From 13cfcaa2cbd924b1683696d6fe0c35b939e64f54 Mon Sep 17 00:00:00 2001 From: fork user Date: Wed, 30 Nov 2022 14:42:09 +0100 Subject: [PATCH] Deleting old js9 files --- .../js9_old/analysis-plugins/fits2fits.json | 8 - .../js9_old/analysis-plugins/imsection.json | 11 - .../analysis-plugins/js9Analysis-fits.json | 12 - .../js9Analysis-funtools.json | 40 - .../js9_old/analysis-plugins/listhdus.json | 8 - .../js9_old/analysis-plugins/loadProxy.json | 20 - .../js9_old/analysis-plugins/quotacheck.json | 8 - .../js9_old/analysis-plugins/uploadfits.json | 10 - web/static/js9_old/analysis-wrappers/js9Xeq | 571 - web/static/js9_old/astroem.js | 159 - web/static/js9_old/astroemw.js | 129 - web/static/js9_old/astroemw.wasm | Bin 1452673 -> 0 bytes web/static/js9_old/css/dhtmlwindow.css | 130 - .../js9_old/css/jquery.contextMenu-v2.8.0.css | 309 - web/static/js9_old/css/jquery.contextMenu.css | 309 - web/static/js9_old/css/spectrum.css | 507 - web/static/js9_old/css/tabcontent.css | 176 - web/static/js9_old/favicon.ico | Bin 1150 -> 0 bytes .../js9_old/font/context-menu-icons.eot | Bin 3396 -> 0 bytes .../js9_old/font/context-menu-icons.ttf | Bin 3188 -> 0 bytes .../js9_old/font/context-menu-icons.woff | Bin 2072 -> 0 bytes .../js9_old/font/context-menu-icons.woff2 | Bin 1592 -> 0 bytes web/static/js9_old/help/archives.html | 88 - web/static/js9_old/help/changelog.html | 934 - web/static/js9_old/help/desktop.html | 585 - web/static/js9_old/help/extmsg.html | 363 - web/static/js9_old/help/helper.html | 319 - web/static/js9_old/help/install.html | 389 - web/static/js9_old/help/knownissues.html | 214 - web/static/js9_old/help/localtasks.html | 342 - web/static/js9_old/help/memory.html | 207 - web/static/js9_old/help/preferences.html | 171 - web/static/js9_old/help/publicapi.html | 6418 -- web/static/js9_old/help/python.html | 170 - web/static/js9_old/help/regions.html | 198 - web/static/js9_old/help/repfile.html | 221 - web/static/js9_old/help/securityissues.html | 56 - web/static/js9_old/help/serverside.html | 409 - web/static/js9_old/help/user.html | 885 - web/static/js9_old/help/webpage.html | 473 - web/static/js9_old/help/yourdata.html | 113 - web/static/js9_old/images/4arrow.png | Bin 1350 -> 0 bytes web/static/js9_old/images/checkmark.svg | 1 - web/static/js9_old/images/close.gif | Bin 125 -> 0 bytes web/static/js9_old/images/empty.svg | 1 - web/static/js9_old/images/gears.png | Bin 860 -> 0 bytes web/static/js9_old/images/indentbg.gif | Bin 292 -> 0 bytes web/static/js9_old/images/indentbg2.gif | Bin 300 -> 0 bytes web/static/js9_old/images/indentbg2_grey.png | Bin 349 -> 0 bytes web/static/js9_old/images/indentbg_grey.png | Bin 384 -> 0 bytes .../js9_old/images/js9-apple-touch-icon.icns | Bin 53784 -> 0 bytes .../js9_old/images/js9-apple-touch-icon.png | Bin 36236 -> 0 bytes web/static/js9_old/images/js9Readme.png | Bin 1337797 -> 0 bytes web/static/js9_old/images/js9logo.png | Bin 7957 -> 0 bytes .../images/js9logo/mac/js9logo-is32.icns | Bin 65249 -> 0 bytes .../js9_old/images/js9logo/mac/js9logo.icns | Bin 69783 -> 0 bytes .../images/js9logo/png/js9logo_128.png | Bin 16967 -> 0 bytes .../images/js9logo/png/js9logo_256.png | Bin 49566 -> 0 bytes .../js9_old/images/js9logo/png/js9logo_48.png | Bin 3433 -> 0 bytes .../images/js9logo/png/js9logo_512.png | Bin 69334 -> 0 bytes .../js9_old/images/js9logo/png/js9logo_64.png | Bin 5439 -> 0 bytes .../js9_old/images/js9logo/png/js9logo_96.png | Bin 10781 -> 0 bytes .../images/js9logo/win/js9logo_512.ico | Bin 65248 -> 0 bytes web/static/js9_old/images/min.gif | Bin 872 -> 0 bytes web/static/js9_old/images/resize.gif | Bin 859 -> 0 bytes web/static/js9_old/images/restore.gif | Bin 125 -> 0 bytes web/static/js9_old/images/shade.gif | Bin 946 -> 0 bytes web/static/js9_old/images/shadeactive.gif | Bin 838 -> 0 bytes web/static/js9_old/images/si-logo.png | Bin 11934 -> 0 bytes web/static/js9_old/images/sun.png | Bin 1925 -> 0 bytes .../images/toolbar/dax_images/10_4.png | Bin 95 -> 0 bytes .../js9_old/images/toolbar/dax_images/2_2.png | Bin 91 -> 0 bytes .../js9_old/images/toolbar/dax_images/5_5.png | Bin 97 -> 0 bytes .../js9_old/images/toolbar/dax_images/8_3.png | Bin 97 -> 0 bytes .../images/toolbar/dax_images/annulus.png | Bin 1285 -> 0 bytes .../images/toolbar/dax_images/back.png | Bin 946 -> 0 bytes .../images/toolbar/dax_images/bin_minus.png | Bin 563 -> 0 bytes .../images/toolbar/dax_images/bin_one.png | Bin 190 -> 0 bytes .../images/toolbar/dax_images/bin_plus.png | Bin 181 -> 0 bytes .../images/toolbar/dax_images/blank.png | Bin 92 -> 0 bytes .../js9_old/images/toolbar/dax_images/blk.png | Bin 148 -> 0 bytes .../js9_old/images/toolbar/dax_images/blu.png | Bin 148 -> 0 bytes .../js9_old/images/toolbar/dax_images/box.png | Bin 912 -> 0 bytes .../images/toolbar/dax_images/circle.png | Bin 1051 -> 0 bytes .../images/toolbar/dax_images/cmap_a.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_aips0.png | Bin 347 -> 0 bytes .../images/toolbar/dax_images/cmap_b.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_bb.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_blue.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_color.png | Bin 461 -> 0 bytes .../images/toolbar/dax_images/cmap_cool.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_green.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_grey.png | Bin 313 -> 0 bytes .../images/toolbar/dax_images/cmap_he.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_heat.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_hsv.png | Bin 618 -> 0 bytes .../images/toolbar/dax_images/cmap_i8.png | Bin 318 -> 0 bytes .../toolbar/dax_images/cmap_inferno.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_magma.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_parula.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_plasma.png | Bin 605 -> 0 bytes .../toolbar/dax_images/cmap_rainbow.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_red.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/cmap_sls.png | Bin 608 -> 0 bytes .../toolbar/dax_images/cmap_staircase.png | Bin 450 -> 0 bytes .../toolbar/dax_images/cmap_standard.png | Bin 605 -> 0 bytes .../toolbar/dax_images/cmap_viridis.png | Bin 605 -> 0 bytes .../images/toolbar/dax_images/contour.png | Bin 1242 -> 0 bytes .../images/toolbar/dax_images/coords.png | Bin 1313 -> 0 bytes .../js9_old/images/toolbar/dax_images/cyn.png | Bin 148 -> 0 bytes .../images/toolbar/dax_images/ellipse.png | Bin 926 -> 0 bytes .../images/toolbar/dax_images/erase.png | Bin 976 -> 0 bytes .../images/toolbar/dax_images/filter.png | Bin 181 -> 0 bytes .../images/toolbar/dax_images/front.png | Bin 997 -> 0 bytes .../images/toolbar/dax_images/glvary.png | Bin 1131 -> 0 bytes .../js9_old/images/toolbar/dax_images/grn.png | Bin 144 -> 0 bytes .../images/toolbar/dax_images/incexl.png | Bin 1108 -> 0 bytes .../images/toolbar/dax_images/lightcurve.png | Bin 646 -> 0 bytes .../js9_old/images/toolbar/dax_images/lin.png | Bin 195 -> 0 bytes .../js9_old/images/toolbar/dax_images/log.png | Bin 200 -> 0 bytes .../js9_old/images/toolbar/dax_images/mag.png | Bin 211 -> 0 bytes .../images/toolbar/dax_images/mag_minus.png | Bin 221 -> 0 bytes .../images/toolbar/dax_images/mag_one.png | Bin 223 -> 0 bytes .../images/toolbar/dax_images/mag_plus.png | Bin 230 -> 0 bytes .../images/toolbar/dax_images/match.png | Bin 274 -> 0 bytes .../images/toolbar/dax_images/minus.png | Bin 652 -> 0 bytes .../images/toolbar/dax_images/open.png | Bin 182 -> 0 bytes .../js9_old/images/toolbar/dax_images/pan.png | Bin 184 -> 0 bytes .../images/toolbar/dax_images/plus.png | Bin 815 -> 0 bytes .../images/toolbar/dax_images/poly.png | Bin 997 -> 0 bytes .../js9_old/images/toolbar/dax_images/pow.png | Bin 195 -> 0 bytes .../js9_old/images/toolbar/dax_images/pur.png | Bin 148 -> 0 bytes .../js9_old/images/toolbar/dax_images/red.png | Bin 147 -> 0 bytes .../images/toolbar/dax_images/smooth.png | Bin 908 -> 0 bytes .../images/toolbar/dax_images/spectrum.png | Bin 165 -> 0 bytes .../images/toolbar/dax_images/srcbkg.png | Bin 1067 -> 0 bytes .../images/toolbar/dax_images/stats.png | Bin 214 -> 0 bytes .../images/toolbar/dax_images/text.png | Bin 1075 -> 0 bytes .../js9_old/images/toolbar/dax_images/wht.png | Bin 142 -> 0 bytes .../js9_old/images/toolbar/dax_images/yel.png | Bin 148 -> 0 bytes .../images/toolbar/odax_images/10_4.png | Bin 95 -> 0 bytes .../images/toolbar/odax_images/2_2.png | Bin 91 -> 0 bytes .../images/toolbar/odax_images/5_5.png | Bin 97 -> 0 bytes .../images/toolbar/odax_images/8_3.png | Bin 97 -> 0 bytes .../images/toolbar/odax_images/annulus.png | Bin 1296 -> 0 bytes .../images/toolbar/odax_images/back.png | Bin 942 -> 0 bytes .../images/toolbar/odax_images/bin_minus.png | Bin 563 -> 0 bytes .../images/toolbar/odax_images/bin_one.png | Bin 190 -> 0 bytes .../images/toolbar/odax_images/bin_plus.png | Bin 181 -> 0 bytes .../images/toolbar/odax_images/blank.png | Bin 92 -> 0 bytes .../images/toolbar/odax_images/blk.png | Bin 148 -> 0 bytes .../images/toolbar/odax_images/blu.png | Bin 465 -> 0 bytes .../images/toolbar/odax_images/box.png | Bin 881 -> 0 bytes .../images/toolbar/odax_images/circle.png | Bin 1154 -> 0 bytes .../images/toolbar/odax_images/cmap_a.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_aips0.png | Bin 347 -> 0 bytes .../images/toolbar/odax_images/cmap_b.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_bb.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_blue.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_color.png | Bin 461 -> 0 bytes .../images/toolbar/odax_images/cmap_cool.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_green.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_grey.png | Bin 313 -> 0 bytes .../images/toolbar/odax_images/cmap_he.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_heat.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_hsv.png | Bin 618 -> 0 bytes .../images/toolbar/odax_images/cmap_i8.png | Bin 318 -> 0 bytes .../toolbar/odax_images/cmap_inferno.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_magma.png | Bin 605 -> 0 bytes .../toolbar/odax_images/cmap_parula.png | Bin 605 -> 0 bytes .../toolbar/odax_images/cmap_plasma.png | Bin 605 -> 0 bytes .../toolbar/odax_images/cmap_rainbow.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_red.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/cmap_sls.png | Bin 608 -> 0 bytes .../toolbar/odax_images/cmap_staircase.png | Bin 450 -> 0 bytes .../toolbar/odax_images/cmap_standard.png | Bin 605 -> 0 bytes .../toolbar/odax_images/cmap_viridis.png | Bin 605 -> 0 bytes .../images/toolbar/odax_images/contour.png | Bin 235 -> 0 bytes .../images/toolbar/odax_images/coords.png | Bin 260 -> 0 bytes .../images/toolbar/odax_images/cyn.png | Bin 148 -> 0 bytes .../images/toolbar/odax_images/ellipse.png | Bin 880 -> 0 bytes .../images/toolbar/odax_images/erase.png | Bin 737 -> 0 bytes .../images/toolbar/odax_images/filter.png | Bin 181 -> 0 bytes .../images/toolbar/odax_images/front.png | Bin 978 -> 0 bytes .../images/toolbar/odax_images/glvary.png | Bin 521 -> 0 bytes .../images/toolbar/odax_images/grn.png | Bin 144 -> 0 bytes .../images/toolbar/odax_images/incexl.png | Bin 1393 -> 0 bytes .../images/toolbar/odax_images/lightcurve.png | Bin 199 -> 0 bytes .../images/toolbar/odax_images/lin.png | Bin 195 -> 0 bytes .../images/toolbar/odax_images/log.png | Bin 200 -> 0 bytes .../images/toolbar/odax_images/mag.png | Bin 211 -> 0 bytes .../images/toolbar/odax_images/mag_minus.png | Bin 221 -> 0 bytes .../images/toolbar/odax_images/mag_one.png | Bin 223 -> 0 bytes .../images/toolbar/odax_images/mag_plus.png | Bin 230 -> 0 bytes .../images/toolbar/odax_images/match.png | Bin 243 -> 0 bytes .../images/toolbar/odax_images/minus.png | Bin 711 -> 0 bytes .../images/toolbar/odax_images/open.png | Bin 182 -> 0 bytes .../images/toolbar/odax_images/pan.png | Bin 184 -> 0 bytes .../images/toolbar/odax_images/plus.png | Bin 997 -> 0 bytes .../images/toolbar/odax_images/poly.png | Bin 1051 -> 0 bytes .../images/toolbar/odax_images/pow.png | Bin 195 -> 0 bytes .../images/toolbar/odax_images/pur.png | Bin 148 -> 0 bytes .../images/toolbar/odax_images/red.png | Bin 147 -> 0 bytes .../images/toolbar/odax_images/smooth.png | Bin 212 -> 0 bytes .../images/toolbar/odax_images/spectrum.png | Bin 117 -> 0 bytes .../images/toolbar/odax_images/srcbkg.png | Bin 1276 -> 0 bytes .../images/toolbar/odax_images/stats.png | Bin 178 -> 0 bytes .../images/toolbar/odax_images/text.png | Bin 1098 -> 0 bytes .../images/toolbar/odax_images/wht.png | Bin 142 -> 0 bytes .../images/toolbar/odax_images/yel.png | Bin 148 -> 0 bytes web/static/js9_old/images/toolbar/svg | 1 - .../js9_old/images/toolbar/threedots.png | Bin 769 -> 0 bytes web/static/js9_old/images/voyager.icns | Bin 1410285 -> 0 bytes .../js9_old/images/voyager/binning_bin1.svg | 1 - .../js9_old/images/voyager/binning_bin12.svg | 1 - .../js9_old/images/voyager/binning_bin2.svg | 1 - web/static/js9_old/images/voyager/color_a.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_aips0.png | Bin 347 -> 0 bytes web/static/js9_old/images/voyager/color_b.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_bb.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_blue.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_color.png | Bin 461 -> 0 bytes .../js9_old/images/voyager/color_cool.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_green.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_grey.png | Bin 313 -> 0 bytes .../js9_old/images/voyager/color_he.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_heat.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_hsv.png | Bin 618 -> 0 bytes .../js9_old/images/voyager/color_i8.png | Bin 318 -> 0 bytes .../js9_old/images/voyager/color_inferno.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_magma.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_parula.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_plasma.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_rainbow.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_red.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_sls.png | Bin 608 -> 0 bytes .../images/voyager/color_staircase.png | Bin 450 -> 0 bytes .../js9_old/images/voyager/color_standard.png | Bin 605 -> 0 bytes .../js9_old/images/voyager/color_turbo.png | Bin 907 -> 0 bytes .../js9_old/images/voyager/color_viridis.png | Bin 605 -> 0 bytes .../images/voyager/regions_annulus.svg | 10 - .../js9_old/images/voyager/regions_box.svg | 9 - .../js9_old/images/voyager/regions_circle.svg | 9 - .../js9_old/images/voyager/regions_cross.svg | 1 - .../images/voyager/regions_ellipse.svg | 9 - .../js9_old/images/voyager/regions_line.svg | 9 - .../js9_old/images/voyager/regions_point.svg | 10 - .../images/voyager/regions_polygon.svg | 9 - .../js9_old/images/voyager/regions_text.svg | 1 - web/static/js9_old/images/voyager/zoom_1.svg | 1 - web/static/js9_old/images/voyager/zoom_in.svg | 1 - .../js9_old/images/voyager/zoom_mag.svg | 1 - .../js9_old/images/voyager/zoom_out.svg | 1 - .../js9_old/images/voyager/zoom_tofit.svg | 1 - .../js9_old/images/voyager/zoom_zoom.svg | 1 - web/static/js9_old/images/voyagerlogo.png | Bin 25379 -> 0 bytes web/static/js9_old/js/ElementQueries.js | 530 - web/static/js9_old/js/ElementQueries.min.js | 20 - web/static/js9_old/js/FileSaver.js | 189 - web/static/js9_old/js/FileSaver.min.js | 6 - web/static/js9_old/js/README | 12 - web/static/js9_old/js/ResizeSensor.js | 354 - web/static/js9_old/js/ResizeSensor.min.js | 15 - web/static/js9_old/js/arrive.js | 461 - web/static/js9_old/js/arrive.min.js | 10 - web/static/js9_old/js/bzip2.js | 283 - web/static/js9_old/js/caman.full.js | 3387 - web/static/js9_old/js/canvas-toBlob.js | 124 - web/static/js9_old/js/dhtmlwindow.js | 418 - web/static/js9_old/js/dhtmlwindow.min.js | 21 - web/static/js9_old/js/dhtmlwindow_blurb.js | 5 - web/static/js9_old/js/fabric-v4.5.1.js | 30552 ------ web/static/js9_old/js/fabric-v4.5.1.min.js | 1 - web/static/js9_old/js/fabric-v4.6.0.js | 30785 ------ web/static/js9_old/js/fabric-v4.6.0.min.js | 1 - web/static/js9_old/js/fabric-v5.2.1.js | 31087 ------- web/static/js9_old/js/fabric-v5.2.1.min.js | 1 - web/static/js9_old/js/fabric.js | 1 - web/static/js9_old/js/fabric.min.js | 1 - web/static/js9_old/js/flot-zoom.js | 101 - web/static/js9_old/js/flot-zoom.min.js | 7 - web/static/js9_old/js/gaussblur-orig.js | 60 - web/static/js9_old/js/gaussblur.js | 70 - web/static/js9_old/js/gaussblur.min.js | 2 - web/static/js9_old/js/imagefilters.js | 672 - web/static/js9_old/js/imagefilters.min.js | 15 - web/static/js9_old/js/jquery-3.5.0.js | 10872 --- web/static/js9_old/js/jquery-3.5.0.min.js | 2 - web/static/js9_old/js/jquery-migrate-3.1.0.js | 540 - .../js9_old/js/jquery-migrate-3.1.0.min.js | 2 - web/static/js9_old/js/jquery-ui-1.12.1.js | 16132 ---- web/static/js9_old/js/jquery-ui-1.12.1.min.js | 649 - web/static/js9_old/js/jquery-ui.js | 1 - web/static/js9_old/js/jquery-ui.min.js | 1 - web/static/js9_old/js/jquery.caret.js | 56 - web/static/js9_old/js/jquery.caret.min.js | 1 - web/static/js9_old/js/jquery.colorhelpers.js | 180 - .../js9_old/js/jquery.colorhelpers.min.js | 6 - .../js9_old/js/jquery.contextMenu-v2.6.3.js | 2101 - .../js/jquery.contextMenu-v2.6.3.min.js | 57 - .../js9_old/js/jquery.contextMenu-v2.8.0.js | 2128 - web/static/js9_old/js/jquery.contextMenu.js | 2133 - .../js9_old/js/jquery.contextMenu.min.js | 58 - web/static/js9_old/js/jquery.doubletap.js | 45 - web/static/js9_old/js/jquery.doubletap.min.js | 10 - .../js9_old/js/jquery.flot.axislabels.js | 466 - .../js9_old/js/jquery.flot.axislabels.min.js | 17 - web/static/js9_old/js/jquery.flot.canvas.js | 345 - .../js9_old/js/jquery.flot.canvas.min.js | 5 - .../js9_old/js/jquery.flot.categories.js | 190 - .../js9_old/js/jquery.flot.categories.min.js | 3 - .../js9_old/js/jquery.flot.crosshair.js | 176 - .../js9_old/js/jquery.flot.crosshair.min.js | 3 - .../js9_old/js/jquery.flot.errorbars.js | 353 - .../js9_old/js/jquery.flot.errorbars.min.js | 7 - .../js9_old/js/jquery.flot.fillbetween.js | 226 - .../js9_old/js/jquery.flot.fillbetween.min.js | 3 - web/static/js9_old/js/jquery.flot.image.js | 241 - .../js9_old/js/jquery.flot.image.min.js | 4 - web/static/js9_old/js/jquery.flot.js | 3168 - web/static/js9_old/js/jquery.flot.min.js | 74 - web/static/js9_old/js/jquery.flot.navigate.js | 346 - .../js9_old/js/jquery.flot.navigate.min.js | 11 - web/static/js9_old/js/jquery.flot.pie.js | 820 - web/static/js9_old/js/jquery.flot.pie.min.js | 18 - web/static/js9_old/js/jquery.flot.resize.js | 59 - .../js9_old/js/jquery.flot.resize.min.js | 4 - .../js9_old/js/jquery.flot.selection.js | 360 - .../js9_old/js/jquery.flot.selection.min.js | 7 - web/static/js9_old/js/jquery.flot.stack.js | 188 - .../js9_old/js/jquery.flot.stack.min.js | 3 - web/static/js9_old/js/jquery.flot.symbol.js | 71 - .../js9_old/js/jquery.flot.symbol.min.js | 2 - .../js9_old/js/jquery.flot.threshold.js | 142 - .../js9_old/js/jquery.flot.threshold.min.js | 3 - web/static/js9_old/js/jquery.flot.time.js | 432 - web/static/js9_old/js/jquery.flot.time.min.js | 9 - web/static/js9_old/js/jquery.js | 1 - web/static/js9_old/js/jquery.mark.es6.js | 958 - web/static/js9_old/js/jquery.mark.es6.min.js | 7 - web/static/js9_old/js/jquery.min.js | 1 - .../js9_old/js/jquery.ui.touch-punch.js | 180 - .../js9_old/js/jquery.ui.touch-punch.min.js | 13 - web/static/js9_old/js/js9inline.js | 48 - web/static/js9_old/js/jsmanipulate.js | 2310 - .../js9_old/js/minify-warnings-v20190909.log | 76 - web/static/js9_old/js/nf | 29 - web/static/js9_old/js/pako_inflate.js | 3025 - web/static/js9_old/js/pako_inflate.min.js | 43 - web/static/js9_old/js/regSelect.js | 698 - web/static/js9_old/js/spectrum.js | 2323 - web/static/js9_old/js/spectrum.min.js | 58 - web/static/js9_old/js/spin.js | 377 - web/static/js9_old/js/spin.min.js | 9 - web/static/js9_old/js/sprintf.js | 181 - web/static/js9_old/js/sprintf.min.js | 4 - web/static/js9_old/js/tabcontent.js | 160 - web/static/js9_old/js/tinycolor.js | 1195 - web/static/js9_old/js/tinycolor.min.js | 30 - web/static/js9_old/js/winmod.js | 16 - web/static/js9_old/js/zee.js | 2548 - web/static/js9_old/js/zpipe.js | 13399 --- web/static/js9_old/js9-allinone.css | 2940 - web/static/js9_old/js9-allinone.js | 26440 ------ web/static/js9_old/js9.css | 909 - web/static/js9_old/js9.html | 42 - web/static/js9_old/js9.js | 28462 ------ web/static/js9_old/js9.min.js | 893 - web/static/js9_old/js9Electron.js | 913 - web/static/js9_old/js9ElectronMainMenu.js | 201 - web/static/js9_old/js9ElectronPreload.js | 61 - web/static/js9_old/js9Helper.js | 1586 - web/static/js9_old/js9Msg.js | 559 - web/static/js9_old/js9PostMessage.js | 81 - web/static/js9_old/js9Prefs.json | 14 - web/static/js9_old/js9Regions.js | 191 - web/static/js9_old/js9plugins.js | 20669 ----- web/static/js9_old/js9prefs.js | 18 - web/static/js9_old/js9support.css | 2029 - web/static/js9_old/js9support.js | 77158 ---------------- web/static/js9_old/js9support.min.js | 4708 - web/static/js9_old/js9support.txt | 7 - web/static/js9_old/js9worker.js | 171 - .../js9_old/node_modules/.bin/is-docker | 1 - .../js9_old/node_modules/.bin/node-gyp-build | 1 - .../node_modules/.bin/node-gyp-build-optional | 1 - .../node_modules/.bin/node-gyp-build-test | 1 - web/static/js9_old/node_modules/.bin/rimraf | 1 - web/static/js9_old/node_modules/.bin/uuid | 1 - .../js9_old/node_modules/.package-lock.json | 512 - .../@socket.io/base64-arraybuffer/LICENSE | 22 - .../@socket.io/base64-arraybuffer/README.md | 29 - .../dist/base64-arraybuffer.es5.js | 50 - .../dist/base64-arraybuffer.es5.js.map | 1 - .../dist/base64-arraybuffer.umd.js | 61 - .../dist/base64-arraybuffer.umd.js.map | 1 - .../base64-arraybuffer/dist/lib/index.js | 48 - .../base64-arraybuffer/dist/lib/index.js.map | 1 - .../base64-arraybuffer/dist/types/index.d.ts | 2 - .../base64-arraybuffer/package.json | 58 - .../base64-arraybuffer/src/index.ts | 63 - .../@socket.io/component-emitter/LICENSE | 24 - .../@socket.io/component-emitter/Readme.md | 74 - .../@socket.io/component-emitter/index.d.ts | 179 - .../@socket.io/component-emitter/index.js | 176 - .../@socket.io/component-emitter/index.mjs | 169 - .../@socket.io/component-emitter/package.json | 31 - .../@types/component-emitter/LICENSE | 21 - .../@types/component-emitter/README.md | 16 - .../@types/component-emitter/index.d.ts | 22 - .../@types/component-emitter/package.json | 24 - .../node_modules/@types/cookie/LICENSE | 21 - .../node_modules/@types/cookie/README.md | 16 - .../node_modules/@types/cookie/index.d.ts | 135 - .../node_modules/@types/cookie/package.json | 30 - .../js9_old/node_modules/@types/cors/LICENSE | 21 - .../node_modules/@types/cors/README.md | 78 - .../node_modules/@types/cors/index.d.ts | 58 - .../node_modules/@types/cors/package.json | 30 - .../js9_old/node_modules/@types/node/LICENSE | 21 - .../node_modules/@types/node/README.md | 16 - .../node_modules/@types/node/assert.d.ts | 912 - .../@types/node/assert/strict.d.ts | 8 - .../node_modules/@types/node/async_hooks.d.ts | 501 - .../node_modules/@types/node/buffer.d.ts | 2232 - .../@types/node/child_process.d.ts | 1366 - .../node_modules/@types/node/cluster.d.ts | 414 - .../node_modules/@types/node/console.d.ts | 412 - .../node_modules/@types/node/constants.d.ts | 18 - .../node_modules/@types/node/crypto.d.ts | 3331 - .../node_modules/@types/node/dgram.d.ts | 545 - .../@types/node/diagnostics_channel.d.ts | 134 - .../js9_old/node_modules/@types/node/dns.d.ts | 659 - .../@types/node/dns/promises.d.ts | 370 - .../node_modules/@types/node/domain.d.ts | 169 - .../node_modules/@types/node/events.d.ts | 651 - .../js9_old/node_modules/@types/node/fs.d.ts | 3869 - .../node_modules/@types/node/fs/promises.d.ts | 1091 - .../node_modules/@types/node/globals.d.ts | 284 - .../@types/node/globals.global.d.ts | 1 - .../node_modules/@types/node/http.d.ts | 1396 - .../node_modules/@types/node/http2.d.ts | 2101 - .../node_modules/@types/node/https.d.ts | 391 - .../node_modules/@types/node/index.d.ts | 129 - .../node_modules/@types/node/inspector.d.ts | 2744 - .../node_modules/@types/node/module.d.ts | 114 - .../js9_old/node_modules/@types/node/net.d.ts | 791 - .../js9_old/node_modules/@types/node/os.d.ts | 455 - .../node_modules/@types/node/package.json | 220 - .../node_modules/@types/node/path.d.ts | 180 - .../node_modules/@types/node/perf_hooks.d.ts | 557 - .../node_modules/@types/node/process.d.ts | 1481 - .../node_modules/@types/node/punycode.d.ts | 117 - .../node_modules/@types/node/querystring.d.ts | 131 - .../node_modules/@types/node/readline.d.ts | 650 - .../node_modules/@types/node/repl.d.ts | 424 - .../node_modules/@types/node/stream.d.ts | 1249 - .../@types/node/stream/consumers.d.ts | 24 - .../@types/node/stream/promises.d.ts | 42 - .../node_modules/@types/node/stream/web.d.ts | 330 - .../@types/node/string_decoder.d.ts | 67 - .../node_modules/@types/node/timers.d.ts | 94 - .../@types/node/timers/promises.d.ts | 68 - .../js9_old/node_modules/@types/node/tls.d.ts | 1020 - .../@types/node/trace_events.d.ts | 161 - .../js9_old/node_modules/@types/node/tty.d.ts | 204 - .../js9_old/node_modules/@types/node/url.d.ts | 891 - .../node_modules/@types/node/util.d.ts | 1594 - .../js9_old/node_modules/@types/node/v8.d.ts | 378 - .../js9_old/node_modules/@types/node/vm.d.ts | 507 - .../node_modules/@types/node/wasi.d.ts | 158 - .../@types/node/worker_threads.d.ts | 649 - .../node_modules/@types/node/zlib.d.ts | 517 - .../js9_old/node_modules/accepts/HISTORY.md | 243 - .../js9_old/node_modules/accepts/LICENSE | 23 - .../js9_old/node_modules/accepts/README.md | 140 - .../js9_old/node_modules/accepts/index.js | 238 - .../js9_old/node_modules/accepts/package.json | 47 - .../node_modules/balanced-match/.npmignore | 5 - .../node_modules/balanced-match/LICENSE.md | 21 - .../node_modules/balanced-match/README.md | 91 - .../node_modules/balanced-match/index.js | 59 - .../node_modules/balanced-match/package.json | 77 - .../node_modules/base64id/CHANGELOG.md | 16 - .../js9_old/node_modules/base64id/LICENSE | 22 - .../js9_old/node_modules/base64id/README.md | 18 - .../node_modules/base64id/lib/base64id.js | 103 - .../node_modules/base64id/package.json | 13 - .../node_modules/brace-expansion/LICENSE | 21 - .../node_modules/brace-expansion/README.md | 129 - .../node_modules/brace-expansion/index.js | 201 - .../node_modules/brace-expansion/package.json | 75 - .../node_modules/component-emitter/History.md | 75 - .../node_modules/component-emitter/LICENSE | 24 - .../node_modules/component-emitter/Readme.md | 74 - .../node_modules/component-emitter/index.js | 175 - .../component-emitter/package.json | 27 - .../node_modules/concat-map/.travis.yml | 4 - .../js9_old/node_modules/concat-map/LICENSE | 18 - .../node_modules/concat-map/README.markdown | 62 - .../node_modules/concat-map/example/map.js | 6 - .../js9_old/node_modules/concat-map/index.js | 13 - .../node_modules/concat-map/package.json | 88 - .../node_modules/concat-map/test/map.js | 39 - .../js9_old/node_modules/cookie/HISTORY.md | 134 - .../js9_old/node_modules/cookie/LICENSE | 24 - .../js9_old/node_modules/cookie/README.md | 286 - .../js9_old/node_modules/cookie/index.js | 202 - .../js9_old/node_modules/cookie/package.json | 42 - .../js9_old/node_modules/cors/CONTRIBUTING.md | 33 - .../js9_old/node_modules/cors/HISTORY.md | 58 - web/static/js9_old/node_modules/cors/LICENSE | 22 - .../js9_old/node_modules/cors/README.md | 243 - .../js9_old/node_modules/cors/lib/index.js | 238 - .../js9_old/node_modules/cors/package.json | 41 - web/static/js9_old/node_modules/debug/LICENSE | 19 - .../js9_old/node_modules/debug/README.md | 455 - .../js9_old/node_modules/debug/Readme.md | 455 - .../js9_old/node_modules/debug/package.json | 59 - .../js9_old/node_modules/debug/src/browser.js | 269 - .../js9_old/node_modules/debug/src/common.js | 274 - .../js9_old/node_modules/debug/src/index.js | 10 - .../js9_old/node_modules/debug/src/node.js | 263 - .../node_modules/define-lazy-prop/index.d.ts | 33 - .../node_modules/define-lazy-prop/index.js | 19 - .../node_modules/define-lazy-prop/license | 9 - .../define-lazy-prop/package.json | 48 - .../node_modules/define-lazy-prop/readme.md | 64 - .../node_modules/engine.io-client/LICENSE | 22 - .../node_modules/engine.io-client/README.md | 333 - .../build/cjs/browser-entrypoint.js | 4 - .../build/cjs/contrib/has-cors.js | 14 - .../build/cjs/contrib/parseqs.js | 39 - .../build/cjs/contrib/parseuri.js | 53 - .../build/cjs/contrib/yeast.js | 55 - .../build/cjs/globalThis.browser.js | 13 - .../engine.io-client/build/cjs/globalThis.js | 3 - .../engine.io-client/build/cjs/index.js | 14 - .../engine.io-client/build/cjs/package.json | 10 - .../engine.io-client/build/cjs/socket.js | 611 - .../engine.io-client/build/cjs/transport.js | 126 - .../build/cjs/transports/index.js | 9 - .../build/cjs/transports/polling.js | 427 - .../websocket-constructor.browser.js | 19 - .../cjs/transports/websocket-constructor.js | 11 - .../build/cjs/transports/websocket.js | 199 - .../cjs/transports/xmlhttprequest.browser.js | 25 - .../build/cjs/transports/xmlhttprequest.js | 28 - .../engine.io-client/build/cjs/util.js | 61 - .../build/cjs/xmlhttprequest.js | 25 - .../build/esm-debug/browser-entrypoint.d.ts | 3 - .../build/esm-debug/browser-entrypoint.js | 2 - .../build/esm-debug/contrib/has-cors.d.ts | 1 - .../build/esm-debug/contrib/has-cors.js | 11 - .../build/esm-debug/contrib/parseqs.d.ts | 15 - .../build/esm-debug/contrib/parseqs.js | 34 - .../build/esm-debug/contrib/parseuri.d.ts | 1 - .../build/esm-debug/contrib/parseuri.js | 49 - .../build/esm-debug/contrib/yeast.d.ts | 23 - .../build/esm-debug/contrib/yeast.js | 50 - .../build/esm-debug/globalThis.browser.d.ts | 2 - .../build/esm-debug/globalThis.browser.js | 11 - .../build/esm-debug/globalThis.d.ts | 1 - .../build/esm-debug/globalThis.js | 1 - .../build/esm-debug/index.d.ts | 8 - .../engine.io-client/build/esm-debug/index.js | 7 - .../build/esm-debug/package.json | 10 - .../build/esm-debug/socket.d.ts | 352 - .../build/esm-debug/socket.js | 604 - .../build/esm-debug/transport.d.ts | 96 - .../build/esm-debug/transport.js | 119 - .../build/esm-debug/transports/index.d.ts | 6 - .../build/esm-debug/transports/index.js | 6 - .../build/esm-debug/transports/polling.d.ts | 142 - .../build/esm-debug/transports/polling.js | 419 - .../websocket-constructor.browser.d.ts | 4 - .../websocket-constructor.browser.js | 13 - .../transports/websocket-constructor.d.ts | 4 - .../transports/websocket-constructor.js | 5 - .../build/esm-debug/transports/websocket.d.ts | 55 - .../build/esm-debug/transports/websocket.js | 192 - .../transports/xmlhttprequest.browser.d.ts | 1 - .../transports/xmlhttprequest.browser.js | 19 - .../esm-debug/transports/xmlhttprequest.d.ts | 2 - .../esm-debug/transports/xmlhttprequest.js | 3 - .../build/esm-debug/util.d.ts | 3 - .../engine.io-client/build/esm-debug/util.js | 52 - .../build/esm-debug/xmlhttprequest.d.ts | 1 - .../build/esm-debug/xmlhttprequest.js | 19 - .../build/esm/browser-entrypoint.d.ts | 3 - .../build/esm/browser-entrypoint.js | 2 - .../build/esm/contrib/has-cors.d.ts | 1 - .../build/esm/contrib/has-cors.js | 11 - .../build/esm/contrib/parseqs.d.ts | 15 - .../build/esm/contrib/parseqs.js | 34 - .../build/esm/contrib/parseuri.d.ts | 1 - .../build/esm/contrib/parseuri.js | 49 - .../build/esm/contrib/yeast.d.ts | 23 - .../build/esm/contrib/yeast.js | 50 - .../build/esm/globalThis.browser.d.ts | 2 - .../build/esm/globalThis.browser.js | 11 - .../build/esm/globalThis.d.ts | 1 - .../engine.io-client/build/esm/globalThis.js | 1 - .../engine.io-client/build/esm/index.d.ts | 8 - .../engine.io-client/build/esm/index.js | 7 - .../engine.io-client/build/esm/package.json | 10 - .../engine.io-client/build/esm/socket.d.ts | 352 - .../engine.io-client/build/esm/socket.js | 579 - .../engine.io-client/build/esm/transport.d.ts | 96 - .../engine.io-client/build/esm/transport.js | 116 - .../build/esm/transports/index.d.ts | 6 - .../build/esm/transports/index.js | 6 - .../build/esm/transports/polling.d.ts | 142 - .../build/esm/transports/polling.js | 403 - .../websocket-constructor.browser.d.ts | 4 - .../websocket-constructor.browser.js | 13 - .../esm/transports/websocket-constructor.d.ts | 4 - .../esm/transports/websocket-constructor.js | 5 - .../build/esm/transports/websocket.d.ts | 55 - .../build/esm/transports/websocket.js | 189 - .../transports/xmlhttprequest.browser.d.ts | 1 - .../esm/transports/xmlhttprequest.browser.js | 19 - .../build/esm/transports/xmlhttprequest.d.ts | 2 - .../build/esm/transports/xmlhttprequest.js | 3 - .../engine.io-client/build/esm/util.d.ts | 3 - .../engine.io-client/build/esm/util.js | 52 - .../build/esm/xmlhttprequest.d.ts | 1 - .../build/esm/xmlhttprequest.js | 19 - .../dist/engine.io.esm.min.js | 7 - .../dist/engine.io.esm.min.js.map | 1 - .../engine.io-client/dist/engine.io.js | 2435 - .../engine.io-client/dist/engine.io.js.map | 1 - .../engine.io-client/dist/engine.io.min.js | 7 - .../dist/engine.io.min.js.map | 1 - .../engine.io-client/package.json | 104 - .../node_modules/engine.io-parser/LICENSE | 22 - .../node_modules/engine.io-parser/Readme.md | 158 - .../engine.io-parser/build/cjs/commons.js | 19 - .../build/cjs/decodePacket.browser.js | 51 - .../build/cjs/decodePacket.js | 49 - .../build/cjs/encodePacket.browser.js | 43 - .../build/cjs/encodePacket.js | 27 - .../engine.io-parser/build/cjs/index.js | 38 - .../engine.io-parser/build/cjs/package.json | 8 - .../engine.io-parser/build/esm/commons.d.ts | 15 - .../engine.io-parser/build/esm/commons.js | 14 - .../build/esm/decodePacket.browser.d.ts | 3 - .../build/esm/decodePacket.browser.js | 49 - .../build/esm/decodePacket.d.ts | 3 - .../build/esm/decodePacket.js | 47 - .../build/esm/encodePacket.browser.d.ts | 3 - .../build/esm/encodePacket.browser.js | 41 - .../build/esm/encodePacket.d.ts | 3 - .../build/esm/encodePacket.js | 25 - .../engine.io-parser/build/esm/index.d.ts | 7 - .../engine.io-parser/build/esm/index.js | 32 - .../engine.io-parser/build/esm/package.json | 8 - .../engine.io-parser/package.json | 61 - .../js9_old/node_modules/engine.io/LICENSE | 19 - .../js9_old/node_modules/engine.io/README.md | 596 - .../engine.io/build/engine.io.d.ts | 28 - .../node_modules/engine.io/build/engine.io.js | 56 - .../engine.io/build/parser-v3/index.d.ts | 95 - .../engine.io/build/parser-v3/index.js | 424 - .../engine.io/build/parser-v3/utf8.d.ts | 14 - .../engine.io/build/parser-v3/utf8.js | 187 - .../node_modules/engine.io/build/server.d.ts | 223 - .../node_modules/engine.io/build/server.js | 626 - .../node_modules/engine.io/build/socket.d.ts | 145 - .../node_modules/engine.io/build/socket.js | 462 - .../engine.io/build/transport.d.ts | 76 - .../node_modules/engine.io/build/transport.js | 113 - .../engine.io/build/transports-uws/index.d.ts | 7 - .../engine.io/build/transports-uws/index.js | 8 - .../build/transports-uws/polling.d.ts | 103 - .../engine.io/build/transports-uws/polling.js | 363 - .../build/transports-uws/websocket.d.ts | 43 - .../build/transports-uws/websocket.js | 89 - .../engine.io/build/transports/index.d.ts | 16 - .../engine.io/build/transports/index.js | 23 - .../build/transports/polling-jsonp.d.ts | 24 - .../build/transports/polling-jsonp.js | 54 - .../engine.io/build/transports/polling.d.ts | 100 - .../engine.io/build/transports/polling.js | 342 - .../engine.io/build/transports/websocket.d.ts | 43 - .../engine.io/build/transports/websocket.js | 102 - .../node_modules/engine.io/build/userver.d.ts | 38 - .../node_modules/engine.io/build/userver.js | 212 - .../node_modules/engine.io/package.json | 80 - .../node_modules/engine.io/wrapper.mjs | 3 - .../js9_old/node_modules/fs.realpath/LICENSE | 43 - .../node_modules/fs.realpath/README.md | 33 - .../js9_old/node_modules/fs.realpath/index.js | 66 - .../js9_old/node_modules/fs.realpath/old.js | 303 - .../node_modules/fs.realpath/package.json | 59 - web/static/js9_old/node_modules/glob/LICENSE | 21 - .../js9_old/node_modules/glob/README.md | 375 - .../js9_old/node_modules/glob/changelog.md | 67 - .../js9_old/node_modules/glob/common.js | 240 - web/static/js9_old/node_modules/glob/glob.js | 790 - .../js9_old/node_modules/glob/package.json | 79 - web/static/js9_old/node_modules/glob/sync.js | 486 - .../js9_old/node_modules/inflight/LICENSE | 15 - .../js9_old/node_modules/inflight/README.md | 37 - .../js9_old/node_modules/inflight/inflight.js | 54 - .../node_modules/inflight/package.json | 58 - .../js9_old/node_modules/inherits/LICENSE | 16 - .../js9_old/node_modules/inherits/README.md | 42 - .../js9_old/node_modules/inherits/inherits.js | 9 - .../node_modules/inherits/inherits_browser.js | 27 - .../node_modules/inherits/package.json | 61 - .../js9_old/node_modules/is-docker/cli.js | 5 - .../js9_old/node_modules/is-docker/index.d.ts | 15 - .../js9_old/node_modules/is-docker/index.js | 29 - .../js9_old/node_modules/is-docker/license | 9 - .../node_modules/is-docker/package.json | 77 - .../js9_old/node_modules/is-docker/readme.md | 27 - .../js9_old/node_modules/is-wsl/index.d.ts | 15 - .../js9_old/node_modules/is-wsl/index.js | 31 - .../js9_old/node_modules/is-wsl/license | 9 - .../js9_old/node_modules/is-wsl/package.json | 77 - .../js9_old/node_modules/is-wsl/readme.md | 36 - .../js9_old/node_modules/mime-db/HISTORY.md | 507 - .../js9_old/node_modules/mime-db/LICENSE | 23 - .../js9_old/node_modules/mime-db/README.md | 100 - .../js9_old/node_modules/mime-db/db.json | 8519 -- .../js9_old/node_modules/mime-db/index.js | 12 - .../js9_old/node_modules/mime-db/package.json | 60 - .../node_modules/mime-types/HISTORY.md | 397 - .../js9_old/node_modules/mime-types/LICENSE | 23 - .../js9_old/node_modules/mime-types/README.md | 113 - .../js9_old/node_modules/mime-types/index.js | 188 - .../node_modules/mime-types/package.json | 44 - .../js9_old/node_modules/minimatch/LICENSE | 15 - .../js9_old/node_modules/minimatch/README.md | 209 - .../node_modules/minimatch/minimatch.js | 923 - .../node_modules/minimatch/package.json | 63 - .../js9_old/node_modules/minimist/.travis.yml | 8 - .../js9_old/node_modules/minimist/LICENSE | 18 - .../node_modules/minimist/example/parse.js | 2 - .../js9_old/node_modules/minimist/index.js | 249 - .../node_modules/minimist/package.json | 45 - .../node_modules/minimist/readme.markdown | 98 - .../node_modules/minimist/test/all_bool.js | 32 - .../node_modules/minimist/test/bool.js | 178 - .../node_modules/minimist/test/dash.js | 31 - .../minimist/test/default_bool.js | 35 - .../node_modules/minimist/test/dotted.js | 22 - .../node_modules/minimist/test/kv_short.js | 16 - .../node_modules/minimist/test/long.js | 31 - .../js9_old/node_modules/minimist/test/num.js | 36 - .../node_modules/minimist/test/parse.js | 197 - .../minimist/test/parse_modified.js | 9 - .../node_modules/minimist/test/proto.js | 60 - .../node_modules/minimist/test/short.js | 67 - .../node_modules/minimist/test/stop_early.js | 15 - .../node_modules/minimist/test/unknown.js | 102 - .../node_modules/minimist/test/whitespace.js | 8 - web/static/js9_old/node_modules/ms/LICENSE.md | 21 - web/static/js9_old/node_modules/ms/README.md | 60 - web/static/js9_old/node_modules/ms/index.js | 162 - web/static/js9_old/node_modules/ms/license.md | 21 - .../js9_old/node_modules/ms/package.json | 37 - web/static/js9_old/node_modules/ms/readme.md | 60 - .../node_modules/negotiator/HISTORY.md | 108 - .../js9_old/node_modules/negotiator/LICENSE | 24 - .../js9_old/node_modules/negotiator/README.md | 203 - .../js9_old/node_modules/negotiator/index.js | 82 - .../node_modules/negotiator/lib/charset.js | 169 - .../node_modules/negotiator/lib/encoding.js | 184 - .../node_modules/negotiator/lib/language.js | 179 - .../node_modules/negotiator/lib/mediaType.js | 294 - .../node_modules/negotiator/package.json | 42 - .../node_modules/node-gyp-build/LICENSE | 21 - .../node_modules/node-gyp-build/README.md | 58 - .../node_modules/node-gyp-build/bin.js | 77 - .../node_modules/node-gyp-build/build-test.js | 19 - .../node_modules/node-gyp-build/index.js | 166 - .../node_modules/node-gyp-build/optional.js | 7 - .../node_modules/node-gyp-build/package.json | 29 - .../node_modules/object-assign/index.js | 90 - .../node_modules/object-assign/license | 21 - .../node_modules/object-assign/package.json | 42 - .../node_modules/object-assign/readme.md | 61 - web/static/js9_old/node_modules/once/LICENSE | 15 - .../js9_old/node_modules/once/README.md | 79 - web/static/js9_old/node_modules/once/once.js | 42 - .../js9_old/node_modules/once/package.json | 67 - .../js9_old/node_modules/open/index.d.ts | 153 - web/static/js9_old/node_modules/open/index.js | 315 - web/static/js9_old/node_modules/open/license | 9 - .../js9_old/node_modules/open/package.json | 61 - .../js9_old/node_modules/open/readme.md | 183 - web/static/js9_old/node_modules/open/xdg-open | 1066 - .../node_modules/path-is-absolute/index.js | 20 - .../node_modules/path-is-absolute/license | 21 - .../path-is-absolute/package.json | 75 - .../node_modules/path-is-absolute/readme.md | 59 - .../js9_old/node_modules/ps-list/index.d.ts | 57 - .../js9_old/node_modules/ps-list/index.js | 152 - .../js9_old/node_modules/ps-list/license | 9 - .../js9_old/node_modules/ps-list/package.json | 71 - .../js9_old/node_modules/ps-list/readme.md | 47 - .../ps-list/vendor/fastlist-0.3.0-x64.exe | Bin 271872 -> 0 bytes .../ps-list/vendor/fastlist-0.3.0-x86.exe | Bin 215040 -> 0 bytes .../js9_old/node_modules/rimraf/CHANGELOG.md | 65 - .../js9_old/node_modules/rimraf/LICENSE | 15 - .../js9_old/node_modules/rimraf/README.md | 101 - web/static/js9_old/node_modules/rimraf/bin.js | 68 - .../js9_old/node_modules/rimraf/package.json | 71 - .../js9_old/node_modules/rimraf/rimraf.js | 360 - .../node_modules/socket.io-adapter/LICENSE | 20 - .../node_modules/socket.io-adapter/Readme.md | 23 - .../socket.io-adapter/dist/index.d.ts | 140 - .../socket.io-adapter/dist/index.js | 275 - .../socket.io-adapter/package.json | 29 - .../node_modules/socket.io-client/LICENSE | 22 - .../node_modules/socket.io-client/README.md | 29 - .../build/cjs/browser-entrypoint.js | 4 - .../build/cjs/contrib/backo2.js | 70 - .../socket.io-client/build/cjs/index.js | 69 - .../socket.io-client/build/cjs/manager.js | 395 - .../socket.io-client/build/cjs/on.js | 10 - .../socket.io-client/build/cjs/socket.js | 616 - .../socket.io-client/build/cjs/url.js | 70 - .../build/esm-debug/browser-entrypoint.d.ts | 2 - .../build/esm-debug/browser-entrypoint.js | 2 - .../build/esm-debug/contrib/backo2.d.ts | 12 - .../build/esm-debug/contrib/backo2.js | 66 - .../build/esm-debug/index.d.ts | 29 - .../socket.io-client/build/esm-debug/index.js | 61 - .../build/esm-debug/manager.d.ts | 290 - .../build/esm-debug/manager.js | 369 - .../socket.io-client/build/esm-debug/on.d.ts | 2 - .../socket.io-client/build/esm-debug/on.js | 6 - .../build/esm-debug/package.json | 5 - .../build/esm-debug/socket.d.ts | 318 - .../build/esm-debug/socket.js | 609 - .../socket.io-client/build/esm-debug/url.d.ts | 33 - .../socket.io-client/build/esm-debug/url.js | 63 - .../build/esm/browser-entrypoint.d.ts | 2 - .../build/esm/browser-entrypoint.js | 2 - .../build/esm/contrib/backo2.d.ts | 12 - .../build/esm/contrib/backo2.js | 66 - .../socket.io-client/build/esm/index.d.ts | 29 - .../socket.io-client/build/esm/index.js | 57 - .../socket.io-client/build/esm/manager.d.ts | 290 - .../socket.io-client/build/esm/manager.js | 350 - .../socket.io-client/build/esm/on.d.ts | 2 - .../socket.io-client/build/esm/on.js | 6 - .../socket.io-client/build/esm/package.json | 5 - .../socket.io-client/build/esm/socket.d.ts | 318 - .../socket.io-client/build/esm/socket.js | 593 - .../socket.io-client/build/esm/url.d.ts | 33 - .../socket.io-client/build/esm/url.js | 59 - .../dist/socket.io.esm.min.js | 7 - .../dist/socket.io.esm.min.js.map | 1 - .../socket.io-client/dist/socket.io.js | 4440 - .../socket.io-client/dist/socket.io.js.map | 1 - .../socket.io-client/dist/socket.io.min.js | 7 - .../dist/socket.io.min.js.map | 1 - .../dist/socket.io.msgpack.min.js | 7 - .../dist/socket.io.msgpack.min.js.map | 1 - .../node_modules/socket.io-parser/LICENSE | 20 - .../node_modules/socket.io-parser/Readme.md | 81 - .../socket.io-parser/build/cjs/binary.js | 80 - .../socket.io-parser/build/cjs/index.js | 295 - .../socket.io-parser/build/cjs/is-binary.js | 55 - .../socket.io-parser/build/cjs/package.json | 3 - .../build/esm-debug/binary.d.ts | 20 - .../build/esm-debug/binary.js | 75 - .../build/esm-debug/index.d.ts | 90 - .../socket.io-parser/build/esm-debug/index.js | 290 - .../build/esm-debug/is-binary.d.ts | 7 - .../build/esm-debug/is-binary.js | 50 - .../build/esm-debug/package.json | 3 - .../socket.io-parser/build/esm/binary.d.ts | 20 - .../socket.io-parser/build/esm/binary.js | 75 - .../socket.io-parser/build/esm/index.d.ts | 90 - .../socket.io-parser/build/esm/index.js | 285 - .../socket.io-parser/build/esm/is-binary.d.ts | 7 - .../socket.io-parser/build/esm/is-binary.js | 50 - .../socket.io-parser/build/esm/package.json | 3 - .../socket.io-parser/package.json | 55 - .../socket.io-client/package.json | 122 - .../socket.io-parser/CHANGELOG.md | 86 - .../node_modules/socket.io-parser/LICENSE | 20 - .../node_modules/socket.io-parser/Readme.md | 81 - .../socket.io-parser/dist/binary.d.ts | 20 - .../socket.io-parser/dist/binary.js | 80 - .../socket.io-parser/dist/index.d.ts | 72 - .../socket.io-parser/dist/index.js | 280 - .../socket.io-parser/dist/is-binary.d.ts | 7 - .../socket.io-parser/dist/is-binary.js | 55 - .../socket.io-parser/package.json | 48 - .../js9_old/node_modules/socket.io/LICENSE | 22 - .../js9_old/node_modules/socket.io/Readme.md | 269 - .../client-dist/socket.io.esm.min.js | 7 - .../client-dist/socket.io.esm.min.js.map | 1 - .../socket.io/client-dist/socket.io.js | 4440 - .../socket.io/client-dist/socket.io.js.map | 1 - .../socket.io/client-dist/socket.io.min.js | 7 - .../client-dist/socket.io.min.js.map | 1 - .../client-dist/socket.io.msgpack.min.js | 7 - .../client-dist/socket.io.msgpack.min.js.map | 1 - .../socket.io/dist/broadcast-operator.d.ts | 158 - .../socket.io/dist/broadcast-operator.js | 291 - .../node_modules/socket.io/dist/client.d.ts | 119 - .../node_modules/socket.io/dist/client.js | 267 - .../node_modules/socket.io/dist/index.d.ts | 341 - .../node_modules/socket.io/dist/index.js | 598 - .../socket.io/dist/namespace.d.ts | 204 - .../node_modules/socket.io/dist/namespace.js | 308 - .../socket.io/dist/parent-namespace.d.ts | 15 - .../socket.io/dist/parent-namespace.js | 47 - .../node_modules/socket.io/dist/socket.d.ts | 444 - .../node_modules/socket.io/dist/socket.js | 704 - .../socket.io/dist/typed-events.d.ts | 110 - .../socket.io/dist/typed-events.js | 81 - .../node_modules/socket.io/dist/uws.d.ts | 3 - .../node_modules/socket.io/dist/uws.js | 133 - .../node_modules/socket.io/package.json | 96 - .../node_modules/socket.io/wrapper.mjs | 3 - .../node_modules/utf-8-validate/LICENSE | 21 - .../node_modules/utf-8-validate/README.md | 50 - .../node_modules/utf-8-validate/binding.gyp | 9 - .../node_modules/utf-8-validate/fallback.js | 62 - .../node_modules/utf-8-validate/index.js | 7 - .../node_modules/utf-8-validate/package.json | 35 - .../prebuilds/darwin-x64/node.napi.node | Bin 33528 -> 0 bytes .../prebuilds/linux-arm/node.napi.armv6.node | Bin 4660 -> 0 bytes .../prebuilds/linux-arm/node.napi.armv7.node | Bin 5452 -> 0 bytes .../linux-arm64/node.napi.armv8.node | Bin 10104 -> 0 bytes .../prebuilds/linux-x64/node.napi.node | Bin 6312 -> 0 bytes .../prebuilds/win32-ia32/node.napi.node | Bin 112128 -> 0 bytes .../prebuilds/win32-x64/node.napi.node | Bin 134656 -> 0 bytes .../utf-8-validate/src/validation.c | 109 - .../js9_old/node_modules/uuid/CHANGELOG.md | 229 - .../js9_old/node_modules/uuid/CONTRIBUTING.md | 18 - .../js9_old/node_modules/uuid/LICENSE.md | 9 - .../js9_old/node_modules/uuid/README.md | 505 - .../js9_old/node_modules/uuid/dist/bin/uuid | 2 - .../uuid/dist/esm-browser/index.js | 9 - .../node_modules/uuid/dist/esm-browser/md5.js | 215 - .../node_modules/uuid/dist/esm-browser/nil.js | 1 - .../uuid/dist/esm-browser/parse.js | 35 - .../uuid/dist/esm-browser/regex.js | 1 - .../node_modules/uuid/dist/esm-browser/rng.js | 19 - .../uuid/dist/esm-browser/sha1.js | 96 - .../uuid/dist/esm-browser/stringify.js | 30 - .../node_modules/uuid/dist/esm-browser/v1.js | 95 - .../node_modules/uuid/dist/esm-browser/v3.js | 4 - .../node_modules/uuid/dist/esm-browser/v35.js | 64 - .../node_modules/uuid/dist/esm-browser/v4.js | 24 - .../node_modules/uuid/dist/esm-browser/v5.js | 4 - .../uuid/dist/esm-browser/validate.js | 7 - .../uuid/dist/esm-browser/version.js | 11 - .../node_modules/uuid/dist/esm-node/index.js | 9 - .../node_modules/uuid/dist/esm-node/md5.js | 13 - .../node_modules/uuid/dist/esm-node/nil.js | 1 - .../node_modules/uuid/dist/esm-node/parse.js | 35 - .../node_modules/uuid/dist/esm-node/regex.js | 1 - .../node_modules/uuid/dist/esm-node/rng.js | 12 - .../node_modules/uuid/dist/esm-node/sha1.js | 13 - .../uuid/dist/esm-node/stringify.js | 29 - .../node_modules/uuid/dist/esm-node/v1.js | 95 - .../node_modules/uuid/dist/esm-node/v3.js | 4 - .../node_modules/uuid/dist/esm-node/v35.js | 64 - .../node_modules/uuid/dist/esm-node/v4.js | 24 - .../node_modules/uuid/dist/esm-node/v5.js | 4 - .../uuid/dist/esm-node/validate.js | 7 - .../uuid/dist/esm-node/version.js | 11 - .../js9_old/node_modules/uuid/dist/index.js | 79 - .../node_modules/uuid/dist/md5-browser.js | 223 - .../js9_old/node_modules/uuid/dist/md5.js | 23 - .../js9_old/node_modules/uuid/dist/nil.js | 8 - .../js9_old/node_modules/uuid/dist/parse.js | 45 - .../js9_old/node_modules/uuid/dist/regex.js | 8 - .../node_modules/uuid/dist/rng-browser.js | 26 - .../js9_old/node_modules/uuid/dist/rng.js | 24 - .../node_modules/uuid/dist/sha1-browser.js | 104 - .../js9_old/node_modules/uuid/dist/sha1.js | 23 - .../node_modules/uuid/dist/stringify.js | 39 - .../node_modules/uuid/dist/umd/uuid.min.js | 1 - .../node_modules/uuid/dist/umd/uuidNIL.min.js | 1 - .../uuid/dist/umd/uuidParse.min.js | 1 - .../uuid/dist/umd/uuidStringify.min.js | 1 - .../uuid/dist/umd/uuidValidate.min.js | 1 - .../uuid/dist/umd/uuidVersion.min.js | 1 - .../node_modules/uuid/dist/umd/uuidv1.min.js | 1 - .../node_modules/uuid/dist/umd/uuidv3.min.js | 1 - .../node_modules/uuid/dist/umd/uuidv4.min.js | 1 - .../node_modules/uuid/dist/umd/uuidv5.min.js | 1 - .../node_modules/uuid/dist/uuid-bin.js | 85 - .../js9_old/node_modules/uuid/dist/v1.js | 107 - .../js9_old/node_modules/uuid/dist/v3.js | 16 - .../js9_old/node_modules/uuid/dist/v35.js | 78 - .../js9_old/node_modules/uuid/dist/v4.js | 37 - .../js9_old/node_modules/uuid/dist/v5.js | 16 - .../node_modules/uuid/dist/validate.js | 17 - .../js9_old/node_modules/uuid/dist/version.js | 21 - .../js9_old/node_modules/uuid/package.json | 165 - .../js9_old/node_modules/uuid/wrapper.mjs | 10 - .../js9_old/node_modules/vary/HISTORY.md | 39 - web/static/js9_old/node_modules/vary/LICENSE | 22 - .../js9_old/node_modules/vary/README.md | 101 - web/static/js9_old/node_modules/vary/index.js | 149 - .../js9_old/node_modules/vary/package.json | 43 - .../js9_old/node_modules/wrappy/LICENSE | 15 - .../js9_old/node_modules/wrappy/README.md | 36 - .../js9_old/node_modules/wrappy/package.json | 59 - .../js9_old/node_modules/wrappy/wrappy.js | 33 - web/static/js9_old/node_modules/ws/LICENSE | 19 - web/static/js9_old/node_modules/ws/README.md | 493 - web/static/js9_old/node_modules/ws/browser.js | 8 - web/static/js9_old/node_modules/ws/index.js | 13 - .../node_modules/ws/lib/buffer-util.js | 126 - .../js9_old/node_modules/ws/lib/constants.js | 12 - .../node_modules/ws/lib/event-target.js | 266 - .../js9_old/node_modules/ws/lib/extension.js | 203 - .../js9_old/node_modules/ws/lib/limiter.js | 55 - .../node_modules/ws/lib/permessage-deflate.js | 511 - .../js9_old/node_modules/ws/lib/receiver.js | 612 - .../js9_old/node_modules/ws/lib/sender.js | 422 - .../js9_old/node_modules/ws/lib/stream.js | 180 - .../node_modules/ws/lib/subprotocol.js | 62 - .../js9_old/node_modules/ws/lib/validation.js | 124 - .../node_modules/ws/lib/websocket-server.js | 485 - .../js9_old/node_modules/ws/lib/websocket.js | 1149 - .../js9_old/node_modules/ws/package.json | 61 - .../js9_old/node_modules/ws/wrapper.mjs | 8 - .../node_modules/xmlhttprequest-ssl/LICENSE | 22 - .../node_modules/xmlhttprequest-ssl/README.md | 67 - .../xmlhttprequest-ssl/autotest.watchr | 8 - .../xmlhttprequest-ssl/example/demo.js | 16 - .../xmlhttprequest-ssl/lib/XMLHttpRequest.js | 673 - .../xmlhttprequest-ssl/package.json | 35 - .../tests/test-constants.js | 13 - .../xmlhttprequest-ssl/tests/test-events.js | 50 - .../tests/test-exceptions.js | 59 - .../xmlhttprequest-ssl/tests/test-headers.js | 76 - .../tests/test-redirect-302.js | 41 - .../tests/test-redirect-303.js | 41 - .../tests/test-redirect-307.js | 43 - .../tests/test-request-methods.js | 62 - .../tests/test-request-protocols.js | 32 - .../xmlhttprequest-ssl/tests/testdata.txt | 1 - web/static/js9_old/params/datapath.html | 44 - web/static/js9_old/params/evfilter.html | 112 - web/static/js9_old/params/filepath.html | 43 - web/static/js9_old/params/histplot.html | 105 - web/static/js9_old/params/lightclose.html | 101 - web/static/js9_old/params/load.html | 569 - web/static/js9_old/params/loadcors.html | 47 - web/static/js9_old/params/loadproxy.html | 42 - web/static/js9_old/params/plotconfig.html | 132 - web/static/js9_old/params/regionsconfig.html | 973 - web/static/js9_old/params/regionssave.html | 431 - .../js9_old/plugins/archive/CORS-proxy.cgi | 78 - web/static/js9_old/plugins/archive/README | 1 - .../js9_old/plugins/archive/archive.html | 46 - web/static/js9_old/plugins/archive/archive.js | 897 - .../js9_old/plugins/archive/simbad-proxy.cgi | 82 - web/static/js9_old/plugins/core/blend.css | 54 - web/static/js9_old/plugins/core/blend.js | 389 - web/static/js9_old/plugins/core/blink.css | 54 - web/static/js9_old/plugins/core/blink.js | 350 - web/static/js9_old/plugins/core/cmaps.css | 34 - web/static/js9_old/plugins/core/cmaps.js | 659 - web/static/js9_old/plugins/core/colorbar.css | 9 - web/static/js9_old/plugins/core/colorbar.js | 325 - .../js9_old/plugins/core/colorcontrols.css | 51 - .../js9_old/plugins/core/colorcontrols.js | 539 - web/static/js9_old/plugins/core/console.js | 257 - web/static/js9_old/plugins/core/cube.css | 36 - web/static/js9_old/plugins/core/cube.js | 440 - web/static/js9_old/plugins/core/divs.css | 31 - web/static/js9_old/plugins/core/divs.js | 135 - web/static/js9_old/plugins/core/filters.css | 77 - web/static/js9_old/plugins/core/filters.js | 337 - web/static/js9_old/plugins/core/imarith.css | 13 - web/static/js9_old/plugins/core/imarith.js | 222 - web/static/js9_old/plugins/core/info.js | 390 - web/static/js9_old/plugins/core/keyboard.css | 49 - web/static/js9_old/plugins/core/keyboard.js | 862 - web/static/js9_old/plugins/core/layers.css | 39 - web/static/js9_old/plugins/core/layers.js | 290 - web/static/js9_old/plugins/core/magnifier.js | 294 - web/static/js9_old/plugins/core/mef.css | 42 - web/static/js9_old/plugins/core/mef.js | 191 - web/static/js9_old/plugins/core/menubar.js | 3278 - .../js9_old/plugins/core/mousetouch.css | 30 - web/static/js9_old/plugins/core/panner.js | 614 - web/static/js9_old/plugins/core/prefs.js | 1094 - .../js9_old/plugins/core/scalecontrols.css | 17 - .../js9_old/plugins/core/scalecontrols.js | 515 - web/static/js9_old/plugins/core/separate.css | 54 - web/static/js9_old/plugins/core/separate.js | 302 - web/static/js9_old/plugins/core/statusbar.css | 67 - web/static/js9_old/plugins/core/statusbar.js | 252 - web/static/js9_old/plugins/core/sync.js | 625 - web/static/js9_old/plugins/core/syncui.css | 127 - web/static/js9_old/plugins/core/syncui.js | 464 - web/static/js9_old/plugins/core/toolbar.css | 76 - web/static/js9_old/plugins/core/toolbar.js | 446 - .../js9_old/plugins/core/zoomcontrols.css | 48 - .../js9_old/plugins/core/zoomcontrols.js | 503 - web/static/js9_old/plugins/fitsy/README | 1 - web/static/js9_old/plugins/fitsy/binning.html | 134 - web/static/js9_old/plugins/fitsy/binning.js | 352 - web/static/js9_old/plugins/fitsy/bzip2.js | 283 - web/static/js9_old/plugins/fitsy/fitsy.js | 1247 - .../js9_old/plugins/fitsy/lzma_worker.js | 3934 - .../js9_old/plugins/fitsy/pako_inflate.min.js | 2 - web/static/js9_old/plugins/help/blend.html | 82 - web/static/js9_old/plugins/help/blink.html | 36 - web/static/js9_old/plugins/help/cmaps.html | 75 - web/static/js9_old/plugins/help/colorbar.html | 34 - .../js9_old/plugins/help/colorcontrols.html | 74 - web/static/js9_old/plugins/help/console.html | 82 - web/static/js9_old/plugins/help/cube.html | 38 - web/static/js9_old/plugins/help/divs.html | 29 - web/static/js9_old/plugins/help/filters.html | 89 - web/static/js9_old/plugins/help/imarith.html | 44 - web/static/js9_old/plugins/help/info.html | 53 - web/static/js9_old/plugins/help/keyboard.html | 71 - web/static/js9_old/plugins/help/layers.html | 44 - .../js9_old/plugins/help/magnifier.html | 28 - web/static/js9_old/plugins/help/mef.html | 40 - .../js9_old/plugins/help/mousetouch.html | 51 - web/static/js9_old/plugins/help/panner.html | 31 - .../js9_old/plugins/help/plugintest.html | 22 - web/static/js9_old/plugins/help/prefs.html | 44 - .../js9_old/plugins/help/scalecontrols.html | 98 - web/static/js9_old/plugins/help/separate.html | 40 - .../js9_old/plugins/help/statusbar.html | 104 - web/static/js9_old/plugins/help/syncui.html | 53 - web/static/js9_old/plugins/help/toolbar.html | 99 - .../js9_old/plugins/help/zoomcontrols.html | 42 - web/static/js9_old/plugins/imexam/3dplot.js | 1490 - web/static/js9_old/plugins/imexam/4arrow.png | Bin 1350 -> 0 bytes web/static/js9_old/plugins/imexam/README | 1 - web/static/js9_old/plugins/imexam/contour.js | 1039 - .../js9_old/plugins/imexam/contours.html | 54 - .../js9_old/plugins/imexam/encircled.js | 71 - web/static/js9_old/plugins/imexam/imcnts.js | 133 - web/static/js9_old/plugins/imexam/imexam.html | 126 - web/static/js9_old/plugins/imexam/imexam.js | 2543 - web/static/js9_old/plugins/imexam/pixtable.js | 116 - web/static/js9_old/plugins/imexam/radproj.js | 84 - web/static/js9_old/plugins/imexam/reghist.js | 93 - web/static/js9_old/plugins/imexam/regstat.js | 92 - web/static/js9_old/plugins/imexam/rghxrg.js | 71 - web/static/js9_old/plugins/imexam/xyproj.js | 119 - web/static/js9_old/plugins/plugintest.css | 14 - web/static/js9_old/plugins/plugintest.js | 291 - 1156 files changed, 495703 deletions(-) delete mode 100644 web/static/js9_old/analysis-plugins/fits2fits.json delete mode 100644 web/static/js9_old/analysis-plugins/imsection.json delete mode 100644 web/static/js9_old/analysis-plugins/js9Analysis-fits.json delete mode 100644 web/static/js9_old/analysis-plugins/js9Analysis-funtools.json delete mode 100644 web/static/js9_old/analysis-plugins/listhdus.json delete mode 100644 web/static/js9_old/analysis-plugins/loadProxy.json delete mode 100644 web/static/js9_old/analysis-plugins/quotacheck.json delete mode 100644 web/static/js9_old/analysis-plugins/uploadfits.json delete mode 100755 web/static/js9_old/analysis-wrappers/js9Xeq delete mode 100644 web/static/js9_old/astroem.js delete mode 100644 web/static/js9_old/astroemw.js delete mode 100755 web/static/js9_old/astroemw.wasm delete mode 100644 web/static/js9_old/css/dhtmlwindow.css delete mode 100644 web/static/js9_old/css/jquery.contextMenu-v2.8.0.css delete mode 100644 web/static/js9_old/css/jquery.contextMenu.css delete mode 100644 web/static/js9_old/css/spectrum.css delete mode 100644 web/static/js9_old/css/tabcontent.css delete mode 100644 web/static/js9_old/favicon.ico delete mode 100644 web/static/js9_old/font/context-menu-icons.eot delete mode 100644 web/static/js9_old/font/context-menu-icons.ttf delete mode 100644 web/static/js9_old/font/context-menu-icons.woff delete mode 100644 web/static/js9_old/font/context-menu-icons.woff2 delete mode 100644 web/static/js9_old/help/archives.html delete mode 100644 web/static/js9_old/help/changelog.html delete mode 100644 web/static/js9_old/help/desktop.html delete mode 100644 web/static/js9_old/help/extmsg.html delete mode 100644 web/static/js9_old/help/helper.html delete mode 100644 web/static/js9_old/help/install.html delete mode 100644 web/static/js9_old/help/knownissues.html delete mode 100644 web/static/js9_old/help/localtasks.html delete mode 100644 web/static/js9_old/help/memory.html delete mode 100644 web/static/js9_old/help/preferences.html delete mode 100644 web/static/js9_old/help/publicapi.html delete mode 100644 web/static/js9_old/help/python.html delete mode 100644 web/static/js9_old/help/regions.html delete mode 100644 web/static/js9_old/help/repfile.html delete mode 100644 web/static/js9_old/help/securityissues.html delete mode 100644 web/static/js9_old/help/serverside.html delete mode 100644 web/static/js9_old/help/user.html delete mode 100644 web/static/js9_old/help/webpage.html delete mode 100644 web/static/js9_old/help/yourdata.html delete mode 100644 web/static/js9_old/images/4arrow.png delete mode 100644 web/static/js9_old/images/checkmark.svg delete mode 100644 web/static/js9_old/images/close.gif delete mode 100644 web/static/js9_old/images/empty.svg delete mode 100644 web/static/js9_old/images/gears.png delete mode 100644 web/static/js9_old/images/indentbg.gif delete mode 100644 web/static/js9_old/images/indentbg2.gif delete mode 100644 web/static/js9_old/images/indentbg2_grey.png delete mode 100644 web/static/js9_old/images/indentbg_grey.png delete mode 100644 web/static/js9_old/images/js9-apple-touch-icon.icns delete mode 100644 web/static/js9_old/images/js9-apple-touch-icon.png delete mode 100644 web/static/js9_old/images/js9Readme.png delete mode 100644 web/static/js9_old/images/js9logo.png delete mode 100644 web/static/js9_old/images/js9logo/mac/js9logo-is32.icns delete mode 100644 web/static/js9_old/images/js9logo/mac/js9logo.icns delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_128.png delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_256.png delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_48.png delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_512.png delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_64.png delete mode 100644 web/static/js9_old/images/js9logo/png/js9logo_96.png delete mode 100644 web/static/js9_old/images/js9logo/win/js9logo_512.ico delete mode 100644 web/static/js9_old/images/min.gif delete mode 100644 web/static/js9_old/images/resize.gif delete mode 100644 web/static/js9_old/images/restore.gif delete mode 100644 web/static/js9_old/images/shade.gif delete mode 100644 web/static/js9_old/images/shadeactive.gif delete mode 100644 web/static/js9_old/images/si-logo.png delete mode 100644 web/static/js9_old/images/sun.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/10_4.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/2_2.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/5_5.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/8_3.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/annulus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/back.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/bin_minus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/bin_one.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/bin_plus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/blank.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/blk.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/blu.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/box.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/circle.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_a.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_aips0.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_b.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_bb.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_blue.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_color.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_cool.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_green.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_grey.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_he.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_heat.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_hsv.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_i8.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_inferno.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_magma.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_parula.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_plasma.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_rainbow.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_red.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_sls.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_staircase.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_standard.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cmap_viridis.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/contour.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/coords.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/cyn.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/ellipse.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/erase.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/filter.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/front.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/glvary.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/grn.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/incexl.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/lightcurve.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/lin.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/log.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/mag.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/mag_minus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/mag_one.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/mag_plus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/match.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/minus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/open.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/pan.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/plus.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/poly.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/pow.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/pur.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/red.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/smooth.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/spectrum.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/srcbkg.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/stats.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/text.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/wht.png delete mode 100644 web/static/js9_old/images/toolbar/dax_images/yel.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/10_4.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/2_2.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/5_5.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/8_3.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/annulus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/back.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/bin_minus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/bin_one.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/bin_plus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/blank.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/blk.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/blu.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/box.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/circle.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_a.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_aips0.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_b.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_bb.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_blue.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_color.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_cool.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_green.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_grey.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_he.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_heat.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_hsv.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_i8.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_inferno.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_magma.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_parula.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_plasma.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_rainbow.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_red.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_sls.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_staircase.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_standard.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cmap_viridis.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/contour.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/coords.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/cyn.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/ellipse.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/erase.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/filter.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/front.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/glvary.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/grn.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/incexl.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/lightcurve.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/lin.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/log.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/mag.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/mag_minus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/mag_one.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/mag_plus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/match.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/minus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/open.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/pan.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/plus.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/poly.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/pow.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/pur.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/red.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/smooth.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/spectrum.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/srcbkg.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/stats.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/text.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/wht.png delete mode 100644 web/static/js9_old/images/toolbar/odax_images/yel.png delete mode 120000 web/static/js9_old/images/toolbar/svg delete mode 100644 web/static/js9_old/images/toolbar/threedots.png delete mode 100644 web/static/js9_old/images/voyager.icns delete mode 100644 web/static/js9_old/images/voyager/binning_bin1.svg delete mode 100644 web/static/js9_old/images/voyager/binning_bin12.svg delete mode 100644 web/static/js9_old/images/voyager/binning_bin2.svg delete mode 100644 web/static/js9_old/images/voyager/color_a.png delete mode 100644 web/static/js9_old/images/voyager/color_aips0.png delete mode 100644 web/static/js9_old/images/voyager/color_b.png delete mode 100644 web/static/js9_old/images/voyager/color_bb.png delete mode 100644 web/static/js9_old/images/voyager/color_blue.png delete mode 100644 web/static/js9_old/images/voyager/color_color.png delete mode 100644 web/static/js9_old/images/voyager/color_cool.png delete mode 100644 web/static/js9_old/images/voyager/color_green.png delete mode 100644 web/static/js9_old/images/voyager/color_grey.png delete mode 100644 web/static/js9_old/images/voyager/color_he.png delete mode 100644 web/static/js9_old/images/voyager/color_heat.png delete mode 100644 web/static/js9_old/images/voyager/color_hsv.png delete mode 100644 web/static/js9_old/images/voyager/color_i8.png delete mode 100644 web/static/js9_old/images/voyager/color_inferno.png delete mode 100644 web/static/js9_old/images/voyager/color_magma.png delete mode 100644 web/static/js9_old/images/voyager/color_parula.png delete mode 100644 web/static/js9_old/images/voyager/color_plasma.png delete mode 100644 web/static/js9_old/images/voyager/color_rainbow.png delete mode 100644 web/static/js9_old/images/voyager/color_red.png delete mode 100644 web/static/js9_old/images/voyager/color_sls.png delete mode 100644 web/static/js9_old/images/voyager/color_staircase.png delete mode 100644 web/static/js9_old/images/voyager/color_standard.png delete mode 100644 web/static/js9_old/images/voyager/color_turbo.png delete mode 100644 web/static/js9_old/images/voyager/color_viridis.png delete mode 100644 web/static/js9_old/images/voyager/regions_annulus.svg delete mode 100644 web/static/js9_old/images/voyager/regions_box.svg delete mode 100644 web/static/js9_old/images/voyager/regions_circle.svg delete mode 100644 web/static/js9_old/images/voyager/regions_cross.svg delete mode 100644 web/static/js9_old/images/voyager/regions_ellipse.svg delete mode 100644 web/static/js9_old/images/voyager/regions_line.svg delete mode 100644 web/static/js9_old/images/voyager/regions_point.svg delete mode 100644 web/static/js9_old/images/voyager/regions_polygon.svg delete mode 100644 web/static/js9_old/images/voyager/regions_text.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_1.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_in.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_mag.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_out.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_tofit.svg delete mode 100644 web/static/js9_old/images/voyager/zoom_zoom.svg delete mode 100644 web/static/js9_old/images/voyagerlogo.png delete mode 100755 web/static/js9_old/js/ElementQueries.js delete mode 100644 web/static/js9_old/js/ElementQueries.min.js delete mode 100644 web/static/js9_old/js/FileSaver.js delete mode 100644 web/static/js9_old/js/FileSaver.min.js delete mode 100644 web/static/js9_old/js/README delete mode 100755 web/static/js9_old/js/ResizeSensor.js delete mode 100644 web/static/js9_old/js/ResizeSensor.min.js delete mode 100644 web/static/js9_old/js/arrive.js delete mode 100644 web/static/js9_old/js/arrive.min.js delete mode 100644 web/static/js9_old/js/bzip2.js delete mode 100644 web/static/js9_old/js/caman.full.js delete mode 100644 web/static/js9_old/js/canvas-toBlob.js delete mode 100644 web/static/js9_old/js/dhtmlwindow.js delete mode 100644 web/static/js9_old/js/dhtmlwindow.min.js delete mode 100644 web/static/js9_old/js/dhtmlwindow_blurb.js delete mode 100644 web/static/js9_old/js/fabric-v4.5.1.js delete mode 100644 web/static/js9_old/js/fabric-v4.5.1.min.js delete mode 100644 web/static/js9_old/js/fabric-v4.6.0.js delete mode 100644 web/static/js9_old/js/fabric-v4.6.0.min.js delete mode 100644 web/static/js9_old/js/fabric-v5.2.1.js delete mode 100644 web/static/js9_old/js/fabric-v5.2.1.min.js delete mode 120000 web/static/js9_old/js/fabric.js delete mode 120000 web/static/js9_old/js/fabric.min.js delete mode 100644 web/static/js9_old/js/flot-zoom.js delete mode 100644 web/static/js9_old/js/flot-zoom.min.js delete mode 100644 web/static/js9_old/js/gaussblur-orig.js delete mode 100644 web/static/js9_old/js/gaussblur.js delete mode 100644 web/static/js9_old/js/gaussblur.min.js delete mode 100644 web/static/js9_old/js/imagefilters.js delete mode 100644 web/static/js9_old/js/imagefilters.min.js delete mode 100644 web/static/js9_old/js/jquery-3.5.0.js delete mode 100644 web/static/js9_old/js/jquery-3.5.0.min.js delete mode 100644 web/static/js9_old/js/jquery-migrate-3.1.0.js delete mode 100644 web/static/js9_old/js/jquery-migrate-3.1.0.min.js delete mode 100644 web/static/js9_old/js/jquery-ui-1.12.1.js delete mode 100644 web/static/js9_old/js/jquery-ui-1.12.1.min.js delete mode 120000 web/static/js9_old/js/jquery-ui.js delete mode 120000 web/static/js9_old/js/jquery-ui.min.js delete mode 100644 web/static/js9_old/js/jquery.caret.js delete mode 100644 web/static/js9_old/js/jquery.caret.min.js delete mode 100644 web/static/js9_old/js/jquery.colorhelpers.js delete mode 100755 web/static/js9_old/js/jquery.colorhelpers.min.js delete mode 100755 web/static/js9_old/js/jquery.contextMenu-v2.6.3.js delete mode 100755 web/static/js9_old/js/jquery.contextMenu-v2.6.3.min.js delete mode 100755 web/static/js9_old/js/jquery.contextMenu-v2.8.0.js delete mode 100755 web/static/js9_old/js/jquery.contextMenu.js delete mode 100644 web/static/js9_old/js/jquery.contextMenu.min.js delete mode 100644 web/static/js9_old/js/jquery.doubletap.js delete mode 100644 web/static/js9_old/js/jquery.doubletap.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.axislabels.js delete mode 100644 web/static/js9_old/js/jquery.flot.axislabels.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.canvas.js delete mode 100644 web/static/js9_old/js/jquery.flot.canvas.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.categories.js delete mode 100644 web/static/js9_old/js/jquery.flot.categories.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.crosshair.js delete mode 100644 web/static/js9_old/js/jquery.flot.crosshair.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.errorbars.js delete mode 100644 web/static/js9_old/js/jquery.flot.errorbars.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.fillbetween.js delete mode 100644 web/static/js9_old/js/jquery.flot.fillbetween.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.image.js delete mode 100644 web/static/js9_old/js/jquery.flot.image.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.js delete mode 100644 web/static/js9_old/js/jquery.flot.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.navigate.js delete mode 100644 web/static/js9_old/js/jquery.flot.navigate.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.pie.js delete mode 100644 web/static/js9_old/js/jquery.flot.pie.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.resize.js delete mode 100644 web/static/js9_old/js/jquery.flot.resize.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.selection.js delete mode 100644 web/static/js9_old/js/jquery.flot.selection.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.stack.js delete mode 100644 web/static/js9_old/js/jquery.flot.stack.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.symbol.js delete mode 100644 web/static/js9_old/js/jquery.flot.symbol.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.threshold.js delete mode 100644 web/static/js9_old/js/jquery.flot.threshold.min.js delete mode 100644 web/static/js9_old/js/jquery.flot.time.js delete mode 100644 web/static/js9_old/js/jquery.flot.time.min.js delete mode 120000 web/static/js9_old/js/jquery.js delete mode 100644 web/static/js9_old/js/jquery.mark.es6.js delete mode 100644 web/static/js9_old/js/jquery.mark.es6.min.js delete mode 120000 web/static/js9_old/js/jquery.min.js delete mode 100644 web/static/js9_old/js/jquery.ui.touch-punch.js delete mode 100644 web/static/js9_old/js/jquery.ui.touch-punch.min.js delete mode 100644 web/static/js9_old/js/js9inline.js delete mode 100644 web/static/js9_old/js/jsmanipulate.js delete mode 100644 web/static/js9_old/js/minify-warnings-v20190909.log delete mode 100755 web/static/js9_old/js/nf delete mode 100644 web/static/js9_old/js/pako_inflate.js delete mode 100644 web/static/js9_old/js/pako_inflate.min.js delete mode 100644 web/static/js9_old/js/regSelect.js delete mode 100644 web/static/js9_old/js/spectrum.js delete mode 100644 web/static/js9_old/js/spectrum.min.js delete mode 100644 web/static/js9_old/js/spin.js delete mode 100644 web/static/js9_old/js/spin.min.js delete mode 100644 web/static/js9_old/js/sprintf.js delete mode 100644 web/static/js9_old/js/sprintf.min.js delete mode 100644 web/static/js9_old/js/tabcontent.js delete mode 100644 web/static/js9_old/js/tinycolor.js delete mode 100644 web/static/js9_old/js/tinycolor.min.js delete mode 100644 web/static/js9_old/js/winmod.js delete mode 100644 web/static/js9_old/js/zee.js delete mode 100644 web/static/js9_old/js/zpipe.js delete mode 100644 web/static/js9_old/js9-allinone.css delete mode 100644 web/static/js9_old/js9-allinone.js delete mode 100644 web/static/js9_old/js9.css delete mode 100644 web/static/js9_old/js9.html delete mode 100644 web/static/js9_old/js9.js delete mode 100644 web/static/js9_old/js9.min.js delete mode 100644 web/static/js9_old/js9Electron.js delete mode 100644 web/static/js9_old/js9ElectronMainMenu.js delete mode 100644 web/static/js9_old/js9ElectronPreload.js delete mode 100644 web/static/js9_old/js9Helper.js delete mode 100644 web/static/js9_old/js9Msg.js delete mode 100644 web/static/js9_old/js9PostMessage.js delete mode 100644 web/static/js9_old/js9Prefs.json delete mode 100644 web/static/js9_old/js9Regions.js delete mode 100644 web/static/js9_old/js9plugins.js delete mode 100644 web/static/js9_old/js9prefs.js delete mode 100644 web/static/js9_old/js9support.css delete mode 100644 web/static/js9_old/js9support.js delete mode 100644 web/static/js9_old/js9support.min.js delete mode 100644 web/static/js9_old/js9support.txt delete mode 100644 web/static/js9_old/js9worker.js delete mode 120000 web/static/js9_old/node_modules/.bin/is-docker delete mode 120000 web/static/js9_old/node_modules/.bin/node-gyp-build delete mode 120000 web/static/js9_old/node_modules/.bin/node-gyp-build-optional delete mode 120000 web/static/js9_old/node_modules/.bin/node-gyp-build-test delete mode 120000 web/static/js9_old/node_modules/.bin/rimraf delete mode 120000 web/static/js9_old/node_modules/.bin/uuid delete mode 100644 web/static/js9_old/node_modules/.package-lock.json delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/LICENSE delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/README.md delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/base64-arraybuffer.es5.js delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/base64-arraybuffer.es5.js.map delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/base64-arraybuffer.umd.js delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/base64-arraybuffer.umd.js.map delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/lib/index.js delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/lib/index.js.map delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/dist/types/index.d.ts delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/package.json delete mode 100644 web/static/js9_old/node_modules/@socket.io/base64-arraybuffer/src/index.ts delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/LICENSE delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/Readme.md delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/index.d.ts delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/index.js delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/index.mjs delete mode 100644 web/static/js9_old/node_modules/@socket.io/component-emitter/package.json delete mode 100644 web/static/js9_old/node_modules/@types/component-emitter/LICENSE delete mode 100644 web/static/js9_old/node_modules/@types/component-emitter/README.md delete mode 100644 web/static/js9_old/node_modules/@types/component-emitter/index.d.ts delete mode 100644 web/static/js9_old/node_modules/@types/component-emitter/package.json delete mode 100755 web/static/js9_old/node_modules/@types/cookie/LICENSE delete mode 100755 web/static/js9_old/node_modules/@types/cookie/README.md delete mode 100755 web/static/js9_old/node_modules/@types/cookie/index.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/cookie/package.json delete mode 100755 web/static/js9_old/node_modules/@types/cors/LICENSE delete mode 100755 web/static/js9_old/node_modules/@types/cors/README.md delete mode 100755 web/static/js9_old/node_modules/@types/cors/index.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/cors/package.json delete mode 100755 web/static/js9_old/node_modules/@types/node/LICENSE delete mode 100755 web/static/js9_old/node_modules/@types/node/README.md delete mode 100755 web/static/js9_old/node_modules/@types/node/assert.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/assert/strict.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/async_hooks.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/buffer.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/child_process.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/cluster.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/console.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/constants.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/crypto.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/dgram.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/diagnostics_channel.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/dns.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/dns/promises.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/domain.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/events.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/fs.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/fs/promises.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/globals.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/globals.global.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/http.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/http2.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/https.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/index.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/inspector.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/module.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/net.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/os.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/package.json delete mode 100755 web/static/js9_old/node_modules/@types/node/path.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/perf_hooks.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/process.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/punycode.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/querystring.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/readline.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/repl.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/stream.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/stream/consumers.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/stream/promises.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/stream/web.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/string_decoder.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/timers.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/timers/promises.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/tls.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/trace_events.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/tty.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/url.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/util.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/v8.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/vm.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/wasi.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/worker_threads.d.ts delete mode 100755 web/static/js9_old/node_modules/@types/node/zlib.d.ts delete mode 100644 web/static/js9_old/node_modules/accepts/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/accepts/LICENSE delete mode 100644 web/static/js9_old/node_modules/accepts/README.md delete mode 100644 web/static/js9_old/node_modules/accepts/index.js delete mode 100644 web/static/js9_old/node_modules/accepts/package.json delete mode 100644 web/static/js9_old/node_modules/balanced-match/.npmignore delete mode 100644 web/static/js9_old/node_modules/balanced-match/LICENSE.md delete mode 100644 web/static/js9_old/node_modules/balanced-match/README.md delete mode 100644 web/static/js9_old/node_modules/balanced-match/index.js delete mode 100644 web/static/js9_old/node_modules/balanced-match/package.json delete mode 100644 web/static/js9_old/node_modules/base64id/CHANGELOG.md delete mode 100644 web/static/js9_old/node_modules/base64id/LICENSE delete mode 100644 web/static/js9_old/node_modules/base64id/README.md delete mode 100644 web/static/js9_old/node_modules/base64id/lib/base64id.js delete mode 100644 web/static/js9_old/node_modules/base64id/package.json delete mode 100644 web/static/js9_old/node_modules/brace-expansion/LICENSE delete mode 100644 web/static/js9_old/node_modules/brace-expansion/README.md delete mode 100644 web/static/js9_old/node_modules/brace-expansion/index.js delete mode 100644 web/static/js9_old/node_modules/brace-expansion/package.json delete mode 100644 web/static/js9_old/node_modules/component-emitter/History.md delete mode 100644 web/static/js9_old/node_modules/component-emitter/LICENSE delete mode 100644 web/static/js9_old/node_modules/component-emitter/Readme.md delete mode 100644 web/static/js9_old/node_modules/component-emitter/index.js delete mode 100644 web/static/js9_old/node_modules/component-emitter/package.json delete mode 100644 web/static/js9_old/node_modules/concat-map/.travis.yml delete mode 100644 web/static/js9_old/node_modules/concat-map/LICENSE delete mode 100644 web/static/js9_old/node_modules/concat-map/README.markdown delete mode 100644 web/static/js9_old/node_modules/concat-map/example/map.js delete mode 100644 web/static/js9_old/node_modules/concat-map/index.js delete mode 100644 web/static/js9_old/node_modules/concat-map/package.json delete mode 100644 web/static/js9_old/node_modules/concat-map/test/map.js delete mode 100644 web/static/js9_old/node_modules/cookie/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/cookie/LICENSE delete mode 100644 web/static/js9_old/node_modules/cookie/README.md delete mode 100644 web/static/js9_old/node_modules/cookie/index.js delete mode 100644 web/static/js9_old/node_modules/cookie/package.json delete mode 100644 web/static/js9_old/node_modules/cors/CONTRIBUTING.md delete mode 100644 web/static/js9_old/node_modules/cors/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/cors/LICENSE delete mode 100644 web/static/js9_old/node_modules/cors/README.md delete mode 100644 web/static/js9_old/node_modules/cors/lib/index.js delete mode 100644 web/static/js9_old/node_modules/cors/package.json delete mode 100644 web/static/js9_old/node_modules/debug/LICENSE delete mode 100644 web/static/js9_old/node_modules/debug/README.md delete mode 100644 web/static/js9_old/node_modules/debug/Readme.md delete mode 100644 web/static/js9_old/node_modules/debug/package.json delete mode 100644 web/static/js9_old/node_modules/debug/src/browser.js delete mode 100644 web/static/js9_old/node_modules/debug/src/common.js delete mode 100644 web/static/js9_old/node_modules/debug/src/index.js delete mode 100644 web/static/js9_old/node_modules/debug/src/node.js delete mode 100644 web/static/js9_old/node_modules/define-lazy-prop/index.d.ts delete mode 100644 web/static/js9_old/node_modules/define-lazy-prop/index.js delete mode 100644 web/static/js9_old/node_modules/define-lazy-prop/license delete mode 100644 web/static/js9_old/node_modules/define-lazy-prop/package.json delete mode 100644 web/static/js9_old/node_modules/define-lazy-prop/readme.md delete mode 100644 web/static/js9_old/node_modules/engine.io-client/LICENSE delete mode 100644 web/static/js9_old/node_modules/engine.io-client/README.md delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/contrib/has-cors.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/contrib/parseqs.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/contrib/parseuri.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/contrib/yeast.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/globalThis.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/globalThis.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/socket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transport.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/polling.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/websocket-constructor.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/websocket-constructor.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/websocket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/xmlhttprequest.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/transports/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/util.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/cjs/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/has-cors.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/parseqs.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/parseuri.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/yeast.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/contrib/yeast.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/globalThis.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/globalThis.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/globalThis.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/globalThis.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/socket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transport.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transport.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/polling.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/polling.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket-constructor.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket-constructor.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket-constructor.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket-constructor.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/websocket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/xmlhttprequest.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/xmlhttprequest.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/xmlhttprequest.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/transports/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/util.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/util.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/xmlhttprequest.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm-debug/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/browser-entrypoint.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/has-cors.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/has-cors.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/parseqs.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/parseqs.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/parseuri.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/parseuri.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/yeast.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/contrib/yeast.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/globalThis.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/globalThis.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/globalThis.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/globalThis.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/socket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transport.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transport.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/polling.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/polling.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket-constructor.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket-constructor.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket-constructor.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/websocket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/xmlhttprequest.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/xmlhttprequest.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/transports/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/util.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/util.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/xmlhttprequest.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-client/build/esm/xmlhttprequest.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.esm.min.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.esm.min.js.map delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.js.map delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.min.js delete mode 100644 web/static/js9_old/node_modules/engine.io-client/dist/engine.io.min.js.map delete mode 100644 web/static/js9_old/node_modules/engine.io-client/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/LICENSE delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/Readme.md delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/commons.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/decodePacket.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/decodePacket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/encodePacket.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/encodePacket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/cjs/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/commons.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/commons.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/decodePacket.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/decodePacket.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/decodePacket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/decodePacket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/encodePacket.browser.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/encodePacket.browser.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/encodePacket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/encodePacket.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/build/esm/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io-parser/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io/LICENSE delete mode 100644 web/static/js9_old/node_modules/engine.io/README.md delete mode 100644 web/static/js9_old/node_modules/engine.io/build/engine.io.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/engine.io.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/parser-v3/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/parser-v3/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/parser-v3/utf8.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/parser-v3/utf8.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/server.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/server.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/socket.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transport.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transport.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/polling.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/polling.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/websocket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports-uws/websocket.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/index.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/index.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/polling-jsonp.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/polling-jsonp.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/polling.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/polling.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/websocket.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/transports/websocket.js delete mode 100644 web/static/js9_old/node_modules/engine.io/build/userver.d.ts delete mode 100644 web/static/js9_old/node_modules/engine.io/build/userver.js delete mode 100644 web/static/js9_old/node_modules/engine.io/package.json delete mode 100644 web/static/js9_old/node_modules/engine.io/wrapper.mjs delete mode 100644 web/static/js9_old/node_modules/fs.realpath/LICENSE delete mode 100644 web/static/js9_old/node_modules/fs.realpath/README.md delete mode 100644 web/static/js9_old/node_modules/fs.realpath/index.js delete mode 100644 web/static/js9_old/node_modules/fs.realpath/old.js delete mode 100644 web/static/js9_old/node_modules/fs.realpath/package.json delete mode 100644 web/static/js9_old/node_modules/glob/LICENSE delete mode 100644 web/static/js9_old/node_modules/glob/README.md delete mode 100644 web/static/js9_old/node_modules/glob/changelog.md delete mode 100644 web/static/js9_old/node_modules/glob/common.js delete mode 100644 web/static/js9_old/node_modules/glob/glob.js delete mode 100644 web/static/js9_old/node_modules/glob/package.json delete mode 100644 web/static/js9_old/node_modules/glob/sync.js delete mode 100644 web/static/js9_old/node_modules/inflight/LICENSE delete mode 100644 web/static/js9_old/node_modules/inflight/README.md delete mode 100644 web/static/js9_old/node_modules/inflight/inflight.js delete mode 100644 web/static/js9_old/node_modules/inflight/package.json delete mode 100644 web/static/js9_old/node_modules/inherits/LICENSE delete mode 100644 web/static/js9_old/node_modules/inherits/README.md delete mode 100644 web/static/js9_old/node_modules/inherits/inherits.js delete mode 100644 web/static/js9_old/node_modules/inherits/inherits_browser.js delete mode 100644 web/static/js9_old/node_modules/inherits/package.json delete mode 100755 web/static/js9_old/node_modules/is-docker/cli.js delete mode 100644 web/static/js9_old/node_modules/is-docker/index.d.ts delete mode 100644 web/static/js9_old/node_modules/is-docker/index.js delete mode 100644 web/static/js9_old/node_modules/is-docker/license delete mode 100644 web/static/js9_old/node_modules/is-docker/package.json delete mode 100644 web/static/js9_old/node_modules/is-docker/readme.md delete mode 100644 web/static/js9_old/node_modules/is-wsl/index.d.ts delete mode 100644 web/static/js9_old/node_modules/is-wsl/index.js delete mode 100644 web/static/js9_old/node_modules/is-wsl/license delete mode 100644 web/static/js9_old/node_modules/is-wsl/package.json delete mode 100644 web/static/js9_old/node_modules/is-wsl/readme.md delete mode 100644 web/static/js9_old/node_modules/mime-db/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/mime-db/LICENSE delete mode 100644 web/static/js9_old/node_modules/mime-db/README.md delete mode 100644 web/static/js9_old/node_modules/mime-db/db.json delete mode 100644 web/static/js9_old/node_modules/mime-db/index.js delete mode 100644 web/static/js9_old/node_modules/mime-db/package.json delete mode 100644 web/static/js9_old/node_modules/mime-types/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/mime-types/LICENSE delete mode 100644 web/static/js9_old/node_modules/mime-types/README.md delete mode 100644 web/static/js9_old/node_modules/mime-types/index.js delete mode 100644 web/static/js9_old/node_modules/mime-types/package.json delete mode 100644 web/static/js9_old/node_modules/minimatch/LICENSE delete mode 100644 web/static/js9_old/node_modules/minimatch/README.md delete mode 100644 web/static/js9_old/node_modules/minimatch/minimatch.js delete mode 100644 web/static/js9_old/node_modules/minimatch/package.json delete mode 100644 web/static/js9_old/node_modules/minimist/.travis.yml delete mode 100644 web/static/js9_old/node_modules/minimist/LICENSE delete mode 100644 web/static/js9_old/node_modules/minimist/example/parse.js delete mode 100644 web/static/js9_old/node_modules/minimist/index.js delete mode 100644 web/static/js9_old/node_modules/minimist/package.json delete mode 100644 web/static/js9_old/node_modules/minimist/readme.markdown delete mode 100644 web/static/js9_old/node_modules/minimist/test/all_bool.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/bool.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/dash.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/default_bool.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/dotted.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/kv_short.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/long.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/num.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/parse.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/parse_modified.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/proto.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/short.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/stop_early.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/unknown.js delete mode 100644 web/static/js9_old/node_modules/minimist/test/whitespace.js delete mode 100644 web/static/js9_old/node_modules/ms/LICENSE.md delete mode 100644 web/static/js9_old/node_modules/ms/README.md delete mode 100644 web/static/js9_old/node_modules/ms/index.js delete mode 100644 web/static/js9_old/node_modules/ms/license.md delete mode 100644 web/static/js9_old/node_modules/ms/package.json delete mode 100644 web/static/js9_old/node_modules/ms/readme.md delete mode 100644 web/static/js9_old/node_modules/negotiator/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/negotiator/LICENSE delete mode 100644 web/static/js9_old/node_modules/negotiator/README.md delete mode 100644 web/static/js9_old/node_modules/negotiator/index.js delete mode 100644 web/static/js9_old/node_modules/negotiator/lib/charset.js delete mode 100644 web/static/js9_old/node_modules/negotiator/lib/encoding.js delete mode 100644 web/static/js9_old/node_modules/negotiator/lib/language.js delete mode 100644 web/static/js9_old/node_modules/negotiator/lib/mediaType.js delete mode 100644 web/static/js9_old/node_modules/negotiator/package.json delete mode 100644 web/static/js9_old/node_modules/node-gyp-build/LICENSE delete mode 100644 web/static/js9_old/node_modules/node-gyp-build/README.md delete mode 100755 web/static/js9_old/node_modules/node-gyp-build/bin.js delete mode 100755 web/static/js9_old/node_modules/node-gyp-build/build-test.js delete mode 100644 web/static/js9_old/node_modules/node-gyp-build/index.js delete mode 100755 web/static/js9_old/node_modules/node-gyp-build/optional.js delete mode 100644 web/static/js9_old/node_modules/node-gyp-build/package.json delete mode 100644 web/static/js9_old/node_modules/object-assign/index.js delete mode 100644 web/static/js9_old/node_modules/object-assign/license delete mode 100644 web/static/js9_old/node_modules/object-assign/package.json delete mode 100644 web/static/js9_old/node_modules/object-assign/readme.md delete mode 100644 web/static/js9_old/node_modules/once/LICENSE delete mode 100644 web/static/js9_old/node_modules/once/README.md delete mode 100644 web/static/js9_old/node_modules/once/once.js delete mode 100644 web/static/js9_old/node_modules/once/package.json delete mode 100644 web/static/js9_old/node_modules/open/index.d.ts delete mode 100644 web/static/js9_old/node_modules/open/index.js delete mode 100644 web/static/js9_old/node_modules/open/license delete mode 100644 web/static/js9_old/node_modules/open/package.json delete mode 100644 web/static/js9_old/node_modules/open/readme.md delete mode 100755 web/static/js9_old/node_modules/open/xdg-open delete mode 100644 web/static/js9_old/node_modules/path-is-absolute/index.js delete mode 100644 web/static/js9_old/node_modules/path-is-absolute/license delete mode 100644 web/static/js9_old/node_modules/path-is-absolute/package.json delete mode 100644 web/static/js9_old/node_modules/path-is-absolute/readme.md delete mode 100644 web/static/js9_old/node_modules/ps-list/index.d.ts delete mode 100644 web/static/js9_old/node_modules/ps-list/index.js delete mode 100644 web/static/js9_old/node_modules/ps-list/license delete mode 100644 web/static/js9_old/node_modules/ps-list/package.json delete mode 100644 web/static/js9_old/node_modules/ps-list/readme.md delete mode 100644 web/static/js9_old/node_modules/ps-list/vendor/fastlist-0.3.0-x64.exe delete mode 100644 web/static/js9_old/node_modules/ps-list/vendor/fastlist-0.3.0-x86.exe delete mode 100644 web/static/js9_old/node_modules/rimraf/CHANGELOG.md delete mode 100644 web/static/js9_old/node_modules/rimraf/LICENSE delete mode 100644 web/static/js9_old/node_modules/rimraf/README.md delete mode 100755 web/static/js9_old/node_modules/rimraf/bin.js delete mode 100644 web/static/js9_old/node_modules/rimraf/package.json delete mode 100644 web/static/js9_old/node_modules/rimraf/rimraf.js delete mode 100644 web/static/js9_old/node_modules/socket.io-adapter/LICENSE delete mode 100644 web/static/js9_old/node_modules/socket.io-adapter/Readme.md delete mode 100644 web/static/js9_old/node_modules/socket.io-adapter/dist/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-adapter/dist/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-adapter/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/LICENSE delete mode 100644 web/static/js9_old/node_modules/socket.io-client/README.md delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/contrib/backo2.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/manager.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/on.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/socket.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/cjs/url.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/contrib/backo2.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/contrib/backo2.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/manager.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/manager.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/on.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/on.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/socket.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/url.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm-debug/url.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/browser-entrypoint.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/browser-entrypoint.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/contrib/backo2.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/contrib/backo2.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/manager.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/manager.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/on.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/on.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/socket.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/url.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/build/esm/url.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.esm.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.esm.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.msgpack.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/dist/socket.io.msgpack.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/LICENSE delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/Readme.md delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/cjs/binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/cjs/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/cjs/is-binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/cjs/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/is-binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/is-binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm-debug/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/is-binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/is-binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/build/esm/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/node_modules/socket.io-parser/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-client/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/CHANGELOG.md delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/LICENSE delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/Readme.md delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/is-binary.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/dist/is-binary.js delete mode 100644 web/static/js9_old/node_modules/socket.io-parser/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io/LICENSE delete mode 100644 web/static/js9_old/node_modules/socket.io/Readme.md delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.esm.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.esm.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.js delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.msgpack.min.js delete mode 100644 web/static/js9_old/node_modules/socket.io/client-dist/socket.io.msgpack.min.js.map delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/broadcast-operator.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/broadcast-operator.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/client.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/client.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/index.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/index.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/namespace.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/namespace.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/parent-namespace.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/parent-namespace.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/socket.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/socket.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/typed-events.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/typed-events.js delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/uws.d.ts delete mode 100644 web/static/js9_old/node_modules/socket.io/dist/uws.js delete mode 100644 web/static/js9_old/node_modules/socket.io/package.json delete mode 100644 web/static/js9_old/node_modules/socket.io/wrapper.mjs delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/LICENSE delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/README.md delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/binding.gyp delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/fallback.js delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/index.js delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/package.json delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/darwin-x64/node.napi.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/linux-arm/node.napi.armv6.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/linux-arm/node.napi.armv7.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/linux-arm64/node.napi.armv8.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/linux-x64/node.napi.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/win32-ia32/node.napi.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/prebuilds/win32-x64/node.napi.node delete mode 100644 web/static/js9_old/node_modules/utf-8-validate/src/validation.c delete mode 100644 web/static/js9_old/node_modules/uuid/CHANGELOG.md delete mode 100644 web/static/js9_old/node_modules/uuid/CONTRIBUTING.md delete mode 100644 web/static/js9_old/node_modules/uuid/LICENSE.md delete mode 100644 web/static/js9_old/node_modules/uuid/README.md delete mode 100755 web/static/js9_old/node_modules/uuid/dist/bin/uuid delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/index.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/md5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/nil.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/parse.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/regex.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/rng.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/sha1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/stringify.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/v1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/v3.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/v35.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/v4.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/v5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/validate.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-browser/version.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/index.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/md5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/nil.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/parse.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/regex.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/rng.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/sha1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/stringify.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/v1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/v3.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/v35.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/v4.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/v5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/validate.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/esm-node/version.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/index.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/md5-browser.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/md5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/nil.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/parse.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/regex.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/rng-browser.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/rng.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/sha1-browser.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/sha1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/stringify.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuid.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidNIL.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidParse.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidStringify.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidValidate.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidVersion.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidv1.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidv3.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidv4.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/umd/uuidv5.min.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/uuid-bin.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/v1.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/v3.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/v35.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/v4.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/v5.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/validate.js delete mode 100644 web/static/js9_old/node_modules/uuid/dist/version.js delete mode 100644 web/static/js9_old/node_modules/uuid/package.json delete mode 100644 web/static/js9_old/node_modules/uuid/wrapper.mjs delete mode 100644 web/static/js9_old/node_modules/vary/HISTORY.md delete mode 100644 web/static/js9_old/node_modules/vary/LICENSE delete mode 100644 web/static/js9_old/node_modules/vary/README.md delete mode 100644 web/static/js9_old/node_modules/vary/index.js delete mode 100644 web/static/js9_old/node_modules/vary/package.json delete mode 100644 web/static/js9_old/node_modules/wrappy/LICENSE delete mode 100644 web/static/js9_old/node_modules/wrappy/README.md delete mode 100644 web/static/js9_old/node_modules/wrappy/package.json delete mode 100644 web/static/js9_old/node_modules/wrappy/wrappy.js delete mode 100644 web/static/js9_old/node_modules/ws/LICENSE delete mode 100644 web/static/js9_old/node_modules/ws/README.md delete mode 100644 web/static/js9_old/node_modules/ws/browser.js delete mode 100644 web/static/js9_old/node_modules/ws/index.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/buffer-util.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/constants.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/event-target.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/extension.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/limiter.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/permessage-deflate.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/receiver.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/sender.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/stream.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/subprotocol.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/validation.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/websocket-server.js delete mode 100644 web/static/js9_old/node_modules/ws/lib/websocket.js delete mode 100644 web/static/js9_old/node_modules/ws/package.json delete mode 100644 web/static/js9_old/node_modules/ws/wrapper.mjs delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/LICENSE delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/README.md delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/autotest.watchr delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/example/demo.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/lib/XMLHttpRequest.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/package.json delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-constants.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-events.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-exceptions.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-headers.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-redirect-302.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-redirect-303.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-redirect-307.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-request-methods.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/test-request-protocols.js delete mode 100644 web/static/js9_old/node_modules/xmlhttprequest-ssl/tests/testdata.txt delete mode 100644 web/static/js9_old/params/datapath.html delete mode 100644 web/static/js9_old/params/evfilter.html delete mode 100644 web/static/js9_old/params/filepath.html delete mode 100644 web/static/js9_old/params/histplot.html delete mode 100644 web/static/js9_old/params/lightclose.html delete mode 100644 web/static/js9_old/params/load.html delete mode 100644 web/static/js9_old/params/loadcors.html delete mode 100644 web/static/js9_old/params/loadproxy.html delete mode 100644 web/static/js9_old/params/plotconfig.html delete mode 100644 web/static/js9_old/params/regionsconfig.html delete mode 100644 web/static/js9_old/params/regionssave.html delete mode 100755 web/static/js9_old/plugins/archive/CORS-proxy.cgi delete mode 100644 web/static/js9_old/plugins/archive/README delete mode 100644 web/static/js9_old/plugins/archive/archive.html delete mode 100644 web/static/js9_old/plugins/archive/archive.js delete mode 100755 web/static/js9_old/plugins/archive/simbad-proxy.cgi delete mode 100644 web/static/js9_old/plugins/core/blend.css delete mode 100644 web/static/js9_old/plugins/core/blend.js delete mode 100644 web/static/js9_old/plugins/core/blink.css delete mode 100644 web/static/js9_old/plugins/core/blink.js delete mode 100644 web/static/js9_old/plugins/core/cmaps.css delete mode 100644 web/static/js9_old/plugins/core/cmaps.js delete mode 100644 web/static/js9_old/plugins/core/colorbar.css delete mode 100644 web/static/js9_old/plugins/core/colorbar.js delete mode 100644 web/static/js9_old/plugins/core/colorcontrols.css delete mode 100644 web/static/js9_old/plugins/core/colorcontrols.js delete mode 100644 web/static/js9_old/plugins/core/console.js delete mode 100644 web/static/js9_old/plugins/core/cube.css delete mode 100644 web/static/js9_old/plugins/core/cube.js delete mode 100644 web/static/js9_old/plugins/core/divs.css delete mode 100644 web/static/js9_old/plugins/core/divs.js delete mode 100644 web/static/js9_old/plugins/core/filters.css delete mode 100644 web/static/js9_old/plugins/core/filters.js delete mode 100644 web/static/js9_old/plugins/core/imarith.css delete mode 100644 web/static/js9_old/plugins/core/imarith.js delete mode 100644 web/static/js9_old/plugins/core/info.js delete mode 100644 web/static/js9_old/plugins/core/keyboard.css delete mode 100644 web/static/js9_old/plugins/core/keyboard.js delete mode 100644 web/static/js9_old/plugins/core/layers.css delete mode 100644 web/static/js9_old/plugins/core/layers.js delete mode 100644 web/static/js9_old/plugins/core/magnifier.js delete mode 100644 web/static/js9_old/plugins/core/mef.css delete mode 100644 web/static/js9_old/plugins/core/mef.js delete mode 100644 web/static/js9_old/plugins/core/menubar.js delete mode 100644 web/static/js9_old/plugins/core/mousetouch.css delete mode 100644 web/static/js9_old/plugins/core/panner.js delete mode 100644 web/static/js9_old/plugins/core/prefs.js delete mode 100644 web/static/js9_old/plugins/core/scalecontrols.css delete mode 100644 web/static/js9_old/plugins/core/scalecontrols.js delete mode 100644 web/static/js9_old/plugins/core/separate.css delete mode 100644 web/static/js9_old/plugins/core/separate.js delete mode 100644 web/static/js9_old/plugins/core/statusbar.css delete mode 100644 web/static/js9_old/plugins/core/statusbar.js delete mode 100644 web/static/js9_old/plugins/core/sync.js delete mode 100644 web/static/js9_old/plugins/core/syncui.css delete mode 100644 web/static/js9_old/plugins/core/syncui.js delete mode 100644 web/static/js9_old/plugins/core/toolbar.css delete mode 100644 web/static/js9_old/plugins/core/toolbar.js delete mode 100644 web/static/js9_old/plugins/core/zoomcontrols.css delete mode 100644 web/static/js9_old/plugins/core/zoomcontrols.js delete mode 100644 web/static/js9_old/plugins/fitsy/README delete mode 100644 web/static/js9_old/plugins/fitsy/binning.html delete mode 100644 web/static/js9_old/plugins/fitsy/binning.js delete mode 100644 web/static/js9_old/plugins/fitsy/bzip2.js delete mode 100644 web/static/js9_old/plugins/fitsy/fitsy.js delete mode 100644 web/static/js9_old/plugins/fitsy/lzma_worker.js delete mode 100644 web/static/js9_old/plugins/fitsy/pako_inflate.min.js delete mode 100644 web/static/js9_old/plugins/help/blend.html delete mode 100644 web/static/js9_old/plugins/help/blink.html delete mode 100644 web/static/js9_old/plugins/help/cmaps.html delete mode 100644 web/static/js9_old/plugins/help/colorbar.html delete mode 100644 web/static/js9_old/plugins/help/colorcontrols.html delete mode 100644 web/static/js9_old/plugins/help/console.html delete mode 100644 web/static/js9_old/plugins/help/cube.html delete mode 100644 web/static/js9_old/plugins/help/divs.html delete mode 100644 web/static/js9_old/plugins/help/filters.html delete mode 100644 web/static/js9_old/plugins/help/imarith.html delete mode 100644 web/static/js9_old/plugins/help/info.html delete mode 100644 web/static/js9_old/plugins/help/keyboard.html delete mode 100644 web/static/js9_old/plugins/help/layers.html delete mode 100644 web/static/js9_old/plugins/help/magnifier.html delete mode 100644 web/static/js9_old/plugins/help/mef.html delete mode 100644 web/static/js9_old/plugins/help/mousetouch.html delete mode 100644 web/static/js9_old/plugins/help/panner.html delete mode 100644 web/static/js9_old/plugins/help/plugintest.html delete mode 100644 web/static/js9_old/plugins/help/prefs.html delete mode 100644 web/static/js9_old/plugins/help/scalecontrols.html delete mode 100644 web/static/js9_old/plugins/help/separate.html delete mode 100644 web/static/js9_old/plugins/help/statusbar.html delete mode 100644 web/static/js9_old/plugins/help/syncui.html delete mode 100644 web/static/js9_old/plugins/help/toolbar.html delete mode 100644 web/static/js9_old/plugins/help/zoomcontrols.html delete mode 100644 web/static/js9_old/plugins/imexam/3dplot.js delete mode 100644 web/static/js9_old/plugins/imexam/4arrow.png delete mode 100644 web/static/js9_old/plugins/imexam/README delete mode 100644 web/static/js9_old/plugins/imexam/contour.js delete mode 100644 web/static/js9_old/plugins/imexam/contours.html delete mode 100644 web/static/js9_old/plugins/imexam/encircled.js delete mode 100644 web/static/js9_old/plugins/imexam/imcnts.js delete mode 100644 web/static/js9_old/plugins/imexam/imexam.html delete mode 100644 web/static/js9_old/plugins/imexam/imexam.js delete mode 100644 web/static/js9_old/plugins/imexam/pixtable.js delete mode 100644 web/static/js9_old/plugins/imexam/radproj.js delete mode 100644 web/static/js9_old/plugins/imexam/reghist.js delete mode 100644 web/static/js9_old/plugins/imexam/regstat.js delete mode 100644 web/static/js9_old/plugins/imexam/rghxrg.js delete mode 100644 web/static/js9_old/plugins/imexam/xyproj.js delete mode 100644 web/static/js9_old/plugins/plugintest.css delete mode 100644 web/static/js9_old/plugins/plugintest.js diff --git a/web/static/js9_old/analysis-plugins/fits2fits.json b/web/static/js9_old/analysis-plugins/fits2fits.json deleted file mode 100644 index 4b5df67..0000000 --- a/web/static/js9_old/analysis-plugins/fits2fits.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - {"name" : "fits2fits", - "title" : "Convert FITS to representation FITS", - "files" : "*", - "action" : "js9Xeq imsection", - "hidden" : true, - "rtype" : "fits"} -] diff --git a/web/static/js9_old/analysis-plugins/imsection.json b/web/static/js9_old/analysis-plugins/imsection.json deleted file mode 100644 index ff257b4..0000000 --- a/web/static/js9_old/analysis-plugins/imsection.json +++ /dev/null @@ -1,11 +0,0 @@ -[ - {"name" : "imsection", - "title" : "Extract an Image Section", - "files" : "fits", - "purl" : "./params/imsection.html", - "action" : "js9Xeq imsection $filename $xdim@$xcen,$ydim@$ycen,$bin $filter $slice", - "workDir": true, - "hidden" : true, - "rtype" : "fits"} -] - diff --git a/web/static/js9_old/analysis-plugins/js9Analysis-fits.json b/web/static/js9_old/analysis-plugins/js9Analysis-fits.json deleted file mode 100644 index bc47a34..0000000 --- a/web/static/js9_old/analysis-plugins/js9Analysis-fits.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - {"name" : "fitshead", - "title" : "FITS Header(s)", - "files" : "fits", - "action" : "js9Xeq fitshead $filename", - "rtype" : "text"}, - {"name" : "macros", - "title" : "Display Macros", - "action" : "js9Xeq macros $image $filename $filename(this) '$ext' '$imcenter' '$wcscenter' '$id' '$foo' '$sregions' '$bregions' '$regions(wcs)' '$regions(physical)' 'ampersand and backquote: `ls &`'", - "hidden" : true, - "rtype" : "text"} -] diff --git a/web/static/js9_old/analysis-plugins/js9Analysis-funtools.json b/web/static/js9_old/analysis-plugins/js9Analysis-funtools.json deleted file mode 100644 index 885ba21..0000000 --- a/web/static/js9_old/analysis-plugins/js9Analysis-funtools.json +++ /dev/null @@ -1,40 +0,0 @@ -[ - {"name" : "counts", - "title" : "Counts in Regions", - "files" : "fits", - "action" : "js9Xeq counts $filename $sregions $bregions", - "rtype" : "text"}, - {"name" : "cubecounts", - "title" : "Counts in Each Cube Slice", - "files" : "fitsHeader(NAXIS,3)", - "action" : "js9Xeq counts $filename(all) $sregions $bregions", - "rtype" : "text"}, - {"name" : "radialprofile", - "title" : "Radial Profile", - "files" : "fits", - "action" : "js9Xeq radialplot $filename $sregions $bregions", - "rtype" : "plot"}, - {"name" : "energyplot", - "title" : "Energy Spectrum", - "files" : "fits", - "action" : "js9Xeq histplot $filename[$regions] false false %energy 0", - "rtype" : "plot"}, - {"name" : "timeplot", - "title" : "Light Curve", - "files" : "fits", - "action" : "js9Xeq histplot $filename[$regions] false false %time 0", - "rtype" : "plot"}, - {"name" : "histplot", - "title" : "Histogram Plot", - "files" : "fits", - "purl" : "./params/histplot.html", - "action" : "js9Xeq histplot $filename[$regions] $norm $bwidth $column $bins", - "rtype" : "plot"}, - {"name" : "evfilter", - "title" : "Event Filter", - "files" : "fits", - "purl" : "./params/evfilter.html", - "action" : "js9Xeq evfilter $filename $filter $imcenter $dims", - "pwin" : "width=830px,height=218px,center=1,resize=1,scrolling=1", - "rtype" : "fits"} -] diff --git a/web/static/js9_old/analysis-plugins/listhdus.json b/web/static/js9_old/analysis-plugins/listhdus.json deleted file mode 100644 index 441ecad..0000000 --- a/web/static/js9_old/analysis-plugins/listhdus.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - {"name" : "listhdus", - "title" : "List HDUs in a FITS File", - "files" : "fits", - "action" : "js9Xeq listhdus $filename", - "hidden" : true, - "rtype" : "text"} -] diff --git a/web/static/js9_old/analysis-plugins/loadProxy.json b/web/static/js9_old/analysis-plugins/loadProxy.json deleted file mode 100644 index 1d90de8..0000000 --- a/web/static/js9_old/analysis-plugins/loadProxy.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - {"name" : "loadproxy", - "title" : "Open a Link via Server Proxy", - "files" : "*", - "purl" : "./params/loadproxy.html", - "action" : "js9Xeq loadproxy $url", - "workDir": true, - "hidden" : true, - "rtype" : "fits" - }, - {"name" : "removeproxy", - "title" : "Remove a File from the Proxy Server", - "files" : "*", - "action" : "js9Xeq removeproxy $proxyfile", - "workDir": true, - "hidden" : true, - "rtype" : "fits" - } -] - diff --git a/web/static/js9_old/analysis-plugins/quotacheck.json b/web/static/js9_old/analysis-plugins/quotacheck.json deleted file mode 100644 index c6ba95e..0000000 --- a/web/static/js9_old/analysis-plugins/quotacheck.json +++ /dev/null @@ -1,8 +0,0 @@ -[ - {"name" : "quotacheck", - "title" : "Check Quota for Remote Analysis", - "files" : "*", - "action" : "js9Xeq quotacheck", - "hidden" : true, - "rtype" : "text"} -] diff --git a/web/static/js9_old/analysis-plugins/uploadfits.json b/web/static/js9_old/analysis-plugins/uploadfits.json deleted file mode 100644 index cd43652..0000000 --- a/web/static/js9_old/analysis-plugins/uploadfits.json +++ /dev/null @@ -1,10 +0,0 @@ -[ - {"name" : "uploadfits", - "title" : "Upload a FITS File to the Remote Server", - "files" : "*", - "action" : "js9Xeq uploadfits $uuid", - "workDir": true, - "hidden" : true, - "rtype" : "text" - } -] diff --git a/web/static/js9_old/analysis-wrappers/js9Xeq b/web/static/js9_old/analysis-wrappers/js9Xeq deleted file mode 100755 index 43fd3c1..0000000 --- a/web/static/js9_old/analysis-wrappers/js9Xeq +++ /dev/null @@ -1,571 +0,0 @@ -#!/bin/bash -# set -x -# exec 2>$HOME/foo.log - -# make sure we have minimum arg count -if [ $# -lt 1 ]; then - echo "$0 [cmd] [args ...]" - exit 1 -fi - -# on entry, the following JS9 environment variables will be available: -# JS9_DIR top level directory of js9 helper -# JS9_WORKDIR working directory, if configured -# JS9_WORKDIR_QUOTA quota for working directory, if configured -# JS9_HOST host ip of client -# JS9_ID id (from js9 div) of client - -#defaults -CHANDRA_BINS="500:8000:1875" -XMM_BINS="400:15000:1825" -XRAY_ELEMENTS='{"text": "O VII", "x": 570, "y": "%Y"}, {"text": "O VIII", "x": 650, "y": "%Y"}, {"text": "Ne X", "x": 1020, "y": "%Y"}, {"text": "Mg XI", "x": 1340, "y": "%Y"}, {"text": "Si XIII", "x": 1850, "y": "%Y"}, {"text": "Si XIV", "x": 2010, "y": "%Y"}, {"text": "S XV", "x": 2450, "y": "%Y"}, {"text": "S XVI", "x": 2620, "y": "%Y"}, {"text": "Ar XVII", "x": 3130, "y": "%Y"}, {"text": "Ar XVIII", "x": 3320, "y": "%Y"}, {"text": "Ca XIX", "x": 3890, "y": "%Y"}, {"text": "Ca XX", "x": 4110, "y": "%Y"}, {"text": "Fe XXV", "x": 6670, "y": "%Y"}' - -# if we are being called via CGI, send stderr to stdout -if [ x"$QUERY_STRING" != x ]; then - exec 2>&1 -fi - -# error handler: send to stderr (which will go to stdout for CGI) -error() { - echo "$*" | egrep "^ERROR:" 1>/dev/null 2>&1 - if [ $? = 0 ]; then - echo "$*" >&2 - else - echo "ERROR: $*" >&2 - fi - exit 1 -} - -xsed() { - sed 's#'${JS9_DIR:-none}'#${JS9_DIR}#g;' -} - -getpar () { - egrep "$1 *=" | awk -F= '{print $2}' | awk -F/ '{print $1}' | sed "s/[' ]*\([^ ']*\)[ ']*/\1/" | tr [a-z] [A-Z] | head -1 -} - -quotacheck () { - if [ x"${JS9_WORKDIR}" = x ]; then - error "task requires configuration of a temporary work directory" - fi - mb=`du -sk . | awk '{printf("%d", ($1 + 500) / 1000)}'` - if [ ${JS9_WORKDIR_QUOTA:-0} -gt 0 ]; then - if [ ${mb:-0} -ge ${JS9_WORKDIR_QUOTA} ]; then - error "disk quota exceeded. Please close a displayed image or remove a proxy file (see File menu)." - fi - fi -} - -# sanity check that we have system programs in the path -hash awk sed egrep du mv rm cat echo 1>/dev/null 2>&1 -if [ $? != 0 ]; then - error "can't find system programs (e.g. awk, sed). Please check the PATH of the JS9 helper." -fi - -# regcnts is preferred -hash regcnts 1>/dev/null 2>&1 -if [ $? = 0 ]; then - CNTS=regcnts -else - hash funcnts 1>/dev/null 2>&1 - if [ $? = 0 ]; then - CNTS=funcnts - else - CNTS="error requires regcnts or funcnts ..." - fi -fi - -# process standard arguments -CMD="$1"; shift; -case $CMD in -counts) - if [ $# -eq 1 ]; then - ${CNTS} "$1" "$2" | xsed - else - ${CNTS} "$1" "$2" "$3" | xsed - fi - exit 0 - ;; - -fits2png) - fits2png $* - exit 0 - ;; - -fitshead) - funhead -a "$1" | xsed - exit 0 - ;; - -hist) - if [ $# -lt 4 ]; then - error "funhist filename norm width [column] [bin] [$#]" - fi - ARGS="" - FILE="$1"; shift - FILE=`echo $FILE | sed 's/\]\[/,/g'` - NORM="$1"; shift; - if [ $NORM = "true" ]; then - ARGS="$ARGS -n" - fi - WIDTH=$1; shift; - if [ $WIDTH = "true" ]; then - ARGS="$ARGS -w" - fi - COL="$1"; shift; - if [ "x$COL" = 'x%energy' ]; then - COL="pi"; - TELESCOP=`funhead $FILE | getpar TELESCOP` - case "$TELESCOP" in - CHANDRA) - COL="energy" - if [ x"$BINS" = x0 ]; then - BINS="${CHANDRA_BINS}" - fi - ;; - XMM) - if [ x"$BINS" = x0 ]; then - BINS="${XMM_BINS}" - fi - ;; - esac - fi - if [ $# -eq 0 ]; then - funhist $ARGS "$FILE" "$COL" | xsed - else - funhist $ARGS "$FILE" "$COL" "$1" | xsed - fi - exit 0 - ;; - -radialplot) - if [ $# -lt 2 ]; then - error "${CNTS} filename [source] [bkgd] [$#]" - fi - if [ x"$2" = x ]; then - error "please specify an annulus region for the source" - fi - echo "$2" | egrep 'box|circle|ellipse|line|point|poly' 1>/dev/null 2>&1 - if [ $? = 0 ]; then - error "please specify an annulus region (only) for the source" - fi - if [ $# -eq 1 ]; then - ${CNTS} -rG "$1" "$2" | funcnts2flot | xsed - else - ${CNTS} -rG "$1" "$2" "$3" | funcnts2flot | xsed - fi - exit 0 - ;; - -histplot) - if [ $# -lt 4 ]; then - error "funhist filename norm width [column] [bin] [$#]" - fi - ARGS="" - FILE="$1"; shift; - FILE=`echo $FILE | sed 's/\]\[/,/g'` - NORM="$1"; shift; - if [ $NORM = "true" ]; then - ARGS="$ARGS -n" - fi - WIDTH=$1; shift - if [ $WIDTH = "true" ]; then - if [ "x$2" = x0 ]; then - error "please don't use a bin width of 0" - fi - ARGS="$ARGS -w" - fi - COL="$1"; shift; - BINS="$1" - TELESCOP=`funhead $FILE | getpar TELESCOP` - YAXIS="counts" - XAXIS="${COL} bin" - if [ "x$COL" = 'x%energy' ]; then - COL="pi"; - XAXIS="${COL} bin" - case "$TELESCOP" in - CHANDRA) - COL="energy" - if [ x"$BINS" = x0 ]; then - BINS="${CHANDRA_BINS}" - fi - XAXIS="${COL} (ev)" - ANNOTATE="${XRAY_ELEMENTS}" - ;; - XMM) - if [ x"$BINS" = x0 ]; then - BINS="${XMM_BINS}" - fi - XAXIS="${COL} (ev)" - ;; - esac - elif [ "x$COL" = 'x%time' ]; then - COL="time" - XAXIS="${COL}" - case "$TELESCOP" in - CHANDRA|EINSTEIN|XMM) - COL="time" - XAXIS="time (sec)" - ;; - esac - fi - TITLE="$YAXIS vs. $XAXIS" - if [ x"$BINS" = "x0" ]; then - funhist $ARGS "$FILE" "$COL" | \ - funhist2flot -a "$ANNOTATE" -t "$TITLE" | xsed - else - funhist $ARGS "$FILE" "$COL" "$BINS" | \ - funhist2flot -a "$ANNOTATE" -t "$TITLE" | xsed - fi - exit 0 - ;; - -evfilter) - # required args - if [ "$#" -lt 3 ]; then - error "evfilter ifile filter cen dims [$*]" - fi - # make sure we are not over quota - quotacheck - # input file - IFILE="$1"; shift - # get filter, remove spaces - FILTER=`echo $1 | sed 's/ //g;s/__ampersand__/\&/g'`; shift - CEN="$1"; shift - # get dims - DIMS="$1"; shift - # make up funtools image section extension from cen and dims - X=`echo $CEN | awk -F, '{print $1}'` - Y=`echo $CEN | awk -F, '{print $2}'` - EXT="[$DIMS@$X,$DIMS@$Y]" - # try to get a base name for output - IBASE=`basename "$IFILE" | sed 's/\.gz$//' | sed 's/\.fits$//' | sed 's/\.ftz$//'` - # make up unique output file base - OBASE=`echo ${IBASE}_${FILTER} | sed 's/\[.*\]//g' | awk -F/ '{print $NF}' | sed 's/[,<>$&|!\*@]/_/g'` - # make up new filter ... might need to combine with old filter - echo "$IFILE" | egrep '\]\[' 1>/dev/null 2>&1 - if [ $? = 0 ]; then - # remove closing bracket from old filter - X=`echo $IFILE | sed 's/\]$//'` - # append new filter onto old filter - IFILEX="${X}&&$FILTER]" - else - IFILEX="${IFILE}[$FILTER]" - fi - # create the filtered FITS event file - funtable $IFILEX ${OBASE}.fits >& err.log - if [ $? != 0 ]; then - error "`cat err.log`" - fi - # create a smaller representation file for display - funimage ${OBASE}.fits"$EXT" stdout | gzip -c > ${OBASE}.fits.gz - if [ $? != 0 ]; then - error "`cat err.log`" - fi - # send representation file and parent file - echo "${JS9_WORKDIR}/${OBASE}.fits.gz ${JS9_WORKDIR}/${OBASE}.fits" - exit 0 - ;; - -imsection) - # optional args - while [ x"$1" != x ]; do - case $1 in - -parent) DOPARENT=1 - shift - continue;; - *) break;; - esac - done - # required args - if [ "$#" -lt 2 ]; then - error "imsection file section filter slice" - fi - hash js9helper 1>/dev/null 2>&1 - if [ $? != 0 ]; then - error "for imsection support, please build and install js9helper" - fi - # gzip files - DOGZIP=1 - # input file - IFILE="$1" - # get section - SECTION="$2"; - # get filter - FILTER="$3" - # get filter - SLICE="$4" - # false means no filter - if [ "$FILTER" = "false" ]; then - FILTER="" - fi - # try to get a base name for output - IBASE=`basename "$IFILE" | sed 's/\.gz$//' | sed 's/\.fits$//' | sed 's/\.ftz$//'` - OBASE=`echo ${IBASE}_${SECTION} | sed 's/\[.*\]//g' | awk -F/ '{print $NF}' | sed 's/[,@]/_/g'` - if [ x$DOGZIP = x1 ]; then - OFILE=${OBASE}.fits.gz - fi - # make sure we are not over quota - quotacheck - # send back relative path to the output file - echo "${JS9_WORKDIR}/${OFILE}" - # run imsection in the js9helper to generate a FITS image - # (and send back json with useful info) - js9helper -i "$IFILE" imsection \!"$OFILE" "$SECTION" "$FILTER" "$SLICE" - if [ x$DOPARENT = x1 ]; then - # send parent file, so analysis is performed on the original file - echo "${IFILE}" | xsed - fi - exit 0 - ;; - -listhdus) - # required args - if [ "$#" -lt 1 ]; then - error "listhdus file" - fi - hash js9helper 1>/dev/null 2>&1 - if [ $? != 0 ]; then - error "for listhdus support, please build and install js9helper" - fi - IFILE="$1" - js9helper -i "$IFILE" listhdus - ;; - -loadproxy) - # required args - if [ "$#" -lt 1 ]; then - error "loadproxy url" - fi - # make sure we are not over quota - quotacheck - URL=`echo $1 | sed 's/__ampersand__/\&/g'` - if [ x"$2" != x ]; then - OFILE="$2" - else - OFILE=`basename "$URL" | sed 's/\?.*//g;s/ *//g;s/%[0-9A-Fa-f][0-9A-Fa-f]//g'` - fi - # hack for google drive - if [ x"$OFILE" = xuc ]; then - OFILE="google_"$RANDOM".fits" - fi - # proxy - if [ x"$JS9_PROXY" != x ]; then - export http_proxy="$JS9_PROXY" - export https_proxy="$http_proxy" - export ftp_proxy="$http_proxy" - fi - # retrieve the FITS file via URL - hash wget 1>/dev/null 2>&1 - if [ $? = 0 ]; then - XFUNC="wget" - wget -q --output-document="$OFILE" "$URL" - else - hash curl 1>/dev/null 2>&1 - if [ $? = 0 ]; then - XFUNC="curl" - curl -s -o "$OFILE" "$URL" - else - error "requires either wget or curl" - fi - fi - if [ $? != 0 ]; then - error "could not retrieve: $URL" - else - s=`file $OFILE` - f=`echo $s | egrep "HTML document text" 1>/dev/null 2>&1` - if [ $? = 0 ]; then - f=`cat $OFILE | sed -n 's/.*\(The document has moved\) /dev/null 2>&1 - if [ $? = 0 ]; then - # look for original file + .gz (unless ofile was specified) - if [ x"$2" = x ]; then - f=`echo "$URL" | sed -n 's/.*=\([^=]*\.fits\{0,1\}\).*/\1/gp'` - if [ x"$f" != x ]; then - ext="${f##*.}" - if [ x"$ext" = xgz ]; then - NFILE="$f" - else - NFILE="$f".gz - fi - if [ x"$NFILE" != x"$OFILE" ]; then - mv $OFILE $NFILE && OFILE="$NFILE" - fi - fi - fi - else - # better be a known image file type - f=`echo $s | egrep -o '(FITS|JPEG|PNG) image data' | awk '{print $1}'` - case "$f" in - FITS|JPEG|PNG) - ;; - *) rm -rf $OFILE - error "$OFILE is not a FITS, JPEG, or PNG image file" - ;; - esac - fi - fi - # special case: in chandra archive, check for rep file generation request - echo $URL | egrep 'https://cxc.cfa.harvard.edu/cdaftp/.*_evt2.fits.gz\?repfile=true' 1>/dev/null 2>&1 - if [ $? = 0 ]; then - hash funhead 1>/dev/null 2>&1 - if [ $? = 0 ]; then - RFILE=`echo $OFILE | sed s#evt2#img#` - # which chandra inst? - INST=`funhead $OFILE | getpar INSTRUME` - # generate a rep file - case "$INST" in - HRC) - DET=`funhead $OFILE | getpar DETNAM` - case "$DET" in - HRC-S) - XCEN=32768 - YCEN=32768 - XDIM=4096 - YDIM=4096 - BLOCK=4 - BITPIX=32 - ;; - HRC-I) - XCEN=16384 - YCEN=16384 - XDIM=4096 - YDIM=4096 - BLOCK=4 - BITPIX=32 - ;; - esac - ;; - ACIS) - XCEN=4096 - YCEN=4096 - XDIM=4096 - YDIM=4096 - BLOCK=4 - BITPIX=32 - ;; - esac - if [ x$BITPIX != x ]; then - (funimage $OFILE"[$XDIM@$XCEN,$YDIM@$YCEN,$BLOCK]" stdout bitpix=$BITPIX | gzip -c > $RFILE) 2>/dev/null - if [ $? = 0 ]; then - # tell JS9 the rep name to load, along with downloaded parent - echo "${JS9_WORKDIR}/$RFILE ${JS9_WORKDIR}/$OFILE" - exit 0 - else - error "couldn't generate FITS representation file for $OFILE" - fi - fi - fi - fi - # special case: in chandra archive, check for parent file request - echo $URL | egrep 'https://cxc.cfa.harvard.edu/cdaftp/.*_img2.fits.gz\?parent=true' 1>/dev/null 2>&1 - if [ $? = 0 ]; then - PFILE=`echo $OFILE | sed s#full_img2#evt2# | sed s#cntr_img2#evt2#` - # and load the parent file asynchronously - PURL=`echo $URL | sed s#full_img2#evt2# | sed s#cntr_img2#evt2#` - # retrieve the parent file - if [ x$XFUNC = "xwget" ]; then - wget -q --output-document="$PFILE" "$PURL" - else - curl -s -o "$PFILE" "$PURL" - fi - if [ $? != 0 ]; then - error "could not retrieve parent file: $URL" - fi - # tell JS9 the new file name to load, along with parent file name - echo "${JS9_WORKDIR}/$OFILE ${JS9_WORKDIR}/$PFILE" - exit 0 - fi - fi - # tell JS9 the new file name to load (no parent file) - echo "${JS9_WORKDIR}/$OFILE" - exit 0 - ;; - -removeproxy) - # required args - if [ "$#" -lt 1 ]; then - error "removeproxy file" - fi - if [ x"${JS9_WORKDIR}" = x ]; then - error "removeproxy requires a temporary work directory" - fi - # remove file(s) from our working directory, but ignore errors - while [ x"$1" != x ]; do - PROXY=`echo $1 | sed 's/__ampersand__/\&/g'` - FILE=`basename "$PROXY"` - rm -f "$FILE" - shift - done - echo "OK" - exit 0 - ;; - -uploadfits) - # required args - if [ "$#" -lt 1 ]; then - error "uploadfits filename" - fi - FNAME="$1" - # make sure we are not over quota - quotacheck - # save stdin as a file - cat > "$FNAME" - # tell JS9 the new pathname - echo "${JS9_WORKDIR}/$FNAME" - exit 0 - ;; - -quotacheck) - # make sure we are not over quota - quotacheck - echo "OK ${JS9_WORKDIR_QUOTA:-0}" - exit 0 - ;; - -macros) - echo " - image: [$1] - file/parent: [$2] - file/this: [$3] - ext: [$4] - imcen: [$5] - wcscen: [$6] - id: [$7] - foo: [$8] (not expanded) - sregions: [$9] - bregions: [${10}] - reg(wcs): [${11}] - reg(phy): [${12}] - string1: [${13}] (passed on command line)" - exit 0 - ;; - -*) - error "unknown function: $CMD" - ;; -esac diff --git a/web/static/js9_old/astroem.js b/web/static/js9_old/astroem.js deleted file mode 100644 index cdc4ee0..0000000 --- a/web/static/js9_old/astroem.js +++ /dev/null @@ -1,159 +0,0 @@ - -// astroem.js: astronomy/astrophysics utilities compiled to javascript -// see: https://github.com/kripken/emscripten -var Module=typeof Module!="undefined"?Module:{};var Module;if(typeof Module!=="object"){Module={}}Module["noExitRuntime"]=true;Module["onRuntimeInitialized"]=function(){if(window.jQuery){if(Module["astroemReady"]){$(document).trigger("astroem:ready",{status:"OK"})}else{Module["astroemReady"]=true}}};var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){var ret=tryParseAsDataURI(filename);if(ret){return binary?ret:ret.toString()}requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{var ret=tryParseAsDataURI(filename);if(ret){onload(ret)}requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText}catch(err){var data=tryParseAsDataURI(url);if(data){return intArrayToString(data)}throw err}};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{try{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}catch(err){var data=tryParseAsDataURI(url);if(data){return data}throw err}}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}var data=tryParseAsDataURI(url);if(data){onload(data.buffer);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;var WebAssembly={Memory:function(opts){this.buffer=new ArrayBuffer(opts["initial"]*65536)},Module:function(binary){},Instance:function(module,info){this.exports=( -// EMSCRIPTEN_START_ASM -function instantiate(Ta){function c(d){d.set=function(a,b){this[a]=b};d.get=function(a){return this[a]};return d}var e;var f=new Uint8Array(123);for(var a=25;a>=0;--a){f[48+a]=52+a;f[65+a]=a;f[97+a]=26+a}f[43]=62;f[47]=63;function l(m,n,o){var g,h,a=0,i=n,j=o.length,k=n+(j*3>>2)-(o[j-2]=="=")-(o[j-1]=="=");for(;a>4;if(i>2;if(i>>0<=299){b:{switch(a|0){case 0:a=H[10653]|H[10654]<<8|(H[10655]<<16|H[10656]<<24);c=H[10649]|H[10650]<<8|(H[10651]<<16|H[10652]<<24);E[b+6|0]=c;E[b+7|0]=c>>>8;E[b+8|0]=c>>>16;E[b+9|0]=c>>>24;E[b+10|0]=a;E[b+11|0]=a>>>8;E[b+12|0]=a>>>16;E[b+13|0]=a>>>24;a=H[10647]|H[10648]<<8|(H[10649]<<16|H[10650]<<24);c=H[10643]|H[10644]<<8|(H[10645]<<16|H[10646]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 1:a=H[10731]|H[10732]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[10727]|H[10728]<<8|(H[10729]<<16|H[10730]<<24);c=H[10723]|H[10724]<<8|(H[10725]<<16|H[10726]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[10719]|H[10720]<<8|(H[10721]<<16|H[10722]<<24);c=H[10715]|H[10716]<<8|(H[10717]<<16|H[10718]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[10711]|H[10712]<<8|(H[10713]<<16|H[10714]<<24);c=H[10707]|H[10708]<<8|(H[10709]<<16|H[10710]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 101:a=H[7700]|H[7701]<<8|(H[7702]<<16|H[7703]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[7696]|H[7697]<<8|(H[7698]<<16|H[7699]<<24);c=H[7692]|H[7693]<<8|(H[7694]<<16|H[7695]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[7688]|H[7689]<<8|(H[7690]<<16|H[7691]<<24);c=H[7684]|H[7685]<<8|(H[7686]<<16|H[7687]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[7680]|H[7681]<<8|(H[7682]<<16|H[7683]<<24);c=H[7676]|H[7677]<<8|(H[7678]<<16|H[7679]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 103:a=H[7672]|H[7673]<<8|(H[7674]<<16|H[7675]<<24);c=H[7668]|H[7669]<<8|(H[7670]<<16|H[7671]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[7665]|H[7666]<<8|(H[7667]<<16|H[7668]<<24);c=H[7661]|H[7662]<<8|(H[7663]<<16|H[7664]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[7657]|H[7658]<<8|(H[7659]<<16|H[7660]<<24);c=H[7653]|H[7654]<<8|(H[7655]<<16|H[7656]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[7649]|H[7650]<<8|(H[7651]<<16|H[7652]<<24);c=H[7645]|H[7646]<<8|(H[7647]<<16|H[7648]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 104:a=H[22507]|H[22508]<<8|(H[22509]<<16|H[22510]<<24);c=H[22503]|H[22504]<<8|(H[22505]<<16|H[22506]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[22501]|H[22502]<<8|(H[22503]<<16|H[22504]<<24);c=H[22497]|H[22498]<<8|(H[22499]<<16|H[22500]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22493]|H[22494]<<8|(H[22495]<<16|H[22496]<<24);c=H[22489]|H[22490]<<8|(H[22491]<<16|H[22492]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22485]|H[22486]<<8|(H[22487]<<16|H[22488]<<24);c=H[22481]|H[22482]<<8|(H[22483]<<16|H[22484]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 105:a=H[22538]|H[22539]<<8|(H[22540]<<16|H[22541]<<24);c=H[22534]|H[22535]<<8|(H[22536]<<16|H[22537]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[22531]|H[22532]<<8|(H[22533]<<16|H[22534]<<24);c=H[22527]|H[22528]<<8|(H[22529]<<16|H[22530]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22523]|H[22524]<<8|(H[22525]<<16|H[22526]<<24);c=H[22519]|H[22520]<<8|(H[22521]<<16|H[22522]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22515]|H[22516]<<8|(H[22517]<<16|H[22518]<<24);c=H[22511]|H[22512]<<8|(H[22513]<<16|H[22514]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 106:a=H[22565]|H[22566]<<8|(H[22567]<<16|H[22568]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[22562]|H[22563]<<8|(H[22564]<<16|H[22565]<<24);c=H[22558]|H[22559]<<8|(H[22560]<<16|H[22561]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22554]|H[22555]<<8|(H[22556]<<16|H[22557]<<24);c=H[22550]|H[22551]<<8|(H[22552]<<16|H[22553]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22546]|H[22547]<<8|(H[22548]<<16|H[22549]<<24);c=H[22542]|H[22543]<<8|(H[22544]<<16|H[22545]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 107:a=H[22160]|H[22161]<<8|(H[22162]<<16|H[22163]<<24);c=H[22156]|H[22157]<<8|(H[22158]<<16|H[22159]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[22153]|H[22154]<<8|(H[22155]<<16|H[22156]<<24);c=H[22149]|H[22150]<<8|(H[22151]<<16|H[22152]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22145]|H[22146]<<8|(H[22147]<<16|H[22148]<<24);c=H[22141]|H[22142]<<8|(H[22143]<<16|H[22144]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22137]|H[22138]<<8|(H[22139]<<16|H[22140]<<24);c=H[22133]|H[22134]<<8|(H[22135]<<16|H[22136]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 108:a=H[22594]|H[22595]<<8|(H[22596]<<16|H[22597]<<24);c=H[22590]|H[22591]<<8|(H[22592]<<16|H[22593]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[22589]|H[22590]<<8|(H[22591]<<16|H[22592]<<24);c=H[22585]|H[22586]<<8|(H[22587]<<16|H[22588]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22581]|H[22582]<<8|(H[22583]<<16|H[22584]<<24);c=H[22577]|H[22578]<<8|(H[22579]<<16|H[22580]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22573]|H[22574]<<8|(H[22575]<<16|H[22576]<<24);c=H[22569]|H[22570]<<8|(H[22571]<<16|H[22572]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 110:E[b+24|0]=H[22276];a=H[22272]|H[22273]<<8|(H[22274]<<16|H[22275]<<24);c=H[22268]|H[22269]<<8|(H[22270]<<16|H[22271]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22264]|H[22265]<<8|(H[22266]<<16|H[22267]<<24);c=H[22260]|H[22261]<<8|(H[22262]<<16|H[22263]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22256]|H[22257]<<8|(H[22258]<<16|H[22259]<<24);c=H[22252]|H[22253]<<8|(H[22254]<<16|H[22255]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 111:E[b+24|0]=H[18017];a=H[18013]|H[18014]<<8|(H[18015]<<16|H[18016]<<24);c=H[18009]|H[18010]<<8|(H[18011]<<16|H[18012]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[18005]|H[18006]<<8|(H[18007]<<16|H[18008]<<24);c=H[18001]|H[18002]<<8|(H[18003]<<16|H[18004]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17997]|H[17998]<<8|(H[17999]<<16|H[18e3]<<24);c=H[17993]|H[17994]<<8|(H[17995]<<16|H[17996]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 112:a=H[21875]|H[21876]<<8|(H[21877]<<16|H[21878]<<24);c=H[21871]|H[21872]<<8|(H[21873]<<16|H[21874]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[21869]|H[21870]<<8|(H[21871]<<16|H[21872]<<24);c=H[21865]|H[21866]<<8|(H[21867]<<16|H[21868]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21861]|H[21862]<<8|(H[21863]<<16|H[21864]<<24);c=H[21857]|H[21858]<<8|(H[21859]<<16|H[21860]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21853]|H[21854]<<8|(H[21855]<<16|H[21856]<<24);c=H[21849]|H[21850]<<8|(H[21851]<<16|H[21852]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 113:a=H[3259]|H[3260]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[3255]|H[3256]<<8|(H[3257]<<16|H[3258]<<24);c=H[3251]|H[3252]<<8|(H[3253]<<16|H[3254]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[3247]|H[3248]<<8|(H[3249]<<16|H[3250]<<24);c=H[3243]|H[3244]<<8|(H[3245]<<16|H[3246]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[3239]|H[3240]<<8|(H[3241]<<16|H[3242]<<24);c=H[3235]|H[3236]<<8|(H[3237]<<16|H[3238]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 114:E[b+24|0]=H[11016];a=H[11012]|H[11013]<<8|(H[11014]<<16|H[11015]<<24);c=H[11008]|H[11009]<<8|(H[11010]<<16|H[11011]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11004]|H[11005]<<8|(H[11006]<<16|H[11007]<<24);c=H[11e3]|H[11001]<<8|(H[11002]<<16|H[11003]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[10996]|H[10997]<<8|(H[10998]<<16|H[10999]<<24);c=H[10992]|H[10993]<<8|(H[10994]<<16|H[10995]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 115:a=H[10958]|H[10959]<<8|(H[10960]<<16|H[10961]<<24);E[b+15|0]=a;E[b+16|0]=a>>>8;E[b+17|0]=a>>>16;E[b+18|0]=a>>>24;a=H[10955]|H[10956]<<8|(H[10957]<<16|H[10958]<<24);c=H[10951]|H[10952]<<8|(H[10953]<<16|H[10954]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[10947]|H[10948]<<8|(H[10949]<<16|H[10950]<<24);c=H[10943]|H[10944]<<8|(H[10945]<<16|H[10946]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 116:a=H[13971]|H[13972]<<8|(H[13973]<<16|H[13974]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[13967]|H[13968]<<8|(H[13969]<<16|H[13970]<<24);c=H[13963]|H[13964]<<8|(H[13965]<<16|H[13966]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[13959]|H[13960]<<8|(H[13961]<<16|H[13962]<<24);c=H[13955]|H[13956]<<8|(H[13957]<<16|H[13958]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[13951]|H[13952]<<8|(H[13953]<<16|H[13954]<<24);c=H[13947]|H[13948]<<8|(H[13949]<<16|H[13950]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 117:a=H[17752]|H[17753]<<8|(H[17754]<<16|H[17755]<<24);E[b+40|0]=a;E[b+41|0]=a>>>8;E[b+42|0]=a>>>16;E[b+43|0]=a>>>24;a=H[17748]|H[17749]<<8|(H[17750]<<16|H[17751]<<24);c=H[17744]|H[17745]<<8|(H[17746]<<16|H[17747]<<24);E[b+32|0]=c;E[b+33|0]=c>>>8;E[b+34|0]=c>>>16;E[b+35|0]=c>>>24;E[b+36|0]=a;E[b+37|0]=a>>>8;E[b+38|0]=a>>>16;E[b+39|0]=a>>>24;a=H[17740]|H[17741]<<8|(H[17742]<<16|H[17743]<<24);c=H[17736]|H[17737]<<8|(H[17738]<<16|H[17739]<<24);E[b+24|0]=c;E[b+25|0]=c>>>8;E[b+26|0]=c>>>16;E[b+27|0]=c>>>24;E[b+28|0]=a;E[b+29|0]=a>>>8;E[b+30|0]=a>>>16;E[b+31|0]=a>>>24;a=H[17732]|H[17733]<<8|(H[17734]<<16|H[17735]<<24);c=H[17728]|H[17729]<<8|(H[17730]<<16|H[17731]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[17724]|H[17725]<<8|(H[17726]<<16|H[17727]<<24);c=H[17720]|H[17721]<<8|(H[17722]<<16|H[17723]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17716]|H[17717]<<8|(H[17718]<<16|H[17719]<<24);c=H[17712]|H[17713]<<8|(H[17714]<<16|H[17715]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 121:a=H[3770]|H[3771]<<8|(H[3772]<<16|H[3773]<<24);E[b+15|0]=a;E[b+16|0]=a>>>8;E[b+17|0]=a>>>16;E[b+18|0]=a>>>24;a=H[3767]|H[3768]<<8|(H[3769]<<16|H[3770]<<24);c=H[3763]|H[3764]<<8|(H[3765]<<16|H[3766]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[3759]|H[3760]<<8|(H[3761]<<16|H[3762]<<24);c=H[3755]|H[3756]<<8|(H[3757]<<16|H[3758]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 122:a=H[5997]|H[5998]<<8|(H[5999]<<16|H[6e3]<<24);c=H[5993]|H[5994]<<8|(H[5995]<<16|H[5996]<<24);E[b+13|0]=c;E[b+14|0]=c>>>8;E[b+15|0]=c>>>16;E[b+16|0]=c>>>24;E[b+17|0]=a;E[b+18|0]=a>>>8;E[b+19|0]=a>>>16;E[b+20|0]=a>>>24;a=H[5992]|H[5993]<<8|(H[5994]<<16|H[5995]<<24);c=H[5988]|H[5989]<<8|(H[5990]<<16|H[5991]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5984]|H[5985]<<8|(H[5986]<<16|H[5987]<<24);c=H[5980]|H[5981]<<8|(H[5982]<<16|H[5983]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 123:a=H[29316]|H[29317]<<8|(H[29318]<<16|H[29319]<<24);c=H[29312]|H[29313]<<8|(H[29314]<<16|H[29315]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[29309]|H[29310]<<8|(H[29311]<<16|H[29312]<<24);c=H[29305]|H[29306]<<8|(H[29307]<<16|H[29308]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29301]|H[29302]<<8|(H[29303]<<16|H[29304]<<24);c=H[29297]|H[29298]<<8|(H[29299]<<16|H[29300]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 124:a=H[20975]|H[20976]<<8|(H[20977]<<16|H[20978]<<24);c=H[20971]|H[20972]<<8|(H[20973]<<16|H[20974]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[20968]|H[20969]<<8|(H[20970]<<16|H[20971]<<24);c=H[20964]|H[20965]<<8|(H[20966]<<16|H[20967]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20960]|H[20961]<<8|(H[20962]<<16|H[20963]<<24);c=H[20956]|H[20957]<<8|(H[20958]<<16|H[20959]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20952]|H[20953]<<8|(H[20954]<<16|H[20955]<<24);c=H[20948]|H[20949]<<8|(H[20950]<<16|H[20951]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 125:a=H[34736]|H[34737]<<8|(H[34738]<<16|H[34739]<<24);c=H[34732]|H[34733]<<8|(H[34734]<<16|H[34735]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[34730]|H[34731]<<8|(H[34732]<<16|H[34733]<<24);c=H[34726]|H[34727]<<8|(H[34728]<<16|H[34729]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[34722]|H[34723]<<8|(H[34724]<<16|H[34725]<<24);c=H[34718]|H[34719]<<8|(H[34720]<<16|H[34721]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[34714]|H[34715]<<8|(H[34716]<<16|H[34717]<<24);c=H[34710]|H[34711]<<8|(H[34712]<<16|H[34713]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 126:a=H[4461]|H[4462]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[4457]|H[4458]<<8|(H[4459]<<16|H[4460]<<24);c=H[4453]|H[4454]<<8|(H[4455]<<16|H[4456]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[4449]|H[4450]<<8|(H[4451]<<16|H[4452]<<24);c=H[4445]|H[4446]<<8|(H[4447]<<16|H[4448]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[4441]|H[4442]<<8|(H[4443]<<16|H[4444]<<24);c=H[4437]|H[4438]<<8|(H[4439]<<16|H[4440]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 151:a=H[51172]|H[51173]<<8|(H[51174]<<16|H[51175]<<24);c=H[51168]|H[51169]<<8|(H[51170]<<16|H[51171]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[51165]|H[51166]<<8|(H[51167]<<16|H[51168]<<24);c=H[51161]|H[51162]<<8|(H[51163]<<16|H[51164]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51157]|H[51158]<<8|(H[51159]<<16|H[51160]<<24);c=H[51153]|H[51154]<<8|(H[51155]<<16|H[51156]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51149]|H[51150]<<8|(H[51151]<<16|H[51152]<<24);c=H[51145]|H[51146]<<8|(H[51147]<<16|H[51148]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 152:a=H[51203]|H[51204]<<8|(H[51205]<<16|H[51206]<<24);c=H[51199]|H[51200]<<8|(H[51201]<<16|H[51202]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[51196]|H[51197]<<8|(H[51198]<<16|H[51199]<<24);c=H[51192]|H[51193]<<8|(H[51194]<<16|H[51195]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51188]|H[51189]<<8|(H[51190]<<16|H[51191]<<24);c=H[51184]|H[51185]<<8|(H[51186]<<16|H[51187]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51180]|H[51181]<<8|(H[51182]<<16|H[51183]<<24);c=H[51176]|H[51177]<<8|(H[51178]<<16|H[51179]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 153:a=H[7730]|H[7731]<<8|(H[7732]<<16|H[7733]<<24);c=H[7726]|H[7727]<<8|(H[7728]<<16|H[7729]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[7724]|H[7725]<<8|(H[7726]<<16|H[7727]<<24);c=H[7720]|H[7721]<<8|(H[7722]<<16|H[7723]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[7716]|H[7717]<<8|(H[7718]<<16|H[7719]<<24);c=H[7712]|H[7713]<<8|(H[7714]<<16|H[7715]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[7708]|H[7709]<<8|(H[7710]<<16|H[7711]<<24);c=H[7704]|H[7705]<<8|(H[7706]<<16|H[7707]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 154:a=H[27825]|H[27826]<<8|(H[27827]<<16|H[27828]<<24);c=H[27821]|H[27822]<<8|(H[27823]<<16|H[27824]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[27818]|H[27819]<<8|(H[27820]<<16|H[27821]<<24);c=H[27814]|H[27815]<<8|(H[27816]<<16|H[27817]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[27810]|H[27811]<<8|(H[27812]<<16|H[27813]<<24);c=H[27806]|H[27807]<<8|(H[27808]<<16|H[27809]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[27802]|H[27803]<<8|(H[27804]<<16|H[27805]<<24);c=H[27798]|H[27799]<<8|(H[27800]<<16|H[27801]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 155:a=H[57918]|H[57919]<<8|(H[57920]<<16|H[57921]<<24);c=H[57914]|H[57915]<<8|(H[57916]<<16|H[57917]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[57912]|H[57913]<<8|(H[57914]<<16|H[57915]<<24);c=H[57908]|H[57909]<<8|(H[57910]<<16|H[57911]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[57904]|H[57905]<<8|(H[57906]<<16|H[57907]<<24);c=H[57900]|H[57901]<<8|(H[57902]<<16|H[57903]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[57896]|H[57897]<<8|(H[57898]<<16|H[57899]<<24);c=H[57892]|H[57893]<<8|(H[57894]<<16|H[57895]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 156:a=H[51141]|H[51142]<<8|(H[51143]<<16|H[51144]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[51137]|H[51138]<<8|(H[51139]<<16|H[51140]<<24);c=H[51133]|H[51134]<<8|(H[51135]<<16|H[51136]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51129]|H[51130]<<8|(H[51131]<<16|H[51132]<<24);c=H[51125]|H[51126]<<8|(H[51127]<<16|H[51128]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51121]|H[51122]<<8|(H[51123]<<16|H[51124]<<24);c=H[51117]|H[51118]<<8|(H[51119]<<16|H[51120]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 157:a=H[17146]|H[17147]<<8|(H[17148]<<16|H[17149]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[17142]|H[17143]<<8|(H[17144]<<16|H[17145]<<24);c=H[17138]|H[17139]<<8|(H[17140]<<16|H[17141]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[17134]|H[17135]<<8|(H[17136]<<16|H[17137]<<24);c=H[17130]|H[17131]<<8|(H[17132]<<16|H[17133]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17126]|H[17127]<<8|(H[17128]<<16|H[17129]<<24);c=H[17122]|H[17123]<<8|(H[17124]<<16|H[17125]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 158:a=H[29374]|H[29375]<<8|(H[29376]<<16|H[29377]<<24);c=H[29370]|H[29371]<<8|(H[29372]<<16|H[29373]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[29369]|H[29370]<<8|(H[29371]<<16|H[29372]<<24);c=H[29365]|H[29366]<<8|(H[29367]<<16|H[29368]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[29361]|H[29362]<<8|(H[29363]<<16|H[29364]<<24);c=H[29357]|H[29358]<<8|(H[29359]<<16|H[29360]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29353]|H[29354]<<8|(H[29355]<<16|H[29356]<<24);c=H[29349]|H[29350]<<8|(H[29351]<<16|H[29352]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 159:a=H[17229]|H[17230]<<8|(H[17231]<<16|H[17232]<<24);c=H[17225]|H[17226]<<8|(H[17227]<<16|H[17228]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[17224]|H[17225]<<8|(H[17226]<<16|H[17227]<<24);c=H[17220]|H[17221]<<8|(H[17222]<<16|H[17223]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[17216]|H[17217]<<8|(H[17218]<<16|H[17219]<<24);c=H[17212]|H[17213]<<8|(H[17214]<<16|H[17215]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17208]|H[17209]<<8|(H[17210]<<16|H[17211]<<24);c=H[17204]|H[17205]<<8|(H[17206]<<16|H[17207]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 201:a=H[8071]|H[8072]<<8|(H[8073]<<16|H[8074]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[8067]|H[8068]<<8|(H[8069]<<16|H[8070]<<24);c=H[8063]|H[8064]<<8|(H[8065]<<16|H[8066]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[8059]|H[8060]<<8|(H[8061]<<16|H[8062]<<24);c=H[8055]|H[8056]<<8|(H[8057]<<16|H[8058]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[8051]|H[8052]<<8|(H[8053]<<16|H[8054]<<24);c=H[8047]|H[8048]<<8|(H[8049]<<16|H[8050]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 202:a=H[11698]|H[11699]<<8|(H[11700]<<16|H[11701]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[11694]|H[11695]<<8|(H[11696]<<16|H[11697]<<24);c=H[11690]|H[11691]<<8|(H[11692]<<16|H[11693]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11686]|H[11687]<<8|(H[11688]<<16|H[11689]<<24);c=H[11682]|H[11683]<<8|(H[11684]<<16|H[11685]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[11678]|H[11679]<<8|(H[11680]<<16|H[11681]<<24);c=H[11674]|H[11675]<<8|(H[11676]<<16|H[11677]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 203:a=H[8363]|H[8364]<<8|(H[8365]<<16|H[8366]<<24);c=H[8359]|H[8360]<<8|(H[8361]<<16|H[8362]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[8358]|H[8359]<<8|(H[8360]<<16|H[8361]<<24);c=H[8354]|H[8355]<<8|(H[8356]<<16|H[8357]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[8350]|H[8351]<<8|(H[8352]<<16|H[8353]<<24);c=H[8346]|H[8347]<<8|(H[8348]<<16|H[8349]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[8342]|H[8343]<<8|(H[8344]<<16|H[8345]<<24);c=H[8338]|H[8339]<<8|(H[8340]<<16|H[8341]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 204:a=H[29270]|H[29271]<<8|(H[29272]<<16|H[29273]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[29267]|H[29268]<<8|(H[29269]<<16|H[29270]<<24);c=H[29263]|H[29264]<<8|(H[29265]<<16|H[29266]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[29259]|H[29260]<<8|(H[29261]<<16|H[29262]<<24);c=H[29255]|H[29256]<<8|(H[29257]<<16|H[29258]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29251]|H[29252]<<8|(H[29253]<<16|H[29254]<<24);c=H[29247]|H[29248]<<8|(H[29249]<<16|H[29250]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 205:a=H[20287]|H[20288]<<8|(H[20289]<<16|H[20290]<<24);c=H[20283]|H[20284]<<8|(H[20285]<<16|H[20286]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20282]|H[20283]<<8|(H[20284]<<16|H[20285]<<24);c=H[20278]|H[20279]<<8|(H[20280]<<16|H[20281]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20274]|H[20275]<<8|(H[20276]<<16|H[20277]<<24);c=H[20270]|H[20271]<<8|(H[20272]<<16|H[20273]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20266]|H[20267]<<8|(H[20268]<<16|H[20269]<<24);c=H[20262]|H[20263]<<8|(H[20264]<<16|H[20265]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 206:a=H[21566]|H[21567]<<8|(H[21568]<<16|H[21569]<<24);c=H[21562]|H[21563]<<8|(H[21564]<<16|H[21565]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[21560]|H[21561]<<8|(H[21562]<<16|H[21563]<<24);c=H[21556]|H[21557]<<8|(H[21558]<<16|H[21559]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21552]|H[21553]<<8|(H[21554]<<16|H[21555]<<24);c=H[21548]|H[21549]<<8|(H[21550]<<16|H[21551]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21544]|H[21545]<<8|(H[21546]<<16|H[21547]<<24);c=H[21540]|H[21541]<<8|(H[21542]<<16|H[21543]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 207:a=H[25609]|H[25610]<<8|(H[25611]<<16|H[25612]<<24);c=H[25605]|H[25606]<<8|(H[25607]<<16|H[25608]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[25604]|H[25605]<<8|(H[25606]<<16|H[25607]<<24);c=H[25600]|H[25601]<<8|(H[25602]<<16|H[25603]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[25596]|H[25597]<<8|(H[25598]<<16|H[25599]<<24);c=H[25592]|H[25593]<<8|(H[25594]<<16|H[25595]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[25588]|H[25589]<<8|(H[25590]<<16|H[25591]<<24);c=H[25584]|H[25585]<<8|(H[25586]<<16|H[25587]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 208:a=H[11670]|H[11671]<<8|(H[11672]<<16|H[11673]<<24);c=H[11666]|H[11667]<<8|(H[11668]<<16|H[11669]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[11663]|H[11664]<<8|(H[11665]<<16|H[11666]<<24);c=H[11659]|H[11660]<<8|(H[11661]<<16|H[11662]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11655]|H[11656]<<8|(H[11657]<<16|H[11658]<<24);c=H[11651]|H[11652]<<8|(H[11653]<<16|H[11654]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[11647]|H[11648]<<8|(H[11649]<<16|H[11650]<<24);c=H[11643]|H[11644]<<8|(H[11645]<<16|H[11646]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 209:a=H[4817]|H[4818]<<8|(H[4819]<<16|H[4820]<<24);c=H[4813]|H[4814]<<8|(H[4815]<<16|H[4816]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[4810]|H[4811]<<8|(H[4812]<<16|H[4813]<<24);c=H[4806]|H[4807]<<8|(H[4808]<<16|H[4809]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[4802]|H[4803]<<8|(H[4804]<<16|H[4805]<<24);c=H[4798]|H[4799]<<8|(H[4800]<<16|H[4801]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[4794]|H[4795]<<8|(H[4796]<<16|H[4797]<<24);c=H[4790]|H[4791]<<8|(H[4792]<<16|H[4793]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 210:a=H[26479]|H[26480]<<8|(H[26481]<<16|H[26482]<<24);c=H[26475]|H[26476]<<8|(H[26477]<<16|H[26478]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[26473]|H[26474]<<8|(H[26475]<<16|H[26476]<<24);c=H[26469]|H[26470]<<8|(H[26471]<<16|H[26472]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26465]|H[26466]<<8|(H[26467]<<16|H[26468]<<24);c=H[26461]|H[26462]<<8|(H[26463]<<16|H[26464]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 211:a=H[20038]|H[20039]<<8|(H[20040]<<16|H[20041]<<24);c=H[20034]|H[20035]<<8|(H[20036]<<16|H[20037]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20033]|H[20034]<<8|(H[20035]<<16|H[20036]<<24);c=H[20029]|H[20030]<<8|(H[20031]<<16|H[20032]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20025]|H[20026]<<8|(H[20027]<<16|H[20028]<<24);c=H[20021]|H[20022]<<8|(H[20023]<<16|H[20024]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20017]|H[20018]<<8|(H[20019]<<16|H[20020]<<24);c=H[20013]|H[20014]<<8|(H[20015]<<16|H[20016]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 212:a=H[20124]|H[20125]<<8|(H[20126]<<16|H[20127]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[20120]|H[20121]<<8|(H[20122]<<16|H[20123]<<24);c=H[20116]|H[20117]<<8|(H[20118]<<16|H[20119]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20112]|H[20113]<<8|(H[20114]<<16|H[20115]<<24);c=H[20108]|H[20109]<<8|(H[20110]<<16|H[20111]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20104]|H[20105]<<8|(H[20106]<<16|H[20107]<<24);c=H[20100]|H[20101]<<8|(H[20102]<<16|H[20103]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 213:a=H[19952]|H[19953]<<8|(H[19954]<<16|H[19955]<<24);c=H[19948]|H[19949]<<8|(H[19950]<<16|H[19951]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[19947]|H[19948]<<8|(H[19949]<<16|H[19950]<<24);c=H[19943]|H[19944]<<8|(H[19945]<<16|H[19946]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[19939]|H[19940]<<8|(H[19941]<<16|H[19942]<<24);c=H[19935]|H[19936]<<8|(H[19937]<<16|H[19938]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[19931]|H[19932]<<8|(H[19933]<<16|H[19934]<<24);c=H[19927]|H[19928]<<8|(H[19929]<<16|H[19930]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 214:a=H[20067]|H[20068]<<8|(H[20069]<<16|H[20070]<<24);c=H[20063]|H[20064]<<8|(H[20065]<<16|H[20066]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20062]|H[20063]<<8|(H[20064]<<16|H[20065]<<24);c=H[20058]|H[20059]<<8|(H[20060]<<16|H[20061]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20054]|H[20055]<<8|(H[20056]<<16|H[20057]<<24);c=H[20050]|H[20051]<<8|(H[20052]<<16|H[20053]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20046]|H[20047]<<8|(H[20048]<<16|H[20049]<<24);c=H[20042]|H[20043]<<8|(H[20044]<<16|H[20045]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 215:a=H[20096]|H[20097]<<8|(H[20098]<<16|H[20099]<<24);c=H[20092]|H[20093]<<8|(H[20094]<<16|H[20095]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20091]|H[20092]<<8|(H[20093]<<16|H[20094]<<24);c=H[20087]|H[20088]<<8|(H[20089]<<16|H[20090]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20083]|H[20084]<<8|(H[20085]<<16|H[20086]<<24);c=H[20079]|H[20080]<<8|(H[20081]<<16|H[20082]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20075]|H[20076]<<8|(H[20077]<<16|H[20078]<<24);c=H[20071]|H[20072]<<8|(H[20073]<<16|H[20074]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 216:a=H[20154]|H[20155]<<8|(H[20156]<<16|H[20157]<<24);c=H[20150]|H[20151]<<8|(H[20152]<<16|H[20153]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[20148]|H[20149]<<8|(H[20150]<<16|H[20151]<<24);c=H[20144]|H[20145]<<8|(H[20146]<<16|H[20147]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20140]|H[20141]<<8|(H[20142]<<16|H[20143]<<24);c=H[20136]|H[20137]<<8|(H[20138]<<16|H[20139]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20132]|H[20133]<<8|(H[20134]<<16|H[20135]<<24);c=H[20128]|H[20129]<<8|(H[20130]<<16|H[20131]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 217:a=H[19720]|H[19721]<<8|(H[19722]<<16|H[19723]<<24);c=H[19716]|H[19717]<<8|(H[19718]<<16|H[19719]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[19712]|H[19713]<<8|(H[19714]<<16|H[19715]<<24);c=H[19708]|H[19709]<<8|(H[19710]<<16|H[19711]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[19704]|H[19705]<<8|(H[19706]<<16|H[19707]<<24);c=H[19700]|H[19701]<<8|(H[19702]<<16|H[19703]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 218:a=H[5412]|H[5413]<<8|(H[5414]<<16|H[5415]<<24);c=H[5408]|H[5409]<<8|(H[5410]<<16|H[5411]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[5404]|H[5405]<<8|(H[5406]<<16|H[5407]<<24);c=H[5400]|H[5401]<<8|(H[5402]<<16|H[5403]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5396]|H[5397]<<8|(H[5398]<<16|H[5399]<<24);c=H[5392]|H[5393]<<8|(H[5394]<<16|H[5395]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 219:a=H[26196]|H[26197]<<8|(H[26198]<<16|H[26199]<<24);c=H[26192]|H[26193]<<8|(H[26194]<<16|H[26195]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[26189]|H[26190]<<8|(H[26191]<<16|H[26192]<<24);c=H[26185]|H[26186]<<8|(H[26187]<<16|H[26188]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26181]|H[26182]<<8|(H[26183]<<16|H[26184]<<24);c=H[26177]|H[26178]<<8|(H[26179]<<16|H[26180]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 220:a=H[20183]|H[20184]<<8|(H[20185]<<16|H[20186]<<24);c=H[20179]|H[20180]<<8|(H[20181]<<16|H[20182]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20178]|H[20179]<<8|(H[20180]<<16|H[20181]<<24);c=H[20174]|H[20175]<<8|(H[20176]<<16|H[20177]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20170]|H[20171]<<8|(H[20172]<<16|H[20173]<<24);c=H[20166]|H[20167]<<8|(H[20168]<<16|H[20169]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20162]|H[20163]<<8|(H[20164]<<16|H[20165]<<24);c=H[20158]|H[20159]<<8|(H[20160]<<16|H[20161]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 221:E[b+24|0]=H[35536];a=H[35532]|H[35533]<<8|(H[35534]<<16|H[35535]<<24);c=H[35528]|H[35529]<<8|(H[35530]<<16|H[35531]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[35524]|H[35525]<<8|(H[35526]<<16|H[35527]<<24);c=H[35520]|H[35521]<<8|(H[35522]<<16|H[35523]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[35516]|H[35517]<<8|(H[35518]<<16|H[35519]<<24);c=H[35512]|H[35513]<<8|(H[35514]<<16|H[35515]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 222:a=H[32946]|H[32947]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[32942]|H[32943]<<8|(H[32944]<<16|H[32945]<<24);c=H[32938]|H[32939]<<8|(H[32940]<<16|H[32941]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[32934]|H[32935]<<8|(H[32936]<<16|H[32937]<<24);c=H[32930]|H[32931]<<8|(H[32932]<<16|H[32933]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[32926]|H[32927]<<8|(H[32928]<<16|H[32929]<<24);c=H[32922]|H[32923]<<8|(H[32924]<<16|H[32925]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 223:a=H[33790]|H[33791]<<8|(H[33792]<<16|H[33793]<<24);c=H[33786]|H[33787]<<8|(H[33788]<<16|H[33789]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[33782]|H[33783]<<8|(H[33784]<<16|H[33785]<<24);c=H[33778]|H[33779]<<8|(H[33780]<<16|H[33781]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[33774]|H[33775]<<8|(H[33776]<<16|H[33777]<<24);c=H[33770]|H[33771]<<8|(H[33772]<<16|H[33773]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 224:a=H[8153]|H[8154]<<8|(H[8155]<<16|H[8156]<<24);c=H[8149]|H[8150]<<8|(H[8151]<<16|H[8152]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[8145]|H[8146]<<8|(H[8147]<<16|H[8148]<<24);c=H[8141]|H[8142]<<8|(H[8143]<<16|H[8144]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[8137]|H[8138]<<8|(H[8139]<<16|H[8140]<<24);c=H[8133]|H[8134]<<8|(H[8135]<<16|H[8136]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 225:a=H[34490]|H[34491]<<8|(H[34492]<<16|H[34493]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[34487]|H[34488]<<8|(H[34489]<<16|H[34490]<<24);c=H[34483]|H[34484]<<8|(H[34485]<<16|H[34486]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[34479]|H[34480]<<8|(H[34481]<<16|H[34482]<<24);c=H[34475]|H[34476]<<8|(H[34477]<<16|H[34478]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[34471]|H[34472]<<8|(H[34473]<<16|H[34474]<<24);c=H[34467]|H[34468]<<8|(H[34469]<<16|H[34470]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 226:a=H[23441]|H[23442]<<8|(H[23443]<<16|H[23444]<<24);c=H[23437]|H[23438]<<8|(H[23439]<<16|H[23440]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[23433]|H[23434]<<8|(H[23435]<<16|H[23436]<<24);c=H[23429]|H[23430]<<8|(H[23431]<<16|H[23432]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23425]|H[23426]<<8|(H[23427]<<16|H[23428]<<24);c=H[23421]|H[23422]<<8|(H[23423]<<16|H[23424]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 227:a=H[23212]|H[23213]<<8|(H[23214]<<16|H[23215]<<24);c=H[23208]|H[23209]<<8|(H[23210]<<16|H[23211]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[23204]|H[23205]<<8|(H[23206]<<16|H[23207]<<24);c=H[23200]|H[23201]<<8|(H[23202]<<16|H[23203]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23196]|H[23197]<<8|(H[23198]<<16|H[23199]<<24);c=H[23192]|H[23193]<<8|(H[23194]<<16|H[23195]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 228:E[b+24|0]=H[26409];a=H[26405]|H[26406]<<8|(H[26407]<<16|H[26408]<<24);c=H[26401]|H[26402]<<8|(H[26403]<<16|H[26404]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[26397]|H[26398]<<8|(H[26399]<<16|H[26400]<<24);c=H[26393]|H[26394]<<8|(H[26395]<<16|H[26396]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26389]|H[26390]<<8|(H[26391]<<16|H[26392]<<24);c=H[26385]|H[26386]<<8|(H[26387]<<16|H[26388]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 229:E[b+24|0]=H[26434];a=H[26430]|H[26431]<<8|(H[26432]<<16|H[26433]<<24);c=H[26426]|H[26427]<<8|(H[26428]<<16|H[26429]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[26422]|H[26423]<<8|(H[26424]<<16|H[26425]<<24);c=H[26418]|H[26419]<<8|(H[26420]<<16|H[26421]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26414]|H[26415]<<8|(H[26416]<<16|H[26417]<<24);c=H[26410]|H[26411]<<8|(H[26412]<<16|H[26413]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 230:a=H[26459]|H[26460]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[26455]|H[26456]<<8|(H[26457]<<16|H[26458]<<24);c=H[26451]|H[26452]<<8|(H[26453]<<16|H[26454]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[26447]|H[26448]<<8|(H[26449]<<16|H[26450]<<24);c=H[26443]|H[26444]<<8|(H[26445]<<16|H[26446]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26439]|H[26440]<<8|(H[26441]<<16|H[26442]<<24);c=H[26435]|H[26436]<<8|(H[26437]<<16|H[26438]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 231:a=H[25655]|H[25656]<<8|(H[25657]<<16|H[25658]<<24);c=H[25651]|H[25652]<<8|(H[25653]<<16|H[25654]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[25648]|H[25649]<<8|(H[25650]<<16|H[25651]<<24);c=H[25644]|H[25645]<<8|(H[25646]<<16|H[25647]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[25640]|H[25641]<<8|(H[25642]<<16|H[25643]<<24);c=H[25636]|H[25637]<<8|(H[25638]<<16|H[25639]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 232:a=H[25632]|H[25633]<<8|(H[25634]<<16|H[25635]<<24);c=H[25628]|H[25629]<<8|(H[25630]<<16|H[25631]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[25625]|H[25626]<<8|(H[25627]<<16|H[25628]<<24);c=H[25621]|H[25622]<<8|(H[25623]<<16|H[25624]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[25617]|H[25618]<<8|(H[25619]<<16|H[25620]<<24);c=H[25613]|H[25614]<<8|(H[25615]<<16|H[25616]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 233:a=H[15411]|H[15412]<<8|(H[15413]<<16|H[15414]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[15407]|H[15408]<<8|(H[15409]<<16|H[15410]<<24);c=H[15403]|H[15404]<<8|(H[15405]<<16|H[15406]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15399]|H[15400]<<8|(H[15401]<<16|H[15402]<<24);c=H[15395]|H[15396]<<8|(H[15397]<<16|H[15398]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15391]|H[15392]<<8|(H[15393]<<16|H[15394]<<24);c=H[15387]|H[15388]<<8|(H[15389]<<16|H[15390]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 234:a=H[20009]|H[20010]<<8|(H[20011]<<16|H[20012]<<24);c=H[20005]|H[20006]<<8|(H[20007]<<16|H[20008]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[20004]|H[20005]<<8|(H[20006]<<16|H[20007]<<24);c=H[2e4]|H[20001]<<8|(H[20002]<<16|H[20003]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[19996]|H[19997]<<8|(H[19998]<<16|H[19999]<<24);c=H[19992]|H[19993]<<8|(H[19994]<<16|H[19995]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[19988]|H[19989]<<8|(H[19990]<<16|H[19991]<<24);c=H[19984]|H[19985]<<8|(H[19986]<<16|H[19987]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 235:a=H[15348]|H[15349]<<8|(H[15350]<<16|H[15351]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[15345]|H[15346]<<8|(H[15347]<<16|H[15348]<<24);c=H[15341]|H[15342]<<8|(H[15343]<<16|H[15344]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15337]|H[15338]<<8|(H[15339]<<16|H[15340]<<24);c=H[15333]|H[15334]<<8|(H[15335]<<16|H[15336]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15329]|H[15330]<<8|(H[15331]<<16|H[15332]<<24);c=H[15325]|H[15326]<<8|(H[15327]<<16|H[15328]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 236:a=H[23339]|H[23340]<<8|(H[23341]<<16|H[23342]<<24);c=H[23335]|H[23336]<<8|(H[23337]<<16|H[23338]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[23333]|H[23334]<<8|(H[23335]<<16|H[23336]<<24);c=H[23329]|H[23330]<<8|(H[23331]<<16|H[23332]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[23325]|H[23326]<<8|(H[23327]<<16|H[23328]<<24);c=H[23321]|H[23322]<<8|(H[23323]<<16|H[23324]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23317]|H[23318]<<8|(H[23319]<<16|H[23320]<<24);c=H[23313]|H[23314]<<8|(H[23315]<<16|H[23316]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 237:a=H[21597]|H[21598]<<8|(H[21599]<<16|H[21600]<<24);c=H[21593]|H[21594]<<8|(H[21595]<<16|H[21596]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[21590]|H[21591]<<8|(H[21592]<<16|H[21593]<<24);c=H[21586]|H[21587]<<8|(H[21588]<<16|H[21589]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21582]|H[21583]<<8|(H[21584]<<16|H[21585]<<24);c=H[21578]|H[21579]<<8|(H[21580]<<16|H[21581]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21574]|H[21575]<<8|(H[21576]<<16|H[21577]<<24);c=H[21570]|H[21571]<<8|(H[21572]<<16|H[21573]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 241:a=H[7124]|H[7125]<<8|(H[7126]<<16|H[7127]<<24);c=H[7120]|H[7121]<<8|(H[7122]<<16|H[7123]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[7119]|H[7120]<<8|(H[7121]<<16|H[7122]<<24);c=H[7115]|H[7116]<<8|(H[7117]<<16|H[7118]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[7111]|H[7112]<<8|(H[7113]<<16|H[7114]<<24);c=H[7107]|H[7108]<<8|(H[7109]<<16|H[7110]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[7103]|H[7104]<<8|(H[7105]<<16|H[7106]<<24);c=H[7099]|H[7100]<<8|(H[7101]<<16|H[7102]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 251:a=H[21027]|H[21028]<<8|(H[21029]<<16|H[21030]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[21023]|H[21024]<<8|(H[21025]<<16|H[21026]<<24);c=H[21019]|H[21020]<<8|(H[21021]<<16|H[21022]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21015]|H[21016]<<8|(H[21017]<<16|H[21018]<<24);c=H[21011]|H[21012]<<8|(H[21013]<<16|H[21014]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21007]|H[21008]<<8|(H[21009]<<16|H[21010]<<24);c=H[21003]|H[21004]<<8|(H[21005]<<16|H[21006]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 252:a=H[34521]|H[34522]<<8|(H[34523]<<16|H[34524]<<24);c=H[34517]|H[34518]<<8|(H[34519]<<16|H[34520]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[34514]|H[34515]<<8|(H[34516]<<16|H[34517]<<24);c=H[34510]|H[34511]<<8|(H[34512]<<16|H[34513]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[34506]|H[34507]<<8|(H[34508]<<16|H[34509]<<24);c=H[34502]|H[34503]<<8|(H[34504]<<16|H[34505]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[34498]|H[34499]<<8|(H[34500]<<16|H[34501]<<24);c=H[34494]|H[34495]<<8|(H[34496]<<16|H[34497]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 253:E[b+24|0]=H[17055];a=H[17051]|H[17052]<<8|(H[17053]<<16|H[17054]<<24);c=H[17047]|H[17048]<<8|(H[17049]<<16|H[17050]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[17043]|H[17044]<<8|(H[17045]<<16|H[17046]<<24);c=H[17039]|H[17040]<<8|(H[17041]<<16|H[17042]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17035]|H[17036]<<8|(H[17037]<<16|H[17038]<<24);c=H[17031]|H[17032]<<8|(H[17033]<<16|H[17034]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 254:a=H[17079]|H[17080]<<8|(H[17081]<<16|H[17082]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[17076]|H[17077]<<8|(H[17078]<<16|H[17079]<<24);c=H[17072]|H[17073]<<8|(H[17074]<<16|H[17075]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[17068]|H[17069]<<8|(H[17070]<<16|H[17071]<<24);c=H[17064]|H[17065]<<8|(H[17066]<<16|H[17067]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[17060]|H[17061]<<8|(H[17062]<<16|H[17063]<<24);c=H[17056]|H[17057]<<8|(H[17058]<<16|H[17059]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 255:a=H[27726]|H[27727]<<8|(H[27728]<<16|H[27729]<<24);c=H[27722]|H[27723]<<8|(H[27724]<<16|H[27725]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[27719]|H[27720]<<8|(H[27721]<<16|H[27722]<<24);c=H[27715]|H[27716]<<8|(H[27717]<<16|H[27718]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[27711]|H[27712]<<8|(H[27713]<<16|H[27714]<<24);c=H[27707]|H[27708]<<8|(H[27709]<<16|H[27710]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 261:a=H[25320]|H[25321]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[25316]|H[25317]<<8|(H[25318]<<16|H[25319]<<24);c=H[25312]|H[25313]<<8|(H[25314]<<16|H[25315]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[25308]|H[25309]<<8|(H[25310]<<16|H[25311]<<24);c=H[25304]|H[25305]<<8|(H[25306]<<16|H[25307]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[25300]|H[25301]<<8|(H[25302]<<16|H[25303]<<24);c=H[25296]|H[25297]<<8|(H[25298]<<16|H[25299]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 262:a=H[25374]|H[25375]<<8|(H[25376]<<16|H[25377]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[25370]|H[25371]<<8|(H[25372]<<16|H[25373]<<24);c=H[25366]|H[25367]<<8|(H[25368]<<16|H[25369]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[25362]|H[25363]<<8|(H[25364]<<16|H[25365]<<24);c=H[25358]|H[25359]<<8|(H[25360]<<16|H[25361]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[25354]|H[25355]<<8|(H[25356]<<16|H[25357]<<24);c=H[25350]|H[25351]<<8|(H[25352]<<16|H[25353]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 263:a=H[19980]|H[19981]<<8|(H[19982]<<16|H[19983]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[19976]|H[19977]<<8|(H[19978]<<16|H[19979]<<24);c=H[19972]|H[19973]<<8|(H[19974]<<16|H[19975]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[19968]|H[19969]<<8|(H[19970]<<16|H[19971]<<24);c=H[19964]|H[19965]<<8|(H[19966]<<16|H[19967]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[19960]|H[19961]<<8|(H[19962]<<16|H[19963]<<24);c=H[19956]|H[19957]<<8|(H[19958]<<16|H[19959]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 264:break b;default:break a}}a=H[10988]|H[10989]<<8|(H[10990]<<16|H[10991]<<24);c=H[10984]|H[10985]<<8|(H[10986]<<16|H[10987]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[10982]|H[10983]<<8|(H[10984]<<16|H[10985]<<24);c=H[10978]|H[10979]<<8|(H[10980]<<16|H[10981]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[10974]|H[10975]<<8|(H[10976]<<16|H[10977]<<24);c=H[10970]|H[10971]<<8|(H[10972]<<16|H[10973]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[10966]|H[10967]<<8|(H[10968]<<16|H[10969]<<24);c=H[10962]|H[10963]<<8|(H[10964]<<16|H[10965]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return}if((a|0)<=599){c:{switch(a-301|0){case 0:a=H[13153]|H[13154]<<8|(H[13155]<<16|H[13156]<<24);E[b+15|0]=a;E[b+16|0]=a>>>8;E[b+17|0]=a>>>16;E[b+18|0]=a>>>24;a=H[13150]|H[13151]<<8|(H[13152]<<16|H[13153]<<24);c=H[13146]|H[13147]<<8|(H[13148]<<16|H[13149]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[13142]|H[13143]<<8|(H[13144]<<16|H[13145]<<24);c=H[13138]|H[13139]<<8|(H[13140]<<16|H[13141]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 1:a=H[8429]|H[8430]<<8|(H[8431]<<16|H[8432]<<24);c=H[8425]|H[8426]<<8|(H[8427]<<16|H[8428]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[8422]|H[8423]<<8|(H[8424]<<16|H[8425]<<24);c=H[8418]|H[8419]<<8|(H[8420]<<16|H[8421]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[8414]|H[8415]<<8|(H[8416]<<16|H[8417]<<24);c=H[8410]|H[8411]<<8|(H[8412]<<16|H[8413]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[8406]|H[8407]<<8|(H[8408]<<16|H[8409]<<24);c=H[8402]|H[8403]<<8|(H[8404]<<16|H[8405]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 3:a=H[5876]|H[5877]<<8|(H[5878]<<16|H[5879]<<24);c=H[5872]|H[5873]<<8|(H[5874]<<16|H[5875]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[5870]|H[5871]<<8|(H[5872]<<16|H[5873]<<24);c=H[5866]|H[5867]<<8|(H[5868]<<16|H[5869]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5862]|H[5863]<<8|(H[5864]<<16|H[5865]<<24);c=H[5858]|H[5859]<<8|(H[5860]<<16|H[5861]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 5:a=H[5559]|H[5560]<<8|(H[5561]<<16|H[5562]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[5555]|H[5556]<<8|(H[5557]<<16|H[5558]<<24);c=H[5551]|H[5552]<<8|(H[5553]<<16|H[5554]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[5547]|H[5548]<<8|(H[5549]<<16|H[5550]<<24);c=H[5543]|H[5544]<<8|(H[5545]<<16|H[5546]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5539]|H[5540]<<8|(H[5541]<<16|H[5542]<<24);c=H[5535]|H[5536]<<8|(H[5537]<<16|H[5538]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 6:a=H[12394]|H[12395]<<8|(H[12396]<<16|H[12397]<<24);c=H[12390]|H[12391]<<8|(H[12392]<<16|H[12393]<<24);E[b+13|0]=c;E[b+14|0]=c>>>8;E[b+15|0]=c>>>16;E[b+16|0]=c>>>24;E[b+17|0]=a;E[b+18|0]=a>>>8;E[b+19|0]=a>>>16;E[b+20|0]=a>>>24;a=H[12389]|H[12390]<<8|(H[12391]<<16|H[12392]<<24);c=H[12385]|H[12386]<<8|(H[12387]<<16|H[12388]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[12381]|H[12382]<<8|(H[12383]<<16|H[12384]<<24);c=H[12377]|H[12378]<<8|(H[12379]<<16|H[12380]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 7:E[b+24|0]=H[12422];a=H[12418]|H[12419]<<8|(H[12420]<<16|H[12421]<<24);c=H[12414]|H[12415]<<8|(H[12416]<<16|H[12417]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[12410]|H[12411]<<8|(H[12412]<<16|H[12413]<<24);c=H[12406]|H[12407]<<8|(H[12408]<<16|H[12409]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[12402]|H[12403]<<8|(H[12404]<<16|H[12405]<<24);c=H[12398]|H[12399]<<8|(H[12400]<<16|H[12401]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 8:a=H[15896]|H[15897]<<8|(H[15898]<<16|H[15899]<<24);c=H[15892]|H[15893]<<8|(H[15894]<<16|H[15895]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15888]|H[15889]<<8|(H[15890]<<16|H[15891]<<24);c=H[15884]|H[15885]<<8|(H[15886]<<16|H[15887]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15880]|H[15881]<<8|(H[15882]<<16|H[15883]<<24);c=H[15876]|H[15877]<<8|(H[15878]<<16|H[15879]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 9:E[b+24|0]=H[15875];a=H[15871]|H[15872]<<8|(H[15873]<<16|H[15874]<<24);c=H[15867]|H[15868]<<8|(H[15869]<<16|H[15870]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15863]|H[15864]<<8|(H[15865]<<16|H[15866]<<24);c=H[15859]|H[15860]<<8|(H[15861]<<16|H[15862]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15855]|H[15856]<<8|(H[15857]<<16|H[15858]<<24);c=H[15851]|H[15852]<<8|(H[15853]<<16|H[15854]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 10:E[b+24|0]=H[20947];a=H[20943]|H[20944]<<8|(H[20945]<<16|H[20946]<<24);c=H[20939]|H[20940]<<8|(H[20941]<<16|H[20942]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20935]|H[20936]<<8|(H[20937]<<16|H[20938]<<24);c=H[20931]|H[20932]<<8|(H[20933]<<16|H[20934]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20927]|H[20928]<<8|(H[20929]<<16|H[20930]<<24);c=H[20923]|H[20924]<<8|(H[20925]<<16|H[20926]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 11:a=H[20921]|H[20922]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[20917]|H[20918]<<8|(H[20919]<<16|H[20920]<<24);c=H[20913]|H[20914]<<8|(H[20915]<<16|H[20916]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20909]|H[20910]<<8|(H[20911]<<16|H[20912]<<24);c=H[20905]|H[20906]<<8|(H[20907]<<16|H[20908]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20901]|H[20902]<<8|(H[20903]<<16|H[20904]<<24);c=H[20897]|H[20898]<<8|(H[20899]<<16|H[20900]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 13:a=H[29293]|H[29294]<<8|(H[29295]<<16|H[29296]<<24);c=H[29289]|H[29290]<<8|(H[29291]<<16|H[29292]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[29286]|H[29287]<<8|(H[29288]<<16|H[29289]<<24);c=H[29282]|H[29283]<<8|(H[29284]<<16|H[29285]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29278]|H[29279]<<8|(H[29280]<<16|H[29281]<<24);c=H[29274]|H[29275]<<8|(H[29276]<<16|H[29277]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 16:a=H[15786]|H[15787]<<8|(H[15788]<<16|H[15789]<<24);c=H[15782]|H[15783]<<8|(H[15784]<<16|H[15785]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[15781]|H[15782]<<8|(H[15783]<<16|H[15784]<<24);c=H[15777]|H[15778]<<8|(H[15779]<<16|H[15780]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15773]|H[15774]<<8|(H[15775]<<16|H[15776]<<24);c=H[15769]|H[15770]<<8|(H[15771]<<16|H[15772]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15765]|H[15766]<<8|(H[15767]<<16|H[15768]<<24);c=H[15761]|H[15762]<<8|(H[15763]<<16|H[15764]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 19:a=H[6697]|H[6698]<<8|(H[6699]<<16|H[6700]<<24);c=H[6693]|H[6694]<<8|(H[6695]<<16|H[6696]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[6692]|H[6693]<<8|(H[6694]<<16|H[6695]<<24);c=H[6688]|H[6689]<<8|(H[6690]<<16|H[6691]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[6684]|H[6685]<<8|(H[6686]<<16|H[6687]<<24);c=H[6680]|H[6681]<<8|(H[6682]<<16|H[6683]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[6676]|H[6677]<<8|(H[6678]<<16|H[6679]<<24);c=H[6672]|H[6673]<<8|(H[6674]<<16|H[6675]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 20:a=H[43168]|H[43169]<<8|(H[43170]<<16|H[43171]<<24);c=H[43164]|H[43165]<<8|(H[43166]<<16|H[43167]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[43161]|H[43162]<<8|(H[43163]<<16|H[43164]<<24);c=H[43157]|H[43158]<<8|(H[43159]<<16|H[43160]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[43153]|H[43154]<<8|(H[43155]<<16|H[43156]<<24);c=H[43149]|H[43150]<<8|(H[43151]<<16|H[43152]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[43145]|H[43146]<<8|(H[43147]<<16|H[43148]<<24);c=H[43141]|H[43142]<<8|(H[43143]<<16|H[43144]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 21:a=H[45304]|H[45305]<<8|(H[45306]<<16|H[45307]<<24);c=H[45300]|H[45301]<<8|(H[45302]<<16|H[45303]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[45298]|H[45299]<<8|(H[45300]<<16|H[45301]<<24);c=H[45294]|H[45295]<<8|(H[45296]<<16|H[45297]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[45290]|H[45291]<<8|(H[45292]<<16|H[45293]<<24);c=H[45286]|H[45287]<<8|(H[45288]<<16|H[45289]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 22:a=H[41539]|H[41540]<<8|(H[41541]<<16|H[41542]<<24);c=H[41535]|H[41536]<<8|(H[41537]<<16|H[41538]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[41531]|H[41532]<<8|(H[41533]<<16|H[41534]<<24);c=H[41527]|H[41528]<<8|(H[41529]<<16|H[41530]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[41523]|H[41524]<<8|(H[41525]<<16|H[41526]<<24);c=H[41519]|H[41520]<<8|(H[41521]<<16|H[41522]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 39:a=H[23285]|H[23286]<<8|(H[23287]<<16|H[23288]<<24);c=H[23281]|H[23282]<<8|(H[23283]<<16|H[23284]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23277]|H[23278]<<8|(H[23279]<<16|H[23280]<<24);c=H[23273]|H[23274]<<8|(H[23275]<<16|H[23276]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 40:a=H[13316]|H[13317]<<8|(H[13318]<<16|H[13319]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[13312]|H[13313]<<8|(H[13314]<<16|H[13315]<<24);c=H[13308]|H[13309]<<8|(H[13310]<<16|H[13311]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[13304]|H[13305]<<8|(H[13306]<<16|H[13307]<<24);c=H[13300]|H[13301]<<8|(H[13302]<<16|H[13303]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[13296]|H[13297]<<8|(H[13298]<<16|H[13299]<<24);c=H[13292]|H[13293]<<8|(H[13294]<<16|H[13295]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 41:a=H[26157]|H[26158]<<8|(H[26159]<<16|H[26160]<<24);c=H[26153]|H[26154]<<8|(H[26155]<<16|H[26156]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[26150]|H[26151]<<8|(H[26152]<<16|H[26153]<<24);c=H[26146]|H[26147]<<8|(H[26148]<<16|H[26149]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26142]|H[26143]<<8|(H[26144]<<16|H[26145]<<24);c=H[26138]|H[26139]<<8|(H[26140]<<16|H[26141]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 42:a=H[26173]|H[26174]<<8|(H[26175]<<16|H[26176]<<24);c=H[26169]|H[26170]<<8|(H[26171]<<16|H[26172]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26165]|H[26166]<<8|(H[26167]<<16|H[26168]<<24);c=H[26161]|H[26162]<<8|(H[26163]<<16|H[26164]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 43:a=H[27739]|H[27740]<<8|(H[27741]<<16|H[27742]<<24);c=H[27735]|H[27736]<<8|(H[27737]<<16|H[27738]<<24);E[b+5|0]=c;E[b+6|0]=c>>>8;E[b+7|0]=c>>>16;E[b+8|0]=c>>>24;E[b+9|0]=a;E[b+10|0]=a>>>8;E[b+11|0]=a>>>16;E[b+12|0]=a>>>24;a=H[27734]|H[27735]<<8|(H[27736]<<16|H[27737]<<24);c=H[27730]|H[27731]<<8|(H[27732]<<16|H[27733]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 44:a=H[29416]|H[29417]<<8|(H[29418]<<16|H[29419]<<24);c=H[29412]|H[29413]<<8|(H[29414]<<16|H[29415]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[29410]|H[29411]<<8|(H[29412]<<16|H[29413]<<24);c=H[29406]|H[29407]<<8|(H[29408]<<16|H[29409]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29402]|H[29403]<<8|(H[29404]<<16|H[29405]<<24);c=H[29398]|H[29399]<<8|(H[29400]<<16|H[29401]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 45:a=H[29435]|H[29436]<<8|(H[29437]<<16|H[29438]<<24);E[b+15|0]=a;E[b+16|0]=a>>>8;E[b+17|0]=a>>>16;E[b+18|0]=a>>>24;a=H[29432]|H[29433]<<8|(H[29434]<<16|H[29435]<<24);c=H[29428]|H[29429]<<8|(H[29430]<<16|H[29431]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[29424]|H[29425]<<8|(H[29426]<<16|H[29427]<<24);c=H[29420]|H[29421]<<8|(H[29422]<<16|H[29423]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 46:a=H[13868]|H[13869]<<8|(H[13870]<<16|H[13871]<<24);E[b+16|0]=a;E[b+17|0]=a>>>8;E[b+18|0]=a>>>16;E[b+19|0]=a>>>24;a=H[13864]|H[13865]<<8|(H[13866]<<16|H[13867]<<24);c=H[13860]|H[13861]<<8|(H[13862]<<16|H[13863]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[13856]|H[13857]<<8|(H[13858]<<16|H[13859]<<24);c=H[13852]|H[13853]<<8|(H[13854]<<16|H[13855]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 47:a=H[50505]|H[50506]<<8|(H[50507]<<16|H[50508]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[50501]|H[50502]<<8|(H[50503]<<16|H[50504]<<24);c=H[50497]|H[50498]<<8|(H[50499]<<16|H[50500]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[50493]|H[50494]<<8|(H[50495]<<16|H[50496]<<24);c=H[50489]|H[50490]<<8|(H[50491]<<16|H[50492]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[50485]|H[50486]<<8|(H[50487]<<16|H[50488]<<24);c=H[50481]|H[50482]<<8|(H[50483]<<16|H[50484]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 59:a=H[11171]|H[11172]<<8|(H[11173]<<16|H[11174]<<24);c=H[11167]|H[11168]<<8|(H[11169]<<16|H[11170]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11163]|H[11164]<<8|(H[11165]<<16|H[11166]<<24);c=H[11159]|H[11160]<<8|(H[11161]<<16|H[11162]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[11155]|H[11156]<<8|(H[11157]<<16|H[11158]<<24);c=H[11151]|H[11152]<<8|(H[11153]<<16|H[11154]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 60:a=H[11149]|H[11150]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[11145]|H[11146]<<8|(H[11147]<<16|H[11148]<<24);c=H[11141]|H[11142]<<8|(H[11143]<<16|H[11144]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11137]|H[11138]<<8|(H[11139]<<16|H[11140]<<24);c=H[11133]|H[11134]<<8|(H[11135]<<16|H[11136]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[11129]|H[11130]<<8|(H[11131]<<16|H[11132]<<24);c=H[11125]|H[11126]<<8|(H[11127]<<16|H[11128]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 61:a=H[51821]|H[51822]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[51817]|H[51818]<<8|(H[51819]<<16|H[51820]<<24);c=H[51813]|H[51814]<<8|(H[51815]<<16|H[51816]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51809]|H[51810]<<8|(H[51811]<<16|H[51812]<<24);c=H[51805]|H[51806]<<8|(H[51807]<<16|H[51808]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51801]|H[51802]<<8|(H[51803]<<16|H[51804]<<24);c=H[51797]|H[51798]<<8|(H[51799]<<16|H[51800]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 62:a=H[51839]|H[51840]<<8|(H[51841]<<16|H[51842]<<24);E[b+16|0]=a;E[b+17|0]=a>>>8;E[b+18|0]=a>>>16;E[b+19|0]=a>>>24;a=H[51835]|H[51836]<<8|(H[51837]<<16|H[51838]<<24);c=H[51831]|H[51832]<<8|(H[51833]<<16|H[51834]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51827]|H[51828]<<8|(H[51829]<<16|H[51830]<<24);c=H[51823]|H[51824]<<8|(H[51825]<<16|H[51826]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 63:a=H[21331]|H[21332]<<8|(H[21333]<<16|H[21334]<<24);c=H[21327]|H[21328]<<8|(H[21329]<<16|H[21330]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[21324]|H[21325]<<8|(H[21326]<<16|H[21327]<<24);c=H[21320]|H[21321]<<8|(H[21322]<<16|H[21323]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21316]|H[21317]<<8|(H[21318]<<16|H[21319]<<24);c=H[21312]|H[21313]<<8|(H[21314]<<16|H[21315]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 64:E[b+24|0]=H[28009];a=H[28005]|H[28006]<<8|(H[28007]<<16|H[28008]<<24);c=H[28001]|H[28002]<<8|(H[28003]<<16|H[28004]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[27997]|H[27998]<<8|(H[27999]<<16|H[28e3]<<24);c=H[27993]|H[27994]<<8|(H[27995]<<16|H[27996]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[27989]|H[27990]<<8|(H[27991]<<16|H[27992]<<24);c=H[27985]|H[27986]<<8|(H[27987]<<16|H[27988]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 65:a=H[51867]|H[51868]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[51863]|H[51864]<<8|(H[51865]<<16|H[51866]<<24);c=H[51859]|H[51860]<<8|(H[51861]<<16|H[51862]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51855]|H[51856]<<8|(H[51857]<<16|H[51858]<<24);c=H[51851]|H[51852]<<8|(H[51853]<<16|H[51854]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51847]|H[51848]<<8|(H[51849]<<16|H[51850]<<24);c=H[51843]|H[51844]<<8|(H[51845]<<16|H[51846]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 66:E[b+16|0]=H[51885];a=H[51881]|H[51882]<<8|(H[51883]<<16|H[51884]<<24);c=H[51877]|H[51878]<<8|(H[51879]<<16|H[51880]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51873]|H[51874]<<8|(H[51875]<<16|H[51876]<<24);c=H[51869]|H[51870]<<8|(H[51871]<<16|H[51872]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 67:a=H[51767]|H[51768]<<8|(H[51769]<<16|H[51770]<<24);c=H[51763]|H[51764]<<8|(H[51765]<<16|H[51766]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[51761]|H[51762]<<8|(H[51763]<<16|H[51764]<<24);c=H[51757]|H[51758]<<8|(H[51759]<<16|H[51760]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51753]|H[51754]<<8|(H[51755]<<16|H[51756]<<24);c=H[51749]|H[51750]<<8|(H[51751]<<16|H[51752]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 68:a=H[51795]|H[51796]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[51791]|H[51792]<<8|(H[51793]<<16|H[51794]<<24);c=H[51787]|H[51788]<<8|(H[51789]<<16|H[51790]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[51783]|H[51784]<<8|(H[51785]<<16|H[51786]<<24);c=H[51779]|H[51780]<<8|(H[51781]<<16|H[51782]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[51775]|H[51776]<<8|(H[51777]<<16|H[51778]<<24);c=H[51771]|H[51772]<<8|(H[51773]<<16|H[51774]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 100:a=H[15205]|H[15206]<<8|(H[15207]<<16|H[15208]<<24);c=H[15201]|H[15202]<<8|(H[15203]<<16|H[15204]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[15200]|H[15201]<<8|(H[15202]<<16|H[15203]<<24);c=H[15196]|H[15197]<<8|(H[15198]<<16|H[15199]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15192]|H[15193]<<8|(H[15194]<<16|H[15195]<<24);c=H[15188]|H[15189]<<8|(H[15190]<<16|H[15191]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15184]|H[15185]<<8|(H[15186]<<16|H[15187]<<24);c=H[15180]|H[15181]<<8|(H[15182]<<16|H[15183]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 101:a=H[15236]|H[15237]<<8|(H[15238]<<16|H[15239]<<24);c=H[15232]|H[15233]<<8|(H[15234]<<16|H[15235]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[15229]|H[15230]<<8|(H[15231]<<16|H[15232]<<24);c=H[15225]|H[15226]<<8|(H[15227]<<16|H[15228]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15221]|H[15222]<<8|(H[15223]<<16|H[15224]<<24);c=H[15217]|H[15218]<<8|(H[15219]<<16|H[15220]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15213]|H[15214]<<8|(H[15215]<<16|H[15216]<<24);c=H[15209]|H[15210]<<8|(H[15211]<<16|H[15212]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 102:a=H[11242]|H[11243]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[11238]|H[11239]<<8|(H[11240]<<16|H[11241]<<24);c=H[11234]|H[11235]<<8|(H[11236]<<16|H[11237]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[11230]|H[11231]<<8|(H[11232]<<16|H[11233]<<24);c=H[11226]|H[11227]<<8|(H[11228]<<16|H[11229]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[11222]|H[11223]<<8|(H[11224]<<16|H[11225]<<24);c=H[11218]|H[11219]<<8|(H[11220]<<16|H[11221]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 103:a=H[17010]|H[17011]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[17006]|H[17007]<<8|(H[17008]<<16|H[17009]<<24);c=H[17002]|H[17003]<<8|(H[17004]<<16|H[17005]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[16998]|H[16999]<<8|(H[17e3]<<16|H[17001]<<24);c=H[16994]|H[16995]<<8|(H[16996]<<16|H[16997]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[16990]|H[16991]<<8|(H[16992]<<16|H[16993]<<24);c=H[16986]|H[16987]<<8|(H[16988]<<16|H[16989]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 104:a=H[4670]|H[4671]<<8|(H[4672]<<16|H[4673]<<24);c=H[4666]|H[4667]<<8|(H[4668]<<16|H[4669]<<24);E[b+22|0]=c;E[b+23|0]=c>>>8;E[b+24|0]=c>>>16;E[b+25|0]=c>>>24;E[b+26|0]=a;E[b+27|0]=a>>>8;E[b+28|0]=a>>>16;E[b+29|0]=a>>>24;a=H[4664]|H[4665]<<8|(H[4666]<<16|H[4667]<<24);c=H[4660]|H[4661]<<8|(H[4662]<<16|H[4663]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[4656]|H[4657]<<8|(H[4658]<<16|H[4659]<<24);c=H[4652]|H[4653]<<8|(H[4654]<<16|H[4655]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[4648]|H[4649]<<8|(H[4650]<<16|H[4651]<<24);c=H[4644]|H[4645]<<8|(H[4646]<<16|H[4647]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 105:E[b+24|0]=H[22662];a=H[22658]|H[22659]<<8|(H[22660]<<16|H[22661]<<24);c=H[22654]|H[22655]<<8|(H[22656]<<16|H[22657]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[22650]|H[22651]<<8|(H[22652]<<16|H[22653]<<24);c=H[22646]|H[22647]<<8|(H[22648]<<16|H[22649]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[22642]|H[22643]<<8|(H[22644]<<16|H[22645]<<24);c=H[22638]|H[22639]<<8|(H[22640]<<16|H[22641]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 106:a=H[15145]|H[15146]<<8|(H[15147]<<16|H[15148]<<24);c=H[15141]|H[15142]<<8|(H[15143]<<16|H[15144]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[15140]|H[15141]<<8|(H[15142]<<16|H[15143]<<24);c=H[15136]|H[15137]<<8|(H[15138]<<16|H[15139]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15132]|H[15133]<<8|(H[15134]<<16|H[15135]<<24);c=H[15128]|H[15129]<<8|(H[15130]<<16|H[15131]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15124]|H[15125]<<8|(H[15126]<<16|H[15127]<<24);c=H[15120]|H[15121]<<8|(H[15122]<<16|H[15123]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 107:a=H[15176]|H[15177]<<8|(H[15178]<<16|H[15179]<<24);c=H[15172]|H[15173]<<8|(H[15174]<<16|H[15175]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[15169]|H[15170]<<8|(H[15171]<<16|H[15172]<<24);c=H[15165]|H[15166]<<8|(H[15167]<<16|H[15168]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15161]|H[15162]<<8|(H[15163]<<16|H[15164]<<24);c=H[15157]|H[15158]<<8|(H[15159]<<16|H[15160]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15153]|H[15154]<<8|(H[15155]<<16|H[15156]<<24);c=H[15149]|H[15150]<<8|(H[15151]<<16|H[15152]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 108:a=H[4562]|H[4563]<<8|(H[4564]<<16|H[4565]<<24);c=H[4558]|H[4559]<<8|(H[4560]<<16|H[4561]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[4557]|H[4558]<<8|(H[4559]<<16|H[4560]<<24);c=H[4553]|H[4554]<<8|(H[4555]<<16|H[4556]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[4549]|H[4550]<<8|(H[4551]<<16|H[4552]<<24);c=H[4545]|H[4546]<<8|(H[4547]<<16|H[4548]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[4541]|H[4542]<<8|(H[4543]<<16|H[4544]<<24);c=H[4537]|H[4538]<<8|(H[4539]<<16|H[4540]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 109:a=H[19923]|H[19924]<<8|(H[19925]<<16|H[19926]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[19919]|H[19920]<<8|(H[19921]<<16|H[19922]<<24);c=H[19915]|H[19916]<<8|(H[19917]<<16|H[19918]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[19911]|H[19912]<<8|(H[19913]<<16|H[19914]<<24);c=H[19907]|H[19908]<<8|(H[19909]<<16|H[19910]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[19903]|H[19904]<<8|(H[19905]<<16|H[19906]<<24);c=H[19899]|H[19900]<<8|(H[19901]<<16|H[19902]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 110:a=H[6961]|H[6962]<<8|(H[6963]<<16|H[6964]<<24);c=H[6957]|H[6958]<<8|(H[6959]<<16|H[6960]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[6953]|H[6954]<<8|(H[6955]<<16|H[6956]<<24);c=H[6949]|H[6950]<<8|(H[6951]<<16|H[6952]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[6945]|H[6946]<<8|(H[6947]<<16|H[6948]<<24);c=H[6941]|H[6942]<<8|(H[6943]<<16|H[6944]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 111:a=H[3983]|H[3984]<<8|(H[3985]<<16|H[3986]<<24);c=H[3979]|H[3980]<<8|(H[3981]<<16|H[3982]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[3978]|H[3979]<<8|(H[3980]<<16|H[3981]<<24);c=H[3974]|H[3975]<<8|(H[3976]<<16|H[3977]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[3970]|H[3971]<<8|(H[3972]<<16|H[3973]<<24);c=H[3966]|H[3967]<<8|(H[3968]<<16|H[3969]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[3962]|H[3963]<<8|(H[3964]<<16|H[3965]<<24);c=H[3958]|H[3959]<<8|(H[3960]<<16|H[3961]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 112:a=H[24472]|H[24473]<<8|(H[24474]<<16|H[24475]<<24);c=H[24468]|H[24469]<<8|(H[24470]<<16|H[24471]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[24464]|H[24465]<<8|(H[24466]<<16|H[24467]<<24);c=H[24460]|H[24461]<<8|(H[24462]<<16|H[24463]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[24456]|H[24457]<<8|(H[24458]<<16|H[24459]<<24);c=H[24452]|H[24453]<<8|(H[24454]<<16|H[24455]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 113:a=H[24405]|H[24406]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[24401]|H[24402]<<8|(H[24403]<<16|H[24404]<<24);c=H[24397]|H[24398]<<8|(H[24399]<<16|H[24400]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[24393]|H[24394]<<8|(H[24395]<<16|H[24396]<<24);c=H[24389]|H[24390]<<8|(H[24391]<<16|H[24392]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[24385]|H[24386]<<8|(H[24387]<<16|H[24388]<<24);c=H[24381]|H[24382]<<8|(H[24383]<<16|H[24384]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 119:a=H[15264]|H[15265]<<8|(H[15266]<<16|H[15267]<<24);E[b+24|0]=a;E[b+25|0]=a>>>8;E[b+26|0]=a>>>16;E[b+27|0]=a>>>24;a=H[15260]|H[15261]<<8|(H[15262]<<16|H[15263]<<24);c=H[15256]|H[15257]<<8|(H[15258]<<16|H[15259]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15252]|H[15253]<<8|(H[15254]<<16|H[15255]<<24);c=H[15248]|H[15249]<<8|(H[15250]<<16|H[15251]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15244]|H[15245]<<8|(H[15246]<<16|H[15247]<<24);c=H[15240]|H[15241]<<8|(H[15242]<<16|H[15243]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 130:a=H[15022]|H[15023]<<8|(H[15024]<<16|H[15025]<<24);E[b+23|0]=a;E[b+24|0]=a>>>8;E[b+25|0]=a>>>16;E[b+26|0]=a>>>24;a=H[15019]|H[15020]<<8|(H[15021]<<16|H[15022]<<24);c=H[15015]|H[15016]<<8|(H[15017]<<16|H[15018]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15011]|H[15012]<<8|(H[15013]<<16|H[15014]<<24);c=H[15007]|H[15008]<<8|(H[15009]<<16|H[15010]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15003]|H[15004]<<8|(H[15005]<<16|H[15006]<<24);c=H[14999]|H[15e3]<<8|(H[15001]<<16|H[15002]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 131:a=H[21096]|H[21097]<<8|(H[21098]<<16|H[21099]<<24);c=H[21092]|H[21093]<<8|(H[21094]<<16|H[21095]<<24);E[b+21|0]=c;E[b+22|0]=c>>>8;E[b+23|0]=c>>>16;E[b+24|0]=c>>>24;E[b+25|0]=a;E[b+26|0]=a>>>8;E[b+27|0]=a>>>16;E[b+28|0]=a>>>24;a=H[21091]|H[21092]<<8|(H[21093]<<16|H[21094]<<24);c=H[21087]|H[21088]<<8|(H[21089]<<16|H[21090]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21083]|H[21084]<<8|(H[21085]<<16|H[21086]<<24);c=H[21079]|H[21080]<<8|(H[21081]<<16|H[21082]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21075]|H[21076]<<8|(H[21077]<<16|H[21078]<<24);c=H[21071]|H[21072]<<8|(H[21073]<<16|H[21074]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 132:a=H[23695]|H[23696]<<8|(H[23697]<<16|H[23698]<<24);c=H[23691]|H[23692]<<8|(H[23693]<<16|H[23694]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[23687]|H[23688]<<8|(H[23689]<<16|H[23690]<<24);c=H[23683]|H[23684]<<8|(H[23685]<<16|H[23686]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23679]|H[23680]<<8|(H[23681]<<16|H[23682]<<24);c=H[23675]|H[23676]<<8|(H[23677]<<16|H[23678]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 133:a=H[15757]|H[15758]<<8|(H[15759]<<16|H[15760]<<24);c=H[15753]|H[15754]<<8|(H[15755]<<16|H[15756]<<24);E[b+14|0]=c;E[b+15|0]=c>>>8;E[b+16|0]=c>>>16;E[b+17|0]=c>>>24;E[b+18|0]=a;E[b+19|0]=a>>>8;E[b+20|0]=a>>>16;E[b+21|0]=a>>>24;a=H[15751]|H[15752]<<8|(H[15753]<<16|H[15754]<<24);c=H[15747]|H[15748]<<8|(H[15749]<<16|H[15750]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15743]|H[15744]<<8|(H[15745]<<16|H[15746]<<24);c=H[15739]|H[15740]<<8|(H[15741]<<16|H[15742]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 134:a=H[15849]|H[15850]<<8;E[b+24|0]=a;E[b+25|0]=a>>>8;a=H[15845]|H[15846]<<8|(H[15847]<<16|H[15848]<<24);c=H[15841]|H[15842]<<8|(H[15843]<<16|H[15844]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[15837]|H[15838]<<8|(H[15839]<<16|H[15840]<<24);c=H[15833]|H[15834]<<8|(H[15835]<<16|H[15836]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[15829]|H[15830]<<8|(H[15831]<<16|H[15832]<<24);c=H[15825]|H[15826]<<8|(H[15827]<<16|H[15828]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 135:a=H[21127]|H[21128]<<8|(H[21129]<<16|H[21130]<<24);c=H[21123]|H[21124]<<8|(H[21125]<<16|H[21126]<<24);E[b+23|0]=c;E[b+24|0]=c>>>8;E[b+25|0]=c>>>16;E[b+26|0]=c>>>24;E[b+27|0]=a;E[b+28|0]=a>>>8;E[b+29|0]=a>>>16;E[b+30|0]=a>>>24;a=H[21120]|H[21121]<<8|(H[21122]<<16|H[21123]<<24);c=H[21116]|H[21117]<<8|(H[21118]<<16|H[21119]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[21112]|H[21113]<<8|(H[21114]<<16|H[21115]<<24);c=H[21108]|H[21109]<<8|(H[21110]<<16|H[21111]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[21104]|H[21105]<<8|(H[21106]<<16|H[21107]<<24);c=H[21100]|H[21101]<<8|(H[21102]<<16|H[21103]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 200:a=H[23715]|H[23716]<<8|(H[23717]<<16|H[23718]<<24);E[b+16|0]=a;E[b+17|0]=a>>>8;E[b+18|0]=a>>>16;E[b+19|0]=a>>>24;a=H[23711]|H[23712]<<8|(H[23713]<<16|H[23714]<<24);c=H[23707]|H[23708]<<8|(H[23709]<<16|H[23710]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[23703]|H[23704]<<8|(H[23705]<<16|H[23706]<<24);c=H[23699]|H[23700]<<8|(H[23701]<<16|H[23702]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 201:a=H[20419]|H[20420]<<8|(H[20421]<<16|H[20422]<<24);E[b+15|0]=a;E[b+16|0]=a>>>8;E[b+17|0]=a>>>16;E[b+18|0]=a>>>24;a=H[20416]|H[20417]<<8|(H[20418]<<16|H[20419]<<24);c=H[20412]|H[20413]<<8|(H[20414]<<16|H[20415]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20408]|H[20409]<<8|(H[20410]<<16|H[20411]<<24);c=H[20404]|H[20405]<<8|(H[20406]<<16|H[20407]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 202:E[b+24|0]=H[14858];a=H[14854]|H[14855]<<8|(H[14856]<<16|H[14857]<<24);c=H[14850]|H[14851]<<8|(H[14852]<<16|H[14853]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[14846]|H[14847]<<8|(H[14848]<<16|H[14849]<<24);c=H[14842]|H[14843]<<8|(H[14844]<<16|H[14845]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[14838]|H[14839]<<8|(H[14840]<<16|H[14841]<<24);c=H[14834]|H[14835]<<8|(H[14836]<<16|H[14837]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 203:a=H[20999]|H[21e3]<<8|(H[21001]<<16|H[21002]<<24);c=H[20995]|H[20996]<<8|(H[20997]<<16|H[20998]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=a;E[b+21|0]=a>>>8;E[b+22|0]=a>>>16;E[b+23|0]=a>>>24;a=H[20991]|H[20992]<<8|(H[20993]<<16|H[20994]<<24);c=H[20987]|H[20988]<<8|(H[20989]<<16|H[20990]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[20983]|H[20984]<<8|(H[20985]<<16|H[20986]<<24);c=H[20979]|H[20980]<<8|(H[20981]<<16|H[20982]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return;case 204:break c;default:break a}}a=H[26092]|H[26093]<<8|(H[26094]<<16|H[26095]<<24);c=H[26088]|H[26089]<<8|(H[26090]<<16|H[26091]<<24);E[b+15|0]=c;E[b+16|0]=c>>>8;E[b+17|0]=c>>>16;E[b+18|0]=c>>>24;E[b+19|0]=a;E[b+20|0]=a>>>8;E[b+21|0]=a>>>16;E[b+22|0]=a>>>24;a=H[26085]|H[26086]<<8|(H[26087]<<16|H[26088]<<24);c=H[26081]|H[26082]<<8|(H[26083]<<16|H[26084]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[26077]|H[26078]<<8|(H[26079]<<16|H[26080]<<24);c=H[26073]|H[26074]<<8|(H[26075]<<16|H[26076]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return}a=H[5433]|H[5434]<<8|(H[5435]<<16|H[5436]<<24);c=H[5429]|H[5430]<<8|(H[5431]<<16|H[5432]<<24);E[b+13|0]=c;E[b+14|0]=c>>>8;E[b+15|0]=c>>>16;E[b+16|0]=c>>>24;E[b+17|0]=a;E[b+18|0]=a>>>8;E[b+19|0]=a>>>16;E[b+20|0]=a>>>24;a=H[5428]|H[5429]<<8|(H[5430]<<16|H[5431]<<24);c=H[5424]|H[5425]<<8|(H[5426]<<16|H[5427]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5420]|H[5421]<<8|(H[5422]<<16|H[5423]<<24);c=H[5416]|H[5417]<<8|(H[5418]<<16|H[5419]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24;return}a=H[5433]|H[5434]<<8|(H[5435]<<16|H[5436]<<24);c=H[5429]|H[5430]<<8|(H[5431]<<16|H[5432]<<24);E[b+13|0]=c;E[b+14|0]=c>>>8;E[b+15|0]=c>>>16;E[b+16|0]=c>>>24;E[b+17|0]=a;E[b+18|0]=a>>>8;E[b+19|0]=a>>>16;E[b+20|0]=a>>>24;a=H[5428]|H[5429]<<8|(H[5430]<<16|H[5431]<<24);c=H[5424]|H[5425]<<8|(H[5426]<<16|H[5427]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=a;E[b+13|0]=a>>>8;E[b+14|0]=a>>>16;E[b+15|0]=a>>>24;a=H[5420]|H[5421]<<8|(H[5422]<<16|H[5423]<<24);c=H[5416]|H[5417]<<8|(H[5418]<<16|H[5419]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=a;E[b+5|0]=a>>>8;E[b+6|0]=a>>>16;E[b+7|0]=a>>>24}function uh(a,b,c,d,e,f,g,h){var 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=N(0),A=0,B=0,C=0,D=0,P=0,U=0,V=N(0),W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=N(0),da=0,ea=0,fa=0,ga=0,ha=0,ia=N(0),ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=N(0),ra=0,sa=0,ta=0,ua=N(0),va=0,wa=N(0),xa=N(0),ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Ga=0,Ha=0,Ja=0,Ka=N(0),La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=N(0),Xa=0,Ya=0,Za=0,_a=0,$a=0,db=0,eb=0,fb=0,gb=0,hb=N(0),ib=0,jb=0,kb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=N(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,Ob=0,Pb=0,Qb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=N(0),cc=0,ec=0,fc=0,gc=0;D=Fa-384|0;Fa=D;a:{if(G[h>>2]>0){break a}if(!Nb(a,h)){Ua(59541);G[h>>2]=413;break a}l=G[a>>2];i=G[a+4>>2];b:{if((l|0)!=G[i+76>>2]){mb(a,l+1|0,0,h);break b}if((G[i+128>>2]&G[i+132>>2])!=-1){break b}if((Rb(a,h)|0)>0){break a}}l=2;ba=4;Na=2;c:{d:{e:{f:{i=b&-2;switch(i-20|0){case 0:break d;case 10:break e;default:break f}}Na=1;if(b-11>>>0<2){break d}if((i|0)==40){break e}l=4;Na=4;if((b|0)==42){break d}if((b|0)==82){ba=8;l=8;Na=8;break d}Ua(24476);break c}l=4;Na=4}i=ba;g:{h:{i:{j:{k:{Ga=G[a+4>>2];switch(G[Ga+1048>>2]-11|0){case 20:break g;case 0:case 10:case 11:case 40:break j;case 30:break k;default:break i}}switch(G[Ga+1104>>2]-8|0){case 0:case 8:break g;default:break h}}i=Na;l:{switch(G[Ga+1104>>2]-8|0){case 8:i=l;break g;case 0:break g;default:break l}}i=ba;break g}Ua(16274);break c}i=8}m:{n:{o:{r=lb(G[Ga+1136>>2],i);if(r){Oa=1;G[D+320>>2]=1;G[D+352>>2]=1;G[D+356>>2]=1;G[D+288>>2]=1;G[D+292>>2]=1;G[D+256>>2]=1;G[D+260>>2]=1;G[D+160>>2]=1;G[D+164>>2]=1;G[D+360>>2]=1;G[D+324>>2]=1;G[D+328>>2]=1;G[D+296>>2]=1;G[D+300>>2]=1;G[D+264>>2]=1;G[D+268>>2]=1;G[D+168>>2]=1;G[D+172>>2]=1;G[D+364>>2]=1;G[D+368>>2]=1;G[D+332>>2]=1;G[D+336>>2]=1;G[D+372>>2]=1;G[D+340>>2]=1;G[D+304>>2]=1;G[D+308>>2]=1;G[D+272>>2]=1;G[D+276>>2]=1;G[D+176>>2]=1;G[D+180>>2]=1;l=0;Ra=G[Ga+1108>>2];if((Ra|0)>0){break o}Pa=1;break n}Ua(59462);G[h>>2]=113;break a}while(1){i=l<<2;o=G[i+c>>2];G[i+(D+128|0)>>2]=o;j=G[d+i>>2];G[i+(D+96|0)>>2]=j;k=i+Ga|0;p=G[k+1112>>2];G[i+(D+352|0)>>2]=p;if((o|0)<=0){Wa(r);G[h>>2]=321;break a}ba=G[k+1052>>2];G[i+(D+320|0)>>2]=ba;G[i+(D+160|0)>>2]=Oa;G[i+(D+288|0)>>2]=((o-1|0)/(ba|0)|0)+1;o=i+(D+256|0)|0;na=((j-1|0)/(ba|0)|0)+1|0;i=((p-1|0)/(ba|0)|0)+1|0;G[o>>2]=(i|0)>(na|0)?na:i;Oa=M(i,Oa);l=l+1|0;if((Ra|0)!=(l|0)){continue}break}Oa=G[D+308>>2];Pa=G[D+276>>2];if((Oa|0)>(Pa|0)){break m}}Sa=G[D+372>>2];Ta=G[D+340>>2];Ya=G[D+272>>2];ub=G[D+304>>2];if((Ya|0)<(ub|0)){b=M(Pa,Ta);G[D+212>>2]=(b|0)<(Sa|0)?b:Sa;G[D+244>>2]=M(Pa-1|0,Ta)+1;break m}Za=G[D+368>>2];_a=G[D+336>>2];$a=G[D+268>>2];vb=G[D+300>>2];if(($a|0)<(vb|0)){b=M(Pa,Ta);G[D+212>>2]=(b|0)<(Sa|0)?b:Sa;G[D+244>>2]=M(Pa-1|0,Ta)+1;G[D+240>>2]=M(Ya-1|0,_a)+1;b=M(_a,Ya);G[D+208>>2]=(b|0)<(Za|0)?b:Za;break m}db=G[D+364>>2];eb=G[D+332>>2];kb=G[D+264>>2];wb=G[D+296>>2];if((kb|0)>=(wb|0)){xb=G[D+352>>2];yb=G[D+320>>2];zb=G[D+256>>2];Ab=G[D+288>>2];Gb=G[D+164>>2];Bb=G[D+292>>2];Hb=G[D+168>>2];Ib=G[D+172>>2];Jb=G[D+176>>2];Kb=G[D+180>>2];nb=G[D+328>>2];c=M(nb,kb);ob=G[D+360>>2];Cb=(c|0)<(ob|0)?c:ob;c=M(eb,$a);Lb=(c|0)<(db|0)?c:db;pb=G[D+324>>2];qb=G[D+260>>2];c=M(pb,qb);rb=G[D+356>>2];Mb=(c|0)<(rb|0)?c:rb;Ob=Ra&-2;Pb=Ra&1;Db=M(kb-1|0,nb)+1|0;Qb=M($a-1|0,eb)+1|0;Sb=M(qb-1|0,pb)+1|0;while(1){c=Oa-1|0;d=M(c,Ta);G[D+244>>2]=d+1;i=M(Oa,Ta);i=(i|0)<(Sa|0)?i:Sa;G[D+212>>2]=i;Tb=i-d|0;Ub=M(c,Kb);c=ub;while(1){d=c-1|0;i=M(d,_a);G[D+240>>2]=i+1;l=M(c,_a);l=(l|0)<(Za|0)?l:Za;G[D+208>>2]=l;p:{if((qb|0)>=(Bb|0)){Vb=M(l-i|0,Tb);Wb=M(d,Jb)+Ub|0;d=vb;while(1){i=d-1|0;l=M(i,eb);G[D+236>>2]=l+1;o=M(d,eb);o=(o|0)<(db|0)?o:db;G[D+204>>2]=o;q:{if((zb|0)>=(Ab|0)){Xb=M(o-l|0,Vb);Yb=M(i,Ib)+Wb|0;Ga=wb;while(1){i=Ga-1|0;l=M(i,nb);G[D+232>>2]=l+1;o=M(Ga,nb);o=(o|0)<(ob|0)?o:ob;G[D+200>>2]=o;Zb=M(o-l|0,Xb);_b=M(i,Hb)+Yb|0;jb=Bb;while(1){i=jb-1|0;l=M(i,pb);G[D+228>>2]=l+1;o=M(jb,pb);o=(o|0)<(rb|0)?o:rb;G[D+196>>2]=o;$b=M(o-l|0,Zb);ac=M(i,Gb)+_b|0;i=Ab;while(1){l=M(i-1|0,yb);G[D+224>>2]=l+1;o=M(i,yb);o=(o|0)<(xb|0)?o:xb;G[D+192>>2]=o;Eb=i;Ba=ac+i|0;j=M(o-l|0,$b);so(a,Ba,j,b,e,g,r,0,D+92|0,h);if(G[h>>2]==415){cb(r,0,M(j,Na));G[h>>2]=0}u=D+224|0;X=D+192|0;x=D+128|0;W=D+96|0;p=0;s=0;o=Fa-192|0;Fa=o;r:{if(G[h>>2]>0){break r}i=o;G[i+112>>2]=0;G[i+116>>2]=0;G[i+80>>2]=0;G[i+84>>2]=0;G[i+48>>2]=0;G[i+52>>2]=0;G[i+104>>2]=0;G[i+108>>2]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+64>>2]=0;G[i+68>>2]=0;G[i+72>>2]=0;G[i+76>>2]=0;G[i+32>>2]=0;G[i+36>>2]=0;G[i+40>>2]=0;G[i+44>>2]=0;A=1;G[i>>2]=1;G[i+160>>2]=1;G[i+128>>2]=1;G[i+132>>2]=1;G[i+4>>2]=1;G[i+8>>2]=1;G[i+164>>2]=1;G[i+168>>2]=1;G[i+136>>2]=1;G[i+12>>2]=1;G[i+172>>2]=1;G[i+140>>2]=1;G[i+144>>2]=1;G[i+16>>2]=1;G[i+20>>2]=1;G[i+176>>2]=1;G[i+180>>2]=1;G[i+148>>2]=1;s:{t:{if((Ra|0)<=0){i=0;v=0;l=Na;break t}while(1){i=s<<2;p=G[i+X>>2];l=G[i+x>>2];if((p|0)<(l|0)){break r}v=G[i+u>>2];m=G[i+W>>2];if((v|0)>(m|0)){break r}n=G[i+o>>2];k=n>>31;aa=i+(o+160|0)|0;k=(k^n)-k|0;n=(m-l|0)/(k|0)|0;da=n+1|0;G[aa>>2]=da;if((n|0)<0){break s}w=i+(o+128|0)|0;m=p-v|0;q=m+1|0;G[w>>2]=q;if((m|0)<0){break s}if(s){G[w>>2]=M(q,G[(i+o|0)+124>>2])}q=l-1|0;m=p-1|0;p=v-1|0;while(1){if((p-q|0)%(k|0)|0){_=(m|0)>(p|0);p=p+1|0;if(_){continue}break r}break}while(1){if((m-q|0)%(k|0)|0){_=(m|0)>(p|0);m=m-1|0;if(_){continue}break r}break}q=m;m=1-l|0;q=(q+m|0)/(k|0)|0;G[i+(o- -64|0)>>2]=(n|0)>(q|0)?q:n;p=(m+p|0)/(k|0)|0;G[i+(o+96|0)>>2]=(p|0)>0?p:0;p=l-v|0;p=(p|0)>0?p:0;m=v-l|0;l=i+(o+32|0)|0;u:{while(1){if(!((m+p|0)%(k|0)|0)){break u}p=p+1|0;if((p|0)>2]){continue}break}G[l>>2]=p;break r}G[l>>2]=p;if(s){G[aa>>2]=M(da,G[(i+o|0)+156>>2])}s=s+1|0;if((Ra|0)!=(s|0)){continue}break}v=G[o+112>>2];p=G[o+80>>2];if((v|0)>(p|0)){break r}s=G[o+64>>2];i=G[o+96>>2];A=(s-i|0)+1|0;l=M(Na,A)}m=G[o+76>>2];q=G[o+108>>2];if((m|0)<(q|0)){break r}k=l;aa=G[o+160>>2];da=G[o+128>>2];_=G[o+32>>2];Y=G[o+36>>2];B=G[o+132>>2];$=G[o+164>>2];ha=G[o+40>>2];la=G[o+136>>2];va=G[o+168>>2];fa=G[o+44>>2];ka=G[o+140>>2];ma=G[o+172>>2];ja=G[o+48>>2];oa=(p-v|0)+1|0;za=(m-q|0)+1|0;Aa=G[o+72>>2];u=G[o+104>>2];Ea=(Aa-u|0)+1|0;Ca=G[o+68>>2];x=G[o+100>>2];La=(Ca-x|0)+1|0;C=0;X=0;while(1){Ha=M(ka,X+ja|0);Qa=M(ma,v+C|0);n=0;w=0;while(1){if((u|0)<=(Aa|0)){Ja=Qa+M(va,n+q|0)|0;fb=Ha+M(la,w+fa|0)|0;W=0;ea=0;while(1){if((x|0)<=(Ca|0)){gb=Ja+M($,u+W|0)|0;Da=_+(fb+M(B,ea+ha|0)|0)|0;pa=0;ga=0;while(1){if((i|0)<=(s|0)){p=Da+M(da,Y+ga|0)|0;m=(gb+M(aa,x+pa|0)|0)+i|0;l=i;while(1){bb(M(p,Na)+r|0,M(m,Na)+f|0,k);m=m+A|0;p=p+A|0;l=l+A|0;if((s|0)>=(l|0)){continue}break}}ga=ga+1|0;pa=pa+1|0;if((La|0)!=(pa|0)){continue}break}}ea=ea+1|0;W=W+1|0;if((Ea|0)!=(W|0)){continue}break}}w=w+1|0;n=n+1|0;if((za|0)!=(n|0)){continue}break}X=X+1|0;C=C+1|0;if((oa|0)!=(C|0)){continue}break}break r}G[h>>2]=323}Fa=o+192|0;v:{if(G[h>>2]){break v}na=1;if((Ra|0)>0){i=0;l=0;u=0;if((Ra|0)!=1){while(1){o=l<<2;k=o|4;p=D+192|0;w=G[k+p>>2];m=k;k=D+224|0;m=w-G[m+k>>2]|0;s=m+1|0;o=G[o+p>>2]-G[k+o>>2]|0;k=o+1|0;p=(o|0)>0;o=p?i?i:k:i;m=(m|0)>0;na=M(m?o?s:1:1,M(p?i?k:1:1,na));l=l+2|0;ba=m?o?o:s:o;i=ba;u=u+2|0;if((Ob|0)!=(u|0)){continue}break}}if(Pb){l=l<<2;l=G[l+(D+192|0)>>2]-G[l+(D+224|0)>>2]|0;o=l+1|0;l=(l|0)>0;ba=l?i?i:o:i;na=M(l?i?o:1:1,na)}if(ba){break v}}ba=1}o=j;n=0;m=0;A=0;C=0;x=0;P=0;U=0;ra=0;W=0;v=0;p=0;aa=0;X=0;Z=0;sa=0;ea=0;pa=0;la=0;La=0;Fb=0;_=Fa-80|0;Fa=_;G[_+76>>2]=1;G[_+60>>2]=0;G[_+24>>2]=0;G[_+28>>2]=1072693248;G[_+16>>2]=0;G[_+20>>2]=0;w:{if(G[h>>2]>0){break w}x:{j=G[a+4>>2];if(!(!((b|0)==163|b-82>>>0<2)&(b|0)!=42|(K[j+1076>>2]!=N(9999)|G[j+1048>>2]-21>>>0<2))){Ua(60755);break x}i=G[j+1228>>2];y:{if(!i){break y}k=i;i=(Ba-1|0)%(((G[j+1112>>2]-1|0)/G[j+1052>>2]|0)+1|0)|0;l=i<<2;if((Ba|0)!=G[k+l>>2]){break y}l=G[l+G[j+1240>>2]>>2];if(l){Wa(l);j=G[a+4>>2]}i=i<<2;l=G[i+G[j+1244>>2]>>2];if(l){Wa(l);j=G[a+4>>2]}G[G[j+1240>>2]+i>>2]=0;G[i+G[G[a+4>>2]+1244>>2]>>2]=0;j=G[a+4>>2];G[i+G[j+1228>>2]>>2]=0;G[i+G[j+1232>>2]>>2]=0;G[i+G[j+1236>>2]>>2]=0;G[i+G[j+1248>>2]>>2]=0}if(G[j+1048>>2]==-1){l=Fa-16|0;Fa=l;i=G[a+4>>2];z:{if(G[i+1148>>2]<=0){A:{B:{switch(b-21|0){case 10:G[l+12>>2]=4870193;break A;case 21:G[l+12>>2]=4542769;break A;default:Ua(7966);G[h>>2]=413;break z;case 0:break B}}G[l+12>>2]=4804657}Bi(a,999,35949,l+12|0,h);i=G[a+4>>2]}dc(a,0,35949,i+1148|0,h);Bk(a,b,G[G[a+4>>2]+1148>>2],Ba,Ba>>31,1,0,o,o>>31,r,h)}Fa=l+16|0;break w}va=G[j+1104>>2];$=(va|0)>0?G[j+1164>>2]!=-1?0:e:e;t=L[j+1192>>3];y=L[j+1184>>3];l=G[j+1208>>2];C:{D:{switch(b-11|0){case 9:k=o;E:{if(!(!((va|0)!=16|y!=1)&t==32768)){Ua(7807);G[h>>2]=413;break E}F:{j=G[a+4>>2];i=G[j+1048>>2];m=i-21|0;if(!((1<>>0<=30:0)|(i|0)==11)){G[_+72>>2]=4;if(($|0)!=1){break F}if((k|0)<=0){break E}i=I[g>>1];j=k;if(j&1){j=k-1|0;m=I[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m|0)?l:m-32768|0}if((k|0)==1){break E}while(1){k=j-1|0;m=I[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:m-32768|0;j=j-2|0;m=I[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m|0)?l:m-32768|0;if(k>>>0>1){continue}break}break E}G[_+72>>2]=2;if(($|0)!=1){if((k|0)<=0){break E}i=k-1|0;m=k&3;if(m){j=0;while(1){k=k-1|0;s=r+(k<<1)|0;F[s>>1]=I[s>>1]^32768;j=j+1|0;if((m|0)!=(j|0)){continue}break}}if(i>>>0<3){break E}while(1){i=r+(k<<1)|0;j=i-2|0;F[j>>1]=I[j>>1]^32768;i=i-4|0;F[i>>1]=I[i>>1]^32768;i=k-3|0;j=r+(i<<1)|0;F[j>>1]=I[j>>1]^32768;k=k-4|0;j=r+(k<<1)|0;F[j>>1]=I[j>>1]^32768;if(i>>>0>1){continue}break}break E}if((k|0)<=0){break E}i=I[g>>1];s=k-1|0;n=k&3;if(n){j=0;while(1){k=k-1|0;w=r+(k<<1)|0;m=I[w>>1];F[w>>1]=(i|0)==(m|0)?l:m^32768;j=j+1|0;if((n|0)!=(j|0)){continue}break}}if(s>>>0<3){break E}while(1){m=r+(k<<1)|0;s=m-2|0;j=I[s>>1];F[s>>1]=(i|0)==(j|0)?l:j^32768;m=m-4|0;j=I[m>>1];F[m>>1]=(i|0)==(j|0)?l:j^32768;m=k-3|0;s=r+(m<<1)|0;j=I[s>>1];F[s>>1]=(i|0)==(j|0)?l:j^32768;k=k-4|0;s=r+(k<<1)|0;j=I[s>>1];F[s>>1]=(i|0)==(j|0)?l:j^32768;if(m>>>0>1){continue}break}break E}i=G[h>>2];G:{if(G[j+1048>>2]==41){if((i|0)>0){break E}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){break G}H:{if((k|0)<=0){break H}j=k-n|0;while(1){I:{if((n|0)<=0){break I}x=0;k=0;if(n-1>>>0>=3){m=n&-4;u=0;while(1){G[i+(k<<2)>>2]=I[r+(j+k<<1)>>1]-32768;s=k|1;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1]-32768;s=k|2;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1]-32768;s=k|3;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1]-32768;k=k+4|0;u=u+4|0;if((m|0)!=(u|0)){continue}break}}m=n&3;if(!m){break I}while(1){G[i+(k<<2)>>2]=I[r+(j+k<<1)>>1]-32768;k=k+1|0;x=x+1|0;if((m|0)!=(x|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break H}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i);break E}if((i|0)>0){break E}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){break G}J:{if((k|0)<=0){break J}j=k-n|0;while(1){K:{if((n|0)<=0){break K}x=0;k=0;if(n-1>>>0>=3){m=n&-4;u=0;while(1){G[i+(k<<2)>>2]=I[r+(j+k<<1)>>1];s=k|1;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1];s=k|2;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1];s=k|3;G[i+(s<<2)>>2]=I[r+(j+s<<1)>>1];k=k+4|0;u=u+4|0;if((m|0)!=(u|0)){continue}break}}m=n&3;if(!m){break K}while(1){G[i+(k<<2)>>2]=I[r+(j+k<<1)>>1];k=k+1|0;x=x+1|0;if((m|0)!=(x|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break J}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i);break E}Ua(61691);G[h>>2]=113}break C;case 0:k=o;L:{if(!(!((va|0)!=8|y!=1)&t==0)){Ua(7807);G[h>>2]=413;break L}M:{N:{i=G[G[a+4>>2]+1048>>2];j=i-21|0;if(!((1<>>0<=30:0)|(i|0)==11)){G[_+72>>2]=4;if(($|0)!=1){break N}if((k|0)<=0){break M}i=H[g|0];s=k-1|0;n=k&3;if(n){j=0;while(1){k=k-1|0;m=H[r+k|0];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:m;j=j+1|0;if((n|0)!=(j|0)){continue}break}}if(s>>>0<3){break M}while(1){m=k-1|0;j=H[m+r|0];G[r+(m<<2)>>2]=(i|0)==(j|0)?l:j;m=k-2|0;j=H[m+r|0];G[r+(m<<2)>>2]=(i|0)==(j|0)?l:j;j=k-3|0;m=H[j+r|0];G[r+(j<<2)>>2]=(i|0)==(m|0)?l:m;k=k-4|0;m=H[r+k|0];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:m;if(j>>>0>1){continue}break}break M}G[_+72>>2]=1;if(($|0)!=1){break M}i=H[g|0];if((i|0)==(l|0)|(k|0)<=0){break M}j=k-1|0;m=k&3;if(m){while(1){k=k-1|0;s=r+k|0;if((i|0)==H[s|0]){E[s|0]=l}x=x+1|0;if((m|0)!=(x|0)){continue}break}}if(j>>>0<3){break M}while(1){j=k+r|0;m=j-1|0;if((i|0)==H[m|0]){E[m|0]=l}j=j-2|0;if((i|0)==H[j|0]){E[j|0]=l}j=k-3|0;m=j+r|0;if((i|0)==H[m|0]){E[m|0]=l}k=k-4|0;m=r+k|0;if((i|0)==H[m|0]){E[m|0]=l}if(j>>>0>1){continue}break}break M}if(G[h>>2]>0){break M}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){Ua(61778);G[h>>2]=113;break L}O:{if((k|0)<=0){break O}j=k-n|0;while(1){P:{if((n|0)<=0){break P}x=0;k=0;if(n-1>>>0>=3){m=n&-4;u=0;while(1){G[i+(k<<2)>>2]=H[r+(j+k|0)|0];s=k|1;G[i+(s<<2)>>2]=H[r+(j+s|0)|0];s=k|2;G[i+(s<<2)>>2]=H[r+(j+s|0)|0];s=k|3;G[i+(s<<2)>>2]=H[r+(j+s|0)|0];k=k+4|0;u=u+4|0;if((m|0)!=(u|0)){continue}break}}m=n&3;if(!m){break P}while(1){G[i+(k<<2)>>2]=H[r+(j+k|0)|0];k=k+1|0;x=x+1|0;if((m|0)!=(x|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break O}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i)}}break C;case 1:k=o;Q:{if(!(!((va|0)!=8|y!=1)&t==-128)){Ua(7807);G[h>>2]=413;break Q}R:{S:{i=G[G[a+4>>2]+1048>>2];j=i-21|0;if(!((1<>>0<=30:0)|(i|0)==11)){G[_+72>>2]=4;if(($|0)!=1){break S}if((k|0)<=0){break R}i=H[g|0];j=k;if(j&1){j=k-1|0;m=H[r+j|0];G[r+(j<<2)>>2]=(i|0)==(m|0)?l:(m<<24>>24)+128|0}if((k|0)==1){break R}while(1){k=j-1|0;m=H[k+r|0];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:(m<<24>>24)+128|0;j=j-2|0;m=E[r+j|0];G[r+(j<<2)>>2]=(i|0)==(m&255)?l:m+128|0;if(k>>>0>1){continue}break}break R}G[_+72>>2]=1;if(($|0)!=1){if((k|0)<=0){break R}i=k-1|0;m=k&3;if(m){j=0;while(1){k=k-1|0;s=r+k|0;E[s|0]=H[s|0]^128;j=j+1|0;if((m|0)!=(j|0)){continue}break}}if(i>>>0<3){break R}while(1){i=k+r|0;j=i-1|0;E[j|0]=H[j|0]^128;i=i-2|0;E[i|0]=H[i|0]^128;i=k-3|0;j=i+r|0;E[j|0]=H[j|0]^128;k=k-4|0;j=r+k|0;E[j|0]=H[j|0]^128;if(i>>>0>1){continue}break}break R}if((k|0)<=0){break R}i=H[g|0];s=k-1|0;n=k&3;if(n){j=0;while(1){k=k-1|0;w=r+k|0;m=H[w|0];E[w|0]=(i|0)==(m|0)?l:m^128;j=j+1|0;if((n|0)!=(j|0)){continue}break}}if(s>>>0<3){break R}while(1){m=k+r|0;s=m-1|0;j=H[s|0];E[s|0]=(i|0)==(j|0)?l:j^128;m=m-2|0;j=H[m|0];E[m|0]=(i|0)==(j|0)?l:j^128;m=k-3|0;s=m+r|0;j=H[s|0];E[s|0]=(i|0)==(j|0)?l:j^128;k=k-4|0;s=r+k|0;j=H[s|0];E[s|0]=(i|0)==(j|0)?l:j^128;if(m>>>0>1){continue}break}break R}if(G[h>>2]>0){break R}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){Ua(61821);G[h>>2]=113;break Q}T:{if((k|0)<=0){break T}j=k-n|0;while(1){U:{if((n|0)<=0){break U}x=0;k=0;if(n-1>>>0>=3){m=n&-4;u=0;while(1){G[i+(k<<2)>>2]=E[r+(j+k|0)|0]+128;s=k|1;G[i+(s<<2)>>2]=E[r+(j+s|0)|0]+128;s=k|2;G[i+(s<<2)>>2]=E[r+(j+s|0)|0]+128;s=k|3;G[i+(s<<2)>>2]=E[r+(j+s|0)|0]+128;k=k+4|0;u=u+4|0;if((m|0)!=(u|0)){continue}break}}m=n&3;if(!m){break U}while(1){G[i+(k<<2)>>2]=E[r+(j+k|0)|0]+128;k=k+1|0;x=x+1|0;if((m|0)!=(x|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break T}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i)}}break C;case 20:k=o;V:{if(!(!((va|0)!=32|y!=1)&t==0)){Ua(7807);G[h>>2]=413;break V}G[_+72>>2]=4;W:{if(($|0)!=1){break W}i=G[g>>2];if((i|0)==(l|0)|(k|0)<=0){break W}j=k-1|0;m=k&3;if(m){while(1){k=k-1|0;s=r+(k<<2)|0;if((i|0)==G[s>>2]){G[s>>2]=l}n=n+1|0;if((m|0)!=(n|0)){continue}break}}if(j>>>0<3){break W}while(1){j=r+(k<<2)|0;m=j-4|0;if((i|0)==G[m>>2]){G[m>>2]=l}j=j-8|0;if((i|0)==G[j>>2]){G[j>>2]=l}j=k-3|0;m=r+(j<<2)|0;if((i|0)==G[m>>2]){G[m>>2]=l}k=k-4|0;m=r+(k<<2)|0;if((i|0)==G[m>>2]){G[m>>2]=l}if(j>>>0>1){continue}break}}}break C;case 19:k=o;X:{if(!(!((va|0)!=32|y!=1)&t==2147483648)){Ua(7807);G[h>>2]=413;break X}G[_+72>>2]=4;Y:{if(($|0)!=1){if((k|0)<=0){break Y}i=k-1|0;m=k&3;if(m){j=0;while(1){k=k-1|0;s=r+(k<<2)|0;G[s>>2]=G[s>>2]^-2147483648;j=j+1|0;if((m|0)!=(j|0)){continue}break}}if(i>>>0<3){break Y}while(1){i=r+(k<<2)|0;j=i-4|0;G[j>>2]=G[j>>2]^-2147483648;i=i-8|0;G[i>>2]=G[i>>2]^-2147483648;i=k-3|0;j=r+(i<<2)|0;G[j>>2]=G[j>>2]^-2147483648;k=k-4|0;j=r+(k<<2)|0;G[j>>2]=G[j>>2]^-2147483648;if(i>>>0>1){continue}break}break Y}if((k|0)<=0){break Y}i=G[g>>2];m=k-1|0;s=k&3;if(s){while(1){k=k-1|0;w=r+(k<<2)|0;j=G[w>>2];G[w>>2]=(i|0)==(j|0)?l:j^-2147483648;n=n+1|0;if((s|0)!=(n|0)){continue}break}}if(m>>>0<3){break Y}while(1){m=r+(k<<2)|0;s=m-4|0;j=G[s>>2];G[s>>2]=(i|0)==(j|0)?l:j^-2147483648;m=m-8|0;j=G[m>>2];G[m>>2]=(i|0)==(j|0)?l:j^-2147483648;m=k-3|0;s=r+(m<<2)|0;j=G[s>>2];G[s>>2]=(i|0)==(j|0)?l:j^-2147483648;k=k-4|0;s=r+(k<<2)|0;j=G[s>>2];G[s>>2]=(i|0)==(j|0)?l:j^-2147483648;if(m>>>0>1){continue}break}}}break C;case 31:Ha=_+24|0;Qa=_+16|0;s=Fa-16|0;Fa=s;G[s+12>>2]=0;G[s+8>>2]=0;Z:{_:{if((va|0)!=32&(va&-33)!=-64?1:t!=0|y!=1){Ua(7807);break _}G[_+72>>2]=4;$:{aa:{ba:{ca:{k=G[a+4>>2];if(G[k+1156>>2]>0){qa=N(-9119119840596153e-51);qa=($|0)==1?K[g>>2]:qa;da:{ea:{n=G[k+1080>>2];switch(n+1|0){case 0:break da;case 2:case 3:break ea;default:break ca}}i=G[k+1028>>2];fa:{if(!i){if(G[k+1084>>2]){break fa}j=Wc(0);k=sq();i=G[a+4>>2];G[i+1084>>2]=((G[i+76>>2]+(j+((k|0)/1e4|0)|0)|0)%1e4|0)+1;Jc(a,31,41550,i+1084|0,0,h);break fa}if((i&G[k+1084>>2])>=0){break fa}w=k+1084|0;if((o|0)>0){i=o<<2;i=(i|0)>1?i:1;j=i&1;k=0;if(i-1>>>0>=3){i=i&2147483644;n=0;while(1){m=H[r+(k|3)|0]+(H[r+(k|2)|0]+(H[r+(k|1)|0]+(H[k+r|0]+m|0)|0)|0)|0;k=k+4|0;n=n+4|0;if((i|0)!=(n|0)){continue}break}}if(j){while(1){m=H[k+r|0]+m|0;k=k+1|0;x=x+1|0;if((j|0)!=(x|0)){continue}break}}i=((m>>>0)%1e4|0)+1|0}else{i=1}G[w>>2]=i;Jc(a,31,41550,w,0,h)}k=G[a+4>>2];x=(Ba+G[k+1084>>2]|0)-1|0;n=G[k+1080>>2]}sb=K[k+1076>>2];w=n;n=0;m=0;t=0;y=0;q=Fa-48|0;Fa=q;G[q+40>>2]=0;G[q+12>>2]=0;G[q+8>>2]=0;aa=M(ba,na);ga:{ha:{if((aa|0)<2){t=1;break ha}ia:{if(sb>=N(0)){Ea=q+40|0;ga=q+12|0;ja=q+8|0;oa=q+32|0;za=q+24|0;Aa=q+16|0;i=(ba|0)<9;A=M(i?na:1,ba);ja:{if((A|0)<=8){ka:{if((A|0)<=0){ua=N(-34028234663852886e22);ia=N(34028234663852886e22);A=0;break ka}la:{ma:{if($){j=A&1;if((A|0)!=1){break ma}ia=N(34028234663852886e22);ua=N(-34028234663852886e22);A=0;break la}k=A&3;j=0;na:{if(A-1>>>0<3){ia=N(34028234663852886e22);ua=N(-34028234663852886e22);break na}u=A&-4;ia=N(34028234663852886e22);ua=N(-34028234663852886e22);while(1){i=n<<2;z=K[r+(i|12)>>2];V=K[r+(i|8)>>2];ca=K[r+(i|4)>>2];wa=K[i+r>>2];xa=uaxa?ca:xa;xa=V>xa?V:xa;ua=z>xa?z:xa;wa=ia>wa?wa:ia;ca=ca>2];ua=z>ua?z:ua;ia=z>2];if(z!=qa){ia=zua?z:ua}z=K[r+(u|4)>>2];if(z!=qa){ia=zua?z:ua}n=n+2|0;i=i+2|0;if((k|0)!=(i|0)){continue}break}}if(!j){break ka}z=K[r+(n<<2)>>2];if(z==qa){break ka}ua=z>ua?z:ua;ia=z>2]=ia}if(ja){K[ja>>2]=ua}if(Ea){G[Ea>>2]=A}if(oa){G[oa>>2]=0;G[oa+4>>2]=0}if(za){G[za>>2]=0;G[za+4>>2]=0}if(!Aa){break ja}G[Aa>>2]=0;G[Aa+4>>2]=0;break ja}oa:{da=lb(A,4);if(!da){break oa}B=lb(A,4);if(!B){Wa(da);break oa}ka=lb(A,4);if(!ka){Wa(da);Wa(B);break oa}Ca=i?1:na;Y=lb(Ca,8);if(!Y){Wa(da);Wa(B);Wa(ka);break oa}ha=lb(Ca,8);if(!ha){Wa(da);Wa(B);Wa(ka);Wa(Y);break oa}pa:{qa:{ma=lb(Ca,8);if(ma){if((Ca|0)>0){break qa}z=N(-34028234663852886e22);ia=N(34028234663852886e22);i=0;break pa}Wa(da);Wa(B);Wa(ka);Wa(Y);Wa(ha);break oa}C=(ga|ja)!=0;fa=($|0)!=0;ia=N(34028234663852886e22);z=N(-34028234663852886e22);i=0;while(1){u=r+(M(A,la)<<2)|0;n=0;k=0;ra:{sa:{if(!$){break sa}while(1){if(K[u+(n<<2)>>2]!=qa){k=n;break sa}n=n+1|0;if((A|0)!=(n|0)){continue}break}break ra}if((k|0)==(A|0)){break ra}ua=K[u+(k<<2)>>2];ta:{if(!C){break ta}ia=ia>ua?ua:ia;if(!(z(n|0))){break ua}while(1){if(K[u+(n<<2)>>2]!=qa){break ua}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}xa=K[u+(n<<2)>>2];va:{if(!C){break va}ia=ia>xa?xa:ia;if(!(z(n|0))){break wa}while(1){if(K[u+(n<<2)>>2]!=qa){break wa}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}Va=K[u+(n<<2)>>2];xa:{if(!C){break xa}ia=ia>Va?Va:ia;if(!(z(n|0))){break ya}while(1){if(K[u+(n<<2)>>2]!=qa){break ya}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}ca=K[u+(n<<2)>>2];za:{if(!C){break za}ia=ca(n|0))){break Aa}while(1){if(K[u+(n<<2)>>2]!=qa){break Aa}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}Ka=K[u+(n<<2)>>2];Ba:{if(!C){break Ba}ia=ia>Ka?Ka:ia;if(!(z(n|0))){break Ca}while(1){if(K[u+(n<<2)>>2]!=qa){break Ca}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}wa=K[u+(n<<2)>>2];Da:{if(!C){break Da}ia=ia>wa?wa:ia;if(!(z(n|0))){break Ea}while(1){if(K[u+(n<<2)>>2]!=qa){break Ea}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}hb=K[u+(n<<2)>>2];Fa:{if(!C){break Fa}ia=ia>hb?hb:ia;if(!(z(n|0))){break Ga}while(1){if(K[u+(n<<2)>>2]!=qa){break Ga}n=n+1|0;if((A|0)!=(n|0)){continue}break}i=j;break ra}if((n|0)==(A|0)){i=j;break ra}V=K[u+(n<<2)>>2];Ha:{if(!C){break Ha}ia=V>2]!=qa){break Ja}n=n+1|0;if((A|0)!=(n|0)){continue}break}break Ia}if((n|0)==(A|0)){break Ia}V=K[u+(n<<2)>>2];Ka:{if(!C){break Ka}ia=V>2]=O(N(ca-wa));j=j+1|0}La:{Ma:{if(!(Ja|(xa!=Va|ca!=Va))){if(wa==Ka){break Ma}}Ja=k<<2;K[Ja+B>>2]=O(N(N(N(ca+ca)-xa)-wa));K[ka+Ja>>2]=O(N(N(ua+N(N(wa*N(-4))+N(N(ca*N(6))+N(xa*N(-4)))))+V));k=k+1|0;break La}i=i+1|0}ua=bc;n=n+1|0;if((A|0)>(n|0)){continue}}break}i=i+k|0;n=ma+(X<<3)|0;Na:{Oa:{switch(k|0){case 1:if((j|0)==1){L[Y+(W<<3)>>3]=K[da>>2];W=W+1|0}L[ha+(X<<3)>>3]=K[B>>2];V=K[ka>>2];break Na;case 0:break ra;default:break Oa}}if((j|0)>=2){ec=Y+(W<<3)|0,fc=+Jk(da,k),L[ec>>3]=fc;W=W+1|0}ec=ha+(X<<3)|0,fc=+Jk(B,k),L[ec>>3]=fc;V=Jk(ka,k)}L[n>>3]=V;X=X+1|0}la=la+1|0;if((Ca|0)!=(la|0)){continue}break}Pa:{Qa:{switch(X|0){case 1:t=L[ma>>3];y=L[ha>>3];break Pa;case 0:break Pa;default:break Qa}}oe(ha,X,8,14);oe(ma,X,8,14);j=(X-1|0)/2<<3;k=(X|0)/2<<3;t=(L[j+ma>>3]+L[k+ma>>3])*.5;y=(L[j+ha>>3]+L[k+ha>>3])*.5}Ra:{switch(W|0){case 1:ra=L[Y>>3];break pa;case 0:break pa;default:break Ra}}oe(Y,W,8,14);ra=(L[Y+((W-1|0)/2<<3)>>3]+L[Y+((W|0)/2<<3)>>3])*.5}if(Ea){G[Ea>>2]=i}if(ga){K[ga>>2]=ia}if(ja){K[ja>>2]=z}if(oa){L[oa>>3]=ra*1.0483579}if(za){L[za>>3]=y*.6052697}if(Aa){L[Aa>>3]=t*.1772048}Wa(ma);Wa(ha);Wa(Y);Wa(ka);Wa(B);Wa(da);break ja}G[q+44>>2]=113}j=G[q+40>>2];Sa:{if(!(j|!$)){G[q+8>>2]=1065353216;G[q+12>>2]=0;t=1;break Sa}t=L[q+16>>3];y=L[q+32>>3];Z=L[q+24>>3];y=y!=0?y>2];V=K[q+8>>2];break ia}t=+N(-sb);j=(ba|0)<5;i=M(j?na:1,ba);if((i|0)<=4){Ta:{if((i|0)<=0){V=N(-34028234663852886e22);z=N(34028234663852886e22);j=0;break Ta}Ua:{Va:{if($){k=i&1;if((i|0)!=1){break Va}j=0;z=N(34028234663852886e22);V=N(-34028234663852886e22);break Ua}n=i&3;Wa:{if(i-1>>>0<3){z=N(34028234663852886e22);V=N(-34028234663852886e22);break Wa}u=i&-4;z=N(34028234663852886e22);V=N(-34028234663852886e22);k=0;while(1){j=m<<2;ca=K[r+(j|12)>>2];wa=K[r+(j|8)>>2];xa=K[r+(j|4)>>2];Ka=K[j+r>>2];V=VKa?Ka:z;z=z>xa?xa:z;z=z>wa?wa:z;z=z>ca?ca:z;m=m+4|0;k=k+4|0;if((u|0)!=(k|0)){continue}break}}if(n){while(1){ca=K[r+(m<<2)>>2];V=Vca?ca:z;m=m+1|0;A=A+1|0;if((n|0)!=(A|0)){continue}break}}j=i;break Ta}n=i&-2;j=0;z=N(34028234663852886e22);V=N(-34028234663852886e22);i=0;while(1){u=m<<2;ca=K[u+r>>2];if(ca!=qa){V=Vca?ca:z;j=j+1|0}ca=K[r+(u|4)>>2];if(ca!=qa){V=Vca?ca:z;j=j+1|0}m=m+2|0;i=i+2|0;if((n|0)!=(i|0)){continue}break}}if(!k){break Ta}ca=K[r+(m<<2)>>2];if(ca==qa){break Ta}V=Vca?ca:z;j=j+1|0}K[q+8>>2]=V;K[q+12>>2]=z;G[q+40>>2]=j;break ia}X=j?1:na;Xa:{if((X|0)<=0){V=N(-34028234663852886e22);z=N(34028234663852886e22);j=0;break Xa}j=0;u=($|0)!=0;z=N(34028234663852886e22);V=N(-34028234663852886e22);while(1){n=r+(M(i,A)<<2)|0;m=0;k=0;Ya:{Za:{if(!$){break Za}while(1){if(K[n+(m<<2)>>2]!=qa){k=m;break Za}m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ya}if((i|0)==(k|0)){break Ya}ca=K[n+(k<<2)>>2];V=Vca?ca:z;_a:{m=k+1|0;if(!(u&(i|0)>(m|0))){break _a}while(1){if(K[n+(m<<2)>>2]!=qa){break _a}m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ya}if((i|0)==(m|0)){break Ya}ca=K[n+(m<<2)>>2];V=Vca?ca:z;$a:{m=m+1|0;if(!(u&(i|0)>(m|0))){break $a}while(1){if(K[n+(m<<2)>>2]!=qa){break $a}m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ya}if((i|0)==(m|0)){break Ya}ca=K[n+(m<<2)>>2];V=Vca?ca:z;ab:{m=m+1|0;if(!(u&(i|0)>(m|0))){break ab}while(1){if(K[n+(m<<2)>>2]!=qa){break ab}m=m+1|0;if((i|0)!=(m|0)){continue}break}break Ya}if((i|0)==(m|0)){break Ya}ca=K[n+(m<<2)>>2];V=Vca?ca:z;m=m+1|0;bb:{if((i|0)<=(m|0)){break bb}while(1){cb:{if(!(u&(i|0)>(m|0))){break cb}while(1){if(K[n+(m<<2)>>2]!=qa){break cb}m=m+1|0;if((i|0)!=(m|0)){continue}break}break bb}if((i|0)==(m|0)){break bb}ca=K[n+(m<<2)>>2];V=Vca?ca:z;j=j+1|0;m=m+1|0;if((i|0)>(m|0)){continue}break}}j=j+4|0}A=A+1|0;if((X|0)!=(A|0)){continue}break}}K[q+12>>2]=z;G[q+40>>2]=j;K[q+8>>2]=V}m=0;if(+N(V-z)/t>4294967284){break ga}db:{eb:{fb:{gb:{hb:{if((x|0)>0){m=G[49098];if(!m){m=113;if(uo()){break ga}m=G[49098];j=G[q+40>>2]}i=(j|0)==(aa|0);k=(x-1>>>0)%1e4|0;y=+K[(k<<2)+m>>2]*500;if(!(O(y)<2147483648)){break hb}m=~~y;if(i){break gb}break fb}k=0;if((j|0)==(aa|0)){break gb}V=K[q+12>>2];y=+V+t*2147483637;break eb}m=-2147483648;if(!i){break fb}}ib:{if((w|0)==2){V=K[q+12>>2];y=+V+t*2147483637;break ib}z=K[q+8>>2];V=K[q+12>>2];if(+N(z-V)/t<2147483637){y=+V/t+.5;jb:{if(O(y)<0x8000000000000000){j=O(y)>=1?~~(y>0?Q(S(y*2.3283064365386963e-10),4294967295):T((y-+(~~y>>>0>>>0))*2.3283064365386963e-10))>>>0:0;i=~~y>>>0;break jb}j=-2147483648;i=0}y=t*(+(i>>>0)+ +(j|0)*4294967296);break ib}y=+N(z+V)*.5}i=0;if((x|0)<=0){if((aa|0)<=0){break db}while(1){k=i<<2;Z=(+K[k+r>>2]-y)/t;Z=Z+(Z>=0?.5:-.5);kb:{if(O(Z)<2147483648){j=~~Z;break kb}j=-2147483648}G[k+r>>2]=j;i=i+1|0;if((aa|0)!=(i|0)){continue}break}break db}if((aa|0)<=0){break db}n=G[49098];while(1){j=i<<2;z=K[j+r>>2];X=j+r|0;lb:{if((w|0)==2){j=-2147483646;if(z==N(0)){break lb}}Z=(+z-y)/t+ +K[n+(m<<2)>>2]+-.5;Z=Z+(Z>=0?.5:-.5);if(O(Z)<2147483648){j=~~Z;break lb}j=-2147483648}G[X>>2]=j;m=m+1|0;mb:{if((m|0)!=1e4){break mb}j=k+1|0;k=(j|0)==1e4?0:j;z=N(K[n+(k<<2)>>2]*N(500));if(N(O(z))>2];y=+V+t*2147483637;if((x|0)<=0){break eb}if((aa|0)<=0){break db}n=G[49098];i=0;while(1){u=i<<2;z=K[u+r>>2];j=-2147483647;nb:{if(z==qa){break nb}if((w|0)==2){j=-2147483646;if(z==N(0)){break nb}}Z=(+z-y)/t+ +K[n+(m<<2)>>2]+-.5;Z=Z+(Z>=0?.5:-.5);if(O(Z)<2147483648){j=~~Z;break nb}j=-2147483648}G[r+u>>2]=j;m=m+1|0;ob:{if((m|0)!=1e4){break ob}j=k+1|0;k=(j|0)==1e4?0:j;z=N(K[n+(k<<2)>>2]*N(500));if(N(O(z))>2];i=-2147483647;pb:{if(z==qa){break pb}Z=(+z-y)/t;Z=Z+(Z>=0?.5:-.5);if(O(Z)<2147483648){i=~~Z;break pb}i=-2147483648}G[j+r>>2]=i;m=m+1|0;if((aa|0)!=(m|0)){continue}break}}Z=(+V-y)/t;Z=Z+(Z>=0?.5:-.5);qb:{if(O(Z)<2147483648){i=~~Z;break qb}i=-2147483648}G[s+12>>2]=i;Z=(+K[q+8>>2]-y)/t;Z=Z+(Z>=0?.5:-.5);rb:{if(O(Z)<2147483648){i=~~Z;break rb}i=-2147483648}G[s+8>>2]=i;m=1}L[Ha>>3]=t;L[Qa>>3]=y}Fa=q+48|0;G[_+76>>2]=m;if((m|0)<2){break $}G[h>>2]=m;break Z}if(K[k+1076>>2]==N(9999)){break ba}if(($|0)==1){break aa}k=0;if((o|0)<=0){break $}while(1){sb:{tb:{j=r+(k<<2)|0;z=K[j>>2];t=+z;if(t<-2147483648.49){G[h>>2]=-11;break tb}if(t>2147483647.49){G[h>>2]=-11;i=2147483647;break sb}if(z>=N(0)){t=t+.5;if(!(O(t)<2147483648)){break tb}i=~~t;break sb}t=t+-.5;if(!(O(t)<2147483648)){break tb}i=~~t;break sb}i=-2147483648}G[j>>2]=i;k=k+1|0;if((o|0)!=(k|0)){continue}break}break $}Ua(44315);Ua(45142);break _}if(($|0)!=1|(o|0)<=0){break $}z=K[g>>2];k=0;if(o-1>>>0>=3){j=o&-4;while(1){i=k<<2;n=i+r|0;if(z==K[n>>2]){G[n>>2]=-1}n=r+(i|4)|0;if(z==K[n>>2]){G[n>>2]=-1}n=r+(i|8)|0;if(z==K[n>>2]){G[n>>2]=-1}i=r+(i|12)|0;if(z==K[i>>2]){G[i>>2]=-1}k=k+4|0;x=x+4|0;if((j|0)!=(x|0)){continue}break}}i=o&3;if(!i){break $}while(1){j=r+(k<<2)|0;if(z==K[j>>2]){G[j>>2]=-1}k=k+1|0;m=m+1|0;if((i|0)!=(m|0)){continue}break}break $}if((o|0)<=0){break $}V=K[g>>2];k=0;while(1){j=r+(k<<2)|0;z=K[j>>2];i=l;ub:{if(z==V){break ub}vb:{t=+z;if(t<-2147483648.49){G[h>>2]=-11;break vb}if(t>2147483647.49){G[h>>2]=-11;i=2147483647;break ub}if(z>=N(0)){t=t+.5;if(!(O(t)<2147483648)){break vb}i=~~t;break ub}t=t+-.5;if(!(O(t)<2147483648)){break vb}i=~~t;break ub}i=-2147483648}G[j>>2]=i;k=k+1|0;if((o|0)!=(k|0)){continue}break}}break Z}G[h>>2]=413}Fa=s+16|0;break C;case 71:A=_+24|0;ga=_+16|0;s=Fa-16|0;Fa=s;G[s+12>>2]=0;G[s+8>>2]=0;wb:{xb:{if((va|0)!=32&(va&-33)!=-64?1:t!=0|y!=1){Ua(7807);break xb}G[_+72>>2]=4;yb:{zb:{Ab:{Bb:{k=G[a+4>>2];if(G[k+1156>>2]>0){t=-91191291391491e-49;t=($|0)==1?L[g>>3]:t;j=0;Cb:{Db:{m=G[k+1080>>2];switch(m+1|0){case 0:break Cb;case 2:case 3:break Db;default:break Bb}}i=G[k+1028>>2];Eb:{if(!i){if(G[k+1084>>2]){break Eb}j=Wc(0);k=sq();i=G[a+4>>2];G[i+1084>>2]=((G[i+76>>2]+(j+((k|0)/1e4|0)|0)|0)%1e4|0)+1;Jc(a,31,41550,i+1084|0,0,h);break Eb}if((i&G[k+1084>>2])>=0){break Eb}w=k+1084|0;if((o|0)>0){i=o<<3;i=(i|0)>1?i:1;n=i&1;k=0;if(i-1>>>0>=3){i=i&2147483640;m=0;while(1){x=H[r+(k|3)|0]+(H[r+(k|2)|0]+(H[r+(k|1)|0]+(H[k+r|0]+x|0)|0)|0)|0;k=k+4|0;m=m+4|0;if((i|0)!=(m|0)){continue}break}}if(n){while(1){x=H[k+r|0]+x|0;k=k+1|0;j=j+1|0;if((n|0)!=(j|0)){continue}break}}i=((x>>>0)%1e4|0)+1|0}else{i=1}G[w>>2]=i;Jc(a,31,41550,w,0,h)}k=G[a+4>>2];j=(Ba+G[k+1084>>2]|0)-1|0;m=G[k+1080>>2]}w=j;ya=t;z=K[k+1076>>2];q=m;i=0;t=0;j=0;y=0;u=0;W=M(ba,na);Fb:{Gb:{if((W|0)<2){Z=1;k=0;break Gb}Hb:{Ib:{Jb:{Kb:{Lb:{Mb:{if(z>=N(0)){k=(ba|0)<9;n=M(k?na:1,ba);if((n|0)<=8){if((n|0)<=0){U=-17976931348623157e292;P=17976931348623157e292;break Jb}Nb:{Ob:{if($){m=n&1;if((n|0)!=1){break Ob}k=0;P=17976931348623157e292;U=-17976931348623157e292;break Nb}j=n&3;Pb:{if(n-1>>>0<3){P=17976931348623157e292;U=-17976931348623157e292;k=0;break Pb}m=n&-4;k=0;P=17976931348623157e292;U=-17976931348623157e292;while(1){i=k<<3;t=L[r+(i|24)>>3];y=L[r+(i|16)>>3];Z=L[r+(i|8)>>3];sa=L[i+r>>3];ta=Uta?Z:ta;ta=y>ta?y:ta;U=t>ta?t:ta;sa=P>sa?sa:P;Z=Z>3];if(t!=ya){U=t>U?t:U;P=t>3];if(t!=ya){U=t>U?t:U;P=t>3];if(t==ya){break Jb}U=t>U?t:U;P=t0){break Rb}U=-17976931348623157e292;P=17976931348623157e292;break Qb}Wa(da);Wa(B);Wa(fa);Wa(Y);Wa(ha);break Lb}la=($|0)!=0;P=17976931348623157e292;U=-17976931348623157e292;while(1){x=r+(M(n,u)<<3)|0;k=0;m=0;Sb:{Tb:{if(!$){break Tb}while(1){if(L[x+(k<<3)>>3]!=ya){m=k;break Tb}k=k+1|0;if((n|0)!=(k|0)){continue}break}break Sb}if((m|0)==(n|0)){break Sb}Z=L[x+(m<<3)>>3];U=UZ?Z:P;j=i+1|0;Ub:{k=m+1|0;if(!(la&(n|0)>(k|0))){break Ub}while(1){if(L[x+(k<<3)>>3]!=ya){break Ub}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}t=L[x+(k<<3)>>3];U=t>U?t:U;P=t(k|0))){break Vb}while(1){if(L[x+(k<<3)>>3]!=ya){break Vb}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}sa=L[x+(k<<3)>>3];U=Usa?sa:P;j=i+3|0;Wb:{k=k+1|0;if(!(la&(n|0)>(k|0))){break Wb}while(1){if(L[x+(k<<3)>>3]!=ya){break Wb}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}y=L[x+(k<<3)>>3];U=y>U?y:U;P=y(k|0))){break Xb}while(1){if(L[x+(k<<3)>>3]!=ya){break Xb}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}ra=L[x+(k<<3)>>3];U=Ura?ra:P;j=i+5|0;Yb:{k=k+1|0;if(!(la&(n|0)>(k|0))){break Yb}while(1){if(L[x+(k<<3)>>3]!=ya){break Yb}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}ta=L[x+(k<<3)>>3];U=Uta?ta:P;j=i+6|0;Zb:{k=k+1|0;if(!(la&(n|0)>(k|0))){break Zb}while(1){if(L[x+(k<<3)>>3]!=ya){break Zb}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}ib=L[x+(k<<3)>>3];U=Uib?ib:P;j=i+7|0;_b:{k=k+1|0;if(!(la&(n|0)>(k|0))){break _b}while(1){if(L[x+(k<<3)>>3]!=ya){break _b}k=k+1|0;if((n|0)!=(k|0)){continue}break}i=j;break Sb}if((k|0)==(n|0)){i=j;break Sb}Ma=L[x+(k<<3)>>3];U=UMa?Ma:P;i=i+8|0;m=0;C=0;k=k+1|0;if((n|0)<=(k|0)){break Sb}while(1){$b:{cc=t;t=sa;sa=y;y=ra;ra=ta;ta=ib;ib=Ma;ac:{if(!(la&(k|0)<(n|0))){break ac}while(1){if(L[x+(k<<3)>>3]!=ya){break ac}k=k+1|0;if((n|0)!=(k|0)){continue}break}break $b}if((k|0)==(n|0)){break $b}Ma=L[x+(k<<3)>>3];j=y!=ra;if(!(!j&ra==ta)){L[da+(C<<3)>>3]=O(y-ta);C=C+1|0}ja=UMa;bc:{cc:{if(!(j|(t!=sa|y!=sa))){if(ra==ta){break cc}}j=m<<3;L[j+B>>3]=O(y+y-t-ta);L[j+fa>>3]=O(Z+(ta*-4+(y*6+t*-4))+Ma);m=m+1|0;break bc}i=i+1|0}U=ja?Ma:U;P=oa?Ma:P;Z=cc;k=k+1|0;if((n|0)>(k|0)){continue}}break}i=i+m|0;j=ka+(X<<3)|0;dc:{ec:{switch(m|0){case 1:if((C|0)==1){L[Y+(aa<<3)>>3]=L[da>>3];aa=aa+1|0}L[ha+(X<<3)>>3]=L[B>>3];t=L[fa>>3];break dc;case 0:break Sb;default:break ec}}if((C|0)>=2){ec=Y+(aa<<3)|0,fc=Mi(da,m),L[ec>>3]=fc;aa=aa+1|0}ec=ha+(X<<3)|0,fc=Mi(B,m),L[ec>>3]=fc;t=Mi(fa,m)}L[j>>3]=t;X=X+1|0}u=u+1|0;if((ma|0)!=(u|0)){continue}break}y=0;sa=0;Z=0;fc:{gc:{switch(X|0){case 1:Z=L[ka>>3];sa=L[ha>>3];break fc;case 0:break fc;default:break gc}}oe(ha,X,8,14);oe(ka,X,8,14);j=(X-1|0)/2<<3;k=(X|0)/2<<3;Z=(L[j+ka>>3]+L[k+ka>>3])*.5;sa=(L[j+ha>>3]+L[k+ha>>3])*.5}hc:{switch(aa|0){case 1:y=L[Y>>3];break Qb;case 0:break Qb;default:break hc}}oe(Y,aa,8,14);y=(L[Y+((aa-1|0)/2<<3)>>3]+L[Y+((aa|0)/2<<3)>>3])*.5}Wa(ka);Wa(ha);Wa(Y);Wa(fa);Wa(B);Wa(da);t=Z*.1772048;ra=y*1.0483579;y=sa*.6052697;break Ib}Z=+N(-z);ic:{k=(ba|0)<5;i=M(k?na:1,ba);if((i|0)<=4){if((i|0)<=0){break ic}jc:{kc:{if($){m=i&1;if((i|0)!=1){break kc}i=0;P=17976931348623157e292;U=-17976931348623157e292;k=0;break jc}m=i&3;lc:{if(i-1>>>0<3){P=17976931348623157e292;U=-17976931348623157e292;k=0;break lc}n=i&-4;k=0;P=17976931348623157e292;U=-17976931348623157e292;while(1){j=k<<3;t=L[r+(j|24)>>3];y=L[r+(j|16)>>3];ra=L[r+(j|8)>>3];sa=L[j+r>>3];ta=Uta?ra:ta;ta=y>ta?y:ta;U=t>ta?t:ta;sa=P>sa?sa:P;ra=ra>3];U=t>U?t:U;P=t>3];if(t!=ya){U=t>U?t:U;P=t>3];if(t!=ya){U=t>U?t:U;P=t>3];if(t==ya){break Hb}U=t>U?t:U;P=t>3]!=ya){u=k;break nc}k=k+1|0;if((k|0)!=(i|0)){continue}break}break mc}if((i|0)==(u|0)){break mc}t=L[m+(u<<3)>>3];U=t>U?t:U;P=t>3]!=ya){break oc}k=k+1|0;if((k|0)!=(i|0)){continue}break}break mc}if((i|0)==(k|0)){break mc}t=L[m+(k<<3)>>3];U=t>U?t:U;P=t>3]!=ya){break pc}k=k+1|0;if((k|0)!=(i|0)){continue}break}break mc}if((i|0)==(k|0)){break mc}t=L[m+(k<<3)>>3];U=t>U?t:U;P=t>3]!=ya){break qc}k=k+1|0;if((k|0)!=(i|0)){continue}break}break mc}if((i|0)==(k|0)){break mc}t=L[m+(k<<3)>>3];U=t>U?t:U;P=t=(i|0)){break rc}while(1){sc:{if(!(n&(i|0)>(k|0))){break sc}while(1){if(L[m+(k<<3)>>3]!=ya){break sc}k=k+1|0;if((k|0)!=(i|0)){continue}break}break rc}if((i|0)==(k|0)){break rc}t=L[m+(k<<3)>>3];U=t>U?t:U;P=t>3];U=t>U?t:U;P=tra?ra:y:y;t=t!=0?t4294967284){break Fb}uc:{vc:{wc:{xc:{yc:{if((w|0)>0){k=G[49098];if(!k){k=113;if(uo()){break Fb}k=G[49098]}i=(i|0)==(W|0);C=(w-1>>>0)%1e4|0;z=N(K[(C<<2)+k>>2]*N(500));if(!(N(O(z))=1?~~(t>0?Q(S(t*2.3283064365386963e-10),4294967295):T((t-+(~~t>>>0>>>0))*2.3283064365386963e-10))>>>0:0;i=~~t>>>0;break Ac}j=-2147483648;i=0}t=Z*(+(i>>>0)+ +(j|0)*4294967296);break zc}t=(P+U)*.5}if((w|0)<=0){if((W|0)<=0){break uc}k=0;if((W|0)!=1){m=W&-2;i=0;while(1){w=r+(k<<2)|0;y=(L[r+(k<<3)>>3]-t)/Z;y=y+(y>=0?.5:-.5);Bc:{if(O(y)<2147483648){j=~~y;break Bc}j=-2147483648}G[w>>2]=j;n=k|1;y=(L[r+(n<<3)>>3]-t)/Z;y=y+(y>=0?.5:-.5);Cc:{if(O(y)<2147483648){j=~~y;break Cc}j=-2147483648}G[r+(n<<2)>>2]=j;k=k+2|0;i=i+2|0;if((m|0)!=(i|0)){continue}break}}if(!(W&1)){break uc}j=r+(k<<2)|0;y=(L[r+(k<<3)>>3]-t)/Z;y=y+(y>=0?.5:-.5);Dc:{if(O(y)<2147483648){i=~~y;break Dc}i=-2147483648}G[j>>2]=i;break uc}if((W|0)<=0){break uc}m=G[49098];n=(q|0)!=2;i=0;while(1){y=L[r+(i<<3)>>3];w=r+(i<<2)|0;Ec:{if(!n){j=-2147483646;if(y==0){break Ec}}y=(y-t)/Z+ +K[m+(k<<2)>>2]+-.5;y=y+(y>=0?.5:-.5);if(O(y)<2147483648){j=~~y;break Ec}j=-2147483648}G[w>>2]=j;k=k+1|0;Fc:{if((k|0)!=1e4){break Fc}j=C+1|0;C=(j|0)==1e4?0:j;z=N(K[m+(C<<2)>>2]*N(500));if(N(O(z))>3];j=-2147483647;Gc:{if(y==ya){break Gc}if(!n){j=-2147483646;if(y==0){break Gc}}y=(y-t)/Z+ +K[m+(k<<2)>>2]+-.5;y=y+(y>=0?.5:-.5);if(O(y)<2147483648){j=~~y;break Gc}j=-2147483648}G[w>>2]=j;k=k+1|0;Hc:{if((k|0)!=1e4){break Hc}j=C+1|0;C=(j|0)==1e4?0:j;z=N(K[m+(C<<2)>>2]*N(500));if(N(O(z))>3];i=-2147483647;Ic:{if(y==ya){break Ic}y=(y-t)/Z;y=y+(y>=0?.5:-.5);if(O(y)<2147483648){i=~~y;break Ic}i=-2147483648}G[j>>2]=i;k=k+1|0;if((W|0)!=(k|0)){continue}break}}y=(P-t)/Z;y=y+(y>=0?.5:-.5);Jc:{if(O(y)<2147483648){i=~~y;break Jc}i=-2147483648}G[s+12>>2]=i;y=(U-t)/Z;y=y+(y>=0?.5:-.5);Kc:{if(O(y)<2147483648){i=~~y;break Kc}i=-2147483648}G[s+8>>2]=i;k=1}L[A>>3]=Z;L[ga>>3]=t}G[_+76>>2]=k;if((k|0)<2){break yb}G[h>>2]=k;break wb}if(K[k+1076>>2]==N(9999)){break Ab}if(($|0)==1){break zb}k=0;if((o|0)<=0){break yb}while(1){j=r+(k<<2)|0;Lc:{Mc:{t=L[r+(k<<3)>>3];if(t<-2147483648.49){G[h>>2]=-11;break Mc}if(t>2147483647.49){G[h>>2]=-11;i=2147483647;break Lc}if(t>=0){t=t+.5;if(!(O(t)<2147483648)){break Mc}i=~~t;break Lc}t=t+-.5;if(!(O(t)<2147483648)){break Mc}i=~~t;break Lc}i=-2147483648}G[j>>2]=i;k=k+1|0;if((o|0)!=(k|0)){continue}break}break yb}Ua(44341);Ua(45142);break xb}if(($|0)!=1|(o|0)<=0){break yb}t=L[g>>3];k=0;if(o-1>>>0>=3){n=o&-4;j=0;while(1){i=k<<3;m=i+r|0;if(t==L[m>>3]){G[m>>2]=-1;G[m+4>>2]=-1}m=r+(i|8)|0;if(t==L[m>>3]){G[m>>2]=-1;G[m+4>>2]=-1}m=r+(i|16)|0;if(t==L[m>>3]){G[m>>2]=-1;G[m+4>>2]=-1}i=r+(i|24)|0;if(t==L[i>>3]){G[i>>2]=-1;G[i+4>>2]=-1}k=k+4|0;j=j+4|0;if((n|0)!=(j|0)){continue}break}}j=o&3;if(!j){break yb}while(1){i=r+(k<<3)|0;if(t==L[i>>3]){G[i>>2]=-1;G[i+4>>2]=-1}k=k+1|0;x=x+1|0;if((j|0)!=(x|0)){continue}break}break yb}if((o|0)<=0){break yb}y=L[g>>3];k=0;while(1){j=r+(k<<2)|0;t=L[r+(k<<3)>>3];i=l;Nc:{if(t==y){break Nc}Oc:{if(t<-2147483648.49){G[h>>2]=-11;break Oc}if(t>2147483647.49){G[h>>2]=-11;i=2147483647;break Nc}if(t>=0){t=t+.5;if(!(O(t)<2147483648)){break Oc}i=~~t;break Nc}t=t+-.5;if(!(O(t)<2147483648)){break Oc}i=~~t;break Nc}i=-2147483648}G[j>>2]=i;k=k+1|0;if((o|0)!=(k|0)){continue}break}}break wb}G[h>>2]=413}Fa=s+16|0;break C;default:Ua(60591);G[h>>2]=410;break w;case 10:break D}}k=o;Z=L[j+1200>>3];Pc:{if(!(!((va|0)!=16|y!=1)&t==0)){Ua(7887);G[h>>2]=413;break Pc}Qc:{Rc:{Sc:{switch(G[G[a+4>>2]+1048>>2]-11|0){case 0:case 10:case 11:case 40:G[_+72>>2]=2;if(($|0)!=1){break Qc}i=F[g>>1];if((i|0)==(l|0)|(k|0)<=0){break Qc}m=k-1|0;s=k&3;if(s){j=0;n=i&65535;while(1){k=k-1|0;w=r+(k<<1)|0;if((n|0)==I[w>>1]){F[w>>1]=l}j=j+1|0;if((s|0)!=(j|0)){continue}break}}if(m>>>0<3){break Qc}i=i&65535;while(1){j=r+(k<<1)|0;m=j-2|0;if((i|0)==I[m>>1]){F[m>>1]=l}j=j-4|0;if((i|0)==I[j>>1]){F[j>>1]=l}j=k-3|0;m=r+(j<<1)|0;if((i|0)==I[m>>1]){F[m>>1]=l}k=k-4|0;m=r+(k<<1)|0;if((i|0)==I[m>>1]){F[m>>1]=l}if(j>>>0>1){continue}break};break Qc;case 30:G[_+72>>2]=4;if(($|0)==1){if((k|0)<=0){break Qc}i=I[g>>1];s=k-1|0;n=k&3;if(n){j=0;while(1){k=k-1|0;m=I[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:m<<16>>16;j=j+1|0;if((n|0)!=(j|0)){continue}break}}if(s>>>0<3){break Qc}while(1){m=k-1|0;j=I[r+(m<<1)>>1];G[r+(m<<2)>>2]=(i|0)==(j|0)?l:j<<16>>16;m=k-2|0;j=F[r+(m<<1)>>1];G[r+(m<<2)>>2]=(i|0)==(j&65535)?l:j;j=k-3|0;m=F[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m&65535)?l:m;k=k-4|0;m=F[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m&65535)?l:m;if(j>>>0>1){continue}break}break Qc}if(G[h>>2]>0){break Qc}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){break Rc}Tc:{if((k|0)<=0){break Tc}j=k-n|0;while(1){Uc:{if((n|0)<=0){break Uc}m=0;k=0;if(n-1>>>0>=3){s=n&-4;x=0;while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1];w=k|1;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];w=k|2;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];w=k|3;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];k=k+4|0;x=x+4|0;if((s|0)!=(x|0)){continue}break}}s=n&3;if(!s){break Uc}while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1];k=k+1|0;m=m+1|0;if((s|0)!=(m|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break Tc}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i);break Qc;default:break Sc}}G[_+72>>2]=4;if(Z==32768){if(($|0)==1){if((k|0)<=0){break Qc}i=I[g>>1];j=k;if(j&1){j=k-1|0;m=I[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m|0)?l:(m<<16>>16)+32768|0}if((k|0)==1){break Qc}while(1){k=j-1|0;m=I[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:(m<<16>>16)+32768|0;j=j-2|0;m=F[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m&65535)?l:m+32768|0;if(k>>>0>1){continue}break}break Qc}if(G[h>>2]>0){break Qc}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){break Rc}Vc:{if((k|0)<=0){break Vc}j=k-n|0;while(1){Wc:{if((n|0)<=0){break Wc}m=0;k=0;if(n-1>>>0>=3){s=n&-4;x=0;while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1]+32768;w=k|1;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1]+32768;w=k|2;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1]+32768;w=k|3;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1]+32768;k=k+4|0;x=x+4|0;if((s|0)!=(x|0)){continue}break}}s=n&3;if(!s){break Wc}while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1]+32768;k=k+1|0;m=m+1|0;if((s|0)!=(m|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break Vc}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i);break Qc}if(($|0)==1){if((k|0)<=0){break Qc}i=I[g>>1];s=k-1|0;n=k&3;if(n){j=0;while(1){k=k-1|0;m=I[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m|0)?l:m<<16>>16;j=j+1|0;if((n|0)!=(j|0)){continue}break}}if(s>>>0<3){break Qc}while(1){m=k-1|0;j=I[r+(m<<1)>>1];G[r+(m<<2)>>2]=(i|0)==(j|0)?l:j<<16>>16;m=k-2|0;j=F[r+(m<<1)>>1];G[r+(m<<2)>>2]=(i|0)==(j&65535)?l:j;j=k-3|0;m=F[r+(j<<1)>>1];G[r+(j<<2)>>2]=(i|0)==(m&65535)?l:m;k=k-4|0;m=F[r+(k<<1)>>1];G[r+(k<<2)>>2]=(i|0)==(m&65535)?l:m;if(j>>>0>1){continue}break}break Qc}if(G[h>>2]>0){break Qc}n=(k|0)<1e4?k:1e4;i=ab(n<<2);if(!i){break Rc}Xc:{if((k|0)<=0){break Xc}j=k-n|0;while(1){Yc:{if((n|0)<=0){break Yc}m=0;k=0;if(n-1>>>0>=3){s=n&-4;x=0;while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1];w=k|1;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];w=k|2;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];w=k|3;G[i+(w<<2)>>2]=F[r+(j+w<<1)>>1];k=k+4|0;x=x+4|0;if((s|0)!=(x|0)){continue}break}}s=n&3;if(!s){break Yc}while(1){G[i+(k<<2)>>2]=F[r+(j+k<<1)>>1];k=k+1|0;m=m+1|0;if((s|0)!=(m|0)){continue}break}}bb(r+(j<<2)|0,i,n<<2);if(!j){break Xc}k=(j|0)>1e4;n=k?n:j;j=j?k?j-1e4|0:0:0;if((n|0)>0){continue}break}}Wa(i);break Qc}Ua(61735);G[h>>2]=113}}}if(G[h>>2]>0){break w}i=G[a+4>>2];Zc:{_c:{if(G[_+76>>2]){Ea=G[i+1140>>2];G[_+68>>2]=Ea;w=lb(Ea,1);G[_+64>>2]=w;if(!w){Ua(60886);break Zc}$c:{ad:{bd:{cd:{dd:{ed:{fd:{gd:{n=G[i+1048>>2];switch(n-11|0){case 30:break ad;case 40:break bd;case 10:case 11:break cd;case 0:break fd;case 20:break gd;default:break $c}}j=0;if((o|0)<=0){break dd}break ed}hd:{id:{switch(G[_+72>>2]-1|0){case 1:m=0;s=G[i+1212>>2];X=ab(s<<2);jd:{if(!X){Ua(2991);i=-1;break jd}i=r;q=I[i>>1];l=q<<8|q>>>8;E[w|0]=l;E[w+1|0]=l>>>8;l=w+2|0;kd:{if((o|0)<=0){break kd}v=o;W=w+Ea|0;x=I[i>>1];o=s;k=8;while(1){j=v-m|0;o=(j|0)<(s|0)?j:o;u=(o|0)<=0;ld:{if(u){t=0;break ld}aa=o&1;md:{if((o|0)==1){j=0;t=0;break md}da=o&-2;j=0;t=0;p=0;while(1){n=I[i+(j+m<<1)>>1];x=n-x<<16;Y=x>>16<<1^x>>31;G[X+(j<<2)>>2]=Y;C=j|1;x=I[i+(C+m<<1)>>1];n=x-n<<16;n=n>>16<<1^n>>31;G[X+(C<<2)>>2]=n;t=t+ +(Y>>>0)+ +(n>>>0);j=j+2|0;p=p+2|0;if((da|0)!=(p|0)){continue}break}}if(aa){n=X+(j<<2)|0;j=I[i+(j+m<<1)>>1];p=j-x<<16;p=p>>16<<1^p>>31;G[n>>2]=p;t=t+ +(p>>>0);x=j}x=x&65535}p=0;nd:{od:{y=R((t-+((o|0)/2|0)+-1)/+(o|0),0);pd:{if(y<4294967296&y>=0){j=~~y>>>0;break pd}j=0}aa=j>>>0<2;qd:{if(!aa){while(1){n=p;p=n+1|0;da=j&65535;j=da>>>1|0;if(da>>>0>3){continue}break}if(n>>>0<13){break qd}j=4;if((k|0)>=29){j=4-k|0;q=G[(k<<2)+104832>>2]&15>>>j|q<>2]&15|q<>0-k;l=l+1|0;j=(k|0)<-7;k=k+8|0;if(j){continue}break}}p=0;if(u){break nd}while(1){n=G[X+(p<<2)>>2];j=16;if((k|0)>=17){j=16-k|0;q=G[(k<<2)+104832>>2]&n>>j|q<>2]|q<>0-k;l=l+1|0;j=(k|0)<-7;k=k+8|0;if(j){continue}break}}p=p+1|0;if((o|0)!=(p|0)){continue}break}break nd}if(t==0){break od}}n=p+1|0;j=4;if((k|0)>=29){j=4-k|0;q=G[(k<<2)+104832>>2]&n>>>j|q<>2]|q<>0-k;l=l+1|0;j=(k|0)<-7;k=k+8|0;if(j){continue}break}}if(!u){da=-1<>2];n=Y>>p;rd:{if((n|0)<(k|0)){j=n+1|0;k=k-j|0;q=q<>>3|0;cb(fa,0,C+1|0);q=(n-((j&-8)+k|0)|0)-8|0;j=(l+C|0)+2|0}l=j;k=7-q|0;q=1}sd:{if(aa){break sd}q=Y&da|q<0){break sd}while(1){E[l|0]=q>>0-k;l=l+1|0;j=(k|0)<-7;k=k+8|0;if(j){continue}break}}u=u+1|0;if((u|0)!=(o|0)){continue}break}}if(l>>>0<=W>>>0){break nd}Ua(11479);Wa(X);i=-1;break jd}j=4;if((k|0)>=29){q=q<0){break nd}while(1){E[l|0]=q>>0-k;l=l+1|0;j=(k|0)<-7;k=k+8|0;if(j){continue}break}}m=m+s|0;if((v|0)>(m|0)){continue}break}if((k|0)>7){break kd}E[l|0]=q<>2];X=ab(k<<2);td:{if(!X){Ua(2991);i=-1;break td}i=r;q=H[i|0];E[w|0]=q;p=w+1|0;v=o;ud:{if((o|0)<=0){break ud}W=w+Ea|0;x=H[i|0];s=k;l=8;while(1){o=v-m|0;s=(k|0)>(o|0)?o:s;u=(s|0)<=0;vd:{if(u){t=0;break vd}aa=s&1;wd:{if((s|0)==1){j=0;t=0;break wd}da=s&-2;j=0;t=0;o=0;while(1){n=H[i+(j+m|0)|0];x=n-x<<24;Y=x>>24<<1^x>>31;G[X+(j<<2)>>2]=Y;C=j|1;x=H[i+(C+m|0)|0];n=x-n<<24;n=n>>24<<1^n>>31;G[X+(C<<2)>>2]=n;t=t+ +(Y>>>0)+ +(n>>>0);j=j+2|0;o=o+2|0;if((da|0)!=(o|0)){continue}break}}if(aa){n=X+(j<<2)|0;o=H[i+(j+m|0)|0];j=o-x<<24;j=j>>24<<1^j>>31;G[n>>2]=j;t=t+ +(j>>>0);x=o}x=x&255}o=0;xd:{yd:{y=R((t-+((s|0)/2|0)+-1)/+(s|0),0);zd:{if(y<4294967296&y>=0){j=~~y>>>0;break zd}j=0}aa=j>>>0<2;Ad:{if(!aa){while(1){n=o;o=n+1|0;da=j&255;j=da>>>1|0;if(da>>>0>3){continue}break}if(n>>>0<5){break Ad}j=3;if((l|0)>=30){j=3-l|0;q=G[(l<<2)+104832>>2]&7>>>j|q<>2]&7|q<>0-l;p=p+1|0;o=(l|0)<-7;l=l+8|0;if(o){continue}break}}o=0;if(u){break xd}while(1){n=G[X+(o<<2)>>2];j=8;if((l|0)>=25){j=8-l|0;q=G[(l<<2)+104832>>2]&n>>j|q<>2]|q<>0-l;p=p+1|0;j=(l|0)<-7;l=l+8|0;if(j){continue}break}}o=o+1|0;if((s|0)!=(o|0)){continue}break}break xd}if(t==0){break yd}}n=o+1|0;j=3;if((l|0)>=30){j=3-l|0;q=G[(l<<2)+104832>>2]&n>>>j|q<>2]|q<>0-l;p=p+1|0;j=(l|0)<-7;l=l+8|0;if(j){continue}break}}if(!u){da=-1<>2];n=Y>>o;Bd:{if((n|0)<(l|0)){j=n+1|0;l=l-j|0;q=q<>>3|0;cb(fa,0,C+1|0);q=(n-((j&-8)+l|0)|0)-8|0;j=(p+C|0)+2|0}p=j;l=7-q|0;q=1}Cd:{if(aa){break Cd}q=Y&da|q<0){break Cd}while(1){E[p|0]=q>>0-l;p=p+1|0;j=(l|0)<-7;l=l+8|0;if(j){continue}break}}u=u+1|0;if((s|0)!=(u|0)){continue}break}}if(p>>>0<=W>>>0){break xd}Ua(11479);Wa(X);i=-1;break td}j=3;if((l|0)>=30){q=q<0){break xd}while(1){E[p|0]=q>>0-l;p=p+1|0;o=(l|0)<-7;l=l+8|0;if(o){continue}break}}m=k+m|0;if((v|0)>(m|0)){continue}break}if((l|0)>7){break ud}E[p|0]=q<>2];X=ab(k<<2);Dd:{if(!X){Ua(2991);i=-1;break Dd}i=r;j=G[i>>2];l=j<<24|j<<8&16711680|(j>>>8&65280|j>>>24);E[w|0]=l;E[w+1|0]=l>>>8;E[w+2|0]=l>>>16;E[w+3|0]=l>>>24;l=w+4|0;s=o;Ed:{if((o|0)<=0){break Ed}W=w+Ea|0;m=G[i>>2];o=k;q=8;while(1){p=s-x|0;o=(k|0)>(p|0)?p:o;u=(o|0)<=0;Fd:{if(u){t=0;break Fd}aa=o&1;Gd:{if((o|0)==1){n=0;t=0;break Gd}da=o&-2;n=0;t=0;p=0;while(1){v=G[i+(n+x<<2)>>2];m=v-m|0;Y=m<<1^m>>31;G[X+(n<<2)>>2]=Y;C=n|1;m=G[i+(C+x<<2)>>2];v=m-v|0;v=v<<1^v>>31;G[X+(C<<2)>>2]=v;t=t+ +(Y>>>0)+ +(v>>>0);n=n+2|0;p=p+2|0;if((da|0)!=(p|0)){continue}break}}if(!aa){break Fd}p=G[i+(n+x<<2)>>2];m=p-m|0;m=m<<1^m>>31;G[X+(n<<2)>>2]=m;t=t+ +(m>>>0);m=p}p=0;Hd:{Id:{y=R((t-+((o|0)/2|0)+-1)/+(o|0),0);Jd:{if(y<4294967296&y>=0){n=~~y>>>0;break Jd}n=0}aa=n>>>0<2;Kd:{if(!aa){while(1){v=p;p=p+1|0;da=n>>>0>3;n=n>>>1|0;if(da){continue}break}if(v>>>0<24){break Kd}n=5;if((q|0)>=28){n=5-q|0;j=G[(q<<2)+104832>>2]&26>>>n|j<>2]&26|j<>0-q;l=l+1|0;p=(q|0)<-7;q=q+8|0;if(p){continue}break}}p=0;if(u){break Hd}while(1){n=G[X+(p<<2)>>2];v=32-q|0;j=G[(q<<2)+104832>>2]&n>>v|j<>2]|j<>0-q;l=l+1|0;v=(q|0)<-7;q=q+8|0;if(v){continue}break}}p=p+1|0;if((o|0)!=(p|0)){continue}break}break Hd}if(t==0){break Id}}v=p+1|0;n=5;if((q|0)>=28){n=5-q|0;j=G[(q<<2)+104832>>2]&v>>>n|j<>2]|j<>0-q;l=l+1|0;v=(q|0)<-7;q=q+8|0;if(v){continue}break}}if(!u){da=-1<>2];n=Y>>p;Ld:{if((n|0)<(q|0)){v=n+1|0;q=q-v|0;j=j<>>3|0;cb(fa,0,v+1|0);j=(n-((j&-8)+q|0)|0)-8|0;l=(l+v|0)+2|0}q=7-j|0;j=1}Md:{if(aa){break Md}j=Y&da|j<0){break Md}while(1){E[l|0]=j>>0-q;l=l+1|0;v=(q|0)<-7;q=q+8|0;if(v){continue}break}}u=u+1|0;if((u|0)!=(o|0)){continue}break}}if(l>>>0<=W>>>0){break Hd}Ua(11479);Wa(X);i=-1;break Dd}n=5;if((q|0)>=28){j=j<0){break Hd}while(1){E[l|0]=j>>0-q;l=l+1|0;p=(q|0)<-7;q=q+8|0;if(p){continue}break}}x=k+x|0;if((s|0)>(x|0)){continue}break}if((q|0)>7){break Ed}E[l|0]=j<>2]);Ua(60641);break x}pe(a,G[G[a+4>>2]+1144>>2],Ba,Ba>>31,1,0,i,0,G[_+64>>2],h);break $c}while(1){if(J[r+(j<<2)>>2]<16777216){j=j+1|0;if((o|0)!=(j|0)){continue}break dd}break}Ua(63440);break x}m=0;i=1;l=0;if((o|0)>0){v=w-2|0;F[w+4>>1]=65436;F[w+10>>1]=0;F[w+12>>1]=0;F[w>>1]=0;F[w+2>>1]=7;j=r;l=G[j>>2];l=(l|0)>0?l:0;n=o+1|0;X=n-1|0;k=8;s=1;p=1;q=1;while(1){Nd:{Od:{Pd:{if((p|0)<(X|0)){o=p+1|0;m=G[j+(p<<2)>>2];m=(m|0)>0?m:0;if((m|0)==(l|0)){p=o;break Nd}if(l){break Pd}p=o;break Od}q=l?q:n;o=p+1|0}i=q-i|0;Qd:{Rd:{x=(l|0)<=0;if(x){l=s;break Rd}if((l|0)==(s|0)){break Rd}s=l-s|0;u=s>>31;if((s^u)-u>>>0>=4096){s=k<<1;F[s+v>>1]=l&4095|4096;F[s+w>>1]=l>>>12;k=k+2|0;break Rd}u=v+(k<<1)|0;s=(s|0)<0?12288-s|0:s- -8192|0;F[u>>1]=s;k=k+1|0;if(i|(p|0)!=(q|0)){break Rd}F[u>>1]=s|16384;break Qd}Sd:{if((i|0)<=0){break Sd}while(1){s=v+(k<<1)|0;u=(i|0)<4095?i:4095;F[s>>1]=u;k=k+1|0;W=i>>>0>4095;i=i-4095|0;if(W){continue}break}if(x|(p|0)!=(q|0)){break Sd}F[s>>1]=u+20481;break Qd}i=o-q|0;if((i|0)<=0){break Qd}while(1){F[v+(k<<1)>>1]=((i|0)<4095?i:4095)+16384;k=k+1|0;p=i>>>0>4095;i=i-4095|0;if(p){continue}break}}s=l;i=o;p=i;o=i}q=o;l=m}m=l;if((n|0)>(p|0)){continue}break}l=k-1|0;i=(l|0)/32768|0;F[w+8>>1]=i;F[w+6>>1]=l-(i<<15)}if((l|0)<0){Wa(G[_+64>>2]);Ua(60698);break x}Ng(a,G[G[a+4>>2]+1144>>2],Ba,Ba>>31,1,0,l,0,G[_+64>>2],h);break $c}z=K[i+1076>>2];Td:{if(!((b|0)!=42|z!=N(9999))){ke(r,o);if(G[G[a+4>>2]+1048>>2]==22){to(r,o,o>>31)}o=o<<2;break Td}if(!((b|0)!=82|z!=N(9999))){Ge(r,o);if(G[G[a+4>>2]+1048>>2]==22){l=o>>31;k=l;i=o;m=i<<3;j=lb(1,m);if(!!i&(k|0)>=0|(k|0)>0){l=r;while(1){s=j+v|0;E[s|0]=H[l|0];s=i+s|0;E[s|0]=H[l+1|0];s=i+s|0;E[s|0]=H[l+2|0];s=i+s|0;E[s|0]=H[l+3|0];s=i+s|0;E[s|0]=H[l+4|0];s=i+s|0;E[s|0]=H[l+5|0];s=i+s|0;E[s|0]=H[l+6|0];E[i+s|0]=H[l+7|0];l=l+8|0;s=v+1|0;p=s?p:p+1|0;v=s;if((o|0)!=(s|0)|(k|0)!=(p|0)){continue}break}}bb(r,j,m);Wa(j)}o=o<<3;break Td}Ud:{switch(G[_+72>>2]-1|0){case 1:Af(r,o);if(G[G[a+4>>2]+1048>>2]==22){n=o<<1;i=ab(n);j=o>>31;Vd:{if(!o&(j|0)<=0|(j|0)<0){break Vd}l=r;s=i;k=o;m=j-!k|0;k=k-1|0;if(!m&k>>>0>=3|m){k=o&-4;while(1){E[s|0]=H[l|0];E[o+s|0]=H[l+1|0];E[s+1|0]=H[l+2|0];E[o+(s+1|0)|0]=H[l+3|0];E[s+2|0]=H[l+4|0];E[o+(s+2|0)|0]=H[l+5|0];E[s+3|0]=H[l+6|0];E[o+(s+3|0)|0]=H[l+7|0];s=s+4|0;l=l+8|0;m=v+4|0;p=m>>>0<4?p+1|0:p;v=m;if((k|0)!=(m|0)|(j|0)!=(p|0)){continue}break}}k=o&3;j=0;if(!(k|j)){break Vd}v=0;p=0;while(1){E[s|0]=H[l|0];E[o+s|0]=H[l+1|0];s=s+1|0;l=l+2|0;w=p;p=v+1|0;w=p?w:w+1|0;v=p;p=w;if((k|0)!=(v|0)|(j|0)!=(p|0)){continue}break}}bb(r,i,n);Wa(i)}o=o<<1;break Td;case 3:ke(r,o);n=G[G[a+4>>2]+1048>>2];break;case 0:break Td;default:break Ud}}if((n|0)==22){to(r,o,o>>31)}o=o<<2}gp(r,o,_- -64|0,_+68|0,_+60|0,h);pe(a,G[G[a+4>>2]+1144>>2],Ba,Ba>>31,1,0,G[_+60>>2],0,G[_+64>>2],h);break $c}Wd:{Xd:{switch(G[_+72>>2]-2|0){case 0:Af(r,o);break Wd;case 2:break Xd;default:break Wd}}ke(r,o)}Ua(10683);break x}qa=K[i+1220>>2];Yd:{if(qa>N(0)){W=l;Ha=_+48|0;Qa=_+32|0;u=0;s=0;t=0;y=0;ra=0;Ja=_+40|0;Zd:{if(!Ja){break Zd}_d:{$d:{ae:{be:{i=(ba|0)<9;B=M(i?na:1,ba);if((B|0)<=8){if((B|0)<=0){break $d}ce:{de:{if($){if((B|0)!=1){break de}break ce}s=B&3;i=0;ee:{if(B-1>>>0<3){A=2147483647;C=-2147483648;l=0;break ee}n=B&-4;l=0;A=2147483647;C=-2147483648;while(1){j=l<<2;k=G[r+(j|12)>>2];p=G[r+(j|8)>>2];m=G[r+(j|4)>>2];j=G[j+r>>2];w=(j|0)>(C|0)?j:C;w=(m|0)>(w|0)?m:w;w=(p|0)>(w|0)?p:w;C=(k|0)>(w|0)?k:w;j=(j|0)<(A|0)?j:A;j=(j|0)>(m|0)?m:j;j=(j|0)>(p|0)?p:j;A=(j|0)>(k|0)?k:j;l=l+4|0;v=v+4|0;if((n|0)!=(v|0)){continue}break}}if(s){break be}break $d}k=B&-2;A=2147483647;C=-2147483648;l=0;while(1){p=u<<2;i=G[p+r>>2];if((i|0)!=(W|0)){C=(i|0)>(C|0)?i:C;A=(i|0)<(A|0)?i:A;l=l+1|0}i=G[r+(p|4)>>2];if((i|0)!=(W|0)){C=(i|0)>(C|0)?i:C;A=(i|0)<(A|0)?i:A;l=l+1|0}u=u+2|0;s=s+2|0;if((k|0)!=(s|0)){continue}break}}break $d}fa=lb(B,8);if(!fa){break ae}ka=lb(B,8);if(!ka){Wa(fa);break ae}ga=lb(B,8);if(!ga){Wa(fa);Wa(ka);break ae}Ca=i?1:na;ma=lb(Ca,8);if(!ma){Wa(fa);Wa(ka);Wa(ga);break ae}ja=lb(Ca,8);if(!ja){Wa(fa);Wa(ka);Wa(ga);Wa(ma);break ae}fe:{ge:{Aa=lb(Ca,8);if(Aa){if((Ca|0)>0){break ge}break fe}Wa(fa);Wa(ka);Wa(ga);Wa(ma);Wa(ja);break ae}oa=($|0)!=0;A=2147483647;C=-2147483648;l=0;while(1){ha=r+(M(B,La)<<2)|0;u=0;i=0;he:{ie:{if(!$){break ie}while(1){if((W|0)!=G[ha+(u<<2)>>2]){i=u;break ie}u=u+1|0;if((B|0)!=(u|0)){continue}break}break he}if((i|0)==(B|0)){break he}x=G[ha+(i<<2)>>2];C=(x|0)>(C|0)?x:C;A=(x|0)<(A|0)?x:A;j=l+1|0;je:{u=i+1|0;if(!(oa&(B|0)>(u|0))){break je}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break je}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=j;break he}if((u|0)==(B|0)){l=j;break he}i=G[ha+(u<<2)>>2];C=(i|0)>(C|0)?i:C;A=(i|0)<(A|0)?i:A;j=l+2|0;ke:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break ke}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break ke}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=j;break he}if((u|0)==(B|0)){l=j;break he}n=G[ha+(u<<2)>>2];C=(n|0)>(C|0)?n:C;A=(n|0)<(A|0)?n:A;j=l+3|0;le:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break le}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break le}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=j;break he}if((u|0)==(B|0)){l=j;break he}v=G[ha+(u<<2)>>2];C=(v|0)>(C|0)?v:C;A=(v|0)<(A|0)?v:A;j=l+4|0;me:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break me}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break me}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=j;break he}if((u|0)==(B|0)){l=j;break he}s=G[ha+(u<<2)>>2];C=(s|0)>(C|0)?s:C;A=(s|0)<(A|0)?s:A;j=l+5|0;ne:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break ne}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break ne}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=j;break he}if((u|0)==(B|0)){l=j;break he}j=G[ha+(u<<2)>>2];C=(j|0)>(C|0)?j:C;A=(j|0)<(A|0)?j:A;k=l+6|0;oe:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break oe}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break oe}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=k;break he}if((u|0)==(B|0)){l=k;break he}m=G[ha+(u<<2)>>2];C=(m|0)>(C|0)?m:C;A=(m|0)<(A|0)?m:A;k=l+7|0;pe:{u=u+1|0;if(!(oa&(B|0)>(u|0))){break pe}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break pe}u=u+1|0;if((B|0)!=(u|0)){continue}break}l=k;break he}if((u|0)==(B|0)){l=k;break he}q=G[ha+(u<<2)>>2];C=(q|0)>(C|0)?q:C;A=(q|0)<(A|0)?q:A;l=l+8|0;za=0;la=0;u=u+1|0;if((B|0)<=(u|0)){break he}while(1){qe:{k=i;i=n;n=v;v=s;s=j;j=m;m=q;re:{if(!(oa&(u|0)<(B|0))){break re}while(1){if((W|0)!=G[ha+(u<<2)>>2]){break re}u=u+1|0;if((B|0)!=(u|0)){continue}break}break qe}if((u|0)==(B|0)){break qe}q=G[ha+(u<<2)>>2];aa=(s|0)!=(v|0);if(!(!aa&(j|0)==(s|0))){p=(v>>31)-((j>>31)+(j>>>0>v>>>0)|0)|0;w=p>>31;da=fa+(la<<3)|0;Y=w^v-j;G[da>>2]=Y-w;G[da+4>>2]=(p^w)-((w>>>0>Y>>>0)+w|0);la=la+1|0}fb=(q|0)>(C|0);gb=(q|0)<(A|0);se:{te:{if(!(aa|((i|0)!=(n|0)|(n|0)!=(v|0)))){if((j|0)==(s|0)){break te}}Da=za<<3;da=Da+ka|0;w=v>>31;tb=w;p=v;w=w<<1|p>>>31;Y=p<<1;p=(i>>31)+(j>>31)|0;X=i+j|0;p=X>>>0>>0?p+1|0:p;aa=X;X=p;p=w-(p+(aa>>>0>Y>>>0)|0)|0;w=p>>31;Y=Y-aa|0;Xa=Y^w;G[da>>2]=Xa-w;G[da+4>>2]=(p^w)-((w>>>0>Xa>>>0)+w|0);da=ga+Da|0;Y=q>>31;Da=Au(v,tb,6,0);w=Da+x|0;p=Ia+(x>>31)|0;p=w>>>0>>0?p+1|0:p;x=p;p=X<<2|aa>>>30;aa=aa<<2;Da=w-aa|0;X=Da+q|0;w=(x-((w>>>0>>0)+p|0)|0)+Y|0;w=X>>>0>>0?w+1|0:w;p=w>>31;x=X^p;G[da>>2]=x-p;G[da+4>>2]=(p^w)-((x>>>0

>>0)+p|0);za=za+1|0;break se}l=l+1|0}C=fb?q:C;A=gb?q:A;x=k;u=u+1|0;if((B|0)>(u|0)){continue}}break}l=l+za|0;k=Aa+(pa<<3)|0;ue:{ve:{switch(za|0){case 1:if((la|0)==1){L[ma+(ea<<3)>>3]=+J[fa>>2]+ +G[fa+4>>2]*4294967296;ea=ea+1|0}L[ja+(pa<<3)>>3]=+J[ka>>2]+ +G[ka+4>>2]*4294967296;i=G[ga>>2];j=G[ga+4>>2];break ue;case 0:break he;default:break ve}}if((la|0)>=2){ec=ma+(ea<<3)|0,fc=+(Ik(fa,za)>>>0)+ +(Ia|0)*4294967296,L[ec>>3]=fc;ea=ea+1|0}ec=ja+(pa<<3)|0,fc=+(Ik(ka,za)>>>0)+ +(Ia|0)*4294967296,L[ec>>3]=fc;i=Ik(ga,za);j=Ia}L[k>>3]=+(i>>>0)+ +(j|0)*4294967296;pa=pa+1|0}La=La+1|0;if((Ca|0)!=(La|0)){continue}break}we:{xe:{switch(pa|0){case 1:t=L[Aa>>3];ra=L[ja>>3];break we;case 0:break we;default:break xe}}oe(ja,pa,8,14);oe(Aa,pa,8,14);i=(pa-1|0)/2<<3;l=(pa|0)/2<<3;t=(L[i+Aa>>3]+L[l+Aa>>3])*.5;ra=(L[i+ja>>3]+L[l+ja>>3])*.5}ye:{switch(ea|0){case 1:y=L[ma>>3];break fe;case 0:break fe;default:break ye}}oe(ma,ea,8,14);y=(L[ma+((ea-1|0)/2<<3)>>3]+L[ma+((ea|0)/2<<3)>>3])*.5}Wa(Aa);Wa(ja);Wa(ma);Wa(ga);Wa(ka);Wa(fa);Fb=t*.1772048;t=y*1.0483579;y=ra*.6052697;break _d}while(1){j=G[r+(l<<2)>>2];C=(j|0)>(C|0)?j:C;A=(j|0)<(A|0)?j:A;l=l+1|0;i=i+1|0;if((s|0)!=(i|0)){continue}break}break $d}G[h>>2]=113}y=0}if(Ha){L[Ha>>3]=t}if(Ja){L[Ja>>3]=y}if(!Qa){break Zd}L[Qa>>3]=Fb}y=L[_+48>>3];t=L[_+40>>3];if(!(y==0|!(y>3]=y;t=y}Z=+qa;y=L[_+32>>3];if(!(y==0|!(t>y))){L[_+40>>3]=y;t=y}qa=N(t*Z);break Yd}if(!(qa>2]=Ea;i=va-8|0;t=+qa+.5;ze:{if(O(t)<2147483648){l=~~t;break ze}l=-2147483648}Ae:{Be:{switch(i|0){case 0:case 8:p=l;W=G[_+64>>2];X=0;aa=Fa-16|0;Fa=aa;if(G[h>>2]<=0){o=(ba|0)<(na|0)?na:ba;t=oc(+N(o|0))/.6931471805599453+.5;Ce:{if(O(t)<2147483648){l=~~t;break Ce}l=-2147483648}De:{Ee:{Fe:{Ge:{He:{i=ab((o+1|0)/2<<2);if(i){pa=l+((o|0)>1<0){da=ba<<1;ga=1;l=2;s=1;j=-4;k=-2;o=0;n=ba;m=na;while(1){v=k;k=j;w=s;s=l;u=(n|0)%2|0;q=0;la=(m|0)%2|0;va=m-la|0;if((va|0)>0){C=o^1;B=n-u|0;while(1){l=M(q,ba);j=ba+l|0;x=0;if((B|0)>0){while(1){Y=r+(j<<2)|0;$=G[Y+4>>2];fa=G[Y>>2];ka=$-fa|0;ea=l<<2;ma=r+(ea|4)|0;ha=G[ma>>2];A=r+ea|0;ea=G[A>>2];G[Y+4>>2]=(ka-ha|0)+ea>>o;Da=Y;Y=$+fa|0;$=ea+ha|0;fa=Y-$>>o;G[Da>>2]=v&((fa|0)<0?0:w)+fa;ha=(ha+ka|0)-ea>>o;G[ma>>2]=v&((ha|0)<0?0:w)+ha;Y=$+Y>>o;G[A>>2]=((Y|0)<0?ga:s)+Y&k;j=j+2|0;l=l+2|0;x=x+2|0;if((B|0)>(x|0)){continue}break}}if(u){j=r+(j<<2)|0;x=G[j>>2];Y=r+(l<<2)|0;$=G[Y>>2];l=x-$<>2]=v&l+((l|0)<0?0:w);l=x+$<>2]=((l|0)<0?ga:s)+l&k}q=q+2|0;if((va|0)>(q|0)){continue}break}}Ie:{if(!la){break Ie}l=M(q,ba);Y=n-u|0;if((Y|0)>0){j=o^1;q=0;while(1){C=l<<2;B=r+(C|4)|0;x=G[B>>2];fa=B;C=r+C|0;B=G[C>>2];$=x-B<>2]=v&(($|0)<0?0:w)+$;x=x+B<>2]=((x|0)<0?ga:s)+x&k;l=l+2|0;q=q+2|0;if((Y|0)>(q|0)){continue}break}}if(!u){break Ie}j=r+(l<<2)|0;l=G[j>>2]<<2-o;G[j>>2]=l+((l|0)<0?ga:s)&k}if(!((n|0)<2|(m|0)<=0)){Y=n-2|0;l=(Y>>>1|0)+1|0;w=l&-8;v=l&7;C=n-3|0;l=(C>>>1|0)+1|0;B=l&-8;x=l&7;ga=0;while(1){l=i;q=r+(M(ba,ga)<<2)|0;o=q+4|0;j=o;u=0;$=Y>>>0<14;if(!$){while(1){G[l>>2]=G[j>>2];G[l+4>>2]=G[j+8>>2];G[l+8>>2]=G[j+16>>2];G[l+12>>2]=G[j+24>>2];G[l+16>>2]=G[j+32>>2];G[l+20>>2]=G[j+40>>2];G[l+24>>2]=G[j+48>>2];G[l+28>>2]=G[j+56>>2];j=j- -64|0;l=l+32|0;u=u+8|0;if((w|0)!=(u|0)){continue}break}}u=0;if(v){while(1){G[l>>2]=G[j>>2];j=j+8|0;l=l+4|0;u=u+1|0;if((v|0)!=(u|0)){continue}break}}Je:{if((n|0)<3){break Je}l=0;if(C>>>0>=14){while(1){G[o>>2]=G[q+8>>2];G[o+4>>2]=G[q+16>>2];G[o+8>>2]=G[q+24>>2];G[o+12>>2]=G[q+32>>2];G[o+16>>2]=G[q+40>>2];G[o+20>>2]=G[q+48>>2];G[o+24>>2]=G[q+56>>2];G[o+28>>2]=G[q+64>>2];o=o+32|0;q=q- -64|0;l=l+8|0;if((B|0)!=(l|0)){continue}break}}l=0;if(!x){break Je}while(1){G[o>>2]=G[q+8>>2];o=o+4|0;q=q+8|0;l=l+1|0;if((x|0)!=(l|0)){continue}break}}j=0;l=i;if(!$){while(1){G[o>>2]=G[l>>2];G[o+4>>2]=G[l+4>>2];G[o+8>>2]=G[l+8>>2];G[o+12>>2]=G[l+12>>2];G[o+16>>2]=G[l+16>>2];G[o+20>>2]=G[l+20>>2];G[o+24>>2]=G[l+24>>2];G[o+28>>2]=G[l+28>>2];l=l+32|0;o=o+32|0;j=j+8|0;if((w|0)!=(j|0)){continue}break}}j=0;if(v){while(1){G[o>>2]=G[l>>2];l=l+4|0;o=o+4|0;j=j+1|0;if((v|0)!=(j|0)){continue}break}}ga=ga+1|0;if((ga|0)!=(m|0)){continue}break}}if(!((m|0)<2|(n|0)<=0)){C=m-2|0;l=(C>>>1|0)+1|0;u=l&-4;w=l&3;B=m-3|0;l=(B>>>1|0)+1|0;$=l&-4;Y=l&3;x=0;while(1){l=i;v=r+(x<<2)|0;j=ba<<2;o=v+j|0;q=o;A=0;ha=C>>>0<6;if(!ha){while(1){G[l>>2]=G[q>>2];fa=q;q=da<<2;ea=fa+q|0;G[l+4>>2]=G[ea>>2];ea=q+ea|0;G[l+8>>2]=G[ea>>2];ea=q+ea|0;G[l+12>>2]=G[ea>>2];q=q+ea|0;l=l+16|0;A=A+4|0;if((u|0)!=(A|0)){continue}break}}ga=0;if(w){while(1){G[l>>2]=G[q>>2];l=l+4|0;q=(da<<2)+q|0;ga=ga+1|0;if((w|0)!=(ga|0)){continue}break}}Ke:{if((m|0)<3){break Ke}q=0;if(B>>>0>=6){while(1){l=da<<2;v=l+v|0;G[o>>2]=G[v>>2];o=j+o|0;v=l+v|0;G[o>>2]=G[v>>2];o=j+o|0;v=l+v|0;G[o>>2]=G[v>>2];o=j+o|0;v=l+v|0;G[o>>2]=G[v>>2];o=j+o|0;q=q+4|0;if(($|0)!=(q|0)){continue}break}}l=0;if(!Y){break Ke}while(1){v=(da<<2)+v|0;G[o>>2]=G[v>>2];o=j+o|0;l=l+1|0;if((Y|0)!=(l|0)){continue}break}}q=0;l=i;if(!ha){while(1){G[o>>2]=G[l>>2];o=j+o|0;G[o>>2]=G[l+4>>2];o=j+o|0;G[o>>2]=G[l+8>>2];o=j+o|0;G[o>>2]=G[l+12>>2];o=j+o|0;l=l+16|0;q=q+4|0;if((u|0)!=(q|0)){continue}break}}q=0;if(w){while(1){G[o>>2]=G[l>>2];l=l+4|0;o=j+o|0;q=q+1|0;if((w|0)!=(q|0)){continue}break}}x=x+1|0;if((x|0)!=(n|0)){continue}break}}o=1;j=k<<1;l=s<<1;ga=l-1|0;n=n+1>>1;m=m+1>>1;X=X+1|0;if((pa|0)!=(X|0)){continue}break}}Wa(i);Le:{if((p|0)<=1){u=M(ba,na);break Le}u=M(ba,na);if((u|0)<=0){break Le}i=p+1>>>1|0;l=i-1|0;j=(r+(u<<2)|0)-4|0;i=1-i|0;o=r;while(1){k=G[o>>2];G[o>>2]=(((k|0)>0?l:i)+k|0)/(p|0);o=o+4|0;if(j>>>0>=o>>>0){continue}break}}o=0;i=G[_+12>>2];G[48827]=i;G[_+12>>2]=0;G[48828]=0;if((i|0)>=2){E[W|0]=221;E[W+1|0]=153;G[48828]=2;o=2}if((i|0)>(o|0)){E[o+W|0]=na>>>24;o=o|1;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=na>>>16;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=na>>>8;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=na;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=ba>>>24;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=ba>>>16;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=ba>>>8;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=ba;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=p>>>24;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=p>>>16;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=p>>>8;o=o+1|0;G[48828]=o}if((i|0)>(o|0)){E[o+W|0]=p;G[48828]=o+1}i=G[r>>2];cp(W,i,i>>31);l=0;G[r>>2]=0;j=8;k=lb(1,(u+7|0)/8|0);i=3029;if(!k){break Fe}if((u|0)<=0){break He}ga=0;while(1){p=r+(l<<2)|0;o=G[p>>2];Me:{Ne:{if((o|0)>0){i=k+ga|0;E[i|0]=H[i|0]<<1;break Ne}i=j;if((o|0)>=0){break Me}i=k+ga|0;E[i|0]=H[i|0]<<1|1;G[p>>2]=0-o}i=j-1|0}j=i?i:8;ga=!i+ga|0;l=l+1|0;if((u|0)!=(l|0)){continue}break}if((j|0)!=8){i=k+ga|0;E[i|0]=H[i|0]<>2]=0;G[aa>>2]=0;G[aa+4>>2]=0;A=(ba+1|0)/2|0;x=(na+1|0)/2|0;o=0;l=0;j=0;while(1){p=aa+(((j|0)>=(A|0))+((l|0)>=(x|0))<<2)|0;i=G[p>>2];m=p;p=G[r+(o<<2)>>2];G[m>>2]=(i|0)>(p|0)?i:p;i=j+1|0;j=(i|0)<(ba|0)?i:0;l=((i|0)>=(ba|0))+l|0;o=o+1|0;if((u|0)!=(o|0)){continue}break}u=0;o=G[aa>>2];if((o|0)<=0){break Ge}while(1){u=u+1|0;i=o>>>0>1;o=o>>>1|0;if(i){continue}break}break Ge}Ua(2963);break Ee}G[aa+4>>2]=0;G[aa+8>>2]=0;A=(ba+1|0)/2|0;x=(na+1|0)/2|0;ga=0;o=0;u=0}G[aa>>2]=o;j=0;o=G[aa+4>>2];Oe:{if((o|0)<=0){v=o;l=0;break Oe}l=0;while(1){l=l+1|0;i=o>>>0>1;v=o>>>1|0;o=v;if(i){continue}break}}G[aa+4>>2]=v;o=G[aa+8>>2];Pe:{if((o|0)<=0){v=o;break Pe}while(1){j=j+1|0;i=o>>>0>1;v=o>>>1|0;o=v;if(i){continue}break}}G[aa+8>>2]=v;q=G[48828];o=q+3|0;if((o|0)<=G[48827]){i=q+W|0;E[i+2|0]=j;E[i+1|0]=l;E[i|0]=u;G[48828]=o;G[48830]=8;G[48832]=0;G[48833]=0;G[48829]=0;o=Li(W,r,ba,x,A,u&255);Qe:{if(o){break Qe}i=(ba|0)/2|0;l=l&255;o=Li(W,r+(A<<2)|0,ba,x,i,l);if(o){break Qe}p=M(x,ba);m=(na|0)/2|0;o=Li(W,r+(p<<2)|0,ba,m,A,l);if(o){break Qe}o=Li(W,r+(p+A<<2)|0,ba,m,i,j&255)}j=G[48829]<<4;G[48829]=j;i=G[48830];l=i-4|0;G[48830]=l;if((i|0)<=4){l=G[48828];E[l+W|0]=j>>4-i;if((l|0)>>0<4?p+1|0:p;G[48832]=i;G[48833]=p;Re:{if((l|0)>=8){q=G[48828];break Re}q=G[48828];E[W+q|0]=j<(q|0)){q=q+1|0;G[48828]=q}w=(l>>31)+p|0;i=i+l|0;w=i>>>0>>0?w+1|0:w;G[48832]=i;G[48833]=w}Se:{Te:{if((ga|0)<=0){j=G[48827];break Te}j=G[48827];i=q+ga|0;if((j|0)<(i|0)){break Se}bb(q+W|0,k,ga);G[48828]=i;q=i}Wa(k);G[_+12>>2]=q;i=16770;if((j|0)<=(q|0)){break Fe}break De}Wa(k)}G[_+12>>2]=q;i=16770}Ua(i)}o=413}G[h>>2]=o}Fa=aa+16|0;break Ae;default:break Be}}if(G[h>>2]<=0){Ue:{v=(o|0)<1e4?o:1e4;j=ab(v<<3);if(!j){Ua(61864);G[h>>2]=113;break Ue}Ve:{if((o|0)<=0){break Ve}o=o-v|0;while(1){We:{if((v|0)<=0){break We}k=0;i=0;if(v-1>>>0>=3){p=v&-4;q=0;while(1){m=j+(i<<3)|0;s=G[r+(i+o<<2)>>2];G[m>>2]=s;G[m+4>>2]=s>>31;m=i|1;s=j+(m<<3)|0;m=G[r+(m+o<<2)>>2];G[s>>2]=m;G[s+4>>2]=m>>31;m=i|2;s=j+(m<<3)|0;m=G[r+(m+o<<2)>>2];G[s>>2]=m;G[s+4>>2]=m>>31;m=i|3;s=j+(m<<3)|0;m=G[r+(m+o<<2)>>2];G[s>>2]=m;G[s+4>>2]=m>>31;i=i+4|0;q=q+4|0;if((p|0)!=(q|0)){continue}break}}p=v&3;if(!p){break We}while(1){m=j+(i<<3)|0;s=G[r+(i+o<<2)>>2];G[m>>2]=s;G[m+4>>2]=s>>31;i=i+1|0;k=k+1|0;if((p|0)!=(k|0)){continue}break}}bb(r+(o<<3)|0,j,v<<3);if(!o){break Ve}i=(o|0)>1e4;v=i?v:o;o=o?i?o-1e4|0:0:0;if((v|0)>0){continue}break}}Wa(j)}}Y=l;oa=G[_+64>>2];j=0;A=0;ja=Fa-32|0;Fa=ja;if(G[h>>2]<=0){l=(ba|0)<(na|0)?na:ba;t=oc(+N(l|0))/.6931471805599453+.5;Xe:{if(O(t)<2147483648){i=~~t;break Xe}i=-2147483648}Ye:{Ze:{_e:{$e:{af:{X=ab((l+1|0)/2<<3);if(X){Qa=i+((l|0)>1<0){za=ba<<1;v=2;p=0;C=-2;W=-1;w=-4;m=-1;aa=1;x=0;u=1;o=0;k=na;s=ba;while(1){da=u;q=o;u=v;o=p;$=C;ha=W;C=w;W=m;Aa=(s|0)%2|0;ga=0;Ja=(k|0)%2|0;fb=k-Ja|0;if((fb|0)>0){Ea=s-Aa|0;v=!j;while(1){i=M(ba,ga);l=ba+i|0;n=0;if((Ea|0)>0){while(1){m=r+(l<<3)|0;pa=G[m+8>>2];w=pa;ma=G[m>>2];ka=ma;gb=w-ka|0;La=gb;B=i<<3;la=r+(B|8)|0;ea=G[la>>2];va=r+B|0;B=G[va>>2];fa=(La-ea|0)+B|0;Ha=G[m+12>>2];Da=G[m+4>>2];tb=Ha-(Da+(w>>>0>>0)|0)|0;Ca=G[la+4>>2];p=tb-(Ca+(ea>>>0>La>>>0)|0)|0;La=G[va+4>>2];w=p+La|0;w=B>>>0>fa>>>0?w+1|0:w;Xa=fa;ka=j&31;fa=m;if((j&63)>>>0>=32){p=w>>31;w=w>>ka}else{p=w>>ka;w=((1<>>ka}G[m+8>>2]=w;G[fa+12>>2]=p;w=m;p=Ha+Da|0;m=ma+pa|0;p=m>>>0>>0?p+1|0:p;pa=p;p=Ca+La|0;fa=B+ea|0;p=fa>>>0>>0?p+1|0:p;Da=fa;ma=fa;Ha=m-fa|0;fa=w;fa=w;ka=p;ma=pa-(p+(m>>>0>>0)|0)|0;w=j&31;if((j&63)>>>0>=32){p=ma>>31;w=ma>>w}else{p=ma>>w;w=((1<>>w}ma=w;Xa=(p|0)<0;Ha=w+(Xa?0:da)|0;w=p+(Xa?0:q)|0;G[fa>>2]=$&Ha;G[fa+4>>2]=ha&(ma>>>0>Ha>>>0?w+1|0:w);w=la;p=Ca+tb|0;la=ea+gb|0;p=la>>>0>>0?p+1|0:p;ea=la;la=ea-B|0;ea=p-((B>>>0>ea>>>0)+La|0)|0;B=j&31;if((j&63)>>>0>=32){p=ea>>31;B=ea>>B}else{p=ea>>B;B=((1<>>B}ea=(p|0)<0;la=B+(ea?0:da)|0;ea=p+(ea?0:q)|0;G[w>>2]=$&la;G[w+4>>2]=ha&(B>>>0>la>>>0?ea+1|0:ea);p=ka+pa|0;B=m+Da|0;p=B>>>0>>0?p+1|0:p;pa=B;B=j&31;if((j&63)>>>0>=32){ea=p>>31;p=p>>B}else{ea=p>>B;p=((1<>>B}m=p;pa=(ea|0)<0;B=m+(pa?aa:u)|0;p=ea+(pa?x:o)|0;w=va;G[w>>2]=B&C;G[w+4>>2]=W&(m>>>0>B>>>0?p+1|0:p);l=l+2|0;i=i+2|0;n=n+2|0;if((Ea|0)>(n|0)){continue}break}}if(Aa){l=r+(l<<3)|0;m=G[l>>2];i=r+(i<<3)|0;ea=G[i>>2];n=ea;w=m-n|0;pa=G[l+4>>2];la=G[i+4>>2];p=pa-(la+(n>>>0>m>>>0)|0)|0;n=v&31;if((v&63)>>>0>=32){p=w<>>32-n|p<>2]=B&$;G[l+4>>2]=ha&(n>>>0>B>>>0?w+1|0:w);p=la+pa|0;l=m+ea|0;p=l>>>0>>0?p+1|0:p;m=l;l=v&31;if((v&63)>>>0>=32){w=m<>>32-l|p<>2]=p&C;G[i+4>>2]=W&(l>>>0>p>>>0?m+1|0:m)}ga=ga+2|0;if((fb|0)>(ga|0)){continue}break}}bf:{if(!Ja){break bf}i=M(ba,ga);la=s-Aa|0;if((la|0)>0){v=!j;l=0;while(1){m=i<<3;p=r+(m|8)|0;n=G[p>>2];w=m+r|0;m=w;va=G[m>>2];ea=va;pa=n-ea|0;B=p;B=p;fa=G[p+4>>2];ka=G[m+4>>2];m=fa-(ka+(n>>>0>>0)|0)|0;ea=pa;p=v&31;if((v&63)>>>0>=32){m=ea<>>32-p|m<>2]=$&pa;G[B+4>>2]=ha&(ea>>>0>pa>>>0?p+1|0:p);p=w;m=fa+ka|0;w=n+va|0;m=w>>>0>>0?m+1|0:m;n=p;B=w;w=v&31;if((v&63)>>>0>=32){p=B<>>32-w|m<>2]=w&C;G[n+4>>2]=W&(m>>>0>w>>>0?p+1|0:p);i=i+2|0;l=l+2|0;if((la|0)>(l|0)){continue}break}}if(!Aa){break bf}i=r+(i<<3)|0;m=i;m=i;p=G[i+4>>2];l=G[i>>2];j=2-j|0;i=j&31;if((j&63)>>>0>=32){p=l<>>32-i|p<>2]=l&C;G[m+4>>2]=W&(i>>>0>l>>>0?p+1|0:p)}if(!((s|0)<2|(k|0)<=0)){q=s-2|0;i=(q>>>1|0)+1|0;m=i&-8;p=i&7;aa=s-3|0;i=(aa>>>1|0)+1|0;da=i&-8;w=i&7;x=0;while(1){l=X;n=r+(M(x,ba)<<3)|0;i=n+8|0;j=i;v=0;B=q>>>0<14;if(!B){while(1){$=G[j+4>>2];G[l>>2]=G[j>>2];G[l+4>>2]=$;$=G[j+20>>2];G[l+8>>2]=G[j+16>>2];G[l+12>>2]=$;$=G[j+36>>2];G[l+16>>2]=G[j+32>>2];G[l+20>>2]=$;$=G[j+52>>2];G[l+24>>2]=G[j+48>>2];G[l+28>>2]=$;$=G[j+68>>2];G[l+32>>2]=G[j+64>>2];G[l+36>>2]=$;$=G[j+84>>2];G[l+40>>2]=G[j+80>>2];G[l+44>>2]=$;$=G[j+100>>2];G[l+48>>2]=G[j+96>>2];G[l+52>>2]=$;$=G[j+116>>2];G[l+56>>2]=G[j+112>>2];G[l+60>>2]=$;j=j+128|0;l=l- -64|0;v=v+8|0;if((m|0)!=(v|0)){continue}break}}v=0;if(p){while(1){$=G[j+4>>2];G[l>>2]=G[j>>2];G[l+4>>2]=$;j=j+16|0;l=l+8|0;v=v+1|0;if((p|0)!=(v|0)){continue}break}}cf:{if((s|0)<3){break cf}l=0;if(aa>>>0>=14){while(1){j=G[n+20>>2];G[i>>2]=G[n+16>>2];G[i+4>>2]=j;j=G[n+36>>2];G[i+8>>2]=G[n+32>>2];G[i+12>>2]=j;j=G[n+52>>2];G[i+16>>2]=G[n+48>>2];G[i+20>>2]=j;j=G[n+68>>2];G[i+24>>2]=G[n+64>>2];G[i+28>>2]=j;j=G[n+84>>2];G[i+32>>2]=G[n+80>>2];G[i+36>>2]=j;j=G[n+100>>2];G[i+40>>2]=G[n+96>>2];G[i+44>>2]=j;j=G[n+116>>2];G[i+48>>2]=G[n+112>>2];G[i+52>>2]=j;j=G[n+132>>2];G[i+56>>2]=G[n+128>>2];G[i+60>>2]=j;i=i- -64|0;n=n+128|0;l=l+8|0;if((da|0)!=(l|0)){continue}break}}l=0;if(!w){break cf}while(1){j=G[n+20>>2];G[i>>2]=G[n+16>>2];G[i+4>>2]=j;i=i+8|0;n=n+16|0;l=l+1|0;if((w|0)!=(l|0)){continue}break}}j=0;l=X;if(!B){while(1){v=G[l+4>>2];G[i>>2]=G[l>>2];G[i+4>>2]=v;v=G[l+12>>2];G[i+8>>2]=G[l+8>>2];G[i+12>>2]=v;v=G[l+20>>2];G[i+16>>2]=G[l+16>>2];G[i+20>>2]=v;v=G[l+28>>2];G[i+24>>2]=G[l+24>>2];G[i+28>>2]=v;v=G[l+36>>2];G[i+32>>2]=G[l+32>>2];G[i+36>>2]=v;v=G[l+44>>2];G[i+40>>2]=G[l+40>>2];G[i+44>>2]=v;v=G[l+52>>2];G[i+48>>2]=G[l+48>>2];G[i+52>>2]=v;v=G[l+60>>2];G[i+56>>2]=G[l+56>>2];G[i+60>>2]=v;l=l- -64|0;i=i- -64|0;j=j+8|0;if((m|0)!=(j|0)){continue}break}}j=0;if(p){while(1){v=G[l+4>>2];G[i>>2]=G[l>>2];G[i+4>>2]=v;l=l+8|0;i=i+8|0;j=j+1|0;if((p|0)!=(j|0)){continue}break}}x=x+1|0;if((x|0)!=(k|0)){continue}break}}if(!((k|0)<2|(s|0)<=0)){da=k-2|0;i=(da>>>1|0)+1|0;w=i&-4;p=i&3;B=k-3|0;i=(B>>>1|0)+1|0;$=i&-4;aa=i&3;m=0;while(1){l=X;q=r+(m<<3)|0;j=ba<<3;i=q+j|0;n=i;ga=0;ha=da>>>0<6;if(!ha){while(1){v=G[n+4>>2];G[l>>2]=G[n>>2];G[l+4>>2]=v;v=za<<3;n=v+n|0;x=G[n+4>>2];G[l+8>>2]=G[n>>2];G[l+12>>2]=x;n=n+v|0;x=G[n+4>>2];G[l+16>>2]=G[n>>2];G[l+20>>2]=x;n=n+v|0;x=G[n+4>>2];G[l+24>>2]=G[n>>2];G[l+28>>2]=x;n=n+v|0;l=l+32|0;ga=ga+4|0;if((w|0)!=(ga|0)){continue}break}}x=0;if(p){while(1){v=G[n+4>>2];G[l>>2]=G[n>>2];G[l+4>>2]=v;l=l+8|0;n=n+(za<<3)|0;x=x+1|0;if((p|0)!=(x|0)){continue}break}}df:{if((k|0)<3){break df}n=0;if(B>>>0>=6){while(1){l=za<<3;v=l+q|0;q=G[v+4>>2];G[i>>2]=G[v>>2];G[i+4>>2]=q;v=l+v|0;q=G[v+4>>2];i=i+j|0;G[i>>2]=G[v>>2];G[i+4>>2]=q;v=l+v|0;q=G[v+4>>2];i=i+j|0;G[i>>2]=G[v>>2];G[i+4>>2]=q;q=l+v|0;l=q;v=G[l+4>>2];i=i+j|0;G[i>>2]=G[l>>2];G[i+4>>2]=v;i=i+j|0;n=n+4|0;if(($|0)!=(n|0)){continue}break}}l=0;if(!aa){break df}while(1){q=(za<<3)+q|0;n=G[q+4>>2];G[i>>2]=G[q>>2];G[i+4>>2]=n;i=i+j|0;l=l+1|0;if((aa|0)!=(l|0)){continue}break}}n=0;l=X;if(!ha){while(1){v=G[l+4>>2];G[i>>2]=G[l>>2];G[i+4>>2]=v;v=G[l+12>>2];i=i+j|0;G[i>>2]=G[l+8>>2];G[i+4>>2]=v;v=G[l+20>>2];i=i+j|0;G[i>>2]=G[l+16>>2];G[i+4>>2]=v;v=G[l+28>>2];i=i+j|0;G[i>>2]=G[l+24>>2];G[i+4>>2]=v;i=i+j|0;l=l+32|0;n=n+4|0;if((w|0)!=(n|0)){continue}break}}n=0;if(p){while(1){v=G[l+4>>2];G[i>>2]=G[l>>2];G[i+4>>2]=v;l=l+8|0;i=i+j|0;n=n+1|0;if((p|0)!=(n|0)){continue}break}}m=m+1|0;if((m|0)!=(s|0)){continue}break}}i=C;m=W<<1|i>>>31;w=i<<1;i=u;p=o<<1|i>>>31;v=i<<1;i=v;aa=i-1|0;x=p-!i|0;j=1;s=s+1>>1;k=k+1>>1;A=A+1|0;if((Qa|0)!=(A|0)){continue}break}}Wa(X);ef:{if((Y|0)<=1){v=M(ba,na);break ef}v=M(ba,na);if((v|0)<=0){break ef}j=(r+(v<<3)|0)-8|0;k=(Y+1>>>1|0)-1|0;i=k;p=0-i|0;m=0-((i|0)!=0)|0;i=r;while(1){o=G[i+4>>2];s=o;l=G[i>>2];n=!!l&(o|0)>=0|(o|0)>0;o=(n?k:p)+l|0;ea=s+(n?0:m)|0;ec=i,gc=Bu(o,l>>>0>o>>>0?ea+1|0:ea,Y,0),G[ec>>2]=gc;G[i+4>>2]=Ia;i=i+8|0;if(j>>>0>=i>>>0){continue}break}}i=0;s=G[_+12>>2];G[48827]=s;G[_+12>>2]=0;G[48828]=0;if((s|0)>=2){E[oa|0]=221;E[oa+1|0]=153;G[48828]=2;i=2}if((i|0)<(s|0)){E[i+oa|0]=na>>>24;i=i|1;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=na>>>16;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=na>>>8;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=na;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=ba>>>24;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=ba>>>16;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=ba>>>8;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=ba;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=Y>>>24;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=Y>>>16;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=Y>>>8;i=i+1|0;G[48828]=i}if((i|0)<(s|0)){E[i+oa|0]=Y;G[48828]=i+1}cp(oa,G[r>>2],G[r+4>>2]);G[r>>2]=0;G[r+4>>2]=0;j=8;u=lb(1,(v+7|0)/8|0);i=3155;if(!u){break _e}l=0;if((v|0)<=0){break af}x=0;while(1){p=r+(l<<3)|0;o=p;i=G[o+4>>2];k=G[o>>2];ff:{gf:{if(!!k&(i|0)>=0|(i|0)>0){i=u+x|0;E[i|0]=H[i|0]<<1;break gf}if((i|0)>0|(i|0)>=0){break ff}o=u+x|0;E[o|0]=H[o|0]<<1|1;G[p>>2]=0-k;G[p+4>>2]=0-(((k|0)!=0)+i|0)}j=j-1|0}o=j;j=o?o:8;x=!o+x|0;l=l+1|0;if((v|0)!=(l|0)){continue}break}if((j|0)!=8){i=u+x|0;E[i|0]=H[i|0]<>2]=0;G[ja+20>>2]=0;G[ja+8>>2]=0;G[ja+12>>2]=0;G[ja>>2]=0;G[ja+4>>2]=0;q=(ba+1|0)/2|0;ga=(na+1|0)/2|0;i=0;l=0;j=0;while(1){p=ja+(((j|0)>=(q|0))+((l|0)>=(ga|0))<<3)|0;k=p;o=G[k+4>>2];m=G[k>>2];n=r+(i<<3)|0;k=G[n+4>>2];w=m;n=G[n>>2];m=(k|0)<=(o|0)&m>>>0>n>>>0|(k|0)<(o|0);G[p>>2]=m?w:n;G[p+4>>2]=m?o:k;o=j+1|0;j=(o|0)<(ba|0)?o:0;l=((o|0)>=(ba|0))+l|0;i=i+1|0;if((v|0)!=(i|0)){continue}break}n=0;v=G[ja>>2];p=G[ja+4>>2];if(!v&(p|0)<=0|(p|0)<0){break $e}while(1){n=n+1|0;i=!p&v>>>0>1|(p|0)!=0;v=(p&1)<<31|v>>>1;p=p>>>1|0;if(i){continue}break}break $e}Ua(3119);break Ze}v=0;p=0;G[ja+16>>2]=0;G[ja+20>>2]=0;G[ja+8>>2]=0;G[ja+12>>2]=0;G[ja>>2]=0;G[ja+4>>2]=0;q=(ba+1|0)/2|0;ga=(na+1|0)/2|0;x=0;n=0}G[ja>>2]=v;G[ja+4>>2]=p;l=0;i=G[ja+12>>2];p=i;v=G[ja+8>>2];hf:{if(!v&(i|0)<=0|(i|0)<0){w=v;m=p;i=0;break hf}i=0;while(1){i=i+1|0;j=!p&v>>>0>1|(p|0)!=0;o=p;p=o>>>1|0;w=(o&1)<<31|v>>>1;m=p;v=w;if(j){continue}break}}G[ja+8>>2]=w;G[ja+12>>2]=m;v=G[ja+16>>2];p=G[ja+20>>2];jf:{if(!v&(p|0)<=0|(p|0)<0){w=v;m=p;break jf}while(1){l=l+1|0;o=!p&v>>>0>1|(p|0)!=0;w=(p&1)<<31|v>>>1;v=w;m=p>>>1|0;p=m;if(o){continue}break}}G[ja+16>>2]=w;G[ja+20>>2]=m;v=G[48828];j=v+3|0;if((j|0)<=(s|0)){o=v+oa|0;E[o+2|0]=l;E[o+1|0]=i;E[o|0]=n;G[48828]=j;G[48830]=8;G[48832]=0;G[48833]=0;G[48829]=0;j=Ki(oa,r,ba,ga,q,n&255);kf:{if(j){break kf}o=(ba|0)/2|0;i=i&255;j=Ki(oa,r+(q<<3)|0,ba,ga,o,i);if(j){break kf}k=M(ba,ga);p=(na|0)/2|0;j=Ki(oa,r+(k<<3)|0,ba,p,q,i);if(j){break kf}j=Ki(oa,r+(k+q<<3)|0,ba,p,o,l&255)}o=G[48829]<<4;G[48829]=o;l=G[48830];i=l-4|0;G[48830]=i;if((l|0)<=4){i=G[48828];E[i+oa|0]=o>>4-l;if((i|0)>>0<4?p+1|0:p;G[48832]=l;G[48833]=p;lf:{if((i|0)>=8){v=G[48828];break lf}v=G[48828];E[oa+v|0]=o<(v|0)){v=v+1|0;G[48828]=v}p=(i>>31)+p|0;l=i+l|0;p=l>>>0>>0?p+1|0:p;G[48832]=l;G[48833]=p}mf:{nf:{if((x|0)<=0){l=G[48827];break nf}l=G[48827];i=v+x|0;if((l|0)<(i|0)){break mf}bb(v+oa|0,u,x);G[48828]=i;v=i}Wa(u);G[_+12>>2]=v;i=16802;if((l|0)<=(v|0)){break _e}break Ye}Wa(u)}G[_+12>>2]=v;i=16770}Ua(i)}j=413}G[h>>2]=j}Fa=ja+32|0}i=G[_+12>>2];pe(a,G[G[a+4>>2]+1144>>2],Ba,Ba>>31,1,0,i,i>>31,G[_+64>>2],h)}i=G[G[a+4>>2]+1156>>2];if((i|0)<=0){break _c}j=i;i=Ba>>31;Ff(a,j,Ba,i,1,0,1,0,_+24|0,h);Ff(a,G[G[a+4>>2]+1160>>2],Ba,i,1,0,1,0,_+16|0,h);break _c}of:{if(G[i+1152>>2]>0){break of}Bi(a,999,35928,G[i+1036>>2]?35904:35908,h);if(G[h>>2]>0){break of}dc(a,0,35928,G[a+4>>2]+1152|0,h)}pf:{if((b|0)==42){s=o<<2;t=+(s>>>0)*1.1;qf:{if(t<4294967296&t>=0){i=~~t>>>0;break qf}i=0}G[_+68>>2]=i;i=lb(i,1);G[_+64>>2]=i;if(!i){Ua(60838);break Zc}rf:{if(($|0)!=1|(o|0)<=0){break rf}z=K[g>>2];i=0;j=0;if(o-1>>>0>=3){k=o&-4;while(1){l=j<<2;p=l+r|0;if(z==K[p>>2]){G[p>>2]=-1}p=r+(l|4)|0;if(z==K[p>>2]){G[p>>2]=-1}p=r+(l|8)|0;if(z==K[p>>2]){G[p>>2]=-1}l=r+(l|12)|0;if(z==K[l>>2]){G[l>>2]=-1}j=j+4|0;v=v+4|0;if((k|0)!=(v|0)){continue}break}}l=o&3;if(!l){break rf}while(1){k=r+(j<<2)|0;if(z==K[k>>2]){G[k>>2]=-1}j=j+1|0;i=i+1|0;if((l|0)!=(i|0)){continue}break}}ke(r,o);break pf}s=o<<3;t=+(s>>>0)*1.1;sf:{if(t<4294967296&t>=0){i=~~t>>>0;break sf}i=0}G[_+68>>2]=i;i=lb(i,1);G[_+64>>2]=i;if(!i){Ua(60838);break Zc}tf:{if(($|0)!=1|(o|0)<=0){break tf}t=L[g>>3];i=0;j=0;if(o-1>>>0>=3){p=o&-4;while(1){l=j<<3;k=l+r|0;if(t==L[k>>3]){G[k>>2]=-1;G[k+4>>2]=-1}k=r+(l|8)|0;if(t==L[k>>3]){G[k>>2]=-1;G[k+4>>2]=-1}k=r+(l|16)|0;if(t==L[k>>3]){G[k>>2]=-1;G[k+4>>2]=-1}l=r+(l|24)|0;if(t==L[l>>3]){G[l>>2]=-1;G[l+4>>2]=-1}j=j+4|0;v=v+4|0;if((p|0)!=(v|0)){continue}break}}k=o&3;if(!k){break tf}while(1){l=r+(j<<3)|0;if(t==L[l>>3]){G[l>>2]=-1;G[l+4>>2]=-1}j=j+1|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}Ge(r,o)}gp(r,s,_- -64|0,_+68|0,_+60|0,h);pe(a,G[G[a+4>>2]+1152>>2],Ba,Ba>>31,1,0,G[_+60>>2],0,G[_+64>>2],h)}Wa(G[_+64>>2]);break w}G[h>>2]=113;break w}G[h>>2]=413}Fa=_+80|0;i=Eb+1|0;if((zb|0)!=(Eb|0)){continue}break}i=(jb|0)!=(qb|0);jb=jb+1|0;if(i){continue}break}i=(Ga|0)!=(kb|0);Ga=Ga+1|0;if(i){continue}break}break q}G[D+200>>2]=Cb;G[D+232>>2]=Db;G[D+228>>2]=Sb;G[D+196>>2]=Mb}i=(d|0)!=($a|0);d=d+1|0;if(i){continue}break}break p}G[D+204>>2]=Lb;G[D+236>>2]=Qb;G[D+232>>2]=Db;G[D+200>>2]=Cb}d=(c|0)!=(Ya|0);c=c+1|0;if(d){continue}break}c=(Oa|0)!=(Pa|0);Oa=Oa+1|0;if(c){continue}break}Ga=G[a+4>>2];break m}b=M(Pa,Ta);G[D+212>>2]=(b|0)<(Sa|0)?b:Sa;G[D+244>>2]=M(Pa-1|0,Ta)+1;G[D+240>>2]=M(Ya-1|0,_a)+1;b=M(_a,Ya);G[D+208>>2]=(b|0)<(Za|0)?b:Za;G[D+236>>2]=M($a-1|0,eb)+1;b=M(eb,$a);G[D+204>>2]=(b|0)<(db|0)?b:db}Wa(r);if(!e|G[Ga+1104>>2]>=0){break a}G[D+88>>2]=0;kc(a,34861,D,D+88|0);if(!G[D+88>>2]){break a}kc(a,35408,D,h);Fh(a,34861,-2147483647,-1,3583,h);a=G[a+4>>2];G[a+1164>>2]=-1;G[a+1208>>2]=-2147483647;break a}G[h>>2]=410}Fa=D+384|0}function so(a,b,c,d,e,f,g,h,i,j){var 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,J=0,P=0,Q=N(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=N(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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Xa=0,Ya=0,Za=0,_a=0,$a=0;o=Fa-80|0;Fa=o;G[o+76>>2]=g;G[o+72>>2]=0;E[o+59|0]=0;F[o+56>>1]=0;G[o+52>>2]=0;G[o+48>>2]=0;G[o+24>>2]=0;G[o+28>>2]=0;G[o+8>>2]=0;G[o+12>>2]=0;G[o>>2]=0;G[o+4>>2]=0;a:{if(G[j>>2]>0){break a}T=a;a=G[a+4>>2];k=G[a+1112>>2];b:{c:{B=G[a+1228>>2];if(B){ma=((k-1|0)/G[a+1052>>2]|0)+1|0;break c}m=G[a+1052>>2];p=(k-1|0)/(m|0)|0;if((k|0)==(m|0)&G[a+1056>>2]==1){break b}ma=p+1|0;B=lb(ma,4);G[a+1228>>2]=B;_a=a,$a=lb(ma,4),G[_a+1240>>2]=$a;_a=a,$a=lb(ma,4),G[_a+1244>>2]=$a;_a=a,$a=lb(ma,4),G[_a+1232>>2]=$a;_a=a,$a=lb(ma,4),G[_a+1236>>2]=$a;_a=a,$a=lb(ma,4),G[_a+1248>>2]=$a;if(B){break c}ma=0;break b}ma=(b-1|0)%(ma|0)|0;k=ma<<2;if(G[k+B>>2]!=(b|0)|G[k+G[a+1236>>2]>>2]!=(d|0)){break b}b=ma<<2;bb(g,G[b+G[a+1240>>2]>>2],G[b+G[a+1232>>2]>>2]);if((e|0)==2){bb(h,G[b+G[G[T+4>>2]+1244>>2]>>2],c)}G[i>>2]=G[b+G[G[T+4>>2]+1248>>2]>>2];break a}g=G[a+1144>>2];a=b;s=a>>31;Le(T,g,a,s,o+8|0,o,j);d:{if(G[j>>2]==107){break d}e:{f:{g:{if(!(G[o+8>>2]|G[o+12>>2])){b=G[T+4>>2];g=G[b+1148>>2];if((g|0)>0){Le(T,g,a,s,o+8|0,o,j);c=G[o+8>>2];if(!(c|G[o>>2]|(G[o+12>>2]|G[o+4>>2]))){break d}k=c;p=k>>31;g=k;b=p;c=G[G[T+4>>2]+1148>>2];l=G[o+76>>2];if((e|0)<=1){bg(T,d,c,a,s,1,0,g,b,f,l,i,j);break a}f=Fa-16|0;Fa=f;if(G[j>>2]<=0){h:{i:{switch(d-1|0){case 0:xp(T,c,a,s,1,0,g,b,l,j);break h;case 10:Re(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 11:Ef(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 19:Gf(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 20:jf(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 29:Dh(T,c,a,s,1,0,g,b,2,0,l,h,i,j);break h;case 30:Eh(T,c,a,s,1,0,g,b,2,0,l,h,i,j);break h;case 39:qe(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 40:Ud(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 79:hf(T,c,a,s,1,0,g,b,1,2,0,0,l,h,i,j);break h;case 80:Se(T,c,a,s,1,0,g,b,1,2,0,0,l,h,i,j);break h;case 41:ae(T,c,a,s,1,0,g,b,1,2,N(0),l,h,i,j);break h;case 81:Id(T,c,a,s,1,0,g,b,1,2,0,l,h,i,j);break h;case 82:e=b<<1|g>>>31;k=g<<1;d=lb(k,1);ae(T,c,a,s,1,0,k,e,1,2,N(0),l,d,i,j);j:{if(!g&(b|0)<=0|(b|0)<0){break j}a=0;c=0;if((g|0)!=1|b){i=g&-2;while(1){E[h+r|0]=H[a+d|0]?1:H[d+(a|1)|0]!=0;E[(r|1)+h|0]=H[d+(a|2)|0]?1:H[d+(a|3)|0]!=0;k=v;c=r+2|0;k=c>>>0<2?k+1|0:k;r=c;v=k;a=a+4|0;e=n;c=U+2|0;e=c>>>0<2?e+1|0:e;U=c;n=e;if((i|0)!=(c|0)|(b|0)!=(e|0)){continue}break}c=r}if(!(g&1)){break j}E[c+h|0]=H[a+d|0]?1:H[d+(a|1)|0]!=0}Wa(d);break h;case 162:p=b<<1|g>>>31;e=g<<1;d=lb(e,1);Id(T,c,a,s,1,0,e,p,1,2,0,l,d,i,j);k:{if(!g&(b|0)<=0|(b|0)<0){break k}a=0;c=0;if((g|0)!=1|b){e=g&-2;while(1){E[h+r|0]=H[a+d|0]?1:H[d+(a|1)|0]!=0;E[(r|1)+h|0]=H[d+(a|2)|0]?1:H[d+(a|3)|0]!=0;k=v;c=r+2|0;k=c>>>0<2?k+1|0:k;r=c;v=k;a=a+4|0;c=U+2|0;p=c>>>0<2?n+1|0:n;U=c;n=p;if((e|0)!=(c|0)|(b|0)!=(n|0)){continue}break}c=r}if(!(g&1)){break k}E[c+h|0]=H[a+d|0]?1:H[d+(a|1)|0]!=0}Wa(d);break h;case 13:fg(T,c,a,s,1,0,g,b,2,0,l,h,i,j);break h;case 15:xh(T,c,a,s,1,0,g,b,2,f+14|0,l,h,i,j);break h;default:break i}}G[j>>2]=410}}Fa=f+16|0;break a}b=G[b+1152>>2];if((b|0)>0){Le(T,b,a,s,o+8|0,o,j);l=G[o+8>>2];if(!(l|G[o>>2]|(G[o+12>>2]|G[o+4>>2]))){break d}g=ab(l);if(!g){Ua(60281);break f}k=l;p=k>>31;if((bg(T,11,G[G[T+4>>2]+1152>>2],a,s,1,0,k,p,o+59|0,g,0,j)|0)>0){Ua(23110);Wa(g);break a}l:{m:{n:{a=G[G[T+4>>2]+1104>>2];if((a|0)==-32){b=2}else{if((a|0)!=-64){break n}b=3}b=c<>2]=b;if((d|0)==42|(d|0)==82){break l}Ua(21152);break m}Ua(24600)}Wa(g);break e}o:{p:{if((d|0)==42){if((a|0)!=-64){break p}a=ab(b);G[o+48>>2]=a;if(!a){Ua(60462);break g}if(!Qi(g,G[o+8>>2],o+48|0,o+68|0,0,o- -64|0,j)){break o}Ua(21671);Wa(G[o+48>>2]);Wa(g);break a}if((d|0)!=82|(a|0)!=-32){break p}a=ab(b);G[o+52>>2]=a;if(!a){Ua(60347);break g}if(!Qi(g,G[o+8>>2],o+52|0,o+68|0,0,o- -64|0,j)){break o}Ua(21671);Wa(G[o+52>>2]);Wa(g);break a}if(!Qi(g,G[o+8>>2],o+76|0,o+68|0,0,o- -64|0,j)){break o}Ua(21671);Wa(g);break a}Wa(g);a=G[o+64>>2];if((a|0)==c<<2){a=G[o+52>>2];q:{if(a){ke(a,c);break q}ke(G[o+76>>2],c)}if((d|0)==42){a=G[o+76>>2];gl(a,c,1,0,e,f?K[f>>2]:N(0),h,i,a);break a}if((d|0)==82){bl(G[o+52>>2],c,1,0,e,f?L[f>>3]:0,h,i,G[o+76>>2]);Wa(G[o+52>>2]);break a}Ua(7574);break e}if((a|0)==c<<3){a=G[o+48>>2];r:{if(a){Ge(a,c);break r}Ge(G[o+76>>2],c)}if((d|0)==42){Wi(G[o+48>>2],c,1,0,e,f?K[f>>2]:N(0),h,i,G[o+76>>2]);Wa(G[o+48>>2]);G[o+48>>2]=0;break a}if((d|0)==82){a=G[o+76>>2];dl(a,c,1,0,e,f?L[f>>3]:0,h,i,a);break a}Ua(7734);break e}Ua(19778);break e}G[j>>2]=415;break a}if(!((e|0)!=2|(c|0)<=0)){cb(h,0,c)}if(i){G[i>>2]=0}m=G[T+4>>2];w=L[m+1200>>3];s:{t:{u:{v:{g=G[m+1156>>2];switch(g+1|0){case 0:break u;case 1:break v;default:break t}}G[o+32>>2]=0;G[o+36>>2]=0;G[o+40>>2]=0;G[o+44>>2]=1072693248;break s}L[o+40>>3]=L[m+1168>>3];L[o+32>>3]=L[m+1176>>3];break s}Hf(T,g,a,s,1,0,1,0,0,o+40|0,0,j);Hf(T,G[G[T+4>>2]+1160>>2],a,s,1,0,1,0,0,o+32|0,0,j);if(G[j>>2]>0){Ua(21703);break a}m=G[T+4>>2];if((G[m+1104>>2]|32)!=-32){break s}u=L[m+1184>>3];z=L[m+1192>>3];if(u==1&z==0){break s}L[o+40>>3]=u*L[o+40>>3];L[o+32>>3]=L[o+32>>3]*u+z}if(!(L[o+40>>3]!=1|L[o+32>>3]!=0)){L[o+40>>3]=L[m+1184>>3];L[o+32>>3]=L[m+1192>>3]}w:{x:{y:{z:{B=G[m+1164>>2];switch(B+1|0){case 1:break w;case 0:break y;default:break z}}Up(T,B,a,s,o+60|0,0,j);if(G[j>>2]<=0){m=G[T+4>>2];break x}Ua(21763);break a}G[o+60>>2]=G[m+1208>>2]}B=e}A:{B:{C:{D:{E:{F:{G:{H:{I:{k=G[m+1048>>2];switch(k-11|0){case 10:case 11:case 40:break G;case 0:break H;case 30:break I;default:break D}}J:{switch(G[m+1104>>2]-8|0){case 0:case 8:break D;default:break J}}g=c<<3;break C}K:{switch(G[m+1104>>2]-8|0){case 8:break F;case 0:break K;default:break D}}if(G[m+1216>>2]!=1){break D}break B}e=G[m+1104>>2];if((e|0)==8){break B}g=k-21|0;if(g>>>0>30){break D}if(1<>2]!=2){break D}g=c<<1;break C}g=c<<1;if((e|0)==16){break C}g=k-21|0;if(g>>>0>30|!(1<>2]=g;break A}G[o+68>>2]=c;g=c}e=ab(g);G[o+72>>2]=e;if(!e){Ua(60529);break f}p=G[o+8>>2];g=p;L:{M:{N:{if((k|0)==31){g=ab(g<<1);if(!g){break N}k=p;p=k>>31;bg(T,21,G[m+1144>>2],a,s,1,0,k,p,o+56|0,g,0,j);break L}g=ab(g);if(g){break M}}Ua(60413);Wa(G[o+72>>2]);break f}e=p;p=e>>31;bg(T,11,G[m+1144>>2],a,s,1,0,e,p,o+59|0,g,0,j)}if(G[j>>2]>0){Ua(23110);Wa(g);Wa(G[o+72>>2]);break a}O:{P:{Q:{R:{S:{T:{U:{V:{W:{X:{e=G[T+4>>2];switch(G[e+1048>>2]-11|0){case 40:break S;case 10:case 11:break T;case 20:break U;case 30:break W;case 0:break X;default:break R}}a=G[e+1212>>2];Y:{switch(G[e+1216>>2]-1|0){case 1:n=G[o+72>>2];p=a;v=g+3|0;r=G[o+8>>2]+g|0;k=H[g+1|0]|H[g|0]<<8;l=H[g+2|0];a=8;Z:{_:{$:{while(1){if((c|0)<=(q|0)){break $}e=a-4|0;if((a|0)<=3){while(1){l=H[v|0]|l<<8;a=e>>>0<4294967288;v=v+1|0;e=e+8|0;if(a){continue}break}}a=p+q|0;m=(a|0)<(c|0)?a:c;x=-1<>>e|0)-1|0;da:{if((s|0)<0){if((m|0)<=(q|0)){break da}a=m+(q^-1)|0;l=0;s=m-q&7;if(s){while(1){F[n+(q<<1)>>1]=k;q=q+1|0;l=l+1|0;if((s|0)!=(l|0)){continue}break}}if(a>>>0<7){break ba}while(1){a=n+(q<<1)|0;F[a>>1]=k;F[a+14>>1]=k;F[a+12>>1]=k;F[a+10>>1]=k;F[a+8>>1]=k;F[a+6>>1]=k;F[a+4>>1]=k;F[a+2>>1]=k;q=q+8|0;if((m|0)!=(q|0)){continue}break}break ba}if((s|0)!=14){if((m|0)<=(q|0)){break aa}while(1){if(!t){while(1){e=e+8|0;t=H[v|0];v=v+1|0;if(!t){continue}break}}a=e-G[(t<<2)+103808>>2]|0;e=(a^-1)+e|0;l=1<>>0<4294967288;v=v+1|0;e=e+8|0;if(t){continue}break}}a=a<>>e;a=(a>>>1^0-(a&1))+k|0;F[n+(q<<1)>>1]=a;k=a&65535;t=(-1<(q|0)){break ca}}break aa}s=8-e|0;U=16-e|0;while(1){a=t<>>0>7;v=v+1|0;l=l-8|0;if(t){continue}break}}ea:{if(!e){t=0;break ea}aa=H[v|0];t=aa&x;a=aa>>>0-l|a;v=v+1|0}a=(0-(a&1)^a>>>1)+k|0;F[n+(q<<1)>>1]=a;k=a&65535;q=q+1|0;if((m|0)!=(q|0)){continue}break}}q=m}a=e;l=t;if(r>>>0>=v>>>0){continue}break}e=1;l=16504;break _}e=0;l=11554;if(r>>>0<=v>>>0){break Z}}Ua(l)}m=e;G[j>>2]=e;e=1;a=0;l=0;break O;case 0:break Q;default:break Y}}n=G[o+72>>2];p=a;a=H[g|0]|H[g+1|0]<<8|(H[g+2|0]<<16|H[g+3|0]<<24);k=a<<24|a<<8&16711680|(a>>>8&65280|a>>>24);v=g+5|0;r=G[o+8>>2]+g|0;l=H[g+4|0];a=8;fa:{ga:{ha:{while(1){if((c|0)<=(q|0)){break ha}e=a-5|0;if((a|0)<=4){while(1){l=H[v|0]|l<<8;a=e>>>0<4294967288;v=v+1|0;e=e+8|0;if(a){continue}break}}a=p+q|0;m=(a|0)<(c|0)?a:c;x=-1<>>e|0)-1|0;la:{if((s|0)<0){if((m|0)<=(q|0)){break la}a=m+(q^-1)|0;l=0;s=m-q&7;if(s){while(1){G[n+(q<<2)>>2]=k;q=q+1|0;l=l+1|0;if((s|0)!=(l|0)){continue}break}}if(a>>>0<7){break ja}while(1){a=n+(q<<2)|0;G[a>>2]=k;G[a+28>>2]=k;G[a+24>>2]=k;G[a+20>>2]=k;G[a+16>>2]=k;G[a+12>>2]=k;G[a+8>>2]=k;G[a+4>>2]=k;q=q+8|0;if((m|0)!=(q|0)){continue}break}break ja}if((s|0)!=25){if((m|0)<=(q|0)){break ia}while(1){if(!t){while(1){e=e+8|0;t=H[v|0];v=v+1|0;if(!t){continue}break}}a=e-G[(t<<2)+103808>>2]|0;e=(a^-1)+e|0;l=1<>>0<4294967288;v=v+1|0;e=e+8|0;if(t){continue}break}}a=a<>>e;k=(a>>>1^0-(a&1))+k|0;G[n+(q<<2)>>2]=k;t=(-1<(q|0)){break ka}}break ia}s=24-e|0;U=32-e|0;while(1){a=t<>>0>7;v=v+1|0;l=l-8|0;if(t){continue}break}}ma:{if(!e){t=0;break ma}aa=H[v|0];t=aa&x;a=aa>>>0-l|a;v=v+1|0}k=(0-(a&1)^a>>>1)+k|0;G[n+(q<<2)>>2]=k;q=q+1|0;if((m|0)!=(q|0)){continue}break}}q=m}a=e;l=t;if(r>>>0>=v>>>0){continue}break}e=1;l=16504;break ga}e=0;l=11554;if(r>>>0<=v>>>0){break fa}}Ua(l)}a=e;break V}a=G[e+1224>>2];na:{switch(G[e+1104>>2]-8|0){case 0:case 8:v=G[o+72>>2];k=o- -64|0;wa=Fa-16|0;Fa=wa;U=G[j>>2];if((U|0)<=0){e=H[g|0]|H[g+1|0]<<8;G[48834]=2;F[wa+14>>1]=e;oa:{if((e|0)!=(H[189772]|H[189773]<<8)){Ua(5235);U=414;break oa}e=H[g+2|0]|H[g+3|0]<<8|(H[g+4|0]<<16|H[g+5|0]<<24);G[o+20>>2]=e<<24|e<<8&16711680|(e>>>8&65280|e>>>24);e=H[g+6|0]|H[g+7|0]<<8|(H[g+8|0]<<16|H[g+9|0]<<24);G[k>>2]=e<<24|e<<8&16711680|(e>>>8&65280|e>>>24);e=H[g+10|0]|H[g+11|0]<<8|(H[g+12|0]<<16|H[g+13|0]<<24);G[o+16>>2]=e<<24|e<<8&16711680|(e>>>8&65280|e>>>24);l=H[g+18|0]|H[g+19|0]<<8|(H[g+20|0]<<16|H[g+21|0]<<24);x=H[g+24|0];n=H[g+23|0];U=H[g+22|0];G[48834]=25;e=G[k>>2];m=(e+1|0)/2|0;q=G[o+20>>2];p=(q+1|0)/2|0;s=M(e,q);if((s|0)>0){cb(v,0,s<<2)}t=l>>>8&65280|l>>>24|(l<<8&16711680|l<<24);G[48835]=0;pa:{U=Ji(g,v,e,p,m,U);qa:{if(U){break qa}l=(e|0)/2|0;U=Ji(g,v+(m<<2)|0,e,p,l,n);if(U){break qa}p=M(e,p);q=(q|0)/2|0;U=Ji(g,v+(p<<2)|0,e,q,m,n);if(U){break qa}U=Ji(g,v+(m+p<<2)|0,e,q,l,x);if(U){break qa}R=G[48836];e=G[48835];if((e|0)<=3){l=G[48834];m=H[l+g|0];G[48834]=l+1;R=m|R<<8;G[48836]=R;e=e+8|0}e=e-4|0;G[48835]=e;if(!(R>>e&15)){break pa}Ua(7346);U=414}G[v>>2]=t;break oa}G[48835]=0;if((s|0)>0){m=G[48834];l=0;while(1){e=v+(r<<2)|0;p=G[e>>2];ra:{if(!p){break ra}if(l){l=l-1|0}else{R=H[g+m|0];m=m+1|0;G[48834]=m;G[48836]=R;l=7}G[48835]=l;if(!(R>>>l&1)){break ra}G[e>>2]=0-p}r=r+1|0;if((s|0)!=(r|0)){continue}break}}G[v>>2]=t;G[j>>2]=0;r=G[o+16>>2];sa:{if((r|0)<2){break sa}e=M(G[o+20>>2],G[k>>2]);if((e|0)<=0){break sa}l=(v+(e<<2)|0)-4|0;e=v;while(1){G[e>>2]=M(G[e>>2],r);e=e+4|0;if(l>>>0>=e>>>0){continue}break}r=G[o+16>>2]}na=G[o+20>>2];x=G[k>>2];l=(x|0)<(na|0)?na:x;m=ab((l+1|0)/2<<2);if(!m){Ua(2937);U=414;break oa}U=0;u=oc(+N(l|0))/.6931471805599453+.5;ta:{if(O(u)<2147483648){e=~~u;break ta}e=-2147483648}l=((l|0)>1<>2];G[v>>2]=(k+(4<>1)|0)+(k>>31)&n<<2;if((l|0)>0){ya=0-x|0;k=n<<1;pa=1<>1;sa=0-qa|0;ta=x<<1;Z=0-ta|0;ha=2<>1;l=t-1|0;a=q;la=1;S=1;P=1;y=x;while(1){p=a;s=n;oa=e;e=P<<1;pa=pa>>1;n=(pa|0)>=(y|0);P=e-n|0;W=S<<1;fa=(na|0)<=(pa|0);S=W-fa|0;V=(S|0)<=0;if(!V){C=P+1>>1;aa=C-1|0;a=aa>>31&aa;J=C-a&3;ga=C+(a^-1)|0;X=P-C<<2;$=aa<<1;da=(e+(n?-1:0)|0)-2|0;a=(da>>>1|0)+1|0;Y=a&-8;A=a&7;R=0;while(1){a=M(x,R);if((P|0)>(C|0)){bb(m,v+(a+C<<2)|0,X)}ua:{if((P|0)<=0){break ua}D=v+(a<<2)|0;e=D+(aa<<2)|0;n=D+($<<2)|0;r=0;a=aa;if(J){while(1){G[n>>2]=G[e>>2];a=a-1|0;n=n-8|0;e=e-4|0;r=r+1|0;if((J|0)!=(r|0)){continue}break}}if(ga>>>0>=3){while(1){G[n>>2]=G[e>>2];G[n-8>>2]=G[e-4>>2];G[n-16>>2]=G[e-8>>2];G[n-24>>2]=G[e-12>>2];n=n-32|0;e=e-16|0;r=(a|0)>3;a=a-4|0;if(r){continue}break}}if((P|0)<2){break ua}e=D+4|0;a=0;n=m;if(da>>>0>=14){while(1){G[e>>2]=G[n>>2];G[e+8>>2]=G[n+4>>2];G[e+16>>2]=G[n+8>>2];G[e+24>>2]=G[n+12>>2];G[e+32>>2]=G[n+16>>2];G[e+40>>2]=G[n+20>>2];G[e+48>>2]=G[n+24>>2];G[e+56>>2]=G[n+28>>2];n=n+32|0;e=e- -64|0;a=a+8|0;if((Y|0)!=(a|0)){continue}break}}a=0;if(!A){break ua}while(1){G[e>>2]=G[n>>2];n=n+4|0;e=e+8|0;a=a+1|0;if((A|0)!=(a|0)){continue}break}}R=R+1|0;if((S|0)!=(R|0)){continue}break}}q=q>>1;ga=(P|0)<=0;if(!ga){a=W+(fa?-1:0)|0;aa=S+1>>1;e=a-aa|0;J=e&3;W=e-1|0;R=aa-1|0;e=R>>31&R;A=aa-e&3;fa=aa+(e^-1)|0;X=M(x,aa);$=a-2|0;a=($>>>1|0)+1|0;da=a&-4;D=a&3;Y=M(x,R);ka=Y<<1;ea=0;while(1){C=v+(ea<<2)|0;va:{if((S|0)<=(aa|0)){break va}n=C+(X<<2)|0;r=0;e=m;a=aa;if(J){while(1){G[e>>2]=G[n>>2];a=a+1|0;e=e+4|0;n=(x<<2)+n|0;r=r+1|0;if((J|0)!=(r|0)){continue}break}}if(W>>>0<3){break va}while(1){G[e>>2]=G[n>>2];r=n;n=x<<2;r=r+n|0;G[e+4>>2]=G[r>>2];r=n+r|0;G[e+8>>2]=G[r>>2];r=n+r|0;G[e+12>>2]=G[r>>2];n=n+r|0;e=e+16|0;a=a+4|0;if((S|0)!=(a|0)){continue}break}}wa:{if(V){break wa}e=C+(Y<<2)|0;n=C+(ka<<2)|0;r=0;a=R;if(A){while(1){G[n>>2]=G[e>>2];a=a-1|0;n=(Z<<2)+n|0;e=(ya<<2)+e|0;r=r+1|0;if((A|0)!=(r|0)){continue}break}}if(fa>>>0>=3){while(1){G[n>>2]=G[e>>2];r=n;n=Z<<2;r=r+n|0;_=e;e=ya<<2;_=_+e|0;G[r>>2]=G[_>>2];r=n+r|0;_=e+_|0;G[r>>2]=G[_>>2];r=n+r|0;_=e+_|0;G[r>>2]=G[_>>2];n=n+r|0;e=e+_|0;r=(a|0)>3;a=a-4|0;if(r){continue}break}}if((S|0)<2){break wa}n=C+(x<<2)|0;r=0;e=m;if($>>>0>=6){while(1){G[n>>2]=G[e>>2];a=ta<<2;n=a+n|0;G[n>>2]=G[e+4>>2];n=a+n|0;G[n>>2]=G[e+8>>2];n=a+n|0;G[n>>2]=G[e+12>>2];n=a+n|0;e=e+16|0;r=r+4|0;if((da|0)!=(r|0)){continue}break}}a=0;if(!D){break wa}while(1){G[n>>2]=G[e>>2];e=e+4|0;n=(ta<<2)+n|0;a=a+1|0;if((D|0)!=(a|0)){continue}break}}ea=ea+1|0;if((P|0)!=(ea|0)){continue}break}}aa=l;X=q-1|0;xa:{if(ba){break xa}D=S-2|0;A=(S|0)<5;if(!A){a=2;if(ga){break xa}while(1){e=M(a,x);r=x+e|0;n=0;while(1){J=G[v+(e+ta<<2)>>2];R=G[v+(e<<2)>>2];l=J-R|0;W=G[v+(e-ta<<2)>>2];R=R-W|0;C=(l|0)>(R|0)?l:R;C=(C>>31&C)<<2;l=(l|0)<(R|0)?l:R;l=((l|0)>0?l:0)<<2;if((C|0)<(l|0)){R=J-W|0;l=(l|0)>(R|0)?R:l;l=(l|0)>(C|0)?l:C;R=v+(r<<2)|0;C=G[R>>2];l=l-(C<<3)|0;l=((l|0)<0?l+7|0:l)>>3;l=(l|0)<(qa|0)?l:qa;G[R>>2]=C+((l|0)>(sa|0)?l:sa)}r=r+2|0;e=e+2|0;n=n+2|0;if((P|0)>(n|0)){continue}break}a=a+2|0;if((D|0)>(a|0)){continue}break}}if(!((P|0)<5|V)){W=P-2|0;ea=0;while(1){R=2;a=M(x,ea);r=G[v+(a<<2)>>2];n=a+2|0;l=G[v+(n<<2)>>2];while(1){a=l;e=n+2|0;l=G[v+(e<<2)>>2];C=l-a|0;V=a-r|0;J=(C|0)>(V|0)?C:V;J=(J>>31&J)<<2;C=(C|0)<(V|0)?C:V;C=((C|0)>0?C:0)<<2;if((J|0)<(C|0)){r=l-r|0;r=(r|0)<(C|0)?r:C;J=(r|0)>(J|0)?r:J;r=v+(n<<2|4)|0;C=G[r>>2];n=J-(C<<3)|0;n=((n|0)<0?n+7|0:n)>>3;n=(n|0)<(qa|0)?n:qa;G[r>>2]=C+((n|0)>(sa|0)?n:sa)}r=a;n=e;R=R+2|0;if((W|0)>(R|0)){continue}break}ea=ea+2|0;if((S|0)>(ea|0)){continue}break}}if((P|0)<5|A){break xa}ga=P-2|0;r=2;while(1){n=M(r,x)+2|0;R=x+n|0;a=2;while(1){J=v+(n+ta<<2)|0;$=G[J+8>>2];e=n<<2;C=G[e+v>>2];V=$-C|0;l=G[v+(e|4)>>2]<<1;W=v+(R<<2)|0;e=G[W>>2]<<1;da=l+e|0;A=(V>>31&V)-da|0;Y=G[J-8>>2];J=C-Y|0;fa=(e+(J>>31&J)|0)-l|0;fa=(A|0)>(fa|0)?A:fa;ka=v+(n-ta<<2)|0;_=G[ka+8>>2];A=C-_|0;ia=(A>>31&A)-e|0;ka=G[ka-8>>2];C=ka-C|0;ua=e+(C>>31&C)|0;ia=l+((ia|0)>(ua|0)?ia:ua)|0;fa=((fa|0)>(ia|0)?fa:ia)<<4;V=((V|0)>0?V:0)-da|0;J=(e+((J|0)>0?J:0)|0)-l|0;V=(J|0)>(V|0)?V:J;J=((A|0)>0?A:0)-e|0;e=e+((C|0)>0?C:0)|0;e=l+((e|0)>(J|0)?J:e)|0;e=((e|0)>(V|0)?V:e)<<4;if((fa|0)<(e|0)){l=$+(ka-(Y+_|0)|0)|0;e=(e|0)>(l|0)?l:e;l=G[W+4>>2];e=((e|0)>(fa|0)?e:fa)-(l<<6)|0;e=((e|0)<0?e+63|0:e)>>6;e=(e|0)<(qa|0)?e:qa;G[W+4>>2]=((e|0)>(sa|0)?e:sa)+l}R=R+2|0;n=n+2|0;a=a+2|0;if((ga|0)>(a|0)){continue}break}r=r+2|0;if((D|0)>(r|0)){continue}break}}$=(y|0)>(pa|0);da=(na|0)>(pa|0);la=oa?la:2;l=oa?X:0;J=(P|0)%2|0;X=(S|0)%2|0;Y=S-X|0;ya:{if((Y|0)<=0){e=0;break ya}fa=P-J|0;e=0;while(1){r=M(e,x);n=x+r|0;a=0;if((fa|0)>0){while(1){R=v+(n<<2)|0;C=G[R+4>>2];A=s&((C|0)<0?l:q)+C;V=A&p;D=0-V|0;C=G[R>>2];C=((C|0)<0?aa:t)+C&k;C=((C|0)<0?V:D)+C|0;_=D;ga=r<<2;ka=v+(ga|4)|0;D=G[ka>>2];D=((D|0)<0?aa:t)+D&k;D=((D|0)<0?V:_)+D|0;W=(C^A^D)&ha;_=v+ga|0;ga=G[_>>2];za:{if((ga|0)>=0){V=(V+ga|0)-W|0;break za}V=ga+(V?V-W|0:W)|0}W=V+C|0;ga=A+D|0;G[R+4>>2]=W+ga>>la;G[R>>2]=W-ga>>la;R=V-C|0;G[ka>>2]=R+(D-A|0)>>la;G[_>>2]=R+(A-D|0)>>la;n=n+2|0;r=r+2|0;a=a+2|0;if((fa|0)>(a|0)){continue}break}}if(J){R=v+(n<<2)|0;a=G[R>>2];a=((a|0)<0?aa:t)+a&k;n=a&ha;D=n;_=0-n|0;r=v+(r<<2)|0;n=G[r>>2];n=((n|0)<0?D:_)+n|0;G[R>>2]=a+n>>la;G[r>>2]=n-a>>la}e=e+2|0;if((Y|0)>(e|0)){continue}break}}R=$?pa:0;C=da?pa:0;Aa:{if(!X){break Aa}e=M(e,x);a=0;V=P-J|0;if((V|0)>0){while(1){A=e<<2;D=v+(A|4)|0;n=G[D>>2];n=((n|0)<0?aa:t)+n&k;r=n&ha;$=r;_=0-r|0;r=v+A|0;A=G[r>>2];A=((A|0)<0?$:_)+A|0;G[D>>2]=A+n>>la;G[r>>2]=A-n>>la;e=e+2|0;a=a+2|0;if((V|0)>(a|0)){continue}break}}if(!J){break Aa}a=v+(e<<2)|0;G[a>>2]=G[a>>2]>>la}y=y-R|0;na=na-C|0;e=oa-1|0;n=s>>1;a=p>>1;t=q;k=s;ha=p;if((oa|0)>0){continue}break}}Wa(m)}G[j>>2]=U}Fa=wa+16|0;a=U;break V;default:break na}}s=a;S=G[o+72>>2];Ja=o- -64|0;Na=Fa-16|0;Fa=Na;a=G[j>>2];Ba:{if((a|0)>0){break Ba}a=H[g|0]|H[g+1|0]<<8;G[48834]=2;F[Na+14>>1]=a;if((a|0)!=(H[189772]|H[189773]<<8)){Ua(5235);a=414;G[j>>2]=414;break Ba}a=H[g+2|0]|H[g+3|0]<<8|(H[g+4|0]<<16|H[g+5|0]<<24);G[o+20>>2]=a<<24|a<<8&16711680|(a>>>8&65280|a>>>24);a=H[g+6|0]|H[g+7|0]<<8|(H[g+8|0]<<16|H[g+9|0]<<24);G[Ja>>2]=a<<24|a<<8&16711680|(a>>>8&65280|a>>>24);a=H[g+10|0]|H[g+11|0]<<8|(H[g+12|0]<<16|H[g+13|0]<<24);G[o+16>>2]=a<<24|a<<8&16711680|(a>>>8&65280|a>>>24);l=H[g+14|0]|H[g+15|0]<<8|(H[g+16|0]<<16|H[g+17|0]<<24);a=H[g+18|0]|H[g+19|0]<<8|(H[g+20|0]<<16|H[g+21|0]<<24);U=H[g+24|0];t=H[g+23|0];aa=H[g+22|0];G[48834]=25;m=G[Ja>>2];n=(m+1|0)/2|0;v=G[o+20>>2];r=(v+1|0)/2|0;q=M(m,v);if((q|0)>0){cb(S,0,q<<3)}x=((a&255)<<24|l>>>8)&-16777216|((a&16777215)<<8|l>>>24)&16711680|(a>>>8&65280|a>>>24);p=l<<8;e=0;k=p&16711680;x=e|x;p=l<<24|k|((a<<24|l>>>8)&65280|(a<<8|l>>>24)&255)|oa;G[48835]=0;Ca:{a=Ii(g,S,m,r,n,aa);Da:{if(a){break Da}e=(m|0)/2|0;a=Ii(g,S+(n<<3)|0,m,r,e,t);if(a){break Da}l=M(m,r);k=(v|0)/2|0;a=Ii(g,S+(l<<3)|0,m,k,n,t);if(a){break Da}a=Ii(g,S+(l+n<<3)|0,m,k,e,U);if(a){break Da}k=G[48836];a=G[48835];if((a|0)<=3){e=G[48834];l=H[e+g|0];G[48834]=e+1;k=l|k<<8;G[48836]=k;a=a+8|0}a=a-4|0;G[48835]=a;if(!(k>>a&15)){break Ca}Ua(7377);a=414}G[S>>2]=x;G[S+4>>2]=p;G[j>>2]=a;break Ba}G[48835]=0;if((q|0)>0){m=G[48834];a=0;while(1){n=S+(a<<3)|0;l=n;e=G[l+4>>2];l=G[l>>2];Ea:{if(!(e|l)){break Ea}if(y){y=y-1|0}else{k=H[g+m|0];m=m+1|0;G[48834]=m;G[48836]=k;y=7}G[48835]=y;if(!(k>>>y&1)){break Ea}G[n>>2]=0-l;G[n+4>>2]=0-(((l|0)!=0)+e|0)}a=a+1|0;if((q|0)!=(a|0)){continue}break}}G[S>>2]=x;G[S+4>>2]=p;G[j>>2]=0;W=G[Ja>>2];Ba=G[o+20>>2];l=G[o+16>>2];Fa:{if((l|0)<2){break Fa}a=M(W,Ba);if((a|0)<=0){break Fa}e=(S+(a<<3)|0)-8|0;a=S;while(1){_a=a,$a=Au(G[a>>2],G[a+4>>2],l,0),G[_a>>2]=$a;G[a+4>>2]=Ia;a=a+8|0;if(e>>>0>=a>>>0){continue}break}}m=(W|0)<(Ba|0)?Ba:W;aa=ab((m+1|0)/2<<3);Ga:{if(!aa){Ua(3091);a=414;break Ga}u=oc(+N(m|0))/.6931471805599453+.5;Ha:{if(O(u)<2147483648){e=~~u;break Ha}e=-2147483648}a=G[S+4>>2];k=a;r=e+((m|0)>1<>>0>=32){p=4<>>32-e;m=4<>1;p=(p&1)<<31|m>>>1;m=p+G[S>>2]|0;e=e+k|0;e=m>>>0

>>0?e+1|0:e;p=m;m=e;e=k>>31;n=e;e=p+e|0;k=m+n|0;q=e;p=e>>>0>>0?k+1|0:k;e=a;k=e&31;if((e&63)>>>0>=32){e=1<>>32-k}U=m;n=e;m=0-(e+((U|0)!=0)|0)|0;x=0-U|0;e=S;G[e>>2]=x<<2&q;G[e+4>>2]=(m<<2|x>>>30)&p;if((r|0)>0){Pa=0-W|0;e=x;k=m<<1|e>>>31;wa=e<<1;pa=k;ha=1<>1;Ea=e;Ga=0-e|0;va=e>>31;xa=0-(va+((e|0)!=0)|0)|0;e=a;l=e&31;if((e&63)>>>0>=32){e=2<>>32-l;qa=2<>1;sa=k;la=(e&1)<<31|qa>>>1;r=la-1|0;v=k-!la|0;k=U;p=n;oa=1;ra=1;ea=1;q=W;while(1){ya=a;l=ea<<1;ha=ha>>1;s=(ha|0)>=(q|0);ea=l-s|0;V=ra<<1;A=(ha|0)>=(Ba|0);ra=V-A|0;J=(ra|0)<=0;if(!J){R=ea+1>>1;e=R-1|0;a=e>>31&e;C=R-a&3;D=R+(a^-1)|0;Z=ea-R<<3;fa=e<<1;ga=(l+(s?-1:0)|0)-2|0;a=(ga>>>1|0)+1|0;ba=a&-8;P=a&7;y=0;while(1){a=M(y,W);if((R|0)<(ea|0)){bb(aa,S+(a+R<<3)|0,Z)}Ia:{if((ea|0)<=0){break Ia}na=S+(a<<3)|0;a=na+(e<<3)|0;l=na+(fa<<3)|0;t=0;s=e;if(C){while(1){X=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=X;s=s-1|0;l=l-16|0;a=a-8|0;t=t+1|0;if((C|0)!=(t|0)){continue}break}}if(D>>>0>=3){while(1){t=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=t;X=a-8|0;$=G[X+4>>2];t=l-16|0;G[t>>2]=G[X>>2];G[t+4>>2]=$;X=a-16|0;$=G[X+4>>2];t=l-32|0;G[t>>2]=G[X>>2];G[t+4>>2]=$;X=a-24|0;$=G[X+4>>2];t=l-48|0;G[t>>2]=G[X>>2];G[t+4>>2]=$;l=l+-64|0;a=a-32|0;t=(s|0)>3;s=s-4|0;if(t){continue}break}}if((ea|0)<2){break Ia}a=na+8|0;s=0;l=aa;if(ga>>>0>=14){while(1){t=G[l+4>>2];G[a>>2]=G[l>>2];G[a+4>>2]=t;t=G[l+12>>2];G[a+16>>2]=G[l+8>>2];G[a+20>>2]=t;t=G[l+20>>2];G[a+32>>2]=G[l+16>>2];G[a+36>>2]=t;t=G[l+28>>2];G[a+48>>2]=G[l+24>>2];G[a+52>>2]=t;t=G[l+36>>2];G[a+64>>2]=G[l+32>>2];G[a+68>>2]=t;t=G[l+44>>2];G[a+80>>2]=G[l+40>>2];G[a+84>>2]=t;t=G[l+52>>2];G[a+96>>2]=G[l+48>>2];G[a+100>>2]=t;t=G[l+60>>2];G[a+112>>2]=G[l+56>>2];G[a+116>>2]=t;l=l- -64|0;a=a+128|0;s=s+8|0;if((ba|0)!=(s|0)){continue}break}}s=0;if(!P){break Ia}while(1){t=G[l+4>>2];G[a>>2]=G[l>>2];G[a+4>>2]=t;l=l+8|0;a=a+16|0;s=s+1|0;if((P|0)!=(s|0)){continue}break}}y=y+1|0;if((y|0)!=(ra|0)){continue}break}}U=(n&1)<<31|U>>>1;n=n>>1;D=(ea|0)<=0;if(!D){a=V+(A?-1:0)|0;e=ra+1>>1;l=a-e|0;y=l&3;Z=l-1|0;R=e-1|0;l=R>>31&R;na=e-l&3;fa=e+(l^-1)|0;ga=M(e,W);ba=a-2|0;a=(ba>>>1|0)+1|0;X=a&-4;V=a&3;$=M(R,W);da=$<<1;P=0;while(1){C=S+(P<<3)|0;Ja:{if((e|0)>=(ra|0)){break Ja}l=C+(ga<<3)|0;t=0;a=aa;s=e;if(y){while(1){A=G[l+4>>2];G[a>>2]=G[l>>2];G[a+4>>2]=A;s=s+1|0;a=a+8|0;l=l+(W<<3)|0;t=t+1|0;if((y|0)!=(t|0)){continue}break}}if(Z>>>0<3){break Ja}while(1){t=G[l+4>>2];G[a>>2]=G[l>>2];G[a+4>>2]=t;t=l;l=W<<3;t=t+l|0;A=G[t+4>>2];G[a+8>>2]=G[t>>2];G[a+12>>2]=A;t=l+t|0;A=G[t+4>>2];G[a+16>>2]=G[t>>2];G[a+20>>2]=A;t=l+t|0;A=G[t+4>>2];G[a+24>>2]=G[t>>2];G[a+28>>2]=A;l=l+t|0;a=a+32|0;s=s+4|0;if((ra|0)!=(s|0)){continue}break}}Ka:{if(J){break Ka}a=C+($<<3)|0;l=C+(da<<3)|0;t=0;s=R;if(na){while(1){A=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=A;s=s-1|0;l=l+(Qa<<3)|0;a=a+(Pa<<3)|0;t=t+1|0;if((na|0)!=(t|0)){continue}break}}if(fa>>>0>=3){while(1){t=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=t;t=a;a=Pa<<3;A=t+a|0;Y=G[A+4>>2];t=l;l=Qa<<3;t=t+l|0;G[t>>2]=G[A>>2];G[t+4>>2]=Y;A=a+A|0;Y=G[A+4>>2];t=l+t|0;G[t>>2]=G[A>>2];G[t+4>>2]=Y;A=a+A|0;Y=G[A+4>>2];t=l+t|0;G[t>>2]=G[A>>2];G[t+4>>2]=Y;l=l+t|0;a=a+A|0;t=(s|0)>3;s=s-4|0;if(t){continue}break}}if((ra|0)<2){break Ka}l=C+(W<<3)|0;t=0;a=aa;if(ba>>>0>=6){while(1){s=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=s;C=G[a+12>>2];s=l;l=Ca<<3;s=s+l|0;G[s>>2]=G[a+8>>2];G[s+4>>2]=C;C=G[a+20>>2];s=l+s|0;G[s>>2]=G[a+16>>2];G[s+4>>2]=C;C=G[a+28>>2];s=l+s|0;G[s>>2]=G[a+24>>2];G[s+4>>2]=C;l=l+s|0;a=a+32|0;t=t+4|0;if((X|0)!=(t|0)){continue}break}}s=0;if(!V){break Ka}while(1){t=G[a+4>>2];G[l>>2]=G[a>>2];G[l+4>>2]=t;a=a+8|0;l=l+(Ca<<3)|0;s=s+1|0;if((V|0)!=(s|0)){continue}break}}P=P+1|0;if((P|0)!=(ea|0)){continue}break}}na=x;R=m;V=k;C=p;fa=r;ga=v;Oa=U-1|0;Xa=n-!U|0;La:{if(Va){break La}Ka=ra-2|0;ba=(ra|0)<5;if(!ba){y=2;if(D){break La}while(1){a=M(y,W);l=W+a|0;s=0;while(1){p=S+(a+Ca<<3)|0;e=G[p>>2];r=S+(a<<3)|0;k=G[r>>2];v=e-k|0;t=S+(a-Ca<<3)|0;m=G[t>>2];x=k-m|0;A=G[p+4>>2];p=G[r+4>>2];r=A-(p+(e>>>0>>0)|0)|0;D=G[t+4>>2];t=p-(D+(k>>>0>>0)|0)|0;k=v>>>0>x>>>0&(r|0)>=(t|0)|(r|0)>(t|0);p=k?v:x;P=k?r:t;k=P>>31;P=k&P;k=p&k;p=P<<2|k>>>30;P=k<<2;k=v>>>0>>0&(r|0)<=(t|0)|(r|0)<(t|0);v=k?v:x;k=k?r:t;r=!!v&(k|0)>=0|(k|0)>0;t=r?v:0;k=r?k:0;r=t;v=r<<2;k=k<<2|r>>>30;if(P>>>0>>0&(k|0)>=(p|0)|(k|0)>(p|0)){t=A-((e>>>0>>0)+D|0)|0;e=e-m|0;m=e;e=e>>>0>>0&(k|0)>=(t|0)|(k|0)>(t|0);m=e?m:v;r=m;e=e?t:k;m=(p|0)<=(e|0)&m>>>0>P>>>0|(e|0)>(p|0);k=m?r:P;t=m?e:p;r=S+(l<<3)|0;e=G[r+4>>2];v=e;m=G[r>>2];e=e<<3|m>>>29;p=m<<3;e=t-((k>>>0

>>0)+e|0)|0;k=k-p|0;t=k+7|0;p=t>>>0<7?e+1|0:e;x=k;k=(e|0)<0;t=k?t:x;k=k?p:e;p=t;e=k>>3;k=(k&7)<<29|p>>>3;p=k;k=k>>>0>>0&(e|0)<=(va|0)|(e|0)<(va|0);p=k?p:Ea;t=p;k=k?e:va;e=k;p=(xa|0)<=(e|0)&p>>>0>Ga>>>0|(e|0)>(xa|0);e=m+(p?t:Ga)|0;p=v+(p?k:xa)|0;G[r>>2]=e;G[r+4>>2]=e>>>0>>0?p+1|0:p}l=l+2|0;a=a+2|0;s=s+2|0;if((ea|0)>(s|0)){continue}break}y=y+2|0;if((Ka|0)>(y|0)){continue}break}}if(!((ea|0)<5|J)){X=ea-2|0;y=0;while(1){a=M(y,W);e=S+(a<<3)|0;r=G[e>>2];v=G[e+4>>2];l=2;a=a+2|0;e=S+(a<<3)|0;x=G[e>>2];m=G[e+4>>2];while(1){s=x;t=m;J=a+2|0;k=S+(J<<3)|0;x=G[k>>2];e=s;A=x-e|0;D=e-r|0;m=G[k+4>>2];k=m-((e>>>0>x>>>0)+t|0)|0;P=t-((e>>>0>>0)+v|0)|0;e=A>>>0>D>>>0&(k|0)>=(P|0)|(k|0)>(P|0);p=e?A:D;Z=e?k:P;e=Z>>31;Z=e&Z;e=p&e;p=Z<<2|e>>>30;Z=e<<2;e=A>>>0>>0&(k|0)<=(P|0)|(k|0)<(P|0);A=e?A:D;e=e?k:P;k=!!A&(e|0)>=0|(e|0)>0;P=k?A:0;e=k?e:0;k=P;P=k<<2;e=e<<2|k>>>30;if(Z>>>0

>>0&(e|0)>=(p|0)|(e|0)>(p|0)){k=m-((r>>>0>x>>>0)+v|0)|0;r=x-r|0;v=r;r=r>>>0

>>0&(e|0)>=(k|0)|(e|0)>(k|0);v=r?v:P;k=r?k:e;e=k;r=(p|0)<=(e|0)&v>>>0>Z>>>0|(e|0)>(p|0);e=r?v:Z;v=r?k:p;a=S+(a<<3|8)|0;k=G[a+4>>2];P=k;r=G[a>>2];p=r;k=k<<3|p>>>29;p=p<<3;k=v-((e>>>0

>>0)+k|0)|0;v=e-p|0;e=a;a=k;k=v+7|0;p=k>>>0<7?a+1|0:a;D=k;k=(a|0)<0;v=k?D:v;a=k?p:a;p=v;k=a>>3;a=(a&7)<<29|p>>>3;p=a;a=a>>>0>>0&(k|0)<=(va|0)|(k|0)<(va|0);p=a?p:Ea;v=p;k=a?k:va;a=k;p=(xa|0)<=(a|0)&p>>>0>Ga>>>0|(a|0)>(xa|0);a=r+(p?v:Ga)|0;p=P+(p?k:xa)|0;G[e>>2]=a;G[e+4>>2]=a>>>0>>0?p+1|0:p}r=s;v=t;a=J;l=l+2|0;if((X|0)>(l|0)){continue}break}y=y+2|0;if((y|0)<(ra|0)){continue}break}}if((ea|0)<5|ba){break La}Ya=ea-2|0;t=2;while(1){a=M(t,W)+2|0;l=W+a|0;s=2;while(1){J=S+(a+Ca<<3)|0;e=J;x=G[e+16>>2];m=a<<3;p=m+S|0;k=G[p>>2];D=x-k|0;Ra=G[e+20>>2];Y=G[p+4>>2];Z=Ra-(Y+(k>>>0>x>>>0)|0)|0;e=Z>>31;P=e&D;ba=e&Z;e=S+(m|8)|0;m=G[e+4>>2];e=G[e>>2];r=e<<1;p=m<<1|e>>>31;v=p;e=p;ka=S+(l<<3)|0;m=ka;p=G[m+4>>2];m=G[m>>2];p=p<<1|m>>>31;m=m<<1;y=m+r|0;A=p;e=p+e|0;e=m>>>0>y>>>0?e+1|0:e;Da=e;p=ba-(e+(y>>>0>P>>>0)|0)|0;P=P-y|0;e=J-16|0;ua=G[e>>2];ba=k-ua|0;Sa=G[e+4>>2];X=Y-(Sa+(k>>>0>>0)|0)|0;e=X>>31;J=m+(e&ba)|0;e=A+(e&X)|0;e=m>>>0>J>>>0?e+1|0:e;e=e-((r>>>0>J>>>0)+v|0)|0;$=P;J=J-r|0;P=(e|0)<=(p|0)&P>>>0>J>>>0|(e|0)<(p|0);_=P?$:J;e=P?p:e;Ha=e;J=S+(a-Ca<<3)|0;e=J;P=G[e+16>>2];$=k-P|0;Ta=G[e+20>>2];da=Y-(Ta+(k>>>0

>>0)|0)|0;e=da>>31;p=e&$;ia=(e&da)-((m>>>0>p>>>0)+A|0)|0;za=p-m|0;e=J-16|0;J=G[e>>2];La=G[e+4>>2];Y=La-((k>>>0>J>>>0)+Y|0)|0;e=J-k|0;k=Y>>31;Ma=m+(e&k)|0;k=A+(k&Y)|0;Za=za;p=Ma;k=m>>>0>p>>>0?k+1|0:k;za=p>>>0>>0&(k|0)<=(ia|0)|(k|0)<(ia|0);p=r+(za?Za:p)|0;k=v+(za?ia:k)|0;k=p>>>0>>0?k+1|0:k;ia=p;p=p>>>0<_>>>0&(k|0)<=(Ha|0)|(k|0)<(Ha|0);_=p?_:ia;p=p?Ha:k;k=_;_=k<<4;p=p<<4|k>>>28;ia=p;k=!!D&(Z|0)>=0|(Z|0)>0;p=k?D:0;k=(k?Z:0)-((p>>>0>>0)+Da|0)|0;y=p-y|0;p=!!ba&(X|0)>=0|(X|0)>0;D=m+(p?ba:0)|0;p=A+(p?X:0)|0;p=m>>>0>D>>>0?p+1|0:p;p=p-((r>>>0>D>>>0)+v|0)|0;D=D-r|0;Z=D;D=y>>>0>>0&(k|0)<=(p|0)|(k|0)<(p|0);y=D?y:Z;k=D?k:p;p=k;Z=r;k=!!$&(da|0)>=0|(da|0)>0;D=k?$:0;k=(k?da:0)-((m>>>0>D>>>0)+A|0)|0;r=e;e=!!e&(Y|0)>=0|(Y|0)>0;r=m+(e?r:0)|0;e=A+(e?Y:0)|0;e=m>>>0>r>>>0?e+1|0:e;D=D-m|0;m=r;r=m>>>0>D>>>0&(e|0)>=(k|0)|(e|0)>(k|0);A=r?D:m;m=Z+A|0;k=(r?k:e)+v|0;e=m;k=e>>>0>>0?k+1|0:k;e=(p|0)<=(k|0)&e>>>0>y>>>0|(k|0)>(p|0);m=e?y:m;k=e?p:k;e=m;r=e<<4;k=k<<4|e>>>28;p=k;if(r>>>0>_>>>0&(k|0)>=(ia|0)|(k|0)>(ia|0)){m=ka;e=Sa+Ta|0;k=P+ua|0;e=k>>>0

>>0?e+1|0:e;v=x+(J-k|0)|0;k=Ra+(La-((k>>>0>J>>>0)+e|0)|0)|0;e=v;k=e>>>0>>0?k+1|0:k;e=e>>>0>>0&(k|0)<=(p|0)|(k|0)<(p|0);r=e?v:r;k=e?k:p;e=k;p=(ia|0)<=(e|0)&r>>>0>_>>>0|(e|0)>(ia|0);e=p?r:_;v=p?k:ia;k=G[m+12>>2];x=k;p=G[m+8>>2];k=k<<6|p>>>26;r=p<<6;k=v-((e>>>0>>0)+k|0)|0;r=e-r|0;e=k;v=r+63|0;e=v>>>0<63?e+1|0:e;y=r;r=(k|0)<0;v=r?v:y;e=r?e:k;r=v;k=e>>6;e=(e&63)<<26|r>>>6;r=e;e=e>>>0>>0&(k|0)<=(va|0)|(k|0)<(va|0);r=e?r:Ea;v=r;k=e?k:va;e=k;r=(xa|0)<=(e|0)&r>>>0>Ga>>>0|(e|0)>(xa|0);e=p+(r?v:Ga)|0;k=x+(r?k:xa)|0;G[m+8>>2]=e;G[m+12>>2]=e>>>0

>>0?k+1|0:k}l=l+2|0;a=a+2|0;s=s+2|0;if((Ya|0)>(s|0)){continue}break}t=t+2|0;if((Ka|0)>(t|0)){continue}break}}La=(q|0)>(ha|0);Ka=(ha|0)<(Ba|0);oa=ya?oa:2;r=ya?Oa:0;v=ya?Xa:0;ua=(ea|0)%2|0;za=(ra|0)%2|0;Ma=ra-za|0;Ma:{if((Ma|0)<=0){s=0;break Ma}Ha=ea-ua|0;m=oa;s=0;while(1){a=M(s,W);l=W+a|0;t=0;if((Ha|0)>0){while(1){y=S+(l<<3)|0;e=y;k=G[e+12>>2];e=G[e+8>>2];p=(k|0)<0;x=e+(p?r:U)|0;p=k+(p?v:n)|0;p=e>>>0>x>>>0?p+1|0:p;P=x&na;e=V&P;Da=p&R;k=C&Da;Z=k;J=k;x=0-e|0;k=0-(((e|0)!=0)+k|0)|0;D=k;A=G[y>>2];X=G[y+4>>2];$=(X|0)<0;ba=A+($?fa:la)|0;p=X+($?ga:sa)|0;p=A>>>0>ba>>>0?p+1|0:p;A=ba&wa;p=p&pa;ba=p;X=(p|0)<0;p=A+(X?e:x)|0;k=ba+(X?J:k)|0;J=p;$=P^p;A=p>>>0>>0?k+1|0:k;da=Da^A;Y=a<<3;X=S+(Y|8)|0;k=X;p=G[k+4>>2];k=G[k>>2];ka=(p|0)<0;ba=k+(ka?fa:la)|0;p=p+(ka?ga:sa)|0;p=k>>>0>ba>>>0?p+1|0:p;k=ba&wa;p=p&pa;ba=p;_=$;$=(p|0)<0;p=k;x=($?e:x)+k|0;k=ba+($?Z:D)|0;k=p>>>0>x>>>0?k+1|0:k;p=qa&(_^x);ba=k;da=ta&(k^da);$=S+Y|0;k=$;D=G[k+4>>2];k=G[k>>2];Na:{if((D|0)>0|(D|0)>=0){Y=e+k|0;e=D+Z|0;e=k>>>0>Y>>>0?e+1|0:e;k=Y;D=k-p|0;Z=e-((k>>>0

>>0)+da|0)|0;break Na}ka=!(e|Z);Y=k+(ka?p:e-p|0)|0;p=D+(ka?da:Z-((e>>>0

>>0)+da|0)|0)|0;D=Y;Z=k>>>0>D>>>0?p+1|0:p}e=Z+A|0;k=J+D|0;e=k>>>0>>0?e+1|0:e;p=k;da=e;k=ba+Da|0;Y=x+P|0;k=Y>>>0>>0?k+1|0:k;_=Y+p|0;ka=k;e=k+e|0;e=Y>>>0>_>>>0?e+1|0:e;k=e;Oa=_;ia=m&31;_=y;if((m&63)>>>0>=32){e=k>>31;k=k>>ia}else{e=k>>ia;k=((1<>>ia}G[y+8>>2]=k;G[_+12>>2]=e;e=p-Y|0;p=da-((p>>>0>>0)+ka|0)|0;da=e;k=m&31;if((m&63)>>>0>=32){e=p>>31;k=p>>k}else{e=p>>k;k=((1<>>k}G[y>>2]=k;G[y+4>>2]=e;k=X;y=D-J|0;X=x-P|0;p=y+X|0;A=Z-((J>>>0>D>>>0)+A|0)|0;e=A+(ba-((x>>>0

>>0)+Da|0)|0)|0;e=p>>>0>>0?e+1|0:e;D=p;J=m&31;if((m&63)>>>0>=32){p=e>>31;e=e>>J}else{p=e>>J;e=((1<>>J}G[k>>2]=e;G[k+4>>2]=p;e=A+(Da-((x>>>0>P>>>0)+ba|0)|0)|0;p=y+(P-x|0)|0;e=p>>>0>>0?e+1|0:e;y=p;x=m&31;k=$;if((m&63)>>>0>=32){p=e>>31;e=e>>x}else{p=e>>x;e=((1<>>x}G[k>>2]=e;G[k+4>>2]=p;l=l+2|0;a=a+2|0;t=t+2|0;if((Ha|0)>(t|0)){continue}break}}if(ua){l=S+(l<<3)|0;t=l;e=G[l>>2];k=G[l+4>>2];p=(k|0)<0;l=e+(p?fa:la)|0;k=k+(p?ga:sa)|0;k=e>>>0>l>>>0?k+1|0:k;l=l&wa;e=qa&l;p=e;x=0-e|0;y=x;x=S+(a<<3)|0;a=x;e=G[a+4>>2];a=G[a>>2];J=(e|0)<0;y=(J?p:y)+a|0;P=k&pa;k=ta&P;p=e+(J?k:0-(((p|0)!=0)+k|0)|0)|0;p=a>>>0>y>>>0?p+1|0:p;k=y;a=l+k|0;e=p+P|0;y=a;a=a>>>0>>0?e+1|0:e;J=y;y=m&31;if((m&63)>>>0>=32){e=a>>31;a=a>>y}else{e=a>>y;a=((1<>>y}G[t>>2]=a;G[t+4>>2]=e;a=k-l|0;l=p-((k>>>0>>0)+P|0)|0;k=a;a=m&31;if((m&63)>>>0>=32){e=l>>31;a=l>>a}else{e=l>>a;a=((1<>>a}G[x>>2]=a;G[x+4>>2]=e}s=s+2|0;if((Ma|0)>(s|0)){continue}break}}J=La?ha:0;A=Ka?ha:0;Oa:{if(!za){break Oa}a=M(s,W);D=ea-ua|0;if((D|0)>0){l=0;while(1){p=a<<3;k=S+(p|8)|0;s=k;e=G[k>>2];k=G[k+4>>2];t=(k|0)<0;m=e+(t?fa:la)|0;k=k+(t?ga:sa)|0;k=e>>>0>m>>>0?k+1|0:k;m=m&wa;e=qa&m;Z=e;t=0-e|0;y=t;t=p+S|0;e=t;x=G[e+4>>2];e=G[e>>2];ba=(x|0)<0;p=e;y=(ba?Z:y)+e|0;P=k&pa;e=ta&P;e=x+(ba?e:0-(((Z|0)!=0)+e|0)|0)|0;e=p>>>0>y>>>0?e+1|0:e;k=y;y=m+k|0;x=e;p=P+e|0;p=m>>>0>y>>>0?p+1|0:p;e=p;Z=y;p=oa;y=p&31;if((p&63)>>>0>=32){p=e>>31;e=e>>y}else{p=e>>y;e=((1<>>y}G[s>>2]=e;G[s+4>>2]=p;e=k-m|0;m=x-((k>>>0>>0)+P|0)|0;s=e;e=oa;k=e&31;if((e&63)>>>0>=32){p=m>>31;e=m>>k}else{p=m>>k;e=((1<>>k}G[t>>2]=e;G[t+4>>2]=p;a=a+2|0;l=l+2|0;if((D|0)>(l|0)){continue}break}}if(!ua){break Oa}a=S+(a<<3)|0;l=a;m=a;e=G[a+4>>2];k=G[a>>2];a=oa&31;if((oa&63)>>>0>=32){p=e>>31;a=e>>a}else{p=e>>a;a=((1<>>a}G[m>>2]=a;G[l+4>>2]=p}q=q-J|0;Ba=Ba-A|0;a=ya-1|0;x=(R&1)<<31|na>>>1;m=R>>1;p=C>>1;k=(C&1)<<31|V>>>1;qa=V;ta=C;la=U;sa=n;wa=na;pa=R;if((ya|0)>0){continue}break}}Wa(aa);a=0}G[j>>2]=a;e=M(G[Ja>>2],G[o+20>>2]);if((e|0)<=0){break Ba}l=0;a=0;if(e-1>>>0>=3){k=e&-4;s=0;while(1){G[S+(a<<2)>>2]=G[S+(a<<3)>>2];m=a|1;G[S+(m<<2)>>2]=G[S+(m<<3)>>2];m=a|2;G[S+(m<<2)>>2]=G[S+(m<<3)>>2];m=a|3;G[S+(m<<2)>>2]=G[S+(m<<3)>>2];a=a+4|0;s=s+4|0;if((k|0)!=(s|0)){continue}break}}e=e&3;if(e){while(1){G[S+(a<<2)>>2]=G[S+(a<<3)>>2];a=a+1|0;l=l+1|0;if((e|0)!=(l|0)){continue}break}}a=G[j>>2]}Fa=Na+16|0}m=a;G[j>>2]=a;e=0;a=1;l=0;break O}a=1;t=G[o+72>>2];e=F[g+4>>1];Pa:{if((e|0)>0){v=e&65535;r=4;break Pa}v=F[g+6>>1]+(F[g+8>>1]<<15)|0;r=F[g+2>>1]+1|0}if(!((c|0)<=0|(v|0)<=0)){q=1;Qa:{if((r|0)>(v|0)){k=1;break Qa}oa=g-2|0;p=t-4|0;x=c+1|0;aa=x-1|0;k=1;s=1;while(1){Ra:{if(n){n=0;break Ra}n=0;U=F[oa+(r<<1)>>1];Sa:{if((U|0)<-4095){break Sa}e=U&4095;Ta:{Ua:{switch((U|0)/4096&65535){case 0:case 4:case 5:e=e+s|0;l=e-1|0;R=(l|0)<(aa|0)?l:aa;C=(s|0)>1?s:1;m=R-C|0;if((m|0)<0){s=e;break Sa}s=k+m|0;S=k+1|0;l=S+m|0;U=U&-4096;Va:{if((U|0)!=16384){if((k|0)<=(s|0)){cb(p+(k<<2)|0,0,(m<<2)+4|0)}if((U|0)!=20480|(e|0)>(x|0)){break Va}G[p+(s<<2)>>2]=q;break Va}if((k|0)>(s|0)){break Va}s=m+1&7;if(s){while(1){G[p+(k<<2)>>2]=q;k=k+1|0;n=n+1|0;if((s|0)!=(n|0)){continue}break}}n=0;if(m>>>0<7){break Va}s=(S+R|0)-C|0;while(1){U=k<<2;m=U+p|0;G[m>>2]=q;G[t+U>>2]=q;G[m+28>>2]=q;G[m+24>>2]=q;G[m+20>>2]=q;G[m+16>>2]=q;G[m+12>>2]=q;G[m+8>>2]=q;k=k+8|0;if((s|0)!=(k|0)){continue}break}}s=e;k=l;break Sa;case 6:q=e+q|0;break Ta;case 2:q=e+q|0;break Sa;case 3:q=q-e|0;break Sa;case 7:q=q-e|0;break Ta;case 1:break Ua;default:break Sa}}n=1;q=e|F[(r<<1)+g>>1]<<12;break Sa}if(!((s|0)<=0|(s|0)>=(x|0))){G[p+(k<<2)>>2]=q;k=k+1|0}s=s+1|0}if((s|0)>=(x|0)){break Qa}}e=(r|0)!=(v|0);r=r+1|0;if(e){continue}break}}if((c|0)>=(k|0)){cb((t+(k<<2)|0)-4|0,0,(c-k<<2)+4|0)}}e=0;break P}Qi(g,G[o+8>>2],o+72|0,o+68|0,17,o- -64|0,j);a=G[o+64>>2];if((a|0)==c<<1){if(G[G[T+4>>2]+1048>>2]==22){n=G[o+72>>2];e=c<<1;p=ab(e);a=c>>31;Wa:{if(!c&(a|0)<=0|(a|0)<0){break Wa}s=0-c|0;q=e+n|0;l=e+p|0;if((c|0)!=1|a){r=c&-2;m=0;while(1){k=q-1|0;E[l-1|0]=H[k|0];E[l-2|0]=H[k+s|0];q=q-2|0;E[l-3|0]=H[q|0];l=l-4|0;E[l|0]=H[q+s|0];k=m;m=x+2|0;k=m>>>0<2?k+1|0:k;x=m;m=k;if((r|0)!=(x|0)|(a|0)!=(k|0)){continue}break}}if(!(c&1)){break Wa}a=q-1|0;E[l-1|0]=H[a|0];E[l-2|0]=H[a+s|0]}bb(n,p,e);Wa(p)}Af(G[o+72>>2],c);e=1;a=0;break P}if((a|0)==c<<2){if(G[G[T+4>>2]+1048>>2]==22){s=G[o+72>>2];m=0;e=c>>31;r=e;a=c;k=a<<2;p=ab(k);if(!!a&(e|0)>=0|(e|0)>0){q=M(a,-3);t=0-a|0;n=k+s|0;l=k+p|0;a=0-(a<<1)|0;while(1){n=n-1|0;E[l-1|0]=H[n|0];E[l-2|0]=H[n+t|0];E[l-3|0]=H[a+n|0];l=l-4|0;E[l|0]=H[n+q|0];e=m;m=x+1|0;e=m?e:e+1|0;x=m;m=e;if((c|0)!=(x|0)|(r|0)!=(e|0)){continue}break}}bb(s,p,k);Wa(p)}ke(G[o+72>>2],c);e=0;a=1;break P}if((a|0)==c<<3){if(G[G[T+4>>2]+1048>>2]==22){k=G[o+72>>2];m=0;p=c>>31;s=p;a=c;e=a<<3;l=ab(e);if(!!a&(p|0)>=0|(p|0)>0){n=M(a,-7);r=M(a,-6);q=M(a,-5);t=M(a,-3);v=0-a|0;ha=e+k|0;y=e+l|0;U=0-(a<<2)|0;a=0-(a<<1)|0;while(1){ha=ha-1|0;E[y-1|0]=H[ha|0];E[y-2|0]=H[v+ha|0];E[y-3|0]=H[a+ha|0];E[y-4|0]=H[t+ha|0];E[y-5|0]=H[U+ha|0];E[y-6|0]=H[q+ha|0];E[y-7|0]=H[r+ha|0];y=y-8|0;E[y|0]=H[n+ha|0];p=m;m=x+1|0;p=m?p:p+1|0;x=m;m=p;if((c|0)!=(x|0)|(s|0)!=(m|0)){continue}break}}bb(k,l,e);Wa(l)}Ge(G[o+72>>2],c);a=0;e=0;break P}if((a|0)==(c|0)){a=0;e=0;m=G[j>>2];l=1;break O}Ua(19778);Wa(G[o+72>>2]);break e}Ua(10657);Wa(G[o+72>>2]);Wa(g);break e}Ua(16244);Wa(G[o+72>>2]);break e}q=G[o+72>>2];n=a;m=g+2|0;v=G[o+8>>2]+g|0;a=H[g+1|0];t=H[g|0];e=8;Xa:{Ya:{Za:{while(1){if((c|0)<=(l|0)){break Za}k=e-3|0;if((e|0)<=2){while(1){a=H[m|0]|a<<8;e=k>>>0<4294967288;m=m+1|0;k=k+8|0;if(e){continue}break}}e=l+n|0;p=(c|0)>(e|0)?e:c;x=-1<>>k|0)-1|0;bb:{if((s|0)<0){if((l|0)>=(p|0)){break bb}cb(l+q|0,t,p-l|0);break $a}if((s|0)!=6){if((l|0)>=(p|0)){break _a}while(1){if(!e){while(1){k=k+8|0;e=H[m|0];m=m+1|0;if(!e){continue}break}}a=k-G[(e<<2)+103808>>2]|0;k=(a^-1)+k|0;e=1<>>0<4294967288;m=m+1|0;k=k+8|0;if(r){continue}break}}a=a<>>k;a=(a>>>1^0-(a&1))+t|0;E[l+q|0]=a;t=a&255;e=(-1<0){s=m;r=k;break cb}s=m+1|0;a=H[m|0]|a;r=8}db:{if(!k){e=0;m=s;break db}m=s+1|0;s=H[s|0];e=s&x;a=s>>>r|a}a=(0-(a&1)^a>>>1)+t|0;E[l+q|0]=a;t=a&255;l=l+1|0;if((p|0)!=(l|0)){continue}break}}l=p}a=e;e=k;if(m>>>0<=v>>>0){continue}break}k=1;e=16504;break Ya}k=0;e=11554;if(m>>>0>=v>>>0){break Xa}}Ua(e)}m=k;G[j>>2]=k;a=0;e=0;l=1;break O}m=G[j>>2];l=0}Wa(g);if(m){Wa(G[o+72>>2]);break a}f=f?f:o+24|0;eb:{fb:{switch(d-11|0){case 10:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){e=F[f>>1];f=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];g=G[o+72>>2];if(a){Xk(g,c,w,u,B,e,h,i,f,j);a=2;break eb}Wk(g,c,w,u,B,e,h,i,f,j);a=2;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){Yk(a,c,z,u+-32768,B,G[o+60>>2],F[f>>1],h,i,G[o+76>>2],j);a=2;break eb}Yk(a,c,z,u,B,G[o+60>>2],F[f>>1],h,i,G[o+76>>2],j);a=2;if(G[G[T+4>>2]+1048>>2]!=41){break eb}e=G[j>>2];if((e|0)!=412&(e|0)!=-11){break eb}G[j>>2]=0;break eb}if(e){Op(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],F[f>>1],h,i,G[o+76>>2],j);a=2;break eb}a=2;if(!l){break eb}Np(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],F[f>>1],h,i,G[o+76>>2],j);break eb;case 20:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){e=G[f>>2];f=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];g=G[o+72>>2];if(a){Rp(g,c,w,u,B,e,h,i,f,j);a=4;break eb}Qp(g,c,w,u,B,e,h,i,f,j);a=4;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){Tp(a,c,z,u+-32768,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}Tp(a,c,z,u,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}if(e){g=G[o+72>>2];l=I[o+60>>1];s=G[f>>2];e=G[o+76>>2];k=0;w=L[o+40>>3];z=L[o+32>>3];a=w==1&z==0;gb:{hb:{if(!B){if(a){break hb}n=0;if((c|0)<=0){break gb}while(1){f=e+(n<<2)|0;ib:{jb:{u=+F[g+(n<<1)>>1]*w+z;if(u<-2147483648.49){G[j>>2]=-11;break jb}if(u>2147483647.49){G[j>>2]=-11;a=2147483647;break ib}if(!(O(u)<2147483648)){break jb}a=~~u;break ib}a=-2147483648}G[f>>2]=a;n=n+1|0;if((n|0)!=(c|0)){continue}break}break gb}if(!a){if((c|0)<=0){break gb}n=0;while(1){a=I[g+(n<<1)>>1];kb:{if((a|0)==(l|0)){G[i>>2]=1;if((B|0)==1){G[e+(n<<2)>>2]=s;break kb}E[h+n|0]=1;break kb}u=+(a<<16>>16)*w+z;if(u<-2147483648.49){G[j>>2]=-11;G[e+(n<<2)>>2]=-2147483648;break kb}if(u>2147483647.49){G[j>>2]=-11;G[e+(n<<2)>>2]=2147483647;break kb}f=e+(n<<2)|0;if(O(u)<2147483648){a=~~u}else{a=-2147483648}G[f>>2]=a}n=n+1|0;if((n|0)!=(c|0)){continue}break}break gb}if((c|0)<=0){break gb}if((B|0)!=1){n=0;if((c|0)!=1){f=c&-2;while(1){a=I[g+(n<<1)>>1];lb:{if((a|0)==(l|0)){G[i>>2]=1;E[h+n|0]=1;break lb}G[e+(n<<2)>>2]=a<<16>>16}a=n|1;j=I[g+(a<<1)>>1];mb:{if((j|0)!=(l|0)){G[e+(a<<2)>>2]=j<<16>>16;break mb}G[i>>2]=1;E[a+h|0]=1}n=n+2|0;k=k+2|0;if((f|0)!=(k|0)){continue}break}}if(!(c&1)){break gb}a=I[g+(n<<1)>>1];if((a|0)!=(l|0)){G[e+(n<<2)>>2]=a<<16>>16;break gb}G[i>>2]=1;E[h+n|0]=1;break gb}n=0;if((c|0)!=1){f=c&-2;while(1){j=e+(n<<2)|0;a=I[g+(n<<1)>>1];nb:{if((a|0)!=(l|0)){a=a<<16>>16;break nb}G[i>>2]=1;a=s}G[j>>2]=a;j=n|1;a=I[g+(j<<1)>>1];ob:{if((a|0)!=(l|0)){a=a<<16>>16;break ob}G[i>>2]=1;a=s}G[e+(j<<2)>>2]=a;n=n+2|0;k=k+2|0;if((f|0)!=(k|0)){continue}break}}if(!(c&1)){break gb}a=I[g+(n<<1)>>1];pb:{if((a|0)!=(l|0)){s=a<<16>>16;break pb}G[i>>2]=1}G[e+(n<<2)>>2]=s;break gb}if((c|0)<=0){break gb}n=0;if(c-1>>>0>=3){a=c&-4;f=0;while(1){G[e+(n<<2)>>2]=F[g+(n<<1)>>1];j=n|1;G[e+(j<<2)>>2]=F[g+(j<<1)>>1];j=n|2;G[e+(j<<2)>>2]=F[g+(j<<1)>>1];j=n|3;G[e+(j<<2)>>2]=F[g+(j<<1)>>1];n=n+4|0;f=f+4|0;if((a|0)!=(f|0)){continue}break}}a=c&3;if(!a){break gb}while(1){G[e+(n<<2)>>2]=F[g+(n<<1)>>1];n=n+1|0;k=k+1|0;if((a|0)!=(k|0)){continue}break}}a=4;break eb}a=4;if(!l){break eb}l=G[o+72>>2];k=H[o+60|0];e=G[f>>2];g=G[o+76>>2];w=L[o+40>>3];z=L[o+32>>3];f=w==1&z==0;qb:{rb:{if(!B){if(f){break rb}n=0;if((c|0)<=0){break qb}while(1){f=g+(n<<2)|0;sb:{tb:{u=+H[l+n|0]*w+z;if(u<-2147483648.49){G[j>>2]=-11;break tb}if(u>2147483647.49){G[j>>2]=-11;e=2147483647;break sb}if(!(O(u)<2147483648)){break tb}e=~~u;break sb}e=-2147483648}G[f>>2]=e;n=n+1|0;if((n|0)!=(c|0)){continue}break}break qb}if(!f){if((c|0)<=0){break qb}n=0;while(1){f=H[l+n|0];ub:{if((f|0)==(k|0)){G[i>>2]=1;if((B|0)==1){G[g+(n<<2)>>2]=e;break ub}E[h+n|0]=1;break ub}u=+(f>>>0)*w+z;if(u<-2147483648.49){G[j>>2]=-11;G[g+(n<<2)>>2]=-2147483648;break ub}if(u>2147483647.49){G[j>>2]=-11;G[g+(n<<2)>>2]=2147483647;break ub}p=g+(n<<2)|0;if(O(u)<2147483648){f=~~u}else{f=-2147483648}G[p>>2]=f}n=n+1|0;if((n|0)!=(c|0)){continue}break}break qb}if((c|0)<=0){break qb}if((B|0)!=1){n=0;if((c|0)!=1){j=c&-2;f=0;while(1){e=H[l+n|0];vb:{if((e|0)==(k|0)){G[i>>2]=1;E[h+n|0]=1;break vb}G[g+(n<<2)>>2]=e}e=n|1;m=H[e+l|0];wb:{if((m|0)!=(k|0)){G[g+(e<<2)>>2]=m;break wb}G[i>>2]=1;E[e+h|0]=1}n=n+2|0;f=f+2|0;if((j|0)!=(f|0)){continue}break}}if(!(c&1)){break qb}e=H[l+n|0];if((e|0)!=(k|0)){G[g+(n<<2)>>2]=e;break qb}G[i>>2]=1;E[h+n|0]=1;break qb}n=0;if((c|0)!=1){j=c&-2;m=0;while(1){p=g+(n<<2)|0;f=H[l+n|0];if((f|0)==(k|0)){G[i>>2]=1;f=e}G[p>>2]=f;p=n|1;f=H[p+l|0];if((k|0)==(f|0)){G[i>>2]=1;f=e}G[g+(p<<2)>>2]=f;n=n+2|0;m=m+2|0;if((j|0)!=(m|0)){continue}break}}if(!(c&1)){break qb}g=g+(n<<2)|0;f=H[l+n|0];if((f|0)==(k|0)){G[i>>2]=1}else{e=f}G[g>>2]=e;break qb}if((c|0)<=0){break qb}s=0;n=0;if(c-1>>>0>=3){e=c&-4;f=0;while(1){G[g+(n<<2)>>2]=H[l+n|0];j=n|1;G[g+(j<<2)>>2]=H[j+l|0];j=n|2;G[g+(j<<2)>>2]=H[j+l|0];j=n|3;G[g+(j<<2)>>2]=H[j+l|0];n=n+4|0;f=f+4|0;if((e|0)!=(f|0)){continue}break}}e=c&3;if(!e){break qb}while(1){G[g+(n<<2)>>2]=H[l+n|0];n=n+1|0;s=s+1|0;if((e|0)!=(s|0)){continue}break}}break eb;case 30:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){e=G[f>>2];f=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];g=G[o+72>>2];if(a){al(g,c,w,u,B,e,h,i,f,j);a=4;break eb}$k(g,c,w,u,B,e,h,i,f,j);a=4;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){_k(a,c,z,u+-32768,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}_k(a,c,z,u,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}if(e){aq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}a=4;if(!l){break eb}bq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],G[f>>2],h,i,G[o+76>>2],j);break eb;case 31:Q=K[f>>2];f=G[T+4>>2];if(K[f+1076>>2]==N(9999)){e=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];f=G[o+72>>2];if(a){gl(f,c,w,u,B,Q,h,i,e);a=4;break eb}Wi(f,c,w,u,B,Q,h,i,e);a=4;break eb}g=G[f+1080>>2];if(g-1>>>0<=1){if(a){k=(G[f+1084>>2]+b|0)-1|0;e=G[o+72>>2];u=L[o+40>>3];z=L[o+32>>3];f=G[o+60>>2];a=G[o+76>>2];n=0;l=0;xb:{yb:{q=G[49098];if(q){break yb}q=lb(1e4,4);G[49098]=q;if(!q){break xb}w=1;while(1){p=(n<<2)+q|0;w=w*16807;ja=w/2147483647;zb:{if(O(ja)<2147483648){j=~~ja;break zb}j=-2147483648}w=+(j|0)*-2147483647+w;K[p>>2]=w/2147483647;n=n+1|0;if((n|0)!=1e4){continue}break}if(O(w)<2147483648){j=~~w}else{j=-2147483648}if((j|0)==1043618065){break yb}Ua(25400);break xb}k=(k-1|0)%1e4|0;ca=N(K[(k<<2)+q>>2]*N(500));Ab:{if(N(O(ca))>2];Cb:{if((j|0)!=(f|0)){if((g|0)==2){ca=N(0);if((j|0)==-2147483646){break Cb}}ca=N((+(j|0)-+K[(n<<2)+q>>2]+.5)*u+z);break Cb}G[i>>2]=1;ca=Q}K[a+m>>2]=ca;n=n+1|0;Db:{if((n|0)!=1e4){break Db}j=k+1|0;k=(j|0)==1e4?0:j;ca=N(K[(k<<2)+q>>2]*N(500));if(N(O(ca))>2];j=a+j|0;Eb:{if((g|0)==2){Q=N(0);if((f|0)==-2147483646){break Eb}}Q=N((+(f|0)-+K[(n<<2)+q>>2]+.5)*u+z)}K[j>>2]=Q;n=n+1|0;Fb:{if((n|0)!=1e4){break Fb}f=k+1|0;k=(f|0)==1e4?0:f;Q=N(K[(k<<2)+q>>2]*N(500));if(N(O(Q))>2];Gb:{if((m|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break Gb}if(!((g|0)!=2|(m|0)!=-2147483646)){G[a+j>>2]=0;break Gb}K[a+j>>2]=(+(m|0)-+K[G[49098]+(n<<2)>>2]+.5)*u+z}n=n+1|0;Hb:{if((n|0)!=1e4){break Hb}j=k+1|0;k=(j|0)==1e4?0:j;Q=N(K[G[49098]+(k<<2)>>2]*N(500));if(N(O(Q))>2]+b|0)-1|0;a=G[o+72>>2];u=L[o+40>>3];z=L[o+32>>3];f=I[o+60>>1];e=G[o+76>>2];q=0;k=0;Ib:{Jb:{m=G[49098];if(m){break Jb}m=lb(1e4,4);G[49098]=m;if(!m){break Ib}w=1;while(1){p=(q<<2)+m|0;w=w*16807;ja=w/2147483647;Kb:{if(O(ja)<2147483648){g=~~ja;break Kb}g=-2147483648}w=+(g|0)*-2147483647+w;K[p>>2]=w/2147483647;q=q+1|0;if((q|0)!=1e4){continue}break}if(O(w)<2147483648){g=~~w}else{g=-2147483648}if((g|0)==1043618065){break Jb}Ua(25400);break Ib}s=(j-1|0)%1e4|0;ca=N(K[(s<<2)+m>>2]*N(500));Lb:{if(N(O(ca))>1];Nb:{if((j|0)!=(f|0)){ca=N((+(j<<16>>16)-+K[(q<<2)+m>>2]+.5)*u+z);break Nb}G[i>>2]=1;ca=Q}K[g>>2]=ca;q=q+1|0;Ob:{if((q|0)!=1e4){break Ob}g=s+1|0;s=(g|0)==1e4?0:g;ca=N(K[(s<<2)+m>>2]*N(500));if(N(O(ca))>2]=(+F[a+(k<<1)>>1]-+K[(q<<2)+m>>2]+.5)*u+z;q=q+1|0;Pb:{if((q|0)!=1e4){break Pb}f=s+1|0;s=(f|0)==1e4?0:f;Q=N(K[(s<<2)+m>>2]*N(500));if(N(O(Q))>1];Qb:{if((g|0)==(f|0)){G[i>>2]=1;E[h+k|0]=1;break Qb}K[e+(k<<2)>>2]=(+(g<<16>>16)-+K[G[49098]+(q<<2)>>2]+.5)*u+z}q=q+1|0;Rb:{if((q|0)!=1e4){break Rb}g=s+1|0;s=(g|0)==1e4?0:g;Q=N(K[G[49098]+(s<<2)>>2]*N(500));if(N(O(Q))>2]+b|0)-1|0;e=G[o+72>>2];u=L[o+40>>3];z=L[o+32>>3];g=H[o+60|0];f=G[o+76>>2];l=0;q=0;Sb:{Tb:{k=G[49098];if(k){break Tb}k=lb(1e4,4);G[49098]=k;if(!k){break Sb}w=1;while(1){p=(l<<2)+k|0;w=w*16807;ja=w/2147483647;Ub:{if(O(ja)<2147483648){j=~~ja;break Ub}j=-2147483648}w=+(j|0)*-2147483647+w;K[p>>2]=w/2147483647;l=l+1|0;if((l|0)!=1e4){continue}break}if(O(w)<2147483648){j=~~w}else{j=-2147483648}if((j|0)==1043618065){break Tb}Ua(25400);break Sb}m=(m-1|0)%1e4|0;ca=N(K[(m<<2)+k>>2]*N(500));Vb:{if(N(O(ca))>>0)-+K[(l<<2)+k>>2]+.5)*u+z);break Xb}G[i>>2]=1;ca=Q}K[j>>2]=ca;l=l+1|0;Yb:{if((l|0)!=1e4){break Yb}j=m+1|0;m=(j|0)==1e4?0:j;ca=N(K[(m<<2)+k>>2]*N(500));if(N(O(ca))>2]=(+H[e+q|0]-+K[(l<<2)+k>>2]+.5)*u+z;l=l+1|0;Zb:{if((l|0)!=1e4){break Zb}g=m+1|0;m=(g|0)==1e4?0:g;Q=N(K[(m<<2)+k>>2]*N(500));if(N(O(Q))>2]=1;E[h+q|0]=1;break _b}K[f+(q<<2)>>2]=(+(j>>>0)-+K[G[49098]+(l<<2)>>2]+.5)*u+z}l=l+1|0;$b:{if((l|0)!=1e4){break $b}j=m+1|0;m=(j|0)==1e4?0:j;Q=N(K[G[49098]+(m<<2)>>2]*N(500));if(N(O(Q))>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[f+1048>>2]!=31|w!=32768)){fl(a,c,z,u+-32768,B,G[o+60>>2],Q,h,i,G[o+76>>2]);a=4;break eb}fl(a,c,z,u,B,G[o+60>>2],Q,h,i,G[o+76>>2]);a=4;break eb}if(e){jq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],Q,h,i,G[o+76>>2]);a=4;break eb}a=4;if(!l){break eb}iq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],Q,h,i,G[o+76>>2]);break eb;case 71:u=L[f>>3];f=G[T+4>>2];if(K[f+1076>>2]==N(9999)){e=G[o+76>>2];w=L[o+32>>3];z=L[o+40>>3];f=G[o+72>>2];if(a){bl(f,c,z,w,B,u,h,i,e);a=8;break eb}dl(f,c,z,w,B,u,h,i,e);a=8;break eb}g=G[f+1080>>2];if(g-1>>>0<=1){if(a){m=(G[f+1084>>2]+b|0)-1|0;e=G[o+72>>2];z=L[o+40>>3];ja=L[o+32>>3];f=G[o+60>>2];a=G[o+76>>2];l=0;q=0;ac:{bc:{k=G[49098];if(k){break bc}k=lb(1e4,4);G[49098]=k;if(!k){break ac}w=1;while(1){p=(l<<2)+k|0;w=w*16807;Aa=w/2147483647;cc:{if(O(Aa)<2147483648){j=~~Aa;break cc}j=-2147483648}w=+(j|0)*-2147483647+w;K[p>>2]=w/2147483647;l=l+1|0;if((l|0)!=1e4){continue}break}if(O(w)<2147483648){j=~~w}else{j=-2147483648}if((j|0)==1043618065){break bc}Ua(25400);break ac}m=(m-1|0)%1e4|0;Q=N(K[(m<<2)+k>>2]*N(500));dc:{if(N(O(Q))>2];fc:{if((j|0)!=(f|0)){if((g|0)==2){w=0;if((j|0)==-2147483646){break fc}}w=(+(j|0)-+K[(l<<2)+k>>2]+.5)*z+ja;break fc}G[i>>2]=1;w=u}L[p>>3]=w;l=l+1|0;gc:{if((l|0)!=1e4){break gc}j=m+1|0;m=(j|0)==1e4?0:j;Q=N(K[(m<<2)+k>>2]*N(500));if(N(O(Q))>2];j=a+(q<<3)|0;hc:{if((g|0)==2){u=0;if((f|0)==-2147483646){break hc}}u=(+(f|0)-+K[(l<<2)+k>>2]+.5)*z+ja}L[j>>3]=u;l=l+1|0;ic:{if((l|0)!=1e4){break ic}f=m+1|0;m=(f|0)==1e4?0:f;Q=N(K[(m<<2)+k>>2]*N(500));if(N(O(Q))>2];jc:{if((j|0)==(f|0)){G[i>>2]=1;E[h+q|0]=1;break jc}if(!((g|0)!=2|(j|0)!=-2147483646)){j=a+(q<<3)|0;G[j>>2]=0;G[j+4>>2]=0;break jc}L[a+(q<<3)>>3]=(+(j|0)-+K[G[49098]+(l<<2)>>2]+.5)*z+ja}l=l+1|0;kc:{if((l|0)!=1e4){break kc}j=m+1|0;m=(j|0)==1e4?0:j;Q=N(K[G[49098]+(m<<2)>>2]*N(500));if(N(O(Q))>2]+b|0)-1|0;a=G[o+72>>2];z=L[o+40>>3];ja=L[o+32>>3];f=I[o+60>>1];e=G[o+76>>2];q=0;k=0;lc:{mc:{m=G[49098];if(m){break mc}m=lb(1e4,4);G[49098]=m;if(!m){break lc}w=1;while(1){p=(q<<2)+m|0;w=w*16807;Aa=w/2147483647;nc:{if(O(Aa)<2147483648){g=~~Aa;break nc}g=-2147483648}w=+(g|0)*-2147483647+w;K[p>>2]=w/2147483647;q=q+1|0;if((q|0)!=1e4){continue}break}if(O(w)<2147483648){g=~~w}else{g=-2147483648}if((g|0)==1043618065){break mc}Ua(25400);break lc}s=(j-1|0)%1e4|0;Q=N(K[(s<<2)+m>>2]*N(500));oc:{if(N(O(Q))>1];qc:{if((j|0)!=(f|0)){w=(+(j<<16>>16)-+K[(q<<2)+m>>2]+.5)*z+ja;break qc}G[i>>2]=1;w=u}L[g>>3]=w;q=q+1|0;rc:{if((q|0)!=1e4){break rc}g=s+1|0;s=(g|0)==1e4?0:g;Q=N(K[(s<<2)+m>>2]*N(500));if(N(O(Q))>3]=(+F[a+(k<<1)>>1]-+K[(q<<2)+m>>2]+.5)*z+ja;q=q+1|0;sc:{if((q|0)!=1e4){break sc}f=s+1|0;s=(f|0)==1e4?0:f;Q=N(K[(s<<2)+m>>2]*N(500));if(N(O(Q))>1];tc:{if((g|0)==(f|0)){G[i>>2]=1;E[h+k|0]=1;break tc}L[e+(k<<3)>>3]=(+(g<<16>>16)-+K[G[49098]+(q<<2)>>2]+.5)*z+ja}q=q+1|0;uc:{if((q|0)!=1e4){break uc}g=s+1|0;s=(g|0)==1e4?0:g;Q=N(K[G[49098]+(s<<2)>>2]*N(500));if(N(O(Q))>2]+b|0)-1|0;e=G[o+72>>2];z=L[o+40>>3];ja=L[o+32>>3];g=H[o+60|0];f=G[o+76>>2];l=0;q=0;vc:{wc:{k=G[49098];if(k){break wc}k=lb(1e4,4);G[49098]=k;if(!k){break vc}w=1;while(1){p=(l<<2)+k|0;w=w*16807;Aa=w/2147483647;xc:{if(O(Aa)<2147483648){j=~~Aa;break xc}j=-2147483648}w=+(j|0)*-2147483647+w;K[p>>2]=w/2147483647;l=l+1|0;if((l|0)!=1e4){continue}break}if(O(w)<2147483648){j=~~w}else{j=-2147483648}if((j|0)==1043618065){break wc}Ua(25400);break vc}m=(m-1|0)%1e4|0;Q=N(K[(m<<2)+k>>2]*N(500));yc:{if(N(O(Q))>>0)-+K[(l<<2)+k>>2]+.5)*z+ja;break Ac}G[i>>2]=1;w=u}L[j>>3]=w;l=l+1|0;Bc:{if((l|0)!=1e4){break Bc}j=m+1|0;m=(j|0)==1e4?0:j;Q=N(K[(m<<2)+k>>2]*N(500));if(N(O(Q))>3]=(+H[e+q|0]-+K[(l<<2)+k>>2]+.5)*z+ja;l=l+1|0;Cc:{if((l|0)!=1e4){break Cc}g=m+1|0;m=(g|0)==1e4?0:g;Q=N(K[(m<<2)+k>>2]*N(500));if(N(O(Q))>2]=1;E[h+q|0]=1;break Dc}L[f+(q<<3)>>3]=(+(j>>>0)-+K[G[49098]+(l<<2)>>2]+.5)*z+ja}l=l+1|0;Ec:{if((l|0)!=1e4){break Ec}j=m+1|0;m=(j|0)==1e4?0:j;Q=N(K[G[49098]+(m<<2)>>2]*N(500));if(N(O(Q))>3];ja=L[o+40>>3];a=G[o+72>>2];if(!(G[f+1048>>2]!=31|w!=32768)){cl(a,c,ja,z+-32768,B,G[o+60>>2],u,h,i,G[o+76>>2]);a=8;break eb}cl(a,c,ja,z,B,G[o+60>>2],u,h,i,G[o+76>>2]);a=8;break eb}if(e){fq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],u,h,i,G[o+76>>2]);a=8;break eb}a=8;if(!l){break eb}eq(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],u,h,i,G[o+76>>2]);break eb;case 0:if(a){up(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,G[o+60>>2],H[f|0],h,i,G[o+76>>2],j);a=1;break eb}if(e){Tk(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],H[f|0],h,i,G[o+76>>2],j);a=1;break eb}a=1;if(!l){break eb}vp(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],H[f|0],h,i,G[o+76>>2],j);break eb;case 1:if(a){Do(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,G[o+60>>2],E[f|0],h,i,G[o+76>>2],j);a=1;break eb}if(e){Eo(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],E[f|0],h,i,G[o+76>>2],j);a=1;break eb}a=1;if(!l){break eb}Co(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],E[f|0],h,i,G[o+76>>2],j);break eb;case 9:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){e=I[f>>1];f=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];g=G[o+72>>2];if(a){Ip(g,c,w,u,B,e,h,i,f,j);a=2;break eb}Hp(g,c,w,u,B,e,h,i,f,j);a=2;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){Vk(a,c,z,u+-32768,B,G[o+60>>2],I[f>>1],h,i,G[o+76>>2],j);a=2;break eb}Vk(a,c,z,u,B,G[o+60>>2],I[f>>1],h,i,G[o+76>>2],j);a=2;break eb}if(e){Gp(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],I[f>>1],h,i,G[o+76>>2],j);a=2;break eb}a=2;if(!l){break eb}Jp(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],I[f>>1],h,i,G[o+76>>2],j);break eb;case 19:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){g=G[f>>2];e=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];f=G[o+72>>2];if(a){k=0;m=0;Fc:{Gc:{if(!B){if(w==1&u==0){break Gc}if((c|0)<=0){break Fc}while(1){Hc:{Ic:{g=m<<2;z=+K[g+f>>2]*w+u;if(z<-.49){G[j>>2]=-11;break Ic}if(z>4294967295.49){G[j>>2]=-11;a=-1;break Hc}if(!(z<4294967296&z>=0)){break Ic}a=~~z>>>0;break Hc}a=0}G[e+g>>2]=a;m=m+1|0;if((m|0)!=(c|0)){continue}break}break Fc}m=f+2|0;Jc:{Kc:{if(!(w==1&u==0)){if((c|0)<=0){break Fc}if(!(u<4294967296&u>=0)){break Kc}a=~~u>>>0;break Jc}if((c|0)<=0){break Fc}while(1){Lc:{Mc:{Nc:{Oc:{a=I[m>>1]&32640;switch(((a|0)==32640?1:!a<<1)|0){case 0:break Mc;case 1:break Oc;default:break Nc}}G[i>>2]=1;if((B|0)==1){G[e+(k<<2)>>2]=g;break Lc}E[h+k|0]=1;break Lc}G[e+(k<<2)>>2]=0;break Lc}a=k<<2;Q=K[a+f>>2];u=+Q;if(u<-.49){G[j>>2]=-11;G[a+e>>2]=0;break Lc}if(u>4294967295.49){G[j>>2]=-11;G[a+e>>2]=-1;break Lc}p=a+e|0;if(Q=N(0)){a=~~Q>>>0}else{a=0}G[p>>2]=a}m=m+4|0;k=k+1|0;if((k|0)!=(c|0)){continue}break}break Fc}a=0}while(1){Pc:{Qc:{Rc:{Sc:{l=I[m>>1]&32640;switch(((l|0)==32640?1:!l<<1)|0){case 0:break Qc;case 1:break Sc;default:break Rc}}G[i>>2]=1;if((B|0)==1){G[e+(k<<2)>>2]=g;break Pc}E[h+k|0]=1;break Pc}if(u<-.49){G[j>>2]=-11;G[e+(k<<2)>>2]=0;break Pc}if(u>4294967295.49){G[j>>2]=-11;G[e+(k<<2)>>2]=-1;break Pc}G[e+(k<<2)>>2]=a;break Pc}l=k<<2;z=+K[l+f>>2]*w+u;if(z<-.49){G[j>>2]=-11;G[e+l>>2]=0;break Pc}if(z>4294967295.49){G[j>>2]=-11;G[e+(k<<2)>>2]=-1;break Pc}l=e+(k<<2)|0;if(z<4294967296&z>=0){p=~~z>>>0}else{p=0}G[l>>2]=p}m=m+4|0;k=k+1|0;if((k|0)!=(c|0)){continue}break}break Fc}if((c|0)<=0){break Fc}while(1){Tc:{Uc:{g=m<<2;Q=K[g+f>>2];u=+Q;if(u<-.49){G[j>>2]=-11;break Uc}if(u>4294967295.49){G[j>>2]=-11;a=-1;break Tc}if(!(Q=N(0))){break Uc}a=~~Q>>>0;break Tc}a=0}G[e+g>>2]=a;m=m+1|0;if((m|0)!=(c|0)){continue}break}}a=4;break eb}k=0;m=0;Vc:{Wc:{if(!B){if(w==1&u==0){break Wc}if((c|0)<=0){break Vc}while(1){g=e+(m<<2)|0;Xc:{Yc:{z=L[f+(m<<3)>>3]*w+u;if(z<-.49){G[j>>2]=-11;break Yc}if(z>4294967295.49){G[j>>2]=-11;a=-1;break Xc}if(!(z<4294967296&z>=0)){break Yc}a=~~z>>>0;break Xc}a=0}G[g>>2]=a;m=m+1|0;if((m|0)!=(c|0)){continue}break}break Vc}m=f+6|0;Zc:{_c:{if(!(w==1&u==0)){if((c|0)<=0){break Vc}if(!(u<4294967296&u>=0)){break _c}a=~~u>>>0;break Zc}if((c|0)<=0){break Vc}while(1){$c:{ad:{bd:{cd:{a=I[m>>1]&32752;switch(((a|0)==32752?1:!a<<1)|0){case 0:break ad;case 1:break cd;default:break bd}}G[i>>2]=1;if((B|0)==1){G[e+(k<<2)>>2]=g;break $c}E[h+k|0]=1;break $c}G[e+(k<<2)>>2]=0;break $c}u=L[f+(k<<3)>>3];if(u<-.49){G[j>>2]=-11;G[e+(k<<2)>>2]=0;break $c}if(u>4294967295.49){G[j>>2]=-11;G[e+(k<<2)>>2]=-1;break $c}p=e+(k<<2)|0;if(u<4294967296&u>=0){a=~~u>>>0}else{a=0}G[p>>2]=a}m=m+8|0;k=k+1|0;if((k|0)!=(c|0)){continue}break}break Vc}a=0}while(1){dd:{ed:{fd:{gd:{l=I[m>>1]&32752;switch(((l|0)==32752?1:!l<<1)|0){case 0:break ed;case 1:break gd;default:break fd}}G[i>>2]=1;if((B|0)==1){G[e+(k<<2)>>2]=g;break dd}E[h+k|0]=1;break dd}if(u<-.49){G[j>>2]=-11;G[e+(k<<2)>>2]=0;break dd}if(u>4294967295.49){G[j>>2]=-11;G[e+(k<<2)>>2]=-1;break dd}G[e+(k<<2)>>2]=a;break dd}z=L[f+(k<<3)>>3]*w+u;if(z<-.49){G[j>>2]=-11;G[e+(k<<2)>>2]=0;break dd}if(z>4294967295.49){G[j>>2]=-11;G[e+(k<<2)>>2]=-1;break dd}l=e+(k<<2)|0;if(z<4294967296&z>=0){p=~~z>>>0}else{p=0}G[l>>2]=p}m=m+8|0;k=k+1|0;if((k|0)!=(c|0)){continue}break}break Vc}if((c|0)<=0){break Vc}while(1){g=e+(m<<2)|0;hd:{id:{u=L[f+(m<<3)>>3];if(u<-.49){G[j>>2]=-11;break id}if(u>4294967295.49){G[j>>2]=-11;a=-1;break hd}if(!(u<4294967296&u>=0)){break id}a=~~u>>>0;break hd}a=0}G[g>>2]=a;m=m+1|0;if((m|0)!=(c|0)){continue}break}}a=4;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){yp(a,c,z,u+-32768,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}yp(a,c,z,u,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}if(e){g=G[o+72>>2];l=I[o+60>>1];a=G[f>>2];f=G[o+76>>2];w=L[o+40>>3];z=L[o+32>>3];e=w==1&z==0;jd:{kd:{if(!B){if(e){break kd}n=0;if((c|0)<=0){break jd}while(1){e=f+(n<<2)|0;ld:{md:{u=+F[g+(n<<1)>>1]*w+z;if(u<-.49){G[j>>2]=-11;break md}if(u>4294967295.49){G[j>>2]=-11;a=-1;break ld}if(!(u<4294967296&u>=0)){break md}a=~~u>>>0;break ld}a=0}G[e>>2]=a;n=n+1|0;if((n|0)!=(c|0)){continue}break}break jd}if(!e){if((c|0)<=0){break jd}n=0;while(1){e=I[g+(n<<1)>>1];nd:{if((e|0)==(l|0)){G[i>>2]=1;if((B|0)==1){G[f+(n<<2)>>2]=a;break nd}E[h+n|0]=1;break nd}u=+(e<<16>>16)*w+z;if(u<-.49){G[j>>2]=-11;G[f+(n<<2)>>2]=0;break nd}if(u>4294967295.49){G[j>>2]=-11;G[f+(n<<2)>>2]=-1;break nd}k=f+(n<<2)|0;if(u<4294967296&u>=0){e=~~u>>>0}else{e=0}G[k>>2]=e}n=n+1|0;if((n|0)!=(c|0)){continue}break}break jd}if((c|0)<=0){break jd}if((B|0)!=1){n=0;while(1){a=I[g+(n<<1)>>1];od:{if((a|0)==(l|0)){G[i>>2]=1;E[h+n|0]=1;break od}a=a<<16>>16;if((a|0)<0){G[j>>2]=-11;G[f+(n<<2)>>2]=0;break od}G[f+(n<<2)>>2]=a}n=n+1|0;if((n|0)!=(c|0)){continue}break}break jd}n=0;if((c|0)!=1){k=c&-2;s=0;while(1){e=I[g+(n<<1)>>1];pd:{if((e|0)!=(l|0)){e=e<<16>>16;if((e|0)>=0){break pd}G[j>>2]=-11;e=0;break pd}G[i>>2]=1;e=a}G[f+(n<<2)>>2]=e;m=n|1;e=I[g+(m<<1)>>1];qd:{if((e|0)!=(l|0)){e=e<<16>>16;if((e|0)>=0){break qd}G[j>>2]=-11;e=0;break qd}G[i>>2]=1;e=a}G[f+(m<<2)>>2]=e;n=n+2|0;s=s+2|0;if((k|0)!=(s|0)){continue}break}}if(!(c&1)){break jd}e=I[g+(n<<1)>>1];rd:{if((e|0)!=(l|0)){a=e<<16>>16;if((a|0)>=0){break rd}G[j>>2]=-11;a=0;break rd}G[i>>2]=1}G[f+(n<<2)>>2]=a;break jd}if((c|0)<=0){break jd}n=0;if((c|0)!=1){l=c&-2;e=0;while(1){k=f+(n<<2)|0;a=F[g+(n<<1)>>1];sd:{if((a|0)<0){G[j>>2]=-11;a=0;break sd}a=a&65535}G[k>>2]=a;k=n|1;a=F[g+(k<<1)>>1];td:{if((a|0)>=0){a=a&65535;break td}G[j>>2]=-11;a=0}G[f+(k<<2)>>2]=a;n=n+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}}if(!(c&1)){break jd}e=0;a=F[g+(n<<1)>>1];ud:{if((a|0)>=0){e=a&65535;break ud}G[j>>2]=-11}G[f+(n<<2)>>2]=e}a=4;break eb}a=4;if(!l){break eb}l=G[o+72>>2];k=H[o+60|0];e=G[f>>2];g=G[o+76>>2];w=L[o+40>>3];z=L[o+32>>3];f=w==1&z==0;vd:{wd:{if(!B){if(f){break wd}n=0;if((c|0)<=0){break vd}while(1){f=g+(n<<2)|0;xd:{yd:{u=+H[l+n|0]*w+z;if(u<-.49){G[j>>2]=-11;break yd}if(u>4294967295.49){G[j>>2]=-11;e=-1;break xd}if(!(u<4294967296&u>=0)){break yd}e=~~u>>>0;break xd}e=0}G[f>>2]=e;n=n+1|0;if((n|0)!=(c|0)){continue}break}break vd}if(!f){if((c|0)<=0){break vd}n=0;while(1){f=H[l+n|0];zd:{if((f|0)==(k|0)){G[i>>2]=1;if((B|0)==1){G[g+(n<<2)>>2]=e;break zd}E[h+n|0]=1;break zd}u=+(f>>>0)*w+z;if(u<-.49){G[j>>2]=-11;G[g+(n<<2)>>2]=0;break zd}if(u>4294967295.49){G[j>>2]=-11;G[g+(n<<2)>>2]=-1;break zd}p=g+(n<<2)|0;if(u<4294967296&u>=0){f=~~u>>>0}else{f=0}G[p>>2]=f}n=n+1|0;if((n|0)!=(c|0)){continue}break}break vd}if((c|0)<=0){break vd}if((B|0)!=1){n=0;if((c|0)!=1){j=c&-2;f=0;while(1){e=H[l+n|0];Ad:{if((e|0)==(k|0)){G[i>>2]=1;E[h+n|0]=1;break Ad}G[g+(n<<2)>>2]=e}e=n|1;m=H[e+l|0];Bd:{if((m|0)!=(k|0)){G[g+(e<<2)>>2]=m;break Bd}G[i>>2]=1;E[e+h|0]=1}n=n+2|0;f=f+2|0;if((j|0)!=(f|0)){continue}break}}if(!(c&1)){break vd}e=H[l+n|0];if((e|0)!=(k|0)){G[g+(n<<2)>>2]=e;break vd}G[i>>2]=1;E[h+n|0]=1;break vd}n=0;if((c|0)!=1){j=c&-2;m=0;while(1){p=g+(n<<2)|0;f=H[l+n|0];if((f|0)==(k|0)){G[i>>2]=1;f=e}G[p>>2]=f;p=n|1;f=H[p+l|0];if((k|0)==(f|0)){G[i>>2]=1;f=e}G[g+(p<<2)>>2]=f;n=n+2|0;m=m+2|0;if((j|0)!=(m|0)){continue}break}}if(!(c&1)){break vd}g=g+(n<<2)|0;f=H[l+n|0];if((f|0)==(k|0)){G[i>>2]=1}else{e=f}G[g>>2]=e;break vd}if((c|0)<=0){break vd}s=0;n=0;if(c-1>>>0>=3){e=c&-4;f=0;while(1){G[g+(n<<2)>>2]=H[l+n|0];j=n|1;G[g+(j<<2)>>2]=H[j+l|0];j=n|2;G[g+(j<<2)>>2]=H[j+l|0];j=n|3;G[g+(j<<2)>>2]=H[j+l|0];n=n+4|0;f=f+4|0;if((e|0)!=(f|0)){continue}break}}e=c&3;if(!e){break vd}while(1){G[g+(n<<2)>>2]=H[l+n|0];n=n+1|0;s=s+1|0;if((e|0)!=(s|0)){continue}break}}break eb;case 29:g=G[T+4>>2];if(K[g+1076>>2]==N(9999)){e=G[f>>2];f=G[o+76>>2];u=L[o+32>>3];w=L[o+40>>3];g=G[o+72>>2];if(a){Cp(g,c,w,u,B,e,h,i,f,j);a=4;break eb}Bp(g,c,w,u,B,e,h,i,f,j);a=4;break eb}if(a){u=L[o+32>>3];z=L[o+40>>3];a=G[o+72>>2];if(!(G[g+1048>>2]!=31|w!=32768)){Uk(a,c,z,u+-32768,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}Uk(a,c,z,u,B,G[o+60>>2],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}if(e){Dp(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,F[o+60>>1],G[f>>2],h,i,G[o+76>>2],j);a=4;break eb}a=4;if(!l){break eb}Ep(G[o+72>>2],c,L[o+40>>3],L[o+32>>3],B,H[o+60|0],G[f>>2],h,i,G[o+76>>2],j);break eb;default:break fb}}G[j>>2]=410;a=0}Wa(G[o+72>>2]);m=G[T+4>>2];if(!G[m+1228>>2]|G[m+1112>>2]==G[m+1052>>2]&G[m+1056>>2]==1){break a}f=M(a,c);e=ma<<2;if(!((f|0)==G[e+G[m+1232>>2]>>2]&G[e+G[m+1236>>2]>>2]==(d|0))){a=G[e+G[m+1240>>2]>>2];if(a){Wa(a);m=G[T+4>>2]}a=G[m+1244>>2];e=ma<<2;g=G[a+e>>2];if(g){Wa(g);a=G[G[T+4>>2]+1244>>2]}G[a+e>>2]=0;a=G[T+4>>2];G[e+G[a+1228>>2]>>2]=0;G[e+G[a+1232>>2]>>2]=0;G[e+G[a+1236>>2]>>2]=0;g=ab(f);G[e+G[a+1240>>2]>>2]=g;m=G[T+4>>2];if(!G[e+G[m+1240>>2]>>2]){break a}if((B|0)==2){a=ab(c);e=ma<<2;G[e+G[m+1244>>2]>>2]=a;m=G[T+4>>2];if(!G[e+G[m+1244>>2]>>2]){break a}}a=ma<<2;G[a+G[m+1232>>2]>>2]=f;G[a+G[m+1236>>2]>>2]=d}a=ma<<2;bb(G[a+G[m+1240>>2]>>2],G[o+76>>2],f);if((B|0)==2){bb(G[G[G[T+4>>2]+1244>>2]+(ma<<2)>>2],h,c)}c=G[T+4>>2];G[a+G[c+1228>>2]>>2]=b;G[a+G[c+1248>>2]>>2]=G[i>>2];break a}Wa(g)}G[j>>2]=113;break a}G[j>>2]=414;break a}G[j>>2]=415}Fa=o+80|0}function Eq(a){var 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,A=0,B=0,C=0,D=0,K=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,ab=0,db=0,eb=0,fb=0,gb=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,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,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;b=G[a+32>>2];Ha=b+88|0;while(1){a=G[b+8>>2];a:{b:{c:{d:{while(1){e:{switch(a-1|0){case 1:break d;case 0:break e;default:continue}}break}a=0;c=G[b>>2];e=G[b+80>>2];f:{if(!G[c+20>>2]|(e|0)>=G[b+76>>2]){break f}g=G[c+16>>2];while(1){E[g|0]=H[G[b+44>>2]+e|0];e=G[b+80>>2]+1|0;G[b+80>>2]=e;a=G[b>>2];c=G[a+24>>2]+1|0;G[a+24>>2]=c;g=G[a+16>>2]+1|0;G[a+16>>2]=g;d=G[a+20>>2]-1|0;G[a+20>>2]=d;if(!c){G[a+28>>2]=G[a+28>>2]+1}a=1;if(!d){break f}if(G[b+76>>2]>(e|0)){continue}break}}Da=a|Da;if(G[b+76>>2]>(e|0)){break b}a=G[b+4>>2];if(!(G[b+12>>2]|(a|0)!=4)&(G[b+56>>2]<=0|J[b+52>>2]>255)){break b}G[b+608>>2]=-1;G[b+76>>2]=0;G[b+80>>2]=0;G[b+68>>2]=0;cb(Ha,0,256);G[b+8>>2]=2;G[b+620>>2]=G[b+620>>2]+1;if((a|0)!=3){break c}if(G[b+12>>2]){break d}if(G[b+56>>2]<=0|J[b+52>>2]>255){break b}}a=G[b+4>>2]}g=G[b+72>>2];n=G[b+68>>2];g:{if((a|0)!=2){i=0;if((g|0)<=(n|0)){break g}a=G[b>>2];if(!G[a+4>>2]|!G[b+12>>2]){break g}while(1){e=G[b+56>>2];h:{i:{c=G[b+52>>2];a=H[G[a>>2]];j:{if((c|0)!=(a|0)){if((e|0)!=1){break j}e=G[b+608>>2];G[b+608>>2]=e<<8^G[((c&255^e>>>24)<<2)+191040>>2];E[(b+c|0)+88|0]=1;E[G[b+36>>2]+G[b+68>>2]|0]=c;G[b+52>>2]=a;G[b+68>>2]=G[b+68>>2]+1;break h}if((e|0)!=255){break i}}if(c>>>0<=255){sl(b)}G[b+56>>2]=1;G[b+52>>2]=a;break h}G[b+56>>2]=e+1}a=G[b>>2];G[a>>2]=G[a>>2]+1;c=G[a+4>>2]-1|0;G[a+4>>2]=c;e=G[a+8>>2]+1|0;G[a+8>>2]=e;if(!e){G[a+12>>2]=G[a+12>>2]+1}e=G[b+12>>2]-1|0;G[b+12>>2]=e;i=1;n=G[b+68>>2];g=G[b+72>>2];if(!c|(n|0)>=(g|0)){break g}if(e){continue}break}break g}i=0;if((g|0)<=(n|0)){break g}c=G[b>>2];if(!G[c+4>>2]){break g}a=G[b+52>>2];d=G[c>>2];while(1){e=G[b+56>>2];k:{l:{c=H[d|0];m:{if((c|0)!=(a|0)){if((e|0)!=1){break m}e=G[b+608>>2];G[b+608>>2]=e<<8^G[((a&255^e>>>24)<<2)+191040>>2];E[(a+b|0)+88|0]=1;E[G[b+36>>2]+G[b+68>>2]|0]=a;G[b+52>>2]=c;G[b+68>>2]=G[b+68>>2]+1;break k}if((e|0)!=255){break l}}if(a>>>0<=255){sl(b)}G[b+56>>2]=1;G[b+52>>2]=c;break k}G[b+56>>2]=e+1}a=G[b>>2];d=G[a>>2]+1|0;G[a>>2]=d;e=G[a+4>>2]-1|0;G[a+4>>2]=e;i=G[a+8>>2]+1|0;G[a+8>>2]=i;if(!i){G[a+12>>2]=G[a+12>>2]+1}i=1;n=G[b+68>>2];g=G[b+72>>2];if((n|0)>=(g|0)){break g}a=c;if(e){continue}break}}Ea=i|Ea;a=G[b+4>>2];if(!(G[b+12>>2]|(a|0)==2)){if(J[b+52>>2]<=255){sl(b);a=G[b+4>>2]}G[b+52>>2]=256;G[b+56>>2]=0;a=(a|0)==4;break a}a=0;if((g|0)<=(n|0)){break a}if(G[G[b>>2]+4>>2]){continue}}return((Da|Ea)&255)!=0}Ia=a;f=0;j=0;T=0;v=0;X=0;_=0;$=0;R=Fa-288|0;Fa=R;a=G[b+68>>2];if((a|0)>0){c=G[b+608>>2]^-1;G[b+608>>2]=c;e=Eu(G[b+612>>2],1)^c;G[b+612>>2]=e;d=G[b+620>>2];if((d|0)>=2){G[b+76>>2]=0}if(G[b+616>>2]>=2){G[R+28>>2]=a;G[R+24>>2]=e;G[R+20>>2]=c;G[R+16>>2]=d;_a(G[24367],75372,R+16|0)}r=Fa-4592|0;Fa=r;B=G[b+616>>2];S=G[b+24>>2];t=G[b+32>>2];s=G[b+68>>2];n:{o:{if((s|0)<1e4){break o}q=G[b+36>>2];a=G[b+48>>2];a=(a|0)>1?a:1;z=M(s,(((a>>>0<100?a:100)-1&255)>>>0)/3|0);G[r+60>>2]=z;if((B|0)>=4){hb(86989,33,1,G[24367])}x=(q+(s+(s&1)|0)|0)+34|0;u=cb(S,0,262148);c=H[q|0]<<8;D=s-1|0;e=D;while(1){a=e;F[x+(a<<1)>>1]=0;c=H[a+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;d=a-1|0;F[x+(d<<1)>>1]=0;c=H[d+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;d=a-2|0;F[x+(d<<1)>>1]=0;c=H[d+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;d=a-3|0;F[x+(d<<1)>>1]=0;c=H[d+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;e=a-4|0;if(a>>>0>6){continue}break}p:{if(a>>>0<4){break p}if(a&1){a=e}else{F[x+(e<<1)>>1]=0;c=H[e+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;a=a-5|0}if(!e){break p}while(1){F[x+(a<<1)>>1]=0;c=H[a+q|0]<<8|c>>8;e=u+(c<<2)|0;G[e>>2]=G[e>>2]+1;e=a-1|0;F[x+(e<<1)>>1]=0;c=H[e+q|0]<<8|c>>8;d=u+(c<<2)|0;G[d>>2]=G[d>>2]+1;a=a-2|0;if(e){continue}break}}a=0;while(1){c=a+s|0;E[c+q|0]=H[a+q|0];F[x+(c<<1)>>1]=0;c=a|1;e=c+s|0;E[e+q|0]=H[c+q|0];F[x+(e<<1)>>1]=0;a=a+2|0;if((a|0)!=34){continue}break}if((B|0)>=4){hb(86961,27,1,G[24367])}e=G[u>>2];c=1;while(1){a=u+(c<<2)|0;e=G[a>>2]+e|0;G[a>>2]=e;e=e+G[a+4>>2]|0;G[a+4>>2]=e;e=e+G[a+8>>2]|0;G[a+8>>2]=e;e=e+G[a+12>>2]|0;G[a+12>>2]=e;c=c+4|0;if((c|0)!=65537){continue}break}c=H[q|0]<<8;e=D;while(1){a=e;d=H[a+q|0];i=u+((d<<8|c<<16>>>24)<<2)|0;c=G[i>>2]-1|0;G[i>>2]=c;G[t+(c<<2)>>2]=a;i=a-1|0;g=H[i+q|0];d=u+((d|g<<8)<<2)|0;c=G[d>>2]-1|0;G[d>>2]=c;G[t+(c<<2)>>2]=i;d=a-2|0;i=H[d+q|0];g=u+((g|i<<8)<<2)|0;c=G[g>>2]-1|0;G[g>>2]=c;G[t+(c<<2)>>2]=d;g=a-3|0;c=i|H[g+q|0]<<8;i=u+(c<<2)|0;d=G[i>>2]-1|0;G[i>>2]=d;G[t+(d<<2)>>2]=g;e=a-4|0;if(a>>>0>6){continue}break}if(a>>>0>3){while(1){a=e;c=H[a+q|0]<<8|c<<16>>>24;i=u+(c<<2)|0;d=G[i>>2]-1|0;G[i>>2]=d;G[t+(d<<2)>>2]=a;e=a-1|0;if(a){continue}break}}a=0;cb(r+2112|0,0,256);while(1){c=r+2368|0;G[c+(a<<2)>>2]=a;e=a|1;G[c+(e<<2)>>2]=e;e=a|2;G[c+(e<<2)>>2]=e;e=a|3;G[c+(e<<2)>>2]=e;e=a|4;G[c+(e<<2)>>2]=e;e=a|5;G[c+(e<<2)>>2]=e;e=a|6;G[c+(e<<2)>>2]=e;e=a|7;G[c+(e<<2)>>2]=e;a=a+8|0;if((a|0)!=256){continue}break}d=364;while(1){e=(d|0)/3|0;if((d|0)<=767){g=(e|0)>255?e:255;a=e;while(1){i=a;n=G[(r+2368|0)+(a<<2)>>2];c=u+(n<<10)|0;l=G[c+1024>>2]-G[c>>2]|0;while(1){q:{c=a-e|0;m=G[(r+2368|0)+(c<<2)>>2];h=u+(m<<10)|0;if(l>>>0>=G[h+1024>>2]-G[h>>2]>>>0){c=a;break q}G[(r+2368|0)+(a<<2)>>2]=m;a=c;if((e|0)<=(a|0)){continue}}break}G[(r+2368|0)+(c<<2)>>2]=n;a=i+1|0;if((g|0)!=(i|0)){continue}break}}a=d-3|0;d=e;if(a>>>0>2){continue}break}U=G[24367];k=z;r:{s:{t:{while(1){A=G[(r+2368|0)+(T<<2)>>2];W=A<<8;y=0;while(1){if((A|0)!=(y|0)){O=u+(y+W<<2)|0;a=G[O>>2];u:{if(a&2097152){break u}c=G[O+4>>2]&-2097153;C=c-1|0;P=a&-2097153;if((C|0)<=(P|0)){break u}if((B|0)>=4){G[r+40>>2]=v;G[r+36>>2]=y;G[r+32>>2]=A;G[r+44>>2]=c-P;_a(U,74822,r+32|0)}G[r+4192>>2]=P;G[r+3792>>2]=C;G[r+3392>>2]=2;i=1;while(1){o=i;i=i-1|0;a=i<<2;w=a+(r+3392|0)|0;Y=a+(r+3792|0)|0;Z=a+(r+4192|0)|0;v:while(1){if(o>>>0>=98){zd(1001)}w:{p=G[w>>2];l=G[Y>>2];d=G[Z>>2];a=l-d|0;if(!((p|0)<15&(a|0)>=20)){c=0;x:{if((a|0)<=0){break x}while(1){g=c;c=c+1|0;if((a|0)>=G[(g<<2)+189552>>2]){continue}break}if(!g){break x}while(1){e=g;g=e-1|0;m=G[(g<<2)+189552>>2];h=m+d|0;n=h;while(1){y:{if((l|0)<(n|0)){break y}k=G[t+(n<<2)>>2];o=k+p|0;a=n;while(1){z:{c=a-m|0;w=G[t+(c<<2)>>2];if(!tl(w+p|0,o,q,x,s,r+60|0)){c=a;break z}G[t+(a<<2)>>2]=w;a=c;if((h|0)<=(a|0)){continue}}break}G[t+(c<<2)>>2]=k;if((l|0)<=(n|0)){break y}a=n+1|0;k=G[t+(a<<2)>>2];o=k+p|0;while(1){A:{c=a-m|0;w=G[t+(c<<2)>>2];if(!tl(w+p|0,o,q,x,s,r+60|0)){c=a;break A}G[t+(a<<2)>>2]=w;a=c;if((h|0)<=(a|0)){continue}}break}G[t+(c<<2)>>2]=k;a=n+2|0;if((l|0)<(a|0)){break y}k=G[t+(a<<2)>>2];o=k+p|0;while(1){B:{c=a-m|0;w=G[t+(c<<2)>>2];if(!tl(w+p|0,o,q,x,s,r+60|0)){c=a;break B}G[t+(a<<2)>>2]=w;a=c;if((h|0)<=(a|0)){continue}}break}G[t+(c<<2)>>2]=k;n=n+3|0;k=G[r+60>>2];if((k|0)>=0){continue}break t}break}if((e|0)>1){continue}break}k=G[r+60>>2]}if((k|0)<0){break t}break w}Q=t+(d<<2)|0;a=H[q+(p+G[Q>>2]|0)|0];c=H[q+(p+G[t+(l<<2)>>2]|0)|0];g=a>>>0>>0?a:c;e=H[q+(p+G[t+(d+l<<1&-4)>>2]|0)|0];a=a>>>0>c>>>0?a:c;c=a>>>0>e>>>0?e>>>0>>0?g:e:a;g=l;n=g;m=d;a=d;while(1){e=a;C:{if((a|0)>(n|0)){break C}D:while(1){e=(a|0)>(n|0)?a:n;while(1){h=t+(a<<2)|0;K=G[h>>2];V=H[q+(K+p|0)|0];if((V|0)==(c|0)){e=t+(m<<2)|0;G[h>>2]=G[e>>2];G[e>>2]=K;m=m+1|0;h=(a|0)<(n|0);e=a+1|0;a=e;if(h){continue D}break C}if(c>>>0>>0){e=a;break C}h=(a|0)!=(e|0);a=a+1|0;if(h){continue}break}break}e=e+1|0}E:{F:{if((e|0)>(n|0)){break F}G:while(1){a=n;while(1){h=t+(a<<2)|0;K=G[h>>2];V=H[q+(K+p|0)|0];if((V|0)==(c|0)){n=t+(g<<2)|0;G[h>>2]=G[n>>2];G[n>>2]=K;n=a-1|0;g=g-1|0;if((a|0)>(e|0)){continue G}break F}if(c>>>0>V>>>0){break E}h=(a|0)>(e|0);a=a-1|0;if(h){continue}break}break}n=((e|0)>(n|0)?n:e)-1|0}if((g|0)<(m|0)){G[w>>2]=p+1;continue v}a=m-d|0;c=e-m|0;h=(a|0)<(c|0)?a:c;H:{if((h|0)<=0){break H}a=e-h|0;I:{if(!(h&1)){i=d;c=h;break I}c=G[Q>>2];i=t+(a<<2)|0;G[Q>>2]=G[i>>2];G[i>>2]=c;a=a+1|0;i=d+1|0;c=h-1|0}if((h|0)==1){break H}while(1){h=t+(i<<2)|0;K=G[h>>2];Q=t+(a<<2)|0;G[h>>2]=G[Q>>2];G[Q>>2]=K;K=G[h+4>>2];G[h+4>>2]=G[Q+4>>2];G[Q+4>>2]=K;a=a+2|0;i=i+2|0;h=c-3|0;c=c-2|0;if(h>>>0<4294967294){continue}break}}a=l-g|0;n=g-n|0;g=(a|0)<(n|0)?a:n;J:{if((g|0)<=0){break J}a=l-g|0;K:{if(!(g&1)){i=e;c=g;break K}c=t+(e<<2)|0;i=G[c>>2];h=c;a=a+1|0;c=t+(a<<2)|0;G[h>>2]=G[c>>2];G[c>>2]=i;i=e+1|0;c=g-1|0}if((g|0)==1){break J}while(1){g=t+(i<<2)|0;h=G[g>>2];Q=t+(a<<2)|0;G[g>>2]=G[Q+4>>2];G[Q+4>>2]=h;h=G[g+4>>2];K=g;a=a+2|0;g=t+(a<<2)|0;G[K+4>>2]=G[g>>2];G[g>>2]=h;i=i+2|0;g=c-3|0;c=c-2|0;if(g>>>0<4294967294){continue}break}}h=(d-m|0)+e|0;i=h-1|0;e=i-d|0;a=l-n|0;c=a+1|0;g=l-c|0;L:{if((e|0)>=(g|0)){e=g;m=c;c=d;d=l;l=i;break L}m=d;d=i}i=p+1|0;n=a-h|0;M:{if((n|0)<=(e|0)){n=e;e=m;g=a;a=d;d=i;i=p;m=h;break M}e=h;g=d;d=p}N:{if((l-c|0)>=(n|0)){h=e;e=c;n=a;a=l;l=i;i=p;break N}h=c;n=l;l=p}G[Z>>2]=e;G[Y>>2]=a;G[w>>2]=i;a=o<<2;c=a+4|0;e=r+4192|0;G[c+e>>2]=m;G[a+e>>2]=h;e=r+3792|0;G[e+a>>2]=n;G[c+e>>2]=g;e=a;a=r+3392|0;G[e+a>>2]=l;G[a+c>>2]=d;i=o+2|0;break w}n=t+(e<<2)|0;V=G[n>>2];G[n>>2]=K;G[h>>2]=V;n=a-1|0;a=e+1|0;continue}}break}if((i|0)>0){continue}break}if((k|0)<0){break t}v=(C+(v-P|0)|0)+1|0;a=G[O>>2]}G[O>>2]=a|2097152}y=y+1|0;if((y|0)!=256){continue}break}g=A+(r+2112|0)|0;if(H[g|0]){zd(1006)}a=0;while(1){c=a<<2;e=u+(A+(a<<8)<<2)|0;G[c+(r+1088|0)>>2]=G[e>>2]&-2097153;G[c+(r- -64|0)>>2]=(G[e+4>>2]&-2097153)-1;a=a+1|0;if((a|0)!=256){continue}break}d=u+(W<<2)|0;a=G[d>>2]&-2097153;i=A<<2;n=i+(r+1088|0)|0;e=G[n>>2];if((a|0)<(e|0)){while(1){c=G[t+(a<<2)>>2]-1|0;l=(s&c>>31)+c|0;c=H[l+q|0];if(!H[c+(r+2112|0)|0]){e=(r+1088|0)+(c<<2)|0;c=G[e>>2];G[e>>2]=c+1;G[t+(c<<2)>>2]=l;e=G[n>>2]}a=a+1|0;if((e|0)>(a|0)){continue}break}}n=d+1024|0;a=(G[n>>2]&-2097153)-1|0;l=i+(r- -64|0)|0;i=G[l>>2];if((a|0)>(i|0)){while(1){c=G[t+(a<<2)>>2]-1|0;m=(s&c>>31)+c|0;c=H[m+q|0];if(!H[c+(r+2112|0)|0]){i=(r- -64|0)+(c<<2)|0;c=G[i>>2];G[i>>2]=c-1;G[t+(c<<2)>>2]=m;i=G[l>>2]}a=a-1|0;if((i|0)<(a|0)){continue}break}}if(!(!e&(i|0)==(D|0)|(e-1|0)==(i|0))){zd(1007)}c=0;while(1){a=c<<8;e=u+(a+A<<2)|0;G[e>>2]=G[e>>2]|2097152;e=u+(A+(a|256)<<2)|0;G[e>>2]=G[e>>2]|2097152;e=u+(A+(a|512)<<2)|0;G[e>>2]=G[e>>2]|2097152;a=u+(A+(a|768)<<2)|0;G[a>>2]=G[a>>2]|2097152;c=c+4|0;if((c|0)!=256){continue}break}E[g|0]=1;O:{if(T>>>0>254){break O}g=G[n>>2]&-2097153;i=G[d>>2]&-2097153;d=g-i|0;c=0;while(1){a=c;c=a+1|0;if(d>>a>65534){continue}break}e=d-1|0;P:{if((d|0)<=0){break P}c=e;if(d&1){c=G[(t+(g<<2)|0)-4>>2];g=e>>>a|0;F[x+(c<<1)>>1]=g;if((c|0)<=33){F[x+(c+s<<1)>>1]=g}c=d-2|0}if(!e){break P}while(1){d=G[t+(c+i<<2)>>2];g=c>>>a|0;F[x+(d<<1)>>1]=g;if((d|0)<=33){F[x+(d+s<<1)>>1]=g}g=c-1|0;d=G[t+(g+i<<2)>>2];g=g>>>a|0;F[x+(d<<1)>>1]=g;if((d|0)<=33){F[x+(d+s<<1)>>1]=g}d=(c|0)>1;c=c-2|0;if(d){continue}break}}if(e>>a<65536){break O}zd(1002)}T=T+1|0;if((T|0)!=256){continue}break}if((B|0)<4){break t}G[r+16>>2]=s;G[r+20>>2]=v;G[r+24>>2]=s-v;_a(U,73623,r+16|0);break s}if((B|0)<3){break r}}a=z-k|0;G[r>>2]=a;G[r+4>>2]=s;L[r+8>>3]=N(N(a|0)/N(s|0));xb(U,72301,r)}if((k|0)>=0){break n}if((B|0)<2){break o}hb(70237,53,1,U)}p=G[b+16>>2];u=G[b+20>>2];a=0;e=0;i=0;q=Fa-2896|0;Fa=q;if((B|0)>=4){hb(86961,27,1,G[24367])}cb(q+1056|0,0,1028);c=1;if((s|0)>0){if(s-1>>>0>=3){g=s&-4;while(1){d=q+1056|0;n=d+(H[a+u|0]<<2)|0;G[n>>2]=G[n>>2]+1;n=d+(H[u+(a|1)|0]<<2)|0;G[n>>2]=G[n>>2]+1;n=d+(H[u+(a|2)|0]<<2)|0;G[n>>2]=G[n>>2]+1;d=d+(H[u+(a|3)|0]<<2)|0;G[d>>2]=G[d>>2]+1;a=a+4|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}}e=s&3;if(e){while(1){d=(q+1056|0)+(H[a+u|0]<<2)|0;G[d>>2]=G[d>>2]+1;a=a+1|0;i=i+1|0;if((e|0)!=(i|0)){continue}break}}i=G[q+1056>>2]}bb(q+32|0,q+1056|0,1024);while(1){a=(q+1056|0)+(c<<2)|0;e=G[a>>2]+i|0;G[a>>2]=e;e=e+G[a+4>>2]|0;G[a+4>>2]=e;e=e+G[a+8>>2]|0;G[a+8>>2]=e;i=e+G[a+12>>2]|0;G[a+12>>2]=i;c=c+4|0;if((c|0)!=257){continue}break}Q:{if((s|0)<=0){break Q}a=0;if((s|0)!=1){d=s&-2;c=0;while(1){i=q+1056|0;g=i+(H[a+u|0]<<2)|0;e=G[g>>2]-1|0;G[g>>2]=e;G[p+(e<<2)>>2]=a;g=a|1;i=i+(H[g+u|0]<<2)|0;e=G[i>>2]-1|0;G[i>>2]=e;G[p+(e<<2)>>2]=g;a=a+2|0;c=c+2|0;if((d|0)!=(c|0)){continue}break}}if(!(s&1)){break Q}e=(q+1056|0)+(H[a+u|0]<<2)|0;c=G[e>>2]-1|0;G[e>>2]=c;G[p+(c<<2)>>2]=a}if((s|0)>=-63){cb(S,0,((s|0)/32<<2)+8|0)}a=0;c=0;while(1){e=c<<2;d=q+1056|0;i=G[e+d>>2];g=S+(i>>5<<2)|0;G[g>>2]=G[g>>2]|1<>2];d=S+(e>>5<<2)|0;G[d>>2]=G[d>>2]|1<>5<<2)|0;G[e>>2]=G[e>>2]|1<>5<<2)|0;d=G[e>>2];Qc=e,Rc=Eu(-2,c)&d,G[Qc>>2]=Rc;a=a+1|0;if((a|0)!=32){continue}break}v=G[24367];U=(B|0)<4;x=1;while(1){if(!U){G[q+16>>2]=x;_a(v,66110,q+16|0)}a=0;c=0;if((s|0)>0){while(1){e=G[p+(a<<2)>>2]-x|0;c=G[S+(a>>>3&536870908)>>2]>>>a&1?a:c;G[u+((s&e>>31)+e<<2)>>2]=c;a=a+1|0;if((s|0)!=(a|0)){continue}break}}A=0;z=-1;while(1){c=z;while(1){c=c+1|0;a=1<>5<<2)>>2];if(c&31?a:0){continue}break}if(a){while(1){a=c;c=a+32|0;if(G[S+(a>>5<<2)>>2]==-1){continue}break}while(1){c=a;a=a+1|0;if(G[S+(c>>5<<2)>>2]>>>c&1){continue}break}}R:{a=c;if((s|0)<(a|0)){break R}while(1){i=a;e=G[S+(a>>5<<2)>>2]&1<>5<<2)>>2]){continue}break}while(1){i=a;a=a+1|0;if(!(G[S+(i>>5<<2)>>2]>>>i&1)){continue}break}}if((i|0)>(s|0)){break R}z=i-1|0;if((c|0)>=(i|0)){continue}B=c-1|0;G[q+2496>>2]=B;G[q+2096>>2]=z;A=((A-c|0)+z|0)+2|0;k=1;T=0;while(1){D=k;if(k>>>0>=99){zd(1004)}k=D-1|0;a=k<<2;O=a+(q+2096|0)|0;e=G[O>>2];P=a+(q+2496|0)|0;l=G[P>>2];a=e-l|0;S:{if((a|0)<=9){T:{if((e|0)==(l|0)){break T}U:{if((a|0)<4){break U}a=e-4|0;if((l|0)>(a|0)){break U}while(1){g=a;m=G[p+(a<<2)>>2];d=a+4|0;V:{if((e|0)<(d|0)){break V}h=G[u+(m<<2)>>2];n=g;while(1){a=d;d=G[p+(a<<2)>>2];if(h>>>0<=J[u+(d<<2)>>2]){a=n;break V}G[p+(n<<2)>>2]=d;n=a;d=a+4|0;if((e|0)>=(d|0)){continue}break}}G[p+(a<<2)>>2]=m;a=g-1|0;if((g|0)>(l|0)){continue}break}}if((e|0)<=(l|0)){break T}g=e+1|0;a=e;while(1){d=a-1|0;n=G[p+(d<<2)>>2];if((a|0)<=(e|0)){m=G[u+(n<<2)>>2];W:{while(1){h=p+(a<<2)|0;o=G[h>>2];if(m>>>0<=J[u+(o<<2)>>2]){break W}G[h-4>>2]=o;h=(a|0)!=(e|0);a=a+1|0;if(h){continue}break}a=g}a=a-1|0}else{a=d}G[(a<<2)+p>>2]=n;a=d;if((l|0)<(a|0)){continue}break}}if((D|0)>1){continue}break S}a=l;X:{Y:{Z:{T=M(T,7621)+1&32767;switch((T>>>0)%3|0){case 0:break X;case 1:break Z;default:break Y}}a=e+l>>1;break X}a=e}d=G[u+(G[p+(a<<2)>>2]<<2)>>2];m=e;h=e;o=l;a=l;while(1){g=a;_:{if((a|0)>(h|0)){break _}$:while(1){g=(a|0)>(h|0)?a:h;while(1){n=p+(a<<2)|0;y=G[n>>2];w=G[u+(y<<2)>>2];if((w|0)==(d|0)){g=p+(o<<2)|0;G[n>>2]=G[g>>2];G[g>>2]=y;o=o+1|0;n=(a|0)<(h|0);g=a+1|0;a=g;if(n){continue $}break _}if((d|0)<(w|0)){g=a;break _}n=(a|0)!=(g|0);a=a+1|0;if(n){continue}break}break}g=g+1|0}aa:{ba:{ca:{if((g|0)>(h|0)){break ca}da:while(1){a=h;while(1){n=p+(a<<2)|0;y=G[n>>2];w=G[u+(y<<2)>>2];if((w|0)==(d|0)){h=n;n=p+(m<<2)|0;G[h>>2]=G[n>>2];G[n>>2]=y;h=a-1|0;m=m-1|0;if((a|0)>(g|0)){continue da}break ca}if((d|0)>(w|0)){break ba}n=(a|0)>(g|0);a=a-1|0;if(n){continue}break}break}h=((g|0)>(h|0)?h:g)-1|0}if((m|0)<(o|0)){break aa}a=o-l|0;d=g-o|0;k=(a|0)<(d|0)?a:d;ea:{if((k|0)<=0){break ea}a=g-k|0;fa:{if(!(k&1)){n=l;d=k;break fa}d=p+(l<<2)|0;n=G[d>>2];C=d;d=p+(a<<2)|0;G[C>>2]=G[d>>2];G[d>>2]=n;a=a+1|0;n=l+1|0;d=k-1|0}if((k|0)==1){break ea}while(1){k=p+(n<<2)|0;w=G[k>>2];y=p+(a<<2)|0;G[k>>2]=G[y>>2];G[y>>2]=w;w=G[k+4>>2];G[k+4>>2]=G[y+4>>2];G[y+4>>2]=w;a=a+2|0;n=n+2|0;k=d-3|0;d=d-2|0;if(k>>>0<4294967294){continue}break}}a=e-m|0;h=m-h|0;m=(a|0)<(h|0)?a:h;ga:{if((m|0)<=0){break ga}a=e-m|0;ha:{if(!(m&1)){n=g;d=m;break ha}d=p+(g<<2)|0;n=G[d>>2];k=d;a=a+1|0;d=p+(a<<2)|0;G[k>>2]=G[d>>2];G[d>>2]=n;n=g+1|0;d=m-1|0}if((m|0)==1){break ga}while(1){m=p+(n<<2)|0;k=G[m>>2];y=p+(a<<2)|0;G[m>>2]=G[y+4>>2];G[y+4>>2]=k;k=G[m+4>>2];C=m;a=a+2|0;m=p+(a<<2)|0;G[C+4>>2]=G[m>>2];G[m>>2]=k;n=n+2|0;m=d-3|0;d=d-2|0;if(m>>>0<4294967294){continue}break}}d=(l+(o^-1)|0)+g|0;a=(e-h|0)+1|0;ia:{if((d-l|0)>(e-a|0)){G[O>>2]=d;break ia}G[P>>2]=a;a=l;e=d}d=D<<2;G[d+(q+2096|0)>>2]=e;G[d+(q+2496|0)>>2]=a;k=D+1|0;break aa}h=p+(g<<2)|0;w=G[h>>2];G[h>>2]=y;G[n>>2]=w;h=a-1|0;a=g+1|0;continue}break}if((k|0)>0){continue}}break}a=-1;if((c|0)>(i|0)){continue}while(1){c=G[u+(G[p+(B<<2)>>2]<<2)>>2];if((c|0)!=(a|0)){a=S+(B>>5<<2)|0;G[a>>2]=G[a>>2]|1<>2]=A;_a(v,68866,q);x=x<<1;if(A?(s|0)>=(x|0):0){continue}hb(86927,33,1,v);break ja}x=x<<1;if((s|0)<(x|0)){break ja}if(A){continue}}break}ka:{if((s|0)<=0){break ka}i=s&1;la:{if((s|0)==1){e=0;a=0;break la}g=s&-2;e=0;a=0;d=0;while(1){c=a;a=a+1|0;n=(q+32|0)+(c<<2)|0;l=G[n>>2];if(!l){continue}G[n>>2]=l-1;E[u+G[p+(e<<2)>>2]|0]=c;n=e|1;while(1){a=c;c=a+1|0;l=(q+32|0)+(a<<2)|0;m=G[l>>2];if(!m){continue}break}G[l>>2]=m-1;E[u+G[p+(n<<2)>>2]|0]=a;e=e+2|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}if(i){while(1){c=a;a=a+1|0;d=(q+32|0)+(c<<2)|0;i=G[d>>2];if(!i){continue}break}G[d>>2]=i-1;E[u+G[p+(e<<2)>>2]|0]=c;a=c}if((a|0)<256){break ka}zd(1005)}Fa=q+2896|0}G[b+28>>2]=-1;c=G[b+68>>2];ma:{if((c|0)>0){a=0;while(1){if(!G[t+(a<<2)>>2]){G[b+28>>2]=a;break ma}a=a+1|0;if((c|0)!=(a|0)){continue}break}}zd(1003)}Fa=r+4592|0;a=G[b+68>>2]}G[b+44>>2]=G[b+20>>2]+a;if(G[b+620>>2]==1){G[b+600>>2]=1107296256;G[b+604>>2]=8;a=G[b+76>>2];h=1107296256;while(1){E[G[b+44>>2]+a|0]=h>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;h=G[b+600>>2]<<8;G[b+600>>2]=h;c=G[b+604>>2];G[b+604>>2]=c-8;if((c|0)>15){continue}break}G[b+604>>2]=c;h=90<<32-c|h;G[b+600>>2]=h;if((c|0)>=8){while(1){E[G[b+44>>2]+a|0]=h>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;h=G[b+600>>2]<<8;G[b+600>>2]=h;e=G[b+604>>2];c=e-8|0;G[b+604>>2]=c;if((e|0)>15){continue}break}}e=c+8|0;G[b+604>>2]=e;h=104<<24-c|h;G[b+600>>2]=h;d=G[b+624>>2]+48|0;if((c|0)>=0){while(1){E[G[b+44>>2]+a|0]=h>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;h=G[b+600>>2]<<8;G[b+600>>2]=h;c=G[b+604>>2];e=c-8|0;G[b+604>>2]=e;if((c|0)>15){continue}break}}G[b+604>>2]=e+8;G[b+600>>2]=(d&255)<<24-e|h;a=G[b+68>>2]}if((a|0)>0){d=G[b+604>>2];na:{if((d|0)<=7){a=G[b+600>>2];break na}c=G[b+76>>2];a=G[b+600>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=49<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}d=e+8|0;G[b+604>>2]=d;a=65<<24-e|a;G[b+600>>2]=a;if((e|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=89<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}d=e+8|0;G[b+604>>2]=d;a=38<<24-e|a;G[b+600>>2]=a;if((e|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=83<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}G[b+604>>2]=e+8;G[b+600>>2]=89<<24-e|a;Fq(b,G[b+608>>2]);e=G[b+604>>2];oa:{if((e|0)<=7){a=G[b+600>>2];break oa}c=G[b+76>>2];a=G[b+600>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}G[b+600>>2]=a;d=e+1|0;G[b+604>>2]=d;i=G[b+28>>2];if((e|0)>=7){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}G[b+604>>2]=d+24;G[b+600>>2]=i<<8-d|a;G[b+84>>2]=0;i=G[b+40>>2];m=G[b+36>>2];p=G[b+32>>2];a=0;while(1){c=a+b|0;if(H[c+88|0]){E[c+344|0]=f;f=f+1|0;G[b+84>>2]=f}c=(a|1)+b|0;if(H[c+88|0]){E[c+344|0]=f;f=f+1|0;G[b+84>>2]=f}a=a+2|0;if((a|0)!=256){continue}break}pa:{if((f|0)<-1){break pa}a=0;cb(b+632|0,0,(f<<2)+8|0);if((f|0)<=0){break pa}if(f-1>>>0>=7){d=f&-8;c=0;while(1){e=R+32|0;E[e+a|0]=a;g=a|1;E[g+e|0]=g;g=a|2;E[g+e|0]=g;g=a|3;E[g+e|0]=g;g=a|4;E[g+e|0]=g;g=a|5;E[g+e|0]=g;g=a|6;E[g+e|0]=g;g=e;e=a|7;E[g+e|0]=e;a=a+8|0;c=c+8|0;if((d|0)!=(c|0)){continue}break}}e=f&7;if(!e){break pa}c=0;while(1){E[(R+32|0)+a|0]=a;a=a+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}a=G[b+68>>2];qa:{if((a|0)<=0){h=0;break qa}g=b+632|0;n=b+636|0;d=R+32|1;h=0;while(1){c=H[R+32|0];e=G[p+(X<<2)>>2]-1|0;l=H[(H[m+((e>>31&a)+e|0)|0]+b|0)+344|0];ra:{if((c|0)==(l|0)){j=j+1|0;break ra}if((j|0)>0){c=j-1|0;a=c&1;e=a?n:g;G[e>>2]=G[e>>2]+1;F[i+(h<<1)>>1]=a;h=h+1|0;if(j>>>0>=3){while(1){a=c-2|0;c=a&2;e=c?n:g;G[e>>2]=G[e>>2]+1;F[i+(h<<1)>>1]=c>>>1;h=h+1|0;c=a>>>1|0;if(a>>>0>3){continue}break}}j=0;c=H[R+32|0]}e=H[R+33|0];E[R+33|0]=c;a=d;if((e|0)!=(l|0)){while(1){c=H[a+1|0];E[a+1|0]=e;a=a+1|0;e=c;if((c|0)!=(l|0)){continue}break}}E[R+32|0]=l;a=(a-R|0)-31|0;F[i+(h<<1)>>1]=a;a=(a<<2)+b|0;G[a+632>>2]=G[a+632>>2]+1;h=h+1|0;a=G[b+68>>2]}X=X+1|0;if((X|0)<(a|0)){continue}break}if((j|0)<=0){break qa}c=j-1|0;a=c&1;e=a?n:g;G[e>>2]=G[e>>2]+1;F[i+(h<<1)>>1]=a;h=h+1|0;if(j>>>0<3){break qa}while(1){a=c-2|0;c=a&2;e=c?n:g;G[e>>2]=G[e>>2]+1;F[i+(h<<1)>>1]=c>>>1;h=h+1|0;c=a>>>1|0;if(a>>>0>3){continue}break}}a=f+1|0;F[i+(h<<1)>>1]=a;a=(a<<2)+b|0;G[a+632>>2]=G[a+632>>2]+1;G[b+628>>2]=h+1;l=0;o=Fa-208|0;Fa=o;D=G[b+40>>2];if(G[b+616>>2]>=3){a=G[b+68>>2];c=G[b+628>>2];G[o+136>>2]=G[b+84>>2];G[o+132>>2]=c;G[o+128>>2]=a;_a(G[24367],72501,o+128|0)}t=G[b+84>>2];k=t+2|0;z=(k|0)>1?k:1;x=b+37668|0;if((t|0)>=-1){cb(x,15,z);cb(b+37926|0,15,z);cb(b+38184|0,15,z);cb(b+38442|0,15,z);cb(b+38700|0,15,z);cb(b+38958|0,15,z)}f=G[b+628>>2];if((f|0)<=0){zd(3001);f=G[b+628>>2]}p=2;sa:{if((f|0)<200){break sa}p=3;if(f>>>0<600){break sa}p=4;if(f>>>0<1200){break sa}_=f>>>0>2399;p=f>>>0<2400?5:6}r=z&2147483644;h=z&3;S=z-1|0;q=G[24367];d=p;while(1){a=l-1|0;i=d;e=0;d=(f|0)/(d|0)|0;ta:{if((d|0)<=0){break ta}if((a|0)>(t|0)){break ta}while(1){c=a;a=a+1|0;g=(a<<2)+b|0;e=G[g+632>>2]+e|0;if((c|0)<(t|0)&(d|0)>(e|0)){continue}break}if((i|0)==(p|0)|(c|0)<(l|0)){break ta}if((i|0)==1|(p-i&-2147483647)!=1){break ta}a=c;e=e-G[g+632>>2]|0}c=e;if(G[b+616>>2]>=3){e=G[b+628>>2];G[o+108>>2]=c;L[o+112>>3]=+N(c|0)*100/+N(e|0);G[o+104>>2]=a;G[o+100>>2]=l;G[o+96>>2]=i;xb(q,89345,o+96|0)}d=i-1|0;ua:{if((t|0)<-1){break ua}m=0;e=0;g=0;if(S>>>0>=3){while(1){n=(M(d,258)+b|0)+37668|0;E[n+e|0]=(e|0)<(l|0)?15:(a|0)<(e|0)?15:0;j=e|1;E[j+n|0]=(j|0)<(l|0)?15:(a|0)<=(e|0)?15:0;j=e|2;E[j+n|0]=(j|0)<(l|0)?15:(a|0)<(j|0)?15:0;P=n;n=e|3;E[P+n|0]=(l|0)>(n|0)?15:(a|0)<(n|0)?15:0;e=e+4|0;g=g+4|0;if((r|0)!=(g|0)){continue}break}}if(!h){break ua}while(1){E[((M(d,258)+b|0)+e|0)+37668|0]=(e|0)<(l|0)?15:(a|0)<(e|0)?15:0;e=e+1|0;m=m+1|0;if((h|0)!=(m|0)){continue}break}}f=f-c|0;l=a+1|0;if((i|0)>1){continue}break}s=(t|0)<-1;Ja=s|!_;h=b+51600|0;Ka=b+50568|0;La=b+49536|0;Ma=b+48504|0;Na=b+47472|0;Oa=b+46440|0;Pa=b+45408|0;Qa=p<<1;f=z<<2;Ra=p<<2;u=(p|0)==5;while(1){cb(o+160|0,0,Ra);if(!s){cb(Pa,0,f);cb(Oa,0,f)}n=(p|0)==2;va:{if(n){break va}if(!s){cb(Na,0,f)}if((p|0)==3){break va}if(!s){cb(Ma,0,f)}if((p|0)==4){break va}if(!s){cb(La,0,f)}if(u){break va}if(!s){cb(Ka,0,f)}if(s|(p|0)==6){break va}cb(h,0,f)}e=0;if(!Ja){while(1){c=(e<<4)+b|0;a=b+e|0;G[c+51600>>2]=H[e+x|0]|H[a+37926|0]<<16;G[c+51604>>2]=H[a+38184|0]|H[a+38442|0]<<16;G[c+51608>>2]=H[a+38700|0]|H[a+38958|0]<<16;e=e+1|0;if((z|0)!=(e|0)){continue}break}}e=0;j=0;r=0;l=G[b+628>>2];if((l|0)>0){while(1){cb(o+196|0,0,Qa);g=e+49|0;i=(g|0)<(l|0)?g:l-1|0;m=i-e|0;Ga=(m|0)==49&_;wa:{if(!Ga){c=e;if((i|0)<(c|0)){break wa}while(1){a=c;c=I[(a<<1)+D>>1]+b|0;F[o+196>>1]=I[o+196>>1]+H[c+37668|0];F[o+198>>1]=I[o+198>>1]+H[c+37926|0];xa:{if(n){break xa}F[o+200>>1]=I[o+200>>1]+H[c+38184|0];if((p|0)==3){break xa}F[o+202>>1]=I[o+202>>1]+H[c+38442|0];if((p|0)==4){break xa}F[o+204>>1]=I[o+204>>1]+H[c+38700|0];if(u){break xa}F[o+206>>1]=I[o+206>>1]+H[c+38958|0];if((p|0)==6){break xa}F[o+208>>1]=I[o+208>>1]+H[c+39216|0]}c=a+1|0;if((a|0)!=(i|0)){continue}break}break wa}c=(I[(g<<1)+D>>1]<<4)+h|0;Sa=G[c>>2];a=(e<<1)+D|0;d=(I[a+96>>1]<<4)+h|0;Ta=G[d>>2];l=(I[a+94>>1]<<4)+h|0;Ua=G[l>>2];A=(I[a+92>>1]<<4)+h|0;Va=G[A>>2];B=(I[a+90>>1]<<4)+h|0;Wa=G[B>>2];T=(I[a+88>>1]<<4)+h|0;Xa=G[T>>2];v=(I[a+86>>1]<<4)+h|0;Ya=G[v>>2];y=(I[a+84>>1]<<4)+h|0;Za=G[y>>2];U=(I[a+82>>1]<<4)+h|0;$a=G[U>>2];X=(I[a+80>>1]<<4)+h|0;ab=G[X>>2];O=(I[a+78>>1]<<4)+h|0;db=G[O>>2];P=(I[a+76>>1]<<4)+h|0;eb=G[P>>2];w=(I[a+74>>1]<<4)+h|0;fb=G[w>>2];Q=(I[a+72>>1]<<4)+h|0;gb=G[Q>>2];W=(I[a+70>>1]<<4)+h|0;ib=G[W>>2];C=(I[a+68>>1]<<4)+h|0;jb=G[C>>2];Y=(I[a+66>>1]<<4)+h|0;kb=G[Y>>2];Z=(I[a- -64>>1]<<4)+h|0;lb=G[Z>>2];K=(I[a+62>>1]<<4)+h|0;mb=G[K>>2];V=(I[a+60>>1]<<4)+h|0;nb=G[V>>2];aa=(I[a+58>>1]<<4)+h|0;ob=G[aa>>2];ba=(I[a+56>>1]<<4)+h|0;pb=G[ba>>2];ca=(I[a+54>>1]<<4)+h|0;qb=G[ca>>2];da=(I[a+52>>1]<<4)+h|0;rb=G[da>>2];ea=(I[a+50>>1]<<4)+h|0;sb=G[ea>>2];fa=(I[a+48>>1]<<4)+h|0;tb=G[fa>>2];ga=(I[a+46>>1]<<4)+h|0;ub=G[ga>>2];ha=(I[a+44>>1]<<4)+h|0;vb=G[ha>>2];ia=(I[a+42>>1]<<4)+h|0;wb=G[ia>>2];ja=(I[a+40>>1]<<4)+h|0;yb=G[ja>>2];ka=(I[a+38>>1]<<4)+h|0;zb=G[ka>>2];la=(I[a+36>>1]<<4)+h|0;Ab=G[la>>2];ma=(I[a+34>>1]<<4)+h|0;Bb=G[ma>>2];na=(I[a+32>>1]<<4)+h|0;Cb=G[na>>2];oa=(I[a+30>>1]<<4)+h|0;Db=G[oa>>2];pa=(I[a+28>>1]<<4)+h|0;Eb=G[pa>>2];qa=(I[a+26>>1]<<4)+h|0;Fb=G[qa>>2];ra=(I[a+24>>1]<<4)+h|0;Gb=G[ra>>2];sa=(I[a+22>>1]<<4)+h|0;Hb=G[sa>>2];ta=(I[a+20>>1]<<4)+h|0;Ib=G[ta>>2];ua=(I[a+18>>1]<<4)+h|0;Jb=G[ua>>2];va=(I[a+16>>1]<<4)+h|0;Kb=G[va>>2];wa=(I[a+14>>1]<<4)+h|0;Lb=G[wa>>2];xa=(I[a+12>>1]<<4)+h|0;Mb=G[xa>>2];ya=(I[a+10>>1]<<4)+h|0;Nb=G[ya>>2];za=(I[a+8>>1]<<4)+h|0;Ob=G[za>>2];Aa=(I[a+6>>1]<<4)+h|0;Pb=G[Aa>>2];Ba=(I[a+4>>1]<<4)+h|0;Qb=G[Ba>>2];Ca=(I[a>>1]<<4)+h|0;Rb=G[Ca>>2];a=(I[a+2>>1]<<4)+h|0;Sb=G[a>>2];Tb=G[c+4>>2];Vb=G[d+4>>2];Wb=G[l+4>>2];Xb=G[A+4>>2];Yb=G[B+4>>2];Zb=G[T+4>>2];_b=G[v+4>>2];$b=G[y+4>>2];ac=G[U+4>>2];bc=G[X+4>>2];cc=G[O+4>>2];dc=G[P+4>>2];ec=G[w+4>>2];fc=G[Q+4>>2];gc=G[W+4>>2];hc=G[C+4>>2];ic=G[Y+4>>2];jc=G[Z+4>>2];kc=G[K+4>>2];lc=G[V+4>>2];mc=G[aa+4>>2];nc=G[ba+4>>2];oc=G[ca+4>>2];pc=G[da+4>>2];qc=G[ea+4>>2];rc=G[fa+4>>2];sc=G[ga+4>>2];tc=G[ha+4>>2];uc=G[ia+4>>2];vc=G[ja+4>>2];wc=G[ka+4>>2];xc=G[la+4>>2];yc=G[ma+4>>2];zc=G[na+4>>2];Ac=G[oa+4>>2];Bc=G[pa+4>>2];Cc=G[qa+4>>2];Dc=G[ra+4>>2];Ec=G[sa+4>>2];Fc=G[ta+4>>2];Gc=G[ua+4>>2];Hc=G[va+4>>2];Ic=G[wa+4>>2];Jc=G[xa+4>>2];Kc=G[ya+4>>2];Lc=G[za+4>>2];Mc=G[Aa+4>>2];Nc=G[Ba+4>>2];Oc=G[Ca+4>>2];Pc=G[a+4>>2];a=G[c+8>>2]+(G[d+8>>2]+(G[l+8>>2]+(G[A+8>>2]+(G[B+8>>2]+(G[T+8>>2]+(G[v+8>>2]+(G[y+8>>2]+(G[U+8>>2]+(G[X+8>>2]+(G[O+8>>2]+(G[P+8>>2]+(G[w+8>>2]+(G[Q+8>>2]+(G[W+8>>2]+(G[C+8>>2]+(G[Y+8>>2]+(G[Z+8>>2]+(G[K+8>>2]+(G[V+8>>2]+(G[aa+8>>2]+(G[ba+8>>2]+(G[ca+8>>2]+(G[da+8>>2]+(G[ea+8>>2]+(G[fa+8>>2]+(G[ga+8>>2]+(G[ha+8>>2]+(G[ia+8>>2]+(G[ja+8>>2]+(G[ka+8>>2]+(G[la+8>>2]+(G[ma+8>>2]+(G[na+8>>2]+(G[oa+8>>2]+(G[pa+8>>2]+(G[qa+8>>2]+(G[ra+8>>2]+(G[sa+8>>2]+(G[ta+8>>2]+(G[ua+8>>2]+(G[va+8>>2]+(G[wa+8>>2]+(G[xa+8>>2]+(G[ya+8>>2]+(G[za+8>>2]+(G[Aa+8>>2]+(G[Ba+8>>2]+(G[a+8>>2]+G[Ca+8>>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;F[o+204>>1]=a;F[o+206>>1]=a>>>16;a=((((((((((((((gc+(hc+(ic+(jc+(kc+(lc+(mc+(nc+(oc+(pc+(qc+(rc+(sc+(tc+(uc+(vc+(wc+(xc+(yc+(zc+(Ac+(Bc+(Cc+(Dc+(Ec+(Fc+(Gc+(Hc+(Ic+(Jc+(Kc+(Lc+(Mc+(Nc+(Oc+Pc|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)+fc|0)+ec|0)+dc|0)+cc|0)+bc|0)+ac|0)+$b|0)+_b|0)+Zb|0)+Yb|0)+Xb|0)+Wb|0)+Vb|0)+Tb|0;F[o+200>>1]=a;F[o+202>>1]=a>>>16;a=((((((((((((((((((((((((((((((((((((((((((((((((Rb+Sb|0)+Qb|0)+Pb|0)+Ob|0)+Nb|0)+Mb|0)+Lb|0)+Kb|0)+Jb|0)+Ib|0)+Hb|0)+Gb|0)+Fb|0)+Eb|0)+Db|0)+Cb|0)+Bb|0)+Ab|0)+zb|0)+yb|0)+wb|0)+vb|0)+ub|0)+tb|0)+sb|0)+rb|0)+qb|0)+pb|0)+ob|0)+nb|0)+mb|0)+lb|0)+kb|0)+jb|0)+ib|0)+gb|0)+fb|0)+eb|0)+db|0)+ab|0)+$a|0)+Za|0)+Ya|0)+Xa|0)+Wa|0)+Va|0)+Ua|0)+Ta|0)+Sa|0;F[o+196>>1]=a;F[o+198>>1]=a>>>16}a=I[o+196>>1];c=I[o+198>>1];d=(a|0)<(c|0)?a:c;c=a>>>0>c>>>0;ya:{if(n){break ya}a=I[o+200>>1];c=a>>>0>>0?2:c;d=(a|0)>(d|0)?d:a;if((p|0)==3){break ya}a=I[o+202>>1];c=a>>>0>>0?3:c;d=(a|0)>(d|0)?d:a;if((p|0)==4){break ya}a=I[o+204>>1];c=a>>>0>>0?4:c;d=(a|0)>(d|0)?d:a;if(u){break ya}a=I[o+206>>1];c=a>>>0>>0?5:c;d=(a|0)>(d|0)?d:a;if((p|0)==6){break ya}a=I[o+208>>1];c=a>>>0>>0?6:c;d=(a|0)>(d|0)?d:a}a=(o+160|0)+(c<<2)|0;G[a>>2]=G[a>>2]+1;E[(b+r|0)+1664|0]=c;za:{if(!Ga){if((e|0)>(i|0)){break za}l=0;a=m+1&3;if(a){while(1){g=((M(c,1032)+b|0)+(I[(e<<1)+D>>1]<<2)|0)+45408|0;G[g>>2]=G[g>>2]+1;e=e+1|0;l=l+1|0;if((a|0)!=(l|0)){continue}break}}if(m>>>0<3){break za}while(1){a=(M(c,1032)+b|0)+45408|0;g=(e<<1)+D|0;l=a+(I[g>>1]<<2)|0;G[l>>2]=G[l>>2]+1;l=a+(I[g+2>>1]<<2)|0;G[l>>2]=G[l>>2]+1;g=a+(I[g+4>>1]<<2)|0;G[g>>2]=G[g>>2]+1;g=e+3|0;a=a+(I[(g<<1)+D>>1]<<2)|0;G[a>>2]=G[a>>2]+1;e=e+4|0;if((g|0)!=(i|0)){continue}break}break za}a=(M(c,1032)+b|0)+45408|0;e=(e<<1)+D|0;c=a+(I[e>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+2>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+4>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+6>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+8>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+10>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+12>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+14>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+16>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+18>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+20>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+22>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+24>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+26>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+28>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+30>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+32>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+34>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+36>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+38>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+40>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+42>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+44>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+46>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+48>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+50>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+52>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+54>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+56>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+58>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+60>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+62>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e- -64>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+66>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+68>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+70>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+72>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+74>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+76>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+78>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+80>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+82>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+84>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+86>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+88>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+90>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+92>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+94>>1]<<2)|0;G[c>>2]=G[c>>2]+1;c=a+(I[e+96>>1]<<2)|0;G[c>>2]=G[c>>2]+1;a=a+(I[(g<<1)+D>>1]<<2)|0;G[a>>2]=G[a>>2]+1}r=r+1|0;j=d+j|0;e=i+1|0;l=G[b+628>>2];if((e|0)<(l|0)){continue}break}}if(G[b+616>>2]>=3){G[o+84>>2]=(j|0)/8;G[o+80>>2]=$+1;_a(q,66402,o+80|0);e=0;while(1){G[o+64>>2]=G[(o+160|0)+(e<<2)>>2];_a(q,66542,o- -64|0);e=e+1|0;if((p|0)!=(e|0)){continue}break}Ub(10,q)}e=0;while(1){j=(M(e,258)+b|0)+37668|0;a=(M(e,1032)+b|0)+45408|0;c=0;m=0;l=Fa-5168|0;Fa=l;d=(k|0)<=0;Aa:{if(d){break Aa}if((k|0)!=1){i=k&-2;while(1){g=c<<2;n=g|4;A=l+2064|0;g=G[a+g>>2];G[n+A>>2]=g?g<<8:256;c=c+2|0;g=G[a+n>>2];G[A+(c<<2)>>2]=g?g<<8:256;m=m+2|0;if((i|0)!=(m|0)){continue}break}}if(!(k&1)){break Aa}c=c<<2;a=G[c+a>>2];G[(c+l|0)+2068>>2]=a?a<<8:256}G[l+2064>>2]=0;G[l+4128>>2]=0;G[l>>2]=-2;Ba:{if(d){break Ba}y=k<<2;U=l|4;A=k&-2;B=k&1;T=k-1|0;X=k>>>0<260;while(1){cb(U,255,y);i=0;g=1;while(1){n=l+4128|0;i=i+1|0;G[n+(i<<2)>>2]=g;v=l+2064|0;d=G[v+(g<<2)>>2];c=i;a=c>>>1|0;m=G[n+(a<<2)>>2];if((d|0)>2]){while(1){n=l+4128|0;G[n+(c<<2)>>2]=m;c=a;a=a>>>1|0;m=G[n+(a<<2)>>2];if((d|0)>2]){continue}break}}G[(l+4128|0)+(c<<2)>>2]=g;g=g+1|0;if((i|0)!=(k|0)){continue}break}if(!X){zd(2001)}g=k;i=g;if((g|0)>=2){while(1){O=G[l+4132>>2];v=G[(l+4128|0)+(i<<2)>>2];G[l+4132>>2]=v;n=i-1|0;c=1;a=1;Ca:{if(i>>>0<3){break Ca}m=2;P=G[(l+2064|0)+(v<<2)>>2];d=1;while(1){K=l+2064|0;w=l+4128|0;if((n|0)<=(m|0)){a=m}else{a=m|1;C=a;W=l+2064|0;Q=a<<2;a=l+4128|0;a=G[W+(G[Q+a>>2]<<2)>>2]>2]<<2)>>2]?C:m}m=G[w+(a<<2)>>2];if((P|0)>2]){a=d;break Ca}G[(l+4128|0)+(d<<2)>>2]=m;d=a;m=a<<1;if((m|0)<(i|0)){continue}break}}d=a<<2;a=l+4128|0;G[d+a>>2]=v;P=G[l+4132>>2];w=a+(n<<2)|0;m=G[w>>2];G[l+4132>>2]=m;Da:{if((i|0)<4){break Da}v=i-2|0;a=2;Q=G[(l+2064|0)+(m<<2)>>2];d=1;while(1){c=l+2064|0;W=l+4128|0;if((a|0)<(v|0)){C=a|1;K=C;Y=l+2064|0;V=C<<2;C=l+4128|0;a=G[Y+(G[V+C>>2]<<2)>>2]>2]<<2)>>2]?K:a}C=c;c=a;a=G[(a<<2)+W>>2];if((Q|0)>2]){c=d;break Da}G[(l+4128|0)+(d<<2)>>2]=a;d=c;a=c<<1;if((v|0)>=(a|0)){continue}break}}v=P<<2;g=g+1|0;G[v+l>>2]=g;a=O<<2;G[a+l>>2]=g;O=l+4128|0;G[O+(c<<2)>>2]=m;c=g<<2;G[c+l>>2]=-1;d=l+2064|0;m=G[d+a>>2];a=m&255;P=c+d|0;c=G[d+v>>2];v=c&255;v=(a>>>0>v>>>0?a:v)+1|(c&-256)+(m&-256);G[P>>2]=v;G[w>>2]=g;c=n;a=c>>1;m=G[O+(a<<2)>>2];if((v|0)>2]){while(1){d=l+4128|0;G[d+(c<<2)>>2]=m;c=a;a=a>>1;m=G[d+(a<<2)>>2];if((v|0)>2]){continue}break}}G[(l+4128|0)+(c<<2)>>2]=g;a=i>>>0>2;i=n;if(a){continue}break}}if((g|0)>=516){zd(2002)}v=(k|0)<=0;if(v){break Ba}g=0;i=1;m=0;if(T){while(1){c=i;a=0;while(1){d=a;a=a+1|0;c=G[l+(c<<2)>>2];if((c|0)>=0){continue}break}O=i+j|0;E[O-1|0]=d;c=i+1|0;a=0;while(1){n=a;a=a+1|0;c=G[l+(c<<2)>>2];if((c|0)>=0){continue}break}E[O|0]=n;g=(n|0)>17?1:(d|0)>17?1:g;i=i+2|0;m=m+2|0;if((A|0)!=(m|0)){continue}break}}c=0;a=i;if(B){while(1){d=c;c=c+1|0;a=G[l+(a<<2)>>2];if((a|0)>=0){continue}break}E[(i+j|0)-1|0]=d;g=(d|0)>17?1:g}if(!(g&255)){break Ba}Ea:{if(!v){m=0;c=1;if(!T){break Ea}while(1){a=(l+2064|0)+(c<<2)|0;G[a>>2]=((G[a>>2]>>8)/2<<8)+256;G[a+4>>2]=((G[a+4>>2]>>8)/2<<8)+256;c=c+2|0;m=m+2|0;if((A|0)!=(m|0)){continue}break}break Ea}G[l+2064>>2]=0;G[l+4128>>2]=0;G[l>>2]=-2;break Ba}if(B){a=(l+2064|0)+(c<<2)|0;G[a>>2]=((G[a>>2]>>8)/2<<8)+256}G[l+2064>>2]=0;G[l+4128>>2]=0;G[l>>2]=-2;if(!v){continue}break}}Fa=l+5168|0;e=e+1|0;if((p|0)!=(e|0)){continue}break}$=$+1|0;if(($|0)!=4){continue}break}if((r|0)>=18003){zd(3003)}E[o+144|0]=0;E[o+145|0]=1;Fa:{if((p|0)==2){break Fa}E[o+146|0]=2;if((p|0)==3){break Fa}E[o+147|0]=3;if((p|0)==4){break Fa}E[o+148|0]=4;if((p|0)==5){break Fa}E[o+149|0]=5;if((p|0)==6){break Fa}E[o+150|0]=6}if((r|0)>0){m=0;a=H[o+144|0];while(1){l=0;d=b+m|0;c=H[d+1664|0];if((c|0)!=(a&255)){while(1){l=l+1|0;i=l+(o+144|0)|0;e=H[i|0];E[i|0]=a;a=e;if((c|0)!=(a|0)){continue}break}}E[d+19666|0]=l;a=c;m=m+1|0;if((r|0)!=(m|0)){continue}break}}s=z&2147483644;f=z&3;q=(t|0)<-1;g=0;while(1){a=32;l=0;Ga:{if(q){break Ga}d=0;e=0;j=0;if(S>>>0>=3){while(1){c=(M(g,258)+b|0)+37668|0;i=H[c+e|0];a=(a|0)<(i|0)?a:i;n=H[c+(e|1)|0];a=(a|0)<(n|0)?a:n;m=H[c+(e|2)|0];a=(a|0)<(m|0)?a:m;c=H[c+(e|3)|0];a=(a|0)<(c|0)?a:c;i=(i|0)<(l|0)?l:i;i=(i|0)>(n|0)?i:n;i=(i|0)>(m|0)?i:m;l=(c|0)<(i|0)?i:c;e=e+4|0;j=j+4|0;if((s|0)!=(j|0)){continue}break}}if(f){while(1){c=H[((M(g,258)+b|0)+e|0)+37668|0];a=(a|0)<(c|0)?a:c;l=(c|0)<(l|0)?l:c;e=e+1|0;d=d+1|0;if((f|0)!=(d|0)){continue}break}}if(l>>>0>=18){zd(3004)}if((a|0)>0){break Ga}zd(3005)}d=(M(g,1032)+b|0)+39216|0;i=(M(g,258)+b|0)+37668|0;e=0;if((a|0)<=(l|0)){n=k&-2;m=k&1;while(1){c=a;Ha:{if((k|0)<=0){break Ha}a=0;h=0;if((k|0)!=1){while(1){if((c|0)==H[a+i|0]){G[d+(a<<2)>>2]=e;e=e+1|0}j=a|1;if((c|0)==H[j+i|0]){G[d+(j<<2)>>2]=e;e=e+1|0}a=a+2|0;h=h+2|0;if((n|0)!=(h|0)){continue}break}}if(!m|(c|0)!=H[a+i|0]){break Ha}G[d+(a<<2)>>2]=e;e=e+1|0}a=c+1|0;e=e<<1;if((c|0)!=(l|0)){continue}break}}g=g+1|0;if((p|0)!=(g|0)){continue}break}l=0;while(1){a=(o+144|0)+l|0;E[a|0]=0;c=(l<<4)+b|0;e=H[c+88|0]!=0;E[a|0]=e;e=H[c+89|0]?1:e;E[a|0]=e;e=H[c+90|0]?1:e;E[a|0]=e;e=H[c+91|0]?1:e;E[a|0]=e;e=H[c+92|0]?1:e;E[a|0]=e;e=H[c+93|0]?1:e;E[a|0]=e;e=H[c+94|0]?1:e;E[a|0]=e;e=H[c+95|0]?1:e;E[a|0]=e;e=H[c+96|0]?1:e;E[a|0]=e;e=H[c+97|0]?1:e;E[a|0]=e;e=H[c+98|0]?1:e;E[a|0]=e;e=H[c+99|0]?1:e;E[a|0]=e;e=H[c+100|0]?1:e;E[a|0]=e;e=H[c+101|0]?1:e;E[a|0]=e;e=H[c+102|0]?1:e;E[a|0]=e;E[a|0]=H[c+103|0]?1:e;l=l+1|0;if((l|0)!=16){continue}break}d=0;i=G[b+76>>2];e=i;while(1){c=G[b+600>>2];g=G[b+604>>2];Ia:{if(H[(o+144|0)+d|0]){if((g|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;a=G[b+604>>2];g=a-8|0;G[b+604>>2]=g;if((a|0)>15){continue}break}}c=-2147483648>>>g|c;break Ia}if((g|0)<8){break Ia}while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;a=G[b+604>>2];g=a-8|0;G[b+604>>2]=g;if((a|0)>15){continue}break}}G[b+600>>2]=c;g=g+1|0;G[b+604>>2]=g;d=d+1|0;if((d|0)!=16){continue}break}a=0;while(1){if(H[(o+144|0)+a|0]){n=a<<4;d=0;while(1){Ja:{if(H[((d+n|0)+b|0)+88|0]){if((g|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;l=G[b+604>>2];g=l-8|0;G[b+604>>2]=g;if((l|0)>15){continue}break}}c=-2147483648>>>g|c;break Ja}if((g|0)<8){break Ja}while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;l=G[b+604>>2];g=l-8|0;G[b+604>>2]=g;if((l|0)>15){continue}break}}G[b+600>>2]=c;g=g+1|0;G[b+604>>2]=g;d=d+1|0;if((d|0)!=16){continue}break}}a=a+1|0;if((a|0)!=16){continue}break}if(G[b+616>>2]>=3){G[o+48>>2]=e-i;_a(G[24367],67789,o+48|0);g=G[b+604>>2];e=G[b+76>>2]}c=G[b+600>>2];Ka:{if((g|0)<8){a=e;break Ka}a=e;while(1){E[G[b+44>>2]+a|0]=c>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;c=G[b+600>>2]<<8;G[b+600>>2]=c;d=G[b+604>>2];g=d-8|0;G[b+604>>2]=g;if((d|0)>15){continue}break}}c=p<<29-g|c;G[b+600>>2]=c;d=g+3|0;G[b+604>>2]=d;if((g|0)>=5){while(1){E[G[b+44>>2]+a|0]=c>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;c=G[b+600>>2]<<8;G[b+600>>2]=c;i=G[b+604>>2];d=i-8|0;G[b+604>>2]=d;if((i|0)>15){continue}break}}c=r<<17-d|c;G[b+600>>2]=c;m=d+15|0;G[b+604>>2]=m;if((r|0)>0){f=0;while(1){d=0;i=(b+f|0)+19666|0;g=H[i|0];if(g){while(1){if((m|0)>=8){while(1){E[G[b+44>>2]+a|0]=c>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;c=G[b+600>>2]<<8;G[b+600>>2]=c;g=G[b+604>>2];m=g-8|0;G[b+604>>2]=m;if((g|0)>15){continue}break}g=H[i|0]}c=-2147483648>>>m|c;G[b+600>>2]=c;m=m+1|0;G[b+604>>2]=m;d=d+1|0;if(d>>>0<(g&255)>>>0){continue}break}}if((m|0)>=8){while(1){E[G[b+44>>2]+a|0]=c>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;c=G[b+600>>2]<<8;G[b+600>>2]=c;d=G[b+604>>2];m=d-8|0;G[b+604>>2]=m;if((d|0)>15){continue}break}}G[b+600>>2]=c;m=m+1|0;G[b+604>>2]=m;f=f+1|0;if((r|0)!=(f|0)){continue}break}}l=0;n=(t|0)<-1;if(G[b+616>>2]>=3){G[o+32>>2]=a-e;_a(G[24367],67756,o+32|0);m=G[b+604>>2];a=G[b+76>>2]}e=a;while(1){h=M(l,258)+b|0;d=H[h+37668|0];c=G[b+600>>2];if((m|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;i=G[b+604>>2];m=i-8|0;G[b+604>>2]=m;if((i|0)>15){continue}break}}c=d<<27-m|c;G[b+600>>2]=c;m=m+5|0;G[b+604>>2]=m;f=0;if(!n){while(1){i=(f+h|0)+37668|0;g=H[i|0];if((g|0)>(d|0)){while(1){if((m|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;g=G[b+604>>2];m=g-8|0;G[b+604>>2]=m;if((g|0)>15){continue}break}}c=2<<30-m|c;G[b+600>>2]=c;m=m+2|0;G[b+604>>2]=m;d=d+1|0;g=H[i|0];if((d|0)<(g|0)){continue}break}}if((d|0)>(g|0)){while(1){if((m|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;g=G[b+604>>2];m=g-8|0;G[b+604>>2]=m;if((g|0)>15){continue}break}}c=3<<30-m|c;G[b+600>>2]=c;m=m+2|0;G[b+604>>2]=m;d=d-1|0;if((d|0)>H[i|0]){continue}break}}if((m|0)>=8){while(1){E[G[b+44>>2]+e|0]=c>>>24;e=G[b+76>>2]+1|0;G[b+76>>2]=e;c=G[b+600>>2]<<8;G[b+600>>2]=c;i=G[b+604>>2];m=i-8|0;G[b+604>>2]=m;if((i|0)>15){continue}break}}G[b+600>>2]=c;m=m+1|0;G[b+604>>2]=m;f=f+1|0;if((z|0)!=(f|0)){continue}break}}l=l+1|0;if((p|0)!=(l|0)){continue}break}if(G[b+616>>2]>=3){G[o+16>>2]=e-a;_a(G[24367],67771,o+16|0);e=G[b+76>>2]}j=0;c=G[b+628>>2];La:{if((c|0)<=0){l=0;break La}l=0;while(1){m=j+49|0;n=(c|0)>(m|0)?m:c-1|0;a=(b+l|0)+1664|0;if(p>>>0<=H[a|0]){zd(3006)}Ma:{if(!((n-j|0)==49&_)){if((j|0)>(n|0)){break Ma}d=G[b+604>>2];while(1){i=I[(j<<1)+D>>1];c=H[a|0];g=H[(i+(M(c,258)+b|0)|0)+37668|0];i=G[((M(c,1032)+b|0)+(i<<2)|0)+39216>>2];c=G[b+600>>2];if((d|0)>=8){m=G[b+76>>2];while(1){E[G[b+44>>2]+m|0]=c>>>24;m=G[b+76>>2]+1|0;G[b+76>>2]=m;c=G[b+600>>2]<<8;G[b+600>>2]=c;h=G[b+604>>2];d=h-8|0;G[b+604>>2]=d;if((h|0)>15){continue}break}}d=d+g|0;G[b+600>>2]=i<<32-d|c;G[b+604>>2]=d;c=(j|0)!=(n|0);j=j+1|0;if(c){continue}break}break Ma}a=H[a|0];c=(M(a,1032)+b|0)+39216|0;g=(j<<1)+D|0;d=I[g>>1];h=G[c+(d<<2)>>2];i=(M(a,258)+b|0)+37668|0;a=H[i+d|0];d=G[b+600>>2];f=G[b+604>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=a+f|0;d=h<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+2>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+4>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+6>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+8>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+10>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+12>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+14>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+16>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+18>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+20>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+22>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+24>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+26>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+28>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+30>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+32>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+34>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+36>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+38>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+40>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+42>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+44>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+46>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+48>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+50>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+52>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+54>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+56>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+58>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+60>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+62>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g- -64>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+66>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+68>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+70>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+72>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+74>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+76>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+78>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+80>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+82>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+84>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+86>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+88>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+90>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+92>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}f=f+h|0;d=a<<32-f|d;G[b+600>>2]=d;G[b+604>>2]=f;a=I[g+94>>1];h=H[a+i|0];a=G[c+(a<<2)>>2];if((f|0)>=8){j=G[b+76>>2];while(1){E[G[b+44>>2]+j|0]=d>>>24;j=G[b+76>>2]+1|0;G[b+76>>2]=j;d=G[b+600>>2]<<8;G[b+600>>2]=d;k=G[b+604>>2];f=k-8|0;G[b+604>>2]=f;if((k|0)>15){continue}break}}k=a;a=f+h|0;d=k<<32-a|d;G[b+600>>2]=d;G[b+604>>2]=a;g=I[g+96>>1];h=H[g+i|0];k=G[c+(g<<2)>>2];if((a|0)>=8){g=G[b+76>>2];while(1){E[G[b+44>>2]+g|0]=d>>>24;g=G[b+76>>2]+1|0;G[b+76>>2]=g;d=G[b+600>>2]<<8;G[b+600>>2]=d;z=G[b+604>>2];a=z-8|0;G[b+604>>2]=a;if((z|0)>15){continue}break}}j=a+h|0;g=k<<32-j|d;G[b+600>>2]=g;G[b+604>>2]=j;a=I[(m<<1)+D>>1];d=H[a+i|0];a=G[c+(a<<2)>>2];if((j|0)>=8){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=g>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;g=G[b+600>>2]<<8;G[b+600>>2]=g;i=G[b+604>>2];j=i-8|0;G[b+604>>2]=j;if((i|0)>15){continue}break}}c=a;a=d+j|0;G[b+600>>2]=c<<32-a|g;G[b+604>>2]=a}l=l+1|0;c=G[b+628>>2];j=n+1|0;if((c|0)>(j|0)){continue}break}}if((l|0)!=(r|0)){zd(3007)}if(G[b+616>>2]>=3){G[o>>2]=G[b+76>>2]-e;_a(G[24367],74870,o)}Fa=o+208|0}Na:{if(!Ia){break Na}d=G[b+604>>2];Oa:{if((d|0)<=7){a=G[b+600>>2];break Oa}c=G[b+76>>2];a=G[b+600>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=23<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}d=e+8|0;G[b+604>>2]=d;a=114<<24-e|a;G[b+600>>2]=a;if((e|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=69<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}d=e+8|0;G[b+604>>2]=d;a=56<<24-e|a;G[b+600>>2]=a;if((e|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;e=G[b+604>>2];d=e-8|0;G[b+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[b+604>>2]=e;a=80<<24-d|a;G[b+600>>2]=a;if((d|0)>=0){c=G[b+76>>2];while(1){E[G[b+44>>2]+c|0]=a>>>24;c=G[b+76>>2]+1|0;G[b+76>>2]=c;a=G[b+600>>2]<<8;G[b+600>>2]=a;d=G[b+604>>2];e=d-8|0;G[b+604>>2]=e;if((d|0)>15){continue}break}}G[b+604>>2]=e+8;G[b+600>>2]=144<<24-e|a;Fq(b,G[b+612>>2]);if(G[b+616>>2]>=2){G[R>>2]=G[b+612>>2];_a(G[24367],68298,R)}if(G[b+604>>2]<=0){break Na}a=G[b+76>>2];c=G[b+600>>2];while(1){E[G[b+44>>2]+a|0]=c>>>24;a=G[b+76>>2]+1|0;G[b+76>>2]=a;c=G[b+600>>2]<<8;G[b+600>>2]=c;e=G[b+604>>2];G[b+604>>2]=e-8;if((e|0)>8){continue}break}}Fa=R+288|0;G[b+8>>2]=1;continue}}function ch(a,b,c,d){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,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,I=0,J=0,K=0,P=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0;j=Fa-13232|0;Fa=j;G[j+13176>>2]=0;k=1;G[j+384>>2]=1;f=G[d>>2];a:{if((f|0)>0){e=f;break a}b:{c:{if((f|0)==-102){break c}i=1;d:{e:{e=f;switch(e+105|0){case 2:break c;case 0:break d;case 1:break e;default:break b}}i=0;m=1;break c}g=1;i=0;k=0}p=m;e=0;G[d>>2]=0;m=i;i=k}G[a>>2]=0;if(G[47541]){e=ji();G[d>>2]=e;if((e|0)>0){break a}}k=b;f:{g:{h:{i:{j:{k:{l:{while(1){n=H[k|0];if((n|0)!=32){m:{if(!n){Ua(54779);break f}n:{if(!i){if(Va(k)>>>0>=1025){Ua(54819);break f}Za(j+12112|0,k);E[j+11072|0]=0;G[j+13152>>2]=1701603686;G[j+13156>>2]=3092282;E[j+1e4|0]=0;E[j+6640|0]=0;E[j+5600|0]=0;E[j+8880|0]=0;E[j+4560|0]=0;E[j+1440|0]=0;break n}dh(k,j+13152|0,j+12112|0,j+11072|0,j+1e4|0,j+8880|0,j+6640|0,j+5600|0,j+4560|0,j+1440|0,d);e=G[d>>2]}if((e|0)>0){Ua(54331);Ua(k);break i}E[j+7680|0]=0;E[j+8720|0]=0;i=0;if(H[j+1e4|0]){e=(Va(j+1e4|0)+j|0)+9999|0;if(H[e|0]==35){E[e|0]=0;i=1}Pj(j+1e4|0,j+13192|0,j+9920|0,j+13188|0,j+13180|0,j+8720|0,j+7680|0,d);e=G[d>>2];if((e|0)>0){break a}}E[j+2480|0]=0;E[j+3520|0]=0;o:{if(!H[j+11072|0]){break o}if(H[j+4560|0]?1:H[j+6640|0]|H[j+8720|0]){Za(j+3520|0,j+11072|0);E[j+11072|0]=0;break o}if(!(H[j+8880|0]|H[j+5600|0])){break o}Za(j+2480|0,j+11072|0);E[j+11072|0]=0}y=j+13152|0;e=j+12112|0;D=j+1e4|0;t=j+8880|0;r=j+6640|0;s=j+5600|0;l=g;g=Fa-7312|0;Fa=g;x=j+13216|0;G[x>>2]=0;n=c;p:{q:{if(!c){break q}B=Za(g,e);if(!Ib(y,42193)){if(Oj(B,d)){break q}}w=(n|0)!=1;c=-1;e=0;while(1){r:{o=G[(e<<2)+1243184>>2];if(!o){break r}s:{t:{if(G[o+24>>2]){if(Ib(y,42193)){break r}A=G[o+12>>2];if(Va(A)>>>0>=1025){Ua(54862);break s}A=Za(g+6240|0,A);if(Oj(A,d)){break q}if(Xa(B,A)){break r}u:{if(!l){if(H[t|0]|H[r|0]){break r}A=H[s|0];if(!(w|(A|0)!=0)){break u}c=A?c:e;break r}c=e;if(w){break r}}break t}dh(G[o+12>>2],g+7280|0,g+6240|0,g+4160|0,g+5200|0,g+3120|0,g+2080|0,g+1040|0,0,0,d);if(G[d>>2]>0){Ua(54425);Ua(G[o+12>>2]);break q}if(!Ib(g+7280|0,42193)){if(Oj(g+6240|0,d)){break q}}if(Xa(y,g+7280|0)){break r}if(Xa(B,g+6240|0)){break r}v:{if(H[s|0]|H[g+1040|0]?1:H[t|0]|H[g+3120|0]|(H[r|0]|H[g+2080|0])){if(Xa(t,g+3120|0)){break r}if(Xa(r,g+2080|0)){break r}if(Xa(s,g+1040|0)){break r}A=Xa(D,g+5200|0);if(!(w|(A|0)!=0)){break v}c=A?c:e;break r}c=e;if(w){break r}}}c=e;if(G[o+84>>2]){break r}Ua(32763);Ua(k)}G[d>>2]=104;c=104;break p}e=e+1|0;if((e|0)!=1e4){continue}break}if((c|0)<0){break q}c=G[(c<<2)+1243184>>2];e=lb(1,8);G[a>>2]=e;if(!e){Ua(54617);Ua(k);G[d>>2]=113;c=113;break p}G[e>>2]=0;G[e+4>>2]=c;G[c+8>>2]=G[c+8>>2]+1;if(H[r|0]){E[D|0]=0}E[t|0]=0;E[r|0]=0;E[s|0]=0;G[x>>2]=1}c=G[d>>2]}Fa=g+7312|0;if((c|0)>0){break i}g=0;if(!G[j+13216>>2]){g=G[310142];while(1){if((g|0)<=0){break m}g=g-1|0;if(Xa(M(g,84)+1240576|0,j+13152|0)){continue}break}G[d>>2]=0;c=G[(M(g,84)+1240576|0)+40>>2];w:{if(!c){break w}e=j+13152|0;r=Za(j+11040|0,e);c=Ja[c|0](e,j+12112|0,j+11072|0)|0;G[d>>2]=c;if(c){Ua(54576);Ua(k);break i}if(!Xa(r,j+13152|0)){break w}g=G[310142];while(1){if((g|0)<=0){break l}g=g-1|0;if(Xa(M(g,84)+1240576|0,j+13152|0)){continue}break}G[d>>2]=0}x:{c=G[(M(g,84)+1240576|0)+44>>2];if(c){c=Ja[c|0](j+12112|0,n,j+13184|0)|0;G[d>>2]=c;if((c|0)<=0){break x}Ua(54675);Ua(k);break i}Ua(54279);Ua(k);break f}c=M(g,84)+1240576|0;e=Ja[G[c+64>>2]](G[j+13184>>2],j+13208|0)|0;G[d>>2]=e;if((e|0)>0){Ja[G[c+56>>2]](G[j+13184>>2])|0;Ua(54727);Ua(k);break i}e=lb(1,8);G[a>>2]=e;if(!e){Ja[G[(M(g,84)+1240576|0)+56>>2]](G[j+13184>>2])|0;Ua(54617);Ua(k);break g}c=lb(1,1736);G[e+4>>2]=c;if(!c){Ja[G[(M(g,84)+1240576|0)+56>>2]](G[j+13184>>2])|0;Ua(54617);Ua(k);Wa(G[a>>2]);G[a>>2]=0;break g}r=Va(k)+1|0;r=ab((r|0)>32?r:32);G[c+12>>2]=r;if(!r){Ja[G[(M(g,84)+1240576|0)+56>>2]](G[j+13184>>2])|0;Ua(54376);Ua(k);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break g}o=lb(1001,8);G[c+96>>2]=o;if(!o){Ja[G[(M(g,84)+1240576|0)+56>>2]](G[j+13184>>2])|0;Ua(54168);Ua(k);Wa(G[G[G[a>>2]+4>>2]+12>>2]);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break g}o=lb(40,2880);G[c+1252>>2]=o;y:{z:{if(o){cb(c+1256|0,255,160);o=c+1728|0;G[o>>2]=38;G[o+4>>2]=39;o=c+1720|0;G[o>>2]=36;G[o+4>>2]=37;o=c+1712|0;G[o>>2]=34;G[o+4>>2]=35;o=c+1704|0;G[o>>2]=32;G[o+4>>2]=33;o=c+1696|0;G[o>>2]=30;G[o+4>>2]=31;o=c+1688|0;G[o>>2]=28;G[o+4>>2]=29;o=c+1680|0;G[o>>2]=26;G[o+4>>2]=27;o=c+1672|0;G[o>>2]=24;G[o+4>>2]=25;o=c+1664|0;G[o>>2]=22;G[o+4>>2]=23;o=c+1656|0;G[o>>2]=20;G[o+4>>2]=21;o=c+1648|0;G[o>>2]=18;G[o+4>>2]=19;o=c+1640|0;G[o>>2]=16;G[o+4>>2]=17;o=c+1632|0;G[o>>2]=14;G[o+4>>2]=15;o=c+1624|0;G[o>>2]=12;G[o+4>>2]=13;o=c+1616|0;G[o>>2]=10;G[o+4>>2]=11;o=c+1608|0;G[o>>2]=8;G[o+4>>2]=9;o=c+1600|0;G[o>>2]=6;G[o+4>>2]=7;o=c+1592|0;G[o>>2]=4;G[o+4>>2]=5;o=c+1584|0;G[o>>2]=2;G[o+4>>2]=3;G[c+1576>>2]=0;G[c+1580>>2]=1;G[c+92>>2]=1e3;o=G[j+13184>>2];G[c+4>>2]=g;G[c>>2]=o;Za(r,k);g=G[j+13208>>2];r=G[j+13212>>2];G[c+128>>2]=-1;G[c+132>>2]=-1;G[c+84>>2]=n;G[c+40>>2]=g;G[c+44>>2]=r;G[c+32>>2]=g;G[c+36>>2]=r;G[c+72>>2]=-1;G[c+24>>2]=l;G[c+20>>2]=i;G[c+16>>2]=555;G[c+8>>2]=1;i=0;Hc(e,0,0,d);c=G[a>>2];if(G[d>>2]>0){break y}n=G[c+4>>2];break z}Ja[G[(M(g,84)+1240576|0)+56>>2]](G[j+13184>>2])|0;Ua(54224);Ua(k);Wa(G[G[G[a>>2]+4>>2]+96>>2]);Wa(G[G[G[a>>2]+4>>2]+12>>2]);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break g}while(1){A:{e=i<<2;g=e+1243184|0;if(!G[g>>2]){break A}e=e+1243184|0;g=e+4|0;if(!G[g>>2]){break A}g=e+8|0;if(!G[g>>2]){break A}g=e+12|0;if(!G[g>>2]){break A}g=e+16|0;if(!G[g>>2]){break A}i=i+5|0;if((i|0)!=1e4){continue}break y}break}G[g>>2]=n;c=G[a>>2]}if((Wf(c,j+13224|0,d)|0)>0){Ua(67445);Ua(k);if(G[d>>2]==252){Ua(44068)}Qb(G[a>>2],d);G[a>>2]=0;break i}g=H[j+11072|0]!=0}if(H[j+1e4|0]){c=G[j+13192>>2];B:{if(c){mb(G[a>>2],c+1|0,j+13224|0,d);break B}if(!H[j+9920|0]){break B}Je(G[a>>2],G[j+13180>>2],j+9920|0,G[j+13188>>2],d)}if(G[d>>2]<=0){break j}Ua(37207);C:{if((c|0)>0){G[j+16>>2]=c;k=j+1072|0;Ya(k,81,44578,j+16|0);break C}G[j+64>>2]=j+9920;b=j+1072|0;Ya(b,81,48820,j- -64|0);Ua(b);b=G[j+13188>>2];if(b){G[j+48>>2]=b;b=j+1072|0;Ya(b,81,48850,j+48|0);Ua(b)}k=44598;b=G[j+13180>>2];if((b|0)==-1){break C}G[j+32>>2]=G[(b<<2)+141388>>2];b=j+1072|0;Ya(b,81,48785,j+32|0);Ua(b)}Ua(k);Qb(G[a>>2],d);G[a>>2]=0;break i}if(!(H[j+8720|0]|((f|0)==-102|m|p)|(H[j+5600|0]|H[j+8880|0]))){if(!H[j+6640|0]){break j}}G[j+13220>>2]=G[G[a>>2]>>2]+1;if(G[j+13220>>2]!=1){break j}Qd(G[a>>2],j+384|0,d);if((m^-1)&G[j+384>>2]!=0){break j}if(xi(G[a>>2],j+13224|0,d)){break k}while(1){c=G[j+13224>>2];D:{if(!c&m|(c|0)!=0&p){break D}if(!c){Qd(G[a>>2],j+384|0,d);if(G[j+384>>2]<=0){break D}break j}E[j+8800|0]=0;G[j+13176>>2]=0;c=j+8800|0;Cb(G[a>>2],16,35480,c,0,j+13176|0);if(Sb(c,34885)){break D}if(Sb(j+8800|0,17342)){break D}if(gc(j+8800|0,35609,8)){break j}}if(!xi(G[a>>2],j+13224|0,d)){continue}break}break k}}else{k=k+1|0;continue}break}G[d>>2]=124;Ua(54530);Ua(j+13152|0);Ua(k);break i}G[d>>2]=124;Ua(54482);Ua(k);Ua(j+13152|0);break i}if(G[d>>2]==107){G[d>>2]=0}mb(G[a>>2],1,j+13224|0,d)}E:{F:{G:{H:{I:{if(H[j+8720|0]){J:{if(E[j+7680|0]-48>>>0<=9){G[j>>2]=j+13204;Qc(j+7680|0,27698,j);if(G[j+13204>>2]>0){break J}Ua(37590);break h}g=G[a>>2];e=j+7680|0;f=j+13204|0;c=Fa-32|0;Fa=c;k=G[d>>2];K:{if(k){break K}L:{if(fh(g,e,c+24|0,c+20|0,c+28|0,c,d)){break L}M:{e=G[c+20>>2];N:{if((e|0)<0){G[c+20>>2]=0-e;if(G[c+24>>2]!=14|(e|0)!=-1){break N}G[f>>2]=0;if(!H[(G[309722]+M(G[309725],344)|0)+88|0]){break L}zi(g,c+20|0,d);if(!G[c+20>>2]){break L}G[f>>2]=1;break L}if(G[c+24>>2]!=14){break N}if((e|0)==1){break M}}Yd();Ua(43091);k=432;G[d>>2]=432;break K}G[f>>2]=0;if(($f(G[309728],G[309729],0,0,37,f,d)|0)!=-1){break L}G[d>>2]=0}Yd();k=G[d>>2]}Fa=c+32|0;if((k|0)>0){Ua(37162);Ua(j+7680|0);Ua(37538);Ua(j+1e4|0);Qb(G[a>>2],d);G[a>>2]=0;break i}if(G[j+13204>>2]){break J}Ua(39430);break h}O:{if(!(H[j+4560|0]|!H[j+3520|0])){Za(j+11072|0,j+3520|0);break O}E[j+11080|0]=H[41194];c=H[41190]|H[41191]<<8|(H[41192]<<16|H[41193]<<24);G[j+11072>>2]=H[41186]|H[41187]<<8|(H[41188]<<16|H[41189]<<24);G[j+11076>>2]=c}if((sd(j+13228|0,j+11072|0,d)|0)>0){Ua(37483);Ua(j+11072|0);break i}p=G[a>>2];r=G[j+13228>>2];o=j+8720|0;t=G[j+13204>>2];n=Fa-30960|0;Fa=n;cb(n+576|0,0,81);bb(n+16|0,141408,560);e=G[d>>2];P:{if((e|0)>0){break P}Q:{if((dc(p,0,o,n+952|0,d)|0)>0){Ua(36498);Ua(o);break Q}if((yc(p,G[n+952>>2],t,t>>31,1,0,1,0,0,n+808|0,n+800|0,n+768|0,n+820|0,n+948|0,n+940|0,n+848|0,n+840|0,n+816|0,n+856|0,n+832|0,n+956|0,n+824|0,n+960|0,d)|0)>0){break Q}c=n+576|0;f=n+936|0;zb(92041,G[n+952>>2],c,f);fo(p,0,c,o,n+952|0,f);if(G[n+956>>2]!=2){Ua(44105);Ua(43386);e=227;G[d>>2]=227;break P}c=G[n+948>>2];R:{if((c|0)<0){G[n+944>>2]=1;f=G[n+860>>2];G[n+864>>2]=G[n+856>>2];G[n+868>>2]=f;G[n+948>>2]=0-c;break R}c=G[n+952>>2];s=n+864|0;l=Fa-336|0;Fa=l;G[l+156>>2]=0;if(G[d>>2]<=0){f=l+80|0;zb(34647,c,f,d);E[l+160|0]=0;if((kc(p,f,l+240|0,l+156|0)|0)<=0){mc(l+240|0,l+160|0,0,l+156|0)}E[l|0]=0;fd(l+160|0,l,l+156|0);k=Fa-144|0;Fa=k;S:{if(G[d>>2]>0){break S}f=G[p>>2];if((f|0)!=G[G[p+4>>2]+76>>2]){mb(p,f+1|0,0,d)}T:{if((c|0)>0){f=G[p+4>>2];if((c|0)<=G[f+936>>2]){break T}}G[d>>2]=302;break S}w=c-1|0;y=G[f+968>>2];U:{if(!H[l|0]){G[n+944>>2]=1;c=y+M(w,160)|0;f=G[c+92>>2];G[s>>2]=G[c+88>>2];G[s+4>>2]=f;break U}G[n+944>>2]=0;V:{W:{g=jb(l,40);if(g){m=1;f=0;while(1){c=g+1|0;G[k+140>>2]=c;v=vb(c,k+140|0);g=G[n+944>>2];B=(g|0)>=9;v=v+.1;X:{if(O(v)<0x8000000000000000){e=O(v)>=1?~~(v>0?Q(S(v*2.3283064365386963e-10),4294967295):T((v-+(~~v>>>0>>>0))*2.3283064365386963e-10))>>>0:0;i=~~v>>>0;break X}e=-2147483648;i=0}c=e;if(!B){e=s+(g<<3)|0;G[e>>2]=i;G[e+4>>2]=c}if((c|0)<0){Ua(58151);break W}G[n+944>>2]=g+1;e=G[k+140>>2];g=jb(e,44);G[k+140>>2]=g;m=Au(m,f,i,c);f=Ia;if(g){continue}break}if(!jb(e,41)){G[k+16>>2]=l;Ya(k+48|0,81,9840,k+16|0);break V}c=y+M(w,160)|0;if(G[c+80>>2]<=0){break U}e=G[c+88>>2];c=G[c+92>>2];if((m|0)==(e|0)&(f|0)==(c|0)){break U}L[k+40>>3]=+(m>>>0)+ +(f|0)*4294967296;L[k+32>>3]=+(e>>>0)+ +(c|0)*4294967296;c=k+48|0;Ya(c,81,19587,k+32|0);Ua(c);break W}G[k>>2]=l;Ya(k+48|0,81,9840,k);break V}Ua(l)}G[d>>2]=263}}Fa=k+144|0}Fa=l+336|0}if(G[d>>2]>0){Ua(24558);break Q}Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{c=G[n+948>>2];switch(c-11|0){case 10:break Z;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break _;case 0:case 3:break $;case 31:break ca;case 30:break da;default:break ea}}switch(c-81|0){case 0:break aa;case 1:break ba;default:break _}}e=32;c=G[n+856>>2];g=G[n+860>>2]<<2|c>>>30;c=c<<2;break Y}e=-32;c=G[n+856>>2];g=G[n+860>>2]<<2|c>>>30;c=c<<2;break Y}e=-64;c=G[n+856>>2];g=G[n+860>>2]<<3|c>>>29;c=c<<3;break Y}e=64;c=G[n+856>>2];g=G[n+860>>2]<<3|c>>>29;c=c<<3;break Y}e=8;g=G[n+860>>2];c=G[n+856>>2];break Y}Ua(37725);Ua(o);Ua(n+768|0);Ua(43208);e=261;G[d>>2]=261;break P}e=16;c=G[n+856>>2];g=G[n+860>>2]<<1|c>>>31;c=c<<1}f=g;i=G[n+944>>2];m=n+864|0;g=G[d>>2];if((g|0)<=0){k=G[r>>2];g=G[r+4>>2];if((k|0)!=G[g+76>>2]){mb(r,k+1|0,0,d);g=G[r+4>>2];k=G[g+76>>2]}l=G[g+96>>2]+(k<<3)|0;if(G[g+104>>2]!=G[l>>2]|G[g+108>>2]!=G[l+4>>2]){Ke(r,d)}Yi(r,e,i,m,d);g=G[d>>2]}if((g|0)>0){Ua(21879);break Q}uk(p,r,9,n+16|0,70,G[n+952>>2],d);G[n+4>>2]=o;G[n>>2]=t;Ya(n+672|0,81,48947,n);sh(p,0,d);Jb(p,G[n+848>>2],G[n+852>>2],1,d);g=c>>>0<3e4&(f|0)<=0|(f|0)<0;e=g?c:3e4;g=g?f:0;i=n+960|0;ic(p,e,g,i,d);ld(r,1,0,1,0,e,g,i,d);m=c-e|0;f=f-((c>>>0>>0)+g|0)|0;fa:{if(!(m|f)){break fa}c=e+1|0;g=c?g:g+1|0;e=c;while(1){if(G[d>>2]>0){break fa}i=m>>>0<3e4&(f|0)<=0|(f|0)<0;c=i?m:3e4;i=i?f:0;l=G[p+4>>2];k=Ja[G[(M(G[l+4>>2],84)+1240576|0)+76>>2]](G[l>>2],n+960|0,c)|0;ga:{if((k|0)!=107){if((k|0)<=0){break ga}Ua(38146);Ua(G[l+12>>2]);l=108}else{l=107}G[d>>2]=l}ld(r,1,0,e,g,c,i,n+960|0,d);g=g+i|0;l=c+e|0;g=l>>>0>>0?g+1|0:g;e=l;f=f-((c>>>0>m>>>0)+i|0)|0;m=m-c|0;if(f|m){continue}break}}Rb(r,d)}e=G[d>>2]}Fa=n+30960|0;if((e|0)<=0){break I}Ua(36385);Ua(j+1e4|0);Qb(G[a>>2],d);G[a>>2]=0;break i}if(!H[j+5600|0]){break E}if(g){break G}if($m(j+13152|0)){break G}if(H[j+11072|0]|!H[j+2480|0]){break H}Za(j+11072|0,j+2480|0);break F}Qb(G[a>>2],d);G[a>>2]=G[j+13228>>2];if(H[j+5600|0]){break G}g=1;break E}E[j+11080|0]=H[41194];c=H[41190]|H[41191]<<8|(H[41192]<<16|H[41193]<<24);G[j+11072>>2]=H[41186]|H[41187]<<8|(H[41188]<<16|H[41189]<<24);G[j+11076>>2]=c;break F}G[G[G[a>>2]+4>>2]+84>>2]=1;E[j+11072|0]=0}g=1;f=j+5600|0;p=0;m=0;o=0;l=Fa-544|0;Fa=l;G[l+532>>2]=-1;G[l+524>>2]=0;G[l+520>>2]=0;G[l+188>>2]=0;ha:{ia:{ja:{ka:{c=j+11072|0;if(!H[c|0]){break ka}if((sd(l+540|0,c,d)|0)>0){Ua(50586);break ja}G[l+536>>2]=G[G[a>>2]>>2]+1;c=G[a>>2];e=G[G[c+4>>2]+20>>2];c=mb(c,1,0,d);la:{if(!e){if((c|0)<=0){c=1;while(1){ne(G[a>>2],G[l+540>>2],d);c=c+1|0;if((mb(G[a>>2],c,0,d)|0)<=0){continue}break}}c=G[d>>2];if((c|0)==107){G[d>>2]=0;break la}if((c|0)<=0){break la}Qb(G[l+540>>2],d);Ua(50681);break ja}ne(G[a>>2],G[l+540>>2],d);mb(G[a>>2],G[l+536>>2],0,d);ne(G[a>>2],G[l+540>>2],d);if(G[d>>2]>0){Qb(G[l+540>>2],d);Ua(50681);break ja}G[l+536>>2]=2}Qb(G[a>>2],d);c=G[l+540>>2];G[a>>2]=c;if((mb(c,G[l+536>>2],0,d)|0)<=0){break ka}Ua(50738);break ja}c=f+4|0;ma:{na:{oa:{pa:{qa:{ra:{while(1){f=H[c|0];if((f|0)!=32){sa:{if((f|0)==64){if(Nj(c+1|0,l+188|0,d)){break ja}e=G[l+188>>2];while(1){c=e;e=c+1|0;if(H[c|0]==32){continue}break}}G[l+520>>2]=0;pk(G[a>>2],l+524|0,l+520|0);e=c;f=Fa-16|0;Fa=f;ta:while(1){ua:{va:{wa:{xa:{ya:{za:{Aa:{Ba:{Ca:{Da:{k=H[e|0];switch(k|0){case 0:break wa;case 40:break xa;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 41:case 42:case 43:break ya;case 39:break za;case 34:break Aa;case 44:break Ca;default:break Da}}if((k|0)==91){break Ba}if((k|0)!=123){break ya}k=1;G[f+12>>2]=e+1;if(!ii(f+12|0)){break va}break wa}E[e|0]=59;G[f+12>>2]=e+1;e=G[f+12>>2];continue}k=1;G[f+12>>2]=e+1;if(!hi(f+12|0)){break va}break wa}e=e+1|0;G[f+12>>2]=e;while(1){i=H[e|0];if(!i){k=1;break wa}if((i|0)==34){G[f+12>>2]=e+1;e=G[f+12>>2];continue ta}else{e=e+1|0;continue}}}e=e+1|0;G[f+12>>2]=e;while(1){i=H[e|0];if(!i){k=1;break wa}if((i|0)==39){G[f+12>>2]=e+1;e=G[f+12>>2];continue ta}else{e=e+1|0;continue}}}G[f+12>>2]=e+1;break va}k=1;G[f+12>>2]=e+1;if(!gi(f+12|0)){break va}}Fa=f+16|0;break ua}e=G[f+12>>2];continue}break}if(k){break ia}if(G[d>>2]){break qa}B=l+351|0;n=l+352|1;while(1){if(H[c|0]==32){while(1){f=H[c+1|0];c=c+1|0;if((f|0)==32){continue}break}}e=qc(c,36383);Ea:{if(!e){break Ea}f=lb(e+1|0,1);if(!f){Ua(48441);G[d>>2]=113;break Ea}f=qb(f,c,e);if((e|0)<=0){m=f;break Ea}D=c+e|0;x=H[D|0];E[e+f|0]=0;c=f;t=c;Fa:{Ga:{Ha:{Ia:{switch(H[c|0]-32|0){case 1:case 13:e=f+1|0;Ja:{c=H[f+1|0];if(!c){break Ja}Ka:{i=Va(e);if((i|0)<2){break Ka}if((c|0)==35){break Ja}i=f+i|0;if(H[i|0]!=43){break Ka}E[i|0]=0;while(1){La:{G[l+12>>2]=0;G[d>>2]=0;dc(G[a>>2],0,e,l+532|0,d);c=G[d>>2];if(c?(c|0)!=237:0){break La}if((wk(G[a>>2],G[l+532>>2],l+12|0)|0)>0){Ua(37876);Ua(f);if(p){Wa(p)}c=G[l+188>>2];if(c){Wa(c)}Wa(f);c=G[l+12>>2];G[d>>2]=c;break ha}G[l+524>>2]=G[l+524>>2]-1;u=1;if(G[d>>2]==237){continue}}break}G[d>>2]=0;G[l+532>>2]=-1;e=0;break Fa}if((c|0)==35){break Ja}if((dc(G[a>>2],0,e,l+532|0,d)|0)>0&G[d>>2]!=237){break Ja}G[d>>2]=0;if((wk(G[a>>2],G[l+532>>2],d)|0)>0){Ua(37876);Ua(f);if(p){Wa(p)}c=G[l+188>>2];if(!c){break ma}Wa(c);break ma}G[l+532>>2]=-1;G[l+524>>2]=G[l+524>>2]-1;u=1;break Ha}df();c=0;G[d>>2]=0;i=H[f+1|0]==35?f+2|0:e;e=Va(i);Ma:{if((e|0)<2){break Ma}e=(e+i|0)-1|0;if(H[e|0]!=43){break Ma}E[e|0]=0;c=1}Na:{Oa:{if(jb(i,63)){break Oa}if(jb(i,42)){break Oa}if(!jb(i,35)){break Na}}ef(G[a>>2],1,d)}while(1){e=c;if((kf(G[a>>2],i,d)|0)>0){if(!(!e|G[d>>2]!=202)){df();break Ga}Ua(36552);Ua(i);if(p){Wa(p)}c=G[l+188>>2];if(!c){break ma}Wa(c);Wa(f);break ja}c=1;if(e){continue}break};break Ha;case 0:while(1){e=H[c+1|0];t=c+1|0;c=t;if((e|0)==32){continue}break};break;default:break Ia}}Pa:{k=qc(t,36176);if(k){c=lb(k+1|0,1);if(c){break Pa}Ua(48441);G[d>>2]=113}Ua(39537);Ua(f);if(p){Wa(p)}c=G[l+188>>2];if(c){Wa(c)}Wa(f);c=G[d>>2];if(c){break ha}break na}c=qb(c,t,k);if(Va(c)>>>0>=71){Ua(39699);Ua(f);if(p){Wa(p)}e=G[l+188>>2];if(e){Wa(e)}Wa(f);Wa(c);break na}i=Za(l+352|0,c);Wa(c);Qa:{Ra:{Sa:{if(H[i|0]!=35){break Sa}e=jb(n,35);c=Va(i);if((e|0)!=(c+B|0)){break Sa}e=G[l+532>>2];if((e|0)<=0){Ua(37835);Ua(i);Ua(3358);Ua(26610);c=G[l+188>>2];if(!c){break oa}Wa(c);break oa}E[(c+i|0)-1|0]=0;zb(n,e,l+272|0,d);e=n;c=G[d>>2];if(!c){break Ra}break ha}if((jb(i,35)|0)!=(Va(i)+B|0)|G[l+532>>2]<=0){break Qa}G[l+520>>2]=0;dc(G[a>>2],0,i,l+528|0,l+520|0);c=G[l+520>>2];if(!c|(c|0)==237){break Qa}df();c=Za(l+112|0,i);ba=(Va(c)+c|0)-1|0,ca=0,E[ba|0]=ca;zb(c,G[l+532>>2],l+272|0,d);if(G[d>>2]){c=G[l+188>>2];if(!c){break ma}Wa(c);Wa(f);break ja}G[l+520>>2]=0;e=i;if(kc(G[a>>2],l+272|0,l+16|0,l+520|0)){break Qa}}Za(e,l+272|0)}e=k+t|0;Ta:{if(H[e|0]==40){Ua:{Va:{Wa:{if(G[d>>2]){break Wa}c=qc(e,64244);if(!c){break Wa}k=lb(c+1|0,1);if(k){break Va}Ua(48441);G[d>>2]=113}c=Va(i)+i|0;E[c|0]=41;E[c+1|0]=0;break Ua}k=qb(k,e,c);if((Va(k)+Va(i)|0)-70>>>0<=4294967224){Ua(39650);c=G[l+188>>2];if(c){Wa(c)}Wa(f);Wa(k);break na}r=Gb(i,k);r=Va(r)+r|0;E[r|0]=41;E[r+1|0]=0;Wa(k);e=c+e|0}c=0;break Ta}c=1}while(1){if(!c){e=e+1|0;c=1;continue}c=H[e|0];if((c|0)!=32){if((c|0)!=61){dc(G[a>>2],0,i,l+528|0,d);c=G[d>>2];if((c|0)==237){while(1){c=G[l+528>>2];G[l+532>>2]=c;o=1;if(!p){p=lb(999,4)}G[((c<<2)+p|0)-4>>2]=1;dc(G[a>>2],0,i,l+528|0,d);c=G[d>>2];if((c|0)==237){continue}break}if((c|0)==219){break Ga}}if((c|0)<=0){c=G[l+528>>2];G[l+532>>2]=c;o=1;if(!p){p=lb(999,4)}G[((c<<2)+p|0)-4>>2]=1;break Ha}if((c|0)==999){break Ga}Ua(38943);Ua(e);if(p){Wa(p)}c=G[l+188>>2];if(!c){break oa}Wa(c);Wa(f);break na}if(H[e+1|0]==61){c=e+2|0;while(1){e=c;c=c+1|0;if(H[e|0]==32){continue}break}Xa:{Ya:{Za:{if(G[d>>2]){break Za}c=qc(e,68332);if(!c){break Za}k=lb(c+1|0,1);if(k){break Ya}Ua(48441);G[d>>2]=113}E[l+272|0]=0;break Xa}c=qb(k,e,c);if(Va(c)>>>0>=71){Ua(39594);e=G[l+188>>2];if(e){Wa(e)}Wa(f);Wa(c);break na}Za(l+272|0,c);Wa(c)}if((dc(G[a>>2],0,l+272|0,l+532|0,d)|0)<=0){c=l+432|0;zb(35402,G[l+532>>2],c,d);if((gj(G[a>>2],c,i,0,d)|0)>0){Ua(21946);Ua(36165);Ua(l+272|0);Ua(36154);Ua(i);if(p){Wa(p)}c=G[l+188>>2];if(!c){break ma}Wa(c);Wa(f);break ja}o=1;if(!p){p=lb(999,4)}G[((G[l+532>>2]<<2)+p|0)-4>>2]=1;break Ha}df();G[d>>2]=0;if((pl(G[a>>2],l+272|0,i,d)|0)<=0){break Ha}Ua(36600);Ua(f);if(p){Wa(p)}c=G[l+188>>2];if(!c){break ma}Wa(c);Wa(f);break ja}E[l+192|0]=0;_a:{$a:{ab:{bb:{cb:{c=G[d>>2];db:{if(c){break db}if(H[i|0]==32){while(1){c=H[i+1|0];i=i+1|0;if((c|0)==32){continue}break}}c=qc(i,64753);if(!c){c=0;break db}k=lb(c+1|0,1);if(k){break cb}Ua(48441);c=113;G[d>>2]=113}E[l+272|0]=0;if(H[i|0]!=40){break _a}if(!c){break bb}break ab}k=qb(k,i,c);if(Va(k)>>>0>=71){Ua(50634);if(p){Wa(p)}c=G[l+188>>2];if(c){Wa(c)}Wa(f);Wa(k);break na}Za(l+272|0,k);Wa(k);i=c+i|0;if(H[i|0]!=40){break _a}}c=i+1|0;if(H[i+1|0]==32){while(1){i=H[c+1|0];c=c+1|0;if((i|0)==32){continue}break}}i=qc(c,64244);if(!i){break ab}k=lb(i+1|0,1);if(k){break $a}Ua(48441);G[d>>2]=113}E[l+192|0]=0;break _a}c=qb(k,c,i);if(Va(c)>>>0>=71){Ua(50634);if(p){Wa(p)}e=G[l+188>>2];if(e){Wa(e)}Wa(f);Wa(c);break na}Za(l+192|0,c);Wa(c)}r=G[a>>2];i=e+1|0;c=l+272|0;e=l+192|0;t=0;w=Fa-16|0;Fa=w;G[w+12>>2]=1;G[w+8>>2]=2147483647;k=Fa-240|0;Fa=k;s=G[d>>2];eb:{if(s){break eb}fb:{gb:{if(fh(r,i,k+216|0,k+204|0,k+212|0,k+176|0,d)){break gb}s=G[k+204>>2];i=s;if((i|0)<0){i=0-s|0;G[k+204>>2]=i}G[k+164>>2]=0;hb:{ib:{jb:{kb:{if((dc(r,0,c,k+164|0,d)|0)==219){G[d>>2]=0;lb:{mb:{nb:{if(H[c|0]==35){if((s|0)>=0){Yd();Ua(62856);break fb}c=c+1|0;ob:{if(Ib(c,32708)){if(Ib(c,33332)){break nb}if(G[k+216>>2]!=16){break ob}break nb}if(G[k+216>>2]==16){break nb}}Yd();Ua(62804);break fb}if((s|0)>=0){break mb}if((kc(r,c,k+80|0,d)|0)==202){G[k+164>>2]=-1;break lb}if(G[d>>2]){break gb}}s=G[k+164>>2];if((s|0)<0){break lb}break hb}G[k+164>>2]=-1}G[d>>2]=0;pk(r,k+164|0,d);G[k+164>>2]=G[k+164>>2]+1;pb:{qb:{if(e){s=H[e|0];if(s){break qb}}if(G[309736]==2){G[k>>2]=i;e=k- -64|0;Ya(e,15,27698,k);rb:{sb:{tb:{ub:{vb:{wb:{i=G[k+216>>2];switch(i-14|0){case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break pb;case 2:break sb;case 27:break ub;case 0:break vb;default:break wb}}xb:{switch(i-81|0){case 0:break rb;case 1:break tb;default:break xb}}if((i|0)!=1){break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=88;E[i+1|0]=0;break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=76;E[i+1|0]=0;break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=74;E[i+1|0]=0;break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=68;E[i+1|0]=0;break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=65;E[i+1|0]=0;break pb}i=k- -64|0;i=Va(i)+i|0;E[i|0]=75;E[i+1|0]=0;break pb}e=k- -64|0;yb:{zb:{Ab:{Bb:{s=G[k+216>>2];switch(s-14|0){case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break pb;case 2:break yb;case 27:break zb;case 0:break Ab;default:break Bb}}if((s|0)==1){break yb}if((s|0)!=82){break pb}i=H[40291]|H[40292]<<8|(H[40293]<<16|H[40294]<<24);E[k+67|0]=i;E[k+68|0]=i>>>8;E[k+69|0]=i>>>16;E[k+70|0]=i>>>24;G[k+64>>2]=H[40288]|H[40289]<<8|(H[40290]<<16|H[40291]<<24);break pb}Yd();Ua(23377);s=227;G[d>>2]=227;break eb}G[k+64>>2]=3223881;break pb}G[k+16>>2]=i;Ya(k- -64|0,16,26859,k+16|0);break pb}if(G[309736]!=2|(s<<24>>24)-58>>>0>4294967285){break pb}if(!(G[k+216>>2]!=1|(s|0)!=66)){i=i+7>>>3|0;G[k+204>>2]=i}G[k+36>>2]=e;G[k+32>>2]=i;e=k- -64|0;Ya(e,16,8745,k+32|0)}Bi(r,G[k+164>>2],c,e,d);i=G[k+212>>2];if((i|0)>=2){il(r,G[k+164>>2],i,k+176|0,d)}i=k+55|0;zb(34755,G[k+164>>2],i,d);if((kc(r,i,k+80|0,d)|0)!=202){break ib}G[d>>2]=0;Cb:{switch(G[309736]-1|0){case 0:break kb;case 1:break Cb;default:break ib}}Vf(e,k+208|0,k+172|0,k+168|0,d);s=255;y=0;Db:{Eb:{Fb:{Gb:{i=G[k+208>>2];switch(i-11|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break ib;case 0:break Db;case 20:case 30:break Eb;case 10:break Fb;default:break Gb}}if((i|0)!=81){break ib}s=0;y=-2147483648;break Db}s=-32768;y=-1;break Db}s=-2147483648;y=-1}hd(r,k+55|0,s,y,19871,d);t=G[k+164>>2];i=Fa-16|0;Fa=i;Hb:{if(G[d>>2]>0){break Hb}if((Dc(r,i+12|0,d)|0)<=0){if(G[i+12>>2]!=2){G[d>>2]=227;break Hb}t=(G[G[r+4>>2]+968>>2]+M(t,160)|0)-48|0;G[t>>2]=s;G[t+4>>2]=y}}break jb}if(G[d>>2]){break gb}i=k- -64|0;zb(34647,G[k+164>>2],i,d);kc(r,i,k+80|0,d);s=G[d>>2];Ib:{Jb:{if((s|0)!=202){if(s){break Ib}il(r,G[k+164>>2],G[k+212>>2],k+176|0,d);break Jb}G[d>>2]=0;df();i=G[k+212>>2];if((i|0)<2){break Jb}il(r,G[k+164>>2],i,k+176|0,d)}s=G[d>>2]}if(s){break gb}break ib}lc(r,k+55|0,34769,17971,d);t=G[k+164>>2];i=Fa-16|0;Fa=i;Kb:{if(G[d>>2]>0){break Kb}if((Dc(r,i+12|0,d)|0)<=0){if(G[i+12>>2]!=1){G[d>>2]=226;break Kb}t=(G[G[r+4>>2]+968>>2]+M(t,160)|0)-40|0;E[t|0]=0;qb(t,34769,19)}}}Fa=i+16|0;t=1}s=G[k+164>>2]}if((s|0)>0){Ec(r,40853,k+48|0,0,d);c=G[309728];if(ki(c,d)){break gb}e=G[k+164>>2];c=G[309729]+M(c,244)|0;G[c+84>>2]=2;G[c+80>>2]=0;G[c+4>>2]=e;G[c>>2]=r;G[309728]=G[309728]+1;G[k+220>>2]=0;c=G[w+12>>2];i=G[w+8>>2]-c|0;e=i+1|0;G[k+228>>2]=e;s=G[309728];J=G[309729];y=c-1|0;Lb:{if(!(G[w+12>>2]!=1|(i|0)<9)){c=0;if(G[w+8>>2]==G[k+48>>2]){break Lb}}c=e}Mb:{if(($f(s,J,y,c,34,k+216|0,d)|0)==-1){G[d>>2]=0;break Mb}if(G[d>>2]){break gb}}if(!t|G[k+232>>2]){break gb}kf(r,k+55|0,d);break gb}i=G[309725];t=G[309722];Nb:{Ob:{Pb:{Qb:{s=G[k+216>>2];switch(s-14|0){case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break gb;case 2:break Nb;case 0:break Ob;case 27:break Pb;default:break Qb}}if((s|0)==1){break Nb}if((s|0)!=82){break gb}Kd(r,c,L[(t+M(i,344)|0)+88>>3],15,e,d);break gb}s=c;c=G[(t+M(i,344)|0)+88>>2];Gc(r,s,c,c>>31,e,d);break gb}Kh(r,c,E[(t+M(i,344)|0)+88|0],e,d);break gb}if(!Ib(c,32708)){ze(r,(t+M(i,344)|0)+88|0,d);break gb}i=(t+M(i,344)|0)+88|0;if(!Ib(c,33332)){Pg(r,i,d);break gb}Gl(r,c,i,e,d)}Yd();s=G[d>>2];break eb}s=432;G[d>>2]=432}Fa=k+240|0;Fa=w+16|0;if((s|0)>0){Ua(15043);if(p){Wa(p)}c=G[l+188>>2];if(!c){break ma}Wa(c);Wa(f);break ja}G[l+520>>2]=0;dc(G[a>>2],0,l+272|0,l+528|0,l+520|0);if(!G[l+520>>2]){c=G[l+528>>2];G[l+532>>2]=c;o=1;if(!p){p=lb(999,4)}G[((c<<2)+p|0)-4>>2]=1;c=G[l+524>>2];if((c|0)>=G[l+532>>2]){break Ha}G[l+524>>2]=c+1;break Ha}df()}else{c=0;continue}break}}e=G[d>>2];break Fa}G[d>>2]=0;e=0}c=D+((x|0)==59)|0;Wa(f);if(!e){continue}}break}if(u|!o){break sa}c=G[l+524>>2];if((c|0)<=0){break sa}while(1){Rb:{f=c-1|0;if(G[(f<<2)+p>>2]){break Rb}if((wk(G[a>>2],c,d)|0)<=0){break Rb}Ua(37876);Ua(m);Wa(p);c=G[l+188>>2];if(c){Wa(c)}if(m){break pa}break ja}e=c>>>0>1;c=f;if(e){continue}break}break ra}}else{c=c+1|0;continue}break}if(!p){break qa}}Wa(p)}c=G[l+188>>2];if(c){Wa(c)}if(!m){break ja}}Wa(m);break ja}Wa(f)}c=125;G[d>>2]=125;break ha}Wa(f)}c=G[d>>2];break ha}Ua(14957);Ua(c);c=G[l+188>>2];if(c){Wa(c)}c=431;G[d>>2]=431}Fa=l+544|0;if((c|0)<=0){break E}Ua(54018);Ua(37048);Ua(j+5600|0);Qb(G[a>>2],d);G[a>>2]=0;break i}k=0;Sb:{if(!H[j+8880|0]){break Sb}Dc(G[a>>2],j+13224|0,d);if(!G[j+13224>>2]){c=H[j+11072|0];Tb:{if(!(c|!H[j+2480|0])){Za(j+11072|0,j+2480|0);break Tb}if(c){break Tb}E[j+11080|0]=H[40798];c=H[40794]|H[40795]<<8|(H[40796]<<16|H[40797]<<24);G[j+11072>>2]=H[40790]|H[40791]<<8|(H[40792]<<16|H[40793]<<24);G[j+11076>>2]=c}f=j+8880|0;z=Fa-16|0;Fa=z;c=j+11072|0;Ub:{if((sd(z+12|0,c,d)|0)>0){Ua(37e3);Ua(c);break Ub}G[z+8>>2]=G[G[a>>2]>>2]+1;i=G[a>>2];if(!G[G[i+4>>2]+20>>2]){e=1;m=G[z+8>>2];if((m|0)>1){Vb:{while(1){Wb:{mb(G[a>>2],e,0,d);if((ne(G[a>>2],G[z+12>>2],d)|0)>0){break Wb}e=e+1|0;m=G[z+8>>2];if((e|0)<(m|0)){continue}break Vb}break}Qb(G[z+12>>2],d);break Ub}i=G[a>>2]}mb(i,m,0,d);i=G[a>>2]}u=G[z+12>>2];t=0;h=Fa-432|0;Fa=h;c=G[35500];G[h+416>>2]=c;e=G[35499];g=G[35498];G[h+408>>2]=g;G[h+412>>2]=e;q=G[35497];m=G[35496];G[h+400>>2]=m;G[h+404>>2]=q;n=G[35495];l=G[35494];G[h+392>>2]=l;G[h+396>>2]=n;p=G[35493];r=G[35492];G[h+384>>2]=r;G[h+388>>2]=p;G[h+368>>2]=c;G[h+360>>2]=g;G[h+364>>2]=e;G[h+352>>2]=m;G[h+356>>2]=q;G[h+344>>2]=l;G[h+348>>2]=n;G[h+336>>2]=r;G[h+340>>2]=p;G[h+320>>2]=c;G[h+312>>2]=g;G[h+316>>2]=e;G[h+304>>2]=m;G[h+308>>2]=q;G[h+296>>2]=l;G[h+300>>2]=n;G[h+288>>2]=r;G[h+292>>2]=p;G[h+272>>2]=c;G[h+264>>2]=g;G[h+268>>2]=e;G[h+256>>2]=m;G[h+260>>2]=q;G[h+248>>2]=l;G[h+252>>2]=n;G[h+240>>2]=r;G[h+244>>2]=p;c=G[d>>2];Xb:{if((c|0)>0){break Xb}Eg(i,h+428|0,d);Qd(i,h+424|0,d);Yb:{Zb:{if((de(i,G[h+424>>2],h+384|0,d)|0)>0){break Zb}c=G[h+424>>2];if(c-5>>>0<=4294967291){Ua(6803);break Yb}pd(u,G[h+428>>2],c,h+384|0,d);Td(i,h+420|0,0,d);c=4;if(G[h+420>>2]>=4){while(1){e=h- -64|0;Sd(i,c,e,d);if((mk(e)|0)>=21){wb(u,h- -64|0,d)}e=G[h+420>>2]>(c|0);c=c+1|0;if(e){continue}break}}if(G[d>>2]>0){Ua(24227);break Zb}G[h+236>>2]=f;if(G[h+424>>2]>0){while(1){q=h+236|0;g=Fa-96|0;Fa=g;G[g+12>>2]=0;c=G[d>>2];_b:{if((c|0)>0){break _b}$b:{ac:{bc:{cc:{if(!Rf(q,39477,g+12|0,g+92|0,d)){F[g+16>>1]=42;break cc}c=G[g+12>>2];if(Va(c)>>>0>=71){Ua(61573);Wa(c);break $b}e=Za(g+16|0,c);Wa(c);G[g+12>>2]=0;c=H[e|0];if((c|0)!=42){break bc}}G[h+380>>2]=1;c=0;break ac}if(!((c|0)!=45|H[e+1|0]!=42)){G[h+380>>2]=0;c=1;break ac}if(!G[g+92>>2]){break $b}c=G[q>>2];if(H[c|0]!=58){break $b}ba=h,ca=_b(e),G[ba+380>>2]=ca;G[q>>2]=c+1;m=Rf(q,39477,g+12|0,g+92|0,d);c=G[g+12>>2];if(!(G[g+92>>2]?m:0)){if(!c){break $b}Wa(c);break $b}if(Va(c)>>>0>=71){Ua(61573);Wa(c);break $b}e=Za(e,c);Wa(c);G[g+12>>2]=0;c=_b(e)}G[h+376>>2]=c;s=1;e=G[q>>2];if(H[e|0]==58){G[q>>2]=e+1;e=Rf(q,49007,g+12|0,g+92|0,d);c=G[g+12>>2];dc:{ec:{if(!(G[g+92>>2]?e:0)){if(c){break ec}break $b}if(Va(c)>>>0<71){break dc}Ua(61573)}Wa(c);break $b}e=Za(g+16|0,c);Wa(c);G[g+12>>2]=0;s=_b(e);e=G[q>>2]}G[h+372>>2]=s;w=H[e|0];fc:{if((w|0)!=44){c=e;break fc}c=e+1|0;G[q>>2]=c;w=H[e+1|0]}if((w|0)==32){while(1){e=c+1|0;G[q>>2]=e;m=H[c+1|0];c=e;if((m|0)==32){continue}break}}if((G[h+380>>2]|G[h+376>>2])<0|(s|0)<=0){break $b}c=G[d>>2];break _b}c=125;G[d>>2]=125}Fa=g+96|0;if((c|0)>0){Ua(36921);Ua(f);break Zb}e=G[h+376>>2];gc:{if(!e){e=G[(h+384|0)+(t<<2)>>2];G[h+376>>2]=e;o=G[h+380>>2];c=e;break gc}g=G[h+380>>2];c=G[(h+384|0)+(t<<2)>>2];o=g?g:c;G[h+380>>2]=o}if(!((c|0)>=(o|0)&(c|0)>=(e|0))){Ua(38574);Ua(f);break Yb}c=t<<2;G[c+(h+288|0)>>2]=e;G[c+(h+336|0)>>2]=o;g=c+(h+240|0)|0;m=G[h+372>>2];G[g>>2]=m;l=c+(h+16|0)|0;q=(e|0)<(o|0);c=(m+(q?o-e|0:e-o|0)|0)/(m|0)|0;G[l>>2]=c;t=t+1|0;m=h+160|0;zb(33788,t,m,d);Ad(u,m,c,c>>31,0,d);if(!((o|0)==1&G[g>>2]==1)){c=-1;while(1){zb(32948,t,h+160|0,d);m=(c|0)==-1;if(!m){n=h+160|0;n=Va(n)+n|0;E[n|0]=c+65;E[n+1|0]=0}G[h+60>>2]=0;hc:{if(Cb(i,82,h+160|0,h+8|0,0,h+60|0)){break hc}if((e|0)>=(o|0)){v=L[h+8>>3]-+(o|0)}else{v=+(o|0)-L[h+8>>3]}v=v/+G[g>>2]+1;L[h+8>>3]=v;Jd(u,h+160|0,v,15,d);if(G[g>>2]==1&(e|0)>=(o|0)){break hc}zb(33351,t,h+160|0,d);if(!m){n=h+160|0;n=Va(n)+n|0;E[n|0]=c+65;E[n+1|0]=0}G[h+60>>2]=0;if(!Cb(i,82,h+160|0,h,0,h+60|0)){n=G[g>>2];v=L[h>>3]*+(((e|0)<(o|0)?0-n|0:n)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}zb(31915,t,h+160|0,d);if(!m){m=h+160|0;m=Va(m)+m|0;E[m|0]=c+65;E[m+1|0]=0}G[h+60>>2]=0;E[h+162|0]=49;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=50;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=51;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=52;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=53;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=54;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=55;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=56;if(!Cb(i,82,h+160|0,h,0,h+60|0)){m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}G[h+60>>2]=0;E[h+162|0]=57;if(Cb(i,82,h+160|0,h,0,h+60|0)){break hc}m=G[g>>2];v=L[h>>3]*+((q?0-m|0:m)|0);L[h>>3]=v;Jd(u,h+160|0,v,15,d)}c=c+1|0;if((c|0)!=26){continue}break}}if(G[h+424>>2]>(t|0)){continue}break}}if((Rb(u,d)|0)>0){break Zb}mq(i,d);mq(u,d);f=G[h+428>>2];c=f>>31;n=G[h+16>>2];o=ab(M(n,(c^f)-c>>>3|0));if(!o){Ua(14142);c=113;G[d>>2]=113;break Xb}D=G[h+340>>2];A=G[h+292>>2];ic:{if((D|0)>(A|0)){c=G[h+244>>2];r=(c+(D-A|0)|0)/(c|0)|0;break ic}c=G[h+244>>2];r=(c+(A-D|0)|0)/(c|0)|0}y=G[h+344>>2];x=G[h+296>>2];jc:{if((y|0)>(x|0)){w=G[h+248>>2];l=(w+(y-x|0)|0)/(w|0)|0;break jc}w=G[h+248>>2];l=(w+(x-y|0)|0)/(w|0)|0}t=G[h+348>>2];B=G[h+300>>2];kc:{if((t|0)>(B|0)){c=G[h+252>>2];p=(c+(t-B|0)|0)/(c|0)|0;break kc}c=G[h+252>>2];p=(c+(B-t|0)|0)/(c|0)|0}lc:{if((p|0)<=0){break lc}if((l|0)>0){if((r|0)>0){s=n>>31;m=1;while(1){c=M(G[h+252>>2],C);c=t+((t|0)>(B|0)?0-c|0:c)|0;G[h+348>>2]=c;G[h+300>>2]=c;w=0;while(1){c=0;e=M(G[h+248>>2],w);e=y+((x|0)<(y|0)?0-e|0:e)|0;G[h+344>>2]=e;G[h+296>>2]=e;g=m;q=g>>31;f=q;while(1){e=M(G[h+244>>2],c);e=D+((A|0)<(D|0)?0-e|0:e)|0;G[h+340>>2]=e;G[h+292>>2]=e;mc:{nc:{oc:{pc:{qc:{e=G[h+428>>2];if((e|0)<=7){if((e|0)==-64){break qc}if((e|0)!=-32){break mc}hq(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,N(-9119119840596153e-51),o,h+56|0,d);Ek(u,1,m,f,n,s,o,N(-9119119840596153e-51),d);break mc}rc:{switch(e-8|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break mc;case 0:break nc;case 8:break oc;case 24:break pc;default:break rc}}if((e|0)!=64){break mc}Xp(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,o,h+56|0,d);Gk(u,m,f,n,s,o,d);break mc}dq(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,-91191291391491e-49,o,h+56|0,d);Zo(u,m,f,n,s,o,-91191291391491e-49,d);break mc}Vp(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,o,h+56|0,d);Fk(u,m,f,n,s,o,d);break mc}Mp(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,o,h+56|0,d);Rk(u,m,f,n,s,o,d);break mc}rp(i,G[h+424>>2],h+384|0,h+336|0,h+288|0,h+240|0,o,h+56|0,d);Sk(u,m,f,n,s,o,d)}e=f+s|0;g=m+n|0;e=g>>>0>>0?e+1|0:e;m=g;f=e;c=c+1|0;if((r|0)!=(c|0)){continue}break}w=w+1|0;if((l|0)!=(w|0)){continue}break}C=C+1|0;if((p|0)!=(C|0)){continue}break}break lc}c=M(p-1|0,c);c=t+((t|0)>(B|0)?0-c|0:c)|0;G[h+300>>2]=c;G[h+348>>2]=c;c=M(l-1|0,w);c=y+((x|0)<(y|0)?0-c|0:c)|0;G[h+344>>2]=c;G[h+296>>2]=c;break lc}c=M(p-1|0,c);c=t+((t|0)>(B|0)?0-c|0:c)|0;G[h+300>>2]=c;G[h+348>>2]=c}Wa(o);c=G[d>>2];if((c|0)<=0){break Xb}Ua(14195)}c=G[d>>2];break Xb}c=212;G[d>>2]=212}Fa=h+432|0;if((c|0)>0){Qb(G[z+12>>2],d);break Ub}e=G[z+8>>2]+1|0;sc:{c=G[a>>2];if(G[G[c+4>>2]+20>>2]){break sc}if((mb(c,e,0,d)|0)<=0){while(1){ne(G[a>>2],G[z+12>>2],d);e=e+1|0;if((mb(G[a>>2],e,0,d)|0)<=0){continue}break}}c=G[d>>2];if((c|0)==107){G[d>>2]=0;break sc}if((c|0)<=0){break sc}Qb(G[z+12>>2],d);break Ub}Qb(G[a>>2],d);c=G[z+12>>2];G[a>>2]=c;f=G[z+8>>2];if((f|0)!=(e-1|0)){mb(c,f,0,d);break Ub}if((Rb(c,d)|0)<=0){break Ub}Qb(G[a>>2],d)}Fa=z+16|0;if(G[d>>2]<=0){break Sb}Ua(53904);Ua(36735);Ua(j+8880|0);Qb(G[a>>2],d);G[a>>2]=0;break i}if(H[j+6640|0]){zi(G[a>>2],j+13200|0,d);c=G[j+13200>>2];k=lb(c,1);if(!k){Ua(53842);Ua(36833);Ua(j+8880|0);Qb(G[a>>2],d);G[a>>2]=0;break g}if((hn(G[a>>2],j+8880|0,1,c,j+13196|0,k,d)|0)<=0){break Sb}Ua(53969);Ua(36833);Ua(j+8880|0);Wa(k);Qb(G[a>>2],d);G[a>>2]=0;break i}tc:{uc:{if(g){break uc}if($m(j+13152|0)){break uc}c=H[j+11072|0];if(!(c|!H[j+2480|0])){Za(j+11072|0,j+2480|0);break tc}if(c){break tc}E[j+11080|0]=H[40798];c=H[40794]|H[40795]<<8|(H[40796]<<16|H[40797]<<24);G[j+11072>>2]=H[40790]|H[40791]<<8|(H[40792]<<16|H[40793]<<24);G[j+11076>>2]=c;break tc}G[G[G[a>>2]+4>>2]+84>>2]=1;E[j+11072|0]=0}f=j+8880|0;x=Fa-16|0;Fa=x;vc:{wc:{A=j+11072|0;xc:{if(H[A|0]){if((sd(x+12|0,A,d)|0)>0){Ua(23216);Ua(A);break vc}G[x+8>>2]=G[G[a>>2]>>2]+1;c=G[a>>2];yc:{if(!G[G[c+4>>2]+20>>2]){e=1;m=G[x+8>>2];if((m|0)<=1){break yc}while(1){zc:{mb(G[a>>2],e,0,d);if((ne(G[a>>2],G[x+12>>2],d)|0)>0){break zc}e=e+1|0;m=G[x+8>>2];if((e|0)<(m|0)){continue}break yc}break}Qb(G[x+12>>2],d);break vc}mb(c,1,0,d);if((ne(G[a>>2],G[x+12>>2],d)|0)>0){break wc}m=G[x+8>>2]}mb(G[a>>2],m,0,d);e=wo(G[a>>2],G[x+12>>2],d);c=G[x+12>>2];if((e|0)>0){Qb(c,d);break vc}Ad(c,40853,0,0,0,d);e=G[x+12>>2];c=G[e+4>>2];G[c+944>>2]=0;G[c+948>>2]=0;G[c+952>>2]=0;G[c+956>>2]=0;if((Rb(e,d)|0)<=0){e=G[x+12>>2];t=G[a>>2];break xc}Qb(G[x+12>>2],d);break vc}e=G[a>>2];G[x+12>>2]=e;t=e}o=e;u=Fa-96|0;Fa=u;e=G[d>>2];Ac:{if(e){break Ac}Bc:{Cc:{if(fh(t,f,u+72|0,u- -64|0,u+68|0,u+32|0,d)){break Cc}e=G[u+64>>2];p=e;if((e|0)<0){p=0-e|0;G[u+64>>2]=p}if(!(G[u+72>>2]==14&(p|0)==1)){Yd();Ua(43091);e=432;G[d>>2]=432;break Ac}c=G[t>>2];if((c|0)!=G[G[t+4>>2]+76>>2]){mb(t,c+1|0,0,d)}if(G[d>>2]){break Cc}c=G[t+4>>2];i=G[c+952>>2];f=G[c+956>>2];n=f;if(!(f|i)){break Cc}C=G[c+960>>2];r=G[c+984>>2];s=G[c+988>>2];g=G[o>>2];c=G[o+4>>2];if((g|0)!=G[c+76>>2]){mb(o,g+1|0,0,d);c=G[o+4>>2]}if(G[c+132>>2]<0){Rb(o,d)}if(G[d>>2]){break Cc}g=C;c=g>>31;J=g;D=c;c=G[o+4>>2];f=G[c+960>>2];g=f>>31;m=G[c+956>>2];B=m;w=G[c+952>>2];Dc:{if(m|w){y=G[c+988>>2];l=G[c+984>>2];break Dc}G[c+984>>2]=0;G[c+988>>2]=0;y=0;l=0}if((f|0)!=(J|0)|(g|0)!=(D|0)){Ua(4328);Yd();e=436;G[d>>2]=436;break Ac}c=ab(i+1|0);G[u+84>>2]=i;G[u+80>>2]=0;G[u+76>>2]=c;Ec:{Fc:{Gc:{if(!c){Ua(14248);break Gc}E[c+i|0]=0;Hc:{if((e|0)<0){p=H[(G[309722]+M(G[309725],344)|0)+88|0];Ic:{if(!i&(n|0)<=0|(n|0)<0){break Ic}m=0;f=0;c=i;e=n-!c|0;c=c-1|0;if(!e&c>>>0>=3|e){c=i&-4;while(1){E[m+G[u+76>>2]|0]=p;E[G[u+76>>2]+(m|1)|0]=p;E[G[u+76>>2]+(m|2)|0]=p;E[G[u+76>>2]+(m|3)|0]=p;g=f;f=m+4|0;g=f>>>0<4?g+1|0:g;m=f;f=g;g=q;e=I+4|0;g=e>>>0<4?g+1|0:g;I=e;q=g;if((c|0)!=(e|0)|(n|0)!=(g|0)){continue}break}}g=i&3;c=0;if(!(g|c)){break Ic}while(1){E[m+G[u+76>>2]|0]=p;q=f;f=m+1|0;q=f?q:q+1|0;m=f;f=q;e=h;q=z+1|0;e=q?e:e+1|0;z=q;h=e;if((g|0)!=(q|0)|(c|0)!=(e|0)){continue}break}}p=p?i:0;break Hc}p=0;$f(G[309728],G[309729],0,0,34,u+72|0,d);if(!i&(n|0)<=0|(n|0)<0){break Hc}K=i&3;c=G[u+76>>2];Jc:{if((!i|0)==(n|0)&i-1>>>0<3){m=0;f=0;break Jc}e=i&-4;m=0;f=0;while(1){p=((((H[c+m|0]!=0)+p|0)+(H[c+(m|1)|0]!=0)|0)+(H[c+(m|2)|0]!=0)|0)+(H[c+(m|3)|0]!=0)|0;g=f;f=m+4|0;g=f>>>0<4?g+1|0:g;m=f;f=g;g=q;q=I+4|0;g=q>>>0<4?g+1|0:g;I=q;q=g;if((e|0)!=(I|0)|(n|0)!=(g|0)){continue}break}}if(!(K|P)){break Hc}while(1){p=(H[c+m|0]!=0)+p|0;e=f;f=m+1|0;e=f?e:e+1|0;m=f;f=e;e=z+1|0;q=e?h:h+1|0;z=e;h=q;if((K|0)!=(e|0)|(P|0)!=(h|0)){continue}break}}if(G[d>>2]){break Ec}q=C;C=ab((q|0)>5e5?q:5e5);if(C){break Fc}}Yd();e=113;G[d>>2]=113;break Ac}m=1;c=5e5/(q|0)|0;h=(c|0)>1?c:1;z=(o|0)!=(t|0);Kc:{if(!z){f=G[u+76>>2];e=1;while(1){c=e;e=c+1|0;m=c;if(H[(c+f|0)-1|0]){continue}break}break Kc}c=w+1|0;if((c|0)<2){break Kc}Ig(o,w,B,p,p>>31,d)}f=M(h,q);I=f;K=f>>31;f=0;while(1){e=0;Lc:{Mc:{while(1){if(H[(m+G[u+76>>2]|0)-1|0]){ee(t,m,f,1,0,J,D,C+M(e,q)|0,d);e=e+1|0;if((h|0)==(e|0)){break Mc}}if(!G[d>>2]){g=f;f=m+1|0;g=f?g:g+1|0;m=f;f=g;if((f|0)<=(n|0)&i>>>0>=m>>>0|(f|0)<(n|0)){continue}}break}if(!e){break Lc}f=M(e,q);ld(o,c,c>>31,1,0,f,f>>31,C,d);c=c+e|0;break Lc}ld(o,c,c>>31,1,0,I,K,C,d);c=c+h|0;if(G[d>>2]){break Lc}e=m+1|0;f=e?f:f+1|0;m=e;if((f|0)<=(n|0)&e>>>0<=i>>>0|(f|0)<(n|0)){continue}}break}Nc:{if(!z){f=c>>31;if(c>>>0>i>>>0&(f|0)>=(n|0)|(f|0)>(n|0)){break Nc}g=n-((c>>>0>i>>>0)+f|0)|0;e=(i-c|0)+1|0;g=e?g:g+1|0;xk(t,c,f,e,g,d);break Nc}if(!(r|s)|!p){break Nc}c=G[o>>2];e=G[o+4>>2];if((c|0)!=G[e+76>>2]){mb(o,c+1|0,0,d);e=G[o+4>>2]}f=G[e+128>>2];h=G[e+132>>2];c=y+G[e+980>>2]|0;g=l+G[e+976>>2]|0;c=g>>>0>>0?c+1|0:c;i=g;e=c;c=i+2879|0;g=c>>>0<2879?e+1|0:e;c=Cu(c,g);q=c;c=0;c=2879-(((c|0)!=0)+q|0)|0;g=0;if(r>>>0>c>>>0&(s|0)>=(g|0)|(g|0)<(s|0)){q=(r-c|0)+2879|0;c=s-((c>>>0>r>>>0)+g|0)|0;Bf(o,Bu(q,q>>>0<2879?c+1|0:c,2880,0),1,d)}g=s+y|0;c=l+r|0;g=c>>>0>>0?g+1|0:g;Gc(o,33303,c,g,0,d);c=f;g=c+i|0;f=e+h|0;f=c>>>0>g>>>0?f+1|0:f;m=g;c=G[t>>2];e=G[t+4>>2];if((c|0)!=G[e+76>>2]){mb(t,c+1|0,0,d);e=G[t+4>>2]}q=G[e+128>>2];c=q+G[e+976>>2]|0;g=G[e+980>>2]+G[e+132>>2]|0;z=c;h=c>>>0>>0?g+1|0:g;while(1){if(!G[d>>2]){Jb(t,z,h,0,d);e=r>>>0<5e5&(s|0)<=0|(s|0)<0?r:5e5;g=e;c=e>>31;q=e;ic(t,e,c,C,d);Jb(o,m,f,1,d);Wb(o,e,c,C,d);e=c+f|0;g=m+g|0;e=g>>>0>>0?e+1|0:e;m=g;f=e;g=c+h|0;e=q+z|0;g=e>>>0>>0?g+1|0:g;z=e;h=g;s=s-((q>>>0>r>>>0)+c|0)|0;r=r-q|0;if(s|r){continue}}break}if(!(l|y)){break Nc}e=1;c=G[o+4>>2];if(G[c+936>>2]<=0|(p|0)<=0){break Nc}g=(p>>31)+B|0;f=p+w|0;g=f>>>0

>>0?g+1|0:g;i=f;while(1){m=w;f=B;if(G[(G[c+968>>2]+M(e,160)|0)-80>>2]<0){while(1){c=f;f=m+1|0;c=f?c:c+1|0;m=f;f=c;Le(o,e,m,c,u+24|0,u+16|0,d);q=y+G[u+20>>2]|0;c=l+G[u+16>>2]|0;q=c>>>0>>0?q+1|0:q;G[u+16>>2]=c;G[u+20>>2]=q;ph(o,e,m,f,G[u+24>>2],G[u+28>>2],c,q,d);if((f|0)<=(g|0)&i>>>0>m>>>0|(f|0)<(g|0)){continue}break}c=G[o+4>>2]}f=G[c+936>>2]>(e|0);e=e+1|0;if(f){continue}break}}Wa(C)}c=G[u+76>>2];Oc:{if(c){Wa(c);break Oc}G[u+4>>2]=412;G[u>>2]=30721;kb(74371,u)}Yd();$n(o,d);break Bc}Yd()}e=G[d>>2]}Fa=u+96|0;c=H[A|0];if((e|0)>0){if(!c){break vc}Qb(G[x+12>>2],d);break vc}if(!c){break vc}c=G[a>>2];Pc:{if(!G[G[c+4>>2]+20>>2]){e=G[x+8>>2]+1|0;if((mb(c,e,0,d)|0)<=0){while(1){ne(G[a>>2],G[x+12>>2],d);e=e+1|0;if((mb(G[a>>2],e,0,d)|0)<=0){continue}break}}c=G[d>>2];if((c|0)==107){G[d>>2]=0;break Pc}if((c|0)<=0){break Pc}Qb(G[x+12>>2],d);break vc}G[x+8>>2]=2}Qb(G[a>>2],d);c=G[x+12>>2];G[a>>2]=c;mb(c,G[x+8>>2],0,d);break vc}Qb(G[x+12>>2],d)}Fa=x+16|0;if(G[d>>2]>0){Ua(53958);Ua(36833);Ua(j+8880|0);Qb(G[a>>2],d);G[a>>2]=0;break i}ze(G[a>>2],38410,d);ze(G[a>>2],b,d)}if(H[j+6640|0]){Qc:{if(!(H[j+4560|0]|!H[j+3520|0])){Za(j+11072|0,j+3520|0);break Qc}E[j+11080|0]=H[40505];c=H[40501]|H[40502]<<8|(H[40503]<<16|H[40504]<<24);G[j+11072>>2]=H[40497]|H[40498]<<8|(H[40499]<<16|H[40500]<<24);G[j+11076>>2]=c}h=j+6640|0;o=j+80|0;m=j+464|0;n=j+432|0;q=j+400|0;l=j+1072|0;p=j+784|0;r=j+496|0;s=j+392|0;t=j+1360|0;u=0;C=0;g=Fa-96|0;Fa=g;G[g+12>>2]=0;Rc:{if(G[d>>2]>0){break Rc}G[j+380>>2]=2;G[j+388>>2]=31;G[s>>2]=0;G[s+4>>2]=1072693248;G[j+376>>2]=0;E[t|0]=0;E[o|0]=0;E[l|0]=0;E[p|0]=0;E[r|0]=0;G[m>>2]=1589294263;G[m+4>>2]=-1196933592;G[n>>2]=1589294263;G[n+4>>2]=-1196933592;G[q>>2]=1589294263;G[q+4>>2]=-1196933592;E[o+71|0]=0;E[l+71|0]=0;E[p+71|0]=0;E[r+71|0]=0;G[m+8>>2]=1589294263;G[m+12>>2]=-1196933592;G[n+8>>2]=1589294263;G[n+12>>2]=-1196933592;G[q+8>>2]=1589294263;G[q+12>>2]=-1196933592;E[o+142|0]=0;E[l+142|0]=0;E[p+142|0]=0;E[r+142|0]=0;G[m+16>>2]=1589294263;G[m+20>>2]=-1196933592;G[n+16>>2]=1589294263;G[n+20>>2]=-1196933592;G[q+16>>2]=1589294263;G[q+20>>2]=-1196933592;E[o+213|0]=0;E[l+213|0]=0;E[p+213|0]=0;E[r+213|0]=0;G[m+24>>2]=1589294263;G[m+28>>2]=-1196933592;G[n+24>>2]=1589294263;G[n+28>>2]=-1196933592;G[q+24>>2]=1589294263;G[q+28>>2]=-1196933592;c=h+3|0;G[g+92>>2]=c;Sc:{Tc:{Uc:{Vc:{Wc:{Xc:{Yc:{e=H[h+3|0];switch(e-98|0){case 0:break Uc;case 2:break Vc;case 16:break Wc;case 8:break Xc;case 7:break Yc;default:break Sc}}G[j+388>>2]=21;c=h+4|0;break Tc}c=h+4|0;break Tc}G[j+388>>2]=42;c=h+4|0;break Tc}G[j+388>>2]=82;c=h+4|0;break Tc}G[j+388>>2]=11;c=h+4|0}G[g+92>>2]=c;e=H[c|0];C=1}Zc:{_c:{if((e|0)==32){B=q+24|0;D=n+24|0;x=m+24|0;A=r+213|0;I=p+213|0;J=l+213|0;z=o+213|0;K=q+16|0;P=n+16|0;R=m+16|0;U=r+142|0;V=p+142|0;W=l+142|0;w=o+142|0;X=q+8|0;Y=n+8|0;Z=m+8|0;_=r+71|0;$=p+71|0;aa=l+71|0;y=o+71|0;break _c}if(!e){break Rc}Ua(36699);Ua(h);break Zc}while(1){if((e|0)==32){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;continue}break}if(!e){break Rc}if((e|0)==64){if(Nj(c+1|0,g+12|0,d)){break Rc}u=G[g+12>>2];i=u;while(1){c=i;G[g+92>>2]=c;i=c+1|0;e=H[c|0];if((e|0)==32){continue}break}}$c:{ad:{bd:{cd:{if((e|0)==40){while(1){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;if((e|0)==32){continue}break}f=qc(c,63664);qb(o,c,f);c=c+f|0;e=1;while(1){G[g+92>>2]=c;f=H[c|0];if((f|0)!=32){if((f|0)==41){break cd}while(1){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;if((e|0)==32){continue}break}f=qc(c,63664);qb(y,c,f);c=c+f|0;e=2;while(1){G[g+92>>2]=c;f=H[c|0];if((f|0)!=32){if((f|0)==41){break cd}while(1){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;if((e|0)==32){continue}break}f=qc(c,63664);qb(w,c,f);c=c+f|0;e=3;while(1){G[g+92>>2]=c;f=H[c|0];if((f|0)!=32){if((f|0)==41){break cd}while(1){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;if((e|0)==32){continue}break}f=qc(c,63664);qb(z,c,f);c=c+f|0;e=4;while(1){G[g+92>>2]=c;f=H[c|0];if((f|0)!=32){if((f|0)==41){break cd}Ua(40168);Ua(h);c=G[g+12>>2];if(!c){break Zc}Wa(c);break Zc}else{c=c+1|0;continue}}}else{c=c+1|0;continue}}}else{c=c+1|0;continue}}}else{c=c+1|0;continue}}}Cg(g+92|0,o,m,n,q,l,p,r,d);dd:{if(G[d>>2]>0){break dd}ed:{fd:{gd:{hd:{id:{jd:{kd:{ld:{md:{nd:{c=G[g+92>>2];e=H[c|0];switch(e-32|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break gd;case 27:break id;case 12:break md;case 0:break nd;default:break jd}}while(1){if((e|0)==32){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;continue}break}od:{switch(e-44|0){case 15:break id;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break kd;case 0:break od;default:break ld}}G[g+92>>2]=c+1;break kd}G[g+92>>2]=c+1;break kd}if(!e){break id}}Cg(g+92|0,y,Z,Y,X,aa,$,_,d);if(G[d>>2]>0){break dd}u=2;pd:{qd:{rd:{sd:{c=G[g+92>>2];e=H[c|0];switch(e-32|0){case 27:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break gd;case 12:break rd;case 0:break sd;default:break pd}}while(1){if((e|0)==32){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;continue}break}td:{switch(e-44|0){default:if(e){break qd}break fd;case 15:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break qd;case 0:break td}}G[g+92>>2]=c+1;break qd}G[g+92>>2]=c+1}Cg(g+92|0,w,R,P,K,W,V,U,d);if(G[d>>2]>0){break dd}u=3;ud:{vd:{wd:{c=G[g+92>>2];e=H[c|0];switch(e-32|0){case 27:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break gd;case 12:break vd;case 0:break wd;default:break hd}}while(1){if((e|0)==32){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;continue}break}xd:{switch(e-44|0){default:if(e){break ud}break fd;case 15:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break ud;case 0:break xd}}G[g+92>>2]=c+1;break ud}G[g+92>>2]=c+1}Cg(g+92|0,z,x,D,B,J,I,A,d);if(G[d>>2]>0){break dd}u=4;yd:{zd:{Ad:{Bd:{c=G[g+92>>2];e=H[c|0];switch(e-32|0){case 27:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break gd;case 12:break zd;case 0:break Ad;default:break Bd}}if(e){break gd}break fd}while(1){if((e|0)==32){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;continue}break}Cd:{switch(e-44|0){default:if(e){break yd}break fd;case 15:break fd;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break yd;case 0:break Cd}}G[g+92>>2]=c+1;break yd}G[g+92>>2]=c+1}Ua(39222);Ua(6625);Ua(h);break Zc}if(e){break gd}break fd}if(e){break gd}}G[j+380>>2]=1;if(H[o|0]|L[m>>3]!=-91191291391491e-49|L[n>>3]!=-91191291391491e-49){break ed}G[j+380>>2]=2;L[q+8>>3]=L[q>>3];break ed}if(!e){break fd}}Ua(39260);Ua(h);c=G[g+12>>2];if(!c){break Zc}Wa(c);break Zc}G[j+380>>2]=u}if(H[c|0]!=59){break ad}break bd}Ua(39376);Ua(h);c=G[g+12>>2];if(!c){break Rc}Wa(c);break Rc}G[j+380>>2]=e;while(1){f=c;c=c+1|0;G[g+92>>2]=c;e=H[f+1|0];if((e|0)==32){continue}break}if((e|0)!=61){if(!e){if(!u){break Rc}Wa(u);break Rc}Ua(39222);Ua(7525);Ua(h);c=G[g+12>>2];if(!c){break Zc}Wa(c);break Zc}c=f+2|0;while(1){G[g+92>>2]=c;f=H[c|0];c=c+1|0;if((f|0)==32){continue}break}Cg(g+92|0,g+16|0,m,n,q,l,p,r,d);if(G[d>>2]>0){break $c}c=1;if(G[j+380>>2]>1){while(1){f=c<<3;L[f+m>>3]=L[m>>3];L[f+n>>3]=L[n>>3];L[f+q>>3]=L[q>>3];f=M(c,71);Za(f+l|0,l);Za(f+p|0,p);Za(f+r|0,r);c=c+1|0;if((c|0)>2]){continue}break}}c=G[g+92>>2];while(1){f=H[c|0];if((f|0)!=32){if(!f){break Rc}if((f|0)==59){break bd}Ua(39319);Ua(h);c=G[g+12>>2];if(!c){break Zc}Wa(c);break Zc}else{c=c+1|0;G[g+92>>2]=c;continue}}}while(1){f=c+1|0;G[g+92>>2]=f;e=H[c+1|0];c=f;if((e|0)==32){continue}break}c=g+16|0;Cg(g+92|0,t,g,g,s,c,c,c,d);if(G[d>>2]>0){Ua(39177);Ua(h);c=G[g+12>>2];if(!c){break Rc}Wa(c);break Rc}if((H[t|0]?0:L[s>>3]==1)|C){break ad}G[j+388>>2]=42}c=G[g+92>>2];while(1){f=H[c|0];if((f|0)!=32){if(f){Ua(39119);Ua(h);G[d>>2]=125}c=G[g+12>>2];if(!c){break Rc}Wa(c);break Rc}else{c=c+1|0;G[g+92>>2]=c;continue}}}Ua(39222);Ua(h);c=G[g+12>>2];if(!c){break Rc}Wa(c);break Rc}G[d>>2]=125}Fa=g+96|0;s=j+11072|0;e=G[j+388>>2];f=G[j+380>>2];v=L[j+392>>3];g=G[j+376>>2];c=Fa-176|0;Fa=c;Dd:{if(G[d>>2]>0){break Dd}if((f|0)>=5){Ua(6766);G[d>>2]=320;break Dd}i=G[a>>2];h=G[i>>2];if((h|0)!=G[G[i+4>>2]+76>>2]){mb(i,h+1|0,0,d)}u=8;Ed:{Fd:{Gd:{switch(e-11|0){case 20:u=32;break Ed;case 31:u=-32;break Ed;default:if((e|0)==82){break Fd}case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:G[d>>2]=410;break Dd;case 0:break Ed;case 10:break Gd}}u=16;break Ed}u=-64}Hd:{if((_j(G[a>>2],f,o,m,n,q,l,p,r,c+144|0,c+112|0,c+80|0,c+48|0,c+16|0,d)|0)>0){Ua(6126);break Hd}Id:{Jd:{if(H[t|0]){if(!Cb(G[a>>2],82,t,c+8|0,0,d)){v=L[c+8>>3];break Jd}G[d>>2]=0;if((dc(G[a>>2],0,t,c+140|0,d)|0)>0){Ua(66743);Ua(t);break Hd}G[c+8>>2]=1589294263;G[c+12>>2]=-1196933592;break Id}L[c+8>>3]=v}if(!(!(v<=0)|v==-91191291391491e-49)){Ua(45241);G[d>>2]=125;break Dd}if(!g|v==-91191291391491e-49){break Id}L[c+8>>3]=1/v}if((sd(c+172|0,s,d)|0)>0){Ua(16402);break Hd}if((pd(G[c+172>>2],u,f,c+112|0,d)|0)>0){Ua(25086);break Hd}if((tk(G[a>>2],G[c+172>>2],c+144|0,d)|0)>0){Ua(11702);break Hd}e=c+144|0;Zj(G[a>>2],G[c+172>>2],f,e,d);q=c+80|0;i=c+16|0;En(G[c+172>>2],f,q,i,d);if((Dn(G[a>>2],G[c+172>>2],u,f,c+112|0,e,q,c+48|0,i,L[c+8>>3],G[c+140>>2],g,k,d)|0)>0){Ua(7256);break Hd}Qb(G[a>>2],d);G[a>>2]=G[c+172>>2]}}Fa=c+176|0;if(k){Wa(k)}if(G[d>>2]>0){Ua(54065);Ua(37098);Ua(j+6640|0);Qb(G[a>>2],d);G[a>>2]=0;break i}ze(G[a>>2],37365,d);ze(G[a>>2],b,d)}if(H[j+4560|0]){Kd:{if(H[j+3520|0]){Za(j+11072|0,j+3520|0);break Kd}E[j+11080|0]=H[40354];c=H[40350]|H[40351]<<8|(H[40352]<<16|H[40353]<<24);G[j+11072>>2]=H[40346]|H[40347]<<8|(H[40348]<<16|H[40349]<<24);G[j+11076>>2]=c}Dc(G[a>>2],j+13224|0,d);Ld:{if(!G[j+13224>>2]){f=j+4560|0;h=Fa-192|0;Fa=h;cb(h+8|4,0,176);G[h+4>>2]=33141;G[h+20>>2]=a;G[h+16>>2]=h+4;G[h+8>>2]=1;c=j+11072|0;Md:{if((sd(h+36|0,c,d)|0)>0){Ua(36786);Ua(c);break Md}G[h>>2]=G[G[a>>2]>>2]+1;c=8;Nd:{Od:{Pd:{Qd:{switch(E[f+3|0]-66|0){case 7:case 39:c=16;break Pd;case 8:case 40:c=32;break Pd;case 16:case 48:c=-32;break Pd;case 0:case 32:break Pd;case 2:case 34:break Qd;default:break Od}}c=-64}G[h+28>>2]=c;c=f+4|0;break Nd}c=G[h+28>>2]?f+4|0:f+3|0}f=G[G[G[a>>2]+4>>2]+20>>2]!=0;e=H[c|0]==49;c=e+c|0;if(H[c|0]!=32){Ua(38845);Ua(c)}l=e|f;while(1){q=c;c=c+1|0;if(H[q|0]==32){continue}break}Rd:{i=G[h>>2];if(l&1|(i|0)<2){break Rd}c=1;Sd:{if(l&1){mb(G[a>>2],1,0,d);if((ne(G[a>>2],G[h+36>>2],d)|0)>0){break Sd}i=G[h>>2];break Rd}while(1){mb(G[a>>2],c,0,d);if((ne(G[a>>2],G[h+36>>2],d)|0)>0){break Sd}c=c+1|0;i=G[h>>2];if((c|0)<(i|0)){continue}break}break Rd}Qb(G[h+36>>2],d);break Md}mb(G[a>>2],i,0,d);G[h+24>>2]=q;i=h+8|0;f=Fa-608|0;Fa=f;G[f+600>>2]=0;G[f+592>>2]=0;G[f+596>>2]=0;G[f+584>>2]=0;G[f+588>>2]=0;G[f+540>>2]=33141;e=Fd(34019);G[309801]=(e|0)!=0;c=G[d>>2];if(!c){c=G[i+8>>2];Td:{Ud:{if(!c){break Ud}c=G[c>>2];if(!c){break Ud}if(H[c|0]){break Td}}G[i+8>>2]=f+540;if(!e){break Td}G[f+160>>2]=33141;kb(89473,f+160|0)}g=G[i+28>>2];m=G[G[i+12>>2]>>2];G[309731]=i;Vd:{if(fh(m,G[i+16>>2],f+584|0,f+572|0,f+580|0,f+544|0,d)){break Vd}c=G[f+572>>2];if((c|0)<0){G[f+572>>2]=0-c}c=34853;Wd:{Xd:{Yd:{Zd:{_d:{$d:{ae:{e=G[f+584>>2];switch(e-14|0){case 0:break Xd;case 27:break Yd;case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break Zd;case 2:break $d;default:break ae}}if((e|0)==1){break _d}if((e|0)!=82){break Zd}c=35602;break Xd}G[d>>2]=-1;Ua(24519)}if(!G[309801]){break Wd}yb(36053);c=33396;break Xd}G[d>>2]=-1;Ua(20856);c=65657;break Xd}c=35076}if(!G[309801]){break Wd}G[f+148>>2]=e;G[f+144>>2]=c;kb(78438,f+144|0)}if(G[d>>2]){break Vd}if(mh(m,5,f+576|0,f+580|0,f+544|0,d)){Ua(6165);break Vd}if(G[309801]){G[f+128>>2]=G[f+576>>2];kb(74805,f+128|0)}c=G[f+576>>2];if(!((c|0)==-64|(e|0)!=82)){G[f+576>>2]=-32;c=-32}e=G[i+20>>2];if(e){G[f+576>>2]=e;c=e}if(G[309801]){G[f+112>>2]=c;kb(74787,f+112|0);c=G[f+576>>2]}if(pd(g,c,G[f+580>>2],f+544|0,d)){Ua(24281);break Vd}be:{ce:{if(!Td(m,f+268|0,f+264|0,d)){e=1;if(G[f+268>>2]>0){while(1){de:{c=e;ee:{if(Sd(m,c,f+176|0,d)){G[f+96>>2]=c;Ya(f+272|0,256,30210,f+96|0);break ee}e=mk(f+176|0);if((e|0)==10|(e|0)==130&c>>>0<12){break de}n=G[f+576>>2]<0;if(n&(e|0)==40|n&(e|0)==30){break de}if(!wb(g,f+176|0,d)){break de}G[f+84>>2]=G[d>>2];G[f+80>>2]=f+176;Ya(f+272|0,256,78700,f+80|0)}Ua(f+272|0);break Vd}e=c+1|0;if((c|0)>2]){continue}break}}fe:{ge:{he:{ie:{je:{ke:{le:{c=G[f+576>>2];switch(c-8|0){case 0:break ge;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break he;case 24:break je;case 8:break ke;default:break le}}if((c|0)==-64){break ie}if((c|0)!=-32){break he}c=42;break ce}c=21;break fe}c=41;break fe}c=82;break ce}G[f>>2]=c;c=f+272|0;Ya(c,256,74762,f);Ua(c);G[d>>2]=-1;break Vd}c=11}G[f+584>>2]=c;e=G[i+24>>2];G[f+272>>2]=e;p=0;if(!e){G[f+176>>2]=0;if(Ec(m,34862,f+272|0,0,f+176|0)){me:{ne:{oe:{pe:{qe:{e=G[f+576>>2];switch(e-8|0){case 24:break oe;case 8:break pe;case 0:break qe;default:break ne}}G[f+272>>2]=255;break me}G[f+272>>2]=-32768;break me}G[f+272>>2]=-2147483648;break me}G[f+64>>2]=e;kb(75109,f- -64|0)}p=1}e=G[f+272>>2];G[i+24>>2]=e}lq(g,e,e>>31,d);if(!G[309801]){break be}G[f+48>>2]=G[f+272>>2];kb(73321,f+48|0);break be}Ua(8285);break Vd}G[f+584>>2]=c;p=0}if(!H[i+32|0]){c=G[309728];if(ki(c,d)){break Vd}G[309728]=G[309728]+1;e=G[i+28>>2];m=G[309729]+M(c,244)|0;G[m+84>>2]=2;G[m>>2]=e;fn(e,35819,G[f+576>>2],G[309730]+M(c,124)|0,m);G[f+596>>2]=-1;re:{if(($f(G[309728],G[309729],0,0,34,f+584|0,d)|0)==-1){G[d>>2]=0;break re}if(G[d>>2]){break Vd}}if(G[f+600>>2]){if(!p){break Vd}c=G[i+24>>2];Gc(g,34862,c,c>>31,19882,d);if(G[d>>2]){Ua(25874)}if(!G[309801]){break Vd}yb(8509);G[f+16>>2]=G[d>>2];kb(78550,f+16|0);break Vd}if(G[f+576>>2]<=0){break Vd}if(!lq(g,-1234554321,-1,d)){break Vd}Ua(16728);break Vd}e=i+32|0;i=i+107|0;m=G[309725];n=G[309722];se:{te:{switch(c-14|0){default:if((c|0)!=82){break se}Kd(g,e,L[(n+M(m,344)|0)+88>>3],15,i,d);break Vd;case 27:c=G[(n+M(m,344)|0)+88>>2];Gc(g,e,c,c>>31,i,d);break Vd;case 0:Kh(g,e,E[(n+M(m,344)|0)+88|0],i,d);break Vd;case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break se;case 2:break te}}Gl(g,e,(n+M(m,344)|0)+88|0,i,d);break Vd}G[f+32>>2]=c;c=f+272|0;Ya(c,256,78648,f+32|0);Ua(c)}Yd();c=G[d>>2]}Fa=f+608|0;if(c){Ua(36889);Ua(q);Qb(G[h+36>>2],d);break Md}e=G[h>>2];ue:{if(l&1){break ue}c=e+1|0;if((mb(G[a>>2],c,0,d)|0)>0){break ue}while(1){ne(G[a>>2],G[h+36>>2],d);e=c;c=c+1|0;if((mb(G[a>>2],c,0,d)|0)<=0){continue}break}}ve:{c=G[d>>2];if((c|0)==107){G[d>>2]=0;break ve}if((c|0)<=0){break ve}Qb(G[h+36>>2],d);break Md}Qb(G[a>>2],d);c=G[h+36>>2];G[a>>2]=c;f=G[h>>2];if((f|0)==(e|0)){break Md}mb(c,f,0,d)}Fa=h+192|0;if(G[d>>2]<=0){break Ld}Ua(54121);Ua(37621);Ua(j+4560|0);Qb(G[a>>2],d);G[a>>2]=0;break i}Ua(33240);Ua(j+4560|0);Qb(G[a>>2],d);G[a>>2]=0;e=233;G[d>>2]=233;break a}ze(G[a>>2],38623,d);ze(G[a>>2],b,d)}if(!H[j+1440|0]){break i}_m(G[a>>2],j+1440|0,d)}e=G[d>>2];break a}Ua(j+7680|0);Ua(37538);Ua(j+1e4|0);Qb(G[a>>2],d);G[a>>2]=0;e=307;G[d>>2]=307;break a}e=113;G[d>>2]=113;break a}e=104;G[d>>2]=104}Fa=j+13232|0;return e}function fh(a,b,c,d,e,f,g){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,K=0,N=0,O=0,P=0,Q=0;u=Fa-80|0;Fa=u;G[u+76>>2]=0;h=G[g>>2];a:{if(h){break a}b:{c:{if(Rb(a,g)){break c}G[309730]=0;G[309728]=0;G[309729]=0;G[309715]=0;G[309712]=a;G[309724]=0;G[309714]=35;G[309713]=36;G[309736]=0;G[309737]=0;G[309722]=0;G[309723]=0;Dc(a,1238944,g);d:{if(!G[309736]){mh(a,9,u+68|0,u+72|0,u+32|0,g);if(G[g>>2]){Ua(6727);break c}i=G[u+72>>2];G[309734]=(i|0)>0;j=1;h=0;if((i|0)>0){if(i-1>>>0>=3){o=i&-4;while(1){s=j;j=h<<2;l=u+32|0;j=M(M(M(M(s,G[j+l>>2]),G[l+(j|4)>>2]),G[l+(j|8)>>2]),G[l+(j|12)>>2]);h=h+4|0;k=k+4|0;if((o|0)!=(k|0)){continue}break}}l=i&3;if(l){while(1){j=M(G[(u+32|0)+(h<<2)>>2],j);h=h+1|0;v=v+1|0;if((l|0)!=(v|0)){continue}break}}G[309734]=j;h=j}if(!G[309801]){break d}G[u+20>>2]=h;G[u+16>>2]=i;kb(73289,u+16|0);break d}if(!Ec(a,40853,1238936,0,u+76|0)){break d}G[309734]=0}e:{if(H[b|0]==64){if(Nj(b+1|0,1238876,g)){break c}h=G[309719];j=Va(h);break e}j=Va(b);h=ab(j+2|0);G[309719]=h;h=Za(h,b)}b=h+j|0;b=Va(b)+b|0;E[b|0]=10;E[b+1|0]=0;G[309720]=0;G[309721]=0;b=G[309704];f:{if(b){b=G[b+(G[309705]<<2)>>2];if(b){break f}}Uj();b=Tj(G[309700]);G[G[309704]+(G[309705]<<2)>>2]=b}Sj(b,0);h=G[309704]+(G[309705]<<2)|0;b=G[h>>2];G[309738]=G[b+16>>2];b=G[b+8>>2];G[309706]=b;G[309710]=b;G[309700]=G[G[h>>2]>>2];E[1238828]=H[b|0];q=Fa-26144|0;Fa=q;G[309630]=-2;A=100;K=q+256|0;k=K;s=q+25856|0;v=s;g:{h:{while(1){i:{F[s>>1]=p;j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{b=A<<1;if((b+v|0)-2>>>0<=s>>>0){if((A|0)>9999){break u}A=(b|0)<1e4?b:1e4;b=ab(M(A,258)+255|0);if(!b){break u}j=s-v>>1;h=j+1|0;b=bb(b,v,h<<1);i=h<<8;K=bb(b+(((A<<1)+255|0)/256<<8)|0,K,i);if((q+25856|0)!=(v|0)){Wa(v)}s=1;if((h|0)>=(A|0)){v=b;break h}s=b+(j<<1)|0;k=(i+K|0)-256|0;v=b}if((p|0)==2){s=0;break i}v:{w:{x:{x=F[(p<<1)+127056>>1];if((x|0)==-40){break x}o=G[309630];if((o|0)==-2){m=Fa-576|0;Fa=m;if(!H[1238808]){E[1238808]=1;if(!H[1238812]){E[1238812]=1}if(!G[309700]){G[309700]=G[30060]}if(!G[309701]){G[309701]=G[29763]}h=G[309704];y:{if(h){l=G[309705];i=G[(l<<2)+h>>2];if(i){break y}}Uj();i=Tj(G[309700]);h=G[309704];l=G[309705];G[h+(l<<2)>>2]=i}G[309738]=G[i+16>>2];b=G[i+8>>2];G[309710]=b;G[309706]=b;G[309700]=G[G[(l<<2)+h>>2]>>2];E[1238828]=H[b|0]}z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:while(1){b=G[309706];E[b|0]=H[1238828];i=H[1238812];o=b;P:while(1){h=H[(H[o|0]<<2)+137104|0];j=i<<1;if(I[j+138128>>1]){G[309709]=o;G[309708]=i}l=h;n=F[j+139424>>1]+h|0;if(F[(n<<1)+138480>>1]!=(i|0)){while(1){i=F[(i<<1)+139792>>1];l=(i|0)>=174?G[(h<<2)+140160>>2]:l;h=l&255;n=h+F[(i<<1)+139424>>1]|0;if(I[(n<<1)+138480>>1]!=(i&65535)){continue}break}}o=o+1|0;i=F[(n<<1)+140400>>1];if(I[(i<<1)+139424>>1]!=413){continue}while(1){j=b;Q:{R:while(1){i=I[(i<<1)+138128>>1];if(!i){o=G[309709];i=I[(G[309708]<<1)+138128>>1]}G[309710]=j;G[309711]=o-j;E[1238828]=H[o|0];E[o|0]=0;h=i<<16>>16;b=o;S:{while(1){G[309706]=b;i=277;T:{switch(h|0){case 0:E[o|0]=H[1238828];i=G[309708];o=G[309709];continue R;case 2:b=G[309710];i=Va(b);while(1){j=b+i|0;h=i-1|0;i=h;if(H[j|0]==32){continue}break};rb(1238528,b+1|0,h);E[h+1238528|0]=0;i=262;break B;case 3:l=0;h=G[309710];i=Va(h);if((i|0)>=256){break I}while(1){b=h+i|0;l=i-1|0;i=l;if(H[b|0]==32){continue}break};rb(m+320|0,h+1|0,l);break C;case 4:l=0;h=G[309710];i=Va(h);if((i|0)>=256){break H}while(1){b=h+i|0;l=i-1|0;i=l;if(H[b|0]==32){continue}break};rb(m+320|0,h+1|0,l);break D;case 5:l=0;b=G[309710];i=H[b+2|0];if(i){h=b+2|0;while(1){l=l<<1|(i&255)==49;i=H[h+1|0];h=h+1|0;if(i){continue}break}}G[309632]=l;i=259;break B;case 6:l=0;b=G[309710];i=H[b+2|0];if(i){h=b+2|0;while(1){l=(i<<24>>24)-48|l<<3;i=H[h+1|0];h=h+1|0;if(i){continue}break}}G[309632]=l;i=259;break B;case 7:l=0;b=G[309710];i=H[b+2|0];if(i){h=b+2|0;while(1){b=i<<24>>24;j=b-48|0;l=l<<4|(j>>>0<10?j:b-87|0);i=H[h+1|0];h=h+1|0;if(i){continue}break}}G[309632]=l;i=259;break B;case 8:O=1238528,P=_b(G[309710]),G[O>>2]=P;i=259;break B;case 9:E[1238528]=!(H[G[309710]]-84&223);i=258;break B;case 10:O=1238528,Q=sb(G[309710]),L[O>>3]=Q;i=260;break B;case 11:if(!Ib(G[309710],34898)){G[309632]=1413754136;G[309633]=1074340347;i=260;break B}if(!Ib(G[309710],35749)){G[309632]=-1961601175;G[309633]=1074118410;i=260;break B}if(!Ib(G[309710],35099)){G[309632]=-1571644103;G[309633]=1066524486;i=260;break B}if(!Ib(G[309710],33143)){i=273;break B}if(!Ib(G[309710],34768)){i=274;break B}if(!Ib(G[309710],34761)){i=275;break B}b=G[309710];if(H[b+1|0]==36){h=Va(b);E[1238528]=35;rb(1238529,b+2|0,h-3|0);G[309710]=1238528;E[h+1238526|0]=0;b=1238528}i=Ja[G[309713]](b,1238528)|0;break B;case 12:i=0;h=G[309710];b=Va(h)-2|0;U:{if((b|0)>=256){G[309737]=431;b=H[65311]|H[65312]<<8|(H[65313]<<16|H[65314]<<24);G[m+336>>2]=H[65307]|H[65308]<<8|(H[65309]<<16|H[65310]<<24);G[m+340>>2]=b;b=H[65319]|H[65320]<<8|(H[65321]<<16|H[65322]<<24);G[m+344>>2]=H[65315]|H[65316]<<8|(H[65317]<<16|H[65318]<<24);G[m+348>>2]=b;E[m+352|0]=H[65323];b=H[65295]|H[65296]<<8|(H[65297]<<16|H[65298]<<24);G[m+320>>2]=H[65291]|H[65292]<<8|(H[65293]<<16|H[65294]<<24);G[m+324>>2]=b;b=H[65303]|H[65304]<<8|(H[65305]<<16|H[65306]<<24);G[m+328>>2]=H[65299]|H[65300]<<8|(H[65301]<<16|H[65302]<<24);G[m+332>>2]=b;j=qb(m+320|0,h+1|0,20);b=Va(j)+j|0;h=H[65197]|H[65198]<<8|(H[65199]<<16|H[65200]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[65201];Ua(j);break U}rb(1238528,h+1|0,b);i=b}E[i+1238528|0]=0;i=261;break B;case 13:b=G[309710];if(H[b|0]==36){h=b+1|0;b=Va(b)-2|0;rb(1238528,h,b);G[309710]=1238528;E[b+1238528|0]=0;b=1238528}i=mi(b,1238528);break B;case 14:i=0;h=G[309710];while(1){b=E[h+i|0];b=b-97>>>0<26?b&95:b;E[i+1238528|0]=b;i=i+1|0;if(b&255){continue}break};V:{W:{X:{Y:{Z:{_:{$:{aa:{j=H[1238528];switch(j-66|0){case 12:break Z;case 3:break _;case 1:break $;case 0:break aa;default:break Y}}if(nb(1238528,64426,5)){break W}i=264;break B}i=264;b=G[309632];if((b|0)!=1129466179|G[309633]!=2639180){break X}break B}if(nb(1238528,64687,9)){break W}i=264;break B}if(nb(1238528,64506,6)){break W}i=264;break B}b=G[309632];h=G[309633];if((j|0)!=73){break X}i=264;if((b|0)==1431196489&(h|0)==2640972){break B}}ba:{switch((b&255)-71|0){case 0:if(!nb(1238528,64484,11)){i=266;break B}if(nb(1238528,64534,12)){break W}i=267;break B;case 12:break V;case 11:break ba;default:break W}}if(nb(1238528,64495,11)){break W}i=268;break B}i=263;break B}i=G[309632]==1397904467&G[309633]==2642516?265:263;break B;case 21:i=278;break B;case 22:i=279;break B;case 23:i=280;break B;case 24:i=281;break B;case 25:i=283;break B;case 26:i=282;break B;case 27:i=284;break B;case 28:i=10;break B;case 29:i=E[G[309710]];break B;case 30:hb(G[309710],G[309711],1,G[309701]);continue O;case 32:i=0;break B;case 20:break B;case 19:break J;case 18:break K;case 17:break L;case 16:break M;case 15:break N;case 1:continue O;case 31:break T;default:break Q}}y=G[309710];E[o|0]=H[1238828];r=G[309704];w=G[309705];z=r+(w<<2)|0;h=G[z>>2];ca:{if(G[h+44>>2]){l=G[309738];break ca}l=G[h+16>>2];G[309738]=l;G[h>>2]=G[309700];h=G[z>>2];G[h+44>>2]=1}n=G[309706];i=G[h+4>>2];b=l+i|0;if(n>>>0<=b>>>0){j=G[309710];h=(y^-1)+o|0;o=j+h|0;G[309706]=o;i=H[1238812];b=j;if((h|0)>0){while(1){h=1;l=H[b|0];if(l){h=H[(l<<2)+137104|0]}l=i<<1;if(I[l+138128>>1]){G[309709]=b;G[309708]=i}n=F[l+139424>>1]+h|0;if(F[(n<<1)+138480>>1]!=(i|0)){l=h;while(1){i=F[(i<<1)+139792>>1];l=(i|0)>=174?G[(h<<2)+140160>>2]:l;h=l&255;n=h+F[(i<<1)+139424>>1]|0;if(I[(n<<1)+138480>>1]!=(i&65535)){continue}break}}i=F[(n<<1)+140400>>1];b=b+1|0;if((o|0)!=(b|0)){continue}break}}if(I[(i<<1)+138128>>1]){G[309709]=o;G[309708]=i}h=i;l=F[(h<<1)+139424>>1]+1|0;if(F[(l<<1)+138480>>1]!=(h|0)){while(1){b=I[(h<<1)+139792>>1];h=b<<16>>16;l=F[(h<<1)+139424>>1]+1|0;if(I[(l<<1)+138480>>1]!=(b|0)){continue}break}}h=F[(l<<1)+140400>>1];if(!l|(h|0)==173){continue R}o=o+1|0;G[309706]=o;b=j;i=h;continue P}if(b+1>>>0>>0){break G}b=G[309710];if(!G[h+40>>2]){h=32;if((n-b|0)==1){continue}break S}t=(b^-1)+n|0;if((t|0)>0){B=t&7;da:{if((n-b|0)-2>>>0<7){h=b;break da}C=t&-8;l=0;h=b;while(1){E[i|0]=H[h|0];E[i+1|0]=H[h+1|0];E[i+2|0]=H[h+2|0];E[i+3|0]=H[h+3|0];E[i+4|0]=H[h+4|0];E[i+5|0]=H[h+5|0];E[i+6|0]=H[h+6|0];E[i+7|0]=H[h+7|0];i=i+8|0;h=h+8|0;l=l+8|0;if((C|0)!=(l|0)){continue}break}}l=0;if(B){while(1){E[i|0]=H[h|0];i=i+1|0;h=h+1|0;l=l+1|0;if((B|0)!=(l|0)){continue}break}}h=G[z>>2]}ea:{fa:{if(G[h+44>>2]==2){G[309738]=0;break fa}l=b-n|0;while(1){b=G[h+12>>2];i=b+l|0;if(!i){if(!G[h+20>>2]){G[h+4>>2]=0;break E}i=G[h+4>>2];r=b<<1;b=r?r:b+(b>>>3|0)|0;G[h+12>>2]=b;b=ub(i,b+2|0);G[h+4>>2]=b;if(!b){break E}n=b+(n-i|0)|0;G[309706]=n;r=G[309704];w=G[309705];h=G[r+(w<<2)>>2];continue}break}b=t+G[h+4>>2]|0;r=(w<<2)+r|0;if(!G[309721]){z=(i>>>0<8192?i:8192)-1|0;h=G[309720];n=G[309719];i=0;ga:{ha:{while(1){ia:{G[309720]=h+1;E[b+i|0]=H[h+n|0];l=i+1|0;h=G[309720];n=G[309719];w=H[h+n|0];if((i|0)==(z|0)){break ia}i=l;if(w){continue}break ha}break}if(w){break ga}}G[309721]=1}E[b+l|0]=0;G[309738]=l;G[G[r>>2]+16>>2]=l;h=G[309705];b=G[309704];i=0;break ea}E[b|0]=0;G[309738]=0;h=G[r>>2]}l=0;G[h+16>>2]=0;if(!t){b=G[309700];h=G[309704];ja:{if(h){i=G[h+(G[309705]<<2)>>2];if(i){break ja}}Uj();i=Tj(G[309700]);G[G[309704]+(G[309705]<<2)>>2]=i}Sj(i,b);b=G[309704];h=G[309705];n=b+(h<<2)|0;i=G[n>>2];l=G[i+16>>2];G[309738]=l;i=G[i+8>>2];G[309706]=i;G[309710]=i;G[309700]=G[G[n>>2]>>2];E[1238828]=H[i|0];i=1;break ea}b=G[309704];h=G[309705];G[G[b+(h<<2)>>2]+44>>2]=2;i=2}b=(h<<2)+b|0;n=G[b>>2];h=l+t|0;ka:{if(J[n+12>>2]>=h>>>0){l=G[n+4>>2];break ka}l=ub(G[n+4>>2],h+(l>>>1|0)|0);G[G[b>>2]+4>>2]=l;l=G[G[b>>2]+4>>2];if(!l){break F}}G[309738]=h;E[h+l|0]=0;E[(h+G[G[b>>2]+4>>2]|0)+1|0]=0;b=G[G[b>>2]+4>>2];G[309710]=b;h=32;if((i|0)==1){continue}break}la:{switch(i|0){case 0:h=(y^-1)+o|0;o=h+b|0;G[309706]=o;i=H[1238812];j=b;if((h|0)<=0){continue P}while(1){h=1;l=H[j|0];if(l){h=H[(l<<2)+137104|0]}l=i<<1;if(I[l+138128>>1]){G[309709]=j;G[309708]=i}n=F[l+139424>>1]+h|0;if(F[(n<<1)+138480>>1]!=(i|0)){l=h;while(1){i=F[(i<<1)+139792>>1];l=(i|0)>=174?G[(h<<2)+140160>>2]:l;h=l&255;n=h+F[(i<<1)+139424>>1]|0;if(I[(n<<1)+138480>>1]!=(i&65535)){continue}break}}i=F[(n<<1)+140400>>1];j=j+1|0;if((o|0)!=(j|0)){continue}break};continue P;case 2:break la;default:continue O}}i=G[G[G[309704]+(G[309705]<<2)>>2]+4>>2];l=G[309738]}o=i+l|0;G[309706]=o;i=H[1238812];j=b;if(b>>>0>=o>>>0){continue}break}while(1){h=1;l=H[j|0];if(l){h=H[(l<<2)+137104|0]}if(I[(i<<1)+138128>>1]){G[309709]=j;G[309708]=i}n=F[(i<<1)+139424>>1]+h|0;if(F[(n<<1)+138480>>1]!=(i|0)){l=h;while(1){i=F[(i<<1)+139792>>1];l=(i|0)>=174?G[(h<<2)+140160>>2]:l;h=l&255;n=h+F[(i<<1)+139424>>1]|0;if(I[(n<<1)+138480>>1]!=(i&65535)){continue}break}}i=F[(n<<1)+140400>>1];j=j+1|0;if((o|0)!=(j|0)){continue}break}continue}break}break}break}G[m>>2]=26483;_a(G[24367],70017,m);break A}i=287;break B}i=288;break B}i=285;break B}i=286;break B}i=276;break B}G[309737]=431;b=H[65274]|H[65275]<<8|(H[65276]<<16|H[65277]<<24);G[m+336>>2]=H[65270]|H[65271]<<8|(H[65272]<<16|H[65273]<<24);G[m+340>>2]=b;b=H[65282]|H[65283]<<8|(H[65284]<<16|H[65285]<<24);G[m+344>>2]=H[65278]|H[65279]<<8|(H[65280]<<16|H[65281]<<24);G[m+348>>2]=b;b=H[65287]|H[65288]<<8|(H[65289]<<16|H[65290]<<24);j=H[65283]|H[65284]<<8|(H[65285]<<16|H[65286]<<24);E[m+349|0]=j;E[m+350|0]=j>>>8;E[m+351|0]=j>>>16;E[m+352|0]=j>>>24;E[m+353|0]=b;E[m+354|0]=b>>>8;E[m+355|0]=b>>>16;E[m+356|0]=b>>>24;b=H[65258]|H[65259]<<8|(H[65260]<<16|H[65261]<<24);G[m+320>>2]=H[65254]|H[65255]<<8|(H[65256]<<16|H[65257]<<24);G[m+324>>2]=b;b=H[65266]|H[65267]<<8|(H[65268]<<16|H[65269]<<24);G[m+328>>2]=H[65262]|H[65263]<<8|(H[65264]<<16|H[65265]<<24);G[m+332>>2]=b;j=qb(m+320|0,h,20);b=Va(j)+j|0;h=H[65197]|H[65198]<<8|(H[65199]<<16|H[65200]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[65201];Ua(j);break C}G[309737]=431;b=H[65237]|H[65238]<<8|(H[65239]<<16|H[65240]<<24);G[m+336>>2]=H[65233]|H[65234]<<8|(H[65235]<<16|H[65236]<<24);G[m+340>>2]=b;b=H[65245]|H[65246]<<8|(H[65247]<<16|H[65248]<<24);G[m+344>>2]=H[65241]|H[65242]<<8|(H[65243]<<16|H[65244]<<24);G[m+348>>2]=b;b=H[65250]|H[65251]<<8|(H[65252]<<16|H[65253]<<24);j=H[65246]|H[65247]<<8|(H[65248]<<16|H[65249]<<24);E[m+349|0]=j;E[m+350|0]=j>>>8;E[m+351|0]=j>>>16;E[m+352|0]=j>>>24;E[m+353|0]=b;E[m+354|0]=b>>>8;E[m+355|0]=b>>>16;E[m+356|0]=b>>>24;b=H[65221]|H[65222]<<8|(H[65223]<<16|H[65224]<<24);G[m+320>>2]=H[65217]|H[65218]<<8|(H[65219]<<16|H[65220]<<24);G[m+324>>2]=b;b=H[65229]|H[65230]<<8|(H[65231]<<16|H[65232]<<24);G[m+328>>2]=H[65225]|H[65226]<<8|(H[65227]<<16|H[65228]<<24);G[m+332>>2]=b;j=qb(m+320|0,h,20);b=Va(j)+j|0;h=H[65197]|H[65198]<<8|(H[65199]<<16|H[65200]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[65201];Ua(j);break D}G[m+16>>2]=29150;_a(G[24367],70017,m+16|0);break A}G[m+32>>2]=63865;_a(G[24367],70017,m+32|0);break A}G[m+48>>2]=3914;_a(G[24367],70017,m+48|0);break A}i=0;E[(m+320|0)+l|0]=0;E[m+64|0]=0;h=H[m+320|0];if(h){while(1){ma:{na:{switch((h<<24>>24)-48|0){case 0:b=m- -64|0;b=Va(b)+b|0;h=H[41656]|H[41657]<<8|(H[41658]<<16|H[41659]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41660];break ma;case 1:b=m- -64|0;b=Va(b)+b|0;h=H[41375]|H[41376]<<8|(H[41377]<<16|H[41378]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41379];break ma;case 2:b=m- -64|0;b=Va(b)+b|0;h=H[41630]|H[41631]<<8|(H[41632]<<16|H[41633]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41634];break ma;case 3:b=m- -64|0;b=Va(b)+b|0;h=H[41331]|H[41332]<<8|(H[41333]<<16|H[41334]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41335];break ma;case 4:b=m- -64|0;b=Va(b)+b|0;h=H[41640]|H[41641]<<8|(H[41642]<<16|H[41643]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41644];break ma;case 5:b=m- -64|0;b=Va(b)+b|0;h=H[41354]|H[41355]<<8|(H[41356]<<16|H[41357]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41358];break ma;case 6:b=m- -64|0;b=Va(b)+b|0;h=H[41601]|H[41602]<<8|(H[41603]<<16|H[41604]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41605];break ma;case 7:b=m- -64|0;b=Va(b)+b|0;h=H[41321]|H[41322]<<8|(H[41323]<<16|H[41324]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41325];break ma;case 8:b=m- -64|0;b=Va(b)+b|0;h=H[41651]|H[41652]<<8|(H[41653]<<16|H[41654]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41655];break ma;case 9:b=m- -64|0;b=Va(b)+b|0;h=H[41370]|H[41371]<<8|(H[41372]<<16|H[41373]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41374];break ma;case 17:case 49:b=m- -64|0;b=Va(b)+b|0;h=H[41625]|H[41626]<<8|(H[41627]<<16|H[41628]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41629];break ma;case 18:case 50:b=m- -64|0;b=Va(b)+b|0;h=H[41326]|H[41327]<<8|(H[41328]<<16|H[41329]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41330];break ma;case 19:case 51:b=m- -64|0;b=Va(b)+b|0;h=H[41635]|H[41636]<<8|(H[41637]<<16|H[41638]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41639];break ma;case 20:case 52:b=m- -64|0;b=Va(b)+b|0;h=H[41349]|H[41350]<<8|(H[41351]<<16|H[41352]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41353];break ma;case 21:case 53:b=m- -64|0;b=Va(b)+b|0;h=H[41596]|H[41597]<<8|(H[41598]<<16|H[41599]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41600];break ma;case 22:case 54:b=m- -64|0;b=Va(b)+b|0;h=H[41316]|H[41317]<<8|(H[41318]<<16|H[41319]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[41320];break ma;case 40:case 72:break na;default:break ma}}b=m- -64|0;b=Va(b)+b|0;h=H[3698]|H[3699]<<8|(H[3700]<<16|H[3701]<<24);E[b|0]=h;E[b+1|0]=h>>>8;E[b+2|0]=h>>>16;E[b+3|0]=h>>>24;E[b+4|0]=H[3702]}i=i+1|0;h=H[i+(m+320|0)|0];if(h){continue}break}}Za(1238528,m- -64|0);i=262;break B}h=0;E[(m+320|0)+l|0]=0;E[m+64|0]=0;l=H[m+320|0];if(l){while(1){i=3158064;oa:{pa:{qa:{switch((l<<24>>24)-48|0){case 1:i=3223600;break pa;case 2:i=3158320;break pa;case 3:i=3223856;break pa;case 4:i=3158065;break pa;case 5:i=3223601;break pa;case 6:i=3158321;break pa;case 7:i=3223857;break pa;case 0:break pa;case 40:case 72:break qa;default:break oa}}i=7895160}b=m- -64|0;b=Va(b)+b|0;E[b|0]=i;E[b+1|0]=i>>>8;E[b+2|0]=i>>>16;E[b+3|0]=i>>>24}h=h+1|0;l=H[h+(m+320|0)|0];if(l){continue}break}}Za(1238528,m- -64|0);i=262}Fa=m+576|0;break z}ca(2);W()}o=i;G[309630]=i}ra:{if((o|0)<=0){G[309630]=0;b=0;break ra}if((o|0)==256){G[309630]=257;break k}b=2;if(o>>>0>291){break ra}b=E[o+127680|0]}h=b+x|0;if(h>>>0>1725){break x}h=h<<1;if((b|0)!=F[h+127984>>1]){break x}p=F[h+131440>>1];if((p|0)>0){k=k+256|0;bb(k,1238528,256);G[309630]=-2;D=D?D-1|0:0;break j}o=0-p|0;break w}o=H[p+134896|0];if(!o){break v}}x=E[o+135216|0];h=(1-x<<8)+k|0;b=G[h>>2];bb(q+4|0,h+4|0,252);sa:{switch(o-5|0){case 0:h=G[k-256>>2];if((h|0)<0){wc(36007);break l}G[309725]=h;break n;case 1:h=G[k-256>>2];if((h|0)<0){wc(36007);break l}G[309725]=h;break n;case 2:h=G[k-256>>2];if((h|0)<0){wc(36007);break l}G[309725]=h;break n;case 3:h=G[k-256>>2];if((h|0)<0){wc(36007);break l}G[309725]=h;break n;case 4:D=0;break n;case 5:b=zg(G[k>>2]);if((b|0)<0){break l}break n;case 6:h=G[309722];i=k-512|0;b=G[i>>2];j=G[(h+M(b,344)|0)+8>>2];if((j|0)>=10){b=yg(b);G[i>>2]=b;if((b|0)<0){break l}b=zg(b);if((b|0)<0){break l}h=G[309722];j=G[(h+M(b,344)|0)+8>>2]}i=G[k>>2];h=M(b,344)+h|0;G[h+8>>2]=j+1;G[(h+(j<<2)|0)+12>>2]=i;break n;case 7:b=zg(G[k>>2]);if((b|0)<0){break l}break n;case 8:j=G[309722];i=k-512|0;b=G[i>>2];h=j+M(b,344)|0;l=G[(M(G[k>>2],344)+j|0)+52>>2];if(G[h+52>>2]<(l|0)){G[h+52>>2]=l;b=G[i>>2]}h=G[(M(b,344)+j|0)+8>>2];if((h|0)>=10){b=yg(b);G[i>>2]=b;if((b|0)<0){break l}b=zg(b);if((b|0)<0){break l}j=G[309722];h=G[(j+M(b,344)|0)+8>>2]}i=G[k>>2];j=M(b,344)+j|0;G[j+8>>2]=h+1;G[(j+(h<<2)|0)+12>>2]=i;break n;case 9:h=G[309722];i=k-512|0;b=G[i>>2];j=G[(h+M(b,344)|0)+8>>2];if((j|0)>=10){b=yg(b);G[i>>2]=b;if((b|0)<0){break l}b=zg(b);if((b|0)<0){break l}h=G[309722];j=G[(h+M(b,344)|0)+8>>2]}i=G[k>>2];h=M(b,344)+h|0;G[h+8>>2]=j+1;G[(h+(j<<2)|0)+12>>2]=i;break n;case 10:j=G[309722];i=k-512|0;G[(j+M(G[i>>2],344)|0)+52>>2]=G[(M(G[k>>2],344)+j|0)+52>>2];b=G[i>>2];h=G[(M(b,344)+j|0)+8>>2];if((h|0)>=10){b=yg(b);G[i>>2]=b;if((b|0)<0){break l}b=zg(b);if((b|0)<0){break l}j=G[309722];h=G[(j+M(b,344)|0)+8>>2]}i=G[k>>2];j=M(b,344)+j|0;G[j+8>>2]=h+1;G[(j+(h<<2)|0)+12>>2]=i;break n;case 11:b=yg(G[k-256>>2]);if((b|0)<0){break l}break n;case 12:b=yg(G[k-256>>2]);if((b|0)<0){break l}break n;case 13:b=Cd(262,k,Va(k)+1|0);if((b|0)<0){break l}O=G[309722]+M(b,344)|0,P=Va(k),G[O+56>>2]=P;break n;case 14:b=xf(G[k>>2]);if((b|0)<0){break l}break n;case 15:b=11244;h=G[k-256>>2];j=G[309722]+M(h,344)|0;if(G[j+52>>2]!=259|G[j>>2]!=-1e3){break m}b=oi(G[k-768>>2],h);if((b|0)<0){break l}break n;case 16:h=k-512|0;b=bc(262,G[h>>2],38,G[k>>2]);if((b|0)<0){break l}j=M(G[h>>2],344);h=G[309722];j=G[(j+h|0)+56>>2];i=h+M(b,344)|0;h=G[(h+M(G[k>>2],344)|0)+56>>2];G[i+56>>2]=(h|0)<(j|0)?j:h;break n;case 17:h=k-512|0;b=bc(262,G[h>>2],124,G[k>>2]);if((b|0)<0){break l}j=M(G[h>>2],344);h=G[309722];j=G[(j+h|0)+56>>2];i=h+M(b,344)|0;h=G[(h+M(G[k>>2],344)|0)+56>>2];G[i+56>>2]=(h|0)<(j|0)?j:h;break n;case 18:b=5652;j=G[309722];h=G[k>>2];i=k-512|0;l=G[i>>2];if((G[(j+M(h,344)|0)+56>>2]+G[(j+M(l,344)|0)+56>>2]|0)>255){break m}b=bc(262,l,43,h);if((b|0)<0){break l}h=G[309722];G[(h+M(b,344)|0)+56>>2]=G[(h+M(G[k>>2],344)|0)+56>>2]+G[(h+M(G[i>>2],344)|0)+56>>2];break n;case 19:b=Od(G[k-768>>2],1,G[k-256>>2],0,0,0,0);if((b|0)<0){break l}break n;case 20:b=Od(G[k-1280>>2],2,G[k-768>>2],G[k-256>>2],0,0,0);if((b|0)<0){break l}break n;case 21:b=Od(G[k-1792>>2],3,G[k-1280>>2],G[k-768>>2],G[k-256>>2],0,0);if((b|0)<0){break l}break n;case 22:b=Od(G[k-2304>>2],4,G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2],0);if((b|0)<0){break l}break n;case 23:b=Od(G[k-2816>>2],5,G[k-2304>>2],G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2]);if((b|0)<0){break l}break n;case 24:b=Fb(262,286,G[k>>2]);if((b|0)<0){break l}break n;case 25:b=G[k-256>>2];break n;case 26:b=Cd(259,k,4);if((b|0)<0){break l}break n;case 27:b=Cd(260,k,8);if((b|0)<0){break l}break n;case 28:b=xf(G[k>>2]);if((b|0)<0){break l}break n;case 29:b=11244;h=G[k-256>>2];j=G[309722]+M(h,344)|0;if(G[j+52>>2]!=259|G[j>>2]!=-1e3){break m}b=oi(G[k-768>>2],h);if((b|0)<0){break l}break n;case 30:b=Vb(259,1035,0,0,0,0,0,0,0,0,0);break n;case 31:b=Vb(259,1036,0,0,0,0,0,0,0,0,0);break n;case 32:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];ta:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break ta}if((i|0)>=(l|0)){break ta}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,37,j);if((b|0)<0){break l}break n;case 33:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];ua:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break ua}if((i|0)>=(l|0)){break ua}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,43,j);if((b|0)<0){break l}break n;case 34:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];va:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break va}if((i|0)>=(l|0)){break va}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,45,j);if((b|0)<0){break l}break n;case 35:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];wa:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break wa}if((i|0)>=(l|0)){break wa}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,42,j);if((b|0)<0){break l}break n;case 36:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];xa:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break xa}if((i|0)>=(l|0)){break xa}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,47,j);if((b|0)<0){break l}break n;case 37:b=27829;j=G[309722];h=G[k-512>>2];if(G[(j+M(h,344)|0)+52>>2]!=259){break m}i=G[k>>2];if(G[(j+M(i,344)|0)+52>>2]!=259){break m}b=bc(259,h,38,i);break n;case 38:b=27829;j=G[309722];h=G[k-512>>2];if(G[(j+M(h,344)|0)+52>>2]!=259){break m}i=G[k>>2];if(G[(j+M(i,344)|0)+52>>2]!=259){break m}b=bc(259,h,124,i);break n;case 39:b=27829;j=G[309722];h=G[k-512>>2];if(G[(j+M(h,344)|0)+52>>2]!=259){break m}i=G[k>>2];if(G[(j+M(i,344)|0)+52>>2]!=259){break m}b=bc(259,h,94,i);break n;case 40:l=G[309722];h=k-512|0;b=G[h>>2];i=G[(l+M(b,344)|0)+52>>2];j=G[k>>2];l=G[(l+M(j,344)|0)+52>>2];ya:{if((i|0)>(l|0)){j=Fb(i,0,j);G[k>>2]=j;b=G[h>>2];break ya}if((i|0)>=(l|0)){break ya}b=Fb(l,0,b);G[h>>2]=b;j=G[k>>2]}b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,285,j);if((b|0)<0){break l}break n;case 41:b=G[k>>2];break n;case 42:b=G[k>>2];b=Fb(G[(G[309722]+M(b,344)|0)+52>>2],289,b);if((b|0)<0){break l}break n;case 43:b=G[k-256>>2];break n;case 44:b=k-512|0;h=Fb(G[(G[309722]+M(G[b>>2],344)|0)+52>>2],0,G[k>>2]);G[k>>2]=h;b=G[b>>2];b=bc(G[(G[309722]+M(b,344)|0)+52>>2],b,42,h);if((b|0)<0){break l}break n;case 45:h=k-512|0;b=Fb(G[(G[309722]+M(G[k>>2],344)|0)+52>>2],0,G[h>>2]);G[h>>2]=b;h=G[k>>2];b=bc(G[(G[309722]+M(h,344)|0)+52>>2],b,42,h);if((b|0)<0){break l}break n;case 46:l=G[309722];i=k-512|0;j=G[i>>2];h=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];za:{if((h|0)>(l|0)){b=Fb(h,0,b);G[k>>2]=b;j=G[i>>2];break za}if((h|0)>=(l|0)){break za}j=Fb(l,0,j);G[i>>2]=j;b=G[k>>2]}if(!Cc(j,b)){wc(5493);break l}l=k-1024|0;h=Vb(0,1034,3,j,b,G[l>>2],0,0,0,0,0);if((h|0)<0){break l}b=G[309722];j=G[i>>2];m=G[k>>2];if(G[(b+M(j,344)|0)+56>>2]>2]){xc(h,m);j=G[i>>2];b=G[309722]}G[(M(G[l>>2],344)+b|0)+52>>2]=G[(M(j,344)+b|0)+52>>2];j=G[l>>2];if(!Cc(j,h)){wc(13975);break l}G[(M(j,344)+b|0)+52>>2]=258;i=G[(M(h,344)+b|0)+56>>2];j=b;b=G[l>>2];if((i|0)>=G[(j+M(b,344)|0)+56>>2]){b=h;break n}xc(h,b);b=h;break n;case 47:l=G[309722];i=k-512|0;j=G[i>>2];h=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];Aa:{if((h|0)>(l|0)){b=Fb(h,0,b);G[k>>2]=b;j=G[i>>2];break Aa}if((h|0)>=(l|0)){break Aa}j=Fb(l,0,j);G[i>>2]=j;b=G[k>>2]}if(!Cc(j,b)){wc(5493);break l}l=k-1024|0;h=Vb(0,1034,3,j,b,G[l>>2],0,0,0,0,0);if((h|0)<0){break l}b=G[309722];j=G[i>>2];m=G[k>>2];if(G[(b+M(j,344)|0)+56>>2]>2]){xc(h,m);j=G[i>>2];b=G[309722]}G[(M(G[l>>2],344)+b|0)+52>>2]=G[(M(j,344)+b|0)+52>>2];j=G[l>>2];if(!Cc(j,h)){wc(13975);break l}G[(M(j,344)+b|0)+52>>2]=258;i=G[(M(h,344)+b|0)+56>>2];j=b;b=G[l>>2];if((i|0)>=G[(j+M(b,344)|0)+56>>2]){b=h;break n}xc(h,b);b=h;break n;case 48:l=G[309722];i=k-512|0;j=G[i>>2];h=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];Ba:{if((h|0)>(l|0)){b=Fb(h,0,b);G[k>>2]=b;j=G[i>>2];break Ba}if((h|0)>=(l|0)){break Ba}j=Fb(l,0,j);G[i>>2]=j;b=G[k>>2]}if(!Cc(j,b)){wc(5493);break l}l=k-1024|0;h=Vb(0,1034,3,j,b,G[l>>2],0,0,0,0,0);if((h|0)<0){break l}b=G[309722];j=G[i>>2];m=G[k>>2];if(G[(b+M(j,344)|0)+56>>2]>2]){xc(h,m);j=G[i>>2];b=G[309722]}G[(M(G[l>>2],344)+b|0)+52>>2]=G[(M(j,344)+b|0)+52>>2];j=G[l>>2];if(!Cc(j,h)){wc(13975);break l}G[(M(j,344)+b|0)+52>>2]=258;i=G[(M(h,344)+b|0)+56>>2];j=b;b=G[l>>2];if((i|0)>=G[(j+M(b,344)|0)+56>>2]){b=h;break n}xc(h,b);b=h;break n;case 49:b=28709;h=k-256|0;if(H[h|0]!=82){break m}if(Xa(h,64608)){if(Xa(h,64546)){break m}b=1042}else{b=1001}b=Vb(260,b,0,0,0,0,0,0,0,0,0);if((b|0)<0){break l}break n;case 50:b=28642;Ca:{Da:{Ea:{Fa:{h=k-512|0;switch(H[h|0]-65|0){case 0:break Da;case 13:break Ea;case 18:break Fa;default:break m}}if(Xa(h,64596)){break m}b=Vb(259,1002,1,G[k-256>>2],0,0,0,0,0,0,0);break Ca}if(Xa(h,64616)){break m}b=Cd(259,(G[309722]+M(G[k-256>>2],344)|0)+56|0,4);break Ca}if(Xa(h,64601)){break m}G[q+26064>>2]=0;b=bc(259,G[k-256>>2],290,Cd(259,q+26064|0,4))}if((b|0)<0){break l}break n;case 51:b=28450;h=k-512|0;if(H[h|0]!=78){break m}Ga:{if(!Xa(h,64616)){b=Cd(259,(G[309722]+M(G[k-256>>2],344)|0)+56|0,4);break Ga}if(Xa(h,64728)){break m}b=Vb(259,1040,1,G[k-256>>2],0,0,0,0,0,0,0)}if((b|0)<0){break l}break n;case 52:b=28421;Ha:{Ia:{Ja:{Ka:{La:{Ma:{h=k-512|0;switch(H[h|0]-65|0){case 0:break Ja;case 12:break Ka;case 18:break La;case 13:break Ma;default:break m}}if(!Xa(h,64616)){b=Cd(259,(G[309722]+M(G[k-256>>2],344)|0)+56|0,4);break Ha}if(Xa(h,64728)){break m}b=Cd(259,(G[309722]+M(G[k-256>>2],344)|0)+56|0,4);break Ha}if(Xa(h,64596)){break m}b=Vb(259,1002,1,G[k-256>>2],0,0,0,0,0,0,0);break Ha}if(Xa(h,64569)){break Ia}b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1022,1,b,0,0,0,0,0,0,0);G[(G[309722]+M(b,344)|0)+56>>2]=1;break Ha}if(Xa(h,64601)){break m}G[q+26064>>2]=0;b=bc(259,G[k-256>>2],290,Cd(259,q+26064|0,4));break Ha}if(Xa(h,64431)){break m}b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1024,1,b,0,0,0,0,0,0,0);G[(G[309722]+M(b,344)|0)+56>>2]=1}if((b|0)<0){break l}break n;case 53:Na:{Oa:{Pa:{Qa:{Ra:{Sa:{Ta:{Ua:{Va:{Wa:{Xa:{l=k-512|0;b=H[l|0];switch(b-65|0){case 17:break Oa;case 13:break Ta;case 12:break Ua;case 0:break Wa;case 18:break Xa;default:break Na}}if(Xa(l,64596)){break Va}b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1002,1,b,0,0,0,0,0,0,0);break o}if(Xa(l,64704)){break Sa}b=Vb(260,1038,1,G[k-256>>2],0,0,0,0,0,0,0);break o}if(Xa(l,64436)){break Ra}b=Vb(260,1039,1,G[k-256>>2],0,0,0,0,0,0,0);break o}if(Xa(l,64588)){break Pa}b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1037,1,b,0,0,0,0,0,0,0);break o}if(!Xa(l,64616)){b=Cd(259,(G[309722]+M(G[k-256>>2],344)|0)+56|0,4);break o}if(Xa(l,64728)){break Na}b=Vb(259,1040,1,G[k-256>>2],0,0,0,0,0,0,0);break o}Ya:{if(Xa(l,64601)){break Ya}h=k-256|0;if(G[(G[309722]+M(G[h>>2],344)|0)+52>>2]!=259){break Ya}G[q+26064>>2]=0;b=bc(259,G[h>>2],290,Cd(259,q+26064|0,4));break o}if(Xa(l,64601)){break Qa}h=k-256|0;if(G[(G[309722]+M(G[h>>2],344)|0)+52>>2]!=260){break Qa}G[q+26064>>2]=0;G[q+26068>>2]=0;b=bc(260,G[h>>2],290,Cd(260,q+26064|0,8));break o}Za:{if(Xa(l,64678)){break Za}h=k-256|0;if(G[(G[309722]+M(G[h>>2],344)|0)+52>>2]!=259){break Za}G[q+26064>>2]=0;b=bc(259,G[h>>2],291,Cd(259,q+26064|0,4));break o}if(Xa(l,64678)){break Na}h=k-256|0;if(G[(G[309722]+M(G[h>>2],344)|0)+52>>2]!=260){break Na}G[q+26064>>2]=0;G[q+26068>>2]=0;b=bc(260,G[h>>2],291,Cd(260,q+26064|0,8));break o}if(Xa(l,64464)){break Na}b=Vb(0,1017,1,G[k-256>>2],0,0,0,0,0,0,0);break o}if(!Xa(l,64569)){b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1022,1,b,0,0,0,0,0,0,0);break o}if(Xa(l,64431)){break Na}b=G[k-256>>2];b=Vb(G[(G[309722]+M(b,344)|0)+52>>2],1024,1,b,0,0,0,0,0,0,0);break o}if(!Xa(l,64608)){b=Vb(0,1001,1,G[k-256>>2],0,0,0,0,0,0,0);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+52>>2]=260;break n}if(Xa(l,64546)){break Na}b=Vb(0,1042,1,G[k-256>>2],0,0,0,0,0,0,0);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+52>>2]=260;break n}j=k-256|0;h=G[j>>2];if(G[(G[309722]+M(h,344)|0)+52>>2]!=260){h=Fb(260,0,h);G[j>>2]=h;b=H[l|0]}_a:{$a:{ab:{bb:{cb:{db:{eb:{i=b&255;if((i|0)==83){if(Xa(l,64564)){break eb}b=Vb(0,1004,1,h,0,0,0,0,0,0,0);break o}j=0;fb:{switch(i-65|0){case 2:if(Xa(l,64459)){break db}b=Vb(0,1005,1,h,0,0,0,0,0,0,0);break o;case 19:if(Xa(l,64583)){break cb}b=Vb(0,1006,1,h,0,0,0,0,0,0,0);break o;case 0:break fb;default:break ab}}gb:{if(Xa(l,64555)){if(Xa(l,64563)){break gb}}b=Vb(0,1007,1,h,0,0,0,0,0,0,0);break o}hb:{if(Xa(l,64450)){if(Xa(l,64458)){break hb}}b=Vb(0,1008,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64574)){if(Xa(l,64582)){break $a}}b=Vb(0,1009,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64661)){break bb}b=Vb(0,1010,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64655)){break bb}b=Vb(0,1011,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64667)){break $a}b=Vb(0,1012,1,h,0,0,0,0,0,0,0);break o}j=(b&255)!=83}ib:{jb:{kb:{i=b&255;switch(i-69|0){case 7:break jb;case 0:break kb;default:break ib}}if(Xa(l,64512)){break s}b=Vb(0,1013,1,h,0,0,0,0,0,0,0);break o}if(!Xa(l,64673)){b=Vb(0,1014,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64745)){break s}b=Vb(0,1015,1,h,0,0,0,0,0,0,0);break o}if((i|0)==83){break t}if((b&255)!=82){break $a}i=1;if(Xa(l,64713)){break _a}b=Vb(0,1021,1,h,0,0,0,0,0,0,0);break o}i=0;if((b&255)!=70){break _a}if(Xa(l,64477)){break _a}b=Vb(0,1020,1,h,0,0,0,0,0,0,0);break o}if(!j){break p}break q;case 54:h=k-1024|0;if(H[h|0]!=83){break n}if(Xa(h,64469)){break n}b=Vb(259,1045,2,G[k-768>>2],G[k-256>>2],0,0,0,0,0,0);if((b|0)<0){break l}break n;case 55:b=28571;lb:{mb:{nb:{ob:{h=k-1024|0;switch(H[h|0]-65|0){case 18:break lb;case 12:break mb;case 0:break nb;case 3:break ob;default:break m}}if(Xa(h,64640)){break m}b=22761;j=G[309722];l=k-768|0;i=G[l>>2];m=k-256|0;h=G[m>>2];if(G[(j+M(i,344)|0)+56>>2]>2]){break m}if(!Cc(i,h)){break m}b=G[(j+M(i,344)|0)+52>>2];j=G[(j+M(h,344)|0)+52>>2];pb:{if((b|0)>(j|0)){h=Fb(b,0,h);G[m>>2]=h;i=G[l>>2];break pb}if((b|0)>=(j|0)){break pb}i=Fb(j,0,i);G[l>>2]=i;h=G[m>>2]}b=Vb(0,1031,2,i,h,0,0,0,0,0,0);if((b|0)<0){break l}break n}if(Xa(h,64736)){break m}h=G[309722];i=k-768|0;b=G[i>>2];if(G[(h+M(b,344)|0)+52>>2]!=260){b=Fb(260,0,b);G[i>>2]=b;l=G[309722]}else{l=h}h=k-256|0;j=G[h>>2];if(G[(l+M(j,344)|0)+52>>2]!=260){j=Fb(260,0,j);G[h>>2]=j;b=G[i>>2]}if(!Cc(b,j)){wc(22920);break l}b=Vb(0,1018,2,b,j,0,0,0,0,0,0);if((b|0)<0){break l}j=G[309722];h=G[h>>2];if(G[(j+M(G[i>>2],344)|0)+56>>2]>=G[(j+M(h,344)|0)+56>>2]){break n}xc(b,h);break n}if(!Xa(h,64569)){m=G[309722];h=k-768|0;j=G[h>>2];l=G[(m+M(j,344)|0)+52>>2];i=k-256|0;b=G[i>>2];m=G[(m+M(b,344)|0)+52>>2];qb:{if((l|0)>(m|0)){b=Fb(l,0,b);G[i>>2]=b;j=G[h>>2];break qb}if((l|0)>=(m|0)){break qb}j=Fb(m,0,j);G[h>>2]=j;b=G[i>>2]}if(!Cc(j,b)){wc(23023);break l}b=Vb(0,1023,2,j,b,0,0,0,0,0,0);if((b|0)<0){break l}l=M(G[h>>2],344);h=G[309722];j=G[i>>2];if(G[(l+h|0)+56>>2]>=G[(h+M(j,344)|0)+56>>2]){break n}xc(b,j);break n}if(Xa(h,64431)){break m}m=G[309722];h=k-768|0;j=G[h>>2];l=G[(m+M(j,344)|0)+52>>2];i=k-256|0;b=G[i>>2];m=G[(m+M(b,344)|0)+52>>2];rb:{if((l|0)>(m|0)){b=Fb(l,0,b);G[i>>2]=b;j=G[h>>2];break rb}if((l|0)>=(m|0)){break rb}j=Fb(m,0,j);G[h>>2]=j;b=G[i>>2]}if(!Cc(j,b)){wc(22971);break l}b=Vb(0,1025,2,j,b,0,0,0,0,0,0);if((b|0)<0){break l}l=M(G[h>>2],344);h=G[309722];j=G[i>>2];if(G[(l+h|0)+56>>2]>=G[(h+M(j,344)|0)+56>>2]){break n}xc(b,j);break n}if(Xa(h,64623)){break m}b=4942;h=G[309722];i=k-768|0;j=G[i>>2];l=h+M(j,344)|0;if(G[l>>2]!=-1e3|G[l+56>>2]!=1){break m}r=G[(h+M(j,344)|0)+52>>2];l=k-256|0;b=G[l>>2];h=G[(h+M(b,344)|0)+52>>2];if((r|0)!=(h|0)){j=Fb(h,0,j);G[i>>2]=j;b=G[l>>2]}b=Vb(0,1046,2,b,j,0,0,0,0,0,0);break n;case 56:b=28478;h=k-2048|0;if(H[h|0]!=65){break m}if(Xa(h,64526)){break m}b=G[309722];n=k-1792|0;h=G[n>>2];if(G[(b+M(h,344)|0)+52>>2]!=260){O=n,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}l=k-1280|0;h=G[l>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=l,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}m=k-768|0;h=G[m>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=m,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}p=k-256|0;i=G[p>>2];if(G[(b+M(i,344)|0)+52>>2]!=260){i=Fb(260,0,i);G[p>>2]=i}b=22711;t=G[n>>2];h=G[l>>2];if(!Cc(t,h)){break m}j=G[m>>2];if(!Cc(h,j)){break m}if(!Cc(j,i)){break m}h=Vb(0,1041,4,t,h,j,i,0,0,0,0);if((h|0)<0){break l}b=G[309722];i=G[l>>2];j=G[(b+M(i,344)|0)+56>>2];if((j|0)>G[(M(G[n>>2],344)+b|0)+56>>2]){xc(h,i);b=G[309722];j=G[(b+M(G[l>>2],344)|0)+56>>2]}l=j;i=G[m>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[m>>2],344)|0)+56>>2]}i=b;b=G[p>>2];if(G[(i+M(b,344)|0)+56>>2]<=(j|0)){b=h;break n}xc(h,b);b=h;break n;case 57:b=Od(G[k-768>>2],1,G[k-256>>2],0,0,0,0);if((b|0)<0){break l}break n;case 58:b=Od(G[k-1280>>2],2,G[k-768>>2],G[k-256>>2],0,0,0);if((b|0)<0){break l}break n;case 59:b=Od(G[k-1792>>2],3,G[k-1280>>2],G[k-768>>2],G[k-256>>2],0,0);if((b|0)<0){break l}break n;case 60:b=Od(G[k-2304>>2],4,G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2],0);if((b|0)<0){break l}break n;case 61:b=Od(G[k-2816>>2],5,G[k-2304>>2],G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2]);if((b|0)<0){break l}break n;case 62:b=Fb(259,287,G[k>>2]);if((b|0)<0){break l}break n;case 63:b=Fb(259,287,G[k>>2]);if((b|0)<0){break l}break n;case 64:b=Fb(260,288,G[k>>2]);if((b|0)<0){break l}break n;case 65:b=Fb(260,288,G[k>>2]);if((b|0)<0){break l}break n;case 66:b=Cd(258,k,1);if((b|0)<0){break l}break n;case 67:b=xf(G[k>>2]);if((b|0)<0){break l}break n;case 68:b=11244;h=G[k-256>>2];j=G[309722]+M(h,344)|0;if(G[j+52>>2]!=259|G[j>>2]!=-1e3){break m}b=oi(G[k-768>>2],h);if((b|0)<0){break l}break n;case 69:b=bc(258,G[k-512>>2],278,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 70:b=bc(258,G[k-512>>2],279,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 71:b=bc(258,G[k-512>>2],281,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 72:b=bc(258,G[k-512>>2],282,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 73:b=bc(258,G[k-512>>2],280,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 74:b=bc(258,G[k-512>>2],283,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 75:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];sb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break sb}if((i|0)>=(l|0)){break sb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,280,b);if((b|0)<0){break l}break n;case 76:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];tb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break tb}if((i|0)>=(l|0)){break tb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,281,b);if((b|0)<0){break l}break n;case 77:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];ub:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break ub}if((i|0)>=(l|0)){break ub}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,283,b);if((b|0)<0){break l}break n;case 78:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];vb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break vb}if((i|0)>=(l|0)){break vb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,282,b);if((b|0)<0){break l}break n;case 79:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];wb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break wb}if((i|0)>=(l|0)){break wb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,126,b);if((b|0)<0){break l}break n;case 80:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];xb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break xb}if((i|0)>=(l|0)){break xb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,278,b);if((b|0)<0){break l}break n;case 81:l=G[309722];h=k-512|0;j=G[h>>2];i=G[(l+M(j,344)|0)+52>>2];b=G[k>>2];l=G[(l+M(b,344)|0)+52>>2];yb:{if((i|0)>(l|0)){b=Fb(i,0,b);G[k>>2]=b;j=G[h>>2];break yb}if((i|0)>=(l|0)){break yb}j=Fb(l,0,j);G[h>>2]=j;b=G[k>>2]}b=bc(258,j,279,b);if((b|0)<0){break l}break n;case 82:b=bc(258,G[k-512>>2],278,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 83:b=bc(258,G[k-512>>2],279,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 84:b=bc(258,G[k-512>>2],280,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 85:b=bc(258,G[k-512>>2],283,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 86:b=bc(258,G[k-512>>2],281,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 87:b=bc(258,G[k-512>>2],282,G[k>>2]);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+56>>2]=1;break n;case 88:b=bc(258,G[k-512>>2],277,G[k>>2]);if((b|0)<0){break l}break n;case 89:b=bc(258,G[k-512>>2],276,G[k>>2]);if((b|0)<0){break l}break n;case 90:b=bc(258,G[k-512>>2],278,G[k>>2]);if((b|0)<0){break l}break n;case 91:b=bc(258,G[k-512>>2],279,G[k>>2]);if((b|0)<0){break l}break n;case 92:l=G[309722];j=k-1024|0;i=G[j>>2];h=G[(l+M(i,344)|0)+52>>2];b=k-512|0;m=G[b>>2];l=G[(l+M(m,344)|0)+52>>2];zb:{if((h|0)>(l|0)){O=b,P=Fb(h,0,m),G[O>>2]=P;i=G[j>>2];break zb}if((h|0)>=(l|0)){break zb}i=Fb(l,0,i);G[j>>2]=i}m=G[309722];l=G[(m+M(i,344)|0)+52>>2];h=G[k>>2];m=G[(m+M(h,344)|0)+52>>2];Ab:{if((l|0)>(m|0)){h=Fb(l,0,h);G[k>>2]=h;break Ab}if((l|0)>=(m|0)){break Ab}O=j,P=Fb(m,0,i),G[O>>2]=P;h=G[k>>2]}m=G[309722];i=G[b>>2];l=G[(m+M(i,344)|0)+52>>2];m=G[(m+M(h,344)|0)+52>>2];Bb:{if((l|0)>(m|0)){O=k,P=Fb(l,0,h),G[O>>2]=P;i=G[b>>2];break Bb}if((l|0)>=(m|0)){break Bb}i=Fb(m,0,i);G[b>>2]=i}O=b,P=bc(258,i,282,G[j>>2]),G[O>>2]=P;h=bc(258,G[j>>2],282,G[k>>2]);G[k>>2]=h;b=bc(258,G[b>>2],277,h);if((b|0)<0){break l}break n;case 93:h=k-512|0;b=G[h>>2];j=G[k>>2];if(!Cc(b,j)){wc(5493);break l}i=j;j=k-1024|0;b=Vb(0,1034,3,b,i,G[j>>2],0,0,0,0,0);if((b|0)<0){break l}l=M(G[h>>2],344);h=G[309722];i=G[k>>2];if(G[(l+h|0)+56>>2]>2]){xc(b,i)}h=G[j>>2];if(!Cc(h,b)){wc(13975);break l}j=G[309722];if(G[(j+M(b,344)|0)+56>>2]>=G[(j+M(h,344)|0)+56>>2]){break n}xc(b,h);break n;case 94:b=28605;h=k-512|0;if(H[h|0]!=73){break m}if(Xa(h,64632)){break m}b=Vb(0,1030,1,G[k-256>>2],0,0,0,0,0,0,0);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+52>>2]=258;break n;case 95:b=28605;h=k-512|0;if(H[h|0]!=73){break m}if(Xa(h,64632)){break m}b=Vb(0,1030,1,G[k-256>>2],0,0,0,0,0,0,0);if((b|0)<0){break l}G[(G[309722]+M(b,344)|0)+52>>2]=258;break n;case 96:b=28605;h=k-512|0;if(H[h|0]!=73){break m}if(Xa(h,64632)){break m}b=Vb(258,1030,1,G[k-256>>2],0,0,0,0,0,0,0);if((b|0)<0){break l}break n;case 97:b=28563;h=k-1024|0;if(H[h|0]!=68){break m}if(Xa(h,64640)){break m}b=22761;i=G[309722];h=G[k-768>>2];j=G[k-256>>2];if(G[(i+M(h,344)|0)+56>>2]>2]){break m}if(!Cc(h,j)){break m}b=Vb(0,1031,2,h,j,0,0,0,0,0,0);if((b|0)<0){break l}break n;case 98:b=G[309722];i=k-1280|0;h=G[i>>2];if(G[(b+M(h,344)|0)+52>>2]!=260){O=i,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}l=k-768|0;j=G[l>>2];if(G[(M(j,344)+b|0)+52>>2]!=260){j=Fb(260,0,j);G[l>>2]=j;b=G[309722]}m=k-256|0;h=G[m>>2];if(G[(b+M(h,344)|0)+52>>2]!=260){h=Fb(260,0,h);G[m>>2]=h;j=G[l>>2]}b=22663;n=G[i>>2];if(!Cc(n,j)){break m}if(!Cc(j,h)){break m}b=28300;p=k-1536|0;if(H[p|0]!=78){break m}if(Xa(p,64506)){break m}b=Vb(258,1026,3,n,j,h,0,0,0,0,0);if((b|0)<0){break l}j=G[309722];n=G[i>>2];h=G[(j+M(n,344)|0)+56>>2];if((h|0)>G[(M(b,344)+j|0)+56>>2]){xc(b,n);j=G[309722];h=G[(j+M(G[i>>2],344)|0)+56>>2]}r=h;i=G[l>>2];h=G[(M(i,344)+j|0)+56>>2];if((r|0)<(h|0)){xc(b,i);j=G[309722];h=G[(j+M(G[l>>2],344)|0)+56>>2]}i=h;h=G[m>>2];if((i|0)>=G[(M(h,344)+j|0)+56>>2]){break n}xc(b,h);break n;case 99:b=G[309722];l=k-2304|0;h=G[l>>2];if(G[(b+M(h,344)|0)+52>>2]!=260){O=l,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}m=k-1792|0;h=G[m>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=m,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}n=k-1280|0;h=G[n>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=n,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}p=k-768|0;h=G[p>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=p,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}t=k-256|0;i=G[t>>2];if(G[(b+M(i,344)|0)+52>>2]!=260){i=Fb(260,0,i);G[t>>2]=i}b=22870;r=G[l>>2];h=G[m>>2];if(!Cc(r,h)){break m}j=G[n>>2];if(!Cc(h,j)){break m}y=G[p>>2];if(!Cc(j,y)){break m}if(!Cc(y,i)){break m}b=28300;w=k-2560|0;if(H[w|0]!=67){break m}if(Xa(w,64696)){break m}h=Vb(258,1027,5,r,h,j,y,i,0,0,0);if((h|0)<0){break l}b=G[309722];i=G[l>>2];j=G[(b+M(i,344)|0)+56>>2];if((j|0)>G[(M(h,344)+b|0)+56>>2]){xc(h,i);b=G[309722];j=G[(b+M(G[l>>2],344)|0)+56>>2]}l=j;i=G[m>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[m>>2],344)|0)+56>>2]}l=j;i=G[n>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[n>>2],344)|0)+56>>2]}l=j;i=G[p>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[p>>2],344)|0)+56>>2]}i=b;b=G[t>>2];if(G[(i+M(b,344)|0)+56>>2]<=(j|0)){b=h;break n}xc(h,b);b=h;break n;case 100:b=G[309722];i=k-3328|0;h=G[i>>2];if(G[(b+M(h,344)|0)+52>>2]!=260){O=i,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}l=k-2816|0;h=G[l>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=l,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}m=k-2304|0;h=G[m>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=m,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}n=k-1792|0;h=G[n>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=n,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}p=k-1280|0;h=G[p>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=p,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}t=k-768|0;h=G[t>>2];if(G[(M(h,344)+b|0)+52>>2]!=260){O=t,P=Fb(260,0,h),G[O>>2]=P;b=G[309722]}y=k-256|0;j=G[y>>2];if(G[(b+M(j,344)|0)+52>>2]!=260){j=Fb(260,0,j);G[y>>2]=j}b=22812;N=G[i>>2];h=G[l>>2];if(!Cc(N,h)){break m}r=G[m>>2];if(!Cc(h,r)){break m}w=G[n>>2];if(!Cc(r,w)){break m}z=G[p>>2];if(!Cc(w,z)){break m}B=G[t>>2];if(!Cc(z,B)){break m}if(!Cc(B,j)){break m}b=28331;Cb:{Db:{Eb:{C=k-3584|0;switch(H[C|0]-66|0){case 3:break Db;case 0:break Eb;default:break m}}if(Xa(C,64426)){break m}b=1028;break Cb}if(Xa(C,64687)){break m}b=1029}h=Vb(258,b,7,N,h,r,w,z,B,j,0);if((h|0)<0){break l}b=G[309722];r=G[i>>2];j=G[(b+M(r,344)|0)+56>>2];if((j|0)>G[(M(h,344)+b|0)+56>>2]){xc(h,r);b=G[309722];j=G[(b+M(G[i>>2],344)|0)+56>>2]}r=j;i=G[l>>2];j=G[(M(i,344)+b|0)+56>>2];if((r|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[l>>2],344)|0)+56>>2]}l=j;i=G[m>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[m>>2],344)|0)+56>>2]}l=j;i=G[n>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[n>>2],344)|0)+56>>2]}l=j;i=G[p>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[p>>2],344)|0)+56>>2]}l=j;i=G[t>>2];j=G[(M(i,344)+b|0)+56>>2];if((l|0)<(j|0)){xc(h,i);b=G[309722];j=G[(b+M(G[t>>2],344)|0)+56>>2]}i=b;b=G[y>>2];if(G[(i+M(b,344)|0)+56>>2]<=(j|0)){b=h;break n}xc(h,b);b=h;break n;case 101:b=xg(1032,92041,-99,-99,49028,49036);if((b|0)<0){break l}break n;case 102:b=xg(1032,k-256|0,-99,-99,49028,49036);if((b|0)<0){break l}break n;case 103:b=xg(1032,k-768|0,G[k-256>>2],-99,49028,49036);if((b|0)<0){break l}break n;case 104:b=xg(1032,k-1792|0,G[k-1280>>2],-99,k-768|0,k-256|0);if((b|0)<0){break l}break n;case 105:b=xg(1047,k-1280|0,G[k-768>>2],G[k-256>>2],49028,49036);if((b|0)<0){break l}break n;case 106:b=xg(1047,k-2304|0,G[k-1792>>2],G[k-1280>>2],k-768|0,k-256|0);if((b|0)<0){break l}break n;case 107:b=Xj(k-256|0,-99,-99,92041);if((b|0)<0){break l}break n;case 108:b=Xj(k-1280|0,G[k-768>>2],G[k-256>>2],92041);if((b|0)<0){break l}break n;case 109:b=Xj(k-1792|0,G[k-1280>>2],G[k-768>>2],k-256|0);if((b|0)<0){break l}break n;case 110:b=Od(G[k-768>>2],1,G[k-256>>2],0,0,0,0);if((b|0)<0){break l}break n;case 111:b=Od(G[k-1280>>2],2,G[k-768>>2],G[k-256>>2],0,0,0);if((b|0)<0){break l}break n;case 112:b=Od(G[k-1792>>2],3,G[k-1280>>2],G[k-768>>2],G[k-256>>2],0,0);if((b|0)<0){break l}break n;case 113:b=Od(G[k-2304>>2],4,G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2],0);if((b|0)<0){break l}break n;case 114:b=Od(G[k-2816>>2],5,G[k-2304>>2],G[k-1792>>2],G[k-1280>>2],G[k-768>>2],G[k-256>>2]);if((b|0)<0){break l}break n;case 115:b=Fb(258,286,G[k>>2]);if((b|0)<0){break l}break n;case 116:b=G[k-256>>2];break n;case 117:b=Cd(261,k,Va(k)+1|0);if((b|0)<0){break l}O=G[309722]+M(b,344)|0,P=Va(k),G[O+56>>2]=P;break n;case 118:b=xf(G[k>>2]);if((b|0)<0){break l}break n;case 119:b=11244;h=G[k-256>>2];j=G[309722]+M(h,344)|0;if(G[j+52>>2]!=259|G[j>>2]!=-1e3){break m}b=oi(G[k-768>>2],h);if((b|0)>=0){break n}break l;case 120:b=Vb(261,1036,0,0,0,0,0,0,0,0,0);break n;case 121:b=G[k-256>>2];break n;case 122:b=6389;j=G[309722];h=G[k>>2];i=k-512|0;l=G[i>>2];if((G[(j+M(h,344)|0)+56>>2]+G[(j+M(l,344)|0)+56>>2]|0)>255){break m}b=bc(261,l,43,h);if((b|0)<0){break l}h=G[309722];G[(h+M(b,344)|0)+56>>2]=G[(h+M(G[k>>2],344)|0)+56>>2]+G[(h+M(G[i>>2],344)|0)+56>>2];break n;case 123:b=15790;h=G[309722];j=G[k-1024>>2];if(G[(h+M(j,344)|0)+56>>2]!=1){break m}i=G[k>>2];b=G[(h+M(i,344)|0)+56>>2];l=k-512|0;m=G[l>>2];h=G[(h+M(m,344)|0)+56>>2];b=Vb(0,1034,3,m,i,j,0,0,0,0,(b|0)>(h|0)?b:h);if((b|0)<0){break l}h=G[309722];j=G[k>>2];if(G[(h+M(G[l>>2],344)|0)+56>>2]>=G[(h+M(j,344)|0)+56>>2]){break n}xc(b,j);break n;case 124:b=28671;h=k-1024|0;if(H[h|0]!=68){break m}if(Xa(h,64640)){break m}h=G[309722];j=k-256|0;i=G[j>>2];b=G[(h+M(i,344)|0)+56>>2];l=k-768|0;m=G[l>>2];h=G[(h+M(m,344)|0)+56>>2];b=Vb(0,1031,2,m,i,0,0,0,0,0,(b|0)>(h|0)?b:h);if((b|0)<0){break l}h=G[309722];j=G[(h+M(G[j>>2],344)|0)+56>>2];if((j|0)<=G[(h+M(G[l>>2],344)|0)+56>>2]){break n}G[(h+M(b,344)|0)+56>>2]=j;break n;case 125:break sa;default:break n}}b=28522;h=k-1536|0;if(H[h|0]!=83){break m}if(Xa(h,64720)){break m}b=50785;h=G[309722];l=G[k-768>>2];j=h+M(l,344)|0;if(G[j+52>>2]!=259|G[j+56>>2]!=1){break m}j=G[k-256>>2];i=h+M(j,344)|0;if(G[i+52>>2]!=259|G[i+56>>2]!=1){break m}b=40257;h=G[(G[i>>2]==-1e3?(h+M(j,344)|0)+88|0:(h+M(G[k-1280>>2],344)|0)+56|0)>>2];if(h-256>>>0<4294967041){break m}b=Vb(0,1044,3,G[k-1280>>2],l,j,0,0,0,0,h);if((b|0)<0){break l}break n}Fb:{switch(D|0){case 0:G[309696]=G[309696]+1;if(!G[309737]){G[309737]=431}b=q+26064|0;bb(b,136908,80);E[q+26143|0]=0;Ua(b);break k;case 3:break Fb;default:break k}}b=G[309630];if((b|0)<=0){if(b){break k}s=1;break i}G[309630]=-2;break k}if(!G[309737]){G[309737]=431}b=q+26064|0;bb(b,136989,80);E[q+26143|0]=0;Ua(b);s=2;break i}if(!Xa(l,64444)){break r}}b=28613;i=0;if(j){break q}break m}b=Vb(0,1016,1,h,0,0,0,0,0,0,0);break o}if(Xa(l,64649)){break p}b=Vb(0,1019,1,h,0,0,0,0,0,0,0);break o}b=28613;if(!i){break m}if(Xa(l,64517)){break m}b=Vb(0,1043,1,h,0,0,0,0,0,0,0);G[(G[309722]+M(b,344)|0)+52>>2]=259}if((b|0)<0){break l}}h=k-(x<<8)|0;k=h+256|0;G[k>>2]=b;bb(h+260|0,q+4|0,252);s=s-(x<<1)|0;j=F[s>>1];h=E[o+135360|0]-56|0;b=j+F[(h<<1)+135504>>1]|0;if(!(b>>>0>1725|I[(b<<1)+127984>>1]!=(j&65535))){p=F[(b<<1)+131440>>1];break j}p=E[h+135522|0];break j}wc(b)}k=k-(x<<8)|0;s=s-(x<<1)|0;p=F[s>>1]}while(1){Gb:{b=F[(p<<1)+127056>>1];Hb:{if((b|0)==-40|(b|0)<-1){break Hb}b=b+1<<1;if(I[b+127984>>1]!=1){break Hb}b=F[b+131440>>1];if((b|0)>0){break Gb}}if((s|0)==(v|0)){s=1;break i}else{k=k-256|0;s=s-2|0;p=F[s>>1];continue}}break}p=b&65535;k=k+256|0;bb(k,1238528,256);D=3}s=s+2|0;continue}break}if((q+25856|0)==(v|0)){break g}}Wa(v)}Fa=q+26144|0;if(s){break b}h=G[309737];G[g>>2]=h;if(h){break a}if(!G[309723]){Ua(15026);break b}if(!G[309728]){G[309729]=1238960;G[309740]=a}o=G[309722];l=G[309725];i=o+M(l,344)|0;a=G[i+60>>2];G[e>>2]=a;G[d>>2]=G[i+56>>2];Ib:{if((a|0)<=0){break Ib}a=a-1|0;a=a>>>0<4?a:4;b=a+1|0;v=b&3;j=0;h=0;if(a>>>0>=3){x=b&-4;a=(o+M(l,344)|0)- -64|0;e=0;while(1){b=h<<2;G[b+f>>2]=G[a+b>>2];k=b|4;G[k+f>>2]=G[a+k>>2];k=b|8;G[k+f>>2]=G[a+k>>2];b=b|12;G[b+f>>2]=G[a+b>>2];h=h+4|0;e=e+4|0;if((x|0)!=(e|0)){continue}break}}if(!v){break Ib}a=o+M(l,344)|0;while(1){b=h<<2;G[b+f>>2]=G[(a+b|0)- -64>>2];h=h+1|0;j=j+1|0;if((v|0)!=(j|0)){continue}break}}Jb:{Kb:{switch(G[i+52>>2]-258|0){case 0:G[c>>2]=14;a=14;break Jb;case 1:G[c>>2]=41;a=41;break Jb;case 2:G[c>>2]=82;a=82;break Jb;case 4:G[c>>2]=1;a=1;break Jb;case 3:G[c>>2]=16;a=16;break Jb;default:break Kb}}G[c>>2]=0;Ua(21131);G[309737]=432;G[g>>2]=432;a=G[c>>2]}G[309735]=a;a=G[309719];Lb:{if(a){Wa(a);break Lb}G[u+4>>2]=940;G[u>>2]=30721;kb(74408,u)}if(G[i>>2]!=-1e3){break c}G[d>>2]=0-G[d>>2]}h=G[g>>2];break a}h=431;G[g>>2]=431}Fa=u+80|0;return h}function ei(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;var 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,P=0,R=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Za=0,_a=0,$a=0,ab=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,kb=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,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=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,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=N(0),hc=0,ic=0,jc=0;r=Fa-1280|0;Fa=r;G[r+1272>>2]=0;G[r+1176>>2]=0;G[r+1180>>2]=1072693248;G[r+1168>>2]=0;G[r+1172>>2]=0;G[r+40>>2]=G[36314];l=G[36313];G[r+32>>2]=G[36312];G[r+36>>2]=l;G[r+24>>2]=0;G[r+28>>2]=0;G[r+16>>2]=0;G[r+20>>2]=0;B=G[47542];if(di(g,19692,32736,r+48|0)){B=nc(r+48|0,0,10)}G[r+1256>>2]=0;G[r+1260>>2]=0;G[r+1248>>2]=0;G[r+1252>>2]=0;G[r+1232>>2]=1;G[r+1236>>2]=1;G[r+1216>>2]=1;G[r+1220>>2]=1;G[r+1184>>2]=1;G[r+1188>>2]=1;G[r+1240>>2]=1;G[r+1244>>2]=1;G[r+1224>>2]=1;G[r+1228>>2]=1;G[r+1192>>2]=1;G[r+1196>>2]=1;Qd(a,r+1276|0,k);g=G[r+1276>>2];de(a,(g|0)<4?g:4,r+1248|0,k);Eg(a,j,k);a:{if(G[r+1276>>2]<=1){G[k>>2]=320;g=0;break a}Z=1;b:{if(d==0){break b}Z=d;if(!(d<0)){break b}Z=1/O(d)}g=0;Ha=1;if(!(!f|!H[f|0])){c:{if(!Xa(f,16840)){l=le(16836);break c}d:{if(!jb(f,58)){if(!jb(f,44)){break d}}l=le(f);break c}G[r>>2]=f;f=r+48|0;Ya(f,1024,8751,r);l=le(f)}f=pc(l,48944);if(f){while(1){e:{f:{if(!Xa(f,49138)){if((u|0)<=1){break f}u=2;break e}if(!Xa(f,16840)){f=g<<2;G[f+(r+16|0)>>2]=0-G[f+(r+1248|0)>>2];q=g;break e}o=g<<2;f=_b(f);G[o+(r+16|0)>>2]=f;if((f|0)<=G[o+(r+1248|0)>>2]&(f|0)>0){break e}G[k>>2]=116;g=0;break a}G[(r+32|0)+(u<<2)>>2]=g;u=u+1|0}f=pc(0,48944);if(f){o=g>>>0<3;g=g+1|0;if(o){continue}}break}g=G[r+32>>2];Ha=G[r+36>>2]}else{Ha=1}Wa(l)}l=G[(r+1248|0)+(g<<2)>>2];g:{if(Z>=1){d=+(l|0)/Z;h:{if(O(d)<2147483648){f=~~d;break h}f=-2147483648}d=Z*+(f|0);i:{if(O(d)<2147483648){f=~~d;break i}f=-2147483648}u=G[(r+1248|0)+(Ha<<2)>>2];d=+(u|0)/Z;j:{if(O(d)<2147483648){o=~~d;break j}o=-2147483648}d=Z*+(o|0);if(O(d)<2147483648){t=~~d;break g}t=-2147483648;break g}f=l;u=G[(r+1248|0)+(Ha<<2)>>2];t=u}k:{l:{if(!b){break l}o=G[b>>2];if(!o){break l}b=G[b+4>>2];if(!b){break l}o=(f|0)>(o|0)?o:f;m:{n:{if(!c){break n}d=L[c>>3];if(d==0){break n}Mb=L[c+8>>3];if(Mb!=0){break m}}Mb=+(t|0)*.5;d=+(f|0)*.5}c=(b|0)<(t|0)?b:t;y=g<<2;w=y+(r+1232|0)|0;Ob=+(o|0)*.5;fc=d-Ob+1;o:{if(O(fc)<2147483648){b=~~fc;break o}b=-2147483648}G[w>>2]=b;o=(o&-2147483647)==1;y=y+(r+1216|0)|0;d=Ob+d;p:{if(O(d)<2147483648){b=~~d;break p}b=-2147483648}G[y>>2]=b+o;o=Ha<<2;y=o+(r+1232|0)|0;d=+(c|0)*.5;Ob=Mb-d+1;q:{if(O(Ob)<2147483648){b=~~Ob;break q}b=-2147483648}G[y>>2]=b;o=o+(r+1216|0)|0;d=d+Mb;r:{if(O(d)<2147483648){b=~~d;break r}b=-2147483648}G[o>>2]=b;if((c&-2147483647)!=1){break k}G[o>>2]=b+1;break k}b=g<<2;c=r+1232|0;G[b+c>>2]=1;G[b+(r+1216|0)>>2]=f;b=Ha<<2;G[b+c>>2]=1;G[b+(r+1216|0)>>2]=t}g=g<<2;y=r+1216|0;b=g+y|0;c=G[b>>2];c=(c|0)>1?c:1;G[b>>2]=(c|0)<(l|0)?c:l;w=r+1232|0;o=w+g|0;c=G[o>>2];c=(c|0)>1?c:1;G[o>>2]=(c|0)<(l|0)?c:l;l=Ha<<2;c=l+y|0;g=G[c>>2];g=(g|0)>1?g:1;g=(g|0)<(u|0)?g:u;G[c>>2]=g;y=l+w|0;l=G[y>>2];l=(l|0)>1?l:1;l=(l|0)<(u|0)?l:u;G[y>>2]=l;s:{if(Yc(Z,1)==0){if(!(Z>0)){break s}g=G[b>>2];gc=N(Z);w=G[o>>2];u=0;while(1){t:{_=g-w|0;f=_+1|0;if((_|0)<0){break t}if(Yc(+N(N(f|0)/gc),1)==0){break t}g=g-1|0;u=u+1|0;if(+(u|0)>2]=g;if(!(Z>0)){break s}g=G[c>>2];u=0;while(1){u:{w=g-l|0;t=w+1|0;if((w|0)<0){break u}if(Yc(+N(N(t|0)/gc),1)==0){break u}g=g-1|0;u=u+1|0;if(+(u|0)>2]=g;break s}t=(g-l|0)+1|0;f=(G[b>>2]-G[o>>2]|0)+1|0}W=1;u=G[r+1276>>2];v:{if((u|0)<=0){break v}l=G[r+16>>2];if(l){w=(l|0)<0;_=w?1:l;g=G[r+1248>>2];G[r+1232>>2]=(g|0)>(_|0)?_:g;l=w?g:l;l=(l|0)>1?l:1;G[r+1216>>2]=(g|0)>(l|0)?l:g;W=w?g:1}u=(u|0)<4?u:4;if((u|0)==1){break v}l=G[r+20>>2];if(l){w=(l|0)<0;_=w?1:l;g=G[r+1252>>2];G[r+1236>>2]=(g|0)>(_|0)?_:g;l=w?g:l;l=(l|0)>1?l:1;G[r+1220>>2]=(g|0)>(l|0)?l:g;W=w?g:W}if((u|0)==2){break v}l=G[r+24>>2];if(l){w=(l|0)<0;_=w?1:l;g=G[r+1256>>2];G[r+1240>>2]=(g|0)>(_|0)?_:g;l=w?g:l;l=(l|0)>1?l:1;G[r+1224>>2]=(g|0)>(l|0)?l:g;W=w?g:W}if((u|0)==3){break v}l=G[r+28>>2];if(!l){break v}u=(l|0)<0;w=u?1:l;g=G[r+1260>>2];G[r+1244>>2]=(g|0)>(w|0)?w:g;l=u?g:l;l=(l|0)>1?l:1;G[r+1228>>2]=(g|0)>(l|0)?l:g;W=u?g:W}w:{x:{y:{if(h){G[h>>2]=G[o>>2];G[h+4>>2]=G[y>>2];if(!q){break y}G[h+8>>2]=G[(r+1232|0)+(q<<2)>>2]}if(!i){break w}G[i>>2]=G[b>>2];G[i+4>>2]=G[c>>2];if(!q){break w}c=(r+1216|0)+(q<<2)|0;b=2;break x}if(!i){break w}G[i>>2]=G[b>>2];b=1}G[(b<<2)+i>>2]=G[c>>2]}Ja=M(f,t);_a=M(Ja,W);if((_a|0)<=1){G[k>>2]=323;g=0;break a}Cb(a,82,35661,r+1176|0,r+1072|0,r+1272|0);if(G[r+1272>>2]!=204){Cb(a,82,34377,r+1168|0,r+1072|0,r+1272|0)}d=L[r+1168>>3];Mb=L[r+1176>>3];h=0;Lb=0;z:{if(Z==1){break z}Lb=1;if(!(!e|(e|0)==115)){break z}h=1;Lb=0}u=42;g=0;b=d!=0|Mb!=1;hc=G[j>>2];e=hc;if((e|0)==64){G[j>>2]=-64;e=-64}A:{B:{C:{D:{E:{F:{G:{H:{I:{Ka=Eu(e- -64|0,29);switch(Ka|0){case 4:break A;case 0:break D;case 16:break E;case 12:break F;case 6:break G;case 10:break H;case 9:break I;default:break a}}if(b){break B}if(h){break C}if(Lb){break B}Ka=1;u=11;break A}if(b){break B}if(h){break C}if(Lb){break B}Ka=2;u=21;break A}if(b){break B}if(h){break C}if(Lb){break B}Ka=2;u=20;break A}if(b){break B}Ka=4;if(!Lb){u=31;break A}e=-32;G[j>>2]=-32;break A}if(b|Lb){break B}Ka=8;u=81;break A}Ka=8;u=82;break A}e=32;G[j>>2]=32;Ka=4;u=31;break A}e=-32;G[j>>2]=-32;Ka=4}J:{if(Z==1){Pb=M(Ka,_a);if(!(!B|(Pb|0)<=(B|0))){G[k>>2]=113;break a}U=lb(Pb,1);if(!U){G[k>>2]=113;break a}Ha=0;l=r+1232|0;o=r+1216|0;q=r+1184|0;c=0;i=0;V=Fa-848|0;Fa=V;K:{if(G[k>>2]>0){break K}Qd(a,V+40|0,k);de(a,9,V,k);L:{M:{if(Nb(a,k)){break M}e=1;N:{O:{f=G[V+40>>2];if((f|0)<=0){break O}while(1){b=i<<2;if(G[b+q>>2]!=1|G[b+l>>2]!=1){break O}h=G[b+V>>2];b=G[b+o>>2];if((h|0)!=(b|0)){break O}e=Au(e,g,b,b>>31);g=Ia;i=i+1|0;if((f|0)!=(i|0)){continue}break}break N}if((f|0)!=(i|0)){break M}}if(!(e|g)|G[k>>2]>0){break K}Qd(a,V+44|0,k);b=G[V+44>>2];P:{if((b|0)<=0){break P}i=0;if(b-1>>>0>=3){o=b&-4;f=0;while(1){h=V+48|0;q=h+(c<<3)|0;t=G[l+(c<<2)>>2];G[q>>2]=t;G[q+4>>2]=t>>31;q=c|1;t=h+(q<<3)|0;q=G[l+(q<<2)>>2];G[t>>2]=q;G[t+4>>2]=q>>31;q=c|2;t=h+(q<<3)|0;q=G[l+(q<<2)>>2];G[t>>2]=q;G[t+4>>2]=q>>31;q=c|3;h=h+(q<<3)|0;q=G[l+(q<<2)>>2];G[h>>2]=q;G[h+4>>2]=q>>31;c=c+4|0;f=f+4|0;if((o|0)!=(f|0)){continue}break}}b=b&3;if(!b){break P}while(1){f=(V+48|0)+(c<<3)|0;h=G[l+(c<<2)>>2];G[f>>2]=h;G[f+4>>2]=h>>31;c=c+1|0;i=i+1|0;if((b|0)!=(i|0)){continue}break}}Bo(a,u,V+48|0,e,g,0,U,0,k);break L}Q:{switch(u-11|0){case 0:rp(a,G[V+40>>2],V,l,o,q,U,0,k);break L;case 1:la=a;a=0;qa=1;m=Fa-400|0;Fa=m;t=G[V+40>>2];R:{if(t-10>>>0<=4294967286){G[m>>2]=t;a=m+32|0;Ya(a,81,24134,m);Ua(a);G[k>>2]=320;break R}if(Nb(la,k)){if((t|0)!=1){b=t&-2;while(1){c=D<<3;e=m+32|0;f=c+e|0;g=D<<2;h=G[g+l>>2];G[f>>2]=h;G[f+4>>2]=h>>31;f=c;c=m+128|0;f=f+c|0;g=G[g+o>>2];G[f>>2]=g;G[f+4>>2]=g>>31;g=e;e=D|1;f=e<<3;g=g+f|0;e=e<<2;h=G[e+l>>2];G[g>>2]=h;G[g+4>>2]=h>>31;c=c+f|0;e=G[e+o>>2];G[c>>2]=e;G[c+4>>2]=e>>31;D=D+2|0;a=a+2|0;if((b|0)!=(a|0)){continue}break}}if(t&1){a=D<<3;b=a+(m+32|0)|0;c=D<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(m+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}E[m+352|0]=0;md(la,12,m+32|0,m+128|0,q,1,m+352|0,U,0,0,k);break R}if((Dc(la,m+124|0,k)|0)>0){break R}y=G[m+124>>2];S:{if(!y){b=1;qa=2;A=1;c=1;break S}e=t<<2;b=G[e+q>>2];A=G[e+l>>2];c=G[e+o>>2]}G[m+352>>2]=1;G[m+356>>2]=1;e=1;g=0;G[m+128>>2]=1;G[m+132>>2]=0;G[m+304>>2]=1;G[m+308>>2]=1;G[m+256>>2]=1;G[m+260>>2]=1;G[m+136>>2]=1;G[m+140>>2]=0;G[m+208>>2]=1;G[m+212>>2]=1;G[m+360>>2]=1;G[m+144>>2]=1;G[m+148>>2]=0;G[m+312>>2]=1;G[m+316>>2]=1;G[m+264>>2]=1;G[m+268>>2]=1;G[m+152>>2]=1;G[m+156>>2]=0;G[m+216>>2]=1;G[m+220>>2]=1;G[m+364>>2]=1;G[m+368>>2]=1;G[m+320>>2]=1;G[m+272>>2]=1;G[m+160>>2]=1;G[m+164>>2]=0;G[m+224>>2]=1;G[m+372>>2]=1;G[m+376>>2]=1;G[m+168>>2]=1;G[m+172>>2]=0;G[m+324>>2]=1;G[m+328>>2]=1;G[m+276>>2]=1;G[m+280>>2]=1;G[m+176>>2]=1;G[m+180>>2]=0;G[m+228>>2]=1;G[m+232>>2]=1;G[m+184>>2]=1;G[m+188>>2]=0;G[m+380>>2]=1;G[m+384>>2]=1;G[m+332>>2]=1;G[m+336>>2]=1;G[m+284>>2]=1;G[m+288>>2]=1;G[m+192>>2]=1;G[m+196>>2]=0;G[m+236>>2]=1;G[m+240>>2]=1;T:{while(1){h=a<<2;f=G[h+o>>2];i=G[h+l>>2];U:{if((f|0)>=(i|0)){u=G[h+(m+208|0)>>2];break U}if(y){break T}G[h+(m+208|0)>>2]=-1;u=-1}G[h+(m+304|0)>>2]=f;G[h+(m+352|0)>>2]=i;G[h+(m+256|0)>>2]=G[h+q>>2];B=m+128|0;f=a+1|0;i=B+(f<<3)|0;h=G[h+V>>2];h=Au(e,g,h,h>>31);G[i>>2]=h;w=i;i=Ia;G[w+4>>2]=i;a=B+(a<<3)|0;ic=a,jc=Au(e,g,u,u>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;e=h;g=i;a=f;if((t|0)!=(f|0)){continue}break}a=(m+128|0)+(t<<3)|0;e=G[a>>2];f=e;e=G[(m+208|0)+(t<<2)>>2];ic=a,jc=Au(f,G[a+4>>2],e,e>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;V:{if(!((t|0)!=1|G[V>>2]!=1)){D=(c-A|0)/(b|0)|0;c=A;a=b;break V}e=G[m+208>>2];a=M(e,G[m+256>>2]);D=(M(e,G[m+304>>2]-G[m+352>>2]|0)|0)/G[q>>2]|0}if((c|0)<(A|0)){break R}ba=G[m+240>>2];ia=M(ba,G[m+384>>2]);e=M(ba,G[m+336>>2]);if((ia|0)>(e|0)){break R}ca=G[m+236>>2];ja=M(ca,G[m+380>>2]);f=M(ca,G[m+332>>2]);if((ja|0)>(f|0)){break R}x=G[m+232>>2];R=M(x,G[m+376>>2]);g=M(x,G[m+328>>2]);if((R|0)>(g|0)){break R}P=G[m+228>>2];X=M(P,G[m+372>>2]);h=M(P,G[m+324>>2]);if((X|0)>(h|0)){break R}W=G[m+224>>2];s=M(W,G[m+368>>2]);i=M(W,G[m+320>>2]);if((s|0)>(i|0)){break R}$=G[m+220>>2];ka=M($,G[m+364>>2]);l=M($,G[m+316>>2]);if((ka|0)>(l|0)){break R}da=G[m+216>>2];ma=M(da,G[m+360>>2]);o=M(da,G[m+312>>2]);if((ma|0)>(o|0)){break R}ea=G[m+212>>2];oa=M(ea,G[m+356>>2]);q=M(ea,G[m+308>>2]);if((oa|0)>(q|0)){break R}ra=D+1|0;hb=ra>>31;ib=G[m+192>>2];kb=G[m+196>>2];mb=G[m+184>>2];nb=G[m+188>>2];ob=G[m+176>>2];pb=G[m+180>>2];qb=G[m+168>>2];rb=G[m+172>>2];sb=G[m+160>>2];tb=G[m+164>>2];ub=G[m+152>>2];vb=G[m+156>>2];wb=G[m+144>>2];xb=G[m+148>>2];yb=G[m+136>>2];zb=G[m+140>>2];t=G[m+352>>2];sa=t;Ab=t>>31;La=c;ta=c>>31;pa=b;Bb=b>>31;ga=A>>31;Ma=e;z=e>>31;Db=ba>>31;ha=ia>>31;Ja=f;Y=f>>31;Eb=ca>>31;$a=ja>>31;ab=g;Na=g>>31;Fb=x>>31;fa=R>>31;na=h;Oa=h>>31;Gb=P>>31;Hb=X>>31;Pa=i;Qa=i>>31;Ib=W>>31;cb=s>>31;db=l;Ra=l>>31;Jb=$>>31;Sa=ka>>31;eb=o;Ta=o>>31;Kb=da>>31;fb=ma>>31;Va=q;Za=q>>31;Qb=ea>>31;gb=oa>>31;b=G[m+288>>2];ua=b;Rb=b>>31;b=G[m+284>>2];va=b;Sb=b>>31;b=G[m+280>>2];wa=b;Tb=b>>31;b=G[m+276>>2];xa=b;Ub=b>>31;b=G[m+272>>2];ya=b;Vb=b>>31;b=G[m+268>>2];za=b;Wb=b>>31;b=G[m+264>>2];Aa=b;Xb=b>>31;b=G[m+260>>2];n=b;Yb=b>>31;D=0;while(1){b=ia;c=ha;while(1){p=Au(ib,kb,b-ba|0,c-((b>>>0>>0)+Db|0)|0);Zb=Ia;f=ja;h=$a;while(1){C=Au(mb,nb,f-ca|0,h-((f>>>0>>0)+Eb|0)|0);$b=Ia;i=R;o=fa;while(1){Ba=Au(ob,pb,i-x|0,o-((i>>>0>>0)+Fb|0)|0);ac=Ia;q=X;t=Hb;while(1){Ca=Au(qb,rb,q-P|0,t-((q>>>0

>>0)+Gb|0)|0);bc=Ia;u=s;y=cb;while(1){Da=Au(sb,tb,u-W|0,y-((u>>>0>>0)+Ib|0)|0);cc=Ia;B=ka;aa=Sa;while(1){Ea=Au(ub,vb,B-$|0,aa-((B>>>0<$>>>0)+Jb|0)|0);dc=Ia;w=ma;_=fb;while(1){Ga=Au(wb,xb,w-da|0,_-((w>>>0>>0)+Kb|0)|0);ec=Ia;e=oa;g=gb;while(1){v=Au(yb,zb,e-ea|0,g-((e>>>0>>0)+Qb|0)|0)+sa|0;l=Ab+Ia|0;l=v>>>0>>0?l+1|0:l;v=v+Ga|0;l=l+ec|0;l=v>>>0>>0?l+1|0:l;v=v+Ea|0;l=l+dc|0;l=v>>>0>>0?l+1|0:l;v=v+Da|0;l=l+cc|0;l=v>>>0>>0?l+1|0:l;v=v+Ca|0;l=l+bc|0;l=v>>>0>>0?l+1|0:l;v=v+Ba|0;l=l+ac|0;l=v>>>0>>0?l+1|0:l;v=v+C|0;l=l+$b|0;l=v>>>0>>0?l+1|0:l;v=p+v|0;l=l+Zb|0;if((Ef(la,qa,A,ga,v,p>>>0>v>>>0?l+1|0:l,ra,hb,a,1,0,D+U|0,m+123|0,m+32|0,k)|0)>0){break R}D=D+ra|0;l=g+Yb|0;e=e+n|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=Va>>>0&(Za|0)>=(l|0)|(l|0)<(Za|0)){continue}break}l=_+Xb|0;e=w+Aa|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=eb>>>0&(Ta|0)>=(l|0)|(l|0)<(Ta|0)){continue}break}l=aa+Wb|0;e=B+za|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=db>>>0&(Ra|0)>=(l|0)|(l|0)<(Ra|0)){continue}break}l=y+Vb|0;e=u+ya|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=Pa>>>0&(Qa|0)>=(l|0)|(l|0)<(Qa|0)){continue}break}l=t+Ub|0;e=q+xa|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=na>>>0&(Oa|0)>=(l|0)|(l|0)<(Oa|0)){continue}break}l=o+Tb|0;e=i+wa|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=ab>>>0&(Na|0)>=(l|0)|(l|0)<(Na|0)){continue}break}l=h+Sb|0;e=f+va|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=Ja>>>0&(Y|0)>=(l|0)|(l|0)<(Y|0)){continue}break}l=c+Rb|0;b=b+ua|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=Ma>>>0&(z|0)>=(l|0)|(l|0)<(z|0)){continue}break}l=ga+Bb|0;b=A+pa|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=La>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}break R}G[m+16>>2]=a+1;a=m+32|0;Ya(a,81,27284,m+16|0);Ua(a);G[k>>2]=321}Fa=m+400|0;break L;case 9:X=a;Ba=1;n=Fa-352|0;Fa=n;f=G[V+40>>2];W:{if(f-10>>>0<=4294967286){G[n>>2]=f;a=n+32|0;Ya(a,81,23953,n);Ua(a);G[k>>2]=320;break W}X:{if(Nb(X,k)){if((f|0)!=1){a=f&-2;while(1){b=C<<3;e=n+32|0;g=b+e|0;h=C<<2;i=G[h+l>>2];G[g>>2]=i;G[g+4>>2]=i>>31;g=b;b=n+128|0;g=g+b|0;h=G[h+o>>2];G[g>>2]=h;G[g+4>>2]=h>>31;h=e;e=C|1;g=e<<3;h=h+g|0;e=e<<2;i=G[e+l>>2];G[h>>2]=i;G[h+4>>2]=i>>31;b=b+g|0;e=G[e+o>>2];G[b>>2]=e;G[b+4>>2]=e>>31;C=C+2|0;c=c+2|0;if((a|0)!=(c|0)){continue}break}}if(f&1){a=C<<3;b=a+(n+32|0)|0;c=C<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(n+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}F[n+304>>1]=0;md(X,20,n+32|0,n+128|0,q,1,n+304|0,U,0,0,k);break X}if((Dc(X,n+124|0,k)|0)>0){break X}Y:{if(!G[n+124>>2]){b=1;Ba=2;A=1;a=1;break Y}e=f<<2;b=G[e+q>>2];A=G[e+l>>2];a=G[e+o>>2]}G[n+256>>2]=1;G[n+304>>2]=1;G[n+308>>2]=1;G[n+208>>2]=1;e=1;g=0;G[n+128>>2]=1;G[n+132>>2]=0;G[n+136>>2]=1;G[n+140>>2]=0;G[n+312>>2]=1;G[n+260>>2]=1;G[n+264>>2]=1;G[n+212>>2]=1;G[n+216>>2]=1;G[n+144>>2]=1;G[n+148>>2]=0;G[n+152>>2]=1;G[n+156>>2]=0;G[n+316>>2]=1;G[n+320>>2]=1;G[n+268>>2]=1;G[n+272>>2]=1;G[n+220>>2]=1;G[n+224>>2]=1;G[n+160>>2]=1;G[n+164>>2]=0;G[n+324>>2]=1;G[n+276>>2]=1;G[n+228>>2]=1;G[n+168>>2]=1;G[n+172>>2]=0;G[n+280>>2]=1;G[n+328>>2]=1;G[n+332>>2]=1;G[n+232>>2]=1;G[n+176>>2]=1;G[n+180>>2]=0;G[n+184>>2]=1;G[n+188>>2]=0;G[n+336>>2]=1;G[n+284>>2]=1;G[n+288>>2]=1;G[n+236>>2]=1;G[n+240>>2]=1;G[n+192>>2]=1;G[n+196>>2]=0;while(1){h=c<<2;i=G[h+o>>2];t=G[h+l>>2];if((i|0)<(t|0)){G[n+16>>2]=c+1;a=n+32|0;Ya(a,81,27103,n+16|0);Ua(a);G[k>>2]=321;break W}G[h+(n+256|0)>>2]=i;G[h+(n+304|0)>>2]=t;G[h+(n+208|0)>>2]=G[h+q>>2];i=e;e=G[h+V>>2];e=Au(i,g,e,e>>31);c=c+1|0;h=(n+128|0)+(c<<3)|0;G[h>>2]=e;g=Ia;G[h+4>>2]=g;if((c|0)!=(f|0)){continue}break}Z:{if(!((f|0)!=1|G[V>>2]!=1)){C=(a-A|0)/(b|0)|0;a=A;c=b;break Z}C=(G[n+256>>2]-G[n+304>>2]|0)/G[q>>2]|0;c=G[n+208>>2]}if((a|0)<(A|0)){break X}pa=G[n+336>>2];e=G[n+288>>2];if((pa|0)>(e|0)){break X}ba=G[n+332>>2];f=G[n+284>>2];if((ba|0)>(f|0)){break X}ia=G[n+328>>2];g=G[n+280>>2];if((ia|0)>(g|0)){break X}ca=G[n+324>>2];h=G[n+276>>2];if((ca|0)>(h|0)){break X}ja=G[n+320>>2];i=G[n+272>>2];if((ja|0)>(i|0)){break X}x=G[n+316>>2];l=G[n+268>>2];if((x|0)>(l|0)){break X}R=G[n+312>>2];o=G[n+264>>2];if((R|0)>(o|0)){break X}P=G[n+308>>2];q=G[n+260>>2];if((P|0)>(q|0)){break X}W=c;Y=C+1|0;Na=Y>>31;Oa=G[n+192>>2];Qa=G[n+196>>2];Ra=G[n+184>>2];Ta=G[n+188>>2];Za=G[n+176>>2];v=G[n+180>>2];ra=G[n+168>>2];hb=G[n+172>>2];ib=G[n+160>>2];kb=G[n+164>>2];mb=G[n+152>>2];nb=G[n+156>>2];ob=G[n+144>>2];pb=G[n+148>>2];qb=G[n+136>>2];rb=G[n+140>>2];c=G[n+304>>2];s=c;sb=c>>31;$=a;p=a>>31;a=b;tb=b>>31;ga=A>>31;ka=e;Ca=e>>31;da=pa>>31;ma=f;Da=f>>31;ea=ba>>31;oa=g;Ea=g>>31;la=ia>>31;sa=h;Ga=h>>31;La=ca>>31;Ma=i;m=i>>31;ha=ja>>31;Ja=l;D=l>>31;$a=x>>31;ab=o;qa=o>>31;fa=R>>31;na=q;ta=q>>31;Hb=P>>31;b=G[n+240>>2];Pa=b;ub=b>>31;b=G[n+236>>2];cb=b;vb=b>>31;b=G[n+232>>2];db=b;wb=b>>31;b=G[n+228>>2];Sa=b;xb=b>>31;b=G[n+224>>2];eb=b;yb=b>>31;b=G[n+220>>2];fb=b;zb=b>>31;b=G[n+216>>2];Va=b;Ab=b>>31;b=G[n+212>>2];gb=b;Bb=b>>31;C=0;while(1){b=pa;c=da;while(1){ua=Au(Oa,Qa,b-1|0,c-!b|0);Db=Ia;f=ba;h=ea;while(1){va=Au(Ra,Ta,f-1|0,h-!f|0);Eb=Ia;i=ia;o=la;while(1){wa=Au(Za,v,i-1|0,o-!i|0);Fb=Ia;q=ca;t=La;while(1){xa=Au(ra,hb,q-1|0,t-!q|0);Gb=Ia;u=ja;y=ha;while(1){ya=Au(ib,kb,u-1|0,y-!u|0);Ib=Ia;B=x;aa=$a;while(1){za=Au(mb,nb,B-1|0,aa-!B|0);Jb=Ia;w=R;_=fa;while(1){Aa=Au(ob,pb,w-1|0,_-!w|0);Kb=Ia;e=P;g=Hb;while(1){z=Au(qb,rb,e-1|0,g-!e|0)+s|0;l=sb+Ia|0;l=s>>>0>z>>>0?l+1|0:l;z=z+Aa|0;l=l+Kb|0;l=z>>>0>>0?l+1|0:l;z=z+za|0;l=l+Jb|0;l=z>>>0>>0?l+1|0:l;z=z+ya|0;l=l+Ib|0;l=z>>>0>>0?l+1|0:l;z=z+xa|0;l=l+Gb|0;l=z>>>0>>0?l+1|0:l;z=z+wa|0;l=l+Fb|0;l=z>>>0>>0?l+1|0:l;z=z+va|0;l=l+Eb|0;l=z>>>0>>0?l+1|0:l;z=z+ua|0;l=l+Db|0;if((Gf(X,Ba,A,ga,z,z>>>0>>0?l+1|0:l,Y,Na,W,1,0,(C<<1)+U|0,n+123|0,n+32|0,k)|0)>0){break X}C=C+Y|0;l=g+Bb|0;e=e+gb|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=na>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}l=_+Ab|0;e=w+Va|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=ab>>>0&(qa|0)>=(l|0)|(l|0)<(qa|0)){continue}break}l=aa+zb|0;e=B+fb|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=Ja>>>0&(D|0)>=(l|0)|(l|0)<(D|0)){continue}break}l=y+yb|0;e=u+eb|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=Ma>>>0&(m|0)>=(l|0)|(l|0)<(m|0)){continue}break}l=t+xb|0;e=q+Sa|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=sa>>>0&(Ga|0)>=(l|0)|(l|0)<(Ga|0)){continue}break}l=o+wb|0;e=i+db|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=oa>>>0&(Ea|0)>=(l|0)|(l|0)<(Ea|0)){continue}break}l=h+vb|0;e=f+cb|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=ma>>>0&(Da|0)>=(l|0)|(l|0)<(Da|0)){continue}break}l=c+ub|0;b=b+Pa|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=ka>>>0&(Ca|0)>=(l|0)|(l|0)<(Ca|0)){continue}break}l=ga+tb|0;b=a+A|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=$>>>0&(p|0)>=(l|0)|(l|0)<(p|0)){continue}break}}}Fa=n+352|0;break L;case 10:Mp(a,G[V+40>>2],V,l,o,q,U,0,k);break L;case 19:W=a;Ba=1;p=Fa-352|0;Fa=p;f=G[V+40>>2];_:{if(f-10>>>0<=4294967286){G[p>>2]=f;a=p+32|0;Ya(a,81,23771,p);Ua(a);G[k>>2]=320;break _}$:{if(Nb(W,k)){if((f|0)!=1){a=f&-2;while(1){b=C<<3;e=p+32|0;g=b+e|0;h=C<<2;i=G[h+l>>2];G[g>>2]=i;G[g+4>>2]=i>>31;g=b;b=p+128|0;g=g+b|0;h=G[h+o>>2];G[g>>2]=h;G[g+4>>2]=h>>31;h=e;e=C|1;g=e<<3;h=h+g|0;e=e<<2;i=G[e+l>>2];G[h>>2]=i;G[h+4>>2]=i>>31;b=b+g|0;e=G[e+o>>2];G[b>>2]=e;G[b+4>>2]=e>>31;C=C+2|0;c=c+2|0;if((a|0)!=(c|0)){continue}break}}if(f&1){a=C<<3;b=a+(p+32|0)|0;c=C<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(p+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}G[p+304>>2]=0;md(W,30,p+32|0,p+128|0,q,1,p+304|0,U,0,0,k);break $}if((Dc(W,p+124|0,k)|0)>0){break $}aa:{if(!G[p+124>>2]){b=1;Ba=2;A=1;a=1;break aa}e=f<<2;b=G[e+q>>2];A=G[e+l>>2];a=G[e+o>>2]}G[p+256>>2]=1;G[p+304>>2]=1;G[p+308>>2]=1;G[p+208>>2]=1;e=1;g=0;G[p+128>>2]=1;G[p+132>>2]=0;G[p+136>>2]=1;G[p+140>>2]=0;G[p+312>>2]=1;G[p+260>>2]=1;G[p+264>>2]=1;G[p+212>>2]=1;G[p+216>>2]=1;G[p+144>>2]=1;G[p+148>>2]=0;G[p+152>>2]=1;G[p+156>>2]=0;G[p+316>>2]=1;G[p+320>>2]=1;G[p+268>>2]=1;G[p+272>>2]=1;G[p+220>>2]=1;G[p+224>>2]=1;G[p+160>>2]=1;G[p+164>>2]=0;G[p+324>>2]=1;G[p+276>>2]=1;G[p+228>>2]=1;G[p+168>>2]=1;G[p+172>>2]=0;G[p+280>>2]=1;G[p+328>>2]=1;G[p+332>>2]=1;G[p+232>>2]=1;G[p+176>>2]=1;G[p+180>>2]=0;G[p+184>>2]=1;G[p+188>>2]=0;G[p+336>>2]=1;G[p+284>>2]=1;G[p+288>>2]=1;G[p+236>>2]=1;G[p+240>>2]=1;G[p+192>>2]=1;G[p+196>>2]=0;while(1){h=c<<2;i=G[h+o>>2];t=G[h+l>>2];if((i|0)<(t|0)){G[p+16>>2]=c+1;a=p+32|0;Ya(a,81,26921,p+16|0);Ua(a);G[k>>2]=321;break _}G[h+(p+256|0)>>2]=i;G[h+(p+304|0)>>2]=t;G[h+(p+208|0)>>2]=G[h+q>>2];i=e;e=G[h+V>>2];e=Au(i,g,e,e>>31);c=c+1|0;h=(p+128|0)+(c<<3)|0;G[h>>2]=e;g=Ia;G[h+4>>2]=g;if((c|0)!=(f|0)){continue}break}ba:{if(!((f|0)!=1|G[V>>2]!=1)){C=(a-A|0)/(b|0)|0;a=A;c=b;break ba}C=(G[p+256>>2]-G[p+304>>2]|0)/G[q>>2]|0;c=G[p+208>>2]}if((a|0)<(A|0)){break $}ba=G[p+336>>2];e=G[p+288>>2];if((ba|0)>(e|0)){break $}ia=G[p+332>>2];f=G[p+284>>2];if((ia|0)>(f|0)){break $}ca=G[p+328>>2];g=G[p+280>>2];if((ca|0)>(g|0)){break $}ja=G[p+324>>2];h=G[p+276>>2];if((ja|0)>(h|0)){break $}x=G[p+320>>2];i=G[p+272>>2];if((x|0)>(i|0)){break $}R=G[p+316>>2];l=G[p+268>>2];if((R|0)>(l|0)){break $}P=G[p+312>>2];o=G[p+264>>2];if((P|0)>(o|0)){break $}X=G[p+308>>2];q=G[p+260>>2];if((X|0)>(q|0)){break $}s=c;C=C+1|0;Na=C>>31;Oa=G[p+192>>2];Qa=G[p+196>>2];Ra=G[p+184>>2];Ta=G[p+188>>2];Za=G[p+176>>2];v=G[p+180>>2];ra=G[p+168>>2];hb=G[p+172>>2];ib=G[p+160>>2];kb=G[p+164>>2];mb=G[p+152>>2];nb=G[p+156>>2];ob=G[p+144>>2];pb=G[p+148>>2];c=G[p+304>>2];$=c;qb=c>>31;rb=G[p+136>>2];sb=G[p+140>>2];ka=a;Ca=a>>31;pa=b;tb=b>>31;ga=A>>31;da=e;Da=e>>31;ma=ba>>31;ea=f;Ea=f>>31;a=G[p+236>>2];oa=a;ub=a>>31;la=ia>>31;sa=g;Ga=g>>31;a=G[p+232>>2];La=a;vb=a>>31;Ma=ca>>31;ha=h;m=h>>31;a=G[p+228>>2];Ja=a;wb=a>>31;$a=ja>>31;ab=i;D=i>>31;a=G[p+224>>2];fa=a;xb=a>>31;na=x>>31;Hb=l;qa=l>>31;a=G[p+220>>2];Pa=a;yb=a>>31;cb=R>>31;db=o;ta=o>>31;a=G[p+216>>2];Sa=a;zb=a>>31;eb=P>>31;fb=q;z=q>>31;a=G[p+212>>2];Va=a;Ab=a>>31;gb=X>>31;a=G[p+240>>2];ua=a;Bb=a>>31;a=0;while(1){b=ba;c=ma;while(1){ca:{if(C){va=Au(Oa,Qa,b-1|0,c-!b|0);Db=Ia;f=ia;h=la;while(1){wa=Au(Ra,Ta,f-1|0,h-!f|0);Eb=Ia;i=ca;o=Ma;while(1){xa=Au(Za,v,i-1|0,o-!i|0);Fb=Ia;q=ja;t=$a;while(1){ya=Au(ra,hb,q-1|0,t-!q|0);Gb=Ia;u=x;y=na;while(1){za=Au(ib,kb,u-1|0,y-!u|0);Ib=Ia;B=R;aa=cb;while(1){Aa=Au(mb,nb,B-1|0,aa-!B|0);Jb=Ia;w=P;_=eb;while(1){n=Au(ob,pb,w-1|0,_-!w|0);Kb=Ia;e=X;g=gb;while(1){if(G[k>>2]>0){break _}Y=Au(rb,sb,e-1|0,g-!e|0)+$|0;l=qb+Ia|0;l=Y>>>0<$>>>0?l+1|0:l;Y=n+Y|0;l=l+Kb|0;l=n>>>0>Y>>>0?l+1|0:l;Y=Y+Aa|0;l=l+Jb|0;l=Y>>>0>>0?l+1|0:l;Y=Y+za|0;l=l+Ib|0;l=Y>>>0>>0?l+1|0:l;Y=Y+ya|0;l=l+Gb|0;l=Y>>>0>>0?l+1|0:l;Y=Y+xa|0;l=l+Fb|0;l=Y>>>0>>0?l+1|0:l;Y=Y+wa|0;l=l+Eb|0;l=Y>>>0>>0?l+1|0:l;Y=Y+va|0;l=l+Db|0;qe(W,Ba,A,ga,Y,Y>>>0>>0?l+1|0:l,C,Na,s,1,0,(a<<2)+U|0,p+123|0,p+32|0,k);if(G[k>>2]>0){break _}a=a+C|0;l=g+Ab|0;e=e+Va|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=fb>>>0&(z|0)>=(l|0)|(l|0)<(z|0)){continue}break}l=_+zb|0;e=w+Sa|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=db>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}l=aa+yb|0;e=B+Pa|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=Hb>>>0&(qa|0)>=(l|0)|(l|0)<(qa|0)){continue}break}l=y+xb|0;e=u+fa|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=ab>>>0&(D|0)>=(l|0)|(l|0)<(D|0)){continue}break}l=t+wb|0;e=q+Ja|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=ha>>>0&(m|0)>=(l|0)|(l|0)<(m|0)){continue}break}l=o+vb|0;e=i+La|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=sa>>>0&(Ga|0)>=(l|0)|(l|0)<(Ga|0)){continue}break}l=h+ub|0;e=f+oa|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=ea>>>0&(Ea|0)>=(l|0)|(l|0)<(Ea|0)){continue}break}break ca}if(G[k>>2]>0){break _}}l=c+Bb|0;b=b+ua|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=da>>>0&(Da|0)>=(l|0)|(l|0)<(Da|0)){continue}break}l=ga+tb|0;b=A+pa|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=ka>>>0&(Ca|0)>=(l|0)|(l|0)<(Ca|0)){continue}break}}}Fa=p+352|0;break L;case 20:Vp(a,G[V+40>>2],V,l,o,q,U,0,k);break L;case 29:X=a;Ba=1;n=Fa-352|0;Fa=n;f=G[V+40>>2];da:{if(f-10>>>0<=4294967286){G[n>>2]=f;a=n+32|0;Ya(a,81,23862,n);Ua(a);G[k>>2]=320;break da}ea:{if(Nb(X,k)){if((f|0)!=1){a=f&-2;while(1){b=C<<3;e=n+32|0;g=b+e|0;h=C<<2;i=G[h+l>>2];G[g>>2]=i;G[g+4>>2]=i>>31;g=b;b=n+128|0;g=g+b|0;h=G[h+o>>2];G[g>>2]=h;G[g+4>>2]=h>>31;h=e;e=C|1;g=e<<3;h=h+g|0;e=e<<2;i=G[e+l>>2];G[h>>2]=i;G[h+4>>2]=i>>31;b=b+g|0;e=G[e+o>>2];G[b>>2]=e;G[b+4>>2]=e>>31;C=C+2|0;c=c+2|0;if((a|0)!=(c|0)){continue}break}}if(f&1){a=C<<3;b=a+(n+32|0)|0;c=C<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(n+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}G[n+304>>2]=0;md(X,40,n+32|0,n+128|0,q,1,n+304|0,U,0,0,k);break ea}if((Dc(X,n+124|0,k)|0)>0){break ea}fa:{if(!G[n+124>>2]){b=1;Ba=2;A=1;a=1;break fa}e=f<<2;b=G[e+q>>2];A=G[e+l>>2];a=G[e+o>>2]}G[n+256>>2]=1;G[n+304>>2]=1;G[n+308>>2]=1;G[n+208>>2]=1;e=1;g=0;G[n+128>>2]=1;G[n+132>>2]=0;G[n+136>>2]=1;G[n+140>>2]=0;G[n+312>>2]=1;G[n+260>>2]=1;G[n+264>>2]=1;G[n+212>>2]=1;G[n+216>>2]=1;G[n+144>>2]=1;G[n+148>>2]=0;G[n+152>>2]=1;G[n+156>>2]=0;G[n+316>>2]=1;G[n+320>>2]=1;G[n+268>>2]=1;G[n+272>>2]=1;G[n+220>>2]=1;G[n+224>>2]=1;G[n+160>>2]=1;G[n+164>>2]=0;G[n+324>>2]=1;G[n+276>>2]=1;G[n+228>>2]=1;G[n+168>>2]=1;G[n+172>>2]=0;G[n+280>>2]=1;G[n+328>>2]=1;G[n+332>>2]=1;G[n+232>>2]=1;G[n+176>>2]=1;G[n+180>>2]=0;G[n+184>>2]=1;G[n+188>>2]=0;G[n+336>>2]=1;G[n+284>>2]=1;G[n+288>>2]=1;G[n+236>>2]=1;G[n+240>>2]=1;G[n+192>>2]=1;G[n+196>>2]=0;while(1){h=c<<2;i=G[h+o>>2];t=G[h+l>>2];if((i|0)<(t|0)){G[n+16>>2]=c+1;a=n+32|0;Ya(a,81,27012,n+16|0);Ua(a);G[k>>2]=321;break da}G[h+(n+256|0)>>2]=i;G[h+(n+304|0)>>2]=t;G[h+(n+208|0)>>2]=G[h+q>>2];i=e;e=G[h+V>>2];e=Au(i,g,e,e>>31);c=c+1|0;h=(n+128|0)+(c<<3)|0;G[h>>2]=e;g=Ia;G[h+4>>2]=g;if((c|0)!=(f|0)){continue}break}ga:{if(!((f|0)!=1|G[V>>2]!=1)){C=(a-A|0)/(b|0)|0;a=A;c=b;break ga}C=(G[n+256>>2]-G[n+304>>2]|0)/G[q>>2]|0;c=G[n+208>>2]}if((a|0)<(A|0)){break ea}pa=G[n+336>>2];e=G[n+288>>2];if((pa|0)>(e|0)){break ea}ba=G[n+332>>2];f=G[n+284>>2];if((ba|0)>(f|0)){break ea}ia=G[n+328>>2];g=G[n+280>>2];if((ia|0)>(g|0)){break ea}ca=G[n+324>>2];h=G[n+276>>2];if((ca|0)>(h|0)){break ea}ja=G[n+320>>2];i=G[n+272>>2];if((ja|0)>(i|0)){break ea}x=G[n+316>>2];l=G[n+268>>2];if((x|0)>(l|0)){break ea}R=G[n+312>>2];o=G[n+264>>2];if((R|0)>(o|0)){break ea}P=G[n+308>>2];q=G[n+260>>2];if((P|0)>(q|0)){break ea}W=c;Y=C+1|0;Na=Y>>31;Oa=G[n+192>>2];Qa=G[n+196>>2];Ra=G[n+184>>2];Ta=G[n+188>>2];Za=G[n+176>>2];v=G[n+180>>2];ra=G[n+168>>2];hb=G[n+172>>2];ib=G[n+160>>2];kb=G[n+164>>2];mb=G[n+152>>2];nb=G[n+156>>2];ob=G[n+144>>2];pb=G[n+148>>2];qb=G[n+136>>2];rb=G[n+140>>2];c=G[n+304>>2];s=c;sb=c>>31;$=a;p=a>>31;a=b;tb=b>>31;ga=A>>31;ka=e;Ca=e>>31;da=pa>>31;ma=f;Da=f>>31;ea=ba>>31;oa=g;Ea=g>>31;la=ia>>31;sa=h;Ga=h>>31;La=ca>>31;Ma=i;m=i>>31;ha=ja>>31;Ja=l;D=l>>31;$a=x>>31;ab=o;qa=o>>31;fa=R>>31;na=q;ta=q>>31;Hb=P>>31;b=G[n+240>>2];Pa=b;ub=b>>31;b=G[n+236>>2];cb=b;vb=b>>31;b=G[n+232>>2];db=b;wb=b>>31;b=G[n+228>>2];Sa=b;xb=b>>31;b=G[n+224>>2];eb=b;yb=b>>31;b=G[n+220>>2];fb=b;zb=b>>31;b=G[n+216>>2];Va=b;Ab=b>>31;b=G[n+212>>2];gb=b;Bb=b>>31;C=0;while(1){b=pa;c=da;while(1){ua=Au(Oa,Qa,b-1|0,c-!b|0);Db=Ia;f=ba;h=ea;while(1){va=Au(Ra,Ta,f-1|0,h-!f|0);Eb=Ia;i=ia;o=la;while(1){wa=Au(Za,v,i-1|0,o-!i|0);Fb=Ia;q=ca;t=La;while(1){xa=Au(ra,hb,q-1|0,t-!q|0);Gb=Ia;u=ja;y=ha;while(1){ya=Au(ib,kb,u-1|0,y-!u|0);Ib=Ia;B=x;aa=$a;while(1){za=Au(mb,nb,B-1|0,aa-!B|0);Jb=Ia;w=R;_=fa;while(1){Aa=Au(ob,pb,w-1|0,_-!w|0);Kb=Ia;e=P;g=Hb;while(1){z=Au(qb,rb,e-1|0,g-!e|0)+s|0;l=sb+Ia|0;l=s>>>0>z>>>0?l+1|0:l;z=z+Aa|0;l=l+Kb|0;l=z>>>0>>0?l+1|0:l;z=z+za|0;l=l+Jb|0;l=z>>>0>>0?l+1|0:l;z=z+ya|0;l=l+Ib|0;l=z>>>0>>0?l+1|0:l;z=z+xa|0;l=l+Gb|0;l=z>>>0>>0?l+1|0:l;z=z+wa|0;l=l+Fb|0;l=z>>>0>>0?l+1|0:l;z=z+va|0;l=l+Eb|0;l=z>>>0>>0?l+1|0:l;z=z+ua|0;l=l+Db|0;if((qe(X,Ba,A,ga,z,z>>>0>>0?l+1|0:l,Y,Na,W,1,0,(C<<2)+U|0,n+123|0,n+32|0,k)|0)>0){break ea}C=C+Y|0;l=g+Bb|0;e=e+gb|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=na>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}l=_+Ab|0;e=w+Va|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=ab>>>0&(qa|0)>=(l|0)|(l|0)<(qa|0)){continue}break}l=aa+zb|0;e=B+fb|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=Ja>>>0&(D|0)>=(l|0)|(l|0)<(D|0)){continue}break}l=y+yb|0;e=u+eb|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=Ma>>>0&(m|0)>=(l|0)|(l|0)<(m|0)){continue}break}l=t+xb|0;e=q+Sa|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=sa>>>0&(Ga|0)>=(l|0)|(l|0)<(Ga|0)){continue}break}l=o+wb|0;e=i+db|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=oa>>>0&(Ea|0)>=(l|0)|(l|0)<(Ea|0)){continue}break}l=h+vb|0;e=f+cb|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=ma>>>0&(Da|0)>=(l|0)|(l|0)<(Da|0)){continue}break}l=c+ub|0;b=b+Pa|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=ka>>>0&(Ca|0)>=(l|0)|(l|0)<(Ca|0)){continue}break}l=ga+tb|0;b=a+A|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=$>>>0&(p|0)>=(l|0)|(l|0)<(p|0)){continue}break}}}Fa=n+352|0;break L;case 30:la=a;a=0;qa=1;m=Fa-400|0;Fa=m;t=G[V+40>>2];ha:{if(t-10>>>0<=4294967286){G[m>>2]=t;a=m+32|0;Ya(a,81,23817,m);Ua(a);G[k>>2]=320;break ha}if(Nb(la,k)){if((t|0)!=1){b=t&-2;while(1){c=D<<3;e=m+32|0;f=c+e|0;g=D<<2;h=G[g+l>>2];G[f>>2]=h;G[f+4>>2]=h>>31;f=c;c=m+128|0;f=f+c|0;g=G[g+o>>2];G[f>>2]=g;G[f+4>>2]=g>>31;g=e;e=D|1;f=e<<3;g=g+f|0;e=e<<2;h=G[e+l>>2];G[g>>2]=h;G[g+4>>2]=h>>31;c=c+f|0;e=G[e+o>>2];G[c>>2]=e;G[c+4>>2]=e>>31;D=D+2|0;a=a+2|0;if((b|0)!=(a|0)){continue}break}}if(t&1){a=D<<3;b=a+(m+32|0)|0;c=D<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(m+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}G[m+352>>2]=0;md(la,41,m+32|0,m+128|0,q,1,m+352|0,U,0,0,k);break ha}if((Dc(la,m+124|0,k)|0)>0){break ha}y=G[m+124>>2];ia:{if(!y){b=1;qa=2;A=1;c=1;break ia}e=t<<2;b=G[e+q>>2];A=G[e+l>>2];c=G[e+o>>2]}G[m+352>>2]=1;G[m+356>>2]=1;e=1;g=0;G[m+128>>2]=1;G[m+132>>2]=0;G[m+304>>2]=1;G[m+308>>2]=1;G[m+256>>2]=1;G[m+260>>2]=1;G[m+136>>2]=1;G[m+140>>2]=0;G[m+208>>2]=1;G[m+212>>2]=1;G[m+360>>2]=1;G[m+144>>2]=1;G[m+148>>2]=0;G[m+312>>2]=1;G[m+316>>2]=1;G[m+264>>2]=1;G[m+268>>2]=1;G[m+152>>2]=1;G[m+156>>2]=0;G[m+216>>2]=1;G[m+220>>2]=1;G[m+364>>2]=1;G[m+368>>2]=1;G[m+320>>2]=1;G[m+272>>2]=1;G[m+160>>2]=1;G[m+164>>2]=0;G[m+224>>2]=1;G[m+372>>2]=1;G[m+376>>2]=1;G[m+168>>2]=1;G[m+172>>2]=0;G[m+324>>2]=1;G[m+328>>2]=1;G[m+276>>2]=1;G[m+280>>2]=1;G[m+176>>2]=1;G[m+180>>2]=0;G[m+228>>2]=1;G[m+232>>2]=1;G[m+184>>2]=1;G[m+188>>2]=0;G[m+380>>2]=1;G[m+384>>2]=1;G[m+332>>2]=1;G[m+336>>2]=1;G[m+284>>2]=1;G[m+288>>2]=1;G[m+192>>2]=1;G[m+196>>2]=0;G[m+236>>2]=1;G[m+240>>2]=1;ja:{while(1){h=a<<2;f=G[h+o>>2];i=G[h+l>>2];ka:{if((f|0)>=(i|0)){u=G[h+(m+208|0)>>2];break ka}if(y){break ja}G[h+(m+208|0)>>2]=-1;u=-1}G[h+(m+304|0)>>2]=f;G[h+(m+352|0)>>2]=i;G[h+(m+256|0)>>2]=G[h+q>>2];B=m+128|0;f=a+1|0;i=B+(f<<3)|0;h=G[h+V>>2];h=Au(e,g,h,h>>31);G[i>>2]=h;w=i;i=Ia;G[w+4>>2]=i;a=B+(a<<3)|0;ic=a,jc=Au(e,g,u,u>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;e=h;g=i;a=f;if((t|0)!=(f|0)){continue}break}a=(m+128|0)+(t<<3)|0;e=G[a>>2];f=e;e=G[(m+208|0)+(t<<2)>>2];ic=a,jc=Au(f,G[a+4>>2],e,e>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;la:{if(!((t|0)!=1|G[V>>2]!=1)){D=(c-A|0)/(b|0)|0;c=A;a=b;break la}e=G[m+208>>2];a=M(e,G[m+256>>2]);D=(M(e,G[m+304>>2]-G[m+352>>2]|0)|0)/G[q>>2]|0}if((c|0)<(A|0)){break ha}ba=G[m+240>>2];ia=M(ba,G[m+384>>2]);e=M(ba,G[m+336>>2]);if((ia|0)>(e|0)){break ha}ca=G[m+236>>2];ja=M(ca,G[m+380>>2]);f=M(ca,G[m+332>>2]);if((ja|0)>(f|0)){break ha}x=G[m+232>>2];R=M(x,G[m+376>>2]);g=M(x,G[m+328>>2]);if((R|0)>(g|0)){break ha}P=G[m+228>>2];X=M(P,G[m+372>>2]);h=M(P,G[m+324>>2]);if((X|0)>(h|0)){break ha}W=G[m+224>>2];s=M(W,G[m+368>>2]);i=M(W,G[m+320>>2]);if((s|0)>(i|0)){break ha}$=G[m+220>>2];ka=M($,G[m+364>>2]);l=M($,G[m+316>>2]);if((ka|0)>(l|0)){break ha}da=G[m+216>>2];ma=M(da,G[m+360>>2]);o=M(da,G[m+312>>2]);if((ma|0)>(o|0)){break ha}ea=G[m+212>>2];oa=M(ea,G[m+356>>2]);q=M(ea,G[m+308>>2]);if((oa|0)>(q|0)){break ha}ra=D+1|0;hb=ra>>31;ib=G[m+192>>2];kb=G[m+196>>2];mb=G[m+184>>2];nb=G[m+188>>2];ob=G[m+176>>2];pb=G[m+180>>2];qb=G[m+168>>2];rb=G[m+172>>2];sb=G[m+160>>2];tb=G[m+164>>2];ub=G[m+152>>2];vb=G[m+156>>2];wb=G[m+144>>2];xb=G[m+148>>2];yb=G[m+136>>2];zb=G[m+140>>2];t=G[m+352>>2];sa=t;Ab=t>>31;La=c;ta=c>>31;pa=b;Bb=b>>31;ga=A>>31;Ma=e;z=e>>31;Db=ba>>31;ha=ia>>31;Ja=f;Y=f>>31;Eb=ca>>31;$a=ja>>31;ab=g;Na=g>>31;Fb=x>>31;fa=R>>31;na=h;Oa=h>>31;Gb=P>>31;Hb=X>>31;Pa=i;Qa=i>>31;Ib=W>>31;cb=s>>31;db=l;Ra=l>>31;Jb=$>>31;Sa=ka>>31;eb=o;Ta=o>>31;Kb=da>>31;fb=ma>>31;Va=q;Za=q>>31;Qb=ea>>31;gb=oa>>31;b=G[m+288>>2];ua=b;Rb=b>>31;b=G[m+284>>2];va=b;Sb=b>>31;b=G[m+280>>2];wa=b;Tb=b>>31;b=G[m+276>>2];xa=b;Ub=b>>31;b=G[m+272>>2];ya=b;Vb=b>>31;b=G[m+268>>2];za=b;Wb=b>>31;b=G[m+264>>2];Aa=b;Xb=b>>31;b=G[m+260>>2];n=b;Yb=b>>31;D=0;while(1){b=ia;c=ha;while(1){p=Au(ib,kb,b-ba|0,c-((b>>>0>>0)+Db|0)|0);Zb=Ia;f=ja;h=$a;while(1){C=Au(mb,nb,f-ca|0,h-((f>>>0>>0)+Eb|0)|0);$b=Ia;i=R;o=fa;while(1){Ba=Au(ob,pb,i-x|0,o-((i>>>0>>0)+Fb|0)|0);ac=Ia;q=X;t=Hb;while(1){Ca=Au(qb,rb,q-P|0,t-((q>>>0

>>0)+Gb|0)|0);bc=Ia;u=s;y=cb;while(1){Da=Au(sb,tb,u-W|0,y-((u>>>0>>0)+Ib|0)|0);cc=Ia;B=ka;aa=Sa;while(1){Ea=Au(ub,vb,B-$|0,aa-((B>>>0<$>>>0)+Jb|0)|0);dc=Ia;w=ma;_=fb;while(1){Ga=Au(wb,xb,w-da|0,_-((w>>>0>>0)+Kb|0)|0);ec=Ia;e=oa;g=gb;while(1){v=Au(yb,zb,e-ea|0,g-((e>>>0>>0)+Qb|0)|0)+sa|0;l=Ab+Ia|0;l=v>>>0>>0?l+1|0:l;v=v+Ga|0;l=l+ec|0;l=v>>>0>>0?l+1|0:l;v=v+Ea|0;l=l+dc|0;l=v>>>0>>0?l+1|0:l;v=v+Da|0;l=l+cc|0;l=v>>>0>>0?l+1|0:l;v=v+Ca|0;l=l+bc|0;l=v>>>0>>0?l+1|0:l;v=v+Ba|0;l=l+ac|0;l=v>>>0>>0?l+1|0:l;v=v+C|0;l=l+$b|0;l=v>>>0>>0?l+1|0:l;v=p+v|0;l=l+Zb|0;if((Ud(la,qa,A,ga,v,p>>>0>v>>>0?l+1|0:l,ra,hb,a,1,0,(D<<2)+U|0,m+123|0,m+32|0,k)|0)>0){break ha}D=D+ra|0;l=g+Yb|0;e=e+n|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=Va>>>0&(Za|0)>=(l|0)|(l|0)<(Za|0)){continue}break}l=_+Xb|0;e=w+Aa|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=eb>>>0&(Ta|0)>=(l|0)|(l|0)<(Ta|0)){continue}break}l=aa+Wb|0;e=B+za|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=db>>>0&(Ra|0)>=(l|0)|(l|0)<(Ra|0)){continue}break}l=y+Vb|0;e=u+ya|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=Pa>>>0&(Qa|0)>=(l|0)|(l|0)<(Qa|0)){continue}break}l=t+Ub|0;e=q+xa|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=na>>>0&(Oa|0)>=(l|0)|(l|0)<(Oa|0)){continue}break}l=o+Tb|0;e=i+wa|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=ab>>>0&(Na|0)>=(l|0)|(l|0)<(Na|0)){continue}break}l=h+Sb|0;e=f+va|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=Ja>>>0&(Y|0)>=(l|0)|(l|0)<(Y|0)){continue}break}l=c+Rb|0;b=b+ua|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=Ma>>>0&(z|0)>=(l|0)|(l|0)<(z|0)){continue}break}l=ga+Bb|0;b=A+pa|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=La>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}break ha}G[m+16>>2]=a+1;a=m+32|0;Ya(a,81,26967,m+16|0);Ua(a);G[k>>2]=321}Fa=m+400|0;break L;case 69:la=a;a=0;qa=1;m=Fa-400|0;Fa=m;t=G[V+40>>2];ma:{if(t-10>>>0<=4294967286){G[m>>2]=t;a=m+32|0;Ya(a,81,23817,m);Ua(a);G[k>>2]=320;break ma}if(Nb(la,k)){if((t|0)!=1){b=t&-2;while(1){c=D<<3;e=m+32|0;f=c+e|0;g=D<<2;h=G[g+l>>2];G[f>>2]=h;G[f+4>>2]=h>>31;f=c;c=m+128|0;f=f+c|0;g=G[g+o>>2];G[f>>2]=g;G[f+4>>2]=g>>31;g=e;e=D|1;f=e<<3;g=g+f|0;e=e<<2;h=G[e+l>>2];G[g>>2]=h;G[g+4>>2]=h>>31;c=c+f|0;e=G[e+o>>2];G[c>>2]=e;G[c+4>>2]=e>>31;D=D+2|0;a=a+2|0;if((b|0)!=(a|0)){continue}break}}if(t&1){a=D<<3;b=a+(m+32|0)|0;c=D<<2;e=G[c+l>>2];G[b>>2]=e;G[b+4>>2]=e>>31;a=a+(m+128|0)|0;b=G[c+o>>2];G[a>>2]=b;G[a+4>>2]=b>>31}G[m+352>>2]=0;G[m+356>>2]=0;md(la,80,m+32|0,m+128|0,q,1,m+352|0,U,0,0,k);break ma}if((Dc(la,m+124|0,k)|0)>0){break ma}y=G[m+124>>2];na:{if(!y){b=1;qa=2;A=1;c=1;break na}e=t<<2;b=G[e+q>>2];A=G[e+l>>2];c=G[e+o>>2]}G[m+352>>2]=1;G[m+356>>2]=1;e=1;g=0;G[m+128>>2]=1;G[m+132>>2]=0;G[m+304>>2]=1;G[m+308>>2]=1;G[m+256>>2]=1;G[m+260>>2]=1;G[m+136>>2]=1;G[m+140>>2]=0;G[m+208>>2]=1;G[m+212>>2]=1;G[m+360>>2]=1;G[m+144>>2]=1;G[m+148>>2]=0;G[m+312>>2]=1;G[m+316>>2]=1;G[m+264>>2]=1;G[m+268>>2]=1;G[m+152>>2]=1;G[m+156>>2]=0;G[m+216>>2]=1;G[m+220>>2]=1;G[m+364>>2]=1;G[m+368>>2]=1;G[m+320>>2]=1;G[m+272>>2]=1;G[m+160>>2]=1;G[m+164>>2]=0;G[m+224>>2]=1;G[m+372>>2]=1;G[m+376>>2]=1;G[m+168>>2]=1;G[m+172>>2]=0;G[m+324>>2]=1;G[m+328>>2]=1;G[m+276>>2]=1;G[m+280>>2]=1;G[m+176>>2]=1;G[m+180>>2]=0;G[m+228>>2]=1;G[m+232>>2]=1;G[m+184>>2]=1;G[m+188>>2]=0;G[m+380>>2]=1;G[m+384>>2]=1;G[m+332>>2]=1;G[m+336>>2]=1;G[m+284>>2]=1;G[m+288>>2]=1;G[m+192>>2]=1;G[m+196>>2]=0;G[m+236>>2]=1;G[m+240>>2]=1;oa:{while(1){h=a<<2;f=G[h+o>>2];i=G[h+l>>2];pa:{if((f|0)>=(i|0)){u=G[h+(m+208|0)>>2];break pa}if(y){break oa}G[h+(m+208|0)>>2]=-1;u=-1}G[h+(m+304|0)>>2]=f;G[h+(m+352|0)>>2]=i;G[h+(m+256|0)>>2]=G[h+q>>2];B=m+128|0;f=a+1|0;i=B+(f<<3)|0;h=G[h+V>>2];h=Au(e,g,h,h>>31);G[i>>2]=h;w=i;i=Ia;G[w+4>>2]=i;a=B+(a<<3)|0;ic=a,jc=Au(e,g,u,u>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;e=h;g=i;a=f;if((t|0)!=(f|0)){continue}break}a=(m+128|0)+(t<<3)|0;e=G[a>>2];f=e;e=G[(m+208|0)+(t<<2)>>2];ic=a,jc=Au(f,G[a+4>>2],e,e>>31),G[ic>>2]=jc;G[a+4>>2]=Ia;qa:{if(!((t|0)!=1|G[V>>2]!=1)){D=(c-A|0)/(b|0)|0;c=A;a=b;break qa}e=G[m+208>>2];a=M(e,G[m+256>>2]);D=(M(e,G[m+304>>2]-G[m+352>>2]|0)|0)/G[q>>2]|0}if((c|0)<(A|0)){break ma}ba=G[m+240>>2];ia=M(ba,G[m+384>>2]);e=M(ba,G[m+336>>2]);if((ia|0)>(e|0)){break ma}ca=G[m+236>>2];ja=M(ca,G[m+380>>2]);f=M(ca,G[m+332>>2]);if((ja|0)>(f|0)){break ma}x=G[m+232>>2];R=M(x,G[m+376>>2]);g=M(x,G[m+328>>2]);if((R|0)>(g|0)){break ma}P=G[m+228>>2];X=M(P,G[m+372>>2]);h=M(P,G[m+324>>2]);if((X|0)>(h|0)){break ma}W=G[m+224>>2];s=M(W,G[m+368>>2]);i=M(W,G[m+320>>2]);if((s|0)>(i|0)){break ma}$=G[m+220>>2];ka=M($,G[m+364>>2]);l=M($,G[m+316>>2]);if((ka|0)>(l|0)){break ma}da=G[m+216>>2];ma=M(da,G[m+360>>2]);o=M(da,G[m+312>>2]);if((ma|0)>(o|0)){break ma}ea=G[m+212>>2];oa=M(ea,G[m+356>>2]);q=M(ea,G[m+308>>2]);if((oa|0)>(q|0)){break ma}ra=D+1|0;hb=ra>>31;ib=G[m+192>>2];kb=G[m+196>>2];mb=G[m+184>>2];nb=G[m+188>>2];ob=G[m+176>>2];pb=G[m+180>>2];qb=G[m+168>>2];rb=G[m+172>>2];sb=G[m+160>>2];tb=G[m+164>>2];ub=G[m+152>>2];vb=G[m+156>>2];wb=G[m+144>>2];xb=G[m+148>>2];yb=G[m+136>>2];zb=G[m+140>>2];t=G[m+352>>2];sa=t;Ab=t>>31;La=c;ta=c>>31;pa=b;Bb=b>>31;ga=A>>31;Ma=e;z=e>>31;Db=ba>>31;ha=ia>>31;Ja=f;Y=f>>31;Eb=ca>>31;$a=ja>>31;ab=g;Na=g>>31;Fb=x>>31;fa=R>>31;na=h;Oa=h>>31;Gb=P>>31;Hb=X>>31;Pa=i;Qa=i>>31;Ib=W>>31;cb=s>>31;db=l;Ra=l>>31;Jb=$>>31;Sa=ka>>31;eb=o;Ta=o>>31;Kb=da>>31;fb=ma>>31;Va=q;Za=q>>31;Qb=ea>>31;gb=oa>>31;b=G[m+288>>2];ua=b;Rb=b>>31;b=G[m+284>>2];va=b;Sb=b>>31;b=G[m+280>>2];wa=b;Tb=b>>31;b=G[m+276>>2];xa=b;Ub=b>>31;b=G[m+272>>2];ya=b;Vb=b>>31;b=G[m+268>>2];za=b;Wb=b>>31;b=G[m+264>>2];Aa=b;Xb=b>>31;b=G[m+260>>2];n=b;Yb=b>>31;D=0;while(1){b=ia;c=ha;while(1){p=Au(ib,kb,b-ba|0,c-((b>>>0>>0)+Db|0)|0);Zb=Ia;f=ja;h=$a;while(1){C=Au(mb,nb,f-ca|0,h-((f>>>0>>0)+Eb|0)|0);$b=Ia;i=R;o=fa;while(1){Ba=Au(ob,pb,i-x|0,o-((i>>>0>>0)+Fb|0)|0);ac=Ia;q=X;t=Hb;while(1){Ca=Au(qb,rb,q-P|0,t-((q>>>0

>>0)+Gb|0)|0);bc=Ia;u=s;y=cb;while(1){Da=Au(sb,tb,u-W|0,y-((u>>>0>>0)+Ib|0)|0);cc=Ia;B=ka;aa=Sa;while(1){Ea=Au(ub,vb,B-$|0,aa-((B>>>0<$>>>0)+Jb|0)|0);dc=Ia;w=ma;_=fb;while(1){Ga=Au(wb,xb,w-da|0,_-((w>>>0>>0)+Kb|0)|0);ec=Ia;e=oa;g=gb;while(1){v=Au(yb,zb,e-ea|0,g-((e>>>0>>0)+Qb|0)|0)+sa|0;l=Ab+Ia|0;l=v>>>0>>0?l+1|0:l;v=v+Ga|0;l=l+ec|0;l=v>>>0>>0?l+1|0:l;v=v+Ea|0;l=l+dc|0;l=v>>>0>>0?l+1|0:l;v=v+Da|0;l=l+cc|0;l=v>>>0>>0?l+1|0:l;v=v+Ca|0;l=l+bc|0;l=v>>>0>>0?l+1|0:l;v=v+Ba|0;l=l+ac|0;l=v>>>0>>0?l+1|0:l;v=v+C|0;l=l+$b|0;l=v>>>0>>0?l+1|0:l;v=p+v|0;l=l+Zb|0;if((hf(la,qa,A,ga,v,p>>>0>v>>>0?l+1|0:l,ra,hb,a,1,0,0,(D<<3)+U|0,m+123|0,m+32|0,k)|0)>0){break ma}D=D+ra|0;l=g+Yb|0;e=e+n|0;l=e>>>0>>0?l+1|0:l;g=l;if(e>>>0<=Va>>>0&(Za|0)>=(l|0)|(l|0)<(Za|0)){continue}break}l=_+Xb|0;e=w+Aa|0;l=e>>>0>>0?l+1|0:l;w=e;_=l;if(e>>>0<=eb>>>0&(Ta|0)>=(l|0)|(l|0)<(Ta|0)){continue}break}l=aa+Wb|0;e=B+za|0;l=e>>>0>>0?l+1|0:l;B=e;aa=l;if(e>>>0<=db>>>0&(Ra|0)>=(l|0)|(l|0)<(Ra|0)){continue}break}l=y+Vb|0;e=u+ya|0;l=e>>>0>>0?l+1|0:l;u=e;y=l;if(e>>>0<=Pa>>>0&(Qa|0)>=(l|0)|(l|0)<(Qa|0)){continue}break}l=t+Ub|0;e=q+xa|0;l=e>>>0>>0?l+1|0:l;q=e;t=l;if(e>>>0<=na>>>0&(Oa|0)>=(l|0)|(l|0)<(Oa|0)){continue}break}l=o+Tb|0;e=i+wa|0;l=e>>>0>>0?l+1|0:l;i=e;o=l;if(e>>>0<=ab>>>0&(Na|0)>=(l|0)|(l|0)<(Na|0)){continue}break}l=h+Sb|0;e=f+va|0;l=e>>>0>>0?l+1|0:l;f=e;h=l;if(e>>>0<=Ja>>>0&(Y|0)>=(l|0)|(l|0)<(Y|0)){continue}break}l=c+Rb|0;b=b+ua|0;l=b>>>0>>0?l+1|0:l;c=l;if(b>>>0<=Ma>>>0&(z|0)>=(l|0)|(l|0)<(z|0)){continue}break}l=ga+Bb|0;b=A+pa|0;l=b>>>0>>0?l+1|0:l;A=b;ga=l;if(b>>>0<=La>>>0&(ta|0)>=(l|0)|(l|0)<(ta|0)){continue}break}break ma}G[m+16>>2]=a+1;a=m+32|0;Ya(a,81,26967,m+16|0);Ua(a);G[k>>2]=321}Fa=m+400|0;break L;case 70:Xp(a,G[V+40>>2],V,l,o,q,U,0,k);break L;case 31:hq(a,G[V+40>>2],V,l,o,q,N(0),U,0,k);break L;case 71:dq(a,G[V+40>>2],V,l,o,q,0,U,0,k);break L;default:break Q}}G[k>>2]=410}}Fa=V+848|0;b=0;B=0;c=0;aa=0;i=0;q=0;break J}o=lb(M(f,Ka),1);if(!o){G[k>>2]=113;break a}d=+(f|0)/Z;ra:{if(O(d)<2147483648){w=~~d;break ra}w=-2147483648}R=M(w,Ka);d=+(t|0)/Z;sa:{if(O(d)<2147483648){h=~~d;break sa}h=-2147483648}Pb=M(M(R,h),W);U=lb(Pb,1);if(!U){G[k>>2]=113;break a}_=0;Ha=0;b=0;B=0;c=0;i=0;q=0;ta:{ua:{va:{wa:{xa:{ya:{switch(Eu(e- -64|0,29)|0){case 9:_=o;Ha=U;break xa;case 10:A=o;b=U;break xa;case 6:pa=o;B=U;break wa;case 12:ba=o;c=U;break va;case 16:ia=o;aa=U;break ua;case 4:ca=o;i=U;break ta;case 0:break ya;default:break ta}}ja=o;q=U;break ta}B=0}c=0}aa=0}}e=G[r+1244>>2];G[r+1208>>2]=G[r+1240>>2];G[r+1212>>2]=e;e=G[r+1236>>2];G[r+1200>>2]=G[r+1232>>2];G[r+1204>>2]=e;za:{if(Z>=1){d=Z*+(h|0);Aa:{if(O(d)<2147483648){t=~~d;break Aa}t=-2147483648}y=1;R=0;d=Z*+(w|0);Ba:{if(O(d)<2147483648){e=~~d;break Ba}e=-2147483648}break za}d=1/Z;Ca:{if(O(d)<2147483648){y=~~d;break Ca}y=-2147483648}e=f}if((W|0)<=0){break J}ga=e;if((t|0)>0){g=f;oa=f>>31;ka=y&-4;X=y&3;la=y-2|0;$=y-1|0;sa=$&-4;da=$&3;$a=(y|0)<=0;while(1){G[r+1208>>2]=G[r+1240>>2]+ea;La=M(ea,Ja);P=0;ma=0;Da:{if((ga|0)<=0){while(1){G[r+1272>>2]=0;G[r+1204>>2]=G[r+1236>>2]+P;cg(a,u,r+1200|0,g,oa,0,o,0,r+1272|0);if(G[r+1272>>2]){break Da}Ea:{if(!(Z<1)){break Ea}d=+(P|0)/Z;Fa:{if(O(d)<2147483648){e=~~d;break Fa}e=-2147483648}if((y|0)<2){break Ea}e=M(La+M(e,w)|0,Ka)+U|0;h=0;f=1;if(la>>>0>2){while(1){bb(e+M(f,R)|0,e,R);bb(e+M(f+1|0,R)|0,e,R);bb(e+M(f+2|0,R)|0,e,R);bb(e+M(f+3|0,R)|0,e,R);f=f+4|0;h=h+4|0;if((sa|0)!=(h|0)){continue}break}}h=0;if(!da){break Ea}while(1){bb(e+M(f,R)|0,e,R);f=f+1|0;h=h+1|0;if((da|0)!=(h|0)){continue}break}}P=P+1|0;if((t|0)!=(P|0)){continue}break Da}}while(1){G[r+1272>>2]=0;G[r+1204>>2]=G[r+1236>>2]+ma;cg(a,u,r+1200|0,g,oa,0,o,0,r+1272|0);if(G[r+1272>>2]){break Da}ab=Eu(G[j>>2]- -64|0,29);d=+(ma|0)/Z;Ga:{if(O(d)<2147483648){e=~~d;break Ga}e=-2147483648}Ma=La+M(e,w)|0;P=0;while(1){d=+(P|0)/Z;Ha:{if(O(d)<2147483648){e=~~d;break Ha}e=-2147483648}x=e+Ma|0;Ia:{Ja:{switch(ab|0){case 0:if($a){break Ia}l=(P<<3)+ja|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x<<3)+q|0;L[s>>3]=L[l>>3]+L[s>>3];s=((f|1)+x<<3)+q|0;L[s>>3]=L[l>>3]+L[s>>3];s=((f|2)+x<<3)+q|0;L[s>>3]=L[l>>3]+L[s>>3];s=((f|3)+x<<3)+q|0;L[s>>3]=L[l>>3]+L[s>>3];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<3)+q|0;L[h>>3]=L[l>>3]+L[h>>3];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 4:if((y|0)<=0){break Ia}l=(P<<2)+ca|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x<<2)+i|0;K[s>>2]=K[l>>2]+K[s>>2];s=((f|1)+x<<2)+i|0;K[s>>2]=K[l>>2]+K[s>>2];s=((f|2)+x<<2)+i|0;K[s>>2]=K[l>>2]+K[s>>2];s=((f|3)+x<<2)+i|0;K[s>>2]=K[l>>2]+K[s>>2];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<2)+i|0;K[h>>2]=K[l>>2]+K[h>>2];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 16:if((y|0)<=0){break Ia}s=(P<<3)+ia|0;e=0;f=0;h=0;if($>>>0>=3){while(1){l=(f+x<<3)+aa|0;fa=l;na=G[s>>2];ha=na+G[l>>2]|0;l=G[l+4>>2]+G[s+4>>2]|0;G[fa>>2]=ha;G[fa+4>>2]=ha>>>0>>0?l+1|0:l;l=((f|1)+x<<3)+aa|0;fa=l;na=G[s>>2];ha=na+G[l>>2]|0;l=G[l+4>>2]+G[s+4>>2]|0;G[fa>>2]=ha;G[fa+4>>2]=ha>>>0>>0?l+1|0:l;l=((f|2)+x<<3)+aa|0;fa=l;na=G[s>>2];ha=na+G[l>>2]|0;l=G[l+4>>2]+G[s+4>>2]|0;G[fa>>2]=ha;G[fa+4>>2]=ha>>>0>>0?l+1|0:l;l=((f|3)+x<<3)+aa|0;fa=l;na=G[s>>2];ha=na+G[l>>2]|0;l=G[l+4>>2]+G[s+4>>2]|0;G[fa>>2]=ha;G[fa+4>>2]=ha>>>0>>0?l+1|0:l;f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<3)+aa|0;l=G[h+4>>2]+G[s+4>>2]|0;fa=G[s>>2];ha=fa+G[h>>2]|0;G[h>>2]=ha;G[h+4>>2]=ha>>>0>>0?l+1|0:l;f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 12:if((y|0)<=0){break Ia}l=(P<<2)+ba|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x<<2)+c|0;G[s>>2]=G[s>>2]+G[l>>2];s=((f|1)+x<<2)+c|0;G[s>>2]=G[s>>2]+G[l>>2];s=((f|2)+x<<2)+c|0;G[s>>2]=G[s>>2]+G[l>>2];s=((f|3)+x<<2)+c|0;G[s>>2]=G[s>>2]+G[l>>2];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<2)+c|0;G[h>>2]=G[h>>2]+G[l>>2];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 6:if((y|0)<=0){break Ia}l=(P<<1)+pa|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x<<1)+B|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|1)+x<<1)+B|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|2)+x<<1)+B|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|3)+x<<1)+B|0;F[s>>1]=I[s>>1]+I[l>>1];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<1)+B|0;F[h>>1]=I[h>>1]+I[l>>1];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 10:if((y|0)<=0){break Ia}l=(P<<1)+A|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x<<1)+b|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|1)+x<<1)+b|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|2)+x<<1)+b|0;F[s>>1]=I[s>>1]+I[l>>1];s=((f|3)+x<<1)+b|0;F[s>>1]=I[s>>1]+I[l>>1];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x<<1)+b|0;F[h>>1]=I[h>>1]+I[l>>1];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break};break Ia;case 9:break Ja;default:break Ia}}if((y|0)<=0){break Ia}l=P+_|0;e=0;f=0;h=0;if($>>>0>=3){while(1){s=(f+x|0)+Ha|0;E[s|0]=H[s|0]+H[l|0];s=((f|1)+x|0)+Ha|0;E[s|0]=H[s|0]+H[l|0];s=((f|2)+x|0)+Ha|0;E[s|0]=H[s|0]+H[l|0];s=((f|3)+x|0)+Ha|0;E[s|0]=H[s|0]+H[l|0];f=f+4|0;h=h+4|0;if((ka|0)!=(h|0)){continue}break}}if(!X){break Ia}while(1){h=(f+x|0)+Ha|0;E[h|0]=H[h|0]+H[l|0];f=f+1|0;e=e+1|0;if((X|0)!=(e|0)){continue}break}}P=P+1|0;if((ga|0)!=(P|0)){continue}break}Ka:{if(!(Z<1)|(y|0)<2){break Ka}e=M(Ka,Ma)+U|0;h=0;f=1;if(la>>>0>2){while(1){bb(e+M(f,R)|0,e,R);bb(e+M(f+1|0,R)|0,e,R);bb(e+M(f+2|0,R)|0,e,R);bb(e+M(f+3|0,R)|0,e,R);f=f+4|0;h=h+4|0;if((sa|0)!=(h|0)){continue}break}}h=0;if(!da){break Ka}while(1){bb(e+M(f,R)|0,e,R);f=f+1|0;h=h+1|0;if((da|0)!=(h|0)){continue}break}}ma=ma+1|0;if((ma|0)!=(t|0)){continue}break}}Wa(o);ea=ea+1|0;if((ea|0)!=(W|0)){continue}break}break J}a=G[r+1240>>2];while(1){Wa(o);g=g+1|0;if((W|0)!=(g|0)){continue}break}G[r+1208>>2]=(a+W|0)-1}La:{if(!Lb){break La}_a=(Pb|0)/(Ka|0)|0;if((_a|0)<=0){break La}d=Z*Z;Z=Z>=1?d:1/d;g=0;while(1){Ma:{Na:{switch(Eu(G[j>>2]- -64|0,29)|0){case 9:a=g+Ha|0;d=+H[a|0]/Z;if(d<4294967296&d>=0){E[a|0]=~~d>>>0;break Ma}E[a|0]=0;break Ma;case 10:a=(g<<1)+b|0;d=+F[a>>1]/Z;if(O(d)<2147483648){F[a>>1]=~~d;break Ma}F[a>>1]=0;break Ma;case 6:a=(g<<1)+B|0;d=+I[a>>1]/Z;if(d<4294967296&d>=0){F[a>>1]=~~d>>>0;break Ma}F[a>>1]=0;break Ma;case 12:a=(g<<2)+c|0;d=+G[a>>2]/Z;if(O(d)<2147483648){G[a>>2]=~~d;break Ma}G[a>>2]=-2147483648;break Ma;case 16:a=(g<<3)+aa|0;d=(+J[a>>2]+ +G[a+4>>2]*4294967296)/Z;if(O(d)<0x8000000000000000){G[a>>2]=~~d>>>0;G[a+4>>2]=O(d)>=1?~~(d>0?Q(S(d*2.3283064365386963e-10),4294967295):T((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break Ma}G[a>>2]=0;G[a+4>>2]=-2147483648;break Ma;case 4:a=(g<<2)+i|0;K[a>>2]=+K[a>>2]/Z;break Ma;case 0:break Na;default:break Ma}}a=(g<<3)+q|0;L[a>>3]=L[a>>3]/Z}g=g+1|0;if((_a|0)!=(g|0)){continue}break}}if((hc|0)!=64){g=U;break a}g=0;Oa:{Pa:{Qa:{Ra:{if((_a|0)>0){while(1){d=L[(g<<3)+U>>3];if(d>2147483647){g=U;break a}if(!(d<-2147483648)){g=g+1|0;if((_a|0)==(g|0)){break Ra}continue}break}g=U;break a}g=lb(_a,4);if(!g){break Qa}break Oa}g=lb(_a,4);if(g){break Pa}}G[k>>2]=113;g=0;break a}if((_a|0)<=0){break Oa}e=0;f=0;if(_a-1>>>0>=3){b=_a&-4;u=0;while(1){c=(f<<2)+g|0;d=bh(L[(f<<3)+U>>3]);Sa:{if(O(d)<2147483648){a=~~d;break Sa}a=-2147483648}G[c>>2]=a;a=f|1;c=(a<<2)+g|0;d=bh(L[(a<<3)+U>>3]);Ta:{if(O(d)<2147483648){a=~~d;break Ta}a=-2147483648}G[c>>2]=a;a=f|2;c=(a<<2)+g|0;d=bh(L[(a<<3)+U>>3]);Ua:{if(O(d)<2147483648){a=~~d;break Ua}a=-2147483648}G[c>>2]=a;a=f|3;c=(a<<2)+g|0;d=bh(L[(a<<3)+U>>3]);Va:{if(O(d)<2147483648){a=~~d;break Va}a=-2147483648}G[c>>2]=a;f=f+4|0;u=u+4|0;if((b|0)!=(u|0)){continue}break}}b=_a&3;if(!b){break Oa}while(1){c=(f<<2)+g|0;d=bh(L[(f<<3)+U>>3]);Wa:{if(O(d)<2147483648){a=~~d;break Wa}a=-2147483648}G[c>>2]=a;f=f+1|0;e=e+1|0;if((b|0)!=(e|0)){continue}break}}Wa(U);G[j>>2]=32}Fa=r+1280|0;return g|0}function Jq(a){var 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,A=0,B=0,C=0,D=0,K=0,N=0;d=G[a+60>>2];p=Fa-4112|0;Fa=p;a:{b:{c:{d:{e:{b=G[a+48>>2];if(!b){break e}c=H[b|0];if(!c){break e}if(!Xa(b,32148)){break e}if(!Xa(b,92037)){break e}l=b;f:{while(1){g:{h:{i:{c=c&255;switch(c|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:break f;case 0:break g;case 9:case 10:case 32:break h;default:break i}}if((c|0)!=59){break f}}c=H[l+1|0];l=l+1|0;continue}break}l=G[952412];break a}l=Ic(1,180);if(!l){break b}K=l,N=Lc(d),G[K+28>>2]=N;b=Lc(b);Yb(b,b);w=b;j:{if(H[b|0]!=91){break j}w=b+1|0;c=Va(w);while(1){if((c|0)<=0){break j}d=b+c|0;c=c-1|0;if(H[d|0]!=93){continue}break}E[d|0]=0}c=Ic(Va(w)+1|0,1);Yb(w,c);pb(b);k:{if(H[c|0]!=64){K=l,N=Lc(c),G[K+16>>2]=N;break k}b=Ol(c+1|0);if(!b){break k}K=l,N=Lc(b),G[K+16>>2]=N;pb(b)}pb(c);b=G[l+16>>2];if(!(H[b|0]?b:0)){l=G[952412];break a}b=Lc(0);G[l>>2]=b;w=0;c=Lc(b);if(c){b=Lh(c,3441,p+16|0);pb(c);w=(b|0)!=0}G[l+4>>2]=2;E[p+16|0]=0;l:{b=Fd(35762);m:{if(b){if(H[Za(p+16|0,b)|0]){break m}}b=Lc(G[l>>2]);if(b){Lh(b,26055,p+16|0);pb(b)}if(!H[p+16|0]){break l}}if(Xc(p+16|0,30815)){break l}c=1;G[l+4>>2]=1;break d}c=G[l+4>>2];if((c|0)!=2){break d}if(l){G[l+136>>2]=145;G[l+132>>2]=146;G[l+128>>2]=147;G[l+124>>2]=148;G[l+120>>2]=149;G[l+116>>2]=150;G[l+112>>2]=151;G[l+104>>2]=43322}G[l+68>>2]=2;break c}l=G[952412];break a}G[p>>2]=c;Tb(G[24367],75705,p)}E[p+16|0]=0;b=Fd(33318);n:{if(b){if(H[Za(p+16|0,b)|0]){break n}}b=Lc(G[l>>2]);if(b){Lh(b,4716,p+16|0);pb(b)}if(H[p+16|0]){break n}F[p+20>>1]=H[20720]|H[20721]<<8;G[p+16>>2]=H[20716]|H[20717]<<8|(H[20718]<<16|H[20719]<<24)}K=l,N=(Ql(p+16|0)|0)!=0,G[K+8>>2]=N;E[p+16|0]=0;b=Fd(35058);o:{p:{if(b){c=H[Za(p+16|0,b)|0];if(c){break p}}b=Lc(G[l>>2]);if(b){Lh(b,17540,p+16|0);pb(b)}c=H[p+16|0];if(!c){break o}}q:{if((c<<24>>24)-48>>>0<=9){c=_b(p+16|0);break q}c=1;if(Ql(p+16|0)){break q}c=0;d=0;f=p+16|0;if(!(!f|!H[f|0])){b=Xb(Va(f)+1|0);d=b;e=H[f|0];r:{if(!e){break r}while(1){d=e<<24>>24;if(!((d|0)==32|d-9>>>0<5)){d=b;while(1){E[d|0]=e;d=d+1|0;e=H[f+1|0];f=f+1|0;if(e){continue}break}break r}e=H[f+1|0];f=f+1|0;if(e){continue}break}d=b}E[d|0]=0;f=d-b|0;s:{if(!f){break s}while(1){d=d-1|0;g=E[d|0];if(!((g|0)==32|g-9>>>0<5)){break s}E[d|0]=0;f=f-1|0;if(f){continue}break}}d=H[b|0];if(d){f=b;while(1){d=d<<24>>24;if(d-65>>>0<26){E[f|0]=d-65>>>0<26?d|32:d}d=H[f+1|0];f=f+1|0;if(d){continue}break}}d=1;t:{if(!Xa(b,20716)){break t}if(!Xa(b,13555)){break t}if(!Xa(b,18607)){break t}d=!Xa(b,41974)}pb(b)}if(!d){break o}}G[l+12>>2]=c}G[320796]=G[320796]+1;r=Fa-224|0;Fa=r;G[950220]=l;zl();K=3792640,N=Lc(16977),G[K>>2]=N;b=G[G[950220]+28>>2];u:{v:{if(b){if(!ob(b,41167,3805472)){G[951368]=0;G[951369]=1072693248}if(!ob(b,41142,3805488)){G[951372]=0;G[951373]=0}if(!ob(b,40771,3805480)){G[951370]=0;G[951371]=0}if(!ob(b,40752,3805496)){G[951374]=0;G[951375]=1072693248}if(!ob(b,41229,3805504)){G[951376]=0;G[951377]=0}if(!ob(b,40821,3805512)){break v}break u}G[951370]=0;G[951371]=0;G[951368]=0;G[951369]=1072693248;G[951372]=0;G[951373]=0;G[951376]=0;G[951377]=0;G[951374]=0;G[951375]=1072693248}G[951378]=0;G[951379]=0}k=L[475685];if(!(L[475684]!=1|k!=0|L[475688]!=.5)){G[951376]=0;G[951377]=0}if(!(k!=0|L[475687]!=1|L[475689]!=.5)){G[951378]=0;G[951379]=0}c=G[950220];b=G[c+28>>2];if(!(!b|!H[b|0])){Ce(G[947122]);bi(G[G[950220]+28>>2],256e3);b=rd(G[G[950220]+28>>2]);G[947122]=b;w:{if(!(!b|!(b?G[b+3312>>2]:0))){c=G[947122];x:{if(!G[c+3304>>2]){L[474082]=L[c+760>>3];b=c+768|0;break x}L[474082]=L[c+768>>3];b=c+760|0}L[474083]=L[b>>3];k=L[c+48>>3];k=G[c+3256>>2]?-k:k;break w}G[948166]=0;G[948167]=0;G[948164]=0;G[948165]=0;k=0}L[474081]=k;c=G[950220]}G[945061]=1;G[950218]=0;Cl(G[c+16>>2]);i=Fa-4784|0;Fa=i;y:{z:{A:{B:{C:{if(!H[3780236]){E[3780236]=1;if(!G[945060]){b=ab(65544);G[945060]=b;if(!b){break C}}if(!G[945061]){G[945061]=1}d=G[945057];if(!d){d=G[30060];G[945057]=d}if(!G[945058]){G[945058]=G[29763]}f=G[945062];D:{E:{if(f){h=G[945063];e=G[(h<<2)+f>>2];if(e){break D}g=G[950329];if(g-1>>>0>h>>>0){break E}b=g+8|0;c=ub(f,b<<2);G[945062]=c;if(!c){break A}c=c+(g<<2)|0;G[c>>2]=0;G[c+4>>2]=0;G[c+24>>2]=0;G[c+28>>2]=0;G[c+16>>2]=0;G[c+20>>2]=0;G[c+8>>2]=0;G[c+12>>2]=0;G[950329]=b;d=G[945057];break E}b=ab(4);G[945062]=b;if(!b){break A}G[b>>2]=0;G[950329]=1;G[945063]=0}e=ab(48);if(!e){break z}G[e+12>>2]=16384;b=ab(16386);G[e+4>>2]=b;if(!b){break z}G[e+20>>2]=1;$i(e,d);f=G[945062];h=G[945063];G[f+(h<<2)>>2]=e}G[950324]=G[e+16>>2];b=G[e+8>>2];G[945070]=b;G[945064]=b;G[945057]=G[G[(h<<2)+f>>2]>>2];E[3780260]=H[b|0]}n=G[24367];F:while(1){b=G[945064];E[b|0]=H[3780260];c=G[945060];G[945066]=c+4;e=G[945061];G[c>>2]=e;h=b;G:{H:while(1){q=I[(e<<1)+169696>>1];while(1){f=H[H[h|0]+156960|0];d=f;q=d+(q<<16>>16)|0;if(F[(q<<1)+157216>>1]!=(e|0)){while(1){e=F[(e<<1)+171568>>1];d=(e|0)>=900?H[f+173440|0]:d;f=d&255;q=f+F[(e<<1)+169696>>1]|0;if(I[(q<<1)+157216>>1]!=(e&65535)){continue}break}}c=G[945066];d=c+4|0;G[945066]=d;e=F[(q<<1)+173536>>1];G[c>>2]=e;h=h+1|0;q=I[(e<<1)+169696>>1];if((q|0)!=6150){continue}break}c=b;I:while(1){e=d-4|0;G[945066]=e;d=G[e>>2];f=F[(d<<1)+186016>>1];b=G[945067];J:{while(1){if(!f|F[(d<<1)+186018>>1]<=(f|0)){e=e-4|0;G[945066]=e;h=h-1|0;d=G[e>>2];f=F[(d<<1)+186016>>1];continue}else{K:{q=F[(f<<1)+187824>>1];L:{if(q&16384|b){if((b|0)!=(q|0)){break L}G[945067]=0;q=q&49151;break J}if(!(q&8192)){break K}G[945068]=h;G[945069]=e;b=q&-24577|16384;G[945067]=b}f=f+1|0;continue}}break}G[945069]=e;G[945068]=h}G[945070]=c;G[945071]=h-c;E[3780260]=H[h|0];E[h|0]=0;g=G[945071];if(g>>>0<8192){b=g+1|0;t=b&3;d=0;f=G[945070];e=0;if(g>>>0>=3){o=b&-4;b=0;while(1){E[e+3780288|0]=H[e+f|0];g=e|1;E[g+3780288|0]=H[f+g|0];g=e|2;E[g+3780288|0]=H[f+g|0];g=e|3;E[g+3780288|0]=H[f+g|0];e=e+4|0;b=b+4|0;if((o|0)!=(b|0)){continue}break}}if(t){while(1){E[e+3780288|0]=H[e+f|0];e=e+1|0;d=d+1|0;if((t|0)!=(d|0)){continue}break}}e=q<<16>>16;G[945064]=h;while(1){M:{N:{O:{P:{Q:{R:{S:{T:{U:{V:{W:{switch(e-1|0){case 0:if(!H[3780288]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3780288)+1|0);Yb(3780288,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 1:G[i+684>>2]=0;dj(36360);if(Ld(3780288,i+688|0,i+684|0)){pb(G[948160]);b=Lc(i+688|0);G[948160]=b;Rl(b)}cj();continue F;case 2:G[945061]=7;continue F;case 3:G[945061]=7;continue F;case 4:G[945061]=7;continue F;case 5:if(G[945061]-5>>>0<=1){Wd()}Lb();G[945061]=7;continue F;case 6:G[945061]=1;continue F;case 7:G[945061]=1;continue F;case 9:if(G[945061]-5>>>0<=1){Wd()}Lb();G[945061]=9;G[947120]=G[947120]+1;continue F;case 10:G[947120]=G[947120]+1;continue F;case 11:b=G[947120]-1|0;G[947120]=b;if(b){continue F}G[945061]=1;continue F;case 18:case 19:if(G[945061]-5>>>0<=1){Wd();Lb()}G[945061]=5;Fl();continue F;case 20:X:{if(H[3780288]){G[i+20>>2]=3780288;G[i+16>>2]=21453;Tb(n,69475,i+16|0);break X}G[i>>2]=21453;Tb(n,68751,i)}b=G[945062];Y:{if(!b){break Y}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Y}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Y}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;continue F;case 21:f=0;G[947121]=G[947121]+1;b=G[948160];if(!(!b|!H[b|0])){if(!Xc(b,25125)){jg(1);continue F}f=!Xc(b,16977)<<1}jg(f);continue F;case 22:G[947121]=G[947121]+1;K=Va(3780288)+3780287|0,N=0,E[K|0]=N;jg(1);continue F;case 23:G[947121]=G[947121]+1;K=Va(3780288)+3780287|0,N=0,E[K|0]=N;jg(2);continue F;case 24:b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}if(!b){Z:{if(H[3780288]){G[i+68>>2]=3780288;G[i+64>>2]=22047;Tb(n,69475,i- -64|0);break Z}G[i+48>>2]=22047;Tb(n,68751,i+48|0)}b=G[945062];_:{if(!b){break _}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break _}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break _}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}b=G[947121]+1|0;G[947121]=b;s=oj(3780288);if((b&-2147483647)==1){L[473562]=s;b=G[321386];if(!b|(b|0)==46|(b|0)==100){continue F}b=G[948160];$:{if(!b){break $}if(!Xa(b,25125)){break $}if(!Xa(b,16977)){break $}if(!Ej(b,16917,3)){continue F}if(!Ej(b,16966,3)){continue F}}L[473562]=s*15;continue F}k=L[473562];b=G[947122];e=G[948160];aa:{ba:{if(!e){break ba}if(!Xa(e,25125)){break ba}if(Xa(e,16977)){break aa}}e=0}pf(b,k,s,e,3788504,3788512,3788520);L[i+32>>3]=L[473563];L[i+40>>3]=L[473564];Ya(3788528,4096,19679,i+32|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 25:b=G[947121];g=b+1|0;G[947121]=g;ca:{da:{if((b|0)<2){break da}f=G[948156];switch(f-6|0){case 0:case 7:break da;default:break ca}}b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}if(!b){ea:{if(H[3780288]){G[i+116>>2]=3780288;G[i+112>>2]=22047;Tb(n,69475,i+112|0);break ea}G[i+96>>2]=22047;Tb(n,68751,i+96|0)}b=G[945062];fa:{if(!b){break fa}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break fa}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break fa}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}b=G[947121];s=vb(3780288,0);if((b&-2147483647)==1){L[473562]=s;continue F}k=L[473562];b=G[947122];e=G[948160];ga:{ha:{if(!e){break ha}if(!Xa(e,25125)){break ha}if(Xa(e,16977)){break ga}}e=0}pf(b,k,s,e,3788504,3788512,3788520);L[i+80>>3]=L[473563];L[i+88>>3]=L[473564];Ya(3788528,4096,19679,i+80|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}ia:{b=(f|0)!=7;ja:{if(!b&(g|0)==3|!b&(g|0)==4){break ja}b=(f|0)==8;if(b&(g|0)==3|b&(g|0)==4){break ja}b=(f|0)==9;if(b&(g|0)==3|b&(g|0)==4){break ja}b=(f|0)==10;if(b&(g|0)==3|b&(g|0)==4){break ja}if((f|0)!=11){break ia}}k=vb(3780288,0);L[474079]=k;b=G[948160];ka:{if(!b){break ka}if(!Xa(b,25125)){break ka}if(Xa(b,16977)){k=k+L[474081];L[474079]=k}if(!Xa(b,16977)|!G[G[947122]+3256>>2]){break ka}k=-k;L[474079]=k}L[i+128>>3]=k;Ya(3788528,4096,19682,i+128|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}la:{b=(f|0)==7;ma:{if((f|0)==8&(g|0)==5|(b&(g|0)==5|(g|0)==8&b)){break ma}d=(g|0)==10;if(d&(f|0)==8){break ma}c=(f|0)==9;b=(g|0)==5;if(c&b|c&(g|0)==8){break ma}c=b;b=(f|0)==10;if(c&b){break ma}if(!(b&d)){break la}}k=vb(3780288,0);L[474079]=k;L[i+144>>3]=k;Ya(3788528,4096,19682,i+144|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}na:{if(!(!b|L[474082]==0)){if(L[474083]!=0){break na}}_i(22074)}oa:{switch(G[948156]-2|0){case 0:case 2:k=vb(3780288,0);L[474079]=k;b=G[948160];pa:{if(!b){break pa}if(!Xa(b,25125)){break pa}if(Xa(b,16977)){k=k+L[474081];L[474079]=k}if(!Xa(b,16977)|!G[G[947122]+3256>>2]){break pa}k=-k;L[474079]=k}L[i+176>>3]=k;Ya(3792672,4096,19682,i+176|0);break;default:break oa}}b=G[947121];B=vb(3780288,0);qa:{if((b&-2147483647)==1){y=L[474082];s=vb(3780288,0);k=L[474082];u=-s/k;if(B/y<0){break qa}u=s/k;break qa}y=L[474083];s=vb(3780288,0);k=L[474083];u=-s/k;if(B/y<0){break qa}u=s/k}k=u;L[474079]=k;L[i+160>>3]=k;Ya(3788528,4096,19682,i+160|0);Te(3788528);Tg(L[474079]);continue F;case 26:b=G[947121];g=b+1|0;G[947121]=g;ra:{sa:{if((b|0)<2){break sa}f=G[948156];switch(f-6|0){case 0:case 7:break sa;default:break ra}}b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}if(!b){ta:{if(H[3780288]){G[i+228>>2]=3780288;G[i+224>>2]=22047;Tb(n,69475,i+224|0);break ta}G[i+208>>2]=22047;Tb(n,68751,i+208|0)}b=G[945062];ua:{if(!b){break ua}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break ua}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break ua}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}b=G[947121];s=vb(3780288,0)/.017453292519943295;if((b&-2147483647)==1){L[473562]=s;continue F}k=L[473562];b=G[947122];e=G[948160];va:{wa:{if(!e){break wa}if(!Xa(e,25125)){break wa}if(Xa(e,16977)){break va}}e=0}pf(b,k,s,e,3788504,3788512,3788520);L[i+192>>3]=L[473563];L[i+200>>3]=L[473564];Ya(3788528,4096,19679,i+192|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}xa:{b=(f|0)!=7;ya:{if(!b&(g|0)==3|!b&(g|0)==4){break ya}b=(f|0)==8;if(b&(g|0)==3|b&(g|0)==4){break ya}b=(f|0)==9;if(b&(g|0)==3|b&(g|0)==4){break ya}b=(f|0)==10;if(b&(g|0)==3|b&(g|0)==4){break ya}if((f|0)!=11){break xa}}k=vb(3780288,0)/.017453292519943295;L[474079]=k;b=G[948160];za:{if(!b){break za}if(!Xa(b,25125)){break za}if(Xa(b,16977)){k=k+L[474081];L[474079]=k}if(!Xa(b,16977)|!G[G[947122]+3256>>2]){break za}k=-k;L[474079]=k}L[i+240>>3]=k;Ya(3788528,4096,19682,i+240|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}Aa:{b=(f|0)==7;Ba:{if((f|0)==8&(g|0)==5|(b&(g|0)==5|(g|0)==8&b)){break Ba}d=(g|0)==10;if(d&(f|0)==8){break Ba}c=(f|0)==9;b=(g|0)==5;if(c&b|c&(g|0)==8){break Ba}c=b;b=(f|0)==10;if(c&b){break Ba}if(!(b&d)){break Aa}}k=vb(3780288,0);L[474079]=k;L[i+256>>3]=k;Ya(3788528,4096,19682,i+256|0);if(!H[3788528]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}Ca:{if(!(!b|L[474082]==0)){if(L[474083]!=0){break Ca}}_i(22074)}Da:{switch(G[948156]-2|0){case 0:case 2:k=vb(3780288,0)/.017453292519943295;L[474079]=k;b=G[948160];Ea:{if(!b){break Ea}if(!Xa(b,25125)){break Ea}if(Xa(b,16977)){k=k+L[474081];L[474079]=k}if(!Xa(b,16977)|!G[G[947122]+3256>>2]){break Ea}k=-k;L[474079]=k}L[i+288>>3]=k;Ya(3792672,4096,19682,i+288|0);break;default:break Da}}b=G[947121];B=vb(3780288,0);Fa:{if((b&-2147483647)==1){y=L[474082];s=vb(3780288,0);k=L[474082];u=-s/k;if(B/y<0){break Fa}u=s/k;break Fa}y=L[474083];s=vb(3780288,0);k=L[474083];u=-s/k;if(B/y<0){break Fa}u=s/k}k=u/.017453292519943295;L[474079]=k;L[i+272>>3]=k;Ya(3788528,4096,19682,i+272|0);Te(3788528);Tg(L[474079]);continue F;case 27:b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}Ga:{if(!(!b|L[474082]==0)){if(L[474083]!=0){break Ga}}Ha:{if(H[3780288]){G[i+340>>2]=3780288;G[i+336>>2]=22074;Tb(n,69475,i+336|0);break Ha}G[i+320>>2]=22074;Tb(n,68751,i+320|0)}b=G[945062];Ia:{if(!b){break Ia}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Ia}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Ia}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}b=G[947121]+1|0;G[947121]=b;B=vb(3780288,0);Ja:{if((b&-2147483647)==1){y=L[474082];s=vb(3780288,0);k=L[474082]*60;u=-s/k;if(B/(y*60)<0){break Ja}u=s/k;break Ja}y=L[474083];s=vb(3780288,0);k=L[474083]*60;u=-s/k;if(B/(y*60)<0){break Ja}u=s/k}k=u;L[474079]=k;L[i+304>>3]=k;Ya(3788528,4096,19682,i+304|0);if(H[3788528]){if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}Tg(L[474079]);continue F;case 28:b=G[947122];if(b){b=G[b+3312>>2]}else{b=0}Ka:{if(!(!b|L[474082]==0)){if(L[474083]!=0){break Ka}}La:{if(H[3780288]){G[i+388>>2]=3780288;G[i+384>>2]=22074;Tb(n,69475,i+384|0);break La}G[i+368>>2]=22074;Tb(n,68751,i+368|0)}b=G[945062];Ma:{if(!b){break Ma}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Ma}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Ma}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}b=G[947121]+1|0;G[947121]=b;B=vb(3780288,0);Na:{if((b&-2147483647)==1){y=L[474082];s=vb(3780288,0);k=L[474082]*3600;u=-s/k;if(B/(y*3600)<0){break Na}u=s/k;break Na}y=L[474083];s=vb(3780288,0);k=L[474083]*3600;u=-s/k;if(B/(y*3600)<0){break Na}u=s/k}k=u;L[474079]=k;L[i+352>>3]=k;Ya(3788528,4096,19682,i+352|0);if(H[3788528]){if(!G[950330]){Lb()}c=Xb(Va(3788528)+1|0);Yb(3788528,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}Tg(L[474079]);continue F;case 29:f=nc(jb(3780288,61)+1|0,0,10);if((f|0)<=0){Oa:{if(H[3780288]){G[i+420>>2]=3780288;G[i+416>>2]=10555;Tb(n,69475,i+416|0);break Oa}G[i+400>>2]=10555;Tb(n,68751,i+400|0)}b=G[945062];Pa:{if(!b){break Pa}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Pa}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Pa}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;continue F}Qa:{Ra:{switch(G[948156]-1|0){case 1:G[947121]=G[947121]-2;break Qa;case 2:G[947121]=G[947121]-1;break Qa;case 3:G[947121]=G[947121]-2;break Qa;case 0:case 10:break Qa;default:break Ra}}Sa:{if(H[3780288]){G[i+580>>2]=3780288;G[i+576>>2]=67700;Tb(n,69475,i+576|0);break Sa}G[i+560>>2]=67700;Tb(n,68751,i+560|0)}b=G[945062];Ta:{if(!b){break Ta}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Ta}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Ta}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}G[i+544>>2]=f;Ya(i+688|0,4096,30101,i+544|0);if(H[i+688|0]){if(!G[950330]){Lb()}b=i+688|0;c=Xb(Va(b)+1|0);Yb(b,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}c=G[(G[950332]+(G[950330]<<2)|0)-4>>2];b=G[c+28>>2];if(b){d=Lc(b+G[c+24>>2]|0);if(d){c=G[950330];b=G[(G[950332]+(c<<2)|0)-4>>2];E[G[b+24>>2]+G[b+28>>2]|0]=0;if(!c){Lb()}c=Xb(2);Yb(16232,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);if(H[d|0]){if(!G[950330]){Lb()}c=Xb(Va(d)+1|0);Yb(d,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}G[i+528>>2]=f;c=i+688|0;Ya(c,4096,66542,i+528|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+32|0,b+36|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+40|0,b+44|0);E[3805456]=1;Wa(d)}b=G[G[(G[950332]+(G[950330]<<2)|0)-4>>2]+52>>2];if(b){pb(b);b=(G[950332]+(G[950330]<<2)|0)-4|0;G[G[b>>2]+52>>2]=0;G[G[b>>2]+56>>2]=0}Ua:{Va:{b=G[948156];if(b-1>>>0>=4){if((b|0)!=11){break Va}s=(L[475681]-L[475680])/+(f|0);e=1;while(1){k=L[475680];L[i+520>>3]=+(e|0)*s+k;L[i+512>>3]=k+ +(e-1|0)*s;c=i+688|0;Ya(c,4096,19679,i+512|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(35975,b+52|0,b+56|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+52|0,b+56|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(92037,b+52|0,b+56|0);b=(e|0)==(f|0);e=e+1|0;if(!b){continue}break}break Ua}s=(L[475681]-L[475680])/+(f|0);e=1;while(1){k=L[475680];L[i+504>>3]=+(e|0)*s+k;L[i+496>>3]=k+ +(e-1|0)*s;b=i+688|0;Ya(b,4096,19679,i+496|0);c=b;b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+52|0,b+56|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(35974,b+52|0,b+56|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(92037,b+52|0,b+56|0);b=(e|0)==(f|0);e=e+1|0;if(!b){continue}break}break Ua}Wa:{if(H[3780288]){G[i+484>>2]=3780288;G[i+480>>2]=67700;Tb(n,69475,i+480|0);break Wa}G[i+464>>2]=67700;Tb(n,68751,i+464|0)}b=G[945062];Xa:{if(!b){break Xa}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Xa}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Xa}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}e=G[950330];if(!e){Lb();e=G[950330]}b=G[(G[950332]+(e<<2)|0)-4>>2];G[b+4>>2]=G[b+4>>2]|32;continue F}Ya:{if(H[3780288]){G[i+452>>2]=3780288;G[i+448>>2]=10582;Tb(n,69475,i+448|0);break Ya}G[i+432>>2]=10582;Tb(n,68751,i+432|0)}b=G[945062];Za:{if(!b){break Za}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break Za}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break Za}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;continue F;case 30:e=0;b=G[947121];if(!El(b)){Wd();Lb();G[945061]=1;E[h|0]=H[3780260];G[945070]=c;G[945064]=c;G[945071]=0;E[3780260]=H[c|0];E[c|0]=0;d=G[945071];if(d>>>0>=8192){break B}b=d+1|0;f=b&3;g=G[945070];if(d>>>0>=3){d=b&-4;h=0;while(1){E[e+3780288|0]=H[e+g|0];b=e|1;E[b+3780288|0]=H[b+g|0];b=e|2;E[b+3780288|0]=H[b+g|0];b=e|3;E[b+3780288|0]=H[b+g|0];e=e+4|0;h=h+4|0;if((d|0)!=(h|0)){continue}break}}h=0;if(f){while(1){E[e+3780288|0]=H[e+g|0];e=e+1|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}G[945064]=c;continue F}G[947121]=b+1;b=G[948160];if(!(!b|!H[b|0])){if(!Xc(b,25125)){jg(1);continue F}e=!Xc(b,16977)<<1}jg(e);continue F;case 31:Wd();Lb();e=0;G[945061]=1;E[h|0]=H[3780260];G[945070]=c;G[945064]=c;G[945071]=0;E[3780260]=H[c|0];E[c|0]=0;d=G[945071];if(d>>>0>=8192){break B}b=d+1|0;f=b&3;g=G[945070];if(d>>>0>=3){d=b&-4;h=0;while(1){E[e+3780288|0]=H[e+g|0];b=e|1;E[b+3780288|0]=H[b+g|0];b=e|2;E[b+3780288|0]=H[b+g|0];b=e|3;E[b+3780288|0]=H[b+g|0];e=e+4|0;h=h+4|0;if((d|0)!=(h|0)){continue}break}}h=0;if(f){while(1){E[e+3780288|0]=H[e+g|0];e=e+1|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}G[945064]=c;continue F;case 33:c=G[(G[950332]+(G[950330]<<2)|0)-4>>2];b=jb(3780288,123);K=c,N=_b(b?b+1|0:3780288),G[K+48>>2]=N;if(G[950216]){continue F}Wd();G[945061]=1;continue F;case 34:G[950216]=G[950216]+1;continue F;case 35:c=G[(G[950332]+(G[950330]<<2)|0)-4>>2];b=jb(3780289,123);K=c,N=_b(b?b+1|0:3780289),G[K+48>>2]=N;b=G[950216];if(b){b=b-1|0;G[950216]=b;if(b){continue F}Wd();G[945061]=1;continue F}Wd();G[945061]=1;G[950217]=G[950217]-1;Lb();if(!G[950330]){Lb()}c=Xb(2);Yb(64244,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);Lb();continue F;case 36:b=G[950216];if(b){b=b-1|0;G[950216]=b;if(b){continue F}Wd();G[945061]=1;continue F}Wd();G[945061]=1;G[950217]=G[950217]-1;Lb();if(!G[950330]){Lb()}c=Xb(2);Yb(64244,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);Lb();continue F;case 37:Wd();Dl();G[945061]=1;continue F;case 38:Wd();Lb();G[945061]=1;continue F;case 39:e=0;E[h|0]=H[3780260];G[945070]=c;f=h-1|0;G[945064]=f;G[945071]=f-c;E[3780260]=H[f|0];E[f|0]=0;c=G[945071];if(c>>>0>=8192){break B}b=c+1|0;d=b&3;g=G[945070];if(c>>>0>=3){c=b&-4;h=0;while(1){E[e+3780288|0]=H[e+g|0];b=e|1;E[b+3780288|0]=H[b+g|0];b=e|2;E[b+3780288|0]=H[b+g|0];b=e|3;E[b+3780288|0]=H[b+g|0];e=e+4|0;h=h+4|0;if((c|0)!=(h|0)){continue}break}}h=0;if(d){while(1){E[e+3780288|0]=H[e+g|0];e=e+1|0;h=h+1|0;if((d|0)!=(h|0)){continue}break}}G[945064]=f;b=G[945061];G[945061]=3;G[950218]=(b-1|0)/2;G[947121]=0;G[950219]=0;e=G[950330];if(!e){Lb();e=G[950330]}b=G[(G[950332]+(e<<2)|0)-4>>2];G[b+4>>2]=G[b+4>>2]|8;c=G[950220];if(c){b=G[c+144>>2];if(b){b=Ja[b|0](c,3780288)|0}else{b=3780288}}else{b=0}Te(b);G[950221]=G[950221]+1;continue F;case 40:if(!G[950330]){Lb()}c=Xb(2);Yb(49008,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 41:G[950219]=G[950219]+1;if(!G[950330]){Lb()}c=Xb(2);Yb(64753,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 42:b=G[950219]-1|0;G[950219]=b;if(b){if(!G[950330]){Lb()}c=Xb(2);Yb(64244,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F}G[945061]=G[950218]<<1|1;c=G[950220];if(c){b=G[c+148>>2];if(b){b=Ja[b|0](c,64244)|0}else{b=64244}}else{b=0}Te(b);continue F;case 43:if(G[945061]-5>>>0<=1){Wd();Lb()}if(G[950222]>=100){_a:{if(H[3780288]){G[i+676>>2]=3780288;G[i+672>>2]=3405;Tb(n,69475,i+672|0);break _a}G[i+656>>2]=3405;Tb(n,68751,i+656|0)}b=G[945062];$a:{if(!b){break $a}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break $a}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break $a}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}g=Ol(3780289);if(!g){ab:{if(H[3780288]){G[i+644>>2]=3780288;G[i+640>>2]=23075;Tb(n,69475,i+640|0);break ab}G[i+624>>2]=23075;Tb(n,68751,i+624|0)}b=G[945062];bb:{if(!b){break bb}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break bb}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break bb}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;break G}if(!H[g|0]){break G}f=0;b=G[945062];if(b){f=G[b+(G[945063]<<2)>>2]}b=G[950222];G[950222]=b+1;G[(b<<2)+3800896>>2]=f;Lb();if(!G[950330]){Lb()}c=Xb(2);Yb(64753,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);Cl(g);pb(g);continue F;case 45:G[947121]=G[947121]+1;if(!H[3780288]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3780288)+1|0);Yb(3780288,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 46:Bl(i+688|0,4095);G[947121]=G[947121]+1;if(!H[i+688|0]){continue F}if(!G[950330]){Lb()}b=i+688|0;c=Xb(Va(b)+1|0);Yb(b,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 47:Dl();if(G[945061]-3>>>0<2){continue F}G[945061]=1;continue F;case 48:G[950217]=G[950217]+1;Lb();if(H[3780288]){if(!G[950330]){Lb()}c=Xb(Va(3780288)+1|0);Yb(3780288,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}Lb();continue F;case 49:G[950217]=G[950217]-1;Lb();if(H[3780288]){if(!G[950330]){Lb()}c=Xb(Va(3780288)+1|0);Yb(3780288,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c)}Lb();continue F;case 50:Lb();G[945061]=1;continue F;case 51:if(!H[3780288]){continue F}if(!G[950330]){Lb()}c=Xb(Va(3780288)+1|0);Yb(3780288,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);continue F;case 54:case 55:case 56:case 57:case 58:b=G[950222];G[950222]=b-1;if((b|0)<=0){b=G[945062];cb:{if(!b){break cb}b=b+(G[945063]<<2)|0;c=G[b>>2];if(!c){break cb}G[b>>2]=0;if(G[c+20>>2]){Wa(G[c+4>>2])}Wa(c)}Fa=i+4784|0;break y}if(!G[950330]){Lb()}c=Xb(2);Yb(64244,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c,b+24|0,b+12|0);pb(c);Lb();b=G[945062];db:{if(!b){break db}b=b+(G[945063]<<2)|0;c=G[b>>2];if(!c){break db}G[b>>2]=0;if(G[c+20>>2]){Wa(G[c+4>>2])}Wa(c)}Al(G[(G[950222]<<2)+3800896>>2]);continue F;case 52:hb(3780288,G[945071],1,G[945058]);continue F;case 53:E[h|0]=H[3780260];z=G[945062];A=G[945063];t=z+(A<<2)|0;d=G[t>>2];eb:{if(G[d+44>>2]){q=G[950324];break eb}q=G[d+16>>2];G[950324]=q;G[d>>2]=G[945057];d=G[t>>2];G[d+44>>2]=1}D=G[945064];e=G[d+4>>2];b=q+e|0;if(D>>>0<=b>>>0){g=G[945060];b=g+4|0;G[945066]=b;c=G[945070];d=(f^-1)+h|0;h=c+d|0;G[945064]=h;e=G[945061];G[g>>2]=e;g=c;if((d|0)>0){while(1){f=1;d=H[g|0];if(d){f=H[d+156960|0]}d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(F[(q<<1)+157216>>1]!=(e|0)){while(1){e=F[(e<<1)+171568>>1];f=(e|0)>=900?H[d+173440|0]:f;d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(I[(q<<1)+157216>>1]!=(e&65535)){continue}break}}e=F[(q<<1)+173536>>1];G[b>>2]=e;b=b+4|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}G[945066]=b}f=F[(e<<1)+169696>>1]+1|0;if(F[(f<<1)+157216>>1]!=(e|0)){while(1){d=I[(e<<1)+171568>>1];e=d<<16>>16;f=F[(e<<1)+169696>>1]+1|0;if(I[(f<<1)+157216>>1]!=(d|0)){continue}break}}d=I[(f<<1)+173536>>1];if((d|0)==899){break O}G[945066]=b+4;e=d<<16>>16;G[b>>2]=e;if(!d){break O}h=h+1|0;G[945064]=h;b=c;continue H}if(D>>>0>b+1>>>0){break V}b=G[945070];if(!G[d+40>>2]){if((D-b|0)!=1){break P}break M}x=D+(b^-1)|0;if((x|0)>0){o=x&7;fb:{if((D-b|0)-2>>>0<7){d=b;break fb}g=x&-8;q=0;d=b;while(1){E[e|0]=H[d|0];E[e+1|0]=H[d+1|0];E[e+2|0]=H[d+2|0];E[e+3|0]=H[d+3|0];E[e+4|0]=H[d+4|0];E[e+5|0]=H[d+5|0];E[e+6|0]=H[d+6|0];E[e+7|0]=H[d+7|0];e=e+8|0;d=d+8|0;q=q+8|0;if((g|0)!=(q|0)){continue}break}}q=0;if(o){while(1){E[e|0]=H[d|0];e=e+1|0;d=d+1|0;q=q+1|0;if((o|0)!=(q|0)){continue}break}}d=G[t>>2]}if(G[d+44>>2]==2){G[950324]=0;break S}b=G[d+12>>2]+(b-D|0)|0;if(!b){break U}b=b>>>0<8192?b:8192;e=0;gb:{hb:{if(G[d+24>>2]){ib:{while(1){jb:{g=en(G[945057]);d=g+1|0;switch(d|0){case 0:case 11:break ib;default:break jb}}E[(x+G[G[G[945062]+(G[945063]<<2)>>2]+4>>2]|0)+e|0]=g;e=e+1|0;if((b|0)!=(e|0)){continue}break}e=b}kb:{switch(d|0){case 11:break hb;case 0:break kb;default:break gb}}b=G[945057];lb:{if(G[b+76>>2]<0){b=G[b>>2];break lb}b=G[b>>2]}if(!(b>>>5&1)){break gb}qd(29320);W()}g=0;G[48624]=0;e=zc(x+G[d+4>>2]|0,1,b,G[945057]);G[950324]=e;if(!e){while(1){e=G[945057];mb:{if(G[e+76>>2]<0){d=G[e>>2];break mb}d=G[e>>2]}if(!(d>>>5&1)){z=G[945062];A=G[945063];d=G[z+(A<<2)>>2];break S}if(G[48624]!=27){break T}G[48624]=0;G[e>>2]=G[e>>2]&-49;e=zc(x+G[G[G[945062]+(G[945063]<<2)>>2]+4>>2]|0,1,b,G[945057]);G[950324]=e;if(!e){continue}break}}z=G[945062];A=G[945063];d=G[z+(A<<2)>>2];G[d+16>>2]=e;break Q}E[(x+G[G[G[945062]+(G[945063]<<2)>>2]+4>>2]|0)+e|0]=10;e=e+1|0}g=0;G[950324]=e;z=G[945062];A=G[945063];d=G[z+(A<<2)>>2];G[d+16>>2]=e;if(e){break Q}break R;case 8:case 12:case 13:case 14:case 15:case 16:case 17:case 32:case 44:continue F;default:break W}}qd(26483);W()}qd(29150);W()}qd(33408);W()}qd(29320);W()}G[d+16>>2]=0}if(!x){e=G[945057];o=G[945062];nb:{ob:{if(o){d=G[945063];b=G[o+(d<<2)>>2];if(b){break nb}g=G[950329];if(d>>>0>>0){break ob}b=g+8|0;d=ub(o,b<<2);G[945062]=d;if(!d){break A}d=d+(g<<2)|0;G[d>>2]=0;G[d+4>>2]=0;G[d+24>>2]=0;G[d+28>>2]=0;G[d+16>>2]=0;G[d+20>>2]=0;G[d+8>>2]=0;G[d+12>>2]=0;G[950329]=b;break ob}b=ab(4);G[945062]=b;if(!b){break A}G[b>>2]=0;G[950329]=1;G[945063]=0}g=G[945057];b=ab(48);if(!b){break z}G[b+12>>2]=16384;d=ab(16386);G[b+4>>2]=d;if(!d){break z}G[b+20>>2]=1;$i(b,g);G[G[945062]+(G[945063]<<2)>>2]=b}$i(b,e);d=G[945062]+(G[945063]<<2)|0;b=G[d>>2];G[950324]=G[b+16>>2];b=G[b+8>>2];G[945064]=b;G[945070]=b;G[945057]=G[G[d>>2]>>2];E[3780260]=H[b|0];z=G[945062];A=G[945063];d=G[z+(A<<2)>>2];e=G[950324];g=1;break Q}g=2;G[d+44>>2]=2;e=0}t=(A<<2)+z|0;o=e+x|0;pb:{if(o>>>0<=J[d+12>>2]){e=G[d+4>>2];break pb}b=G[d+4>>2];d=o+(e>>>1|0)|0;b=ub(b,d);G[G[t>>2]+4>>2]=b;b=G[t>>2];e=G[b+4>>2];if(!e){break N}G[b+12>>2]=d-2}G[950324]=o;E[e+o|0]=0;E[(o+G[G[t>>2]+4>>2]|0)+1|0]=0;b=G[G[t>>2]+4>>2];G[945070]=b;if((g|0)==1){break M}qb:{switch(g|0){case 0:c=G[945060];g=c+4|0;G[945066]=g;d=(f^-1)+h|0;h=d+b|0;G[945064]=h;e=G[945061];G[c>>2]=e;c=b;if((d|0)<=0){continue H}while(1){f=1;d=H[c|0];if(d){f=H[d+156960|0]}d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(F[(q<<1)+157216>>1]!=(e|0)){while(1){e=F[(e<<1)+171568>>1];f=(e|0)>=900?H[d+173440|0]:f;d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(I[(q<<1)+157216>>1]!=(e&65535)){continue}break}}e=F[(q<<1)+173536>>1];G[g>>2]=e;g=g+4|0;c=c+1|0;if((h|0)!=(c|0)){continue}break};G[945066]=g;continue H;case 2:break qb;default:continue F}}e=G[G[G[945062]+(G[945063]<<2)>>2]+4>>2];q=G[950324]}h=e+q|0;G[945064]=h;c=G[945060];g=c+4|0;G[945066]=g;e=G[945061];G[c>>2]=e;if(b>>>0>=h>>>0){c=b;break O}c=b;while(1){f=1;d=H[c|0];if(d){f=H[d+156960|0]}d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(F[(q<<1)+157216>>1]!=(e|0)){while(1){e=F[(e<<1)+171568>>1];f=(e|0)>=900?H[d+173440|0]:f;d=f&255;q=d+F[(e<<1)+169696>>1]|0;if(I[(q<<1)+157216>>1]!=(e&65535)){continue}break}}e=F[(q<<1)+173536>>1];G[g>>2]=e;g=g+4|0;c=c+1|0;if((h|0)!=(c|0)){continue}break}G[945066]=g;c=b}d=G[945066];continue I}qd(63819);W()}G[945064]=b;e=((G[945061]-1|0)/2|0)+55|0;f=b;continue}}break}break}break B}pb(g);rb:{if(H[3780288]){G[i+612>>2]=3780288;G[i+608>>2]=2809;Tb(n,69475,i+608|0);break rb}G[i+592>>2]=2809;Tb(n,68751,i+592|0)}b=G[945062];sb:{if(!b){break sb}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break sb}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break sb}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;continue}}qd(63671);W()}qd(33004);W()}qd(64041);W()}qd(63953);W()}c=-1;if(!H[3801300]){d=G[950330];if(!(!G[G[950220]+12>>2]|(d|0)<=0)){f=G[24367];c=0;while(1){b=G[G[950332]+(c<<2)>>2];d=G[b>>2];b=G[b+24>>2];tb:{if(b){G[r+212>>2]=b;G[r+208>>2]=d;_a(f,69251,r+208|0);break tb}G[r+196>>2]=d;G[r+192>>2]=c;_a(f,68424,r+192|0)}d=G[950330];c=c+1|0;if((d|0)>(c|0)){continue}break}}ub:{vb:{wb:{if((d|0)<=0){f=0;G[950328]=0;G[951383]=0;break wb}e=G[950332];o=G[24367];f=0;b=0;c=0;while(1){g=c<<2;h=G[g+e>>2];if(!(!h|!G[h+24>>2])){f=G[h+4>>2];if((f&6)==2){xb:{if(H[3780288]){G[r+180>>2]=3780288;G[r+176>>2]=53772;Tb(o,69475,r+176|0);break xb}G[r+160>>2]=53772;Tb(o,68751,r+160|0)}d=G[945062];yb:{if(!d){break yb}h=d+(G[945063]<<2)|0;d=G[h>>2];if(!d){break yb}G[d+16>>2]=0;E[G[d+4>>2]]=0;E[G[d+4>>2]+1|0]=0;G[d+44>>2]=0;G[d+28>>2]=1;e=G[d+4>>2];G[d+8>>2]=e;if((d|0)!=G[h>>2]){break yb}d=G[d+16>>2];G[945064]=e;G[950324]=d;G[945070]=e;G[945057]=G[G[h>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}if((f&5)==5){zb:{if(H[3780288]){G[r+148>>2]=3780288;G[r+144>>2]=62372;Tb(o,69475,r+144|0);break zb}G[r+128>>2]=62372;Tb(o,68751,r+128|0)}d=G[945062];Ab:{if(!d){break Ab}h=d+(G[945063]<<2)|0;d=G[h>>2];if(!d){break Ab}G[d+16>>2]=0;E[G[d+4>>2]]=0;E[G[d+4>>2]+1|0]=0;G[d+44>>2]=0;G[d+28>>2]=1;e=G[d+4>>2];G[d+8>>2]=e;if((d|0)!=G[h>>2]){break Ab}d=G[d+16>>2];G[945064]=e;G[950324]=d;G[945070]=e;G[945057]=G[G[h>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}if((f&9)==9){Bb:{if(H[3780288]){G[r+116>>2]=3780288;G[r+112>>2]=62307;Tb(o,69475,r+112|0);break Bb}G[r+96>>2]=62307;Tb(o,68751,r+96|0)}d=G[945062];Cb:{if(!d){break Cb}h=d+(G[945063]<<2)|0;d=G[h>>2];if(!d){break Cb}G[d+16>>2]=0;E[G[d+4>>2]]=0;E[G[d+4>>2]+1|0]=0;G[d+44>>2]=0;G[d+28>>2]=1;e=G[d+4>>2];G[d+8>>2]=e;if((d|0)!=G[h>>2]){break Cb}d=G[d+16>>2];G[945064]=e;G[950324]=d;G[945070]=e;G[945057]=G[G[h>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}e=G[950332];d=G[G[g+e>>2]+4>>2];v=(d&1)+v|0;b=(d>>>1&1)+b|0;m=(d>>>2&1)+m|0;d=G[950330]}c=c+1|0;if((c|0)<(d|0)){continue}break}if(!(!v|(b|m))){F[1890146]=H[26857]|H[26858]<<8;G[945072]=H[26853]|H[26854]<<8|(H[26855]<<16|H[26856]<<24);Fl();Wd();d=G[950330]}G[950328]=0;G[951383]=0;if((d|0)>0){break vb}}m=G[950332];break ub}m=G[950332];c=0;while(1){h=c<<2;g=G[h+m>>2];Db:{if(!g){break Db}b=G[g+24>>2];if(!b){break Db}if(Zi(c,0)){E[3805528]=0}E[3805536]=0;b=Jh(b,152,g);pb(G[G[h+G[950332]>>2]+24>>2]);m=G[950332];G[G[h+m>>2]+24>>2]=b;d=G[950330]}c=c+1|0;if((c|0)<(d|0)){continue}break}}oe(m,d,4,153);b=0;if(!(!G[G[950220]+12>>2]|G[950330]<=0)){g=G[24367];c=0;while(1){d=G[G[950332]+(c<<2)>>2];m=G[d>>2];d=G[d+24>>2];Eb:{if(d){G[r+84>>2]=d;G[r+80>>2]=m;_a(g,69253,r+80|0);break Eb}G[r+68>>2]=m;G[r+64>>2]=c;_a(g,68426,r- -64|0)}c=c+1|0;if((c|0)0){c=0;while(1){Gb:{Hb:{Ib:{d=G[G[950332]+(c<<2)>>2];if(!d){break Ib}while(1){h=G[d+24>>2];if(!h){break Ib}g=G[d+4>>2];if(!g){Bb(h,3801304,3805520);d=G[950326];m=Va(d)+d|0;d=m-2|0;if(!(H[d|0]!=40|H[m-1|0]!=41)){E[d|0]=0}c=c+1|0;m=G[950330];if((c|0)>=(m|0)){break Gb}d=G[G[950332]+(c<<2)>>2];if(!d){break Ib}continue}break}if(Zi(c,0)){E[3805528]=0}E[3805536]=1;o=Jh(h,152,d);Jb:{if(Zi(c,o)){m=0;f=Va(G[950326]);d=f-1|0;Kb:{if((d|0)<0){break Kb}while(1){h=G[950326]+d|0;if(H[h|0]!=40){break Kb}E[h|0]=0;d=d-1|0;m=m+1|0;if((f|0)!=(m|0)){continue}break}m=f}d=b&4;h=g&4;Lb:{if(!(!d|!h)){Bb(1782,3801304,3805520);break Lb}f=g&1;if(!(!d|!f)){if((e|0)>0){Bb(64244,3801304,3805520);e=e-1|0}Mb:{if(!G[G[950220]+8>>2]){d=65326;break Mb}d=1782;if((e|0)<=0){break Mb}Bb(64244,3801304,3805520);e=e-1|0}Bb(d,3801304,3805520);Bb(64753,3801304,3805520);e=e+1|0;break Lb}b=b&1;if(!(!h|(b&f|!b))){if(!(!G[G[950220]+8>>2]|(e|0)<=0)){Bb(64244,3801304,3805520);e=e-1|0}Bb(65326,3801304,3805520);Bb(64753,3801304,3805520);if(!G[G[950220]+8>>2]){e=e+1|0;break Lb}Bb(64753,3801304,3805520);e=e+2|0;break Lb}Bb(65326,3801304,3805520)}b=0;if(!m){break Jb}while(1){t=G[950326];d=0;Nb:{if(!t){break Nb}d=0;if(!H[t|0]){break Nb}d=Va(t)}f=G[951380];if((f|0)<=(d+2|0)){i=f^-1;h=d+3|0;f=f+1024|0;f=(i+((f|0)<(h|0)?h:f)&-1024)+f|0;G[951380]=f}Ob:{if(!d){d=Ic(f,1);break Ob}d=lf(t,f)}G[950326]=d;d=Va(d)+d|0;E[d|0]=40;E[d+1|0]=0;b=b+1|0;if((m|0)!=(b|0)){continue}break}break Jb}if(c|!G[G[950220]+8>>2]){break Jb}Bb(64752,3801304,3805520);e=e+2|0}Bb(o,3801304,3805520);pb(o);b=G[G[G[950332]+(c<<2)>>2]+52>>2];if(b){b=b+(H[b|0]==44)|0}else{b=85390}Bb(b,3801308,3805524);b=c+1|0;m=G[950330];Pb:{if((b|0)>=(m|0)){break Pb}f=G[950332];v=G[f+(b<<2)>>2];if((g|0)!=G[v+4>>2]){break Pb}o=g&4?1782:65326;while(1){d=b;h=(c|0)<0;Qb:{if(h){break Qb}while(1){Rb:{c=d;d=c-1|0;m=G[(d<<2)+f>>2];Sb:{if(!m){break Sb}m=G[m+24>>2];if(!m){break Sb}if(!Xa(m,64753)){break Sb}if(Xa(m,64244)){break Rb}}if(c>>>0>1){continue}break Qb}break}d=E[(Va(m)+m|0)-1|0];c=d-33|0;if((1<>>0<=29:0)|(d|0)==124){break Qb}E[3805528]=0}t=Jh(G[v+24>>2],152,v);Tb:{Ub:{Vb:{if(!t){break Vb}d=E[t|0];if(!d){break Vb}c=d-33|0;if((d|0)==124|(1<>>0<=29:0)){break Ub}}Wb:{if(h){break Wb}m=G[950332];c=b;while(1){Xb:{d=c;c=c-1|0;f=G[m+(c<<2)>>2];Yb:{if(!f){break Yb}f=G[f+24>>2];if(!f){break Yb}if(!Xa(f,64753)){break Yb}if(Xa(f,64244)){break Xb}}if(d>>>0>1){continue}break Wb}break}d=E[(Va(f)+f|0)-1|0];c=d-33|0;if((1<>>0<=29:0)|(d|0)==124){break Wb}f=0;d=Va(G[950326]);c=d-1|0;if((c|0)<0){Bb(o,3801304,3805520);break Wb}Zb:{while(1){m=G[950326]+c|0;if(H[m|0]!=40){break Zb}E[m|0]=0;c=c-1|0;f=f+1|0;if((d|0)!=(f|0)){continue}break}f=d}Bb(o,3801304,3805520);v=0;if(!f){break Wb}while(1){h=G[950326];c=0;_b:{if(!h){break _b}c=0;if(!H[h|0]){break _b}c=Va(h)}d=G[951380];if((d|0)<=(c+2|0)){i=d^-1;m=c+3|0;d=d+1024|0;d=(i+((d|0)<(m|0)?m:d)&-1024)+d|0;G[951380]=d}$b:{if(!c){c=Ic(d,1);break $b}c=lf(h,d)}G[950326]=c;c=Va(c)+c|0;E[c|0]=40;E[c+1|0]=0;v=v+1|0;if((v|0)!=(f|0)){continue}break}}if(!t|!H[t|0]){break Tb}}d=0;f=Va(t);m=G[950326];if(!(!m|!H[m|0])){d=Va(m)}c=G[951380];f=d+f|0;if((c|0)<=(f+1|0)){h=c^-1;f=f+2|0;c=c+1024|0;c=(h+((c|0)<(f|0)?f:c)&-1024)+c|0;G[951380]=c}ac:{if(!d){c=Ic(c,1);break ac}c=lf(m,c)}G[950326]=c;Gb(c,t)}pb(t);c=G[G[G[950332]+(b<<2)>>2]+52>>2];if(c){c=c+(H[c|0]==44)|0}else{c=85390}Bb(c,3801308,3805524);m=G[950330];d=b+1|0;if((m|0)>(d|0)){c=b;f=G[950332];b=d;v=G[f+(b<<2)>>2];if((g|0)==G[v+4>>2]){continue}}break}b=d}c=b;b=g;break Hb}c=c+1|0;b=f}f=b;if((c|0)<(m|0)){continue}}break}if(!(!G[G[950220]+8>>2]|!(b&1))){Bb(41692,3801304,3805520)}if(!e){break Fb}}while(1){Bb(64244,3801304,3805520);e=e-1|0;if(e){continue}break}}m=0;d=G[950326];b=Va(d);bc:{cc:{if((b|0)>0){h=b&1;dc:{if((b|0)==1){f=0;c=0;break dc}g=b&-2;f=0;c=0;e=0;while(1){b=H[c+d|0];f=(((b|0)==40)+f|0)-((b|0)==41)|0;b=H[(c|1)+d|0];f=(f+((b|0)==40)|0)-((b|0)==41)|0;c=c+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(h){b=H[c+d|0];f=(((b|0)==40)+f|0)-((b|0)==41)|0}if(!f){break cc}b=G[24367];if(G[G[950220]+12>>2]){G[r+52>>2]=d;G[r+48>>2]=f;_a(b,69632,r+48|0)}ec:{if(H[3780288]){G[r+36>>2]=3780288;G[r+32>>2]=7502;Tb(b,69475,r+32|0);break ec}G[r+16>>2]=7502;Tb(b,68751,r+16|0)}b=G[945062];fc:{if(!b){break fc}c=b+(G[945063]<<2)|0;b=G[c>>2];if(!b){break fc}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[c>>2]){break fc}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[c>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1;d=G[950326]}if(!d){break bc}}if(Xa(d,64156)){m=d;break bc}pb(d);G[950326]=0}d=0;if(G[G[950220]+12>>2]){G[r>>2]=m;_a(G[24367],69376,r);m=G[950326]}K=l,N=Lc(m),G[K+160>>2]=N;K=l,N=Lc(G[950327]),G[K+176>>2]=N;G[l+164>>2]=G[950221];G[l+172>>2]=G[950328];h=G[950330];gc:{if((h|0)<=0){break gc}g=G[950332];c=0;if((h|0)!=1){m=h&-2;e=0;while(1){f=c<<2;b=G[f+g>>2];if(H[b+4|0]&4){d=G[b+20>>2]+d|0}b=G[g+(f|4)>>2];if(H[b+4|0]&4){d=G[b+20>>2]+d|0}c=c+2|0;e=e+2|0;if((m|0)!=(e|0)){continue}break}}if(!(h&1)){break gc}b=G[g+(c<<2)>>2];if(!(H[b+4|0]&4)){break gc}d=G[b+20>>2]+d|0}G[l+168>>2]=d;zl();b=G[945062];if(b){d=G[945063];c=(d<<2)+b|0;f=G[c>>2];if(f){G[c>>2]=0;if(G[f+20>>2]){Wa(G[f+4>>2]);d=G[945063];b=G[945062]}Wa(f);G[(d<<2)+b>>2]=0}}else{b=0}Wa(b);Wa(G[945060]);G[945063]=0;G[945062]=0;G[950329]=0;G[945064]=0;E[3780236]=0;G[945061]=0;G[945060]=0;G[945066]=0;G[945057]=0;G[945058]=0;c=G[l+172>>2]}Fa=r+224|0;hc:{ic:{switch(c+1|0){case 1:Hh(l);l=G[952412];break a;case 0:break hc;default:break ic}}if(w){break a}c=0;jc:{if(!l){break jc}if(G[l+12>>2]>=2){hb(70217,19,1,G[24367])}b=G[l+112>>2];c=1;if(!b){break jc}c=Ja[b|0](l)|0}if(!c){break hc}c=0;kc:{if(!l){break kc}if(G[l+12>>2]>=2){hb(73247,22,1,G[24367])}b=G[l+116>>2];c=1;if(!b){break kc}c=Ja[b|0](l)|0}if(!c){break hc}c=0;lc:{if(!l){break lc}if(G[l+12>>2]>=2){hb(72480,20,1,G[24367])}b=G[l+120>>2];c=1;if(!b){break lc}c=Ja[b|0](l)|0}if(!c){break hc}c=0;mc:{if(!l){break mc}if(G[l+12>>2]>=2){hb(73225,21,1,G[24367])}b=G[l+124>>2];c=1;if(!b){break mc}c=Ja[b|0](l)|0}if(!c){break hc}if(!Hl(l)){break hc}b=0;nc:{if(!l){break nc}oc:{if(G[l+12>>2]>=2){hb(72832,22,1,G[24367]);b=1;if(G[l+12>>2]>1){break oc}}c=G[l+132>>2];b=1;if(!c){break nc}b=Ja[c|0](l)|0}}if(!b){break hc}if(G[l+4>>2]==2|G[l+12>>2]>1){break a}}Hh(l)}l=0}Fa=p+4112|0;G[a+116>>2]=l;if(!(!l|(l|0)==G[952412])){e=G[a+4>>2];h=G[a+8>>2];w=G[a+12>>2];g=G[a+16>>2];m=G[a+72>>2];D=a+80|0;A=Fa-16|0;Fa=A;if(!(!l|(l|0)==G[952412])){if(G[l+4>>2]==2){z=A+12|0;v=Fa-16|0;Fa=v;if(l){o=Fa-4112|0;Fa=o;d=Ic(M(Va(G[l+160>>2]),10)|1,1);pc:{if(!G[l+172>>2]){break pc}j=G[l+160>>2];b=G[l+104>>2];qc:{if(b){G[o>>2]=b;Ya(o+16|0,4095,16239,o);break qc}E[o+18|0]=H[16243];F[o+16>>1]=H[16241]|H[16242]<<8}c=d;while(1){f=H[j|0];while(1){if(!f){break pc}b=Sb(j,o+16|0);if(!b){break pc}j=Va(o+16|0)+b|0;if(!H[j|0]){break pc}rc:{if(!fb(j,64277,8)){break rc}if(!fb(j,64253,4)){break rc}if(!fb(j,64368,7)){break rc}if(!fb(j,64343,8)){break rc}if(!fb(j,64352,5)){break rc}if(!fb(j,64419,6)){break rc}if(!fb(j,64418,7)){break rc}if(!fb(j,64410,7)){break rc}if(!fb(j,64402,7)){break rc}if(!fb(j,64390,4)){break rc}if(!fb(j,64382,6)){break rc}if(!fb(j,64259,6)){break rc}if(!fb(j,64276,9)){break rc}if(!fb(j,64252,5)){break rc}if(!fb(j,64367,8)){break rc}if(!fb(j,64342,9)){break rc}if(!fb(j,64389,5)){break rc}if(!fb(j,64266,9)){break rc}if(!fb(j,64246,5)){break rc}if(!fb(j,64358,8)){break rc}if(!fb(j,64332,9)){break rc}if(!fb(j,64376,5)){break rc}if(!fb(j,64258,7)){break rc}if(!fb(j,64312,8)){break rc}if(!fb(j,64395,6)){break rc}f=1;if(fb(j,64321,10)){continue}}break}while(1){j=H[b|0];if(!(!j|(j|0)==40)){E[c|0]=j;b=b+1|0;c=c+1|0;continue}break}E[c|0]=105;f=H[b|0];if((f|0)!=40){c=c+1|0}else{E[c+1|0]=40;C=C+1|0;f=H[b+1|0];b=b+1|0;c=c+2|0}sc:{if(!f){j=b;break sc}j=b;if(!C){break sc}while(1){E[c|0]=f;C=(((f|0)==40)+C|0)-((f|0)==41)|0;c=c+1|0;j=b+1|0;f=H[b+1|0];if(!f){break sc}b=j;if(C){continue}break}}E[c|0]=59;c=c+1|0;continue}}Fa=o+4112|0;E[v+12|0]=105;E[v+13|0]=105;E[v+14|0]=105;E[v+15|0]=0;b=G[l+172>>2];G[v+8>>2]=G[l+160>>2];G[v+4>>2]=d;G[v>>2]=b;ea(194216,v+12|0,v|0)|0;if(d){Wa(d)}c=0;p=Fa-48|0;Fa=p;E[p+47|0]=0;b=ea(194112,p+47|0,0)|0;G[945054]=0;tc:{if((b|0)<=0){if(!z){break tc}G[z>>2]=0;break tc}n=lb(1,64);G[n>>2]=b;b=b<<2|1;G[n+4>>2]=b;b=lb(b,168);d=(m|0)>1?m:1;G[n+32>>2]=d;G[n+8>>2]=b;G[n+44>>2]=1;G[n+36>>2]=1;G[n+28>>2]=g;c=(w|0)>1?w:1;G[n+24>>2]=c;G[n+20>>2]=h;b=(e|0)>1?e:1;G[n+16>>2]=b;c=(g-c|0)/(d|0)|0;g=c+1|0;G[n+48>>2]=g;m=(h-b|0)/(d|0)|0;x=m+1|0;G[n+40>>2]=x;t=m+2|0;C=lb(t,4);G[945055]=10240;b=lb(10240,16);G[945056]=b;G[b>>2]=0;w=c+2|0;K=n,N=lb(w,4),G[K+52>>2]=N;o=lb(w,4);G[n+56>>2]=o;e=lb(w,4);G[n+60>>2]=e;uc:{if((c|0)<-1){break uc}d=0;f=0;if(g>>>0>=7){b=w&-8;j=0;while(1){h=f<<2;G[h+o>>2]=x;G[o+(h|4)>>2]=x;G[o+(h|8)>>2]=x;G[o+(h|12)>>2]=x;G[o+(h|16)>>2]=x;G[o+(h|20)>>2]=x;G[o+(h|24)>>2]=x;G[o+(h|28)>>2]=x;f=f+8|0;j=j+8|0;if((b|0)!=(j|0)){continue}break}}b=w&7;if(b){while(1){G[o+(f<<2)>>2]=x;f=f+1|0;d=d+1|0;if((b|0)!=(d|0)){continue}break}}if((c|0)<-1){break uc}b=0;c=0;if(g>>>0>=7){d=w&-8;f=0;while(1){j=c<<2;G[j+e>>2]=1;G[e+(j|4)>>2]=1;G[e+(j|8)>>2]=1;G[e+(j|12)>>2]=1;G[e+(j|16)>>2]=1;G[e+(j|20)>>2]=1;G[e+(j|24)>>2]=1;G[e+(j|28)>>2]=1;c=c+8|0;f=f+8|0;if((d|0)!=(f|0)){continue}break}}d=w&7;if(!d){break uc}while(1){G[e+(c<<2)>>2]=1;c=c+1|0;b=b+1|0;if((d|0)!=(b|0)){continue}break}}E[p+43|0]=105;E[p+44|0]=105;E[p+45|0]=105;E[p+46|0]=0;G[p+20>>2]=0;G[p+24>>2]=0;G[p+16>>2]=n;ea(194144,p+43|0,p+16|0)|0;j=G[n+44>>2];if((j|0)<=G[n+48>>2]){o=t<<2;e=(m|0)>=0;while(1){m=j;f=j<<2;vc:{if(!G[f+G[n+52>>2]>>2]){break vc}j=G[945056];b=G[945054];if(G[j+(b<<4)>>2]){d=b+1|0;G[945054]=d;c=G[945055];if((c|0)<=(d|0)){b=c+10240|0;G[945055]=b;j=ub(j,b<<4);G[945056]=j;cb((c<<4)+j|0,0,163840)}G[(d<<4)+j>>2]=0}b=G[f+G[n+56>>2]>>2];if((b|0)>G[f+G[n+60>>2]>>2]){break vc}j=(C+(b-G[n+36>>2]<<2)|0)+4|0;d=0;while(1){G[n+12>>2]=0;G[p>>2]=n;E[p+39|0]=105;E[p+40|0]=105;E[p+41|0]=105;E[p+42|0]=0;c=b;G[p+4>>2]=b;G[p+8>>2]=m;wc:{if(!(ea(194176,p+39|0,p|0)|0)){break wc}xc:{yc:{switch(G[j>>2]+1|0){case 1:d=d+1|0;b=G[n+12>>2];b=b?b:-1;break xc;case 0:break yc;default:break wc}}b=G[n+12>>2];if((b|0)<=0){break wc}}G[j>>2]=b}j=j+4|0;b=c+1|0;if((c|0)>2]>>2]){continue}break}if(!d){break vc}zc:{if(!e){c=G[945054];b=G[945056];break zc}j=1;h=m+1|0;b=G[945056];c=G[945054];d=G[945055];while(1){w=G[C+(j<<2)>>2];g=(c<<4)+b|0;f=G[g>>2];if((w|0)!=(f|0)){Ac:{if(!f){break Ac}G[g+12>>2]=j-1;c=c+1|0;G[945054]=c;if((c|0)<(d|0)){break Ac}f=d+10240|0;G[945055]=f;b=ub(b,f<<4);G[945056]=b;cb((d<<4)+b|0,0,163840);d=f}f=G[n+44>>2];g=(c<<4)+b|0;G[g+8>>2]=j;G[g>>2]=w;G[g+4>>2]=h-f}j=j+1|0;if((t|0)!=(j|0)){continue}break}}d=(c<<4)+b|0;Bc:{if(!G[d>>2]){break Bc}G[d+12>>2]=(G[n+40>>2]-G[n+36>>2]|0)+1;c=c+1|0;G[945054]=c;d=G[945055];if((d|0)>(c|0)){break Bc}c=d+10240|0;G[945055]=c;b=ub(b,c<<4);G[945056]=b;cb(b+(d<<4)|0,0,163840)}cb(C,0,o)}j=m+1|0;if((m|0)>2]){continue}break}}if(C){Wa(C)}if(G[n+4>>2]>0){f=0;while(1){j=G[n+8>>2];m=M(f,168);d=G[(j+m|0)+24>>2];if(d){b=0;c=G[n+48>>2];if((c|0)>=0){while(1){j=G[G[(m+G[n+8>>2]|0)+24>>2]+(b<<2)>>2];if(j){while(1){c=G[j>>2];Wa(j);j=c;if(c){continue}break}c=G[n+48>>2]}d=(b|0)<(c|0);b=b+1|0;if(d){continue}break}d=G[(m+G[n+8>>2]|0)+24>>2]}Wa(d);j=G[n+8>>2]}b=G[(j+m|0)+124>>2];if(b){Wa(b);j=G[n+8>>2]}b=G[(j+m|0)+32>>2];if(b){Wa(b)}f=f+1|0;if((f|0)>2]){continue}break}}b=G[n+8>>2];if(b){Wa(b)}b=G[n+52>>2];if(b){Wa(b)}b=G[n+56>>2];if(b){Wa(b)}b=G[n+60>>2];if(b){Wa(b)}Wa(n);if(z){G[z>>2]=G[945054]}c=G[945056]}Fa=p+48|0}else{c=0}Fa=v+16|0;G[a+112>>2]=c}if(D){G[D>>2]=G[l+168>>2]}j=G[A+12>>2]}Fa=A+16|0;G[a+76>>2]=j;b=G[G[a+116>>2]+16>>2];j=Ic(M(Va(b),3),1);G[a+52>>2]=j;c=H[b|0];if(c){while(1){E[j|0]=c;if(H[b|0]!=10){j=j+1|0}else{E[j+1|0]=35;E[j+2|0]=32;j=j+3|0}c=H[b+1|0];b=b+1|0;if(c){continue}break}j=G[a+52>>2]}K=a,N=lf(j,Va(j)+1|0),G[K+52>>2]=N}b=G[a+80>>2];if(b){K=a,N=Ic(b,8),G[K+104>>2]=N;K=a,N=Ic(G[a+80>>2],8),G[K+108>>2]=N;K=a,N=Ic(G[a+80>>2],4),G[K+84>>2]=N;K=a,N=Ic(G[a+80>>2],4),G[K+88>>2]=N;a=G[a+80>>2]}else{a=0}return a}function qj(a,b){var 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,A=0,B=0,C=0,D=0,I=0,J=0,K=0,N=0,P=0;c=Fa-3008|0;Fa=c;d=lb(1,9416);b=H[b|0];b=(b|0)==32?0:b;E[c+1967|0]=b;E[d+9404|0]=b;if(rf(a,35488,c+1967|0,63,c+1968|0)){e=c+1968|0;b=lb(Va(e)+2|0,1);G[d+9400>>2]=b;Za(b,e)}G[d+4064>>2]=0;G[d+4004>>2]=0;G[d+3268>>2]=0;G[d+3272>>2]=0;b=d+4032|0;G[b>>2]=-1;G[b+4>>2]=0;D=c+2816|0;b=D;G[b>>2]=0;G[b+4>>2]=0;J=c+2824|0;b=J;G[b>>2]=0;G[b+4>>2]=0;G[c+2832>>2]=0;G[c+2836>>2]=0;G[c+2800>>2]=0;G[c+2804>>2]=0;G[c+2808>>2]=0;G[c+2812>>2]=0;G[c+2144>>2]=0;G[c+2148>>2]=0;G[c+2840>>2]=0;G[c+2844>>2]=0;G[d+48>>2]=0;G[d+52>>2]=0;G[d+3300>>2]=0;G[c+2120>>2]=0;h=c+2120|0;i=Fa-16|0;Fa=i;e=E[c+1967|0];a:{if((e|0)<=63){Md(a,33794,h);break a}q=Za(i,33794);b=Va(33794)+q|0;E[b|0]=e;E[b+1|0]=0;Md(a,q,h)}Fa=i+16|0;b=G[c+2120>>2];b:{if(b){break b}Md(a,33794,c+2120|0);b=G[c+2120>>2];if(b){break b}Md(a,33788,c+2120|0);b=G[c+2120>>2];if(b){break b}Md(a,34652,c+2120|0);b=G[c+2120>>2]}c:{d:{if((b|0)<=0){jd(25828);break d}if(b>>>0>=3){G[c+2120>>2]=2;b=2}G[d+3320>>2]=b;G[d+3316>>2]=b;G[d+136>>2]=0;G[d+140>>2]=0;G[d+4040>>2]=b;w=d+136|0;ob(a,41261,w);g=L[d+136>>3];if(g<1){ob(a,33148,w);g=L[w>>3]}if(g<1){jd(25791);break d}G[d+144>>2]=0;G[d+148>>2]=0;B=d+144|0;ob(a,40853,B);if(L[d+144>>3]<1){ob(a,34932,B)}b=G[c+2120>>2];e:{f:{if((b|0)>=2){if(!(L[B>>3]<1)){break f}jd(25918);break d}if((b|0)!=1){break e}}h=G[24367];i=H[33792]|H[33793]<<8;q=H[33788]|H[33789]<<8|(H[33790]<<16|H[33791]<<24);m=H[35421]|H[35422]<<8;r=H[35417]|H[35418]<<8|(H[35419]<<16|H[35420]<<24);while(1){F[c+2132>>1]=i;G[c+2128>>2]=q;b=f;f=b+1|0;G[c+1920>>2]=f;e=c+2032|0;db(e,30633,c+1920|0);e=Gb(c+2128|0,e);g:{if(Md(a,e,c+2124|0)){break g}h:{i:{switch(b|0){case 0:g=L[w>>3];if(!(g>1)){break h}if(O(g)<2147483648){G[c+2124>>2]=~~g;break g}G[c+2124>>2]=-2147483648;break g;case 1:break i;default:break h}}g=L[B>>3];if(!(g>1)){break h}if(O(g)<2147483648){G[c+2124>>2]=~~g;break g}G[c+2124>>2]=-2147483648;break g}G[c+1904>>2]=e;_a(h,86533,c+1904|0)}E[e+4|0]=m;E[e+5|0]=m>>>8;E[e|0]=r;E[e+1|0]=r>>>8;E[e+2|0]=r>>>16;E[e+3|0]=r>>>24;b=c+2032|0;j:{if(!ie(a,Gb(e,b),16,b)){break j}if(!ug(c+2032|0,35917)){break j}G[c+2124>>2]=0}j=(G[c+2124>>2]>1)+j|0;if(G[c+2120>>2]>(f|0)){continue}break}}G[c+2120>>2]=j;G[d+3316>>2]=j;G[d+3320>>2]=j;ie(a,35441,16,d+3336|0);Md(a,33968,d+3332|0);b=0;e=G[321351];G[d+9408>>2]=0;G[d+3324>>2]=e;Md(a,35104,d+9408|0);K=cb(d+832|0,0,648);cb(c+2144|0,0,648);h=G[c+2120>>2];k:{if((h|0)>0){q=h-1|0;if(q>>>0>=3){f=h&-4;i=d+832|0;while(1){e=i+(M(b,h)+b<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|1;e=i+(M(e,h)+e<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|2;e=i+(M(e,h)+e<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|3;e=i+(M(e,h)+e<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;b=b+4|0;u=u+4|0;if((f|0)!=(u|0)){continue}break}}f=h&3;if(f){j=0;while(1){e=(M(b,h)+b<<3)+d|0;G[e+832>>2]=0;G[e+836>>2]=1072693248;b=b+1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}j=0;b=0;if(q>>>0>=3){f=h&-4;u=0;while(1){i=c+2144|0;e=i+(M(b,h)+b<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|1;e=i+(M(e,h)+e<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|2;e=i+(M(e,h)+e<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;e=b|3;e=(M(e,h)+e<<3)+i|0;G[e>>2]=0;G[e+4>>2]=1072693248;b=b+4|0;u=u+4|0;if((f|0)!=(u|0)){continue}break}}f=h&3;if(f){while(1){e=(c+2144|0)+(M(b,h)+b<<3)|0;G[e>>2]=0;G[e+4>>2]=1072693248;b=b+1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}u=0;I=d+760|0;cb(I,0,72);j=0;if(q>>>0>=7){f=h&-8;i=d+760|0;e=0;while(1){q=j<<3;b=q+i|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|8)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|16)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|24)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|32)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|40)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|48)|0;G[b>>2]=0;G[b+4>>2]=1072693248;b=i+(q|56)|0;G[b>>2]=0;G[b+4>>2]=1072693248;j=j+8|0;e=e+8|0;if((f|0)!=(e|0)){continue}break}}e=h&7;if(!e){break k}while(1){b=(j<<3)+d|0;G[b+760>>2]=0;G[b+764>>2]=1072693248;j=j+1|0;u=u+1|0;if((e|0)!=(u|0)){continue}break}break k}I=d+760|0;cb(I,0,72)}l:{if(rf(a,34226,c+1967|0,63,c+1968|0)){b=0;u=0;r=0;j=Fa-96|0;Fa=j;i=c+1968|0;m:{if(!i){break m}h=Va(i);p=lb(1,h+1|0);n:{if((h|0)<=0){break n}if((h|0)!=1){f=h&-2;while(1){e=H[b+i|0];E[b+p|0]=(e-97&255)>>>0<26?e-32|0:e;e=b|1;q=H[e+i|0];E[e+p|0]=(q-97&255)>>>0<26?q-32|0:q;b=b+2|0;r=r+2|0;if((f|0)!=(r|0)){continue}break}}if(!(h&1)){break n}e=b+p|0;b=H[b+i|0];E[e|0]=(b-97&255)>>>0<26?b-32|0:b}E[h+p|0]=0;if((Va(p)|0)==1){u=H[p|0];break m}E[j+88|0]=0;G[j+80>>2]=1314079575;G[j+84>>2]=4541761;u=95;h=0;while(1){q=h?h- -64|0:0;E[j+87|0]=q;if(ie(a,j+80|0,72,j)){m=Va(j);w=lb(1,m+1|0);o:{if((m|0)<=0){break o}b=0;if((m|0)!=1){f=m&-2;r=0;while(1){e=H[b+j|0];E[b+w|0]=(e-97&255)>>>0<26?e-32|0:e;e=b|1;i=H[e+j|0];E[e+w|0]=(i-97&255)>>>0<26?i-32|0:i;b=b+2|0;r=r+2|0;if((f|0)!=(r|0)){continue}break}}if(!(m&1)){break o}e=b+w|0;b=H[b+j|0];E[e|0]=(b-97&255)>>>0<26?b-32|0:b}E[m+w|0]=0;b=Xa(w,p);Wa(w);u=b?u:q}h=h+1|0;if((h|0)!=27){continue}break}Wa(p)}Fa=j+96|0;b=u<<24>>24;E[c+2976|0]=b;p:{q:{if((b|0)==95){G[c+1888>>2]=c+1968;_a(G[24367],70021,c+1888|0);G[d+9392>>2]=0;break q}b=qj(a,c+2976|0);G[d+9392>>2]=b;if(b){break p}}jd(5132);break d}G[b+9396>>2]=d;break l}G[d+9392>>2]=0}G[d+3224>>2]=0;G[d+3228>>2]=0;e=d+3232|0;G[e>>2]=0;G[e+4>>2]=0;b=d+3224|0;r:{if(Zb(a,35715,c+1967|0,b)){L[e>>3]=L[b>>3]/299792.5;break r}if(Zb(a,35707,c+1967|0,e)){L[b>>3]=L[e>>3]*299792.5;break r}if(!ob(a,32691,b)){break r}L[e>>3]=L[b>>3]/299792.5}j=cb(d+4176|0,0,80);s:{t:{u:{v:{if(rf(a,41295,c+1967|0,16,c+2976|0)){b=c+2976|0;m=Za(c+2944|0,b);h=rf(a,40882,c+1967|0,16,m);Za(d+3368|0,b);Za(d+3384|0,m);w:{if(ug(m,33504)){f=2;q=1;break w}b=ug(m,35895);f=b?2:1;q=(b|0)!=0}b=d+3400|0;E[b|0]=0;e=c+1967|0;rf(a,40521,e,9,b);b=d+3416|0;E[b|0]=0;rf(a,40374,e,9,b);if(tm(d,c+2976|0,m)){break d}x:{if(G[d+3260>>2]){break x}e=d+3560|0;y:{if(rf(a,41241,c+1967|0,16,e)){break y}if(Lm(a,41248,e)){break y}E[e|0]=0}if(!Xa(e,16895)){G[d+3260>>2]=-1}if(!h){break x}b=d+3592|0;z:{if(rf(a,40833,c+1967|0,16,b)){break z}if(Lm(a,40840,b)){break z}E[b|0]=0}if(Xa(e,16895)){break x}G[d+3260>>2]=-1}G[d+616>>2]=0;G[d+620>>2]=1072693248;h=c+1967|0;e=d+616|0;Zb(a,41201,h,e);b=d+624|0;G[b>>2]=0;G[b+4>>2]=1072693248;Zb(a,40799,h,b);G[d+688>>2]=0;G[d+692>>2]=0;L[d+16>>3]=L[d+616>>3];L[d+24>>3]=L[b>>3];Zb(a,41279,h,d+688|0);b=d+696|0;G[b>>2]=0;G[b+4>>2]=0;Zb(a,40866,h,b);A:{B:{C:{switch(G[d+3964>>2]-7|0){default:g=L[b>>3];break A;case 0:g=90-L[b>>3];break B;case 1:break C}}g=L[b>>3]+-90}L[b>>3]=g}L[d+8>>3]=g;G[d+3176>>2]=0;G[d+3180>>2]=1083127808;n=L[d+688>>3];L[d>>3]=n;b=G[d+3304>>2];L[d+4080>>3]=b?n:g;L[d+4072>>3]=b?g:n;s=c+1967|0;Zb(a,35545,s,d+3176|0);G[d+3184>>2]=0;G[d+3188>>2]=1083127808;L[d+4088>>3]=L[d+3176>>3];Zb(a,35537,s,d+3184|0);G[d+4052>>2]=I;G[d+4044>>2]=e;b=d+4168|0;G[b>>2]=0;G[b+4>>2]=0;G[d+4048>>2]=K;L[d+4096>>3]=L[d+3184>>3];Zb(a,41543,s,b);G[c+1872>>2]=0;b=c+2128|0;db(b,29941,c+1872|0);Zb(a,b,s,j);G[c+1856>>2]=1;db(b,29941,c+1856|0);x=d+4184|0;Zb(a,b,s,x);G[c+1840>>2]=2;db(b,29941,c+1840|0);A=d+4192|0;Zb(a,b,s,A);G[c+1824>>2]=3;db(b,29941,c+1824|0);u=d+4200|0;Zb(a,b,s,u);G[c+1808>>2]=4;db(b,29941,c+1808|0);p=d+4208|0;Zb(a,b,s,p);G[c+1792>>2]=5;db(b,29941,c+1792|0);r=d+4216|0;Zb(a,b,s,r);G[c+1776>>2]=6;db(b,29941,c+1776|0);w=d+4224|0;Zb(a,b,s,w);G[c+1760>>2]=7;db(b,29941,c+1760|0);m=d+4232|0;Zb(a,b,s,m);G[c+1744>>2]=8;db(b,29941,c+1744|0);h=d+4240|0;Zb(a,b,s,h);G[c+1728>>2]=9;db(b,29941,c+1728|0);e=d+4248|0;Zb(a,b,s,e);G[c+1712>>2]=f;db(c+2904|0,41069,c+1712|0);G[c+1696>>2]=f;db(c+2896|0,40711,c+1696|0);G[c+1680>>2]=f;db(c+2888|0,40490,c+1680|0);D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{b=G[d+3260>>2];switch(b-1|0){case 35:break F;case 26:break G;case 17:break H;case 8:break I;case 9:break J;case 12:break K;case 1:break L;case 0:case 3:case 13:case 14:case 15:case 16:break M;case 6:break N;default:break D}}G[c+1668>>2]=0;G[c+1664>>2]=f;s=c+2128|0;db(s,29879,c+1664|0);b=c+1967|0;Zb(a,s,b,j);G[c+1652>>2]=1;G[c+1648>>2]=f;db(s,29879,c+1648|0);Zb(a,s,b,x);G[c+1636>>2]=2;G[c+1632>>2]=f;db(s,29879,c+1632|0);Zb(a,s,b,A);G[c+1620>>2]=3;G[c+1616>>2]=f;db(s,29879,c+1616|0);Zb(a,s,b,u);G[c+1604>>2]=4;G[c+1600>>2]=f;db(s,29879,c+1600|0);Zb(a,s,b,p);G[c+1588>>2]=5;G[c+1584>>2]=f;db(s,29879,c+1584|0);Zb(a,s,b,r);G[c+1572>>2]=6;G[c+1568>>2]=f;db(s,29879,c+1568|0);Zb(a,s,b,w);G[c+1556>>2]=7;G[c+1552>>2]=f;db(s,29879,c+1552|0);Zb(a,s,b,m);G[c+1540>>2]=8;G[c+1536>>2]=f;db(s,29879,c+1536|0);Zb(a,s,b,h);G[c+1524>>2]=9;G[c+1520>>2]=f;db(s,29879,c+1520|0);Zb(a,s,b,e);break E}b=c+1967|0;Zb(a,c+2904|0,b,x);Zb(a,c+2896|0,b,A);break E}b=c+1967|0;Zb(a,c+2904|0,b,x);Zb(a,c+2896|0,b,A);if(L[u>>3]==0){G[u>>2]=0;G[u+4>>2]=1079410688}Zb(a,c+2888|0,c+1967|0,u);break E}if(L[x>>3]==0){G[x>>2]=0;G[x+4>>2]=1072693248}Zb(a,c+2904|0,c+1967|0,x);break E}if(L[x>>3]==0){G[x>>2]=0;G[x+4>>2]=1072693248}Zb(a,c+2904|0,c+1967|0,x);if(L[A>>3]==0){G[A>>2]=0;G[A+4>>2]=1072693248}Zb(a,c+2896|0,c+1967|0,A);break E}if(L[x>>3]==0){G[x>>2]=0;G[x+4>>2]=1079410688}Zb(a,c+2904|0,c+1967|0,x);break E}Zb(a,c+2904|0,c+1967|0,x);break E}b=c+1967|0;Zb(a,41130,b,x);Zb(a,40746,b,A);break E}Zb(a,41130,c+1967|0,x)}b=G[d+3260>>2]}if((b|0)==33){m=ab(2e3);h=ab(2e3);Of(a,41248,m);Of(a,40840,h);f=ab(2e3);e=ab(2e3);O:{if(!(L[d+3176>>3]>360)){break O}b=d+3176|0;if(kd(m,21617,b)){break O}if(kd(h,21617,b)){break O}G[b>>2]=0;G[b+4>>2]=1080459264}b=d+3192|0;P:{if(kd(m,13552,b)){break P}if(kd(h,13552,b)){break P}G[b>>2]=442745336;G[b+4>>2]=1078765020}b=d;Q:{R:{if(sf(m,10928,f)){break R}if(sf(h,10928,f)){break R}i=0;break Q}i=Xh(f)}G[b+6040>>2]=i;b=d;S:{T:{if(sf(h,10921,e)){break T}if(sf(m,10921,e)){break T}i=0;break S}i=Xh(e)}G[b+6044>>2]=i;qg(d);Wa(m);Wa(h);Wa(f);Wa(e);b=1;U:{if(!(G[d+6044>>2]|G[d+6040>>2])){break U}b=0}if(b){break v}b=G[d+3260>>2]}if((b|0)==34){k=Fa-160|0;Fa=k;z=ab(2e3);x=ab(2e3);if(!Of(a,41248,z)){b=Gb(bb(ab(Va(a)+200|0),64865,161),a);Of(b,41248,z);Of(b,40840,x);Wa(b)}Of(a,40840,x);s=ab(2e3);A=ab(2e3);V:{if(!(L[d+3176>>3]>360)){break V}b=d+3176|0;if(kd(z,21617,b)){break V}if(kd(x,21617,b)){break V}G[b>>2]=0;G[b+4>>2]=1080459264}b=d+3192|0;W:{if(kd(z,13552,b)){break W}if(kd(x,13552,b)){break W}G[b>>2]=442745336;G[b+4>>2]=1078765020}G[k+144>>2]=0;b=k+152|0;db(b,29831,k+144|0);u=d+4176|0;if(!kd(z,b,u)){G[u>>2]=0;G[u+4>>2]=0}G[k+128>>2]=1;b=k+152|0;db(b,29831,k+128|0);j=d+4184|0;if(!kd(z,b,j)){G[j>>2]=0;G[j+4>>2]=0}G[k+112>>2]=2;b=k+152|0;db(b,29831,k+112|0);p=d+4192|0;if(!kd(z,b,p)){G[p>>2]=0;G[p+4>>2]=0}G[k+96>>2]=3;b=k+152|0;db(b,29831,k+96|0);r=d+4200|0;if(!kd(z,b,r)){G[r>>2]=0;G[r+4>>2]=0}G[k+80>>2]=4;b=k+152|0;db(b,29831,k+80|0);w=d+4208|0;if(!kd(z,b,w)){G[w>>2]=0;G[w+4>>2]=0}G[k+64>>2]=5;b=k+152|0;db(b,29831,k- -64|0);m=d+4216|0;if(!kd(z,b,m)){G[m>>2]=0;G[m+4>>2]=0}G[k+48>>2]=6;b=k+152|0;db(b,29831,k+48|0);h=d+4224|0;if(!kd(z,b,h)){G[h>>2]=0;G[h+4>>2]=0}G[k+32>>2]=7;b=k+152|0;db(b,29831,k+32|0);f=d+4232|0;if(!kd(z,b,f)){G[f>>2]=0;G[f+4>>2]=0}G[k+16>>2]=8;b=k+152|0;db(b,29831,k+16|0);e=d+4240|0;if(!kd(z,b,e)){G[e>>2]=0;G[e+4>>2]=0}G[k>>2]=9;b=k+152|0;db(b,29831,k);i=b;b=d+4248|0;if(!kd(z,i,b)){G[b>>2]=0;G[b+4>>2]=0}b=d;X:{Y:{if(sf(z,10928,s)){break Y}if(sf(x,10928,s)){break Y}i=0;break X}i=Xh(s)}G[b+6040>>2]=i;b=d;Z:{_:{if(sf(x,10921,A)){break _}if(sf(z,10921,A)){break _}i=0;break Z}i=Xh(A)}G[b+6044>>2]=i;$:{aa:{if(L[d+4248>>3]!=0){e=9;break aa}if(L[e>>3]!=0){e=8;break aa}if(L[f>>3]!=0){e=7;break aa}if(L[h>>3]!=0){e=6;break aa}if(L[m>>3]!=0){e=5;break aa}if(L[w>>3]!=0){e=4;break aa}if(L[r>>3]!=0){e=3;break aa}if(L[p>>3]!=0){G[d+3276>>2]=2;break $}if(L[j>>3]!=0){G[d+3276>>2]=1;break $}if(L[u>>3]!=0){G[d+3276>>2]=0;break $}G[d+3276>>2]=-1;break $}G[d+3276>>2]=e;h=e&3;r=e-1|0;n=L[d+4184>>3];w=d+4176|0;m=1;ba:{ca:{da:{while(1){v=+(m|0)*3.141592653589793/180;f=0;g=0;b=e;if(h){while(1){g=g*v+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}if(r>>>0>=3){while(1){f=b-1|0;g=((g*v+L[w+(b<<3)>>3]*+(b|0))*v+L[w+(f<<3)>>3]*+(f|0))*v;f=b-2|0;g=(g+L[w+(f<<3)>>3]*+(f|0))*v;f=b-3|0;g=g+L[w+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(g<=0){l=t-n*(v-t)/(g-n);f=e&3;if(f){break da}b=e;break ca}n=g;t=v;m=m+1|0;if((m|0)!=181){continue}break}l=3.141592653589793;break ba}j=0;b=e;while(1){o=o*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;o=((o*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;o=(o+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;o=o+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(o)<1e-13){break ba}b=o<0;y=b?t:l;t=b?n:o;n=b?l:v;g=b?o:g;l=y-t*(n-y)/(g-t);f=e&3;ea:{if(!f){b=e;break ea}j=0;b=e;while(1){C=C*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;v=((C*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;v=(v+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;C=v+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(C)<1e-13){break ba}o=0;b=C<0;y=b?y:l;v=b?t:C;t=b?l:n;n=b?C:g;l=y-v*(t-y)/(n-v);f=e&3;fa:{if(!f){b=e;break fa}j=0;b=e;while(1){o=o*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((o*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;o=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(o)<1e-13){break ba}g=0;b=o<0;y=b?y:l;v=b?v:o;t=b?l:t;n=b?o:n;l=y-v*(t-y)/(n-v);f=e&3;ga:{if(!f){b=e;break ga}j=0;b=e;while(1){g=g*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((g*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;g=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(g)<1e-13){break ba}o=0;b=g<0;y=b?y:l;v=b?v:g;t=b?l:t;n=b?g:n;l=y-v*(t-y)/(n-v);f=e&3;ha:{if(!f){b=e;break ha}j=0;b=e;while(1){o=o*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((o*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;o=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(o)<1e-13){break ba}g=0;b=o<0;y=b?y:l;v=b?v:o;t=b?l:t;n=b?o:n;l=y-v*(t-y)/(n-v);f=e&3;ia:{if(!f){b=e;break ia}j=0;b=e;while(1){g=g*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((g*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;g=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(g)<1e-13){break ba}o=0;b=g<0;y=b?y:l;v=b?v:g;t=b?l:t;n=b?g:n;l=y-v*(t-y)/(n-v);f=e&3;ja:{if(!f){b=e;break ja}j=0;b=e;while(1){o=o*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((o*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;o=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(o)<1e-13){break ba}g=0;b=o<0;y=b?y:l;v=b?v:o;t=b?l:t;n=b?o:n;l=y-v*(t-y)/(n-v);f=e&3;ka:{if(!f){b=e;break ka}j=0;b=e;while(1){g=g*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((g*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;g=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(g)<1e-13){break ba}o=0;b=g<0;C=b?y:l;y=b?v:g;v=b?l:t;t=b?g:n;l=C-y*(v-C)/(t-y);f=e&3;la:{if(!f){b=e;break la}j=0;b=e;while(1){o=o*l+L[((b<<3)+d|0)+4176>>3]*+(b|0);b=b-1|0;j=j+1|0;if((f|0)!=(j|0)){continue}break}}if(r>>>0>=3){h=d+4176|0;while(1){f=b-1|0;g=((o*l+L[h+(b<<3)>>3]*+(b|0))*l+L[h+(f<<3)>>3]*+(f|0))*l;f=b-2|0;g=(g+L[h+(f<<3)>>3]*+(f|0))*l;f=b-3|0;o=g+L[h+(f<<3)>>3]*+(f|0);f=(b|0)>4;b=b-4|0;if(f){continue}break}}if(O(o)<1e-13){break ba}b=o<0;n=b?C:l;g=b?y:o;l=n-g*((b?l:v)-n)/((b?o:t)-g)}o=0;f=e+1&3;if(f){b=0;while(1){o=o*l+L[((e<<3)+d|0)+4176>>3];e=e-1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}while(1){b=(e<<3)+d|0;o=(((o*l+L[b+4176>>3])*l+L[b+4168>>3])*l+L[b+4160>>3])*l+L[b+4152>>3];b=(e|0)>3;e=e-4|0;if(b){continue}break}L[d+3248>>3]=o;L[d+3240>>3]=l}qg(d);Wa(z);Wa(x);Wa(s);Wa(A);Fa=k+160|0;if(G[d+6044>>2]|G[d+6040>>2]){b=0}else{b=1}if(b){E[d+3375|0]=78;b=7;break u}b=G[d+3260>>2]}if((b|0)!=35){break t}break v}b=H[c+1967|0];if((b|32)!=32){G[c>>2]=b<<24>>24;a=c+2032|0;db(a,30781,c);jd(a);break d}if(Pc(a,34954)){G[d+3260>>2]=31;e=Pc(a,34954);ob(e,34954,c+2944|0);ob(e,34681,c+2912|0);ob(e,33940,c+2904|0);L[d+152>>3]=(L[c+2944>>3]+L[c+2912>>3]/60+L[c+2904>>3]/3600)*15*3.141592653589793/180;E[c+1936|0]=43;ie(e,34400,1,c+1936|0);b=H[c+1936|0];ob(e,35836,c+2896|0);ob(e,34673,c+2888|0);ob(e,33915,c+2880|0);g=L[c+2896>>3]+L[c+2888>>3]/60+L[c+2880>>3]/3600;L[d+160>>3]=((b|0)==45?-g:g)*3.141592653589793/180;ob(a,32863,d+120|0);Md(a,32863,c+1952|0);b=G[c+1952>>2];L[d+128>>3]=L[d+120>>3];b=(b|0)==1950?3427142:3492678;E[d+3848|0]=b;E[d+3849|0]=b>>>8;E[d+3850|0]=b>>>16;E[d+3851|0]=b>>>24;ob(a,34948,d+128|0);G[c+808>>2]=d+3848;L[c+768>>3]=L[c+2904>>3];G[c+776>>2]=E[c+1936|0];L[c+784>>3]=L[c+2896>>3];L[c+792>>3]=L[c+2888>>3];L[c+800>>3]=L[c+2880>>3];L[c+752>>3]=L[c+2944>>3];L[c+760>>3]=L[c+2912>>3];Eb(d+3972|0,9081,c+752|0);ob(a,35652,d+168|0);ob(a,32664,d+192|0);ob(a,32655,d+200|0);ob(a,41208,d+176|0);ob(a,40806,d+184|0);f=Pc(a,41268);G[c+736>>2]=1;b=c+2128|0;db(b,29957,c+736|0);G[d+208>>2]=0;G[d+212>>2]=0;ob(f,b,d+208|0);G[c+720>>2]=2;db(b,29957,c+720|0);e=d+216|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,b,e);G[c+704>>2]=3;db(b,29957,c+704|0);e=d+224|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,b,e);G[c+688>>2]=4;db(b,29957,c+688|0);e=d+232|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,b,e);G[c+672>>2]=5;db(b,29957,c+672|0);e=d+240|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+656>>2]=6;db(b,29957,c+656|0);e=d+248|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);f=Pc(a,41223);G[c+640>>2]=1;db(b,29925,c+640|0);G[d+256>>2]=0;G[d+260>>2]=0;ob(f,b,d+256|0);G[c+624>>2]=2;db(b,29925,c+624|0);e=d+264|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+608>>2]=3;db(b,29925,c+608|0);e=d+272|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+592>>2]=4;db(b,29925,c+592|0);e=d+280|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+576>>2]=5;db(b,29925,c+576|0);e=d+288|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+560>>2]=6;db(b,29925,c+560|0);e=d+296|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+544>>2]=7;db(b,29925,c+544|0);e=d+304|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+528>>2]=8;db(b,29925,c+528|0);e=d+312|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+512>>2]=9;db(b,29925,c+512|0);e=d+320|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+496>>2]=10;db(b,29925,c+496|0);e=d+328|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+480>>2]=11;db(b,29925,c+480|0);e=d+336|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+464>>2]=12;db(b,29925,c+464|0);e=d+344|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+448>>2]=13;db(b,29925,c+448|0);e=d+352|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+432>>2]=14;db(b,29925,c+432|0);e=d+360|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+416>>2]=15;db(b,29925,c+416|0);e=d+368|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+400>>2]=16;db(b,29925,c+400|0);e=d+376|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+384>>2]=17;db(b,29925,c+384|0);e=d+384|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+368>>2]=18;db(b,29925,c+368|0);e=d+392|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+352>>2]=19;db(b,29925,c+352|0);e=d+400|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);G[c+336>>2]=20;db(b,29925,c+336|0);e=d+408|0;G[e>>2]=0;G[e+4>>2]=0;ob(f,c+2128|0,e);e=Pc(a,41195);G[c+320>>2]=1;db(b,29918,c+320|0);G[d+416>>2]=0;G[d+420>>2]=0;ob(e,b,d+416|0);G[c+304>>2]=2;db(b,29918,c+304|0);a=d+424|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,b,a);G[c+288>>2]=3;db(b,29918,c+288|0);a=d+432|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,b,a);G[c+272>>2]=4;db(b,29918,c+272|0);a=d+440|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,b,a);G[c+256>>2]=5;db(b,29918,c+256|0);a=d+448|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+240>>2]=6;db(b,29918,c+240|0);a=d+456|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+224>>2]=7;db(b,29918,c+224|0);a=d+464|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+208>>2]=8;db(b,29918,c+208|0);a=d+472|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+192>>2]=9;db(b,29918,c+192|0);a=d+480|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+176>>2]=10;db(b,29918,c+176|0);a=d+488|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+160>>2]=11;db(b,29918,c+160|0);a=d+496|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+144>>2]=12;db(b,29918,c+144|0);a=d+504|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+128>>2]=13;db(b,29918,c+128|0);a=d+512|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+112>>2]=14;db(b,29918,c+112|0);a=d+520|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+96>>2]=15;db(b,29918,c+96|0);a=d+528|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+80>>2]=16;db(b,29918,c+80|0);a=d+536|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+64>>2]=17;db(b,29918,c- -64|0);a=d+544|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+48>>2]=18;db(b,29918,c+48|0);a=d+552|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+32>>2]=19;db(b,29918,c+32|0);a=d+560|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,c+2128|0,a);G[c+16>>2]=20;db(b,29918,c+16|0);a=d+568|0;G[a>>2]=0;G[a+4>>2]=0;ob(e,b,a);G[d+3312>>2]=1;a=H[35967]|H[35968]<<8;E[d+3512|0]=a;E[d+3513|0]=a>>>8;E[d+3514|0]=H[35969];E[d+3544|0]=68;E[d+3545|0]=83;E[d+3546|0]=83;E[d+3547|0]=0;E[d+3528|0]=68;E[d+3529|0]=69;E[d+3530|0]=67;E[d+3531|0]=0;G[d+3288>>2]=3;G[d+3292>>2]=0;E[d+3376|0]=H[33746];b=H[33742]|H[33743]<<8|(H[33744]<<16|H[33745]<<24);a=H[33738]|H[33739]<<8|(H[33740]<<16|H[33741]<<24);E[d+3368|0]=a;E[d+3369|0]=a>>>8;E[d+3370|0]=a>>>16;E[d+3371|0]=a>>>24;E[d+3372|0]=b;E[d+3373|0]=b>>>8;E[d+3374|0]=b>>>16;E[d+3375|0]=b>>>24;b=H[33733]|H[33734]<<8|(H[33735]<<16|H[33736]<<24);e=d+3384|0;a=H[33729]|H[33730]<<8|(H[33731]<<16|H[33732]<<24);E[e|0]=a;E[e+1|0]=a>>>8;E[e+2|0]=a>>>16;E[e+3|0]=a>>>24;E[e+4|0]=b;E[e+5|0]=b>>>8;E[e+6|0]=b>>>16;E[e+7|0]=b>>>24;E[d+3392|0]=H[33737];n=L[d+136>>3]*.5;L[d+616>>3]=n;L[d+16>>3]=n;g=L[d+144>>3]*.5;L[d+24>>3]=g;L[d+624>>3]=g;Zg(n,g,d,c+2872|0,c+2856|0);n=L[c+2872>>3];L[d+688>>3]=n;g=L[c+2856>>3];L[d+8>>3]=g;L[d>>3]=n;L[d+696>>3]=g;b=c+2864|0;a=c+2848|0;Zg(L[d+616>>3],L[d+624>>3]+1,d,b,a);g=L[c+2848>>3]-L[c+2856>>3];L[d+40>>3]=g;L[d+32>>3]=-g;pj(d);G[d+3312>>2]=1;qg(d);t=L[d+48>>3]*3.141592653589793/180;L[c+1944>>3]=t;n=L[d+624>>3];g=ib(t);Zg(L[d+616>>3]+eb(t),n+g,d,b,a);N=d,P=-pg(L[c+2872>>3],L[c+2856>>3],L[c+2864>>3],L[c+2848>>3]),L[N+760>>3]=P;t=L[d+624>>3];n=L[c+1944>>3];g=eb(n);Zg(L[d+616>>3]+ib(n),t+g,d,b,a);g=pg(L[c+2872>>3],L[c+2856>>3],L[c+2864>>3],L[c+2848>>3]);L[d+768>>3]=g;rj(d,L[d+760>>3],g,L[d+48>>3]);break s}ma:{na:{if(Pc(a,32970)){break na}if(Pc(a,35643)){break na}if(Pc(a,41286)){break na}if(Pc(a,35348)){break na}if(!Pc(a,41215)){break ma}}G[c+2880>>2]=0;G[c+2884>>2]=0;ob(a,32970,c+2880|0);g=L[c+2880>>3];if(g==0){ob(a,35643,c+2880|0);g=L[c+2880>>3]}oa:{if(g==0){ob(a,41215,c+2880|0);g=L[c+2880>>3];if(g!=0){L[c+2840>>3]=g/-3600;ob(a,40813,c+2880|0);L[c+2832>>3]=L[c+2880>>3]/3600;break oa}ob(a,35348,c+2880|0);g=L[c+2880>>3];if(g!=0){L[c+2840>>3]=g/-3600;ob(a,35339,c+2880|0);L[c+2832>>3]=L[c+2880>>3]/3600;break oa}b=c+2880|0;ob(a,41286,b);L[c+2840>>3]=L[c+2880>>3]/-3600;ob(a,40873,b);L[c+2832>>3]=L[c+2880>>3]/3600;break oa}g=g/3600;L[c+2832>>3]=g;L[c+2840>>3]=-g}G[c+1944>>2]=0;G[c+1948>>2]=0;ob(a,41309,c+1944|0);if(L[d+48>>3]==0){ob(a,40896,c+1944|0)}rj(d,L[c+2840>>3],L[c+2832>>3],L[c+1944>>3]);L[d+616>>3]=L[d+136>>3]*.5+.5;b=d+624|0;L[b>>3]=L[d+144>>3]*.5+.5;if(Pc(a,41201)){ob(a,41201,d+616|0);ob(a,40799,b)}G[d+688>>2]=0;G[d+692>>2]=-1064355840;L[d+16>>3]=L[d+616>>3];L[d+24>>3]=L[d+624>>3];b=Ye(a,35967);if(b){g=Km(b);N=d,P=ec(b,40241,Va(b))?g*15:g,L[N+688>>3]=P;b=1}else{b=0}if(!b){jd(33880);break d}e=d+696|0;G[e>>2]=0;G[e+4>>2]=-1064355840;b=Ye(a,35895);if(b){N=e,P=Km(b),L[N>>3]=P;b=1}else{b=0}if(!b){jd(33845);break d}G[d+3304>>2]=0;n=L[d+688>>3];L[d>>3]=n;b=d+4088|0;G[b>>2]=0;G[b+4>>2]=1083127808;g=L[d+696>>3];L[d+4080>>3]=g;L[d+4072>>3]=n;L[d+8>>3]=g;if(!ob(a,35545,b)){ob(a,35553,b)}b=d+4096|0;G[b>>2]=0;G[b+4>>2]=1083127808;ob(a,35537,b);pa:{if(ob(a,33932,c+1952|0)){L[d+128>>3]=(L[c+1952>>3]+-15019.81352)/365.242198781+1900;break pa}e=d+128|0;if(!vg(a,33923,e)){if(vg(a,35389,e)){break pa}if(ob(a,34948,e)){break pa}L[d+128>>3]=L[d+120>>3];break pa}b=c+2912|0;ie(a,33923,32,b);if(jb(b,84)){break pa}if(ob(a,33299,c+1936|0)){L[e>>3]=L[e>>3]+L[c+1936>>3]/8765.812770744;break pa}if(!ob(a,35806,c+1936|0)){break pa}L[e>>3]=L[e>>3]+L[c+1936>>3]/8765.812770744}tm(d,34601,34592);G[d+3304>>2]=0;E[c+2944|0]=0;pm(a,d,c+2944|0);pj(d);G[d+3312>>2]=1;G[d+3288>>2]=3;G[d+3292>>2]=0;break s}jd(23641);break d}E[d+3390|0]=65;F[d+3374>>1]=20033;b=3}G[d+3260>>2]=b;E[d+3391|0]=78}if(G[d+3324>>2]>0){pm(a,d,c+1967|0)}pj(d);p=a;a=0;m=Fa-80|0;Fa=m;qa:{if(G[d+6048>>2]!=1){break qa}if(G[d+3324>>2]==2){G[d+6056>>2]=0;G[d+3324>>2]=3;G[d+8480>>2]=0;G[d+7672>>2]=0;G[d+6864>>2]=0;break qa}b=d+6056|0;ra:{if(!Md(p,34126,b)){jd(13771);break ra}h=G[b>>2];if((h|0)<0){break ra}b=h+1|0;f=b&3;i=(h<<3)+8|0;if(h>>>0>=3){e=b&-4;b=0;while(1){cb((M(a,80)+d|0)+6064|0,0,i);cb((M(a|1,80)+d|0)+6064|0,0,i);cb((M(a|2,80)+d|0)+6064|0,0,i);cb((M(a|3,80)+d|0)+6064|0,0,i);a=a+4|0;b=b+4|0;if((e|0)!=(b|0)){continue}break}}if(f){b=0;while(1){cb((M(a,80)+d|0)+6064|0,0,i);a=a+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if((h|0)<0){break ra}b=h+1|0;while(1){a=0;if((e|0)<=(h|0)){while(1){G[m+48>>2]=e;G[m+52>>2]=a;f=m+68|0;db(f,29871,m+48|0);ob(p,f,((M(e,80)+d|0)+(a<<3)|0)+6064|0);a=a+1|0;if((b|0)!=(a|0)){continue}break}}b=b-1|0;a=(e|0)!=(h|0);e=e+1|0;if(a){continue}break}}b=d+6864|0;sa:{if(!Md(p,34118,b)){jd(13714);break sa}a=0;h=G[b>>2];if((h|0)<0){break sa}b=h+1|0;f=b&3;i=(h<<3)+8|0;if(h>>>0>=3){e=b&-4;b=0;while(1){cb((M(a,80)+d|0)+6872|0,0,i);cb((M(a|1,80)+d|0)+6872|0,0,i);cb((M(a|2,80)+d|0)+6872|0,0,i);cb((M(a|3,80)+d|0)+6872|0,0,i);a=a+4|0;b=b+4|0;if((e|0)!=(b|0)){continue}break}}if(f){b=0;while(1){cb((M(a,80)+d|0)+6872|0,0,i);a=a+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if((h|0)<0){break sa}b=h+1|0;while(1){a=0;if((e|0)<=(h|0)){while(1){G[m+32>>2]=e;G[m+36>>2]=a;f=m+68|0;db(f,29863,m+32|0);ob(p,f,((M(e,80)+d|0)+(a<<3)|0)+6872|0);a=a+1|0;if((b|0)!=(a|0)){continue}break}}b=b-1|0;a=(e|0)!=(h|0);e=e+1|0;if(a){continue}break}}b=d+7672|0;ta:{if(!Md(p,34109,b)){jd(13656);break ta}a=0;h=G[b>>2];if((h|0)<0){break ta}b=h+1|0;f=b&3;i=(h<<3)+8|0;if(h>>>0>=3){e=b&-4;b=0;while(1){cb((M(a,80)+d|0)+7680|0,0,i);cb((M(a|1,80)+d|0)+7680|0,0,i);cb((M(a|2,80)+d|0)+7680|0,0,i);cb((M(a|3,80)+d|0)+7680|0,0,i);a=a+4|0;b=b+4|0;if((e|0)!=(b|0)){continue}break}}if(f){b=0;while(1){cb((M(a,80)+d|0)+7680|0,0,i);a=a+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if((h|0)<0){break ta}b=h+1|0;while(1){a=0;if((e|0)<=(h|0)){while(1){G[m+16>>2]=e;G[m+20>>2]=a;f=m+68|0;db(f,29854,m+16|0);ob(p,f,((M(e,80)+d|0)+(a<<3)|0)+7680|0);a=a+1|0;if((b|0)!=(a|0)){continue}break}}b=b-1|0;a=(e|0)!=(h|0);e=e+1|0;if(a){continue}break}}b=d+8480|0;if(!Md(p,34100,b)){jd(13598);break qa}a=0;h=G[b>>2];if((h|0)<0){break qa}b=h+1|0;f=b&3;i=(h<<3)+8|0;if(h>>>0>=3){e=b&-4;b=0;while(1){cb((M(a,80)+d|0)+8488|0,0,i);cb((M(a|1,80)+d|0)+8488|0,0,i);cb((M(a|2,80)+d|0)+8488|0,0,i);cb((M(a|3,80)+d|0)+8488|0,0,i);a=a+4|0;b=b+4|0;if((e|0)!=(b|0)){continue}break}}if(f){b=0;while(1){cb((M(a,80)+d|0)+8488|0,0,i);a=a+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}e=0;if((h|0)<0){break qa}b=h+1|0;while(1){a=0;if((e|0)<=(h|0)){while(1){G[m>>2]=e;G[m+4>>2]=a;f=m+68|0;db(f,29845,m);ob(p,f,((M(e,80)+d|0)+(a<<3)|0)+8488|0);a=a+1|0;if((b|0)!=(a|0)){continue}break}}b=b-1|0;a=(e|0)!=(h|0);e=e+1|0;if(a){continue}break}}Fa=m+80|0;G[d+3268>>2]=0;G[d+3272>>2]=0;i=c+1967|0;a=c+2800|0;f=Zb(p,41174,i,a);e=Zb(p,40778,i,a|8);b=Zb(p,41149,i,D);a=Zb(p,40759,i,J);ua:{va:{if(G[d+3324>>2]==2){break va}i=Pc(p,41161);if(!i){break va}e=d+3268|0;G[d+3260>>2]=32;a=H[35383]|H[35384]<<8|(H[35385]<<16|H[35386]<<24);E[d+3544|0]=a;E[d+3545|0]=a>>>8;E[d+3546|0]=a>>>16;E[d+3547|0]=a>>>24;b=d+3548|0;a=H[35387]|H[35388]<<8;E[b|0]=a;E[b+1|0]=a>>>8;G[c+1504>>2]=1;a=c+2128|0;db(a,29911,c+1504|0);G[d+256>>2]=0;G[d+260>>2]=0;if(ob(i,a,d+256|0)){G[e>>2]=1}G[c+1488>>2]=2;a=c+2128|0;db(a,29911,c+1488|0);b=d+264|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=2}G[c+1472>>2]=3;a=c+2128|0;db(a,29911,c+1472|0);b=d+272|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=3}G[c+1456>>2]=4;a=c+2128|0;db(a,29911,c+1456|0);b=d+280|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=4}G[c+1440>>2]=5;a=c+2128|0;db(a,29911,c+1440|0);b=d+288|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=5}G[c+1424>>2]=6;a=c+2128|0;db(a,29911,c+1424|0);b=d+296|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=6}G[c+1408>>2]=7;a=c+2128|0;db(a,29911,c+1408|0);b=d+304|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=7}G[c+1392>>2]=8;a=c+2128|0;db(a,29911,c+1392|0);b=d+312|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=8}G[c+1376>>2]=9;a=c+2128|0;db(a,29911,c+1376|0);b=d+320|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=9}G[c+1360>>2]=10;a=c+2128|0;db(a,29911,c+1360|0);b=d+328|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=10}G[c+1344>>2]=11;a=c+2128|0;db(a,29911,c+1344|0);b=d+336|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=11}G[c+1328>>2]=12;a=c+2128|0;db(a,29911,c+1328|0);b=d+344|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=12}G[c+1312>>2]=13;a=c+2128|0;db(a,29911,c+1312|0);b=d+352|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=13}G[c+1296>>2]=14;a=c+2128|0;db(a,29911,c+1296|0);b=d+360|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=14}G[c+1280>>2]=15;a=c+2128|0;db(a,29911,c+1280|0);b=d+368|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=15}G[c+1264>>2]=16;a=c+2128|0;db(a,29911,c+1264|0);b=d+376|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=16}G[c+1248>>2]=17;a=c+2128|0;db(a,29911,c+1248|0);b=d+384|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=17}G[c+1232>>2]=18;a=c+2128|0;db(a,29911,c+1232|0);b=d+392|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=18}G[c+1216>>2]=19;a=c+2128|0;db(a,29911,c+1216|0);b=d+400|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=19}G[c+1200>>2]=20;a=c+2128|0;db(a,29911,c+1200|0);b=d+408|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(i,a,b)){G[e>>2]=20}f=d+3272|0;e=Pc(p,41136);G[c+1184>>2]=1;a=c+2128|0;db(a,29904,c+1184|0);G[d+416>>2]=0;G[d+420>>2]=0;if(ob(e,a,d+416|0)){G[f>>2]=1}G[c+1168>>2]=2;a=c+2128|0;db(a,29904,c+1168|0);b=d+424|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=2}G[c+1152>>2]=3;a=c+2128|0;db(a,29904,c+1152|0);b=d+432|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=3}G[c+1136>>2]=4;a=c+2128|0;db(a,29904,c+1136|0);b=d+440|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=4}G[c+1120>>2]=5;a=c+2128|0;db(a,29904,c+1120|0);b=d+448|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=5}G[c+1104>>2]=6;a=c+2128|0;db(a,29904,c+1104|0);b=d+456|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=6}G[c+1088>>2]=7;a=c+2128|0;db(a,29904,c+1088|0);b=d+464|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=7}G[c+1072>>2]=8;a=c+2128|0;db(a,29904,c+1072|0);b=d+472|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=8}G[c+1056>>2]=9;a=c+2128|0;db(a,29904,c+1056|0);b=d+480|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=9}G[c+1040>>2]=10;a=c+2128|0;db(a,29904,c+1040|0);b=d+488|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=10}G[c+1024>>2]=11;a=c+2128|0;db(a,29904,c+1024|0);b=d+496|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=11}G[c+1008>>2]=12;a=c+2128|0;db(a,29904,c+1008|0);b=d+504|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=12}G[c+992>>2]=13;a=c+2128|0;db(a,29904,c+992|0);b=d+512|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=13}G[c+976>>2]=14;a=c+2128|0;db(a,29904,c+976|0);b=d+520|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=14}G[c+960>>2]=15;a=c+2128|0;db(a,29904,c+960|0);b=d+528|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=15}G[c+944>>2]=16;a=c+2128|0;db(a,29904,c+944|0);b=d+536|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=16}G[c+928>>2]=17;a=c+2128|0;db(a,29904,c+928|0);b=d+544|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=17}G[c+912>>2]=18;a=c+2128|0;db(a,29904,c+912|0);b=d+552|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=18}G[c+896>>2]=19;a=c+2128|0;db(a,29904,c+896|0);b=d+560|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=19}G[c+880>>2]=20;a=c+2128|0;db(a,29904,c+880|0);b=d+568|0;G[b>>2]=0;G[b+4>>2]=0;if(ob(e,a,b)){G[f>>2]=20}rg(L[d+616>>3],L[d+624>>3],d,c+2872|0,c+2856|0);b=c+2864|0;a=c+2848|0;rg(L[d+616>>3],L[d+624>>3]+1,d,b,a);n=L[c+2856>>3];g=L[c+2848>>3];G[d+3312>>2]=1;g=g-n;L[d+40>>3]=g;L[d+32>>3]=-g;qg(d);L[c+1944>>3]=L[d+48>>3]*3.141592653589793/180;rg(L[d+616>>3],L[d+624>>3],d,c+2872|0,c+2856|0);t=L[d+624>>3];n=L[c+1944>>3];g=ib(n);rg(L[d+616>>3]+eb(n),t+g,d,b,a);g=-pg(L[c+2872>>3],L[c+2856>>3],L[c+2864>>3],L[c+2848>>3]);L[d+32>>3]=g;L[d+760>>3]=g;t=L[d+624>>3];n=L[c+1944>>3];g=eb(n);rg(L[d+616>>3]+ib(n),t+g,d,b,a);g=pg(L[c+2872>>3],L[c+2856>>3],L[c+2864>>3],L[c+2848>>3]);L[d+40>>3]=g;L[d+768>>3]=g;L[d+56>>3]=L[c+2800>>3];L[d- -64>>3]=L[c+2808>>3];L[d+72>>3]=L[c+2816>>3];L[d+80>>3]=L[c+2824>>3];sg(2,d+56|0,d+88|0);break ua}wa:{if(!(b|(e|f))){if(!a){break wa}}G[d+3300>>2]=1;a=c+2800|0;if(a){G[d+3300>>2]=1;L[d+56>>3]=L[a>>3];L[d- -64>>3]=L[a+8>>3];L[d+72>>3]=L[a+16>>3];L[d+80>>3]=L[a+24>>3];sg(2,d+56|0,d+88|0);g=L[a>>3];n=g*g;g=L[a+16>>3];L[d+32>>3]=V(n+g*g);g=L[a+8>>3];n=g*g;g=L[a+24>>3];L[d+40>>3]=V(n+g*g);if(G[d+3304>>2]){g=L[a+16>>3];L[a+16>>3]=-L[a+8>>3];L[a+8>>3]=-g}rm(d);G[d+3312>>2]=1;qg(d);L[d+760>>3]=L[d+32>>3];L[d+768>>3]=L[d+40>>3]}break ua}if(Zb(p,41234,c+1967|0,c+2840|0)){Zb(p,40826,c+1967|0,c+2832|0);xa:{if(L[c+2840>>3]!=0){g=L[c+2832>>3];if(!(L[B>>3]>1)|g!=0){break xa}}ya:{za:{if(Pc(p,32970)){break za}if(Pc(p,35643)){break za}if(Pc(p,41286)){break za}if(Pc(p,35348)){break za}if(!Pc(p,41215)){break ya}}G[c+2880>>2]=0;G[c+2884>>2]=0;ob(p,32970,c+2880|0);o=L[c+2880>>3];if(o==0){ob(p,35643,c+2880|0);o=L[c+2880>>3]}if(o==0){ob(p,41215,c+2880|0);g=L[c+2880>>3];if(g!=0){if(L[c+2840>>3]==0){L[c+2840>>3]=g/-3600}g=L[c+2832>>3];if(g!=0){break xa}ob(p,40813,c+2880|0);g=L[c+2880>>3]/3600;L[c+2832>>3]=g;break xa}ob(p,35348,c+2880|0);g=L[c+2880>>3];if(g!=0){if(L[c+2840>>3]==0){L[c+2840>>3]=g/-3600}g=L[c+2832>>3];if(g!=0){break xa}ob(p,35339,c+2880|0);g=L[c+2880>>3]/3600;L[c+2832>>3]=g;break xa}ob(p,41286,c+2880|0);g=L[c+2880>>3];if(!(g==0|L[c+2840>>3]!=0)){L[c+2840>>3]=g/-3600}g=L[c+2832>>3];if(g!=0){break xa}ob(p,40873,c+2880|0);g=L[c+2880>>3]/3600;L[c+2832>>3]=g;break xa}if(L[c+2840>>3]==0){L[c+2840>>3]=o/-3600}g=L[c+2832>>3];if(g!=0){break xa}g=o/3600;L[c+2832>>3]=g;break xa}g=L[c+2832>>3]}if(!(!(L[B>>3]>1)|g!=0)){L[c+2832>>3]=-L[c+2840>>3]}G[d+784>>2]=0;G[d+788>>2]=1072693248;G[d+776>>2]=0;G[d+780>>2]=1072693248;b=0;cb(c+2144|0,0,648);cb(K,0,648);i=G[c+2120>>2];Aa:{if((i|0)<=0){break Aa}if(i-1>>>0>=3){e=i&-4;j=0;while(1){f=c+2144|0;a=f+(M(b,i)+b<<3)|0;G[a>>2]=0;G[a+4>>2]=1072693248;a=b|1;a=f+(M(a,i)+a<<3)|0;G[a>>2]=0;G[a+4>>2]=1072693248;a=b|2;a=f+(M(a,i)+a<<3)|0;G[a>>2]=0;G[a+4>>2]=1072693248;a=b|3;a=(M(a,i)+a<<3)+f|0;G[a>>2]=0;G[a+4>>2]=1072693248;b=b+4|0;j=j+4|0;if((e|0)!=(j|0)){continue}break}}e=i&3;if(!e){break Aa}j=0;while(1){a=(c+2144|0)+(M(b,i)+b<<3)|0;G[a>>2]=0;G[a+4>>2]=1072693248;b=b+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break}}Ba:{if(H[c+1967|0]){break Ba}if(!ob(p,41366,c+2144|0)){break Ba}j=G[c+2120>>2];if((j|0)>0){e=0;f=0;while(1){b=0;G[c+2124>>2]=0;a=e+1|0;if((j|0)>0){while(1){q=(c+2144|0)+(f<<3)|0;L[q>>3]=(b|0)==(e|0)?1:0;G[c+864>>2]=a;G[c+868>>2]=b+1;b=c+2128|0;db(b,29818,c+864|0);ob(p,b,q);b=G[c+2124>>2]+1|0;G[c+2124>>2]=b;f=f+1|0;j=G[c+2120>>2];if((j|0)>(b|0)){continue}break}}e=a;if((j|0)>(a|0)){continue}break}}qm(d,L[c+2840>>3],L[c+2832>>3],c+2144|0);break ua}if(Zb(p,41180,c+1967|0,c+2144|0)){j=G[c+2120>>2];if((j|0)>0){e=0;f=0;while(1){b=0;G[c+2124>>2]=0;a=e+1|0;if((j|0)>0){while(1){q=(c+2144|0)+(f<<3)|0;L[q>>3]=(b|0)==(e|0)?1:0;G[c+848>>2]=a;G[c+852>>2]=b+1;b=c+2128|0;db(b,29808,c+848|0);Zb(p,b,c+1967|0,q);b=G[c+2124>>2]+1|0;G[c+2124>>2]=b;f=f+1|0;j=G[c+2120>>2];if((j|0)>(b|0)){continue}break}}e=a;if((j|0)>(a|0)){continue}break}}qm(d,L[c+2840>>3],L[c+2832>>3],c+2144|0);break ua}G[c+1944>>2]=0;G[c+1948>>2]=0;Zb(p,q?40896:41309,c+1967|0,c+1944|0);rj(d,L[c+2840>>3],L[c+2832>>3],L[c+1944>>3]);break ua}G[d+40>>2]=0;G[d+44>>2]=1072693248;G[d+32>>2]=0;G[d+36>>2]=1072693248;G[d+3300>>2]=0;G[d+48>>2]=0;G[d+52>>2]=0;G[d+768>>2]=0;G[d+772>>2]=1072693248;G[d+760>>2]=0;G[d+764>>2]=1072693248;jd(41398)}Ca:{if(G[d+3260>>2]!=3|G[d+3316>>2]!=2){break Ca}a=G[d+3168>>2];if(a){tg(a);G[d+3168>>2]=0}a=G[d+3172>>2];if(a){tg(a);G[d+3172>>2]=0}f=0;G[d+1560>>2]=0;cb(d+1568|0,0,1600);cb(d+4424|0,0,1600);G[c+2124>>2]=0;j=0;while(1){G[c+836>>2]=j;G[c+832>>2]=1;a=c+2128|0;db(a,29879,c+832|0);Da:{if(!Zb(p,a,c+1967|0,((G[c+2124>>2]<<3)+d|0)+1568|0)){b=G[c+2124>>2];a=((b<<3)+d|0)+1568|0;G[a>>2]=0;G[a+4>>2]=0;break Da}f=f+1|0;b=G[c+2124>>2]}j=b+1|0;G[c+2124>>2]=j;if((b|0)<99){continue}break}j=0;G[c+2124>>2]=0;while(1){G[c+820>>2]=j;G[c+816>>2]=2;a=c+2128|0;db(a,29879,c+816|0);Ea:{if(Zb(p,a,c+1967|0,((G[c+2124>>2]<<3)+d|0)+2368|0)){f=f+1|0;b=G[c+2124>>2];break Ea}b=G[c+2124>>2];a=((b<<3)+d|0)+2368|0;G[a>>2]=0;G[a+4>>2]=0}j=b+1|0;G[c+2124>>2]=j;if((b|0)<99){continue}break}if(G[d+6048>>2]==1|(f|0)<=0){break Ca}b=100;i=M(G[d+4024>>2],100);q=M(G[d+4028>>2],100);h=d+1568|0;while(1){e=b<<3;a=e+d|0;L[a+4424>>3]=L[h+(b+q<<3)>>3];L[a+5224>>3]=L[h+(b+i<<3)>>3];if(b){a=d+4424|0;f=b-1|0;L[a+(f<<3)>>3]=L[h+(f+q<<3)>>3];L[(a+e|0)+792>>3]=L[h+(f+i<<3)>>3];b=b-2|0;continue}break}k=Fa-224|0;Fa=k;G[k+168>>2]=1;G[k+172>>2]=1;Fa:{if(G[d+3316>>2]!=2){break Fa}b=G[d+4028>>2];h=G[d+4024>>2];u=d+4008|0;if(Xa(u,34606)|L[(M(h,800)+d|0)+1576>>3]==0&L[(M(b,800)+d|0)+1576>>3]==0){break Fa}a=G[d+9392>>2];Ga:{if(a){cc(a,0,0,k+72|0,k- -64|0);cc(G[d+9392>>2],L[d+136>>3],L[d+144>>3],k+56|0,k+48|0);break Ga}G[k+64>>2]=0;G[k+68>>2]=0;G[k+72>>2]=0;G[k+76>>2]=0;L[k+56>>3]=L[d+136>>3];L[k+48>>3]=L[d+144>>3]}Ha:{if(!h){g=L[k+64>>3];o=L[k+48>>3]-g;t=L[k+72>>3];n=L[k+56>>3]-t;break Ha}g=L[k+72>>3];o=L[k+56>>3]-g;t=L[k+64>>3];n=L[k+48>>3]-t}e=lb(288,8);i=lb(144,8);q=lb(144,8);f=b<<3;b=k+192|0;B=f+b|0;g=g+.5;L[B>>3]=g;a=k+176|0;D=a+f|0;L[D>>3]=g;m=b;b=h<<3;z=m+b|0;g=t+.5;L[z>>3]=g;j=a+b|0;L[j>>3]=g;J=d+4144|0;x=d+4036|0;n=n/11;g=o/11;a=k+208|0;s=a+f|0;A=a+b|0;r=11;a=e;b=q;w=i;while(1){m=r;L[z>>3]=L[j>>3];f=11;while(1){if(Yh(k+192|0,x,k+208|0)){G[k+32>>2]=u;h=k+80|0;db(h,9038,k+32|0);jd(h)}L[w>>3]=L[A>>3];L[b>>3]=L[s>>3];vm(J,L[A>>3],L[s>>3],a,a+8|0);L[z>>3]=n+L[z>>3];h=f;f=f-1|0;a=a+16|0;b=b+8|0;w=w+8|0;if(h){continue}break}L[B>>3]=g+L[B>>3];r=m-1|0;if(m){continue}break}a=k+208|0;Yh(k+176|0,x,a);L[A>>3]=L[A>>3]+.0002777777777777778;zj(a,x,k+192|0);g=L[z>>3]-L[j>>3];n=g*g;g=L[B>>3]-L[D>>3];g=V(n+g*g)*3600;if(g==0){G[k+16>>2]=u;a=k+80|0;db(a,9038,k+16|0);jd(a)}G[k+164>>2]=1;g=.04/g;r=0;a=1;Ia:{while(1){if((a|0)>=2){tg(r)}r=Im(k+168|0,k+164|0);Gm(r,e,i);f=143;a=e;b=i;Ja:{while(1){h=g>3]);if(h){break Ja}h=f;f=f-1|0;a=a+16|0;b=b+8|0;if(h){continue}break}G[k+164>>2]=G[k+164>>2]+1;break Ia}b=G[k+164>>2];a=b+1|0;G[k+164>>2]=a;if(h&(b|0)<=8){continue}break}jd(14561);G[d+1560>>2]=1}G[d+3168>>2]=r;G[d+6024>>2]=r;a=k+208|0;Yh(k+176|0,x,a);L[s>>3]=L[s>>3]+.0002777777777777778;zj(a,x,k+192|0);g=L[z>>3]-L[j>>3];n=g*g;g=L[B>>3]-L[D>>3];g=V(n+g*g)*3600;if(g==0){G[k>>2]=u;a=k+80|0;db(a,9038,k);jd(a)}G[k+164>>2]=1;g=.04/g;a=1;Ka:{while(1){if((a|0)>=2){tg(r)}r=Im(k+168|0,k+164|0);Gm(r,e,q);f=143;a=e;b=q;La:{while(1){h=g>3]);if(h){break La}h=f;f=f-1|0;a=a+16|0;b=b+8|0;if(h){continue}break}G[k+164>>2]=G[k+164>>2]+1;break Ka}b=G[k+164>>2];a=b+1|0;G[k+164>>2]=a;if(h&(b|0)<=8){continue}break}jd(14561);G[d+1560>>2]=1}G[d+3172>>2]=r;G[d+6028>>2]=r;Wa(e);Wa(i);Wa(q)}Fa=k+224|0;G[d+4064>>2]=0}a=d+3544|0;Ma:{if(fb(a,34142,6)){if(fb(a,34781,5)){break Ma}}G[d+3288>>2]=5;G[d+3292>>2]=-1}Na:{if(ob(p,33932,c+1952|0)){L[d+128>>3]=(L[c+1952>>3]+-15019.81352)/365.242198781+1900;break Na}b=d+128|0;if(!vg(p,33923,b)){if(vg(p,35389,b)){break Na}if(ob(p,34948,b)){break Na}L[d+128>>3]=L[d+120>>3];break Na}a=c+2912|0;ie(p,33923,32,a);if(jb(a,84)){break Na}if(ob(p,33299,c+1936|0)){L[b>>3]=L[b>>3]+L[c+1936>>3]/8765.812770744;break Na}if(!ob(p,35806,c+1936|0)){break Na}L[b>>3]=L[b>>3]+L[c+1936>>3]/8765.812770744}G[d+3312>>2]=1}G[d+3328>>2]=0;G[d+3296>>2]=0;G[d+3284>>2]=1;G[d+4052>>2]=I;G[d+4044>>2]=d+616;G[d+4048>>2]=K;e=0;w=Fa-32|0;Fa=w;if(!(!d|!G[d+3312>>2])){while(1){Oa:{if(!e){G[w+24>>2]=H[35802]|H[35803]<<8|(H[35804]<<16|H[35805]<<24);a=H[35798]|H[35799]<<8|(H[35800]<<16|H[35801]<<24);G[w+16>>2]=H[35794]|H[35795]<<8|(H[35796]<<16|H[35797]<<24);G[w+20>>2]=a;break Oa}G[w>>2]=e;db(w+16|0,29995,w)}a=e<<2;i=G[a+1285504>>2];Pa:{if(i){if(!G[d+3312>>2]){break Pa}m=Va(i);if((m|0)<=0){break Pa}h=(a+d|0)+9288|0;a=G[h>>2];if(a){Wa(a)}a=lb(m+2|0,1);G[h>>2]=a;if(!a){break Pa}a=0;if((m|0)!=1){f=m&-2;u=0;while(1){b=H[a+i|0];E[G[h>>2]+a|0]=(b|0)==95?32:b;b=a|1;q=H[b+i|0];E[b+G[h>>2]|0]=(q|0)==95?32:q;a=a+2|0;u=u+2|0;if((f|0)!=(u|0)){continue}break}}if(m&1){b=G[h>>2]+a|0;a=H[a+i|0];E[b|0]=(a|0)==95?32:a}E[m+G[h>>2]|0]=0;break Pa}i=Fd(w+16|0);if(i){if(!G[d+3312>>2]){break Pa}m=Va(i);if((m|0)<=0){break Pa}h=(a+d|0)+9288|0;a=G[h>>2];if(a){Wa(a)}a=lb(m+2|0,1);G[h>>2]=a;if(!a){break Pa}a=0;if((m|0)!=1){f=m&-2;u=0;while(1){b=H[a+i|0];E[G[h>>2]+a|0]=(b|0)==95?32:b;b=a|1;q=H[b+i|0];E[b+G[h>>2]|0]=(q|0)==95?32:q;a=a+2|0;u=u+2|0;if((f|0)!=(u|0)){continue}break}}if(m&1){b=G[h>>2]+a|0;a=H[a+i|0];E[b|0]=(a|0)==95?32:a}E[m+G[h>>2]|0]=0;break Pa}Qa:{switch(e-1|0){case 0:if(!G[d+3312>>2]){break Pa}a=G[d+9292>>2];if(a){Wa(a)}a=lb(13,1);G[d+9292>>2]=a;if(!a){break Pa}E[a+8|0]=32;E[a+9|0]=37;E[a+10|0]=115;E[a+11|0]=0;E[a|0]=115;E[a+1|0]=117;E[a+2|0]=97;E[a+3|0]=50;E[a+4|0]=32;E[a+5|0]=45;E[a+6|0]=97;E[a+7|0]=104;break Pa;case 1:if(!G[d+3312>>2]){break Pa}a=G[d+9296>>2];if(a){Wa(a)}a=lb(13,1);G[d+9296>>2]=a;if(!a){break Pa}E[a+8|0]=32;E[a+9|0]=37;E[a+10|0]=115;E[a+11|0]=0;E[a|0]=115;E[a+1|0]=103;E[a+2|0]=115;E[a+3|0]=99;E[a+4|0]=32;E[a+5|0]=45;E[a+6|0]=97;E[a+7|0]=104;break Pa;case 2:if(!G[d+3312>>2]){break Pa}a=G[d+9300>>2];if(a){Wa(a)}a=lb(13,1);G[d+9300>>2]=a;if(!a){break Pa}E[a+8|0]=32;E[a+9|0]=37;E[a+10|0]=115;E[a+11|0]=0;E[a|0]=115;E[a+1|0]=116;E[a+2|0]=121;E[a+3|0]=50;E[a+4|0]=32;E[a+5|0]=45;E[a+6|0]=97;E[a+7|0]=104;break Pa;case 3:if(!G[d+3312>>2]){break Pa}a=G[d+9304>>2];if(a){Wa(a)}a=lb(13,1);G[d+9304>>2]=a;if(!a){break Pa}E[a+8|0]=32;E[a+9|0]=37;E[a+10|0]=115;E[a+11|0]=0;E[a|0]=115;E[a+1|0]=112;E[a+2|0]=112;E[a+3|0]=109;E[a+4|0]=32;E[a+5|0]=45;E[a+6|0]=97;E[a+7|0]=104;break Pa;case 4:if(!G[d+3312>>2]){break Pa}a=G[d+9308>>2];if(a){Wa(a)}a=lb(13,1);G[d+9308>>2]=a;if(!a){break Pa}E[a+8|0]=32;E[a+9|0]=37;E[a+10|0]=115;E[a+11|0]=0;E[a|0]=115;E[a+1|0]=115;E[a+2|0]=97;E[a+3|0]=111;E[a+4|0]=32;E[a+5|0]=45;E[a+6|0]=97;E[a+7|0]=104;break Pa;default:break Qa}}G[(a+d|0)+9288>>2]=0}e=e+1|0;if((e|0)!=10){continue}break}}Fa=w+32|0;break c}Ce(d);d=0}Fa=c+3008|0;return d}function Wt(a,b,c){a=a|0;b=b|0;c=c|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,J=0,K=0,L=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;_=Fa-16|0;Fa=_;if(G[a+5060>>2]!=4){w=a;Z=c;x=_+12|0;if(x){G[x>>2]=0}a:{b:{c:{d:{e:{if(!w){break e}G[w+5060>>2]=0;if(!b){break e}if((Z|0)>=0){break d}}if(x){G[x>>2]=-2}a=0;if(!w){break a}G[w+5060>>2]=-2;break b}if(H[w+5008|0]){if(x){G[x>>2]=-1}G[w+5060>>2]=-1;break b}if(!Z){if(x){G[x>>2]=0}G[w+5060>>2]=0;break b}G[w+5028>>2]=b;G[w+5032>>2]=Z;ba=w+4|0;$=w+5012|0;while(1){b=G[w>>2];f:{if(G[b+76>>2]<0){a=G[b>>2];break f}a=G[b>>2]}if(a>>>5&1){break c}g:{if(G[w+5016>>2]){break g}a=Tf(b);if((a|0)==-1){break g}ak(a,b);b=zc(ba,1,5e3,G[w>>2]);a=G[w>>2];h:{if(G[a+76>>2]<0){a=G[a>>2];break h}a=G[a>>2]}if(a>>>5&1){break c}G[w+5016>>2]=b;G[w+5004>>2]=b;G[w+5012>>2]=ba}S=Fa-32|0;Fa=S;f=-2;i:{if(!$){break i}d=G[$+32>>2];if(!d|G[d>>2]!=($|0)){break i}Q=d+1092|0;i=G[d+4>>2];aa=G[24367];while(1){f=-1;j:{k:{l:{m:{n:{switch(i-1|0){case 1:b=H[d+16|0];if(!H[d+40|0]){break m}l=G[d>>2];a=G[l+20>>2];if(!b){break l}if(!a){break k}g=G[d+12>>2];while(1){if(g){E[G[l+16>>2]]=H[d+8|0];b=G[d+3168>>2];a=G[((H[d+8|0]^b>>>24)<<2)+191040>>2];g=G[d+12>>2]-1|0;G[d+12>>2]=g;G[d+3168>>2]=a^b<<8;l=G[d>>2];b=G[l+24>>2]+1|0;G[l+24>>2]=b;G[l+16>>2]=G[l+16>>2]+1;a=G[l+20>>2]-1|0;G[l+20>>2]=a;if(!b){G[l+28>>2]=G[l+28>>2]+1}if(a){continue}break k}s=G[d+1088>>2];h=G[d+64064>>2];a=h+1|0;if((s|0)==(a|0)){break k}f=-4;if((a|0)<(s|0)){break i}G[d+12>>2]=1;j=G[d+60>>2];E[d+8|0]=j;c=G[d+56>>2];n=M(G[d+36>>2],1e5);if(c>>>0>=n>>>0){break i}i=0;g=256;while(1){b=g+i>>1;a=(c|0)>2];g=a?b:g;i=a?i:b;if((g-i|0)!=1){continue}break}k=G[d+3152>>2];b=I[k+(c<<1)>>1];q=G[d+3156>>2];r=b|H[q+(c>>>1|0)|0]>>>(c<<2&4)<<16&983040;G[d+56>>2]=r;p=G[d+20>>2];if(!p){a=G[d+24>>2];p=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=1;o=s+1|0;G[d+1088>>2]=o;c=p-1|0;G[d+20>>2]=c;o:{if((h|0)==(s|0)){break o}a=i&255^(c|0)==1;if((a|0)!=(j|0)){G[d+60>>2]=a;break o}G[d+12>>2]=2;if(n>>>0<=r>>>0){break i}i=0;g=256;while(1){e=g+i>>1;a=(r|0)>2];g=a?e:g;i=a?i:e;if((g-i|0)!=1){continue}break}a=H[q+(r>>>1|0)|0]>>>(b<<2&4)<<16&983040;b=I[k+(r<<1)>>1];p=a|b;G[d+56>>2]=p;if(!c){a=G[d+24>>2];c=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=2;e=s+2|0;G[d+1088>>2]=e;c=c-1|0;G[d+20>>2]=c;if((h|0)==(o|0)){break o}a=i&255^(c|0)==1;if((a|0)!=(j|0)){G[d+60>>2]=a;break o}G[d+12>>2]=3;if(n>>>0<=p>>>0){break i}i=0;g=256;while(1){o=g+i>>1;a=(p|0)>2];g=a?o:g;i=a?i:o;if((g-i|0)!=1){continue}break}a=H[q+(p>>>1|0)|0]>>>(b<<2&4)<<16&983040;b=I[k+(p<<1)>>1];o=a|b;G[d+56>>2]=o;if(!c){a=G[d+24>>2];c=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=3;G[d+1088>>2]=s+3;c=c-1|0;G[d+20>>2]=c;if((e|0)==(h|0)){break o}a=i&255^(c|0)==1;if((a|0)!=(j|0)){G[d+60>>2]=a;break o}if(n>>>0<=o>>>0){break i}i=0;g=256;while(1){e=g+i>>1;a=(o|0)>2];g=a?e:g;i=a?i:e;if((g-i|0)!=1){continue}break}a=H[q+(o>>>1|0)|0]>>>(b<<2&4)<<16&983040;b=I[k+(o<<1)>>1];o=a|b;G[d+56>>2]=o;if(!c){a=G[d+24>>2];c=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}G[d+1088>>2]=s+4;c=c-1|0;G[d+20>>2]=c;g=(i&255^(c|0)==1)+4|0;G[d+12>>2]=g;if(n>>>0<=o>>>0){break i}i=0;p=256;while(1){e=i+p>>1;a=(o|0)>2];p=a?e:p;i=a?i:e;if((p-i|0)!=1){continue}break}G[d+60>>2]=i;G[d+56>>2]=I[k+(o<<1)>>1]|H[q+(o>>>1|0)|0]>>>(b<<2&4)<<16&983040;if(!c){a=G[d+24>>2];c=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}G[d+1088>>2]=s+5;a=c-1|0;G[d+20>>2]=a;G[d+60>>2]=(a|0)==1^i}if(G[l+20>>2]){continue}break};break k;case 0:break i;default:break n}}if((i|0)<10){continue}break j}if(b){b=G[d>>2];if(!G[b+20>>2]){break k}g=G[d+12>>2];while(1){if(g){E[G[b+16>>2]]=H[d+8|0];b=G[d+3168>>2];a=G[((H[d+8|0]^b>>>24)<<2)+191040>>2];g=G[d+12>>2]-1|0;G[d+12>>2]=g;G[d+3168>>2]=a^b<<8;b=G[d>>2];c=G[b+24>>2]+1|0;G[b+24>>2]=c;G[b+16>>2]=G[b+16>>2]+1;a=G[b+20>>2]-1|0;G[b+20>>2]=a;if(!c){G[b+28>>2]=G[b+28>>2]+1}if(!a){break k}continue}q=G[d+1088>>2];j=G[d+64064>>2];a=j+1|0;if((q|0)==(a|0)){break k}f=-4;if((a|0)<(q|0)){break i}G[d+12>>2]=1;i=G[d+60>>2];E[d+8|0]=i;a=G[d+56>>2];k=M(G[d+36>>2],1e5);if(a>>>0>=k>>>0){break i}h=G[d+3148>>2];c=G[h+(a<<2)>>2];e=c>>>8|0;G[d+56>>2]=e;r=G[d+20>>2];if(!r){a=G[d+24>>2];r=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=1;l=q+1|0;G[d+1088>>2]=l;r=r-1|0;G[d+20>>2]=r;p:{if((j|0)==(q|0)){break p}a=c&255^(r|0)==1;if((a|0)!=(i|0)){G[d+60>>2]=a;break p}G[d+12>>2]=2;if(e>>>0>=k>>>0){break i}c=G[h+(e<<2)>>2];o=c>>>8|0;G[d+56>>2]=o;if(!r){a=G[d+24>>2];r=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=2;e=q+2|0;G[d+1088>>2]=e;r=r-1|0;G[d+20>>2]=r;if((j|0)==(l|0)){break p}a=c&255^(r|0)==1;if((a|0)!=(i|0)){G[d+60>>2]=a;break p}G[d+12>>2]=3;if(k>>>0<=o>>>0){break i}c=G[h+(o<<2)>>2];l=c>>>8|0;G[d+56>>2]=l;if(!r){a=G[d+24>>2];r=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}g=3;G[d+1088>>2]=q+3;r=r-1|0;G[d+20>>2]=r;if((e|0)==(j|0)){break p}a=c&255^(r|0)==1;if((a|0)!=(i|0)){G[d+60>>2]=a;break p}if(k>>>0<=l>>>0){break i}c=G[h+(l<<2)>>2];e=c>>>8|0;G[d+56>>2]=e;if(!r){a=G[d+24>>2];r=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}G[d+1088>>2]=q+4;p=r-1|0;G[d+20>>2]=p;g=(c&255^(p|0)==1)+4|0;G[d+12>>2]=g;if(e>>>0>=k>>>0){break i}a=G[h+(e<<2)>>2];G[d+56>>2]=a>>>8;c=a&255;G[d+60>>2]=c;if(!p){a=G[d+24>>2];p=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}G[d+1088>>2]=q+5;a=p-1|0;G[d+20>>2]=a;G[d+60>>2]=c^(a|0)==1}if(G[b+20>>2]){continue}break}break k}n=M(G[d+36>>2],1e5);q=G[d+64064>>2];o=q+1|0;l=G[d+56>>2];s=G[d+3148>>2];c=G[d+60>>2];a=G[d+1088>>2];p=G[d+12>>2];e=H[d+8|0];i=G[d+3168>>2];b=G[d>>2];g=G[b+16>>2];k=G[b+20>>2];r=k;q:{r:while(1){s:{t:{u:{if((p|0)<=0){b=a;break u}if(!r){break s}b=e&255;while(1){if((p|0)==1){b=a;p=0;break t}E[g|0]=e;i=G[((b^i>>>24)<<2)+191040>>2]^i<<8;g=g+1|0;p=p-1|0;r=r-1|0;if(r){continue}break}break s}p=1}while(1){if(!p){if(!r){r=0;p=1;break q}E[g|0]=e;i=G[((e&255^i>>>24)<<2)+191040>>2]^i<<8;r=r-1|0;g=g+1|0;p=1;continue}f=-4;if((b|0)>(o|0)){break i}if((b|0)==(o|0)){p=0;b=o;break q}if(l>>>0>=n>>>0){break i}e=c;a=b+1|0;c=G[s+(l<<2)>>2];l=c>>>8|0;v:{c=c&255;if((e|0)!=(c|0)){b=a;break v}if((b|0)==(q|0)){b=a;c=e;break v}if(l>>>0>=n>>>0){break i}p=2;h=G[s+(l<<2)>>2];l=h>>>8|0;c=e;a=o;j=b+2|0;if((a|0)==(j|0)){continue r}a=j;j=c;c=h&255;if((j|0)!=(c|0)){continue r}if(l>>>0>=n>>>0){break i}h=G[s+(l<<2)>>2];l=h>>>8|0;p=3;c=e;a=o;j=b+3|0;if((a|0)==(j|0)){continue r}a=j;j=c;c=h&255;if((j|0)!=(c|0)){continue r}if(l>>>0>=n>>>0){break i}l=G[s+(l<<2)>>2];c=l>>>8|0;if(c>>>0>=n>>>0){break i}a=b+5|0;p=(l&255)+4|0;b=G[s+(c<<2)>>2];l=b>>>8|0;c=b&255;continue r}p=0;continue}}break}b=a;r=0}j=G[d>>2];a=G[j+24>>2];o=a+(k-r|0)|0;G[j+24>>2]=o;if(a>>>0>o>>>0){G[j+28>>2]=G[j+28>>2]+1}G[d+1088>>2]=b;G[d+12>>2]=p;E[d+8|0]=e;G[d+3168>>2]=i;G[d+3148>>2]=s;G[d+60>>2]=c;G[d+56>>2]=l;G[j+20>>2]=r;G[j+16>>2]=g;break k}if(!a){break k}g=G[d+12>>2];while(1){if(g){E[G[l+16>>2]]=H[d+8|0];b=G[d+3168>>2];a=G[((H[d+8|0]^b>>>24)<<2)+191040>>2];g=G[d+12>>2]-1|0;G[d+12>>2]=g;G[d+3168>>2]=a^b<<8;l=G[d>>2];b=G[l+24>>2]+1|0;G[l+24>>2]=b;G[l+16>>2]=G[l+16>>2]+1;a=G[l+20>>2]-1|0;G[l+20>>2]=a;if(!b){G[l+28>>2]=G[l+28>>2]+1}if(!a){break k}continue}n=G[d+1088>>2];p=G[d+64064>>2];a=p+1|0;if((n|0)==(a|0)){break k}f=-4;if((a|0)<(n|0)){break i}G[d+12>>2]=1;j=G[d+60>>2];E[d+8|0]=j;o=G[d+56>>2];q=M(G[d+36>>2],1e5);if(o>>>0>=q>>>0){break i}i=0;g=256;while(1){b=g+i>>1;a=(o|0)>2];g=a?b:g;i=a?i:b;if((g-i|0)!=1){continue}break}g=1;k=G[d+3152>>2];e=I[k+(o<<1)>>1];r=G[d+3156>>2];a=H[r+(o>>>1|0)|0];c=n+1|0;G[d+1088>>2]=c;h=e|a>>>(o<<2&4)<<16&983040;G[d+56>>2]=h;w:{if((n|0)==(p|0)){break w}a=i&255;if((a|0)!=(j|0)){G[d+60>>2]=a;break w}G[d+12>>2]=2;if(h>>>0>=q>>>0){break i}i=0;g=256;while(1){b=g+i>>1;a=(h|0)>2];g=a?b:g;i=a?i:b;if((g-i|0)!=1){continue}break}o=I[k+(h<<1)>>1];a=H[r+(h>>>1|0)|0];g=2;b=n+2|0;G[d+1088>>2]=b;h=o|a>>>(e<<2&4)<<16&983040;G[d+56>>2]=h;if((c|0)==(p|0)){break w}a=i&255;if((a|0)!=(j|0)){G[d+60>>2]=a;break w}G[d+12>>2]=3;if(h>>>0>=q>>>0){break i}i=0;g=256;while(1){c=g+i>>1;a=(h|0)>2];g=a?c:g;i=a?i:c;if((g-i|0)!=1){continue}break}e=I[k+(h<<1)>>1];a=H[r+(h>>>1|0)|0];g=3;G[d+1088>>2]=n+3;o=e|a>>>(o<<2&4)<<16&983040;G[d+56>>2]=o;if((b|0)==(p|0)){break w}a=i&255;if((a|0)!=(j|0)){G[d+60>>2]=a;break w}if(o>>>0>=q>>>0){break i}i=0;g=256;while(1){b=g+i>>1;a=(o|0)>2];g=a?b:g;i=a?i:b;if((g-i|0)!=1){continue}break}c=I[k+(o<<1)>>1];a=H[r+(o>>>1|0)|0];G[d+1088>>2]=n+4;g=(i&255)+4|0;G[d+12>>2]=g;e=c|a>>>(e<<2&4)<<16&983040;G[d+56>>2]=e;if(e>>>0>=q>>>0){break i}i=0;p=256;while(1){b=i+p>>1;a=(e|0)>2];p=a?b:p;i=a?i:b;if((p-i|0)!=1){continue}break}G[d+60>>2]=i;b=I[k+(e<<1)>>1];a=H[r+(e>>>1|0)|0];G[d+1088>>2]=n+5;G[d+56>>2]=b|a>>>(c<<2&4)<<16&983040}if(G[l+20>>2]){continue}break}}f=0;if(G[d+12>>2]|G[d+1088>>2]!=(G[d+64064>>2]+1|0)){break i}b=G[d+3168>>2]^-1;G[d+3168>>2]=b;a=G[d+48>>2];if((a|0)>=3){a=G[d+3160>>2];G[S+20>>2]=b;G[S+16>>2]=a;_a(aa,1024,S+16|0);a=G[d+48>>2]}if((a|0)>=2){Ub(93,aa)}a=G[d+3168>>2];if((a|0)!=G[d+3160>>2]){f=-4;break i}G[d+4>>2]=14;Aa=d,Ba=Eu(G[d+3172>>2],1)^a,G[Aa+3172>>2]=Ba}a=0;e=0;j=0;f=0;i=0;k=0;o=0;g=0;n=0;l=0;q=0;u=0;h=0;s=0;p=0;r=0;A=0;y=0;B=0;z=0;C=0;O=0;D=0;L=0;t=0;J=0;K=0;N=0;T=0;U=0;V=0;W=0;P=0;Y=0;X=0;R=Fa-16|0;Fa=R;ca=d+64020|0;v=G[d>>2];x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{V:{W:{X:{Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{ga:{ha:{ia:{ja:{ka:{la:{ma:{na:{oa:{pa:{qa:{ra:{sa:{ta:{ua:{va:{wa:{xa:{ya:{za:{Aa:{Ba:{Ca:{Da:{Ea:{Fa:{Ga:{Ha:{Ia:{Ja:{Ka:{La:{Ma:{Na:{Oa:{Pa:{Qa:{Ra:{Sa:{Ta:{Ua:{Va:{Wa:{Xa:{Ya:{Za:{_a:{$a:{ab:{bb:{cb:{db:{eb:{fb:{gb:{hb:{c=G[d+4>>2];if((c|0)==10){cb(ca,0,96);G[d+4>>2]=10;da=d+64112|0;ea=d+64108|0;fa=d+64104|0;ga=d+64100|0;ha=d+64096|0;ia=d+64092|0;ja=d+64088|0;ka=d+64084|0;la=d+64080|0;ma=d+64076|0;na=d+64072|0;oa=d+64068|0;pa=d+64064|0;qa=d+64060|0;ra=d+64056|0;sa=d+64052|0;ta=d+64048|0;ua=d+64044|0;va=d+64040|0;wa=d+64036|0;xa=d+64032|0;ya=d+64028|0;za=d+64024|0;c=G[d+32>>2];if((c|0)<=7){break hb}k=G[d+28>>2];break gb}da=d+64112|0;ea=d+64108|0;fa=d+64104|0;ga=d+64100|0;ha=d+64096|0;ia=d+64092|0;ja=d+64088|0;ka=d+64084|0;la=d+64080|0;ma=d+64076|0;na=d+64072|0;oa=d+64068|0;pa=d+64064|0;qa=d+64060|0;ra=d+64056|0;sa=d+64052|0;ta=d+64048|0;ua=d+64044|0;va=d+64040|0;wa=d+64036|0;xa=d+64032|0;ya=d+64028|0;za=d+64024|0;U=G[d+64112>>2];V=G[d+64108>>2];W=G[d+64104>>2];T=G[d+64100>>2];P=G[d+64096>>2];X=G[d+64092>>2];z=G[d+64088>>2];b=G[d+64084>>2];l=G[d+64080>>2];Y=G[d+64076>>2];o=G[d+64072>>2];g=G[d+64068>>2];n=G[d+64064>>2];t=G[d+64060>>2];A=G[d+64056>>2];y=G[d+64052>>2];C=G[d+64048>>2];D=G[d+64044>>2];p=G[d+64040>>2];L=G[d+64036>>2];B=G[d+64032>>2];O=G[d+64028>>2];r=G[d+64024>>2];s=G[d+64020>>2];ib:{switch(c-11|0){case 31:c=G[d+32>>2];break va;case 26:c=G[d+32>>2];m=0;break Q;case 28:J=G[d+32>>2];m=0;break P;case 25:break R;case 19:break V;case 9:break da;case 3:break wa;case 23:break Aa;case 22:break Ba;case 21:break Ca;case 18:break Da;case 17:break Ea;case 29:break Fa;case 27:break Ga;case 39:break Ia;case 38:break Ja;case 37:break Ka;case 36:break La;case 35:break Ma;case 34:break Na;case 33:break Oa;case 32:break Pa;case 24:break Qa;case 20:break Ra;case 16:break Sa;case 15:break Ta;case 14:break Ua;case 13:break Va;case 12:break Wa;case 11:break Xa;case 10:break Ya;case 8:break Za;case 7:break _a;case 6:break $a;case 5:break ab;case 4:break bb;case 2:break cb;case 1:break db;case 0:break fb;case 30:break ib;default:break Ha}}K=G[d+32>>2];m=1;break P}f=G[v+4>>2];a=c;while(1){if(!f){a=0;f=0;break y}m=G[v>>2];b=H[m|0];c=a+8|0;G[d+32>>2]=c;k=b|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[v+4>>2]=f;G[v>>2]=m+1;b=G[v+8>>2]+1|0;G[v+8>>2]=b;if(!b){G[v+12>>2]=G[v+12>>2]+1}b=(a|0)>=0;a=c;if(!b){continue}break}}c=c-8|0;G[d+32>>2]=c;u=-5;b=0;f=0;a=0;if((k>>>c&255)==66){break eb}break y}c=G[d+32>>2];a=s}s=a;G[d+4>>2]=11;if((c|0)>=8){k=G[d+28>>2];break za}f=G[v+4>>2];a=c;while(1){if(!f){break O}i=G[v>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;k=e|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[v+4>>2]=f;G[v>>2]=i+1;e=G[v+8>>2]+1|0;G[v+8>>2]=e;if(!e){G[v+12>>2]=G[v+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}break za}c=G[d+32>>2];break ya}c=G[d+32>>2];break xa}c=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ta}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ha}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ga}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break fa}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ea}c=G[d+32>>2];break ca}c=G[d+32>>2];break ba}c=G[d+32>>2];break aa}c=G[d+32>>2];break $}c=G[d+32>>2];break _}c=G[d+32>>2];break Z}c=G[d+32>>2];break Y}c=G[d+32>>2];break U}N=G[d+32>>2];m=3;break S}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break qa}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break pa}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break oa}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break na}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ma}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break la}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ka}k=G[d+32>>2];f=r;a=p;q=n;j=g;e=o;i=l;h=b;break ja}zd(4001);zd(4002);break O}m=3;break P}m=4;break P}m=1;break X}m=1;break W}m=1;break T}m=1;break S}m=2;break S}c=c-8|0;G[d+32>>2]=c;u=-5;i=l;h=b;e=o;j=g;q=n;a=p;f=r;if((k>>>c&255)!=90){break y}}G[d+4>>2]=12;jb:{if((c|0)>=8){k=G[d+28>>2];break jb}f=G[v+4>>2];a=c;while(1){if(!f){break O}i=G[v>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;k=e|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[v+4>>2]=f;G[v>>2]=i+1;e=G[v+8>>2]+1|0;G[v+8>>2]=e;if(!e){G[v+12>>2]=G[v+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;u=-5;i=l;h=b;e=o;j=g;q=n;a=p;f=r;if((k>>>c&255)!=104){break y}}G[d+4>>2]=13;kb:{if((c|0)>=8){j=G[d+28>>2];break kb}f=G[v+4>>2];a=c;while(1){if(!f){break O}i=G[v>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[v+4>>2]=f;G[v>>2]=i+1;e=G[v+8>>2]+1|0;G[v+8>>2]=e;if(!e){G[v+12>>2]=G[v+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}a=c-8|0;G[d+32>>2]=a;a=j>>>a&255;G[d+36>>2]=a;u=-5;if(a-58>>>0<4294967287){break N}e=a-48|0;G[d+36>>2]=e;c=G[v+44>>2];a=G[v+36>>2];if(H[d+40|0]){Aa=d,Ba=Ja[a|0](c,M(e,2e5),1)|0,G[Aa+3152>>2]=Ba;c=Ja[G[v+36>>2]](G[v+44>>2],M(G[d+36>>2],1e5)>>1,1)|0;G[d+3156>>2]=c;u=-3;if(!G[d+3152>>2]){break N}i=l;h=b;e=o;j=g;q=n;a=p;f=r;if(!c){break y}break wa}a=Ja[a|0](c,M(e,4e5),1)|0;G[d+3148>>2]=a;if(a){break wa}u=-3;break N}G[d+4>>2]=14;c=G[d+32>>2];lb:{if((c|0)>=8){j=G[d+28>>2];break lb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;k=j>>>c&255;if((k|0)!=23){break ua}}f=r;a=p;q=n;j=g;e=o;i=l;h=b;G[d+4>>2]=42;if((c|0)<8){break sa}n=G[d+28>>2];break ra}u=-4;f=r;a=p;q=n;j=g;e=o;i=l;h=b;if((k|0)!=49){break y}}G[d+4>>2]=15;if((c|0)>=8){n=G[d+28>>2];break ia}g=G[d>>2];b=G[g+4>>2];k=c;while(1){if(!b){u=0;break y}o=G[g>>2];l=H[o|0];c=k+8|0;G[d+32>>2]=c;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;b=b-1|0;G[g+4>>2]=b;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(k|0)>=0;k=c;if(!l){continue}break}break ia}g=G[d>>2];b=G[g+4>>2];k=c;while(1){if(!b){u=0;break y}o=G[g>>2];l=H[o|0];c=k+8|0;G[d+32>>2]=c;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;b=b-1|0;G[g+4>>2]=b;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(k|0)>=0;k=c;if(!l){continue}break}}k=c-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=114){break y}}G[d+4>>2]=43;mb:{if((k|0)>=8){n=G[d+28>>2];break mb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=69){break y}}G[d+4>>2]=44;nb:{if((k|0)>=8){n=G[d+28>>2];break nb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=56){break y}}G[d+4>>2]=45;ob:{if((k|0)>=8){n=G[d+28>>2];break ob}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=80){break y}}G[d+4>>2]=46;pb:{if((k|0)>=8){n=G[d+28>>2];break pb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=144){break y}G[d+3164>>2]=0}G[d+4>>2]=47;qb:{if((k|0)>=8){n=G[d+28>>2];break qb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;G[d+3164>>2]=n>>>k&255|G[d+3164>>2]<<8}G[d+4>>2]=48;rb:{if((k|0)>=8){n=G[d+28>>2];break rb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;G[d+3164>>2]=n>>>k&255|G[d+3164>>2]<<8}G[d+4>>2]=49;sb:{if((k|0)>=8){n=G[d+28>>2];break sb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;G[d+3164>>2]=n>>>k&255|G[d+3164>>2]<<8}G[d+4>>2]=50;tb:{if((k|0)>=8){n=G[d+28>>2];break tb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}G[d+4>>2]=1;b=k-8|0;G[d+32>>2]=b;G[d+3164>>2]=n>>>b&255|G[d+3164>>2]<<8;u=4;break y}k=c-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=65){break y}}G[d+4>>2]=16;ub:{if((k|0)>=8){n=G[d+28>>2];break ub}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=89){break y}}G[d+4>>2]=17;vb:{if((k|0)>=8){n=G[d+28>>2];break vb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=38){break y}}G[d+4>>2]=18;wb:{if((k|0)>=8){n=G[d+28>>2];break wb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}k=k-8|0;G[d+32>>2]=k;u=-4;if((n>>>k&255)!=83){break y}}G[d+4>>2]=19;xb:{if((k|0)>=8){n=G[d+28>>2];break xb}g=G[d>>2];c=G[g+4>>2];b=k;while(1){if(!c){u=0;break y}o=G[g>>2];l=H[o|0];k=b+8|0;G[d+32>>2]=k;n=l|G[d+28>>2]<<8;G[d+28>>2]=n;c=c-1|0;G[g+4>>2]=c;G[g>>2]=o+1;l=G[g+8>>2]+1|0;G[g+8>>2]=l;if(!l){G[g+12>>2]=G[g+12>>2]+1}l=(b|0)>=0;b=k;if(!l){continue}break}}b=k-8|0;G[d+32>>2]=b;u=-4;if((n>>>b&255)!=89){break y}b=G[d+44>>2]+1|0;G[d+44>>2]=b;if(G[d+48>>2]>=2){G[R>>2]=b;_a(G[24367],66375,R)}G[d+3160>>2]=0;r=f;p=a;n=q;g=j;o=e;l=i;b=h}G[d+4>>2]=20;c=G[d+32>>2];yb:{if((c|0)>=8){j=G[d+28>>2];break yb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+3160>>2]=j>>>c&255|G[d+3160>>2]<<8}G[d+4>>2]=21;zb:{if((c|0)>=8){j=G[d+28>>2];break zb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+3160>>2]=j>>>c&255|G[d+3160>>2]<<8}G[d+4>>2]=22;Ab:{if((c|0)>=8){j=G[d+28>>2];break Ab}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+3160>>2]=j>>>c&255|G[d+3160>>2]<<8}G[d+4>>2]=23;Bb:{if((c|0)>=8){j=G[d+28>>2];break Bb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+3160>>2]=j>>>c&255|G[d+3160>>2]<<8}G[d+4>>2]=24;Cb:{if((c|0)>0){j=G[d+28>>2];break Cb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}}G[d+52>>2]=0;c=c-1|0;G[d+32>>2]=c;E[d+16|0]=j>>>c&1}G[d+4>>2]=25;Db:{if((c|0)>=8){j=G[d+28>>2];break Db}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+52>>2]=j>>>c&255|G[d+52>>2]<<8}G[d+4>>2]=26;Eb:{if((c|0)>=8){j=G[d+28>>2];break Eb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}c=c-8|0;G[d+32>>2]=c;G[d+52>>2]=j>>>c&255|G[d+52>>2]<<8}G[d+4>>2]=27;Fb:{if((c|0)>=8){j=G[d+28>>2];break Fb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>=0;a=c;if(!e){continue}break}}a=c-8|0;G[d+32>>2]=a;c=j>>>a&255|G[d+52>>2]<<8;G[d+52>>2]=c;k=0;u=-4;if((c|0)<0){break N}i=l;h=b;e=o;j=g;q=n;a=p;f=r;if((c|0)>(M(G[d+36>>2],1e5)|10)){break y}m=0}while(1){Gb:{Hb:{if(!m){if((k|0)>=16){break Hb}s=k;m=1;continue}G[d+4>>2]=28;c=G[d+32>>2];Ib:{if((c|0)>0){j=G[d+28>>2];break Ib}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}}a=c-1|0;G[d+32>>2]=a;E[(d+s|0)+3436|0]=j>>>a&1;k=s+1|0;break Gb}s=0;cb(d+3180|0,0,256);f=r;m=0;break W}m=0;continue}}while(1){Jb:{Kb:{Lb:{Mb:{if(!m){if((s|0)>15){break Mb}r=0;if(!H[(d+s|0)+3436|0]){break Jb}break Kb}G[d+4>>2]=29;c=G[d+32>>2];if((c|0)>0){j=G[d+28>>2];break Lb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}break Lb}a=0;G[d+3176>>2]=0;m=0;while(1){if(H[(d+m|0)+3180|0]){E[(a+d|0)+3452|0]=m;a=G[d+3176>>2]+1|0;G[d+3176>>2]=a}c=m|1;if(H[(c+d|0)+3180|0]){E[(a+d|0)+3452|0]=c;a=G[d+3176>>2]+1|0;G[d+3176>>2]=a}m=m+2|0;if((m|0)!=256){continue}break}if(!a){u=-4;i=l;h=b;e=o;j=g;q=n;break L}B=a+2|0;r=f;break V}a=c-1|0;G[d+32>>2]=a;if(j>>>a&1){E[(((s<<4)+r|0)+d|0)+3180|0]=1}r=r+1|0}f=r;if((f|0)>15){break Jb}m=1;continue}s=s+1|0;m=0;continue}}G[d+4>>2]=30;c=G[d+32>>2];Nb:{if((c|0)>=3){j=G[d+28>>2];break Nb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-6;a=c;if(!e){continue}break}}c=c-3|0;G[d+32>>2]=c;L=j>>>c&7;if(L>>>0>7){break U}u=-4;i=l;h=b;e=o;j=g;q=n;a=p;f=r;if(1<>2]=31;Ob:{if((c|0)>=15){j=G[d+28>>2];break Ob}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){u=0;i=l;h=b;e=o;j=g;q=n;a=p;break z}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>6;a=c;if(!e){continue}break}}c=c-15|0;G[d+32>>2]=c;a=0;p=j>>>c&32767;if(p){m=0;break T}u=-4;i=l;h=b;e=o;j=g;q=n;break z}while(1){Pb:{if(!m){if((a|0)>=(p|0)){break Pb}r=0;s=a;m=1;continue}while(1){G[d+4>>2]=32;c=G[d+32>>2];Qb:{if((c|0)>0){j=G[d+28>>2];break Qb}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}}a=c-1|0;G[d+32>>2]=a;if(j>>>a&1){u=-4;r=r+1|0;if((L|0)>(r|0)){continue}break N}break}E[(d+s|0)+25870|0]=r;a=s+1|0;m=0;continue}break}m=0;if((L|0)>0){while(1){E[(R+10|0)+m|0]=m;m=m+1|0;if((m&255)<(L|0)){continue}break}}O=0;s=0;if((p|0)>0){k=0;while(1){j=d+k|0;m=H[j+25870|0];h=H[m+(R+10|0)|0];Rb:{if(!m){break Rb}i=m-1|0;a=0;f=m;e=f&3;if(e){while(1){c=R+10|0;q=c+m|0;m=m-1|0;E[q|0]=H[c+m|0];f=f-1|0;a=a+1|0;if((e|0)!=(a&255)){continue}break}}if((i&255)>>>0<3){break Rb}while(1){c=m+R|0;m=m-4|0;a=m+(R+10|0)|0;a=H[a|0]|H[a+1|0]<<8|(H[a+2|0]<<16|H[a+3|0]<<24);E[c+7|0]=a;E[c+8|0]=a>>>8;E[c+9|0]=a>>>16;E[c+10|0]=a>>>24;f=f-4|0;if(f&255){continue}break}}E[R+10|0]=h;E[j+7868|0]=h;k=k+1|0;if((p|0)!=(k|0)){continue}break}s=p}m=0}while(1){Sb:{Tb:{Ub:{Vb:{switch(m|0){case 0:if((O|0)>=(L|0)){O=0;if((L|0)>0){O=B&-4;C=B&3;u=0;N=(B|0)<=0;D=B-1>>>0<3;while(1){Wb:{if(N){f=32;a=0;break Wb}q=0;f=32;a=0;m=0;i=0;if(!D){while(1){e=(M(u,258)+d|0)+43872|0;k=H[e+m|0];c=(f|0)<(k|0)?f:k;h=H[e+(m|1)|0];c=(c|0)<(h|0)?c:h;j=H[e+(m|2)|0];c=(c|0)<(j|0)?c:j;e=H[e+(m|3)|0];f=(c|0)<(e|0)?c:e;a=(a|0)>(k|0)?a:k;a=(a|0)>(h|0)?a:h;a=(a|0)>(j|0)?a:j;a=(a|0)>(e|0)?a:e;m=m+4|0;i=i+4|0;if((O|0)!=(i|0)){continue}break}}if(!C){break Wb}while(1){c=H[((M(u,258)+d|0)+m|0)+43872|0];f=(c|0)>(f|0)?f:c;a=(a|0)>(c|0)?a:c;m=m+1|0;q=q+1|0;if((C|0)!=(q|0)){continue}break}}t=M(u,1032)+d|0;m=t+45420|0;y=t+57804|0;v=(M(u,258)+d|0)+43872|0;i=0;j=a;c=f;s=(c|0)>(a|0);if(!s){n=B&-2;q=B&1;a=c;while(1){e=a;Xb:{if((B|0)<=0){break Xb}a=0;k=0;if((B|0)!=1){while(1){if((e|0)==H[a+v|0]){G[y+(i<<2)>>2]=a;i=i+1|0}h=a|1;if((e|0)==H[v+h|0]){G[y+(i<<2)>>2]=h;i=i+1|0}a=a+2|0;k=k+2|0;if((n|0)!=(k|0)){continue}break}}if(!q|(e|0)!=H[a+v|0]){break Xb}G[y+(i<<2)>>2]=a;i=i+1|0}a=e+1|0;if((e|0)!=(j|0)){continue}break}}t=cb(t+51612|0,0,92);Yb:{if((B|0)<=0){break Yb}i=0;if((B|0)!=1){h=B&-2;a=0;while(1){e=t+(H[i+v|0]<<2)|0;G[e+4>>2]=G[e+4>>2]+1;e=t+(H[v+(i|1)|0]<<2)|0;G[e+4>>2]=G[e+4>>2]+1;i=i+2|0;a=a+2|0;if((h|0)!=(a|0)){continue}break}}if(!(B&1)){break Yb}a=t+(H[i+v|0]<<2)|0;G[a+4>>2]=G[a+4>>2]+1}a=G[t+8>>2]+G[t+4>>2]|0;G[t+8>>2]=a;a=a+G[t+12>>2]|0;G[t+12>>2]=a;a=a+G[t+16>>2]|0;G[t+16>>2]=a;a=a+G[t+20>>2]|0;G[t+20>>2]=a;a=a+G[t+24>>2]|0;G[t+24>>2]=a;a=a+G[t+28>>2]|0;G[t+28>>2]=a;a=a+G[t+32>>2]|0;G[t+32>>2]=a;a=a+G[t+36>>2]|0;G[t+36>>2]=a;a=a+G[t+40>>2]|0;G[t+40>>2]=a;a=a+G[t+44>>2]|0;G[t+44>>2]=a;a=a+G[t+48>>2]|0;G[t+48>>2]=a;a=a+G[t+52>>2]|0;G[t+52>>2]=a;a=a+G[t+56>>2]|0;G[t+56>>2]=a;a=a+G[t+60>>2]|0;G[t+60>>2]=a;a=a+G[t+64>>2]|0;G[t+64>>2]=a;a=a+G[t+68>>2]|0;G[t+68>>2]=a;a=a+G[t+72>>2]|0;G[t+72>>2]=a;a=a+G[t+76>>2]|0;G[t+76>>2]=a;a=a+G[t+80>>2]|0;G[t+80>>2]=a;a=a+G[t+84>>2]|0;G[t+84>>2]=a;G[t+88>>2]=a+G[t+88>>2];m=cb(m,0,92);Zb:{if(s){break Zb}e=(j-c|0)+1|0;n=e&1;k=0;a=c;if((j|0)!=(a|0)){q=e&-2;h=0;while(1){s=a<<2;i=s+4|0;e=i+t|0;k=(G[e>>2]-G[s+t>>2]|0)+k|0;G[m+s>>2]=k-1;a=a+2|0;e=(G[t+(a<<2)>>2]-G[e>>2]|0)+(k<<1)|0;G[i+m>>2]=e-1;k=e<<1;h=h+2|0;if((q|0)!=(h|0)){continue}break}}if(!n){break Zb}a=a<<2;e=a+t|0;G[a+m>>2]=((G[e+4>>2]-G[e>>2]|0)+k|0)-1}_b:{if((c|0)>=(j|0)){break _b}i=c^-1;if(j-c&1){e=c<<2;c=c+1|0;a=t+(c<<2)|0;G[a>>2]=((G[e+m>>2]<<1)-G[a>>2]|0)+2}if((i|0)==(0-j|0)){break _b}while(1){i=c<<2;e=i+4|0;a=e+t|0;G[a>>2]=((G[i+m>>2]<<1)-G[a>>2]|0)+2;c=c+2|0;a=t+(c<<2)|0;G[a>>2]=((G[e+m>>2]<<1)-G[a>>2]|0)+2;if((c|0)!=(j|0)){continue}break}}G[((u<<2)+d|0)+63996>>2]=f;u=u+1|0;if((L|0)!=(u|0)){continue}break}O=L}i=G[d+36>>2];a=G[d+3176>>2];cb(d- -64|0,0,1024);D=a+1|0;a=4095;j=d+3708|0;m=15;while(1){f=a+j|0;c=m;h=c<<4;E[f|0]=h|15;e=a-15|0;E[e+j|0]=h;E[f-1|0]=h|14;E[f-2|0]=h|13;E[f-3|0]=h|12;E[f-4|0]=h|11;E[f-5|0]=h|10;E[f-6|0]=h|9;E[f-7|0]=h|8;E[f-8|0]=h|7;E[f-9|0]=h|6;E[f-10|0]=h|5;E[f-11|0]=h|4;E[f-12|0]=h|3;E[f-13|0]=h|2;E[f-14|0]=h|1;G[((c<<2)+d|0)+7804>>2]=e;m=c-1|0;a=a-16|0;if(c){continue}break}t=M(i,1e5);if((p|0)<=0){u=-4;s=256;q=0;i=l;h=b;e=o;j=g;y=0;C=0;a=p;break z}P=H[d+7868|0];a=M(P,1032)+d|0;W=a+45420|0;U=a+57804|0;V=a+51612|0;s=256;y=49;n=0;T=G[((P<<2)+d|0)+63996>>2];b=T;C=0;break R}m=1;continue;default:G[d+4>>2]=35;$b:{if((N|0)>0){k=G[d+28>>2];break $b}i=G[d>>2];f=G[i+4>>2];a=N;while(1){if(!f){break O}e=G[i>>2];c=H[e|0];N=a+8|0;G[d+32>>2]=N;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[i+4>>2]=f;G[i>>2]=e+1;c=G[i+8>>2]+1|0;G[i+8>>2]=c;if(!c){G[i+12>>2]=G[i+12>>2]+1}c=(a|0)>-8;a=N;if(!c){continue}break}}a=N-1|0;G[d+32>>2]=a;Y=(k>>>a&1?-1:1)+Y|0;break Tb;case 2:G[d+4>>2]=34;c=G[d+32>>2];ac:{if((c|0)>0){j=G[d+28>>2];break ac}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}}N=c-1|0;G[d+32>>2]=N;if(!(j>>>N&1)){E[((M(O,258)+d|0)+s|0)+43872|0]=Y;s=s+1|0;break Ub}m=3;continue;case 1:break Vb}}G[d+4>>2]=33;c=G[d+32>>2];bc:{if((c|0)>=5){j=G[d+28>>2];break bc}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-4;a=c;if(!e){continue}break}}a=c-5|0;G[d+32>>2]=a;Y=j>>>a&31;s=0}if((B|0)<=(s|0)){break Sb}}if(Y-21>>>0>=4294967276){m=2;continue}u=-4;break M}O=O+1|0;m=0;continue}}G[d+4>>2]=36;f=G[d+32>>2];cc:{if((f|0)>=(b|0)){k=G[d+28>>2];break cc}i=G[d>>2];a=G[i+4>>2];while(1){if(!a){break O}e=G[i>>2];c=H[e|0];f=f+8|0;G[d+32>>2]=f;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;a=a-1|0;G[i+4>>2]=a;G[i>>2]=e+1;c=G[i+8>>2]+1|0;G[i+8>>2]=c;if(!c){G[i+12>>2]=G[i+12>>2]+1}if((b|0)>(f|0)){continue}break}}c=f-b|0;G[d+32>>2]=c;z=(-1<>>c;m=1}while(1){dc:{ec:{fc:{gc:{hc:{if(!m){G[d+4>>2]=37;if((c|0)<=0){break hc}j=G[d+28>>2];break gc}u=-4;if((b|0)>20){break N}a=b<<2;if(G[a+W>>2]>=(z|0)){break fc}b=b+1|0;break ec}h=G[d>>2];f=G[h+4>>2];a=c;while(1){if(!f){break O}i=G[h>>2];e=H[i|0];c=a+8|0;G[d+32>>2]=c;j=e|G[d+28>>2]<<8;G[d+28>>2]=j;f=f-1|0;G[h+4>>2]=f;G[h>>2]=i+1;e=G[h+8>>2]+1|0;G[h+8>>2]=e;if(!e){G[h+12>>2]=G[h+12>>2]+1}e=(a|0)>-8;a=c;if(!e){continue}break}}c=c-1|0;G[d+32>>2]=c;X=j>>>c&1;z=X|z<<1;break dc}a=z-G[a+V>>2]|0;if(a>>>0>257){break N}i=(a<<2)+U|0;m=2;break P}m=0;continue}m=1;continue}}while(1){ic:{jc:{kc:{lc:{mc:{nc:{oc:{pc:{qc:{rc:{sc:{tc:{uc:{vc:{wc:{switch(m|0){case 0:G[d+4>>2]=39;if((J|0)<=0){break vc}k=G[d+28>>2];break uc;case 1:G[d+4>>2]=41;if((K|0)<=0){break sc}k=G[d+28>>2];break rc;case 2:A=G[i>>2];break mc;case 3:break wc;default:break tc}}G[d+4>>2]=38;f=G[d+32>>2];if((f|0)>=(b|0)){k=G[d+28>>2];break oc}j=G[d>>2];a=G[j+4>>2];while(1){if(!a){break O}e=G[j>>2];c=H[e|0];f=f+8|0;G[d+32>>2]=f;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;a=a-1|0;G[j+4>>2]=a;G[j>>2]=e+1;c=G[j+8>>2]+1|0;G[j+8>>2]=c;if(!c){G[j+12>>2]=G[j+12>>2]+1}if((b|0)>(f|0)){continue}break}break oc}j=G[d>>2];f=G[j+4>>2];a=J;while(1){if(!f){break O}e=G[j>>2];c=H[e|0];J=a+8|0;G[d+32>>2]=J;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[j+4>>2]=f;G[j>>2]=e+1;c=G[j+8>>2]+1|0;G[j+8>>2]=c;if(!c){G[j+12>>2]=G[j+12>>2]+1}c=(a|0)>-8;a=J;if(!c){continue}break}}J=J-1|0;G[d+32>>2]=J;X=k>>>J&1;z=X|z<<1;break nc}G[d+4>>2]=40;f=G[d+32>>2];if((f|0)>=(b|0)){k=G[d+28>>2];break qc}j=G[d>>2];a=G[j+4>>2];while(1){if(!a){break O}e=G[j>>2];c=H[e|0];f=f+8|0;G[d+32>>2]=f;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;a=a-1|0;G[j+4>>2]=a;G[j>>2]=e+1;c=G[j+8>>2]+1|0;G[j+8>>2]=c;if(!c){G[j+12>>2]=G[j+12>>2]+1}if((b|0)>(f|0)){continue}break}break qc}j=G[d>>2];f=G[j+4>>2];a=K;while(1){if(!f){break O}e=G[j>>2];c=H[e|0];K=a+8|0;G[d+32>>2]=K;k=c|G[d+28>>2]<<8;G[d+28>>2]=k;f=f-1|0;G[j+4>>2]=f;G[j>>2]=e+1;c=G[j+8>>2]+1|0;G[j+8>>2]=c;if(!c){G[j+12>>2]=G[j+12>>2]+1}c=(a|0)>-8;a=K;if(!c){continue}break}}K=K-1|0;G[d+32>>2]=K;X=k>>>K&1;z=X|z<<1;break pc}K=f-b|0;G[d+32>>2]=K;z=(-1<>>K}u=-4;if((b|0)>20){break N}xc:{yc:{a=b<<2;if(G[a+W>>2]<(z|0)){b=b+1|0;break yc}a=z-G[a+V>>2]|0;if(a>>>0>257){break N}i=(a<<2)+U|0;break xc}m=1;continue}m=2;continue}J=f-b|0;G[d+32>>2]=J;z=(-1<>>J}u=-4;if((b|0)>20){break N}a=b<<2;if(G[a+W>>2]<(z|0)){b=b+1|0;break ic}a=z-G[a+V>>2]|0;if(a>>>0>257){break N}A=G[(a<<2)+U>>2];if(A>>>0<2){h=b;e=o;break lc}c=H[(H[(G[d+7804>>2]+d|0)+3708|0]+d|0)+3452|0];a=((c<<2)+d|0)- -64|0;j=g+1|0;G[a>>2]=j+G[a>>2];zc:{Ac:{Bc:{Cc:{if(H[d+40|0]){if((g|0)>=0){break Ac}break Cc}if((g|0)>=0){break Bc}}g=j;break zc}q=(n|0)>(t|0)?n:t;while(1){if((n|0)==(q|0)){break F}G[G[d+3148>>2]+(n<<2)>>2]=c;n=n+1|0;a=(j|0)>1;g=j-1|0;j=g;if(a){continue}break}break zc}q=(n|0)>(t|0)?n:t;while(1){if((n|0)==(q|0)){break F}F[G[d+3152>>2]+(n<<1)>>1]=c;n=n+1|0;a=(j|0)>1;g=j-1|0;j=g;if(a){continue}break}}}h=b;q=n;if((A|0)==(D|0)){break jc}e=1;if(A>>>0>1){break kc}g=-1}u=-4;if((e|0)>2097151){break C}Dc:{Ec:{switch(A|0){case 0:g=e+g|0;break Dc;case 1:break Ec;default:break Dc}}g=(e<<1)+g|0}o=e<<1;if(!y){C=C+1|0;if((C|0)>=(p|0)){break D}P=H[(d+C|0)+7868|0];a=M(P,1032)+d|0;V=a+51612|0;U=a+57804|0;W=a+45420|0;y=50;T=G[((P<<2)+d|0)+63996>>2]}y=y-1|0;b=T;m=3;continue}u=-4;if((q|0)>=(t|0)){e=o;break B}f=A-1|0;Fc:{if(f>>>0<=15){j=G[d+7804>>2];k=H[((j+f|0)+d|0)+3708|0];Gc:{if(f>>>0>3){while(1){a=(f+j|0)+d|0;b=a+3705|0;a=a+3704|0;a=H[a|0]|H[a+1|0]<<8|(H[a+2|0]<<16|H[a+3|0]<<24);E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=a>>>16;E[b+3|0]=a>>>24;f=f-4|0;if(f>>>0>3){continue}break}if(!f){break Gc}}e=f-1|0;c=f&3;if(c){a=0;while(1){b=(f+j|0)+d|0;E[b+3708|0]=H[b+3707|0];f=f-1|0;a=a+1|0;if((c|0)!=(a|0)){continue}break}}if(e>>>0<3){break Gc}while(1){c=(f+j|0)+d|0;b=c+3707|0;a=c+3706|0;a=H[a|0]|H[a+1|0]<<8;E[b|0]=a;E[b+1|0]=a>>>8;b=c+3705|0;a=c+3704|0;a=H[a|0]|H[a+1|0]<<8;E[b|0]=a;E[b+1|0]=a>>>8;f=f-4|0;if(f){continue}break}}E[(d+j|0)+3708|0]=k;break Fc}m=f>>>4|0;b=((m<<2)+d|0)+7804|0;c=G[b>>2];a=f&15;f=c+a|0;k=H[(f+d|0)+3708|0];if(a){a=d+3708|0;while(1){c=a+f|0;f=f-1|0;E[c|0]=H[a+f|0];c=G[b>>2];if((f|0)>(c|0)){continue}break}}G[b>>2]=c+1;e=d+7804|0;c=d+3708|0;while(1){a=e+(m<<2)|0;b=G[a>>2]-1|0;G[a>>2]=b;a=m-1|0;E[b+c|0]=H[(c+G[e+(a<<2)>>2]|0)+15|0];b=(m|0)>1;m=a;if(b){continue}break}a=G[d+7804>>2]-1|0;G[d+7804>>2]=a;E[(a+d|0)+3708|0]=k;if(G[d+7804>>2]){break Fc}f=15;c=4095;j=d+3708|0;while(1){b=c+j|0;a=f;e=((a<<2)+d|0)+7804|0;E[b|0]=H[(j+G[e>>2]|0)+15|0];E[b-1|0]=H[(j+G[e>>2]|0)+14|0];E[b-2|0]=H[(j+G[e>>2]|0)+13|0];E[b-3|0]=H[(j+G[e>>2]|0)+12|0];E[b-4|0]=H[(j+G[e>>2]|0)+11|0];E[b-5|0]=H[(j+G[e>>2]|0)+10|0];E[b-6|0]=H[(j+G[e>>2]|0)+9|0];E[b-7|0]=H[(j+G[e>>2]|0)+8|0];E[b-8|0]=H[(j+G[e>>2]|0)+7|0];E[b-9|0]=H[(j+G[e>>2]|0)+6|0];E[b-10|0]=H[(j+G[e>>2]|0)+5|0];E[b-11|0]=H[(j+G[e>>2]|0)+4|0];E[b-12|0]=H[(j+G[e>>2]|0)+3|0];E[b-13|0]=H[(j+G[e>>2]|0)+2|0];E[b-14|0]=H[(j+G[e>>2]|0)+1|0];b=c-15|0;E[b+j|0]=H[j+G[e>>2]|0];G[e>>2]=b;f=a-1|0;c=c-16|0;if(a){continue}break}}b=H[((k&255)+d|0)+3452|0];a=((b<<2)+d|0)- -64|0;G[a>>2]=G[a>>2]+1;Hc:{if(H[d+40|0]){F[G[d+3152>>2]+(q<<1)>>1]=b;break Hc}G[G[d+3148>>2]+(q<<2)>>2]=b}n=q+1|0;if(!y){C=C+1|0;if((C|0)>=(p|0)){break D}P=H[(d+C|0)+7868|0];a=M(P,1032)+d|0;V=a+51612|0;U=a+57804|0;W=a+45420|0;y=50;T=G[((P<<2)+d|0)+63996>>2]}y=y-1|0;b=T;m=4;continue}m=0;u=-4;a=G[d+52>>2];if((a|0)<0|(a|0)>=(q|0)){break G}while(1){a=G[((m<<2)+d|0)- -64>>2];if((a|0)<0|(a|0)>(q|0)){break H}s=m|1;a=G[((s<<2)+d|0)- -64>>2];if((a|0)<0|(a|0)>(q|0)){break G}s=m|2;a=G[((s<<2)+d|0)- -64>>2];if((a|0)<0|(a|0)>(q|0)){break G}s=m|3;a=G[((s<<2)+d|0)- -64>>2];if((a|0)<0|(a|0)>(q|0)){break G}m=m+4|0;if((m|0)!=256){continue}break}k=0;G[d+1092>>2]=0;n=d+1092|0;f=1;j=d- -64|0;b=1;while(1){i=b<<2;e=i+n|0;a=j+i|0;G[e>>2]=G[a-4>>2];c=i+4|0;G[c+n>>2]=G[a>>2];a=i+8|0;G[a+n>>2]=G[c+j>>2];G[e+12>>2]=G[a+j>>2];b=b+4|0;if((b|0)!=257){continue}break}while(1){c=(f<<2)+d|0;a=c+1092|0;b=G[a>>2]+k|0;G[a>>2]=b;a=c+1096|0;b=b+G[a>>2]|0;G[a>>2]=b;a=c+1100|0;b=b+G[a>>2]|0;G[a>>2]=b;a=c+1104|0;k=b+G[a>>2]|0;G[a>>2]=k;f=f+4|0;if((f|0)!=257){continue}break}s=0;while(1){a=G[((s<<2)+d|0)+1092>>2];if((a|0)<0|(a|0)>(q|0)){break G}m=1;b=s|1;if((b|0)==257){f=0;while(1){a=G[((m<<2)+d|0)+1092>>2];if((a|0)<(f|0)){i=l;e=o;j=g;D=A;a=p;f=r;s=m;break y}b=a;s=m+1|0;a=G[((s<<2)+d|0)+1092>>2];if((b|0)>(a|0)){break G}b=a;s=m+2|0;a=G[((s<<2)+d|0)+1092>>2];if((b|0)>(a|0)){break G}s=m+3|0;f=G[((s<<2)+d|0)+1092>>2];if((a|0)>(f|0)){break G}m=m+4|0;if((m|0)!=257){continue}break}G[d+3168>>2]=-1;m=0;E[d+8|0]=0;G[d+12>>2]=0;G[d+4>>2]=2;if(G[d+48>>2]>=2){hb(26719,6,1,G[24367])}Ic:{Jc:{Kc:{if(H[d+40|0]){while(1){e=m<<2;a=e+d|0;G[a+2120>>2]=G[a+1092>>2];a=m|1;if((a|0)==257){break Kc}c=d+2120|0;a=a<<2;b=d+1092|0;G[c+a>>2]=G[b+a>>2];a=e|8;G[a+c>>2]=G[a+b>>2];a=e|12;G[a+c>>2]=G[a+b>>2];m=m+4|0;continue}}f=G[d+3148>>2];s=0;Lc:{if((q|0)<=0){break Lc}if((q|0)!=1){e=q&-2;j=d+1092|0;b=0;while(1){c=j+(H[f+(m<<2)|0]<<2)|0;a=f+(G[c>>2]<<2)|0;G[a>>2]=G[a>>2]|m<<8;G[c>>2]=G[c>>2]+1;c=m|1;i=j+(H[f+(c<<2)|0]<<2)|0;a=f+(G[i>>2]<<2)|0;G[a>>2]=G[a>>2]|c<<8;G[i>>2]=G[i>>2]+1;m=m+2|0;b=b+2|0;if((e|0)!=(b|0)){continue}break}}s=q;if(!(s&1)){break Lc}b=((H[f+(m<<2)|0]<<2)+d|0)+1092|0;a=f+(G[b>>2]<<2)|0;G[a>>2]=G[a>>2]|m<<8;G[b>>2]=G[b>>2]+1}a=G[f+(G[d+52>>2]<<2)>>2];G[d+1088>>2]=0;a=a>>>8|0;G[d+56>>2]=a;if(!H[d+16|0]){break Jc}G[d+20>>2]=0;G[d+24>>2]=0;u=1;if(a>>>0>=M(G[d+36>>2],1e5)>>>0){break x}b=G[f+(a<<2)>>2];G[d+1088>>2]=1;G[d+56>>2]=b>>>8;u=0;a=G[48016];G[d+24>>2]=1;a=a-1|0;G[d+20>>2]=a;G[d+60>>2]=b&255^(a|0)==1;break G}if((q|0)>0){m=0;while(1){a=G[d+3152>>2]+(m<<1)|0;c=((H[a|0]<<2)+d|0)+2120|0;e=G[c>>2];F[a>>1]=e;a=G[d+3156>>2]+(m>>>1|0)|0;b=H[a|0];E[a|0]=m&1?b&15|e>>>12&1048560:b&-16|e>>>16;G[c>>2]=G[c>>2]+1;m=m+1|0;if((q|0)!=(m|0)){continue}break}}m=G[d+52>>2];f=H[G[d+3156>>2]+(m>>1)|0]>>>(m<<2&4)<<16&983040|I[G[d+3152>>2]+(m<<1)>>1];while(1){e=G[d+3152>>2]+(f<<1)|0;c=I[e>>1];a=G[d+3156>>2]+(f>>>1|0)|0;b=H[a|0];F[e>>1]=m;e=H[a|0];s=f;f=c|b>>>(f<<2&4)<<16&983040;E[a|0]=s&1?e&15|m>>>12&1048560:e&-16|m>>>16;m=s;if((m|0)!=G[d+52>>2]){continue}break}G[d+1088>>2]=0;G[d+56>>2]=s;if(H[d+16|0]){G[d+20>>2]=0;G[d+24>>2]=0;u=1;if(M(G[d+36>>2],1e5)>>>0<=s>>>0){break x}c=Cq(s,n);G[d+60>>2]=c;e=G[d+56>>2];b=I[G[d+3152>>2]+(e<<1)>>1];a=H[G[d+3156>>2]+(e>>>1|0)|0];G[d+1088>>2]=G[d+1088>>2]+1;G[d+56>>2]=b|a>>>(e<<2&4)<<16&983040;m=G[d+20>>2];if(!m){a=G[d+24>>2];m=G[(a<<2)+192064>>2];a=a+1|0;G[d+24>>2]=(a|0)==512?0:a}a=m-1|0;G[d+20>>2]=a;G[d+60>>2]=c^(a|0)==1;break Ic}u=1;if(M(G[d+36>>2],1e5)>>>0<=s>>>0){break x}Aa=d,Ba=Cq(s,n),G[Aa+60>>2]=Ba;c=G[d+56>>2];b=I[G[d+3152>>2]+(c<<1)>>1];a=H[G[d+3156>>2]+(c>>>1|0)|0];G[d+1088>>2]=G[d+1088>>2]+1;G[d+56>>2]=b|a>>>(c<<2&4)<<16&983040;break Ic}u=1;if(a>>>0>=M(G[d+36>>2],1e5)>>>0){break x}a=G[f+(a<<2)>>2];G[d+1088>>2]=1;G[d+56>>2]=a>>>8;G[d+60>>2]=a&255;u=0;break G}u=0;i=l;e=o;j=g;D=A;break L}a=G[((b<<2)+d|0)+1092>>2];if((a|0)<0|(a|0)>(q|0)){break I}b=s|2;a=G[((b<<2)+d|0)+1092>>2];if((a|0)<0|(a|0)>(q|0)){break J}b=s|3;a=G[((b<<2)+d|0)+1092>>2];if((a|0)<0|(a|0)>(q|0)){break K}s=s+4|0;continue}}m=0;continue}}u=0}}h=b;j=g;q=n;break E}a=p;break y}i=l;e=o;j=g;D=A;a=p;f=r;s=b;break y}i=l;e=o;j=g;D=A;a=p;f=r;s=b;break y}i=l;e=o;j=g;D=A;a=p;f=r;s=b;break y}i=l;e=o;j=g;D=A;a=p;f=r;s=m;break y}i=l;e=o;j=g;D=A;break A}h=b}i=l;e=o;break A}y=0;e=o}q=n}i=l;j=g}a=p}f=r}G[ca>>2]=s;G[za>>2]=f;G[ya>>2]=O;G[xa>>2]=B;G[wa>>2]=L;G[va>>2]=a;G[ua>>2]=D;G[ta>>2]=C;G[sa>>2]=y;G[ra>>2]=A;G[qa>>2]=t;G[pa>>2]=q;G[oa>>2]=j;G[na>>2]=e;G[ma>>2]=Y;G[la>>2]=i;G[ka>>2]=h;G[ja>>2]=z;G[ia>>2]=X;G[ha>>2]=P;G[ga>>2]=T;G[fa>>2]=W;G[ea>>2]=V;G[da>>2]=U}Fa=R+16|0;f=u;if((f|0)==4){if(G[d+48>>2]>=3){a=G[d+3164>>2];G[S+4>>2]=G[d+3172>>2];G[S>>2]=a;_a(aa,3783,S)}f=G[d+3172>>2]==G[d+3164>>2]?4:-4;break i}i=2;if(G[d+4>>2]==2){continue}break}}Fa=S+32|0;if(f&-5){if(x){G[x>>2]=f}G[w+5060>>2]=f;break b}Mc:{Nc:{Oc:{switch(f|0){case 0:b=G[w>>2];a=Tf(b);if((a|0)!=-1){ak(a,b);break Nc}if(G[w+5016>>2]){break Nc}if(!G[w+5032>>2]){break Mc}if(x){G[x>>2]=-7}G[w+5060>>2]=-7;break b;case 4:break Oc;default:break Nc}}if(x){G[x>>2]=4}G[w+5060>>2]=4;a=Z-G[w+5032>>2]|0;break a}if(G[w+5032>>2]){continue}}break}if(x){G[x>>2]=0}G[w+5060>>2]=0;a=Z;break a}if(x){G[x>>2]=-6}G[w+5060>>2]=-6}a=0}e=G[_+12>>2]&-5?-1:a}Fa=_+16|0;return e|0}function qn(a){a=a|0;var 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,A=0,B=0,C=0,D=0,F=0,I=0,J=0;c=Fa-2992|0;Fa=c;b=G[a+8>>2];a:{if(!b){l=1;break a}j=G[309722];l=1;d=b;while(1){d=d-1|0;e=d<<2;f=j+M(G[(e+a|0)+12>>2],344)|0;G[e+(c+2944|0)>>2]=f;e=e+(c+2896|0)|0;g=G[f>>2];G[e>>2]=(g|0)!=-1e3;b:{if((g|0)!=-1e3){G[e>>2]=G[f+56>>2];l=0;break b}c:{d:{switch(G[f+52>>2]-258|0){case 2:L[((c+16|0)+M(d,288)|0)+32>>3]=L[f+88>>3];break c;case 1:G[((c+16|0)+M(d,288)|0)+32>>2]=G[f+88>>2];break c;case 0:E[((c+16|0)+M(d,288)|0)+32|0]=H[f+88|0];break c;default:break d}}Za((M(d,288)+c|0)+48|0,f+88|0)}E[(c+6|0)+d|0]=0}if(d){continue}break}}f=G[a>>2];e:{if(!((f|0)==1001|(f&-2)==1042|(!b|!l))){f:{g:{switch(f-1002|0){case 0:h:{switch(G[G[c+2944>>2]+52>>2]-258|0){case 0:G[a+88>>2]=H[c+48|0]!=0;break f;case 1:G[a+88>>2]=G[c+48>>2];break f;case 2:L[a+88>>3]=L[c+48>>3];break f;case 4:break h;default:break f}}Za(a+88|0,c+48|0);break f;case 36:i:{switch(G[G[c+2944>>2]+52>>2]-259|0){case 0:L[a+88>>3]=G[c+48>>2];break f;case 1:break i;default:break f}}L[a+88>>3]=L[c+48>>3];break f;case 37:G[a+88>>2]=0;G[a+92>>2]=0;break f;case 35:j:{switch(G[G[c+2944>>2]+52>>2]-258|0){case 0:G[a+88>>2]=H[c+48|0]!=0;break f;case 1:G[a+88>>2]=G[c+48>>2];break f;default:break j}}L[a+88>>3]=L[c+48>>3];break f;case 41:if(G[G[c+2944>>2]+52>>2]==260){F=a,I=Bg(L[c+48>>3]),G[F+88>>2]=I;break f}F=a,I=Bg(+G[c+48>>2]),G[F+88>>2]=I;break f;case 15:if(G[G[c+2944>>2]+52>>2]==260){h=L[c+48>>3];L[a+88>>3]=h>0?h:-h;break f}f=G[c+48>>2];b=f>>31;G[a+88>>2]=(b^f)-b;break f;case 38:G[a+88>>2]=1;break f;case 28:E[a+88|0]=0;break f;case 29:k:{switch(G[a+52>>2]-258|0){case 0:E[a+88|0]=H[c+48|0];break f;case 1:G[a+88>>2]=G[c+48>>2];break f;case 2:L[a+88>>3]=L[c+48>>3];break f;case 3:break k;default:break f}}Za(a+88|0,c+48|0);break f;case 44:l:{switch(G[a+52>>2]-259|0){case 0:G[a+88>>2]=G[c+48>>2];break f;case 1:break l;default:break f}}L[a+88>>3]=L[c+48>>3];break f;case 2:F=a,J=ib(L[c+48>>3]),L[F+88>>3]=J;break f;case 3:F=a,J=eb(L[c+48>>3]),L[F+88>>3]=J;break f;case 4:F=a,J=Mc(L[c+48>>3]),L[F+88>>3]=J;break f;case 5:h=L[c+48>>3];if(h<-1|h>1){wc(15900);break f}F=a,J=fc(h),L[F+88>>3]=J;break f;case 6:h=L[c+48>>3];if(h<-1|h>1){wc(6516);break f}F=a,J=Sc(h),L[F+88>>3]=J;break f;case 7:F=a,J=Pd(L[c+48>>3]),L[F+88>>3]=J;break f;case 8:F=a,J=wn(L[c+48>>3]),L[F+88>>3]=J;break f;case 9:F=a,J=vn(L[c+48>>3]),L[F+88>>3]=J;break f;case 10:F=a,J=un(L[c+48>>3]),L[F+88>>3]=J;break f;case 11:F=a,J=af(L[c+48>>3]),L[F+88>>3]=J;break f;case 12:h=L[c+48>>3];if(h<=0){wc(17554);break f}F=a,J=oc(h),L[F+88>>3]=J;break f;case 13:h=L[c+48>>3];if(h<=0){wc(41565);break f}F=a,J=tn(h),L[F+88>>3]=J;break f;case 14:h=L[c+48>>3];if(h<0){wc(4463);break f}L[a+88>>3]=V(h);break f;case 17:L[a+88>>3]=T(L[c+48>>3]);break f;case 18:L[a+88>>3]=S(L[c+48>>3]);break f;case 19:L[a+88>>3]=S(L[c+48>>3]+.5);break f;case 16:F=a,J=Db(L[c+48>>3],L[c+336>>3]),L[F+88>>3]=J;break f;case 39:m=L[c+48>>3];k=L[c+336>>3];p=L[c+624>>3];o=L[c+912>>3];h=L[154849];if(h==0){G[309698]=-1571644103;G[309699]=1066524486;h=.017453292519943295}t=eb(h*k);u=eb(h*o);m=ib((p-m)*h*.5);k=ib((o-k)*h*.5);k=Q(R(k*k+m*(m*(t*u)),0),1);k=Db(V(k),V(1-k));L[a+88>>3]=(k+k)/h;case 20:m:{switch(G[a+52>>2]-259|0){case 1:L[a+88>>3]=L[c+48>>3];break f;case 0:G[a+88>>2]=G[c+48>>2];break f;case 3:break m;default:break f}}Za(a+88|0,c+48|0);break f;case 21:n:{switch(G[a+52>>2]-259|0){case 1:h=L[c+48>>3];k=L[c+336>>3];L[a+88>>3]=h>2];f=G[c+336>>2];G[a+88>>2]=(b|0)<(f|0)?b:f;break f;case 22:o:{switch(G[a+52>>2]-259|0){case 1:L[a+88>>3]=L[c+48>>3];break f;case 0:G[a+88>>2]=G[c+48>>2];break f;case 3:break o;default:break f}}Za(a+88|0,c+48|0);break f;case 23:p:{switch(G[a+52>>2]-259|0){case 1:h=L[c+48>>3];k=L[c+336>>3];L[a+88>>3]=h>k?h:k;break f;case 0:break p;default:break f}}b=G[c+48>>2];f=G[c+336>>2];G[a+88>>2]=(b|0)>(f|0)?b:f;break f;case 24:E[a+88|0]=L[c+624>>3]>O(L[c+48>>3]-L[c+336>>3]);break f;case 25:h=L[c+912>>3]-L[c+48>>3];p=h*h;h=L[c+1200>>3]-L[c+336>>3];p=p+h*h;h=L[c+624>>3];E[a+88|0]=p<=h*h;break f;case 26:m=L[c+48>>3];p=L[c+336>>3];h=L[c+624>>3];k=L[c+912>>3];t=L[c+1488>>3];u=L[c+1776>>3];z=L[c+1200>>3]/180*3.141592653589793;o=ib(z);m=t-m;t=eb(z);p=u-p;u=m*t+o*p;b=u>=h*-.5&u<=h*.5;h=p*t-m*o;E[a+88|0]=b&h>=k*-.5&h<=k*.5;break f;case 27:k=L[c+1488>>3];o=L[c+48>>3];m=L[c+1200>>3]/180*3.141592653589793;h=ib(m);p=L[c+336>>3];t=L[c+1776>>3];k=k-o;o=eb(m);m=t-p;p=(k*o+h*m)/L[c+624>>3];h=(m*o-k*h)/L[c+912>>3];E[a+88|0]=p*p+h*h<=1;break f;case 32:q:{switch(G[a+52>>2]-258|0){case 0:E[a+88|0]=H[(H[c+624|0]?c+16|0:c+304|0)+32|0];break f;case 1:G[a+88>>2]=G[(H[c+624|0]?c+16|0:c+304|0)+32>>2];break f;case 2:L[a+88>>3]=L[(H[c+624|0]?c+16|0:c+304|0)+32>>3];break f;case 3:break q;default:break f}}Za(a+88|0,(H[c+624|0]?c+16|0:c+304|0)+32|0);break f;case 42:kn(a+88|0,G[a+56>>2],c+48|0,G[c+16>>2],G[c+336>>2]);break f;case 43:break g;default:break f}}b=c+48|0;f=Sb(b,c+336|0);if(!f){G[a+88>>2]=0;break f}G[a+88>>2]=(f-b|0)+1}G[a>>2]=-1e3;break e}Nd(a);if(G[309737]){break e}f=G[309727];b=G[a+56>>2];d=M(f,b);r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{V:{W:{X:{Y:{Z:{_:{$:{aa:{ba:{ca:{switch(G[a>>2]-1001|0){case 28:if(!f){break e}n=a+88|0;j=a+84|0;break Z;case 27:if(!f){break e}n=a+88|0;j=a+84|0;break Y;case 26:if(!f){break e}n=a+88|0;j=a+84|0;break X;case 25:if(!f){break e}j=a+88|0;e=a+84|0;break W;case 40:if(!f){break e}break R;case 17:if(!f){break e}break ba;case 20:if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;L[b+G[a+88>>2]>>3]=S(L[b+G[G[c+2944>>2]+88>>2]>>3]+.5)}if(d){continue}break};break e;case 19:if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;L[b+G[a+88>>2]>>3]=S(L[b+G[G[c+2944>>2]+88>>2]>>3])}if(d){continue}break};break e;case 18:if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;L[b+G[a+88>>2]>>3]=T(L[b+G[G[c+2944>>2]+88>>2]>>3])}if(d){continue}break};break e;case 5:break A;case 4:break B;case 3:break C;case 41:break D;case 0:break E;case 34:break F;case 35:break G;case 42:break H;case 1:break I;case 37:break J;case 38:break K;case 36:break L;case 16:break M;case 39:break N;case 29:break O;case 30:break P;case 45:break Q;case 21:break S;case 22:break T;case 23:break U;case 24:break V;case 33:break _;case 43:break $;case 44:break aa;case 15:break ca;case 14:break r;case 13:break s;case 12:break t;case 11:break u;case 10:break v;case 9:break w;case 8:break x;case 7:break y;case 6:break z;default:break e}}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;h=L[b+G[G[c+2944>>2]+88>>2]>>3];if(h<0){b=b+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break e}L[b+G[a+88>>2]>>3]=V(h)}if(d){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2900>>2];da:{if((e|0)<=1){b=f;if(!e){break da}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];ea:{fa:{if((b|0)<=1){if(!b){b=H[c+6|0];break ea}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break fa}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}b=H[c+7|0]|b&255;E[G[a+84>>2]+d|0]=(b|0)!=0;g=g-1|0;if(!b){F=G[a+88>>2]+(d<<3)|0,J=Db(L[c+48>>3],L[c+336>>3]),L[F>>3]=J}if(g){continue}break}}if(f){continue}break}break e}if(!f){break e}j=G[G[c+2944>>2]>>2]==-1e3;i=G[G[c+2948>>2]>>2]==-1e3;while(1){b=G[c+2944>>2];f=f-1|0;ga:{if(j){g=b+88|0;b=0;break ga}g=G[G[b+88>>2]+(f<<2)>>2];b=H[G[b+84>>2]+f|0]!=0}d=G[c+2948>>2];ha:{ia:{ja:{ka:{if(i){e=d+88|0}else{if(H[G[d+84>>2]+f|0]){break ka}e=G[G[d+88>>2]+(f<<2)>>2]}G[G[a+88>>2]+(f<<2)>>2]=0;d=1;if(b){break ha}b=Sb(g,e);if(b){break ja}}d=1;b=0;break ia}d=0;b=(b-g|0)+1|0}G[G[a+88>>2]+(f<<2)>>2]=b}E[G[a+84>>2]+f|0]=d;if(f){continue}break}break e}if(!f){break e}d=G[c+2944>>2];e=G[d+56>>2];n=G[G[c+2948>>2]>>2]==-1e3;q=G[d>>2]!=-1e3;s=G[G[c+2952>>2]>>2]==-1e3;while(1){d=G[c+2948>>2];f=f-1|0;la:{if(n){i=d+88|0;d=0;break la}i=G[d+88>>2]+(f<<2)|0;d=H[G[d+84>>2]+f|0]!=0}j=G[c+2944>>2];i=G[i>>2];ma:{if(!q){g=j+88|0;if(e){break ma}e=Va(g);break ma}d=H[G[j+84>>2]+f|0]?1:d;g=G[G[j+88>>2]+(f<<2)>>2]}na:{if(s){l=b;break na}j=G[c+2952>>2];l=G[G[j+88>>2]+(f<<2)>>2];d=H[G[j+84>>2]+f|0]?1:d}j=f<<2;E[G[j+G[a+88>>2]>>2]]=0;d=i?d:1;if(!d){if((kn(G[j+G[a+88>>2]>>2],l,g,e,i)|0)<0){break e}}E[G[a+84>>2]+f|0]=d;if(f){continue}break}break e}oa:{switch(G[a+52>>2]-258|0){case 3:if(!f){break e}b=c+336|0;d=c+48|0;while(1){f=f-1|0;if(G[c+2904>>2]){e=G[c+2952>>2];E[c+624|0]=H[G[e+88>>2]+f|0];E[c+8|0]=H[G[e+84>>2]+f|0]}if(G[c+2900>>2]){e=G[c+2948>>2];Za(b,G[G[e+88>>2]+(f<<2)>>2]);E[c+7|0]=H[G[e+84>>2]+f|0]}if(G[c+2896>>2]){e=G[c+2944>>2];Za(d,G[G[e+88>>2]+(f<<2)>>2]);E[c+6|0]=H[G[e+84>>2]+f|0]}e=H[c+8|0];E[G[a+84>>2]+f|0]=e;if(!e){e=G[G[a+88>>2]+(f<<2)>>2];if(H[c+624|0]){Za(e,d);E[G[a+84>>2]+f|0]=H[c+6|0];if(f){continue}break e}Za(e,b);E[G[a+84>>2]+f|0]=H[c+7|0];if(f){continue}break e}E[G[G[a+88>>2]+(f<<2)>>2]]=0;if(f){continue}break};break e;case 0:if(!f){break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2904>>2];pa:{if((e|0)<=1){b=f;if(!e){break pa}}e=G[c+2952>>2];E[c+624|0]=H[G[e+88>>2]+b|0];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];qa:{if((e|0)<=1){b=f;if(!e){break qa}}e=G[c+2948>>2];E[c+336|0]=H[G[e+88>>2]+b|0];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];ra:{if((b|0)<=1){if(!b){break ra}b=G[c+2944>>2];E[c+48|0]=H[G[b+88>>2]+f|0];E[c+6|0]=H[G[b+84>>2]+f|0];break ra}b=G[c+2944>>2];E[c+48|0]=H[G[b+88>>2]+d|0];E[c+6|0]=H[G[b+84>>2]+d|0]}g=g-1|0;b=H[c+8|0];E[G[a+84>>2]+d|0]=b;if(!b){sa:{if(H[c+624|0]){E[G[a+88>>2]+d|0]=H[c+48|0];b=H[c+6|0];break sa}E[G[a+88>>2]+d|0]=H[c+336|0];b=H[c+7|0]}E[G[a+84>>2]+d|0]=b}if(g){continue}break}}if(f){continue}break};break e;case 1:if(!f){break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2904>>2];ta:{if((e|0)<=1){b=f;if(!e){break ta}}e=G[c+2952>>2];E[c+624|0]=H[G[e+88>>2]+b|0];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];ua:{if((e|0)<=1){b=f;if(!e){break ua}}e=G[c+2948>>2];G[c+336>>2]=G[G[e+88>>2]+(b<<2)>>2];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];va:{if((b|0)<=1){if(!b){break va}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(f<<2)>>2];E[c+6|0]=H[G[b+84>>2]+f|0];break va}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(d<<2)>>2];E[c+6|0]=H[G[b+84>>2]+d|0]}g=g-1|0;b=H[c+8|0];E[G[a+84>>2]+d|0]=b;if(!b){wa:{if(H[c+624|0]){G[G[a+88>>2]+(d<<2)>>2]=G[c+48>>2];b=H[c+6|0];break wa}G[G[a+88>>2]+(d<<2)>>2]=G[c+336>>2];b=H[c+7|0]}E[G[a+84>>2]+d|0]=b}if(g){continue}break}}if(f){continue}break};break e;case 2:break oa;default:break e}}if(!f){break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2904>>2];xa:{if((e|0)<=1){b=f;if(!e){break xa}}e=G[c+2952>>2];E[c+624|0]=H[G[e+88>>2]+b|0];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];ya:{if((e|0)<=1){b=f;if(!e){break ya}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];za:{if((b|0)<=1){if(!b){break za}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];E[c+6|0]=H[G[b+84>>2]+f|0];break za}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];E[c+6|0]=H[G[b+84>>2]+d|0]}g=g-1|0;b=H[c+8|0];E[G[a+84>>2]+d|0]=b;if(!b){Aa:{if(H[c+624|0]){L[G[a+88>>2]+(d<<3)>>3]=L[c+48>>3];b=H[c+6|0];break Aa}L[G[a+88>>2]+(d<<3)>>3]=L[c+336>>3];b=H[c+7|0]}E[G[a+84>>2]+d|0]=b}if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2920>>2];Ba:{if((e|0)<=1){b=f;if(!e){break Ba}}e=G[c+2968>>2];L[c+1776>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+12|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2916>>2];Ca:{if((e|0)<=1){b=f;if(!e){break Ca}}e=G[c+2964>>2];L[c+1488>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+11|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2912>>2];Da:{if((e|0)<=1){b=f;if(!e){break Da}}e=G[c+2960>>2];L[c+1200>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+10|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2908>>2];Ea:{if((e|0)<=1){b=f;if(!e){break Ea}}e=G[c+2956>>2];L[c+912>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+9|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2904>>2];Fa:{if((e|0)<=1){b=f;if(!e){break Fa}}e=G[c+2952>>2];L[c+624>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];Ga:{if((e|0)<=1){b=f;if(!e){break Ga}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];Ha:{Ia:{if((b|0)<=1){if(!b){b=H[c+6|0];break Ha}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break Ia}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;i=1;e=j;Ja:{Ka:{if(b&255){break Ka}e=j;if(H[c+7|0]){break Ka}e=j;if(H[c+8|0]){break Ka}e=j;if(H[c+9|0]){break Ka}e=j;if(H[c+10|0]){break Ka}e=j;if(H[c+11|0]){break Ka}b=H[c+12|0];E[G[j>>2]+d|0]=(b|0)!=0;if(b){break Ja}k=L[c+48>>3];o=L[c+1488>>3];m=L[c+1200>>3]/180*3.141592653589793;h=ib(m);p=L[c+336>>3];t=L[c+1776>>3];k=o-k;o=eb(m);m=t-p;p=(k*o+h*m)/L[c+624>>3];h=(m*o-k*h)/L[c+912>>3];i=p*p+h*h<=1;e=n}E[G[e>>2]+d|0]=i}if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2920>>2];La:{if((e|0)<=1){b=f;if(!e){break La}}e=G[c+2968>>2];L[c+1776>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+12|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2916>>2];Ma:{if((e|0)<=1){b=f;if(!e){break Ma}}e=G[c+2964>>2];L[c+1488>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+11|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2912>>2];Na:{if((e|0)<=1){b=f;if(!e){break Na}}e=G[c+2960>>2];L[c+1200>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+10|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2908>>2];Oa:{if((e|0)<=1){b=f;if(!e){break Oa}}e=G[c+2956>>2];L[c+912>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+9|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2904>>2];Pa:{if((e|0)<=1){b=f;if(!e){break Pa}}e=G[c+2952>>2];L[c+624>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];Qa:{if((e|0)<=1){b=f;if(!e){break Qa}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];Ra:{Sa:{if((b|0)<=1){if(!b){b=H[c+6|0];break Ra}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break Sa}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;i=1;e=j;Ta:{Ua:{if(b&255){break Ua}e=j;if(H[c+7|0]){break Ua}e=j;if(H[c+8|0]){break Ua}e=j;if(H[c+9|0]){break Ua}e=j;if(H[c+10|0]){break Ua}e=j;if(H[c+11|0]){break Ua}b=H[c+12|0];E[G[j>>2]+d|0]=(b|0)!=0;if(b){break Ta}k=L[c+336>>3];o=L[c+1776>>3];m=L[c+1200>>3]/180*3.141592653589793;h=ib(m);p=L[c+1488>>3]-L[c+48>>3];m=eb(m);o=o-k;k=p*m+h*o;t=L[c+624>>3];b=k>=t*-.5&k<=t*.5;h=o*m-p*h;k=L[c+912>>3];i=b&h>=k*-.5&h<=k*.5;e=n}E[G[e>>2]+d|0]=i}if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2912>>2];Va:{if((e|0)<=1){b=f;if(!e){break Va}}e=G[c+2960>>2];L[c+1200>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+10|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2908>>2];Wa:{if((e|0)<=1){b=f;if(!e){break Wa}}e=G[c+2956>>2];L[c+912>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+9|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2904>>2];Xa:{if((e|0)<=1){b=f;if(!e){break Xa}}e=G[c+2952>>2];L[c+624>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];Ya:{if((e|0)<=1){b=f;if(!e){break Ya}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];Za:{_a:{if((b|0)<=1){if(!b){b=H[c+6|0];break Za}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break _a}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;i=1;e=j;$a:{ab:{if(b&255){break ab}e=j;if(H[c+7|0]){break ab}e=j;if(H[c+8|0]){break ab}e=j;if(H[c+9|0]){break ab}b=H[c+10|0];E[G[j>>2]+d|0]=(b|0)!=0;if(b){break $a}h=L[c+912>>3]-L[c+48>>3];p=h*h;h=L[c+1200>>3]-L[c+336>>3];p=p+h*h;h=L[c+624>>3];i=p<=h*h;e=n}E[G[e>>2]+d|0]=i}if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;i=G[c+2904>>2];bb:{if((i|0)<=1){b=f;if(!i){break bb}}i=G[c+2952>>2];L[c+624>>3]=L[G[i+88>>2]+(b<<3)>>3];E[c+8|0]=H[G[i+84>>2]+b|0]}b=d;i=G[c+2900>>2];cb:{if((i|0)<=1){b=f;if(!i){break cb}}i=G[c+2948>>2];L[c+336>>3]=L[G[i+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[i+84>>2]+b|0]}b=G[c+2896>>2];db:{eb:{if((b|0)<=1){if(!b){b=H[c+6|0];break db}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break eb}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;i=1;fb:{if(H[c+7|0]|b&255){b=e}else{b=H[c+8|0];E[G[e>>2]+d|0]=(b|0)!=0;if(b){break fb}i=L[c+624>>3]>O(L[c+48>>3]-L[c+336>>3]);b=j}E[G[b>>2]+d|0]=i}if(g){continue}break}}if(f){continue}break}break e}gb:{hb:{switch(G[a+52>>2]-259|0){case 1:if(!f){break e}break gb;case 0:break hb;default:break e}}if(!f){break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2900>>2];ib:{if((e|0)<=1){b=f;if(!e){break ib}}e=G[c+2948>>2];G[c+336>>2]=G[G[e+88>>2]+(b<<2)>>2];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];jb:{kb:{if((b|0)<=1){if(!b){b=H[c+6|0];break jb}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(f<<2)>>2];b=H[G[b+84>>2]+f|0];break kb}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(d<<2)>>2];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;b=b&255;e=H[c+7|0];lb:{if(!(!b|!e)){E[G[a+84>>2]+d|0]=1;b=0;break lb}if(b){E[G[a+84>>2]+d|0]=0;b=G[c+336>>2];break lb}E[G[a+84>>2]+d|0]=0;b=G[c+48>>2];if(e){break lb}e=G[c+336>>2];b=(b|0)>(e|0)?b:e}G[G[a+88>>2]+(d<<2)>>2]=b;if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2900>>2];mb:{if((e|0)<=1){b=f;if(!e){break mb}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];nb:{ob:{if((b|0)<=1){if(!b){b=H[c+6|0];break nb}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break ob}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;b=b&255;e=H[c+7|0];pb:{if(!(!b|!e)){E[G[a+84>>2]+d|0]=1;h=0;break pb}if(b){E[G[a+84>>2]+d|0]=0;h=L[c+336>>3];break pb}E[G[a+84>>2]+d|0]=0;h=L[c+48>>3];if(e){break pb}k=L[c+336>>3];h=h>k?h:k}L[G[a+88>>2]+(d<<3)>>3]=h;if(g){continue}break}}if(f){continue}break}break e}e=M(G[G[c+2944>>2]+56>>2],f);qb:{switch(G[a+52>>2]-259|0){case 3:if(!f){break e}rb:while(1){f=f-1|0;b=f<<2;d=G[b+G[G[c+2944>>2]+88>>2]>>2];g=48;while(1){e=H[d|0];sb:{if((e|0)!=49){if(e){break sb}E[G[b+G[a+88>>2]>>2]]=g;E[G[b+G[a+88>>2]>>2]+1|0]=0;if(f){continue rb}break e}g=49}d=d+1|0;continue}};case 0:if(!f){break e}while(1){l=1;f=f-1|0;E[f+G[a+84>>2]|0]=1;b=e;g=G[G[c+2944>>2]+56>>2];d=g;if(d){while(1){d=d-1|0;b=b-1|0;j=G[c+2944>>2];if(!H[b+G[j+84>>2]|0]){j=G[G[j+88>>2]+(b<<2)>>2];E[G[a+84>>2]+f|0]=0;i=l?j:(i|0)>(j|0)?i:j;l=0}if(d){continue}break}e=e-g|0}G[G[a+88>>2]+(f<<2)>>2]=i;if(f){continue}break};break e;case 1:break qb;default:break e}}if(!f){break e}while(1){i=1;f=f-1|0;E[f+G[a+84>>2]|0]=1;b=e;j=G[G[c+2944>>2]+56>>2];d=j;if(d){while(1){d=d-1|0;b=b-1|0;g=G[c+2944>>2];if(!H[b+G[g+84>>2]|0]){k=L[G[g+88>>2]+(b<<3)>>3];E[G[a+84>>2]+f|0]=0;h=i?k:h>k?h:k;i=0}if(d){continue}break}e=e-j|0}L[G[a+88>>2]+(f<<3)>>3]=h;if(f){continue}break}break e}tb:{ub:{switch(G[a+52>>2]-259|0){case 1:if(!f){break e}break tb;case 0:break ub;default:break e}}if(!f){break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2900>>2];vb:{if((e|0)<=1){b=f;if(!e){break vb}}e=G[c+2948>>2];G[c+336>>2]=G[G[e+88>>2]+(b<<2)>>2];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];wb:{xb:{if((b|0)<=1){if(!b){b=H[c+6|0];break wb}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(f<<2)>>2];b=H[G[b+84>>2]+f|0];break xb}b=G[c+2944>>2];G[c+48>>2]=G[G[b+88>>2]+(d<<2)>>2];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;b=b&255;e=H[c+7|0];yb:{if(!(!b|!e)){E[G[a+84>>2]+d|0]=1;b=0;break yb}if(b){E[G[a+84>>2]+d|0]=0;b=G[c+336>>2];break yb}E[G[a+84>>2]+d|0]=0;b=G[c+48>>2];if(e){break yb}e=G[c+336>>2];b=(b|0)<(e|0)?b:e}G[G[a+88>>2]+(d<<2)>>2]=b;if(g){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;e=G[c+2900>>2];zb:{if((e|0)<=1){b=f;if(!e){break zb}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];Ab:{Bb:{if((b|0)<=1){if(!b){b=H[c+6|0];break Ab}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break Bb}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;b=b&255;e=H[c+7|0];Cb:{if(!(!b|!e)){E[G[a+84>>2]+d|0]=1;h=0;break Cb}if(b){E[G[a+84>>2]+d|0]=0;h=L[c+336>>3];break Cb}E[G[a+84>>2]+d|0]=0;h=L[c+48>>3];if(e){break Cb}k=L[c+336>>3];h=h>2]+(d<<3)>>3]=h;if(g){continue}break}}if(f){continue}break}break e}e=M(G[G[c+2944>>2]+56>>2],f);Db:{switch(G[a+52>>2]-259|0){case 3:if(!f){break e}Eb:while(1){f=f-1|0;b=f<<2;d=G[b+G[G[c+2944>>2]+88>>2]>>2];g=49;while(1){e=H[d|0];Fb:{if((e|0)!=48){if(e){break Fb}E[G[b+G[a+88>>2]>>2]]=g;E[G[b+G[a+88>>2]>>2]+1|0]=0;if(f){continue Eb}break e}g=48}d=d+1|0;continue}};case 0:if(!f){break e}while(1){l=1;f=f-1|0;E[f+G[a+84>>2]|0]=1;b=e;g=G[G[c+2944>>2]+56>>2];d=g;if(d){while(1){d=d-1|0;b=b-1|0;j=G[c+2944>>2];if(!H[b+G[j+84>>2]|0]){j=G[G[j+88>>2]+(b<<2)>>2];E[G[a+84>>2]+f|0]=0;i=l?j:(i|0)<(j|0)?i:j;l=0}if(d){continue}break}e=e-g|0}G[G[a+88>>2]+(f<<2)>>2]=i;if(f){continue}break};break e;case 1:break Db;default:break e}}if(!f){break e}while(1){i=1;f=f-1|0;E[f+G[a+84>>2]|0]=1;b=e;j=G[G[c+2944>>2]+56>>2];d=j;if(d){while(1){d=d-1|0;b=b-1|0;g=G[c+2944>>2];if(!H[b+G[g+84>>2]|0]){k=L[G[g+88>>2]+(b<<3)>>3];E[G[a+84>>2]+f|0]=0;h=i?k:h>2]+(f<<3)>>3]=h;if(f){continue}break}break e}while(1){f=f-1|0;g=G[a+56>>2];Gb:{if(!g){break Gb}while(1){d=d-1|0;b=d;e=G[c+2908>>2];Hb:{if((e|0)<=1){b=f;if(!e){break Hb}}e=G[c+2956>>2];L[c+912>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+9|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2904>>2];Ib:{if((e|0)<=1){b=f;if(!e){break Ib}}e=G[c+2952>>2];L[c+624>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+8|0]=H[G[e+84>>2]+b|0]}b=d;e=G[c+2900>>2];Jb:{if((e|0)<=1){b=f;if(!e){break Jb}}e=G[c+2948>>2];L[c+336>>3]=L[G[e+88>>2]+(b<<3)>>3];E[c+7|0]=H[G[e+84>>2]+b|0]}b=G[c+2896>>2];Kb:{Lb:{if((b|0)<=1){if(!b){b=H[c+6|0];break Kb}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(f<<3)>>3];b=H[G[b+84>>2]+f|0];break Lb}b=G[c+2944>>2];L[c+48>>3]=L[G[b+88>>2]+(d<<3)>>3];b=H[G[b+84>>2]+d|0]}E[c+6|0]=b}g=g-1|0;Mb:{if(!(H[c+8|0]|(H[c+7|0]|b&255))){b=H[c+9|0];E[G[a+84>>2]+d|0]=(b|0)!=0;if(b){break Mb}k=L[c+912>>3];o=L[c+624>>3];m=L[c+48>>3];p=L[c+336>>3];h=L[154849];if(h==0){G[309698]=-1571644103;G[309699]=1066524486;h=.017453292519943295}t=eb(p*h);u=eb(k*h);o=ib((o-m)*h*.5);k=ib((k-p)*h*.5);b=G[a+88>>2]+(d<<3)|0;k=Q(R(k*k+o*(o*(t*u)),0),1);k=Db(V(k),V(1-k));L[b>>3]=(k+k)/h;if(!g){break Gb}continue}E[G[a+84>>2]+d|0]=1}if(g){continue}break}}if(f){continue}break}break e}Nb:{switch(G[a+52>>2]-259|0){case 1:if(!d){break e}while(1){d=d-1|0;f=d<<3;b=f+G[a+88>>2]|0;e=G[c+2944>>2];h=L[f+G[e+88>>2]>>3];Ob:{if(h==L[G[c+2948>>2]+88>>3]){G[b>>2]=0;G[b+4>>2]=0;b=1;break Ob}L[b>>3]=h;b=H[G[e+84>>2]+d|0]}E[G[a+84>>2]+d|0]=b;if(d){continue}break};break e;case 0:break Nb;default:break e}}if(!d){break e}while(1){d=d-1|0;f=d<<2;b=f+G[a+88>>2]|0;e=G[c+2944>>2];f=G[f+G[e+88>>2]>>2];Pb:{if((f|0)==G[G[c+2948>>2]+88>>2]){G[b>>2]=0;b=1;break Pb}G[b>>2]=f;b=H[G[e+84>>2]+d|0]}E[G[a+84>>2]+d|0]=b;if(d){continue}break}break e}Qb:{switch(G[a+52>>2]-258|0){case 3:if(!f){break e}e=c+48|0;j=c+336|0;while(1){f=f-1|0;if(G[c+2900>>2]){b=G[c+2948>>2];E[c+7|0]=H[G[b+84>>2]+f|0];Za(j,G[G[b+88>>2]+(f<<2)>>2])}Rb:{if(!G[c+2896>>2]){b=H[c+6|0];break Rb}g=G[c+2944>>2];b=H[G[g+84>>2]+f|0];E[c+6|0]=b;Za(e,G[G[g+88>>2]+(f<<2)>>2])}b=b&255;E[G[a+84>>2]+(b?f:d)|0]=b?H[c+7|0]:0;Za(G[G[a+88>>2]+(f<<2)>>2],b?j:e);if(f){continue}break};break e;case 0:if(!f){break e}e=c+48|0;j=c+336|0;while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;i=G[c+2900>>2];Sb:{if((i|0)<=1){b=f;if(!i){break Sb}}i=G[c+2948>>2];E[c+7|0]=H[G[i+84>>2]+b|0];E[c+336|0]=H[G[i+88>>2]+b|0]}b=G[c+2896>>2];Tb:{if((b|0)<=1){if(!b){b=H[c+6|0];break Tb}i=G[c+2944>>2];b=H[G[i+84>>2]+f|0];E[c+6|0]=b;E[c+48|0]=H[G[i+88>>2]+f|0];break Tb}i=G[c+2944>>2];b=H[G[i+84>>2]+d|0];E[c+6|0]=b;E[c+48|0]=H[G[i+88>>2]+d|0]}b=b&255;E[G[a+84>>2]+d|0]=b?H[c+7|0]:0;E[G[a+88>>2]+d|0]=H[(b?j:e)|0];g=g-1|0;if(g){continue}break}}if(f){continue}break};break e;case 1:if(!f){break e}e=c+48|0;j=c+336|0;while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;i=G[c+2900>>2];Ub:{if((i|0)<=1){b=f;if(!i){break Ub}}i=G[c+2948>>2];E[c+7|0]=H[G[i+84>>2]+b|0];G[c+336>>2]=G[G[i+88>>2]+(b<<2)>>2]}b=G[c+2896>>2];Vb:{if((b|0)<=1){if(!b){b=H[c+6|0];break Vb}i=G[c+2944>>2];b=H[G[i+84>>2]+f|0];E[c+6|0]=b;G[c+48>>2]=G[G[i+88>>2]+(f<<2)>>2];break Vb}i=G[c+2944>>2];b=H[G[i+84>>2]+d|0];E[c+6|0]=b;G[c+48>>2]=G[G[i+88>>2]+(d<<2)>>2]}b=b&255;E[G[a+84>>2]+d|0]=b?H[c+7|0]:0;G[G[a+88>>2]+(d<<2)>>2]=G[(b?j:e)>>2];g=g-1|0;if(g){continue}break}}if(f){continue}break};break e;case 2:break Qb;default:break e}}if(!f){break e}e=c+48|0;j=c+336|0;while(1){f=f-1|0;g=G[a+56>>2];if(g){while(1){d=d-1|0;b=d;i=G[c+2900>>2];Wb:{if((i|0)<=1){b=f;if(!i){break Wb}}i=G[c+2948>>2];E[c+7|0]=H[G[i+84>>2]+b|0];L[c+336>>3]=L[G[i+88>>2]+(b<<3)>>3]}b=G[c+2896>>2];Xb:{if((b|0)<=1){if(!b){b=H[c+6|0];break Xb}i=G[c+2944>>2];b=H[G[i+84>>2]+f|0];E[c+6|0]=b;L[c+48>>3]=L[G[i+88>>2]+(f<<3)>>3];break Xb}i=G[c+2944>>2];b=H[G[i+84>>2]+d|0];E[c+6|0]=b;L[c+48>>3]=L[G[i+88>>2]+(d<<3)>>3]}b=b&255;E[G[a+84>>2]+d|0]=b?H[c+7|0]:0;L[G[a+88>>2]+(d<<3)>>3]=L[(b?j:e)>>3];g=g-1|0;if(g){continue}break}}if(f){continue}break}break e}b=G[G[c+2944>>2]+52>>2]==261?f:d;if(!b){break e}d=b;if(b&1){d=b-1|0;E[d+G[a+88>>2]|0]=H[G[G[c+2944>>2]+84>>2]+d|0];E[G[a+84>>2]+d|0]=0}if((b|0)==1){break e}while(1){b=d-1|0;E[b+G[a+88>>2]|0]=H[b+G[G[c+2944>>2]+84>>2]|0];E[b+G[a+84>>2]|0]=0;d=d-2|0;E[d+G[a+88>>2]|0]=H[G[G[c+2944>>2]+84>>2]+d|0];E[G[a+84>>2]+d|0]=0;if(d){continue}break}break e}if(!f){break e}b=G[c+2944>>2];j=G[b+52>>2]==261?1:G[b+56>>2];g=j-1|0;l=j&1;e=M(f,j);while(1){f=f-1|0;E[f+G[a+84>>2]|0]=0;i=f<<2;G[i+G[a+88>>2]>>2]=0;if(j){n=G[G[c+2944>>2]+84>>2];d=j;b=e;if(l){b=e-1|0;if(!H[n+b|0]){d=i+G[a+88>>2]|0;G[d>>2]=G[d>>2]+1}d=g}if((j|0)!=1){while(1){if(!H[(b+n|0)-1|0]){q=i+G[a+88>>2]|0;G[q>>2]=G[q>>2]+1}d=d-2|0;b=b-2|0;if(!H[n+b|0]){q=i+G[a+88>>2]|0;G[q>>2]=G[q>>2]+1}if(d){continue}break}}e=e-j|0}if(f){continue}break}break e}if(G[G[c+2944>>2]+52>>2]!=260){if(!d){break e}while(1){d=d-1|0;e=d<<2;f=G[c+2944>>2];j=G[e+G[f+88>>2]>>2];b=j>>31;G[e+G[a+88>>2]>>2]=(b^j)-b;E[G[a+84>>2]+d|0]=H[G[f+84>>2]+d|0];if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;f=d<<3;b=G[c+2944>>2];h=L[f+G[b+88>>2]>>3];L[f+G[a+88>>2]>>3]=h>0?h:-h;E[G[a+84>>2]+d|0]=H[G[b+84>>2]+d|0];if(d){continue}break}break e}b=G[c+2944>>2];n=G[b+84>>2];d=G[b+88>>2];j=G[b+56>>2];Yb:{Zb:{if(G[b+52>>2]==259){e=ab(j<<2);if(!e){break Zb}if((f|0)>0){A=j&3;D=j-1>>>0<3;while(1){_b:{if(!j){g=e;break _b}l=0;i=j;g=e;b=n;if(A){while(1){if(!H[b|0]){G[g>>2]=G[d>>2];g=g+4|0}i=i-1|0;b=b+1|0;d=d+4|0;l=l+1|0;if((A|0)!=(l|0)){continue}break}}if(!D){while(1){if(!H[b|0]){G[g>>2]=G[d>>2];g=g+4|0}if(!H[b+1|0]){G[g>>2]=G[d+4>>2];g=g+4|0}if(!H[b+2|0]){G[g>>2]=G[d+8>>2];g=g+4|0}i=i-4|0;if(!H[b+3|0]){G[g>>2]=G[d+12>>2];g=g+4|0}b=b+4|0;d=d+16|0;if(i){continue}break}}n=j+n|0}b=g-e|0;$b:{if((b|0)>0){E[G[a+84>>2]+q|0]=0;l=0;b=b>>>2|0;g=b-1|0;x=(g|0)/2|0;ac:{if(b>>>0<2){break ac}while(1){s=l+1|0;if((s|0)==(g|0)){b=e+(l<<2)|0;i=G[b>>2];g=e+(g<<2)|0;l=G[g>>2];if((i|0)<=(l|0)){break ac}G[b>>2]=l;G[g>>2]=i;break ac}r=e+((g+l|0)/2<<2)|0;b=G[r>>2];v=e+(g<<2)|0;i=G[v>>2];bc:{if((b|0)<=(i|0)){b=i;break bc}G[r>>2]=i;G[v>>2]=b}w=e+(l<<2)|0;i=G[w>>2];if((i|0)>(b|0)){G[w>>2]=b;G[v>>2]=i;i=G[w>>2]}b=G[r>>2];if((i|0)<(b|0)){G[r>>2]=i;G[w>>2]=b;b=G[r>>2]}i=e+(s<<2)|0;G[r>>2]=G[i>>2];G[i>>2]=b;b=g;while(1){r=G[w>>2];while(1){s=s+1|0;B=e+(s<<2)|0;C=G[B>>2];if((r|0)>(C|0)){continue}break}while(1){i=b;b=b-1|0;v=e+(b<<2)|0;y=G[v>>2];if((r|0)<(y|0)){continue}break}if((i|0)>(s|0)){G[B>>2]=y;G[v>>2]=C;continue}break}G[w>>2]=y;G[v>>2]=r;g=(i|0)>(x|0)?i-2|0:g;l=(b|0)>(x|0)?l:s;if((g|0)>(l|0)){continue}break}}b=G[e+(x<<2)>>2];break $b}E[G[a+84>>2]+q|0]=1;b=0}G[G[a+88>>2]+(q<<2)>>2]=b;q=q+1|0;if((q|0)!=(f|0)){continue}break}}Wa(e);break e}e=ab(j<<3);if(!e){break Yb}if((f|0)>0){s=j&3;r=j-1>>>0<3;while(1){cc:{if(!j){g=e;break cc}l=0;i=j;g=e;b=n;if(s){while(1){if(!H[b|0]){L[g>>3]=L[d>>3];g=g+8|0}i=i-1|0;b=b+1|0;d=d+8|0;l=l+1|0;if((s|0)!=(l|0)){continue}break}}if(!r){while(1){if(!H[b|0]){L[g>>3]=L[d>>3];g=g+8|0}if(!H[b+1|0]){L[g>>3]=L[d+8>>3];g=g+8|0}if(!H[b+2|0]){L[g>>3]=L[d+16>>3];g=g+8|0}i=i-4|0;if(!H[b+3|0]){L[g>>3]=L[d+24>>3];g=g+8|0}b=b+4|0;d=d+32|0;if(i){continue}break}}n=j+n|0}b=g-e|0;dc:{if((b|0)>0){E[G[a+84>>2]+q|0]=0;h=Mi(e,b>>>3|0);break dc}E[G[a+84>>2]+q|0]=1;h=0}L[G[a+88>>2]+(q<<3)>>3]=h;q=q+1|0;if((q|0)!=(f|0)){continue}break}}Wa(e);break e}wc(14017);Wa(G[a+88>>2]);break e}wc(14017);Wa(G[a+88>>2]);break e}d=G[c+2944>>2];b=M(G[d+56>>2],f);ec:{switch(G[d+52>>2]-259|0){case 1:if(!f){break e}while(1){f=f-1|0;fc:{gc:{g=G[c+2944>>2];e=G[g+56>>2];if(e){q=e&1;n=G[g+84>>2];j=e-1|0;hc:{if(!j){l=0;h=0;d=b;break hc}s=e&-2;l=0;h=0;d=b;i=0;while(1){r=d-1|0;if(!H[r+n|0]){h=h+L[G[g+88>>2]+(r<<3)>>3];l=l+1|0}d=d-2|0;if(!H[n+d|0]){h=h+L[G[g+88>>2]+(d<<3)>>3];l=l+1|0}i=i+2|0;if((s|0)!=(i|0)){continue}break}}ic:{if(!q){break ic}d=d-1|0;if(H[d+n|0]){break ic}l=l+1|0;h=h+L[G[g+88>>2]+(d<<3)>>3]}d=b-e|0;if((l|0)>=2){break gc}b=d}E[G[a+84>>2]+f|0]=0;h=0;break fc}o=+(l|0);jc:{if(!e){h=0;break jc}k=h/o;i=G[g+84>>2];h=0;if(q){b=b-1|0;if(!H[i+b|0]){h=L[G[g+88>>2]+(b<<3)>>3]-k;h=h*h+0}e=j}if(j){while(1){j=b-1|0;if(!H[j+i|0]){m=L[G[g+88>>2]+(j<<3)>>3]-k;h=m*m+h}e=e-2|0;b=b-2|0;if(!H[i+b|0]){m=L[G[g+88>>2]+(b<<3)>>3]-k;h=m*m+h}if(e){continue}break}}b=d}E[G[a+84>>2]+f|0]=0;h=V(h/(o+-1))}L[G[a+88>>2]+(f<<3)>>3]=h;if(f){continue}break};break e;case 0:break ec;default:break e}}if(!f){break e}while(1){f=f-1|0;kc:{lc:{g=G[c+2944>>2];e=G[g+56>>2];if(e){q=e&1;n=G[g+84>>2];j=e-1|0;mc:{if(!j){l=0;h=0;d=b;break mc}s=e&-2;l=0;h=0;d=b;i=0;while(1){r=d-1|0;if(!H[r+n|0]){h=h+ +G[G[g+88>>2]+(r<<2)>>2];l=l+1|0}d=d-2|0;if(!H[n+d|0]){h=h+ +G[G[g+88>>2]+(d<<2)>>2];l=l+1|0}i=i+2|0;if((s|0)!=(i|0)){continue}break}}nc:{if(!q){break nc}d=d-1|0;if(H[d+n|0]){break nc}l=l+1|0;h=h+ +G[G[g+88>>2]+(d<<2)>>2]}d=b-e|0;if((l|0)>=2){break lc}b=d}E[G[a+84>>2]+f|0]=0;h=0;break kc}o=+(l|0);oc:{if(!e){h=0;break oc}k=h/o;i=G[g+84>>2];h=0;if(q){b=b-1|0;if(!H[i+b|0]){h=+G[G[g+88>>2]+(b<<2)>>2]-k;h=h*h+0}e=j}if(j){while(1){j=b-1|0;if(!H[j+i|0]){m=+G[G[g+88>>2]+(j<<2)>>2]-k;h=m*m+h}e=e-2|0;b=b-2|0;if(!H[i+b|0]){m=+G[G[g+88>>2]+(b<<2)>>2]-k;h=m*m+h}if(e){continue}break}}b=d}E[G[a+84>>2]+f|0]=0;h=V(h/(o+-1))}L[G[a+88>>2]+(f<<3)>>3]=h;if(f){continue}break}break e}b=G[c+2944>>2];d=M(G[b+56>>2],f);pc:{switch(G[b+52>>2]-259|0){case 1:if(!f){break e}while(1){f=f-1|0;e=f<<3;b=e+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;qc:{j=G[c+2944>>2];b=G[j+56>>2];if(b){g=G[j+84>>2];i=0;while(1){b=b-1|0;d=d-1|0;if(!H[g+d|0]){n=e+G[a+88>>2]|0;L[n>>3]=L[G[j+88>>2]+(d<<3)>>3]+L[n>>3];i=i+1|0}if(b){continue}break}if(i){break qc}}E[G[a+84>>2]+f|0]=1;if(f){continue}break e}E[G[a+84>>2]+f|0]=0;b=e+G[a+88>>2]|0;L[b>>3]=L[b>>3]/+(i|0);if(f){continue}break};break e;case 0:break pc;default:break e}}if(!f){break e}while(1){f=f-1|0;e=f<<3;b=e+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;rc:{j=G[c+2944>>2];b=G[j+56>>2];if(b){g=G[j+84>>2];i=0;while(1){b=b-1|0;d=d-1|0;if(!H[g+d|0]){n=e+G[a+88>>2]|0;L[n>>3]=L[n>>3]+ +G[G[j+88>>2]+(d<<2)>>2];i=i+1|0}if(b){continue}break}if(i){break rc}}E[G[a+84>>2]+f|0]=1;if(f){continue}break e}E[G[a+84>>2]+f|0]=0;b=e+G[a+88>>2]|0;L[b>>3]=L[b>>3]/+(i|0);if(f){continue}break}break e}b=G[c+2944>>2];d=M(G[b+56>>2],f);sc:{tc:{uc:{vc:{wc:{switch(G[b+52>>2]-258|0){case 2:if(!f){break e}break tc;case 1:if(!f){break e}break sc;case 0:if(!f){break e}break vc;default:break wc}}if(!f){break e}break uc}while(1){f=f-1|0;e=f<<2;G[e+G[a+88>>2]>>2]=0;E[G[a+84>>2]+f|0]=1;b=G[G[c+2944>>2]+56>>2];if(b){while(1){b=b-1|0;d=d-1|0;j=G[c+2944>>2];if(!H[d+G[j+84>>2]|0]){g=e+G[a+88>>2]|0;G[g>>2]=G[g>>2]+(H[G[j+88>>2]+d|0]!=0);E[G[a+84>>2]+f|0]=0}if(b){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;b=f<<2;d=G[b+G[G[c+2944>>2]+88>>2]>>2];G[b+G[a+88>>2]>>2]=0;E[G[a+84>>2]+f|0]=0;while(1){xc:{e=H[d|0];yc:{if((e|0)!=49){if(!e){break xc}break yc}e=b+G[a+88>>2]|0;G[e>>2]=G[e>>2]+1}d=d+1|0;continue}break}if(f){continue}break}break e}while(1){f=f-1|0;e=f<<3;b=e+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+f|0]=1;b=G[G[c+2944>>2]+56>>2];if(b){while(1){b=b-1|0;d=d-1|0;j=G[c+2944>>2];if(!H[d+G[j+84>>2]|0]){g=e+G[a+88>>2]|0;L[g>>3]=L[G[j+88>>2]+(d<<3)>>3]+L[g>>3];E[G[a+84>>2]+f|0]=0}if(b){continue}break}}if(f){continue}break}break e}while(1){f=f-1|0;e=f<<2;G[e+G[a+88>>2]>>2]=0;E[G[a+84>>2]+f|0]=1;b=G[G[c+2944>>2]+56>>2];if(b){while(1){b=b-1|0;d=d-1|0;j=G[c+2944>>2];if(!H[d+G[j+84>>2]|0]){g=e+G[a+88>>2]|0;G[g>>2]=G[g>>2]+G[G[j+88>>2]+(d<<2)>>2];E[G[a+84>>2]+f|0]=0}if(b){continue}break}}if(f){continue}break}break e}f=G[c+2944>>2];b=G[f>>2];if(G[f+52>>2]==260){if((b|0)!=-1e3){if(!d){break e}while(1){d=d-1|0;E[d+G[a+84>>2]|0]=H[G[G[c+2944>>2]+84>>2]+d|0];b=d<<3;if(L[b+G[G[c+2944>>2]+88>>2]>>3]<0){E[G[a+84>>2]+d|0]=1}if(!H[G[a+84>>2]+d|0]){b=Bg(L[b+G[G[c+2944>>2]+88>>2]>>3]);G[G[a+88>>2]+(d<<2)>>2]=b}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;E[d+G[a+84>>2]|0]=L[c+48>>3]<0;if(!H[G[a+84>>2]+d|0]){b=Bg(L[c+48>>3]);G[G[a+88>>2]+(d<<2)>>2]=b}if(d){continue}break}break e}if((b|0)!=-1e3){if(!d){break e}while(1){d=d-1|0;E[d+G[a+84>>2]|0]=H[G[G[c+2944>>2]+84>>2]+d|0];b=d<<2;if(G[b+G[G[c+2944>>2]+88>>2]>>2]<0){E[G[a+84>>2]+d|0]=1}if(!H[G[a+84>>2]+d|0]){f=Bg(+G[b+G[G[c+2944>>2]+88>>2]>>2]);G[b+G[a+88>>2]>>2]=f}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;E[d+G[a+84>>2]|0]=G[c+48>>2]>>>31;if(!H[G[a+84>>2]+d|0]){b=Bg(+G[c+48>>2]);G[G[a+88>>2]+(d<<2)>>2]=b}if(d){continue}break}break e}zc:{switch(G[a+52>>2]-259|0){case 2:if(!f){break e}d=f;if(d&1){d=f-1|0;E[G[G[a+88>>2]+(d<<2)>>2]]=0;E[G[a+84>>2]+d|0]=1}if((f|0)==1){break e}while(1){b=d-1|0;E[G[G[a+88>>2]+(b<<2)>>2]]=0;E[b+G[a+84>>2]|0]=1;d=d-2|0;E[G[G[a+88>>2]+(d<<2)>>2]]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break};break e;case 0:break zc;default:break e}}if(!f){break e}b=f-1|0;e=f&3;if(e){d=0;while(1){f=f-1|0;G[G[a+88>>2]+(f<<2)>>2]=0;E[G[a+84>>2]+f|0]=1;d=d+1|0;if((e|0)!=(d|0)){continue}break}}if(b>>>0<3){break e}while(1){b=f-1|0;G[G[a+88>>2]+(b<<2)>>2]=0;E[b+G[a+84>>2]|0]=1;b=f-2|0;G[G[a+88>>2]+(b<<2)>>2]=0;E[b+G[a+84>>2]|0]=1;b=f-3|0;G[G[a+88>>2]+(b<<2)>>2]=0;E[b+G[a+84>>2]|0]=1;f=f-4|0;G[G[a+88>>2]+(f<<2)>>2]=0;E[G[a+84>>2]+f|0]=1;if(f){continue}break}break e}if(!f){break e}d=f;if(d&1){d=f-1|0;G[G[a+88>>2]+(d<<2)>>2]=G[309726]+d;E[G[a+84>>2]+d|0]=0}if((f|0)==1){break e}while(1){b=d-1|0;G[G[a+88>>2]+(b<<2)>>2]=b+G[309726];E[b+G[a+84>>2]|0]=0;d=d-2|0;G[G[a+88>>2]+(d<<2)>>2]=G[309726]+d;E[G[a+84>>2]+d|0]=0;if(d){continue}break}break e}if(!d){break e}while(1){b=Au(G[309618],G[309619],1284865837,1481765933)+1|0;f=Ia;f=b?f:f+1|0;G[309618]=b;G[309619]=f;d=d-1|0;L[G[a+88>>2]+(d<<3)>>3]=+(f>>>1|0)*4.656612873077393e-10;E[G[a+84>>2]+d|0]=0;if(d){continue}break}break e}if(!d){break e}while(1){Ac:{if(!H[1238480]){f=Au(G[309618],G[309619],1284865837,1481765933)+1|0;b=Ia;G[309618]=f;b=f?b:b+1|0;G[309619]=b;j=Au(G[309618],G[309619],1284865837,1481765933)+1|0;f=Ia;f=j?f:f+1|0;G[309618]=j;G[309619]=f;E[1238480]=1;h=V(oc(+(b>>>1|0)*4.656612873077393e-10)*-2);k=+(f>>>1|0)*4.656612873077393e-10*6.283185307179586;F=1238488,J=h*eb(k),L[F>>3]=J;h=h*ib(k);break Ac}E[1238480]=0;h=L[154811]}d=d-1|0;L[G[a+88>>2]+(d<<3)>>3]=h;E[G[a+84>>2]+d|0]=0;if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=ib(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=eb(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=Mc(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;h=L[b+G[G[c+2944>>2]+88>>2]>>3];if(h<-1|h>1){b=b+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break e}F=b+G[a+88>>2]|0,J=fc(h),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;h=L[b+G[G[c+2944>>2]+88>>2]>>3];if(h<-1|h>1){b=b+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break e}F=b+G[a+88>>2]|0,J=Sc(h),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=Pd(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=wn(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=vn(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=un(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;F=b+G[a+88>>2]|0,J=af(L[b+G[G[c+2944>>2]+88>>2]>>3]),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;h=L[b+G[G[c+2944>>2]+88>>2]>>3];if(h<=0){b=b+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break e}F=b+G[a+88>>2]|0,J=oc(h),L[F>>3]=J}if(d){continue}break}break e}if(!d){break e}while(1){d=d-1|0;b=H[d+G[G[c+2944>>2]+84>>2]|0];E[G[a+84>>2]+d|0]=b;if(!b){b=d<<3;h=L[b+G[G[c+2944>>2]+88>>2]>>3];if(h<=0){b=b+G[a+88>>2]|0;G[b>>2]=0;G[b+4>>2]=0;E[G[a+84>>2]+d|0]=1;if(d){continue}break e}F=b+G[a+88>>2]|0,J=tn(h),L[F>>3]=J}if(d){continue}break}}d=G[a+8>>2];if(d){while(1){d=d-1|0;a=G[(c+2944|0)+(d<<2)>>2];if(G[a>>2]>0){Wa(G[a+88>>2])}if(d){continue}break}}Fa=c+2992|0}function Tq(a,b){a=a|0;b=b|0;var 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,w=0,x=0,y=0,z=0,B=0,C=0,D=0,F=0,I=0,P=0,T=0,U=0,X=0,Y=0,Z=N(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=N(0),qa=0,ra=0;c=Fa-2544|0;Fa=c;G[c+2392>>2]=0;G[c+1856>>2]=0;G[c+1860>>2]=2146959360;Wc(1292356);r=G[29763];G[321435]=r;G[47589]=1;G[323090]=G[323089];G[323091]=0;G[47590]=0;G[323092]=0;G[323093]=0;E[1292384]=0;E[1292640]=0;F=1;z=1;y=1;a:{b:{c:{while(1){e=d;d=1;d:{switch(of(a,b,33061)+1|0){case 98:qa=190364,ra=_b(G[321433]),G[qa>>2]=ra;d=e;continue;case 123:y=vb(G[321433],c+1868|0);d=e;e=G[321433];if(J[c+1868>>2]>=Va(e)+e>>>0){continue}G[c+1728>>2]=e;_a(G[321435],81462,c+1728|0);break a;case 101:qa=1292364,ra=nj(G[321433]),G[qa>>2]=ra;d=e;continue;case 116:g=ac(G[321433],49010);G[321435]=g;d=e;if(g){continue}G[c+1744>>2]=G[321433];_a(0,80991,c+1744|0);break a;case 106:Za(1292640,G[321433]);d=e;continue;case 112:Za(1292384,G[321433]);d=e;continue;case 120:G[323093]=1;Za(1292896,G[321433]);d=e;continue;case 88:z=vb(G[321433],c+1868|0);d=e;e=G[321433];if(J[c+1868>>2]>=Va(e)+e>>>0){continue}G[c+1760>>2]=e;_a(G[321435],81748,c+1760|0);break a;case 117:U=vb(G[321433],c+1868|0);d=e;e=G[321433];if(J[c+1868>>2]>=Va(e)+e>>>0){continue}G[c+1776>>2]=e;_a(G[321435],81650,c+1776|0);break a;case 121:F=vb(G[321433],c+1868|0);d=e;e=G[321433];if(J[c+1868>>2]>=Va(e)+e>>>0){continue}G[c+1792>>2]=e;_a(G[321435],81558,c+1792|0);break a;case 99:t=nc(G[321433],c+1868|0,10);g=G[321433];if(J[c+1868>>2]>>0){n=1;t=0;d=e;m=Fa-8224|0;Fa=m;G[925240]=0;g=Za(m+32|0,g);if(G[323091]>=3){G[m+16>>2]=g;kb(76778,m+16|0);$a(G[29763])}u=Va(g)+g|0;while(1){e=g;if(H[e|0]==32){g=e+1|0;if(e>>>0>>0){continue}}break}e:{if(e>>>0>=u>>>0){j=G[925240];break e}o=G[29763];g=e;while(1){j=H[e|0]-32|0;if(!(!j|(j|0)==12|e>>>0>=u>>>0)){e=e+1|0;continue}E[e|0]=0;j=G[925240];qa=(j<<3)+3700976|0,ra=_b(g),G[qa>>2]=ra;while(1){f:{g=e+1|0;D=H[e+1|0];if((D|0)!=32){break f}e=g;if(u>>>0>e>>>0){continue}}break}e=g;if(u>>>0<=e>>>0){break e}while(1){j=D-32|0;if(!(!j|(j|0)==12|e>>>0>=u>>>0)){D=H[e+1|0];e=e+1|0;continue}break}E[e|0]=0;j=G[925240];D=(j<<3)+3700976|0;g=_b(g);G[D+4>>2]=g;if(G[323091]){G[m+8>>2]=g;G[m>>2]=j;G[m+4>>2]=G[D>>2];kb(73855,m);$a(o);j=G[925240]}j=j+1|0;G[925240]=j;g=e+1|0;if(u>>>0>g>>>0){continue}break}}Fa=m+8224|0;if((j|0)>3){continue}G[c+1808>>2]=G[321433];_a(G[321435],80307,c+1808|0);break a}d=e;if((t|0)>=0){continue}G[c+1824>>2]=t;_a(G[321435],82230,c+1824|0);break a;case 0:break b;case 89:continue;case 105:break d;default:break c}}j=nc(G[321433],c+1868|0,10);G[323092]=j;g=G[321433];if(J[c+1868>>2]>=Va(g)+g>>>0){d=e;if((j|0)>=0){continue}}break}G[c+1840>>2]=g;_a(G[321435],81309,c+1840|0);break a}G[c>>2]=G[b>>2];_a(G[321435],81983,c);break a}g:{h:{i:{j:{k:{l:{d=a;a=G[47589];if((d-a|0)>2){a=(a<<2)+b|0;Za(1293152,G[a>>2]);Za(1293408,G[a+4>>2]);da=Za(c+2128|0,G[a+8>>2]);Lf(1293152,0,G[323092]);Lf(da,1,0);if(H[1292640]){Lf(1292640,1,0)}if(H[1292384]){Lf(1292384,1,0)}a=Va(1293408);m:{n:{o:{if(a>>>0>=6){b=-5;d=a+1293403|0;if(!fb(d,33598,5)){break n}if(fb(d,5646,5)){break o}break n}if((a|0)!=5){break m}}b=-4;d=a+1293404|0;if(!fb(d,33380,4)){break n}if(fb(d,5001,4)){break m}}E[(a+b|0)+1293408|0]=0}Za(1293664,1293408);a=Va(1293408)+1293408|0;b=H[5646]|H[5647]<<8|(H[5648]<<16|H[5649]<<24);E[a|0]=b;E[a+1|0]=b>>>8;E[a+2|0]=b>>>16;E[a+3|0]=b>>>24;b=H[5650]|H[5651]<<8;E[a+4|0]=b;E[a+5|0]=b>>>8;a=Va(1293664)+1293664|0;b=H[5645]|H[5646]<<8|(H[5647]<<16|H[5648]<<24);d=H[5641]|H[5642]<<8|(H[5643]<<16|H[5644]<<24);E[a|0]=d;E[a+1|0]=d>>>8;E[a+2|0]=d>>>16;E[a+3|0]=d>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;b=H[5648]|H[5649]<<8|(H[5650]<<16|H[5651]<<24);E[a+7|0]=b;E[a+8|0]=b>>>8;E[a+9|0]=b>>>16;E[a+10|0]=b>>>24;p:{if(G[323091]<=0){break p}G[c+1712>>2]=1293152;kb(76473,c+1712|0);G[c+1696>>2]=1293408;kb(76451,c+1696|0);G[c+1680>>2]=1293664;kb(76687,c+1680|0);G[c+1664>>2]=da;kb(76276,c+1664|0);if(H[1292640]){G[c+1648>>2]=1292640;kb(90289,c+1648|0)}if(H[1292384]){G[c+1632>>2]=1292384;kb(90266,c+1632|0)}$a(r);if(G[323091]<=0){break p}Wc(1292356);L[c+1616>>3]=G[323089]-G[323090]|0;gb(91957,c+1616|0);$a(r)}a=Fa-416|0;Fa=a;G[a+412>>2]=0;q:{r:{s:{t:{u:{v:{w:{if(!Rc(1293920,1293152,0,a+412|0)){b=G[323092];if((b|0)>0){if(mb(G[323480],b+1|0,0,a+412|0)){break w}}if(Yj(G[323480],1292336,a+412|0)){break v}if(Eg(G[323480],1293956,a+412|0)){break u}x:{if(!G[323093]){break x}if(Rc(3700832,1292896,0,a+412|0)){break t}b=G[323092];if((b|0)<=0){break x}if(mb(G[925208],b+1|0,0,a+412|0)){break s}}if(G[323091]>=3){G[a>>2]=G[323084];kb(69897,a);$a(G[29763])}b=rd(G[323084]);G[323483]=b;if(!b){break r}f=L[161745];L[b+16>>3]=f+L[b+16>>3];L[b+24>>3]=f+L[b+24>>3];k=f+f;f=k+L[b+136>>3];L[b+136>>3]=f;k=k+L[b+144>>3];L[b+144>>3]=k;if(O(k)<2147483648){b=~~k}else{b=-2147483648}G[323482]=b;if(O(f)<2147483648){b=~~f}else{b=-2147483648}G[323481]=b;y:{if(de(G[323480],2,a+144|0,a+412|0)){G[a+412>>2]=0;break y}b=G[a+148>>2];G[323481]=G[a+144>>2];G[323482]=b}G[323488]=0;b=G[323483];f=L[b+32>>3];z:{A:{if(!(f<0&L[b+40>>3]<0|f>0&L[b+40>>3]>0)){b=43640;if(G[323091]>2){break A}break z}G[323488]=1;b=43704;if(G[323091]<3){break z}}yb(b)}f=2e3;b=4;B:{C:{D:{E:{F:{d=G[323483];switch(G[d+3964>>2]-1|0){case 2:break B;case 3:break D;case 1:break E;case 0:break F;default:break C}}b=0;if(L[d+120>>3]!=1950){break B}f=1950;break B}b=1;if(L[d+120>>3]==2e3){break B}f=1950;break B}if(L[d+120>>3]!=1950){b=2;break B}b=3;f=1950;break B}b=0}L[161743]=f;G[323484]=b;Fa=a+416|0;break q}G[a+128>>2]=1293152;b=a+144|0;db(b,33643,a+128|0);G[a+112>>2]=b;_a(G[321435],80471,a+112|0);break a}b=G[a+412>>2];d=a+144|0;uc(b,d);G[a+96>>2]=b;G[a+100>>2]=d;_a(G[321435],80427,a+96|0);break a}b=G[a+412>>2];d=a+144|0;uc(b,d);G[a+80>>2]=b;G[a+84>>2]=d;_a(G[321435],80427,a+80|0);break a}b=G[a+412>>2];d=a+144|0;uc(b,d);G[a+64>>2]=b;G[a+68>>2]=d;_a(G[321435],80427,a- -64|0);break a}G[a+48>>2]=1292896;b=a+144|0;db(b,33604,a+48|0);G[a+32>>2]=b;_a(G[321435],80471,a+32|0);break a}b=G[a+412>>2];d=a+144|0;uc(b,d);G[a+16>>2]=b;G[a+20>>2]=d;_a(G[321435],80427,a+16|0);break a}hb(84433,53,1,G[321435]);break a}if(H[1292640]){mj(1292640,1)}if(G[323091]>0){G[c+1600>>2]=G[323481];kb(73494,c+1600|0);G[c+1584>>2]=G[323482];kb(73469,c+1584|0);G[c+1568>>2]=G[323484];kb(75841,c+1568|0);L[c+1552>>3]=L[161743];gb(70933,c+1552|0);G[c+1536>>2]=G[323488];kb(75769,c+1536|0);G[c+1520>>2]=G[323483]+3544;kb(90117,c+1520|0);$a(r)}a=G[323483]+3544|0;G:{if(!Xa(a,34606)){break G}if(!Xa(a,34543)){break G}if(!Xa(a,35981)){break G}if(!Xa(a,35072)){break G}if(Xa(a,35873)){break l}}G[323490]=0;G[323491]=0;if(e){a=G[323482];b=M(a,a);a=G[323481];h=V(+(b+M(a,a)|0));H:{if(O(h)<2147483648){a=~~h;break H}a=-2147483648}h=+(a|0);L[161745]=h}if(G[323091]>0){L[c+1488>>3]=h;gb(90054,c+1488|0);$a(r)}_=G[323489];mj(da,0);ga=(_|0)==-64;if(H[1292384]){mj(1292384,2)}D=ga?-64:-32;if(G[323091]>0){G[c+1472>>2]=G[323493];kb(73443,c+1472|0);G[c+1456>>2]=G[323494];kb(73418,c+1456|0);G[c+1440>>2]=G[323496];kb(75817,c+1440|0);L[c+1424>>3]=L[161749];gb(70908,c+1424|0);G[c+1408>>2]=G[323500];kb(75745,c+1408|0);G[c+1392>>2]=G[323495]+3544;kb(69711,c+1392|0);G[c+1376>>2]=D;kb(75793,c+1376|0);$a(r)}a=G[323495]+3544|0;I:{if(!Xa(a,34606)){break I}if(!Xa(a,34543)){break I}if(!Xa(a,35981)){break I}if(!Xa(a,35072)){break I}if(Xa(a,35873)){break k}}if(G[323484]!=G[323496]){break j}a=H[1292384];J:{if(H[1292640]){if(a){a=Th(1300832,2100832);break J}a=Th(1300832,2900832);break J}b=G[323084];if(a){a=Th(b,2100832);break J}a=Th(b,2900832)}G[c+2392>>2]=a;if(a){break i}if(G[323091]>=2){yb(16676);$a(r)}g=G[323481];a=M(g,24)+24|0;qa=1292340,ra=ab(a),G[qa>>2]=ra;qa=1292348,ra=ab(a),G[qa>>2]=ra;qa=1292344,ra=ab(a),G[qa>>2]=ra;qa=1292352,ra=ab(a),G[qa>>2]=ra;a=g<<3;fa=ab(a);if(G[323093]){ia=ab(a)}d=0;h=-1e8;l=1e8;if(G[323482]<0){k=1e8;i=-1e8;break g}i=-1e8;k=1e8;while(1){b=d;q=+(d|0)+.5;he(.5,q,c+2440|0,c+2432|0);f=L[c+2440>>3];a=1;K:{if(f<-.5){break K}a=1;if(f>+G[323533]+1.5){break K}p=L[c+2432>>3];a=1;if(p<-.5){break K}a=p>+G[323535]+1.5}if(G[323091]>=3){L[c+1312>>3]=f;L[c+1320>>3]=L[c+2432>>3];G[c+1328>>2]=a;G[c+1296>>2]=0;G[c+1300>>2]=1071644672;L[c+1304>>3]=q;gb(87953,c+1296|0);$a(r);cc(G[323483],.5,q,c+2408|0,c+2400|0);Bd(G[323495],L[c+2408>>3],L[c+2400>>3],c+2424|0,c+2416|0,c+2396|0);L[c+1264>>3]=L[c+2424>>3];L[c+1272>>3]=L[c+2416>>3];G[c+1280>>2]=G[c+2396>>2];L[c+1248>>3]=L[c+2408>>3];L[c+1256>>3]=L[c+2400>>3];gb(87888,c+1248|0)}L:{if(!a){f=L[c+2432>>3];l=f>3];i=ip?p:k;if(f>h){break L}}f=h}he(+G[323481]+.5,q,c+2440|0,c+2432|0);d=1;h=L[c+2440>>3];M:{if(h<-.5|h>+G[323533]+1.5){break M}p=L[c+2432>>3];if(p<-.5){break M}d=p>+G[323535]+1.5}if(G[323091]>=3){L[c+1216>>3]=h;L[c+1224>>3]=L[c+2432>>3];G[c+1232>>2]=d;L[c+1208>>3]=q;L[c+1200>>3]=+G[323481]+.5;gb(87953,c+1200|0);$a(r);cc(G[323483],+G[323481]+.5,q,c+2408|0,c+2400|0);Bd(G[323495],L[c+2408>>3],L[c+2400>>3],c+2424|0,c+2416|0,c+2396|0);L[c+1168>>3]=L[c+2424>>3];L[c+1176>>3]=L[c+2416>>3];G[c+1184>>2]=G[c+2396>>2];L[c+1152>>3]=L[c+2408>>3];L[c+1160>>3]=L[c+2400>>3];gb(87888,c+1152|0)}N:{if(!d){h=L[c+2432>>3];l=h>3];i=iq?q:k;if(f>2]=G[b>>2];_a(G[321435],81983,c+16|0);break a}G[c+1504>>2]=a;a=c+1872|0;db(a,14454,c+1504|0);lj(a);W()}G[c+1360>>2]=a;a=c+1872|0;db(a,14369,c+1360|0);lj(a);W()}G[c+1344>>2]=14292;_a(G[321435],80471,c+1344|0);break a}hb(83546,102,1,G[321435]);break a}g=G[323481]}d=0;if((g|0)>=0){while(1){b=d;q=+(d|0)+.5;he(q,.5,c+2440|0,c+2432|0);f=L[c+2440>>3];a=1;O:{if(f<-.5){break O}a=1;if(f>+G[323533]+1.5){break O}p=L[c+2432>>3];a=1;if(p<-.5){break O}a=p>+G[323535]+1.5}if(G[323091]>=3){L[c+1120>>3]=f;L[c+1128>>3]=L[c+2432>>3];G[c+1136>>2]=a;L[c+1104>>3]=q;G[c+1112>>2]=0;G[c+1116>>2]=1071644672;gb(87953,c+1104|0);$a(r);cc(G[323483],q,.5,c+2408|0,c+2400|0);Bd(G[323495],L[c+2408>>3],L[c+2400>>3],c+2424|0,c+2416|0,c+2396|0);L[c+1072>>3]=L[c+2424>>3];L[c+1080>>3]=L[c+2416>>3];G[c+1088>>2]=G[c+2396>>2];L[c+1056>>3]=L[c+2408>>3];L[c+1064>>3]=L[c+2400>>3];gb(87888,c+1056|0)}P:{if(!a){f=L[c+2432>>3];l=f>3];i=ip?p:k;if(f>h){break P}}f=h}he(q,+G[323482]+.5,c+2440|0,c+2432|0);d=1;h=L[c+2440>>3];Q:{if(h<-.5|h>+G[323533]+1.5){break Q}p=L[c+2432>>3];if(p<-.5){break Q}d=p>+G[323535]+1.5}if(G[323091]>=3){L[c+1024>>3]=h;L[c+1032>>3]=L[c+2432>>3];G[c+1040>>2]=d;L[c+1008>>3]=q;L[c+1016>>3]=+G[323482]+.5;gb(87953,c+1008|0);$a(r);cc(G[323483],q,+G[323482]+.5,c+2408|0,c+2400|0);Bd(G[323495],L[c+2408>>3],L[c+2400>>3],c+2424|0,c+2416|0,c+2396|0);L[c+976>>3]=L[c+2424>>3];L[c+984>>3]=L[c+2416>>3];G[c+992>>2]=G[c+2396>>2];L[c+960>>3]=L[c+2408>>3];L[c+968>>3]=L[c+2400>>3];gb(87888,c+960|0)}R:{if(!d){h=L[c+2432>>3];l=h>3];i=iq?q:k;if(f=0){while(1){G[c+2440>>2]=0;G[c+2444>>2]=1071644672;e=d;f=+(d|0)+.5;L[c+2432>>3]=f;Uh(.5,f,c+1872|0,c+2448|0);q=L[c+1872>>3];a=1;S:{if(q<-.5){break S}a=1;if(q>+G[323532]+1.5){break S}p=L[c+2448>>3];a=1;if(p<-.5){break S}a=p>+G[323534]+1.5}if(G[323091]>=3){L[c+928>>3]=q;L[c+936>>3]=L[c+2448>>3];G[c+944>>2]=a;G[c+912>>2]=0;G[c+916>>2]=1071644672;L[c+920>>3]=f;gb(87920,c+912|0);$a(r)}T:{if(!a){l=fh){break T}}f=h}q=+G[323493]+.5;L[c+2440>>3]=q;h=L[c+2432>>3];Uh(q,h,c+1872|0,c+2448|0);d=1;p=L[c+1872>>3];U:{if(p<-.5|p>+G[323532]+1.5){break U}s=L[c+2448>>3];if(s<-.5){break U}d=s>+G[323534]+1.5}if(G[323091]>=3){L[c+880>>3]=p;L[c+888>>3]=L[c+2448>>3];G[c+896>>2]=d;L[c+864>>3]=q;L[c+872>>3]=h;gb(87920,c+864|0);$a(r)}V:{if(!d){l=hq?q:k;if(f=0){while(1){G[c+2432>>2]=0;G[c+2436>>2]=1071644672;b=d;f=+(d|0)+.5;L[c+2440>>3]=f;Uh(f,.5,c+1872|0,c+2448|0);q=L[c+1872>>3];a=1;W:{if(q<-.5){break W}a=1;if(q>+G[323532]+1.5){break W}p=L[c+2448>>3];a=1;if(p<-.5){break W}a=p>+G[323534]+1.5}if(G[323091]>=3){L[c+832>>3]=q;L[c+840>>3]=L[c+2448>>3];G[c+848>>2]=a;L[c+816>>3]=f;G[c+824>>2]=0;G[c+828>>2]=1071644672;gb(87920,c+816|0);$a(r)}X:{if(a){break X}i=f>i?f:i;k=f>3]=h;q=L[c+2440>>3];Uh(q,h,c+1872|0,c+2448|0);d=1;p=L[c+1872>>3];Y:{if(p<-.5|p>+G[323532]+1.5){break Y}s=L[c+2448>>3];if(s<-.5){break Y}d=s>+G[323534]+1.5}if(G[323091]>=3){L[c+784>>3]=p;L[c+792>>3]=L[c+2448>>3];G[c+800>>2]=d;L[c+768>>3]=q;L[c+776>>3]=h;gb(87920,c+768|0);$a(r)}Z:{if(!d){l=hq?q:k;if(f0;f=k+-1;$:{if(O(f)<2147483648){d=~~f;break $}d=-2147483648}m=(d|0)>0;I=j?e:0;ba=m?d:0;f=h-l+2;aa:{if(O(f)<2147483648){g=~~f;break aa}g=-2147483648}w=(b|0)<(g|0)?b:g;f=i-k+2;ba:{if(O(f)<2147483648){b=~~f;break ba}b=-2147483648}x=(a|0)<(b|0)?a:b;if(G[323091]>=2){yb(38515);L[c+752>>3]=k;gb(70528,c+752|0);L[c+736>>3]=i;gb(70462,c+736|0);L[c+720>>3]=l;gb(70511,c+720|0);L[c+704>>3]=h;gb(70445,c+704|0);G[c+688>>2]=ba;kb(74016,c+688|0);G[c+672>>2]=x;kb(73982,c+672|0);G[c+656>>2]=I;kb(73999,c+656|0);G[c+640>>2]=w;kb(73965,c+640|0);$a(r)}ca:{da:{ea:{fa:{ga:{if(!(i>2]=b;if(!b){break ja}d=d+1|0;if((w|0)!=(d|0)){continue}break ha}break}break ea}if(G[323091]>0){G[c+624>>2]=M(w,M(e,x));kb(68827,c+624|0);$a(r)}a=(w|0)>0&(x|0)>0;ka:{if((_|0)!=-64){if(!a){break ka}B=x&-8;m=x&7;j=0;ca=x-1>>>0<7;while(1){a=G[(j<<2)+C>>2];b=0;o=0;if(!ca){while(1){d=b<<2;G[d+a>>2]=2143289344;G[a+(d|4)>>2]=2143289344;G[a+(d|8)>>2]=2143289344;G[a+(d|12)>>2]=2143289344;G[a+(d|16)>>2]=2143289344;G[a+(d|20)>>2]=2143289344;G[a+(d|24)>>2]=2143289344;G[a+(d|28)>>2]=2143289344;b=b+8|0;o=o+8|0;if((B|0)!=(o|0)){continue}break}}g=0;if(m){while(1){G[a+(b<<2)>>2]=2143289344;b=b+1|0;g=g+1|0;if((m|0)!=(g|0)){continue}break}}j=j+1|0;if((w|0)!=(j|0)){continue}break}break ka}if(!a){break ka}B=x&-8;m=x&7;j=0;ca=x-1>>>0<7;while(1){a=G[(j<<2)+C>>2];b=0;o=0;if(!ca){while(1){d=b<<3;g=d+a|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|8)|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|16)|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|24)|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|32)|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|40)|0;G[g>>2]=0;G[g+4>>2]=2146959360;g=a+(d|48)|0;G[g>>2]=0;G[g+4>>2]=2146959360;d=a+(d|56)|0;G[d>>2]=0;G[d+4>>2]=2146959360;b=b+8|0;o=o+8|0;if((B|0)!=(o|0)){continue}break}}g=0;if(m){while(1){d=a+(b<<3)|0;G[d>>2]=0;G[d+4>>2]=2146959360;b=b+1|0;g=g+1|0;if((m|0)!=(g|0)){continue}break}}j=j+1|0;if((w|0)!=(j|0)){continue}break}}B=ab(u);if(B){if((w|0)>0){g=x<<3;j=x<<2;m=M(e,x);u=(_|0)==-64;b=(x|0)<=0;d=0;while(1){a=ab(m);G[B+(d<<2)>>2]=a;if(!a){break da}la:{if(!u){if(b){break la}cb(a,0,j);break la}if(b){break la}cb(a,0,g)}d=d+1|0;if((w|0)!=(d|0)){continue}break}}if(G[323091]>0){G[c+608>>2]=M(w,M(e,x));kb(68942,c+608|0);$a(r)}G[c+2488>>2]=1;G[c+2492>>2]=1;G[c+2480>>2]=1;G[c+2484>>2]=t+1;if((G[323482]-t|0)>(t|0)){a=G[323481];ca=a;ja=a>>31;na=(n|0)!=1;q=y*-.5;oa=(_|0)!=-64;j=t;k=z;while(1){a=G[323481];ma:{na:{if(!na){u=a-1|0;m=0;X=G[925240];oa:{if((X|0)<=0){n=0;break oa}p=+(j|0);n=0;e=G[925244];g=G[925245];f=+(a|0);d=1;i=0;o=1;while(1){pa:{m=(d|0)==(X|0);b=((m?0:d)<<3)+3700976|0;a=G[b>>2];l=+(g|0);b=G[b+4>>2];s=+(b|0);if(!(p>(ls?l:s))){d=d+1|0;e=a;g=b;if(!m){continue}m=0;if(!o){break pa}n=0;break oa}l=(p-l)*+(a-e|0)/+(b-g|0)+ +(e|0);i=i>l?i:l;f=f0?a:0}if(G[323091]>=2){G[c+588>>2]=n;G[c+584>>2]=u;G[c+580>>2]=m;G[c+576>>2]=j;kb(62587,c+576|0);$a(r)}if(n){break na}G[c+2484>>2]=G[c+2484>>2]+1;break ma}u=a-t|0;if(G[323091]==2){G[c+592>>2]=j;kb(67859,c+592|0);$a(r)}m=t}if(!cg(G[323480],82,c+2480|0,ca,ja,c+1856|0,fa,c+2508|0,c+2392|0)){ra:{if(G[323093]){if(cg(G[925208],82,c+2480|0,ca,ja,c+1856|0,ia,c+2508|0,c+2392|0)){break ra}}G[c+2484>>2]=G[c+2484>>2]+1;sa:{ta:{if(!(y==1&ka)){if(G[323481]<0){break sa}if(y!=1){f=q+ +(j+1|0);d=0;while(1){a=d+1|0;i=+(a|0);b=M(d,24);e=b+G[323085]|0;e=he(q+i,f,e,e+8|0);G[(b+G[323085]|0)+16>>2]=e;e=b+G[323087]|0;e=he(y*.5+i,f,e,e+8|0);G[(b+G[323087]|0)+16>>2]=e;g=G[323481];b=(g|0)>(d|0);d=a;if(b){continue}break}break ta}f=+(j|0)+.5;a=G[323085];a=he(.5,f,a,a+8|0);n=G[323085];G[n+16>>2]=a;ka=1;d=1;g=G[323481];if((g|0)<=0){break ta}while(1){a=M(d,24);b=a+n|0;b=he(+(d|0)+.5,f,b,b+8|0);n=G[323085];e=a+n|0;G[e+16>>2]=b;a=(a+G[323087]|0)-24|0;L[a>>3]=L[e>>3];i=L[e+8>>3];G[a+16>>2]=b;L[a+8>>3]=i;g=G[323481];a=(g|0)>(d|0);d=d+1|0;if(a){continue}break}break ta}a=G[323085];G[323085]=G[323086];G[323086]=a;a=G[323087];G[323087]=G[323088];G[925218]=a;G[323088]=a;g=G[323481];ka=1}if((g|0)<0){break sa}if(y!=1){i=y*.5;f=i+ +(j+1|0);d=0;while(1){a=d+1|0;l=+(a|0);b=M(d,24);e=b+G[323086]|0;e=he(q+l,f,e,e+8|0);G[(b+G[323086]|0)+16>>2]=e;e=b+G[323088]|0;e=he(i+l,f,e,e+8|0);G[(b+G[323088]|0)+16>>2]=e;b=G[323481]>(d|0);d=a;if(b){continue}break}break sa}f=+(j|0)+1.5;a=G[323086];a=he(.5,f,a,a+8|0);n=G[323086];G[n+16>>2]=a;d=1;if(G[323481]<=0){break sa}while(1){a=M(d,24);b=a+n|0;b=he(+(d|0)+.5,f,b,b+8|0);n=G[323086];e=a+n|0;G[e+16>>2]=b;a=(a+G[323088]|0)-24|0;L[a>>3]=L[e>>3];i=L[e+8>>3];G[a+16>>2]=b;L[a+8>>3]=i;a=G[323481]>(d|0);d=d+1|0;if(a){continue}break}}if((m|0)>=(u|0)){break ma}while(1){a=m<<3;f=L[a+fa>>3];b=G[323093];if(b){k=L[a+ia>>3];k=z*(k>>0>2146435072|(a&2146435072)==2146435072){break ua}f=F*f;if(G[323091]>=3){va:{if(b){L[c+528>>3]=k;L[c+520>>3]=f;G[c+516>>2]=m;G[c+512>>2]=j;gb(91901,c+512|0);break va}L[c+504>>3]=f;G[c+500>>2]=m;G[c+496>>2]=j;gb(90181,c+496|0)}$a(r)}wa:{if(G[323488]){b=G[323088];a=M(m,24);d=b+a|0;L[c+1872>>3]=L[d>>3];L[c+2448>>3]=L[d+8>>3];o=G[323086];d=a+o|0;L[c+1880>>3]=L[d>>3];L[c+2456>>3]=L[d+8>>3];e=G[323085];a=a+e|0;L[c+1888>>3]=L[a>>3];L[c+2464>>3]=L[a+8>>3];g=G[323087];n=g;break wa}n=G[323087];a=M(m,24);b=n+a|0;L[c+1872>>3]=L[b>>3];L[c+2448>>3]=L[b+8>>3];e=G[323085];b=a+e|0;L[c+1880>>3]=L[b>>3];L[c+2456>>3]=L[b+8>>3];o=G[323086];a=a+o|0;L[c+1888>>3]=L[a>>3];L[c+2464>>3]=L[a+8>>3];g=G[323088];b=g}a=M(m,24);d=a+g|0;L[c+1896>>3]=L[d>>3];L[c+2472>>3]=L[d+8>>3];b=a+b|0;if(G[b+16>>2]){break ua}d=a+o|0;if(G[d+16>>2]){break ua}g=a+n|0;if(G[g+16>>2]){break ua}a=a+e|0;if(G[a+16>>2]){break ua}i=L[d+8>>3];l=L[g+8>>3];p=L[a+8>>3];s=p>-1e8?p:-1e8;s=l>s?l:s;la=i>s?i:s;s=L[b+8>>3];n=la>3];$=L[g>>3];aa=L[a>>3];T=aa>-1e8?aa:-1e8;T=T<$?$:T;ma=P>T?P:T;T=L[b>>3];aa=aa<1e8?aa:1e8;$=$T?T:P;d=G[323091];p=p<1e8?p:1e8;l=ls?s:i;i=S(p+-.5);xa:{if(O(i)<2147483648){e=~~i;break xa}e=-2147483648}b=T>ma;i=n?s:la;l=S(P+-.5);ya:{if(O(l)<2147483648){a=~~l;break ya}a=-2147483648}l=b?T:ma;s=S(i+-.5)+1;za:{if(O(s)<2147483648){b=~~s;break za}b=-2147483648}d=(d|0)<3;s=S(l+-.5)+1;Aa:{if(O(s)<2147483648){g=~~s;break Aa}g=-2147483648}if(!d){id();L[c+480>>3]=P;gb(73190,c+480|0);L[c+464>>3]=l;gb(73148,c+464|0);L[c+448>>3]=p;gb(73169,c+448|0);L[c+432>>3]=i;gb(73127,c+432|0);id();G[c+420>>2]=g;G[c+416>>2]=a;kb(73913,c+416|0);G[c+404>>2]=b;G[c+400>>2]=e;kb(73885,c+400|0);id()}if((b|0)<=(e|0)|(a|0)>=(g|0)){break ua}Ba:{if(!oa){if(!(k>0)){break Ba}while(1){d=e-I|0;if(!((d|0)<0|(d|0)>=(w|0))){d=d<<2;X=d+B|0;ea=d+C|0;i=+(e|0);l=i+.5;p=i+1.5;d=a;while(1){n=d-ba|0;Ca:{if((n|0)<0|(n|0)>=(x|0)){break Ca}h=+(d|0);h=gm(c+1872|0,c+2448|0,h+.5,h+1.5,l,p,L[462610]);Y=n<<3;n=Y+G[ea>>2]|0;s=L[n>>3];A(+s);o=v(1)|0;ha=v(0)|0;i=f*h*k;s=(o&2146435072)==2146435072?i:i+s;o=o&2147483647;L[n>>3]=(o|0)==2146435072&(ha|0)!=0|o>>>0>2146435072?i:s;o=Y+G[X>>2]|0;L[o>>3]=h*k+L[o>>3];if(G[323091]<3){break Ca}G[c+300>>2]=m;G[c+296>>2]=j;G[c+292>>2]=d;G[c+288>>2]=e;kb(66704,c+288|0);i=L[n>>3];L[c+272>>3]=L[o>>3];L[c+264>>3]=i;L[c+256>>3]=h;gb(87725,c+256|0);$a(r)}d=d+1|0;if((g|0)>(d|0)){continue}break}}e=e+1|0;if((b|0)!=(e|0)){continue}break}break ua}while(1){d=e-I|0;if(!((d|0)<0|(d|0)>=(w|0))){d=d<<2;X=d+B|0;ea=d+C|0;i=+(e|0);l=i+.5;p=i+1.5;d=a;while(1){n=d-ba|0;Da:{if((n|0)<0|(n|0)>=(x|0)){break Da}if(k>0){h=+(d|0);h=gm(c+1872|0,c+2448|0,h+.5,h+1.5,l,p,L[462610])}i=f*h*k;o=n<<2;n=o+G[ea>>2]|0;s=i+ +K[n>>2];Y=G[n>>2];K[n>>2]=(Y&2147483647)>>>0>2139095040?i:(Y&2139095040)==2139095040?i:s;o=o+G[X>>2]|0;K[o>>2]=h*k+ +K[o>>2];if(G[323091]<3){break Da}G[c+396>>2]=m;G[c+392>>2]=j;G[c+388>>2]=d;G[c+384>>2]=e;kb(66704,c+384|0);Z=K[n>>2];L[c+368>>3]=K[o>>2];L[c+352>>3]=h;L[c+360>>3]=Z;gb(87725,c+352|0);$a(r)}d=d+1|0;if((g|0)>(d|0)){continue}break}}e=e+1|0;if((b|0)!=(e|0)){continue}break}break ua}f=k*(f*h);while(1){d=e-I|0;if(!((d|0)<0|(d|0)>=(w|0))){d=d<<2;X=d+B|0;ea=d+C|0;d=a;while(1){n=d-ba|0;Ea:{if((n|0)<0|(n|0)>=(x|0)){break Ea}Y=n<<3;n=Y+G[ea>>2]|0;i=L[n>>3];A(+i);o=v(1)|0;ha=v(0)|0;i=(o&2146435072)==2146435072?f:f+i;o=o&2147483647;L[n>>3]=(o|0)==2146435072&(ha|0)!=0|o>>>0>2146435072?f:i;o=Y+G[X>>2]|0;L[o>>3]=h*k+L[o>>3];if(G[323091]<3){break Ea}G[c+348>>2]=m;G[c+344>>2]=j;G[c+340>>2]=d;G[c+336>>2]=e;kb(66704,c+336|0);i=L[n>>3];L[c+320>>3]=L[o>>3];L[c+312>>3]=i;L[c+304>>3]=h;gb(87725,c+304|0);$a(r)}d=d+1|0;if((g|0)>(d|0)){continue}break}}e=e+1|0;if((b|0)!=(e|0)){continue}break}}m=m+1|0;if((u|0)!=(m|0)){continue}break}break ma}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+544>>2]=a;G[c+548>>2]=b;_a(G[321435],80427,c+544|0);break a}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+560>>2]=a;G[c+564>>2]=b;_a(G[321435],80427,c+560|0);break a}j=j+1|0;if((j|0)<(G[323482]-t|0)){continue}break}}if(G[323091]>0){Wc(1292356);L[c+240>>3]=G[323089]-G[323090]|0;gb(91859,c+240|0);$a(r)}if(!Qb(G[323480],c+2392|0)){e=0;a=(w|0)>0&(x|0)>0;if((_|0)!=-64){z=0;g=99999;if(!a){break ga}n=0;k=0;y=0;F=0;o=0;t=0;b=99999;while(1){a=e<<2;m=G[a+C>>2];u=G[a+B>>2];pa=N(L[c+1856>>3]);d=0;while(1){j=d<<2;a=j+m|0;j=j+u|0;Z=K[j>>2];Fa:{if(!(Z>N(0))){K[a>>2]=pa;G[j>>2]=0;break Fa}Z=N(K[a>>2]/Z);K[a>>2]=Z;Ga:{if(n){h=+Z;U=+K[j>>2];break Ga}h=+Z;F=h;y=h;U=+K[j>>2];k=U;z=k}t=(e|0)>(t|0)?e:t;b=(b|0)>(e|0)?e:b;o=(d|0)>(o|0)?d:o;g=(d|0)<(g|0)?d:g;z=zU?U:k;y=h>y?h:y;F=h>2];d=0;while(1){m=d<<3;a=m+u|0;h=L[a>>3];Ha:{if(!(h>0)){L[m+G[j>>2]>>3]=L[c+1856>>3];G[a>>2]=0;G[a+4>>2]=0;break Ha}m=m+G[j>>2]|0;h=L[m>>3]/h;L[m>>3]=h;f=L[a>>3];z=n?z:f;z=f>z?f:z;k=n?k:f;k=fh?h:f;t=(e|0)>(t|0)?e:t;b=(b|0)>(e|0)?e:b;o=(d|0)>(o|0)?d:o;g=(d|0)<(g|0)?d:g;n=1}d=d+1|0;if((x|0)!=(d|0)){continue}break}e=e+1|0;if((w|0)!=(e|0)){continue}break}break fa}break ca}break da}hb(82189,40,1,G[321435]);break a}b=99999;t=0;o=0;F=0;y=0;k=0}j=t+I|0;a=b+I|0;d=o+ba|0;m=g+ba|0;if(G[323091]>0){L[c+224>>3]=F;gb(70479,c+224|0);L[c+208>>3]=y;gb(70429,c+208|0);L[c+192>>3]=k;gb(70495,c+192|0);L[c+176>>3]=z;gb(90164,c+176|0);G[c+160>>2]=m;kb(75656,c+160|0);G[c+144>>2]=d;kb(75626,c+144|0);G[c+128>>2]=a;kb(75641,c+128|0);G[c+112>>2]=j;kb(75611,c+112|0)}Ia:{Ja:{Ka:{La:{Ma:{Na:{if(!((b|0)>(t|0)|(g|0)>(o|0))){Ed(1293408);Ed(1293664);if(sd(1293968,1293408,c+2392|0)){break ca}if(G[47591]){if(sd(3700888,1293664,c+2392|0)){break ca}}if(pd(G[323492],D,2,1293972,c+2392|0)){break ca}if(G[323091]>0){yb(62207);$a(r)}Oa:{if(!G[47591]){break Oa}if(pd(G[925222],D,2,3700892,c+2392|0)){break ca}if(G[323091]<=0){break Oa}yb(62252);$a(r)}if(Xi(G[323492],da,c+2392|0)){break ca}if(G[323091]>0){yb(24964);$a(r)}Pa:{if(!G[47591]){break Pa}if(Xi(G[925222],da,c+2392|0)){break ca}if(G[323091]<=0){break Pa}yb(72935);$a(r)}b=D>>31;if(Gc(G[323492],32941,D,b,0,c+2392|0)){break ca}if(G[47591]){if(Gc(G[925222],32941,D,b,0,c+2392|0)){break ca}}if(Gc(G[323492],33788,2,0,0,c+2392|0)){break ca}d=(d-m|0)+1|0;b=d>>31;e=d;if(Gc(G[323492],41261,d,b,0,c+2392|0)){break ca}t=(j-a|0)+1|0;d=t>>31;if(Gc(G[323492],40853,t,d,0,c+2392|0)){break ca}h=+(m|0);if(Kd(G[323492],41201,L[462616]-h,-14,0,c+2392|0)){break ca}f=+(a|0);if(Kd(G[323492],40799,L[462617]-f,-14,0,c+2392|0)){break ca}if(Kd(G[323492],41229,L[462618]-h,-14,0,c+2392|0)){break ca}if(Kd(G[323492],40821,L[462619]-f,-14,0,c+2392|0)){break ca}Qa:{if(!G[47591]){break Qa}if(Gc(G[925222],33788,2,0,0,c+2392|0)){break ca}if(Gc(G[925222],41261,e,b,0,c+2392|0)){break ca}if(Gc(G[925222],40853,t,d,0,c+2392|0)){break ca}if(Kd(G[925222],41201,L[462616]-h,-14,0,c+2392|0)){break ca}if(Kd(G[925222],40799,L[462617]-f,-14,0,c+2392|0)){break ca}if(Kd(G[925222],41229,L[462618]-h,-14,0,c+2392|0)){break ca}if(Kd(G[925222],40821,L[462619]-f,-14,0,c+2392|0)){break ca}if(!G[323091]){break Qa}yb(29099);$a(r)}t=ga?82:42;G[c+2480>>2]=1;G[c+2484>>2]=1;j=(a|0)>(j|0)?a:j;Ra:{if((_|0)==-64){m=g<<3;d=a;while(1){if(ag(G[323492],t,c+2480|0,e,b,m+G[(d-I<<2)+C>>2]|0,c+2392|0)){break Na}G[c+2484>>2]=G[c+2484>>2]+1;u=(d|0)==(j|0);d=d+1|0;if(!u){continue}break}break Ra}d=a;while(1){if(ag(G[323492],t,c+2480|0,e,b,G[(d-I<<2)+C>>2]+(g<<2)|0,c+2392|0)){break Ma}G[c+2484>>2]=G[c+2484>>2]+1;m=(d|0)!=(j|0);d=d+1|0;if(m){continue}break}}if(G[323091]>0){yb(25009);$a(r)}Sa:{if(!G[47591]){break Sa}G[c+2480>>2]=1;G[c+2484>>2]=1;if((_|0)==-64){d=g<<3;while(1){if(ag(G[925222],t,c+2480|0,e,b,d+G[B+(a-I<<2)>>2]|0,c+2392|0)){break La}G[c+2484>>2]=G[c+2484>>2]+1;g=(a|0)==(j|0);a=a+1|0;if(!g){continue}break}break Sa}while(1){if(ag(G[925222],t,c+2480|0,e,b,G[B+(a-I<<2)>>2]+(g<<2)|0,c+2392|0)){break Ka}G[c+2484>>2]=G[c+2484>>2]+1;d=(a|0)!=(j|0);a=a+1|0;if(d){continue}break}}if(G[323091]>0){yb(72981);$a(r)}if(Qb(G[323492],c+2392|0)){break ca}if(G[323091]>0){yb(27772);$a(r)}Ta:{if(!G[47591]){break Ta}if(Qb(G[925222],c+2392|0)){break ca}if(G[323091]<=0){break Ta}yb(73519);$a(r)}d=0;if((w|0)<=0){break Ja}while(1){Wa(G[(d<<2)+C>>2]);d=d+1|0;if((w|0)!=(d|0)){continue}break}Wa(C);if((w|0)<=0){break Ia}d=0;while(1){Wa(G[B+(d<<2)>>2]);d=d+1|0;if((w|0)!=(d|0)){continue}break}break Ia}lj(43899);W()}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+80>>2]=a;G[c+84>>2]=b;_a(G[321435],80427,c+80|0);break a}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+96>>2]=a;G[c+100>>2]=b;_a(G[321435],80427,c+96|0);break a}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+48>>2]=a;G[c+52>>2]=b;_a(G[321435],80427,c+48|0);break a}a=G[c+2392>>2];b=c+2512|0;uc(a,b);G[c+64>>2]=a;G[c+68>>2]=b;_a(G[321435],80427,c- -64|0);break a}Wa(C)}Wa(B);a=G[323085];if(a){Wa(a)}a=G[323086];if(a){Wa(a)}a=G[323087];if(a){Wa(a)}a=G[323088];if(a){Wa(a)}if(fa){Wa(fa)}a=G[323483];if(a){Ce(a)}a=G[323495];if(a){Ce(a)}a=G[323084];if(a){Wa(a)}Wc(1292356);L[c+32>>3]=G[323089]-G[323090]|0;xb(G[321435],77637,c+32|0);$a(r);$a(G[321435]);Hb(G[321435]);sc(0);W()}hb(79462,75,1,G[321435]);break a}hb(79538,75,1,G[321435]);break a}a=Fa-48|0;Fa=a;b=G[c+2392>>2];d=a+16|0;uc(b,d);G[a>>2]=b;G[a+4>>2]=d;_a(G[321435],80427,a)}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Sq(a,b){a=a|0;b=b|0;var 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,A=0,B=0,C=0,D=0,F=0,I=0,J=0,K=0,N=0,P=0,Q=0,R=0,T=0,U=0,V=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;c=Fa-82640|0;Fa=c;G[c+1304>>2]=0;G[c+1308>>2]=2146959360;Wc(3705196);Y=1;G[926296]=1;n=G[29763];G[321435]=n;G[47589]=1;G[926300]=G[926299];E[c+1568|0]=0;G[926301]=0;G[47590]=0;d=1;a:{b:{c:{d:{e:{f:{g:{h:{i:{while(1){e=d;d=0;j:{k:{l:{m:{n:{i=of(a,b,38893);switch(i-97|0){case 4:continue;case 18:break j;case 13:break k;case 3:break l;case 15:break m;case 0:break n;case 1:case 2:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 14:case 16:case 17:break h;default:break i}}Y=1;d=e;e=Za(c+2080|0,G[321433]);if(!nb(e,16019,5)){continue}Y=2;if(!nb(e,16012,7)){continue}Y=4;if(!nb(e,4678,6)){continue}yb(32573);$a(n);break a}Za(c+1568|0,G[321433]);d=e;continue}fa=3705204,ga=nj(G[321433]),G[fa>>2]=ga;d=e;continue}G[926296]=0;d=e;continue}i=ac(G[321433],49010);G[321435]=i;d=e;if(i){continue}break}G[c+1296>>2]=G[321433];kb(80991,c+1296|0);break a}if((i|0)!=-1){break h}d=a;a=G[47589];if((d-a|0)>2){a=(a<<2)+b|0;g=Za(c+1312|0,G[a>>2]);t=Za(c+1824|0,G[a+4>>2]);Za(3705216,G[a+8>>2]);if(G[926301]>0){Wc(3705196);L[c+1280>>3]=G[926299]-G[926300]|0;gb(78117,c+1280|0);$a(n)}Lf(t,1,0);a=Va(3705216);o:{if(a>>>0<6){break o}a=a+3705211|0;if(fb(a,5646,5)){break o}E[a|0]=0}a=Va(3705216);p:{if(a>>>0<6){break p}a=a+3705211|0;if(fb(a,33598,5)){break p}E[a|0]=0}a=Va(3705216);q:{if(a>>>0<5){break q}a=a+3705212|0;if(fb(a,5001,4)){break q}E[a|0]=0}a=Va(3705216);r:{if(a>>>0<5){break r}a=a+3705212|0;if(fb(a,33380,4)){break r}E[a|0]=0}Za(3705472,3705216);a=Va(3705216);b=a+3705220|0;d=H[5650]|H[5651]<<8;E[b|0]=d;E[b+1|0]=d>>>8;a=a+3705216|0;b=H[5646]|H[5647]<<8|(H[5648]<<16|H[5649]<<24);E[a|0]=b;E[a+1|0]=b>>>8;E[a+2|0]=b>>>16;E[a+3|0]=b>>>24;d=Va(3705472);a=d+3705479|0;b=H[5648]|H[5649]<<8|(H[5650]<<16|H[5651]<<24);E[a|0]=b;E[a+1|0]=b>>>8;E[a+2|0]=b>>>16;E[a+3|0]=b>>>24;b=H[5645]|H[5646]<<8|(H[5647]<<16|H[5648]<<24);a=d+3705472|0;d=H[5641]|H[5642]<<8|(H[5643]<<16|H[5644]<<24);E[a|0]=d;E[a+1|0]=d>>>8;E[a+2|0]=d>>>16;E[a+3|0]=d>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;if(G[926301]>0){G[c+1264>>2]=g;kb(76753,c+1264|0);G[c+1248>>2]=3705216;kb(76728,c+1248|0);G[c+1232>>2]=3705472;kb(76298,c+1232|0);G[c+1216>>2]=t;kb(76496,c+1216|0);$a(n)}f=ac(t,13287);if(f){E[c+2384|0]=0;s:while(1){if(!vc(c+82384|0,256,f)){break g}a=(Va(c+82384|0)+c|0)+82383|0;if(H[a|0]==10){E[a|0]=0}a=(Va(c+82384|0)+c|0)+82383|0;if(H[a|0]==13){E[a|0]=0}if(G[926301]>=3){G[c+1200>>2]=c+82384;kb(76800,c+1200|0);$a(n)}a=Va(c+82384|0);if((a|0)<=79){cb(a+(c+82384|0)|0,32,80-a|0)}E[c+82464|0]=0;b=Va(c+2384|0);a=Va(c+82384|0);t:{if((a|0)>0){bb(b+(c+2384|0)|0,c+82384|0,a);if(a>>>0>79){break t}}cb(c+2384+(a+b)|0,32,80-a|0)}E[(b+c|0)+2464|0]=0;b=c+82384|0;i=a+b|0;while(1){d=b;a=H[d|0];if((a|0)==32){b=d+1|0;if(d>>>0>>0){continue}}break}B=d;while(1){b=a&255;if(!(!((b|0)==61|(b|0)==32)&i>>>0>B>>>0)){b=B;while(1){a=(a&255)-32|0;if(!(a>>>0>29|!(1<>>0>=i>>>0)){a=H[b+1|0];b=b+1|0;continue}break}E[B|0]=0;a=(H[b|0]==39)+b|0;while(1){u:{v:{switch(H[a|0]-32|0){case 0:case 7:break u;default:break v}}if(a>>>0>=i>>>0){break u}a=a+1|0;continue}break}E[a|0]=0;if(G[926301]>=2){G[c+1188>>2]=b;G[c+1184>>2]=d;kb(76184,c+1184|0);$a(n)}if(!Xa(d,41295)){Za(3705728,b)}if(!Xa(d,41261)){fa=3705988,ga=_b(b),G[fa>>2]=ga;fa=3706060,ga=_b(b),G[fa>>2]=ga}if(!Xa(d,40853)){fa=3705992,ga=_b(b),G[fa>>2]=ga;fa=3706064,ga=_b(b),G[fa>>2]=ga}if(!Xa(d,41201)){fa=3706e3,ha=sb(b),L[fa>>3]=ha;fa=3706072,ha=sb(b),L[fa>>3]=ha}if(!Xa(d,40799)){fa=3706008,ha=sb(b),L[fa>>3]=ha;fa=3706080,ha=sb(b),L[fa>>3]=ha}if(!Xa(d,41279)){fa=3706016,ha=sb(b),L[fa>>3]=ha;fa=3706088,ha=sb(b),L[fa>>3]=ha}if(!Xa(d,40866)){fa=3706024,ha=sb(b),L[fa>>3]=ha;fa=3706096,ha=sb(b),L[fa>>3]=ha}o=o+1|0;if((o|0)!=1e3){continue s}break g}a=H[B+1|0];B=B+1|0;continue}}}G[c+32>>2]=44379;_a(G[321435],80471,c+32|0);break f}G[c+16>>2]=G[b>>2];kb(79810,c+16|0);break a}G[c>>2]=G[b>>2];kb(79810,c);break a}Hb(f);a=rd(c+2384|0);G[926528]=a;w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{if(a){ca=Xa(Va(3705728)+3705725|0,34150);if((Rh(g)|0)<=0){break I}P=Pb(10369);K=Pb(21447);Q=Pb(41041);T=Pb(40643);U=Pb(41002);q=Pb(40604);D=Pb(41034);r=Pb(40636);A=Pb(40995);N=Pb(40585);y=Pb(41022);b=Pb(40624);a=Va(c+1568|0);d=G[(G[925773]+M(K,4108)|0)+4104>>2];if((K|0)<0){K=Pb(22604)}if((y|0)<0){y=Pb(6868)}if((b|0)<0){b=Pb(16725)}if((P|K|(U|q))<0){break H}if((A|N|(y|b))<0){break H}if((D|r|(Q|T))<0){break H}x=(a+d|0)+16|0;a=0;p=G[47592];d=p<<2;_=ab(d);F=ab(d);B=ab(d);o=ab(d);f=ab(d);i=p<<3;l=ab(i);k=ab(i);g=ab(i);j=ab(i);s=ab(i);m=ab(i);Z=ab(d);X=ab(d);if((p|0)>0){while(1){d=a<<2;fa=d+F|0,ga=ab(x),G[fa>>2]=ga;fa=d+B|0,ga=ab(x),G[fa>>2]=ga;fa=d+o|0,ga=ab(32),G[fa>>2]=ga;fa=d+f|0,ga=ab(32),G[fa>>2]=ga;a=a+1|0;if((p|0)!=(a|0)){continue}break}}i=0;if(G[926301]>0){Wc(3705196);L[c+1168>>3]=G[926299]-G[926300]|0;gb(77881,c+1168|0);$a(n)}a=nf();G[926297]=a;if((a|0)>=0){da=c+2379|0;v=1;a=0;while(1){i=a<<2;fa=i+_|0,ga=_b((P|0)>2]:0),G[fa>>2]=ga;d=a<<3;$=d+l|0;fa=$,ha=sb((U|0)>2]:0),L[fa>>3]=ha;fa=d+k|0,ha=sb((q|0)>2]:0),L[fa>>3]=ha;fa=d+g|0,ha=sb((D|0)>2]:0),L[fa>>3]=ha;fa=d+j|0,ha=sb((r|0)>2]:0),L[fa>>3]=ha;p=d+s|0;fa=p,ha=sb((A|0)>2]:0),L[fa>>3]=ha;d=d+m|0;fa=d,ha=sb((N|0)>2]:0),L[fa>>3]=ha;aa=i+Z|0;fa=aa,ga=_b(G[925783]>(y|0)?G[(G[925773]+M(y,4108)|0)+4096>>2]:0),G[fa>>2]=ga;ba=i+X|0;fa=ba,ga=_b(G[925783]>(b|0)?G[(G[925773]+M(b,4108)|0)+4096>>2]:0),G[fa>>2]=ga;Za(G[i+o>>2],(Q|0)>2]:0);Za(G[f+i>>2],(T|0)>2]:0);J:{if(ca){break J}u=L[p>>3];z=L[463250];w=O(u-z);V=+G[926497];K:{if(!(w>V)){h=u;break K}ea=360/O(L[$>>3]);while(1){h=u-ea;if(O(h-z)>w){w=O(u-z);h=u;break K}L[p>>3]=h;u=h;z=L[463250];w=O(h-z);if(VV)){break J}u=360/O(L[$>>3]);while(1){h=h+u;if(O(h-z)>w){break J}L[p>>3]=h;z=L[463250];w=O(h-z);if(V>3];L:{if(v){I=L[d>>3];J=I-+G[ba>>2]+1;R=h-+G[aa>>2]+1;C=h;break L}u=h-+G[aa>>2]+1;R=uC?h:C;h=L[d>>3];I=h>I?h:I;h=h-+G[ba>>2]+1;if(!(h(K|0)?G[(G[925773]+M(K,4108)|0)+4096>>2]:0;if(H[d|0]!=47){v=c+1568|0;if(Va(d)>>>0>=2){d=(!fb(d,42201,2)<<1)+d|0}Za(3703136,v);v=Va(3703136);if(!((v|0)<=0|H[v+3703135|0]==47)){v=Va(3703136)+3703136|0;E[v|0]=47;E[v+1|0]=0}Gb(3703136,d);d=3703136}p=Za(p,d);M:{if(!G[926296]){break M}d=Va(p);if(d>>>0<6){break M}if(fb(d+da|0,5646,5)){break M}E[(d+p|0)-5|0]=0}d=i+F|0;Za(G[d>>2],p);if(G[926296]){d=G[d>>2];d=Va(d)+d|0;v=H[5646]|H[5647]<<8|(H[5648]<<16|H[5649]<<24);E[d|0]=v;E[d+1|0]=v>>>8;E[d+2|0]=v>>>16;E[d+3|0]=v>>>24;v=H[5650]|H[5651]<<8;E[d+4|0]=v;E[d+5|0]=v>>>8;d=i+B|0;Za(G[d>>2],p);d=G[d>>2];d=Va(d)+d|0;i=H[5645]|H[5646]<<8|(H[5647]<<16|H[5648]<<24);p=H[5641]|H[5642]<<8|(H[5643]<<16|H[5644]<<24);E[d|0]=p;E[d+1|0]=p>>>8;E[d+2|0]=p>>>16;E[d+3|0]=p>>>24;E[d+4|0]=i;E[d+5|0]=i>>>8;E[d+6|0]=i>>>16;E[d+7|0]=i>>>24;i=H[5648]|H[5649]<<8|(H[5650]<<16|H[5651]<<24);E[d+7|0]=i;E[d+8|0]=i>>>8;E[d+9|0]=i>>>16;E[d+10|0]=i>>>24}N:{i=a+1|0;if((i|0)!=G[47592]){break N}p=a+51|0;G[47592]=p;a=p<<2;_=ub(_,a);F=ub(F,a);B=ub(B,a);o=ub(o,a);f=ub(f,a);d=p<<3;g=ub(g,d);j=ub(j,d);s=ub(s,d);m=ub(m,d);Z=ub(Z,a);X=ub(X,a);l=ub(l,d);k=ub(k,d);a=i;while(1){O:{d=a<<2;fa=d+F|0,ga=ab(x),G[fa>>2]=ga;v=ab(x);G[d+B>>2]=v;fa=d+o|0,ga=ab(32),G[fa>>2]=ga;fa=d+f|0,ga=ab(32),G[fa>>2]=ga;if(!v){break O}a=a+1|0;if((p|0)!=(a|0)){continue}break N}break}G[c+1152>>2]=62744;_a(G[321435],83707,c+1152|0);break e}v=0;d=nf();G[926297]=d;a=i;if((d|0)>=0){continue}break}}Qh();d=0;a=G[926301];if((a|0)>=3){G[c+1136>>2]=i;kb(90312,c+1136|0);if(i){while(1){b=d<<2;a=G[b+F>>2];P:{if(G[926296]){G[c+1124>>2]=G[b+B>>2];G[c+1120>>2]=a;kb(76122,c+1120|0);break P}G[c+1104>>2]=a;kb(77142,c+1104|0)}d=d+1|0;if((i|0)!=(d|0)){continue}break}}id();$a(n);a=G[926301]}if((a|0)>0){Wc(3705196);L[c+1088>>3]=G[926299]-G[926300]|0;gb(78164,c+1088|0);$a(n)}Q:{if(!Sb(G[o>>2],34149)){break Q}b=0;G[926298]=1;if(!i){break Q}while(1){a=b<<3;d=a+g|0;h=(L[463252]-L[d>>3])/L[a+l>>3];if(O(S(h+.5)-h)>.1){break G}f=a+s|0;L[f>>3]=h+L[f>>3];f=a+j|0;h=(L[463253]-L[f>>3])/L[a+k>>3];if(O(S(h+.5)-h)>.1){break F}a=a+m|0;L[a>>3]=h+L[a>>3];L[d>>3]=L[463252];L[f>>3]=L[463253];b=b+1|0;if((i|0)!=(b|0)){continue}break}}a=M(G[47592],20);b=ab(a);G[926508]=b;if(!b){break E}if(G[926296]){a=ab(a);G[926509]=a;if(!a){break D}}if(G[926301]>0){Wc(3705196);L[c+1008>>3]=G[926299]-G[926300]|0;gb(77772,c+1008|0);$a(n)}R:{if(!e){break R}h=C-R+1;if(h<+G[926497]){L[463250]=C;if(O(h)<2147483648){a=~~h}else{a=-2147483648}G[926497]=a}h=I-J+1;if(!(h<+G[926498])){break R}L[463251]=I;if(O(h)<2147483648){a=~~h}else{a=-2147483648}G[926498]=a}e=G[926301];if((e|0)>0){G[c+992>>2]=G[926497];kb(73395,c+992|0);G[c+976>>2]=G[926498];kb(73355,c+976|0);L[c+960>>3]=L[463250];gb(71170,c+960|0);L[c+944>>3]=L[463251];gb(71147,c+944|0);$a(n);e=G[926301]}b=G[926497];h=O(C-R);S:{if(O(h)<2147483648){a=~~h;break S}a=-2147483648}a=(a|0)<(b|0)?b:a;if((e|0)>0){G[c+928>>2]=a;kb(75346,c+928|0);$a(n)}a=a<<3;P=ab(a);x=ab(a);if(!P){break C}if(!x){break B}T:{if(G[926301]<=0){break T}Wc(3705196);L[c+912>>3]=G[926299]-G[926300]|0;gb(77668,c+912|0);$a(n);if(G[926301]<2){break T}yb(33824);yb(5006);yb(48714);$a(n)}w=0;U:{if(!i){break U}z=L[g>>3];if(z!=z){break A}h=L[j>>3];if(h!=h){break A}C=L[l>>3];if(C!=C){break A}J=L[k>>3];if(J!=J){break A}b=G[926508];u=L[463251]-L[m>>3]+1;V:{if(O(u)<2147483648){a=~~u;break V}a=-2147483648}G[b+8>>2]=a;d=(a+G[X>>2]|0)-1|0;e=G[926498];e=(d|0)<(e|0)?d:e;G[b+16>>2]=e;u=L[463250];w=L[s>>3];W:{if(!(u>w)){u=-S(w-u+.5);break W}u=S(u-w+.5)}X:{if(O(u)<2147483648){d=~~u;break X}d=-2147483648}G[b+12>>2]=d;if(G[926301]>=2){G[c+908>>2]=d;G[c+904>>2]=e;G[c+900>>2]=a;G[c+896>>2]=0;kb(73825,c+896|0);$a(n);b=G[926508]}G[b>>2]=0;if(G[926296]){G[G[926509]>>2]=0}w=C*J+0;e=1;if((i|0)==1){break U}u=h;while(1){f=e<<3;if(z!=L[f+g>>3]|u!=L[f+j>>3]){break A}R=L[f+l>>3];if(R!=C){break A}V=L[f+k>>3];if(V!=J){break A}o=M(e,20);a=o+b|0;h=L[463251]-L[f+m>>3]+1;Y:{if(O(h)<2147483648){b=~~h;break Y}b=-2147483648}G[a+8>>2]=b;d=(b+G[(e<<2)+X>>2]|0)-1|0;y=G[926498];y=(d|0)<(y|0)?d:y;G[a+16>>2]=y;d=a;h=L[463250];I=L[f+s>>3];Z:{if(h>I){h=S(h-I+.5);break Z}h=-S(I-h+.5)}_:{if(O(h)<2147483648){a=~~h;break _}a=-2147483648}G[d+12>>2]=a;if(G[926301]>=2){G[c+892>>2]=a;G[c+888>>2]=y;G[c+884>>2]=b;G[c+880>>2]=e;kb(73825,c+880|0);$a(n)}b=G[926508];G[o+b>>2]=0;if(G[926296]){G[o+G[926509]>>2]=0}w=R*V+w;e=e+1|0;if((i|0)!=(e|0)){continue}break}}b=G[47592]<<2;a=ab(b);G[926510]=a;e=ab(b);G[926511]=e;f=ab(b);G[926512]=f;b=ab(b);G[926513]=b;if(!b){break z}$:{if(!i){break $}d=0;j=G[926508];if((i|0)!=1){k=i&-2;g=0;while(1){o=d<<2;s=j+M(d,20)|0;G[o+a>>2]=G[s+8>>2];G[e+o>>2]=d;G[f+o>>2]=G[s+16>>2];G[b+o>>2]=d;o=d|1;s=o<<2;l=j+M(o,20)|0;G[s+a>>2]=G[l+8>>2];G[e+s>>2]=o;G[f+s>>2]=G[l+16>>2];G[b+s>>2]=o;d=d+2|0;g=g+2|0;if((k|0)!=(g|0)){continue}break}}if(i&1){g=d<<2;j=j+M(d,20)|0;G[g+a>>2]=G[j+8>>2];G[e+g>>2]=d;G[f+g>>2]=G[j+16>>2];G[b+g>>2]=d}if((i|0)<2){break $}g=i;k=g-2|0;j=k;while(1){g=g-1|0;b=G[926511];d=0;while(1){e=d<<2;f=e+a|0;o=G[f>>2];d=d+1|0;s=d<<2;l=s+a|0;m=G[l>>2];if((o|0)>(m|0)){G[f>>2]=m;G[l>>2]=o;e=b+e|0;f=G[e>>2];q=e;e=b+s|0;G[q>>2]=G[e>>2];G[e>>2]=f}if((d|0)!=(g|0)){continue}break}b=(j|0)>0;j=j-1|0;if(b){continue}break}if((i|0)<2){break $}a=G[926512];g=i;while(1){g=g-1|0;b=G[926513];d=0;while(1){e=d<<2;f=e+a|0;j=G[f>>2];d=d+1|0;o=d<<2;s=o+a|0;l=G[s>>2];if((j|0)>(l|0)){G[f>>2]=l;G[s>>2]=j;e=b+e|0;f=G[e>>2];j=e;e=b+o|0;G[j>>2]=G[e>>2];G[e>>2]=f}if((d|0)!=(g|0)){continue}break}b=(k|0)>0;k=k-1|0;if(b){continue}break}}d=0;a=G[926301];if((a|0)>=2){yb(38904);yb(66443);yb(48721);aa:{if(i){while(1){a=d<<2;b=G[a+G[926511]>>2];a=G[a+G[926510]>>2];G[c+848>>2]=d;G[c+852>>2]=a;G[c+856>>2]=b;kb(73842,c+848|0);d=d+1|0;if((i|0)!=(d|0)){continue}break}$a(n);yb(38918);yb(66462);yb(48721);if(!i){break aa}d=0;while(1){a=d<<2;b=G[a+G[926513]>>2];a=G[a+G[926512]>>2];G[c+832>>2]=d;G[c+836>>2]=a;G[c+840>>2]=b;kb(73842,c+832|0);d=d+1|0;if((i|0)!=(d|0)){continue}break}break aa}$a(n);yb(38918);yb(66462);yb(48721)}$a(n);a=G[926301]}if((a|0)>0){Wc(3705196);L[c+816>>3]=G[926299]-G[926300]|0;gb(77941,c+816|0);$a(n)}d=0;ba:{ca:{a=G[926497];b=a<<2;p=ab(b);if(p){if((a|0)<=0){break ba}break ca}Ae(6001);W()}da:{while(1){ea:{e=ab(400);G[p+(d<<2)>>2]=e;if(!e){break ea}d=d+1|0;if((a|0)!=(d|0)){continue}break da}break}G[c+64>>2]=21285;_a(G[321435],83707,c- -64|0);break e}o=ab(b);if(o){break x}break y}o=ab(b);if(!o){break y}break w}hb(83821,57,1,G[321435]);break a}G[c+48>>2]=g;_a(G[321435],81102,c+48|0);break a}hb(79662,147,1,G[321435]);break a}G[c+1048>>2]=G[(b<<2)+F>>2];L[c+1040>>3]=h;a=c+82384|0;Eb(a,9179,c+1040|0);G[c+1024>>2]=a;_a(G[321435],80471,c+1024|0);break f}G[c+1080>>2]=G[(b<<2)+F>>2];L[c+1072>>3]=h;a=c+82384|0;Eb(a,9234,c+1072|0);G[c+1056>>2]=a;_a(G[321435],80471,c+1056|0);break f}Ae(5719);W()}Ae(5714);W()}Ae(11466);W()}Ae(11618);W()}G[c+864>>2]=25461;_a(G[321435],80471,c+864|0);break f}Ae(13558);W()}Ae(6020);W()}d=0;if((a|0)<=0){break w}while(1){fa:{e=ab(400);G[(d<<2)+o>>2]=e;if(!e){break fa}d=d+1|0;if((a|0)!=(d|0)){continue}break w}break}G[c+80>>2]=21302;_a(G[321435],83707,c+80|0);break e}ga:{Q=ab(b);if(Q){if(G[926301]>0){Wc(3705196);L[c+800>>3]=G[926299]-G[926300]|0;gb(77828,c+800|0);$a(n);a=G[926497]}a=a<<3;T=ab(a);U=ab(a);if(T){if(U){if(G[926301]>0){Wc(3705196);L[c+784>>3]=G[926299]-G[926300]|0;gb(77717,c+784|0);$a(n)}Ed(3705216);Ed(3705472);if(!sd(3705984,3705216,3705188)){if(!sd(3706056,3705472,3705188)){G[926526]=2;a=G[926498];G[926498]=1;if(!pd(G[926496],-64,2,3705988,3705188)){if(G[926301]>0){yb(62208);$a(n)}if(!pd(G[926514],-64,2,3706060,3705188)){ha:{if(G[926301]<=0){G[926498]=a;break ha}yb(62252);$a(n);G[926498]=a;if(G[926301]<=0){break ha}Wc(3705196);L[c+768>>3]=G[926299]-G[926300]|0;gb(78035,c+768|0);$a(n)}if(!Xi(G[926496],t,3705188)){if(G[926301]>0){yb(24964);$a(n)}if(!Xi(G[926514],t,3705188)){if(G[926301]>0){yb(25041);$a(n)}if(!Gc(G[926496],32941,-64,-1,0,3705188)){if(!Gc(G[926514],32941,-64,-1,0,3705188)){if(!Gc(G[926496],33788,2,0,0,3705188)){a=G[926497];if(!Gc(G[926496],41261,a,a>>31,0,3705188)){a=G[926498];if(!Gc(G[926496],40853,a,a>>31,0,3705188)){if(!Gc(G[926514],33788,2,0,0,3705188)){a=G[926497];if(!Gc(G[926514],41261,a,a>>31,0,3705188)){a=G[926498];if(!Gc(G[926514],40853,a,a>>31,0,3705188)){if(!Kd(G[926496],41201,L[463250],-14,0,3705188)){if(!Kd(G[926496],40799,L[463251],-14,0,3705188)){if(!Kd(G[926514],41201,L[463250],-14,0,3705188)){if(!Kd(G[926514],40799,L[463251],-14,0,3705188)){if(G[926301]>0){Wc(3705196);L[c+752>>3]=G[926299]-G[926300]|0;gb(78075,c+752|0);$a(n)}a=0;d=Fa-16|0;Fa=d;G[926532]=500;e=ab(2e3);G[926533]=e;ia:{ja:{while(1){b=ab(16);G[e+(a<<2)>>2]=b;if(!b){break ja}G[b+8>>2]=-1;G[b+12>>2]=-1;G[b>>2]=-1;G[b+4>>2]=0;a=a+1|0;if((a|0)!=500){continue}break}G[926535]=0;G[926534]=0;Fa=d+16|0;break ia}G[d>>2]=5694;_a(G[321435],83707,d);break b}ka:{la:{ma:{na:{oa:{pa:{qa:{ra:{if(G[926498]<=0){break ra}u=O(w)*.017453292519943295*.017453292519943295/+(i|0);s=1;y=50;b=0;d=0;K=0;while(1){a=G[926301];if((a|0)>=2){G[c+736>>2]=s;kb(75146,c+736|0);$a(n);a=G[926301]}if((a|0)==1){G[c+720>>2]=s;kb(30435,c+720|0);$a(n)}a=G[926497];if((a|0)>0){cb(Q,0,a<<2)}sa:{if((b|0)>=(i|0)){break sa}while(1){a=b<<2;if(G[a+G[926510]>>2]>(s|0)){break sa}m=G[a+G[926511]>>2];e=0;a=0;l=Fa-16|0;Fa=l;ta:{ua:{va:{wa:{xa:{ya:{k=G[926535];if(k){j=G[926533];g=G[926534];if((k|0)<=0){break wa}f=k&3;if(k-1>>>0>=3){break ya}break xa}a=1;f=G[G[926533]>>2];G[f+4>>2]=1;G[f>>2]=m;break va}t=k&-4;while(1){a=G[G[j+(G[G[j+(G[G[j+(g<<2)>>2]+8>>2]<<2)>>2]+8>>2]<<2)>>2]+8>>2];g=G[G[j+(a<<2)>>2]+8>>2];e=e+4|0;if((t|0)!=(e|0)){continue}break}}if(!f){break wa}e=0;while(1){a=g;g=G[G[j+(a<<2)>>2]+8>>2];e=e+1|0;if((f|0)!=(e|0)){continue}break}}f=G[j+(g<<2)>>2];G[f+12>>2]=a;G[f+4>>2]=1;G[f>>2]=m;a=0;za:{Aa:{e=G[926532];if((e|0)<=0){break Aa}while(1){if(!G[G[j+(a<<2)>>2]+4>>2]){break Aa}a=a+1|0;if((e|0)!=(a|0)){continue}break}a=e;break za}if((a|0)!=(e|0)){break va}}j=ub(j,(e<<2)+2e3|0);G[926533]=j;m=e+500|0;while(1){f=ab(16);G[j+(e<<2)>>2]=f;if(!f){break ua}G[f+8>>2]=-1;G[f+12>>2]=-1;G[f>>2]=-1;G[f+4>>2]=0;e=e+1|0;if((m|0)>(e|0)){continue}break}G[926532]=m;f=G[j+(g<<2)>>2]}G[f+8>>2]=a;G[926535]=k+1;Fa=l+16|0;break ta}G[l>>2]=50554;_a(G[321435],83707,l);break b}b=b+1|0;if((i|0)!=(b|0)){continue}break}b=i}Ba:{if((d|0)>=(i|0)){break Ba}while(1){a=d<<2;if(G[a+G[926512]>>2]>=(s|0)){break Ba}m=G[a+G[926513]>>2];a=G[926533];k=G[926534];e=k;while(1){Ca:{g=G[a+(e<<2)>>2];if(!G[g+4>>2]){break Ca}if((m|0)==G[g>>2]){G[926535]=G[926535]-1;j=G[g+12>>2];f=G[g+8>>2];Da:{if((e|0)!=(k|0)){break Da}G[926534]=f;if(G[G[a+(f<<2)>>2]+4>>2]){break Da}e=G[926532];Ea:{if((e|0)<=0){break Ea}l=0;f=0;if(e-1>>>0>=3){t=e&-4;j=0;while(1){g=f<<2;k=G[g+a>>2];G[k+8>>2]=-1;G[k+12>>2]=-1;G[k>>2]=-1;G[k+4>>2]=0;k=G[a+(g|4)>>2];G[k+8>>2]=-1;G[k+12>>2]=-1;G[k>>2]=-1;G[k+4>>2]=0;k=G[a+(g|8)>>2];G[k+8>>2]=-1;G[k+12>>2]=-1;G[k>>2]=-1;G[k+4>>2]=0;g=G[a+(g|12)>>2];G[g+8>>2]=-1;G[g+12>>2]=-1;G[g>>2]=-1;G[g+4>>2]=0;f=f+4|0;j=j+4|0;if((t|0)!=(j|0)){continue}break}}g=e&3;if(!g){break Ea}while(1){e=G[a+(f<<2)>>2];G[e+8>>2]=-1;G[e+12>>2]=-1;G[e>>2]=-1;G[e+4>>2]=0;f=f+1|0;l=l+1|0;if((g|0)!=(l|0)){continue}break}}G[926535]=0;G[926534]=0;break Ca}G[g+8>>2]=-1;G[g+12>>2]=-1;G[g>>2]=-1;G[g+4>>2]=0;if((j|0)==-1){G[G[a+(f<<2)>>2]+12>>2]=-1;break Ca}if((f|0)==-1){G[G[a+(j<<2)>>2]+8>>2]=-1;break Ca}G[G[a+(f<<2)>>2]+12>>2]=j;G[G[a+(j<<2)>>2]+8>>2]=f;break Ca}e=G[g+8>>2];if((e|0)!=-1){continue}}break}a=M(m,20);e=a+G[926508]|0;if(G[e>>2]){if(Qb(G[e+4>>2],3705188)){break ka}G[a+G[926508]>>2]=0;G[926526]=G[926526]-1}Fa:{if(!G[926296]){break Fa}e=a+G[926509]|0;if(!G[e>>2]){break Fa}if(Qb(G[e+4>>2],3705188)){break la}G[a+G[926509]>>2]=0;G[926526]=G[926526]-1}d=d+1|0;if((i|0)!=(d|0)){continue}break}d=i}t=G[926535];if(G[926301]>=2){G[c+672>>2]=t;kb(90331,c+672|0);yb(68050);yb(48669);$a(n)}if((t|0)>0){D=s+1|0;k=0;while(1){g=G[926533];e=G[926534];f=0;while(1){Ga:{e=G[g+(e<<2)>>2];if(!G[e+4>>2]){a=-1;break Ga}if((f|0)==(k|0)){a=G[e>>2];break Ga}f=f+1|0;a=-1;e=G[e+8>>2];if((e|0)!=-1){continue}}break}if(G[926301]>=2){e=G[G[926508]+M(a,20)>>2];G[c+656>>2]=G[(a<<2)+F>>2];G[c+640>>2]=a;G[c+644>>2]=e;G[c+648>>2]=G[926526];G[c+652>>2]=200;kb(69231,c+640|0);$a(n)}Ha:{Ia:{Ja:{Ka:{La:{Ma:{Na:{Oa:{Pa:{Qa:{Ra:{Sa:{Ta:{f=G[926508];m=M(a,20);e=f+m|0;if(!G[e>>2]){g=G[926526];G[926526]=g+1;if((g|0)>=200){break ga}g=a<<2;f=g+F|0;if(Rc(e+4|0,G[f>>2],0,3705188)){break Ta}if(G[926301]>=2){G[c+592>>2]=a;kb(73953,c+592|0);$a(n)}e=G[926508];G[e+m>>2]=1;if(G[926296]){e=G[926526];G[926526]=e+1;if((e|0)>=200){break ga}e=g+B|0;if(Rc((m+G[926509]|0)+4|0,G[e>>2],0,3705188)){break Sa}G[m+G[926509]>>2]=1;e=G[926508]}if(Yj(G[(e+m|0)+4>>2],c+2380|0,3705188)){break Ra}if(G[926301]>=3){G[c+528>>2]=G[c+2380>>2];kb(69940,c+528|0);$a(n)}e=rd(G[c+2380>>2]);G[926527]=e;if(!e){break Qa}g=G[926528];if(Xa(e+3512|0,g+3512|0)){break Pa}if(Xa(e+3528|0,g+3528|0)){break Oa}if(!G[926298]){if(O(L[e>>3]-L[g>>3])>1e-8){break Na}if(O(L[e+8>>3]-L[g+8>>3])>1e-8){break Ma}}if(O(L[e+56>>3]-L[g+56>>3])>1e-8|O(L[e- -64>>3]-L[g- -64>>3])>1e-8|(O(L[e+72>>3]-L[g+72>>3])>1e-8|O(L[e+80>>3]-L[g+80>>3])>1e-8)){break La}if(L[e+120>>3]!=L[g+120>>3]){break Ka}f=G[926508]}G[c+2352>>2]=1;e=G[(f+m|0)+8>>2];G[c+2360>>2]=1;G[c+2364>>2]=1;f=D-e|0;G[c+2356>>2]=f;e=a<<2;j=G[e+Z>>2];if(G[926301]>=3){G[c+448>>2]=a;kb(86350,c+448|0);G[c+432>>2]=G[c+2356>>2];kb(73378,c+432|0);G[c+416>>2]=j;kb(73338,c+416|0);$a(n);f=G[c+2356>>2]}if(!(G[e+X>>2]<(f|0)|(f|0)<=0)){G[926297]=0;e=j>>31;if(cg(G[(m+G[926508]|0)+4>>2],82,c+2352|0,j,e,c+1304|0,P,c+2348|0,3705188)){break Ja}if(!G[926296]){if((j|0)<=0){break Ha}g=0;e=0;if(j-1>>>0>=7){q=j&-8;l=0;while(1){f=e<<3;r=f+x|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|8)|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|16)|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|24)|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|32)|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|40)|0;G[r>>2]=0;G[r+4>>2]=1072693248;r=x+(f|48)|0;G[r>>2]=0;G[r+4>>2]=1072693248;f=x+(f|56)|0;G[f>>2]=0;G[f+4>>2]=1072693248;e=e+8|0;l=l+8|0;if((q|0)!=(l|0)){continue}break}}f=j&7;if(!f){break Ia}while(1){l=x+(e<<3)|0;G[l>>2]=0;G[l+4>>2]=1072693248;e=e+1|0;g=g+1|0;if((f|0)!=(g|0)){continue}break}break Ia}if(!cg(G[(m+G[926509]|0)+4>>2],82,c+2352|0,j,e,c+1304|0,x,c+2348|0,3705188)){break Ia}a=G[926297];b=c+82384|0;uc(a,b);G[c+384>>2]=a;G[c+388>>2]=b;kb(80427,c+384|0);break d}if(G[926301]<3){break Ha}yb(8367);$a(n);break Ha}G[c+624>>2]=G[f>>2];a=c+82384|0;db(a,33643,c+624|0);G[c+608>>2]=a;_a(G[321435],80471,c+608|0);break f}G[c+576>>2]=G[e>>2];a=c+82384|0;db(a,33681,c+576|0);G[c+560>>2]=a;_a(G[321435],80471,c+560|0);break f}a=G[926297];b=c+82384|0;uc(a,b);G[c+544>>2]=a;G[c+548>>2]=b;kb(80427,c+544|0);break d}hb(84433,53,1,G[321435]);break a}G[c+512>>2]=G[f>>2];a=c+82384|0;db(a,20661,c+512|0);G[c+496>>2]=a;_a(G[321435],80471,c+496|0);break f}G[c+480>>2]=G[f>>2];a=c+82384|0;db(a,20567,c+480|0);G[c+464>>2]=a;_a(G[321435],80471,c+464|0);break f}G[c+144>>2]=G[f>>2];a=c+82384|0;db(a,20614,c+144|0);G[c+128>>2]=a;_a(G[321435],80471,c+128|0);break f}G[c+176>>2]=G[f>>2];a=c+82384|0;db(a,20520,c+176|0);G[c+160>>2]=a;_a(G[321435],80471,c+160|0);break f}G[c+208>>2]=G[f>>2];a=c+82384|0;db(a,20471,c+208|0);G[c+192>>2]=a;_a(G[321435],80471,c+192|0);break f}G[c+240>>2]=G[f>>2];a=c+82384|0;db(a,20423,c+240|0);G[c+224>>2]=a;_a(G[321435],80471,c+224|0);break f}a=G[926297];b=c+82384|0;uc(a,b);G[c+400>>2]=a;G[c+404>>2]=b;kb(80427,c+400|0);break d}f=0;if((j|0)<=0){break Ha}while(1){g=f<<3;l=g+P|0;e=G[l+4>>2];l=G[l>>2];q=e&2147483647;Ua:{if((q|0)==2146435072&(l|0)!=0|q>>>0>2146435072|(e&2146435072)==2146435072|L[g+x>>3]<=0){break Ua}g=G[(m+G[926508]|0)+12>>2]+f|0;if((g|0)<0){break Ua}e=G[926497];if((e|0)<=(g|0)){break Ua}g=g<<2;r=g+Q|0;l=G[r>>2];Va:{if((l|0)<(y|0)){break Va}y=y+50|0;if(G[926301]>0){G[c+368>>2]=y;kb(75296,c+368|0);$a(n);e=G[926497]}Wa:{if((e|0)<=0){f=0;break Wa}e=y<<3;f=0;while(1){A=f<<2;N=A+p|0;q=ub(G[N>>2],e);G[N>>2]=q;if(!q){break ma}A=o+A|0;q=ub(G[A>>2],e);G[A>>2]=q;if(!q){break na}f=f+1|0;if((f|0)>2]>>3]=L[q+P>>3];L[e+G[g+o>>2]>>3]=L[q+x>>3];G[r>>2]=l+1}f=f+1|0;if((j|0)>(f|0)){continue}break}}f=G[926526];Xa:{Ya:{if(!((f|0)<200|K)){K=1;if(G[926301]<=0){break Ya}yb(85320);$a(n);f=G[926526]}if((f|0)<200){break Xa}}if(Qb(G[(m+G[926508]|0)+4>>2],3705188)){break oa}if(G[926301]>=2){G[c+304>>2]=a;kb(73941,c+304|0);$a(n)}G[m+G[926508]>>2]=0;G[926526]=G[926526]-1;if(!G[926296]){break Xa}if(Qb(G[(m+G[926509]|0)+4>>2],3705188)){break pa}G[m+G[926509]>>2]=0;G[926526]=G[926526]-1}k=k+1|0;if((t|0)!=(k|0)){continue}break}}j=0;f=G[926497];if((f|0)>0){while(1){a=j<<3;g=a+T|0;G[g>>2]=0;G[g+4>>2]=0;k=a+U|0;a=k;G[a>>2]=0;G[a+4>>2]=0;Za:{_a:{$a:{ab:{bb:{e=j<<2;a=G[e+Q>>2];if((a|0)>0){cb:{switch(Y-1|0){case 3:break $a;case 1:break bb;case 0:break cb;default:break Za}}l=G[e+o>>2];e=G[e+p>>2];f=0;m=1;w=0;z=0;while(1){t=f<<3;q=t+l|0;h=L[q>>3];if(!(h>0)){f=f+1|0;if((a|0)!=(f|0)){continue}if(m&1){break ab}break _a}w=L[e+t>>3]*h+w;L[g>>3]=w;z=L[q>>3]+z;L[k>>3]=z;m=0;f=f+1|0;if((a|0)!=(f|0)){continue}break}break _a}break ab}t=G[e+p>>2];q=G[e+o>>2];e=a;l=Fa-32|0;Fa=l;db:{eb:{fb:{f=G[926529];if(!f){f=1024;G[926529]=1024;a=ab(8192);G[926530]=a;fa=3706124,ga=ab(8192),G[fa>>2]=ga;if(!a){break fb}}a=1;v=f;f=e<<1;if((v|0)<(f|0)){G[926529]=f;f=e<<4;m=ub(G[926530],f);G[926530]=m;fa=3706124,ga=ub(G[926531],f),G[fa>>2]=ga;if(!m){break eb}}G[g>>2]=0;G[g+4>>2]=0;G[k>>2]=0;G[k+4>>2]=0;gb:{if((e|0)<=0){break gb}h=u*.5;f=0;D=G[926531];r=G[926530];a=0;while(1){A=a<<3;m=A+q|0;if(h>3]){N=f<<3;L[N+r>>3]=L[t+A>>3];L[D+N>>3]=L[m>>3];L[k>>3]=L[m>>3]+L[k>>3];f=f+1|0}a=a+1|0;if((e|0)!=(a|0)){continue}break}if(!f){a=1;break gb}e=1;m=G[926530];hb:{ib:{if((f|0)!=1){t=G[926531];while(1){a=e;while(1){jb:{q=a<<3;a=a-1|0;D=a<<3;r=D+m|0;h=L[r>>3];A=m+q|0;C=L[A>>3];if(!(h>C)){break jb}q=q+t|0;J=L[q>>3];L[A>>3]=h;v=q;q=t+D|0;L[v>>3]=L[q>>3];L[r>>3]=C;L[q>>3]=J;if(a){continue}}break}e=e+1|0;if((f|0)!=(e|0)){continue}break}if(!(f&1)){break ib}}else{f=1}h=L[((f|0)/2<<3)+m>>3];break hb}h=L[m>>3];if((f|0)==2){break hb}a=m+((f|0)/2<<3)|0;h=(L[a>>3]+L[a-8>>3])*.5}L[g>>3]=h;a=0}Fa=l+32|0;break db}G[l>>2]=3626;_a(G[321435],83707,l);break b}G[l+16>>2]=62721;_a(G[321435],83707,l+16|0);break b}if(!a){break Za}}L[g>>3]=L[c+1304>>3];G[k>>2]=0;G[k+4>>2]=0;break Za}l=G[e+o>>2];m=G[e+p>>2];G[k>>2]=0;G[k+4>>2]=1072693248;k=a&1;kb:{if((a|0)==1){f=0;h=0;break kb}a=a&-2;f=0;h=0;e=0;while(1){t=f<<3;h=!(L[t+l>>3]>0)|!(L[m+t>>3]>0)?h:h+1;t=(f|1)<<3;h=!(L[t+l>>3]>0)|!(L[m+t>>3]>0)?h:h+1;f=f+2|0;e=e+2|0;if((a|0)!=(e|0)){continue}break}}lb:{if(!k){break lb}a=f<<3;if(!(L[a+l>>3]>0)|!(L[a+m>>3]>0)){break lb}h=h+1}L[g>>3]=h;break Za}L[g>>3]=w/z}f=G[926497];j=j+1|0;if((f|0)>(j|0)){continue}break}}G[c+2360>>2]=1;G[c+2364>>2]=1;G[c+2356>>2]=s;G[c+2352>>2]=1;a=f>>31;if(ag(G[926496],82,c+2352|0,f,a,T,3705188)){break qa}if(!ag(G[926514],82,c+2352|0,f,a,U,3705188)){a=G[926498]<=(s|0);s=s+1|0;if(a){break ra}continue}break}a=G[926297];b=c+82384|0;uc(a,b);G[c+256>>2]=a;G[c+260>>2]=b;kb(80427,c+256|0);break d}if(G[926301]>0){Wc(3705196);L[c+112>>3]=G[926299]-G[926300]|0;gb(77992,c+112|0);$a(n)}if(Qb(G[926496],3705188)){break c}if(Qb(G[926514],3705188)){break c}if(G[926301]>0){yb(27750);$a(n)}Wc(3705196);L[c+96>>3]=G[926299]-G[926300]|0;xb(G[321435],77637,c+96|0);$a(n);$a(G[321435]);Hb(G[321435]);sc(0);W()}a=G[926297];b=c+82384|0;uc(a,b);G[c+272>>2]=a;G[c+276>>2]=b;kb(80427,c+272|0);break d}a=G[926297];b=c+82384|0;uc(a,b);G[c+288>>2]=a;G[c+292>>2]=b;kb(80427,c+288|0);break d}a=G[926297];b=c+82384|0;uc(a,b);G[c+320>>2]=a;G[c+324>>2]=b;kb(80427,c+320|0);break d}Ed(3705216);Ed(3705472);G[c+352>>2]=62784;_a(G[321435],83707,c+352|0);break e}Ed(3705216);Ed(3705472);G[c+336>>2]=62764;_a(G[321435],83707,c+336|0);break e}a=G[926297];b=c+82384|0;uc(a,b);G[c+688>>2]=a;G[c+692>>2]=b;kb(80427,c+688|0);break d}a=G[926297];b=c+82384|0;uc(a,b);G[c+704>>2]=a;G[c+708>>2]=b;kb(80427,c+704|0);break d}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}break c}Ae(21295);W()}Ae(21278);W()}Ae(5471);W()}yb(32524);$a(n)}Ed(3705216);Ed(3705472);break a}$a(G[321435]);break a}Ed(3705216);Ed(3705472);$a(G[321435]);Hb(G[321435]);sc(a);W()}a=Fa-48|0;Fa=a;b=G[926297];d=a+16|0;uc(b,d);G[a>>2]=b;G[a+4>>2]=d;kb(80427,a);Ed(3705216);Ed(3705472);$a(G[321435]);Hb(G[321435]);sc(b);W()}$a(G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()}function xu(a,b){a=a|0;b=b|0;var 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;j=Fa-32|0;Fa=j;G[j+28>>2]=0;G[j+24>>2]=0;G[j+20>>2]=0;G[j+16>>2]=0;Tl();c=Ic(1,72);G[j+28>>2]=c;G[c+64>>2]=G[29763];G[c+56>>2]=0;G[c+60>>2]=1072693248;G[c>>2]=1;G[c+4>>2]=32;G[c+8>>2]=1;c=G[j+28>>2];G[c+68>>2]=G[24367];G[c+44>>2]=0;c=Ic(1,128);G[j+24>>2]=c;G[c>>2]=0;c=Ic(1,128);G[j+20>>2]=c;G[c>>2]=1;c=Ic(1,40);G[j+16>>2]=c;G[c+32>>2]=0;G[c+36>>2]=1072693248;G[952413]=G[j+28>>2];G[952414]=G[j+24>>2];d=G[j+20>>2];G[952416]=c;G[952415]=d;G[945053]=154;d=G[j+28>>2];e=G[j+24>>2];c=G[j+20>>2];i=G[j+16>>2];g=Fa-32|0;Fa=g;G[47589]=1;h=G[24367];a:{b:{while(1){c:{switch(of(a,b,40975)+1|0){case 99:v=d,w=sb(G[321433]),L[v+56>>3]=w;continue;case 100:k=G[321433];G[d+16>>2]=1;G[d+48>>2]=k;if(!Sb(k,16840)){continue}G[d+12>>2]=1;continue;case 102:k=ac(G[321433],4017);G[d+68>>2]=k;if(k){G[945052]=k;continue}G[g>>2]=G[321433];Tb(h,69432,g);continue;case 104:G[d+20>>2]=1;continue;case 72:G[d+20>>2]=2;continue;case 107:G[d+44>>2]=1;continue;case 110:G[d+24>>2]=1;continue;case 112:k=ac(G[321433],4017);G[d+64>>2]=k;if(k){continue}G[g+16>>2]=G[321433];Tb(h,69388,g+16|0);continue;case 113:G[d+28>>2]=1;continue;case 115:G[d+32>>2]=1;continue;case 116:G[d+36>>2]=1;continue;case 123:G[d+40>>2]=1;continue;case 85:G[d+4>>2]=9;continue;case 50:G[d+16>>2]=1;continue;case 105:break b;case 0:break c;default:continue}}break}h=G[47589];a=a-h|0;if((a|0)>0){d:{v=e,x=Lc(G[(h<<2)+b>>2]),G[v+56>>2]=x;e:{if((a|0)!=1){h=G[((G[47589]<<2)+b|0)+4>>2];G[e+48>>2]=h;if(H[h|0]){break e}}G[e+48>>2]=64139}f:{if(a>>>0<3){break f}e=2;if((a|0)!=3){e=3;h=Lc(G[((G[47589]<<2)+b|0)+8>>2])}else{h=0}G[c+56>>2]=h;e=G[(G[47589]+e<<2)+b>>2];G[c+48>>2]=e;v=i,w=vb(e,g+28|0),L[v+24>>3]=w;e=G[c+48>>2];if(!(!e|!H[e|0]|(e|0)!=G[g+28>>2])){G[d>>2]=2;G[i+24>>2]=0;G[i+28>>2]=0;break f}if((a|0)==4){break d}G[d>>2]=1;G[c+48>>2]=0}Fa=g+32|0;break a}}}c=Fa-16|0;Fa=c;G[c>>2]=G[b>>2];a=G[24367];_a(a,76030,c);hb(86149,19,1,a);hb(87583,71,1,a);hb(70291,74,1,a);hb(87528,44,1,a);hb(68630,35,1,a);_a(a,87669,0);hb(70146,26,1,a);hb(87360,55,1,a);hb(68777,49,1,a);hb(87314,45,1,a);hb(68580,49,1,a);hb(87416,70,1,a);hb(68890,29,1,a);hb(68666,51,1,a);hb(68506,49,1,a);sc(1);W()}xl(G[j+28>>2],G[j+24>>2]);a=G[j+20>>2];g:{if(!G[a+48>>2]){break g}if(G[a+56>>2]){xl(G[j+28>>2],a);break g}b=G[j+24>>2];G[a+4>>2]=G[b+4>>2];G[a+8>>2]=G[b+8>>2];G[a+12>>2]=G[b+12>>2];G[a+16>>2]=G[b+16>>2];G[a+20>>2]=G[b+20>>2];G[a+24>>2]=G[b+24>>2];G[a+72>>2]=G[b+72>>2];G[a+60>>2]=G[b+60>>2];c=G[b+68>>2];G[a+28>>2]=1;G[a+68>>2]=c;G[a+124>>2]=G[b+124>>2]}if(!Jq(G[j+24>>2])){G[j>>2]=G[G[j+24>>2]+48>>2];Tb(G[24367],89438,j)}b=G[j+20>>2];h:{if(!G[b+48>>2]){a=G[j+28>>2];break h}Jq(b);a=G[j+28>>2];if(!G[a+24>>2]){b=G[j+20>>2];break h}b=G[j+20>>2];if(G[G[j+24>>2]+80>>2]!=G[b+80>>2]){break h}G[a>>2]=3}c=G[j+24>>2];d=G[j+16>>2];i:{if(G[b+56>>2]){f=L[c+96>>3];if(!(f>0)){break i}m=L[b+96>>3];if(!(m>0)){break i}f=f/m;L[d+32>>3]=f*f;break i}b=G[c+120>>2];if(!b|!(b?G[b+3312>>2]:0)){break i}b=G[c+120>>2];if(!G[b+3304>>2]){f=L[b+760>>3];L[c+96>>3]=(f<0?-f:f)*+G[c+72>>2];break i}f=L[b+768>>3];L[c+96>>3]=(f<0?-f:f)*+G[c+72>>2]}j:{if(!G[a+32>>2]){break j}a=G[c+116>>2];if(!a){break j}v=d,x=Lc(G[a+176>>2]),G[v>>2]=x}v=d,x=Ic(G[c+80>>2],8),G[v+8>>2]=x;v=d,x=Ic(G[c+80>>2],8),G[v+12>>2]=x;v=d,x=Ic(G[c+80>>2],8),G[v+16>>2]=x;v=d,x=Ic(G[c+80>>2],8),G[v+20>>2]=x;a=G[j+24>>2];d=G[j+20>>2];e=G[j+16>>2];b=Fa-416|0;Fa=b;k:{l:{m:{c=G[j+28>>2];switch(G[c+44>>2]){case 1:break l;case 0:break m;default:break k}}hb(73014,9,1,G[c+64>>2]);g=G[c+64>>2];G[b+192>>2]=G[a+56>>2];_a(g,70001,b+192|0);if(G[c+12>>2]){g=G[c+64>>2];G[b+176>>2]=G[a+40>>2];_a(g,75865,b+176|0)}f=L[c+56>>3];if(f!=1){g=G[c+64>>2];L[b+160>>3]=f;xb(g,72366,b+160|0)}f=L[a+96>>3];if(f>0){g=G[c+64>>2];L[b+144>>3]=f*3600;xb(g,71125,b+144|0)}hb(73211,13,1,G[c+64>>2]);g=G[d+56>>2];n:{if(g){i=G[c+64>>2];G[b+128>>2]=g;_a(i,70001,b+128|0);f=L[d+96>>3];if(f>0){g=G[c+64>>2];L[b+112>>3]=f*3600;xb(g,71125,b+112|0)}if(L[e+32>>3]==1){break n}e=G[c+64>>2];f=L[a+96>>3];L[b+104>>3]=L[d+96>>3];L[b+96>>3]=f;xb(e,88547,b+96|0);break n}d=G[c+64>>2];if(G[c>>2]!=1){G[b+80>>2]=G[a+56>>2];_a(d,70001,b+80|0);break n}L[b+64>>3]=L[e+24>>3];xb(d,72e3,b- -64|0)}if(G[c+28>>2]|!(L[a+96>>3]>0)){a=16895}else{a=30700}hb(68718,15,1,G[c+64>>2]);d=G[c+64>>2];G[b+48>>2]=a;_a(d,86480,b+48|0);d=G[c+64>>2];G[b+32>>2]=a;_a(d,86453,b+32|0);d=G[c+64>>2];G[b+16>>2]=a;_a(d,86426,b+16|0);if(!G[c+32>>2]){break k}d=G[c+64>>2];G[b>>2]=a;_a(d,68734,b);hb(68920,21,1,G[c+64>>2]);break k}hb(68421,2,1,G[c+64>>2]);hb(68390,14,1,G[c+64>>2]);f=L[c+56>>3];if(f!=1){g=G[c+64>>2];L[b+400>>3]=f;xb(g,87112,b+400|0)}f=L[a+96>>3];if(f>0){g=G[c+64>>2];L[b+384>>3]=f*3600;xb(g,87085,b+384|0)}if(G[c+12>>2]){g=G[c+64>>2];G[b+368>>2]=G[a+40>>2];_a(g,87136,b+368|0)}g=G[c+64>>2];G[b+352>>2]=G[a+56>>2];_a(g,89998,b+352|0);hb(87079,5,1,G[c+64>>2]);hb(68405,18,1,G[c+64>>2]);o:{if(G[d+56>>2]){f=L[d+96>>3];if(f>0){g=G[c+64>>2];L[b+336>>3]=f*3600;xb(g,71099,b+336|0)}if(L[e+32>>3]!=1){e=G[c+64>>2];f=L[a+96>>3];L[b+328>>3]=L[d+96>>3];L[b+320>>3]=f;xb(e,87220,b+320|0)}e=G[c+64>>2];G[b+304>>2]=G[d+56>>2];_a(e,89998,b+304|0);break o}d=G[c+64>>2];if(G[c>>2]!=1){G[b+288>>2]=G[a+56>>2];_a(d,89998,b+288|0);break o}L[b+272>>3]=L[e+24>>3];xb(d,71973,b+272|0)}hb(87079,5,1,G[c+64>>2]);if(G[c+28>>2]|!(L[a+96>>3]>0)){a=16895}else{a=30700}hb(68370,19,1,G[c+64>>2]);if(G[c+32>>2]){d=G[c+64>>2];G[b+256>>2]=a;_a(d,87165,b+256|0);hb(87186,25,1,G[c+64>>2])}d=G[c+64>>2];G[b+240>>2]=a;_a(d,87292,b+240|0);d=G[c+64>>2];G[b+224>>2]=a;_a(d,87255,b+224|0);d=G[c+64>>2];G[b+208>>2]=a;_a(d,90020,b+208|0);hb(87079,5,1,G[c+64>>2])}Fa=b+416|0;p:{while(1){Iq(G[j+28>>2],G[j+24>>2]);b=G[j+28>>2];if(G[b>>2]!=1){Iq(b,G[j+20>>2]);b=G[j+28>>2]}while(1){a=G[j+24>>2];d=G[j+20>>2];q:{r:{switch(G[b+36>>2]-1|0){case 0:bb(G[a+108>>2],G[a+104>>2],G[a+80>>2]<<3);bb(G[a+88>>2],G[a+84>>2],G[a+80>>2]<<2);if(G[a+80>>2]>=2){g=G[a+84>>2];e=G[g>>2];i=G[a+104>>2];f=L[i>>3];c=1;while(1){h=i+(c<<3)|0;f=f+L[h>>3];L[h>>3]=f;h=g+(c<<2)|0;e=G[h>>2]+e|0;G[h>>2]=e;c=c+1|0;if((c|0)>2]){continue}break}}if(G[b>>2]==1){break q}bb(G[d+108>>2],G[d+104>>2],G[d+80>>2]<<3);bb(G[d+88>>2],G[d+84>>2],G[d+80>>2]<<2);if(G[d+80>>2]<2){break q}a=G[d+84>>2];e=G[a>>2];b=G[d+104>>2];f=L[b>>3];c=1;while(1){g=b+(c<<3)|0;f=f+L[g>>3];L[g>>3]=f;g=a+(c<<2)|0;e=G[g>>2]+e|0;G[g>>2]=e;c=c+1|0;if((c|0)>2]){continue}break};break q;case 1:break r;default:break q}}bb(G[a+104>>2],G[a+108>>2],G[a+80>>2]<<3);bb(G[a+84>>2],G[a+88>>2],G[a+80>>2]<<2);if(G[b>>2]==1){break q}bb(G[d+104>>2],G[d+108>>2],G[d+80>>2]<<3);bb(G[d+84>>2],G[d+88>>2],G[d+80>>2]<<2)}d=G[j+24>>2];c=G[j+20>>2];a=G[j+16>>2];b=0;f=0;h=Fa-16|0;Fa=h;s:{t:{u:{v:{k=G[j+28>>2];switch(G[k>>2]-1|0){case 0:break t;case 1:break u;case 2:break v;default:break s}}if(G[d+80>>2]<=0){break s}i=G[c+84>>2];p=G[24367];while(1){n=b<<2;e=G[n+i>>2];if(!e){G[h>>2]=b;Tb(p,75994,h);i=G[c+84>>2];e=G[n+i>>2]}g=b<<3;l=g+G[c+104>>2]|0;f=L[a+32>>3]*(+G[n+G[d+84>>2]>>2]/+(e|0));m=L[l>>3]*f;L[g+G[a+8>>2]>>3]=m;e=g+G[d+104>>2]|0;L[g+G[a+16>>2]>>3]=L[e>>3]-m;L[g+G[a+20>>2]>>3]=V(f*f*L[l>>3]+L[e>>3]);L[g+G[a+12>>2]>>3]=G[k+8>>2]?f*V(L[l>>3]):0;b=b+1|0;if((b|0)>2]){continue}break}break s}w:{x:{y:{z:{if(G[k+36>>2]==1){b=G[c+80>>2]-1|0;L[a+24>>3]=L[G[c+104>>2]+(b<<3)>>3];b=G[G[c+84>>2]+(b<<2)>>2];break z}G[a+4>>2]=0;G[a+24>>2]=0;G[a+28>>2]=0;e=G[c+80>>2];if((e|0)<=0){break x}n=e&1;g=G[c+84>>2];i=G[c+104>>2];A:{if((e|0)==1){c=0;break A}l=e&-2;c=0;e=0;while(1){f=L[i+(c<<3)>>3]+f;L[a+24>>3]=f;b=G[g+(c<<2)>>2]+b|0;G[a+4>>2]=b;p=c|1;f=L[i+(p<<3)>>3]+f;L[a+24>>3]=f;b=b+G[g+(p<<2)>>2]|0;G[a+4>>2]=b;c=c+2|0;e=e+2|0;if((l|0)!=(e|0)){continue}break}}if(!n){break y}L[a+24>>3]=L[i+(c<<3)>>3]+f;b=G[g+(c<<2)>>2]+b|0}G[a+4>>2]=b}if(b){break w}}Tb(G[24367],75968,0)}e=G[d+80>>2];if((e|0)<=0){break s}g=G[a+12>>2];i=G[k+8>>2];k=G[a+20>>2];n=G[a+16>>2];l=G[d+104>>2];p=G[a+8>>2];d=G[d+84>>2];m=+G[a+4>>2];b=0;while(1){c=b<<3;f=L[a+32>>3]*(+G[d+(b<<2)>>2]/m);q=L[a+24>>3]*f;L[c+p>>3]=q;r=c+l|0;L[c+n>>3]=L[r>>3]-q;L[c+k>>3]=V(f*f*L[a+24>>3]+L[r>>3]);L[c+g>>3]=i?f*V(L[a+24>>3]):0;b=b+1|0;if((e|0)!=(b|0)){continue}break}break s}e=G[d+80>>2];if((e|0)<=0){break s}g=G[a+12>>2];i=G[a+20>>2];k=G[a+16>>2];n=G[d+104>>2];l=G[a+8>>2];d=G[d+84>>2];while(1){c=b<<3;f=L[a+24>>3]*+G[d+(b<<2)>>2];L[c+l>>3]=f;p=c+n|0;L[c+k>>3]=L[p>>3]-f;L[c+i>>3]=V(L[p>>3]);c=c+g|0;G[c>>2]=0;G[c+4>>2]=0;b=b+1|0;if((e|0)!=(b|0)){continue}break}}Fa=h+16|0;h=G[j+24>>2];k=G[j+16>>2];i=0;n=0;p=0;c=Fa-29792|0;Fa=c;B:{C:{D:{d=G[j+28>>2];switch(G[d+44>>2]){case 1:break C;case 0:break D;default:break B}}E[c+25696|0]=0;if(G[d+12>>2]){G[c+720>>2]=G[h+36>>2]+1;Ya(c+25696|0,4096,30105,c+720|0)}E:{if(G[d+36>>2]==1){if(!G[d+12>>2]){Ub(10,G[d+64>>2])}a=G[d+64>>2];G[c+672>>2]=c+25696;_a(a,69018,c+672|0);a=G[d+64>>2];b=G[d+4>>2];G[c+660>>2]=b;G[c+656>>2]=b;_a(a,10851,c+656|0);break E}if(G[d+4>>2]==9){Ub(12,G[d+64>>2])}if(!G[d+12>>2]){Ub(10,G[d+64>>2])}a=G[d+64>>2];G[c+704>>2]=c+25696;_a(a,69060,c+704|0);a=G[d+64>>2];b=G[d+4>>2];G[c+692>>2]=b;G[c+688>>2]=b;_a(a,10881,c+688|0)}a=G[d+64>>2];b=G[d+4>>2];G[c+644>>2]=b;G[c+640>>2]=b;_a(a,10604,c+640|0);b=G[d+64>>2];a=G[d+4>>2];G[c+632>>2]=a;G[c+628>>2]=a;G[c+624>>2]=a;_a(b,10379,c+624|0);a=d- -64|0;if(G[d+32>>2]){e=G[a>>2];b=G[d+4>>2];G[c+620>>2]=b;G[c+616>>2]=b;G[c+612>>2]=b;G[c+608>>2]=b;_a(e,40650,c+608|0)}Ub(10,G[d+64>>2]);b=G[d+64>>2];e=G[d+4>>2];G[c+596>>2]=e;G[c+592>>2]=e;_a(b,48566,c+592|0);b=G[d+64>>2];e=G[d+4>>2];G[c+580>>2]=e;G[c+576>>2]=e;_a(b,48570,c+576|0);e=G[d+64>>2];b=G[d+4>>2];G[c+568>>2]=b;G[c+564>>2]=b;G[c+560>>2]=b;_a(e,48532,c+560|0);if(G[d+32>>2]){e=G[a>>2];b=G[d+4>>2];G[c+556>>2]=b;G[c+552>>2]=b;G[c+548>>2]=b;G[c+544>>2]=b;_a(e,48521,c+544|0)}Ub(10,G[a>>2]);if(G[k>>2]){dj(49008)}if(G[h+80>>2]>0){e=G[k>>2];g=0;while(1){F:{if(!e){break F}g=jb(e,10);if(!g){g=0;break F}E[g|0]=0}l=G[G[h+84>>2]+(i<<2)>>2];G:{H:{if(l){b=i<<3;s=L[b+G[k+20>>2]>>3];f=+(l|0);m=s/f;t=L[b+G[k+16>>2]>>3];q=t/f;I:{if(G[d+28>>2]){break I}o=L[h+96>>3];if(!(o>0)){break I}o=o*o;f=o*f*1296e4;m=m/o/1296e4;q=q/o/1296e4}l=G[d+20>>2];if(l>>>0<=2){n=G[(l<<2)+189380>>2]}o=L[b+G[k+8>>2]>>3];u=L[b+G[k+12>>2]>>3];l=G[d+64>>2];b=G[d+4>>2];L[c+536>>3]=m;G[c+528>>2]=b;L[c+520>>3]=q;G[c+512>>2]=b;L[c+504>>3]=f;G[c+496>>2]=b;L[c+488>>3]=u;G[c+480>>2]=b;L[c+472>>3]=o;G[c+464>>2]=b;L[c+456>>3]=s;G[c+448>>2]=b;L[c+440>>3]=t;G[c+436>>2]=b;G[c+432>>2]=i+1;xb(l,n,c+432|0);if(!G[d+32>>2]|!e){break H}G[c+21600>>2]=0;J:{K:{if(!Ld(e,c+5216|0,c+21600|0)){break K}if(!nb(c+5216|0,35978,3)){break K}f=vb(c+5216|0,0);L:{if(G[d+28>>2]){break L}m=L[h+96>>3];if(!(m>0)){break L}b=G[a>>2];G[c+400>>2]=G[d+4>>2];L[c+408>>3]=f*m*3600;xb(b,19001,c+400|0);break J}b=G[a>>2];l=G[d+4>>2];L[c+424>>3]=f;G[c+416>>2]=l;xb(b,19001,c+416|0);break J}b=G[a>>2];l=G[d+4>>2];G[c+388>>2]=35978;G[c+384>>2]=l;_a(b,8526,c+384|0)}M:{N:{if(!Ld(e,c+5216|0,c+21600|0)){break N}if(!nb(c+5216|0,35978,3)){break N}f=vb(c+5216|0,0);O:{if(!G[d+28>>2]){m=L[h+96>>3];if(m>0){break O}}b=G[a>>2];l=G[d+4>>2];L[c+376>>3]=f;G[c+368>>2]=l;xb(b,19001,c+368|0);break M}b=G[a>>2];G[c+352>>2]=G[d+4>>2];L[c+360>>3]=f*m*3600;xb(b,19001,c+352|0);break M}b=G[a>>2];l=G[d+4>>2];G[c+340>>2]=35978;G[c+336>>2]=l;_a(b,8526,c+336|0)}P:{Q:{if(!Ld(e,c+5216|0,c+21600|0)){break Q}if(!nb(c+5216|0,35978,3)){break Q}f=vb(c+5216|0,0);b=G[a>>2];l=G[d+4>>2];L[c+328>>3]=f;G[c+320>>2]=l;xb(b,19001,c+320|0);break P}b=G[a>>2];l=G[d+4>>2];G[c+308>>2]=35978;G[c+304>>2]=l;_a(b,8526,c+304|0)}R:{if(!Ld(e,c+5216|0,c+21600|0)){break R}if(!nb(c+5216|0,35978,3)){break R}f=vb(c+5216|0,0);b=G[a>>2];l=G[d+4>>2];L[c+296>>3]=f;G[c+288>>2]=l;xb(b,19001,c+288|0);break H}b=G[a>>2];l=G[d+4>>2];G[c+276>>2]=35978;G[c+272>>2]=l;_a(b,8526,c+272|0);break H}if(!G[d+40>>2]){break G}b=G[d+20>>2];if(b>>>0<=2){n=G[(b<<2)+189380>>2]}l=G[d+64>>2];b=G[d+4>>2];G[c+264>>2]=0;G[c+268>>2]=0;G[c+256>>2]=b;G[c+248>>2]=0;G[c+252>>2]=0;G[c+240>>2]=b;G[c+232>>2]=0;G[c+236>>2]=0;G[c+224>>2]=b;G[c+216>>2]=0;G[c+220>>2]=0;G[c+208>>2]=b;G[c+200>>2]=0;G[c+204>>2]=0;G[c+192>>2]=b;G[c+184>>2]=0;G[c+188>>2]=0;G[c+176>>2]=b;G[c+168>>2]=0;G[c+172>>2]=0;G[c+164>>2]=b;G[c+160>>2]=i+1;xb(l,n,c+160|0);if(!G[d+32>>2]|!e){break H}G[c+21600>>2]=0;S:{T:{if(!Ld(e,c+5216|0,c+21600|0)){break T}if(!nb(c+5216|0,35978,3)){break T}f=vb(c+5216|0,0);U:{if(G[d+28>>2]){break U}m=L[h+96>>3];if(!(m>0)){break U}b=G[a>>2];G[c+128>>2]=G[d+4>>2];L[c+136>>3]=f*m*3600;xb(b,19001,c+128|0);break S}b=G[a>>2];l=G[d+4>>2];L[c+152>>3]=f;G[c+144>>2]=l;xb(b,19001,c+144|0);break S}b=G[a>>2];l=G[d+4>>2];G[c+116>>2]=35978;G[c+112>>2]=l;_a(b,8526,c+112|0)}V:{W:{if(!Ld(e,c+5216|0,c+21600|0)){break W}if(!nb(c+5216|0,35978,3)){break W}f=vb(c+5216|0,0);X:{if(!G[d+28>>2]){m=L[h+96>>3];if(m>0){break X}}b=G[a>>2];l=G[d+4>>2];L[c+104>>3]=f;G[c+96>>2]=l;xb(b,19001,c+96|0);break V}b=G[a>>2];G[c+80>>2]=G[d+4>>2];L[c+88>>3]=f*m*3600;xb(b,19001,c+80|0);break V}b=G[a>>2];l=G[d+4>>2];G[c+68>>2]=35978;G[c+64>>2]=l;_a(b,8526,c- -64|0)}Y:{Z:{if(!Ld(e,c+5216|0,c+21600|0)){break Z}if(!nb(c+5216|0,35978,3)){break Z}f=vb(c+5216|0,0);b=G[a>>2];l=G[d+4>>2];L[c+56>>3]=f;G[c+48>>2]=l;xb(b,19001,c+48|0);break Y}b=G[a>>2];l=G[d+4>>2];G[c+36>>2]=35978;G[c+32>>2]=l;_a(b,8526,c+32|0)}_:{if(!Ld(e,c+5216|0,c+21600|0)){break _}if(!nb(c+5216|0,35978,3)){break _}f=vb(c+5216|0,0);b=G[a>>2];l=G[d+4>>2];L[c+24>>3]=f;G[c+16>>2]=l;xb(b,19001,c+16|0);break H}b=G[a>>2];l=G[d+4>>2];G[c+4>>2]=35978;G[c>>2]=l;_a(b,8526,c)}Ub(10,G[a>>2])}if(g){E[g|0]=10;e=g+1|0}i=i+1|0;if((i|0)>2]){continue}break}}if(G[k>>2]){cj()}Ub(10,G[a>>2]);$a(G[a>>2]);break B}E[c+1120|0]=0;if(G[d+12>>2]){G[c+1104>>2]=G[h+36>>2]+1;Ya(c+1120|0,4096,30633,c+1104|0)}a=G[d+36>>2];b=G[d+64>>2];G[c+1088>>2]=c+1120;a=(a|0)==1;_a(b,a?85159:85121,c+1088|0);G[c+5244>>2]=10911;G[c+5240>>2]=5880;G[c+5236>>2]=31629;G[c+5232>>2]=10623;G[c+5228>>2]=26062;G[c+5224>>2]=10905;G[c+5220>>2]=5483;G[c+5216>>2]=a?13535:18018;if(G[d+32>>2]){G[c+5260>>2]=40688;G[c+5256>>2]=41048;G[c+5252>>2]=40616;G[c+5248>>2]=41014}if(G[k>>2]){dj(49008)}if(G[h+80>>2]>0){l=G[k>>2];while(1){$:{if(!l){break $}n=jb(l,10);if(!n){n=0;break $}E[n|0]=0}b=G[G[h+84>>2]+(i<<2)>>2];aa:{ba:{ca:{if(b){a=i<<3;s=L[a+G[k+20>>2]>>3];f=+(b|0);m=s/f;t=L[a+G[k+16>>2]>>3];q=t/f;da:{if(G[d+28>>2]){break da}o=L[h+96>>3];if(!(o>0)){break da}o=o*o;f=o*f*1296e4;m=m/o/1296e4;q=q/o/1296e4}b=G[d+20>>2];if(b>>>0<=2){p=G[(b<<2)+189392>>2]}o=L[a+G[k+12>>2]>>3];u=L[a+G[k+8>>2]>>3];L[c+976>>3]=t;G[c+984>>2]=G[c+5224>>2];L[c+992>>3]=s;G[c+1e3>>2]=G[c+5228>>2];L[c+1008>>3]=u;G[c+1016>>2]=G[c+5232>>2];L[c+1024>>3]=o;G[c+1032>>2]=G[c+5236>>2];L[c+1040>>3]=f;G[c+1048>>2]=G[c+5240>>2];L[c+1056>>3]=q;G[c+1064>>2]=G[c+5244>>2];L[c+1072>>3]=m;G[c+960>>2]=G[c+5216>>2];G[c+964>>2]=i+1;G[c+968>>2]=G[c+5220>>2];a=c+21600|0;Ya(a,4096,p,c+960|0);Sg(G[d+64>>2],a);ea:{if(!G[d+32>>2]|!l){break ea}g=0;G[c+1116>>2]=0;hb(67812,2,1,G[d+64>>2]);while(1){fa:{ga:{if(!Ld(l,c+25696|0,c+1116|0)){break ga}if(!nb(c+25696|0,35978,3)){break ga}f=vb(c+25696|0,0);ha:{if(G[d+28>>2]|g>>>0>1){break ha}m=L[h+96>>3];if(!(m>0)){break ha}L[c+936>>3]=f*m*3600;G[c+928>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,19222,c+928|0);break fa}L[c+952>>3]=f;G[c+944>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,19222,c+944|0);break fa}G[c+916>>2]=65593;G[c+912>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,8547,c+912|0)}r=G[d+64>>2];a=c+21600|0;while(1){ia:{ja:{ka:{e=Sb(a,16007);if(!e){e=Sb(a,34391);if(!e){break ka}}b=e+4|0;break ja}e=Sb(a,16008);if(!e){e=Sb(a,34392);if(!e){break ia}}b=e+3|0}E[e|0]=0;fe(a,r);hb(65587,5,1,r);a=b;continue}break}fe(a,r);if((g|0)==3){break ea}Ub(44,G[d+64>>2]);g=g+1|0;continue}}Ub(125,G[d+64>>2]);if((G[h+80>>2]-1|0)!=(i|0)){break ca}break ba}if(!G[d+40>>2]){break aa}a=G[d+20>>2];if(a>>>0<=2){p=G[(a<<2)+189404>>2]}a=G[d+64>>2];G[c+800>>2]=0;G[c+804>>2]=0;G[c+808>>2]=G[c+5224>>2];G[c+816>>2]=0;G[c+820>>2]=0;G[c+824>>2]=G[c+5228>>2];G[c+832>>2]=0;G[c+836>>2]=0;G[c+840>>2]=G[c+5232>>2];G[c+848>>2]=0;G[c+852>>2]=0;G[c+856>>2]=G[c+5236>>2];G[c+864>>2]=0;G[c+868>>2]=0;G[c+872>>2]=G[c+5240>>2];G[c+880>>2]=0;G[c+884>>2]=0;G[c+888>>2]=G[c+5244>>2];G[c+896>>2]=0;G[c+900>>2]=0;G[c+784>>2]=G[c+5216>>2];G[c+788>>2]=i+1;G[c+792>>2]=G[c+5220>>2];xb(a,p,c+784|0);la:{if(!G[d+32>>2]|!l){break la}g=0;G[c+1116>>2]=0;hb(67812,2,1,G[d+64>>2]);while(1){ma:{na:{if(!Ld(l,c+25696|0,c+1116|0)){break na}if(!nb(c+25696|0,35978,3)){break na}f=vb(c+25696|0,0);oa:{if(G[d+28>>2]|g>>>0>1){break oa}m=L[h+96>>3];if(!(m>0)){break oa}L[c+760>>3]=f*m*3600;G[c+752>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,19104,c+752|0);break ma}L[c+776>>3]=f;G[c+768>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,19104,c+768|0);break ma}G[c+740>>2]=65593;G[c+736>>2]=G[(c+(g<<2)|0)+5248>>2];Ya(c+21600|0,4096,8534,c+736|0)}r=G[d+64>>2];a=c+21600|0;while(1){pa:{qa:{ra:{e=Sb(a,16007);if(!e){e=Sb(a,34391);if(!e){break ra}}b=e+4|0;break qa}e=Sb(a,16008);if(!e){e=Sb(a,34392);if(!e){break pa}}b=e+3|0}E[e|0]=0;fe(a,r);hb(65587,5,1,r);a=b;continue}break}fe(a,r);if((g|0)==3){break la}Ub(44,G[d+64>>2]);g=g+1|0;continue}}Ub(125,G[d+64>>2]);if((G[h+80>>2]-1|0)==(i|0)){break ba}}Ub(44,G[d+64>>2])}Ub(10,G[d+64>>2])}if(n){E[n|0]=10;l=n+1|0}i=i+1|0;if((i|0)>2]){continue}break}}if(G[k>>2]){cj()}hb(87159,5,1,G[d+64>>2]);$a(G[d+64>>2])}Fa=c+29792|0;b=G[j+28>>2];if(G[b+36>>2]==1){G[b+36>>2]=2;continue}break}h=G[j+24>>2];a=0;e=0;i=0;g=0;f=0;d=Fa-8544|0;Fa=d;sa:{ta:{switch(G[b+44>>2]){case 0:a=G[b+4>>2];ua:{if(G[b+36>>2]){if((a|0)==9){Ub(12,G[b+64>>2])}Ub(10,G[b+64>>2]);if(G[h+52>>2]){hb(86390,20,1,G[b+64>>2]);a=G[b+64>>2];G[d+160>>2]=G[h+52>>2];_a(a,90110,d+160|0)}hb(75886,21,1,G[b+64>>2]);c=G[b+64>>2];a=G[b+4>>2];G[d+156>>2]=a;G[d+152>>2]=a;G[d+148>>2]=a;G[d+144>>2]=a;_a(c,68450,d+144|0);c=G[b+64>>2];a=G[b+4>>2];G[d+140>>2]=a;G[d+136>>2]=a;G[d+132>>2]=a;G[d+128>>2]=a;_a(c,87023,d+128|0);if(G[h+80>>2]<=0){break ua}a=0;while(1){i=G[G[h+84>>2]+(a<<2)>>2];e=i+e|0;m=L[G[h+104>>2]+(a<<3)>>3];f=f+m;c=G[b+20>>2];if(c>>>0<=2){g=G[(c<<2)+189440>>2]}k=G[b+64>>2];c=G[b+4>>2];G[d+124>>2]=e;G[d+120>>2]=c;L[d+112>>3]=f;G[d+104>>2]=c;G[d+100>>2]=i;G[d+96>>2]=c;L[d+88>>3]=m;G[d+84>>2]=c;a=a+1|0;G[d+80>>2]=a;xb(k,g,d+80|0);if(G[h+80>>2]>(a|0)){continue}break}break ua}if((a|0)==9){Ub(12,G[b+64>>2])}if(G[h+52>>2]){hb(86390,20,1,G[b+64>>2]);a=G[b+64>>2];G[d+64>>2]=G[h+52>>2];_a(a,90110,d- -64|0)}hb(75908,14,1,G[b+64>>2]);a=G[b+64>>2];c=G[b+4>>2];G[d+52>>2]=c;G[d+48>>2]=c;_a(a,6911,d+48|0);Ub(10,G[b+64>>2]);a=G[b+64>>2];c=G[b+4>>2];G[d+36>>2]=c;G[d+32>>2]=c;_a(a,48566,d+32|0);Ub(10,G[b+64>>2]);if(G[h+80>>2]<=0){break ua}a=0;while(1){c=G[b+20>>2];if(c>>>0<=2){i=G[(c<<2)+189452>>2]}f=L[G[h+104>>2]+(a<<3)>>3];e=G[b+64>>2];c=G[b+4>>2];G[d+20>>2]=G[G[h+84>>2]+(a<<2)>>2];G[d+16>>2]=c;L[d+8>>3]=f;G[d+4>>2]=c;a=a+1|0;G[d>>2]=a;xb(e,i,d);Ub(10,G[b+64>>2]);if(G[h+80>>2]>(a|0)){continue}break}}Ub(10,G[b+64>>2]);$a(G[b+64>>2]);break sa;case 1:break ta;default:break sa}}E[d+4448|0]=0;if(G[b+12>>2]){G[d+336>>2]=G[h+36>>2]+1;Ya(d+4448|0,4096,30633,d+336|0)}va:{wa:{c=G[h+52>>2];xa:{if(c){if(H[c|0]){i=Va(c)}g=lb(i<<1|1,1);if((i|0)>0){while(1){ya:{za:{k=H[a+c|0];if((k|0)!=10){if((k|0)!=34){break za}k=e+g|0;E[k|0]=92;E[k+1|0]=34;e=e+1|0;break ya}E[e+g|0]=59;k=a+1|0;a=H[c+k|0]==35?k:a;break ya}E[e+g|0]=k}e=e+1|0;a=a+1|0;if((i|0)>(a|0)){continue}break}}E[e+g|0]=0;a=G[b+36>>2];c=G[b+64>>2];G[d+320>>2]=d+4448;_a(c,67652,d+320|0);c=G[b+64>>2];G[d+304>>2]=g;_a(c,87212,d+304|0);if(a){break xa}break wa}if(!G[b+36>>2]){break wa}}a=G[b+64>>2];G[d+288>>2]=d+4448;_a(a,85224,d+288|0);if(G[h+80>>2]<=0){break va}a=0;e=0;i=0;while(1){c=G[G[h+84>>2]+(a<<2)>>2];e=c+e|0;m=L[G[h+104>>2]+(a<<3)>>3];f=f+m;k=G[b+20>>2];if(k>>>0<=2){i=G[(k<<2)+189476>>2]}G[d+276>>2]=e;G[d+272>>2]=3737;L[d+264>>3]=f;G[d+256>>2]=5601;G[d+252>>2]=c;G[d+248>>2]=6934;L[d+240>>3]=m;G[d+232>>2]=5476;G[d+224>>2]=18018;c=a+1|0;G[d+228>>2]=c;k=d+352|0;Ya(k,4096,i,d+224|0);Sg(G[b+64>>2],k);if((G[h+80>>2]-1|0)!=(a|0)){Ub(44,G[b+64>>2])}Ub(10,G[b+64>>2]);a=c;if((c|0)>2]){continue}break}break va}a=G[b+64>>2];G[d+208>>2]=d+4448;_a(a,85203,d+208|0);if(G[h+80>>2]<=0){break va}a=0;e=0;while(1){c=G[b+20>>2];if(c>>>0<=2){e=G[(c<<2)+189416>>2]}f=L[G[h+104>>2]+(a<<3)>>3];G[d+204>>2]=G[G[h+84>>2]+(a<<2)>>2];G[d+200>>2]=6934;L[d+192>>3]=f;G[d+184>>2]=5476;c=a+1|0;G[d+180>>2]=c;G[d+176>>2]=18018;i=d+352|0;Ya(i,4096,e,d+176|0);Sg(G[b+64>>2],i);if((G[h+80>>2]-1|0)!=(a|0)){Ub(44,G[b+64>>2])}Ub(10,G[b+64>>2]);a=c;if((c|0)>2]){continue}break}}hb(87159,5,1,G[b+64>>2]);$a(G[b+64>>2]);if(!g){break sa}Wa(g)}Fa=d+8544|0;h=G[j+20>>2];b=G[j+16>>2];a=0;e=0;i=0;g=0;f=0;c=Fa-8736|0;Fa=c;Aa:{Ba:{Ca:{d=G[j+28>>2];switch(G[d+44>>2]){case 1:break Ba;case 0:break Ca;default:break Aa}}Da:{Ea:{Fa:{switch(G[d>>2]-2|0){case 0:if(G[d+4>>2]==9){Ub(12,G[d+64>>2])}if(G[h+52>>2]){hb(87487,23,1,G[d+64>>2]);a=G[d+64>>2];G[c+240>>2]=G[h+52>>2];_a(a,90110,c+240|0)}hb(75949,18,1,G[d+64>>2]);a=G[d+64>>2];g=G[d+4>>2];G[c+228>>2]=g;G[c+224>>2]=g;_a(a,6911,c+224|0);Ub(10,G[d+64>>2]);a=G[d+64>>2];g=G[d+4>>2];G[c+212>>2]=g;G[c+208>>2]=g;_a(a,48566,c+208|0);Ub(10,G[d+64>>2]);a=G[d+20>>2];if(a>>>0<=2){e=G[(a<<2)+189428>>2]}g=G[d+64>>2];f=L[b+24>>3];a=G[d+4>>2];G[c+196>>2]=G[b+4>>2];G[c+192>>2]=a;L[c+184>>3]=f;G[c+180>>2]=a;G[c+176>>2]=66360;xb(g,e,c+176|0);Ub(10,G[d+64>>2]);a=d- -64|0;break Ea;case 1:break Fa;default:break Da}}a=G[d+4>>2];Ga:{if(G[d+36>>2]){if((a|0)==9){Ub(12,G[d+64>>2])}if(G[h+52>>2]){hb(87487,23,1,G[d+64>>2]);a=G[d+64>>2];G[c+160>>2]=G[h+52>>2];_a(a,90110,c+160|0)}hb(75923,25,1,G[d+64>>2]);b=G[d+64>>2];a=G[d+4>>2];G[c+156>>2]=a;G[c+152>>2]=a;G[c+148>>2]=a;G[c+144>>2]=a;_a(b,68450,c+144|0);b=G[d+64>>2];a=G[d+4>>2];G[c+140>>2]=a;G[c+136>>2]=a;G[c+132>>2]=a;G[c+128>>2]=a;_a(b,87023,c+128|0);if(G[h+80>>2]<=0){break Ga}a=0;while(1){g=G[G[h+84>>2]+(a<<2)>>2];e=g+e|0;m=L[G[h+104>>2]+(a<<3)>>3];f=f+m;b=G[d+20>>2];if(b>>>0<=2){i=G[(b<<2)+189440>>2]}k=G[d+64>>2];b=G[d+4>>2];G[c+124>>2]=e;G[c+120>>2]=b;L[c+112>>3]=f;G[c+104>>2]=b;G[c+100>>2]=g;G[c+96>>2]=b;L[c+88>>3]=m;G[c+84>>2]=b;a=a+1|0;G[c+80>>2]=a;xb(k,i,c+80|0);if(G[h+80>>2]>(a|0)){continue}break}break Ga}if((a|0)==9){Ub(12,G[d+64>>2])}if(G[h+52>>2]){hb(87487,23,1,G[d+64>>2]);a=G[d+64>>2];G[c+64>>2]=G[h+52>>2];_a(a,90110,c- -64|0)}hb(75949,18,1,G[d+64>>2]);a=G[d+64>>2];b=G[d+4>>2];G[c+52>>2]=b;G[c+48>>2]=b;_a(a,6911,c+48|0);Ub(10,G[d+64>>2]);a=G[d+64>>2];b=G[d+4>>2];G[c+36>>2]=b;G[c+32>>2]=b;_a(a,48566,c+32|0);Ub(10,G[d+64>>2]);if(G[h+80>>2]<=0){break Ga}a=0;while(1){b=G[d+20>>2];if(b>>>0<=2){i=G[(b<<2)+189452>>2]}f=L[G[h+104>>2]+(a<<3)>>3];e=G[d+64>>2];b=G[d+4>>2];G[c+20>>2]=G[G[h+84>>2]+(a<<2)>>2];G[c+16>>2]=b;L[c+8>>3]=f;G[c+4>>2]=b;a=a+1|0;G[c>>2]=a;xb(e,i,c);Ub(10,G[d+64>>2]);if(G[h+80>>2]>(a|0)){continue}break}}a=d- -64|0}Ub(10,G[a>>2])}$a(G[d+64>>2]);break Aa}E[c+4640|0]=0;if(G[d+12>>2]){G[c+528>>2]=G[h+36>>2]+1;Ya(c+4640|0,4096,30633,c+528|0)}k=G[h+52>>2];if(k){if(H[k|0]){i=Va(k)}g=lb(i<<1|1,1);if((i|0)>0){while(1){Ha:{Ia:{n=H[a+k|0];if((n|0)!=10){if((n|0)!=34){break Ia}n=e+g|0;E[n|0]=92;E[n+1|0]=34;e=e+1|0;break Ha}E[e+g|0]=59;n=a+1|0;a=H[k+n|0]==35?n:a;break Ha}E[e+g|0]=n}e=e+1|0;a=a+1|0;if((i|0)>(a|0)){continue}break}}E[e+g|0]=0}Ja:{Ka:{La:{switch(G[d>>2]-2|0){case 0:if(g){a=G[d+64>>2];G[c+512>>2]=c+4640;_a(a,67674,c+512|0);a=G[d+64>>2];G[c+496>>2]=g;_a(a,87212,c+496|0)}a=G[d+64>>2];G[c+480>>2]=c+4640;_a(a,85251,c+480|0);e=d- -64|0;a=0;i=G[d+20>>2];if(i>>>0<=2){a=G[(i<<2)+189464>>2]}f=L[b+24>>3];G[c+476>>2]=G[b+4>>2];G[c+472>>2]=6934;L[c+464>>3]=f;G[c+456>>2]=5476;G[c+452>>2]=65542;G[c+448>>2]=18018;b=c+544|0;Ya(b,4096,a,c+448|0);Sg(G[e>>2],b);Ub(10,G[e>>2]);break Ka;case 1:break La;default:break Ja}}Ma:{if(G[d+36>>2]){if(g){a=G[d+64>>2];G[c+432>>2]=c+4640;_a(a,67674,c+432|0);a=G[d+64>>2];G[c+416>>2]=g;_a(a,87212,c+416|0)}a=G[d+64>>2];G[c+400>>2]=c+4640;_a(a,85276,c+400|0);if(G[h+80>>2]<=0){break Ma}e=0;a=0;i=0;while(1){b=G[G[h+84>>2]+(a<<2)>>2];e=b+e|0;m=L[G[h+104>>2]+(a<<3)>>3];f=f+m;k=G[d+20>>2];if(k>>>0<=2){i=G[(k<<2)+189476>>2]}G[c+388>>2]=e;G[c+384>>2]=3737;L[c+376>>3]=f;G[c+368>>2]=5601;G[c+364>>2]=b;G[c+360>>2]=6934;L[c+352>>3]=m;G[c+344>>2]=5476;G[c+336>>2]=18018;b=a+1|0;G[c+340>>2]=b;k=c+544|0;Ya(k,4096,i,c+336|0);Sg(G[d+64>>2],k);if((G[h+80>>2]-1|0)!=(a|0)){Ub(44,G[d+64>>2])}Ub(10,G[d+64>>2]);a=b;if((a|0)>2]){continue}break}break Ma}if(g){a=G[d+64>>2];G[c+320>>2]=c+4640;_a(a,67674,c+320|0);a=G[d+64>>2];G[c+304>>2]=g;_a(a,87212,c+304|0)}a=G[d+64>>2];G[c+288>>2]=c+4640;_a(a,85251,c+288|0);if(G[h+80>>2]<=0){break Ma}a=0;e=0;while(1){b=G[d+20>>2];if(b>>>0<=2){e=G[(b<<2)+189488>>2]}f=L[G[h+104>>2]+(a<<3)>>3];G[c+284>>2]=G[G[h+84>>2]+(a<<2)>>2];G[c+280>>2]=6934;L[c+272>>3]=f;G[c+264>>2]=5476;b=a+1|0;G[c+260>>2]=b;G[c+256>>2]=18018;i=c+544|0;Ya(i,4096,e,c+256|0);Sg(G[d+64>>2],i);if((G[h+80>>2]-1|0)!=(a|0)){Ub(44,G[d+64>>2])}Ub(10,G[d+64>>2]);a=b;if((a|0)>2]){continue}break}}e=d- -64|0}hb(87159,5,1,G[e>>2])}$a(G[d+64>>2]);if(!g){break Aa}Wa(g)}Fa=c+8736|0;if(!G[G[j+28>>2]+12>>2]){break p}a=G[j+20>>2];d=G[a+40>>2];Na:{if(!d){break Na}b=G[a+36>>2]+1|0;G[a+36>>2]=b;c=G[a+64>>2];if((b|0)<(d|0)){G[a+68>>2]=c+M(b,G[a+44>>2]);Hq(a,0);break Na}G[a+68>>2]=c}a=G[j+24>>2];d=G[a+40>>2];if(!d){break p}b=G[a+36>>2]+1|0;G[a+36>>2]=b;c=G[a+64>>2];if((b|0)<(d|0)){G[a+68>>2]=c+M(b,G[a+44>>2]);Hq(a,G[j+16>>2]);continue}break}G[a+68>>2]=c}a=Fa-4112|0;Fa=a;b=G[j+28>>2];if(G[b+44>>2]==1){v=a,x=Wc(0),G[v+12>>2]=x;c=rb(a+16|0,wl(rq(a+12|0)),4095);v=(Va(c)+c|0)-1|0,x=0,E[v|0]=x;d=G[b+64>>2];G[a>>2]=c;_a(d,89982,a);hb(68364,2,1,G[b+64>>2]);$a(G[b+64>>2])}Fa=a+4112|0;yl(G[j+28>>2],G[j+24>>2],G[j+20>>2],G[j+16>>2]);Fa=j+32|0;return 0}function hf(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var 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,P=N(0),R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;x=Fa-29104|0;Fa=x;q=G[p>>2];a:{if(!(g|h)|(q|0)>0){break a}if(o){G[o>>2]=0}if((j|0)==2){cb(n,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,x+29096|0,x+29088|0,x+28992|0,x+29064|0,x+29084|0,x+29080|0,x+29040|0,x+29032|0,x+29060|0,x+29048|0,x+29016|0,x+29076|0,x+29024|0,x+28864|0,p)|0)>0){q=G[p>>2];break a}G[x+29060>>2]=M(G[x+29060>>2],i);R=1;c=G[x+29080>>2];X=c;Y=c>>31;b:{if(G[x+29084>>2]!=16){break b}Gd(x+28992|0,x+29072|0,x+29056|0,x+29068|0,p);c=G[x+29068>>2];if((c|0)<=0){break b}if(c-1>>>0>=7){d=c&-8;q=0;while(1){R=R*10*10*10*10*10*10*10*10;q=q+8|0;if((d|0)!=(q|0)){continue}break}}c=c&7;if(!c){break b}q=0;while(1){R=R*10;q=q+1|0;if((c|0)!=(q|0)){continue}break}}c:{if(!(k|l)&(j|0)==1){break c}e=G[x+29028>>2];c=G[x+29024>>2];d=G[x+29084>>2];if(!e&(c|0)==1234554321&((d|0)%10|0)==1){break c}f=e-(c>>>0<32768)|0;if(((f|0)==-1&c-32768>>>0<4294901760|(f|0)!=-1)&(d|0)==21|(!e&c>>>0>255|(e|0)!=0)&(d|0)==11){break c}D=(d|0)==16?H[x+28864|0]==1?0:j:j}_=0-i|0;e=0;f=0;d:{while(1){d=g>>>0>>0&(h|0)<=(Y|0)|(h|0)<(Y|0)?g:X;c=d;j=c>>31;t=c;q=j;e:{if((i|0)>=0){c=G[x+29036>>2];j=c;c=G[x+29052>>2]+(c^-1)|0;r=G[x+29032>>2];u=r^-1;d=u+G[x+29048>>2]|0;c=Bu(d,d>>>0>>0?c+1|0:c,i,0);d=Ia;break e}r=G[x+29032>>2];j=G[x+29036>>2];c=Bu(r,j,_,0);d=Ia}w=c;u=G[x+29044>>2];c=G[x+29040>>2];v=Au(G[x+29016>>2],G[x+29020>>2],U,V);c=c+v|0;u=Ia+u|0;u=c>>>0>>0?u+1|0:u;B=c;v=r;r=G[x+29060>>2];c=(r|0)/(i|0)|0;v=Au(v,j,c,c>>31);j=B+v|0;c=Ia+u|0;u=j;j=j>>>0>>0?c+1|0:c;c=d;v=w+1|0;d=(d|0)<=(q|0)&t>>>0>w>>>0|(d|0)<(q|0);w=d?v:t;f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{c=G[x+29084>>2];switch(c-11|0){case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break h;case 5:break i;case 31:break k;case 10:break l;case 0:break m;case 30:break n;default:break o}}switch(c-81|0){case 0:break g;case 1:break j;default:break h}}t=x- -64|0;Uc(a,u,j,w,r,t,p);A=G[x+29024>>2];c=k;d=l;j=e+n|0;v=(e<<3)+m|0;z=L[x+29096>>3];C=L[x+29088>>3];q=z==1&C==0;p:{q:{if(!D){if(q){break q}r=0;if((w|0)<=0){break p}while(1){j=v+(r<<3)|0;s=+G[t+(r<<2)>>2]*z+C;r:{if(s<0){G[p>>2]=-11;d=0;c=0;break r}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break r}if(O(s)<0x8000000000000000){d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break r}d=-2147483648;c=0}G[j>>2]=c;G[j+4>>2]=d;r=r+1|0;if((w|0)!=(r|0)){continue}break}break p}if(!q){if((w|0)<=0){break p}r=0;while(1){q=G[t+(r<<2)>>2];s:{if((q|0)==(A|0)){G[o>>2]=1;if((D|0)==1){q=v+(r<<3)|0;G[q>>2]=c;G[q+4>>2]=d;break s}E[j+r|0]=1;break s}s=+(q|0)*z+C;if(s<0){G[p>>2]=-11;q=v+(r<<3)|0;G[q>>2]=0;G[q+4>>2]=0;break s}if(s>0x10000000000000000){G[p>>2]=-11;q=v+(r<<3)|0;G[q>>2]=-1;G[q+4>>2]=-1;break s}q=v+(r<<3)|0;t:{if(s<0x10000000000000000&s>=0){y=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;u=~~s>>>0;break t}y=0;u=0}G[q>>2]=u;G[q+4>>2]=y}r=r+1|0;if((w|0)!=(r|0)){continue}break}break p}if((w|0)<=0){break p}if((D|0)!=1){r=0;while(1){c=G[t+(r<<2)>>2];u:{if((c|0)==(A|0)){G[o>>2]=1;E[j+r|0]=1;break u}if((c|0)<0){G[p>>2]=-11;c=v+(r<<3)|0;G[c>>2]=0;G[c+4>>2]=0;break u}d=v+(r<<3)|0;G[d>>2]=c;G[d+4>>2]=0}r=r+1|0;if((w|0)!=(r|0)){continue}break}break p}r=0;if((w|0)!=1){B=w&-2;u=0;while(1){y=v+(r<<3)|0;j=G[t+(r<<2)>>2];v:{if((j|0)!=(A|0)){q=0;if((j|0)>=0){break v}G[p>>2]=-11;j=0;q=0;break v}G[o>>2]=1;j=c;q=d}G[y>>2]=j;G[y+4>>2]=q;y=r|1;j=G[t+(y<<2)>>2];w:{if((j|0)!=(A|0)){q=0;if((j|0)>=0){break w}G[p>>2]=-11;j=0;q=0;break w}G[o>>2]=1;j=c;q=d}y=v+(y<<3)|0;G[y>>2]=j;G[y+4>>2]=q;r=r+2|0;u=u+2|0;if((B|0)!=(u|0)){continue}break}}if(!(w&1)){break p}j=G[t+(r<<2)>>2];x:{if((j|0)!=(A|0)){if((j|0)>=0){c=j;d=0;break x}G[p>>2]=-11;c=0;d=0;break x}G[o>>2]=1}j=v+(r<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break p}if((w|0)<=0){break p}r=0;if((w|0)!=1){j=w&-2;u=0;while(1){d=v+(r<<3)|0;c=G[t+(r<<2)>>2];if((c|0)<0){G[p>>2]=-11;c=0}G[d>>2]=c;G[d+4>>2]=0;d=r|1;c=G[t+(d<<2)>>2];if((c|0)<0){G[p>>2]=-11;c=0}d=v+(d<<3)|0;G[d>>2]=c;G[d+4>>2]=0;r=r+2|0;u=u+2|0;if((j|0)!=(u|0)){continue}break}}if(!(w&1)){break p}d=v+(r<<3)|0;c=G[t+(r<<2)>>2];if((c|0)<0){G[p>>2]=-11;c=0}G[d>>2]=c;G[d+4>>2]=0}break f}t=x- -64|0;$d(a,u,j,w,r,t,p);A=H[x+29024|0];c=k;d=l;j=e+n|0;r=(e<<3)+m|0;z=L[x+29096>>3];C=L[x+29088>>3];q=z==1&C==0;y:{z:{if(!D){if(q){break z}u=0;if((w|0)<=0){break y}while(1){j=r+(u<<3)|0;A:{B:{s=+H[t+u|0]*z+C;if(s<0){G[p>>2]=-11;break B}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break A}if(!(s<0x10000000000000000&s>=0)){break B}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break A}d=0;c=0}G[j>>2]=c;G[j+4>>2]=d;u=u+1|0;if((w|0)!=(u|0)){continue}break}break y}if(!q){if((w|0)<=0){break y}u=0;while(1){q=H[t+u|0];C:{if((q|0)==(A|0)){G[o>>2]=1;if((D|0)==1){q=r+(u<<3)|0;G[q>>2]=c;G[q+4>>2]=d;break C}E[j+u|0]=1;break C}s=+(q>>>0)*z+C;if(s<0){G[p>>2]=-11;q=r+(u<<3)|0;G[q>>2]=0;G[q+4>>2]=0;break C}if(s>0x10000000000000000){G[p>>2]=-11;q=r+(u<<3)|0;G[q>>2]=-1;G[q+4>>2]=-1;break C}q=r+(u<<3)|0;D:{if(s<0x10000000000000000&s>=0){y=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;B=~~s>>>0;break D}y=0;B=0}G[q>>2]=B;G[q+4>>2]=y}u=u+1|0;if((w|0)!=(u|0)){continue}break}break y}if((w|0)<=0){break y}if((D|0)!=1){u=0;if((w|0)!=1){d=w&-2;v=0;while(1){c=H[t+u|0];E:{if((c|0)==(A|0)){G[o>>2]=1;E[j+u|0]=1;break E}q=r+(u<<3)|0;G[q>>2]=c;G[q+4>>2]=0}c=u|1;q=H[c+t|0];F:{if((q|0)!=(A|0)){c=r+(c<<3)|0;G[c>>2]=q;G[c+4>>2]=0;break F}G[o>>2]=1;E[c+j|0]=1}u=u+2|0;v=v+2|0;if((d|0)!=(v|0)){continue}break}}if(!(w&1)){break y}c=H[t+u|0];if((c|0)!=(A|0)){d=r+(u<<3)|0;G[d>>2]=c;G[d+4>>2]=0;break y}G[o>>2]=1;E[j+u|0]=1;break y}u=0;if((w|0)!=1){B=w&-2;v=0;while(1){y=r+(u<<3)|0;j=H[t+u|0];if((j|0)!=(A|0)){q=0}else{G[o>>2]=1;j=c;q=d}G[y>>2]=j;G[y+4>>2]=q;y=u|1;j=H[y+t|0];if((j|0)!=(A|0)){q=0}else{G[o>>2]=1;j=c;q=d}y=r+(y<<3)|0;G[y>>2]=j;G[y+4>>2]=q;u=u+2|0;v=v+2|0;if((B|0)!=(v|0)){continue}break}}if(!(w&1)){break y}j=H[t+u|0];G:{if((j|0)!=(A|0)){c=j;d=0;break G}G[o>>2]=1}j=r+(u<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break y}if((w|0)<=0){break y}j=0;u=0;if(w-1>>>0>=3){c=w&-4;v=0;while(1){d=r+(u<<3)|0;G[d>>2]=H[t+u|0];G[d+4>>2]=0;d=u|1;q=r+(d<<3)|0;G[q>>2]=H[d+t|0];G[q+4>>2]=0;d=u|2;q=r+(d<<3)|0;G[q>>2]=H[d+t|0];G[q+4>>2]=0;d=u|3;q=r+(d<<3)|0;G[q>>2]=H[d+t|0];G[q+4>>2]=0;u=u+4|0;v=v+4|0;if((c|0)!=(v|0)){continue}break}}c=w&3;if(!c){break y}while(1){d=r+(u<<3)|0;G[d>>2]=H[t+u|0];G[d+4>>2]=0;u=u+1|0;j=j+1|0;if((c|0)!=(j|0)){continue}break}}break f}y=x- -64|0;Pe(a,u,j,w,r,y,p);q=I[x+29024>>1];c=k;d=l;B=e+n|0;A=(e<<3)+m|0;z=L[x+29096>>3];C=L[x+29088>>3];j=z==1&C==0;H:{I:{if(!D){if(j){break I}t=0;if((w|0)<=0){break H}while(1){j=A+(t<<3)|0;J:{K:{s=+F[y+(t<<1)>>1]*z+C;if(s<-0x8000000000000000){G[p>>2]=-11;break K}if(s>0x8000000000000000){G[p>>2]=-11;d=2147483647;c=-1;break J}if(!(O(s)<0x8000000000000000)){break K}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break J}d=-2147483648;c=0}G[j>>2]=c;G[j+4>>2]=d;t=t+1|0;if((w|0)!=(t|0)){continue}break}break H}if(!j){if((w|0)<=0){break H}t=0;while(1){j=I[y+(t<<1)>>1];L:{if((j|0)==(q|0)){G[o>>2]=1;if((D|0)==1){j=A+(t<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break L}E[t+B|0]=1;break L}s=+(j<<16>>16)*z+C;if(s<-0x8000000000000000){G[p>>2]=-11;j=A+(t<<3)|0;G[j>>2]=0;G[j+4>>2]=-2147483648;break L}if(s>0x8000000000000000){G[p>>2]=-11;j=A+(t<<3)|0;G[j>>2]=-1;G[j+4>>2]=2147483647;break L}j=A+(t<<3)|0;M:{if(O(s)<0x8000000000000000){r=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;u=~~s>>>0;break M}r=-2147483648;u=0}G[j>>2]=u;G[j+4>>2]=r}t=t+1|0;if((w|0)!=(t|0)){continue}break}break H}if((w|0)<=0){break H}if((D|0)!=1){t=0;if((w|0)!=1){W=w&-2;v=0;while(1){c=I[y+(t<<1)>>1];N:{if((c|0)==(q|0)){G[o>>2]=1;E[t+B|0]=1;break N}r=c<<16;j=r>>31;d=A+(t<<3)|0;G[d>>2]=r>>16;G[d+4>>2]=j}d=t|1;c=I[y+(d<<1)>>1];O:{if((c|0)!=(q|0)){u=c<<16;r=u>>31;d=A+(d<<3)|0;G[d>>2]=u>>16;G[d+4>>2]=r;break O}G[o>>2]=1;E[d+B|0]=1}t=t+2|0;v=v+2|0;if((W|0)!=(v|0)){continue}break}}if(!(w&1)){break H}c=I[y+(t<<1)>>1];if((c|0)!=(q|0)){j=c<<16;u=j>>31;d=A+(t<<3)|0;G[d>>2]=j>>16;G[d+4>>2]=u;break H}G[o>>2]=1;E[t+B|0]=1;break H}t=0;if((w|0)!=1){W=w&-2;v=0;while(1){B=A+(t<<3)|0;j=I[y+(t<<1)>>1];P:{if((j|0)!=(q|0)){r=j<<16;j=r>>31;r=r>>16;break P}G[o>>2]=1;j=d;r=c}G[B>>2]=r;G[B+4>>2]=j;B=t|1;j=I[y+(B<<1)>>1];Q:{if((j|0)!=(q|0)){u=j<<16;r=u>>31;u=u>>16;j=r;break Q}G[o>>2]=1;u=c;j=d}r=A+(B<<3)|0;G[r>>2]=u;G[r+4>>2]=j;t=t+2|0;v=v+2|0;if((W|0)!=(v|0)){continue}break}}if(!(w&1)){break H}j=I[y+(t<<1)>>1];R:{if((j|0)!=(q|0)){j=j<<16;u=j>>31;c=j>>16;d=u;break R}G[o>>2]=1}j=A+(t<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break H}if((w|0)<=0){break H}t=0;if((w|0)!=1){j=w&-2;u=0;while(1){c=A+(t<<3)|0;d=F[y+(t<<1)>>1];S:{if((d|0)<0){G[p>>2]=-11;d=0;break S}d=d&65535}G[c>>2]=d;G[c+4>>2]=0;d=t|1;c=F[y+(d<<1)>>1];T:{if((c|0)>=0){c=c&65535;break T}G[p>>2]=-11;c=0}d=A+(d<<3)|0;G[d>>2]=c;G[d+4>>2]=0;t=t+2|0;u=u+2|0;if((j|0)!=(u|0)){continue}break}}if(!(w&1)){break H}c=A+(t<<3)|0;d=F[y+(t<<1)>>1];U:{if((d|0)>=0){d=d&65535;break U}G[p>>2]=-11;d=0}G[c>>2]=d;G[c+4>>2]=0}break f}q=x- -64|0;Uc(a,u,j,w,r,q,p);C=L[x+29096>>3];z=L[x+29088>>3];v=e+n|0;j=(e<<3)+m|0;r=0;u=0;V:{W:{if(!D){if(C==1&z==0){break W}if((w|0)<=0){break V}while(1){r=j+(u<<3)|0;X:{Y:{s=+K[q+(u<<2)>>2]*C+z;if(s<0){G[p>>2]=-11;break Y}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break X}if(!(s<0x10000000000000000&s>=0)){break Y}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break X}d=0;c=0}G[r>>2]=c;G[r+4>>2]=d;u=u+1|0;if((w|0)!=(u|0)){continue}break}break V}u=q+2|0;Z:{_:{if(!(C==1&z==0)){if((w|0)<=0){break V}if(!(z<0x10000000000000000&z>=0)){break _}d=O(z)>=1?~~(z>0?Q(S(z*2.3283064365386963e-10),4294967295):T((z-+(~~z>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~z>>>0;break Z}if((w|0)<=0){break V}while(1){$:{aa:{ba:{ca:{c=I[u>>1]&32640;switch(((c|0)==32640?1:!c<<1)|0){case 0:break aa;case 1:break ca;default:break ba}}G[o>>2]=1;if((D|0)==1){c=j+(r<<3)|0;G[c>>2]=k;G[c+4>>2]=l;break $}E[r+v|0]=1;break $}c=j+(r<<3)|0;G[c>>2]=0;G[c+4>>2]=0;break $}P=K[q+(r<<2)>>2];if(P>2]=-11;c=j+(r<<3)|0;G[c>>2]=0;G[c+4>>2]=0;break $}if(P>N(0x10000000000000000)){G[p>>2]=-11;c=j+(r<<3)|0;G[c>>2]=-1;G[c+4>>2]=-1;break $}c=j+(r<<3)|0;da:{if(P=N(0)){t=N(O(P))>=N(1)?~~(P>N(0)?N(Q(N(S(N(P*N(2.3283064365386963e-10)))),N(4294967296))):N(T(N(N(P-N(~~P>>>0>>>0))*N(2.3283064365386963e-10)))))>>>0:0;d=~~P>>>0;break da}t=0;d=0}G[c>>2]=d;G[c+4>>2]=t}u=u+4|0;r=r+1|0;if((w|0)!=(r|0)){continue}break}break V}d=0;c=0}while(1){ea:{fa:{ga:{ha:{t=I[u>>1]&32640;switch(((t|0)==32640?1:!t<<1)|0){case 0:break fa;case 1:break ha;default:break ga}}G[o>>2]=1;if((D|0)==1){t=j+(r<<3)|0;G[t>>2]=k;G[t+4>>2]=l;break ea}E[r+v|0]=1;break ea}if(z<0){G[p>>2]=-11;t=j+(r<<3)|0;G[t>>2]=0;G[t+4>>2]=0;break ea}if(z>0x10000000000000000){G[p>>2]=-11;t=j+(r<<3)|0;G[t>>2]=-1;G[t+4>>2]=-1;break ea}t=j+(r<<3)|0;G[t>>2]=c;G[t+4>>2]=d;break ea}s=+K[q+(r<<2)>>2]*C+z;if(s<0){G[p>>2]=-11;t=j+(r<<3)|0;G[t>>2]=0;G[t+4>>2]=0;break ea}if(s>0x10000000000000000){G[p>>2]=-11;t=j+(r<<3)|0;G[t>>2]=-1;G[t+4>>2]=-1;break ea}t=j+(r<<3)|0;ia:{if(s<0x10000000000000000&s>=0){y=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;B=~~s>>>0;break ia}y=0;B=0}G[t>>2]=B;G[t+4>>2]=y}u=u+4|0;r=r+1|0;if((w|0)!=(r|0)){continue}break}break V}if((w|0)<=0){break V}while(1){r=j+(u<<3)|0;ja:{ka:{P=K[q+(u<<2)>>2];if(P>2]=-11;break ka}if(P>N(0x10000000000000000)){G[p>>2]=-11;d=-1;c=-1;break ja}if(!(P=N(0))){break ka}d=N(O(P))>=N(1)?~~(P>N(0)?N(Q(N(S(N(P*N(2.3283064365386963e-10)))),N(4294967296))):N(T(N(N(P-N(~~P>>>0>>>0))*N(2.3283064365386963e-10)))))>>>0:0;c=~~P>>>0;break ja}d=0;c=0}G[r>>2]=c;G[r+4>>2]=d;u=u+1|0;if((w|0)!=(u|0)){continue}break}}break f}c=u;u=x- -64|0;Tc(a,c,j,w,r,u,p);C=L[x+29096>>3];z=L[x+29088>>3];v=e+n|0;q=(e<<3)+m|0;r=0;j=0;la:{ma:{if(!D){if(C==1&z==0){break ma}if((w|0)<=0){break la}while(1){na:{oa:{r=j<<3;s=L[r+u>>3]*C+z;if(s<0){G[p>>2]=-11;break oa}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break na}if(!(s<0x10000000000000000&s>=0)){break oa}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break na}d=0;c=0}r=q+r|0;G[r>>2]=c;G[r+4>>2]=d;j=j+1|0;if((w|0)!=(j|0)){continue}break}break la}j=u+6|0;pa:{qa:{if(!(C==1&z==0)){if((w|0)<=0){break la}if(!(z<0x10000000000000000&z>=0)){break qa}d=O(z)>=1?~~(z>0?Q(S(z*2.3283064365386963e-10),4294967295):T((z-+(~~z>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~z>>>0;break pa}if((w|0)<=0){break la}while(1){ra:{sa:{ta:{ua:{c=I[j>>1]&32752;switch(((c|0)==32752?1:!c<<1)|0){case 0:break sa;case 1:break ua;default:break ta}}G[o>>2]=1;if((D|0)==1){c=q+(r<<3)|0;G[c>>2]=k;G[c+4>>2]=l;break ra}E[r+v|0]=1;break ra}c=q+(r<<3)|0;G[c>>2]=0;G[c+4>>2]=0;break ra}c=r<<3;s=L[c+u>>3];if(s<0){G[p>>2]=-11;c=c+q|0;G[c>>2]=0;G[c+4>>2]=0;break ra}if(s>0x10000000000000000){G[p>>2]=-11;c=c+q|0;G[c>>2]=-1;G[c+4>>2]=-1;break ra}c=c+q|0;va:{if(s<0x10000000000000000&s>=0){t=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;d=~~s>>>0;break va}t=0;d=0}G[c>>2]=d;G[c+4>>2]=t}j=j+8|0;r=r+1|0;if((w|0)!=(r|0)){continue}break}break la}d=0;c=0}while(1){wa:{xa:{ya:{za:{t=I[j>>1]&32752;switch(((t|0)==32752?1:!t<<1)|0){case 0:break xa;case 1:break za;default:break ya}}G[o>>2]=1;if((D|0)==1){t=q+(r<<3)|0;G[t>>2]=k;G[t+4>>2]=l;break wa}E[r+v|0]=1;break wa}if(z<0){G[p>>2]=-11;t=q+(r<<3)|0;G[t>>2]=0;G[t+4>>2]=0;break wa}if(z>0x10000000000000000){G[p>>2]=-11;t=q+(r<<3)|0;G[t>>2]=-1;G[t+4>>2]=-1;break wa}t=q+(r<<3)|0;G[t>>2]=c;G[t+4>>2]=d;break wa}t=r<<3;s=L[t+u>>3]*C+z;if(s<0){G[p>>2]=-11;t=q+t|0;G[t>>2]=0;G[t+4>>2]=0;break wa}if(s>0x10000000000000000){G[p>>2]=-11;t=q+(r<<3)|0;G[t>>2]=-1;G[t+4>>2]=-1;break wa}t=q+(r<<3)|0;Aa:{if(s<0x10000000000000000&s>=0){y=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;B=~~s>>>0;break Aa}y=0;B=0}G[t>>2]=B;G[t+4>>2]=y}j=j+8|0;r=r+1|0;if((w|0)!=(r|0)){continue}break}break la}if((w|0)<=0){break la}while(1){Ba:{Ca:{r=j<<3;s=L[r+u>>3];if(s<0){G[p>>2]=-11;break Ca}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break Ba}if(!(s<0x10000000000000000&s>=0)){break Ca}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break Ba}d=0;c=0}r=q+r|0;G[r>>2]=c;G[r+4>>2]=d;j=j+1|0;if((w|0)!=(j|0)){continue}break}}break f}Jb(a,u,j,0,p);c=G[x+29060>>2];d=G[x+29064>>2];Da:{if((c|0)==(d|0)){c=M(c,w);ic(a,c,c>>31,x- -64|0,p);break Da}Rd(a,d,w,c-d|0,x- -64|0,p)}u=x- -64|0;C=L[x+29096>>3];$=L[x+29088>>3];aa=G[x+29064>>2];ba=e+n|0;y=(e<<3)+m|0;A=0;v=Fa-112|0;Fa=v;W=x+28864|0;ca=Va(W);if((w|0)>0){while(1){Ea:{j=u+aa|0;Z=H[j|0];E[j|0]=0;c=u;Fa:{Ga:{if(H[W|0]==1){break Ga}if(fb(W,u,ca)){break Ga}c=j;if(!D){break Fa}G[o>>2]=1;if((D|0)==1){c=(A<<3)+y|0;G[c>>2]=k;G[c+4>>2]=l;c=j;break Fa}E[A+ba|0]=1;break Fa}while(1){d=H[c|0];if((d|0)==32){c=c+1|0;continue}break}t=1;Ha:{switch(d-43|0){case 0:case 2:while(1){q=H[c+1|0];c=c+1|0;if((q|0)==32){continue}break};t=(d|0)==45?-1:1;d=q;break;default:break Ha}}z=0;if((d-48&255)>>>0<10){while(1){s=z*10+ +(d<<24>>24);q=c;while(1){d=H[q+1|0];c=q+1|0;q=c;if((d|0)==32){continue}break}z=s+-48;if((d-48&255)>>>0<=9){continue}break}}s=R;Ia:{Ja:{switch(d-44|0){case 0:case 2:break Ja;default:break Ia}}q=c;while(1){d=H[q+1|0];c=q+1|0;q=c;if((d|0)==32){continue}break}s=1;if((d-48&255)>>>0>=10){break Ia}while(1){z=z*10+ +(d<<24>>24)+-48;q=c;while(1){d=H[q+1|0];c=q+1|0;q=c;if((d|0)==32){continue}break}s=s*10;if((d-48&255)>>>0<=9){continue}break}}Ka:{if((d&254)!=68){B=1;q=0;break Ka}while(1){B=1;q=c;c=c+1|0;d=H[q+1|0];if((d|0)==32){continue}break}La:{switch(d-43|0){case 0:case 2:q=q+2|0;while(1){c=q;q=c+1|0;r=H[c|0];if((r|0)==32){continue}break};B=(d|0)==45?-1:1;d=r;break;default:break La}}q=0;if((d-48&255)>>>0>=10){break Ka}while(1){r=d;da=M(q,10)-48|0;q=c;while(1){d=H[q+1|0];c=q+1|0;q=c;if((d|0)==32){continue}break}q=da+(r<<24>>24)|0;if((d-48&255)>>>0<=9){continue}break}}if(d){G[v+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[v+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[v+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[v+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[v+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[v+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[v+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[v+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[v+20>>2]=c;c=v+16|0;Ua(c);G[v>>2]=u;Ya(c,81,43022,v);Ua(c);E[j|0]=Z;G[p>>2]=409;break Ea}s=z*+(t|0)/s*$b(10,+(M(q,B)|0))*C+$;Ma:{if(s<0){G[p>>2]=-11;d=(A<<3)+y|0;G[d>>2]=0;G[d+4>>2]=0;break Ma}if(s>0x10000000000000000){G[p>>2]=-11;d=(A<<3)+y|0;G[d>>2]=-1;G[d+4>>2]=-1;break Ma}d=(A<<3)+y|0;Na:{if(s<0x10000000000000000&s>=0){u=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;q=~~s>>>0;break Na}u=0;q=0}G[d>>2]=q;G[d+4>>2]=u}}u=c;E[j|0]=Z;A=A+1|0;if((w|0)!=(A|0)){continue}}break}}Fa=v+112|0;break f}G[x>>2]=b;G[x+4>>2]=x+28992;a=x+28896|0;Ya(a,81,8924,x);Ua(a);q=311;if(G[x+29076>>2]==1){break d}q=312;break d}t=(e<<3)+m|0;Tc(a,u,j,w,r,t,p);u=G[x+29024>>2];A=G[x+29028>>2];c=k;d=l;j=e+n|0;z=L[x+29096>>3];C=L[x+29088>>3];q=z==1&C==0x8000000000000000;Oa:{Pa:{if(!D){if(q){if((w|0)<=0){break Oa}u=0;v=0;if(w-1>>>0>=3){d=w&-4;j=0;while(1){c=v<<3;q=c+t|0;r=c+t|0;A=G[r>>2];r=G[r+4>>2]^-2147483648;G[q>>2]=A;G[q+4>>2]=r;q=c|8;r=q+t|0;q=q+t|0;A=G[q>>2];q=G[q+4>>2]^-2147483648;G[r>>2]=A;G[r+4>>2]=q;q=c|16;r=q+t|0;q=q+t|0;A=G[q>>2];q=G[q+4>>2]^-2147483648;G[r>>2]=A;G[r+4>>2]=q;c=c|24;q=c+t|0;c=c+t|0;r=G[c>>2];c=G[c+4>>2]^-2147483648;G[q>>2]=r;G[q+4>>2]=c;v=v+4|0;j=j+4|0;if((d|0)!=(j|0)){continue}break}}c=w&3;if(!c){break Oa}while(1){d=v<<3;j=d+t|0;d=d+t|0;q=G[d>>2];d=G[d+4>>2]^-2147483648;G[j>>2]=q;G[j+4>>2]=d;v=v+1|0;u=u+1|0;if((c|0)!=(u|0)){continue}break}break Oa}if(z==1&C==0){break Pa}v=0;if((w|0)<=0){break Oa}while(1){Qa:{Ra:{j=v<<3;c=j+t|0;s=(+J[c>>2]+ +G[c+4>>2]*4294967296)*z+C;if(s<0){G[p>>2]=-11;break Ra}if(s>0x10000000000000000){G[p>>2]=-11;d=-1;c=-1;break Qa}if(!(s<0x10000000000000000&s>=0)){break Ra}d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~s>>>0;break Qa}d=0;c=0}j=j+t|0;G[j>>2]=c;G[j+4>>2]=d;v=v+1|0;if((w|0)!=(v|0)){continue}break}break Oa}Sa:{Ta:{Ua:{if(q){if((w|0)<=0){break Oa}if((D|0)==1){break Sa}v=0;if((w|0)!=1){c=w&-2;r=0;while(1){d=v<<3;q=d+t|0;y=G[q>>2];q=G[q+4>>2];Va:{if((y|0)==(u|0)&(q|0)==(A|0)){G[o>>2]=1;E[j+v|0]=1;break Va}d=d+t|0;G[d>>2]=y;G[d+4>>2]=q^-2147483648}d=v|1;q=d<<3;y=q+t|0;B=G[y>>2];y=G[y+4>>2];Wa:{if((B|0)!=(u|0)|(y|0)!=(A|0)){d=q+t|0;G[d>>2]=B;G[d+4>>2]=y^-2147483648;break Wa}G[o>>2]=1;E[d+j|0]=1}v=v+2|0;r=r+2|0;if((c|0)!=(r|0)){continue}break}}if(!(w&1)){break Oa}c=v<<3;d=c+t|0;q=G[d>>2];d=G[d+4>>2];if((q|0)==(u|0)&(d|0)==(A|0)){break Ua}c=c+t|0;G[c>>2]=q;G[c+4>>2]=d^-2147483648;break Oa}if(z==1&C==0){break Ta}if((w|0)<=0){break Oa}v=0;while(1){q=v<<3;r=q+t|0;y=G[r>>2];r=G[r+4>>2];Xa:{if((y|0)==(u|0)&(r|0)==(A|0)){G[o>>2]=1;if((D|0)==1){q=q+t|0;G[q>>2]=c;G[q+4>>2]=d;break Xa}E[j+v|0]=1;break Xa}s=(+(y>>>0)+ +(r|0)*4294967296)*z+C;if(s<0){G[p>>2]=-11;q=q+t|0;G[q>>2]=0;G[q+4>>2]=0;break Xa}if(s>0x10000000000000000){G[p>>2]=-11;q=q+t|0;G[q>>2]=-1;G[q+4>>2]=-1;break Xa}q=q+t|0;Ya:{if(s<0x10000000000000000&s>=0){y=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;r=~~s>>>0;break Ya}y=0;r=0}G[q>>2]=r;G[q+4>>2]=y}v=v+1|0;if((w|0)!=(v|0)){continue}break}break Oa}G[o>>2]=1;E[j+v|0]=1;break Oa}if((w|0)<=0){break Oa}v=0;while(1){q=v<<3;r=q+t|0;y=G[r>>2];r=G[r+4>>2];Za:{if((y|0)==(u|0)&(r|0)==(A|0)){G[o>>2]=1;if((D|0)==1){q=q+t|0;G[q>>2]=c;G[q+4>>2]=d;break Za}E[j+v|0]=1;break Za}if((r|0)<0){G[p>>2]=-11;q=q+t|0;G[q>>2]=0;G[q+4>>2]=0;break Za}q=q+t|0;G[q>>2]=y;G[q+4>>2]=r}v=v+1|0;if((w|0)!=(v|0)){continue}break}break Oa}v=0;if((w|0)!=1){y=w&-2;r=0;while(1){B=v<<3;q=B+t|0;j=G[q>>2];q=G[q+4>>2];_a:{if((j|0)!=(u|0)|(q|0)!=(A|0)){q=q^-2147483648;break _a}G[o>>2]=1;j=c;q=d}B=t+B|0;G[B>>2]=j;G[B+4>>2]=q;B=(v|1)<<3;q=B+t|0;j=G[q>>2];q=G[q+4>>2];$a:{if((j|0)!=(u|0)|(q|0)!=(A|0)){q=q^-2147483648;break $a}G[o>>2]=1;j=c;q=d}B=t+B|0;G[B>>2]=j;G[B+4>>2]=q;v=v+2|0;r=r+2|0;if((y|0)!=(r|0)){continue}break}}if(!(w&1)){break Oa}q=t+(v<<3)|0;j=G[q>>2];q=G[q+4>>2];ab:{if((j|0)!=(u|0)|(q|0)!=(A|0)){c=j;d=q^-2147483648;break ab}G[o>>2]=1}j=t+(v<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break Oa}if((w|0)<=0){break Oa}v=0;if((w|0)!=1){j=w&-2;r=0;while(1){q=v<<3;c=q+t|0;d=G[c+4>>2];c=G[c>>2];q=q+t|0;if((d|0)<0){G[p>>2]=-11;d=0;c=0}G[q>>2]=c;G[q+4>>2]=d;q=(v|1)<<3;c=q+t|0;d=G[c+4>>2];c=G[c>>2];q=q+t|0;if((d|0)<0){G[p>>2]=-11;d=0;c=0}G[q>>2]=c;G[q+4>>2]=d;v=v+2|0;r=r+2|0;if((j|0)!=(r|0)){continue}break}}if(!(w&1)){break Oa}j=v<<3;c=j+t|0;d=G[c+4>>2];c=G[c>>2];j=j+t|0;if((d|0)<0){G[p>>2]=-11;d=0;c=0}G[j>>2]=c;G[j+4>>2]=d}}q=G[p>>2];if((q|0)>0){s=+(e>>>0)+ +(f|0)*4294967296;R=s+1;s=s+ +(w|0);bb:{if(G[x+29076>>2]>0){G[x+32>>2]=b;L[x+24>>3]=s;L[x+16>>3]=R;Ya(x+28896|0,81,46757,x+16|0);break bb}L[x+56>>3]=s;L[x+48>>3]=R;Ya(x+28896|0,81,46698,x+48|0)}Ua(x+28896|0);q=G[p>>2];break a}c=w;u=c>>31;j=c;h=h-((g>>>0>>0)+u|0)|0;g=g-c|0;if(h|g){c=M(i,w);q=c;d=c+G[x+29032>>2]|0;c=G[x+29036>>2]+(c>>31)|0;c=d>>>0>>0?c+1|0:c;G[x+29032>>2]=d;q=c;G[x+29036>>2]=c;c=e+j|0;j=f+u|0;j=c>>>0>>0?j+1|0:j;e=c;f=j;u=G[x+29052>>2];c=u;w=G[x+29048>>2];if((q|0)>=(c|0)&d>>>0>=w>>>0|(c|0)<(q|0)){j=Bu(d,q,w,u);c=U+j|0;r=Ia;V=V+r|0;V=c>>>0>>0?V+1|0:V;U=c;c=Au(j,r,w,u);G[x+29032>>2]=d-c;G[x+29036>>2]=q-(Ia+(c>>>0>d>>>0)|0);continue}if((q|0)>0|(q|0)>=0){continue}j=U;U=Bu(d^-1,q^-1,w,u)+1|0;c=Ia;c=U?c:c+1|0;r=U;U=j-r|0;V=V-((j>>>0>>0)+c|0)|0;c=Au(r,c,w,u)+d|0;j=q+Ia|0;G[x+29032>>2]=c;G[x+29036>>2]=c>>>0>>0?j+1|0:j;continue}break}if((q|0)!=-11){break a}Ua(44994);q=412}G[p>>2]=q}Fa=x+29104|0;return q}function Vq(a,b){a=a|0;b=b|0;var 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,A=0,B=0,C=0,D=0,F=0,I=0,K=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=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;c=Fa-82176|0;Fa=c;G[321982]=-1571644103;G[321983]=1066524486;G[321985]=5;G[47589]=1;r=G[29763];G[321435]=r;G[47590]=0;E[1287936]=0;x=.01;F=50;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{while(1){B=d;d=1;n:{o:{p:{q:{r:{p=of(a,b,36679);switch(p-100|0){case 17:continue;case 15:break n;case 16:break o;case 11:break p;case 5:break q;case 0:break r;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 10:case 12:case 13:case 14:break i;default:break m}}E[1287936]=1;d=B;continue}d=nc(G[321433],c+1252|0,0);F=G[321433];if(J[c+1252>>2]>>0){break l}F=(d|0)>1?d:1;d=B;continue}p=nc(G[321433],c+1252|0,0);G[321985]=p;d=G[321433];if(J[c+1252>>2]>>0){break k}d=B;if((p|0)>=0){continue}G[321985]=0;continue}x=vb(G[321433],c+1252|0);d=G[321433];if(J[c+1252>>2]>>0){break j}d=B;if(!(x<0)){continue}x=0;continue}p=ac(G[321433],49010);G[321435]=p;d=B;if(p){continue}break}G[c+1248>>2]=G[321433];_a(0,80991,c+1248|0);break a}if((p|0)!=-1){break i}d=a;a=G[47589];if((d-a|0)<=1){break h}a=(a<<2)+b|0;p=Za(c+1536|0,G[a>>2]);m=Za(c+1280|0,G[a+4>>2]);Lf(p,1,0);g=Fa-480|0;Fa=g;s:{l=ac(p,13287);if(l){G[322016]=0;G[321992]=0;G[322070]=0;G[322071]=0;G[322072]=0;G[322073]=0;G[322074]=0;G[322075]=0;G[322076]=0;G[322077]=0;G[322078]=0;G[322079]=0;G[322080]=0;E[1287984]=0;E[1288080]=0;E[1288160]=0;E[1288336]=0;E[1288416]=0;E[1288496]=0;E[1288656]=0;E[1288576]=0;E[1288736]=0;E[1288816]=0;E[1288896]=0;E[1288976]=0;E[1289056]=0;if(!vc(g+224|0,256,l)){break s}t:while(1){b=g+224|0;s=b+Va(b)|0;while(1){a=b;f=H[b|0];if((f|0)==32){b=a+1|0;if(a>>>0>>0){continue}}break}d=a;while(1){b=f&255;if(!(!((b|0)==32|(b|0)==61)&d>>>0>>0)){b=d;while(1){f=(f&255)-32|0;if(!(f>>>0>29|!(1<>>0>=s>>>0)){f=H[b+1|0];b=b+1|0;continue}break}E[d|0]=0;f=(H[b|0]==39)+b|0;while(1){d=H[f|0]-10|0;if(!(f>>>0>=s>>>0|(1<>>0<=29:0))){f=f+1|0;continue}break}E[f|0]=0;u:{v:{if(!Xa(a,41234)){f=1287968;a=1287984;break v}if(!Xa(a,40826)){f=1288064;a=1288080;break v}if(!Xa(a,40896)){f=1288280;a=1288160;break v}if(!Xa(a,41174)){f=1288284;a=1288336;break v}if(!Xa(a,40778)){f=1288288;a=1288416;break v}if(!Xa(a,41149)){f=1288292;a=1288496;break v}if(!Xa(a,40759)){f=1288296;a=1288576;break v}if(!Xa(a,41180)){f=1288300;a=1288656;break v}if(!Xa(a,40784)){f=1288304;a=1288736;break v}if(!Xa(a,41155)){f=1288308;a=1288816;break v}if(!Xa(a,40765)){f=1288312;a=1288896;break v}if(!Xa(a,34948)){f=1288316;a=1288976;break v}if(Xa(a,32863)){break u}f=1288320;a=1289056}G[f>>2]=1;Za(a,b)}if(vc(g+224|0,256,l)){continue t}break s}f=H[d+1|0];d=d+1|0;continue}}}G[g>>2]=p;_a(G[321435],80820,g);break a}if(H[1287936]){yb(40077);if(G[321992]){G[g+208>>2]=1287984;kb(76419,g+208|0)}if(G[322016]){G[g+192>>2]=1288080;kb(76387,g+192|0)}if(G[322070]){G[g+176>>2]=1288160;kb(76403,g+176|0)}if(G[322071]){G[g+160>>2]=1288336;kb(76617,g+160|0)}if(G[322072]){G[g+144>>2]=1288416;kb(76553,g+144|0)}if(G[322073]){G[g+128>>2]=1288496;kb(76585,g+128|0)}if(G[322074]){G[g+112>>2]=1288576;kb(76521,g+112|0)}if(G[322075]){G[g+96>>2]=1288656;kb(76633,g+96|0)}if(G[322076]){G[g+80>>2]=1288736;kb(76569,g+80|0)}if(G[322077]){G[g+64>>2]=1288816;kb(76601,g- -64|0)}if(G[322078]){G[g+48>>2]=1288896;kb(76537,g+48|0)}if(G[322079]){G[g+32>>2]=1288976;kb(76435,g+32|0)}if(G[322080]){G[g+16>>2]=1289056;kb(76260,g+16|0)}id()}Fa=g+480|0;a=ac(m,49010);G[321986]=a;if(!a){break g}if(H[1287936]){yb(44716);yb(63237);yb(51058);$a(r)}s=G[321985];a=(s<<2)+4|0;ga=1287948,ha=ab(a),G[ga>>2]=ha;ga=1287952,ha=ab(a),G[ga>>2]=ha;w:{if((s|0)>0){q=s&-4;t=s&3;i=s-1|0;v=(s<<3)+8|0;b=0;while(1){g=ab(v);d=b<<2;G[d+G[321987]>>2]=g;g=ab(v);G[d+G[321988]>>2]=g;g=G[d+G[321988]>>2];m=G[d+G[321987]>>2];d=0;f=0;if(i>>>0>=3){while(1){l=d<<3;j=l+m|0;G[j>>2]=0;G[j+4>>2]=0;j=g+l|0;G[j>>2]=0;G[j+4>>2]=0;j=l|8;w=j+m|0;G[w>>2]=0;G[w+4>>2]=0;j=g+j|0;G[j>>2]=0;G[j+4>>2]=0;j=l|16;w=j+m|0;G[w>>2]=0;G[w+4>>2]=0;j=g+j|0;G[j>>2]=0;G[j+4>>2]=0;l=l|24;j=l+m|0;G[j>>2]=0;G[j+4>>2]=0;l=g+l|0;G[l>>2]=0;G[l+4>>2]=0;d=d+4|0;f=f+4|0;if((q|0)!=(f|0)){continue}break}}f=0;if(t){while(1){l=d<<3;j=l+m|0;G[j>>2]=0;G[j+4>>2]=0;l=g+l|0;G[l>>2]=0;G[l+4>>2]=0;d=d+1|0;f=f+1|0;if((t|0)!=(f|0)){continue}break}}b=b+1|0;if((s|0)!=(b|0)){continue}break}l=0;ga=1287956,ha=ab(a),G[ga>>2]=ha;ga=1287960,ha=ab(a),G[ga>>2]=ha;if((s|0)<=0){break w}q=s&-4;t=s&3;v=(s<<3)+8|0;while(1){f=0;b=ab(v);a=l<<2;G[a+G[321989]>>2]=b;b=ab(v);G[a+G[321990]>>2]=b;b=G[a+G[321990]>>2];g=G[a+G[321989]>>2];d=0;a=0;if(i>>>0>=3){while(1){m=d<<3;j=m+g|0;G[j>>2]=0;G[j+4>>2]=0;j=b+m|0;G[j>>2]=0;G[j+4>>2]=0;j=m|8;w=j+g|0;G[w>>2]=0;G[w+4>>2]=0;j=b+j|0;G[j>>2]=0;G[j+4>>2]=0;j=m|16;w=j+g|0;G[w>>2]=0;G[w+4>>2]=0;j=b+j|0;G[j>>2]=0;G[j+4>>2]=0;m=m|24;j=m+g|0;G[j>>2]=0;G[j+4>>2]=0;m=b+m|0;G[m>>2]=0;G[m+4>>2]=0;d=d+4|0;a=a+4|0;if((q|0)!=(a|0)){continue}break}}if(t){while(1){a=d<<3;m=a+g|0;G[m>>2]=0;G[m+4>>2]=0;a=a+b|0;G[a>>2]=0;G[a+4>>2]=0;d=d+1|0;f=f+1|0;if((t|0)!=(f|0)){continue}break}}l=l+1|0;if((s|0)!=(l|0)){continue}break}break w}ga=1287956,ha=ab(a),G[ga>>2]=ha;ga=1287960,ha=ab(a),G[ga>>2]=ha}if(H[1287936]){yb(44488);$a(r);s=G[321985]}l=M(s,s);w=l<<1;a=w|1;b=a<<2;m=ab(b);t=ab(b);if(l){b=w>>>0>1?w:1;a=a<<3;d=0;while(1){g=d<<2;ga=g+m|0,ha=ab(16),G[ga>>2]=ha;ga=g+t|0,ha=ab(a),G[ga>>2]=ha;d=d+1|0;if((b|0)!=(d|0)){continue}break}}g=ac(p,13287);if(!g){break f}E[c+1824|0]=0;a=0;while(1){if(vc(c+81824|0,256,g)){b=(Va(c+81824|0)+c|0)+81823|0;if(H[b|0]==10){E[b|0]=0}b=(Va(c+81824|0)+c|0)+81823|0;if(H[b|0]==13){E[b|0]=0}d=Va(c+1824|0);b=Va(c+81824|0);x:{if((b|0)>0){bb(d+(c+1824|0)|0,c+81824|0,b);if(b>>>0>79){break x}}cb(c+1824+(b+d)|0,32,80-b|0)}E[(c+d|0)+1904|0]=0;a=a+1|0;if((a|0)!=1e3){continue}}break}if(H[1287936]){yb(86179);$a(r);b=Va(c+1824|0);a=0;while(1){d=0;cb(c+82080|0,0,80);p=M(a,80);while(1){y:{i=d+p|0;f=(i|0)>(b|0);if(f){break y}E[(c+82080|0)+d|0]=H[i+(c+1824|0)|0];i=d|1;v=i+p|0;f=(v|0)>(b|0);if(f){break y}E[i+(c+82080|0)|0]=H[v+(c+1824|0)|0];d=d+2|0;if((d|0)!=80){continue}}break}E[c+82160|0]=0;d=80;while(1){z:{p=(c+82080|0)+d|0;if((H[p|0]|32)!=32){break z}E[p|0]=0;p=(c+d|0)+82079|0;if((H[p|0]|32)!=32){break z}E[p|0]=0;p=d-2|0;i=p+(c+82080|0)|0;if((H[i|0]|32)!=32){break z}E[i|0]=0;d=d-3|0;if(p){continue}}break}a=a+1|0;if(H[c+82080|0]){G[c+1184>>2]=a;G[c+1188>>2]=c+82080;kb(69623,c+1184|0)}if(!f){continue}break}id();$a(r)}a=rd(c+1824|0);G[321991]=a;if(!a){break e}Wg(a,0);if(H[1287936]){yb(73546);$a(r)}G[c+1264>>2]=0;cc(G[321991],.5,.5,c+1808|0,c+1800|0);Bd(G[321991],L[c+1808>>3],L[c+1800>>3],c+82080|0,c+1816|0,c+1264|0);h=L[c+82080>>3]+-.5;L[161033]=h;L[161034]=L[c+1816>>3]+-.5;if(H[1287936]){L[c+1168>>3]=h;gb(72339,c+1168|0);L[c+1152>>3]=L[161034];gb(90238,c+1152|0);$a(r)}Hb(g);p=0;d=G[321991];if(G[d+3260>>2]==31){G[321992]=1;L[c+1136>>3]=L[d+760>>3];Eb(1287984,19360,c+1136|0);G[322016]=1;L[c+1120>>3]=L[G[321991]+768>>3];Eb(1288080,19360,c+1120|0);G[321992]=1;L[c+1104>>3]=L[G[321991]+48>>3];Eb(1288160,19360,c+1104|0);d=G[321991]}h=(L[d+136>>3]+1)*.5;L[c+1824>>3]=h;e=(L[d+144>>3]+1)*.5;L[c+81824>>3]=e;cc(d,h,e,c+1808|0,c+1800|0);o=sb(1287984);a=c+1264|0;b=c+1256|0;cc(G[321991],L[c+1824>>3]+1,L[c+81824>>3],a,b);k=L[c+1264>>3];h=L[160991];n=L[c+1256>>3]*h;e=eb(n);y=k*h;P=ib(y);C=L[c+1808>>3];Q=h*L[c+1800>>3];k=eb(Q);C=C*h;$=ib(C);y=eb(y);C=eb(C);h=Sc(ib(Q)*ib(n)+(C*k*(y*e)+$*k*(P*e)))/h;L[161030]=o<0?-h:h;o=sb(1288080);cc(G[321991],L[c+1824>>3],L[c+81824>>3]+1,a,b);k=L[c+1264>>3];h=L[160991];n=L[c+1256>>3]*h;e=eb(n);y=k*h;P=ib(y);C=L[c+1808>>3];Q=h*L[c+1800>>3];k=eb(Q);C=C*h;$=ib(C);y=eb(y);C=eb(C);h=Sc(ib(Q)*ib(n)+(C*k*(y*e)+$*k*(P*e)))/h;L[161031]=o<0?-h:h;a=G[321991];h=L[a+144>>3];e=L[a+136>>3];A:{if(O(e)<2147483648){a=~~e;break A}a=-2147483648}d=h<+(a|0);ea=1;if(O(h)<2147483648){b=~~h}else{b=-2147483648}h=+((d?b:a)|0)*.125;B:{if(O(h)<2147483648){a=~~h;break B}a=-2147483648}v=(a|0)>1?a:1;h=+(a|0)/20;C:{if(O(h)<2147483648){a=~~h;break C}a=-2147483648}X=(a|0)>1?a:1;u=w>>>0>1?w:1;Y=u&2147483644;R=u&3;fa=u-1|0;I=u<<3;Z=l-1|0;_=t+(Z<<2)|0;Wh();aa=c+1040|0;S=c+1048|0;T=c+1056|0;U=c+1064|0;D=c+1072|0;N=c+1080|0;D:{while(1){E:{if(!l){break E}a=0;d=0;f=0;if(fa>>>0>=3){while(1){b=d<<2;g=G[b+m>>2];G[g>>2]=0;G[g+4>>2]=0;cb(G[b+t>>2],0,I);g=b|4;i=G[g+m>>2];G[i>>2]=0;G[i+4>>2]=0;cb(G[g+t>>2],0,I);g=b|8;i=G[g+m>>2];G[i>>2]=0;G[i+4>>2]=0;cb(G[g+t>>2],0,I);b=b|12;g=G[b+m>>2];G[g>>2]=0;G[g+4>>2]=0;cb(G[b+t>>2],0,I);d=d+4|0;f=f+4|0;if((Y|0)!=(f|0)){continue}break}}if(!R){break E}while(1){b=d<<2;g=G[b+m>>2];G[g>>2]=0;G[g+4>>2]=0;cb(G[b+t>>2],0,I);d=d+1|0;a=a+1|0;if((R|0)!=(a|0)){continue}break}}if(H[1287936]){G[c+1088>>2]=p;kb(78391,c+1088|0);$a(r)}q=0;e=0;d=G[321991];if(L[d+136>>3]+1>0){while(1){if(L[d+144>>3]+1>0){h=e+-.5;j=0;e=0;while(1){e=e+-.5;cc(d,h,e,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[322064],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);k=L[c+1824>>3];o=h-k;if(H[1287936]){L[aa>>3]=L[c+82080>>3];L[S>>3]=L[c+1816>>3];L[T>>3]=k;L[U>>3]=L[c+81824>>3];L[D>>3]=o;G[N>>2]=G[c+1276>>2];L[c+1024>>3]=h;L[c+1032>>3]=e;gb(88178,c+1024|0);$a(r)}F:{if(!(G[c+1276>>2]?B:1)){break F}g=G[321985];if((g|0)<=0){break F}ba=g&-2;ca=g&1;i=0;while(1){da=M(i,s);n=$b(h,+(i|0));f=0;while(1){k=$b(e,+(f|0));a=f+da<<2;b=G[a+m>>2];L[b>>3]=n*k*o+L[b>>3];z=G[a+t>>2];b=0;while(1){A=M(b,s);k=$b(h,+(b+i|0));d=0;a=0;if((g|0)!=1){while(1){K=z+(d+A<<3)|0;ga=K,ia=k*$b(e,+(d+f|0))+L[K>>3],L[ga>>3]=ia;K=d|1;V=z+(K+A<<3)|0;ga=V,ia=k*$b(e,+(f+K|0))+L[V>>3],L[ga>>3]=ia;d=d+2|0;a=a+2|0;if((ba|0)!=(a|0)){continue}break}}if(ca){a=z+(d+A<<3)|0;ga=a,ia=k*$b(e,+(d+f|0))+L[a>>3],L[ga>>3]=ia}b=b+1|0;if((g|0)!=(b|0)){continue}break}f=f+1|0;if((g|0)!=(f|0)){continue}break}i=i+1|0;if((g|0)!=(i|0)){continue}break}}j=j+v|0;e=+(j|0);d=G[321991];if(e>3]+1){continue}break}}q=q+v|0;e=+(q|0);if(e>3]+1){continue}break}}e=0;q=0;if(H[1287936]){G[c+1008>>2]=p;kb(78297,c+1008|0);$a(r);d=G[321991]}if(L[d+136>>3]+1>0){while(1){if(L[d+144>>3]+1>0){k=e+-.5;j=0;e=0;while(1){h=e+-.5;cc(d,k,h,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[322064],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);o=L[c+81824>>3];e=h-o;if(H[1287936]){L[c+960>>3]=L[c+82080>>3];L[c+968>>3]=L[c+1816>>3];L[c+976>>3]=L[c+1824>>3];L[c+984>>3]=o;L[c+992>>3]=e;G[c+1e3>>2]=G[c+1276>>2];L[c+944>>3]=k;L[c+952>>3]=h;gb(88178,c+944|0);$a(r)}G:{if(!(G[c+1276>>2]?B:1)){break G}g=G[321985];if((g|0)<=0){break G}ba=g&-2;ca=g&1;i=0;while(1){da=l+M(i,s)|0;o=+(i|0);f=0;while(1){h=L[c+81824>>3];n=$b(L[c+1824>>3],o);h=$b(h,+(f|0));a=f+da<<2;b=G[a+m>>2];L[b>>3]=n*h*e+L[b>>3];z=G[a+t>>2];b=0;while(1){A=l+M(b,s)|0;h=+(b+i|0);d=0;a=0;if((g|0)!=1){while(1){n=L[c+81824>>3];K=z+(d+A<<3)|0;ga=K,ia=$b(L[c+1824>>3],h)*$b(n,+(d+f|0))+L[K>>3],L[ga>>3]=ia;n=L[c+81824>>3];K=d|1;V=z+(K+A<<3)|0;ga=V,ia=$b(L[c+1824>>3],h)*$b(n,+(f+K|0))+L[V>>3],L[ga>>3]=ia;d=d+2|0;a=a+2|0;if((ba|0)!=(a|0)){continue}break}}if(ca){n=L[c+81824>>3];a=z+(d+A<<3)|0;ga=a,ia=$b(L[c+1824>>3],h)*$b(n,+(d+f|0))+L[a>>3],L[ga>>3]=ia}b=b+1|0;if((g|0)!=(b|0)){continue}break}f=f+1|0;if((g|0)!=(f|0)){continue}break}i=i+1|0;if((g|0)!=(i|0)){continue}break}}j=j+v|0;e=+(j|0);d=G[321991];if(e>3]+1){continue}break}}q=q+v|0;e=+(q|0);if(e>3]+1){continue}break}}if(L[G[_>>2]+(Z<<3)>>3]==0){break d}if(H[1287936]){yb(40053);a=0;if(l){while(1){yb(36468);b=a<<2;g=G[b+t>>2];d=0;while(1){L[c+928>>3]=L[g+(d<<3)>>3];gb(66481,c+928|0);d=d+1|0;if((l|0)!=(d|0)){continue}break}yb(36690);L[c+912>>3]=L[G[b+m>>2]>>3];gb(73117,c+912|0);a=a+1|0;if((l|0)!=(a|0)){continue}break}}id()}km(t,w,m);if(H[1287936]){yb(40011);a=0;if(l){while(1){yb(36468);b=a<<2;g=G[b+t>>2];d=0;while(1){L[c+896>>3]=L[g+(d<<3)>>3];gb(66481,c+896|0);d=d+1|0;if((l|0)!=(d|0)){continue}break}yb(36690);L[c+880>>3]=L[G[b+m>>2]>>3];gb(73117,c+880|0);a=a+1|0;if((l|0)!=(a|0)){continue}break}}id()}f=0;b=G[321985];if((b|0)>0){while(1){if((b|0)>0){g=M(f,s);d=0;a=G[321988];while(1){i=G[m+(d+g<<2)>>2];q=G[(f<<2)+a>>2]+(d<<3)|0;e=L[i>>3]*.5+L[q>>3];L[q>>3]=e;h=e==0?-999:L[i>>3]/e*100;if(H[1287936]){L[c+864>>3]=h;L[c+856>>3]=e;G[c+852>>2]=d;G[c+848>>2]=f;gb(89254,c+848|0);$a(r);b=G[321985];a=G[321988]}d=d+1|0;if((d|0)<(b|0)){continue}break}}f=f+1|0;if((f|0)<(b|0)){continue}break}}f=0;if(H[1287936]){id();b=G[321985]}if((b|0)>0){while(1){if((b|0)>0){g=l+M(f,s)|0;d=0;a=G[321990];while(1){i=G[m+(d+g<<2)>>2];q=G[(f<<2)+a>>2]+(d<<3)|0;e=L[i>>3]*.5+L[q>>3];L[q>>3]=e;h=e==0?-999:L[i>>3]/e*100;if(H[1287936]){L[c+832>>3]=h;L[c+824>>3]=e;G[c+820>>2]=d;G[c+816>>2]=f;gb(89223,c+816|0);$a(r);b=G[321985];a=G[321990]}d=d+1|0;if((d|0)<(b|0)){continue}break}}f=f+1|0;if((f|0)<(b|0)){continue}break}}Wh();if(H[1287936]){G[c+800>>2]=p;kb(78506,c+800|0);$a(r)}a=0;e=0;h=0;o=0;d=G[321991];if(L[d+136>>3]+1>0){while(1){if(L[d+144>>3]+1>0){n=e+-.5;b=0;k=0;while(1){e=k+-.5;cc(d,n,e,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[322064],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);if(H[1287936]){L[c+752>>3]=L[c+82080>>3];L[c+760>>3]=L[c+1816>>3];L[c+768>>3]=L[c+1824>>3];L[c+776>>3]=L[c+81824>>3];G[c+784>>2]=G[c+1276>>2];L[c+736>>3]=n;L[c+744>>3]=e;gb(88046,c+736|0);$a(r)}H:{if(!(G[c+1276>>2]?B:1)){break H}k=O(n-L[c+1824>>3]);o=k>o?k:o;e=O(e-L[c+81824>>3]);if(!(e>h)){break H}h=e}b=b+v|0;k=+(b|0);d=G[321991];if(k>3]+1){continue}break}}a=a+v|0;e=+(a|0);if(e>3]+1){continue}break}}if(H[1287936]){G[c+728>>2]=p;L[c+720>>3]=o;gb(78628,c+720|0);G[c+712>>2]=p;L[c+704>>3]=h;gb(78588,c+704|0);$a(r)}if(o>>0>p>>>0;if((p|0)!=(F|0)){continue}break}p=F}Z=u&2147483644;R=u&3;I=(w>>>0>1?w:1)<<3;_=l-1|0;aa=t+(_<<2)|0;Wh();Y=1;g=0;I:{while(1){J:{if(!l){break J}a=0;d=0;f=0;if(fa>>>0>=3){while(1){b=d<<2;i=G[b+m>>2];G[i>>2]=0;G[i+4>>2]=0;cb(G[b+t>>2],0,I);i=b|4;q=G[i+m>>2];G[q>>2]=0;G[q+4>>2]=0;cb(G[i+t>>2],0,I);i=b|8;q=G[i+m>>2];G[q>>2]=0;G[q+4>>2]=0;cb(G[i+t>>2],0,I);b=b|12;i=G[b+m>>2];G[i>>2]=0;G[i+4>>2]=0;cb(G[b+t>>2],0,I);d=d+4|0;f=f+4|0;if((Z|0)!=(f|0)){continue}break}}if(!R){break J}while(1){b=d<<2;f=G[b+m>>2];G[f>>2]=0;G[f+4>>2]=0;cb(G[b+t>>2],0,I);d=d+1|0;a=a+1|0;if((R|0)!=(a|0)){continue}break}}if(H[1287936]){G[c+688>>2]=g;kb(78344,c+688|0);$a(r)}q=0;e=0;d=G[321991];if(L[d+136>>3]+1>0){while(1){if(L[d+144>>3]+1>0){h=e+-.5;j=0;e=0;while(1){e=e+-.5;cc(G[322064],h,e,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[321991],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);G[c+1276>>2]=0;k=L[c+1824>>3]-L[161033];L[c+1824>>3]=k;n=L[c+81824>>3]-L[161034];L[c+81824>>3]=n;o=h-k;K:{L:{if(!H[1287936]){break L}L[c+640>>3]=L[c+82080>>3];L[c+648>>3]=L[c+1816>>3];L[c+656>>3]=k;L[c+664>>3]=n;L[c+672>>3]=o;G[c+680>>2]=0;L[c+624>>3]=h;L[c+632>>3]=e;gb(88107,c+624|0);$a(r);if(B){break L}if(G[c+1276>>2]){break K}}u=G[321985];if((u|0)<=0){break K}S=u&-2;T=u&1;i=0;while(1){U=M(i,s);n=$b(h,+(i|0));f=0;while(1){k=$b(e,+(f|0));a=f+U<<2;b=G[a+m>>2];L[b>>3]=n*k*o+L[b>>3];z=G[a+t>>2];b=0;while(1){A=M(b,s);k=$b(h,+(b+i|0));d=0;a=0;if((u|0)!=1){while(1){D=z+(d+A<<3)|0;ga=D,ia=k*$b(e,+(d+f|0))+L[D>>3],L[ga>>3]=ia;D=d|1;N=z+(D+A<<3)|0;ga=N,ia=k*$b(e,+(f+D|0))+L[N>>3],L[ga>>3]=ia;d=d+2|0;a=a+2|0;if((S|0)!=(a|0)){continue}break}}if(T){a=z+(d+A<<3)|0;ga=a,ia=k*$b(e,+(d+f|0))+L[a>>3],L[ga>>3]=ia}b=b+1|0;if((u|0)!=(b|0)){continue}break}f=f+1|0;if((u|0)!=(f|0)){continue}break}i=i+1|0;if((u|0)!=(i|0)){continue}break}}j=j+v|0;e=+(j|0);d=G[321991];if(e>3]+1){continue}break}}q=q+v|0;e=+(q|0);if(e>3]+1){continue}break}}e=0;q=0;if(H[1287936]){G[c+608>>2]=g;kb(78250,c+608|0);$a(r);d=G[321991]}if(L[d+136>>3]+1>0){while(1){if(L[d+144>>3]+1>0){k=e+-.5;j=0;e=0;while(1){h=e+-.5;cc(G[322064],k,h,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[321991],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);G[c+1276>>2]=0;n=L[c+1824>>3]-L[161033];L[c+1824>>3]=n;e=L[c+81824>>3]-L[161034];L[c+81824>>3]=e;o=h-e;M:{N:{if(!H[1287936]){break N}L[c+560>>3]=L[c+82080>>3];L[c+568>>3]=L[c+1816>>3];L[c+576>>3]=n;L[c+584>>3]=e;L[c+592>>3]=o;G[c+600>>2]=0;L[c+544>>3]=k;L[c+552>>3]=h;gb(88107,c+544|0);$a(r);if(B){break N}if(G[c+1276>>2]){break M}}u=G[321985];if((u|0)<=0){break M}S=u&-2;T=u&1;i=0;while(1){U=l+M(i,s)|0;e=+(i|0);f=0;while(1){h=L[c+81824>>3];n=$b(L[c+1824>>3],e);h=$b(h,+(f|0));a=f+U<<2;b=G[a+m>>2];L[b>>3]=n*h*o+L[b>>3];z=G[a+t>>2];b=0;while(1){A=l+M(b,s)|0;h=+(b+i|0);d=0;a=0;if((u|0)!=1){while(1){n=L[c+81824>>3];D=z+(d+A<<3)|0;ga=D,ia=$b(L[c+1824>>3],h)*$b(n,+(d+f|0))+L[D>>3],L[ga>>3]=ia;n=L[c+81824>>3];D=d|1;N=z+(D+A<<3)|0;ga=N,ia=$b(L[c+1824>>3],h)*$b(n,+(f+D|0))+L[N>>3],L[ga>>3]=ia;d=d+2|0;a=a+2|0;if((S|0)!=(a|0)){continue}break}}if(T){n=L[c+81824>>3];a=z+(d+A<<3)|0;ga=a,ia=$b(L[c+1824>>3],h)*$b(n,+(d+f|0))+L[a>>3],L[ga>>3]=ia}b=b+1|0;if((u|0)!=(b|0)){continue}break}f=f+1|0;if((u|0)!=(f|0)){continue}break}i=i+1|0;if((u|0)!=(i|0)){continue}break}}j=j+v|0;e=+(j|0);d=G[321991];if(e>3]+1){continue}break}}q=q+v|0;e=+(q|0);if(e>3]+1){continue}break}}if(L[G[aa>>2]+(_<<3)>>3]==0){break c}if(H[1287936]){yb(40029);a=0;if(l){while(1){yb(36468);b=a<<2;f=G[b+t>>2];d=0;while(1){L[c+528>>3]=L[f+(d<<3)>>3];gb(66481,c+528|0);d=d+1|0;if((l|0)!=(d|0)){continue}break}yb(36690);L[c+512>>3]=L[G[b+m>>2]>>3];gb(73117,c+512|0);a=a+1|0;if((l|0)!=(a|0)){continue}break}}id()}km(t,w,m);if(H[1287936]){yb(40011);a=0;if(l){while(1){yb(36468);b=a<<2;f=G[b+t>>2];d=0;while(1){L[c+496>>3]=L[f+(d<<3)>>3];gb(66481,c+496|0);d=d+1|0;if((l|0)!=(d|0)){continue}break}yb(36690);L[c+480>>3]=L[G[b+m>>2]>>3];gb(73117,c+480|0);a=a+1|0;if((l|0)!=(a|0)){continue}break}}id()}f=0;b=G[321985];if((b|0)>0){while(1){if((b|0)>0){i=M(f,s);d=0;a=G[321987];while(1){q=G[m+(d+i<<2)>>2];j=G[(f<<2)+a>>2]+(d<<3)|0;e=L[q>>3]*.5+L[j>>3];L[j>>3]=e;h=e==0?-999:L[q>>3]/e*100;if(H[1287936]){L[c+464>>3]=h;L[c+456>>3]=e;G[c+452>>2]=d;G[c+448>>2]=f;gb(89315,c+448|0);$a(r);b=G[321985];a=G[321987]}d=d+1|0;if((d|0)<(b|0)){continue}break}}f=f+1|0;if((f|0)<(b|0)){continue}break}}f=0;if(H[1287936]){id();b=G[321985]}if((b|0)>0){while(1){if((b|0)>0){i=l+M(f,s)|0;d=0;a=G[321989];while(1){q=G[m+(d+i<<2)>>2];j=G[(f<<2)+a>>2]+(d<<3)|0;e=L[q>>3]*.5+L[j>>3];L[j>>3]=e;h=e==0?-999:L[q>>3]/e*100;if(H[1287936]){L[c+432>>3]=h;L[c+424>>3]=e;G[c+420>>2]=d;G[c+416>>2]=f;gb(89285,c+416|0);$a(r);b=G[321985];a=G[321989]}d=d+1|0;if((d|0)<(b|0)){continue}break}}f=f+1|0;if((f|0)<(b|0)){continue}break}}Wh();if(H[1287936]){G[c+400>>2]=g;kb(78462,c+400|0);$a(r)}a=0;e=0;h=0;k=0;b=G[321991];if(L[b+136>>3]+1>0){while(1){if(L[b+144>>3]+1>0){n=e+-.5;d=0;o=0;while(1){e=o+-.5;cc(G[322064],n,e,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[321991],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);G[c+1276>>2]=0;o=L[c+1824>>3]-L[161033];L[c+1824>>3]=o;y=L[c+81824>>3]-L[161034];L[c+81824>>3]=y;O:{P:{if(!H[1287936]){break P}L[c+352>>3]=L[c+82080>>3];L[c+360>>3]=L[c+1816>>3];L[c+368>>3]=o;L[c+376>>3]=y;G[c+384>>2]=0;L[c+336>>3]=n;L[c+344>>3]=e;gb(87985,c+336|0);$a(r);if(B){break P}if(G[c+1276>>2]){break O}}o=O(n-L[c+1824>>3]);k=k>3]);if(!(e>h)){break O}h=e}d=d+v|0;o=+(d|0);b=G[321991];if(o>3]+1){continue}break}}a=a+v|0;e=+(a|0);if(e>3]+1){continue}break}}if(H[1287936]){G[c+328>>2]=g;L[c+320>>3]=k;gb(78608,c+320|0);G[c+312>>2]=g;L[c+304>>3]=h;gb(78568,c+304|0);$a(r)}if(k>>0>g>>>0;if((g|0)!=(F|0)){continue}break}g=F}Q:{if(!H[1287936]){break Q}id();if(!H[1287936]){break Q}yb(10782);$a(r)}n=0;h=0;d=G[321991];if(L[d+136>>3]+1>0){e=0;a=0;while(1){if(L[d+144>>3]+1>0){e=e+-.5;b=0;k=0;while(1){x=k+-.5;cc(d,e,x,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[322064],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);if(H[1287936]){L[c+256>>3]=L[c+82080>>3];L[c+264>>3]=L[c+1816>>3];L[c+272>>3]=L[c+1824>>3];L[c+280>>3]=L[c+81824>>3];G[c+288>>2]=G[c+1276>>2];L[c+240>>3]=e;L[c+248>>3]=x;gb(88046,c+240|0);$a(r)}R:{if(!(G[c+1276>>2]?B:1)){break R}k=O(e-L[c+1824>>3]);n=k>n?k:n;x=O(x-L[c+81824>>3]);if(!(x>h)){break R}h=x}b=b+X|0;k=+(b|0);d=G[321991];if(k>3]+1){continue}break}}a=a+X|0;e=+(a|0);if(e>3]+1){continue}break}}S:{if(!H[1287936]){break S}id();L[c+224>>3]=n;gb(70408,c+224|0);L[c+208>>3]=h;gb(70366,c+208|0);$a(r);if(!H[1287936]){break S}yb(10746);$a(r)}k=0;x=0;b=G[321991];if(L[b+136>>3]+1>0){e=0;a=0;while(1){if(L[b+144>>3]+1>0){y=e+-.5;d=0;o=0;while(1){e=o+-.5;cc(G[322064],y,e,c+82080|0,c+1816|0);G[c+1276>>2]=0;Bd(G[321991],L[c+82080>>3],L[c+1816>>3],c+1824|0,c+81824|0,c+1276|0);G[c+1276>>2]=0;o=L[c+1824>>3]-L[161033];L[c+1824>>3]=o;P=L[c+81824>>3]-L[161034];L[c+81824>>3]=P;T:{U:{if(!H[1287936]){break U}L[c+160>>3]=L[c+82080>>3];L[c+168>>3]=L[c+1816>>3];L[c+176>>3]=o;L[c+184>>3]=P;G[c+192>>2]=0;L[c+144>>3]=y;L[c+152>>3]=e;gb(87985,c+144|0);$a(r);if(B){break U}if(G[c+1276>>2]){break T}}o=O(y-L[c+1824>>3]);k=k>3]);if(!(e>x)){break T}x=e}d=d+X|0;o=+(d|0);b=G[321991];if(o>3]+1){continue}break}}a=a+X|0;e=+(a|0);if(e>3]+1){continue}break}}if(H[1287936]){L[c+128>>3]=k;gb(70387,c+128|0);L[c+112>>3]=x;gb(90142,c+112|0);$a(r)}Hb(G[321986]);L[c+88>>3]=k;L[c+96>>3]=x;a=F-1|0;G[c+80>>2]=(ea?p:a)+1;G[c+104>>2]=(Y?g:a)+1;L[c+64>>3]=n;L[c+72>>3]=h;xb(G[321435],79198,c- -64|0);$a(r);$a(G[321435]);Hb(G[321435]);sc(0);W()}G[c+1200>>2]=F;_a(G[321435],81164,c+1200|0);break b}G[c+1216>>2]=d;_a(G[321435],81239,c+1216|0);break b}G[c+1232>>2]=d;_a(G[321435],81385,c+1232|0);break b}G[c>>2]=G[b>>2];_a(G[321435],84889,c);break a}G[c+16>>2]=G[b>>2];_a(G[321435],84889,c+16|0);break a}G[c+32>>2]=m;_a(G[321435],80640,c+32|0);break b}G[c+48>>2]=p;_a(G[321435],80820,c+48|0);break a}hb(84378,54,1,G[321435]);break a}hb(82436,70,1,G[321435]);break a}hb(82365,70,1,G[321435]);break a}$a(r)}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Oq(a,b){a=a|0;b=b|0;var 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,A=0,B=0,C=0,D=0,K=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=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,Wa=0;c=Fa-23536|0;Fa=c;n=ab(64);r=ab(4096);G[n>>2]=r;Ta=n,Ua=ab(4096),G[Ta+4>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+8>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+12>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+16>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+20>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+24>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+28>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+32>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+36>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+40>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+44>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+48>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+52>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+56>>2]=Ua;Ta=n,Ua=ab(4096),G[Ta+60>>2]=Ua;m=ab(32768);a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l=ab(32768);if(l){G[47589]=1;X=G[29763];G[321435]=X;G[47590]=0;G[935722]=0;l:{m:while(1){w=e;while(1){e=1;n:{o:{p:{q:{r:{g=of(a,b,36988);switch(g-80|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 31:case 33:case 34:break j;case 30:continue m;case 35:break n;case 32:break o;case 0:break p;case 21:break q;case 20:break r;default:break l}}Ta=3742888,Ua=nj(G[321433]),G[Ta>>2]=Ua;continue}e=G[321433];N=_b(e);if((N|0)<0){break k}ya=jb(e,37)?1:ya;e=w;continue m}e=_b(G[321433]);Ma=(e|0)>0?e:0;e=w;continue m}e=w;w=G[321433];B=sb(w);if(!(B<=0)){continue m}G[c+1312>>2]=w;_a(G[321435],80706,c+1312|0);break a}e=ac(G[321433],49010);G[321435]=e;if(e){continue}break}break}G[c+1328>>2]=G[321433];kb(80991,c+1328|0);break a}if((g|0)!=-1){break j}za=1;g=G[47589];p=a-g|0;if((p|0)<=1){break i}e=(g<<2)+b|0;ja=Za(c+19440|0,G[e>>2]);Na=Za(c+15344|0,G[e+4>>2]);if((p|0)==2){break e}e=G[e+8>>2];d=Xa(e,34868);P=0;if(!d){break f}if(!Xa(e,35899)){Aa=1;t=1;P=0;break f}if(!Xa(e,34873)){t=2;Oa=1;break g}if(!Xa(e,35912)){t=3;Ba=1;break g}if(!Xa(e,34820)){t=4;P=1;break f}if(Xa(e,34819)){break h}t=5;Pa=1;P=0;break f}hb(83879,56,1,G[321435]);$a(G[29763]);break a}G[c+1296>>2]=e;_a(G[321435],80767,c+1296|0);break a}G[c>>2]=G[b>>2];kb(84675,c);break c}G[c+16>>2]=G[b>>2];kb(84675,c+16|0);break c}hb(83124,90,1,G[321435]);break c}P=0}za=!d;if(p>>>0<4){break e}q=vb(G[((g<<2)+b|0)+12>>2],c+1340|0);a=G[((G[47589]<<2)+b|0)+12>>2];if(J[c+1340>>2]>=Va(a)+a>>>0){break d}hb(81841,60,1,G[321435]);break a}q=Ba?1950:Aa?1950:2e3}G[935572]=G[935722];s:{t:{u:{v:{d=ac(Na,49010);if(d){if((Rh(ja)|0)>0){b=Pb(23501);w:{if((b|0)>=0){if((nf()|0)>=0){e=16;while(1){Za(G[(Z<<2)+n>>2],(b|0)>2]:0);Z=Z+1|0;if((Z|0)>=(e|0)){a=e+16|0;n=ab(a<<2);while(1){Ta=(e<<2)+n|0,Ua=ab(4096),G[Ta>>2]=Ua;e=e+1|0;if((a|0)>(e|0)){continue}break}e=a}if((nf()|0)>=0){continue}break}break w}Qh();B=-2;g=2;h=360;e=0;break u}Za(r,ja);Z=1}Qh();Sa=c+11248|1;h=360;e=0;ka=4096;g=2;_=1;la=1;x:{y:{z:{while(1){a=Za(ja,G[(ma<<2)+n>>2]);if(G[935722]>0){G[c+1284>>2]=a;G[c+1280>>2]=ma;kb(76821,c+1280|0);$a(X)}if((Rh(a)|0)<=0){break x}na=Pb(6975);oa=Pb(40414);pa=Pb(40474);qa=Pb(40395);ra=Pb(40402);sa=Pb(40314);ta=Pb(40326);ua=Pb(40295);va=Pb(40302);C=Pb(41002);r=Pb(40604);u=Pb(41060);Ca=1;$=Pb(40707);aa=Pb(40486);ba=Pb(40342);v=Pb(41055);ca=Pb(40695);da=Pb(40481);ea=Pb(40337);A:{B:{if((u|$|(aa|ba))<0){break B}if((v|ca|da)<0){break B}if((ea|0)>=0){break A}}u=Pb(41029);$=Pb(40631);aa=Pb(40469);ba=Pb(40321);v=Pb(41009);ca=Pb(40611);da=Pb(40409);ea=Pb(40309);C:{if((u|$|(aa|ba))<0){break C}if((v|ca|da)<0){break C}if((ea|0)>=0){break A}}Da=Pb(41041);Ea=Pb(40643);Ga=Pb(3709);fa=Pb(16725);ga=Pb(6868);Ha=Pb(41034);Ia=Pb(40636);Ja=Pb(40995);Ka=Pb(40585);C=Pb(41002);r=Pb(40604);La=Pb(40700);Pb(17534);if((ga|0)<0){ga=Pb(41022)}if((fa|0)<0){fa=Pb(40624)}D:{if((Da|Ea|(fa|ga))<0){break D}if((Ha|Ia|(Ja|Ka))<0){break D}if((C|r)<0){break D}Ca=2;if((La|0)>=0){break A}}Ca=3;u=Pb(30988);v=Pb(30707);if((u|v)>=0){break A}u=Pb(13594);v=Pb(5251);if((u|v)>=0){break A}u=Pb(41034);v=Pb(40636);if((u|v)<0){break y}}G[935728]=0;G[935729]=1084178432;G[935725]=0;a=Xd(32863);if(a){Za(c+11248|0,a)}a=Xd(34948);if(a){Za(c+11248|0,a)}a=Xd(3709);if(a){Za(c+11248|0,a)}a=Xd(17534);if(a){Za(c+11248|0,a)}a=Xd(33588);if(a){Za(c+7152|0,a)}a=Xd(34666);if(a){Za(c+7152|0,a)}a=Xd(33589);if(a){Za(c+7152|0,a)}a=Xd(35752);if(a){Za(c+7152|0,a)}a=Xd(33575);if(a){Za(c+7152|0,a)}a=Xd(5347);if(a){Za(c+7152|0,a)}a=Xd(16343);if(a){Za(c+7152|0,a)}a=Xd(5348);if(a){Za(c+7152|0,a)}a=Xd(25955);if(a){Za(c+7152|0,a)}a=Xd(5338);if(a){Za(c+7152|0,a)}b=0;a=0;if(H[c+7152|0]){while(1){p=c+7152|0;s=p+b|0;a=E[s|0];E[s|0]=a-65>>>0<26?a|32:a;a=Va(p);b=b+1|0;if(a>>>0>b>>>0){continue}break}}b=106;E:{F:{G:{switch((H[c+11248|0]&223)-66|0){default:f=sb(c+11248|0);Y=2e3;if(f==0){break F}break E;case 0:b=98;break;case 8:break G}}Y=sb(Sa)}f=Y}L[467864]=f;s=I[c+7152>>1]!=29029;b=H[(a+c|0)+7151|0]==106?106:b;if(!(s|(b|0)!=106)){G[935725]=0}p=I[c+7152>>1]!=25445;H:{I:{if((b|0)==106){a=2;if(!p){break I}}b=(b|0)==98;p=b&!p;a=p?3:1;if(b&!s){break I}if(!p){break H}}G[935725]=a}if(I[c+7152>>1]==24935){G[935725]=4}if(I[c+7152>>1]==26483){G[935725]=5}if(I[c+7152>>1]==30067){G[935725]=5}la=(sa|ta|(ua|va))<0?0:la;_=(oa|pa|(qa|ra))<0?0:_;J:{if((nf()|0)>=0){p=(la|0)!=0;while(1){K:{if((na|0)<0){break K}if(Ue(na)){g=-1;break K}a=_b(G[925783]>(na|0)?G[(G[925773]+M(na,4108)|0)+4096>>2]:0);b=a;if(Q){if((a|0)==2){g=-1;break K}b=(a|0)==(g|0)?g:-1}if((a|0)<3){g=b;break K}L:{M:{if(!(!_|(b|0)<3)){if(Ue(oa)){break M}if(Ue(pa)){break M}if(Ue(qa)){break M}if(Ue(ra)){break M}Qa=_b(G[925783]>(oa|0)?G[(G[925773]+M(oa,4108)|0)+4096>>2]:0);x=sb(G[925783]>(pa|0)?G[(G[925773]+M(pa,4108)|0)+4096>>2]:0);j=sb(G[925783]>(qa|0)?G[(G[925773]+M(qa,4108)|0)+4096>>2]:0);y=sb(G[925783]>(ra|0)?G[(G[925773]+M(ra,4108)|0)+4096>>2]:0)}if((b|0)<4){a=p;break L}if(!la){a=p;break L}a=1;if(Ue(sa)){b=-1;break L}if(Ue(ta)){b=-1;break L}if(Ue(ua)){b=-1;break L}if(Ue(va)){b=-1;break L}Ra=_b(G[925783]>(sa|0)?G[(G[925773]+M(sa,4108)|0)+4096>>2]:0);i=sb(G[925783]>(ta|0)?G[(G[925773]+M(ta,4108)|0)+4096>>2]:0);o=sb(G[925783]>(ua|0)?G[(G[925773]+M(ua,4108)|0)+4096>>2]:0);ha=sb(G[925783]>(va|0)?G[(G[925773]+M(va,4108)|0)+4096>>2]:0);break L}a=p;b=-1}if(!Q){R=x;S=y;T=i;z=o;U=ha;V=Qa;A=j;K=Ra}b=(b|0)<3?b:_?b:-1;wa=wa+1|0;if(_){b=x!=R?-1:b;g=y!=S;f=+(V|0)-A;A=j>A?j:A;k=+(Qa|0)-j;f=A+(f3&a)){break K}a=i!=T?-1:g;b=U!=ha;f=+(K|0)-z;z=o>z?o:z;k=+(Ra|0)-o;f=z+(f(u|0)?G[(G[925773]+M(u,4108)|0)+4096>>2]:0),L[Ta+3048>>3]=Wa;f=sb(G[925783]>(v|0)?G[(G[925773]+M(v,4108)|0)+4096>>2]:0);L[c+3040>>3]=f;dd(G[935725],L[467864],L[c+3048>>3],f,t,q,c+3032|0,c+3024|0);a=e<<3;L[a+m>>3]=L[c+3032>>3];L[a+l>>3]=L[c+3024>>3];R:{if((C|0)<0){break R}f=O(sb(G[925783]>(C|0)?G[(G[925773]+M(C,4108)|0)+4096>>2]:0));if(!(f(r|0)?G[(G[925773]+M(r,4108)|0)+4096>>2]:0));if(!(f(u|0)?G[(G[925773]+M(u,4108)|0)+4096>>2]:0),L[Ta+3048>>3]=Wa;f=sb(G[925783]>(v|0)?G[(G[925773]+M(v,4108)|0)+4096>>2]:0);L[c+3040>>3]=f;b=c+3032|0;s=c+3024|0;dd(G[935725],L[467864],L[c+3048>>3],f,t,q,b,s);a=e<<3;L[a+m>>3]=L[c+3032>>3];L[a+l>>3]=L[c+3024>>3];Ta=c,Wa=sb(G[925783]>($|0)?G[(G[925773]+M($,4108)|0)+4096>>2]:0),L[Ta+3048>>3]=Wa;f=sb(G[925783]>(ca|0)?G[(G[925773]+M(ca,4108)|0)+4096>>2]:0);L[c+3040>>3]=f;dd(G[935725],L[467864],L[c+3048>>3],f,t,q,b,s);D=a+8|0;L[D+m>>3]=L[c+3032>>3];L[l+D>>3]=L[c+3024>>3];Ta=c,Wa=sb(G[925783]>(aa|0)?G[(G[925773]+M(aa,4108)|0)+4096>>2]:0),L[Ta+3048>>3]=Wa;f=sb(G[925783]>(da|0)?G[(G[925773]+M(da,4108)|0)+4096>>2]:0);L[c+3040>>3]=f;dd(G[935725],L[467864],L[c+3048>>3],f,t,q,b,s);D=a+16|0;L[D+m>>3]=L[c+3032>>3];L[l+D>>3]=L[c+3024>>3];Ta=c,Wa=sb(G[925783]>(ba|0)?G[(G[925773]+M(ba,4108)|0)+4096>>2]:0),L[Ta+3048>>3]=Wa;f=sb(G[925783]>(ea|0)?G[(G[925773]+M(ea,4108)|0)+4096>>2]:0);L[c+3040>>3]=f;dd(G[935725],L[467864],L[c+3048>>3],f,t,q,b,s);a=a+24|0;L[a+m>>3]=L[c+3032>>3];L[a+l>>3]=L[c+3024>>3];S:{if((C|0)<0){break S}f=O(sb(G[925783]>(C|0)?G[(G[925773]+M(C,4108)|0)+4096>>2]:0));if(!(f(r|0)?G[(G[925773]+M(r,4108)|0)+4096>>2]:0));if(!(f(Da|0)?G[(G[925773]+M(Da,4108)|0)+4096>>2]:0);Za(3742936,G[925783]>(Ea|0)?G[(G[925773]+M(Ea,4108)|0)+4096>>2]:0);Ta=3742952,Ua=_b(G[925783]>(ga|0)?G[(G[925773]+M(ga,4108)|0)+4096>>2]:0),G[Ta>>2]=Ua;Ta=3742956,Ua=_b(G[925783]>(fa|0)?G[(G[925773]+M(fa,4108)|0)+4096>>2]:0),G[Ta>>2]=Ua;Ta=3742960,Wa=sb(G[925783]>(Ja|0)?G[(G[925773]+M(Ja,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;Ta=3742968,Wa=sb(G[925783]>(Ka|0)?G[(G[925773]+M(Ka,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;Ta=3742976,Wa=sb(G[925783]>(Ha|0)?G[(G[925773]+M(Ha,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;Ta=3742984,Wa=sb(G[925783]>(Ia|0)?G[(G[925773]+M(Ia,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;Ta=3742992,Wa=sb(G[925783]>(C|0)?G[(G[925773]+M(C,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;Ta=3743e3,Wa=sb(G[925783]>(r|0)?G[(G[925773]+M(r,4108)|0)+4096>>2]:0),L[Ta>>3]=Wa;f=sb(G[925783]>(La|0)?G[(G[925773]+M(La,4108)|0)+4096>>2]:0);G[935726]=2e3;L[467876]=f;if((Ga|0)>=0){Ta=3742904,Ua=_b(G[925783]>(Ga|0)?G[(G[925773]+M(Ga,4108)|0)+4096>>2]:0),G[Ta>>2]=Ua}E[c+1424|0]=0;a=H[33554]|H[33555]<<8|(H[33556]<<16|H[33557]<<24);G[c+1344>>2]=H[33550]|H[33551]<<8|(H[33552]<<16|H[33553]<<24);G[c+1348>>2]=a;G[c+1352>>2]=H[33558]|H[33559]<<8|(H[33560]<<16|H[33561]<<24);f=L[467874];k=L[467875];b=Va(c+1424|0);a=Va(c+1344|0);T:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break T}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;a=H[40385]|H[40386]<<8|(H[40387]<<16|H[40388]<<24);G[c+1344>>2]=H[40381]|H[40382]<<8|(H[40383]<<16|H[40384]<<24);G[c+1348>>2]=a;a=H[40391]|H[40392]<<8|(H[40393]<<16|H[40394]<<24);b=H[40387]|H[40388]<<8|(H[40389]<<16|H[40390]<<24);F[c+1350>>1]=b;F[c+1352>>1]=b>>>16;F[c+1354>>1]=a;F[c+1356>>1]=a>>>16;b=Va(c+1424|0);a=Va(c+1344|0);U:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break U}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;a=H[40967]|H[40968]<<8|(H[40969]<<16|H[40970]<<24);G[c+1344>>2]=H[40963]|H[40964]<<8|(H[40965]<<16|H[40966]<<24);G[c+1348>>2]=a;G[c+1352>>2]=H[40971]|H[40972]<<8|(H[40973]<<16|H[40974]<<24);b=Va(c+1424|0);a=Va(c+1344|0);V:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break V}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1264>>2]=G[935738];a=c+1344|0;db(a,30391,c+1264|0);b=Va(c+1424|0);a=Va(a);W:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break W}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1248>>2]=G[935739];a=c+1344|0;db(a,30378,c+1248|0);b=Va(c+1424|0);a=Va(a);X:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break X}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1232>>2]=3742920;a=c+1344|0;db(a,64770,c+1232|0);b=Va(c+1424|0);a=Va(a);Y:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break Y}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1216>>2]=3742936;a=c+1344|0;db(a,64755,c+1216|0);b=Va(c+1424|0);a=Va(a);Z:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break Z}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1200>>3]=L[467872];a=c+1344|0;Eb(a,18769,c+1200|0);b=Va(c+1424|0);a=Va(a);_:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break _}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1184>>3]=L[467873];a=c+1344|0;Eb(a,18701,c+1184|0);b=Va(c+1424|0);a=Va(a);$:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break $}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1168>>3]=L[467870];a=c+1344|0;Eb(a,18735,c+1168|0);b=Va(c+1424|0);a=Va(a);aa:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break aa}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1152>>3]=L[467871];a=c+1344|0;Eb(a,18667,c+1152|0);b=Va(c+1424|0);a=Va(a);ba:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break ba}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1136>>3]=L[467874];a=c+1344|0;Eb(a,18752,c+1136|0);b=Va(c+1424|0);a=Va(a);ca:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break ca}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1120>>3]=L[467875];a=c+1344|0;Eb(a,18684,c+1120|0);b=Va(c+1424|0);a=Va(a);da:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break da}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;L[c+1104>>3]=L[467876];a=c+1344|0;Eb(a,18718,c+1104|0);b=Va(c+1424|0);a=Va(a);ea:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break ea}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1088>>2]=G[935726];a=c+1344|0;db(a,30339,c+1088|0);b=Va(c+1424|0);a=Va(a);fa:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break fa}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;G[c+1344>>2]=4476485;b=Va(c+1424|0);a=Va(c+1344|0);ga:{if((a|0)>0){bb(b+(c+1424|0)|0,c+1344|0,a);if(a>>>0>79){break ga}}cb(c+1424+(a+b)|0,32,80-a|0)}E[(b+c|0)+1504|0]=0;a=rd(c+1424|0);G[935724]=a;if(!a){break J}k=O(k);f=O(f);f=f>2]-1|0){case 2:break ja;case 3:break la;case 1:break ma;case 0:break na;default:break ka}}G[935728]=0;G[935729]=1084178432;G[935725]=0;h=1950;if(L[b+120>>3]==1950){break ia}break ha}G[935728]=0;G[935729]=1084127232;G[935725]=1;if(L[b+120>>3]==2e3){break ia}break ha}G[935728]=0;G[935729]=1084178432;G[935725]=2;h=1950;a=3;if(L[b+120>>3]==1950){break ja}break ha}a=0}G[935725]=a}L[467864]=h}h=s?k:f;a=b;b=c+3048|0;s=c+3040|0;cc(a,.5,.5,b,s);D=c+3032|0;xa=c+3024|0;dd(G[935725],L[467864],L[c+3048>>3],L[c+3040>>3],t,q,D,xa);a=e<<3;L[a+m>>3]=L[c+3032>>3];L[a+l>>3]=L[c+3024>>3];cc(G[935724],+G[935738]+.5,.5,b,s);dd(G[935725],L[467864],L[c+3048>>3],L[c+3040>>3],t,q,D,xa);ia=a+8|0;L[ia+m>>3]=L[c+3032>>3];L[l+ia>>3]=L[c+3024>>3];cc(G[935724],+G[935738]+.5,+G[935739]+.5,b,s);dd(G[935725],L[467864],L[c+3048>>3],L[c+3040>>3],t,q,D,xa);ia=a+16|0;L[ia+m>>3]=L[c+3032>>3];L[l+ia>>3]=L[c+3024>>3];cc(G[935724],.5,+G[935739]+.5,b,s);dd(G[935725],L[467864],L[c+3048>>3],L[c+3040>>3],t,q,D,xa);a=a+24|0;L[a+m>>3]=L[c+3032>>3];L[a+l>>3]=L[c+3024>>3];e=e+4|0}if((e|0)>=(ka|0)){ka=ka+4096|0;a=ka<<3;m=ub(m,a);l=ub(l,a);if(!l){break z}}h=B>0?B:h;if((nf()|0)>=0){continue}break}}Qh();ma=ma+1|0;if((ma|0)==(Z|0)){break v}continue}break}G[c+1072>>2]=Q;_a(G[321435],83021,c+1072|0);break a}Hb(d);hb(83879,56,1,G[321435]);break c}hb(80079,227,1,G[321435]);break a}G[c+48>>2]=a;_a(G[321435],81102,c+48|0);break a}G[c+32>>2]=ja;_a(G[321435],81049,c+32|0);break a}hb(83936,60,1,G[321435]);break c}b=0;B=-2;if((e|0)>0){break t}}j=-2;i=-2;break s}f=1;i=-1;j=-1;o=-1;y=1;x=1;while(1){a=b<<3;k=L[a+m>>3];ha=L[a+l>>3]*.017453292519943295;B=eb(ha);Y=k*.017453292519943295;k=B*ib(Y);j=jo?k:o;x=kk?k:f;b=b+1|0;if((e|0)!=(b|0)){continue}break}B=o-x;j=j-y;i=i-f}if(i>1?1:B>1|j>1){hb(85307,12,1,d);hb(86411,14,1,d);i=180/h;oa:{if(O(i)<2147483648){a=~~i;break oa}a=-2147483648}e=(g|0)!=-1;i=360/h;pa:{if(O(i)<2147483648){b=~~i;break pa}b=-2147483648}qa:{if(!e){hb(86498,12,1,d);break qa}G[c+432>>2]=g;_a(d,75597,c+432|0)}G[c+416>>2]=b;_a(d,75530,c+416|0);G[c+400>>2]=a;_a(d,75516,c+400|0);t=3;e=0;ra:{if((g|0)>=3){G[c+384>>2]=V;_a(d,75502,c+384|0);if((g|0)==3){break ra}G[c+368>>2]=K;_a(d,75488,c+368|0);e=1}t=g}if(za){hb(89784,21,1,d);hb(89762,21,1,d);L[c+352>>3]=q;xb(d,70545,c+352|0)}if(Aa){hb(89784,21,1,d);hb(89762,21,1,d);L[c+336>>3]=q;xb(d,70545,c+336|0)}if(Oa){hb(89740,21,1,d);hb(89674,21,1,d);L[c+320>>3]=q;xb(d,70545,c+320|0)}if(Ba){hb(89740,21,1,d);hb(89674,21,1,d);L[c+304>>3]=q;xb(d,70545,c+304|0)}if(P){hb(89718,21,1,d);hb(89652,21,1,d)}if(Pa){hb(89696,21,1,d);hb(89630,21,1,d)}G[c+288>>2]=0;G[c+292>>2]=0;xb(d,71373,c+288|0);G[c+272>>2]=0;G[c+276>>2]=0;xb(d,71319,c+272|0);if((g|0)>=3){L[c+256>>3]=R;xb(d,71283,c+256|0)}if(e){L[c+240>>3]=T;xb(d,71229,c+240|0)}L[c+224>>3]=(+(b|0)+1)*.5;xb(d,72266,c+224|0);L[c+208>>3]=(+(a|0)+1)*.5;xb(d,72248,c+208|0);if((g|0)>=3){L[c+192>>3]=A;xb(d,71247,c+192|0)}if(e){L[c+176>>3]=z;xb(d,71193,c+176|0)}L[c+160>>3]=-h;xb(d,71355,c+160|0);L[c+144>>3]=h;xb(d,71301,c+144|0);if((g|0)>=3){L[c+128>>3]=S;xb(d,71265,c+128|0)}if(e){L[c+112>>3]=U;xb(d,71211,c+112|0)}G[c+96>>2]=0;G[c+100>>2]=0;xb(d,71337,c+96|0);hb(85385,4,1,d);$a(d);Hb(d);E[c+3056|0]=0;if((t|0)<0){bb(c+3056|0,42233,79)}G[c+80>>2]=a;G[c+68>>2]=Q;G[c+72>>2]=wa;G[c+76>>2]=b;G[c+64>>2]=c+3056;_a(G[321435],79294,c- -64|0);$a(X);break b}sa:{if(w){a=0;ta:{if((e|0)<3){break ta}if((Yl(e,m,l,0)|0)<0){break ta}if(G[935573]>0){Xl()}a=ab(112);L[a>>3]=L[467787];L[a+32>>3]=L[467788];L[a+8>>3]=L[467794];L[a+40>>3]=L[467795];L[a+16>>3]=L[467801];L[a+48>>3]=L[467802];L[a+24>>3]=L[467808];L[a+56>>3]=L[467809];L[a+64>>3]=L[467815];L[a+72>>3]=L[467816];L[a+80>>3]=L[467822];L[a+88>>3]=L[467823];L[a+96>>3]=L[467824]}break sa}a=0;ua:{if((e|0)<3){break ua}if((Yl(e,m,l,1)|0)<0){break ua}if(G[935573]>0){Xl()}a=ab(112);L[a>>3]=L[467787];L[a+32>>3]=L[467788];L[a+8>>3]=L[467794];L[a+40>>3]=L[467795];L[a+16>>3]=L[467801];L[a+48>>3]=L[467802];L[a+24>>3]=L[467808];L[a+56>>3]=L[467809];L[a+64>>3]=L[467815];L[a+72>>3]=L[467816];L[a+80>>3]=L[467822];L[a+88>>3]=L[467823];L[a+96>>3]=L[467824]}}if(a){h=h<=0?.0002777777777777778:h>=360?.0002777777777777778:h;va:{if(!Ma){break va}h=+(Ma|0);i=L[a+88>>3];j=L[a+80>>3];if(i>j){h=i/h;break va}h=j/h}wa:{if(!ya){break wa}i=+(N|0)/100;xa:{j=L[a+88>>3]/h;ya:{if(O(j)<2147483648){e=~~j;break ya}e=-2147483648}j=L[a+80>>3]/h;za:{if(O(j)<2147483648){b=~~j;break za}b=-2147483648}if((e|0)<(b|0)){i=i*+(b|0);if(!(O(i)<2147483648)){break xa}N=~~i;break wa}i=i*+(e|0);if(!(O(i)<2147483648)){break xa}N=~~i;break wa}N=-2147483648}if(G[935722]>0){G[c+1060>>2]=ya;G[c+1056>>2]=N;kb(88478,c+1056|0);$a(X)}i=L[a+80>>3];j=L[a+88>>3];hb(85307,12,1,d);hb(86411,14,1,d);f=j/h;j=+(N<<1);o=f+j;Aa:{if(O(o)<2147483648){b=~~o;break Aa}b=-2147483648}e=i>h*+(b|0)?b+2|0:b;j=i/h+j;Ba:{if(O(j)<2147483648){b=~~j;break Ba}b=-2147483648}w=i>h*+(b|0)?b+2|0:b;Ca:{if((g|0)==-1){hb(86498,12,1,d);break Ca}G[c+1040>>2]=g;_a(d,75597,c+1040|0)}G[c+1024>>2]=w;_a(d,75530,c+1024|0);G[c+1008>>2]=e;_a(d,75516,c+1008|0);n=3;b=0;Da:{if((g|0)>=3){G[c+992>>2]=V;_a(d,75502,c+992|0);if((g|0)==3){break Da}G[c+976>>2]=K;_a(d,75488,c+976|0);b=1}n=g}if(za){hb(89960,21,1,d);hb(89938,21,1,d);L[c+960>>3]=q;xb(d,70545,c+960|0)}if(Aa){hb(89960,21,1,d);hb(89938,21,1,d);L[c+944>>3]=q;xb(d,70545,c+944|0)}if(Oa){hb(89916,21,1,d);hb(89850,21,1,d);L[c+928>>3]=q;xb(d,70545,c+928|0)}if(Ba){hb(89916,21,1,d);hb(89850,21,1,d);L[c+912>>3]=q;xb(d,70545,c+912|0)}if(P){hb(89894,21,1,d);hb(89828,21,1,d)}if(Pa){hb(89872,21,1,d);hb(89806,21,1,d)}L[c+896>>3]=L[a+64>>3];xb(d,71373,c+896|0);L[c+880>>3]=L[a+72>>3];xb(d,71319,c+880|0);if((g|0)>=3){L[c+864>>3]=R;xb(d,71283,c+864|0)}if(b){L[c+848>>3]=T;xb(d,71229,c+848|0)}i=+(w|0);L[c+832>>3]=(i+1)*.5;xb(d,72266,c+832|0);j=+(e|0);L[c+816>>3]=(j+1)*.5;xb(d,72248,c+816|0);if((g|0)>=3){L[c+800>>3]=A;xb(d,71247,c+800|0)}if(b){L[c+784>>3]=z;xb(d,71193,c+784|0)}L[c+768>>3]=-h;xb(d,71355,c+768|0);L[c+752>>3]=h;xb(d,71301,c+752|0);if((g|0)>=3){L[c+736>>3]=S;xb(d,71265,c+736|0)}if(b){L[c+720>>3]=U;xb(d,71211,c+720|0)}L[c+704>>3]=L[a+96>>3];xb(d,71337,c+704|0);hb(85385,4,1,d);$a(d);Hb(d);r=0;b=Fa-84112|0;Fa=b;Ea:{Fa:{K=ac(Na,13287);if(K){E[b+16|0]=0;V=G[29763];while(1){if(vc(b+80016|0,4096,K)){g=(Va(b+80016|0)+b|0)+80015|0;if(H[g|0]==10){E[g|0]=0}g=(Va(b+80016|0)+b|0)+80015|0;if(H[g|0]==13){E[g|0]=0}if(G[935722]>=3){G[b>>2]=b+80016;kb(76800,b);$a(V)}p=Va(b+16|0);g=Va(b+80016|0);Ga:{if((g|0)>0){bb(p+(b+16|0)|0,b+80016|0,g);if(g>>>0>79){break Ga}}cb(b+16+(g+p)|0,32,80-g|0)}E[(b+p|0)+96|0]=0;r=r+1|0;if((r|0)!=1e3){continue}}break}g=rd(b+16|0);G[935754]=g;if(!g){break Fa}Fa=b+84112|0;break Ea}hb(84323,54,1,G[321435]);break a}hb(84378,54,1,G[321435]);break a}b=c+3032|0;g=c+3024|0;cc(G[935754],.5,.5,b,g);L[m>>3]=L[c+3032>>3];L[l>>3]=L[c+3024>>3];o=i+.5;cc(G[935754],o,.5,b,g);L[m+8>>3]=L[c+3032>>3];L[l+8>>3]=L[c+3024>>3];f=o;o=j+.5;cc(G[935754],f,o,b,g);L[m+16>>3]=L[c+3032>>3];L[l+16>>3]=L[c+3024>>3];cc(G[935754],.5,o,b,g);o=L[c+3032>>3];L[m+24>>3]=o;f=L[c+3024>>3];L[l+24>>3]=f;if(G[935722]!=1){E[c+3056|0]=0;Ha:{if((n|0)>=0){x=L[l+16>>3];y=L[m+16>>3];z=L[l+8>>3];A=L[m+8>>3];R=L[l>>3];S=L[m>>3];T=L[a+96>>3];U=L[a+72>>3];L[c+592>>3]=L[a+64>>3];L[c+600>>3]=U;L[c+608>>3]=h*i;L[c+616>>3]=h*j;L[c+624>>3]=T;L[c+632>>3]=S;L[c+640>>3]=R;L[c+648>>3]=A;L[c+656>>3]=z;L[c+664>>3]=y;L[c+672>>3]=x;L[c+680>>3]=o;L[c+688>>3]=f;G[c+576>>2]=Q;G[c+580>>2]=wa;G[c+584>>2]=w;G[c+588>>2]=e;xb(G[321435],77424,c+576|0);break Ha}b=c+3056|0;bb(b,42312,77);o=L[l+24>>3];f=L[m+24>>3];x=L[l+16>>3];y=L[m+16>>3];z=L[l+8>>3];A=L[m+8>>3];R=L[l>>3];S=L[m>>3];T=L[a+96>>3];U=L[a+72>>3];k=L[a+64>>3];G[c+464>>2]=e;L[c+472>>3]=k;L[c+480>>3]=U;L[c+488>>3]=h*i;L[c+496>>3]=h*j;L[c+504>>3]=T;L[c+512>>3]=S;L[c+520>>3]=R;L[c+528>>3]=A;L[c+536>>3]=z;L[c+544>>3]=y;L[c+552>>3]=x;L[c+560>>3]=f;L[c+568>>3]=o;G[c+452>>2]=Q;G[c+456>>2]=wa;G[c+460>>2]=w;a=G[321435];G[c+448>>2]=b;xb(a,77201,c+448|0)}$a(X)}break b}hb(83649,57,1,G[321435])}$a(X);break a}$a(G[321435]);Hb(G[321435]);sc(0);W()}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Ch(a){var 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,A=0,B=0,C=0,D=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;r=Fa-16|0;Fa=r;x=-2;a:{if(!G[a+36>>2]|(!a|!G[a+32>>2])){break a}f=G[a+28>>2];if(!f|G[f>>2]!=(a|0)){break a}g=G[f+4>>2];if(g-16180>>>0>31){break a}o=G[a+12>>2];if(!o){break a}c=G[a>>2];if(!(G[a+4>>2]?c:1)){break a}if((g|0)==16191){G[f+4>>2]=16192;g=16192}O=f+92|0;z=f+756|0;A=f+116|0;D=f+88|0;B=f+112|0;y=f+1332|0;d=G[f+64>>2];C=G[a+4>>2];h=C;e=G[f+60>>2];l=G[a+16>>2];t=l;b:{c:{d:while(1){e:{b=-3;i=1;f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{V:{W:{X:{Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{ga:{ha:{ia:{ja:{ka:{la:{ma:{switch(g-16180|0){case 23:m=G[f+76>>2];b=c;g=h;break A;case 21:i=G[f+76>>2];break C;case 18:g=G[f+108>>2];break L;case 27:g=G[f+12>>2];break f;case 16:if(d>>>0>=14){break U}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0<=5){break V}c=g;h=i;d=b;break U;case 9:if(d>>>0>=32){break $}if(!h){break e}b=c+1|0;g=h-1|0;e=(H[c|0]<>>0<=23){break aa}c=b;h=g;break $;case 1:if(d>>>0>=16){break ka}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0<=7){break la}c=g;h=i;d=b;break ka;case 8:break j;case 7:break k;case 6:break l;case 5:break m;case 24:break z;case 22:break B;case 20:break J;case 19:break K;case 30:break b;case 26:break Q;case 25:break R;case 17:break T;case 29:break c;case 15:break W;case 14:break X;case 13:break Y;case 11:case 12:break Z;case 10:break _;case 4:break da;case 3:break ga;case 2:break ja;case 0:break ma;case 28:break g;default:break a}}k=G[f+12>>2];if(!k){break P}na:{if(d>>>0>=16){break na}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0>7){c=g;h=i;d=b;break na}if(!i){c=g;h=0;d=b;b=n;break c}d=d+16|0;h=h-2|0;e=(H[c+1|0]<>2]){G[f+40>>2]=15}e=0;d=Oc(0,0,0);G[f+28>>2]=d;E[r+12|0]=31;E[r+13|0]=139;W=f,X=Oc(d,r+12|0,2),G[W+28>>2]=X;G[f+4>>2]=16181;d=0;g=G[f+4>>2];continue}G[f+20>>2]=0;b=G[f+36>>2];if(b){G[b+48>>2]=-1}if(!(((e<<8&65280)+(e>>>8|0)>>>0)%31|0?0:k&1)){G[a+24>>2]=17233;G[f+4>>2]=16209;g=G[f+4>>2];continue}if((e&15)!=8){G[a+24>>2]=26035;G[f+4>>2]=16209;g=G[f+4>>2];continue}g=e>>>4|0;k=g&15;i=k+8|0;j=k>>>0<=7;b=G[f+40>>2];if(!b){G[f+40>>2]=i;b=i}if(!(b>>>0>=i>>>0&j)){d=d-4|0;G[a+24>>2]=19724;G[f+4>>2]=16209;e=g;g=G[f+4>>2];continue}G[f+24>>2]=256<>2]=b;G[a+48>>2]=b;G[f+4>>2]=e&8192?16189:16191;e=0;g=G[f+4>>2];continue}if(!i){c=g;h=0;d=b;b=n;break c}d=d+16|0;h=h-2|0;e=(H[c+1|0]<>2]=e;if((e&255)!=8){G[a+24>>2]=26035;G[f+4>>2]=16209;g=G[f+4>>2];continue}if(e&57344){G[a+24>>2]=5085;G[f+4>>2]=16209;g=G[f+4>>2];continue}d=G[f+36>>2];if(d){G[d>>2]=e>>>8&1}if(!(!(e&512)|!(H[f+12|0]&4))){E[r+12|0]=e;E[r+13|0]=e>>>8;W=f,X=Oc(G[f+28>>2],r+12|0,2),G[W+28>>2]=X}G[f+4>>2]=16182;d=0;e=0;break ia}if(d>>>0>31){break ha}}if(!h){break e}b=c+1|0;g=h-1|0;e=(H[c|0]<>>0>23){c=b;h=g;break ha}i=d+8|0;if(!g){c=b;h=0;d=i;b=n;break c}b=c+2|0;g=h-2|0;e=(H[c+1|0]<>>0>15){c=b;h=g;break ha}i=d+16|0;if(!g){c=b;h=0;d=i;b=n;break c}b=c+3|0;g=h-3|0;e=(H[c+2|0]<>>0>7){c=b;h=g;break ha}d=d+24|0;if(!g){c=b;h=0;b=n;break c}h=h-4|0;e=(H[c+3|0]<>2];if(d){G[d+4>>2]=e}if(!(!(H[f+21|0]&2)|!(H[f+12|0]&4))){E[r+12|0]=e;E[r+13|0]=e>>>8;E[r+14|0]=e>>>16;E[r+15|0]=e>>>24;W=f,X=Oc(G[f+28>>2],r+12|0,4),G[W+28>>2]=X}G[f+4>>2]=16183;d=0;e=0;break fa}if(d>>>0>15){break ea}}if(!h){break e}b=c+1|0;g=h-1|0;e=(H[c|0]<>>0>7){c=b;h=g;break ea}d=d+8|0;if(!g){c=b;h=0;b=n;break c}h=h-2|0;e=(H[c+1|0]<>2];if(d){G[d+12>>2]=e>>>8;G[d+8>>2]=e&255}if(!(!(H[f+21|0]&2)|!(H[f+12|0]&4))){E[r+12|0]=e;E[r+13|0]=e>>>8;W=f,X=Oc(G[f+28>>2],r+12|0,2),G[W+28>>2]=X}G[f+4>>2]=16184;g=0;d=0;e=0;b=G[f+20>>2];if(b&1024){break ca}break o}b=G[f+20>>2];if(!(b&1024)){g=d;break o}g=e;if(d>>>0>15){break ba}}if(!h){h=0;e=g;b=n;break c}i=c+1|0;k=h-1|0;e=(H[c|0]<>>0>7){c=i;h=k;break ba}d=d+8|0;if(!k){c=i;h=0;b=n;break c}h=h-2|0;e=(H[c+1|0]<>2]=e;d=G[f+36>>2];if(d){G[d+20>>2]=e}d=0;if(!(!(b&512)|!(H[f+12|0]&4))){E[r+12|0]=e;E[r+13|0]=e>>>8;W=f,X=Oc(G[f+28>>2],r+12|0,2),G[W+28>>2]=X}e=0;break n}i=d+8|0;if(!g){c=b;h=0;d=i;b=n;break c}b=c+2|0;g=h-2|0;e=(H[c+1|0]<>>0>15){c=b;h=g;break $}i=d+16|0;if(!g){c=b;h=0;d=i;b=n;break c}b=c+3|0;g=h-3|0;e=(H[c+2|0]<>>0>7){c=b;h=g;break $}d=d+24|0;if(!g){c=b;h=0;b=n;break c}h=h-4|0;e=(H[c+3|0]<>>8&65280|e>>>24);G[f+28>>2]=d;G[a+48>>2]=d;G[f+4>>2]=16190;e=0;d=0}if(!G[f+16>>2]){G[a+16>>2]=l;G[a+12>>2]=o;G[a+4>>2]=h;G[a>>2]=c;G[f+64>>2]=d;G[f+60>>2]=e;x=2;break a}b=gf(0,0,0);G[f+28>>2]=b;G[a+48>>2]=b;G[f+4>>2]=16191}oa:{pa:{if(!G[f+8>>2]){if(d>>>0<3){break pa}break oa}G[f+4>>2]=16206;e=e>>>(d&7)|0;d=d&-8;g=G[f+4>>2];continue}if(!h){break e}h=h-1|0;e=(H[c|0]<>2]=e&1;g=16193;qa:{ra:{sa:{switch((e>>>1&3)-1|0){case 0:G[f+80>>2]=113520;G[f+88>>2]=9;G[f+92>>2]=5;G[f+84>>2]=115568;G[f+4>>2]=16199;break qa;case 1:g=16196;break ra;case 2:break sa;default:break ra}}G[a+24>>2]=21052;g=16209}G[f+4>>2]=g}d=d-3|0;e=e>>>3|0;g=G[f+4>>2];continue}e=e>>>(d&7)|0;d=d&-8;ta:{if(d>>>0>31){break ta}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0>23){c=g;h=i;d=b;break ta}if(!i){c=g;h=0;d=b;b=n;break c}g=d+16|0;i=c+2|0;k=h-2|0;e=(H[c+1|0]<>>0>15){c=i;h=k;d=g;break ta}if(!k){c=i;h=0;d=g;b=n;break c}b=d+24|0;i=c+3|0;k=h-3|0;e=(H[c+2|0]<>>16|0)){G[a+24>>2]=7070;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+4>>2]=16194;G[f+68>>2]=b;e=0;d=0}G[f+4>>2]=16195}b=G[f+68>>2];if(b){b=b>>>0>>0?b:h;b=b>>>0>>0?b:l;if(!b){break h}g=bb(o,c,b);G[f+68>>2]=G[f+68>>2]-b;o=b+g|0;l=l-b|0;c=b+c|0;h=h-b|0;g=G[f+4>>2];continue}G[f+4>>2]=16191;g=G[f+4>>2];continue}if(!i){c=g;h=0;d=b;b=n;break c}d=d+16|0;h=h-2|0;e=(H[c+1|0]<>2]=b+257;g=e>>>5&31;G[f+104>>2]=g+1;k=(e>>>10&15)+4|0;G[f+96>>2]=k;d=d-14|0;e=e>>>14|0;if(!(g>>>0<30&b>>>0<=29)){G[a+24>>2]=6875;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+4>>2]=16197;g=0;G[f+108>>2]=0;break S}g=G[f+108>>2];k=G[f+96>>2];if(g>>>0>=k>>>0){break M}}b=g;while(1){if(d>>>0<=2){if(!h){break e}h=h-1|0;e=(H[c|0]<>2]=g;F[((I[(b<<1)+113472>>1]<<1)+f|0)+116>>1]=e&7;d=d-3|0;e=e>>>3|0;b=g;if(k>>>0>b>>>0){continue}break}break M}if(!l){break y}E[o|0]=G[f+68>>2];G[f+4>>2]=16200;l=l-1|0;o=o+1|0;g=G[f+4>>2];continue}g=G[f+12>>2];if(!g){g=0;break N}ua:{if(d>>>0>31){i=c;break ua}if(!h){break e}b=d+8|0;i=c+1|0;k=h-1|0;e=(H[c|0]<>>0>23){h=k;d=b;break ua}if(!k){c=i;h=0;d=b;b=n;break c}k=d+16|0;i=c+2|0;j=h-2|0;e=(H[c+1|0]<>>0>15){h=j;d=k;break ua}if(!j){c=i;h=0;d=k;b=n;break c}b=d+24|0;i=c+3|0;j=h-3|0;e=(H[c+2|0]<>>0>7){h=j;d=b;break ua}if(!j){c=i;h=0;d=b;b=n;break c}d=d+32|0;i=c+4|0;h=h-4|0;e=(H[c+3|0]<>2]=c+G[a+20>>2];G[f+32>>2]=c+G[f+32>>2];b=g&4;if(!(!b|(l|0)==(t|0))){b=o-c|0;g=G[f+28>>2];va:{if(G[f+20>>2]){c=Oc(g,b,c);break va}c=gf(g,b,c)}G[f+28>>2]=c;G[a+48>>2]=c;g=G[f+12>>2];b=g&4}if(!b|G[f+28>>2]==((G[f+20>>2]?e:e<<8&16711680|e<<24|(e>>>8&65280|e>>>24))|0)){break O}G[a+24>>2]=17279;G[f+4>>2]=16209;c=i;t=l;g=G[f+4>>2];continue}G[f+4>>2]=16192;break q}c=i;e=0;d=0;t=l}G[f+4>>2]=16207;break f}if(g>>>0<=18){i=0;b=g;n=3-b&3;if(n){while(1){F[((I[(b<<1)+113472>>1]<<1)+f|0)+116>>1]=0;b=b+1|0;i=i+1|0;if((n|0)!=(i|0)){continue}break}}if(g-16>>>0>=3){while(1){n=f+116|0;g=b<<1;F[n+(I[g+113472>>1]<<1)>>1]=0;F[n+(I[g+113474>>1]<<1)>>1]=0;F[n+(I[g+113476>>1]<<1)>>1]=0;F[n+(I[g+113478>>1]<<1)>>1]=0;b=b+4|0;if((b|0)!=19){continue}break}}G[f+108>>2]=19}G[f+88>>2]=7;G[f+80>>2]=y;G[f+112>>2]=y;g=0;n=Pk(0,A,19,B,D,z);if(n){G[a+24>>2]=5060;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+4>>2]=16198;G[f+108>>2]=0;n=0}w=G[f+100>>2];s=w+G[f+104>>2]|0;if(s>>>0>g>>>0){u=-1<>2]^-1;q=G[f+80>>2];while(1){m=d;i=h;k=c;p=e&u;j=H[(q+(p<<2)|0)+1|0];wa:{if(j>>>0<=d>>>0){b=d;break wa}while(1){if(!i){break I}j=H[k|0]<>>0>b>>>0){continue}break}c=k;h=i}d=I[(q+(p<<2)|0)+2>>1];xa:{if(d>>>0<=15){i=g+1|0;G[f+108>>2]=i;F[((g<<1)+f|0)+116>>1]=d;d=b-j|0;e=e>>>j|0;g=i;break xa}ya:{za:{Aa:{switch(d-16|0){case 0:d=j+2|0;if(d>>>0>b>>>0){while(1){if(!h){break p}h=h-1|0;e=(H[c|0]<>>0>b>>>0){continue}break}}d=b-j|0;b=e>>>j|0;if(!g){G[a+24>>2]=5255;G[f+4>>2]=16209;e=b;g=G[f+4>>2];continue d}d=d-2|0;e=b>>>2|0;i=(b&3)+3|0;b=I[((g<<1)+f|0)+114>>1];break ya;case 1:d=j+3|0;if(d>>>0>b>>>0){while(1){if(!h){break p}h=h-1|0;e=(H[c|0]<>>0>b>>>0){continue}break}}d=(b-j|0)-3|0;b=e>>>j|0;e=b>>>3|0;i=(b&7)+3|0;break za;default:break Aa}}d=j+7|0;if(d>>>0>b>>>0){while(1){if(!h){break p}h=h-1|0;e=(H[c|0]<>>0>b>>>0){continue}break}}d=(b-j|0)-7|0;b=e>>>j|0;e=b>>>7|0;i=(b&127)+11|0}b=0}if(s>>>0>>0){break F}j=i-1|0;k=0;m=i&3;if(m){while(1){F[((g<<1)+f|0)+116>>1]=b;g=g+1|0;i=i-1|0;k=k+1|0;if((m|0)!=(k|0)){continue}break}}if(j>>>0>=3){while(1){k=(g<<1)+f|0;F[k+118>>1]=b;F[k+116>>1]=b;F[k+120>>1]=b;F[k+122>>1]=b;g=g+4|0;i=i-4|0;if(i){continue}break}}G[f+108>>2]=g}if(g>>>0>>0){continue}break}}if(!I[f+628>>1]){G[a+24>>2]=17150;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+88>>2]=9;G[f+80>>2]=y;G[f+112>>2]=y;n=Pk(1,A,w,B,D,z);if(n){G[a+24>>2]=5032;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+92>>2]=6;G[f+84>>2]=G[f+112>>2];n=Pk(2,(G[f+100>>2]<<1)+A|0,G[f+104>>2],B,O,z);if(n){G[a+24>>2]=5110;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+4>>2]=16199;n=0}G[f+4>>2]=16200}if(!(h>>>0<6|l>>>0<258)){G[a+16>>2]=l;G[a+12>>2]=o;G[a+4>>2]=h;G[a>>2]=c;G[f+64>>2]=d;G[f+60>>2]=e;e=G[a+12>>2];d=G[a+16>>2];c=e+d|0;s=c+(t^-1)|0;m=G[a+28>>2];o=G[m+52>>2];P=(c+(o^-1)|0)-t|0;u=o&7;K=G[m+44>>2];Q=o+K|0;w=c-257|0;R=(d-t|0)+e|0;g=G[a>>2];L=(g+G[a+4>>2]|0)-5|0;S=-1<>2]^-1;T=-1<>2]^-1;M=G[m+84>>2];N=G[m+80>>2];h=G[m+64>>2];j=G[m+60>>2];k=G[m+56>>2];U=G[m+48>>2];V=o-1>>>0<7;while(1){if(h>>>0<=14){j=((H[g|0]<>>c|0;c=I[d+2>>1];Ba:{Ca:{Da:{b=H[d|0];if(!b){break Da}Ea:{Fa:{Ga:{while(1){if(b&16){l=c&65535;c=b&15;Ha:{if(!c){d=g;b=j;break Ha}Ia:{if(c>>>0<=h>>>0){b=h;break Ia}b=h+8|0;j=(H[g|0]<>>c|0}if(h>>>0<=14){b=((H[d|0]<>>c|0;c=I[g+2>>1];b=H[g|0];if(b&16){break Ga}while(1){if(!(b&64)){b=(((-1<>>c|0;c=I[b+2>>1];b=H[b|0];if(!(b&16)){continue}break Ga}break}l=25378;g=d;break Fa}d=b&255;if(!(d&64)){d=(((-1<>>c|0;c=I[d+2>>1];b=H[d|0];if(!b){break Da}continue}break}l=25322;c=16191;if(b&32){break Ea}break Fa}p=c&65535;b=b&15;Ja:{if(b>>>0<=h>>>0){c=h;g=d;break Ja}j=(H[d|0]<>>0<=c>>>0){break Ja}j=(H[d+1|0]<>>b|0;Ka:{q=d+p|0;c=e-R|0;if(q>>>0>c>>>0){i=q-c|0;if(!(!G[m+7108>>2]|i>>>0<=U>>>0)){l=17312;break Fa}La:{Ma:{if(!o){b=k+(K-i|0)|0;if(i>>>0>=l>>>0){break La}p=(p+(d+s|0)|0)-e|0;d=0;c=i;v=c&7;if(v){while(1){E[e|0]=H[b|0];c=c-1|0;e=e+1|0;b=b+1|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}if(p>>>0<7){break Ma}while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];E[e+3|0]=H[b+3|0];E[e+4|0]=H[b+4|0];E[e+5|0]=H[b+5|0];E[e+6|0]=H[b+6|0];E[e+7|0]=H[b+7|0];e=e+8|0;b=b+8|0;c=c-8|0;if(c){continue}break}break Ma}if(i>>>0>o>>>0){b=k+(Q-i|0)|0;i=i-o|0;if(i>>>0>=l>>>0){break La}p=(p+(d+P|0)|0)-e|0;d=0;c=i;v=c&7;if(v){while(1){E[e|0]=H[b|0];c=c-1|0;e=e+1|0;b=b+1|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}if(p>>>0>=7){while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];E[e+3|0]=H[b+3|0];E[e+4|0]=H[b+4|0];E[e+5|0]=H[b+5|0];E[e+6|0]=H[b+6|0];E[e+7|0]=H[b+7|0];e=e+8|0;b=b+8|0;c=c-8|0;if(c){continue}break}}l=l-i|0;if(o>>>0>=l>>>0){b=k;break La}d=0;c=o;b=k;if(u){while(1){E[e|0]=H[b|0];c=c-1|0;e=e+1|0;b=b+1|0;d=d+1|0;if((u|0)!=(d|0)){continue}break}}if(!V){while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];E[e+3|0]=H[b+3|0];E[e+4|0]=H[b+4|0];E[e+5|0]=H[b+5|0];E[e+6|0]=H[b+6|0];E[e+7|0]=H[b+7|0];e=e+8|0;b=b+8|0;c=c-8|0;if(c){continue}break}}b=e-q|0;l=l-o|0;break La}b=k+(o-i|0)|0;if(i>>>0>=l>>>0){break La}p=(p+(d+s|0)|0)-e|0;d=0;c=i;v=c&7;if(v){while(1){E[e|0]=H[b|0];c=c-1|0;e=e+1|0;b=b+1|0;d=d+1|0;if((v|0)!=(d|0)){continue}break}}if(p>>>0<7){break Ma}while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];E[e+3|0]=H[b+3|0];E[e+4|0]=H[b+4|0];E[e+5|0]=H[b+5|0];E[e+6|0]=H[b+6|0];E[e+7|0]=H[b+7|0];e=e+8|0;b=b+8|0;c=c-8|0;if(c){continue}break}}b=e-q|0;l=l-i|0}Na:{if(l>>>0<3){break Na}c=0;d=l-3|0;i=((d>>>0)/3|0)+1&3;if(i){while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];l=l-3|0;e=e+3|0;b=b+3|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(d>>>0<9){break Na}while(1){E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];E[e+3|0]=H[b+3|0];E[e+4|0]=H[b+4|0];E[e+5|0]=H[b+5|0];E[e+6|0]=H[b+6|0];E[e+7|0]=H[b+7|0];E[e+8|0]=H[b+8|0];E[e+9|0]=H[b+9|0];E[e+10|0]=H[b+10|0];E[e+11|0]=H[b+11|0];e=e+12|0;b=b+12|0;l=l-12|0;if(l>>>0>2){continue}break}}if(!l){break Ca}E[e|0]=H[b|0];if((l|0)!=1){break Ka}e=e+1|0;break Ca}d=e-q|0;while(1){c=e;b=d;E[e|0]=H[b|0];E[e+1|0]=H[b+1|0];E[e+2|0]=H[b+2|0];e=e+3|0;d=b+3|0;l=l-3|0;if(l>>>0>2){continue}break}if(!l){break Ca}E[c+3|0]=H[d|0];if((l|0)==1){e=c+4|0;break Ca}E[c+4|0]=H[b+4|0];e=c+5|0;break Ca}E[e+1|0]=H[b+1|0];e=e+2|0;break Ca}G[a+24>>2]=l;c=16209}G[m+4>>2]=c;break Ba}E[e|0]=c;e=e+1|0}if(g>>>0>=L>>>0){break Ba}if(e>>>0>>0){continue}}break}G[a+12>>2]=e;c=g-(h>>>3|0)|0;G[a>>2]=c;G[a+16>>2]=(w-e|0)+257;G[a+4>>2]=(L-c|0)+5;c=h&7;G[m+64>>2]=c;G[m+60>>2]=(-1<>2];e=G[f+60>>2];h=G[a+4>>2];c=G[a>>2];l=G[a+16>>2];o=G[a+12>>2];if(G[f+4>>2]!=16191){break q}G[f+7112>>2]=-1;g=G[f+4>>2];continue}G[f+7112>>2]=0;i=d;g=h;b=c;s=G[f+80>>2];p=-1<>2]^-1;j=s+((p&e)<<2)|0;m=H[j+1|0];Oa:{if(m>>>0<=d>>>0){k=d;break Oa}while(1){if(!g){break G}j=H[b|0]<>>0>>0){continue}break}}p=I[j+2>>1];i=H[j|0];if(!i|i&240){break E}h=g;c=b;d=k;u=-1<>>m|0)+p<<2)|0;j=H[q+1|0];Pa:{if(d>>>0>=m+j>>>0){i=k;break Pa}while(1){if(!h){break H}j=H[c|0]<>>m|0)+p<<2)|0;j=H[q+1|0];if(d>>>0>>0){continue}break}}k=i-m|0;e=e>>>m|0;i=H[q|0];p=I[q+2>>1];break D}c=c+h|0;d=(h<<3)+d|0;break e}c=b+g|0;d=(g<<3)+k|0;break e}c=c+h|0;d=(h<<3)+d|0;break e}G[a+24>>2]=5255;G[f+4>>2]=16209;g=G[f+4>>2];continue}j=m;m=0;c=b;h=g}G[f+68>>2]=p&65535;G[f+7112>>2]=j+m;d=k-j|0;e=e>>>j|0;if(!i){G[f+4>>2]=16205;g=G[f+4>>2];continue}if(i&32){G[f+4>>2]=16191;G[f+7112>>2]=-1;g=G[f+4>>2];continue}if(i&64){G[a+24>>2]=25322;G[f+4>>2]=16209;g=G[f+4>>2];continue}G[f+4>>2]=16201;i=i&15;G[f+76>>2]=i}j=c;k=h;Qa:{if(!i){b=G[f+68>>2];break Qa}g=d;b=c;if(d>>>0>>0){while(1){if(!h){break t}h=h-1|0;e=(H[b|0]<>>0>g>>>0){continue}break}}G[f+7112>>2]=G[f+7112>>2]+i;b=G[f+68>>2]+((-1<>2]=b;d=g-i|0;e=e>>>i|0}G[f+4>>2]=16202;G[f+7116>>2]=b}i=d;g=h;b=c;s=G[f+84>>2];p=-1<>2]^-1;j=s+((p&e)<<2)|0;m=H[j+1|0];Ra:{if(m>>>0<=d>>>0){k=d;break Ra}while(1){if(!g){break u}j=H[b|0]<>>0>>0){continue}break}}p=I[j+2>>1];j=H[j|0];Sa:{if(j&240){i=m;c=G[f+7112>>2];break Sa}h=g;c=b;d=k;u=-1<>>m|0)+p<<2)|0;i=H[q+1|0];Ta:{if(d>>>0>=m+i>>>0){j=k;break Ta}while(1){if(!h){break v}i=H[c|0]<>>m|0)+p<<2)|0;i=H[q+1|0];if(d>>>0>>0){continue}break}b=c;g=h}k=j-m|0;e=e>>>m|0;j=H[q|0];p=I[q+2>>1];c=G[f+7112>>2]+m|0}G[f+7112>>2]=c+i;d=k-i|0;e=e>>>i|0;if(j&64){G[a+24>>2]=25378;G[f+4>>2]=16209;c=b;h=g;g=G[f+4>>2];continue}G[f+4>>2]=16203;m=j&15;G[f+76>>2]=m;G[f+72>>2]=p&65535}Ua:{if(!m){c=b;h=g;break Ua}i=d;h=g;k=b;Va:{if(d>>>0>=m>>>0){c=b;break Va}while(1){if(!h){break w}h=h-1|0;e=(H[k|0]<>>0>i>>>0){continue}break}}G[f+7112>>2]=G[f+7112>>2]+m;G[f+72>>2]=G[f+72>>2]+((-1<>>m|0}G[f+4>>2]=16204}if(l){break x}}l=0;break h}b=G[f+72>>2];g=t-l|0;Wa:{if(b>>>0>g>>>0){b=b-g|0;if(!(!G[f+7108>>2]|b>>>0<=J[f+48>>2])){G[a+24>>2]=17312;G[f+4>>2]=16209;g=G[f+4>>2];continue}g=G[f+52>>2];Xa:{if(g>>>0>>0){b=b-g|0;g=G[f+56>>2]+(G[f+44>>2]-b|0)|0;break Xa}g=G[f+56>>2]+(g-b|0)|0}i=G[f+68>>2];b=b>>>0>>0?b:i;break Wa}g=o-b|0;i=G[f+68>>2];b=i}k=b>>>0>>0?b:l;G[f+68>>2]=i-k;j=k-1|0;i=0;m=k&7;if(!m){break s}b=k;while(1){E[o|0]=H[g|0];b=b-1|0;o=o+1|0;g=g+1|0;i=i+1|0;if((m|0)!=(i|0)){continue}break}break r}c=b+g|0;d=(g<<3)+d|0;break e}c=b+g|0;d=(g<<3)+k|0;break e}c=c+h|0;d=(h<<3)+d|0;break e}c=k+j|0;d=(k<<3)+d|0;break e}b=k}if(j>>>0>=7){while(1){E[o|0]=H[g|0];E[o+1|0]=H[g+1|0];E[o+2|0]=H[g+2|0];E[o+3|0]=H[g+3|0];E[o+4|0]=H[g+4|0];E[o+5|0]=H[g+5|0];E[o+6|0]=H[g+6|0];E[o+7|0]=H[g+7|0];o=o+8|0;g=g+8|0;b=b-8|0;if(b){continue}break}}l=l-k|0;if(G[f+68>>2]){break q}G[f+4>>2]=16200;g=G[f+4>>2];continue}g=G[f+4>>2];continue}h=0;d=b;b=n;break c}d=G[f+36>>2];if(d){G[d+16>>2]=0}d=g}G[f+4>>2]=16185}i=G[f+20>>2];if(i&1024){g=G[f+68>>2];b=g>>>0>>0?g:h;if(b){k=G[f+36>>2];Ya:{if(!k){break Ya}j=G[k+16>>2];if(!j){break Ya}g=G[k+20>>2]-g|0;i=G[k+24>>2];bb(g+j|0,c,i>>>0>>0?i-g|0:b);i=G[f+20>>2]}if(!(!(i&512)|!(H[f+12|0]&4))){W=f,X=Oc(G[f+28>>2],c,b),G[W+28>>2]=X}g=G[f+68>>2]-b|0;G[f+68>>2]=g;h=h-b|0;c=b+c|0}if(g){break h}}G[f+4>>2]=16186;G[f+68>>2]=0}Za:{if(H[f+21|0]&8){g=0;if(!h){break i}while(1){b=H[c+g|0];i=G[f+36>>2];_a:{if(!i){break _a}k=G[i+28>>2];if(!k){break _a}j=G[i+32>>2];i=G[f+68>>2];if(j>>>0<=i>>>0){break _a}G[f+68>>2]=i+1;E[i+k|0]=b}g=g+1|0;if(h>>>0>g>>>0?b:0){continue}break}if(!(!(H[f+21|0]&2)|!(H[f+12|0]&4))){W=f,X=Oc(G[f+28>>2],c,g),G[W+28>>2]=X}c=c+g|0;h=h-g|0;if(!b){break Za}break h}b=G[f+36>>2];if(!b){break Za}G[b+28>>2]=0}G[f+4>>2]=16187;G[f+68>>2]=0}$a:{if(H[f+21|0]&16){g=0;if(!h){break i}while(1){b=H[c+g|0];i=G[f+36>>2];ab:{if(!i){break ab}k=G[i+36>>2];if(!k){break ab}j=G[i+40>>2];i=G[f+68>>2];if(j>>>0<=i>>>0){break ab}G[f+68>>2]=i+1;E[i+k|0]=b}g=g+1|0;if(h>>>0>g>>>0?b:0){continue}break}if(!(!(H[f+21|0]&2)|!(H[f+12|0]&4))){W=f,X=Oc(G[f+28>>2],c,g),G[W+28>>2]=X}c=c+g|0;h=h-g|0;if(!b){break $a}break h}b=G[f+36>>2];if(!b){break $a}G[b+36>>2]=0}G[f+4>>2]=16188}k=G[f+20>>2];if(k&512){bb:{if(d>>>0>15){g=c;break bb}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0>7){h=i;d=b;break bb}if(!i){c=g;h=0;d=b;b=n;break c}d=d+16|0;g=c+2|0;h=h-2|0;e=(H[c+1|0]<>1]==(e|0))){G[a+24>>2]=17514;G[f+4>>2]=16209;c=g;g=G[f+4>>2];continue}e=0;d=0;c=g}b=G[f+36>>2];if(b){G[b+48>>2]=1;G[b+44>>2]=k>>>9&1}b=Oc(0,0,0);G[f+28>>2]=b;G[a+48>>2]=b;G[f+4>>2]=16191;g=G[f+4>>2];continue}h=0}i=n}b=i;break c}cb:{if(!(!g|!G[f+20>>2])){db:{if(d>>>0>31){g=c;break db}if(!h){break e}b=d+8|0;g=c+1|0;i=h-1|0;e=(H[c|0]<>>0>23){h=i;d=b;break db}if(!i){c=g;h=0;d=b;b=n;break c}i=d+16|0;g=c+2|0;k=h-2|0;e=(H[c+1|0]<>>0>15){h=k;d=i;break db}if(!k){c=g;h=0;d=i;b=n;break c}b=d+24|0;g=c+3|0;k=h-3|0;e=(H[c+2|0]<>>0>7){h=k;d=b;break db}if(!k){c=g;h=0;d=b;b=n;break c}d=d+32|0;g=c+4|0;h=h-4|0;e=(H[c+3|0]<>2]!=(e|0)){break cb}d=0;e=0;c=g}G[f+4>>2]=16208;b=1;break c}G[a+24>>2]=17256;G[f+4>>2]=16209;c=g;g=G[f+4>>2];continue}break}h=0;b=n}G[a+16>>2]=l;G[a+12>>2]=o;G[a+4>>2]=h;G[a>>2]=c;G[f+64>>2]=d;G[f+60>>2]=e;eb:{fb:{if(!G[f+44>>2]){if((l|0)==(t|0)|J[f+4>>2]>16208){break fb}}d=t-l|0;c=G[a+28>>2];g=G[c+56>>2];gb:{if(!g){n=1;g=Ja[G[a+32>>2]](G[a+40>>2],1<>2],1)|0;G[c+56>>2]=g;if(!g){break gb}}h=G[c+44>>2];if(!h){G[c+48>>2]=0;G[c+52>>2]=0;h=1<>2];G[c+44>>2]=h}hb:{if(d>>>0>=h>>>0){bb(g,o-h|0,h);G[c+52>>2]=0;break hb}i=h;h=G[c+52>>2];i=i-h|0;n=i>>>0>>0;g=g+h|0;h=n?i:d;bb(g,o-d|0,h);if(n){d=d-h|0;bb(G[c+56>>2],o-d|0,d);G[c+52>>2]=d;break hb}n=0;d=h+G[c+52>>2]|0;g=d;d=G[c+44>>2];G[c+52>>2]=(g|0)==(d|0)?0:g;g=d;d=G[c+48>>2];if(g>>>0<=d>>>0){break gb}G[c+48>>2]=d+h;break gb}G[c+48>>2]=G[c+44>>2];n=0}if(n){break eb}l=G[a+16>>2];h=G[a+4>>2]}G[a+8>>2]=G[a+8>>2]+(C-h|0);c=t-l|0;G[a+20>>2]=c+G[a+20>>2];G[f+32>>2]=c+G[f+32>>2];if(!(!(H[f+12|0]&4)|(l|0)==(t|0))){d=G[a+12>>2]-c|0;g=G[f+28>>2];ib:{if(G[f+20>>2]){c=Oc(g,d,c);break ib}c=gf(g,d,c)}G[f+28>>2]=c;G[a+48>>2]=c}c=a;a=G[f+4>>2];G[c+44>>2]=((G[f+64>>2]+((G[f+8>>2]!=0)<<6)|0)+(((a|0)==16191)<<7)|0)+((a|0)==16199?256:((a|0)==16194)<<8);x=(h|0)==(C|0)?(l|0)==(t|0)?b?b:-5:b:b;break a}G[f+4>>2]=16210}x=-4}Fa=r+16|0;return x}function Ij(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var 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=N(0),z=0,A=0,B=0,C=0,D=0,F=0,I=0,J=0,P=0,Q=0,R=0,S=0,T=0,U=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;i=Fa-4688|0;Fa=i;t=G[47542];u=31;a:{if(!di(g,3730,32901,i+2528|0)){break a}j=Eu(nc(i+2528|0,0,10)- -64|0,29);if(j>>>0>16){break a}u=G[(j<<2)+145260>>2]}if(di(g,19692,32736,i+2528|0)){t=nc(i+2528|0,0,10)}m=di(g,21827,35570,i+1504|0);G[i+3660>>2]=0;E[i+1408|0]=0;Cb(a,16,35394,i+1408|0,i+1312|0,i+3660|0);b:{c:{d:{if(!G[i+3660>>2]){if(!Xc(i+1408|0,32954)){break d}}G[i+3660>>2]=0;E[i+1408|0]=0;Cb(a,16,35693,i+1408|0,i+1312|0,i+3660|0);if(G[i+3660>>2]){break c}if((_b(i+1408|0)|0)<=0){break c}}u=h;g=0;j=0;m=Fa-48|0;Fa=m;G[m+12>>2]=92041;G[m+24>>2]=1;G[m+28>>2]=21073;e:{if(!a){G[u>>2]=1;a=0;break e}G[m+8>>2]=a;b=Fa-128|0;Fa=b;G[b+32>>2]=0;G[b+48>>2]=0;G[m+44>>2]=0;f:{g:{h:{i:{j:{d=G[m+8>>2];k:{l:{if(d){G[b+24>>2]=d;break l}d=b+24|0;h=G[m+12>>2];c=b+48|0;a=G[c>>2];if((a|0)<=0){G[c>>2]=-102;ch(d,h,0,c);a=G[c>>2]}if(a){break k}d=G[b+24>>2]}if(Dc(d,b+56|0,b+48|0)){break k}if(G[b+56>>2]&-3){G[b+16>>2]=G[m+12>>2];_a(G[24367],86885,b+16|0);g=1;break f}if(Ec(G[b+24>>2],33788,b+36|0,0,b+48|0)){break k}B=G[b+36>>2];g=ab(B<<2);l=G[b+24>>2];h=Fa-352|0;Fa=h;d=b+48|0;a=G[d>>2];m:{if((a|0)>0){break m}G[b+52>>2]=0;E[h+256|0]=0;s=qb(h+256|0,33788,74);t=Va(s);if(t){a=0;if((t|0)>0){while(1){k=a+s|0;c=E[k|0];E[k|0]=c-97>>>0<26?c&95:c;a=a+1|0;if((t|0)!=(a|0)){continue}break}}n:{if(G[d>>2]>0){a=G[l+4>>2];k=G[a+76>>2];break n}k=G[l>>2];a=G[l+4>>2];if((k|0)!=G[a+76>>2]){mb(l,k+1|0,0,d);a=G[l+4>>2];k=G[a+76>>2]}c=G[a+104>>2];j=G[a+96>>2]+(k<<3)|0;v=G[j>>2];j=Bu(c-v|0,G[a+108>>2]-(G[j+4>>2]+(c>>>0>>0)|0)|0,80,0)}c=G[l>>2];if((c|0)!=(k|0)){mb(l,c+1|0,0,d);a=G[l+4>>2];k=G[a+76>>2]}c=3;k=G[a+96>>2]+(k<<3)|0;v=G[k>>2]+160|0;k=G[k+4>>2];G[a+120>>2]=v;G[a+124>>2]=v>>>0<160?k+1|0:k;o:{p:{if((j|0)>=3){B=B+1|0;v=t+(h+160|0)|0;k=0;while(1){if((Jg(l,h+160|0,d)|0)>0){a=G[d>>2];break m}a=c;q:{if(fb(s,h+160|0,t)){break q}E[h+248|0]=0;x=jb(h+160|0,61);if(!x){break q}x=x-v|0;c=207;if((x|0)>=8){break o}c=qb(h+248|0,v,x);G[h+348>>2]=0;if((ue(c,h+344|0,h+348|0)|0)>0){break q}c=G[h+344>>2];if((c|0)>=(B|0)|(c|0)<=0){break q}c=h+80|0;mc(h+160|0,c,h,d);lk(c,(G[h+344>>2]-1<<2)+g|0,d);c=G[h+344>>2]-1|0;if((c|0)>=G[b+52>>2]){G[b+52>>2]=c+1}if(G[d>>2]!=204){break q}G[d>>2]=0;k=1}c=a+1|0;if((a|0)!=(j|0)){continue}break}if(k){break p}}a=G[d>>2];break m}a=G[d>>2];if((a|0)>0){break m}c=204}a=c;G[d>>2]=a;break m}a=G[d>>2]}Fa=h+352|0;if(a){break k}r:{s:{switch(G[b+56>>2]){case 0:d=0;a=G[b+52>>2];if((a|0)<=0){break j}while(1){p=G[(d<<2)+g>>2];if((p|0)<2){d=d+1|0;if((a|0)!=(d|0)){continue}break j}break};a=0;h=0;break r;case 2:break s;default:break j}}if(G[b+52>>2]>=2){a=G[g+4>>2];n=a;q=a>>31}if(vd(G[b+24>>2],G[m+24>>2],0,b+28|0,0,b+48|0)){break k}if(!(n|q)){break j}a=G[b+28>>2];h=a>>31}if(Ec(G[b+24>>2],35693,b+32|0,0,b+48|0)){if(G[b+48>>2]!=202){break k}G[b+48>>2]=0}G[b+44>>2]=-1;if(Ec(G[b+24>>2],32876,b+44|0,0,b+48|0)){if(G[b+48>>2]!=202){break k}G[b+48>>2]=0}G[b+40>>2]=-1;if(Ec(G[b+24>>2],32885,b+40|0,0,b+48|0)){if(G[b+48>>2]!=202){break k}G[b+48>>2]=0}d=G[b+32>>2];t:{if(d){break t}d=0;u:{v:{c=G[b+40>>2];if((c|0)>=0){f=V(+((c+1>>>0)/12|0))+.5;if(!(O(f)<2147483648)){break v}d=~~f;break u}w:{switch(G[b+56>>2]){case 0:f=V(+((p>>>0)/12>>>0))+.5;if(!(O(f)<2147483648)){break v}d=~~f;break u;case 2:break w;default:break t}}f=V(+(Bu(Au(n,q,a,h),Ia,12,0)>>>0)+ +(Ia|0)*4294967296)+.5;if(!(O(f)<2147483648)){break v}d=~~f;break u}d=-2147483648}G[b+32>>2]=d}G[m+32>>2]=d;c=M(M(d,d),12);G[m+40>>2]=c;if(G[b+44>>2]<0){G[b+44>>2]=0}if(G[b+40>>2]<0){G[b+40>>2]=c-1}x:{if(Fc(G[b+24>>2],33575,b+96|0,0,b+48|0)){if(G[b+48>>2]!=202){break k}G[b+48>>2]=0;break x}y:{switch(H[b+96|0]-67|0){case 4:E[m+28|0]=71;break x;case 2:E[m+28|0]=69;break x;case 0:break y;default:break x}}E[m+28|0]=81}z:{if(Fc(G[b+24>>2],35081,b- -64|0,0,b+48|0)){if(G[b+48>>2]!=202){break k}G[b+48>>2]=0;break z}if(!nb(b- -64|0,35812,7)){E[m+29|0]=78;break z}if(!nb(b- -64|0,35085,5)){E[m+29|0]=82;break z}G[b>>2]=b- -64;_a(G[24367],86680,b)}d=ab(G[m+40>>2]<<2);G[m+44>>2]=d;if(!d){break i}j=G[b+44>>2];A:{if((j|0)<=0){break A}if(j-1>>>0>=7){k=j&-8;c=0;while(1){G[d+24>>2]=-240822174;G[d+28>>2]=-240822174;G[d+16>>2]=-240822174;G[d+20>>2]=-240822174;G[d+8>>2]=-240822174;G[d+12>>2]=-240822174;G[d>>2]=-240822174;G[d+4>>2]=-240822174;d=d+32|0;c=c+8|0;if((k|0)!=(c|0)){continue}break}}j=j&7;if(!j){break A}c=0;while(1){G[d>>2]=-240822174;d=d+4|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}B:{switch(G[b+56>>2]){case 2:if(!n&(q|0)<=0|(q|0)<0){break g}p=0;l=0;j=a<<2;while(1){c=Fa-16|0;Fa=c;k=p+1|0;l=k?l:l+1|0;p=k;ae(G[b+24>>2],G[m+24>>2],k,l,1,0,a,h,1,1,N(-1.637499996306027e30),d,c+15|0,b+60|0,b+48|0);Fa=c+16|0;if(G[b+48>>2]){break k}d=d+j|0;if((n|0)!=(p|0)|(l|0)!=(q|0)){continue}break};break g;case 0:break B;default:break g}}if(!hl(G[b+24>>2],0,1,0,p,0,N(-1.637499996306027e30),d,b+60|0,b+48|0)){break g}}wf(G[24367],G[b+48>>2]);break h}hb(86720,39,1,G[24367]);break h}Vm()}if(g){Wa(g)}a=G[m+44>>2];if(a){Wa(a)}G[m+44>>2]=0;g=G[b+48>>2];break f}h=G[b+40>>2];d=h+1|0;a=G[m+40>>2];C:{if((d|0)>=(a|0)){break C}g=G[m+44>>2]+(d<<2)|0;j=a+(h^-1)&7;if(j){c=0;while(1){G[g>>2]=-240822174;d=d+1|0;g=g+4|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}if((a-h|0)-2>>>0<7){break C}while(1){G[g+24>>2]=-240822174;G[g+28>>2]=-240822174;G[g+16>>2]=-240822174;G[g+20>>2]=-240822174;G[g+8>>2]=-240822174;G[g+12>>2]=-240822174;G[g>>2]=-240822174;G[g+4>>2]=-240822174;g=g+32|0;d=d+8|0;if((a|0)!=(d|0)){continue}break}}g=0;if(G[m+8>>2]){break f}Qb(G[b+24>>2],b+48|0)}Fa=b+128|0;G[u>>2]=g;a=0;if(g){break e}c=0;n=Fa-144|0;Fa=n;h=G[m+32>>2];t=E[m+30|0];G[n+60>>2]=0;p=G[(t<<2)+144220>>2];a=M(p,h);G[n+56>>2]=a;G[n+52>>2]=a;D:{E:{F:{G:{if(G[m+8>>2]){if(!sd(n+48|0,42094,n+60|0)){break G}break F}if(sd(n+48|0,G[m+20>>2],n+60|0)){break F}}if(pd(G[n+48>>2],-32,2,n+52|0,n+60|0)){break F}l=G[n+48>>2];a=Fa-192|0;Fa=a;G[a+108>>2]=0;g=a+108|0;Kh(l,35787,0,4821,g);d=Fa-128|0;Fa=d;if(G[g>>2]<=0){Wc(d);b=ol(d);H:{if(!b){ma(d+96|0,25,33950,rq(d)|0)|0;G[d+84>>2]=H[16970]|H[16971]<<8|(H[16972]<<16|H[16973]<<24);b=H[16973]|H[16974]<<8|(H[16975]<<16|H[16976]<<24);E[d+87|0]=b;E[d+88|0]=b>>>8;E[d+89|0]=b>>>16;E[d+90|0]=b>>>24;break H}ma(d+96|0,25,33950,b|0)|0;G[d+84>>2]=5526816}G[d+8>>2]=H[65213]|H[65214]<<8|(H[65215]<<16|H[65216]<<24);b=H[65209]|H[65210]<<8|(H[65211]<<16|H[65212]<<24);G[d>>2]=H[65205]|H[65206]<<8|(H[65207]<<16|H[65208]<<24);G[d+4>>2]=b;q=Gb(d,d+96|0);b=Va(q)+q|0;j=H[5940]|H[5941]<<8|(H[5942]<<16|H[5943]<<24);k=H[5936]|H[5937]<<8|(H[5938]<<16|H[5939]<<24);E[b|0]=k;E[b+1|0]=k>>>8;E[b+2|0]=k>>>16;E[b+3|0]=k>>>24;E[b+4|0]=j;E[b+5|0]=j>>>8;E[b+6|0]=j>>>16;E[b+7|0]=j>>>24;j=H[5976]|H[5977]<<8|(H[5978]<<16|H[5979]<<24);E[b+40|0]=j;E[b+41|0]=j>>>8;E[b+42|0]=j>>>16;E[b+43|0]=j>>>24;j=H[5972]|H[5973]<<8|(H[5974]<<16|H[5975]<<24);k=H[5968]|H[5969]<<8|(H[5970]<<16|H[5971]<<24);E[b+32|0]=k;E[b+33|0]=k>>>8;E[b+34|0]=k>>>16;E[b+35|0]=k>>>24;E[b+36|0]=j;E[b+37|0]=j>>>8;E[b+38|0]=j>>>16;E[b+39|0]=j>>>24;j=H[5964]|H[5965]<<8|(H[5966]<<16|H[5967]<<24);k=H[5960]|H[5961]<<8|(H[5962]<<16|H[5963]<<24);E[b+24|0]=k;E[b+25|0]=k>>>8;E[b+26|0]=k>>>16;E[b+27|0]=k>>>24;E[b+28|0]=j;E[b+29|0]=j>>>8;E[b+30|0]=j>>>16;E[b+31|0]=j>>>24;j=H[5956]|H[5957]<<8|(H[5958]<<16|H[5959]<<24);k=H[5952]|H[5953]<<8|(H[5954]<<16|H[5955]<<24);E[b+16|0]=k;E[b+17|0]=k>>>8;E[b+18|0]=k>>>16;E[b+19|0]=k>>>24;E[b+20|0]=j;E[b+21|0]=j>>>8;E[b+22|0]=j>>>16;E[b+23|0]=j>>>24;j=H[5948]|H[5949]<<8|(H[5950]<<16|H[5951]<<24);k=H[5944]|H[5945]<<8|(H[5946]<<16|H[5947]<<24);E[b+8|0]=k;E[b+9|0]=k>>>8;E[b+10|0]=k>>>16;E[b+11|0]=k>>>24;E[b+12|0]=j;E[b+13|0]=j>>>8;E[b+14|0]=j>>>16;E[b+15|0]=j>>>24;b=Gb(q,d+84|0);j=Va(b)+b|0;E[j|0]=41;E[j+1|0]=0;Dq(l,35389,b,g)}Fa=d+128|0;b=G[m+32>>2];y=N(N((H[m+30|0]?b<<2|1:M(b,5)+1|0)|0)*N(.5));K[a+100>>2]=y;K[a+104>>2]=y;xd(l,42,41201,a+104|0,16844,g);xd(l,42,40799,a+100|0,16844,g);if(!H[m+30|0]){b=a+108|0;Qg(l,41180,N(.7071067690849304),-8,4912,b);Qg(l,40784,N(.7071067690849304),-8,4912,b);Qg(l,41155,N(-.7071067690849304),-8,4912,b);Qg(l,40765,N(.7071067690849304),-8,4912,b)}f=-90/+G[m+32>>2]/1.4142135623730951;b=a+108|0;ll(l,41234,f,-8,4885,b);ll(l,40826,-f,-8,4885,b);b=H[m+30|0]?34928:32859;j=34433;k=33498;g=25205;d=25157;I:{J:{switch(H[m+28|0]-69|0){case 0:j=34438;k=33503;g=25186;d=25138;break I;case 12:j=48516;k=48506;g=15463;d=14698;break I;case 2:break I;default:break J}}j=34428;k=33493;g=25224;d=25176}G[a+84>>2]=b;G[a+80>>2]=j;j=a+112|0;db(j,8784,a+80|0);G[a+68>>2]=b;G[a+64>>2]=g;q=a+128|0;db(q,14538,a- -64|0);s=a+108|0;lc(l,41295,j,q,s);G[a+52>>2]=b;G[a+48>>2]=k;db(j,8784,a+48|0);G[a+36>>2]=b;G[a+32>>2]=d;db(q,14538,a+32|0);lc(l,40882,j,q,s);y=N(N(N(E[m+31|0])*N(90))+N(0));K[a+96>>2]=y;K:{L:{M:{switch(H[m+30|0]){case 0:G[a+92>>2]=0;break K;case 1:G[a+92>>2]=1119092736;y=N(y+N(180));break L;default:break M}}G[a+92>>2]=-1028390912;y=N(y+N(180))}K[a+96>>2]=y}if(y>N(360)){K[a+96>>2]=y+N(-360)}G[a+16>>2]=g;b=a+128|0;db(b,4684,a+16|0);g=a+108|0;xd(l,42,41279,a+96|0,b,g);G[a>>2]=d;db(b,4684,a);xd(l,42,40866,a+92|0,b,g);N:{if(H[m+30|0]){b=H[21646]|H[21647]<<8|(H[21648]<<16|H[21649]<<24);G[a+144>>2]=H[21642]|H[21643]<<8|(H[21644]<<16|H[21645]<<24);G[a+148>>2]=b;b=H[21654]|H[21655]<<8|(H[21656]<<16|H[21657]<<24);G[a+152>>2]=H[21650]|H[21651]<<8|(H[21652]<<16|H[21653]<<24);G[a+156>>2]=b;b=H[21662]|H[21663]<<8|(H[21664]<<16|H[21665]<<24);G[a+160>>2]=H[21658]|H[21659]<<8|(H[21660]<<16|H[21661]<<24);G[a+164>>2]=b;b=H[21667]|H[21668]<<8|(H[21669]<<16|H[21670]<<24);d=H[21663]|H[21664]<<8|(H[21665]<<16|H[21666]<<24);E[a+165|0]=d;E[a+166|0]=d>>>8;E[a+167|0]=d>>>16;E[a+168|0]=d>>>24;E[a+169|0]=b;E[a+170|0]=b>>>8;E[a+171|0]=b>>>16;E[a+172|0]=b>>>24;G[a+88>>2]=1127481344;b=H[21630]|H[21631]<<8|(H[21632]<<16|H[21633]<<24);G[a+128>>2]=H[21626]|H[21627]<<8|(H[21628]<<16|H[21629]<<24);G[a+132>>2]=b;b=H[21638]|H[21639]<<8|(H[21640]<<16|H[21641]<<24);G[a+136>>2]=H[21634]|H[21635]<<8|(H[21636]<<16|H[21637]<<24);G[a+140>>2]=b;xd(l,42,35545,a+88|0,a+128|0,a+108|0);if(H[m+30|0]){break N}}b=a+108|0;hd(l,41130,4,0,61663,b);hd(l,40746,3,0,61635,b)}b=a+108|0;wb(l,68332,b);Pg(l,H[m+30|0]?3517:3449,b);Pg(l,8444,b);Pg(l,26653,b);Pg(l,30833,b);Fa=a+192|0;a=G[a+108>>2];G[n+60>>2]=a;if(a){break F}O:{a=h<<2;c=ab(a);if(c){o=ab(a);if(o){break O}}Vm();o=0;break E}if((h|0)>0){v=h-1|0;U=(h<<2)+o|0;W=M(h,h);B=h>>31;J=(p|0)>1?p:1;p=1;l=0;X=M(t,100);while(1){a=0;g=0;while(1){P=a+h|0;q=v-g|0;x=0;while(1){b=E[m+31|0];d=(M(I,20)+X|0)+(x<<2)|0;a=G[d+144240>>2];P:{if(!b|(a|0)<0){break P}if(a>>>0>=4){b=a+b|0;if(a>>>0>=8){a=(b|0)>11?b-4|0:b;break P}a=(b|0)>7?b-4|0:b;break P}a=a+b|0;a=(a|0)>3?a-4|0:a}Q:{R:{if((a|0)>=0){Y=d+144848|0;Q=G[d+144544>>2];if(H[m+29|0]!=78){b=a;a=c;j=0;k=0;if((h|0)>0){R=1-h|0;S=h<<3;s=h<<1;d=s-1|0;Z=M(d,d)-1|0;t=M(M(h,h),24)|1;d=h-1|0;_=t+d|0;$=h-2|0;aa=0-s|0;ba=0-h|0;b=b<<2;C=M(h,G[b+145200>>2]);ca=C+g|0;D=M(h,G[b+145152>>2]);da=D+g|0;b=d-g|0;ea=b+D|0;fa=b+C|0;d=0;b=0;while(1){S:{T:{switch(Q|0){case 0:b=j+ca|0;d=j+ea|0;break S;case 1:b=j+fa|0;d=(k+D|0)-g|0;break S;case 2:b=(k+C|0)-g|0;d=D+(R+(g+k|0)|0)|0;break S;case 3:break T;default:break S}}d=j+da|0;b=C+(R+(g+k|0)|0)|0}d=((d>>31&S)+d|0)+1|0;U:{if((b|0)>(h|0)){j=0;if((b|0)==(s|0)){break U}j=s-b<<1;F=j-1|0;j=(($-b|0)+M(F,F)|0)+M(j,(d|0)/(s|0)|0)+(d|0)%(s|0)|0;break U}j=(M(h-b|0,S)+Z|0)+d|0;if((b|0)>=(ba|0)){break U}j=t;if((b|0)<=(aa|0)){break U}j=b+s<<1;F=j|1;ga=j;j=(d|0)/(s|0)|0;j=((b+_|0)-M(F,F)|0)+M(ga,j)+(d-M(j,s))|0}G[a>>2]=(j-1|0)/2;j=k^-1;a=a+4|0;k=k+1|0;if((h|0)!=(k|0)){continue}break}}break R}C=M(a,W);d=0;k=c;while(1){b=0;a=0;V:{W:{switch(Q|0){case 3:b=d;a=g;break V;case 2:b=q;a=d;break V;case 1:b=v-d|0;a=q;break V;case 0:break W;default:break V}}a=v-d|0;b=g}j=1;s=0;if(a|b){while(1){t=b;s=0-(b&1)&j<<1|(0-(a&1)&j|s);if((a|b)&1){G[k>>2]=s}b=t>>1;j=j<<2;D=a>>>0>1;a=a>>1;if(t>>>0>1|D){continue}break}}G[k>>2]=s+C;k=k+4|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}break R}b=G[n+48>>2];a=n+60|0;X:{if(Nb(b,a)){Ua(28060);G[a>>2]=413;a=413;break X}rc(b,2,1,0,p,l,h,B,a);a=G[a>>2]}if(a){break F}break Q}b=G[Y>>2];G[n+60>>2]=0;d=G[m+44>>2];a=o;j=c;while(1){K[a>>2]=K[d+(G[j>>2]<<2)>>2];j=j+4|0;a=a+4|0;if(U>>>0>a>>>0){continue}break}Y:{if(!b){break Y}Z:{_:{$:{aa:{ba:{a=b>>31;switch((a^-1)+(a^b)|0){case 0:break $;case 1:break aa;case 2:break ba;default:break _}}d=0;a=(b>>>31|0)+g|0;break Z}d=a+P|0;a=h;break Z}d=((b|0)>0)+g|0;a=h;break Z}d=0;a=P-((b|0)>0)|0}if((a|0)<=(d|0)){break Y}b=(a<<2)+o|0;a=(d<<2)+o|0;while(1){G[a>>2]=-240822174;a=a+4|0;if(b>>>0>a>>>0){continue}break}}if(Ek(G[n+48>>2],0,p,l,h,B,o,N(-1.637499996306027e30),n+60|0)){break F}}a=h;b=a+p|0;l=l+B|0;l=a>>>0>b>>>0?l+1|0:l;p=b;x=x+1|0;if((J|0)!=(x|0)){continue}break}a=g^-1;g=g+1|0;if((h|0)!=(g|0)){continue}break}I=I+1|0;if((J|0)!=(I|0)){continue}break}}a=G[m+12>>2];if(!(!a|!H[a|0])){G[n+32>>2]=a;a=n- -64|0;db(a,9908,n+32|0);ze(G[n+48>>2],a,n+60|0)}G[n+16>>2]=G[m+32>>2];a=n- -64|0;db(a,30612,n+16|0);ze(G[n+48>>2],a,n+60|0);G[n>>2]=H[m+29|0]==78?35812:35085;db(a,9816,n);if(H[m+29|0]==114){a=n- -64|0;a=Va(a)+a|0;b=H[62300]|H[62301]<<8|(H[62302]<<16|H[62303]<<24);c=H[62296]|H[62297]<<8|(H[62298]<<16|H[62299]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;b=H[62303]|H[62304]<<8|(H[62305]<<16|H[62306]<<24);E[a+7|0]=b;E[a+8|0]=b>>>8;E[a+9|0]=b>>>16;E[a+10|0]=b>>>24}ze(G[n+48>>2],n- -64|0,n+60|0);a=G[n+48>>2];ca:{if(G[m+8>>2]){G[m+16>>2]=a;break ca}Qb(a,n+60|0)}a=0;break D}wf(G[24367],G[n+60>>2])}if(c){Wa(c)}if(o){Wa(o)}if(!G[m+8>>2]){G[m+16>>2]=0}a=G[n+60>>2]}Fa=n+144|0;G[u>>2]=a;a=G[m+44>>2];if(a){Wa(a)}a=G[m+16>>2]}Fa=m+48|0;g=0;if(G[u>>2]){break b}g=a;if(!e|!(L[e>>3]==0|L[e+8>>3]==0)){break b}G[i+3660>>2]=0;de(g,2,i+3664|0,i+3660|0);if(L[e>>3]==0){L[e>>3]=G[i+3664>>2]/2|0}if(L[e+8>>3]!=0){break b}L[e+8>>3]=G[i+3668>>2]/2|0;break b}G[i+3616>>2]=1589294263;G[i+3620>>2]=-1196933592;E[i+1232|0]=0;G[i+3584>>2]=1589294263;G[i+3588>>2]=-1196933592;z=1;da:{if(f==0){break da}z=f;if(!(f<0)){break da}z=1/O(f)}L[i+3552>>3]=z;E[i+656|0]=0;E[i+368|0]=0;E[i+80|0]=0;G[i+3624>>2]=1589294263;G[i+3628>>2]=-1196933592;G[i+3592>>2]=1589294263;G[i+3596>>2]=-1196933592;L[i+3560>>3]=z;E[i+727|0]=0;E[i+439|0]=0;E[i+151|0]=0;G[i+3632>>2]=1589294263;G[i+3636>>2]=-1196933592;G[i+3600>>2]=1589294263;G[i+3604>>2]=-1196933592;L[i+3568>>3]=z;E[i+798|0]=0;E[i+510|0]=0;E[i+222|0]=0;G[i+3608>>2]=1589294263;G[i+3612>>2]=-1196933592;G[i+3640>>2]=1589294263;G[i+3644>>2]=-1196933592;L[i+3576>>3]=z;E[i+869|0]=0;E[i+581|0]=0;E[i+293|0]=0;ea:{fa:{ga:{if(c){l=le(c);c=pc(l,49007);if(c){ha=rb(i+944|0,c,71),ia=0,E[ha+70|0]=ia}c=pc(0,49007);if(c){rb(i+1015|0,c,71);E[i+1085|0]=0}g=pc(0,49007);E[i+1086|0]=0;ha:{if(!g){break ha}j=H[g|0];if(!j){break ha}c=i+1086|0;ia:{ja:{ka:{while(1){k=j&255;if(!k|(k|0)==58){break ga}E[c|0]=j;j=H[g+1|0];if(!j|(j|0)==58){break ia}E[c+1|0]=j;j=H[g+2|0];if(!j|(j|0)==58){break ja}E[c+2|0]=j;j=o|3;k=c+3|0;q=H[g+3|0];if(!q|(q|0)==58){break ka}if((j|0)!=71){E[c+3|0]=q;o=o+4|0;c=c+4|0;j=H[g+4|0];g=g+4|0;continue}break}g=g+3|0;j=71;break fa}g=g+3|0;break fa}k=c+2|0;j=o|2;g=g+2|0;break fa}k=c+1|0;j=o|1;g=g+1|0;break fa}Wa(l);c=2;break ea}E[i+1015|0]=0;E[i+944|0]=0;c=2;break ea}k=c;j=o}E[k|0]=0;la:{ma:{if(H[g|0]==58){E[i+3664|0]=0;o=i+3664|0;na:{c=H[g+1|0];if(c){g=g+1|0;while(1){if((c&255)==58|j>>>0>1023){break na}E[o|0]=c;j=j+1|0;o=o+1|0;c=H[g+1|0];g=g+1|0;if(c){continue}break}}E[o|0]=0;f=sb(i+3664|0);break la}E[o|0]=0;f=sb(i+3664|0);if((c&255)!=58){break la}E[i+3664|0]=0;o=i+3664|0;oa:{c=H[g+1|0];if(c){g=g+1|0;while(1){if((c&255)==58|j>>>0>1023){break oa}E[o|0]=c;j=j+1|0;o=o+1|0;c=H[g+1|0];g=g+1|0;if(c){continue}break}}E[o|0]=0;w=sb(i+3664|0);break ma}E[o|0]=0;w=sb(i+3664|0);if((c&255)!=58){break ma}E[i+3664|0]=0;o=i+3664|0;c=H[g+1|0];pa:{if(!c){break pa}g=g+1|0;while(1){if((c&255)==58|j>>>0>1023){break pa}E[o|0]=c;j=j+1|0;o=o+1|0;c=H[g+1|0];g=g+1|0;if(c){continue}break}}E[o|0]=0;r=sb(i+3664|0);L[i+3600>>3]=w;L[i+3632>>3]=f;L[i+3568>>3]=r;Wa(l);c=3;break ea}G[i+3568>>2]=0;G[i+3572>>2]=1072693248;Wa(l);c=3;break ea}L[i+3600>>3]=w;L[i+3632>>3]=f;Wa(l);c=3;break ea}L[i+3568>>3]=f;Wa(l);c=3}zi(a,i+3656|0,h);j=G[i+3656>>2];g=j+1|0;q=lb(g,1);qa:{if(!(!b|!H[b|0])){g=0;hn(a,b,0,j,i+3652|0,q,h);if(!G[h>>2]){break qa}break b}if((j|0)<0){break qa}cb(q,1,g)}b=Fa-96|0;Fa=b;l=c;_j(a,c,i+944|0,i+3616|0,i+3584|0,i+3552|0,i+656|0,i+368|0,i+80|0,i- -64|0,i+48|0,b- -64|0,b+32|0,b,h);ra:{if(G[h>>2]|(c|0)<=0){break ra}K[i+32>>2]=L[b+64>>3];K[i+16>>2]=L[b+32>>3];K[i>>2]=L[b>>3];c=(l|0)<4?l:4;if((c|0)==1){break ra}K[i+36>>2]=L[b+72>>3];K[i+20>>2]=L[b+40>>3];K[i+4>>2]=L[b+8>>3];if((c|0)==2){break ra}K[i+40>>2]=L[b+80>>3];K[i+24>>2]=L[b+48>>3];K[i+8>>2]=L[b+16>>3];if((c|0)==3){break ra}K[i+44>>2]=L[b+88>>3];K[i+28>>2]=L[b+56>>3];K[i+12>>2]=L[b+24>>3]}Fa=b+96|0;g=0;if(G[h>>2]){break b}f=z*+G[i+48>>2];sa:{if(O(f)<2147483648){b=~~f;break sa}b=-2147483648}G[i+48>>2]=b;f=z*+G[i+52>>2];ta:{if(O(f)<2147483648){c=~~f;break ta}c=-2147483648}G[i+52>>2]=c;f=+N(K[i+20>>2]+K[i+36>>2])*.5;ua:{if(O(f)<2147483648){k=~~f;break ua}k=-2147483648}f=+(k|0);w=+N(K[i+16>>2]+K[i+32>>2])*.5;va:{if(O(w)<2147483648){k=~~w;break va}k=-2147483648}w=+(k|0);wa:{xa:{if(!d){break xa}j=G[d>>2];if(!j){break xa}k=G[d+4>>2];if(!k){break xa}ya:{za:{if(!e){break za}r=L[e>>3];if(r==0){break za}A=L[e+8>>3];if(A==0){break za}w=r;f=A;break ya}k=(c|0)>(k|0)?k:c;j=(b|0)>(j|0)?j:b}r=+(k|0)*.5;A=f-r;Aa:{if(O(A)<2147483648){b=~~A;break Aa}b=-2147483648}L[i+3624>>3]=b|0;A=+(j|0)*.5;T=w-A;Ba:{if(O(T)<2147483648){b=~~T;break Ba}b=-2147483648}L[i+3616>>3]=b|0;r=f+r;Ca:{if(O(r)<2147483648){b=~~r;break Ca}b=-2147483648}L[i+3592>>3]=b|0;r=w+A;Da:{if(O(r)<2147483648){b=~~r;break Da}b=-2147483648}L[i+3584>>3]=b|0;break wa}j=b;k=c}Ea:{if(!t){break Ea}r=(L[i+3592>>3]-L[i+3624>>3])/L[i+3560>>3];A=(L[i+3584>>3]-L[i+3616>>3])/L[i+3552>>3];Fa:{if(O(A)<2147483648){b=~~A;break Fa}b=-2147483648}r=r*+(b|0);Ga:{if(O(r)<2147483648){b=~~r;break Ga}b=-2147483648}Ha:{if((l|0)==2){break Ha}r=(L[i+3600>>3]-L[i+3632>>3])/L[i+3568>>3]*+(b|0);if(O(r)<2147483648){b=~~r;break Ha}b=-2147483648}if((M(vk(u),b)|0)<=(t|0)){break Ea}G[h>>2]=113;break b}t=m?i+1504|0:42094;m=i+944|0;n=i+3616|0;s=i+3584|0;v=i+3552|0;B=i+656|0;x=i+368|0;C=i+80|0;p=i+1232|0;c=0;r=1;b=Fa-176|0;Fa=b;Ia:{if(G[h>>2]>0){break Ia}if((l|0)>=5){Ua(6766);G[h>>2]=320;break Ia}o=G[a>>2];if((o|0)!=G[G[a+4>>2]+76>>2]){mb(a,o+1|0,0,h)}o=8;Ja:{Ka:{La:{switch(u-11|0){case 20:o=32;break Ja;case 31:o=-32;break Ja;default:if((u|0)==82){break Ka}case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:G[h>>2]=410;break Ia;case 0:break Ja;case 10:break La}}o=16;break Ja}o=-64}if((_j(a,l,m,n,s,v,B,x,C,b+144|0,b+112|0,b+80|0,b+48|0,b+16|0,h)|0)>0){Ua(6126);break Ia}Ma:{Na:{if(H[p|0]){if(!Cb(a,82,p,b+8|0,0,h)){r=L[b+8>>3];break Na}G[h>>2]=0;if((dc(a,0,p,b+140|0,h)|0)>0){Ua(66743);Ua(p);break Ia}G[b+8>>2]=1589294263;G[b+12>>2]=-1196933592;break Ma}L[b+8>>3]=1}if(!(!(r<=0)|r==-91191291391491e-49)){Ua(45241);G[h>>2]=125;break Ia}}if((sd(b+172|0,t,h)|0)>0){Ua(16402);break Ia}if((pd(G[b+172>>2],o,l,b+112|0,h)|0)>0){Ua(25086);break Ia}if((tk(a,G[b+172>>2],b+144|0,h)|0)>0){Ua(11702);break Ia}p=b+144|0;Zj(a,G[b+172>>2],l,p,h);u=b+80|0;m=b+16|0;En(G[b+172>>2],l,u,m,h);if((Dn(a,G[b+172>>2],o,l,b+112|0,p,u,b+48|0,m,L[b+8>>3],G[b+140>>2],0,q,h)|0)>0){Ua(7256);break Ia}c=G[b+172>>2]}Fa=b+176|0;if(G[h>>2]){break b}G[i+3660>>2]=0;b=i+3664|0;h=i+3660|0;zb(34641,G[i+64>>2],b,h);l=i+1408|0;o=i+1312|0;Cb(a,16,b,l,o,h);zb(34165,1,b,h);g=c;Jc(c,16,b,l,21232,h);G[i+3660>>2]=0;zb(34553,1,b,h);c=i+32|0;Jc(g,42,b,c,26534,h);G[i+3660>>2]=0;zb(33042,1,b,h);p=i+16|0;Jc(g,42,b,p,26561,h);G[i+3660>>2]=0;zb(34659,1,b,h);u=i+48|0;Jc(g,41,b,u,6701,h);G[i+3660>>2]=0;zb(34641,G[i+68>>2],b,h);Cb(a,16,b,l,o,h);zb(34165,2,b,h);Jc(g,16,b,l,21232,h);G[i+3660>>2]=0;zb(34553,2,b,h);Jc(g,42,b,c|4,26534,h);G[i+3660>>2]=0;zb(33042,2,b,h);Jc(g,42,b,p|4,26561,h);G[i+3660>>2]=0;zb(34659,2,b,h);Jc(g,41,b,u|4,6701,h);if(O(f)<2147483648){b=~~f}else{b=-2147483648}if(O(w)<2147483648){c=~~w}else{c=-2147483648}Sm(a,g,c,b,j,k,z,0);if(d){G[d+4>>2]=k;G[d>>2]=j}if(e){L[e+8>>3]=f;L[e>>3]=w}if(nb(t,42094,7)){b=0;a=Fa-16|0;Fa=a;c=i+3660|0;if(G[c>>2]<=0){G[a+12>>2]=G[g>>2]+1;if((Xf(g,c)|0)>0){Ua(45102)}while(1){d=G[g+4>>2];e=d+(b<<2)|0;if(!(G[e+1256>>2]<0|!G[e+1416>>2])){Hg(d,b,c)}b=b+1|0;if((b|0)!=40){continue}break}if(G[c>>2]!=112){b=G[g+4>>2];d=G[(M(G[b+4>>2],84)+1240576|0)+68>>2];if(d){Ja[d|0](G[b>>2])|0}}if((Zn(g,G[a+12>>2]-1|0,a+8|0,c)|0)>0){Ua(45061)}}Fa=a+16|0}if(q){Wa(q)}}Fa=i+4688|0;return g|0}function Mh(a,b,c){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,I=0,J=0,N=0,P=0,Q=0,R=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;f=Fa-2416|0;Fa=f;G[935250]=G[935250]+1;G[f+344>>2]=0;a:{if(Rc(f+348|0,a,0,f+344|0)){G[f+192>>2]=a;db(c,9154,f+192|0);G[935251]=G[935251]+1;if(!G[935249]){x=1;break a}G[f+176>>2]=a;kb(80536,f+176|0);$a(G[29763]);x=1;break a}Be(a,f+208|0);d=G[f+252>>2];c=G[f+248>>2];G[b+1028>>2]=1;G[b+1032>>2]=c;G[b+1036>>2]=d;G[f+344>>2]=0;if(!mb(G[f+348>>2],1,0,f+344|0)){$=b+1080|0;aa=b+1050|0;ba=b+1040|0;U=f+1376|1;C=G[29763];while(1){G[935252]=G[935252]+1;G[f+344>>2]=0;b:{c:{if(Vc(G[f+348>>2],41295,f+1376|0,f+352|0,f+344|0)){if(G[926536]){G[f+160>>2]=a;kb(69177,f+160|0);$a(C)}c=G[b+1028>>2];G[935246]=G[935246]+1;if(G[935249]){G[f+148>>2]=c;G[f+144>>2]=a;kb(79e3,f+144|0);$a(C)}A=(c|0)==1?1:A;x=x+1|0;D=0;G[935253]=G[935253]+1;n=0;if(G[935256]){break c}break b}c=f+1376|0;d:{if(H[f+1376|0]!=39){break d}d=(Va(f+1376|0)+f|0)+1375|0;if(H[d|0]!=39){break d}E[d|0]=0;c=U}if(Va(c)>>>0<=7){E[c|0]=0}while(1){g=H[c|0];if(!((g|0)==45|!g)){c=c+1|0;continue}break}while(1){d=g&255;if((d|0)==45){g=H[c+1|0];c=c+1|0;continue}break}if(!d){if(G[926536]){G[f+128>>2]=a;kb(69204,f+128|0);$a(C)}c=G[b+1028>>2];G[935246]=G[935246]+1;if(G[935249]){G[f+116>>2]=c;G[f+112>>2]=a;kb(79063,f+112|0);$a(C)}A=(c|0)==1?1:A;x=x+1|0;D=0;G[935253]=G[935253]+1;n=0;if(G[935256]){break c}break b}G[f+344>>2]=0;if(Vc(G[f+348>>2],40882,f+1376|0,f+352|0,f+344|0)){if(G[926536]){G[f+96>>2]=a;kb(69123,f+96|0);$a(C)}c=G[b+1028>>2];G[935246]=G[935246]+1;if(G[935249]){G[f+84>>2]=c;G[f+80>>2]=a;kb(78874,f+80|0);$a(C)}A=(c|0)==1?1:A;x=x+1|0;D=0;G[935253]=G[935253]+1;n=0;if(G[935256]){break c}break b}c=f+1376|0;e:{if(H[f+1376|0]!=39){break e}d=(Va(f+1376|0)+f|0)+1375|0;if(H[d|0]!=39){break e}E[d|0]=0;c=U}if(Va(c)>>>0<=7){E[c|0]=0}while(1){g=H[c|0];if(!((g|0)==45|!g)){c=c+1|0;continue}break}while(1){d=g&255;if((d|0)==45){g=H[c+1|0];c=c+1|0;continue}break}D=1;if(d){break c}if(G[926536]){G[f+64>>2]=a;kb(69150,f- -64|0);$a(C)}c=G[b+1028>>2];G[935246]=G[935246]+1;if(G[935249]){G[f+52>>2]=c;G[f+48>>2]=a;kb(78937,f+48|0);$a(C)}A=(c|0)==1?1:A;x=x+1|0;D=0;G[935253]=G[935253]+1;n=0;if(!G[935256]){break b}}g=G[b+1028>>2];f:{if((g|0)!=1){break f}c=0;if(G[935262]<=0){break f}while(1){G[f+344>>2]=0;g=M(c,516);g:{if(Vc(G[f+348>>2],g+G[935263]|0,f+1376|0,f+352|0,f+344|0)){E[(g+G[935263]|0)+384|0]=0;break g}d=f+1376|0;h:{if(H[f+1376|0]!=39){break h}h=(Va(f+1376|0)+f|0)+1375|0;if(H[h|0]!=39){break h}E[h|0]=0;d=U}Za((g+G[935263]|0)+384|0,d)}c=c+1|0;if((c|0)>2]}c=0;x=x-((g|0)==2&(A|0)!=0)|0;i:{j:{k:{if(!D){D=0;break k}G[f+344>>2]=0;if(Yj(G[f+348>>2],f+2412|0,f+344|0)){D=0;G[935253]=G[935253]+1;if(G[935256]){break k}break b}n=rd(G[f+2412>>2]);l:{if(!n){h=G[b+1028>>2];G[935246]=G[935246]+1;d=G[935253]+1|0;G[935253]=d;A=(h|0)==1?1:A;x=x+1|0;if(G[935249]){G[f+36>>2]=h;G[f+32>>2]=a;kb(78749,f+32|0);$a(C);d=G[935253]}G[935253]=d+1;if(!G[935256]){n=0;break b}D=1;d=Wg(n,1);n=0;if((d|0)==1){break l}break k}if((Wg(n,1)|0)!=1){break j}}if(G[926536]){G[f+16>>2]=a;kb(69102,f+16|0);$a(C)}d=G[b+1028>>2];G[935246]=G[935246]+1;if(G[935249]){G[f+4>>2]=d;G[f>>2]=a;kb(78818,f);$a(C)}A=(d|0)==1?1:A;x=x+1|0;n=0;D=1;G[935253]=G[935253]+1;if(!G[935256]){break b}}G[f+344>>2]=0;if(Vc(G[f+348>>2],41261,f+1376|0,f+352|0,f+344|0)){d=0}else{d=_b(f+1376|0)}G[b+1060>>2]=d;if(!Vc(G[f+348>>2],40853,f+1376|0,f+352|0,f+344|0)){c=_b(f+1376|0)}G[b+1068>>2]=0;G[b+1072>>2]=0;E[b+1050|0]=0;E[b+1040|0]=0;G[b+1064>>2]=c;cb($,0,136);break i}e=L[n+136>>3];m:{if(O(e)<2147483648){c=~~e;break m}c=-2147483648}G[b+1060>>2]=c;e=L[n+144>>3];n:{if(O(e)<2147483648){c=~~e;break n}c=-2147483648}G[b+1064>>2]=c;c=Za(ba,n+3368|0);Za(aa,n+3384|0);K[b+1068>>2]=L[n+16>>3];K[b+1072>>2]=L[n+24>>3];y=L[n+120>>3];L[b+1208>>3]=y;L[b+1080>>3]=L[n>>3];L[b+1088>>3]=L[n+8>>3];l=L[n+32>>3];L[b+1096>>3]=l;e=L[n+40>>3];L[b+1104>>3]=e;p=L[n+48>>3];L[b+1112>>3]=p;o:{if(!(p<-90|p>90)|(!(l>0)|!(e>0))){break o}L[b+1104>>3]=-e;L[b+1096>>3]=-l;e=p+180;if(e>=360){while(1){e=e+-360;if(e>=360){continue}break}}L[b+1112>>3]=e;if(!(e<=-360)){break o}while(1){e=e+360;if(e<=-360){continue}break}L[b+1112>>3]=e}d=fb(c,34433,4);c=fb(c,34438,4);cc(n,+G[b+1060>>2]*.5,+G[b+1064>>2]*.5,f+336|0,f+328|0);k=c?!d<<2:2;dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,f+320|0,f+312|0);L[b+1120>>3]=L[f+320>>3];L[b+1128>>3]=L[f+312>>3];e=L[b+1096>>3];p:{if(!(!(e<0&L[b+1104>>3]<0)&(!(e>0)|!(L[b+1104>>3]>0)))){g=f+336|0;h=f+328|0;cc(n,-.5,-.5,g,h);d=f+304|0;c=f+296|0;dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1136>>3]=L[f+304>>3];L[b+1144>>3]=L[f+296>>3];cc(n,L[n+136>>3]+.5,-.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1152>>3]=L[f+304>>3];L[b+1160>>3]=L[f+296>>3];cc(n,L[n+136>>3]+.5,L[n+144>>3]+.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1168>>3]=L[f+304>>3];L[b+1176>>3]=L[f+296>>3];cc(n,-.5,L[n+144>>3]+.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);l=L[f+304>>3];L[b+1184>>3]=l;e=L[f+296>>3];L[b+1192>>3]=e;break p}g=f+336|0;h=f+328|0;cc(n,-.5,-.5,g,h);d=f+304|0;c=f+296|0;dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1136>>3]=L[f+304>>3];L[b+1144>>3]=L[f+296>>3];cc(n,L[n+136>>3]+.5,-.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1184>>3]=L[f+304>>3];L[b+1192>>3]=L[f+296>>3];cc(n,L[n+136>>3]+.5,L[n+144>>3]+.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);L[b+1168>>3]=L[f+304>>3];L[b+1176>>3]=L[f+296>>3];cc(n,-.5,L[n+144>>3]+.5,g,h);dd(k,y,L[f+336>>3],L[f+328>>3],0,2e3,d,c);l=L[f+304>>3];L[b+1152>>3]=l;e=L[f+296>>3];L[b+1160>>3]=e}B=e*.01745329252;Y=eb(B);l=l*.01745329252;V=ib(l);e=L[b+1120>>3];y=L[b+1128>>3]*.01745329252;Z=eb(y);e=e*.01745329252;p=ib(e);l=eb(l);e=eb(e);ea=b,fa=Sc(ib(y)*ib(B)+(e*Z*(l*Y)+p*Z*(V*Y)))/.01745329252,L[ea+1200>>3]=fa;Wa(G[f+2412>>2]);D=1}g=0;if(G[935262]>0){while(1){G[f+344>>2]=0;h=M(g,516);q:{r:{if(Vc(G[f+348>>2],h+G[935263]|0,f+1376|0,f+352|0,f+344|0)){d=G[935263];c=(h+d|0)+256|0;break r}d=f+1376|0;s:{if(H[f+1376|0]!=39){break s}c=(Va(f+1376|0)+f|0)+1375|0;if(H[c|0]!=39){break s}E[c|0]=0;d=U}Za((h+G[935263]|0)+256|0,d);d=G[935263];c=h+d|0;if(H[c+256|0]){break q}c=c+256|0}Za(c,(d+h|0)+384|0)}g=g+1|0;if((g|0)>2]=G[935247];W=0;i=Fa-1072|0;Fa=i;h=H[41649]|H[41650]<<8;F[i+778>>1]=h;E[i+684|0]=H[35851];d=H[34154]|H[34155]<<8;F[i+696>>1]=d;c=H[34156];E[i+698|0]=c;G[i+768>>2]=5391428;g=H[41645]|H[41646]<<8|(H[41647]<<16|H[41648]<<24);F[i+774>>1]=g;q=g>>>16|0;F[i+776>>1]=q;F[i+608>>1]=d;E[i+610|0]=c;G[i+680>>2]=H[35847]|H[35848]<<8|(H[35849]<<16|H[35850]<<24);F[i+690>>1]=h;F[i+686>>1]=g;F[i+688>>1]=q;if(!G[935247]){g=0;c=G[935259];hb(70071,20,1,G[935266]);hb(2544,130,1,G[935266]);hb(1880,87,1,G[935266]);d=G[935262];t:{if(c){if((d|0)>0){while(1){c=M(g,516);G[i+592>>2]=G[(c+G[935263]|0)+512>>2];db(i+1040|0,1785,i+592|0);h=c+G[935263]|0;d=0;while(1){c=E[d+h|0];E[(i+784|0)+d|0]=c-65>>>0<26?c|32:c;c=Va(h)>>>0>d>>>0;d=d+1|0;if(c){continue}break}G[i+576>>2]=i+784;_a(G[935266],i+1040|0,i+576|0);g=g+1|0;if((g|0)0){while(1){h=M(d,516);G[i+560>>2]=G[(h+G[935263]|0)+512>>2];c=i+1040|0;db(c,1785,i+560|0);G[i+544>>2]=(h+G[935263]|0)+128;_a(G[935266],c,i+544|0);d=d+1|0;if((d|0)0){while(1){c=M(g,516);G[i+528>>2]=G[(c+G[935263]|0)+512>>2];db(i+1040|0,1785,i+528|0);h=c+G[935263]|0;d=0;while(1){c=E[d+h|0];E[(i+784|0)+d|0]=c-65>>>0<26?c|32:c;c=Va(h)>>>0>d>>>0;d=d+1|0;if(c){continue}break}G[i+512>>2]=i+784;_a(G[935266],i+1040|0,i+512|0);g=g+1|0;if((g|0)>2]=G[(h+G[935263]|0)+512>>2];c=i+1040|0;db(c,1785,i+496|0);G[i+480>>2]=(h+G[935263]|0)+128;_a(G[935266],c,i+480|0);d=d+1|0;if((d|0)>3]=L[b+1120>>3];L[i+760>>3]=L[b+1128>>3];r=0;s=0;p=0;B=0;N=0;V=0;y=0;I=0;h=Fa-224|0;Fa=h;u:{v:{w:{d=i+696|0;k=i+608|0;if(Xa(d,k)){break w}if(Xa(d+78|0,k+78|0)){break w}c=0;break v}s=H[d|0];if(s){c=d;while(1){g=s<<24>>24;if(g-65>>>0<26){E[c|0]=g-65>>>0<26?g|32:g}s=H[c+1|0];c=c+1|0;if(s){continue}break}}q=d+78|0;s=H[q|0];if(s){c=q;while(1){g=s<<24>>24;if(g-65>>>0<26){E[c|0]=g-65>>>0<26?g|32:g}s=H[c+1|0];c=c+1|0;if(s){continue}break}}s=H[k|0];if(s){c=k;while(1){g=s<<24>>24;if(g-65>>>0<26){E[c|0]=g-65>>>0<26?g|32:g}s=H[c+1|0];c=c+1|0;if(s){continue}break}}g=k+78|0;s=H[g|0];if(s){c=g;while(1){w=s<<24>>24;if(w-65>>>0<26){E[c|0]=w-65>>>0<26?w|32:w}s=H[c+1|0];c=c+1|0;if(s){continue}break}}x:{y:{if(!Xa(d,13289)){break y}if(!Xa(d,30708)){break y}s=0;break x}s=0;z:{switch(H[q|0]-98|0){case 0:s=1;break;case 8:break z;default:break u}}V=vb(d+79|0,h+192|0);c=G[h+192>>2];if(!c|H[c|0]){break u}}A:{B:{if(!Xa(k,13289)){break B}if(!Xa(k,30708)){break B}break A}C:{switch(H[g|0]-98|0){case 0:N=1;break;case 8:break C;default:break u}}y=vb(k+79|0,h+192|0);c=G[h+192>>2];if(!c|H[c|0]){break u}}D:{if(!Xa(d,13289)){break D}if(!Xa(d,30708)){s=s?3:2;break D}if(!Xa(d,31605)){s=4;break D}if(Xa(d,17546)){break u}s=5}E:{if(!Xa(k,13289)){break E}if(!Xa(k,30708)){N=N?3:2;break E}if(!Xa(k,31605)){N=4;break E}if(Xa(k,17546)){break u}N=5}c=1}ca=c;if((am(d+72|0,h+192|0,h+184|0)|0)<0){break u}w=d- -64|0;q=d+28|0;v=d;g=d+3|0;c=G[h+192>>2];d=G[h+184>>2];if(!(!c|(d|0)==1)){ea=v,fa=vb(g,h+220|0),L[ea+56>>3]=fa;c=G[h+220>>2];if(!c|H[c|0]){break u}ea=w,fa=vb(q,h+220|0),L[ea>>3]=fa;c=G[h+220>>2];if(!c|H[c|0]){break u}c=G[h+192>>2]}F:{G:{if(!(c|(d|0)!=1)){L[h+176>>3]=L[v+56>>3];Eb(g,18786,h+176|0);L[h+160>>3]=L[w>>3];Eb(q,18786,h+160|0);break G}H:{I:{J:{K:{L:{switch(d-1|0){case 1:l=L[w>>3];e=L[v+56>>3];break K;case 3:l=L[w>>3];e=L[v+56>>3];break I;case 0:break G;case 4:break J;case 2:break L;default:break F}}l=L[w>>3]/1e3;e=L[v+56>>3]/1e3}L[v+56>>3]=e*57.29577951308232;e=l*57.29577951308232;break H}l=L[w>>3]/1e3;e=L[v+56>>3]/1e3}L[v+56>>3]=e/3600;e=l/3600}L[w>>3]=e;break F}j=Fa-448|0;Fa=j;c=Za(j+400|0,g);z=Za(j+352|0,q);F[j+64>>1]=48;F[j+160>>1]=48;F[j+16>>1]=48;d=0;_=Za(j+208|0,c);e=-1;l=1;M:{N:{while(1){q=c+d|0;g=H[q|0];if((g|0)!=32){O:{switch(g-43|0){case 2:break N;case 0:break O;default:break M}}}else{d=d+1|0;continue}break}e=1}E[q|0]=32;l=e}o=-1;m=-1;u=-1;P:{Q:{R:{d=Va(c);if((d|0)<=0){break R}J=d&1;S:{if((d|0)==1){d=0;break S}P=d&-2;d=0;while(1){R=d|1;X=H[R+c|0]&223;g=H[c+d|0]&223;u=(X|0)==83?R:(g|0)==83?d:u;m=(X|0)==77?R:(g|0)==77?d:m;Q=(g|0)==68;t=(g|0)==72;g=t?r:Q?1:r;r=g;q=(X|0)==68;da=q?1:g;g=(X|0)==72;r=g?r:da;o=g?R:q?R:t?d:Q?d:o;d=d+2|0;I=I+2|0;if((P|0)!=(I|0)){continue}break}}if(J){t=H[c+d|0]&223;q=(t|0)==68;g=(t|0)==72;o=g?d:q?d:o;r=g?r:q?1:r;m=(t|0)==77?d:m;u=(t|0)==83?d:u}d=1;if(!((o|0)<=0|(m|0)<=0)&(m|0)<(o|0)|!((o|0)<=0|(u|0)<=0)&(o|0)>(u|0)){break P}if(!((m|0)<=0|(u|0)<=0)&(m|0)>(u|0)){break P}T:{U:{V:{W:{d=(o|0)>0;X:{if(d){ea=Za(j+160|0,c)+o|0,ga=0,E[ea|0]=ga;if((m|0)<=0){break X}if(m-1>>>0<=o>>>0){break W}d=1;ea=Za(j- -64|0,(c+o|0)+1|0)+((o^-1)+m|0)|0,ga=0,E[ea|0]=ga;if((u|0)>0){break V}break R}if((m|0)>0){break W}}if((u|0)<=0){break R}g=u-1|0;break U}ea=Za(j- -64|0,c)+m|0,ga=0,E[ea|0]=ga;if((u|0)<=0){break R}}g=u-1|0;if((m|0)>=(g|0)){break U}Za(j+16|0,(c+m|0)+1|0);u=(m^-1)+u|0;break T}if(!(!d|(g|0)<=(o|0))){Za(j+16|0,(c+o|0)+1|0);u=(o^-1)+u|0;break T}Za(j+16|0,c)}E[(j+16|0)+u|0]=0;G[j+8>>2]=0;break Q}G[j+8>>2]=0;if((o&m&u)==-1){while(1){d=c;c=c+1|0;g=H[d|0];if((g|0)==32){continue}break}G[j+304>>2]=d;if(!g){break Q}c=0;while(1){q=c;Y:{while(1){c=g&255;if(!c){break Y}if(!((c|0)==32|(c|0)==58)){g=H[d+1|0];d=d+1|0;continue}break}E[d|0]=0;d=d+1|0}g=d;while(1){d=g;g=d+1|0;if(H[d|0]==32){continue}break}c=q+1|0;G[(j+304|0)+(c<<2)>>2]=d;g=H[d|0];if(g){continue}break}G[j+8>>2]=c;if(q>>>0>=2){Za(j+160|0,G[j+304>>2]);Za(j- -64|0,G[j+308>>2]);Za(j+16|0,G[j+312>>2]);break Q}Z:{switch(q|0){case 1:Za(j- -64|0,G[j+304>>2]);Za(j+16|0,G[j+308>>2]);break Q;case 0:break Z;default:break Q}}Za(j+16|0,G[j+304>>2]);break Q}if((m&u)==-1){c=c+o|0;while(1){g=H[c+1|0];d=c+1|0;c=d;if((g|0)==32){continue}break}G[j+304>>2]=d;if(!g){break Q}c=0;while(1){q=c;_:{while(1){c=g&255;if(!c){break _}if(!((c|0)==32|(c|0)==58)){g=H[d+1|0];d=d+1|0;continue}break}E[d|0]=0;d=d+1|0}g=d;while(1){d=g;g=d+1|0;if(H[d|0]==32){continue}break}c=q+1|0;G[(j+304|0)+(c<<2)>>2]=d;g=H[d|0];if(g){continue}break}G[j+8>>2]=c;$:{switch(q|0){case 1:Za(j- -64|0,G[j+304>>2]);Za(j+16|0,G[j+308>>2]);break Q;case 0:break $;default:break Q}}Za(j- -64|0,G[j+304>>2]);break Q}if((u|0)!=-1){break Q}Nh((c+m|0)+1|0,j+304|0,j+8|0);if(G[j+8>>2]!=1){break Q}Za(j+16|0,G[j+304>>2])}d=0;aa:{if((mg(j+16|0)|0)!=1){I=0;e=0;break aa}mg(j- -64|0);e=0;I=mg(j+160|0);if((I|0)!=1){break aa}e=sb(j+16|0);if(e>60){p=e/1e4;ba:{if(O(p)<2147483648){c=~~p;break ba}c=-2147483648}B=+(c|0);p=e-B*1e4;e=p/100;ca:{if(O(e)<2147483648){c=~~e;break ca}c=-2147483648}e=p;p=+(c|0);e=e-p*100;I=1;break aa}I=1;B=sb(j+160|0);p=sb(j- -64|0)}L[v+56>>3]=l*((r|0)==1?1:15)*(B+p/60+e/3600);J=Za(j+256|0,_);g=Va(J);e=vb(J,j+12|0);da:{if(!H[J|0]){c=0;break da}while(1){c=d+J|0;if(H[c|0]==46){E[c|0]=0}c=Va(J);d=d+1|0;if(c>>>0>d>>>0){continue}break}}if(!(G[j+12>>2]!=(g+J|0)|c>>>0>4)){L[v+56>>3]=e;I=0}F[j+64>>1]=48;F[j+112>>1]=48;F[j+16>>1]=48;d=0;q=Za(_,z);e=-1;l=1;ea:{fa:{while(1){g=d+z|0;c=H[g|0];if((c|0)!=32){ga:{switch(c-43|0){case 2:break fa;case 0:break ga;default:break ea}}}else{d=d+1|0;continue}break}e=1}E[g|0]=32;l=e}r=-1;o=-1;m=-1;ha:{ia:{c=Va(z);if((c|0)<=0){break ia}g=c&1;ja:{if((c|0)==1){d=0;break ja}c=c&-2;d=0;u=0;while(1){P=d|1;Q=H[P+z|0]&223;t=H[d+z|0]&223;m=(Q|0)==83?P:(t|0)==83?d:m;o=(Q|0)==77?P:(t|0)==77?d:o;r=(Q|0)==68?P:(t|0)==68?d:r;d=d+2|0;u=u+2|0;if((c|0)!=(u|0)){continue}break}}if(g){c=H[d+z|0]&223;m=(c|0)==83?d:m;o=(c|0)==77?d:o;r=(c|0)==68?d:r}d=1;if(!((r|0)<=0|(o|0)<=0)&(o|0)<(r|0)|!((r|0)<=0|(m|0)<=0)&(m|0)<(r|0)){break P}if(!((o|0)<=0|(m|0)<=0)&(m|0)<(o|0)){break P}ka:{la:{ma:{na:{d=(r|0)>0;oa:{if(d){ea=Za(j+112|0,z)+r|0,ga=0,E[ea|0]=ga;if((o|0)<=0){break oa}if(o-1>>>0<=r>>>0){break na}d=1;ea=Za(j- -64|0,(r+z|0)+1|0)+((r^-1)+o|0)|0,ga=0,E[ea|0]=ga;if((m|0)>0){break ma}break ia}if((o|0)>0){break na}}if((m|0)<=0){break ia}c=m-1|0;break la}ea=Za(j- -64|0,z)+o|0,ga=0,E[ea|0]=ga;if((m|0)<=0){break ia}}c=m-1|0;if((o|0)>=(c|0)){break la}Za(j+16|0,(o+z|0)+1|0);m=(o^-1)+m|0;break ka}if(!(!d|(c|0)<=(r|0))){Za(j+16|0,(r+z|0)+1|0);m=(r^-1)+m|0;break ka}Za(j+16|0,z)}E[(j+16|0)+m|0]=0;G[j+8>>2]=0;break ha}G[j+8>>2]=0;pa:{qa:{ra:{if((r&o&m)!=-1){if((o&m)!=-1){break pa}Nh((r+z|0)+1|0,j+304|0,j+8|0);switch(G[j+8>>2]-1|0){case 0:break qa;case 1:break ra;default:break ha}}Nh(z,j+304|0,j+8|0);c=G[j+8>>2];if((c|0)>=3){Za(j+112|0,G[j+304>>2]);Za(j- -64|0,G[j+308>>2]);Za(j+16|0,G[j+312>>2]);break ha}sa:{switch(c-1|0){case 1:Za(j- -64|0,G[j+304>>2]);Za(j+16|0,G[j+308>>2]);break ha;case 0:break sa;default:break ha}}Za(j+16|0,G[j+304>>2]);break ha}c=G[j+304>>2];Za(Za(j- -64|0,c),c);Za(j+16|0,G[j+308>>2]);break ha}Za(j- -64|0,G[j+304>>2]);break ha}if((m|0)!=-1){break ha}Nh((o+z|0)+1|0,j+304|0,j+8|0);if(G[j+8>>2]!=1){break ha}Za(j+16|0,G[j+304>>2])}c=1;B=0;d=0;ta:{ua:{if((mg(j+16|0)|0)!=1){break ua}if((mg(j- -64|0)|0)!=1){break ua}p=0;e=0;g=mg(j+112|0);if((g|0)!=1){break ta}e=sb(j+16|0);if(e>60){p=e/1e4;va:{if(O(p)<2147483648){g=~~p;break va}g=-2147483648}B=+(g|0);p=e-B*1e4;e=p/100;wa:{if(O(e)<2147483648){g=~~e;break wa}g=-2147483648}e=p;p=+(g|0);e=e-p*100;g=1;break ta}g=1;B=sb(j+112|0);p=sb(j- -64|0);break ta}g=0;p=0;e=0}L[w>>3]=l*(B+p/60+e/3600);t=Za(J,q);q=Va(t);e=vb(t,j+12|0);if(H[t|0]){while(1){c=d+t|0;if(H[c|0]==46){E[c|0]=0}d=d+1|0;c=Va(t);if(d>>>0>>0){continue}break}c=c>>>0<5}xa:{if(!(!c|G[j+12>>2]!=(q+t|0))){L[w>>3]=e;g=0;c=0;if(!(O(e)>90)){break xa}}if(!(g|I)){d=3;break P}c=!g<<1}d=I?c:1}Fa=j+448|0;if(d){break u}}e=L[v+56>>3];if(e<0){while(1){e=e+360;if(e<0){continue}break}L[v+56>>3]=e}if(e>360){while(1){e=e+-360;if(e>360){continue}break}L[v+56>>3]=e}l=L[w>>3];if(l<-90|l>90){break u}ya:{if(ca){dd(s,V,e,l,N,y,k+56|0,k- -64|0);break ya}L[k+64>>3]=l;L[k+56>>3]=e}if((am(k+72|0,0,h+220|0)|0)<0){break u}c=G[h+220>>2];t=$l(c,1);if((t|0)<0){break u}v=$l(c,0);if((v|0)<0){break u}w=k+28|0;q=k+3|0;za:{Aa:{Ba:{Ca:{switch(c-1|0){default:e=L[k+56>>3];break Aa;case 2:e=L[k+56>>3]*.017453292519943295*1e3;L[k+56>>3]=e;l=L[k+64>>3]*.017453292519943295*1e3;break Ba;case 3:e=L[k+56>>3]*3600;L[k+56>>3]=e;l=L[k+64>>3]*3600;break Ba;case 4:e=L[k+56>>3]*3600*1e3;L[k+56>>3]=e;l=L[k+64>>3]*3600*1e3;break Ba;case 0:m=-1;e=L[k+56>>3];Da:{if(e<-360|e>360){break Da}Ea:{if(e<0){G[h+200>>2]=1;e=O(e);break Ea}G[h+200>>2]=0}l=e/15;e=S(l);Fa:{if(O(e)<2147483648){c=~~e;break Fa}c=-2147483648}G[h+212>>2]=c;l=(l-+(c|0))*60;e=S(l);Ga:{if(O(e)<2147483648){g=~~e;break Ga}g=-2147483648}G[h+208>>2]=g;p=$b(10,+(t|0));e=(l-+(g|0))*60;Ha:{if(e<0){e=T(e*p+-.5);break Ha}e=S(e*p+.5)}e=e/p;L[h+192>>3]=e;if(e>=60){L[h+192>>3]=e+-60;g=g+1|0;G[h+208>>2]=g}m=0;if((g|0)<60){break Da}G[h+208>>2]=g-60;G[h+212>>2]=G[h+212>>2]+1}if((m|0)<0){break u}g=G[h+200>>2]?48783:92041;d=G[h+208>>2];c=G[h+212>>2];Ia:{if(!t){L[h+112>>3]=L[h+192>>3];G[h+96>>2]=g;G[h+100>>2]=c;G[h+104>>2]=d;Eb(q,7144,h+96|0);break Ia}G[h+144>>2]=t;L[h+152>>3]=L[h+192>>3];G[h+128>>2]=g;G[h+132>>2]=c;G[h+136>>2]=d;G[h+140>>2]=t+3;Eb(q,7188,h+128|0)}e=L[h+192>>3]+(+G[h+212>>2]*1e4+ +G[h+208>>2]*100);L[k+56>>3]=e;if(G[h+200>>2]){L[k+56>>3]=-e}g=-1;e=L[k+64>>3];Ja:{if(e<-360|e>360){break Ja}Ka:{if(e<0){G[h+200>>2]=1;e=O(e);break Ka}G[h+200>>2]=0}l=S(e);La:{if(O(l)<2147483648){c=~~l;break La}c=-2147483648}G[h+216>>2]=c;l=(e-+(c|0))*60;e=S(l);Ma:{if(O(e)<2147483648){d=~~e;break Ma}d=-2147483648}G[h+204>>2]=d;p=$b(10,+(v|0));e=(l-+(d|0))*60;Na:{if(e<0){e=T(e*p+-.5);break Na}e=S(e*p+.5)}e=e/p;L[h+184>>3]=e;if(e>=60){L[h+184>>3]=e+-60;d=d+1|0;G[h+204>>2]=d}g=0;if((d|0)<60){break Ja}G[h+204>>2]=d-60;G[h+216>>2]=G[h+216>>2]+1}if((g|0)<0){break u}g=G[h+200>>2]?48783:49026;d=G[h+204>>2];c=G[h+216>>2];Oa:{if(!v){L[h+48>>3]=L[h+184>>3];G[h+32>>2]=g;G[h+36>>2]=c;G[h+40>>2]=d;Eb(w,7166,h+32|0);break Oa}G[h+80>>2]=v;L[h+88>>3]=L[h+184>>3];G[h+64>>2]=g;G[h+68>>2]=c;G[h+72>>2]=d;G[h+76>>2]=v+3;Eb(w,7210,h- -64|0)}e=L[h+184>>3]+(+G[h+216>>2]*1e4+ +G[h+204>>2]*100);L[k+64>>3]=e;if(!G[h+200>>2]){break za}L[k+64>>3]=-e;break za;case 1:break Ca}}e=L[k+56>>3]*.017453292519943295;L[k+56>>3]=e;l=L[k+64>>3]*.017453292519943295}L[k+64>>3]=l}e=bm(e,t);L[k+56>>3]=e;L[h+24>>3]=e;G[h+16>>2]=t;Eb(q,19659,h+16|0);e=bm(L[k+64>>3],v);L[k+64>>3]=e;L[h+8>>3]=e;G[h>>2]=v;Eb(w,19653,h)}}Fa=h+224|0;G[i+464>>2]=G[b>>2];_a(G[935266],29730,i+464|0);L[i+448>>3]=L[b+1120>>3];xb(G[935266],18791,i+448|0);L[i+432>>3]=L[b+1128>>3];xb(G[935266],18791,i+432|0);G[i+416>>2]=k|3;_a(G[935266],8700,i+416|0);G[i+400>>2]=i+636;_a(G[935266],8700,i+400|0);G[i+384>>2]=G[b+1060>>2];_a(G[935266],29730,i+384|0);G[i+368>>2]=G[b+1064>>2];_a(G[935266],29730,i+368|0);G[i+352>>2]=b+1040;_a(G[935266],8651,i+352|0);G[i+336>>2]=b+1050;_a(G[935266],8651,i+336|0);L[i+320>>3]=K[b+1068>>2];xb(G[935266],18922,i+320|0);L[i+304>>3]=K[b+1072>>2];xb(G[935266],18922,i+304|0);L[i+288>>3]=L[b+1080>>3];xb(G[935266],18791,i+288|0);L[i+272>>3]=L[b+1088>>3];xb(G[935266],18791,i+272|0);L[i+256>>3]=L[b+1096>>3];xb(G[935266],25572,i+256|0);L[i+240>>3]=L[b+1104>>3];xb(G[935266],25572,i+240|0);L[i+224>>3]=L[b+1112>>3];xb(G[935266],18791,i+224|0);L[i+208>>3]=L[b+1208>>3];xb(G[935266],19234,i+208|0);if(G[935262]>0){while(1){d=M(W,516);G[i+192>>2]=G[(d+G[935263]|0)+512>>2];c=i+1040|0;db(c,8433,i+192|0);G[i+176>>2]=(d+G[935263]|0)+256;_a(G[935266],c,i+176|0);W=W+1|0;if((W|0)>3]=L[b+1136>>3];xb(G[935266],18791,i+160|0);L[i+144>>3]=L[b+1144>>3];xb(G[935266],18791,i+144|0);L[i+128>>3]=L[b+1152>>3];xb(G[935266],18791,i+128|0);L[i+112>>3]=L[b+1160>>3];xb(G[935266],18791,i+112|0);L[i+96>>3]=L[b+1168>>3];xb(G[935266],18791,i+96|0);L[i+80>>3]=L[b+1176>>3];xb(G[935266],18791,i+80|0);L[i+64>>3]=L[b+1184>>3];xb(G[935266],18791,i- -64|0);L[i+48>>3]=L[b+1192>>3];xb(G[935266],18791,i+48|0)}c=G[b+1036>>2];G[i+32>>2]=G[b+1032>>2];G[i+36>>2]=c;_a(G[935266],26726,i+32|0);G[i+16>>2]=G[b+1028>>2]-1;_a(G[935266],29730,i+16|0);G[i>>2]=b+4;_a(G[935266],69730,i);$a(G[935266]);G[935247]=G[935247]+1;Fa=i+1072|0;G[935254]=G[935254]+1;if(!D){break b}Wa(n)}c=G[b+1028>>2]+1|0;G[b+1028>>2]=c;G[f+344>>2]=0;if(!mb(G[f+348>>2],c,0,f+344|0)){continue}break}}G[f+344>>2]=0;Qb(G[f+348>>2],f+344|0)}Fa=f+2416|0;return x}function qq(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0;j=Fa-816|0;Fa=j;a:{if(G[i>>2]>0){break a}l=G[a>>2];k=G[a+4>>2];if((l|0)!=G[k+76>>2]){mb(a,l+1|0,0,i);k=G[a+4>>2];l=G[k+76>>2]}l=G[k+96>>2]+(l<<3)|0;if(G[k+104>>2]!=G[l>>2]|G[k+108>>2]!=G[l+4>>2]){G[i>>2]=201;break a}if((c|0)<0){G[i>>2]=218;break a}if(d>>>0>=1e3){G[i>>2]=216;break a}E[j+352|0]=0;if(h){qb(j+352|0,h,70)}lc(a,34516,35618,15302,i);b:{if(G[i>>2]>0){break b}G[j+240>>2]=8;G[j+244>>2]=0;E[j+256|0]=0;if((db(j+256|0,26741,j+240|0)|0)<0){Ua(17884);G[i>>2]=401}h=j+640|0;Ob(32941,j+256|0,7410,h,i);wb(a,h,i);if(G[i>>2]>0){break b}G[j+224>>2]=2;G[j+228>>2]=0;E[j+256|0]=0;if((db(j+256|0,26741,j+224|0)|0)<0){Ua(17884);G[i>>2]=401}h=j+640|0;Ob(33788,j+256|0,23165,h,i);wb(a,h,i)}c:{d:{if(d){k=0;while(1){m=(k<<2)+f|0;Vf(G[m>>2],j+636|0,j+632|0,j+628|0,i);e:{f:{l=G[j+636>>2];h=l-1|0;if(h){if((h|0)!=15){break f}h=G[j+632>>2];l=h>>31;break e}h=(G[j+632>>2]+7|0)/8|0;l=h>>31;break e}if((l|0)>0){h=M(G[j+632>>2],(l>>>0)/10|0);l=h>>31;break e}h=8;m=G[m>>2];l=0;if((H[m|0]|32)==112){break e}h=H[m+1|0]-80&223?16:8;l=0}if(G[i>>2]>0){break c}n=l+n|0;m=h+o|0;n=m>>>0>>0?n+1|0:n;o=m;k=k+1|0;if((k|0)!=(d|0)){continue}break}break d}if(G[i>>2]>0){break c}}G[j+208>>2]=o;G[j+212>>2]=n;E[j+256|0]=0;if((db(j+256|0,26741,j+208|0)|0)<0){Ua(17884);G[i>>2]=401}h=j+640|0;Ob(41261,j+256|0,7422,h,i);wb(a,h,i);if(G[i>>2]>0){break c}G[j+192>>2]=b;G[j+196>>2]=c;E[j+256|0]=0;if((db(j+256|0,26741,j+192|0)|0)<0){Ua(17884);G[i>>2]=401}b=j+640|0;Ob(40853,j+256|0,23289,b,i);wb(a,b,i);if(G[i>>2]>0){break c}G[j+176>>2]=0;G[j+180>>2]=0;E[j+256|0]=0;if((db(j+256|0,26741,j+176|0)|0)<0){Ua(17884);G[i>>2]=401}b=j+640|0;Ob(33303,j+256|0,31608,b,i);wb(a,b,i);if(G[i>>2]>0){break c}G[j+160>>2]=1;G[j+164>>2]=0;E[j+256|0]=0;if((db(j+256|0,26741,j+160|0)|0)<0){Ua(17884);G[i>>2]=401}b=j+640|0;Ob(33311,j+256|0,61992,b,i);wb(a,b,i);if(G[i>>2]>0){break c}E[j+256|0]=0;G[j+144>>2]=d;G[j+148>>2]=d>>31;if((db(j+256|0,26741,j+144|0)|0)<0){Ua(17884);G[i>>2]=401}b=j+640|0;Ob(33837,j+256|0,3872,b,i);wb(a,b,i)}n=(d|0)>0?d:0;h=0;while(1){g:{if((h|0)==(n|0)){break g}o=h<<2;d=o+e|0;if(H[G[d>>2]]){b=h+1|0;G[j+128>>2]=b;c=j+432|0;Ya(c,73,29741,j+128|0);k=b;b=j+512|0;zb(35402,k,b,i);lc(a,b,G[d>>2],c,i)}b=G[f+o>>2];if(Va(b)>>>0>=30){Ua(56310);G[i>>2]=261;break g}c=Za(j+592|0,b);Yf(c);h=h+1|0;zb(34641,h,j+512|0,i);d=H[26802]|H[26803]<<8|(H[26804]<<16|H[26805]<<24);b=H[26798]|H[26799]<<8|(H[26800]<<16|H[26801]<<24);E[j+445|0]=b;E[j+446|0]=b>>>8;E[j+447|0]=b>>>16;E[j+448|0]=b>>>24;E[j+449|0]=d;E[j+450|0]=d>>>8;E[j+451|0]=d>>>16;E[j+452|0]=d>>>24;b=H[26797]|H[26798]<<8|(H[26799]<<16|H[26800]<<24);G[j+440>>2]=H[26793]|H[26794]<<8|(H[26795]<<16|H[26796]<<24);G[j+444>>2]=b;b=H[26789]|H[26790]<<8|(H[26791]<<16|H[26792]<<24);G[j+432>>2]=H[26785]|H[26786]<<8|(H[26787]<<16|H[26788]<<24);G[j+436>>2]=b;Vf(c,j+636|0,j+632|0,j+628|0,i);h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{b=G[j+636>>2];switch(b-1|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 14:case 16:case 17:case 18:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:break j;case 82:break l;case 81:break m;case 41:break n;case 79:break o;case 39:break p;case 80:break q;case 40:break r;case 19:break s;case 20:break t;case 13:break u;case 10:break v;case 0:break w;case 15:break x;default:break k}}b=j+432|0;b=Va(b)+b|0;k=H[11103]|H[11104]<<8|(H[11105]<<16|H[11106]<<24);d=H[11099]|H[11100]<<8|(H[11101]<<16|H[11102]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;d=H[11115]|H[11116]<<8;E[b+16|0]=d;E[b+17|0]=d>>>8;k=H[11111]|H[11112]<<8|(H[11113]<<16|H[11114]<<24);d=H[11107]|H[11108]<<8|(H[11109]<<16|H[11110]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;b=jb(c,65);G[j+112>>2]=j+628;if((Qc(b+1|0,27698,j+112|0)|0)!=1){break h}b=G[j+632>>2];if((b|0)>=G[j+628>>2]){break h}if((b|0)==1){d=H[36118]|H[36119]<<8|(H[36120]<<16|H[36121]<<24);b=H[36114]|H[36115]<<8|(H[36116]<<16|H[36117]<<24);E[j+471|0]=b;E[j+472|0]=b>>>8;E[j+473|0]=b>>>16;E[j+474|0]=b>>>24;E[j+475|0]=d;E[j+476|0]=d>>>8;E[j+477|0]=d>>>16;E[j+478|0]=d>>>24;b=H[36111]|H[36112]<<8|(H[36113]<<16|H[36114]<<24);G[j+464>>2]=H[36107]|H[36108]<<8|(H[36109]<<16|H[36110]<<24);G[j+468>>2]=b;b=H[36103]|H[36104]<<8|(H[36105]<<16|H[36106]<<24);G[j+456>>2]=H[36099]|H[36100]<<8|(H[36101]<<16|H[36102]<<24);G[j+460>>2]=b;b=H[36095]|H[36096]<<8|(H[36097]<<16|H[36098]<<24);G[j+448>>2]=H[36091]|H[36092]<<8|(H[36093]<<16|H[36094]<<24);G[j+452>>2]=b;b=H[36087]|H[36088]<<8|(H[36089]<<16|H[36090]<<24);G[j+440>>2]=H[36083]|H[36084]<<8|(H[36085]<<16|H[36086]<<24);G[j+444>>2]=b;b=H[36079]|H[36080]<<8|(H[36081]<<16|H[36082]<<24);G[j+432>>2]=H[36075]|H[36076]<<8|(H[36077]<<16|H[36078]<<24);G[j+436>>2]=b;break h}b=H[13285]|H[13286]<<8|(H[13287]<<16|H[13288]<<24);G[j+472>>2]=H[13281]|H[13282]<<8|(H[13283]<<16|H[13284]<<24);G[j+476>>2]=b;b=H[13277]|H[13278]<<8|(H[13279]<<16|H[13280]<<24);G[j+464>>2]=H[13273]|H[13274]<<8|(H[13275]<<16|H[13276]<<24);G[j+468>>2]=b;b=H[13269]|H[13270]<<8|(H[13271]<<16|H[13272]<<24);G[j+456>>2]=H[13265]|H[13266]<<8|(H[13267]<<16|H[13268]<<24);G[j+460>>2]=b;b=H[13261]|H[13262]<<8|(H[13263]<<16|H[13264]<<24);G[j+448>>2]=H[13257]|H[13258]<<8|(H[13259]<<16|H[13260]<<24);G[j+452>>2]=b;b=H[13253]|H[13254]<<8|(H[13255]<<16|H[13256]<<24);G[j+440>>2]=H[13249]|H[13250]<<8|(H[13251]<<16|H[13252]<<24);G[j+444>>2]=b;b=H[13245]|H[13246]<<8|(H[13247]<<16|H[13248]<<24);G[j+432>>2]=H[13241]|H[13242]<<8|(H[13243]<<16|H[13244]<<24);G[j+436>>2]=b;break h}b=j+432|0;d=Va(b)+b|0;b=H[33394]|H[33395]<<8|(H[33396]<<16|H[33397]<<24);E[d|0]=b;E[d+1|0]=b>>>8;E[d+2|0]=b>>>16;E[d+3|0]=b>>>24;b=H[33398]|H[33399]<<8;E[d+4|0]=b;E[d+5|0]=b>>>8;break h}b=j+432|0;d=Va(b)+b|0;b=H[35376]|H[35377]<<8|(H[35378]<<16|H[35379]<<24);E[d|0]=b;E[d+1|0]=b>>>8;E[d+2|0]=b>>>16;E[d+3|0]=b>>>24;b=H[35379]|H[35380]<<8|(H[35381]<<16|H[35382]<<24);E[d+3|0]=b;E[d+4|0]=b>>>8;E[d+5|0]=b>>>16;E[d+6|0]=b>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34848]|H[34849]<<8|(H[34850]<<16|H[34851]<<24);d=H[34844]|H[34845]<<8|(H[34846]<<16|H[34847]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34860];k=H[34856]|H[34857]<<8|(H[34858]<<16|H[34859]<<24);d=H[34852]|H[34853]<<8|(H[34854]<<16|H[34855]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34087]|H[34088]<<8|(H[34089]<<16|H[34090]<<24);d=H[34083]|H[34084]<<8|(H[34085]<<16|H[34086]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34099];k=H[34095]|H[34096]<<8|(H[34097]<<16|H[34098]<<24);d=H[34091]|H[34092]<<8|(H[34093]<<16|H[34094]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34087]|H[34088]<<8|(H[34089]<<16|H[34090]<<24);d=H[34083]|H[34084]<<8|(H[34085]<<16|H[34086]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34099];k=H[34095]|H[34096]<<8|(H[34097]<<16|H[34098]<<24);d=H[34091]|H[34092]<<8|(H[34093]<<16|H[34094]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34070]|H[34071]<<8|(H[34072]<<16|H[34073]<<24);d=H[34066]|H[34067]<<8|(H[34068]<<16|H[34069]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34082];k=H[34078]|H[34079]<<8|(H[34080]<<16|H[34081]<<24);d=H[34074]|H[34075]<<8|(H[34076]<<16|H[34077]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34053]|H[34054]<<8|(H[34055]<<16|H[34056]<<24);d=H[34049]|H[34050]<<8|(H[34051]<<16|H[34052]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34065];k=H[34061]|H[34062]<<8|(H[34063]<<16|H[34064]<<24);d=H[34057]|H[34058]<<8|(H[34059]<<16|H[34060]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34070]|H[34071]<<8|(H[34072]<<16|H[34073]<<24);d=H[34066]|H[34067]<<8|(H[34068]<<16|H[34069]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34082];k=H[34078]|H[34079]<<8|(H[34080]<<16|H[34081]<<24);d=H[34074]|H[34075]<<8|(H[34076]<<16|H[34077]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34053]|H[34054]<<8|(H[34055]<<16|H[34056]<<24);d=H[34049]|H[34050]<<8|(H[34051]<<16|H[34052]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[34065];k=H[34061]|H[34062]<<8|(H[34063]<<16|H[34064]<<24);d=H[34057]|H[34058]<<8|(H[34059]<<16|H[34060]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[34828]|H[34829]<<8|(H[34830]<<16|H[34831]<<24);d=H[34824]|H[34825]<<8|(H[34826]<<16|H[34827]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;k=H[34834]|H[34835]<<8|(H[34836]<<16|H[34837]<<24);d=H[34830]|H[34831]<<8|(H[34832]<<16|H[34833]<<24);E[b+6|0]=d;E[b+7|0]=d>>>8;E[b+8|0]=d>>>16;E[b+9|0]=d>>>24;E[b+10|0]=k;E[b+11|0]=k>>>8;E[b+12|0]=k>>>16;E[b+13|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[35597]|H[35598]<<8|(H[35599]<<16|H[35600]<<24);d=H[35593]|H[35594]<<8|(H[35595]<<16|H[35596]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;k=H[35605]|H[35606]<<8|(H[35607]<<16|H[35608]<<24);d=H[35601]|H[35602]<<8|(H[35603]<<16|H[35604]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;k=Va(b)+b|0;d=H[32998]|H[32999]<<8|(H[33e3]<<16|H[33001]<<24);b=H[32994]|H[32995]<<8|(H[32996]<<16|H[32997]<<24);E[k|0]=b;E[k+1|0]=b>>>8;E[k+2|0]=b>>>16;E[k+3|0]=b>>>24;E[k+4|0]=d;E[k+5|0]=d>>>8;E[k+6|0]=d>>>16;E[k+7|0]=d>>>24;b=H[33002]|H[33003]<<8;E[k+8|0]=b;E[k+9|0]=b>>>8;break h}if((b|0)==163){break i}}if((b|0)>=0){break h}b=j+432|0;b=Va(b)+b|0;k=H[3678]|H[3679]<<8|(H[3680]<<16|H[3681]<<24);d=H[3674]|H[3675]<<8|(H[3676]<<16|H[3677]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;k=H[3694]|H[3695]<<8|(H[3696]<<16|H[3697]<<24);d=H[3690]|H[3691]<<8|(H[3692]<<16|H[3693]<<24);E[b+16|0]=d;E[b+17|0]=d>>>8;E[b+18|0]=d>>>16;E[b+19|0]=d>>>24;E[b+20|0]=k;E[b+21|0]=k>>>8;E[b+22|0]=k>>>16;E[b+23|0]=k>>>24;k=H[3686]|H[3687]<<8|(H[3688]<<16|H[3689]<<24);d=H[3682]|H[3683]<<8|(H[3684]<<16|H[3685]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;break h}b=j+432|0;b=Va(b)+b|0;k=H[32981]|H[32982]<<8|(H[32983]<<16|H[32984]<<24);d=H[32977]|H[32978]<<8|(H[32979]<<16|H[32980]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;E[b+16|0]=H[32993];k=H[32989]|H[32990]<<8|(H[32991]<<16|H[32992]<<24);d=H[32985]|H[32986]<<8|(H[32987]<<16|H[32988]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24}k=c;d=k;l=k;b=G[j+636>>2];m=b>>31;y:{z:{A:{B:{C:{D:{E:{b=(b^m)-m|0;switch(b-12|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:break A;case 28:break C;case 8:break D;case 0:break E;default:break B}}while(1){b=k;k=b+1|0;if(H[b|0]!=83){continue}break}E[b|0]=66;b=j+512|0;lc(a,b,c,j+432|0,i);zb(34362,h,b,i);b=H[7466]|H[7467]<<8|(H[7468]<<16|H[7469]<<24);G[j+448>>2]=H[7462]|H[7463]<<8|(H[7464]<<16|H[7465]<<24);G[j+452>>2]=b;b=H[7458]|H[7459]<<8|(H[7460]<<16|H[7461]<<24);G[j+440>>2]=H[7454]|H[7455]<<8|(H[7456]<<16|H[7457]<<24);G[j+444>>2]=b;b=H[7450]|H[7451]<<8|(H[7452]<<16|H[7453]<<24);G[j+432>>2]=H[7446]|H[7447]<<8|(H[7448]<<16|H[7449]<<24);G[j+436>>2]=b;if(G[i>>2]<=0){G[j+16>>2]=0;E[j+736|0]=0;G[j+24>>2]=0;G[j+28>>2]=-1067450368;if((Ya(j+736|0,71,19659,j+16|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i)}zb(34838,h,j+512|0,i);G[j+448>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);b=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[j+440>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[j+444>>2]=b;b=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[j+432>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[j+436>>2]=b;if(G[i>>2]>0){break y}G[j>>2]=0;E[j+736|0]=0;G[j+8>>2]=0;G[j+12>>2]=1072693248;if((Ya(j+736|0,71,19659,j)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i);break y}while(1){b=d;d=b+1|0;if(H[b|0]!=85){continue}break}E[b|0]=73;b=j+512|0;lc(a,b,c,j+432|0,i);zb(34362,h,b,i);c=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);b=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[j+453|0]=b;E[j+454|0]=b>>>8;E[j+455|0]=b>>>16;E[j+456|0]=b>>>24;E[j+457|0]=c;E[j+458|0]=c>>>8;E[j+459|0]=c>>>16;E[j+460|0]=c>>>24;b=H[6478]|H[6479]<<8|(H[6480]<<16|H[6481]<<24);G[j+448>>2]=H[6474]|H[6475]<<8|(H[6476]<<16|H[6477]<<24);G[j+452>>2]=b;b=H[6470]|H[6471]<<8|(H[6472]<<16|H[6473]<<24);G[j+440>>2]=H[6466]|H[6467]<<8|(H[6468]<<16|H[6469]<<24);G[j+444>>2]=b;b=H[6462]|H[6463]<<8|(H[6464]<<16|H[6465]<<24);G[j+432>>2]=H[6458]|H[6459]<<8|(H[6460]<<16|H[6461]<<24);G[j+436>>2]=b;if(G[i>>2]<=0){G[j+48>>2]=0;E[j+736|0]=0;G[j+56>>2]=0;G[j+60>>2]=1088421888;if((Ya(j+736|0,71,19659,j+48|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i)}zb(34838,h,j+512|0,i);G[j+448>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);b=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[j+440>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[j+444>>2]=b;b=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[j+432>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[j+436>>2]=b;if(G[i>>2]>0){break y}G[j+32>>2]=0;E[j+736|0]=0;G[j+40>>2]=0;G[j+44>>2]=1072693248;if((Ya(j+736|0,71,19659,j+32|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i);break y}while(1){b=l;l=b+1|0;if(H[b|0]!=86){continue}break}E[b|0]=74;b=j+512|0;lc(a,b,c,j+432|0,i);zb(34362,h,b,i);c=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);b=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[j+453|0]=b;E[j+454|0]=b>>>8;E[j+455|0]=b>>>16;E[j+456|0]=b>>>24;E[j+457|0]=c;E[j+458|0]=c>>>8;E[j+459|0]=c>>>16;E[j+460|0]=c>>>24;b=H[6478]|H[6479]<<8|(H[6480]<<16|H[6481]<<24);G[j+448>>2]=H[6474]|H[6475]<<8|(H[6476]<<16|H[6477]<<24);G[j+452>>2]=b;b=H[6470]|H[6471]<<8|(H[6472]<<16|H[6473]<<24);G[j+440>>2]=H[6466]|H[6467]<<8|(H[6468]<<16|H[6469]<<24);G[j+444>>2]=b;b=H[6462]|H[6463]<<8|(H[6464]<<16|H[6465]<<24);G[j+432>>2]=H[6458]|H[6459]<<8|(H[6460]<<16|H[6461]<<24);G[j+436>>2]=b;if(G[i>>2]<=0){G[j+80>>2]=0;E[j+736|0]=0;G[j+88>>2]=0;G[j+92>>2]=1105199104;if((Ya(j+736|0,71,19659,j+80|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i)}zb(34838,h,j+512|0,i);G[j+448>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);b=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[j+440>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[j+444>>2]=b;b=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[j+432>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[j+436>>2]=b;if(G[i>>2]>0){break y}G[j+64>>2]=0;E[j+736|0]=0;G[j+72>>2]=0;G[j+76>>2]=1072693248;if((Ya(j+736|0,71,19659,j- -64|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i);break y}if((b|0)==80){break z}}lc(a,j+512|0,c,j+432|0,i);break y}while(1){b=k;k=b+1|0;if(H[b|0]!=87){continue}break}E[b|0]=75;d=j+512|0;lc(a,d,c,j+432|0,i);l=j+256|0;zb(34362,h,l,i);c=Va(l)+l|0;b=H[68292]|H[68293]<<8|(H[68294]<<16|H[68295]<<24);E[c|0]=b;E[c+1|0]=b>>>8;E[c+2|0]=b>>>16;E[c+3|0]=b>>>24;b=H[68296]|H[68297]<<8;E[c+4|0]=b;E[c+5|0]=b>>>8;E[j+264|0]=0;b=Va(l)+l|0;k=H[6437]|H[6438]<<8|(H[6439]<<16|H[6440]<<24);c=H[6433]|H[6434]<<8|(H[6435]<<16|H[6436]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;E[b+4|0]=k;E[b+5|0]=k>>>8;E[b+6|0]=k>>>16;E[b+7|0]=k>>>24;k=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);c=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[b+46|0]=c;E[b+47|0]=c>>>8;E[b+48|0]=c>>>16;E[b+49|0]=c>>>24;E[b+50|0]=k;E[b+51|0]=k>>>8;E[b+52|0]=k>>>16;E[b+53|0]=k>>>24;k=H[6477]|H[6478]<<8|(H[6479]<<16|H[6480]<<24);c=H[6473]|H[6474]<<8|(H[6475]<<16|H[6476]<<24);E[b+40|0]=c;E[b+41|0]=c>>>8;E[b+42|0]=c>>>16;E[b+43|0]=c>>>24;E[b+44|0]=k;E[b+45|0]=k>>>8;E[b+46|0]=k>>>16;E[b+47|0]=k>>>24;k=H[6469]|H[6470]<<8|(H[6471]<<16|H[6472]<<24);c=H[6465]|H[6466]<<8|(H[6467]<<16|H[6468]<<24);E[b+32|0]=c;E[b+33|0]=c>>>8;E[b+34|0]=c>>>16;E[b+35|0]=c>>>24;E[b+36|0]=k;E[b+37|0]=k>>>8;E[b+38|0]=k>>>16;E[b+39|0]=k>>>24;k=H[6461]|H[6462]<<8|(H[6463]<<16|H[6464]<<24);c=H[6457]|H[6458]<<8|(H[6459]<<16|H[6460]<<24);E[b+24|0]=c;E[b+25|0]=c>>>8;E[b+26|0]=c>>>16;E[b+27|0]=c>>>24;E[b+28|0]=k;E[b+29|0]=k>>>8;E[b+30|0]=k>>>16;E[b+31|0]=k>>>24;k=H[6453]|H[6454]<<8|(H[6455]<<16|H[6456]<<24);c=H[6449]|H[6450]<<8|(H[6451]<<16|H[6452]<<24);E[b+16|0]=c;E[b+17|0]=c>>>8;E[b+18|0]=c>>>16;E[b+19|0]=c>>>24;E[b+20|0]=k;E[b+21|0]=k>>>8;E[b+22|0]=k>>>16;E[b+23|0]=k>>>24;k=H[6445]|H[6446]<<8|(H[6447]<<16|H[6448]<<24);c=H[6441]|H[6442]<<8|(H[6443]<<16|H[6444]<<24);E[b+8|0]=c;E[b+9|0]=c>>>8;E[b+10|0]=c>>>16;E[b+11|0]=c>>>24;E[b+12|0]=k;E[b+13|0]=k>>>8;E[b+14|0]=k>>>16;E[b+15|0]=k>>>24;wb(a,l,i);zb(34838,h,d,i);G[j+448>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);b=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[j+440>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[j+444>>2]=b;b=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[j+432>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[j+436>>2]=b;if(G[i>>2]>0){break y}G[j+96>>2]=0;E[j+736|0]=0;G[j+104>>2]=0;G[j+108>>2]=1072693248;if((Ya(j+736|0,71,19659,j+96|0)|0)<0){Ua(17928);G[i>>2]=402}b=jb(j+736|0,44);if(b){E[b|0]=46}if(jb(j+736|0,78)){Ua(35198);G[i>>2]=402}b=j+640|0;Ob(j+512|0,j+736|0,j+432|0,b,i);wb(a,b,i)}F:{if(!g){break F}c=g+o|0;b=G[c>>2];if(!b|!H[b|0]){break F}b=j+512|0;zb(33357,h,b,i);lc(a,b,G[c>>2],26762,i)}if(G[i>>2]<=0){continue}}break}if(H[j+352|0]){lc(a,35480,j+352|0,15289,i)}if(G[i>>2]<=0){break a}Ua(56256)}Fa=j+816|0}function $f(a,b,c,d,e,f,g){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,J=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;j=Fa-496|0;Fa=j;G[j+468>>2]=0;G[j+432>>2]=G[29736];i=G[29735];G[j+424>>2]=G[29734];G[j+428>>2]=i;i=G[29733];G[j+416>>2]=G[29732];G[j+420>>2]=i;i=G[29731];G[j+408>>2]=G[29730];G[j+412>>2]=i;i=G[29729];G[j+400>>2]=G[29728];G[j+404>>2]=i;G[j+384>>2]=0;G[j+388>>2]=0;i=G[g>>2];a:{if((i|0)>0){break a}b:{if(a>>>0>=1e3){Ua(51315);break b}Dc(G[b>>2],j+476|0,g);c:{d:{if(a){while(1){e:{f:{g:{i=M(p,244)+b|0;h=G[i+80>>2];k=G[i+84>>2]!=2?(h|0)<0?0-h|0:h:h;switch(k|0){case 0:case 11:case 12:case 14:case 16:case 20:case 21:case 31:case 40:case 41:case 42:case 81:case 82:case 83:break e;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 13:case 15:case 17:case 18:case 19:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:break f;default:break g}}if((k|0)==163){break e}}a=p+1|0;h:{if((k|0)<0){G[j+32>>2]=a;Ya(j+288|0,81,51457,j+32|0);break h}G[j+52>>2]=h;G[j+48>>2]=a;Ya(j+288|0,81,51639,j+48|0)}Ua(j+288|0);break c}G[i+96>>2]=0;G[i+100>>2]=0;E[i+174|0]=0;l=i+104|0;E[l|0]=0;Dc(G[i>>2],j+472|0,g);h=G[j+472>>2];i:{if(!G[j+476>>2]){if(h){G[j+64>>2]=p+1;Ya(j+288|0,81,51403,j- -64|0);i=233;G[g>>2]=233;break a}G[i+4>>2]=0;h=H[35678]|H[35679]<<8|(H[35680]<<16|H[35681]<<24);E[i+8|0]=h;E[i+9|0]=h>>>8;E[i+10|0]=h>>>16;E[i+11|0]=h>>>24;h=H[35682]|H[35683]<<8;E[i+12|0]=h;E[i+13|0]=h>>>8;G[j+492>>2]=0;Fc(G[i>>2],33369,l,0,j+492|0);break i}if(!h){G[j+80>>2]=p+1;Ya(j+288|0,81,51350,j+80|0);i=235;G[g>>2]=235;break a}k=i+4|0;j:{h=G[i+4>>2];k:{if((h|0)<=0){h=i+8|0;if(dc(G[i>>2],0,h,k,g)){G[j+112>>2]=h;G[j+116>>2]=p+1;a=j+288|0;Ya(a,81,51528,j+112|0);Ua(a);break d}h=G[k>>2];if((h|0)<=0){break k}}if(G[G[G[i>>2]+4>>2]+936>>2]>=(h|0)){break j}}G[j+100>>2]=h;G[j+96>>2]=p+1;a=j+288|0;Ya(a,81,51581,j+96|0);Ua(a);break b}G[j+492>>2]=0;q=h;h=j+208|0;m=j+492|0;zb(34547,q,h,m);Ec(G[i>>2],h,i+96|0,0,m);G[j+492>>2]=0;zb(33036,G[k>>2],h,m);Ec(G[i>>2],h,i+100|0,0,m);G[j+492>>2]=0;zb(35402,G[k>>2],h,m);Fc(G[i>>2],h,i+8|0,0,m);if(G[j+492>>2]){E[i+8|0]=0}G[j+492>>2]=0;h=j+208|0;m=j+492|0;zb(33357,G[k>>2],h,m);Fc(G[i>>2],h,l,0,m);G[j+492>>2]=0;zb(34187,G[k>>2],h,m);Fc(G[i>>2],h,i+174|0,0,m)}p=p+1|0;if((p|0)!=(a|0)){continue}break}}V=(c|0)>0?c:0;c=G[b>>2];l:{if(!G[j+476>>2]){Qd(c,j+488|0,g);de(G[b>>2],9,j+400|0,g);G[j+492>>2]=0;Ec(G[b>>2],33752,j+396|0,0,j+492|0);o=G[j+400>>2];i=G[j+488>>2];if(!(G[j+492>>2]|!G[j+396>>2]|(o|(i|0)<2))){Ec(G[b>>2],33311,j+464|0,0,g);o=G[j+464>>2];i=G[j+488>>2]}m:{if((i|0)<2){break m}c=i-1|0;k=c&3;n:{if(i-2>>>0<3){i=1;break n}m=c&-4;h=0;i=1;while(1){c=(j+400|0)+(i<<2)|0;o=M(M(M(M(G[c>>2],o),G[c+4>>2]),G[c+8>>2]),G[c+12>>2]);i=i+4|0;h=h+4|0;if((m|0)!=(h|0)){continue}break}}if(!k){break m}p=0;while(1){o=M(G[(j+400|0)+(i<<2)>>2],o);i=i+1|0;p=p+1|0;if((k|0)!=(p|0)){continue}break}}n=V+1|0;v=1;break l}Ec(c,40853,j+464|0,0,g);n=1;o=G[j+464>>2];v=V+1|0}c=o-V|0;c=(c|0)>0?c:0;G[j+464>>2]=c;o:{if(!d){jo(G[b>>2],j+460|0,g);h=1;if((a|0)>=2){o=1;while(1){c=G[M(o,244)+b>>2];i=0;p:{q:{while(1){if((c|0)!=G[M(i,244)+b>>2]){i=i+1|0;if((o|0)!=(i|0)){continue}break q}break}if((i|0)!=(o|0)){break p}}jo(c,j+456|0,g);c=G[j+460>>2];d=G[j+456>>2];G[j+460>>2]=(c|0)<(d|0)?c:d;h=h+1|0}o=o+1|0;if((o|0)!=(a|0)){continue}break}}c=G[j+460>>2]/(h|0)|0;G[j+460>>2]=(c|0)>1?c:1;break o}if((d|0)<0){G[j+460>>2]=c;break o}G[j+460>>2]=(c|0)<(d|0)?c:d}r:{s:{t:{x=lb(a,16);if(x){if((a|0)>0){w=v>>31;m=0;while(1){k=M(m,244)+b|0;c=G[k>>2];u:{v:{w:{if(!G[j+476>>2]){Eg(c,j+484|0,g);x:{y:{z:{A:{c=G[j+484>>2];B:{if((c|0)<=7){if((c|0)==-64){break y}if((c|0)!=-32){break B}o=42;break v}C:{switch(c-8|0){case 0:break w;case 24:break z;case 8:break A;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break B;default:break C}}if((c|0)==64){break x}}o=G[j+480>>2];break u}o=21;break v}o=41;break v}o=82;break v}o=81;break v}if((vd(c,G[k+4>>2],j+480|0,j+452|0,j+444|0,g)|0)>0){break r}o=G[j+480>>2];if((o|0)>=0){break u}G[j+460>>2]=1;if(G[k+84>>2]!=2){break u}G[j+16>>2]=m+1;a=j+288|0;Ya(a,81,51457,j+16|0);Ua(a);break c}o=11}G[j+480>>2]=o}c=o>>31;if(((c^o)-c|0)==1){o=M(o,11);G[j+480>>2]=o;G[j+452>>2]=(G[j+452>>2]+7|0)/8}p=G[k+80>>2];if(!p){c=o>>31;p=(c^o)-c|0;G[k+80>>2]=p}D:{E:{F:{c=G[j+476>>2];if(!((p|0)!=16?c:0)){i=G[j+460>>2];G[k+92>>2]=(c|0)!=2|G[j+452>>2]!=0;c=o>>31;c=(c^o)-c|0;d=c-11|0;if(d>>>0>30|!(1<=0){p=G[j+452>>2];break G}p=1;G[j+452>>2]=1;if(G[j+464>>2]<=0){break G}i=0;c=0;while(1){h=c+w|0;d=v;l=d+i|0;nh(G[k>>2],G[k+4>>2],l,d>>>0>l>>>0?h+1|0:h,j+448|0,0,g);d=G[j+452>>2];h=G[j+448>>2];p=(d|0)>(h|0)?d:h;G[j+452>>2]=p;h=c;c=i+1|0;h=c?h:h+1|0;i=c;d=G[j+464>>2];l=i>>>0>>0;c=h;d=d>>31;if(l&(h|0)<=(d|0)|(d|0)>(h|0)){continue}break}o=G[j+480>>2]}c=G[j+460>>2];G[k+92>>2]=p;i=M(c,p);c=o>>31;c=(c^o)-c|0;d=c-11|0;if(!(1<>>0<=30:0)&(c|0)!=81){break D}G[j+492>>2]=0;d=G[j+476>>2];zb(34755,G[k+4>>2],j+208|0,j+492|0);c=G[k>>2];H:{if((d|0)==1){Fc(c,j+208|0,j+128|0,0,j+492|0);if(!G[j+492>>2]){o=j+128|0;while(1){c=H[o|0];if((c|0)!=32){if(!c){break H}ue(j+128|0,j+440|0,j+492|0);if(G[j+492>>2]){break H}break D}else{o=o+1|0;continue}}}G[j+440>>2]=0;break D}Ec(c,j+208|0,j+440|0,0,j+492|0);if(G[j+492>>2]){G[j+440>>2]=0;break D}if(G[j+440>>2]){break D}}G[j+440>>2]=-2147483648;break D}if((c|0)!=81){break D}}G[j+492>>2]=0;Ec(G[k>>2],34862,j+440|0,0,j+492|0);if(!G[j+492>>2]){break D}G[j+440>>2]=0}I:{J:{K:{L:{M:{N:{O:{P:{Q:{R:{S:{T:{U:{V:{W:{X:{Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{ga:{ha:{ia:{ja:{ka:{la:{ma:{na:{oa:{pa:{qa:{ra:{sa:{ta:{c=G[k+80>>2];switch(c-11|0){case 5:break ia;case 71:break ja;case 72:break ka;case 31:break la;case 29:break ma;case 30:break na;case 19:break oa;case 20:break pa;case 9:break qa;case 10:break ra;case 1:break sa;case 0:break ta;case 2:case 4:case 6:case 7:case 8:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:break ea;case 70:break ga;case 3:break ha;default:break fa}}Z=k,_=lb(i+1|0,1),G[Z+88>>2]=_;c=x+(m<<4)|0;G[c>>2]=1;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=1;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=2;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=2;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=4;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=4;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=4;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=4;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c>>2]=4;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=_;c=x+(m<<4)|0;G[c+8>>2]=-2059275978;G[c>>2]=4;break I}Z=k,_=lb(i+1|0,8),G[Z+88>>2]=_;c=x+(m<<4)|0;G[c>>2]=8;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]==1){o=G[j+444>>2];G[j+452>>2]=o;break ua}o=G[j+452>>2]}c=i+1|0;l=lb(c,4);G[k+88>>2]=l;s=x+(m<<4)|0;h=o+1|0;G[s>>2]=h;if(!l){break I}d=lb(h,1);G[s+8>>2]=d;if((o|0)>0){E[d+1|0]=1}d=lb(M(c,h),1);G[l>>2]=d;if(!d){break t}va:{if((i|0)<=0){break va}o=1;if(i-1>>>0>=3){r=i&-4;c=0;while(1){q=l+(o<<2)|0;d=d+h|0;G[q>>2]=d;d=d+h|0;t=d+h|0;G[q+8>>2]=t;G[q+4>>2]=d;d=h+t|0;G[q+12>>2]=d;o=o+4|0;c=c+4|0;if((r|0)!=(c|0)){continue}break}}c=i&3;i=0;if(!c){break va}while(1){d=d+h|0;G[l+(o<<2)>>2]=d;o=o+1|0;i=i+1|0;if((c|0)!=(i|0)){continue}break}}G[j+492>>2]=0;c=j+208|0;d=j+492|0;zb(34755,G[k+4>>2],c,d);Fc(G[k>>2],c,j+128|0,0,d);if(G[j+492>>2]){break I}qb(G[s+8>>2],j+128|0,G[j+452>>2]);break I}Z=k,_=lb(i+1|0,1),G[Z+88>>2]=_;c=x+(m<<4)|0;E[c+8|0]=2;G[c>>2]=1;break I}Z=k,_=lb(i+1|0,8),G[Z+88>>2]=_;c=x+(m<<4)|0;G[c>>2]=8;i=G[j+480>>2];d=i>>31;d=(d^i)-d|0;i=d-11|0;if(i>>>0>30|!(1<>2]=c;G[j>>2]=m+1;c=j+288|0;Ya(c,81,51691,j);i=410;break s}if((d|0)==81){break ca}G[c+8>>2]=0;G[c+12>>2]=-2147483648;break I}d=G[j+440>>2];G[c+8>>2]=d;G[c+12>>2]=d>>31;break I}Z=k,_=lb(i<<1|1,8),G[Z+88>>2]=_;c=x+(m<<4)|0;G[c+8>>2]=1589294263;G[c+12>>2]=-1196933592;G[c>>2]=8;break I}if((d|0)==81){break $}G[c+8>>2]=1589294263;G[c+12>>2]=-1196933592;break I}L[c+8>>3]=G[j+440>>2];break I}if((d|0)==81){break Z}G[c+8>>2]=-2059275978;break I}K[c+8>>2]=G[j+440>>2];break I}if((d|0)==81){break X}G[c+8>>2]=2147483647;break I}d=G[j+440>>2];if((d|0)<0){G[c+8>>2]=2147483647;break I}G[c+8>>2]=d;break I}if((d|0)==81){break V}G[c+8>>2]=-2147483648;break I}G[c+8>>2]=G[j+440>>2];break I}if((d|0)==81){break T}G[c+8>>2]=-1;break I}d=G[j+440>>2];d=(d|0)>0?d:0;G[j+440>>2]=d;G[c+8>>2]=d;break I}if((d|0)==81){break R}G[c+8>>2]=-2147483648;break I}G[c+8>>2]=G[j+440>>2];break I}if((d|0)==81){break P}F[c+8>>1]=65535;break I}d=G[j+440>>2];d=(d|0)<65535?d:65535;d=(d|0)>0?d:0;G[j+440>>2]=d;F[c+8>>1]=d;break I}if((d|0)==81){break N}F[c+8>>1]=32768;break I}d=G[j+440>>2];d=(d|0)<32767?d:32767;d=(d|0)>-32768?d:-32768;G[j+440>>2]=d;F[c+8>>1]=d;break I}if((d|0)==81){break L}E[c+8|0]=128;break I}d=G[j+440>>2];d=(d|0)<127?d:127;d=(d|0)>-128?d:-128;G[j+440>>2]=d;E[c+8|0]=d;break I}if((d|0)==81){break J}E[c+8|0]=255;break I}d=G[j+440>>2];d=(d|0)<255?d:255;d=(d|0)>0?d:0;G[j+440>>2]=d;E[c+8|0]=d}if(!G[k+88>>2]){break t}m=m+1|0;if((m|0)!=(a|0)){continue}break}}T=G[j+464>>2];if(!T){break r}X=(a|0)<=0;while(1){c=G[j+460>>2];D=(c|0)>(T|0)?T:c;wa:{if(X){break wa}h=n>>31;w=v>>31;o=0;while(1){s=M(o,244)+b|0;xa:{if(G[s+84>>2]==2){break xa}c=G[s+88>>2];r=G[s+80>>2];ya:{if((r|0)==16){i=G[(x+(o<<4)|0)+8>>2];c=c+4|0;break ya}d=x+(o<<4)|0;i=d+8|0;c=c+G[d>>2]|0}k=G[s>>2];za:{if(!G[j+476>>2]){l=j+468|0;q=M(D,G[s+92>>2]);d=q>>31;m=G[g>>2];if(!(!(d|q)|(m|0)>0)){Aa:{Ba:{switch(r-11|0){case 0:if(!i){wp(k,n,h,q,d,0,c,l,g);break Aa}wp(k,n,h,q,d,H[i|0],c,l,g);break Aa;case 1:if(!i){Fo(k,n,h,q,d,0,c,l,g);break Aa}Fo(k,n,h,q,d,E[i|0],c,l,g);break Aa;case 9:if(!i){Kp(k,n,h,q,d,0,c,l,g);break Aa}Kp(k,n,h,q,d,I[i>>1],c,l,g);break Aa;case 10:if(!i){Pp(k,n,h,q,d,0,c,l,g);break Aa}Pp(k,n,h,q,d,F[i>>1],c,l,g);break Aa;case 19:if(!i){zp(k,n,h,q,d,0,c,l,g);break Aa}zp(k,n,h,q,d,G[i>>2],c,l,g);break Aa;case 20:if(!i){Wp(k,n,h,q,d,0,c,l,g);break Aa}Wp(k,n,h,q,d,G[i>>2],c,l,g);break Aa;case 29:if(!i){Fp(k,n,h,q,d,0,c,l,g);break Aa}Fp(k,n,h,q,d,G[i>>2],c,l,g);break Aa;case 30:if(!i){cq(k,n,h,q,d,0,c,l,g);break Aa}cq(k,n,h,q,d,G[i>>2],c,l,g);break Aa;case 69:if(!i){Ap(k,n,h,q,d,0,0,c,l,g);break Aa}Ap(k,n,h,q,d,G[i>>2],G[i+4>>2],c,l,g);break Aa;case 70:if(!i){_p(k,n,h,q,d,0,0,c,l,g);break Aa}_p(k,n,h,q,d,G[i>>2],G[i+4>>2],c,l,g);break Aa;case 31:if(!i){hl(k,1,n,h,q,d,N(0),c,l,g);break Aa}hl(k,1,n,h,q,d,K[i>>2],c,l,g);break Aa;case 71:if(!i){gq(k,n,h,q,d,0,c,l,g);break Aa}gq(k,n,h,q,d,L[i>>3],c,l,g);break Aa;default:break Ba}}G[g>>2]=410}m=G[g>>2]}if((m|0)<=0){break za}break wa}if((vd(k,G[s+4>>2],j+480|0,j+452|0,j+444|0,g)|0)>0){break r}if(G[j+480>>2]<0){nh(G[s>>2],G[s+4>>2],v,w,s+92|0,0,g)}d=M(D,G[s+92>>2]);if((bg(G[s>>2],G[s+80>>2],G[s+4>>2],v,w,n,h,d,d>>31,i,c,j+468|0,g)|0)>0){break wa}}c=G[s+88>>2];d=G[s+80>>2];if(G[j+468>>2]){if((d|0)==16){d=G[c>>2];c=x+(o<<4)|0;bb(d,G[c+8>>2],G[c>>2]);break xa}bb(c,i,G[x+(o<<4)>>2]);break xa}if((d|0)==16){cb(G[c>>2],0,G[x+(o<<4)>>2]);break xa}cb(c,0,G[x+(o<<4)>>2])}o=o+1|0;if((o|0)!=(a|0)){continue}break}}if(G[g>>2]>0){break r}c=G[j+464>>2];Ca:{if(!G[j+476>>2]){c=Ja[e|0](c,V,n,D,a,b,f)|0;break Ca}c=Ja[e|0](c,V,v,D,a,b,f)|0}G[g>>2]=c;if(c-1>>>0<4294967294){break r}G[j+492>>2]=0;if(!X){r=n>>31;y=v>>31;o=0;while(1){Da:{k=M(o,244)+b|0;Ea:{if(!G[k+84>>2]){break Ea}p=G[k+88>>2];l=G[k+80>>2];Fa:{if((l|0)==16){c=p+4|0;p=G[p>>2];i=2;break Fa}i=G[x+(o<<4)>>2];c=p+i|0}h=G[k>>2];d=G[j+476>>2];if(nb(p,j+384|0,i)){if(!d){d=M(D,G[k+92>>2]);k=d;m=d>>31;i=j+492|0;d=G[i>>2];if((d|0)<=0){Ga:{if(!p){Ao(h,l,n,r,k,m,c,i);break Ga}Ha:{switch(l-11|0){case 0:l=H[p|0];d=Fa-16|0;Fa=d;Ia:{if(Nb(h,i)){E[d+15|0]=l;bd(h,11,n,r,k,m,1,c,d+15|0,i);break Ia}qp(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 1:l=E[p|0];d=Fa-16|0;Fa=d;Ja:{if(Nb(h,i)){E[d+15|0]=l;bd(h,12,n,r,k,m,1,c,d+15|0,i);break Ja}Xo(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 9:l=I[p>>1];d=Fa-16|0;Fa=d;Ka:{if(Nb(h,i)){F[d+14>>1]=l;bd(h,20,n,r,k,m,1,c,d+14|0,i);break Ka}Uo(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 10:l=F[p>>1];d=Fa-16|0;Fa=d;La:{if(Nb(h,i)){F[d+14>>1]=l;bd(h,21,n,r,k,m,1,c,d+14|0,i);break La}pp(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 19:l=G[p>>2];d=Fa-16|0;Fa=d;Ma:{if(Nb(h,i)){G[d+12>>2]=l;bd(h,30,n,r,k,m,1,c,d+12|0,i);break Ma}No(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 20:l=G[p>>2];d=Fa-16|0;Fa=d;Na:{if(Nb(h,i)){G[d+12>>2]=l;bd(h,31,n,r,k,m,1,c,d+12|0,i);break Na}Io(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 29:l=G[p>>2];d=Fa-16|0;Fa=d;Oa:{if(Nb(h,i)){G[d+12>>2]=l;bd(h,40,n,r,k,m,1,c,d+12|0,i);break Oa}So(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 30:l=G[p>>2];d=Fa-16|0;Fa=d;Pa:{if(Nb(h,i)){G[d+12>>2]=l;bd(h,41,n,r,k,m,1,c,d+12|0,i);break Pa}Lo(h,2,1,0,n,r,k,m,c,l,i)}Fa=d+16|0;break Ga;case 69:d=G[p>>2];l=G[p+4>>2];Qa:{if(Nb(h,i)){Ua(28105);G[i>>2]=413;break Qa}Qo(h,2,1,0,n,r,k,m,c,d,l,i)}break Ga;case 70:d=G[p>>2];l=G[p+4>>2];Ra:{if(Nb(h,i)){Ua(28161);G[i>>2]=413;break Ra}Ko(h,2,1,0,n,r,k,m,c,d,l,i)}break Ga;case 31:Ek(h,1,n,r,k,m,c,K[p>>2],i);break Ga;case 71:Zo(h,n,r,k,m,c,L[p>>3],i);break Ga;default:break Ha}}G[i>>2]=410}d=G[i>>2]}if((d|0)<=0){break Ea}break Da}if((vd(h,G[k+4>>2],j+480|0,j+452|0,j+444|0,g)|0)>0){break r}if(G[j+480>>2]<0){nh(G[k>>2],G[k+4>>2],v,y,k+92|0,0,g)}d=G[k>>2];l=G[k+80>>2];i=G[k+4>>2];h=M(D,G[k+92>>2]);m=h;t=h>>31;z=0;B=0;C=0;s=0;u=j+492|0;h=G[u>>2];if((h|0)<=0){Sa:{if(!p){Bk(d,l,i,v,y,n,r,m,t,c,u);break Sa}Ta:{switch(l-11|0){case 0:qp(d,i,v,y,n,r,m,t,c,H[p|0],u);break Sa;case 1:Xo(d,i,v,y,n,r,m,t,c,E[p|0],u);break Sa;case 9:Uo(d,i,v,y,n,r,m,t,c,I[p>>1],u);break Sa;case 10:pp(d,i,v,y,n,r,m,t,c,F[p>>1],u);break Sa;case 19:No(d,i,v,y,n,r,m,t,c,G[p>>2],u);break Sa;case 20:Io(d,i,v,y,n,r,m,t,c,G[p>>2],u);break Sa;case 29:So(d,i,v,y,n,r,m,t,c,G[p>>2],u);break Sa;case 30:Lo(d,i,v,y,n,r,m,t,c,G[p>>2],u);break Sa;case 69:Qo(d,i,v,y,n,r,m,t,c,G[p>>2],G[p+4>>2],u);break Sa;case 70:Ko(d,i,v,y,n,r,m,t,c,G[p>>2],G[p+4>>2],u);break Sa;case 31:Dk(d,i,v,y,n,r,m,t,c,K[p>>2],u);break Sa;case 71:Hk(d,i,v,y,n,r,m,t,c,L[p>>3],u);break Sa;case 72:k=d;d=n;h=r<<1|d>>>31;d=d<<1;l=d-1|0;q=h-!d|0;d=m;h=t<<1|d>>>31;Dk(k,i,v,y,l,q,d<<1,h,c,K[p>>2],u);break Sa;case 152:k=d;d=n;h=r<<1|d>>>31;d=d<<1;l=d-1|0;q=h-!d|0;d=m;h=t<<1|d>>>31;Hk(k,i,v,y,l,q,d<<1,h,c,L[p>>3],u);break Sa;case 3:U=H[p|0];if(G[u>>2]<=0){Ua:{k=G[d>>2];h=G[d+4>>2];Va:{if((k|0)!=G[h+76>>2]){mb(d,k+1|0,0,u);break Va}if((G[h+128>>2]&G[h+132>>2])!=-1){break Va}if((Rb(d,u)|0)>0){break Ua}}h=G[G[d+4>>2]+968>>2]+M(i-1|0,160)|0;Wa:{if(G[h+80>>2]>0){A=G[h+88>>2];J=G[h+92>>2];break Wa}h=r+t|0;k=m+n|0;h=k>>>0>>0?h+1|0:h;A=k-1|0;J=h-!k|0}if(!m&(t|0)<=0|(t|0)<0|(Go(d,i,v,y,n,r,m,t,c,u)|0)>0){break Ua}h=v;k=n;l=Au(A,J,h-1|0,y-!h|0)+k|0;h=Ia+r|0;z=l;P=k>>>0>l>>>0?h+1|0:h;w=0;q=0;k=0;l=0;while(1){Xa:{if((U|0)!=H[c+w|0]){if(k|l){h=P+(q-((k>>>0>w>>>0)+l|0)|0)|0;B=z+(w-k|0)|0;h=B>>>0>>0?h+1|0:h;p=h;Q=Bu(B-1|0,h-!B|0,A,J);h=Ia;R=h;O=Q+1|0;h=O?h:h+1|0;S=h;h=Au(A,J,Q,R);if((rc(d,i,O,S,B-h|0,p-(Ia+(h>>>0>B>>>0)|0)|0,k,l,u)|0)>0){break Ua}}h=s;k=C+1|0;h=k?h:h+1|0;C=k;s=h;h=0;k=0;break Xa}C=0;s=0;h=l;k=k+1|0;h=k?h:h+1|0}l=h;h=q;q=w+1|0;h=q?h:h+1|0;w=q;q=h;if((m|0)!=(w|0)|(t|0)!=(h|0)){continue}break}if(!(k|l)|(s|C)){break Ua}h=P+(t-((k>>>0>m>>>0)+l|0)|0)|0;c=z+(m-k|0)|0;h=c>>>0>>0?h+1|0:h;m=h;q=Bu(c-1|0,h-!c|0,A,J);h=Ia;s=h;t=d;d=q+1|0;h=d?h:h+1|0;w=d;d=Au(A,J,q,s);rc(t,i,w,h,c-d|0,m-(Ia+(c>>>0>>0)|0)|0,k,l,u)}}break Sa;case 5:C=Fa-16|0;Fa=C;if(G[u>>2]<=0){Ya:{k=G[d>>2];h=G[d+4>>2];Za:{if((k|0)!=G[h+76>>2]){mb(d,k+1|0,0,u);break Za}if((G[h+128>>2]&G[h+132>>2])!=-1){break Za}if((Rb(d,u)|0)>0){break Ya}}vd(d,i,0,C+12|0,C+8|0,u);h=G[C+12>>2];if(G[G[d+4>>2]+80>>2]==2){h=(h|0)/G[C+8>>2]|0;G[C+12>>2]=h}if(!m&(t|0)<=0|(t|0)<0){break Ya}l=h;q=h>>31;h=v;k=n;l=Au(l,q,h-1|0,y-!h|0)+k|0;h=r+Ia|0;s=l;J=k>>>0>l>>>0?h+1|0:h;w=0;q=0;k=0;l=0;while(1){_a:{if(Xa(p,G[(w<<2)+c>>2])){if(k|l){h=J+(q-((k>>>0>w>>>0)+l|0)|0)|0;A=s+(w-k|0)|0;h=A>>>0>>0?h+1|0:h;P=h;O=h-!A|0;h=G[C+12>>2];U=h;R=h>>31;Q=Bu(A-1|0,O,h,R);h=Ia;O=h;S=Q+1|0;h=S?h:h+1|0;W=h;h=Au(U,R,Q,O);if((rc(d,i,S,W,A-h|0,P-(Ia+(h>>>0>A>>>0)|0)|0,k,l,u)|0)>0){break Ya}}h=B;k=z+1|0;h=k?h:h+1|0;z=k;B=h;h=0;k=0;break _a}if(z|B){h=J+(q-((w>>>0>>0)+B|0)|0)|0;U=w-z|0;A=s+U|0;h=A>>>0>>0?h+1|0:h;P=h;S=h-!A|0;h=G[C+12>>2];R=h;O=h>>31;Q=Bu(A-1|0,S,h,O);h=Ia;S=h;Y=Q+1|0;h=Y?h:h+1|0;W=h;h=Au(R,O,Q,S);if((dg(d,i,Y,W,A-h|0,P-(Ia+(h>>>0>A>>>0)|0)|0,z,B,(U<<2)+c|0,u)|0)>0){break Ya}}z=0;B=0;h=l;k=k+1|0;h=k?h:h+1|0}l=h;h=q;q=w+1|0;h=q?h:h+1|0;w=q;q=h;if((m|0)!=(w|0)|(t|0)!=(h|0)){continue}break}if(z|B){k=d;h=J+(t-((m>>>0>>0)+B|0)|0)|0;q=m-z|0;d=s+q|0;h=d>>>0>>0?h+1|0:h;m=h;l=h-!d|0;h=G[C+12>>2];s=h;w=h>>31;l=Bu(d-1|0,l,h,w);h=Ia;t=h;P=i;i=l+1|0;h=i?h:h+1|0;R=i;i=Au(s,w,l,t);dg(k,P,R,h,d-i|0,m-(Ia+(d>>>0>>0)|0)|0,z,B,(q<<2)+c|0,u);break Ya}if(!(k|l)){break Ya}h=J+(t-((k>>>0>m>>>0)+l|0)|0)|0;c=s+(m-k|0)|0;h=c>>>0>>0?h+1|0:h;m=h;q=h-!c|0;h=G[C+12>>2];s=h;w=h>>31;q=Bu(c-1|0,q,h,w);h=Ia;t=h;z=d;d=q+1|0;h=d?h:h+1|0;B=d;d=Au(q,t,s,w);rc(z,i,B,h,c-d|0,m-(Ia+(c>>>0>>0)|0)|0,k,l,u)}}Fa=C+16|0;break Sa;default:break Ta}}G[u>>2]=410}h=G[u>>2]}if((h|0)<=0){break Ea}break Da}if(!d){d=M(D,G[k+92>>2]);if((Ao(h,l,n,r,d,d>>31,c,j+492|0)|0)<=0){break Ea}break Da}if((vd(h,G[k+4>>2],j+480|0,j+452|0,j+444|0,g)|0)>0){break r}if(G[j+480>>2]<0){nh(G[k>>2],G[k+4>>2],v,y,k+92|0,0,g)}d=M(D,G[k+92>>2]);if((Bk(G[k>>2],G[k+80>>2],G[k+4>>2],v,y,n,r,d,d>>31,c,j+492|0)|0)>0){break Da}}o=o+1|0;if((o|0)!=(a|0)){continue}}break}c=G[g>>2]}if(c){break r}c=G[j+492>>2];G[g>>2]=c;if(c){break r}c=G[j+476>>2];n=(c?0:D)+n|0;v=(c?D:0)+v|0;T=T-D|0;if(T){continue}break}break r}Ua(7297);i=113;G[g>>2]=113;break a}c=5352;i=113}Ua(c);G[g>>2]=i}if((a|0)>0){i=0;while(1){c=M(i,244)+b|0;$a:{if(G[c+80>>2]!=16){break $a}d=G[c+88>>2];if(!d){break $a}Wa(G[d>>2]);Wa(G[(x+(i<<4)|0)+8>>2])}c=G[c+88>>2];if(c){Wa(c)}i=i+1|0;if((i|0)!=(a|0)){continue}break}}Wa(x)}i=G[g>>2];break a}i=410;G[g>>2]=410;break a}i=302;G[g>>2]=302}Fa=j+496|0;return i}function Yi(a,b,c,d,e){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=N(0),v=0;f=Fa-432|0;Fa=f;a:{if(G[e>>2]>0){break a}h=G[a>>2];j=G[a+4>>2];if((h|0)!=G[j+76>>2]){mb(a,h+1|0,0,e);j=G[a+4>>2];h=G[j+76>>2]}k=G[j+96>>2]+(h<<3)|0;if(G[j+104>>2]!=G[k>>2]|G[j+108>>2]!=G[k+4>>2]){G[e>>2]=201;break a}if(!(!c|!G[j+992>>2])){b:{if((c|0)<=0){break b}h=0;j=0;if(c-1>>>0>=3){g=c&-4;while(1){k=f+256|0;G[k+(j<<2)>>2]=G[(j<<3)+d>>2];l=j|1;G[k+(l<<2)>>2]=G[(l<<3)+d>>2];l=j|2;G[k+(l<<2)>>2]=G[(l<<3)+d>>2];l=j|3;G[k+(l<<2)>>2]=G[(l<<3)+d>>2];j=j+4|0;n=n+4|0;if((g|0)!=(n|0)){continue}break}}k=c&3;if(!k){break b}while(1){G[(f+256|0)+(j<<2)>>2]=G[(j<<3)+d>>2];j=j+1|0;h=h+1|0;if((k|0)!=(h|0)){continue}break}}d=a;h=b;l=f+256|0;b=0;g=Fa-304|0;Fa=g;G[g+200>>2]=G[29766];a=G[29765];G[g+192>>2]=G[29764];G[g+196>>2]=a;G[g+160>>2]=G[29770];a=G[29769];G[g+152>>2]=G[29768];G[g+156>>2]=a;c:{if(G[e>>2]>0){break c}n=G[d+4>>2];d:{if(!((h|0)>=0|K[n+1020>>2]!=N(9999)|G[n+992>>2]-21>>>0<2)){Ua(61493);break d}t=G[n+992>>2];if(!t){G[n+992>>2]=11;t=11}e:{f:{g:{h:{i:{j:{if((h|0)<0){u=K[n+1020>>2];if(u==N(9999)){break f}a=G[n+1024>>2];if(!a){break j}if(u!=N(0)){break f}if((a|0)!=-1){break g}K[n+1020>>2]=16;break f}k=16;v=1;k:{switch(h-10|0){case 10:break e;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break f;case 0:break k;default:break i}}k=8;break h}G[n+1024>>2]=1;if(u==N(0)){break g}break f}if((h|0)!=40){break f}k=32}v=0;break e}K[n+1020>>2]=4}v=0;k=h}a=G[n+1016>>2];G[g+48>>2]=G[n+1012>>2];G[g+52>>2]=a;a=G[n+1e3>>2];G[g+32>>2]=G[n+996>>2];G[g+36>>2]=a;a=G[n+1008>>2];G[g+40>>2]=G[n+1004>>2];G[g+44>>2]=a;l:{m:{n:{o:{if((t|0)!=41){break o}if((c|0)<2){break l}a=0;j=c-1|0;if(j>>>0>=3){o=c&-4;while(1){m=b;b=a<<2;b=(((m+(G[b+l>>2]>3)|0)+(G[l+(b|4)>>2]>3)|0)+(G[l+(b|8)>>2]>3)|0)+(G[l+(b|12)>>2]>3)|0;a=a+4|0;p=p+4|0;if((o|0)!=(p|0)){continue}break}}p=c&3;if(p){while(1){b=(G[l+(a<<2)>>2]>3)+b|0;a=a+1|0;i=i+1|0;if((p|0)!=(i|0)){continue}break}}if(b>>>0<2){break m}a=0;p:{if((c|0)<2){break p}a=1;if(J[g+36>>2]>=2){break p}while(1){a=a+1|0;if((c|0)!=(a|0)&J[(g+32|0)+(a<<2)>>2]<2){continue}break}a=(a|0)<(c|0)}b=G[g+32>>2];q:{if(!(G[g+36>>2]!=-1|(b|0)>0)){G[g+32>>2]=G[l>>2];G[g+36>>2]=G[l+4>>2];if((c|0)<3){break q}b=c-2|0;i=b&7;a=2;if(c-3>>>0>=7){p=b&-8;j=0;while(1){o=a<<2;m=g+32|0;b=o+m|0;G[b>>2]=1;G[m+(o|4)>>2]=1;G[b+24>>2]=1;G[b+28>>2]=1;G[b+16>>2]=1;G[b+20>>2]=1;G[b+8>>2]=1;G[b+12>>2]=1;a=a+8|0;j=j+8|0;if((p|0)!=(j|0)){continue}break}}if(!i){break q}b=0;while(1){G[(g+32|0)+(a<<2)>>2]=1;a=a+1|0;b=b+1|0;if((i|0)!=(b|0)){continue}break}break q}b=(b|0)>0;if(!(b|!(a^1))){G[g+32>>2]=G[l>>2];a=G[l+4>>2];if((a|0)<31){G[g+36>>2]=a;break q}b=16;r:{if((a&15)-4>>>0<4294967293){break r}b=24;if(((a>>>0)%24|0)-4>>>0<4294967293){break r}b=20;if(((a>>>0)%20|0)-4>>>0<4294967293){break r}b=30;if(((a>>>0)%30|0)-4>>>0<4294967293){break r}b=28;if(((a>>>0)%28|0)-4>>>0<4294967293){break r}b=26;if(((a>>>0)%26|0)-4>>>0<4294967293){break r}b=22;if(((a>>>0)%22|0)-4>>>0<4294967293){break r}b=18;if(((a>>>0)%18|0)-4>>>0<4294967293){break r}b=((a>>>0)%14|0)-4>>>0<4294967293?14:17}G[g+36>>2]=b;break q}if(!b){G[g+32>>2]=G[l>>2]}if((c|0)<2){break q}a=1;if((c|0)!=2){p=j&-2;b=0;while(1){i=a<<2;o=i+(g+32|0)|0;m=G[o>>2];s:{t:{if((m|0)<0){i=G[i+l>>2];break t}if(m){break s}i=1}G[o>>2]=i}i=a+1<<2;o=i+(g+32|0)|0;m=G[o>>2];u:{v:{if((m|0)>=0){if(m){break u}i=1;break v}i=G[i+l>>2]}G[o>>2]=i}a=a+2|0;b=b+2|0;if((p|0)!=(b|0)){continue}break}}if(!(j&1)){break q}a=a<<2;b=a+(g+32|0)|0;j=G[b>>2];w:{if((j|0)>=0){if(j){break q}a=1;break w}a=G[a+l>>2]}G[b>>2]=a}x:{y:{if((c|0)<=0){break y}a=0;j=-1;b=-1;while(1){z:{if(G[(g+32|0)+(a<<2)>>2]<2){break z}if((b|0)<0){b=a;break z}i=(j|0)<0;j=a;if(i){break z}Ua(60978);break d}a=a+1|0;if((c|0)!=(a|0)){continue}break}if((b|0)<0){break y}if((j|0)>=0){break x}}Ua(61041);break d}A:{i=(g+32|0)+(b<<2)|0;o=G[i>>2];if((o|0)>=4){a=(g+32|0)+(j<<2)|0;p=G[a>>2];if((p|0)>3){break A}}Ua(61100);break d}b=G[l+(b<<2)>>2];m=(b|0)/(o|0)|0;q=b-M(o,m)|0;if(q-1>>>0<=2){r=i;s=T(+(q|0)/+(m|0));B:{if(O(s)<2147483648){i=~~s;break B}i=-2147483648}i=i+o|0;G[r>>2]=i;if(((b|0)%(i|0)|0)-1>>>0<3){break n}p=G[a>>2]}b=G[l+(j<<2)>>2];j=(b|0)/(p|0)|0;i=b-M(j,p)|0;if(i-1>>>0>2){break o}m=a;s=T(+(i|0)/+(j|0));C:{if(O(s)<2147483648){a=~~s;break C}a=-2147483648}a=a+p|0;G[m>>2]=a;if(((b|0)%(a|0)|0)-1>>>0>2){break o}Ua(61304);break d}j=1;o=(c|0)<=0;D:{if(o){break D}if(G[g+32>>2]<=0){G[g+32>>2]=G[l>>2]}a=1;if((c|0)==1){break D}b=c-1|0;p=b&1;if((c|0)!=2){m=b&-2;b=0;while(1){i=a<<2;q=i+(g+32|0)|0;r=G[q>>2];E:{F:{if((r|0)<0){i=G[i+l>>2];break F}if(r){break E}i=1}G[q>>2]=i}i=a+1<<2;q=i+(g+32|0)|0;r=G[q>>2];G:{H:{if((r|0)>=0){if(r){break G}i=1;break H}i=G[i+l>>2]}G[q>>2]=i}a=a+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!p){break D}a=a<<2;b=a+(g+32|0)|0;i=G[b>>2];I:{if((i|0)>=0){if(i){break D}a=1;break I}a=G[a+l>>2]}G[b>>2]=a}p=G[n+1036>>2];a=0;b=H[35846];E[g+174|0]=b;E[g+170|0]=b;b=H[35844]|H[35845]<<8;F[g+172>>1]=b;F[g+168>>1]=b;G[g+176>>2]=p?4346161:4345905;G[g+188>>2]=g+168;G[g+184>>2]=g+172;G[g+180>>2]=g+176;J:{if(o){break J}if((c|0)!=1){o=c&-2;i=0;while(1){b=a<<2;m=b|4;q=G[m+l>>2]-1|0;r=m;m=g+32|0;j=M(((q|0)/G[r+m>>2]|0)+1|0,M(((G[b+l>>2]-1|0)/G[b+m>>2]|0)+1|0,j));a=a+2|0;i=i+2|0;if((o|0)!=(i|0)){continue}break}}if(!(c&1)){break J}a=a<<2;j=M(((G[a+l>>2]-1|0)/G[a+(g+32|0)>>2]|0)+1|0,j)}K:{if((k|0)<0){b=3;if(K[n+1020>>2]!=N(9999)){break K}}b=1}L:{M:{switch(t+1|0){case 22:a=H[41112]|H[41113]<<8|(H[41114]<<16|H[41115]<<24);E[g+211|0]=a;E[g+212|0]=a>>>8;E[g+213|0]=a>>>16;E[g+214|0]=a>>>24;G[g+208>>2]=H[41109]|H[41110]<<8|(H[41111]<<16|H[41112]<<24);break L;case 23:a=H[40742]|H[40743]<<8|(H[40744]<<16|H[40745]<<24);E[g+211|0]=a;E[g+212|0]=a>>>8;E[g+213|0]=a>>>16;E[g+214|0]=a>>>24;G[g+208>>2]=H[40739]|H[40740]<<8|(H[40741]<<16|H[40742]<<24);break L;case 52:G[g+208>>2]=1346984514;G[g+212>>2]=3235634;break L;case 32:a=H[41119]|H[41120]<<8|(H[41121]<<16|H[41122]<<24);E[g+211|0]=a;E[g+212|0]=a>>>8;E[g+213|0]=a>>>16;E[g+214|0]=a>>>24;G[g+208>>2]=H[41116]|H[41117]<<8|(H[41118]<<16|H[41119]<<24);if(p){G[g+176>>2]=4804913;break L}G[g+176>>2]=4804657;break L;case 42:G[g+216>>2]=H[41084]|H[41085]<<8|(H[41086]<<16|H[41087]<<24);a=H[41080]|H[41081]<<8|(H[41082]<<16|H[41083]<<24);G[g+208>>2]=H[41076]|H[41077]<<8|(H[41078]<<16|H[41079]<<24);G[g+212>>2]=a;break L;case 0:a=H[33725]|H[33726]<<8|(H[33727]<<16|H[33728]<<24);E[g+215|0]=a;E[g+216|0]=a>>>8;E[g+217|0]=a>>>16;E[g+218|0]=a>>>24;a=H[33722]|H[33723]<<8|(H[33724]<<16|H[33725]<<24);G[g+208>>2]=H[33718]|H[33719]<<8|(H[33720]<<16|H[33721]<<24);G[g+212>>2]=a;break L;default:Ua(61448);break d;case 12:break M}}a=H[41126]|H[41127]<<8|(H[41128]<<16|H[41129]<<24);E[g+211|0]=a;E[g+212|0]=a>>>8;E[g+213|0]=a>>>16;E[g+214|0]=a>>>24;G[g+208>>2]=H[41123]|H[41124]<<8|(H[41125]<<16|H[41126]<<24)}i=G[n+76>>2];a=0;nl(d,2,j,j>>31,b,g+192|0,g+180|0,g+152|0,0,e);Rg(d,35668,1,24671,e);if(!i){Rg(d,35504,1,26e3,e)}hd(d,32893,k,k>>31,24353,e);hd(d,33763,c,c>>31,24325,e);N:{if((c|0)<=0){break N}b=0;while(1){j=b+1|0;G[g+16>>2]=j;i=g+224|0;Ya(i,75,29932,g+16|0);b=G[l+(b<<2)>>2];hd(d,i,b,b>>31,6981,e);b=j;if((c|0)!=(b|0)){continue}break}if((c|0)<=0){break N}while(1){b=a+1|0;G[g>>2]=b;j=g+224|0;Ya(j,75,29987,g);a=G[(g+32|0)+(a<<2)>>2];hd(d,j,a,a>>31,29206,e);a=b;if((c|0)!=(a|0)){continue}break}}O:{if((k|0)>=0){break O}b=G[d+4>>2];if(K[b+1020>>2]==N(9999)){lc(d,32673,35436,14623,e);break O}P:{Q:{R:{S:{T:{U:{a=G[b+1024>>2];switch(a|0){case 0:break S;case 2:break U;default:break T}}if(nb(g+208|0,41076,12)){break Q}G[b+1024>>2]=1;hb(86760,124,1,G[24367]);a=G[G[d+4>>2]+1024>>2]}switch(a+1|0){case 2:break R;case 0:break P;case 3:break Q;default:break O}}G[b+1024>>2]=1}lc(d,32673,41088,16314,e);xd(d,31,41550,G[d+4>>2]+1028|0,5737,e);break O}lc(d,32673,40718,16314,e);xd(d,31,41550,G[d+4>>2]+1028|0,5737,e);if(nb(g+208|0,41123,7)){break O}E[g+216|0]=H[35435];a=H[35431]|H[35432]<<8|(H[35433]<<16|H[35434]<<24);G[g+208>>2]=H[35427]|H[35428]<<8|(H[35429]<<16|H[35430]<<24);G[g+212>>2]=a;break O}lc(d,32673,34039,14665,e)}lc(d,35408,g+208|0,16292,e);a=G[G[d+4>>2]+992>>2];V:{if((a|0)!=41){if((a|0)!=11){break V}lc(d,41302,35357,19755,e);hd(d,41273,32,0,17187,e);lc(d,40889,32962,63346,e);W:{switch(k-8|0){case 0:hd(d,40860,1,0,63346,e);break V;case 8:hd(d,40860,2,0,63346,e);break V;default:break W}}hd(d,40860,4,0,63346,e);break V}lc(d,41302,35662,10532,e);Qg(d,41273,K[G[d+4>>2]+1040>>2],7,10532,e);lc(d,40889,34908,13828,e);a=G[G[d+4>>2]+1044>>2];hd(d,40860,a,a>>31,13828,e)}X:{Y:{if(v){G[g+104>>2]=H[4533]|H[4534]<<8|(H[4535]<<16|H[4536]<<24);a=H[4529]|H[4530]<<8|(H[4531]<<16|H[4532]<<24);G[g+96>>2]=H[4525]|H[4526]<<8|(H[4527]<<16|H[4528]<<24);G[g+100>>2]=a;a=H[4521]|H[4522]<<8|(H[4523]<<16|H[4524]<<24);G[g+88>>2]=H[4517]|H[4518]<<8|(H[4519]<<16|H[4520]<<24);G[g+92>>2]=a;a=H[4513]|H[4514]<<8|(H[4515]<<16|H[4516]<<24);G[g+80>>2]=H[4509]|H[4510]<<8|(H[4511]<<16|H[4512]<<24);G[g+84>>2]=a;a=H[4505]|H[4506]<<8|(H[4507]<<16|H[4508]<<24);G[g+72>>2]=H[4501]|H[4502]<<8|(H[4503]<<16|H[4504]<<24);G[g+76>>2]=a;a=H[4497]|H[4498]<<8|(H[4499]<<16|H[4500]<<24);G[g+64>>2]=H[4493]|H[4494]<<8|(H[4495]<<16|H[4496]<<24);G[g+68>>2]=a;s=32768;break Y}if((h|0)!=40){if((h|0)!=10){break X}E[g+104|0]=H[20261];a=H[20257]|H[20258]<<8|(H[20259]<<16|H[20260]<<24);G[g+96>>2]=H[20253]|H[20254]<<8|(H[20255]<<16|H[20256]<<24);G[g+100>>2]=a;a=H[20249]|H[20250]<<8|(H[20251]<<16|H[20252]<<24);G[g+88>>2]=H[20245]|H[20246]<<8|(H[20247]<<16|H[20248]<<24);G[g+92>>2]=a;a=H[20241]|H[20242]<<8|(H[20243]<<16|H[20244]<<24);G[g+80>>2]=H[20237]|H[20238]<<8|(H[20239]<<16|H[20240]<<24);G[g+84>>2]=a;a=H[20233]|H[20234]<<8|(H[20235]<<16|H[20236]<<24);G[g+72>>2]=H[20229]|H[20230]<<8|(H[20231]<<16|H[20232]<<24);G[g+76>>2]=a;a=H[20225]|H[20226]<<8|(H[20227]<<16|H[20228]<<24);G[g+64>>2]=H[20221]|H[20222]<<8|(H[20223]<<16|H[20224]<<24);G[g+68>>2]=a;s=-128;break Y}a=H[17708]|H[17709]<<8|(H[17710]<<16|H[17711]<<24);E[g+103|0]=a;E[g+104|0]=a>>>8;E[g+105|0]=a>>>16;E[g+106|0]=a>>>24;a=H[17705]|H[17706]<<8|(H[17707]<<16|H[17708]<<24);G[g+96>>2]=H[17701]|H[17702]<<8|(H[17703]<<16|H[17704]<<24);G[g+100>>2]=a;a=H[17697]|H[17698]<<8|(H[17699]<<16|H[17700]<<24);G[g+88>>2]=H[17693]|H[17694]<<8|(H[17695]<<16|H[17696]<<24);G[g+92>>2]=a;a=H[17689]|H[17690]<<8|(H[17691]<<16|H[17692]<<24);G[g+80>>2]=H[17685]|H[17686]<<8|(H[17687]<<16|H[17688]<<24);G[g+84>>2]=a;a=H[17681]|H[17682]<<8|(H[17683]<<16|H[17684]<<24);G[g+72>>2]=H[17677]|H[17678]<<8|(H[17679]<<16|H[17680]<<24);G[g+76>>2]=a;a=H[17673]|H[17674]<<8|(H[17675]<<16|H[17676]<<24);G[g+64>>2]=H[17669]|H[17670]<<8|(H[17671]<<16|H[17672]<<24);G[g+68>>2]=a;s=2147483648}c=g- -64|0;be(d,34377,s,c,e);a=H[10528]|H[10529]<<8|(H[10530]<<16|H[10531]<<24);b=H[10524]|H[10525]<<8|(H[10526]<<16|H[10527]<<24);E[g+79|0]=b;E[g+80|0]=b>>>8;E[g+81|0]=b>>>16;E[g+82|0]=b>>>24;E[g+83|0]=a;E[g+84|0]=a>>>8;E[g+85|0]=a>>>16;E[g+86|0]=a>>>24;a=H[10521]|H[10522]<<8|(H[10523]<<16|H[10524]<<24);G[g+72>>2]=H[10517]|H[10518]<<8|(H[10519]<<16|H[10520]<<24);G[g+76>>2]=a;a=H[10513]|H[10514]<<8|(H[10515]<<16|H[10516]<<24);G[g+64>>2]=H[10509]|H[10510]<<8|(H[10511]<<16|H[10512]<<24);G[g+68>>2]=a;be(d,35661,1,c,e)}break c}Ua(61231);break d}Ua(61165);break d}Ua(61377)}G[e>>2]=413}Fa=g+304|0;break a}Z:{if(!h){h=H[26031]|H[26032]<<8|(H[26033]<<16|H[26034]<<24);E[f+127|0]=h;E[f+128|0]=h>>>8;E[f+129|0]=h>>>16;E[f+130|0]=h>>>24;h=H[26028]|H[26029]<<8|(H[26030]<<16|H[26031]<<24);G[f+120>>2]=H[26024]|H[26025]<<8|(H[26026]<<16|H[26027]<<24);G[f+124>>2]=h;h=H[26020]|H[26021]<<8|(H[26022]<<16|H[26023]<<24);G[f+112>>2]=H[26016]|H[26017]<<8|(H[26018]<<16|H[26019]<<24);G[f+116>>2]=h;h=H[26012]|H[26013]<<8|(H[26014]<<16|H[26015]<<24);G[f+104>>2]=H[26008]|H[26009]<<8|(H[26010]<<16|H[26011]<<24);G[f+108>>2]=h;h=H[26004]|H[26005]<<8|(H[26006]<<16|H[26007]<<24);G[f+96>>2]=H[26e3]|H[26001]<<8|(H[26002]<<16|H[26003]<<24);G[f+100>>2]=h;if(G[e>>2]>0){break Z}F[f+176>>1]=84;h=f+256|0;Ob(35530,f+176|0,f+96|0,h,e);wb(a,h,e);break Z}h=H[15459]|H[15460]<<8|(H[15461]<<16|H[15462]<<24);G[f+104>>2]=H[15455]|H[15456]<<8|(H[15457]<<16|H[15458]<<24);G[f+108>>2]=h;h=H[15451]|H[15452]<<8|(H[15453]<<16|H[15454]<<24);G[f+96>>2]=H[15447]|H[15448]<<8|(H[15449]<<16|H[15450]<<24);G[f+100>>2]=h;lc(a,34516,35678,f+96|0,e)}h=16;_:{$:{if((b|0)==20){break $}aa:{if((b|0)<=7){if((b|0)==-64|(b|0)==-32){break aa}break _}h=32;ba:{switch(b-8|0){default:if((b|0)!=80){break _}h=64;break $;case 32:break $;case 0:case 8:case 24:case 56:break aa;case 2:break ba;case 1:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:break _}}h=8;break $}h=b}k=H[16897]|H[16898]<<8|(H[16899]<<16|H[16900]<<24);g=H[16893]|H[16894]<<8|(H[16895]<<16|H[16896]<<24);F[f+118>>1]=g;F[f+120>>1]=g>>>16;F[f+122>>1]=k;F[f+124>>1]=k>>>16;k=H[16891]|H[16892]<<8|(H[16893]<<16|H[16894]<<24);G[f+112>>2]=H[16887]|H[16888]<<8|(H[16889]<<16|H[16890]<<24);G[f+116>>2]=k;k=H[16883]|H[16884]<<8|(H[16885]<<16|H[16886]<<24);G[f+104>>2]=H[16879]|H[16880]<<8|(H[16881]<<16|H[16882]<<24);G[f+108>>2]=k;k=H[16875]|H[16876]<<8|(H[16877]<<16|H[16878]<<24);G[f+96>>2]=H[16871]|H[16872]<<8|(H[16873]<<16|H[16874]<<24);G[f+100>>2]=k;if(G[e>>2]>0){break a}E[f+176|0]=0;G[f+64>>2]=h;G[f+68>>2]=h>>31;if((db(f+176|0,26741,f- -64|0)|0)<0){Ua(17884);G[e>>2]=401}h=f+256|0;Ob(32941,f+176|0,f+96|0,h,e);wb(a,h,e);if(G[e>>2]>0){break a}if(c>>>0>=1e3){G[f>>2]=c;a=f+256|0;Ya(a,81,30538,f);Ua(a);G[e>>2]=212;break a}G[f+112>>2]=H[7252]|H[7253]<<8|(H[7254]<<16|H[7255]<<24);h=H[7248]|H[7249]<<8|(H[7250]<<16|H[7251]<<24);G[f+104>>2]=H[7244]|H[7245]<<8|(H[7246]<<16|H[7247]<<24);G[f+108>>2]=h;h=H[7240]|H[7241]<<8|(H[7242]<<16|H[7243]<<24);G[f+96>>2]=H[7236]|H[7237]<<8|(H[7238]<<16|H[7239]<<24);G[f+100>>2]=h;hd(a,33788,c,0,f+96|0,e);h=H[66106]|H[66107]<<8|(H[66108]<<16|H[66109]<<24);k=H[66102]|H[66103]<<8|(H[66104]<<16|H[66105]<<24);E[f+109|0]=k;E[f+110|0]=k>>>8;E[f+111|0]=k>>>16;E[f+112|0]=k>>>24;E[f+113|0]=h;E[f+114|0]=h>>>8;E[f+115|0]=h>>>16;E[f+116|0]=h>>>24;h=H[66101]|H[66102]<<8|(H[66103]<<16|H[66104]<<24);G[f+104>>2]=H[66097]|H[66098]<<8|(H[66099]<<16|H[66100]<<24);G[f+108>>2]=h;h=H[66093]|H[66094]<<8|(H[66095]<<16|H[66096]<<24);G[f+96>>2]=H[66089]|H[66090]<<8|(H[66091]<<16|H[66092]<<24);G[f+100>>2]=h;if(c){j=f+116|0;h=0;while(1){k=h+1|0;g=(h<<3)+d|0;h=G[g+4>>2];i=G[g>>2];if((h|0)<0){G[f+16>>2]=k;L[f+24>>3]=+(i>>>0)+ +(h|0)*4294967296;a=f+256|0;Ya(a,81,19457,f+16|0);Ua(a);G[e>>2]=213;break a}G[f+48>>2]=k;Ya(j,53,30633,f+48|0);zb(33788,k,f+176|0,e);if(G[e>>2]<=0){h=G[g+4>>2];G[f+32>>2]=G[g>>2];G[f+36>>2]=h;E[f+352|0]=0;if((db(f+352|0,26741,f+32|0)|0)<0){Ua(17884);G[e>>2]=401}h=f+256|0;Ob(f+176|0,f+352|0,f+96|0,h,e);wb(a,h,e)}h=k;if((h|0)!=(c|0)){continue}break}}ca:{if(!G[G[a+4>>2]+76>>2]){G[f+128>>2]=H[6580]|H[6581]<<8|(H[6582]<<16|H[6583]<<24);c=H[6576]|H[6577]<<8|(H[6578]<<16|H[6579]<<24);G[f+120>>2]=H[6572]|H[6573]<<8|(H[6574]<<16|H[6575]<<24);G[f+124>>2]=c;c=H[6568]|H[6569]<<8|(H[6570]<<16|H[6571]<<24);G[f+112>>2]=H[6564]|H[6565]<<8|(H[6566]<<16|H[6567]<<24);G[f+116>>2]=c;c=H[6560]|H[6561]<<8|(H[6562]<<16|H[6563]<<24);G[f+104>>2]=H[6556]|H[6557]<<8|(H[6558]<<16|H[6559]<<24);G[f+108>>2]=c;c=H[6552]|H[6553]<<8|(H[6554]<<16|H[6555]<<24);G[f+96>>2]=H[6548]|H[6549]<<8|(H[6550]<<16|H[6551]<<24);G[f+100>>2]=c;Rg(a,35787,1,f+96|0,e);wb(a,3277,e);wb(a,34961,e);break ca}c=H[41831]|H[41832]<<8|(H[41833]<<16|H[41834]<<24);E[f+119|0]=c;E[f+120|0]=c>>>8;E[f+121|0]=c>>>16;E[f+122|0]=c>>>24;c=H[41828]|H[41829]<<8|(H[41830]<<16|H[41831]<<24);G[f+112>>2]=H[41824]|H[41825]<<8|(H[41826]<<16|H[41827]<<24);G[f+116>>2]=c;c=H[41820]|H[41821]<<8|(H[41822]<<16|H[41823]<<24);G[f+104>>2]=H[41816]|H[41817]<<8|(H[41818]<<16|H[41819]<<24);G[f+108>>2]=c;c=H[41812]|H[41813]<<8|(H[41814]<<16|H[41815]<<24);G[f+96>>2]=H[41808]|H[41809]<<8|(H[41810]<<16|H[41811]<<24);G[f+100>>2]=c;d=f+96|0;hd(a,33303,0,0,d,e);c=H[41477]|H[41478]<<8|(H[41479]<<16|H[41480]<<24);E[f+119|0]=c;E[f+120|0]=c>>>8;E[f+121|0]=c>>>16;E[f+122|0]=c>>>24;c=H[41474]|H[41475]<<8|(H[41476]<<16|H[41477]<<24);G[f+112>>2]=H[41470]|H[41471]<<8|(H[41472]<<16|H[41473]<<24);G[f+116>>2]=c;c=H[41466]|H[41467]<<8|(H[41468]<<16|H[41469]<<24);G[f+104>>2]=H[41462]|H[41463]<<8|(H[41464]<<16|H[41465]<<24);G[f+108>>2]=c;c=H[41458]|H[41459]<<8|(H[41460]<<16|H[41461]<<24);G[f+96>>2]=H[41454]|H[41455]<<8|(H[41456]<<16|H[41457]<<24);G[f+100>>2]=c;hd(a,33311,1,0,d,e)}da:{if((b|0)==20){G[f+136>>2]=H[4533]|H[4534]<<8|(H[4535]<<16|H[4536]<<24);b=H[4529]|H[4530]<<8|(H[4531]<<16|H[4532]<<24);G[f+128>>2]=H[4525]|H[4526]<<8|(H[4527]<<16|H[4528]<<24);G[f+132>>2]=b;b=H[4521]|H[4522]<<8|(H[4523]<<16|H[4524]<<24);G[f+120>>2]=H[4517]|H[4518]<<8|(H[4519]<<16|H[4520]<<24);G[f+124>>2]=b;b=H[4513]|H[4514]<<8|(H[4515]<<16|H[4516]<<24);G[f+112>>2]=H[4509]|H[4510]<<8|(H[4511]<<16|H[4512]<<24);G[f+116>>2]=b;b=H[4505]|H[4506]<<8|(H[4507]<<16|H[4508]<<24);G[f+104>>2]=H[4501]|H[4502]<<8|(H[4503]<<16|H[4504]<<24);G[f+108>>2]=b;b=H[4497]|H[4498]<<8|(H[4499]<<16|H[4500]<<24);G[f+96>>2]=H[4493]|H[4494]<<8|(H[4495]<<16|H[4496]<<24);G[f+100>>2]=b;be(a,34377,32768,f+96|0,e);break da}if((b|0)!=10){if((b|0)!=80){if((b|0)!=40){break a}b=H[17708]|H[17709]<<8|(H[17710]<<16|H[17711]<<24);E[f+135|0]=b;E[f+136|0]=b>>>8;E[f+137|0]=b>>>16;E[f+138|0]=b>>>24;b=H[17705]|H[17706]<<8|(H[17707]<<16|H[17708]<<24);G[f+128>>2]=H[17701]|H[17702]<<8|(H[17703]<<16|H[17704]<<24);G[f+132>>2]=b;b=H[17697]|H[17698]<<8|(H[17699]<<16|H[17700]<<24);G[f+120>>2]=H[17693]|H[17694]<<8|(H[17695]<<16|H[17696]<<24);G[f+124>>2]=b;b=H[17689]|H[17690]<<8|(H[17691]<<16|H[17692]<<24);G[f+112>>2]=H[17685]|H[17686]<<8|(H[17687]<<16|H[17688]<<24);G[f+116>>2]=b;b=H[17681]|H[17682]<<8|(H[17683]<<16|H[17684]<<24);G[f+104>>2]=H[17677]|H[17678]<<8|(H[17679]<<16|H[17680]<<24);G[f+108>>2]=b;b=H[17673]|H[17674]<<8|(H[17675]<<16|H[17676]<<24);G[f+96>>2]=H[17669]|H[17670]<<8|(H[17671]<<16|H[17672]<<24);G[f+100>>2]=b;be(a,34377,2147483648,f+96|0,e);break da}b=f+256|0;bb(b,17588,81);wb(a,b,e);break da}E[f+136|0]=H[20261];b=H[20257]|H[20258]<<8|(H[20259]<<16|H[20260]<<24);G[f+128>>2]=H[20253]|H[20254]<<8|(H[20255]<<16|H[20256]<<24);G[f+132>>2]=b;b=H[20249]|H[20250]<<8|(H[20251]<<16|H[20252]<<24);G[f+120>>2]=H[20245]|H[20246]<<8|(H[20247]<<16|H[20248]<<24);G[f+124>>2]=b;b=H[20241]|H[20242]<<8|(H[20243]<<16|H[20244]<<24);G[f+112>>2]=H[20237]|H[20238]<<8|(H[20239]<<16|H[20240]<<24);G[f+116>>2]=b;b=H[20233]|H[20234]<<8|(H[20235]<<16|H[20236]<<24);G[f+104>>2]=H[20229]|H[20230]<<8|(H[20231]<<16|H[20232]<<24);G[f+108>>2]=b;b=H[20225]|H[20226]<<8|(H[20227]<<16|H[20228]<<24);G[f+96>>2]=H[20221]|H[20222]<<8|(H[20223]<<16|H[20224]<<24);G[f+100>>2]=b;be(a,34377,-128,f+96|0,e)}b=H[10528]|H[10529]<<8|(H[10530]<<16|H[10531]<<24);c=H[10524]|H[10525]<<8|(H[10526]<<16|H[10527]<<24);E[f+111|0]=c;E[f+112|0]=c>>>8;E[f+113|0]=c>>>16;E[f+114|0]=c>>>24;E[f+115|0]=b;E[f+116|0]=b>>>8;E[f+117|0]=b>>>16;E[f+118|0]=b>>>24;b=H[10521]|H[10522]<<8|(H[10523]<<16|H[10524]<<24);G[f+104>>2]=H[10517]|H[10518]<<8|(H[10519]<<16|H[10520]<<24);G[f+108>>2]=b;b=H[10513]|H[10514]<<8|(H[10515]<<16|H[10516]<<24);G[f+96>>2]=H[10509]|H[10510]<<8|(H[10511]<<16|H[10512]<<24);G[f+100>>2]=b;be(a,35661,1,f+96|0,e);break a}G[f+80>>2]=b;a=f+256|0;Ya(a,81,30501,f+80|0);Ua(a);G[e>>2]=211}Fa=f+432|0}function bn(a,b,c){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;l=Fa-208|0;Fa=l;G[309831]=G[309831]+1;G[l+204>>2]=0;E[l+32|0]=0;G[l+24>>2]=0;G[l+28>>2]=0;d=b;n=Fa-16|0;Fa=n;p=l+204|0;b=G[p>>2];if(!b){s=Fa-16|0;Fa=s;b=G[p>>2];if((b|0)<=0){e=G[a>>2];G[n+8>>2]=e;b=G[a+4>>2];if((G[b+128>>2]&G[b+132>>2])!=-1){G[s+12>>2]=0;e=e+1|0;if((mb(a,e,0,s+12|0)|0)<=0){b=e;while(1){G[n+8>>2]=b;b=b+1|0;if((mb(a,b,0,s+12|0)|0)<=0){continue}break}}mb(a,e,0,p)}b=G[p>>2]}Fa=s+16|0;G[p>>2]=b;e=G[n+8>>2];if(e){b=mb(a,e,n+12|0,p);G[p>>2]=b}if(b){G[p>>2]=0}m=Fa-544|0;Fa=m;G[m+540>>2]=0;G[m+536>>2]=0;G[m+532>>2]=0;E[m+280|0]=H[35098];b=H[35094]|H[35095]<<8|(H[35096]<<16|H[35097]<<24);G[m+272>>2]=H[35090]|H[35091]<<8|(H[35092]<<16|H[35093]<<24);G[m+276>>2]=b;G[m+500>>2]=m+369;G[m+504>>2]=m+386;G[m+508>>2]=m+403;G[m+512>>2]=m+420;b=m+288|0;G[m+468>>2]=b|9;G[m+472>>2]=m+306;G[m+476>>2]=m+315;G[m+496>>2]=m+352;G[m+464>>2]=b;G[m+480>>2]=m+324;G[m+516>>2]=m+437;G[m+484>>2]=m+333;g=m+496|0;f=m+464|0;j=Fa-160|0;Fa=j;b=G[30023];G[j+152>>2]=G[30022];G[j+156>>2]=b;b=G[30021];G[j+144>>2]=G[30020];G[j+148>>2]=b;E[j+142|0]=H[35991];F[j+140>>1]=H[35989]|H[35990]<<8;G[j+136>>2]=H[35468]|H[35469]<<8|(H[35470]<<16|H[35471]<<24);b=H[35464]|H[35465]<<8|(H[35466]<<16|H[35467]<<24);G[j+128>>2]=H[35460]|H[35461]<<8|(H[35462]<<16|H[35463]<<24);G[j+132>>2]=b;G[j+124>>2]=4272691;e=H[34454]|H[34455]<<8|(H[34456]<<16|H[34457]<<24);b=H[34450]|H[34451]<<8|(H[34452]<<16|H[34453]<<24);E[j+111|0]=b;E[j+112|0]=b>>>8;E[j+113|0]=b>>>16;E[j+114|0]=b>>>24;E[j+115|0]=e;E[j+116|0]=e>>>8;E[j+117|0]=e>>>16;E[j+118|0]=e>>>24;b=H[34447]|H[34448]<<8|(H[34449]<<16|H[34450]<<24);G[j+104>>2]=H[34443]|H[34444]<<8|(H[34445]<<16|H[34446]<<24);G[j+108>>2]=b;s=H[34880];E[j+102|0]=s;e=H[34878]|H[34879]<<8;F[j+100>>1]=e;b=G[30027];G[j+88>>2]=G[30026];G[j+92>>2]=b;b=G[30025];G[j+80>>2]=G[30024];G[j+84>>2]=b;E[j+78|0]=s;F[j+76>>1]=e;b=G[30031];G[j+56>>2]=G[30030];G[j+60>>2]=b;b=G[30029];G[j+48>>2]=G[30028];G[j+52>>2]=b;E[j+46|0]=H[35999];F[j+44>>1]=H[35997]|H[35998]<<8;b=G[30035];G[j+24>>2]=G[30034];G[j+28>>2]=b;b=G[30033];G[j+16>>2]=G[30032];G[j+20>>2]=b;E[j+12|0]=H[35996];G[j+8>>2]=H[35992]|H[35993]<<8|(H[35994]<<16|H[35995]<<24);b=G[p>>2];if(!b){Za(G[g>>2],j+144|0);Za(G[f>>2],j+140|0);Za(G[g+4>>2],j+128|0);Za(G[f+4>>2],j+124|0);Za(G[g+8>>2],j+104|0);Za(G[f+8>>2],j+100|0);Za(G[g+12>>2],j+80|0);Za(G[f+12>>2],j+76|0);Za(G[g+16>>2],j+16|0);Za(G[f+16>>2],j+8|0);Za(G[g+20>>2],j+48|0);Za(G[f+20>>2],j+44|0);G[m+540>>2]=6;b=G[p>>2]}Fa=j+160|0;G[p>>2]=b;x=G[m+540>>2];v=Fa-192|0;Fa=v;b=G[p>>2];a:{if((b|0)>0){break a}E[v+16|0]=0;b=G[a>>2];q=G[a+4>>2];if((b|0)!=G[q+76>>2]){mb(a,b+1|0,0,p);q=G[a+4>>2];b=G[q+76>>2]}b:{c:{d:{e:{s=G[q+96>>2];e=s+(b<<3)|0;if(G[q+104>>2]!=G[e>>2]|G[q+108>>2]!=G[e+4>>2]){if(G[q+88>>2]!=(b|0)){break e}b=s+(b<<3)|0;i=J[b+8>>2]>2];e=G[b+12>>2];b=G[q+44>>2];if(i&(e|0)<=(b|0)|(b|0)>(e|0)){break e}}nl(a,2,0,0,x,g,f,0,v+16|0,p);break d}if(x>>>0>999){break c}b=0;f:{if(!x){break f}}s=H[v+16|0];if((x|0)>0){while(1){Vf(G[f+(b<<2)>>2],v+96|0,v+188|0,v+184|0,p);q=r;g:{h:{i:{e=G[v+96>>2]-1|0;if(e){if((e|0)==15){break i}else{break h}}r=(G[v+188>>2]+7|0)/8|0;break g}r=G[v+188>>2];break g}r=M(G[v+184>>2],G[v+188>>2])}e=q+(r>>31)|0;h=h+r|0;r=h>>>0>>0?e+1|0:e;b=b+1|0;if((x|0)!=(b|0)){continue}break}q=G[a+4>>2]}if(G[q+84>>2]!=1){break b}Rb(a,p);_n(a,p);e=G[a+4>>2];o=G[e+76>>2]+1|0;b=G[e+96>>2]+(o<<3)|0;i=G[b>>2];k=G[b+4>>2];G[e+80>>2]=2;s=(((x<<1)+((s|0)!=0)|0)+44|0)/36|0;if((Bf(a,s,1,p)|0)>0){break d}w=G[a+4>>2];e=G[w+88>>2];b=e+1|0;G[w+88>>2]=b;u=G[w+96>>2];j=G[w+76>>2];j:{if((e|0)<(j|0)){break j}r=e-j|0;h=r+1&3;if(h){q=0;while(1){t=(b<<3)+u|0;e=G[t+4>>2];G[t+8>>2]=G[t>>2];G[t+12>>2]=e;b=b-1|0;q=q+1|0;if((h|0)!=(q|0)){continue}break}}if(r>>>0<3){break j}while(1){t=(b<<3)+u|0;e=G[t+4>>2];G[t+8>>2]=G[t>>2];G[t+12>>2]=e;h=t-8|0;e=G[h+4>>2];G[t>>2]=G[h>>2];G[t+4>>2]=e;r=t-16|0;e=G[r+4>>2];G[h>>2]=G[r>>2];G[h+4>>2]=e;h=t-24|0;e=G[h+4>>2];G[r>>2]=G[h>>2];G[r+4>>2]=e;b=b-4|0;if((j|0)<(b|0)){continue}break}}h=(o<<3)+u|0;G[h>>2]=i;G[h+4>>2]=k;G[w+76>>2]=o;G[a>>2]=o;G[w+120>>2]=i;G[w+124>>2]=k;b=G[h+4>>2];G[w+104>>2]=G[h>>2];G[w+108>>2]=b;e=G[h>>2];b=G[h+4>>2];G[w+80>>2]=2;h=M(s,2880);e=h+e|0;G[w+128>>2]=e;b=(h>>31)+b|0;G[w+132>>2]=e>>>0>>0?b+1|0:b;qq(a,0,0,x,g,f,0,v+16|0,p);Rb(a,p)}b=G[p>>2];break a}G[v>>2]=x;b=v+96|0;Ya(b,81,30574,v);Ua(b);b=216;G[p>>2]=216;break a}b=112;G[p>>2]=112}Fa=v+192|0;G[p>>2]=b;if(!b){G[m+536>>2]=G[a>>2]+1;Vc(a,33837,m+112|0,m+32|0,p);vq(a,35480,m+272|0,23611,p);Fh(a,33996,0,0,60936,p);if(!(!d|!H[d|0])){vq(a,35496,d,21520,p)}k:{if((x|0)<=0){break k}b=0;while(1){if(G[p>>2]){break k}l:{m:{d=(m+496|0)+(b<<2)|0;if(!Ib(G[d>>2],120096)){break m}if(!Ib(G[d>>2],34443)){break m}b=b+1|0;break l}b=b+1|0;G[m+16>>2]=b;d=m+192|0;Ya(d,75,29963,m+16|0);y=p,z=Fc(a,d,m+112|0,m+32|0,p),G[y>>2]=z;G[m>>2]=b;Ya(d,75,29971,m);y=p,z=Fh(a,d,0,0,20187,p),G[y>>2]=z}if((b|0)!=(x|0)){continue}break}}b=1;while(1){d=b;b=d+1|0;if(!Je(a,-1,35090,d,p)){continue}break}if(G[p>>2]==301){G[p>>2]=0}mb(a,G[m+536>>2],m+532|0,p);Ad(a,33996,d,0,65398,p);b=G[p>>2]}Fa=m+544|0;G[p>>2]=b}Fa=n+16|0;G[l+204>>2]=b;n:{if(b){break n}G[l+200>>2]=G[a>>2]+1;if((c|0)>0){d=c;b=l+196|0;c=l+204|0;mb(a,d,b,c);Un(a,G[l+200>>2],c);mb(a,G[l+200>>2],b,c);b=G[l+204>>2];if(b){break n}}c=6;while(1){o:{b=eh(0);G[l+204>>2]=b;if(b){break o}p:{q:{switch(G[47524]-1|0){case 3:case 4:G[l+204>>2]=369;break o;case 1:G[309831]=G[309831]-1;break o;case 0:r:{if(G[310098]==2){rb(l+112|0,G[310118],80);break r}b=G[47540];G[47540]=b+1;G[l+16>>2]=b;Ya(l+112|0,80,29887,l+16|0)}E[l+191|0]=0;b=bn(a,l+112|0,G[l+200>>2]);break p;case 2:if(!G[309816]){G[l+204>>2]=363;break o}if(G[309823]){G[l+204>>2]=364;break o}b=G[309817];G[309823]=G[309816];G[309824]=b;G[309829]=G[309822];b=G[309821];G[309827]=G[309820];G[309828]=b;b=G[309819];G[309825]=G[309818];G[309826]=b;G[l+204>>2]=0;G[309816]=0;b=Qj(a,G[l+200>>2],0);break p;default:break q}}d=Va(1240396);s:{if(d-2>>>0>4){break s}e=d-1|0;if(H[e+1240396|0]!=35){break s}if(!H[l+32|0]){b=l+32|0;bb(b,1240396,e);E[b+e|0]=0}if((Va(l+32|0)|0)==(e|0)){c=!nb(l+32|0,1240396,e)+c|0}G[l>>2]=c;Ya(d+1240395|0,76-d|0,30633,l)}b=360;d=G[l+24>>2];t:{if(!d){d=ab(176);break t}d=ub(G[l+28>>2],M(d,176)+176|0)}if(!d){break p}h=G[l+24>>2];G[l+28>>2]=d;d=bb(d+M(h,176)|0,1240392,176);u:{if(G[310098]!=2){break u}e=G[310118];if(!e){break u}q=d;d=ab(Va(e)+1|0);G[q+80>>2]=d;if(!d){break p}Za(d,e)}G[l+24>>2]=h+1;b=0}G[l+204>>2]=b;if(!b){continue}}break}mb(a,G[l+200>>2],l+196|0,l+204|0);v:{w:{if(G[l+204>>2]){break w}b=cn(a,l+24|0,6);G[l+204>>2]=b;if(b){break w}b=Rj(l+24|0,a);G[l+204>>2]=b;if(!b){break v}}G[l+196>>2]=0;c=a;t=Fa-16016|0;Fa=t;G[t+16008>>2]=0;d=l+196|0;if(!G[d>>2]){a=ik(c,t+16008|0,d);G[d>>2]=a;h=G[t+16008>>2];x:{if((h|0)<=0){break x}while(1){if(a){break x}a=0;g=Fa-7552|0;Fa=g;G[g+7548>>2]=0;G[g+7544>>2]=0;G[g+7540>>2]=0;G[g+7536>>2]=0;G[g+7532>>2]=0;G[g+7528>>2]=0;G[g+76>>2]=0;b=G[d>>2];if(!b){G[g+7544>>2]=G[G[c+4>>2]+84>>2];y:{if(G[g+7544>>2]!=1){Ua(58442);G[d>>2]=350;break y}u=g+76|0;i=0;f=Fa-6544|0;Fa=f;G[f+6504>>2]=0;G[f+6500>>2]=0;E[f+15|0]=0;o=G[d>>2];z:{if(o){break z}o=jk(c,f+6540|0,f+6536|0,f+6532|0,f+6528|0,f+6524|0,f+6520|0,f+6516|0,d);G[d>>2]=o;A:{if(o){break A}b=G[f+6540>>2];k=G[f+6536>>2];j=G[f+6532>>2];s=G[f+6528>>2];r=G[f+6524>>2];e=G[f+6520>>2];n=Fa-16|0;Fa=n;G[n+12>>2]=0;G[n+8>>2]=0;G[n+4>>2]=0;o=G[d>>2];if(!o){B:{C:{D:{E:{F:{G:{if(b){vd(c,b,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(b|G[n+12>>2]!=16){break G}o=56889;b=G[n+8>>2];if((b|0)>8|(b|0)!=G[n+4>>2]){break D}}if(k){vd(c,k,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(b|G[n+12>>2]!=16){break F}o=56938;b=G[n+8>>2];if((b|0)>32|(b|0)!=G[n+4>>2]){break D}}H:{if(!j){break H}vd(c,j,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(!(b|G[n+12>>2]!=41)&G[n+8>>2]<2){break H}o=56841;if(!b){break D}break C}I:{if(!s){break I}vd(c,s,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(!(b|G[n+12>>2]!=41)&G[n+8>>2]<2){break I}o=56743;if(!b){break D}break C}if(r){vd(c,r,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(b|G[n+12>>2]!=16){break E}o=56792;b=G[n+8>>2];if((b|0)>256|(b|0)!=G[n+4>>2]){break D}}if(!e){break B}vd(c,e,n+12|0,n+8|0,n+4|0,d);b=G[d>>2];if(!(b|G[n+12>>2]!=16)){o=56983;b=G[n+8>>2];if((b|0)>3|(b|0)!=G[n+4>>2]){break D}break B}o=56983;if(b){break C}break D}o=56889;if(!b){break D}break C}o=56938;if(!b){break D}break C}o=56792;if(b){break C}}G[d>>2]=340}Ua(o)}o=G[d>>2]}Fa=n+16|0;G[d>>2]=o;if(o){break A}G[f+8>>2]=f+6416;b=G[f+6540>>2];if(b){y=d,z=Df(c,b,h,h>>31,f+15|0,f+8|0,f+6508|0,d),G[y>>2]=z;J:{K:{if(!Ib(f+6416|0,32755)){break K}if(!Ib(f+6416|0,35678)){break K}i=1;if(!Ib(f+6416|0,35630)){break J}i=2;if(!Ib(f+6416|0,35618)){break J}i=-1;break J}i=0}G[f+6512>>2]=i}G[f+8>>2]=f+6336;b=G[f+6536>>2];if(b){y=d,z=Df(c,b,h,h>>31,f+15|0,f+8|0,f+6508|0,d),G[y>>2]=z}b=G[f+6532>>2];if(b){y=d,z=Zk(c,b,h,h>>31,f+6500|0,f+6508|0,d),G[y>>2]=z}b=G[f+6528>>2];if(b){y=d,z=Zk(c,b,h,h>>31,f+6504|0,f+6508|0,d),G[y>>2]=z}G[f+8>>2]=f+3136;b=G[f+6524>>2];if(b){y=d,z=Df(c,b,h,h>>31,f+15|0,f+8|0,f+6508|0,d),G[y>>2]=z}G[f+8>>2]=f+6256;b=G[f+6520>>2];L:{if(b){o=Df(c,b,h,h>>31,f+15|0,f+8|0,f+6508|0,d);G[d>>2]=o;break L}o=G[d>>2]}M:{N:{O:{if(o){break O}r=G[f+6516>>2];if(r>>>0>12){break O}P:{Q:{R:{b=1<>2]=104;G[f>>2]=f+6256;b=f+5216|0;Ya(b,81,52370,f);Ua(b);break O}if(ad(f+3136|0)){Ua(52686);b=Rc(u,f+3136|0,1,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0;Ua(52331);b=Rc(u,f+3136|0,0,d);break Q}Ua(52823);if(H[f+3136|0]==47){Ua(52424);b=f+2096|0;y=d,z=kh(f+3136|0,b,d),G[y>>2]=z;Ua(52600);b=Rc(u,b,1,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0;Ua(52331);b=Rc(u,f+2096|0,0,d);break Q}Ua(52774);y=d,z=yf(c,f+5216|0,f+4176|0,0,0,0,d),G[y>>2]=z;b=H[f+5216|0];if(b){if(!(ad(f+5216|0)|(b|0)==47)){e=f+16|0;cf(e,d);b=Va(e)+e|0;E[b|0]=47;E[b+1|0]=0;if((Va(e)+Va(f+5216|0)|0)-1024>>>0<=4294966270){Ua(52513);G[d>>2]=125;break O}b=f+5216|0;Za(b,Gb(f+16|0,b))}b=Dg(f+5216|0,f+3136|0,f+2096|0,d);G[d>>2]=b;if(b){break O}if(!ad(f+2096|0)){e=f+2096|0;b=f+1056|0;y=d,z=kh(e,b,d),G[y>>2]=z;Za(e,b)}b=Rc(u,f+2096|0,1,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0;Ua(52644);b=Rc(u,f+2096|0,0,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0}b=H[f+4176|0];if(b){if(!(ad(f+4176|0)|(b|0)==47)){b=f+16|0;cf(b,d);if((Va(b)+Va(f+4176|0)|0)-1024>>>0<=4294966270){Ua(52468);G[d>>2]=125;break O}e=f+16|0;b=Va(e)+e|0;E[b|0]=47;E[b+1|0]=0;b=f+4176|0;Za(b,Gb(e,b))}b=Dg(f+4176|0,f+3136|0,f+2096|0,d);G[d>>2]=b;if(b){break O}if(!ad(f+2096|0)){e=f+2096|0;b=f+1056|0;y=d,z=kh(e,b,d),G[y>>2]=z;Za(e,b)}b=Rc(u,f+2096|0,1,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0;Ua(52644);b=Rc(u,f+2096|0,0,d);G[d>>2]=b;if(!b){break P}G[d>>2]=0}Ua(52558);G[d>>2]=342;break O}b=Mj(c,u,d)}G[d>>2]=b;if(b){break O}}if(r>>>0>12){break O}b=1<>2],G[f+6504>>2],f+6512|0,d);G[d>>2]=o;break M}o=Je(G[u>>2],i,f+6336|0,G[f+6500>>2],d);G[d>>2]=o;if((o|0)!=301){break M}G[d>>2]=342;Ua(52732);break O}if(!H[f+6416|0]|!H[f+6336|0]){break N}b=G[f+6500>>2];if((b|0)<=0){break N}o=Je(G[u>>2],i,f+6336|0,b,d);G[d>>2]=o;if((o|0)!=301){break M}G[d>>2]=342;Ua(52732)}o=G[d>>2];break M}b=mb(G[u>>2],G[f+6504>>2],f+6512|0,d);o=(b|0)==107?342:b;G[d>>2]=o}if(o){break A}o=0;break z}b=G[u>>2];if(!b){break z}Qb(b,d);o=G[d>>2]}Fa=f+6544|0;G[d>>2]=o;G[g+7544>>2]=G[G[G[g+76>>2]+4>>2]+84>>2];G[d>>2]=G[d>>2];S:{if(G[g+7544>>2]!=1){break S}y=d,z=Ec(c,33996,g+7532|0,g+2160|0,d),G[y>>2]=z;se(G[G[G[g+76>>2]+4>>2]+12>>2],g+1120|0,d);se(G[G[c+4>>2]+12>>2],g+80|0,d);T:{if(G[G[g+76>>2]+4>>2]==G[c+4>>2]){break T}if(!fb(g+1120|0,g+80|0,1025)){break T}G[g+7532>>2]=0-G[g+7532>>2]}b=yf(c,g+6496|0,g+5456|0,0,0,0,d);G[d>>2]=b;if(b){break y}y=d,z=cf(g+3376|0,d),G[y>>2]=z;b=H[g+6496|0];U:{if(!b|(b|0)==47){break U}if(ad(g+6496|0)){break U}e=Za(g+4416|0,g+3376|0);if((Va(e)+Va(g+6496|0)|0)-1024>>>0<=4294966270){Ua(56553);G[d>>2]=125;break y}b=Va(e)+e|0;E[b|0]=47;E[b+1|0]=0;b=g+6496|0;_d(Gb(e,b),b,d)}b=H[g+5456|0];V:{if(!b|(b|0)==47){break V}if(ad(g+5456|0)){break V}e=Za(g+4416|0,g+3376|0);if((Va(e)+Va(g+5456|0)|0)-1024>>>0<=4294966270){Ua(56553);G[d>>2]=125;break y}b=Va(e)+e|0;E[b|0]=47;E[b+1|0]=0;b=g+5456|0;_d(Gb(e,b),b,d)}y=d,z=lh(G[g+76>>2],g+7540|0,d),G[y>>2]=z;q=Sd(G[g+76>>2],0,g+2160|0,d);G[d>>2]=q;e=1;r=G[g+7540>>2];if((r|0)<=0){break S}while(1){if(!(a|q)){b=e;G[g+64>>2]=b;a=g+3296|0;Ya(a,75,30030,g- -64|0);q=Ec(G[g+76>>2],a,g+7528|0,g+2160|0,d);G[d>>2]=q;a=0;W:{if(q){break W}e=G[g+7532>>2];s=G[g+7528>>2];if((s|0)>0){q=0;a=b;if((e|0)==(s|0)){break W}}a=0;if((s|0)>=0){q=0;break W}if((e|0)!=(s|0)){q=0;break W}G[g+48>>2]=b;e=g+3296|0;Ya(e,75,30038,g+48|0);q=Di(G[g+76>>2],e,g+2252|0,g+2160|0,d);G[d>>2]=q;X:{Y:{if(!q){e=G[g+2252>>2];Za(g+2256|0,e);Wa(e);q=G[d>>2]}Z:{if(q){if((q|0)!=202){break W}G[g+36>>2]=b;G[g+32>>2]=b;a=g+2160|0;Ya(a,81,30009,g+32|0);Ua(a);q=0;break Z}Vn(g+2256|0);q=0;a=H[g+2256|0];if(!a){break X}if(ad(g+2256|0)|(a|0)==47){break X}a=g+4416|0;y=d,z=io(G[g+76>>2],a,d),G[y>>2]=z;a=Uf(a,47);if(a){E[a|0]=0}if((Va(g+4416|0)+Va(g+2256|0)|0)-1024>>>0>4294966270){break Y}Ua(56553);q=125}G[d>>2]=q;a=0;break W}e=g+4416|0;a=Va(e)+e|0;E[a|0]=47;E[a+1|0]=0;a=g+2256|0;q=_d(Gb(e,a),a,d);G[d>>2]=q}if(Xa(g+2256|0,g+6496|0)){a=0;if(Xa(g+2256|0,g+5456|0)){break W}}a=b}e=b+1|0;if((b|0)!=(r|0)){continue}}break}if(!a){break S}G[g+16>>2]=a;b=g+3296|0;Ya(b,75,30030,g+16|0);y=d,z=kf(G[g+76>>2],b,d),G[y>>2]=z;G[g>>2]=a;Ya(b,75,30038,g);kf(G[g+76>>2],b,d);G[d>>2]=0;y=d,z=lh(G[g+76>>2],g+7540|0,d),G[y>>2]=z}y=d,z=xk(c,h,h>>31,1,0,d),G[y>>2]=z}a=G[g+76>>2];if(a){Qb(a,d)}b=G[d>>2]}Fa=g+7552|0;a=b;G[d>>2]=b;b=(h|0)>1;h=h-1|0;if(b){continue}break}}h=0;i=Fa-2496|0;Fa=i;G[i+2492>>2]=0;G[i+2484>>2]=0;G[i+2480>>2]=0;G[i+60>>2]=0;a=G[d>>2];if(!a){a=Fc(c,34516,i+320|0,i- -64|0,d);G[d>>2]=a;_:{if((a|0)==202){G[i+320>>2]=1296650832;G[i+324>>2]=5853761;G[d>>2]=0;break _}a=Va(i+320|0);if(H[i+320|0]!=39|H[(a+i|0)+319|0]!=39){break _}b=a-2|0;if((b|0)>0){a=i+320|0;yd(a,a|1,b)}E[b+(i+320|0)|0]=0}$:{aa:{a=Va(i+320|0)-1|0;if((a|0)<=0){break aa}while(1){if(H[(i+320|0)+h|0]!=32){break aa}h=h+1|0;if((h|0)!=(a|0)){continue}break}break $}if((a|0)==(h|0)|(a|0)<0){break $}while(1){b=(i+320|0)+a|0;if(H[b|0]!=32){break $}E[b|0]=0;b=(a|0)>0;a=a-1|0;if(b){continue}break}}a=Ec(c,33996,i+2480|0,i- -64|0,d);G[d>>2]=a;if((a|0)==202){G[i+2480>>2]=1;G[d>>2]=0}a=Fc(c,35480,i+240|0,i- -64|0,d);G[d>>2]=a;ba:{if((a|0)==202){E[i+240|0]=0;G[d>>2]=0;break ba}a=Va(i+240|0);if(H[i+240|0]!=39|H[(a+i|0)+239|0]!=39){break ba}b=a-2|0;if((b|0)>0){a=i+240|0;yd(a,a|1,b)}E[b+(i+240|0)|0]=0}h=0;ca:{da:{a=Va(i+240|0)-1|0;if((a|0)<=0){break da}while(1){if(H[(i+240|0)+h|0]!=32){break da}h=h+1|0;if((h|0)!=(a|0)){continue}break}break ca}if((a|0)==(h|0)|(a|0)<0){break ca}while(1){b=(i+240|0)+a|0;if(H[b|0]!=32){break ca}E[b|0]=0;b=(a|0)>0;a=a-1|0;if(b){continue}break}}G[i+2492>>2]=G[c>>2]+1;a=yf(c,i+1440|0,i+400|0,0,0,0,d);G[d>>2]=a;ea:{if(a){break ea}h=lh(c,i+2484|0,d);G[d>>2]=h;a=1;s=G[i+2484>>2];if((s|0)>0){while(1){if(h){break ea}e=a;j=i+60|0;k=Fa-4416|0;Fa=k;G[k+4412>>2]=0;G[k+4408>>2]=0;a=G[d>>2];fa:{if(a){break fa}G[j>>2]=0;y=d,z=lh(c,k+4412|0,d),G[y>>2]=z;ga:{a=G[k+4412>>2];ha:{if((a|0)<(e|0)){G[d>>2]=344;G[k+4>>2]=a;G[k>>2]=e;a=k+80|0;Ya(a,73,52044,k);Ua(a);a=G[d>>2];break ha}G[k+64>>2]=e;a=k+4320|0;Ya(a,75,30030,k- -64|0);a=Ec(c,a,k+4408|0,k+80|0,d);G[d>>2]=a;if(a){break ga}a=G[k+4408>>2];ia:{ja:{if((a|0)>0){a=Mj(c,j,d);G[d>>2]=a;break ja}ka:{la:{ma:{if(!a){G[d>>2]=344;G[k+20>>2]=e;G[k+16>>2]=0;Ya(k+80|0,73,52142,k+16|0);break ma}G[k+48>>2]=e;G[k+4408>>2]=0-a;a=k+4320|0;Ya(a,75,30038,k+48|0);a=Di(c,a,k+3276|0,k+80|0,d);G[d>>2]=a;if(!a){a=G[k+3276>>2];Za(k+3280|0,a);Wa(a);a=G[d>>2]}if((a|0)!=202){break la}G[d>>2]=344;G[k+32>>2]=e;Ya(k+80|0,73,52007,k+32|0)}Ua(k+80|0);break ka}a=k+3280|0;Vn(a);if(ad(a)){Ua(52277);a=Rc(j,k+3280|0,1,d);G[d>>2]=a;if(!a){break ia}Ua(52226);G[d>>2]=0;a=Rc(j,k+3280|0,0,d);G[d>>2]=a;break ja}a=k+1200|0;y=d,z=kh(k+3280|0,a,d),G[y>>2]=z;a=Rc(j,a,1,d);G[d>>2]=a;if(!a){break ia}Ua(52226);G[d>>2]=0;a=Rc(j,k+1200|0,0,d);G[d>>2]=a;if(!a){break ia}G[d>>2]=0;b=k+160|0;G[k+76>>2]=b;a=k+1200|0;G[k+72>>2]=a;y=d,z=yf(c,a,b,0,0,0,d),G[y>>2]=z;G[j>>2]=0;a=1;r=0;while(1){b=a;a=0;r=G[(k+72|0)+(r<<2)>>2];h=0;na:{if(!H[r|0]){break na}h=Dg(r,k+3280|0,k+2240|0,d);G[d>>2]=h;if(h){G[d>>2]=0;h=0;break na}if(!ad(k+2240|0)){h=k+2240|0;y=d,z=kh(h,r,d),G[y>>2]=z;Za(h,r)}h=Rc(j,k+2240|0,1,d);G[d>>2]=h;if(!h){break ka}Ua(52100);Ua(52184);G[d>>2]=0;h=Rc(j,k+2240|0,0,d);G[d>>2]=0;h=!h}r=1;if(b&!h){continue}break}}a=G[d>>2]}if(a){break ga}}a=G[j>>2];if(!a){Ua(51953);a=343;G[d>>2]=343;break ga}a=Je(a,-1,35090,G[k+4408>>2],d)?343:0;G[d>>2]=a}if(a){break ga}a=0;break fa}b=G[j>>2];if(!b){break fa}Qb(b,d);G[j>>2]=0;a=G[d>>2]}Fa=k+4416|0;G[d>>2]=a;oa:{if(a){G[d>>2]=0;G[i+48>>2]=e;a=i- -64|0;Ya(a,81,58694,i+48|0);Ua(a);break oa}G[i+2488>>2]=G[G[G[i+60>>2]+4>>2]+84>>2];if(G[i+2488>>2]!=1){G[i+32>>2]=e;a=i- -64|0;Ya(a,81,58545,i+32|0);Ua(a);break oa}G[i+2476>>2]=0;pa:{if(!H[i+1440|0]){h=G[d>>2];break pa}h=hk(G[i+60>>2],i+320|0,i+240|0,G[i+2480>>2],G[i+2492>>2],i+1440|0,i+2476|0,d);G[d>>2]=h}if(!(!H[i+400|0]|(h|0)!=342)){G[d>>2]=0;h=hk(G[i+60>>2],i+320|0,i+240|0,G[i+2480>>2],G[i+2492>>2],i+400|0,i+2476|0,d);G[d>>2]=h}if(!h){a=G[i+2476>>2];h=xk(G[i+60>>2],a,a>>31,1,0,d);G[d>>2]=h}if((h|0)==342){Ua(58641)}G[d>>2]=0;a=G[i+60>>2];if(!a){break oa}Qb(a,d);G[i+60>>2]=0}a=e+1|0;h=G[d>>2];if((e|0)!=(s|0)){continue}break}}if(h|1){break ea}G[i+2488>>2]=G[G[c+4>>2]+84>>2];if(G[i+2488>>2]){if((s|0)<=0){break ea}h=G[d>>2];a=1;while(1){if(h){break ea}G[i+16>>2]=a;b=i+160|0;Ya(b,75,30030,i+16|0);kf(c,b,d);G[i>>2]=a;Ya(b,75,30038,i);kf(c,b,d);h=G[d>>2];if((h|0)==202){G[d>>2]=0;h=0}b=(a|0)!=(s|0);a=a+1|0;if(b){continue}break}break ea}Ua(58736)}a=G[i+60>>2];if(a){Qb(a,d)}a=G[d>>2]}Fa=i+2496|0;G[d>>2]=a;y=d,z=vo(c,t+16012|0,d),G[y>>2]=z}Fa=t+16016|0}c=G[l+24>>2];if((c|0)>0){b=0;while(1){d=M(b,176);a=d+G[l+28>>2]|0;qa:{if(G[a>>2]!=2){break qa}a=G[a+80>>2];if(!a){break qa}Wa(a);G[(d+G[l+28>>2]|0)+80>>2]=0;c=G[l+24>>2]}b=b+1|0;if((c|0)>(b|0)){continue}break}}a=G[l+28>>2];if(a){Wa(a)}b=G[l+204>>2]}Fa=l+208|0;return b}function Xj(a,b,c,d){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,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,F=0,I=0,J=0,K=0,N=0,P=0;n=Fa-352|0;Fa=n;a:{b:{c:{d:{if((b|0)==-99){if((mi(33141,n)|0)!=269){break d}b=xf(G[n>>2])}if((c|0)==-99){break c}break b}if(!G[309737]){G[309737]=431}a=n+272|0;bb(a,136827,80);E[n+351|0]=0;Ua(a);I=-1;break a}if((mi(32826,n)|0)==269){c=xf(G[n>>2]);break b}if(!G[309737]){G[309737]=431}a=n+272|0;bb(a,136746,80);E[n+351|0]=0;Ua(a);I=-1;break a}y=Fb(260,0,b);v=Fb(260,0,c);e:{f:{g:{h:{i:{z=G[309723];if((z|0)==G[309724]){b=G[309722];j:{if(b){G[309724]=z<<1;b=ub(b,M(z,688));break j}G[309724]=100;b=ab(34400)}if(!b){break i}G[309722]=b;z=G[309723]}w=z+1|0;G[309723]=w;I=-1;if((y|v|z)<0){break a}k:{b=G[309722];c=G[(b+M(y,344)|0)+56>>2];if((c|0)==1){break k}f=G[(M(v,344)+b|0)+56>>2];if((f|0)==1){break k}l:{if(G[(M(y,344)+b|0)+52>>2]!=G[(M(v,344)+b|0)+52>>2]|(c|0)!=(f|0)){break l}e=G[(M(y,344)+b|0)+60>>2];if((e|0)!=G[(M(v,344)+b|0)+60>>2]){break l}f=1;if((e|0)<=0){break k}c=0;if(e-1>>>0>=3){o=e&-4;while(1){p=c<<2;i=p|4;m=f;f=(M(y,344)+b|0)- -64|0;l=(M(v,344)+b|0)- -64|0;m=G[f+i>>2]==G[i+l>>2]?G[p+f>>2]==G[l+p>>2]?m:0:0;i=p|8;m=G[i+f>>2]==G[i+l>>2]?m:0;i=f;f=p|12;f=G[i+f>>2]==G[f+l>>2]?m:0;c=c+4|0;j=j+4|0;if((o|0)!=(j|0)){continue}break}}e=e&3;if(e){while(1){p=f;f=c<<2;f=G[(f+(M(y,344)+b|0)|0)- -64>>2]==G[(f+(M(v,344)+b|0)|0)- -64>>2]?p:0;c=c+1|0;g=g+1|0;if((e|0)!=(g|0)){continue}break}}if(f){break k}}if(!G[309737]){G[309737]=431}a=n+272|0;bb(a,136422,80);E[n+351|0]=0;Ua(a);break a}if(G[309724]==(w|0)){G[309724]=w<<1;b=ub(b,M(w,688));if(!b){break h}G[309722]=b;w=G[309723]}G[309723]=w+1;if((w|0)<0){break e}D=M(w,344)+b|0;G[D+12>>2]=z;G[D+8>>2]=3;c=D;G[c+52>>2]=258;G[c+56>>2]=1;G[c+4>>2]=29;G[c>>2]=1033;G[c+20>>2]=v;G[c+16>>2]=y;G[c+60>>2]=1;G[c+64>>2]=1;j=M(y,344)+b|0;G[c+56>>2]=G[j+56>>2];G[c+60>>2]=G[j+60>>2];p=G[j+60>>2];m:{if((p|0)<=0){break m}f=0;c=0;if(p-1>>>0>=3){o=p&-4;g=0;while(1){l=(M(w,344)+b|0)- -64|0;e=c<<2;i=(M(y,344)+b|0)- -64|0;G[l+e>>2]=G[i+e>>2];r=e|4;G[r+l>>2]=G[i+r>>2];r=e|8;G[r+l>>2]=G[i+r>>2];e=e|12;G[e+l>>2]=G[e+i>>2];c=c+4|0;g=g+4|0;if((o|0)!=(g|0)){continue}break}}g=p&3;if(!g){break m}while(1){e=c<<2;G[(e+(M(w,344)+b|0)|0)- -64>>2]=G[(e+(M(y,344)+b|0)|0)- -64>>2];c=c+1|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}c=G[(M(v,344)+b|0)+56>>2];n:{if((c|0)<=G[j+56>>2]){break n}G[D+56>>2]=c;c=M(v,344)+b|0;G[D+60>>2]=G[c+60>>2];j=G[c+60>>2];if((j|0)<=0){break n}f=0;c=0;if(j-1>>>0>=3){i=j&-4;g=0;while(1){p=(M(w,344)+b|0)- -64|0;e=c<<2;l=(M(v,344)+b|0)- -64|0;G[p+e>>2]=G[l+e>>2];o=e|4;G[o+p>>2]=G[l+o>>2];o=e|8;G[o+p>>2]=G[l+o>>2];e=e|12;G[e+p>>2]=G[e+l>>2];c=c+4|0;g=g+4|0;if((i|0)!=(g|0)){continue}break}}g=j&3;if(!g){break n}while(1){e=c<<2;G[(e+(M(w,344)+b|0)|0)- -64>>2]=G[(e+(M(v,344)+b|0)|0)- -64>>2];c=c+1|0;f=f+1|0;if((g|0)!=(f|0)){continue}break}}c=M(z,344)+b|0;G[c>>2]=-1e3;G[c+4>>2]=0;G[n+268>>2]=0;G[n+264>>2]=0;g=H[d|0];if(g){if((g|0)!=32){f=d;break g}while(1){g=H[d+1|0];f=d+1|0;d=f;if((g|0)==32){continue}break}break g}c=Wj(M(y,344)+b|0);G[n+268>>2]=c;g=Wj(M(v,344)+b|0);G[n+264>>2]=g;if((c|g)>=0){break f}if(!G[309737]){G[309737]=431}a=n+272|0;bb(a,136665,80);E[n+351|0]=0;Ua(a);a=G[309723];if(!a){break a}G[309723]=a-1;break a}G[309737]=113;I=-1;break a}G[309737]=113;break a}c=f;o:{while(1){p:{q:{r:{d=g&255;switch(d-32|0){case 0:case 12:break p;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:break q;default:break r}}if(!d){break o}}g=H[c+1|0];c=c+1|0;continue}break}E[c|0]=0;c=c+1|0}while(1){d=H[c|0];if((d|0)!=32){if(!d){if(!G[309737]){G[309737]=431}a=n+272|0;bb(a,136503,80);E[n+351|0]=0;Ua(a);a=G[309723];if(!a){break a}G[309723]=a-1;break a}dc(G[309712],0,f,n+268|0,1238948);dc(G[309712],0,c,n+264|0,1238948);if(!G[309737]){g=G[n+264>>2];c=G[n+268>>2];break f}a=n+272|0;bb(a,136584,80);E[n+351|0]=0;Ua(a);a=G[309723];if(!a){break a}G[309723]=a-1;break a}else{c=c+1|0;continue}}}G[n+272>>2]=0;s:{if((c|0)<=0|(g|0)<=0){break s}G[n+260>>2]=0;Bn(G[309712],c,g,n+280|0,n+288|0,n+296|0,n+304|0,n+312|0,n+320|0,n+328|0,n+336|0,n+260|0);c=G[n+260>>2];if(c){if((c|0)==505){G[n+272>>2]=0;break s}G[309737]=c;a=G[309723];if(!a){break a}G[309723]=a-1;break a}G[n+272>>2]=1}c=a;a=n+272|0;x=n+256|0;e=0;F=Fa-16|0;Fa=F;G[F+8>>2]=0;if(!G[309737]){rh();t:{if(ch(F+12|0,c,0,F+8|0)){qh();o=a;m=x;t=Fa-32|0;Fa=t;u:{if(G[309737]){break u}v:{q=ab(80);if(!q){break v}G[q>>2]=0;G[q+4>>2]=0;w:{if(!(!o|!G[o>>2])){bb(q+8|0,o,72);break w}G[q+8>>2]=0}d=ab(512);if(!d){Wa(q);break v}C=ac(c,13287);if(!C){G[t>>2]=c;Ya(d,512,42961,t);Ua(d);Wa(d);Wa(q);G[309737]=104;break u}G[309737]=104;p=512;x:{y:{z:{A:{if(vc(d,512,C)){J=o- -64|0;while(1){G[309737]=0;a=d;f=Va(a);c=p;B:{if((f|0)!=(c-1|0)){break B}while(1){if(H[(a+f|0)-1|0]==10){p=c;d=a;break B}p=c<<1;d=ub(a,p);if(!d){x=113;c=42507;d=a;break z}g=d+f|0;vc(g,c+1|0,C);a=d;f=Va(g)+f|0;c=p;if((f|0)==(c-1|0)){continue}break}}f=d;C:{if(H[f|0]==35){while(1){a=f;f=a+1|0;c=E[a+1|0];if((c|0)==32|c-9>>>0<5){continue}break}if(gc(f,36648,7)){break C}x=431;if(G[q>>2]){c=42785;break z}a=a+8|0;while(1){c=a;a=c+1|0;f=E[c|0];if((f|0)==32|f-9>>>0<5){continue}break}if(!gc(c,16895,5)){e=0;break C}if(!gc(c,25131,6)){e=1;break C}e=2;if(!gc(c,5783,6)){break C}if(!gc(c,6871,3)){break C}c=43851;break z}if(!gc(d,30820,4)|!H[d|0]){break C}while(1){a=f;g=0;i=1;j=e;while(1){x=431;if(G[309737]){c=22021;break z}c=E[f|0];if(!c){c=22021;break z}D:{E:{F:{G:{H:{switch(c-10|0){default:if((c|0)!=100){break G}j=g?1:j;break G;case 30:c=0;E[f|0]=0;f=f+1|0;if(!g){g=f;break E}G[309737]=1;break E;case 31:E[f|0]=0;f=f+1|0;if(g){break D}G[309737]=1;g=0;break F;case 0:case 25:E[f|0]=0;c=!g;break E;case 48:j=g?2:j;break G;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 26:case 27:case 28:case 29:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:break G;case 34:break H}}i=i+1|0}f=f+1|0}c=0}if(!c){continue}}break}if(G[309737]){c=22021;break z}while(1){c=a;a=c+1|0;e=E[c|0];if((e|0)==32|e-9>>>0<5){continue}break}I:{if(!(e|g)){e=j;break I}J:{K:{if(!gc(c,36333,6)){c=c+6|0;j=0;break K}if(!gc(c,36323,9)){c=c+9|0;j=0;break K}if(!gc(c,36315,7)){c=c+7|0;j=0;break K}L:{if(!gc(c,36380,4)){break L}if(!gc(c,36375,4)){break L}if(!gc(c,36309,5)){c=c+5|0;j=1;break K}e=1;if(!gc(c,40249,3)){break I}if(!gc(c,40333,3)){break I}if(!gc(c,6487,4)){break I}e=0;if(!gc(c,25125,5)){break I}if(!gc(c,16977,8)){break I}if(!gc(c,36350,9)){f=28258;break J}if(gc(c,36340,9)){break K}f=28216;break J}c=c+4|0;j=1}e=j;a=G[q+4>>2];r=G[q>>2];if(!((r|0)%10|0)){M:{if(a){a=ub(a,M(r,168)+1680|0);break M}a=ab(1680)}if(!a){x=113;c=30900;break z}G[q+4>>2]=a;r=G[q>>2]}G[q>>2]=r+1;k=M(r,168)+a|0;a=k;G[a+48>>2]=0;G[a+52>>2]=0;G[a+4>>2]=0;E[a|0]=1;G[a+56>>2]=0;G[a+60>>2]=0;a=a- -64|0;G[a>>2]=0;G[a+4>>2]=0;G[k+72>>2]=0;G[k+76>>2]=0;G[k+80>>2]=0;G[k+84>>2]=0;G[k+88>>2]=0;G[k+92>>2]=0;G[k+96>>2]=0;G[k+100>>2]=0;G[k+104>>2]=0;G[k+108>>2]=0;G[k+136>>2]=0;G[k+140>>2]=0;G[k+144>>2]=0;G[k+148>>2]=0;G[k+152>>2]=0;G[k+156>>2]=0;G[k+160>>2]=0;G[k+164>>2]=0;l=k+48|0;while(1){a=c;c=c+1|0;j=E[a|0];if((j|0)==32|j-9>>>0<5){continue}break}N:{switch((j&255)-43|0){case 2:E[k|0]=0;case 0:a=c;break;default:break N}}while(1){c=a;a=c+1|0;j=E[c|0];if((j|0)==32|j-9>>>0<5){continue}break}if(!j){c=22021;break z}a=Va(c)-1|0;r=c+a|0;j=E[r|0];if((j|0)==32|j-9>>>0<5){while(1){E[r|0]=0;a=a-1|0;r=c+a|0;j=E[r|0];if((j|0)==32|j-9>>>0<5){continue}break}}O:{P:{Q:{R:{S:{T:{U:{if(!Ib(c,22631)){h=2;G[k+4>>2]=2;if((i|0)!=3){break U}break R}if(!Ib(c,5443)){G[k+4>>2]=3;h=2;if((i|0)!=4){break U}break R}if(!Ib(c,20708)){if(i-9>>>0<4294967291){break U}if(i>>>0<=5){G[k+4>>2]=4;G[l+32>>2]=0;G[l+36>>2]=0;break S}G[k+4>>2]=5;G[l+56>>2]=0;G[l+60>>2]=0;G[l+48>>2]=0;G[l+52>>2]=0;break S}if(!Ib(c,5437)){G[k+4>>2]=5;V:{switch(i-6|0){default:G[309737]=431;break;case 0:case 2:break V}}G[l+48>>2]=0;G[l+52>>2]=0;G[l+56>>2]=0;G[l+60>>2]=0;break S}W:{if(Ib(c,3720)){if(Ib(c,3717)){break W}}if(i-9>>>0<4294967291){break U}if(i>>>0<=5){G[k+4>>2]=6;G[l+32>>2]=0;G[l+36>>2]=0;break S}G[k+4>>2]=7;G[l+56>>2]=0;G[l+60>>2]=0;G[l+48>>2]=0;G[l+52>>2]=0;break S}X:{if(Ib(c,22621)){if(Ib(c,22618)){break X}}G[k+4>>2]=8;if(i-6>>>0<=4294967293){G[309737]=431}G[l+32>>2]=0;G[l+36>>2]=0;h=4;break R}Y:{Z:{if(!Ib(c,26591)){break Z}if(!Ib(c,26588)){break Z}if(!Ib(c,5463)){break Z}if(Ib(c,5460)){break Y}}G[k+4>>2]=9;if(i-6>>>0<=4294967293){G[309737]=431}G[l+32>>2]=0;G[l+36>>2]=0;break S}_:{if(Ib(c,10502)){if(Ib(c,23667)){break _}}G[k+4>>2]=10;h=2;if((i|0)!=4){break U}break R}if(!Ib(c,4710)){G[k+4>>2]=0;h=2;if((i|0)!=2){break U}break R}if(!Ib(c,21330)){G[k+4>>2]=1;h=4;if((i|0)!=4){break U}break R}if(!Ib(c,15727)){G[k+4>>2]=11;if(i&1|(i|0)<6){break U}if(G[309737]){break Q}a=ab(i<<3);G[l+4>>2]=a;if(a){break P}x=113;c=6073;break z}if(Ib(c,31649)){break T}G[k+4>>2]=12;h=2;if((i|0)==8){break R}}G[309737]=431;break Q}$:{aa:{if(!Ib(c,31634)){G[k+4>>2]=13;if(i-12>>>0<=4294967293){break aa}break $}if(Ib(c,31648)){f=38036;break J}G[k+4>>2]=14;if(i-12>>>0>4294967293){break $}}G[309737]=431}G[l+80>>2]=0;G[l+84>>2]=0}h=2}if(!G[309737]){break O}}Ua(15597);Ua(c);break A}G[l>>2]=i;h=i;l=a}j=0;while(1){a=g;while(1){c=a;a=c+1|0;if(H[c|0]!=44){continue}break}E[c|0]=0;r=a;while(1){c=H[r|0];if(!(!c|(c|0)==44)){r=r+1|0;continue}break}E[r|0]=0;ba:{ca:{if(jb(g,58)){s=0;c=0;e=nc(g,t+28|0,10);g=G[t+28>>2];da:{if(!g|H[g|0]!=58){break da}c=nc(g+1|0,t+28|0,10);g=G[t+28>>2];if(!g|H[g|0]!=58){break da}s=sb(g+1|0)}s=s/3600+(+(c|0)/60+ +(e|0));while(1){c=a;a=c+1|0;g=E[c|0];if((g|0)==32|g-9>>>0<5){continue}break}u=0;a=0;c=nc(c+((g|0)==45)|0,t+28|0,10);e=G[t+28>>2];ea:{if(!e|H[e|0]!=58){break ea}a=nc(e+1|0,t+28|0,10);e=G[t+28>>2];if(!e|H[e|0]!=58){break ea}u=sb(e+1|0)}s=s*15;u=(g|0)==45?+(0-c|0)+ +(a|0)/-60+u/-3600:u/3600+(+(a|0)/60+ +(c|0));A=j?A:u;B=j?B:s;e=2;break ca}s=sb(g);B=j?B:s;u=sb(a);A=j?A:u;if(e){break ca}e=0;break ba}x=505;c=42685;if(!o|!G[o>>2]){break z}if(ri(s,u,L[o+8>>3],L[o+16>>3],L[o+24>>3],L[o+32>>3],L[o+40>>3],L[o+48>>3],L[o+56>>3],J,t+16|0,t+8|0)){Ua(42739);break A}u=L[t+8>>3];s=L[t+16>>3]}g=r+1|0;a=j<<3;L[a+l>>3]=s;L[(a|8)+l>>3]=u;j=j+2|0;if((h|0)>(j|0)){continue}break}if((i|0)>(j|0)){while(1){a=g;while(1){c=H[a|0];if(!(!c|(c|0)==44)){a=a+1|0;continue}break}E[a|0]=0;r=(j<<3)+l|0;u=vb(g,t+28|0);L[r>>3]=u;c=G[t+28>>2];fa:{if(!c){break fa}ga:{ha:{c=H[c|0];switch(c-34|0){case 1:case 2:case 3:case 4:break fa;case 0:case 5:break ga;default:break ha}}if((c|0)!=100){break fa}}u=u/((c|0)==39?60:(c|0)==34?3600:1);if(ri(B,A+(A<0?u:-u),L[o+8>>3],L[o+16>>3],L[o+24>>3],L[o+32>>3],L[o+40>>3],L[o+48>>3],L[o+56>>3],J,t+16|0,t+8|0)){Ua(42739);break A}u=L[t+16>>3]-L[l>>3];s=u*u;u=L[t+8>>3]-L[l+8>>3];L[r>>3]=V(s+u*u)}g=a+1|0;j=j+1|0;if((i|0)!=(j|0)){continue}break}}a=G[k+4>>2];ia:{ja:{if((a|0)!=5){if((a|0)!=7){break ia}if((i|0)==7){break ja}break ia}if((i|0)!=7){break ia}}L[l+56>>3]=L[l+48>>3]}ka:{if(!e){break ka}c=4;x=3;r=2;la:{ma:{na:{switch(a-4|0){case 1:case 3:x=7;r=6;break ma;case 0:case 2:case 4:case 5:break la;case 6:case 8:break ma;case 9:case 10:break na;default:break ka}}L[l+16>>3]=L[o+56>>3]+L[l+16>>3];x=10;r=3}a=(r<<3)+l|0;L[a>>3]=L[o+56>>3]+L[a>>3];c=x}a=(c<<3)+l|0;L[a>>3]=L[o+56>>3]+L[a>>3]}yn(k);if(H[f|0]){continue}break C}Ua(f);break z}if(H[f|0]){continue}break}}if(vc(d,p,C)){continue}break}}c=0;g=G[q>>2];oa:{if((g|0)<=0){break oa}while(1){a=c;e=G[q+4>>2];pa:{if(H[e+M(c,168)|0]){break pa}while(1){f=a;if((a|0)<2){break pa}a=f-1|0;if(!H[e+M(a,168)|0]){continue}break}g=f-2|0;while(1){a=G[q+4>>2];if(H[a+M(g,168)|0]){f=ub(a,M(G[q>>2],168)+168|0);G[q+4>>2]=f;a=G[q>>2];G[q>>2]=a+1;e=g+1|0;if((e|0)<(a|0)){while(1){f=G[q+4>>2]+M(a,168)|0;bb(f,f-168|0,168);a=a-1|0;if((e|0)<(a|0)){continue}break}f=G[q+4>>2]}c=c+1|0;bb(M(e,168)+f|0,M(c,168)+f|0,168)}a=(g|0)>0;g=g-1|0;if(a){continue}break}g=G[q>>2]}c=c+1|0;if((g|0)>(c|0)){continue}break}if((g|0)<=0){break oa}e=G[q+4>>2];f=0;a=0;if((g|0)!=1){j=g&-2;c=0;while(1){p=e+M(a,168)|0;f=(H[p|0]!=0)+f|0;G[p+8>>2]=f;p=e+M(a|1,168)|0;f=f+(H[p|0]!=0)|0;G[p+8>>2]=f;a=a+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!(g&1)){break oa}a=e+M(a,168)|0;G[a+8>>2]=(H[a|0]!=0)+f}}if(G[309737]){break y}G[m>>2]=q;break x}Ua(c);G[309737]=x}qi(q)}Hb(C);Wa(d);break u}Ua(42507);G[309737]=113}Fa=t+32|0;break t}k=G[F+12>>2];i=a;a=Fa-624|0;Fa=a;h=bb(a,123296,426);qa:{if(G[309737]){break qa}q=ab(80);if(!q){Ua(42507);G[309737]=113;break qa}G[q>>2]=0;G[q+4>>2]=0;ra:{if(!(!i|!G[i>>2])){bb(q+8|0,i,72);break ra}G[q+8>>2]=0}G[h+580>>2]=0;c=h+592|0;a=h+580|0;dc(k,0,h,c,a);d=h+71|0;f=c|4;dc(k,0,d,f,a);g=h+142|0;j=c|8;dc(k,0,g,j,a);p=h+213|0;l=c|12;dc(k,0,p,l,a);o=h+284|0;r=h+608|0;dc(k,0,o,r,a);sa:{ta:{ua:{va:{if(G[h+580>>2]){c=43172;if(Je(k,2,34525,1,1238948)){break va}}c=44284;if(Cb(k,31,40853,q,h+432|0,1238948)){break va}a=ab(M(G[q>>2],168));G[q+4>>2]=a;if(!a){a=30900;break ta}c=43299;if(dc(k,0,h,h+592|0,1238948)){break va}if(dc(k,0,d,f,1238948)){break va}if(dc(k,0,g,j,1238948)){break va}if(dc(k,0,p,l,1238948)){break va}if(dc(k,0,o,r,1238948)){break va}K=dc(k,0,h+355|0,h+612|0,1238948);r=1;wa:{if(!G[q+8>>2]){break wa}e=ab(72);if(!e){a=30942;break ta}G[e>>2]=1;a=e- -64|0;if(Bn(k,G[h+592>>2],G[h+596>>2],e+8|0,e+16|0,e+24|0,e+32|0,e+40|0,e+48|0,e+56|0,a,1238948)){G[e>>2]=0;G[309737]=0;break wa}if(!G[e>>2]|!G[i>>2]){break wa}xa:{if(O(L[e+8>>3]-L[i+8>>3])>1e-6|O(L[e+16>>3]-L[i+16>>3])>1e-6|(O(L[e+24>>3]-L[i+24>>3])>1e-6|O(L[e+32>>3]-L[i+32>>3])>1e-6)){break xa}if(O(L[e+40>>3]-L[i+40>>3])>1e-6|O(L[e+48>>3]-L[i+48>>3])>1e-6|O(L[e+56>>3]-L[i+56>>3])>1e-6){break xa}if(Xa(a,i- -64|0)){break wa}}r=0}c=43261;if(Zf(k,G[h+592>>2],1,h+588|0,h+544|0,1238948)){break va}if(Zf(k,G[h+596>>2],1,h+588|0,h+544|4,1238948)){break va}if(Zf(k,G[h+600>>2],1,h+588|0,h+544|8,1238948)){break va}if(Zf(k,G[h+604>>2],1,h+588|0,h+544|12,1238948)){break va}if(Zf(k,G[h+608>>2],1,h+588|0,h+560|0,1238948)){break va}if(Zf(k,G[h+612>>2],1,h+588|0,h+564|0,1238948)){break va}N=h,P=ab(72),G[N+508>>2]=P;if(G[q>>2]<=0){break ua}C=i- -64|0;J=e- -64|0;t=1;g=0;while(1){m=G[q+4>>2]+M(t-1|0,168)|0;a=m;G[a+48>>2]=0;G[a+52>>2]=0;G[a+104>>2]=0;G[a+108>>2]=0;G[a+96>>2]=0;G[a+100>>2]=0;G[a+88>>2]=0;G[a+92>>2]=0;G[a+80>>2]=0;G[a+84>>2]=0;G[a+72>>2]=0;G[a+76>>2]=0;a=a- -64|0;G[a>>2]=0;G[a+4>>2]=0;G[m+56>>2]=0;G[m+60>>2]=0;G[m+136>>2]=0;G[m+140>>2]=0;G[m+144>>2]=0;G[m+148>>2]=0;G[m+152>>2]=0;G[m+156>>2]=0;G[m+160>>2]=0;G[m+164>>2]=0;if(Df(k,G[h+600>>2],t,g,68332,h+508|0,h+584|0,1238948)){c=43829;break va}E[m|0]=1;c=G[h+508>>2];if(H[c|0]==33){E[m|0]=0;c=c+1|0}if(!Xa(c,123728)){G[m+4>>2]=0}if(!Xa(c,123799)){G[m+4>>2]=2}if(!Xa(c,123870)){G[m+4>>2]=4}if(!Xa(c,123941)){G[m+4>>2]=3}if(!Xa(c,124012)){G[m+4>>2]=5}if(!Xa(c,124083)){G[m+4>>2]=6}if(!Xa(c,124154)){G[m+4>>2]=6}if(!Xa(c,124225)){G[m+4>>2]=7}if(!Xa(c,124296)){G[m+4>>2]=8}if(!Xa(c,124367)){G[m+4>>2]=8}if(!Xa(c,124438)){G[m+4>>2]=11}if(!Xa(c,124509)){G[m+4>>2]=10}if(!Xa(c,124580)){G[m+4>>2]=10}if(!Xa(c,124651)){G[m+4>>2]=9}if(!Xa(c,124722)){G[m+4>>2]=9}if(!Xa(c,124793)){G[m+4>>2]=9}o=m+48|0;ya:{za:{Aa:{if(!Xa(c,124864)){G[m+4>>2]=9;j=1;break Aa}a=G[m+4>>2];if((a|0)==11){a=lb(G[h+544>>2]<<1,8);G[o+4>>2]=a;if(!a){a=6073;break ta}j=G[h+544>>2];G[o>>2]=j<<1;if((j|0)>0){break za}c=a;break ya}j=(a|0)==8?2:1}a=o}p=0;d=0;while(1){l=d;f=p;c=f+1|0;d=c?l:l+1|0;p=c;c=a;if(Hf(k,G[h+592>>2],t,g,p,d,1,0,-91191291391491e-49,c,h+584|0,1238948)){Ua(15684);break ua}Ba:{Ca:{if(L[c>>3]==-91191291391491e-49){break Ca}if(Hf(k,G[h+596>>2],t,g,p,d,1,0,-91191291391491e-49,c+8|0,h+584|0,1238948)){Ua(15641);break ua}s=L[c+8>>3];if(s==-91191291391491e-49){break Ca}a=c+16|0;B=L[c>>3];if(!(f|l)){u=B;A=s;break Ba}if(u!=B|s!=A){break Ba}f=p;c=a}j=f;G[o>>2]=f<<1;break ya}if((j|0)!=(p|0)|d){continue}break}c=a}Da:{if(r){break Da}a=0;d=c-(j<<4)|0;A=L[d+8>>3];u=L[d>>3];if((j|0)<=0){break Da}while(1){Ea:{f=d+(a<<4)|0;p=f+8|0;zn(L[f>>3],L[p>>3],L[e+8>>3],L[e+16>>3],L[e+24>>3],L[e+32>>3],L[e+40>>3],L[e+48>>3],L[e+56>>3],J,h+520|0,h+512|0);ri(L[h+520>>3],L[h+512>>3],L[i+8>>3],L[i+16>>3],L[i+24>>3],L[i+32>>3],L[i+40>>3],L[i+48>>3],L[i+56>>3],C,f,p);if(G[309737]){break Ea}a=a+1|0;if((j|0)!=(a|0)){continue}break Da}break}Ua(7470);break ua}a=G[m+4>>2];d=a-2|0;if(!(d>>>0>8|!(447>>>d&1))){d=G[(d<<2)+124936>>2];if(Hf(k,G[h+604>>2],t,g,1,0,d,0,0,c,h+584|0,1238948)){Ua(15522);break ua}Fa:{if(!r){a=0;while(1){s=L[c>>3];L[h+536>>3]=u;s=A+s;L[h+528>>3]=s;zn(u,s,L[e+8>>3],L[e+16>>3],L[e+24>>3],L[e+32>>3],L[e+40>>3],L[e+48>>3],L[e+56>>3],J,h+520|0,h+512|0);ri(L[h+520>>3],L[h+512>>3],L[i+8>>3],L[i+16>>3],L[i+24>>3],L[i+32>>3],L[i+40>>3],L[i+48>>3],L[i+56>>3],C,h+536|0,h+528|0);if(G[309737]){Ua(7470);break ua}s=L[h+536>>3]-L[o>>3];B=s*s;s=L[h+528>>3]-L[o+8>>3];L[c>>3]=V(B+s*s);c=c+8|0;a=a+1|0;if((d|0)!=(a|0)){continue}break}break Fa}c=(d<<3)+c|0}a=G[m+4>>2]}a=a-4|0;Ga:{if(a>>>0>6|!(111>>>a&1)){break Ga}d=G[(a<<2)+124972>>2];if(Hf(k,G[h+608>>2],t,g,1,0,d,0,0,c,h+584|0,1238948)){Ua(15557);break ua}if(r){break Ga}s=L[i+56>>3]-L[e+56>>3];if(d-1>>>0>=3){f=d&-4;a=0;while(1){L[c>>3]=s+L[c>>3];L[c+8>>3]=s+L[c+8>>3];L[c+16>>3]=s+L[c+16>>3];L[c+24>>3]=s+L[c+24>>3];c=c+32|0;a=a+4|0;if((f|0)!=(a|0)){continue}break}}d=d&3;a=0;while(1){L[c>>3]=s+L[c>>3];c=c+8|0;a=a+1|0;if((d|0)!=(a|0)){continue}break}}Ha:{if(!K){if(!bg(k,31,G[h+612>>2],t,g,1,0,1,0,0,m+8|0,h+584|0,1238948)){break Ha}Ua(15479);break ua}G[m+8>>2]=1}yn(m);a=G[q>>2];c=a>>>0>t>>>0;a=a>>31;a=c&(a|0)>=(g|0)|(a|0)>(g|0);c=t+1|0;g=c?g:g+1|0;t=c;if(a){continue}break}break ua}Ua(c)}if(G[309737]){qi(q);break sa}G[x>>2]=q;break sa}Ua(a);G[309737]=113;qi(q)}Qb(k,1238948)}Fa=h+624|0}}Fa=F+16|0;if(G[309737]){a=G[309723];if(!a){break a}G[309723]=a-1;break a}G[(M(z,344)+b|0)+88>>2]=G[n+256>>2];a=G[309722];if(G[a+M(y,344)>>2]!=-1e3|G[a+M(v,344)>>2]!=-1e3){break e}Ja[G[D+4>>2]](D)}I=w}Fa=n+352|0;return I}function Se(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){var 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,K=0,N=0,P=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0;t=Fa-29104|0;Fa=t;r=G[p>>2];a:{if(!(g|h)|(r|0)>0){break a}if(o){G[o>>2]=0}if((j|0)==2){cb(n,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,t+29096|0,t+29088|0,t+28992|0,t+29064|0,t+29084|0,t+29080|0,t+29040|0,t+29032|0,t+29060|0,t+29048|0,t+29016|0,t+29076|0,t+29024|0,t+28864|0,p)|0)>0){r=G[p>>2];break a}G[t+29060>>2]=M(G[t+29060>>2],i);R=1;c=G[t+29080>>2];_=c;$=c>>31;b:{if(G[t+29084>>2]!=16){break b}Gd(t+28992|0,t+29072|0,t+29056|0,t+29068|0,p);d=G[t+29068>>2];if((d|0)<=0){break b}if(d-1>>>0>=7){c=d&-8;while(1){R=R*10*10*10*10*10*10*10*10;D=D+8|0;if((c|0)!=(D|0)){continue}break}}c=d&7;if(!c){break b}D=0;while(1){R=R*10;D=D+1|0;if((c|0)!=(D|0)){continue}break}}D=0;f=G[t+29084>>2];c:{d:{if(!(k|l)&(j|0)==1){break d}e=G[t+29028>>2];c=G[t+29024>>2];if(!e&(c|0)==1234554321&((f|0)%10|0)==1){break d}if(!((e-(c>>>0<32768)|0)==-1&c-32768>>>0>=4294901760|(f|0)!=21)){W=0;break c}W=0;if(!(!e&c>>>0<=255|(f|0)!=11)){break c}D=(f|0)==16?H[t+28864|0]==1?0:j:j}W=0;if((f|0)!=81){break c}c=g>>>0<268435455&(h|0)<=0|(h|0)<0;_=c?g:268435455;$=c?h:0;W=!D&L[t+29096>>3]==1&L[t+29088>>3]==0}ba=0-i|0;e=0;f=0;e:{while(1){c=g>>>0<_>>>0&(h|0)<=($|0)|(h|0)<($|0)?g:_;j=c;c=c>>31;B=j;A=c;f:{if((i|0)>=0){d=G[t+29036>>2];z=d;d=G[t+29052>>2]+(d^-1)|0;u=G[t+29032>>2];c=u^-1;j=c+G[t+29048>>2]|0;r=Bu(j,c>>>0>j>>>0?d+1|0:d,i,0);c=Ia;break f}u=G[t+29032>>2];z=G[t+29036>>2];r=Bu(u,z,ba,0);c=Ia}j=G[t+29044>>2];v=G[t+29040>>2];d=Au(G[t+29016>>2],G[t+29020>>2],X,V);q=v+d|0;v=Ia+j|0;v=d>>>0>q>>>0?v+1|0:v;j=z;z=G[t+29060>>2];d=(z|0)/(i|0)|0;d=Au(u,j,d,d>>31);q=d+q|0;j=Ia+v|0;j=d>>>0>q>>>0?j+1|0:j;x=q;v=r+1|0;c=r>>>0>>0&(c|0)<=(A|0)|(c|0)<(A|0);u=c?v:B;g:{h:{i:{j:{k:{l:{m:{n:{o:{c=G[t+29084>>2];switch(c-11|0){case 30:break h;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break i;case 5:break j;case 31:break l;case 10:break m;case 0:break n;default:break o}}p:{switch(c-81|0){case 1:break k;case 0:break p;default:break i}}y=(e<<3)+m|0;Tc(a,x,j,u,z,y,p);if(W){break g}q=G[t+29024>>2];x=G[t+29028>>2];z=e+n|0;K=L[t+29096>>3];N=L[t+29088>>3];c=K==1&N==0x8000000000000000;q:{r:{if(!D){s:{t:{if(c){if((u|0)<=0){break q}w=0;if((u|0)!=1){r=u&-2;B=0;while(1){j=w<<3;d=j+y|0;c=G[d+4>>2];d=G[d>>2];u:{if((c|0)>0|(c|0)>=0){G[p>>2]=-11;d=-1;v=2147483647;break u}v=c^-2147483648}c=j+y|0;G[c>>2]=d;G[c+4>>2]=v;j=(w|1)<<3;d=j+y|0;c=G[d+4>>2];d=G[d>>2];v=c^-2147483648;v:{if((c|0)<0){break v}G[p>>2]=-11;d=-1;v=2147483647}c=j+y|0;G[c>>2]=d;G[c+4>>2]=v;w=w+2|0;B=B+2|0;if((r|0)!=(B|0)){continue}break}}if(!(u&1)){break q}d=y+(w<<3)|0;c=G[d+4>>2];d=G[d>>2];if((c|0)>0|(c|0)>=0){break t}j=c^-2147483648;break s}if(K==1&N==0){break r}w=0;if((u|0)<=0){break q}while(1){w:{x:{d=w<<3;c=d+y|0;s=(+J[c>>2]+ +G[c+4>>2]*4294967296)*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;break x}if(s>0x8000000000000000){G[p>>2]=-11;r=-1;j=2147483647;break w}if(!(O(s)<0x8000000000000000)){break x}r=~~s>>>0;j=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break w}r=0;j=-2147483648}c=d+y|0;G[c>>2]=r;G[c+4>>2]=j;w=w+1|0;if((u|0)!=(w|0)){continue}break}break q}G[p>>2]=-11;d=-1;j=2147483647}c=y+(w<<3)|0;G[c>>2]=d;G[c+4>>2]=j;break q}if(c){if((u|0)<=0){break q}w=0;while(1){r=w<<3;c=r+y|0;d=G[c>>2];j=G[c+4>>2];y:{if((d|0)==(q|0)&(j|0)==(x|0)){G[o>>2]=1;if((D|0)==1){c=r+y|0;G[c>>2]=k;G[c+4>>2]=l;break y}E[w+z|0]=1;break y}if((j|0)>0|(j|0)>=0){G[p>>2]=-11;c=r+y|0;G[c>>2]=-1;G[c+4>>2]=2147483647;break y}c=r+y|0;G[c>>2]=d;G[c+4>>2]=j^-2147483648}w=w+1|0;if((u|0)!=(w|0)){continue}break}break q}if(!(K==1&N==0)){if((u|0)<=0){break q}w=0;while(1){j=w<<3;c=j+y|0;d=G[c>>2];c=G[c+4>>2];z:{if((d|0)==(q|0)&(c|0)==(x|0)){G[o>>2]=1;if((D|0)==1){c=j+y|0;G[c>>2]=k;G[c+4>>2]=l;break z}E[w+z|0]=1;break z}s=(+(d>>>0)+ +(c|0)*4294967296)*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;c=j+y|0;G[c>>2]=0;G[c+4>>2]=-2147483648;break z}if(s>0x8000000000000000){G[p>>2]=-11;c=j+y|0;G[c>>2]=-1;G[c+4>>2]=2147483647;break z}j=j+y|0;A:{if(O(s)<0x8000000000000000){d=~~s>>>0;c=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break A}d=0;c=-2147483648}G[j>>2]=d;G[j+4>>2]=c}w=w+1|0;if((u|0)!=(w|0)){continue}break}break q}if((u|0)<=0){break q}if((D|0)!=1){w=0;if((u|0)!=1){A=u&-2;B=0;while(1){r=w<<3;c=r+y|0;j=G[c>>2];d=G[c+4>>2];B:{if((j|0)==(q|0)&(d|0)==(x|0)){G[o>>2]=1;E[w+z|0]=1;break B}c=r+y|0;G[c>>2]=j;G[c+4>>2]=d}v=w|1;r=v<<3;c=r+y|0;j=G[c>>2];d=G[c+4>>2];C:{if((j|0)!=(q|0)|(d|0)!=(x|0)){c=r+y|0;G[c>>2]=j;G[c+4>>2]=d;break C}G[o>>2]=1;E[v+z|0]=1}w=w+2|0;B=B+2|0;if((A|0)!=(B|0)){continue}break}}if(!(u&1)){break q}r=w<<3;c=r+y|0;j=G[c>>2];d=G[c+4>>2];if((j|0)!=(q|0)|(d|0)!=(x|0)){c=r+y|0;G[c>>2]=j;G[c+4>>2]=d;break q}G[o>>2]=1;E[w+z|0]=1;break q}w=0;if((u|0)!=1){r=u&-2;B=0;while(1){j=w<<3;d=j+y|0;c=G[d>>2];d=G[d+4>>2];if((c|0)==(q|0)&(d|0)==(x|0)){G[o>>2]=1;d=l;c=k}j=j+y|0;G[j>>2]=c;G[j+4>>2]=d;j=(w|1)<<3;d=j+y|0;c=G[d>>2];d=G[d+4>>2];if((c|0)==(q|0)&(d|0)==(x|0)){G[o>>2]=1;d=l;c=k}j=j+y|0;G[j>>2]=c;G[j+4>>2]=d;w=w+2|0;B=B+2|0;if((r|0)!=(B|0)){continue}break}}if(!(u&1)){break q}j=w<<3;d=j+y|0;c=G[d>>2];d=G[d+4>>2];if((c|0)==(q|0)&(d|0)==(x|0)){G[o>>2]=1;d=l;c=k}j=j+y|0;G[j>>2]=c;G[j+4>>2]=d;break q}if((u|0)<=0){break q}v=0;w=0;if(u-1>>>0>=3){r=u&-4;z=0;while(1){A=w<<3;j=A+y|0;d=y+A|0;c=G[d+4>>2];G[j>>2]=G[d>>2];G[j+4>>2]=c;c=A|8;j=c+y|0;d=c+y|0;c=G[d+4>>2];G[j>>2]=G[d>>2];G[j+4>>2]=c;c=A|16;j=c+y|0;d=c+y|0;c=G[d+4>>2];G[j>>2]=G[d>>2];G[j+4>>2]=c;c=A|24;j=c+y|0;d=c+y|0;c=G[d+4>>2];G[j>>2]=G[d>>2];G[j+4>>2]=c;w=w+4|0;z=z+4|0;if((r|0)!=(z|0)){continue}break}}r=u&3;if(!r){break q}while(1){c=w<<3;j=c+y|0;d=c+y|0;c=G[d+4>>2];G[j>>2]=G[d>>2];G[j+4>>2]=c;w=w+1|0;v=v+1|0;if((r|0)!=(v|0)){continue}break}}break g}B=t- -64|0;$d(a,x,j,u,z,B,p);z=H[t+29024|0];c=k;d=l;A=e+n|0;x=(e<<3)+m|0;K=L[t+29096>>3];N=L[t+29088>>3];j=K==1&N==0;D:{E:{if(!D){if(j){break E}q=0;if((u|0)<=0){break D}while(1){c=x+(q<<3)|0;F:{G:{s=+H[q+B|0]*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;break G}if(s>0x8000000000000000){G[p>>2]=-11;j=-1;d=2147483647;break F}if(!(O(s)<0x8000000000000000)){break G}j=~~s>>>0;d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break F}j=0;d=-2147483648}G[c>>2]=j;G[c+4>>2]=d;q=q+1|0;if((u|0)!=(q|0)){continue}break}break D}if(!j){if((u|0)<=0){break D}q=0;while(1){j=H[q+B|0];H:{if((j|0)==(z|0)){G[o>>2]=1;if((D|0)==1){j=x+(q<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break H}E[q+A|0]=1;break H}s=+(j>>>0)*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;j=x+(q<<3)|0;G[j>>2]=0;G[j+4>>2]=-2147483648;break H}if(s>0x8000000000000000){G[p>>2]=-11;j=x+(q<<3)|0;G[j>>2]=-1;G[j+4>>2]=2147483647;break H}v=x+(q<<3)|0;I:{if(O(s)<0x8000000000000000){r=~~s>>>0;j=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break I}r=0;j=-2147483648}G[v>>2]=r;G[v+4>>2]=j}q=q+1|0;if((u|0)!=(q|0)){continue}break}break D}if((u|0)<=0){break D}if((D|0)!=1){q=0;if((u|0)!=1){j=u&-2;w=0;while(1){d=H[q+B|0];J:{if((d|0)==(z|0)){G[o>>2]=1;E[q+A|0]=1;break J}c=x+(q<<3)|0;G[c>>2]=d;G[c+4>>2]=0}c=q|1;d=H[c+B|0];K:{if((d|0)!=(z|0)){c=x+(c<<3)|0;G[c>>2]=d;G[c+4>>2]=0;break K}G[o>>2]=1;E[c+A|0]=1}q=q+2|0;w=w+2|0;if((j|0)!=(w|0)){continue}break}}if(!(u&1)){break D}d=H[q+B|0];if((d|0)!=(z|0)){c=x+(q<<3)|0;G[c>>2]=d;G[c+4>>2]=0;break D}G[o>>2]=1;E[q+A|0]=1;break D}q=0;if((u|0)!=1){A=u&-2;w=0;while(1){v=x+(q<<3)|0;j=H[q+B|0];if((j|0)!=(z|0)){r=0}else{G[o>>2]=1;j=c;r=d}G[v>>2]=j;G[v+4>>2]=r;v=q|1;j=H[v+B|0];if((j|0)!=(z|0)){r=0}else{G[o>>2]=1;j=c;r=d}v=x+(v<<3)|0;G[v>>2]=j;G[v+4>>2]=r;q=q+2|0;w=w+2|0;if((A|0)!=(w|0)){continue}break}}if(!(u&1)){break D}j=H[q+B|0];L:{if((j|0)!=(z|0)){c=j;d=0;break L}G[o>>2]=1}j=x+(q<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break D}if((u|0)<=0){break D}z=0;q=0;if(u-1>>>0>=3){j=u&-4;w=0;while(1){c=x+(q<<3)|0;G[c>>2]=H[q+B|0];G[c+4>>2]=0;d=q|1;c=x+(d<<3)|0;G[c>>2]=H[d+B|0];G[c+4>>2]=0;d=q|2;c=x+(d<<3)|0;G[c>>2]=H[d+B|0];G[c+4>>2]=0;d=q|3;c=x+(d<<3)|0;G[c>>2]=H[d+B|0];G[c+4>>2]=0;q=q+4|0;w=w+4|0;if((j|0)!=(w|0)){continue}break}}d=u&3;if(!d){break D}while(1){c=x+(q<<3)|0;G[c>>2]=H[q+B|0];G[c+4>>2]=0;q=q+1|0;z=z+1|0;if((d|0)!=(z|0)){continue}break}}break g}q=t- -64|0;Pe(a,x,j,u,z,q,p);r=I[t+29024>>1];c=k;d=l;B=e+n|0;y=(e<<3)+m|0;K=L[t+29096>>3];N=L[t+29088>>3];j=K==1&N==0;M:{N:{if(!D){if(j){break N}C=0;if((u|0)<=0){break M}while(1){c=y+(C<<3)|0;O:{P:{s=+F[q+(C<<1)>>1]*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;break P}if(s>0x8000000000000000){G[p>>2]=-11;j=-1;d=2147483647;break O}if(!(O(s)<0x8000000000000000)){break P}j=~~s>>>0;d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break O}j=0;d=-2147483648}G[c>>2]=j;G[c+4>>2]=d;C=C+1|0;if((u|0)!=(C|0)){continue}break}break M}if(!j){if((u|0)<=0){break M}C=0;while(1){j=I[q+(C<<1)>>1];Q:{if((j|0)==(r|0)){G[o>>2]=1;if((D|0)==1){j=y+(C<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break Q}E[B+C|0]=1;break Q}s=+(j<<16>>16)*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;j=y+(C<<3)|0;G[j>>2]=0;G[j+4>>2]=-2147483648;break Q}if(s>0x8000000000000000){G[p>>2]=-11;j=y+(C<<3)|0;G[j>>2]=-1;G[j+4>>2]=2147483647;break Q}A=y+(C<<3)|0;R:{if(O(s)<0x8000000000000000){v=~~s>>>0;j=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break R}v=0;j=-2147483648}G[A>>2]=v;G[A+4>>2]=j}C=C+1|0;if((u|0)!=(C|0)){continue}break}break M}if((u|0)<=0){break M}if((D|0)!=1){C=0;if((u|0)!=1){z=u&-2;x=0;while(1){c=I[q+(C<<1)>>1];S:{if((c|0)==(r|0)){G[o>>2]=1;E[B+C|0]=1;break S}A=c<<16;v=A>>31;d=y+(C<<3)|0;G[d>>2]=A>>16;G[d+4>>2]=v}d=C|1;c=I[q+(d<<1)>>1];T:{if((c|0)!=(r|0)){j=c<<16;A=j>>31;d=y+(d<<3)|0;G[d>>2]=j>>16;G[d+4>>2]=A;break T}G[o>>2]=1;E[d+B|0]=1}C=C+2|0;x=x+2|0;if((z|0)!=(x|0)){continue}break}}if(!(u&1)){break M}c=I[q+(C<<1)>>1];if((c|0)!=(r|0)){v=c<<16;j=v>>31;d=y+(C<<3)|0;G[d>>2]=v>>16;G[d+4>>2]=j;break M}G[o>>2]=1;E[B+C|0]=1;break M}C=0;if((u|0)!=1){B=u&-2;x=0;while(1){z=y+(C<<3)|0;j=I[q+(C<<1)>>1];U:{if((j|0)!=(r|0)){A=j<<16;v=A>>31;A=A>>16;j=v;break U}G[o>>2]=1;A=c;j=d}G[z>>2]=A;G[z+4>>2]=j;z=C|1;j=I[q+(z<<1)>>1];V:{if((j|0)!=(r|0)){j=j<<16;A=j>>31;v=j>>16;j=A;break V}G[o>>2]=1;v=c;j=d}A=y+(z<<3)|0;G[A>>2]=v;G[A+4>>2]=j;C=C+2|0;x=x+2|0;if((B|0)!=(x|0)){continue}break}}if(!(u&1)){break M}j=I[q+(C<<1)>>1];W:{if((j|0)!=(r|0)){v=j<<16;j=v>>31;c=v>>16;d=j;break W}G[o>>2]=1}j=y+(C<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break M}if((u|0)<=0){break M}x=0;C=0;if(u-1>>>0>=3){j=u&-4;z=0;while(1){d=y+(C<<3)|0;c=F[q+(C<<1)>>1];G[d>>2]=c;G[d+4>>2]=c>>31;c=C|1;d=y+(c<<3)|0;c=F[q+(c<<1)>>1];G[d>>2]=c;G[d+4>>2]=c>>31;c=C|2;d=y+(c<<3)|0;c=F[q+(c<<1)>>1];G[d>>2]=c;G[d+4>>2]=c>>31;c=C|3;d=y+(c<<3)|0;c=F[q+(c<<1)>>1];G[d>>2]=c;G[d+4>>2]=c>>31;C=C+4|0;z=z+4|0;if((j|0)!=(z|0)){continue}break}}j=u&3;if(!j){break M}while(1){d=y+(C<<3)|0;c=F[q+(C<<1)>>1];G[d>>2]=c;G[d+4>>2]=c>>31;C=C+1|0;x=x+1|0;if((j|0)!=(x|0)){continue}break}}break g}c=t- -64|0;Uc(a,x,j,u,z,c,p);Zp(c,u,L[t+29096>>3],L[t+29088>>3],D,k,l,e+n|0,o,(e<<3)+m|0,p);break g}c=t- -64|0;Tc(a,x,j,u,z,c,p);Yp(c,u,L[t+29096>>3],L[t+29088>>3],D,k,l,e+n|0,o,(e<<3)+m|0,p);break g}Jb(a,x,j,0,p);d=G[t+29060>>2];c=G[t+29064>>2];X:{if((d|0)==(c|0)){c=M(d,u);ic(a,c,c>>31,t- -64|0,p);break X}Rd(a,c,u,d-c|0,t- -64|0,p)}v=t- -64|0;K=L[t+29096>>3];N=L[t+29088>>3];q=G[t+29064>>2];x=e+n|0;Z=(e<<3)+m|0;U=0;P=Fa-112|0;Fa=P;w=t+28864|0;B=Va(w);if((u|0)>0){while(1){Y:{c=q+v|0;y=H[c|0];E[c|0]=0;j=v;Z:{_:{if(H[w|0]==1){break _}if(fb(w,v,B)){break _}j=c;if(!D){break Z}G[o>>2]=1;if((D|0)==1){d=(U<<3)+Z|0;G[d>>2]=k;G[d+4>>2]=l;break Z}E[x+U|0]=1;break Z}while(1){d=H[j|0];if((d|0)==32){j=j+1|0;continue}break}C=1;$:{switch(d-43|0){case 0:case 2:while(1){r=H[j+1|0];j=j+1|0;if((r|0)==32){continue}break};C=(d|0)==45?-1:1;d=r;break;default:break $}}Y=0;if((d-48&255)>>>0<10){while(1){s=Y*10+ +(d<<24>>24);r=j;while(1){d=H[r+1|0];j=r+1|0;r=j;if((d|0)==32){continue}break}Y=s+-48;if((d-48&255)>>>0<=9){continue}break}}s=R;aa:{ba:{switch(d-44|0){case 0:case 2:break ba;default:break aa}}r=j;while(1){d=H[r+1|0];j=r+1|0;r=j;if((d|0)==32){continue}break}s=1;if((d-48&255)>>>0>=10){break aa}while(1){Y=Y*10+ +(d<<24>>24)+-48;r=j;while(1){d=H[r+1|0];j=r+1|0;r=j;if((d|0)==32){continue}break}s=s*10;if((d-48&255)>>>0<=9){continue}break}}ca:{if((d&254)!=68){aa=1;r=0;break ca}while(1){aa=1;r=j;j=j+1|0;d=H[r+1|0];if((d|0)==32){continue}break}da:{switch(d-43|0){case 0:case 2:r=r+2|0;while(1){j=r;r=j+1|0;A=H[j|0];if((A|0)==32){continue}break};aa=(d|0)==45?-1:1;d=A;break;default:break da}}r=0;if((d-48&255)>>>0>=10){break ca}while(1){A=d;z=M(r,10)-48|0;r=j;while(1){d=H[r+1|0];j=r+1|0;r=j;if((d|0)==32){continue}break}r=z+(A<<24>>24)|0;if((d-48&255)>>>0<=9){continue}break}}if(d){G[P+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);d=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[P+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[P+44>>2]=d;d=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[P+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[P+36>>2]=d;d=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[P+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[P+28>>2]=d;d=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[P+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[P+20>>2]=d;d=P+16|0;Ua(d);G[P>>2]=v;Ya(d,81,43022,P);Ua(d);E[c|0]=y;G[p>>2]=409;break Y}s=Y*+(C|0)/s*$b(10,+(M(r,aa)|0))*K+N;ea:{if(s<-0x8000000000000000){G[p>>2]=-11;d=(U<<3)+Z|0;G[d>>2]=0;G[d+4>>2]=-2147483648;break ea}if(s>0x8000000000000000){G[p>>2]=-11;d=(U<<3)+Z|0;G[d>>2]=-1;G[d+4>>2]=2147483647;break ea}v=(U<<3)+Z|0;fa:{if(O(s)<0x8000000000000000){r=~~s>>>0;d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break fa}r=0;d=-2147483648}G[v>>2]=r;G[v+4>>2]=d}}v=j;E[c|0]=y;U=U+1|0;if((u|0)!=(U|0)){continue}}break}}Fa=P+112|0;break g}G[t>>2]=b;G[t+4>>2]=t+28992;a=t+28896|0;Ya(a,81,8924,t);Ua(a);r=311;if(G[t+29076>>2]==1){break e}r=312;break e}B=t- -64|0;Uc(a,x,j,u,z,B,p);z=G[t+29024>>2];c=k;d=l;A=e+n|0;x=(e<<3)+m|0;K=L[t+29096>>3];N=L[t+29088>>3];j=K==1&N==0;ga:{ha:{if(!D){if(j){break ha}q=0;if((u|0)<=0){break ga}while(1){c=x+(q<<3)|0;ia:{ja:{s=+G[B+(q<<2)>>2]*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;break ja}if(s>0x8000000000000000){G[p>>2]=-11;j=-1;d=2147483647;break ia}if(!(O(s)<0x8000000000000000)){break ja}j=~~s>>>0;d=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break ia}j=0;d=-2147483648}G[c>>2]=j;G[c+4>>2]=d;q=q+1|0;if((u|0)!=(q|0)){continue}break}break ga}if(!j){if((u|0)<=0){break ga}q=0;while(1){j=G[B+(q<<2)>>2];ka:{if((j|0)==(z|0)){G[o>>2]=1;if((D|0)==1){j=x+(q<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break ka}E[q+A|0]=1;break ka}s=+(j|0)*K+N;if(s<-0x8000000000000000){G[p>>2]=-11;j=x+(q<<3)|0;G[j>>2]=0;G[j+4>>2]=-2147483648;break ka}if(s>0x8000000000000000){G[p>>2]=-11;j=x+(q<<3)|0;G[j>>2]=-1;G[j+4>>2]=2147483647;break ka}v=x+(q<<3)|0;la:{if(O(s)<0x8000000000000000){r=~~s>>>0;j=O(s)>=1?~~(s>0?Q(S(s*2.3283064365386963e-10),4294967295):T((s-+(~~s>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break la}r=0;j=-2147483648}G[v>>2]=r;G[v+4>>2]=j}q=q+1|0;if((u|0)!=(q|0)){continue}break}break ga}if((u|0)<=0){break ga}if((D|0)!=1){q=0;if((u|0)!=1){d=u&-2;w=0;while(1){j=G[B+(q<<2)>>2];ma:{if((j|0)==(z|0)){G[o>>2]=1;E[q+A|0]=1;break ma}c=x+(q<<3)|0;G[c>>2]=j;G[c+4>>2]=j>>31}c=q|1;j=G[B+(c<<2)>>2];na:{if((j|0)!=(z|0)){c=x+(c<<3)|0;G[c>>2]=j;G[c+4>>2]=j>>31;break na}G[o>>2]=1;E[c+A|0]=1}q=q+2|0;w=w+2|0;if((d|0)!=(w|0)){continue}break}}if(!(u&1)){break ga}d=G[B+(q<<2)>>2];if((d|0)!=(z|0)){c=x+(q<<3)|0;G[c>>2]=d;G[c+4>>2]=d>>31;break ga}G[o>>2]=1;E[q+A|0]=1;break ga}q=0;if((u|0)!=1){A=u&-2;w=0;while(1){v=x+(q<<3)|0;j=G[B+(q<<2)>>2];oa:{if((j|0)!=(z|0)){r=j>>31;break oa}G[o>>2]=1;j=c;r=d}G[v>>2]=j;G[v+4>>2]=r;v=q|1;j=G[B+(v<<2)>>2];pa:{if((j|0)!=(z|0)){r=j>>31;break pa}G[o>>2]=1;j=c;r=d}v=x+(v<<3)|0;G[v>>2]=j;G[v+4>>2]=r;q=q+2|0;w=w+2|0;if((A|0)!=(w|0)){continue}break}}if(!(u&1)){break ga}j=G[B+(q<<2)>>2];qa:{if((j|0)!=(z|0)){c=j;d=c>>31;break qa}G[o>>2]=1}j=x+(q<<3)|0;G[j>>2]=c;G[j+4>>2]=d;break ga}if((u|0)<=0){break ga}z=0;q=0;if(u-1>>>0>=3){j=u&-4;w=0;while(1){d=x+(q<<3)|0;c=G[B+(q<<2)>>2];G[d>>2]=c;G[d+4>>2]=c>>31;c=q|1;d=x+(c<<3)|0;c=G[B+(c<<2)>>2];G[d>>2]=c;G[d+4>>2]=c>>31;c=q|2;d=x+(c<<3)|0;c=G[B+(c<<2)>>2];G[d>>2]=c;G[d+4>>2]=c>>31;c=q|3;d=x+(c<<3)|0;c=G[B+(c<<2)>>2];G[d>>2]=c;G[d+4>>2]=c>>31;q=q+4|0;w=w+4|0;if((j|0)!=(w|0)){continue}break}}j=u&3;if(!j){break ga}while(1){d=x+(q<<3)|0;c=G[B+(q<<2)>>2];G[d>>2]=c;G[d+4>>2]=c>>31;q=q+1|0;z=z+1|0;if((j|0)!=(z|0)){continue}break}}}r=G[p>>2];if((r|0)>0){s=+(e>>>0)+ +(f|0)*4294967296;R=s+1;s=s+ +(u|0);ra:{if(G[t+29076>>2]>0){G[t+32>>2]=b;L[t+24>>3]=s;L[t+16>>3]=R;Ya(t+28896|0,81,46757,t+16|0);break ra}L[t+56>>3]=s;L[t+48>>3]=R;Ya(t+28896|0,81,46698,t+48|0)}Ua(t+28896|0);r=G[p>>2];break a}v=u>>31;j=u;c=j;h=h-((c>>>0>g>>>0)+v|0)|0;g=g-c|0;if(h|g){c=M(i,u);r=c+G[t+29032>>2]|0;d=G[t+29036>>2]+(c>>31)|0;d=c>>>0>r>>>0?d+1|0:d;c=r;G[t+29032>>2]=c;r=d;G[t+29036>>2]=d;d=e+j|0;j=f+v|0;j=d>>>0>>0?j+1|0:j;e=d;f=j;u=G[t+29052>>2];d=u;q=G[t+29048>>2];if((r|0)>=(d|0)&c>>>0>=q>>>0|(d|0)<(r|0)){j=Bu(c,r,q,u);v=X+j|0;d=Ia;V=V+d|0;V=v>>>0>>0?V+1|0:V;X=v;d=Au(j,d,q,u);G[t+29032>>2]=c-d;G[t+29036>>2]=r-(Ia+(c>>>0>>0)|0);continue}if((r|0)>0|(r|0)>=0){continue}j=Bu(c^-1,r^-1,q,u)+1|0;A=Ia;A=j?A:A+1|0;d=X;X=d-j|0;V=V-((d>>>0>>0)+A|0)|0;d=Au(j,A,q,u)+c|0;j=r+Ia|0;G[t+29032>>2]=d;G[t+29036>>2]=c>>>0>d>>>0?j+1|0:j;continue}break}if((r|0)!=-11){break a}Ua(44994);r=412}G[p>>2]=r}Fa=t+29104|0;return r}function Gm(a,b,c){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,H=0,I=0,J=0,K=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,X=0,Y=0,Z=0,_=0,$=0;F=Fa-80|0;Fa=F;a:{b:{c:{d:{if(b){j=G[a>>2];d=G[a+16>>2];f=G[a+8>>2];y=lb(M(f,f),8);if(y){D=lb(f,8);if(!D){break d}g=143;t=f-1|0;if(!b){break c}z=f&3;r=d&-4;P=d&3;u=(d|0)<=0;U=d-1>>>0>2;while(1){p=g;e:{if(u){break e}i=0;g=0;s=0;if(U){while(1){d=g<<3;n=F+48|0;L[d+n>>3]=L[b>>3];L[n+(d|8)>>3]=L[b+8>>3];L[n+(d|16)>>3]=L[b+16>>3];L[n+(d|24)>>3]=L[b+24>>3];g=g+4|0;b=b+32|0;s=s+4|0;if((r|0)!=(s|0)){continue}break}}if(!P){break e}while(1){L[(F+48|0)+(g<<3)>>3]=L[b>>3];g=g+1|0;b=b+8|0;i=i+1|0;if((P|0)!=(i|0)){continue}break}}$g(a,F+48|0);f:{if(!l){e=1;l=0;break f}e=L[l>>3];l=l+8|0}if(f){h=L[c>>3];d=t;g=y;n=D;o=j;while(1){v=d;k=e*L[o>>3];L[n>>3]=k*h+L[n>>3];s=0;i=f;d=j;if(z){while(1){L[g>>3]=k*L[d>>3]+L[g>>3];g=g+8|0;d=d+8|0;i=i-1|0;s=s+1|0;if((z|0)!=(s|0)){continue}break}}if(t>>>0>=3){while(1){L[g>>3]=k*L[d>>3]+L[g>>3];L[g+8>>3]=k*L[d+8>>3]+L[g+8>>3];L[g+16>>3]=k*L[d+16>>3]+L[g+16>>3];L[g+24>>3]=k*L[d+24>>3]+L[g+24>>3];g=g+32|0;d=d+32|0;i=i-4|0;if(i){continue}break}}d=v-1|0;n=n+8|0;o=o+8|0;if(v){continue}break}}c=c+8|0;g=p-1|0;if(p){continue}break}break b}G[F+4>>2]=65985;G[F>>2]=66133;_a(G[24367],90100,F);break a}G[F+36>>2]=64147;G[F+32>>2]=66156;_a(G[24367],90100,F+32|0);break a}G[F+20>>2]=65960;G[F+16>>2]=66133;_a(G[24367],90100,F+16|0);break a}if(!f){break b}z=f&3;P=f&7;r=f-1|0;while(1){o=g;i=0;d=f;g=j;if(P){while(1){L[g>>3]=L[v>>3];g=g+8|0;v=v+8|0;d=d-1|0;i=i+1|0;if((P|0)!=(i|0)){continue}break}}if(r>>>0>=7){while(1){L[g>>3]=L[v>>3];L[g+8>>3]=L[v+8>>3];L[g+16>>3]=L[v+16>>3];L[g+24>>3]=L[v+24>>3];L[g+32>>3]=L[v+32>>3];L[g+40>>3]=L[v+40>>3];L[g+48>>3]=L[v+48>>3];L[g+56>>3]=L[v+56>>3];g=g- -64|0;v=v- -64|0;d=d-8|0;if(d){continue}break}}g:{if(!l){e=1;l=0;break g}e=L[l>>3];l=l+8|0}h=L[c>>3];d=t;g=y;b=D;n=j;while(1){p=d;k=e*L[n>>3];L[b>>3]=k*h+L[b>>3];s=0;i=f;d=j;if(z){while(1){L[g>>3]=k*L[d>>3]+L[g>>3];g=g+8|0;d=d+8|0;i=i-1|0;s=s+1|0;if((z|0)!=(s|0)){continue}break}}if(r>>>0>=3){while(1){L[g>>3]=k*L[d>>3]+L[g>>3];L[g+8>>3]=k*L[d+8>>3]+L[g+8>>3];L[g+16>>3]=k*L[d+16>>3]+L[g+16>>3];L[g+24>>3]=k*L[d+24>>3]+L[g+24>>3];g=g+32|0;d=d+32|0;i=i-4|0;if(i){continue}break}}d=p-1|0;b=b+8|0;n=n+8|0;if(p){continue}break}g=o-1|0;c=c+8|0;if(o){continue}break}}S=Fa-32|0;Fa=S;d=0;i=Fa-16|0;Fa=i;h:{i:{j:{k:{n=ab(f<<3);if(n){if((f|0)<=0){break j}while(1){l=M(d,f);o=n+(d<<3)|0;l:{if(!d){b=0;while(1){e=L[(b+l<<3)+y>>3];m:{if(!b){if(e<=0){break i}L[o>>3]=V(e);break m}L[(M(b,f)<<3)+y>>3]=e/L[o>>3]}b=b+1|0;if((f|0)!=(b|0)){continue}break}break l}p=d&1;g=d-1|0;v=(g+l<<3)+y|0;c=d;while(1){t=M(c,f);e=L[(c+l<<3)+y>>3];if(p){e=e-L[v>>3]*L[(g+t<<3)+y>>3];b=g}else{b=d}if((d|0)!=1){while(1){j=b-1|0;k=e-L[(j+l<<3)+y>>3]*L[(j+t<<3)+y>>3];j=b-2|0;e=k-L[(j+l<<3)+y>>3]*L[(j+t<<3)+y>>3];s=(b|0)>2;b=j;if(s){continue}break}}n:{if((c|0)==(d|0)){if(e<=0){break i}L[o>>3]=V(e);break n}L[(d+t<<3)+y>>3]=e/L[o>>3]}c=c+1|0;if((f|0)!=(c|0)){continue}break}}d=d+1|0;if((f|0)!=(d|0)){continue}break}break k}G[i+4>>2]=65812;G[i>>2]=66133;_a(G[24367],90100,i);ca(-1);W()}j=0;if((f|0)<=0){break j}while(1){g=j<<3;l=g+D|0;e=L[l>>3];o:{if(!j){break o}d=M(f,j);p:{if(!(j&1)){b=j;break p}b=j-1|0;e=e-L[(d+b<<3)+y>>3]*L[(b<<3)+D>>3]}if((j|0)==1){break o}while(1){c=b-1|0;k=e-L[(c+d<<3)+y>>3]*L[(c<<3)+D>>3];c=b-2|0;e=k-L[(c+d<<3)+y>>3]*L[(c<<3)+D>>3];o=(b|0)>2;b=c;if(o){continue}break}}L[l>>3]=e/L[g+n>>3];j=j+1|0;if((j|0)!=(f|0)){continue}break}j=0;if((f|0)<=0){break j}c=f;while(1){d=c;c=c-1|0;g=c<<3;l=g+D|0;e=L[l>>3];q:{if((d|0)>=(f|0)){break q}if(j&1){e=e-L[(M(d,f)+c<<3)+y>>3]*L[(d<<3)+D>>3];b=d+1|0}else{b=d}if((j|0)==1){break q}while(1){o=b+1|0;e=e-L[(M(b,f)+c<<3)+y>>3]*L[(b<<3)+D>>3]-L[(M(o,f)+c<<3)+y>>3]*L[(o<<3)+D>>3];b=b+2|0;if((f|0)!=(b|0)){continue}break}}L[l>>3]=e/L[g+n>>3];j=j+1|0;if((d|0)>1){continue}break}}Wa(n);b=0;break h}Wa(n);b=-1}Fa=i+16|0;r:{s:{t:{if(b){b=f<<3;U=ab(M(b,f));if(!U){break t}$=ab(b);if(!$){break s}s=y;v=U;t=$;r=0;J=Fa+-64|0;Fa=J;u:{v:{w:{b=f<<3;H=ab(b);if(H){x:{y:{P=ab(b);if(P){if((f|0)>0){break y}z=f-1|0;break x}G[J+36>>2]=65810;G[J+32>>2]=66133;_a(G[24367],90100,J+32|0);break v}u=f-2|0;E=f-1|0;Q=f+1|0;while(1){i=r;w=i<<3;K=w+H|0;L[K>>3]=q*m;r=i+1|0;n=f-r|0;q=0;m=0;g=f-i|0;z:{if((g|0)<=0){break z}d=0;b=g;j=(M(i,Q)<<3)+s|0;c=j;l=f-i&3;if(l){while(1){b=b-1|0;m=m+O(L[c>>3]);c=c+8|0;d=d+1|0;if((l|0)!=(d|0)){continue}break}}A=E-i>>>0<3;if(!A){while(1){m=m+O(L[c>>3])+O(L[c+8>>3])+O(L[c+16>>3])+O(L[c+24>>3]);c=c+32|0;b=b-4|0;if(b){continue}break}}if(m==0){break z}e=0;c=j;b=g;if(b&1){e=L[j>>3]/m;L[j>>3]=e;c=j+8|0;e=e*e+0;b=g-1|0}if((i|0)!=(E|0)){while(1){k=L[c>>3]/m;L[c>>3]=k;h=L[c+8>>3]/m;L[c+8>>3]=h;e=h*h+(k*k+e);c=c+16|0;b=b-2|0;if(b){continue}break}}k=O(V(e));x=k;C=-k;k=L[j>>3];h=k>=0?x:C;L[j>>3]=k+h;q=-h;if(n){k=k*q-e;p=w+((M(f,r)<<3)+s|0)|0;o=g&3;z=n;while(1){l=0;h=0;d=g;c=p;b=j;if(o){while(1){d=d-1|0;h=L[c>>3]*L[b>>3]+h;c=c+8|0;b=b+8|0;l=l+1|0;if((o|0)!=(l|0)){continue}break}}if(!A){while(1){h=L[c+24>>3]*L[b+24>>3]+(L[c+16>>3]*L[b+16>>3]+(L[c+8>>3]*L[b+8>>3]+(L[c>>3]*L[b>>3]+h)));b=b+32|0;c=c+32|0;d=d-4|0;if(d){continue}break}}e=h/k;l=0;d=g;c=p;b=j;if(o){while(1){L[c>>3]=e*L[b>>3]+L[c>>3];c=c+8|0;b=b+8|0;d=d-1|0;l=l+1|0;if((o|0)!=(l|0)){continue}break}}if(!A){while(1){L[c>>3]=e*L[b>>3]+L[c>>3];L[c+8>>3]=e*L[b+8>>3]+L[c+8>>3];L[c+16>>3]=e*L[b+16>>3]+L[c+16>>3];L[c+24>>3]=e*L[b+24>>3]+L[c+24>>3];c=c+32|0;b=b+32|0;d=d-4|0;if(d){continue}break}}p=(f<<3)+p|0;z=z-1|0;if(z){continue}break}}c=0;b=g&3;if(b){while(1){L[j>>3]=m*L[j>>3];j=j+8|0;g=g-1|0;c=c+1|0;if((b|0)!=(c|0)){continue}break}}if(A){break z}while(1){L[j>>3]=m*L[j>>3];L[j+8>>3]=m*L[j+8>>3];L[j+16>>3]=m*L[j+16>>3];L[j+24>>3]=m*L[j+24>>3];j=j+32|0;g=g-4|0;if(g){continue}break}}A=t+w|0;L[A>>3]=q*m;q=0;A:{if(!((f|0)==(r|0)|(f|0)<=(i|0))){m=0;if(!n){break A}d=0;b=n;c=s+w|0;w=M(f,r)<<3;l=c+w|0;c=l;g=E-i|0;p=g&3;if(p){while(1){b=b-1|0;m=m+O(L[c>>3]);c=(f<<3)+c|0;d=d+1|0;if((p|0)!=(d|0)){continue}break}}R=u-i|0;z=R>>>0<3;if(!z){while(1){d=f<<3;j=d+c|0;I=d+j|0;o=I+d|0;m=m+O(L[c>>3])+O(L[j>>3])+O(L[I>>3])+O(L[o>>3]);c=d+o|0;b=b-4|0;if(b){continue}break}}if(m==0){break A}B:{if(!n){e=0;break B}e=0;b=n;c=l;if(g&1){e=L[l>>3]/m;L[l>>3]=e;c=(f<<3)+l|0;e=e*e+0;b=n-1|0}if((i|0)==(u|0)){break B}while(1){h=L[c>>3]/m;L[c>>3]=h;d=f<<3;c=d+c|0;k=L[c>>3]/m;L[c>>3]=k;c=c+d|0;e=k*k+(h*h+e);b=b-2|0;if(b){continue}break}}k=O(V(e));x=k;C=-k;k=L[l>>3];h=k>=0?x:C;L[l>>3]=k+h;o=r<<3;j=o+H|0;q=-h;C:{if(!n){break C}e=k*q-e;d=n;c=j;b=l;if(g&1){L[j>>3]=L[l>>3]/e;c=j+8|0;d=n-1|0;b=(f<<3)+l|0}if((i|0)==(u|0)){break C}while(1){L[c>>3]=L[b>>3]/e;g=b;b=f<<3;g=g+b|0;L[c+8>>3]=L[g>>3]/e;b=b+g|0;c=c+16|0;d=d-2|0;if(d){continue}break}}if((f|0)!=(r|0)){g=w+(o+s|0)|0;o=f-r|0;while(1){o=o-1|0;D:{if(!n){break D}c=0;h=0;i=n;b=g;d=l;if(p){while(1){i=i-1|0;h=L[b>>3]*L[d>>3]+h;w=f<<3;b=w+b|0;d=d+w|0;c=c+1|0;if((p|0)!=(c|0)){continue}break}}if(R>>>0>2){while(1){c=f<<3;w=c+b|0;I=c+w|0;X=I+c|0;Y=c+d|0;Z=Y+c|0;_=Z+c|0;h=L[X>>3]*L[_>>3]+(L[I>>3]*L[Z>>3]+(L[w>>3]*L[Y>>3]+(L[b>>3]*L[d>>3]+h)));b=c+X|0;d=c+_|0;i=i-4|0;if(i){continue}break}}if(!n){break D}i=0;d=n;c=j;b=g;if(p){while(1){L[b>>3]=h*L[c>>3]+L[b>>3];c=c+8|0;d=d-1|0;b=(f<<3)+b|0;i=i+1|0;if((p|0)!=(i|0)){continue}break}}if(z){break D}while(1){L[b>>3]=h*L[c>>3]+L[b>>3];i=b;b=f<<3;i=i+b|0;L[i>>3]=h*L[c+8>>3]+L[i>>3];i=b+i|0;L[i>>3]=h*L[c+16>>3]+L[i>>3];i=b+i|0;L[i>>3]=h*L[c+24>>3]+L[i>>3];b=b+i|0;c=c+32|0;d=d-4|0;if(d){continue}break}}g=g+8|0;if(o){continue}break}}if(!n){break A}c=0;if(p){while(1){L[l>>3]=m*L[l>>3];n=n-1|0;l=(f<<3)+l|0;c=c+1|0;if((p|0)!=(c|0)){continue}break}}if(z){break A}while(1){L[l>>3]=m*L[l>>3];b=f<<3;c=b+l|0;L[c>>3]=m*L[c>>3];c=b+c|0;L[c>>3]=m*L[c>>3];c=b+c|0;L[c>>3]=m*L[c>>3];l=b+c|0;n=n-4|0;if(n){continue}break}break A}m=0}e=O(L[A>>3])+O(L[K>>3]);T=e=(z|0)){w=M(f,g);break E}r=j-1|0;F:{if(q==0){w=M(f,g);E=M(f,p);break F}w=M(f,g);if(!j){break E}o=((M(f,p)<<3)+s|0)+(g<<3)|0;e=q*L[o>>3];n=p<<3;u=n+((w<<3)+v|0)|0;c=u;b=o;d=j;if(d&1){L[u>>3]=L[o>>3]/e;c=u+8|0;d=r;b=o+(f<<3)|0}if((j|0)!=1){while(1){L[c>>3]=L[b>>3]/e;l=b;b=f<<3;l=l+b|0;L[c+8>>3]=L[l>>3]/e;b=b+l|0;c=c+16|0;d=d-2|0;if(d){continue}break}if(!j){break E}}E=M(f,p);n=n+((E<<3)+v|0)|0;A=j&3;l=j;while(1){i=0;h=0;d=j;c=n;b=o;if(A){while(1){d=d-1|0;h=L[b>>3]*L[c>>3]+h;c=c+8|0;b=(f<<3)+b|0;i=i+1|0;if((A|0)!=(i|0)){continue}break}}K=r>>>0<3;if(!K){while(1){i=f<<3;Q=i+b|0;R=i+Q|0;I=R+i|0;h=L[I>>3]*L[c+24>>3]+(L[R>>3]*L[c+16>>3]+(L[Q>>3]*L[c+8>>3]+(L[b>>3]*L[c>>3]+h)));b=i+I|0;c=c+32|0;d=d-4|0;if(d){continue}break}}i=0;d=j;c=n;b=u;if(A){while(1){L[c>>3]=h*L[b>>3]+L[c>>3];c=c+8|0;b=b+8|0;d=d-1|0;i=i+1|0;if((A|0)!=(i|0)){continue}break}}if(!K){while(1){L[c>>3]=h*L[b>>3]+L[c>>3];L[c+8>>3]=h*L[b+8>>3]+L[c+8>>3];L[c+16>>3]=h*L[b+16>>3]+L[c+16>>3];L[c+24>>3]=h*L[b+24>>3]+L[c+24>>3];c=c+32|0;b=b+32|0;d=d-4|0;if(d){continue}break}}n=(f<<3)+n|0;l=l-1|0;if(l){continue}break}}if(!j){break E}b=((E<<3)+v|0)+(g<<3)|0;c=((w<<3)+v|0)+(p<<3)|0;d=0;n=j&3;if(n){while(1){G[c>>2]=0;G[c+4>>2]=0;G[b>>2]=0;G[b+4>>2]=0;c=c+8|0;j=j-1|0;b=(f<<3)+b|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}if(r>>>0<3){break E}while(1){G[c>>2]=0;G[c+4>>2]=0;G[b>>2]=0;G[b+4>>2]=0;G[c+8>>2]=0;G[c+12>>2]=0;d=b;b=f<<3;d=d+b|0;G[d>>2]=0;G[d+4>>2]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=b+d|0;G[d>>2]=0;G[d+4>>2]=0;G[c+24>>2]=0;G[c+28>>2]=0;d=b+d|0;G[d>>2]=0;G[d+4>>2]=0;b=b+d|0;c=c+32|0;j=j-4|0;if(j){continue}break}}b=(g+w<<3)+v|0;G[b>>2]=0;G[b+4>>2]=1072693248;c=g-1|0;j=f-g|0;q=L[(g<<3)+H>>3];if((g|0)>0){continue}break}}if((f|0)>0){E=0;R=E+1|0;b=f^-1;I=b+f|0;X=b+f|0;u=f<<3;Y=-8-u|0;Z=(f+M(f-1|0,f)<<3)-8|0;o=0;l=f;while(1){b=l;l=b-1|0;c=l<<3;g=c+((M(f,l)<<3)+s|0)|0;w=o+E|0;A=o+R|0;p=f-l|0;e=L[c+t>>3];G:{H:{I:{J:{n=f-b|0;if(n){d=0;b=n;j=g+u|0;c=j;i=o+E&7;if(i){while(1){G[c>>2]=0;G[c+4>>2]=0;b=b-1|0;c=c+u|0;d=d+1|0;if((i|0)!=(d|0)){continue}break}}if(o+X>>>0>=7){while(1){G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;G[c>>2]=0;G[c+4>>2]=0;c=c+u|0;b=b-8|0;if(b){continue}break}}if(e!=0){break J}break H}if(e==0){break H}m=1/e;break I}m=1/e;if(!n){break I}_=o+I|0;Q=A&3;K=w&3;r=p-1|0;while(1){K:{if(!r){h=0;break K}i=0;h=0;d=r;c=j;b=g;if(K){while(1){d=d-1|0;h=L[b+8>>3]*L[c+8>>3]+h;c=c+8|0;b=b+8|0;i=i+1|0;if((K|0)!=(i|0)){continue}break}}if(_>>>0<3){break K}while(1){h=L[b+32>>3]*L[c+32>>3]+(L[b+24>>3]*L[c+24>>3]+(L[b+16>>3]*L[c+16>>3]+(L[b+8>>3]*L[c+8>>3]+h)));c=c+32|0;b=b+32|0;d=d-4|0;if(d){continue}break}}n=n-1|0;L:{if(!p){break L}e=m*(h/L[g>>3]);i=0;d=p;c=j;b=g;if(Q){while(1){L[c>>3]=e*L[b>>3]+L[c>>3];c=c+8|0;b=b+8|0;d=d-1|0;i=i+1|0;if((Q|0)!=(i|0)){continue}break}}if(w>>>0<3){break L}while(1){L[c>>3]=e*L[b>>3]+L[c>>3];L[c+8>>3]=e*L[b+8>>3]+L[c+8>>3];L[c+16>>3]=e*L[b+16>>3]+L[c+16>>3];L[c+24>>3]=e*L[b+24>>3]+L[c+24>>3];c=c+32|0;b=b+32|0;d=d-4|0;if(d){continue}break}}j=j+u|0;if(n){continue}break}}if(!p){break G}b=0;c=g;d=A&3;if(d){while(1){L[c>>3]=m*L[c>>3];c=c+8|0;p=p-1|0;b=b+1|0;if((d|0)!=(b|0)){continue}break}}if(w>>>0<3){break G}while(1){L[c>>3]=m*L[c>>3];L[c+8>>3]=m*L[c+8>>3];L[c+16>>3]=m*L[c+16>>3];L[c+24>>3]=m*L[c+24>>3];c=c+32|0;p=p-4|0;if(p){continue}break}break G}if(!p){break G}cb((Z+M(o,Y)|0)+s|0,0,A<<3)}L[g>>3]=L[g>>3]+1;o=o+1|0;if((f|0)!=(o|0)){continue}break}}if((f|0)<=0){break w}A=f&3;n=f-1|0;E=f&1;o=f;M:while(1){p=o;o=o-1|0;b=o<<3;Q=b+H|0;K=p-2|0;c=K<<3;R=c+H|0;I=c+t|0;w=b+t|0;g=0;while(1){l=o;N:{O:{while(1){if(T+O(L[(l<<3)+H>>3])==T){break N}c=l-1|0;if(T+O(L[(c<<3)+t>>3])==T){break O}b=(l|0)<=0;l=c;if(!b){continue}break}c=-1;l=-1}if((l|0)>=(p|0)){break N}r=(M(c,f)<<3)+s|0;u=r+8|0;i=(M(f,l)<<3)+s|0;h=1;j=l;while(1){b=j<<3;q=h*L[b+H>>3];e=O(q);if(T+e==T){break N}b=b+t|0;m=L[b>>3];h=O(m);P:{if(h>3]=k;e=1/k;h=e*-q;Q:{if(!f){break Q}e=m*e;d=f;c=i;b=r;if(E){k=L[r>>3];m=L[i>>3];L[r>>3]=k*e+h*m;L[i>>3]=m*e-h*k;c=i+8|0;d=n;b=u}if(!n){break Q}while(1){k=L[b>>3];m=L[c>>3];L[b>>3]=k*e+h*m;L[c>>3]=m*e-h*k;k=L[b+8>>3];m=L[c+8>>3];L[b+8>>3]=k*e+h*m;L[c+8>>3]=m*e-h*k;c=c+16|0;b=b+16|0;d=d-2|0;if(d){continue}break}}i=(f<<3)+i|0;j=j+1|0;if((p|0)>(j|0)){continue}break}}e=L[w>>3];if((l|0)==(o|0)){R:{if(!(e<0)){break R}L[w>>3]=-e;c=(M(f,o)<<3)+v|0;d=0;b=f;if(A){while(1){L[c>>3]=-L[c>>3];c=c+8|0;b=b-1|0;d=d+1|0;if((A|0)!=(d|0)){continue}break}}if(n>>>0<3){break R}while(1){L[c>>3]=-L[c>>3];L[c+8>>3]=-L[c+8>>3];L[c+16>>3]=-L[c+16>>3];L[c+24>>3]=-L[c+24>>3];c=c+32|0;b=b-4|0;if(b){continue}break}}z=z-1|0;if((p|0)>1){continue M}break w}if((g|0)!=99){u=l<<3;q=L[u+t>>3];m=L[I>>3];h=L[R>>3];k=L[Q>>3];h=((m-e)*(e+m)+(h-k)*(h+k))/(m*(k+k));x=O(h);S:{if(x>1){C=x;x=1/x;x=C*V(x*x+1);break S}x=V(h*h+1)}C=(q-e)*(e+q);e=O(x);e=(C+k*(m/(h+(h>=0?e:-e))-k))/q;if((l|0)<=(K|0)){b=M(f,l)<<3;i=b+s|0;j=b+v|0;h=1;m=1;while(1){d=i;c=j;b=l;l=b+1|0;j=l<<3;k=L[j+H>>3];x=m*k;C=L[j+t>>3];r=b<<3;b=r+H|0;m=O(e);B=h*k;h=O(B);T:{if(m>h){k=h/m;k=m*V(k*k+1);break T}k=0;if(B==0){break T}k=m/h;k=h*V(k*k+1)}L[b>>3]=k;h=B/k;B=x*h;m=e/k;e=q*m;j=(f<<3)+c|0;U:{if(!E){i=f;b=j;break U}k=L[c>>3];N=L[j>>3];L[c>>3]=k*m+h*N;L[j>>3]=N*m-h*k;c=c+8|0;i=n;b=j+8|0}if(n){while(1){k=L[c>>3];N=L[b>>3];L[c>>3]=k*m+h*N;L[b>>3]=N*m-h*k;k=L[c+8>>3];N=L[b+8>>3];L[c+8>>3]=k*m+h*N;L[b+8>>3]=N*m-h*k;b=b+16|0;c=c+16|0;i=i-2|0;if(i){continue}break}}q=x*m-h*q;x=C*m;N=e+B;e=O(N);C=C*h;k=O(C);V:{W:{if(e>k){k=k/e;B=k*k+1;break W}if(C==0){b=r+t|0;G[b>>2]=0;G[b+4>>2]=0;break V}e=e/k;B=e*e+1;e=k}e=e*V(B);L[r+t>>3]=e;if(e==0){break V}e=1/e;h=C*e;m=N*e}e=q*h;k=m*x;x=x*h;C=m*q;i=(f<<3)+d|0;X:{if(!f){break X}Y:{if(!E){c=i;b=f;break Y}q=L[d>>3];B=L[i>>3];L[d>>3]=q*m+h*B;L[i>>3]=B*m-h*q;c=i+8|0;d=d+8|0;b=n}if(!n){break X}while(1){q=L[d>>3];B=L[c>>3];L[d>>3]=q*m+h*B;L[c>>3]=B*m-h*q;q=L[d+8>>3];B=L[c+8>>3];L[d+8>>3]=q*m+h*B;L[c+8>>3]=B*m-h*q;c=c+16|0;d=d+16|0;b=b-2|0;if(b){continue}break}}q=k-e;e=C+x;if((l|0)!=(z|0)){continue}break}}b=u+H|0;G[b>>2]=0;G[b+4>>2]=0;L[Q>>3]=e;L[w>>3]=q;g=g+1|0;continue}break}break}G[J+52>>2]=63704;G[J+48>>2]=66042;_a(G[24367],90100,J+48|0);break v}G[J+20>>2]=65829;G[J+16>>2]=66133;_a(G[24367],90100,J+16|0);break v}Z:{if(!f){break Z}g=f-1|0;h=0;j=f&3;_:{if(!j){b=f;c=t;break _}d=0;b=f;c=t;while(1){e=L[c>>3];h=e>h?e:h;c=c+8|0;b=b-1|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}if(g>>>0>=3){while(1){e=L[c+24>>3];k=L[c+16>>3];m=L[c+8>>3];q=L[c>>3];h=hk?e:k;c=c+32|0;b=b-4|0;if(b){continue}break}}if(!f){break Z}e=h*1e-11;c=t;b=f;j=b&3;if(j){d=0;while(1){if(e>L[c>>3]){G[c>>2]=0;G[c+4>>2]=0}b=b-1|0;c=c+8|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}}if(g>>>0>2){while(1){if(e>L[c>>3]){G[c>>2]=0;G[c+4>>2]=0}if(e>L[c+8>>3]){G[c+8>>2]=0;G[c+12>>2]=0}if(e>L[c+16>>3]){G[c+16>>2]=0;G[c+20>>2]=0}b=b-4|0;if(e>L[c+24>>3]){G[c+24>>2]=0;G[c+28>>2]=0}c=c+32|0;if(b){continue}break}}if(!f){break Z}n=f&3;l=f<<3;o=f-1>>>0<3;j=f;g=P;while(1){j=j-1|0;k=L[t>>3];$:{if(k!=0){x=0/k;if(!f){break $}i=0;h=0;d=f;c=D;b=s;if(n){while(1){d=d-1|0;h=L[b>>3]*L[c>>3]+h;c=c+8|0;b=b+8|0;i=i+1|0;if((n|0)!=(i|0)){continue}break}}if(!o){while(1){h=L[b+24>>3]*L[c+24>>3]+(L[b+16>>3]*L[c+16>>3]+(L[b+8>>3]*L[c+8>>3]+(L[b>>3]*L[c>>3]+h)));c=c+32|0;b=b+32|0;d=d-4|0;if(d){continue}break}}s=l+s|0;x=h/k;break $}s=l+s|0;x=0}L[g>>3]=x;t=t+8|0;g=g+8|0;if(j){continue}break}}if((f|0)>0){n=f&3;g=0;o=f-1>>>0<3;while(1){h=0;d=f;c=P;b=v;i=0;if(n){while(1){d=d-1|0;h=L[b>>3]*L[c>>3]+h;c=c+8|0;b=(f<<3)+b|0;i=i+1|0;if((n|0)!=(i|0)){continue}break}}if(!o){while(1){j=f<<3;l=j+b|0;i=j+l|0;t=i+j|0;h=L[t>>3]*L[c+24>>3]+(L[i>>3]*L[c+16>>3]+(L[l>>3]*L[c+8>>3]+(L[b>>3]*L[c>>3]+h)));b=j+t|0;c=c+32|0;d=d-4|0;if(d){continue}break}}L[(g<<3)+D>>3]=h;v=v+8|0;g=g+1|0;if((g|0)!=(f|0)){continue}break}}Wa(P);Wa(H);Fa=J- -64|0;break u}ca(-1);W()}Wa(U);Wa($)}Fa=S+32|0;break r}G[S+4>>2]=65768;G[S>>2]=66133;_a(G[24367],90100,S);break a}G[S+20>>2]=65790;G[S+16>>2]=66133;_a(G[24367],90100,S+16|0);break a}Wa(y);if(f){bb(G[a+4>>2],D,f<<3)}Wa(D);Fa=F+80|0;return}ca(-1);W()}function pf(a,b,c,d,e,f,g){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,F=0,H=0,I=0,J=0,K=0,N=0,P=0,S=0,T=0,U=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,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0;q=Fa-32|0;Fa=q;if(!(!a|!G[a+3312>>2])){G[g>>2]=0;L[q+16>>3]=c;L[q+24>>3]=b;n=G[a+3264>>2];a:{if((n|0)!=-90){if((n|0)!=90){break a}L[q+16>>3]=90-c;break a}L[q+16>>3]=c+-90}b:{if(!d){s=G[a+3964>>2];h=L[a+120>>3];break b}s=Nf(d);h=Zh(d)}G[a+592>>2]=0;G[a+596>>2]=1072693248;c:{if((s|0)<=0){break c}d:{switch(s-6|0){case 0:case 4:break c;default:break d}}Bm(s,G[a+3964>>2],h,L[a+120>>3],q+24|0,q+16|0,L[a+128>>3])}e:{f:{g:{h:{i:{j:{k:{d=G[a+3260>>2];switch(d-31|0){case 3:break h;case 2:break i;case 1:break j;case 0:break k;default:break g}}l=L[q+24>>3];i=L[q+16>>3];G[q+8>>2]=0;G[q+12>>2]=0;G[q>>2]=0;G[q+4>>2]=0;h=L[a+160>>3];i=i*3.141592653589793/180;j=eb(i);m=ib(i);if(h==0){h=L[a+8>>3]*3.141592653589793/180;L[a+160>>3]=h}i=L[a+152>>3];k=eb(h);h=ib(h);if(i==0){i=L[a+8>>3]*3.141592653589793/180;L[a+152>>3]=i}d=1;l=l*3.141592653589793/180-i;p=eb(l);i=m*h+j*k*p;l:{if(i==0){break l}o=ib(l);l=L[a+168>>3];if(l==0){break l}ga=(m*k-h*j*p)*206264.8062470964/i;h=ga/l;ha=j*o*206264.8062470964/i;i=ha/l;ia=L[a+472>>3];ka=ia*3;z=L[a+512>>3];la=z*4;D=L[a+496>>3];S=D*3;C=L[a+352>>3];ja=C*4;na=L[a+336>>3];xa=na*3;oa=L[a+312>>3];ya=oa*3;p=L[a+448>>3];za=L[a+432>>3];K=L[a+424>>3];o=L[a+288>>3];Aa=L[a+272>>3];T=L[a+264>>3];t=L[a+480>>3];Ba=t+t;N=L[a+440>>3];Ca=N+N;r=L[a+504>>3];Da=r+r;v=L[a+488>>3];Ea=v+v;U=L[a+464>>3];X=U+U;aa=L[a+456>>3];Ga=aa+aa;B=L[a+344>>3];Ha=B+B;F=L[a+328>>3];Ia=F+F;Y=L[a+296>>3];Ka=Y+Y;x=L[a+320>>3];La=x+x;Z=L[a+304>>3];ba=Z+Z;_=L[a+280>>3];Ma=_+_;ca=L[a+416>>3];da=L[a+256>>3];d=0;while(1){m:{j=h*h;m=i*i;l=j+m;pa=l*l;qa=h*j;ra=j*i;sa=h*m;ta=i*m;k=h*i;P=i*C*pa+(i*B*l+(na*qa+(F*ra+(x*sa+(oa*ta+(Z*l+(Y*j+(o*k+(_*m+(Aa+(da*i+h*T)))))))))))-ha;$=j*j;ea=m*m;fa=j*(m*6);ua=C*($+(ea*5+fa))+(B*(m*3+j)+(F*j+(La*k+(ya*m+(ba*i+(o*h+(Ma*i+da)))))));ea=z*(ea+($*5+fa))+(r*(j*3+m)+(v*m+(Ba*k+(ka*j+(X*h+(p*i+(Ca*h+ca)))))));fa=k*la*l+(Da*k+(S*m+(Ea*k+(t*j+(X*i+(Ga*i+(p*h+K)))))));va=k*ja*l+(Ha*k+(xa*j+(Ia*k+(x*m+(ba*h+(Ka*h+(o*i+T)))))));$=ua*ea-fa*va;j=h*z*pa+(h*r*l+(D*ta+(v*sa+(t*ra+(ia*qa+(U*l+(aa*m+(p*k+(N*j+(za+(ca*h+i*K)))))))))))-ga;m=(P*fa-j*ua)/$;h=h+m;j=(va*j-P*ea)/$;i=i+j;if(O(j)<5e-7&O(m)<5e-7){break m}d=d+1|0;if((d|0)!=50){continue}}break}d=1;j=L[a+192>>3];if(j==0){break l}m=L[a+200>>3];if(m==0){break l}k=L[a+248>>3];L[q+8>>3]=(L[a+224>>3]-i*1e3)/j-L[a+176>>3]+1+-.5;h=(k+h*1e3)/m-L[a+184>>3]+1+-.5;L[q>>3]=h;d=-1;i=L[q+8>>3];if(i<.5|i>L[a+136>>3]+.5|(h<.5|h>L[a+144>>3]+.5)){break l}d=0}if(d){break f}break e}h=L[q+24>>3];d=0;n=G[a+3272>>2];u=G[a+3268>>2];i=Mc(L[q+16>>3]*3.141592653589793/180);m=h*3.141592653589793/180-L[a+688>>3]*3.141592653589793/180;j=eb(m);k=L[a+696>>3]*3.141592653589793/180;h=Mc(k);l=L[a+112>>3];o=h;h=(1-h*j/i)/(h+j/i);K=Mc(m)*eb(k)*(1-o*h)*180/3.141592653589793;T=h*180/3.141592653589793;h=K*L[a+104>>3]+l*T;i=K*L[a+88>>3]+L[a+96>>3]*T;B=L[a+456>>3];N=L[a+432>>3];U=L[a+424>>3];F=L[a+296>>3];X=L[a+272>>3];aa=L[a+264>>3];Y=L[a+448>>3];$=Y+Y;Z=L[a+440>>3];ga=Z+Z;ba=L[a+288>>3];ha=ba+ba;_=L[a+280>>3];ia=_+_;ka=L[a+416>>3];la=L[a+256>>3];s=(u|0)<7;u=u>>>0<9;while(1){p=F*i+(ha*h+X);l=h*i;m=h*h;k=i*i;o=F*l+(ba*m+(_*k+(X*h+(aa*i+la))));t=m+k;ca=m*i;da=h*k;z=h*m;C=i*k;j=F*h+(ia*i+aa);n:{if(s){break n}r=L[a+312>>3];v=L[a+304>>3];o=r*z+(v*C+o);p=r*3*m+p;D=v*3*k+j;j=D;if(u){break n}j=L[a+352>>3];r=L[a+344>>3];P=L[a+336>>3];S=P+P;v=L[a+328>>3];x=L[a+320>>3];p=j*(m*3+k)+((r+r)*l+(S*h+((v+v)*l+(x*k+p))));o=h*j*t+(i*r*t+(P*t+(v*ca+(x*da+o))));j=(j+j)*l+(r*(k*3+m)+(S*i+(v*m+((x+x)*l+D))))}r=B*i+($*h+N);v=B*l+(Y*m+(Z*k+(N*h+(U*i+ka))));D=o-K;o=B*h+(ga*i+U);o:{if((n|0)<7){break o}x=L[a+472>>3];S=x*z;z=L[a+464>>3];v=S+(z*C+v);r=x*3*m+r;S=z*3*k+o;o=S;if(n>>>0<9){break o}o=L[a+512>>3];x=L[a+504>>3];P=L[a+496>>3];ja=P+P;z=L[a+488>>3];C=L[a+480>>3];r=o*(m*3+k)+((x+x)*l+(ja*h+((z+z)*l+(C*k+r))));v=h*o*t+(i*x*t+(P*t+(z*ca+(C*da+v))));o=(o+o)*l+(x*(k*3+m)+(ja*i+(z*m+((C+C)*l+S))))}m=v-T;v=D*o-m*j;j=j*r-o*p;k=v/j;h=h+k;j=(p*m-D*r)/j;i=i+j;if(!(O(j)<5e-7&O(k)<5e-7)){d=d+1|0;if((d|0)!=50){continue}}break}L[q+8>>3]=i+L[a+616>>3];h=h+L[a+624>>3];L[q>>3]=h;d=-1;i=L[q+8>>3];if(!(i<.5|i>L[a+136>>3]+.5|(h<.5|h>L[a+144>>3]+.5))){d=0}if(d){break f}break e}k=L[q+24>>3];n=a+688|0;d=G[a+3304>>2];l=L[n+(((d|0)!=0)<<3)>>3];m=L[n+(!d<<3)>>3];h=L[a+3176>>3];i=L[q+16>>3]*3.141592653589793/180;t=ib(i);j=eb(i);m=(90-m)*3.141592653589793/180;r=ib(m);v=eb(m);k=(k-l)*3.141592653589793/180;o=ib(k);D=h!=999?h*3.141592653589793/180:3.141592653589793;l=eb(k);h=j*v;p=t*r-l*h;if(O(p)<1e-5){p=h*(1-l)-eb(i+m)}o=o*-j;p:{if(!(p==0&o==0)){h=Db(o,p);break p}h=k+-3.141592653589793}h=D+h;q:{if(h>3.141592653589793){h=h+-6.283185307179586;break q}if(!(h<-3.141592653589793)){break q}h=h+6.283185307179586}r:{if(Yc(k,3.141592653589793)==0){i=l*m+i;k=i>1.5707963267948966?3.141592653589793-i:i;if(!(k<-1.5707963267948966)){break r}k=-3.141592653589793-k;break r}i=t*v+l*(j*r);if(O(i)>.99){k=Sc(V(p*p+o*o));if(i>=0){break r}k=-k;break r}k=fc(i)}l=0;i=ib(k);j=0;s:{if(i==0){break s}i=L[a+3192>>3]*eb(k)/i;if(!(G[a+6040>>2]|G[a+6044>>2])){j=ib(h);h=eb(h)*-i;i=j*i;l=d?h:i;j=d?i:h;break s}j=eb(h);d=0;r=ib(h)*i;h=r;v=j*-i;j=v;while(1){l=1;k=0;i=h;n=G[a+6040>>2];if(n){i=Ee(n,h,j);l=qf(G[a+6040>>2],h,j,1,0)+1;k=qf(G[a+6040>>2],h,j,0,1);i=h+i}n=G[a+6044>>2];t:{if(!n){p=1;t=0;m=j;break t}m=Ee(n,h,j);t=qf(G[a+6044>>2],h,j,1,0);p=qf(G[a+6044>>2],h,j,0,1)+1;m=j+m}o=l*p-t*k;u:{if(o==0){break u}i=i-r;m=m-v;l=(i*t-m*l)/o;j=j+l;k=(k*m-i*p)/o;h=h+k;k=O(k);l=O(l);k=k>l?k:l;i=O(i);m=O(m);i=i>m?i:m;if((i>2];l=d?j:h;j=d?h:j}v:{w:{if(G[a+3300>>2]){L[q+8>>3]=l*L[a+88>>3]+j*L[a+96>>3];h=l*L[a+104>>3]+j*L[a+112>>3];break w}h=L[a+48>>3];x:{if(h!=0){i=h*3.141592653589793/180;h=ib(i);i=eb(i);L[q+8>>3]=l*i+j*h;j=j*i-h*l;break x}L[q+8>>3]=l}L[q>>3]=j;h=L[a+32>>3];if(h!=0){L[q+8>>3]=L[q+8>>3]/h}h=L[a+40>>3];if(h==0){break v}h=L[q>>3]/h}L[q>>3]=h}L[q+8>>3]=L[q+8>>3]+L[a+16>>3];L[q>>3]=L[q>>3]+L[a+24>>3];break e}k=L[q+24>>3];n=a+688|0;d=G[a+3304>>2];l=L[n+(((d|0)!=0)<<3)>>3];m=L[n+(!d<<3)>>3];j=L[a+3176>>3];h=L[q+16>>3]*3.141592653589793/180;t=ib(h);i=eb(h);m=(90-m)*3.141592653589793/180;r=ib(m);v=eb(m);k=(k-l)*3.141592653589793/180;o=ib(k);D=j!=999?j*3.141592653589793/180:3.141592653589793;p=eb(k);j=i*v;l=t*r-p*j;if(O(l)<1e-5){l=j*(1-p)-eb(h+m)}o=o*-i;y:{if(!(l==0&o==0)){j=Db(o,l);break y}j=k+-3.141592653589793}j=D+j;z:{if(j>3.141592653589793){j=j+-6.283185307179586;break z}if(!(j<-3.141592653589793)){break z}j=j+6.283185307179586}A:{if(Yc(k,3.141592653589793)==0){h=p*m+h;h=h>1.5707963267948966?3.141592653589793-h:h;if(!(h<-1.5707963267948966)){break A}h=-3.141592653589793-h;break A}i=t*v+p*(i*r);if(O(i)>.99){h=Sc(V(l*l+o*o));if(i>=0){break A}h=-h;break A}h=fc(i)}h=1.5707963267948966-h;i=((((((((((h*0+L[a+4248>>3])*h+L[a+4240>>3])*h+L[a+4232>>3])*h+L[a+4224>>3])*h+L[a+4216>>3])*h+L[a+4208>>3])*h+L[a+4200>>3])*h+L[a+4192>>3])*h+L[a+4184>>3])*h+L[a+4176>>3])*L[a+3192>>3];B:{if(!(G[a+6040>>2]|G[a+6044>>2])){h=ib(j);j=eb(j)*-i;h=h*i;k=d?j:h;h=d?h:j;break B}m=eb(j);d=0;r=ib(j)*i;h=r;v=m*-i;j=v;while(1){k=0;i=h;p=1;l=0;n=G[a+6040>>2];if(n){i=Ee(n,h,j);p=qf(G[a+6040>>2],h,j,1,0)+1;l=qf(G[a+6040>>2],h,j,0,1);i=h+i}n=G[a+6044>>2];C:{if(!n){t=1;m=j;break C}m=Ee(n,h,j);k=qf(G[a+6044>>2],h,j,1,0);t=qf(G[a+6044>>2],h,j,0,1)+1;m=j+m}o=p*t-k*l;D:{if(o==0){break D}i=i-r;m=m-v;k=(i*k-m*p)/o;j=j+k;l=(l*m-i*t)/o;h=h+l;l=O(l);k=O(k);k=km?i:m;if((i>2];k=d?j:h;h=d?h:j}E:{F:{if(G[a+3300>>2]){L[q+8>>3]=k*L[a+88>>3]+h*L[a+96>>3];h=k*L[a+104>>3]+h*L[a+112>>3];break F}i=L[a+48>>3];G:{if(i!=0){j=i*3.141592653589793/180;i=ib(j);j=eb(j);L[q+8>>3]=k*j+h*i;h=h*j-i*k;break G}L[q+8>>3]=k}L[q>>3]=h;h=L[a+32>>3];if(h!=0){L[q+8>>3]=L[q+8>>3]/h}h=L[a+40>>3];if(h==0){break E}h=L[q>>3]/h}L[q>>3]=h}L[q+8>>3]=L[q+8>>3]+L[a+16>>3];L[q>>3]=L[q>>3]+L[a+24>>3];break e}h=L[q+16>>3];i=L[q+24>>3];if(!(G[a+3324>>2]!=2&(d|0)>0)){m=h;h=0;n=G[a+3260>>2];x=L[a+40>>3];v=L[a+32>>3];U=L[a+24>>3];T=L[a+16>>3];F=L[a+8>>3];K=L[a>>3];N=L[a+48>>3]*3.141592653589793/180;z=ib(N);C=eb(N);if((n|0)<=0){k=0}else{d=G[a+3304>>2];j=d?F:K;k=i-j;h=(d?K:F)*3.141592653589793/180;l=j*3.141592653589793/180;o=m*3.141592653589793/180;j=eb(o);p=T*v;H:{if(p>180|p<-180){i=k>360?i+-360:i;if(!(k<0)){break H}i=i+360;break H}i=k>180?i+-360:i;if(!(k<-180)){break H}i=i+360}r=i*3.141592653589793/180;k=r-l;p=j*ib(k);X=eb(h);k=eb(k);B=ib(o);k=B*ib(h)+k*(j*X)}I:{J:{K:{switch(n-3|0){case 8:t=o-h;p=r-l;break J;case 1:d=1;if(k<0){break I}k=ib(h);l=eb(r-l);t=B*eb(h)-l*(k*j);break J;case 0:case 30:case 31:case 32:d=1;if(k<=0){break I}k=eb(h);l=eb(r-l);o=ib(h);h=B*o+l*(j*k);t=(B*k-l*(o*j))/h;p=p/h;break J;case 3:k=eb(h);o=eb(r-l);l=1;t=ib(h);h=Sc(Q(R(B*t+o*(j*k),-1),1));if(h!=0){l=h/ib(h)}t=(B*k-t*j*o)*l;p=p*l;break J;case 26:d=1;if(h==0){break I}k=eb(r-l);t=(eb(h)-j*k)/ib(h);break J;case 17:case 27:d=1;if(O(o)>1.5707963267948974|O(h)>1.5707963267948974){break I}t=o-h;p=j*(r-l);break J;case 9:d=2;h=Mc(o*.5+.7853981633974487);if(h<1e-5){break I}j=x*C+v*z;j=j==0?1:j;k=(F*.5+45)*3.141592653589793/180;p=oc(Mc(j*.5*.01745329252+k));o=j*3.141592653589793/180;j=oc(Mc(k));k=o/(p-j);t=k*oc(h)-j*k;h=eb(F*3.141592653589793/180);p=(h<=0?1:h)*(r-l);break J;case 19:d=1;j=(r-l)*.5;if(O(j)>1.5707963267948974){break I}d=3;p=eb(o);k=V((p*eb(j)+1)*.5);if(O(k)<1e-5){break I}l=F*3.141592653589793/180;h=x*C+v*z;t=h==0?.017453292519943295:h*3.141592653589793/180;h=l+t;r=eb(h);B=ib(h);h=eb(l);D=t;l=ib(l);t=V((h+1)*.5);r=B/V((r+1)*.5)-l/t;r=D/(r==0?1:r);t=r*ib(o)/k-l*r/t;l=v*C-z*x;o=l==0?.017453292519943295:l*3.141592653589793/180;r=o*.5;l=ib(r)*(h+h);h=o*V((h*eb(r)+1)*.5)/(l==0?1:l);p=(h+h)*p*ib(j)/k;break J;case 2:d=1;if(O(o)>1.5707963267948974){break I}k=eb(h);l=eb(r-l);h=ib(h);o=j*k*l+(B*h+1);if(O(o)<1e-5){break I}o=2/o;t=o*(B*k-h*j*l);p=p*o;break J;case 13:break K;default:break J}}k=Mc(h);p=k*-2;j=p*p;l=ib(h)*(l-r);t=l*l;D=l;l=1/k;h=o-h;r=h;h=k*k;k=k/3;o=p*-.25;k=l*(r*(r*(r*(r*(j*j*-.0390625+(h*.1875*j+(h*-.125*h+k*o)))+(k*.5+(o*h+p*j*.0625)))+(j*-.125+h*.5))+p*.5)+1);h=(t/-6+1)*(D*k);L:{if(G[a+3300>>2]){j=L[a+56>>3];j=j/O(j);break L}j=h;h=v/O(v)}p=h*j;t=l-k*(t*-.5+1)}M:{if((n|0)>0){j=p*180/3.141592653589793;h=t*180/3.141592653589793;break M}j=i-K;h=m-F}d=G[a+3304>>2];i=d?h:j;h=d?j:h;N:{if(G[a+3300>>2]){j=i*L[a+104>>3]+h*L[a+112>>3];i=i*L[a+88>>3]+h*L[a+96>>3];break N}O:{if(N==0){j=h;break O}j=h*C-z*i;i=i*C+z*h}i=i/(v!=0?v:1);if(x==0){break N}j=j/x}h=T+i;L[q+8>>3]=h;P:{if((n|0)!=11){break P}m=L[a+136>>3];Q:{if(m0){break Q}break P}if(!(h<0)){break P}i=360/v+h;if(!(m>=i)){break P}}L[q+8>>3]=i}L[q>>3]=U+j;d=0}if(d){break f}break e}d=Fa-112|0;Fa=d;G[q+8>>2]=0;G[q+12>>2]=0;G[q>>2]=0;G[q+4>>2]=0;u=a+4004|0;R:{if(G[a+4004>>2]!=137){s=1;if(sj(G[a+4040>>2],a+3368|0,u)){break R}}G[d+104>>2]=0;G[d+108>>2]=0;G[d+96>>2]=0;G[d+100>>2]=0;G[d+88>>2]=0;G[d+92>>2]=0;G[d+80>>2]=0;G[d+84>>2]=0;y=d+80|0;L[y+(G[a+4024>>2]<<3)>>3]=i;L[y+(G[a+4028>>2]<<3)>>3]=h;G[d+16>>2]=0;G[d+20>>2]=0;G[d+24>>2]=0;G[d+28>>2]=0;G[d+40>>2]=0;G[d+44>>2]=1072693248;G[d+32>>2]=0;G[d+36>>2]=1072693248;G[d+48>>2]=0;G[d+52>>2]=0;G[d+56>>2]=0;G[d+60>>2]=0;G[d+72>>2]=0;G[d+76>>2]=1072693248;G[d+64>>2]=0;G[d+68>>2]=1072693248;W=a+3368|0;H=a+688|0;s=a+4064|0;w=a+4144|0;A=d+48|0;J=a+4036|0;Na=d+16|0;S:{if(G[u>>2]!=137){n=1;if(sj(G[J+4>>2],W,u)){break S}}W=G[J+4>>2];T:{if((W|0)<=0){break T}ma=G[u+20>>2];n=0;if((W|0)!=1){Oa=W&-2;while(1){if(!((n|0)==(ma|0)|G[u+24>>2]==(n|0))){I=n<<3;L[I+A>>3]=L[y+I>>3]-L[H+I>>3]}I=n|1;if(!((I|0)==(ma|0)|(I|0)==G[u+24>>2])){I=I<<3;L[I+A>>3]=L[y+I>>3]-L[H+I>>3]}n=n+2|0;wa=wa+2|0;if((Oa|0)!=(wa|0)){continue}break}}if(!(W&1)|(n|0)==(ma|0)|G[u+24>>2]==(n|0)){break T}n=n<<3;L[n+A>>3]=L[n+y>>3]-L[n+H>>3]}U:{if(G[u>>2]==999){break U}H=u+4|0;if(!Xa(H,34233)){n=2;if(L[s+16>>3]==0){break S}E[H|0]=83;E[H+1|0]=73;E[H+2|0]=78;E[H+3|0]=0;G[w+40>>2]=0;G[w+44>>2]=0;Pa=w,Qa=Mb(L[s+16>>3])/Kb(L[s+16>>3]),L[Pa+48>>3]=Qa;G[w+4>>2]=G[w+4>>2]>>31}n=G[u+20>>2]<<3;h=L[n+y>>3];I=y;y=G[u+24>>2]<<3;i=L[I+y>>3];W=n+A|0;y=A+y|0;V:{W:{if(G[s>>2]!=137){n=1;if(um(H,s,w)){break W}}j=Mb(i);t=Kb(i);k=h-L[s+40>>3];m=Mb(k);l=Kb(k);h=t*L[s+72>>3]-m*(j*L[s+64>>3]);if(O(h)<1e-5){h=Mb(L[s+48>>3]+i);h=j*L[s+64>>3]*(1-m)-h}l=l*-j;X:{if(!(h==0&l==0)){o=Ac(l,h);break X}o=k+-180}p=o+L[s+56>>3];L[d+8>>3]=p;o=-360;Y:{if(!(p>180)){o=360;if(!(p<-180)){break Y}}L[d+8>>3]=p+o}Z:{_:{if(Yc(k,180)==0){h=m*L[s+48>>3]+i;h=h>90?180-h:h;L[d>>3]=h;if(!(h<-90)){break Z}h=-180-h;break _}i=t*L[s+64>>3]+m*(j*L[s+72>>3]);if(O(i)>.99){h=Yg(V(h*h+l*l));if(!(i<0)){break _}h=-h;break _}h=Bc(i)}L[d>>3]=h}s=Ja[G[w+1888>>2]](L[d+8>>3],L[d>>3],w,W,y)|0;n=0;if(!s){break V}n=(s|0)==1?2:3}}if(n){break S}n=G[u+28>>2];if((n|0)==-1){break U}s=A+(n<<3)|0;n=A+(G[u+24>>2]<<3)|0;i=L[n>>3];h=L[w+24>>3];h=h==0?90:h*3.141592653589793*.5;$:{if(i>3]=i+h;i=5;break $}m=h*.5;if(m>3]=i-h;i=0;break $}n=A+(G[u+20>>2]<<3)|0;j=L[n>>3];if(j>h*2.5){L[n>>3]=h*-3+j;i=4;break $}if(j>h*1.5){L[n>>3]=j-(h+h);i=3;break $}i=1;if(!(j>m)){break $}L[n>>3]=j-h;i=2}L[s>>3]=i}n=((zj(A,J,Na)|0)!=0)<<2}s=n;if(n){break R}L[q+8>>3]=L[d+16>>3];L[q>>3]=L[d+24>>3];h=L[d+32>>3];L[a+592>>3]=G[a+3260>>2]-24>>>0<3?h+-1:h;s=0}Fa=d+112|0;if(!s){break e}}G[g>>2]=1}k=L[q>>3];l=L[q+8>>3];d=G[a+9392>>2];aa:{if(d){pf(d,l,k,0,e,f,g);d=G[g>>2];break aa}d=0;h=0;i=0;A=Fa-80|0;ba:{if(G[a+6048>>2]==1){j=k-L[a+24>>3];m=l-L[a+16>>3];w=G[a+8480>>2];n=G[a+7672>>2];ca:{if((n|0)<0){break ca}while(1){y=M(n-d|0,80)+a|0;u=d<<3;h=L[(y+u|0)+7680>>3];H=u+A|0;u=d;da:{if(!d){break da}s=0;J=u&3;if(J){while(1){d=d-1|0;h=j*h+L[(y+(d<<3)|0)+7680>>3];s=s+1|0;if((J|0)!=(s|0)){continue}break}}if(u-1>>>0<3){break da}while(1){J=y+7680|0;s=J+(d<<3)|0;h=j*(j*(j*(j*h+L[s-8>>3])+L[s-16>>3])+L[s-24>>3]);s=d-4|0;h=h+L[J+(s<<3)>>3];J=(d|0)>4;d=s;if(J){continue}break}}L[H>>3]=h;d=u+1|0;if((n|0)!=(u|0)){continue}break}h=L[A>>3];if((n|0)<=0){i=h;break ca}u=n-1|0;d=n+1|0;y=n&3;ea:{if(!y){i=h;break ea}s=0;i=h;while(1){i=m*i+L[A+(d-n<<3)>>3];n=n-1|0;s=s+1|0;if((y|0)!=(s|0)){continue}break}}if(u>>>0<3){break ca}while(1){u=A+(d-n<<3)|0;i=m*(m*(m*(m*i+L[u>>3])+L[u+8>>3])+L[u+16>>3]);u=n-3|0;i=i+L[A+(d-u<<3)>>3];n=n-4|0;if(u>>>0>1){continue}break}}L[e>>3]=i;d=0;fa:{if((w|0)<0){break fa}while(1){y=M(w-d|0,80)+a|0;n=d<<3;h=L[(y+n|0)+8488>>3];H=n+A|0;n=d;ga:{if(!d){break ga}s=0;u=n&3;if(u){while(1){d=d-1|0;h=j*h+L[(y+(d<<3)|0)+8488>>3];s=s+1|0;if((u|0)!=(s|0)){continue}break}}if(n-1>>>0<3){break ga}while(1){s=y+8488|0;u=s+(d<<3)|0;h=j*(j*(j*(j*h+L[u-8>>3])+L[u-16>>3])+L[u-24>>3]);u=d-4|0;h=h+L[s+(u<<3)>>3];s=(d|0)>4;d=u;if(s){continue}break}}L[H>>3]=h;d=n+1|0;if((n|0)!=(w|0)){continue}break}h=L[A>>3];if((w|0)<=0){break fa}n=w-1|0;d=w+1|0;u=w&3;if(u){s=0;while(1){h=m*h+L[A+(d-w<<3)>>3];w=w-1|0;s=s+1|0;if((u|0)!=(s|0)){continue}break}}if(n>>>0<3){break fa}while(1){n=A+(d-w<<3)|0;h=m*(m*(m*(m*h+L[n>>3])+L[n+8>>3])+L[n+16>>3]);n=w-3|0;h=h+L[A+(d-n<<3)>>3];w=w-4|0;if(n>>>0>1){continue}break}}L[f>>3]=h;L[e>>3]=L[e>>3]+l;L[f>>3]=L[f>>3]+k;break ba}L[e>>3]=l;L[f>>3]=k}d=G[g>>2];if(d){break aa}h=L[e>>3];ha:{if(h<.5){break ha}i=L[f>>3];if(i<.5|h>L[a+136>>3]+.5){break ha}d=0;if(!(i>L[a+144>>3]+.5)){break aa}}d=2;G[g>>2]=2}L[a+608>>3]=c;L[a+600>>3]=b;G[a+3308>>2]=d;L[a+576>>3]=L[e>>3];L[a+584>>3]=L[f>>3]}Fa=q+32|0}function li(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{switch(e-11|0){case 3:z:{switch(a-11|0){default:if((a|0)!=82){break x}if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=L[(a<<3)+b>>3]!=0;i=a|1;E[i+g|0]=L[(i<<3)+b>>3]!=0;i=a|2;E[i+g|0]=L[(i<<3)+b>>3]!=0;i=a|3;E[i+g|0]=L[(i<<3)+b>>3]!=0;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break e}while(1){E[a+g|0]=L[(a<<3)+b>>3]!=0;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break e;case 31:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=K[(a<<2)+b>>2]!=N(0);i=a|1;E[i+g|0]=K[(i<<2)+b>>2]!=N(0);i=a|2;E[i+g|0]=K[(i<<2)+b>>2]!=N(0);i=a|3;E[i+g|0]=K[(i<<2)+b>>2]!=N(0);a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break e}while(1){E[a+g|0]=K[(a<<2)+b>>2]!=N(0);a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break e;case 30:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=G[(a<<2)+b>>2]!=0;i=a|1;E[i+g|0]=G[(i<<2)+b>>2]!=0;i=a|2;E[i+g|0]=G[(i<<2)+b>>2]!=0;i=a|3;E[i+g|0]=G[(i<<2)+b>>2]!=0;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break e}while(1){E[a+g|0]=G[(a<<2)+b>>2]!=0;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break e;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=I[(a<<1)+b>>1]!=0;i=a|1;E[i+g|0]=I[(i<<1)+b>>1]!=0;i=a|2;E[i+g|0]=I[(i<<1)+b>>1]!=0;i=a|3;E[i+g|0]=I[(i<<1)+b>>1]!=0;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break e}while(1){E[a+g|0]=I[(a<<1)+b>>1]!=0;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break e;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break x;case 0:case 3:break z}}if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=H[a+b|0]!=0;i=a|1;E[i+g|0]=H[b+i|0]!=0;i=a|2;E[i+g|0]=H[b+i|0]!=0;i=a|3;E[i+g|0]=H[b+i|0]!=0;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break e}while(1){E[a+g|0]=H[a+b|0]!=0;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break e;case 0:A:{switch(a-11|0){case 30:a=0;if((d|0)<=0){break d}while(1){B:{if(H[a+c|0]){E[a+g|0]=H[f|0];G[h>>2]=1;break B}e=G[(a<<2)+b>>2];if((e|0)<0){G[309737]=-11;E[a+g|0]=0;break B}if(e>>>0>=256){G[309737]=-11;E[a+g|0]=255;break B}E[a+g|0]=e}a=a+1|0;if((d|0)!=(a|0)){continue}break};break d;case 31:tp(b,d,1,0,0,0,0,0,g,1238948);break f;default:if((a|0)==82){break i}break;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break A;case 0:case 3:break g;case 10:break h}}G[309737]=410;break f;case 10:C:{switch(a-11|0){case 30:a=0;if((d|0)<=0){break d}while(1){D:{if(H[a+c|0]){F[(a<<1)+g>>1]=I[f>>1];G[h>>2]=1;break D}e=G[(a<<2)+b>>2];if((e|0)<=-32769){G[309737]=-11;F[(a<<1)+g>>1]=32768;break D}if((e|0)>=32768){G[309737]=-11;F[(a<<1)+g>>1]=32767;break D}F[(a<<1)+g>>1]=e}a=a+1|0;if((d|0)!=(a|0)){continue}break};break d;case 31:Xk(b,d,1,0,0,0,0,0,g,1238948);break j;default:if((a|0)==82){break m}break;case 10:break k;case 0:case 3:break l;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break C}}G[309737]=410;break j;case 20:E:{switch(a-11|0){case 30:if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<2;G[k+g>>2]=G[b+k>>2];l=k|4;G[l+g>>2]=G[b+l>>2];l=k|8;G[l+g>>2]=G[b+l>>2];k=k|12;G[k+g>>2]=G[b+k>>2];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break n}while(1){k=a<<2;G[k+g>>2]=G[b+k>>2];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break};break n;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){G[(a<<2)+g>>2]=F[(a<<1)+b>>1];i=a|1;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|2;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|3;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break n}while(1){G[(a<<2)+g>>2]=F[(a<<1)+b>>1];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break n;case 0:case 3:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){G[(a<<2)+g>>2]=H[a+b|0];i=a|1;G[(i<<2)+g>>2]=H[b+i|0];i=a|2;G[(i<<2)+g>>2]=H[b+i|0];i=a|3;G[(i<<2)+g>>2]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break n}while(1){G[(a<<2)+g>>2]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break n;case 31:Rp(b,d,1,0,0,0,0,0,g,1238948);break n;default:if((a|0)==82){break o}break;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break E}}G[309737]=410;break n;case 30:F:{switch(a-11|0){case 30:if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<2;G[k+g>>2]=G[b+k>>2];l=k|4;G[l+g>>2]=G[b+l>>2];l=k|8;G[l+g>>2]=G[b+l>>2];k=k|12;G[k+g>>2]=G[b+k>>2];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break p}while(1){k=a<<2;G[k+g>>2]=G[b+k>>2];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break};break p;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){G[(a<<2)+g>>2]=F[(a<<1)+b>>1];i=a|1;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|2;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|3;G[(i<<2)+g>>2]=F[(i<<1)+b>>1];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break p}while(1){G[(a<<2)+g>>2]=F[(a<<1)+b>>1];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break p;case 0:case 3:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){G[(a<<2)+g>>2]=H[a+b|0];i=a|1;G[(i<<2)+g>>2]=H[b+i|0];i=a|2;G[(i<<2)+g>>2]=H[b+i|0];i=a|3;G[(i<<2)+g>>2]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break p}while(1){G[(a<<2)+g>>2]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break p;case 31:al(b,d,1,0,0,0,0,0,g,1238948);break p;default:if((a|0)==82){break q}break;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break F}}G[309737]=410;break p;case 70:G:{switch(a-11|0){case 30:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){i=(a<<3)+g|0;l=G[(a<<2)+b>>2];G[i>>2]=l;G[i+4>>2]=l>>31;i=a|1;l=(i<<3)+g|0;i=G[(i<<2)+b>>2];G[l>>2]=i;G[l+4>>2]=i>>31;i=a|2;l=(i<<3)+g|0;i=G[(i<<2)+b>>2];G[l>>2]=i;G[l+4>>2]=i>>31;i=a|3;l=(i<<3)+g|0;i=G[(i<<2)+b>>2];G[l>>2]=i;G[l+4>>2]=i>>31;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break r}while(1){k=(a<<3)+g|0;i=G[(a<<2)+b>>2];G[k>>2]=i;G[k+4>>2]=i>>31;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break r;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){i=(a<<3)+g|0;l=F[(a<<1)+b>>1];G[i>>2]=l;G[i+4>>2]=l>>31;i=a|1;l=(i<<3)+g|0;i=F[(i<<1)+b>>1];G[l>>2]=i;G[l+4>>2]=i>>31;i=a|2;l=(i<<3)+g|0;i=F[(i<<1)+b>>1];G[l>>2]=i;G[l+4>>2]=i>>31;i=a|3;l=(i<<3)+g|0;i=F[(i<<1)+b>>1];G[l>>2]=i;G[l+4>>2]=i>>31;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break r}while(1){k=(a<<3)+g|0;i=F[(a<<1)+b>>1];G[k>>2]=i;G[k+4>>2]=i>>31;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break r;case 0:case 3:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){i=(a<<3)+g|0;G[i>>2]=H[a+b|0];G[i+4>>2]=0;i=a|1;l=(i<<3)+g|0;G[l>>2]=H[b+i|0];G[l+4>>2]=0;i=a|2;l=(i<<3)+g|0;G[l>>2]=H[b+i|0];G[l+4>>2]=0;i=a|3;l=(i<<3)+g|0;G[l>>2]=H[b+i|0];G[l+4>>2]=0;a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break r}while(1){k=(a<<3)+g|0;G[k>>2]=H[a+b|0];G[k+4>>2]=0;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break r;case 31:Zp(b,d,1,0,0,0,0,0,0,g,1238948);break r;default:if((a|0)==82){break s}break;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break G}}G[309737]=410;break r;case 31:H:{switch(a-11|0){case 31:if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<2;K[k+g>>2]=K[b+k>>2];l=k|4;K[l+g>>2]=K[b+l>>2];l=k|8;K[l+g>>2]=K[b+l>>2];k=k|12;K[k+g>>2]=K[b+k>>2];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break t}while(1){k=a<<2;K[k+g>>2]=K[b+k>>2];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break};break t;case 30:if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<2;K[k+g>>2]=G[b+k>>2];l=k|4;K[l+g>>2]=G[b+l>>2];l=k|8;K[l+g>>2]=G[b+l>>2];k=k|12;K[k+g>>2]=G[b+k>>2];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break t}while(1){k=a<<2;K[k+g>>2]=G[b+k>>2];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break};break t;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){K[(a<<2)+g>>2]=F[(a<<1)+b>>1];i=a|1;K[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|2;K[(i<<2)+g>>2]=F[(i<<1)+b>>1];i=a|3;K[(i<<2)+g>>2]=F[(i<<1)+b>>1];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break t}while(1){K[(a<<2)+g>>2]=F[(a<<1)+b>>1];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break t;case 0:case 3:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){K[(a<<2)+g>>2]=H[a+b|0];i=a|1;K[(i<<2)+g>>2]=H[b+i|0];i=a|2;K[(i<<2)+g>>2]=H[b+i|0];i=a|3;K[(i<<2)+g>>2]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break t}while(1){K[(a<<2)+g>>2]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break t;default:if((a|0)==82){break u}break;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break H}}G[309737]=410;break t;case 71:I:{switch(a-11|0){default:if((a|0)!=82){break w}if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<3;L[k+g>>3]=L[b+k>>3];l=k|8;L[l+g>>3]=L[b+l>>3];l=k|16;L[l+g>>3]=L[b+l>>3];k=k|24;L[k+g>>3]=L[b+k>>3];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break v}while(1){k=a<<3;L[k+g>>3]=L[b+k>>3];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break};break v;case 31:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){L[(a<<3)+g>>3]=K[(a<<2)+b>>2];i=a|1;L[(i<<3)+g>>3]=K[(i<<2)+b>>2];i=a|2;L[(i<<3)+g>>3]=K[(i<<2)+b>>2];i=a|3;L[(i<<3)+g>>3]=K[(i<<2)+b>>2];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break v}while(1){L[(a<<3)+g>>3]=K[(a<<2)+b>>2];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break v;case 30:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){L[(a<<3)+g>>3]=G[(a<<2)+b>>2];i=a|1;L[(i<<3)+g>>3]=G[(i<<2)+b>>2];i=a|2;L[(i<<3)+g>>3]=G[(i<<2)+b>>2];i=a|3;L[(i<<3)+g>>3]=G[(i<<2)+b>>2];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break v}while(1){L[(a<<3)+g>>3]=G[(a<<2)+b>>2];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break v;case 10:if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){L[(a<<3)+g>>3]=F[(a<<1)+b>>1];i=a|1;L[(i<<3)+g>>3]=F[(i<<1)+b>>1];i=a|2;L[(i<<3)+g>>3]=F[(i<<1)+b>>1];i=a|3;L[(i<<3)+g>>3]=F[(i<<1)+b>>1];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break v}while(1){L[(a<<3)+g>>3]=F[(a<<1)+b>>1];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break v;case 0:case 3:break I;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break w}}if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){L[(a<<3)+g>>3]=H[a+b|0];i=a|1;L[(i<<3)+g>>3]=H[b+i|0];i=a|2;L[(i<<3)+g>>3]=H[b+i|0];i=a|3;L[(i<<3)+g>>3]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break v}while(1){L[(a<<3)+g>>3]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break};break v;default:break y}}G[309737]=410;break d}G[309737]=410;break e}G[309737]=410}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){L[(b<<3)+g>>3]=L[f>>3];G[h>>2]=1}j=b|1;if(H[j+c|0]){L[(j<<3)+g>>3]=L[f>>3];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}L[(b<<3)+g>>3]=L[f>>3];break a}Wi(b,d,1,0,0,N(0),0,0,g)}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){K[(b<<2)+g>>2]=K[f>>2];G[h>>2]=1}j=b|1;if(H[j+c|0]){K[(j<<2)+g>>2]=K[f>>2];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}K[(b<<2)+g>>2]=K[f>>2];break a}Yp(b,d,1,0,0,0,0,0,0,g,1238948)}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){k=G[f+4>>2];j=(b<<3)+g|0;G[j>>2]=G[f>>2];G[j+4>>2]=k;G[h>>2]=1}j=b|1;if(H[j+c|0]){k=G[f+4>>2];j=(j<<3)+g|0;G[j>>2]=G[f>>2];G[j+4>>2]=k;G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}a=(b<<3)+g|0;b=G[f+4>>2];G[a>>2]=G[f>>2];G[a+4>>2]=b;break a}$k(b,d,1,0,0,0,0,0,g,1238948)}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){G[(b<<2)+g>>2]=G[f>>2];G[h>>2]=1}j=b|1;if(H[j+c|0]){G[(j<<2)+g>>2]=G[f>>2];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}break c}Qp(b,d,1,0,0,0,0,0,g,1238948)}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){G[(b<<2)+g>>2]=G[f>>2];G[h>>2]=1}j=b|1;if(H[j+c|0]){G[(j<<2)+g>>2]=G[f>>2];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}break c}Wk(b,d,1,0,0,0,0,0,g,1238948);break j}if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){F[(a<<1)+g>>1]=H[a+b|0];i=a|1;F[(i<<1)+g>>1]=H[b+i|0];i=a|2;F[(i<<1)+g>>1]=H[b+i|0];i=a|3;F[(i<<1)+g>>1]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break j}while(1){F[(a<<1)+g>>1]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break}break j}if((d|0)<=0){break d}a=0;if(d-1>>>0>=3){i=d&-4;e=0;while(1){k=a<<1;F[k+g>>1]=I[b+k>>1];l=k|2;F[l+g>>1]=I[b+l>>1];l=k|4;F[l+g>>1]=I[b+l>>1];k=k|6;F[k+g>>1]=I[b+k>>1];a=a+4|0;e=e+4|0;if((i|0)!=(e|0)){continue}break}}e=d&3;if(!e){break j}while(1){k=a<<1;F[k+g>>1]=I[b+k>>1];a=a+1|0;j=j+1|0;if((e|0)!=(j|0)){continue}break}}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){F[(b<<1)+g>>1]=I[f>>1];G[h>>2]=1}j=b|1;if(H[j+c|0]){F[(j<<1)+g>>1]=I[f>>1];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}F[(b<<1)+g>>1]=I[f>>1];break a}sp(b,d,1,0,0,0,0,0,g,1238948);break f}Tk(b,d,1,0,0,0,0,0,0,g,1238948);break f}if((d|0)<=0){break d}e=0;a=0;if(d-1>>>0>=3){k=d&-4;while(1){E[a+g|0]=H[a+b|0];i=a|1;E[i+g|0]=H[b+i|0];i=a|2;E[i+g|0]=H[b+i|0];i=a|3;E[i+g|0]=H[b+i|0];a=a+4|0;j=j+4|0;if((k|0)!=(j|0)){continue}break}}j=d&3;if(!j){break f}while(1){E[a+g|0]=H[a+b|0];a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break}}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){E[b+g|0]=H[f|0];G[h>>2]=1}j=b|1;if(H[j+c|0]){E[g+j|0]=H[f|0];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}break b}if((d|0)<=0){break d}a=d&1;b=0;if((d|0)!=1){e=d&-2;d=0;while(1){if(H[b+c|0]){E[b+g|0]=H[f|0];G[h>>2]=1}j=b|1;if(H[j+c|0]){E[g+j|0]=H[f|0];G[h>>2]=1}b=b+2|0;d=d+2|0;if((e|0)!=(d|0)){continue}break}}if(!a|!H[b+c|0]){break d}break b}return}G[(b<<2)+g>>2]=G[f>>2];break a}E[b+g|0]=H[f|0]}G[h>>2]=1}function Wf(a,b,c){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=N(0),r=0,s=0;l=Fa-448|0;Fa=l;d=G[c>>2];if((d|0)<=0){a:{if((Sd(a,1,l+352|0,c)|0)>0){tb(5,45368);break a}d=rb(l+272|0,l+352|0,8);E[d+8|0]=0;b:{if(H[d+7|0]!=32){break b}E[d+7|0]=0;if(H[d+6|0]!=32){break b}E[d+6|0]=0;if(H[d+5|0]!=32){break b}E[d+5|0]=0;if(H[d+4|0]!=32){break b}E[d+4|0]=0;if(H[d+3|0]!=32){break b}E[d+3|0]=0;if(H[d+2|0]!=32){break b}E[d+2|0]=0;if(H[d+1|0]!=32){break b}E[d+1|0]=0;if(H[d|0]!=32){break b}E[d|0]=0}if((mc(l+352|0,l+192|0,l+112|0,c)|0)>0){tb(5,39481);tb(5,l+352|0);break a}c:{d:{if(!nb(d,35530,7)){bo(a,c);if(!b){break d}G[b>>2]=0;break d}if(!nb(d,34516,9)){if((fd(l+192|0,l+32|0,c)|0)>0){break c}d=l+32|0;while(1){e=d;d=d+1|0;if(H[e|0]==32){continue}break}if(!Xa(e,35630)){h=Fa-464|0;Fa=h;e:{if(G[c>>2]>0){break e}e=G[a>>2];d=G[a+4>>2];if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);d=G[a+4>>2]}G[d+80>>2]=1;e=G[d+44>>2];G[d+104>>2]=G[d+40>>2];G[d+108>>2]=e;if((mo(a,h+440|0,h+432|0,h+448|0,h+460|0,c)|0)>0){break e}if(G[h+448>>2]|G[h+452>>2]){tb(5,45670);G[h+80>>2]=G[h+448>>2];d=h+96|0;Ya(d,81,27397,h+80|0);tb(5,d);G[c>>2]=214;break e}i=G[h+444>>2];e=G[a+4>>2];d=e;G[d+960>>2]=G[h+440>>2];G[d+964>>2]=i;G[d+936>>2]=G[h+460>>2];if(G[d+1228>>2]){d=0;i=(G[e+1112>>2]-1|0)/G[e+1052>>2]|0;if((i|0)>=0){while(1){g=d<<2;e=G[a+4>>2];f=G[g+G[e+1240>>2]>>2];if(f){Wa(f);e=G[a+4>>2]}e=G[G[e+1244>>2]+g>>2];if(e){Wa(e)}e=(d|0)!=(i|0);d=d+1|0;if(e){continue}break}e=G[a+4>>2]}Wa(G[e+1248>>2]);Wa(G[G[a+4>>2]+1236>>2]);Wa(G[G[a+4>>2]+1232>>2]);Wa(G[G[a+4>>2]+1244>>2]);Wa(G[G[a+4>>2]+1240>>2]);Wa(G[G[a+4>>2]+1228>>2]);e=G[a+4>>2];d=e;G[d+1228>>2]=0;G[d+1232>>2]=0;d=d+1244|0;G[d>>2]=0;G[d+4>>2]=0;d=e+1236|0;G[d>>2]=0;G[d+4>>2]=0}d=G[e+968>>2];if(d){Wa(d)}f:{g:{i=G[h+460>>2];if((i|0)>0){d=lb(i,160);if(d){break g}tb(5,50279);G[G[a+4>>2]+968>>2]=0;G[c>>2]=111;break e}f=G[a+4>>2];G[f+968>>2]=0;break f}f=G[a+4>>2];G[f+968>>2]=d;if(i-1>>>0>=3){g=i&-4;e=0;while(1){E[d+120|0]=1;G[d+104>>2]=0;G[d+108>>2]=0;G[d+96>>2]=0;G[d+100>>2]=1072693248;E[d|0]=0;E[d+160|0]=0;G[d+80>>2]=-9999;G[d+72>>2]=-1;G[d+76>>2]=-1;E[d+320|0]=0;E[d+480|0]=0;E[d+280|0]=1;G[d+264>>2]=0;G[d+268>>2]=0;G[d+256>>2]=0;G[d+260>>2]=1072693248;E[d+440|0]=1;G[d+424>>2]=0;G[d+428>>2]=0;G[d+416>>2]=0;G[d+420>>2]=1072693248;G[d+240>>2]=-9999;G[d+232>>2]=-1;G[d+236>>2]=-1;E[d+600|0]=1;G[d+584>>2]=0;G[d+588>>2]=0;G[d+576>>2]=0;G[d+580>>2]=1072693248;G[d+400>>2]=-9999;G[d+392>>2]=-1;G[d+396>>2]=-1;G[d+560>>2]=-9999;G[d+552>>2]=-1;G[d+556>>2]=-1;d=d+640|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}}i=i&3;if(!i){break f}e=0;while(1){E[d+120|0]=1;G[d+104>>2]=0;G[d+108>>2]=0;G[d+96>>2]=0;G[d+100>>2]=1072693248;E[d|0]=0;G[d+80>>2]=-9999;G[d+72>>2]=-1;G[d+76>>2]=-1;d=d+160|0;e=e+1|0;if((i|0)!=(e|0)){continue}break}}d=G[h+436>>2];e=G[h+432>>2];G[f+944>>2]=e;G[f+948>>2]=d;G[f+952>>2]=e;G[f+956>>2]=d;i=G[h+440>>2];g=G[h+444>>2];G[f+1088>>2]=0;G[f+984>>2]=0;G[f+988>>2]=0;r=f,s=Au(e,d,i,g),G[r+976>>2]=s;G[f+980>>2]=Ia;e=8;g=0;h:{while(1){Cf(a,e,h+352|0,h+272|0,h+192|0,c);i:{j:{k:{l:{m:{d=G[c>>2];switch(d-205|0){case 2:break j;case 0:break k;case 1:break l;default:break m}}if((d|0)==107){break h}}if((d|0)<=0){break i}break e}d=h+272|0;d=Va(d)+d|0;E[d|0]=39;E[d+1|0]=0}G[c>>2]=0}n:{d=H[h+352|0];o:{if((d|0)==84){ao(a,h+352|0,h+272|0,c);f=H[h+352|0];break o}f=G[h+352>>2];if((d|0)!=69){break o}if((f|0)==4476485){break n}}g=H[h+192|0]|(H[h+272|0]|f&255)?0:g+1|0;e=e+1|0;continue}break}i=G[a+4>>2];p=G[h+460>>2];if((p|0)>0){e=G[i+968>>2];f=0;while(1){if(G[e+80>>2]==-9999){d=h+352|0;zb(34641,f+1|0,d,c);G[h>>2]=d;d=h+96|0;Ya(d,81,45726,h);tb(5,d);G[c>>2]=232;break e}k=G[e+72>>2];d=G[e+76>>2];if((k&d)==-1){d=h+352|0;zb(34749,f+1|0,d,c);G[h+16>>2]=d;d=h+96|0;Ya(d,81,45726,h+16|0);tb(5,d);G[c>>2]=231;break e}p:{n=G[i+960>>2];j=G[i+964>>2];if(!(n|j)){break p}if(!((k>>>0>>0&(d|0)<=(j|0)|(d|0)<(j|0))&((d|0)>0|(d|0)>=0))){d=h+352|0;zb(34749,f+1|0,d,c);G[h+68>>2]=k;G[h+64>>2]=d;d=h+96|0;Ya(d,81,45767,h- -64|0);tb(5,d);G[c>>2]=234;break e}o=G[e+152>>2];k=o+k|0;d=(o>>31)+d|0;d=k>>>0>>0?d+1|0:d;if((d|0)<=(j|0)&k>>>0<=n>>>0|(d|0)<(j|0)){break p}G[h+48>>2]=f+1;d=h+96|0;Ya(d,81,50344,h+48|0);tb(5,d);G[h+36>>2]=G[G[a+4>>2]+960>>2];G[h+32>>2]=e+140;Ya(d,81,27412,h+32|0);tb(5,d);G[c>>2]=236;break e}e=e+160|0;f=f+1|0;if((p|0)!=(f|0)){continue}break}}e=G[i+124>>2];d=G[i+120>>2];g=M(g,80)+80|0;G[i+104>>2]=d-g;G[i+108>>2]=e-((g>>31)+(d>>>0>>0)|0);g=e-(d>>>0<80)|0;d=d-80|0;e=Cu(d,g);f=(d-e|0)+2880|0;d=g-(Ia+(d>>>0>>0)|0)|0;e=f;G[i+128>>2]=e;d=e>>>0<2880?d+1|0:d;G[i+132>>2]=d;g=G[i+96>>2]+(G[i+76>>2]<<3)|0;k=e;f=Au(G[h+432>>2],G[h+436>>2],G[h+440>>2],G[h+444>>2])+2879|0;e=Ia;e=f>>>0<2879?e+1|0:e;j=f;f=k+f|0;k=d;d=e;e=k+d|0;e=f>>>0>>0?e+1|0:e;d=Cu(j,d);G[g+8>>2]=f-d;G[g+12>>2]=e-(Ia+(d>>>0>f>>>0)|0);d=G[g+4>>2];G[i+120>>2]=G[g>>2];G[i+124>>2]=d;break e}tb(5,45615);G[c>>2]=210}Fa=h+464|0;if(!b){break d}G[b>>2]=1;break d}q:{r:{if(!Xa(e,35618)){break r}if(!Xa(e,35627)){break r}if(Xa(e,35628)){break q}}i=Fa-416|0;Fa=i;s:{if(G[c>>2]>0){break s}e=G[a>>2];d=G[a+4>>2];if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);d=G[a+4>>2]}G[d+80>>2]=2;e=G[d+44>>2];G[d+104>>2]=G[d+40>>2];G[d+108>>2]=e;if((mo(a,i+392|0,i+384|0,i+400|0,i+412|0,c)|0)>0){break s}g=G[i+396>>2];e=G[a+4>>2];d=e;G[d+960>>2]=G[i+392>>2];G[d+964>>2]=g;G[d+936>>2]=G[i+412>>2];if(G[d+1228>>2]){d=0;g=(G[e+1112>>2]-1|0)/G[e+1052>>2]|0;if((g|0)>=0){while(1){h=d<<2;e=G[a+4>>2];f=G[h+G[e+1240>>2]>>2];if(f){Wa(f);e=G[a+4>>2]}e=G[G[e+1244>>2]+h>>2];if(e){Wa(e)}e=(d|0)!=(g|0);d=d+1|0;if(e){continue}break}e=G[a+4>>2]}Wa(G[e+1248>>2]);Wa(G[G[a+4>>2]+1236>>2]);Wa(G[G[a+4>>2]+1232>>2]);Wa(G[G[a+4>>2]+1244>>2]);Wa(G[G[a+4>>2]+1240>>2]);Wa(G[G[a+4>>2]+1228>>2]);e=G[a+4>>2];d=e;G[d+1228>>2]=0;G[d+1232>>2]=0;d=d+1244|0;G[d>>2]=0;G[d+4>>2]=0;d=e+1236|0;G[d>>2]=0;G[d+4>>2]=0}d=G[e+968>>2];if(d){Wa(d)}t:{u:{g=G[i+412>>2];if((g|0)>0){d=lb(g,160);if(d){break u}tb(5,50214);G[G[a+4>>2]+968>>2]=0;G[c>>2]=111;break s}f=G[a+4>>2];G[f+968>>2]=0;break t}f=G[a+4>>2];G[f+968>>2]=d;if((g|0)!=1){h=g&-2;e=0;while(1){G[d+112>>2]=1234554321;G[d+116>>2]=0;G[d+104>>2]=0;G[d+108>>2]=0;G[d+96>>2]=0;G[d+100>>2]=1072693248;E[d|0]=0;E[d+160|0]=0;E[d+120|0]=0;G[d+88>>2]=1;G[d+92>>2]=0;G[d+80>>2]=-9999;G[d+272>>2]=1234554321;G[d+276>>2]=0;G[d+264>>2]=0;G[d+268>>2]=0;G[d+256>>2]=0;G[d+260>>2]=1072693248;E[d+280|0]=0;G[d+248>>2]=1;G[d+252>>2]=0;G[d+240>>2]=-9999;d=d+320|0;e=e+2|0;if((h|0)!=(e|0)){continue}break}}if(!(g&1)){break t}G[d+112>>2]=1234554321;G[d+116>>2]=0;G[d+104>>2]=0;G[d+108>>2]=0;G[d+96>>2]=0;G[d+100>>2]=1072693248;E[d|0]=0;E[d+120|0]=0;G[d+88>>2]=1;G[d+92>>2]=0;G[d+80>>2]=-9999}d=G[i+388>>2];e=G[i+384>>2];G[f+944>>2]=e;G[f+948>>2]=d;G[f+952>>2]=e;G[f+956>>2]=d;r=f,s=Au(e,d,G[i+392>>2],G[i+396>>2]),G[r+976>>2]=s;G[f+980>>2]=Ia;d=G[i+400>>2];e=G[i+404>>2];G[f+1088>>2]=0;G[f+984>>2]=d;G[f+988>>2]=e;d=8;g=0;v:{while(1){Cf(a,d,i+288|0,i+208|0,i+128|0,c);w:{x:{y:{z:{A:{e=G[c>>2];switch(e-205|0){case 2:break x;case 0:break y;case 1:break z;default:break A}}if((e|0)==107){break v}}if((e|0)<=0){break w}break s}e=i+208|0;e=Va(e)+e|0;E[e|0]=39;E[e+1|0]=0}G[c>>2]=0}B:{C:{D:{E:{F:{h=H[i+288|0];switch(h-84|0){case 6:break E;case 0:break F;default:break D}}ao(a,i+288|0,i+208|0,c);e=H[i+288|0];break C}e=90;if(nb(i+288|0,35668,7)|H[i+208|0]!=84){break C}G[G[a+4>>2]+1088>>2]=1;break C}e=G[i+288>>2];if((h|0)!=69){break C}if((e|0)==4476485){break B}}g=H[i+128|0]|(H[i+208|0]|e&255)?0:g+1|0;d=d+1|0;continue}break}h=G[a+4>>2];f=G[i+412>>2];if((f|0)>0){e=G[h+968>>2];d=0;while(1){d=d+1|0;if(G[e+80>>2]==-9999){e=d;d=i+288|0;zb(34641,e,d,c);G[i>>2]=d;d=i+32|0;Ya(d,81,45574,i);tb(5,d);G[c>>2]=232;break s}e=e+160|0;if((d|0)!=(f|0)){continue}break}}e=G[h+124>>2];d=G[h+120>>2];g=M(g,80)+80|0;G[h+104>>2]=d-g;G[h+108>>2]=e-((g>>31)+(d>>>0>>0)|0);g=e-(d>>>0<80)|0;d=d-80|0;e=Cu(d,g);f=(d-e|0)+2880|0;e=g-(Ia+(d>>>0>>0)|0)|0;d=f;G[h+128>>2]=d;e=d>>>0<2880?e+1|0:e;G[h+132>>2]=e;g=e;f=G[h+96>>2]+(G[h+76>>2]<<3)|0;k=d;e=G[h+988>>2]+G[h+980>>2]|0;j=G[h+976>>2];d=j+G[h+984>>2]|0;h=d+2879|0;d=d>>>0>>0?e+1|0:e;d=h>>>0<2879?d+1|0:d;j=h;h=k+h|0;e=d;d=d+g|0;e=Cu(j,e);G[f+8>>2]=h-e;G[f+12>>2]=(h>>>0>>0?d+1|0:d)-(Ia+(e>>>0>h>>>0)|0);g=0;e=0;f=0;h=Fa-112|0;Fa=h;G:{if(G[c>>2]>0){break G}j=G[a>>2];d=G[a+4>>2];H:{I:{if((j|0)!=G[d+76>>2]){mb(a,j+1|0,0,c);break I}if((G[d+128>>2]&G[d+132>>2])!=-1){break I}if((Rb(a,c)|0)>0){break H}}j=G[a+4>>2];d=G[j+968>>2];j=G[j+936>>2];G[i+376>>2]=0;G[i+380>>2]=0;if((j|0)<=0){break H}while(1){G[d+72>>2]=g;G[d+76>>2]=e;J:{K:{L:{e=G[d+80>>2];g=e-1|0;if(g){if((g|0)==15){break K}else{break L}}e=G[d+92>>2];g=G[d+88>>2]+7|0;e=g>>>0<7?e+1|0:e;g=Bu(g,e,8,0);e=Ia;break J}if((e|0)>0){g=Au(G[d+88>>2],G[d+92>>2],(e>>>0)/10|0,0);e=Ia;break J}k=d+140|0;e=k;while(1){g=E[e|0];e=e+1|0;if(g-48>>>0<10){continue}break}M:{switch((g&255)-80|0){case 0:g=G[d+88>>2];e=G[d+92>>2]<<3|g>>>29;g=g<<3;break J;case 1:g=G[d+88>>2];e=G[d+92>>2]<<4|g>>>28;g=g<<4;break J;default:break M}}G[h>>2]=k;d=h+16|0;Ya(d,81,9871,h);tb(5,d);G[c>>2]=261;break G}g=G[d+88>>2];e=G[d+92>>2]}k=G[i+376>>2];g=k+g|0;e=G[i+380>>2]+e|0;e=g>>>0>>0?e+1|0:e;G[i+376>>2]=g;G[i+380>>2]=e;d=d+160|0;f=f+1|0;if((j|0)!=(f|0)){continue}break}}}Fa=h+112|0;d=G[i+376>>2];e=G[i+392>>2];if((d|0)!=(e|0)|G[i+380>>2]!=G[i+396>>2]){G[i+20>>2]=d;G[i+16>>2]=e;d=i+32|0;Ya(d,81,27469,i+16|0);tb(5,d);G[c>>2]=241}d=G[a+4>>2];e=G[d+96>>2]+(G[d+76>>2]<<3)|0;g=G[e+4>>2];G[d+120>>2]=G[e>>2];G[d+124>>2]=g;if(G[d+1088>>2]!=1){break s}f=Fa-208|0;Fa=f;G[f+32>>2]=0;N:{if(G[c>>2]>0){break N}if((Cb(a,16,35408,f+48|0,0,c)|0)>0){Ua(15952);Ua(13201);break N}E[G[a+4>>2]+1092|0]=0;d=11;qb(G[a+4>>2]+1092|0,f+48|0,11);O:{P:{Q:{R:{S:{T:{U:{g=H[f+48|0];switch(g-71|0){case 0:break S;case 1:break T;case 11:break U;default:break R}}if(!nb(f+48|0,41123,7)){break Q}if(!nb(f+48|0,35427,9)){break Q}break P}if(nb(f+48|0,41076,12)){break P}d=41;break Q}if(!nb(f+48|0,41109,7)){d=21;break Q}if(nb(f+48|0,40739,7)){break P}d=22;break Q}e=G[f+48>>2];h=G[f+52>>2];if((g|0)==66){d=51;if((e|0)==1346984514&(h|0)==3235634){break Q}}V:{switch((e&255)-78|0){case 2:if(nb(f+48|0,41116,7)){break P}d=31;break Q;case 0:break V;default:break P}}if(nb(f+48|0,33718,11)){break P}d=-1}e=G[a+4>>2];G[e+1048>>2]=d;if((Cb(a,31,32893,e+1104|0,0,c)|0)>0){Ua(26247);break N}G[f+40>>2]=0;G[f+44>>2]=0;W:{X:{if(G[G[a+4>>2]+1104>>2]>=0){break X}if((dc(a,0,34356,f+32|0,f+44|0)|0)!=219){break X}if((dc(a,0,35636,f+32|0,f+40|0)|0)!=219){break X}G[G[a+4>>2]+1076>>2]=1176255488;break W}G[f+44>>2]=0;if((Cb(a,16,32673,f+48|0,0,f+44|0)|0)>0){d=G[a+4>>2];G[d+1076>>2]=0;G[d+1080>>2]=0;break W}Y:{Z:{_:{switch(H[f+48|0]-78|0){case 0:if(nb(f+48|0,35436,5)){break Z}G[G[a+4>>2]+1076>>2]=1176255488;break W;case 5:break _;default:break Y}}if(!nb(f+48|0,41088,21)){G[G[a+4>>2]+1080>>2]=1;break W}if(nb(f+48|0,40718,21)){break Y}G[G[a+4>>2]+1080>>2]=2;break W}if(nb(f+48|0,34039,10)){break Y}G[G[a+4>>2]+1080>>2]=-1;break W}G[G[a+4>>2]+1080>>2]=0}G[f+44>>2]=0;d=Cb(a,31,41550,f+36|0,0,f+44|0);e=G[a+4>>2];G[e+1084>>2]=(d|0)<=0?G[f+36>>2]:1;if((Cb(a,31,33763,e+1108|0,0,c)|0)>0){Ua(26294);break N}$:{d=G[G[a+4>>2]+1108>>2];if((d|0)<=0){Ua(63525);break $}aa:{ba:{ca:{if(d>>>0<7){d=0;e=1;j=1;while(1){h=d+1|0;G[f+16>>2]=h;g=f+128|0;Ya(g,75,29932,f+16|0);k=d<<2;Cb(a,41,g,(k+G[a+4>>2]|0)+1112|0,0,c);if(G[c>>2]>0){Ua(26200);break N}G[f>>2]=h;Ya(f+128|0,75,29987,f);g=G[a+4>>2];da:{if(!d){G[g+1052>>2]=G[g+1112>>2];break da}G[(g+k|0)+1052>>2]=1}G[f+44>>2]=0;Cb(a,41,f+128|0,(g+k|0)+1052|0,0,f+44|0);g=G[a+4>>2];k=k+g|0;d=G[k+1052>>2];j=M(((G[k+1112>>2]-1|0)/(d|0)|0)+1|0,j);e=M(d,e);d=h;if((d|0)>2]){continue}break}if((j|0)!=G[g+952>>2]|G[g+956>>2]!=j>>31){Ua(24707);break O}d=G[g+1048>>2];if((d|0)!=41){if((d|0)!=11){break aa}if((Cb(a,31,41273,g+1212|0,0,c)|0)>0){Ua(26340);break N}G[f+44>>2]=0;ea:{if(!Cb(a,16,40889,f+48|0,0,f+44|0)){if(H[f+48|0]==78){d=nb(f+48|0,33385,9);G[f+44>>2]=0;if(d){break ea}break ca}G[f+44>>2]=0;break ea}G[f+44>>2]=0}if((Cb(a,31,40860,G[a+4>>2]+1216|0,0,f+44|0)|0)>0){break ca}g=G[a+4>>2];break ba}if((Cb(a,42,41273,g+1220|0,0,c)|0)>0){Ua(26340);break N}G[f+44>>2]=0;Cb(a,31,40860,G[a+4>>2]+1224|0,0,f+44|0);g=G[a+4>>2];break aa}Ua(6584);break $}g=G[a+4>>2];G[g+1216>>2]=4}h=G[g+1212>>2];if((h|0)>15){break aa}d=G[g+1216>>2];if((d|0)<9){break aa}G[f+44>>2]=d;G[g+1212>>2]=d;G[g+1216>>2]=h}G[g+1136>>2]=e;d=e;e=G[g+1104>>2];h=G[g+1212>>2];j=G[g+1048>>2];fa:{if((j|0)==11){if((e|0)==16){d=(((d|0)/(h|0)|0)+(d<<1)|0)+6|0;break fa}d=(((d|0)/(h|0)|0)+(d<<2)|0)+6|0;break fa}ga:{if(j-21>>>0<=1){ha:{switch(e-8|0){case 8:d=d<<1;break fa;case 0:break ga;default:break ha}}d=d<<2;break fa}ia:{switch(j-41|0){case 10:m=+(d|0)*1.01*+(e|0)*.125+601;if(O(m)<2147483648){d=~~m;break fa}d=-2147483648;break fa;case 0:ja:{switch(e-8|0){case 0:case 8:m=+(d|0)*2.2+26;if(O(m)<2147483648){d=~~m;break fa}d=-2147483648;break fa;default:break ja}}m=+(d|0)*4.4+26;if(O(m)<2147483648){d=~~m;break fa}d=-2147483648;break fa;default:break ia}}d=d<<2}}G[g+1140>>2]=d;if((dc(a,0,35951,g+1144|0,c)|0)>0){Ua(51886);break O}rh();G[f+44>>2]=0;d=f+44|0;dc(a,0,35949,G[a+4>>2]+1148|0,d);G[f+44>>2]=0;dc(a,0,35928,G[a+4>>2]+1152|0,d);G[f+44>>2]=0;ka:{if((dc(a,0,35636,G[a+4>>2]+1156|0,d)|0)<=0){break ka}G[f+44>>2]=0;if((Cb(a,82,35636,G[a+4>>2]+1168|0,0,f+44|0)|0)>0){break ka}G[G[a+4>>2]+1156>>2]=-1}G[f+44>>2]=0;la:{if((dc(a,0,34356,G[a+4>>2]+1160|0,f+44|0)|0)<=0){break la}G[f+44>>2]=0;if((Cb(a,82,34356,G[a+4>>2]+1176|0,0,f+44|0)|0)>0){break la}G[G[a+4>>2]+1160>>2]=-1}G[f+44>>2]=0;ma:{if((dc(a,0,34861,G[a+4>>2]+1164|0,f+44|0)|0)<=0){break ma}G[f+44>>2]=0;if((Cb(a,31,34861,G[a+4>>2]+1208|0,0,f+44|0)|0)>0){G[f+44>>2]=0;if((Cb(a,31,34862,G[a+4>>2]+1208|0,0,f+44|0)|0)>0){break ma}}G[G[a+4>>2]+1164>>2]=-1}G[f+44>>2]=0;e=Cb(a,82,35661,G[a+4>>2]+1184|0,0,f+44|0);d=G[a+4>>2];if((e|0)>0){G[d+1184>>2]=0;G[d+1188>>2]=1072693248}G[f+44>>2]=0;e=Cb(a,82,34377,d+1192|0,0,f+44|0);d=G[a+4>>2];na:{if((e|0)>0){e=d+1192|0;G[e>>2]=0;G[e+4>>2]=0;G[e+8>>2]=0;G[e+12>>2]=0;break na}L[d+1200>>3]=L[d+1192>>3]}q=K[d+1020>>2];if(q!=N(0)){K[d+1076>>2]=q}qh();break N}G[c>>2]=212;break N}Ua(37781);Ua(f+48|0)}G[c>>2]=414}Fa=f+208|0;break s}tb(5,45518);G[c>>2]=210}Fa=i+416|0;if(!b){break d}G[b>>2]=2;break d}G[l+444>>2]=0;bo(a,l+444|0);d=G[l+444>>2];if(!(!b|(d|0)!=251)){G[b>>2]=-1;break d}G[c>>2]=d;if(!b){break d}G[b>>2]=0;break d}oa:{switch(H[l+352|0]){case 0:case 10:G[c>>2]=107;break d;default:break oa}}G[c>>2]=252;tb(5,49619);tb(5,l+352|0)}b=G[a+4>>2];d=(G[b+76>>2]<<3)+G[b+96>>2]|0;f=J[d+8>>2]>2];d=G[d+12>>2];e=G[b+44>>2];if(f&(d|0)<=(e|0)|(d|0)<(e|0)){G[b+48>>2]=0;break a}G[b+48>>2]=1;Ym(a,l,c);if(nb(l,42094,7)){if(nb(l,42043,11)){break a}}b=a;a=G[a+4>>2];a=(G[a+76>>2]<<3)+G[a+96>>2]|0;Wm(b,G[a+8>>2],G[a+12>>2],c);break a}tb(5,38683);tb(5,l+192|0)}d=G[c>>2]}Fa=l+448|0;return d}function Jm(a,b,c,d){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,r=0,s=0,t=0,u=0,w=0,x=0,y=0,z=0,A=0,C=0,D=0,F=0,I=0;p=Fa-48|0;Fa=p;a:{if(c>>>0<=2){c=c<<2;z=G[c+92732>>2];A=G[c+92720>>2];while(1){c=G[b+4>>2];b:{if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break b}c=jc(b)}if((c|0)==32|c-9>>>0<5){continue}break}n=1;c:{d:{switch(c-43|0){case 0:case 2:break d;default:break c}}n=(c|0)==45?-1:1;c=G[b+4>>2];if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break c}c=jc(b)}e:{f:{while(1){if(E[g+2831|0]==(c|32)){g:{if(g>>>0>6){break g}c=G[b+4>>2];if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break g}c=jc(b)}g=g+1|0;if((g|0)!=8){continue}break f}break}if((g|0)!=3){if((g|0)==8){break f}if(!d|g>>>0<4){break e}if((g|0)==8){break f}}c=G[b+116>>2];if((c|0)>0|(c|0)>=0){G[b+4>>2]=G[b+4>>2]-1}if(!d|g>>>0<4){break f}c=(c|0)<0;while(1){if(!c){G[b+4>>2]=G[b+4>>2]-1}g=g-1|0;if(g>>>0>3){continue}break}}j=Fa-16|0;Fa=j;g=(B(N(N(n|0)*N(Y))),v(2));b=g&2147483647;h:{if(b-8388608>>>0<=2130706431){k=b<<25;c=(b>>>7|0)+1065353216|0;break h}k=g<<25;c=g>>>7|2147418112;if(b>>>0>=2139095040){break h}k=0;c=0;if(!b){break h}c=b;b=P(b);od(j,c,0,0,0,b+81|0);i=G[j>>2];h=G[j+4>>2];k=G[j+8>>2];c=G[j+12>>2]^65536|16265-b<<16}G[p>>2]=i;G[p+4>>2]=h;G[p+8>>2]=k;G[p+12>>2]=g&-2147483648|c;Fa=j+16|0;i=G[p+8>>2];h=G[p+12>>2];k=G[p>>2];j=G[p+4>>2];break a}i:{j:{k:{if(g){break k}g=0;while(1){if(E[g+16008|0]!=(c|32)){break k}l:{if(g>>>0>1){break l}c=G[b+4>>2];if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break l}c=jc(b)}g=g+1|0;if((g|0)!=3){continue}break}break j}m:{switch(g|0){case 0:n:{if((c|0)!=48){break n}g=G[b+4>>2];o:{if((g|0)!=G[b+104>>2]){G[b+4>>2]=g+1;g=H[g|0];break o}g=jc(b)}if((g&-33)==88){f=Fa-432|0;Fa=f;c=G[b+4>>2];p:{if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;g=H[c|0];break p}g=jc(b)}q:{r:{while(1){if((g|0)!=48){s:{if((g|0)!=46){break q}c=G[b+4>>2];if((c|0)==G[b+104>>2]){break s}G[b+4>>2]=c+1;g=H[c|0];break r}}else{c=G[b+4>>2];if((c|0)!=G[b+104>>2]){s=1;G[b+4>>2]=c+1;g=H[c|0]}else{s=1;g=jc(b)}continue}break}g=jc(b)}e=1;if((g|0)!=48){break q}while(1){c=q;q=c-1|0;r=r-!c|0;c=G[b+4>>2];t:{if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;g=H[c|0];break t}g=jc(b)}if((g|0)==48){continue}break}s=1}j=1073676288;while(1){u:{c=g|32;v:{w:{F=g-48|0;if(F>>>0<10){break w}if((g|0)!=46&c-97>>>0>=6){break u}if((g|0)!=46){break w}if(e){break u}e=1;q=i;r=h;break v}c=(g|0)>57?c-87|0:F;x:{if((h|0)<=0&i>>>0<=7|(h|0)<0){t=c+(t<<4)|0;break x}if(!h&i>>>0<=28){Zd(f+48|0,c);tc(f+32|0,x,y,k,j,0,0,0,1073414144);x=G[f+32>>2];y=G[f+36>>2];k=G[f+40>>2];j=G[f+44>>2];tc(f+16|0,G[f+48>>2],G[f+52>>2],G[f+56>>2],G[f+60>>2],x,y,k,j);Zc(f,G[f+16>>2],G[f+20>>2],G[f+24>>2],G[f+28>>2],l,o,u,w);u=G[f+8>>2];w=G[f+12>>2];l=G[f>>2];o=G[f+4>>2];break x}if(m|!c){break x}tc(f+80|0,x,y,k,j,0,0,0,1073610752);Zc(f- -64|0,G[f+80>>2],G[f+84>>2],G[f+88>>2],G[f+92>>2],l,o,u,w);u=G[f+72>>2];w=G[f+76>>2];m=1;l=G[f+64>>2];o=G[f+68>>2]}c=i+1|0;h=c?h:h+1|0;i=c;s=1}c=G[b+4>>2];if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;g=H[c|0]}else{g=jc(b)}continue}break}y:{if(!s){c=G[b+116>>2];z:{A:{if((c|0)>0|(c|0)>=0){c=G[b+4>>2];G[b+4>>2]=c-1;if(!d){break A}G[b+4>>2]=c-2;if(!e){break z}G[b+4>>2]=c-3;break z}if(d){break z}}te(b,0,0)}td(f+96|0,+(n|0)*0);l=G[f+96>>2];o=G[f+100>>2];c=G[f+108>>2];b=G[f+104>>2];break y}if((h|0)<=0&i>>>0<=7|(h|0)<0){k=i;j=h;while(1){t=t<<4;c=k+1|0;j=c?j:j+1|0;k=c;if((c|0)!=8|j){continue}break}}B:{C:{D:{if((g&-33)==80){k=Hm(b,d);c=Ia;j=c;if(k|(c|0)!=-2147483648){break B}if(d){c=G[b+116>>2];if((c|0)>0|(c|0)>=0){break D}break C}l=0;o=0;te(b,0,0);c=0;b=0;break y}k=0;j=0;if(G[b+116>>2]<0){break B}}G[b+4>>2]=G[b+4>>2]-1}k=0;j=0}if(!t){td(f+112|0,+(n|0)*0);l=G[f+112>>2];o=G[f+116>>2];c=G[f+124>>2];b=G[f+120>>2];break y}b=e?q:i;h=(e?r:h)<<2|b>>>30;b=k+(b<<2)|0;d=h+j|0;d=b>>>0>>0?d+1|0:d;i=b-32|0;h=d-(b>>>0<32)|0;b=h;if(i>>>0>0-z>>>0&(b|0)>=0|(b|0)>0){G[48624]=68;Zd(f+160|0,n);tc(f+144|0,G[f+160>>2],G[f+164>>2],G[f+168>>2],G[f+172>>2],-1,-1,-1,2147418111);tc(f+128|0,G[f+144>>2],G[f+148>>2],G[f+152>>2],G[f+156>>2],-1,-1,-1,2147418111);l=G[f+128>>2];o=G[f+132>>2];c=G[f+140>>2];b=G[f+136>>2];break y}b=z-226|0;c=b>>31;if((h|0)>=(c|0)&b>>>0<=i>>>0|(c|0)<(h|0)){if((t|0)>=0){while(1){Zc(f+416|0,l,o,u,w,0,0,0,-1073807360);c=Zm(l,o,u,w,1073610752);b=(c|0)<0;Zc(f+400|0,l,o,u,w,b?l:G[f+416>>2],b?o:G[f+420>>2],b?u:G[f+424>>2],b?w:G[f+428>>2]);b=i;i=b-1|0;h=h-!b|0;u=G[f+408>>2];w=G[f+412>>2];l=G[f+400>>2];o=G[f+404>>2];t=t<<1|(c|0)>=0;if((t|0)>=0){continue}break}}d=h-((z>>31)+(i>>>0>>0)|0)|0;b=(i-z|0)+32|0;d=b>>>0<32?d+1|0:d;c=b>>>0>>0&(d|0)<=0|(d|0)<0?(b|0)>0?b:0:A;E:{if((c|0)>=113){Zd(f+384|0,n);q=G[f+392>>2];r=G[f+396>>2];x=G[f+384>>2];y=G[f+388>>2];h=0;b=0;break E}td(f+352|0,Qf(1,144-c|0));Zd(f+336|0,n);x=G[f+336>>2];y=G[f+340>>2];q=G[f+344>>2];r=G[f+348>>2];Tm(f+368|0,G[f+352>>2],G[f+356>>2],G[f+360>>2],G[f+364>>2],x,y,q,r);C=G[f+376>>2];D=G[f+380>>2];h=G[f+372>>2];b=G[f+368>>2]}c=!(t&1)&((Sf(l,o,u,w,0,0,0,0)|0)!=0&(c|0)<32);wg(f+320|0,c+t|0);tc(f+304|0,x,y,q,r,G[f+320>>2],G[f+324>>2],G[f+328>>2],G[f+332>>2]);d=b;Zc(f+272|0,G[f+304>>2],G[f+308>>2],G[f+312>>2],G[f+316>>2],b,h,C,D);b=c;tc(f+288|0,x,y,q,r,b?0:l,b?0:o,b?0:u,b?0:w);Zc(f+256|0,G[f+288>>2],G[f+292>>2],G[f+296>>2],G[f+300>>2],G[f+272>>2],G[f+276>>2],G[f+280>>2],G[f+284>>2]);Fj(f+240|0,G[f+256>>2],G[f+260>>2],G[f+264>>2],G[f+268>>2],d,h,C,D);b=G[f+240>>2];c=G[f+244>>2];d=G[f+248>>2];h=G[f+252>>2];if(!Sf(b,c,d,h,0,0,0,0)){G[48624]=68}Om(f+224|0,b,c,d,h,i);l=G[f+224>>2];o=G[f+228>>2];c=G[f+236>>2];b=G[f+232>>2];break y}G[48624]=68;Zd(f+208|0,n);tc(f+192|0,G[f+208>>2],G[f+212>>2],G[f+216>>2],G[f+220>>2],0,0,0,65536);tc(f+176|0,G[f+192>>2],G[f+196>>2],G[f+200>>2],G[f+204>>2],0,0,0,65536);l=G[f+176>>2];o=G[f+180>>2];c=G[f+188>>2];b=G[f+184>>2]}G[p+16>>2]=l;G[p+20>>2]=o;G[p+24>>2]=b;G[p+28>>2]=c;Fa=f+432|0;i=G[p+24>>2];h=G[p+28>>2];k=G[p+16>>2];j=G[p+20>>2];break a}if(G[b+116>>2]<0){break n}G[b+4>>2]=G[b+4>>2]-1}g=b;f=n;t=d;d=0;n=0;e=Fa-8976|0;Fa=e;D=z+A|0;F=0-D|0;F:{G:{while(1){if((c|0)!=48){H:{if((c|0)!=46){break F}b=G[g+4>>2];if((b|0)==G[g+104>>2]){break H}G[g+4>>2]=b+1;c=H[b|0];break G}}else{b=G[g+4>>2];if((b|0)!=G[g+104>>2]){d=1;G[g+4>>2]=b+1;c=H[b|0]}else{d=1;c=jc(g)}continue}break}c=jc(g)}m=1;if((c|0)!=48){break F}while(1){b=i;i=b-1|0;h=h-!b|0;b=G[g+4>>2];I:{if((b|0)!=G[g+104>>2]){G[g+4>>2]=b+1;c=H[b|0];break I}c=jc(g)}if((c|0)==48){continue}break}d=1}G[e+784>>2]=0;J:{K:{b=(c|0)==46;l=c-48|0;L:{M:{N:{O:{if(b|l>>>0<=9){while(1){P:{if(b&1){if(!m){i=k;h=j;m=1;break P}b=!d;break O}b=k+1|0;j=b?j:j+1|0;k=b;if((n|0)<=2044){C=(c|0)==48?C:k;b=(e+784|0)+(n<<2)|0;if(s){l=(M(G[b>>2],10)+c|0)-48|0}G[b>>2]=l;d=1;c=s+1|0;b=(c|0)==9;s=b?0:c;n=b+n|0;break P}if((c|0)==48){break P}G[e+8960>>2]=G[e+8960>>2]|1;C=18396}b=G[g+4>>2];Q:{if((b|0)!=G[g+104>>2]){G[g+4>>2]=b+1;c=H[b|0];break Q}c=jc(g)}b=(c|0)==46;l=c-48|0;if(b|l>>>0<10){continue}break}}i=m?i:k;h=m?h:j;if(!(!d|(c&-33)!=69)){l=Hm(g,t);b=Ia;o=b;R:{if(l|(b|0)!=-2147483648){break R}if(!t){break L}l=0;o=0;if(G[g+116>>2]<0){break R}G[g+4>>2]=G[g+4>>2]-1}if(!d){break M}h=h+o|0;b=i+l|0;h=b>>>0>>0?h+1|0:h;i=b;break K}b=!d;if((c|0)<0){break N}}if(G[g+116>>2]<0){break N}G[g+4>>2]=G[g+4>>2]-1}if(!b){break K}}G[48624]=28}k=0;j=0;te(g,0,0);c=0;b=0;break J}b=G[e+784>>2];if(!b){td(e,+(f|0)*0);k=G[e>>2];j=G[e+4>>2];c=G[e+12>>2];b=G[e+8>>2];break J}if(!(k>>>0>9&(j|0)>=0|(j|0)>0|((i|0)!=(k|0)|(h|0)!=(j|0))|(b>>>A|0?(A|0)<=30:0))){Zd(e+48|0,f);wg(e+32|0,b);tc(e+16|0,G[e+48>>2],G[e+52>>2],G[e+56>>2],G[e+60>>2],G[e+32>>2],G[e+36>>2],G[e+40>>2],G[e+44>>2]);k=G[e+16>>2];j=G[e+20>>2];c=G[e+28>>2];b=G[e+24>>2];break J}if(i>>>0>(z|0)/-2>>>0&(h|0)>=0|(h|0)>0){G[48624]=68;Zd(e+96|0,f);tc(e+80|0,G[e+96>>2],G[e+100>>2],G[e+104>>2],G[e+108>>2],-1,-1,-1,2147418111);tc(e- -64|0,G[e+80>>2],G[e+84>>2],G[e+88>>2],G[e+92>>2],-1,-1,-1,2147418111);k=G[e+64>>2];j=G[e+68>>2];c=G[e+76>>2];b=G[e+72>>2];break J}b=z-226|0;c=i>>>0>>0;b=b>>31;if(c&(h|0)<=(b|0)|(b|0)>(h|0)){G[48624]=68;Zd(e+144|0,f);tc(e+128|0,G[e+144>>2],G[e+148>>2],G[e+152>>2],G[e+156>>2],0,0,0,65536);tc(e+112|0,G[e+128>>2],G[e+132>>2],G[e+136>>2],G[e+140>>2],0,0,0,65536);k=G[e+112>>2];j=G[e+116>>2];c=G[e+124>>2];b=G[e+120>>2];break J}if(s){if((s|0)<=8){b=(e+784|0)+(n<<2)|0;g=G[b>>2];while(1){g=M(g,10);s=s+1|0;if((s|0)!=9){continue}break}G[b>>2]=g}n=n+1|0}S:{m=i;if((C|0)>(i|0)|(C|0)>=9|(i|0)>17){break S}if((m|0)==9){Zd(e+192|0,f);wg(e+176|0,G[e+784>>2]);tc(e+160|0,G[e+192>>2],G[e+196>>2],G[e+200>>2],G[e+204>>2],G[e+176>>2],G[e+180>>2],G[e+184>>2],G[e+188>>2]);k=G[e+160>>2];j=G[e+164>>2];c=G[e+172>>2];b=G[e+168>>2];break J}if((m|0)<=8){Zd(e+272|0,f);wg(e+256|0,G[e+784>>2]);tc(e+240|0,G[e+272>>2],G[e+276>>2],G[e+280>>2],G[e+284>>2],G[e+256>>2],G[e+260>>2],G[e+264>>2],G[e+268>>2]);Zd(e+224|0,G[(0-m<<2)+92720>>2]);Nm(e+208|0,G[e+240>>2],G[e+244>>2],G[e+248>>2],G[e+252>>2],G[e+224>>2],G[e+228>>2],G[e+232>>2],G[e+236>>2]);k=G[e+208>>2];j=G[e+212>>2];c=G[e+220>>2];b=G[e+216>>2];break J}b=(M(m,-3)+A|0)+27|0;c=G[e+784>>2];if(c>>>b|0?(b|0)<=30:0){break S}Zd(e+352|0,f);wg(e+336|0,c);tc(e+320|0,G[e+352>>2],G[e+356>>2],G[e+360>>2],G[e+364>>2],G[e+336>>2],G[e+340>>2],G[e+344>>2],G[e+348>>2]);Zd(e+304|0,G[(m<<2)+92648>>2]);tc(e+288|0,G[e+320>>2],G[e+324>>2],G[e+328>>2],G[e+332>>2],G[e+304>>2],G[e+308>>2],G[e+312>>2],G[e+316>>2]);k=G[e+288>>2];j=G[e+292>>2];c=G[e+300>>2];b=G[e+296>>2];break J}while(1){c=n;n=c-1|0;if(!G[(e+784|0)+(n<<2)>>2]){continue}break}s=0;d=(m|0)%9|0;T:{if(!d){b=0;break T}b=0;d=(m|0)<0?d+9|0:d;U:{if(!c){c=0;break U}i=G[(0-d<<2)+92720>>2];j=1e9/(i|0)|0;l=0;g=0;while(1){h=l;k=(e+784|0)+(g<<2)|0;n=G[k>>2];l=(n>>>0)/(i>>>0)|0;h=h+l|0;G[k>>2]=h;h=!h&(b|0)==(g|0);b=h?b+1&2047:b;m=h?m-9|0:m;l=M(j,n-M(i,l)|0);g=g+1|0;if((g|0)!=(c|0)){continue}break}if(!l){break U}G[(e+784|0)+(c<<2)>>2]=l;c=c+1|0}m=(m-d|0)+9|0}while(1){k=(e+784|0)+(b<<2)|0;V:{while(1){if(((m|0)!=36|J[k>>2]>=10384593)&(m|0)>=36){break V}d=c+2047|0;l=0;while(1){g=d&2047;n=(e+784|0)+(g<<2)|0;d=G[n>>2];j=d>>>3|0;h=d<<29;i=h+l|0;d=j;d=h>>>0>i>>>0?d+1|0:d;h=d;if(!h&i>>>0<1000000001){l=0}else{d=i;l=Du(d,h,1e9,0);i=d-Au(l,Ia,1e9,0)|0}G[n>>2]=i;c=(g|0)!=(c-1&2047)?c:(b|0)==(g|0)?c:i?c:g;d=g-1|0;if((b|0)!=(g|0)){continue}break}s=s-29|0;if(!l){continue}break}b=b-1&2047;if((c|0)==(b|0)){d=e+784|0;i=d+((c+2046&2047)<<2)|0;c=c-1&2047;G[i>>2]=G[i>>2]|G[d+(c<<2)>>2]}m=m+9|0;G[(e+784|0)+(b<<2)>>2]=l;continue}break}W:{X:while(1){i=c+1&2047;j=(e+784|0)+((c-1&2047)<<2)|0;while(1){h=(m|0)>45?9:1;Y:{while(1){d=b;g=0;Z:{while(1){_:{b=d+g&2047;if((b|0)==(c|0)){break _}b=G[(e+784|0)+(b<<2)>>2];k=G[(g<<2)+92672>>2];if(b>>>0>>0){break _}if(b>>>0>k>>>0){break Z}g=g+1|0;if((g|0)!=4){continue}}break}if((m|0)!=36){break Z}i=0;h=0;g=0;k=0;j=0;while(1){b=d+g&2047;if((b|0)==(c|0)){c=c+1&2047;G[(e+(c<<2)|0)+780>>2]=0}wg(e+768|0,G[(e+784|0)+(b<<2)>>2]);tc(e+752|0,i,h,k,j,0,0,1342177280,1075633366);Zc(e+736|0,G[e+752>>2],G[e+756>>2],G[e+760>>2],G[e+764>>2],G[e+768>>2],G[e+772>>2],G[e+776>>2],G[e+780>>2]);k=G[e+744>>2];j=G[e+748>>2];i=G[e+736>>2];h=G[e+740>>2];g=g+1|0;if((g|0)!=4){continue}break}Zd(e+720|0,f);tc(e+704|0,i,h,k,j,G[e+720>>2],G[e+724>>2],G[e+728>>2],G[e+732>>2]);k=G[e+712>>2];j=G[e+716>>2];i=0;h=0;l=G[e+704>>2];o=G[e+708>>2];t=s+113|0;g=t-z|0;n=(g|0)<(A|0);b=n?(g|0)>0?g:0:A;if((b|0)<=112){break Y}break W}s=h+s|0;b=c;if((d|0)==(b|0)){continue}break}k=1e9>>>h|0;n=-1<>2];g=(t>>>h|0)+g|0;G[l>>2]=g;g=!g&(b|0)==(d|0);b=g?b+1&2047:b;m=g?m-9|0:m;g=M(k,n&t);d=d+1&2047;if((d|0)!=(c|0)){continue}break}if(!g){continue}if((b|0)!=(i|0)){G[(e+784|0)+(c<<2)>>2]=g;c=i;continue X}G[j>>2]=G[j>>2]|1;continue}break}break}td(e+656|0,Qf(1,225-b|0));Tm(e+688|0,G[e+656>>2],G[e+660>>2],G[e+664>>2],G[e+668>>2],l,o,k,j);x=G[e+696>>2];y=G[e+700>>2];u=G[e+688>>2];w=G[e+692>>2];td(e+640|0,Qf(1,113-b|0));Mm(e+672|0,l,o,k,j,G[e+640>>2],G[e+644>>2],G[e+648>>2],G[e+652>>2]);i=G[e+672>>2];h=G[e+676>>2];q=G[e+680>>2];r=G[e+684>>2];Fj(e+624|0,l,o,k,j,i,h,q,r);Zc(e+608|0,u,w,x,y,G[e+624>>2],G[e+628>>2],G[e+632>>2],G[e+636>>2]);k=G[e+616>>2];j=G[e+620>>2];l=G[e+608>>2];o=G[e+612>>2]}m=d+4&2047;$:{if((m|0)==(c|0)){break $}m=G[(e+784|0)+(m<<2)>>2];aa:{if(m>>>0<=499999999){if(!m&(d+5&2047)==(c|0)){break aa}td(e+496|0,+(f|0)*.25);Zc(e+480|0,i,h,q,r,G[e+496>>2],G[e+500>>2],G[e+504>>2],G[e+508>>2]);q=G[e+488>>2];r=G[e+492>>2];i=G[e+480>>2];h=G[e+484>>2];break aa}if((m|0)!=5e8){td(e+592|0,+(f|0)*.75);Zc(e+576|0,i,h,q,r,G[e+592>>2],G[e+596>>2],G[e+600>>2],G[e+604>>2]);q=G[e+584>>2];r=G[e+588>>2];i=G[e+576>>2];h=G[e+580>>2];break aa}I=+(f|0);if((d+5&2047)==(c|0)){td(e+528|0,I*.5);Zc(e+512|0,i,h,q,r,G[e+528>>2],G[e+532>>2],G[e+536>>2],G[e+540>>2]);q=G[e+520>>2];r=G[e+524>>2];i=G[e+512>>2];h=G[e+516>>2];break aa}td(e+560|0,I*.75);Zc(e+544|0,i,h,q,r,G[e+560>>2],G[e+564>>2],G[e+568>>2],G[e+572>>2]);q=G[e+552>>2];r=G[e+556>>2];i=G[e+544>>2];h=G[e+548>>2]}if((b|0)>111){break $}Mm(e+464|0,i,h,q,r,0,0,0,1073676288);if(Sf(G[e+464>>2],G[e+468>>2],G[e+472>>2],G[e+476>>2],0,0,0,0)){break $}Zc(e+448|0,i,h,q,r,0,0,0,1073676288);q=G[e+456>>2];r=G[e+460>>2];i=G[e+448>>2];h=G[e+452>>2]}Zc(e+432|0,l,o,k,j,i,h,q,r);Fj(e+416|0,G[e+432>>2],G[e+436>>2],G[e+440>>2],G[e+444>>2],u,w,x,y);k=G[e+424>>2];j=G[e+428>>2];l=G[e+416>>2];o=G[e+420>>2];ba:{if((-2-D|0)>=(t&2147483647)){break ba}G[e+408>>2]=k;G[e+412>>2]=j&2147483647;G[e+400>>2]=l;G[e+404>>2]=o;tc(e+384|0,l,o,k,j,0,0,0,1073610752);d=Zm(G[e+400>>2],G[e+404>>2],G[e+408>>2],G[e+412>>2],1081081856);c=(d|0)<0;k=c?k:G[e+392>>2];j=c?j:G[e+396>>2];l=c?l:G[e+384>>2];o=c?o:G[e+388>>2];s=((d|0)>=0)+s|0;if((Sf(i,h,q,r,0,0,0,0)|0)!=0&(c?n:n&(b|0)!=(g|0))?0:(s+110|0)<=(F|0)){break ba}G[48624]=68}Om(e+368|0,l,o,k,j,s);k=G[e+368>>2];j=G[e+372>>2];c=G[e+380>>2];b=G[e+376>>2]}G[p+40>>2]=b;G[p+44>>2]=c;G[p+32>>2]=k;G[p+36>>2]=j;Fa=e+8976|0;i=G[p+40>>2];h=G[p+44>>2];k=G[p+32>>2];j=G[p+36>>2];break a;case 3:break j;default:break m}}c=G[b+116>>2];if((c|0)>0|(c|0)>=0){G[b+4>>2]=G[b+4>>2]-1}break i}ca:{c=G[b+4>>2];da:{if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break da}c=jc(b)}if((c|0)==40){g=1;break ca}h=2147450880;if(G[b+116>>2]<0){break a}G[b+4>>2]=G[b+4>>2]-1;break a}while(1){ea:{c=G[b+4>>2];fa:{if((c|0)!=G[b+104>>2]){G[b+4>>2]=c+1;c=H[c|0];break fa}c=jc(b)}if(!(c-48>>>0<10|c-65>>>0<26|(c|0)==95)){if(c-97>>>0>=26){break ea}}g=g+1|0;continue}break}h=2147450880;if((c|0)==41){break a}c=G[b+116>>2];if((c|0)>0|(c|0)>=0){G[b+4>>2]=G[b+4>>2]-1}ga:{if(d){if(g){break ga}break a}break i}while(1){g=g-1|0;if((c|0)>0|(c|0)>=0){G[b+4>>2]=G[b+4>>2]-1}if(g){continue}break}break a}G[48624]=28;te(b,0,0)}h=0}G[a>>2]=k;G[a+4>>2]=j;G[a+8>>2]=i;G[a+12>>2]=h;Fa=p+48|0}function Yl(a,b,c,d){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,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,H=0,I=0,J=0,K=0,N=0,P=0;B=Fa+-64|0;Fa=B;G[935654]=-1571644103;G[935655]=1066524486;G[935656]=1413754136;G[935657]=1074340347;m=G[935572];G[935573]=m;G[935653]=0;h=ab(M(a,56));G[935658]=h;a:{b:{if(!h){break b}G[935653]=a;if((m|0)>=2){yb(36656);$a(G[29763]);a=G[935653]}if((a|0)>0){m=G[29763];while(1){if(G[935573]>=2){a=o<<3;e=L[a+b>>3];L[B+56>>3]=L[a+c>>3];L[B+48>>3]=e;gb(72389,B+48|0);$a(m)}a=G[935658]+M(o,56)|0;h=o<<3;f=L[h+b>>3];L[a>>3]=f;e=L[c+h>>3];L[a+8>>3]=e;g=L[467827];N=a,P=eb(f*g)*eb(e*g),L[N+16>>3]=P;i=f;f=L[467827];N=a,P=ib(i*f)*eb(e*f),L[N+24>>3]=P;f=L[467827];G[a+48>>2]=o;N=a,P=ib(e*f),L[N+32>>3]=P;o=o+1|0;if((o|0)>3]+L[s+32>>3];g=g+L[o+24>>3]+L[s+24>>3];e=e+L[o+16>>3]+L[s+16>>3];a=a+2|0;m=m+2|0;if((z|0)!=(m|0)){continue}break}}if(!(h&1)){break c}a=b+M(a,56)|0;f=f+L[a+32>>3];g=g+L[a+24>>3];e=e+L[a+16>>3]}i=f;f=V(f*f+(e*e+g*g));k=i/f;L[467834]=k;g=g/f;L[467833]=g;f=e/f;L[467832]=f;e=Db(g,f);j=L[467827];e=e/j;L[467830]=e;N=3742648,P=fc(k)/j,L[N>>3]=P;if(e>=360){while(1){e=e+-360;if(e>=360){continue}break}L[467830]=e}if(e<0){while(1){e=e+360;if(e<0){continue}break}L[467830]=e}a=0;if(G[935573]>=2){yb(38834);L[c+112>>3]=L[467832];gb(73105,c+112|0);L[c+96>>3]=L[467833];gb(73093,c+96|0);L[c+80>>3]=L[467834];gb(73081,c+80|0);L[c+64>>3]=L[467830];gb(71809,c- -64|0);L[c+48>>3]=L[467831];gb(90223,c+48|0);h=G[935653]}b=G[935658];e=1;d:{if((h|0)<=0){m=0;break d}m=0;while(1){o=b+M(a,56)|0;j=L[o+32>>3]*k+(L[o+16>>3]*f+g*L[o+24>>3]);o=j>3]=P;e=L[b>>3];a=b+M(m,56)|0;L[b>>3]=L[a>>3];L[a>>3]=e;e=L[b+8>>3];L[b+8>>3]=L[a+8>>3];L[a+8>>3]=e;e=L[b+16>>3];L[b+16>>3]=L[a+16>>3];L[a+16>>3]=e;e=L[b+24>>3];L[b+24>>3]=L[a+24>>3];L[a+24>>3]=e;e=L[b+32>>3];L[b+32>>3]=L[a+32>>3];L[a+32>>3]=e;m=G[b+48>>2];G[b+48>>2]=G[a+48>>2];G[a+48>>2]=m;G[b+52>>2]=0;G[b+40>>2]=0;G[b+44>>2]=-1074790400;e=L[b+16>>3];f=L[467833];g=L[b+24>>3];l=L[467832];k=e*f-g*l;v=g;g=L[467834];i=L[b+32>>3];j=v*g-i*f;l=i*l-e*g;e=V(k*k+(j*j+l*l));if(!(!(e>3]=e;gb(73024,c+32|0);$a(G[29763])}if(!(e<=0)){l=l/e;j=j/e;k=k/e}if(G[935653]>=2){a=G[935658];p=-j;h=G[29763];m=1;while(1){o=M(m,56);b=o+a|0;G[b+52>>2]=0;e=L[23878];i=L[a+16>>3];n=L[b+16>>3];g=L[a+24>>3];f=L[b+24>>3];e:{if(!(!(e>O(i-n))|!(e>O(g-f))|!(e>O(L[a+32>>3]-L[b+32>>3])))){G[b+40>>2]=0;G[b+44>>2]=0;G[b+52>>2]=1;G[935659]=G[935659]+1;break e}v=e;e=i*f-g*n;r=L[b+32>>3];q=L[a+32>>3];g=g*r-q*f;f=n*q-i*r;i=V(e*e+(g*g+f*f));if(!(!(v>i)|G[935573]<3)){L[c+16>>3]=i;gb(73024,c+16|0);$a(h)}if(!(i<=0)){f=f/i;g=g/i;e=e/i}i=j*f-l*g;f=l*e-k*f;g=p*e+k*g;e=V(i*i+(f*f+g*g));if(!(!(e>3]=e;gb(73024,c);$a(h)}f:{if(e<=0){e=0;break f}i=i/e;g=g/e;f=f/e}a=G[935658];b=o+a|0;L[b+40>>3]=e;if(!(L[a+32>>3]*i+(L[a+16>>3]*f+g*L[a+24>>3])<0)){break e}L[b+40>>3]=-e}m=m+1|0;if((m|0)=2){ej();a=G[935573]}if((a|0)>0){b=0;a=Fa+-64|0;Fa=a;yb(30686);L[a+48>>3]=L[467830];L[a+56>>3]=L[467831];gb(71476,a+48|0);L[a+32>>3]=L[467830];L[a+40>>3]=L[467831];gb(71497,a+32|0);e=L[467837]*2.2;L[a+16>>3]=e;L[a+24>>3]=e;gb(71538,a+16|0);yb(19839);yb(11636);yb(27702);yb(29237);if(G[935653]>0){while(1){c=G[935658]+M(b,56)|0;e=L[c+8>>3];L[a>>3]=L[c>>3];L[a+8>>3]=e;gb(68556,a);b=b+1|0;if((b|0)=2){yb(37661);ej()}g:{if(G[935659]<=0){break g}b=0;c=G[935653];if((c|0)>0){m=G[935658];o=0;while(1){a=m+M(o,56)|0;if(!G[a+52>>2]){c=m+M(b,56)|0;L[c>>3]=L[a>>3];L[c+8>>3]=L[a+8>>3];L[c+16>>3]=L[a+16>>3];L[c+24>>3]=L[a+24>>3];L[c+32>>3]=L[a+32>>3];L[c+40>>3]=L[a+40>>3];a=G[a+48>>2];G[c+52>>2]=0;G[c+48>>2]=a;c=G[935653];b=b+1|0}o=o+1|0;if((o|0)<(c|0)){continue}break}}G[935653]=b;if(G[935573]<2){break g}yb(40091);ej()}h=Fa-160|0;Fa=h;c=G[935658];h:{b=ab(8);if(b){i:{G[b+4>>2]=0;G[b>>2]=c;a=ab(8);if(!a){break i}G[a+4>>2]=b;G[a>>2]=c+56;j:{if(G[935653]>=3){E=G[29763];o=2;while(1){k:{if(G[935573]<2){break k}yb(48638);b=G[(G[935658]+M(o,56)|0)+48>>2];G[h+144>>2]=o;G[h+148>>2]=b;kb(86245,h+144|0);b=a;if(!a){yb(17300);break k}while(1){c=G[b>>2];m=G[c+48>>2];e=L[c>>3];f=L[c+8>>3];g=L[c+16>>3];k=L[c+24>>3];L[h+136>>3]=L[c+32>>3];L[h+128>>3]=k;L[h+120>>3]=g;L[h+112>>3]=f;L[h+104>>3]=e;G[h+96>>2]=m;gb(71391,h+96|0);b=G[b+4>>2];if(b){continue}break}}m=G[a+4>>2];l:{if(m){s=G[935658];b=G[a>>2];c=a;break l}s=G[935658];c=ab(8);if(!c){break i}G[c+4>>2]=a;b=M(o,56)+s|0;G[c>>2]=b;o=o+1|0;m=a}a=s;s=M(o,56);z=a+s|0;a=Fa-48|0;Fa=a;m=G[m>>2];f=L[m+16>>3];g=L[b+24>>3];k=L[m+24>>3];j=L[b+16>>3];e=f*g-k*j;i=k;k=L[b+32>>3];l=L[m+32>>3];g=i*k-l*g;f=l*j-f*k;k=V(e*e+(g*g+f*f));if(!(!(k>3]=k;gb(73024,a+32|0);$a(G[29763])}if(!(k<=0)){f=f/k;g=g/k;e=e/k}l=L[b+16>>3];j=L[z+24>>3];i=L[b+24>>3];n=L[z+16>>3];k=l*j-i*n;v=i;i=L[z+32>>3];p=L[b+32>>3];j=v*i-p*j;l=p*n-l*i;i=V(k*k+(j*j+l*l));if(!(!(i>3]=i;gb(73024,a+16|0);$a(G[29763])}if(!(i<=0)){l=l/i;j=j/i;k=k/i}i=j*f-l*g;f=l*e-k*f;e=g*k-j*e;g=V(i*i+(f*f+e*e));if(!(!(g>3]=g;gb(73024,a);$a(G[29763])}if(!(g<=0)){i=i/g;f=f/g;e=e/g}Fa=a+48|0;a=G[935573];m:{if(!(L[b+32>>3]*i+(L[b+16>>3]*f+e*L[b+24>>3])>0)){if((a|0)>=2){a=G[(s+G[935658]|0)+48>>2];b=G[b+48>>2];G[h+80>>2]=G[m+48>>2];G[h+84>>2]=b;G[h+88>>2]=a;G[h+92>>2]=a;kb(88440,h+80|0);$a(E)}b=G[935658];a=ab(8);if(!a){break i}G[a+4>>2]=c;G[a>>2]=b+s;o=o+1|0;break m}if((a|0)>=3){a=G[(s+G[935658]|0)+48>>2];s=G[G[c>>2]+48>>2];b=G[b+48>>2];G[h+64>>2]=G[m+48>>2];G[h+68>>2]=b;G[h+72>>2]=a;G[h+76>>2]=s;kb(88402,h- -64|0);$a(E)}a=G[c+4>>2];Wa(c)}n:{if(G[935573]<2){break n}b=G[(G[935658]+M(o,56)|0)+48>>2];G[h+48>>2]=o;G[h+52>>2]=b;kb(86289,h+48|0);b=a;if(!a){yb(17300);break n}while(1){c=G[b>>2];m=G[c+48>>2];e=L[c>>3];f=L[c+8>>3];g=L[c+16>>3];k=L[c+24>>3];L[h+40>>3]=L[c+32>>3];L[h+32>>3]=k;L[h+24>>3]=g;L[h+16>>3]=f;L[h+8>>3]=e;G[h>>2]=m;gb(71391,h);b=G[b+4>>2];if(b){continue}break}}if(G[935653]>(o|0)){continue}break}if((o|0)>2){break j}}a=0}Fa=h+160|0;break h}}yb(65598);sc(1);W()}G[935652]=a;if(!a){break b}a=G[935573];if((a|0)>=2){yb(37307);o=G[935652];o:{if(o){while(1){a=G[o>>2];b=G[a+48>>2];e=L[a>>3];f=L[a+8>>3];g=L[a+16>>3];k=L[a+24>>3];L[B+40>>3]=L[a+32>>3];L[B+32>>3]=k;L[B+24>>3]=g;L[B+16>>3]=f;L[B+8>>3]=e;G[B>>2]=b;gb(71391,B);o=G[o+4>>2];if(o){continue}break o}}yb(17300)}a=G[935573]}if((a|0)>0){a=Fa-48|0;Fa=a;b=G[935652];p:{if(!b){break p}yb(3901);c=G[b>>2];e=L[c>>3];L[a+40>>3]=L[c+8>>3];L[a+32>>3]=e;gb(71654,a+32|0);c=G[b+4>>2];if(!c){break p}while(1){m=G[c>>2];e=L[m>>3];L[a+24>>3]=L[m+8>>3];L[a+16>>3]=e;gb(71634,a+16|0);c=G[c+4>>2];if(c){continue}break}}b=G[b>>2];e=L[b>>3];L[a+8>>3]=L[b+8>>3];L[a>>3]=e;gb(71634,a);yb(4674);$a(G[29763]);Fa=a+48|0}o=0;q:{switch(d|0){case 0:b=0;c=0;h=Fa-592|0;Fa=h;a=G[935652];r:{if(a){e=999;f=-999;s=1;m=a;while(1){d=G[m>>2];g=L[d+32>>3];s=g>0?0:s;z=e>g;e=z?g:e;c=z?d:c;z=f>2];if(m){continue}break}if((s|0)!=1){break r}}c=b}m=G[935573];if((m|0)>=2){G[h+576>>2]=G[c+48>>2];kb(75467,h+576|0);$a(G[29763]);m=G[935573]}e=L[c+24>>3];f=L[c+16>>3];g=e*0+f*-0;j=L[c+32>>3];k=j*0-e;l=j*-0+f;e=V(g*g+(k*k+l*l));if(!(!(e>3]=e;gb(73024,h+560|0);$a(G[29763])}if(!(e<=0)){l=l/e;k=k/e;g=g/e}e=L[c+16>>3];f=L[c+24>>3];q=e*l-f*k;i=f*g;f=L[c+32>>3];w=i-f*l;x=k*f-e*g;e=V(q*q+(w*w+x*x));if(!(!(e>3]=e;gb(73024,h+544|0);$a(G[29763])}if(!(e<=0)){x=x/e;w=w/e;q=q/e}r=-k;t=-l;s:{if(!a){s=G[935573];n=L[23878];break s}s=G[935573];n=L[23878];z=G[29763];p=999;d=a;while(1){c=G[d>>2];d=G[d+4>>2];f=L[c+16>>3];e=L[c+24>>3];i=f*l+e*r;j=L[c+32>>3];e=e*g+j*t;f=k*j-f*g;j=V(i*i+(e*e+f*f));if(!(!(j>3]=j;gb(73024,h+528|0);$a(z);s=G[935573];n=L[23878]}if(!(j<=0)){i=i/j;f=f/j;e=e/j}e=i*q+(e*w+x*f);m=e>3];f=L[b+24>>3];j=e*l+f*r;i=f*g;f=L[b+32>>3];p=i+f*t;u=k*f-e*g;e=V(j*j+(p*p+u*u));if(!(!(e>3]=e;gb(73024,h+512|0);$a(G[29763])}if(!(e<=0)){u=u/e;p=p/e;j=j/e}if(G[935573]>=2){G[h+496>>2]=G[b+48>>2];kb(75446,h+496|0);$a(G[29763])}e=999;f=-999;d=G[a>>2];c=d;b=a;while(1){m=G[b>>2];i=L[m+32>>3]*g+(L[m+16>>3]*k+l*L[m+24>>3]);s=i>2];if(b){continue}break};f=L[c+24>>3];i=L[c+32>>3];y=f*g+i*t;n=L[c+16>>3];A=k*i-n*g;e=y*f-A*n;v=A*i;A=n*l+f*r;f=v-A*f;n=n*A-y*i;i=V(e*e+(f*f+n*n));if(!(!(i>3]=i;gb(73024,h+480|0);$a(G[29763])}if(!(i<=0)){n=n/i;f=f/i;e=e/i}i=L[d+24>>3];y=L[d+32>>3];A=i*g+y*t;t=L[d+16>>3];k=k*y-t*g;g=A*i-k*t;l=t*l+i*r;k=k*y-l*i;l=t*l-A*y;i=V(g*g+(k*k+l*l));if(!(!(i>3]=i;gb(73024,h+464|0);$a(G[29763])}if(!(i<=0)){l=l/i;k=k/i;g=g/i}m=G[935573];if((m|0)>=2){yb(86139);L[h+448>>3]=q;L[h+440>>3]=x;L[h+432>>3]=w;gb(73059,h+432|0);L[h+416>>3]=j;L[h+408>>3]=u;L[h+400>>3]=p;gb(73059,h+400|0);L[h+384>>3]=e;L[h+376>>3]=n;L[h+368>>3]=f;gb(73059,h+368|0);L[h+352>>3]=g;L[h+344>>3]=l;L[h+336>>3]=k;gb(73059,h+336|0);$a(G[29763]);m=G[935573]}i=w*n-x*f;r=x*e-q*n;t=q*f-w*e;y=V(i*i+(r*r+t*t));if(!(!(y>3]=y;gb(73024,h+320|0);$a(G[29763])}if(!(y<=0)){t=t/y;r=r/y;i=i/y}b=i*L[c+32>>3]+(r*L[c+16>>3]+t*L[c+24>>3])<0;t=b?-t:t;y=b?-r:r;r=Db(t,y);A=b?-i:i;J=fc(A);F=L[467827];i=r/F;if(i>=360){while(1){i=i+-360;if(i>=360){continue}break}}if(i<0){while(1){i=i+360;if(i<0){continue}break}}r=u*e+j*-n;n=p*n+u*-f;e=j*f-p*e;f=V(n*n+(r*r+e*e));if(!(!(f>3]=f;gb(73024,h+304|0);$a(G[29763])}if(!(f<=0)){n=n/f;r=r/f;e=e/f}b=n*L[c+32>>3]+(r*L[c+16>>3]+e*L[c+24>>3])<0;C=b?-e:e;r=b?-r:r;e=Db(C,r);D=b?-n:n;K=fc(D);H=L[467827];e=e/H;if(e>=360){while(1){e=e+-360;if(e>=360){continue}break}}if(e<0){while(1){e=e+360;if(e<0){continue}break}}n=-p;f=p*l-u*k;p=u*g-j*l;j=n*g+j*k;n=V(f*f+(p*p+j*j));if(!(!(n>3]=n;gb(73024,h+288|0);$a(G[29763])}if(!(n<=0)){j=j/n;p=p/n;f=f/n}b=f*L[d+32>>3]+(p*L[d+16>>3]+j*L[d+24>>3])<0;n=b?-j:j;p=b?-p:p;j=Db(n,p);u=b?-f:f;v=fc(u);I=L[467827];f=j/I;if(f>=360){while(1){f=f+-360;if(f>=360){continue}break}}if(f<0){while(1){f=f+360;if(f<0){continue}break}}j=w*l+x*-k;l=x*g+q*-l;g=-w*g+q*k;k=V(j*j+(l*l+g*g));if(!(!(k>3]=k;gb(73024,h+272|0);$a(G[29763])}if(!(k<=0)){j=j/k;l=l/k;g=g/k}b=j*L[d+32>>3]+(l*L[d+16>>3]+g*L[d+24>>3])<0;k=b?-g:g;l=b?-l:l;g=Db(k,l);j=b?-j:j;q=fc(j);w=L[467827];g=g/w;if(g>=360){while(1){g=g+-360;if(g>=360){continue}break}}if(g<0){while(1){g=g+360;if(g<0){continue}break}}m=G[935573];if((m|0)>=2){yb(86125);L[h+264>>3]=J/F;L[h+256>>3]=i;gb(71544,h+256|0);L[h+248>>3]=K/H;L[h+240>>3]=e;gb(71544,h+240|0);L[h+232>>3]=v/I;L[h+224>>3]=f;gb(71544,h+224|0);L[h+216>>3]=q/w;L[h+208>>3]=g;gb(71544,h+208|0);$a(G[29763]);m=G[935573]}f=t*u-A*n;e=D*l-r*j;g=A*p-y*u;j=C*j-D*k;i=f*e-g*j;v=g;g=r*k-C*l;k=y*n-t*p;e=v*g-k*e;f=k*j-f*g;g=V(i*i+(e*e+f*f));if(!(!(g>3]=g;gb(73024,h+192|0);$a(G[29763])}if(!(g<=0)){i=i/g;f=f/g;e=e/g}b=i*A+(e*y+t*f)<0;n=b?-f:f;p=b?-e:e;e=Db(n,p);r=b?-i:i;f=fc(r);j=L[467827];k=e/j;if(k>=360){while(1){k=k+-360;if(k>=360){continue}break}}if(k<0){while(1){k=k+360;if(k<0){continue}break}}i=f/j;g=j*i;e=ib(g);L[467844]=e;L[467858]=e;q=j*0;f=eb(q);l=eb(g);w=f*l;L[467850]=w;g=ib(q);q=l*g;L[467847]=q;x=j*k;j=ib(x);u=l*j;L[467843]=u;v=l;l=eb(x);x=v*l;L[467842]=x;L[467860]=w;L[467859]=q;L[467855]=u;L[467852]=x;q=e*-f;w=g*l;L[467849]=j*q-w;x=g*j;L[467848]=x+q*l;q=f*l;u=e*-g;L[467846]=q+j*u;v=u*l;u=f*j;L[467845]=v-u;j=e*-j;L[467857]=f*j-w;L[467856]=j*g+q;e=e*-l;L[467854]=f*e+x;L[467853]=e*g-u;e=1e20;f=-1e20;g=-1e20;j=1e20;while(1){b=G[a>>2];Vl(L[b>>3],L[b+8>>3]);l=L[467839];f=fl?l:e;l=L[467838];g=gl?l:j;a=G[a+4>>2];if(a){continue}break};if(G[935573]>=2){L[h+176>>3]=j;gb(71604,h+176|0);L[h+160>>3]=g;gb(71574,h+160|0);L[h+144>>3]=e;gb(71589,h+144|0);L[h+128>>3]=f;gb(71559,h+128|0);$a(G[29763])}L[467819]=r;L[467818]=n;L[467817]=p;L[467816]=i;L[467815]=k;G[935648]=0;G[935649]=0;v=i;i=L[467827];n=v*i;l=ib(n);L[467844]=l;L[467858]=l;e=O(e);f=O(f);e=e>f?e:f;p=e+e;L[467823]=p;e=O(j);f=O(g);e=e>f?e:f;r=e+e;L[467822]=r;f=i*0;e=eb(f);j=eb(n);n=e*j;L[467850]=n;f=ib(f);q=j*f;L[467847]=q;k=k*i;g=ib(k);i=j*g;L[467843]=i;k=eb(k);j=j*k;L[467842]=j;L[467860]=n;L[467859]=q;L[467855]=i;L[467852]=j;j=l*-e;i=f*k;L[467849]=g*j-i;n=f*g;L[467848]=n+k*j;j=e*k;q=l*-f;L[467846]=j+g*q;v=k*q;q=e*g;L[467845]=v-q;g=l*-g;L[467857]=e*g-i;L[467856]=g*f+j;i=e;e=l*-k;L[467854]=i*e+n;L[467853]=e*f-q;mf(r*-.5,p*-.5);L[467787]=L[467840];L[467788]=L[467841];mf(L[467822]*.5,L[467823]*-.5);L[467794]=L[467840];L[467795]=L[467841];mf(L[467822]*.5,L[467823]*.5);L[467801]=L[467840];L[467802]=L[467841];mf(L[467822]*-.5,L[467823]*.5);L[467808]=L[467840];L[467809]=L[467841];if(G[935573]>=2){L[h+112>>3]=L[467815];L[h+120>>3]=L[467816];gb(71674,h+112|0);L[h+96>>3]=L[467822];gb(71917,h+96|0);L[h+80>>3]=L[467823];gb(71843,h+80|0);L[h+64>>3]=L[467824];gb(71823,h- -64|0);L[h+48>>3]=L[467787];L[h+56>>3]=L[467788];gb(71782,h+48|0);L[h+32>>3]=L[467794];L[h+40>>3]=L[467795];gb(71755,h+32|0);L[h+16>>3]=L[467801];L[h+24>>3]=L[467802];gb(71728,h+16|0);L[h>>3]=L[467808];L[h+8>>3]=L[467809];gb(71701,h);$a(G[29763])}Fa=h+592|0;break a;case 1:Wl(G[935652]);break a;case 2:a=G[935652];Wl(a);G[935650]=0;G[935651]=0;if(!a){break a}g=L[467827];k=L[467819];j=L[467818];l=L[467817];e=0;while(1){b=G[a>>2];f=Sc(L[b+32>>3]*k+(L[b+16>>3]*l+j*L[b+24>>3]))/g;if(f>e){L[467825]=f;e=f}a=G[a+4>>2];if(a){continue}break};break a;case 3:break a;default:break q}}a=G[935652];if(G[935653]>0){Wa(G[935658])}if(!a){break b}while(1){b=G[a+4>>2];Wa(a);a=b;if(a){continue}break}}o=-1}Fa=B- -64|0;return o}function Mk(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=-2;a:{b:{c:{d:{if(!G[a+36>>2]|(!a|!G[a+32>>2])){break d}c=G[a+28>>2];if(!c|G[c>>2]!=(a|0)){break d}e:{f:{e=G[c+4>>2];switch(e-57|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:break d;case 0:case 12:case 16:case 34:case 46:case 56:break e;default:break f}}if((e|0)==666){break e}if((e|0)!=42){break d}}if(b>>>0>5){break d}g:{h:{if(!G[a+12>>2]){break h}f=G[a+4>>2];if(G[a>>2]?0:f){break h}if((b|0)==4|(e|0)!=666){break g}}G[a+24>>2]=G[26248];return-2}if(!G[a+16>>2]){break b}d=G[c+40>>2];G[c+40>>2]=b;i:{if(G[c+20>>2]){cd(c);h=G[c+20>>2];e=G[a+16>>2];d=e>>>0>h>>>0?h:e;j:{if(!d){break j}bb(G[a+12>>2],G[c+16>>2],d);G[a+12>>2]=d+G[a+12>>2];G[c+16>>2]=d+G[c+16>>2];G[a+20>>2]=d+G[a+20>>2];e=G[a+16>>2]-d|0;G[a+16>>2]=e;f=G[c+20>>2];h=f-d|0;G[c+20>>2]=h;if((d|0)!=(f|0)){break j}G[c+16>>2]=G[c+8>>2]}if(e){e=G[c+4>>2];break i}break a}if((b|0)==4|f|((b<<1)+(b>>>0>4?-9:0)|0)>((d<<1)+((d|0)>4?-9:0)|0)){break i}break b}k:{l:{m:{n:{if((e|0)!=42){if((e|0)!=666){break n}if(!G[a+4>>2]){break m}break b}f=(G[c+48>>2]<<12)-30720|0;d=0;o:{if(G[c+136>>2]>1){break o}e=G[c+132>>2];if((e|0)<2){break o}d=64;if(e>>>0<6){break o}d=(e|0)==6?128:192}G[c+20>>2]=h+1;d=d|f;d=G[c+108>>2]?d|32:d;E[G[c+8>>2]+h|0]=d>>>8;e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=(d|(d>>>0)%31)^31;if(G[c+108>>2]){d=G[a+48>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d>>>24;e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d>>>16;d=G[a+48>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d>>>8;e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d}m=a,n=gf(0,0,0),G[m+48>>2]=n;G[c+4>>2]=113;Mg(a);if(G[c+20>>2]){break a}e=G[c+4>>2]}p:{q:{r:{s:{t:{u:{if((e|0)==57){m=a,n=Oc(0,0,0),G[m+48>>2]=n;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=31;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=139;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=8;d=G[c+28>>2];if(d){break u}d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=0;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=0;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=0;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=0;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=0;d=2;e=G[c+132>>2];if((e|0)!=9){d=G[c+136>>2]>1?4:((e|0)<2)<<2}e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=3;G[c+4>>2]=113;Mg(a);if(G[c+20>>2]){break a}e=G[c+4>>2]}switch(e-69|0){case 34:break q;case 22:break r;case 4:break s;case 0:break t;default:break p}}e=G[d+36>>2];f=G[d+28>>2];g=G[d+16>>2];h=G[d+44>>2];i=G[d>>2];j=G[c+20>>2];G[c+20>>2]=j+1;d=2;E[j+G[c+8>>2]|0]=((h|0)!=0)<<1|(i|0)!=0|((g|0)!=0)<<2|((f|0)!=0)<<3|((e|0)!=0)<<4;e=G[G[c+28>>2]+4>>2];f=G[c+20>>2];G[c+20>>2]=f+1;E[f+G[c+8>>2]|0]=e;e=G[G[c+28>>2]+4>>2];f=G[c+20>>2];G[c+20>>2]=f+1;E[f+G[c+8>>2]|0]=e>>>8;e=I[G[c+28>>2]+6>>1];f=G[c+20>>2];G[c+20>>2]=f+1;E[f+G[c+8>>2]|0]=e;e=H[G[c+28>>2]+7|0];f=G[c+20>>2];G[c+20>>2]=f+1;E[f+G[c+8>>2]|0]=e;e=G[c+132>>2];if((e|0)!=9){d=G[c+136>>2]>1?4:((e|0)<2)<<2}e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[G[c+28>>2]+12>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[c+28>>2];if(G[d+16>>2]){d=G[d+20>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[G[c+28>>2]+20>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d>>>8;d=G[c+28>>2]}if(G[d+44>>2]){m=a,n=Oc(G[a+48>>2],G[c+8>>2],G[c+20>>2]),G[m+48>>2]=n}G[c+4>>2]=69;G[c+32>>2]=0}f=G[c+28>>2];h=G[f+16>>2];if(h){e=G[c+12>>2];d=G[c+20>>2];g=G[c+32>>2];f=I[f+20>>1]-g|0;if(e>>>0>>0){while(1){g=e-d|0;bb(G[c+8>>2]+d|0,G[G[c+28>>2]+16>>2]+G[c+32>>2]|0,g);e=G[c+12>>2];G[c+20>>2]=e;if(!(!G[G[c+28>>2]+44>>2]|d>>>0>=e>>>0)){m=a,n=Oc(G[a+48>>2],G[c+8>>2]+d|0,e-d|0),G[m+48>>2]=n}G[c+32>>2]=g+G[c+32>>2];d=G[a+28>>2];cd(d);e=G[d+20>>2];h=G[a+16>>2];e=e>>>0>>0?e:h;v:{if(!e){break v}bb(G[a+12>>2],G[d+16>>2],e);G[a+12>>2]=e+G[a+12>>2];G[d+16>>2]=e+G[d+16>>2];G[a+20>>2]=e+G[a+20>>2];G[a+16>>2]=G[a+16>>2]-e;h=G[d+20>>2];G[d+20>>2]=h-e;if((e|0)!=(h|0)){break v}G[d+16>>2]=G[d+8>>2]}if(G[c+20>>2]){break a}d=0;f=f-g|0;e=G[c+12>>2];if(f>>>0>e>>>0){continue}break}h=G[G[c+28>>2]+16>>2];g=G[c+32>>2]}bb(G[c+8>>2]+d|0,g+h|0,f);e=G[c+20>>2]+f|0;G[c+20>>2]=e;if(!(!G[G[c+28>>2]+44>>2]|d>>>0>=e>>>0)){m=a,n=Oc(G[a+48>>2],G[c+8>>2]+d|0,e-d|0),G[m+48>>2]=n}G[c+32>>2]=0}G[c+4>>2]=73}if(G[G[c+28>>2]+28>>2]){f=G[c+20>>2];while(1){w:{d=G[c+20>>2];if((d|0)!=G[c+12>>2]){break w}if(!(!G[G[c+28>>2]+44>>2]|d>>>0<=f>>>0)){m=a,n=Oc(G[a+48>>2],G[c+8>>2]+f|0,d-f|0),G[m+48>>2]=n}d=G[a+28>>2];cd(d);e=G[d+20>>2];f=G[a+16>>2];e=e>>>0>>0?e:f;x:{if(!e){break x}bb(G[a+12>>2],G[d+16>>2],e);G[a+12>>2]=e+G[a+12>>2];G[d+16>>2]=e+G[d+16>>2];G[a+20>>2]=e+G[a+20>>2];G[a+16>>2]=G[a+16>>2]-e;f=G[d+20>>2];G[d+20>>2]=f-e;if((e|0)!=(f|0)){break x}G[d+16>>2]=G[d+8>>2]}d=0;f=0;if(!G[c+20>>2]){break w}break a}e=G[G[c+28>>2]+28>>2];g=G[c+32>>2];G[c+32>>2]=g+1;e=H[e+g|0];G[c+20>>2]=d+1;E[G[c+8>>2]+d|0]=e;if(e){continue}break}y:{if(!G[G[c+28>>2]+44>>2]){break y}d=G[c+20>>2];if(d>>>0<=f>>>0){break y}m=a,n=Oc(G[a+48>>2],G[c+8>>2]+f|0,d-f|0),G[m+48>>2]=n}G[c+32>>2]=0}G[c+4>>2]=91}z:{if(!G[G[c+28>>2]+36>>2]){break z}f=G[c+20>>2];while(1){A:{d=G[c+20>>2];if((d|0)!=G[c+12>>2]){break A}if(!(!G[G[c+28>>2]+44>>2]|d>>>0<=f>>>0)){m=a,n=Oc(G[a+48>>2],G[c+8>>2]+f|0,d-f|0),G[m+48>>2]=n}d=G[a+28>>2];cd(d);e=G[d+20>>2];f=G[a+16>>2];e=e>>>0>>0?e:f;B:{if(!e){break B}bb(G[a+12>>2],G[d+16>>2],e);G[a+12>>2]=e+G[a+12>>2];G[d+16>>2]=e+G[d+16>>2];G[a+20>>2]=e+G[a+20>>2];G[a+16>>2]=G[a+16>>2]-e;f=G[d+20>>2];G[d+20>>2]=f-e;if((e|0)!=(f|0)){break B}G[d+16>>2]=G[d+8>>2]}d=0;f=0;if(!G[c+20>>2]){break A}break a}e=G[G[c+28>>2]+36>>2];g=G[c+32>>2];G[c+32>>2]=g+1;e=H[e+g|0];G[c+20>>2]=d+1;E[G[c+8>>2]+d|0]=e;if(e){continue}break}if(!G[G[c+28>>2]+44>>2]){break z}d=G[c+20>>2];if(d>>>0<=f>>>0){break z}m=a,n=Oc(G[a+48>>2],G[c+8>>2]+f|0,d-f|0),G[m+48>>2]=n}G[c+4>>2]=103}if(G[G[c+28>>2]+44>>2]){d=G[c+20>>2];if(J[c+12>>2]>>0){Mg(a);if(G[c+20>>2]){break c}d=0}e=G[a+48>>2];G[c+20>>2]=d+1;E[G[c+8>>2]+d|0]=e;d=G[a+48>>2];e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d>>>8;m=a,n=Oc(0,0,0),G[m+48>>2]=n}G[c+4>>2]=113;Mg(a);if(!G[c+20>>2]){break p}break a}if(G[a+4>>2]){break l}}if(G[c+116>>2]){break l}if(!b|G[c+4>>2]==666){break k}}d=G[c+132>>2];C:{if(!d){e=jp(c,b);break C}D:{switch(G[c+136>>2]-2|0){case 0:E:{F:{while(1){G:{if(G[c+116>>2]){break G}Ri(c);if(G[c+116>>2]){break G}if(b){break F}e=0;break E}G[c+96>>2]=0;d=H[G[c+56>>2]+G[c+108>>2]|0];e=G[c+5792>>2];F[G[c+5796>>2]+(e<<1)>>1]=0;G[c+5792>>2]=e+1;E[e+G[c+5784>>2]|0]=d;d=(d<<2)+c|0;F[d+148>>1]=I[d+148>>1]+1;G[c+116>>2]=G[c+116>>2]-1;f=G[c+108>>2]+1|0;G[c+108>>2]=f;if(G[c+5792>>2]!=(G[c+5788>>2]-1|0)){continue}d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,f-d|0,0);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;H:{if(!f){break H}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break H}G[e+16>>2]=G[e+8>>2]}if(G[G[c>>2]+16>>2]){continue}break}e=0;break E}G[c+5812>>2]=0;if((b|0)==4){d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,G[c+108>>2]-d|0,1);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;I:{if(!f){break I}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break I}G[e+16>>2]=G[e+8>>2]}e=G[G[c>>2]+16>>2]?3:2;break E}J:{if(!G[c+5792>>2]){break J}d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,G[c+108>>2]-d|0,0);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;K:{if(!f){break K}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break K}G[e+16>>2]=G[e+8>>2]}if(G[G[c>>2]+16>>2]){break J}e=0;break E}e=1}break C;case 1:L:{while(1){M:{N:{O:{g=G[c+116>>2];if(g>>>0>=259){G[c+96>>2]=0;break O}Ri(c);g=G[c+116>>2];e=0;if(!(g>>>0>=259|b)){break L}if(g){G[c+96>>2]=0;if(g>>>0>2){break O}j=G[c+108>>2];break N}G[c+5812>>2]=0;if((b|0)==4){d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,G[c+108>>2]-d|0,1);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;P:{if(!f){break P}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break P}G[e+16>>2]=G[e+8>>2]}e=G[G[c>>2]+16>>2]?3:2;break L}Q:{if(!G[c+5792>>2]){break Q}d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,G[c+108>>2]-d|0,0);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;R:{if(!f){break R}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break R}G[e+16>>2]=G[e+8>>2]}if(G[G[c>>2]+16>>2]){break Q}e=0;break L}e=1;break L}j=G[c+108>>2];if(!j){j=0;break N}k=G[c+56>>2]+j|0;d=k-1|0;h=H[d|0];if((h|0)!=H[k|0]|(h|0)!=H[d+2|0]|(h|0)!=H[d+3|0]){break N}l=k+258|0;d=-1;S:{T:{U:{V:{W:{X:{while(1){f=d+k|0;if((h|0)==H[f+4|0]){if((h|0)!=H[f+5|0]){break X}if((h|0)!=H[f+6|0]){break W}if((h|0)!=H[f+7|0]){break V}e=d+8|0;i=e+k|0;if((h|0)!=H[i|0]){break S}if((h|0)!=H[f+9|0]){break U}if((h|0)!=H[f+10|0]){break T}i=f+11|0;if((h|0)!=H[i|0]){break S}f=(d|0)<247;d=e;if(f){continue}break S}break}i=f+4|0;break S}i=f+5|0;break S}i=f+6|0;break S}i=f+7|0;break S}i=f+9|0;break S}i=f+10|0}d=(i-l|0)+258|0;d=d>>>0>>0?d:g;G[c+96>>2]=d;if(d>>>0<3){break N}e=G[c+5792>>2];F[G[c+5796>>2]+(e<<1)>>1]=1;G[c+5792>>2]=e+1;d=d-3|0;E[e+G[c+5784>>2]|0]=d;d=((H[(d&255)+116208|0]<<2)+c|0)+1176|0;F[d>>1]=I[d>>1]+1;d=((H[115696]<<2)+c|0)+2440|0;F[d>>1]=I[d>>1]+1;d=G[c+96>>2];G[c+96>>2]=0;G[c+116>>2]=G[c+116>>2]-d;g=d+G[c+108>>2]|0;G[c+108>>2]=g;break M}d=H[G[c+56>>2]+j|0];e=G[c+5792>>2];F[G[c+5796>>2]+(e<<1)>>1]=0;G[c+5792>>2]=e+1;E[e+G[c+5784>>2]|0]=d;d=(d<<2)+c|0;F[d+148>>1]=I[d+148>>1]+1;G[c+116>>2]=G[c+116>>2]-1;g=G[c+108>>2]+1|0;G[c+108>>2]=g}if(G[c+5792>>2]!=(G[c+5788>>2]-1|0)){continue}d=G[c+92>>2];if((d|0)>=0){e=d+G[c+56>>2]|0}else{e=0}ge(c,e,g-d|0,0);G[c+92>>2]=G[c+108>>2];d=G[c>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];g=G[d+16>>2];f=f>>>0>>0?f:g;Y:{if(!f){break Y}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break Y}G[e+16>>2]=G[e+8>>2]}if(G[G[c>>2]+16>>2]){continue}break}e=0}break C;default:break D}}e=Ja[G[M(d,12)+118440>>2]](c,b)|0}d=e;if((d&-2)==2){G[c+4>>2]=666}if(!(d&-3)){d=0;if(G[a+16>>2]){break d}break a}if((d|0)!=1){break k}Z:{_:{switch(b-1|0){case 0:e=G[c+5820>>2];d=I[c+5816>>1]|2<>1]=d;$:{if((e|0)>=14){e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=H[c+5817|0];e=G[c+5820>>2];d=2>>>16-e|0;F[c+5816>>1]=d;e=e-13|0;break $}e=e+3|0}G[c+5820>>2]=e;aa:{if((e|0)>=10){e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=H[c+5817|0];d=0;F[c+5816>>1]=0;e=G[c+5820>>2]-9|0;break aa}e=e+7|0}G[c+5820>>2]=e;ba:{ca:{if((e|0)==16){e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=H[c+5817|0];F[c+5816>>1]=0;e=0;break ca}if((e|0)<8){break ba}e=G[c+20>>2];G[c+20>>2]=e+1;E[e+G[c+8>>2]|0]=d;F[c+5816>>1]=H[c+5817|0];e=G[c+5820>>2]-8|0}G[c+5820>>2]=e}break Z;case 4:break Z;default:break _}}Si(c,0,0,0);if((b|0)!=3){break Z}d=G[c+68>>2];e=(G[c+76>>2]<<1)-2|0;F[d+e>>1]=0;cb(d,0,e);if(G[c+116>>2]){break Z}G[c+5812>>2]=0;G[c+92>>2]=0;G[c+108>>2]=0}Mg(a);if(G[a+16>>2]){break k}break a}d=0;if((b|0)!=4){break d}d=1;e=G[c+24>>2];if((e|0)<=0){break d}b=G[a+48>>2];da:{if((e|0)==2){d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;b=G[a+48>>2];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b>>>8;b=I[a+50>>1];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;b=H[a+51|0];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;b=G[a+8>>2];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;b=G[a+8>>2];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b>>>8;b=I[a+10>>1];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;b=H[a+11|0];break da}d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b>>>24;d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b>>>16;b=G[a+48>>2];d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b>>>8}d=G[c+20>>2];G[c+20>>2]=d+1;E[d+G[c+8>>2]|0]=b;Mg(a);a=G[c+24>>2];if((a|0)>0){G[c+24>>2]=0-a}d=!G[c+20>>2]}return d}G[c+40>>2]=-1;return 0}G[a+24>>2]=G[26251];return-5}G[c+40>>2]=-1;return 0}function Bi(a,b,c,d,e){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,I=0,K=0,L=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;D=Fa-16|0;Fa=D;G[D+12>>2]=c;G[D+8>>2]=d;h=a;V=D+12|0;Q=D+8|0;f=Fa-368|0;Fa=f;a:{if(G[e>>2]>0){break a}a=G[h>>2];c=G[h+4>>2];b:{c:{if((a|0)!=G[c+76>>2]){mb(h,a+1|0,0,e);break c}if((G[c+128>>2]&G[c+132>>2])!=-1){break c}if((Rb(h,e)|0)>0){break b}}c=G[h+4>>2];if(!G[c+80>>2]){Ua(50904);G[e>>2]=235;break a}a=0;if((b|0)<=0){G[e>>2]=302;break a}I=G[c+936>>2];while(1){c=G[(a<<2)+Q>>2];if(Va(c)>>>0>=71){Ua(50965);G[e>>2]=261;break a}c=Za(f+256|0,c);Yf(c);d:{if(G[G[h+4>>2]+80>>2]==1){Gd(c,f+364|0,f+340|0,f+360|0,e);c=G[f+340>>2]+1|0;d=c;c=c>>31;break d}Vf(c,f+364|0,f+336|0,f+340|0,e);d=G[f+364>>2];if((d|0)<0){d=jb(c,81)?16:8;c=0;break d}e:{f:{c=d-1|0;if(c){if((c|0)==15){break f}break e}c=(G[f+336>>2]+7|0)/8|0;d=c;c=c>>31;break d}c=G[f+336>>2];d=c;c=c>>31;break d}c=M(G[f+336>>2],(d>>>0)/10|0);d=c;c=c>>31}c=c+j|0;d=d+m|0;c=d>>>0>>0?c+1|0:c;m=d;j=c;a=a+1|0;if((a|0)!=1){continue}break}if(G[e>>2]>0){break a}a=G[h+4>>2];p=G[a+960>>2];q=G[a+964>>2];r=G[a+952>>2];g=G[a+956>>2];l=Au(r,g,m,j);c=Ia;n=c;d=c;s=G[a+984>>2];o=G[a+976>>2];i=s+o|0;k=G[a+988>>2];c=k+G[a+980>>2]|0;c=i>>>0>>0?c+1|0:c;o=i+2879|0;c=o>>>0<2879?c+1|0:c;c=Cu(o,c);i=Ia;o=0-(i+(c>>>0>2879)|0)|0;if(2879-c>>>0>>0&(o|0)<=(d|0)|(d|0)>(o|0)){i=i+n|0;a=c;c=c+l|0;if((Bf(h,Bu(c,a>>>0>c>>>0?i+1|0:i,2880,0),1,e)|0)>0){break b}a=G[h+4>>2];s=G[a+984>>2];k=G[a+988>>2]}if(!!s&(k|0)>=0|(k|0)>0){c=G[a+980>>2]+G[a+132>>2]|0;d=G[a+128>>2];o=d+G[a+976>>2]|0;if((Ci(h,o,d>>>0>o>>>0?c+1|0:c,s,k,l,n,e)|0)>0){break b}a=G[h+4>>2]}R=I+1|0;P=(b|0)>(I|0);t=P?R:b;c=l;d=c+G[a+976>>2]|0;b=n+G[a+980>>2]|0;b=c>>>0>d>>>0?b+1|0:b;c=d;G[a+976>>2]=c;G[a+980>>2]=b;a=0;G[f+356>>2]=0;Ad(h,34350,c,b,65398,f+356|0);o=p;v=q;if(!P){b=(G[G[h+4>>2]+968>>2]+M(t,160)|0)-88|0;o=G[b>>2];v=G[b+4>>2]}u=Fa-1e4|0;Fa=u;if(!(!(g|r)|G[e>>2]>0)){d=G[h+4>>2];S=(G[d+80>>2]==1)<<5;b=j+q|0;c=m+p|0;b=c>>>0

>>0?b+1|0:b;z=c;x=b;g:{if((b|0)<=0&c>>>0<=1e4|(b|0)<0){if(!!m&(j|0)>=0|(j|0)>0){cb(u,S,m)}c=G[d+980>>2]+G[d+132>>2]|0;b=G[d+128>>2];k=b+G[d+976>>2]|0;l=k;c=b>>>0>k>>>0?c+1|0:c;b=c;k=G[d+44>>2];if(l>>>0>J[d+40>>2]&(c|0)>=(k|0)|(c|0)>(k|0)){k=d;c=l+2879|0;b=c>>>0<2879?b+1|0:b;d=c;c=Cu(c,b);G[k+40>>2]=d-c;G[k+44>>2]=b-(Ia+(c>>>0>d>>>0)|0)}c=v;b=o+1|0;c=b?c:c+1|0;n=b;d=c;b=o;i=p-b|0;k=q-((b>>>0>p>>>0)+v|0)|0;l=m+u|0;ee(h,r,g,n,c,i,k,l,e);b=G[h+4>>2];G[b+960>>2]=z;G[b+964>>2]=x;b=i+m|0;i=j+k|0;ld(h,r,g,n,c,b,b>>>0>>0?i+1|0:i,u,e);b=G[h+4>>2];G[b+960>>2]=p;G[b+964>>2]=q;if(r>>>0<2&(g|0)<=0|(g|0)<0){break g}while(1){c=r-1|0;b=g-!r|0;ee(h,c,b,n,d,p,q,l,e);k=G[h+4>>2];G[k+960>>2]=z;G[k+964>>2]=x;ld(h,c,b,n,d,z,x,u,e);k=G[h+4>>2];G[k+960>>2]=p;G[k+964>>2]=q;k=!g&r>>>0>2|(g|0)!=0;r=c;g=b;if(k){continue}break}break g}c=q;b=p+9999|0;c=b>>>0<9999?c+1|0:c;y=b;w=c;c=b;b=o;i=w-((c>>>0>>0)+v|0)|0;B=c-b|0;K=Bu(B,i,1e4,0);L=Ia;h:{if(B>>>0<1e4&(i|0)<=0|(i|0)<0){break h}s=1;k=0;c=Au(K,L,1e4,0);d=c+o|0;b=Ia+v|0;b=c>>>0>d>>>0?b+1|0:b;c=d;l=c-9999|0;b=b-(c>>>0<9999)|0;n=b;c=q-((l>>>0>p>>>0)+b|0)|0;b=(p-l|0)+1|0;c=b?c:c+1|0;d=b;b=c;ee(h,r,g,l,n,d,c,u,e);c=G[h+4>>2];G[c+960>>2]=z;G[c+964>>2]=x;c=j+n|0;C=l+m|0;c=C>>>0>>0?c+1|0:c;ld(h,r,g,C,c,d,b,u,e);d=G[h+4>>2];b=d;G[b+960>>2]=p;G[b+964>>2]=q;b=B;c=b-1e4|0;if((b>>>0<1e4|0)==(i|0)&c>>>0<1e4){break h}while(1){b=l;l=b-1e4|0;n=n-(b>>>0<1e4)|0;ee(h,r,g,l,n,1e4,0,u,e);b=G[h+4>>2];G[b+960>>2]=z;G[b+964>>2]=x;c=j+n|0;b=l+m|0;c=b>>>0>>0?c+1|0:c;ld(h,r,g,b,c,1e4,0,u,e);d=G[h+4>>2];b=d;G[b+960>>2]=p;G[b+964>>2]=q;b=k;c=s+1|0;b=c?b:b+1|0;s=c;k=b;if((K|0)!=(c|0)|(L|0)!=(b|0)){continue}break}}k=Bu(y,w,1e4,0);l=Ia;if(!(r>>>0<2&(g|0)<=0|(g|0)<0|(!p&(q|0)<=0|(q|0)<0))){c=Au(k,l,1e4,0);d=c-1e4|0;b=d;T=p-b|0;c=Ia-(c>>>0<1e4)|0;U=q-(c+(b>>>0>p>>>0)|0)|0;b=k>>>0>1&(l|0)>=0|(l|0)>0;N=b?k:1;O=b?l:0;b=o;d=b+d|0;c=c+v|0;c=b>>>0>d>>>0?c+1|0:c;d=d+1|0;b=d?c:c+1|0;C=d;d=m+d|0;c=b+j|0;K=d;B=d>>>0>>0?c+1|0:c;L=y>>>0<2e4&(w|0)<=0|(w|0)<0;s=r;k=g;while(1){y=s-1|0;w=k-!s|0;d=w;ee(h,y,d,C,b,T,U,u,e);c=G[h+4>>2];G[c+960>>2]=z;G[c+964>>2]=x;ld(h,y,d,K,B,T,U,u,e);d=G[h+4>>2];c=d;G[c+960>>2]=p;G[c+964>>2]=q;A=1;i=0;l=C;n=b;if(!L){while(1){c=l;l=c-1e4|0;n=n-(c>>>0<1e4)|0;ee(h,y,w,l,n,1e4,0,u,e);c=G[h+4>>2];G[c+960>>2]=z;G[c+964>>2]=x;c=j+n|0;d=l+m|0;c=d>>>0>>0?c+1|0:c;ld(h,y,w,d,c,1e4,0,u,e);d=G[h+4>>2];c=d;G[c+960>>2]=p;G[c+964>>2]=q;c=A+1|0;i=c?i:i+1|0;A=c;if((N|0)!=(c|0)|(i|0)!=(O|0)){continue}break}}c=s>>>0>2&(k|0)>=0|(k|0)>0;s=y;k=w;if(c){continue}break}}N=cb(u,S,m>>>0<1e4&(j|0)<=0|(j|0)<0?m:1e4);G[d+960>>2]=z;G[d+964>>2]=x;b=j;c=m+9999|0;b=c>>>0<9999?b+1|0:b;c=Bu(c,b,1e4,0);k=Ia;if(!(!r&(g|0)<=0|(g|0)<0|(!m&(j|0)<=0|(j|0)<0))){b=c>>>0>1&(k|0)>=0|(k|0)>0;K=b?c:1;L=b?k:0;b=Au(c,k,-1e4,-1);d=b+m|0;c=Ia+j|0;c=b>>>0>d>>>0?c+1|0:c;b=d+1e4|0;c=b>>>0<1e4?c+1|0:c;O=b;w=c;i=v;b=o+1|0;i=b?i:i+1|0;x=b;d=b;k=b+O|0;C=i;b=i+c|0;B=k;d=d>>>0>k>>>0?b+1|0:b;y=m>>>0<10001&(j|0)<=0|(j|0)<0;A=1;i=0;while(1){ld(h,A,i,x,C,O,w,N,e);s=1;k=0;l=B;n=d;if(!y){while(1){ld(h,A,i,l,n,1e4,0,N,e);b=n;c=l+1e4|0;b=c>>>0<1e4?b+1|0:b;l=c;n=b;c=k;b=s+1|0;c=b?c:c+1|0;s=b;k=c;if((K|0)!=(b|0)|(L|0)!=(c|0)){continue}break}}k=(r|0)!=(A|0)|(g|0)!=(i|0);b=i;c=A+1|0;b=c?b:b+1|0;A=c;i=b;if(k){continue}break}d=G[h+4>>2]}G[d+960>>2]=p;G[d+964>>2]=q}}Fa=u+1e4|0;if(!(G[G[h+4>>2]+80>>2]!=1|(I|0)<=0)){while(1){a=a+1|0;b=f+176|0;zb(34749,a,b,e);_f(h,b,f+344|0,f+96|0,e);b=G[f+344>>2];c=G[f+348>>2];if(b>>>0>o>>>0&(c|0)>=(v|0)|(c|0)>(v|0)){c=c+j|0;d=b+m|0;c=d>>>0>>0?c+1|0:c;b=d;G[f+344>>2]=b;G[f+348>>2]=c;Ad(h,f+176|0,b,c,65398,e)}if((a|0)!=(I|0)){continue}break}}a=I+1|0;Ad(h,33837,a,a>>31,65398,e);b=j+q|0;a=m+p|0;b=a>>>0

>>0?b+1|0:b;Ad(h,41261,a,b,65398,e);if(!P){ko(h,t,I,1,e)}s=H[26754]|H[26755]<<8|(H[26756]<<16|H[26757]<<24);r=H[26758]|H[26759]<<8|(H[26760]<<16|H[26761]<<24);n=H[26746]|H[26747]<<8|(H[26748]<<16|H[26749]<<24);l=H[26750]|H[26751]<<8|(H[26752]<<16|H[26753]<<24);m=H[26825]|H[26826]<<8|(H[26827]<<16|H[26828]<<24);p=H[26829]|H[26830]<<8|(H[26831]<<16|H[26832]<<24);k=H[26817]|H[26818]<<8|(H[26819]<<16|H[26820]<<24);d=H[26821]|H[26822]<<8|(H[26823]<<16|H[26824]<<24);q=0;while(1){G[f+104>>2]=s;G[f+108>>2]=r;G[f+96>>2]=n;G[f+100>>2]=l;b=f+176|0;zb(35402,t,b,e);a=q<<2;lc(h,b,G[a+V>>2],f+96|0,e);G[f+104>>2]=m;G[f+108>>2]=p;G[f+96>>2]=k;G[f+100>>2]=d;c=Za(f+256|0,G[a+Q>>2]);Yf(c);zb(34641,t,b,e);a=c;b=G[f+364>>2];i=b>>31;i:{j:{k:{l:{m:{n:{o:{b=(b^i)-i|0;switch(b-12|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:break k;case 28:break m;case 8:break n;case 0:break o;default:break l}}while(1){b=a;a=b+1|0;if(H[b|0]!=83){continue}break}E[b|0]=66;i=f+176|0;b=f+96|0;lc(h,i,c,b,e);zb(34362,t,i,e);a=H[7466]|H[7467]<<8|(H[7468]<<16|H[7469]<<24);G[f+112>>2]=H[7462]|H[7463]<<8|(H[7464]<<16|H[7465]<<24);G[f+116>>2]=a;a=H[7458]|H[7459]<<8|(H[7460]<<16|H[7461]<<24);G[f+104>>2]=H[7454]|H[7455]<<8|(H[7456]<<16|H[7457]<<24);G[f+108>>2]=a;a=H[7450]|H[7451]<<8|(H[7452]<<16|H[7453]<<24);G[f+96>>2]=H[7446]|H[7447]<<8|(H[7448]<<16|H[7449]<<24);G[f+100>>2]=a;be(h,i,-128,b,e);zb(34838,t,i,e);G[f+112>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);a=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[f+104>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[f+108>>2]=a;a=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[f+96>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[f+100>>2]=a;be(h,i,1,b,e);break i}while(1){b=a;a=b+1|0;if(H[b|0]!=85){continue}break}E[b|0]=73;g=f+176|0;b=f+96|0;lc(h,g,c,b,e);zb(34362,t,g,e);i=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);a=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[f+117|0]=a;E[f+118|0]=a>>>8;E[f+119|0]=a>>>16;E[f+120|0]=a>>>24;E[f+121|0]=i;E[f+122|0]=i>>>8;E[f+123|0]=i>>>16;E[f+124|0]=i>>>24;a=H[6478]|H[6479]<<8|(H[6480]<<16|H[6481]<<24);G[f+112>>2]=H[6474]|H[6475]<<8|(H[6476]<<16|H[6477]<<24);G[f+116>>2]=a;a=H[6470]|H[6471]<<8|(H[6472]<<16|H[6473]<<24);G[f+104>>2]=H[6466]|H[6467]<<8|(H[6468]<<16|H[6469]<<24);G[f+108>>2]=a;a=H[6462]|H[6463]<<8|(H[6464]<<16|H[6465]<<24);G[f+96>>2]=H[6458]|H[6459]<<8|(H[6460]<<16|H[6461]<<24);G[f+100>>2]=a;be(h,g,32768,b,e);zb(34838,t,g,e);G[f+112>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);a=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[f+104>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[f+108>>2]=a;a=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[f+96>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[f+100>>2]=a;be(h,g,1,b,e);break i}while(1){b=a;a=b+1|0;if(H[b|0]!=86){continue}break}E[b|0]=74;g=f+176|0;b=f+96|0;lc(h,g,c,b,e);zb(34362,t,g,e);i=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);a=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[f+117|0]=a;E[f+118|0]=a>>>8;E[f+119|0]=a>>>16;E[f+120|0]=a>>>24;E[f+121|0]=i;E[f+122|0]=i>>>8;E[f+123|0]=i>>>16;E[f+124|0]=i>>>24;a=H[6478]|H[6479]<<8|(H[6480]<<16|H[6481]<<24);G[f+112>>2]=H[6474]|H[6475]<<8|(H[6476]<<16|H[6477]<<24);G[f+116>>2]=a;a=H[6470]|H[6471]<<8|(H[6472]<<16|H[6473]<<24);G[f+104>>2]=H[6466]|H[6467]<<8|(H[6468]<<16|H[6469]<<24);G[f+108>>2]=a;a=H[6462]|H[6463]<<8|(H[6464]<<16|H[6465]<<24);G[f+96>>2]=H[6458]|H[6459]<<8|(H[6460]<<16|H[6461]<<24);G[f+100>>2]=a;be(h,g,2147483648,b,e);zb(34838,t,g,e);G[f+112>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);a=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[f+104>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[f+108>>2]=a;a=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[f+96>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[f+100>>2]=a;be(h,g,1,b,e);break i}if((b|0)==80){break j}}lc(h,f+176|0,c,f+96|0,e);break i}while(1){b=a;a=b+1|0;if(H[b|0]!=87){continue}break}E[b|0]=75;i=f+176|0;b=f+96|0;lc(h,i,c,b,e);zb(34362,t,f,e);g=Va(f)+f|0;a=H[68292]|H[68293]<<8|(H[68294]<<16|H[68295]<<24);E[g|0]=a;E[g+1|0]=a>>>8;E[g+2|0]=a>>>16;E[g+3|0]=a>>>24;a=H[68296]|H[68297]<<8;E[g+4|0]=a;E[g+5|0]=a>>>8;E[f+8|0]=0;a=Va(f)+f|0;j=H[6437]|H[6438]<<8|(H[6439]<<16|H[6440]<<24);g=H[6433]|H[6434]<<8|(H[6435]<<16|H[6436]<<24);E[a|0]=g;E[a+1|0]=g>>>8;E[a+2|0]=g>>>16;E[a+3|0]=g>>>24;E[a+4|0]=j;E[a+5|0]=j>>>8;E[a+6|0]=j>>>16;E[a+7|0]=j>>>24;j=H[6483]|H[6484]<<8|(H[6485]<<16|H[6486]<<24);g=H[6479]|H[6480]<<8|(H[6481]<<16|H[6482]<<24);E[a+46|0]=g;E[a+47|0]=g>>>8;E[a+48|0]=g>>>16;E[a+49|0]=g>>>24;E[a+50|0]=j;E[a+51|0]=j>>>8;E[a+52|0]=j>>>16;E[a+53|0]=j>>>24;j=H[6477]|H[6478]<<8|(H[6479]<<16|H[6480]<<24);g=H[6473]|H[6474]<<8|(H[6475]<<16|H[6476]<<24);E[a+40|0]=g;E[a+41|0]=g>>>8;E[a+42|0]=g>>>16;E[a+43|0]=g>>>24;E[a+44|0]=j;E[a+45|0]=j>>>8;E[a+46|0]=j>>>16;E[a+47|0]=j>>>24;j=H[6469]|H[6470]<<8|(H[6471]<<16|H[6472]<<24);g=H[6465]|H[6466]<<8|(H[6467]<<16|H[6468]<<24);E[a+32|0]=g;E[a+33|0]=g>>>8;E[a+34|0]=g>>>16;E[a+35|0]=g>>>24;E[a+36|0]=j;E[a+37|0]=j>>>8;E[a+38|0]=j>>>16;E[a+39|0]=j>>>24;j=H[6461]|H[6462]<<8|(H[6463]<<16|H[6464]<<24);g=H[6457]|H[6458]<<8|(H[6459]<<16|H[6460]<<24);E[a+24|0]=g;E[a+25|0]=g>>>8;E[a+26|0]=g>>>16;E[a+27|0]=g>>>24;E[a+28|0]=j;E[a+29|0]=j>>>8;E[a+30|0]=j>>>16;E[a+31|0]=j>>>24;j=H[6453]|H[6454]<<8|(H[6455]<<16|H[6456]<<24);g=H[6449]|H[6450]<<8|(H[6451]<<16|H[6452]<<24);E[a+16|0]=g;E[a+17|0]=g>>>8;E[a+18|0]=g>>>16;E[a+19|0]=g>>>24;E[a+20|0]=j;E[a+21|0]=j>>>8;E[a+22|0]=j>>>16;E[a+23|0]=j>>>24;j=H[6445]|H[6446]<<8|(H[6447]<<16|H[6448]<<24);g=H[6441]|H[6442]<<8|(H[6443]<<16|H[6444]<<24);E[a+8|0]=g;E[a+9|0]=g>>>8;E[a+10|0]=g>>>16;E[a+11|0]=g>>>24;E[a+12|0]=j;E[a+13|0]=j>>>8;E[a+14|0]=j>>>16;E[a+15|0]=j>>>24;wb(h,f,e);zb(34838,t,i,e);G[f+112>>2]=H[29394]|H[29395]<<8|(H[29396]<<16|H[29397]<<24);a=H[29390]|H[29391]<<8|(H[29392]<<16|H[29393]<<24);G[f+104>>2]=H[29386]|H[29387]<<8|(H[29388]<<16|H[29389]<<24);G[f+108>>2]=a;a=H[29382]|H[29383]<<8|(H[29384]<<16|H[29385]<<24);G[f+96>>2]=H[29378]|H[29379]<<8|(H[29380]<<16|H[29381]<<24);G[f+100>>2]=a;be(h,i,1,b,e)}if(G[G[h+4>>2]+80>>2]==1){a=H[26853]|H[26854]<<8|(H[26855]<<16|H[26856]<<24);G[f+112>>2]=H[26849]|H[26850]<<8|(H[26851]<<16|H[26852]<<24);G[f+116>>2]=a;F[f+120>>1]=H[26857]|H[26858]<<8;a=H[26837]|H[26838]<<8|(H[26839]<<16|H[26840]<<24);G[f+96>>2]=H[26833]|H[26834]<<8|(H[26835]<<16|H[26836]<<24);G[f+100>>2]=a;a=H[26845]|H[26846]<<8|(H[26847]<<16|H[26848]<<24);G[f+104>>2]=H[26841]|H[26842]<<8|(H[26843]<<16|H[26844]<<24);G[f+108>>2]=a;i=v;a=o+((t|0)==(R|0)?2:1)|0;i=a>>>0>>0?i+1|0:i;G[f+344>>2]=a;G[f+348>>2]=i;a=f+176|0;zb(34749,t,a,e);hd(h,a,G[f+344>>2],G[f+348>>2],f+96|0,e);Gd(c,f+364|0,f+340|0,f+360|0,e);a=G[f+340>>2]+1|0;c=a+o|0;b=(a>>31)+v|0;o=c;v=a>>>0>c>>>0?b+1|0:b}t=t+1|0;q=q+1|0;if((q|0)!=1){continue}break}Rb(h,e)}}Fa=f+368|0;Fa=D+16|0}function ht(a,b,c){a=a|0;b=b|0;c=c|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;s=Fa-16|0;Fa=s;b=0;G[s+8>>2]=0;G[c>>2]=-1;a:{b:{while(1){e=M(b,48)+757232|0;if(!G[e>>2]){d=b;break b}d=b+1|0;e=M(d,48)+757232|0;if(!G[e>>2]){break b}d=b+2|0;e=M(d,48)+757232|0;if(!G[e>>2]){break b}d=b+3|0;e=M(d,48)+757232|0;if(!G[e>>2]){break b}d=b+4|0;e=M(d,48)+757232|0;if(!G[e>>2]){break b}b=b+5|0;if((b|0)!=1e4){continue}break}Ua(55816);b=103;break a}G[c>>2]=d;d=M(d,48);G[e>>2]=d+757236;b=d+757256|0;G[b>>2]=0;G[b+4>>2]=0;b=d+757244|0;G[b>>2]=0;G[b+4>>2]=2880;G[d+757240>>2]=b;b=d+757264|0;G[b>>2]=0;G[b+4>>2]=0;G[d+757252>>2]=17;b=0;G[s+12>>2]=0;d=M(G[c>>2],48);u=G[d+757232>>2];v=G[d+757240>>2];d=0;g=Fa-800|0;Fa=g;G[u>>2]=0;G[v>>2]=0;G[s+8>>2]=0;l=Fa-128|0;Fa=l;G[g+268>>2]=0;r=ac(a,30817);c:{if(!r){Ua(37968);Ua(a);break c}d:{if(He(r,0,2)){Ua(38078);break d}j=ek(r);if((j|0)<0){Ua(38110);break d}if(He(r,0,0)){Ua(38256);Ua(a);break c}f=j+5e3|0;e=lb(1,f);if(!e){G[l>>2]=f;e=l+32|0;Ya(e,81,11810,l);Ua(e);Ua(a);break c}G[g+268>>2]=f;f=zc(e,1,j,r);Hb(r);if((f|0)>1023){d=e;break c}G[l+20>>2]=1024;G[l+16>>2]=f;f=l+32|0;Ya(f,81,44636,l+16|0);Ua(f);Ua(a);Wa(e);break c}Ua(a)}Fa=l+128|0;i=d;e:{if(!d){d=104;G[s+12>>2]=104;break e}w=G[g+268>>2];F[g+544>>1]=H[35790]|H[35791]<<8;E[g+546|0]=H[35792];cb(g+544|3,32,77);E[g+624|0]=0;d=1;f=lb(6,1);f:{g:{if(!f){Ua(23507);break g}e=H[i|0];E[f|0]=H[i+!e|0];e=i+(e?2:3)|0;E[f+1|0]=H[e|0];E[f+2|0]=H[e+2|0];E[f+3|0]=H[e+4|0];E[f+4|0]=H[e+6|0];e=fb(f,13157,5);Wa(f);if(!e){break f}}d=!fb(i,40598,5)<<1}r=d;h:{if((d|0)<=0){Ua(11851);break h}t=(r|0)==2;e=M((((w+(t?-2046:-2052)|0)/((t?81:162)|0)|0)+24|0)/36|0,2880)+14404|0;G[v>>2]=e;d=lb(e,1);if(!d){G[g>>2]=e;Ya(g+272|0,81,12331,g);break h}G[u>>2]=d;l=rb(d,g+544|0,80);F[g+368>>1]=84;ud(l,35530,g+368|0);j=t?10:16;h=H[j+i|0];d=(h|0)!=0;G[189304]=d;if((r|0)!=1){d=H[i+(h?14:17)|0]|H[i+(h?15:16)|0]<<8|H[i+(h?16:15)|0]<<16|H[i+(h?17:14)|0]<<24}G[189280]=d;f=j+3|0;e=j|1;d=j+2|0;d=H[i+(h?j:f)|0]|H[i+(h?e:d)|0]<<8|H[i+(h?d:e)|0]<<16|H[i+(h?f:j)|0]<<24;e=d-2|0;if(!(e>>>0>=11|!(1599>>>e&1))){G[g+256>>2]=G[(e<<2)+120244>>2];q=g+368|0;Ya(q,30,30633,g+256|0);ud(l,32941,q);Dd(l,32941,21031);e=0;m=t?18:20;j=m|1;f=m+2|0;h=G[189304]==1;d=m+3|0;x=H[i+(h?j:f)|0]<<8|H[i+(h?m:d)|0]|H[i+(h?f:j)|0]<<16|H[i+(h?d:m)|0]<<24;G[g+240>>2]=x;Ya(q,30,30633,g+240|0);ud(l,33788,q);Dd(l,33788,6965);o=t?22:24;j=o|1;f=o+2|0;h=G[189304]==1;d=o+3|0;G[g+224>>2]=H[i+(h?j:f)|0]<<8|H[i+(h?o:d)|0]|H[i+(h?f:j)|0]<<16|H[i+(h?d:o)|0]<<24;Ya(q,30,30633,g+224|0);ud(l,41261,q);Dd(l,41261,32499);j=l+320|0;i:{if((x|0)<2){break i}h=o+5|0;j=o+6|0;m=G[189304]==1;f=o+4|0;d=o+7|0;G[g+208>>2]=H[i+(m?h:j)|0]<<8|H[i+(m?f:d)|0]|H[i+(m?j:h)|0]<<16|H[i+(m?d:f)|0]<<24;d=g+368|0;Ya(d,30,30633,g+208|0);ud(l,40853,d);Dd(l,40853,32446);j=l+400|0;if((x|0)==2){break i}n=1;h=o+9|0;j=o+10|0;m=G[189304]==1;f=o+8|0;d=o+11|0;G[g+192>>2]=H[i+(m?h:j)|0]<<8|H[i+(m?f:d)|0]|H[i+(m?j:h)|0]<<16|H[i+(m?d:f)|0]<<24;d=g+368|0;Ya(d,30,30633,g+192|0);ud(l,40514,d);Dd(l,40514,32393);j=l+480|0;if(x>>>0<4){break i}e=1;h=o+13|0;j=o+14|0;m=G[189304]==1;f=o+12|0;d=o+15|0;G[g+176>>2]=H[i+(m?h:j)|0]<<8|H[i+(m?f:d)|0]|H[i+(m?j:h)|0]<<16|H[i+(m?d:f)|0]<<24;d=g+368|0;Ya(d,30,30633,g+176|0);ud(l,40363,d);Dd(l,40363,32340);j=l+560|0}j:{k:{if((r|0)==2){f=lb(384,1);if(!f){break k}d=0;while(1){m=d+i|0;h=H[m+638|0];E[d+f|0]=(h-1&255)>>>0<31?32:h;h=d|1;if((h|0)==383){break j}o=f+h|0;h=H[m+639|0];E[o|0]=(h-1&255)>>>0<31?32:h;d=d+2|0;continue}}f=Kn(i,732);break j}Ua(23559);f=0}d=Va(f);if((d|0)<=7){cb(d+f|0,32,8-d|0);E[f+8|0]=0}d=Va(f);E[g+368|0]=39;q=g+368|0;d=(d|0)<67?d:67;rb(q|1,f,d);d=d+g|0;E[d+369|0]=39;E[d+370|0]=0;ud(l,33480,q);Dd(l,33480,21601);Wa(f);o=t?50:52;h=o|1;f=o+2|0;m=G[189304]==1;d=o+3|0;G[g+160>>2]=H[i+(m?h:f)|0]<<8|H[i+(m?o:d)|0]|H[i+(m?f:h)|0]<<16|H[i+(m?d:o)|0]<<24;Ya(q,30,30633,g+160|0);ud(l,41253,q);Dd(l,41253,32471);if((x|0)<2){j=j+160|0}else{m=o+5|0;h=o+6|0;q=G[189304]==1;f=o+4|0;d=o+7|0;G[g+144>>2]=H[i+(q?m:h)|0]<<8|H[i+(q?f:d)|0]|H[i+(q?h:m)|0]<<16|H[i+(q?d:f)|0]<<24;d=g+368|0;Ya(d,30,30633,g+144|0);ud(l,40845,d);Dd(l,40845,32418);j=j+240|0}if(n){h=o|9;n=o+10|0;m=G[189304]==1;f=o|8;d=o+11|0;G[g+128>>2]=H[i+(m?h:n)|0]<<8|H[i+(m?f:d)|0]|H[i+(m?n:h)|0]<<16|H[i+(m?d:f)|0]<<24;d=g+368|0;Ya(d,30,30633,g+128|0);ud(l,40506,d);Dd(l,40506,32365);j=j+80|0}if(e){n=o+13|0;f=o+14|0;h=G[189304]==1;e=o+12|0;d=o+15|0;G[g+112>>2]=H[i+(h?n:f)|0]<<8|H[i+(h?e:d)|0]|H[i+(h?f:n)|0]<<16|H[i+(h?d:e)|0]<<24;d=g+368|0;Ya(d,30,30633,g+112|0);ud(l,40355,d);Dd(l,40355,32312);j=j+80|0}d=Va(a);E[g+368|0]=39;e=g+368|0;d=(d|0)<67?d:67;rb(e|1,a,d);d=d+g|0;E[d+369|0]=39;E[d+370|0]=0;ud(l,35585,e);Dd(l,35585,21498);l:{m:{if((r|0)==2){e=lb(256,1);if(!e){break m}d=0;while(1){h=d+e|0;n=d+i|0;f=H[n+126|0];E[h|0]=(f-1&255)>>>0<31?32:f;f=H[n+127|0];E[h+1|0]=(f-1&255)>>>0<31?32:f;f=H[n+128|0];E[h+2|0]=(f-1&255)>>>0<31?32:f;d=d+3|0;if((d|0)!=255){continue}break}break l}e=Kn(i,412);break l}Ua(23559);e=0}n:{if(fb(e,34134,3)){d=e;break n}d=Jn(e,a);if(!d){d=e;break n}Wa(e)}o:{if(jb(d,47)){a=d;break o}if(jb(d,36)){a=d;break o}a=Jn(d,a);if(!a){a=d;break o}Wa(d)}n=t?86:88;d=jb(a,33);p:{if(d){d=d+1|0;e=Va(d);E[g+368|0]=39;h=g+368|0;e=(e|0)<67?e:67;rb(h|1,d,e);break p}d=Va(a);E[g+368|0]=39;h=g+368|0;e=(d|0)<67?d:67;rb(h|1,a,e)}d=g+e|0;E[d+369|0]=39;E[d+370|0]=0;ud(l,35562,h);Wa(a);Dd(l,35562,22112);e=n|1;d=n+2|0;f=G[189304]==1;a=n+3|0;G[g+96>>2]=(H[i+(f?e:d)|0]<<9|H[i+(f?n:a)|0]<<1|H[i+(f?d:e)|0]<<17|H[i+(f?a:n)|0]<<25)-2;a=g+368|0;Ya(a,30,30633,g+96|0);ud(l,35139,a);Dd(l,35139,64159);G[g+80>>2]=r;Ya(a,30,30633,g+80|0);ud(l,34012,a);Dd(l,34012,63491);q:{if(G[189280]){F[g+368>>1]=84;break q}F[g+368>>1]=70}ud(l,34237,g+368|0);Dd(l,34237,33508);f=0;E[g+528|0]=0;a=j+400|0;r:{if((r|0)==2){cb(g+448|0,32,80);if((w|0)<2047){break r}d=2046;while(1){s:{t:{u:{e=H[d+i|0];switch(e|0){case 0:break r;case 10:break u;default:break t}}f=g+448|0;e=rb(a,f,80);a=nb(f,66596,7);cb(f,32,80);a=e+(a?80:0)|0;f=0;break s}if((f|0)>=81){if(nb(g+448|0,66596,7)){f=9;a=rb(a,g+448|0,80)+80|0}cb(g+448|0,32,80)}if((e-33&255)>>>0<=93){E[(g+448|0)+f|0]=e}f=f+1|0}d=d+1|0;if((w|0)!=(d|0)){continue}break}break r}d=G[189304];cb(g+448|0,32,80);if((w|0)<2053){break r}e=(d|0)!=1;d=2052;while(1){v:{w:{x:{j=H[i+(d|e)|0];switch(j|0){case 0:break r;case 10:break x;default:break w}}if(nb(g+448|0,66596,7)){a=rb(a,g+448|0,80)+80|0}cb(g+448|0,32,80);f=0;break v}if((f|0)>=81){if(nb(g+448|0,66596,7)){f=9;a=rb(a,g+448|0,80)+80|0}cb(g+448|0,32,80)}if((j-33&255)>>>0<=93){E[(g+448|0)+f|0]=j}f=f+1|0}d=d+2|0;if((w|0)>(d|0)){continue}break}}rb(a,g+544|0,80);d=0;y:{z:{A:{while(1){n=d+l|0;if(!H[n|0]){f=d;break A}f=1;a=d+l|0;n=a+1|0;if(!H[n|0]){break A}n=a+2|0;if(!H[n|0]){break A}n=a+3|0;if(!H[n|0]){break A}n=a+4|0;if(!H[n|0]){break A}d=d+5|0;if((d|0)!=57600){continue}break}n=l+57600|0;break z}if(f){break z}j=0;break y}a=l;while(1){j=0;f=ec(a,35790,n-a|0);if(!f){break y}e=(f-l|0)%80|0;B:{if((e|0)>=8){a=f+1|0;break B}d=H[f+3|0];if(!((d|0)==61|(d-33&255)>>>0>93)){a=f+1|0;break B}j=f-e|0;if((e|0)>0){e=f+1|0;d=j;while(1){a=H[d|0]==32?a:e;d=d+1|0;if(f>>>0>d>>>0){continue}break}}if(a>>>0<=f>>>0){break y}}j=0;if(a>>>0>>0){continue}break}}a=G[v>>2];d=j+80|0;G[s+8>>2]=d-l;E[g+546|0]=H[68332];F[g+544>>1]=H[68330]|H[68331]<<8;a=l+(a-((a>>>0)%2880|0)|0)|0;if(a>>>0>d>>>0){while(1){d=rb(d,g+544|0,80)+80|0;if(a>>>0>d>>>0){continue}break}}d=G[s+12>>2];Wa(i);if((d|0)>0){break e}a=G[s+8>>2];G[s+8>>2]=(a-((a-1>>>0)%2880|0)|0)+2879;a=G[u>>2];d=Fe(a,35562);C:{if(!d){break C}if((Va(d)|0)<=254){Za(g+544|0,d);break C}y=rb(g+544|0,d,254),z=0,E[y+254|0]=z}d=0;e=Fe(a,35139);D:{if(!e){break D}if(Va(e)>>>0>29){break D}d=2147483647;p=sb(Za(g+448|0,e));k=p+.001;if(k>2147483647){break D}E:{if(p>=0){if(!(O(k)<2147483648)){break E}d=~~k;break D}d=-2147483648;k=p+-.001;if(k<-2147483648){break D}if(!(O(k)<2147483648)){break E}d=~~k;break D}d=-2147483648}F:{G:{f=g+544|0;e=jb(f,33);m=ac(e?e+1|0:f,30817);if(!m){Ua(38183);Ua(g+544|0);break G}f=lb(d,1);if(!f){Ua(11761);Ua(g+544|0);Hb(m);break G}e=d;d=zc(f,1,d,m);if((e|0)>(d|0)){G[g+36>>2]=1024;G[g+32>>2]=d;a=g+448|0;Ya(a,81,44679,g+32|0);Ua(a);Wa(f);Hb(m);break G}H:{e=lb(6,1);I:{if(!e){Ua(23507);break I}d=H[f|0];E[e|0]=H[f+!d|0];d=f+(d?2:3)|0;E[e+1|0]=H[d|0];E[e+2|0]=H[d+2|0];E[e+3|0]=H[d+4|0];E[e+4|0]=H[d+6|0];d=fb(e,3744,5);Wa(e);if(!d){break H}}if(!fb(f,40592,5)){break H}Ua(38224);Ua(g+544|0);Wa(f);Hb(m);break G}Wa(f);j=1;e=Fe(a,33788);d=1;J:{if(!e){break J}d=1;if(Va(e)>>>0>29){break J}p=sb(Za(g+448|0,e));k=p+.001;d=2147483647;if(k>2147483647){break J}K:{if(p>=0){if(!(O(k)<2147483648)){break K}d=~~k;break J}k=p+-.001;d=-2147483648;if(k<-2147483648){break J}if(!(O(k)<2147483648)){break K}d=~~k;break J}d=-2147483648}e=Fe(a,41261);L:{if(!e){break L}if(Va(e)>>>0>29){break L}j=2147483647;p=sb(Za(g+448|0,e));k=p+.001;if(k>2147483647){break L}M:{if(p>=0){if(!(O(k)<2147483648)){break M}j=~~k;break L}j=-2147483648;k=p+-.001;if(k<-2147483648){break L}if(!(O(k)<2147483648)){break M}j=~~k;break L}j=-2147483648}n=1;e=Fe(a,41253);r=1;N:{if(!e){break N}r=1;if(Va(e)>>>0>29){break N}p=sb(Za(g+448|0,e));k=p+.001;r=2147483647;if(k>2147483647){break N}O:{if(p>=0){if(!(O(k)<2147483648)){break O}r=~~k;break N}k=p+-.001;r=-2147483648;if(k<-2147483648){break N}if(!(O(k)<2147483648)){break O}r=~~k;break N}r=-2147483648}f=1;h=1;P:{if((d|0)<2){break P}e=Fe(a,40853);f=1;Q:{if(!e){break Q}f=1;if(Va(e)>>>0>29){break Q}p=sb(Za(g+448|0,e));k=p+.001;f=2147483647;if(k>2147483647){break Q}R:{if(p>=0){if(!(O(k)<2147483648)){break R}f=~~k;break Q}k=p+-.001;f=-2147483648;if(k<-2147483648){break Q}if(!(O(k)<2147483648)){break R}f=~~k;break Q}f=-2147483648}Fe(a,40845);if(d>>>0<3){break P}n=Fe(a,40514);e=1;S:{if(!n){break S}e=1;if(Va(n)>>>0>29){break S}p=sb(Za(g+448|0,n));k=p+.001;e=2147483647;if(k>2147483647){break S}T:{if(p>=0){if(!(O(k)<2147483648)){break T}e=~~k;break S}k=p+-.001;e=-2147483648;if(k<-2147483648){break S}if(!(O(k)<2147483648)){break T}e=~~k;break S}e=-2147483648}n=e;if(d>>>0<4){break P}d=Fe(a,40363);if(!d){break P}if(Va(d)>>>0>29){break P}h=2147483647;p=sb(Za(g+448|0,d));k=p+.001;if(k>2147483647){break P}U:{if(p>=0){if(!(O(k)<2147483648)){break U}h=~~k;break P}h=-2147483648;k=p+-.001;if(k<-2147483648){break P}if(!(O(k)<2147483648)){break U}h=~~k;break P}h=-2147483648}V:{W:{X:{d=Fe(a,32941);if(!d){break X}if(Va(d)>>>0>29){break X}k=sb(Za(g+448|0,d));p=k+.001;if(p>2147483647){break X}if(k>=0){break W}p=k+-.001;if(!(p<-2147483648)){break W}e=-2147483648;d=-2147483648;break V}e=2147483647;d=2147483647;break V}if(O(p)<2147483648){e=~~p}else{e=-2147483648}if((e|0)>=0){d=e;break V}d=0-e|0}Y:{l=(d|0)/8|0;i=M(l,j);q=M(i,M(M(f,n),h));d=(q+G[s+8>>2]|0)-1|0;h=(d-((d>>>0)%2880|0)|0)+2880|0;if(h>>>0<=J[v>>2]){break Y}a=ub(G[u>>2],h);if(a){break Y}G[g+48>>2]=G[s+8>>2];a=g+448|0;Ya(a,81,11506,g+48|0);Ua(a);Ua(g+544|0);Hb(m);break G}G[u>>2]=a;G[v>>2]=h;d=G[s+8>>2];G[s+8>>2]=h;d=a+d|0;Z:{if((j|0)==(r|0)){f=zc(d,1,q,m);break Z}h=0;n=(f|0)==1?(n|0)>1?n:f:f;if((n|0)<=0){f=0;break Z}r=M(l,r-j|0);a=d;f=0;while(1){j=zc(a,1,i,m);He(m,r,1);f=f+j|0;a=a+i|0;h=h+1|0;if((n|0)!=(h|0)){continue}break}}Hb(m);if((f|0)<(q|0)){G[g+68>>2]=q;G[g+64>>2]=f;a=g+448|0;Ya(a,81,44679,g- -64|0);Ua(a);Ua(g+544|0);break G}if(!G[189280]){break F}_:{switch(Eu(e- -64|0,28)|0){case 5:if((q|0)<2){break F}e=d+q|0;while(1){a=H[d+1|0];E[d+1|0]=H[d|0];E[d|0]=a;d=d+2|0;if(e>>>0>d>>>0){continue}break};break F;case 6:if((q|0)<4){break F}f=d+q|0;while(1){e=H[d+3|0];E[d+3|0]=H[d|0];a=H[d+2|0];E[d+2|0]=H[d+1|0];E[d+1|0]=a;E[d|0]=e;d=d+4|0;if(f>>>0>d>>>0){continue}break};break F;case 3:if((q|0)<2){break F}e=d+q|0;while(1){a=H[d+1|0];E[d+1|0]=H[d|0];E[d|0]=a;d=d+2|0;if(e>>>0>d>>>0){continue}break};break F;case 2:if((q|0)<4){break F}f=d+q|0;while(1){e=H[d+3|0];E[d+3|0]=H[d|0];a=H[d+2|0];E[d+2|0]=H[d+1|0];E[d+1|0]=a;E[d|0]=e;d=d+4|0;if(f>>>0>d>>>0){continue}break};break F;case 0:break _;default:break F}}if((q|0)<8){break F}r=d+q|0;while(1){j=H[d+7|0];E[d+7|0]=H[d|0];f=H[d+6|0];E[d+6|0]=H[d+1|0];e=H[d+5|0];E[d+5|0]=H[d+2|0];a=H[d+4|0];E[d+4|0]=H[d+3|0];E[d+3|0]=a;E[d+2|0]=e;E[d+1|0]=f;E[d|0]=j;d=d+8|0;if(r>>>0>d>>>0){continue}break}break F}G[s+12>>2]=104}d=G[s+12>>2];break e}G[g+16>>2]=d;d=g+272|0;Ya(d,81,30404,g+16|0);Ua(d)}Ua(a);d=104;G[s+12>>2]=104;Wa(i)}Fa=g+800|0;G[s+12>>2]=d;a=G[c>>2];if(d){a=M(a,48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;Ua(55760);b=G[s+12>>2];break a}c=M(a,48);a=c+757256|0;G[a>>2]=0;G[a+4>>2]=0;a=c+757264|0;G[a>>2]=G[s+8>>2];G[a+4>>2]=0}Fa=s+16|0;return b|0}function dd(a,b,c,d,e,f,g,h){var 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;i=Fa-32|0;Fa=i;if(G[321436]){j=G[24367];hb(88717,28,1,j);$a(j)}l=1950;j=a&-2;a:{if((j|0)==4){break a}l=b;if(l!=0){break a}l=a&-3?1950:2e3}L[i>>3]=d;L[i+8>>3]=c;k=(a|0)!=(e|0);v=e&-2;b=1950;b:{if((v|0)==4){break b}b=f;if(f!=0){break b}b=e&-3?1950:2e3}c:{if(!(k|l!=b)){L[g>>3]=c;L[h>>3]=d;break c}d:{if((j|0)==2){j=!a;a=(a|0)==2;jj(c,d,i+8|0,i,l,!(j|a));a=!(a^j);if((e|0)!=(a|0)|b!=l){break d}L[g>>3]=L[i+8>>3];L[h>>3]=L[i>>3];break c}e:{f:{switch(a-4|0){case 1:g:{if(H[3706360]){q=L[463310];m=L[463296];s=L[463312];break g}G[926594]=442745336;G[926595]=1078765020;G[926592]=-1571644103;G[926593]=1066524486;G[926596]=52553840;G[926597]=-1075344588;G[926600]=-673237620;G[926601]=-1078782476;G[926604]=71334806;G[926605]=1072007784;G[926608]=-505530574;G[926609]=1072016415;G[926612]=1753527554;G[926613]=-1078674469;G[926616]=-910810613;G[926617]=1072129682;G[926620]=-1081034383;G[926621]=1072680502;G[926624]=489187355;G[926625]=1069297225;E[3706360]=1;q=.9939225903997749;m=.017453292519943295;s=.11008126222478191}n=m*d;d=eb(n);c=m*c;p=ib(c);m=eb(c);c=0;f=ib(n);m=d*m;d=p*d;q=s*f+(m*0+q*d);n=O(q);h:{if(n>=1){z=i,A=fc(q/n),L[z+16>>3]=A;break h}c=L[463308];n=L[463304];p=L[463306];s=L[463302];w=L[463298];x=L[463300];z=i,A=fc(q),L[z+16>>3]=A;c=Db(c*f+(n*m+d*p),s*f+(w*m+d*x))}d=L[463297];c=c*d;if(c<0){while(1){c=c+360;if(c<0){continue}break}}L[i+24>>3]=c;if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[i+24>>3]=c}d=d*L[i+16>>3];L[i+16>>3]=d;c=90;i:{if(!(O(d)>=90)){break i}G[i+24>>2]=0;G[i+28>>2]=0;d=L[i+16>>3];if(!(d>90)){c=-90;if(!(d<-90)){break i}}L[i+16>>3]=c}c=L[i+24>>3];if((e|0)==4){L[g>>3]=c;L[h>>3]=L[i+16>>3];break c}cm(c,L[i+16>>3],i+8|0,i);break e;case 0:break f;default:break d}}if((e|0)==5){dm(c,d,g,h);break c}cm(c,d,i+24|0,i+16|0);L[i+8>>3]=L[i+24>>3];L[i>>3]=L[i+16>>3]}a=1}if(!((a|0)!=(e|0)|b!=l)){L[g>>3]=L[i+8>>3];L[h>>3]=L[i>>3];break c}j:{k:{l:{switch(a|0){case 1:m:{switch(e|0){default:if(b!=l){ng(l,L[i+8>>3],L[i>>3],b,i+24|0,i+16|0);L[i+8>>3]=L[i+24>>3];L[i>>3]=L[i+16>>3]}if((e|0)!=1){break j}L[g>>3]=L[i+8>>3];L[h>>3]=L[i>>3];break c;case 0:case 2:break m}}c=L[i+8>>3];f=L[i>>3];u=i+24|0;y=i+16|0;a=Fa+-64|0;Fa=a;if(G[321436]){j=G[24367];hb(88989,34,1,j);$a(j)}d=O(l);n:{o:{if(G[47601]){p:{if(d==1950){L[a+48>>3]=f;L[a+56>>3]=c;break p}ng(d,c,f,1950,a+56|0,a+48|0);f=L[a+48>>3];c=L[a+56>>3]}Oh(c,f,1950,a+24|0,a+16|0,a+8|0,a);c=L[a+56>>3]+L[a+24>>3];L[a+56>>3]=c;L[a+48>>3]=L[a+48>>3]+L[a+16>>3];if(G[321436]){j=G[24367];hb(89190,32,1,j);$a(j);c=L[a+56>>3]}if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[a+56>>3]=c}if(c<0){while(1){c=c+360;if(c<0){continue}break}L[a+56>>3]=c}d=1950;f=L[a+48>>3];if(!(O(f)>90)){break n}f=f>0?180-f:-(f+180);L[a+48>>3]=f;c=c+180;c=c>=360?c+-360:c;break o}L[a+48>>3]=f}L[a+56>>3]=c}q:{if(d!=1950){ng(d,c,f,1950,a+40|0,a+32|0);break q}L[a+32>>3]=f;L[a+40>>3]=c}j=Fa-32|0;Fa=j;if(G[321436]){k=G[24367];hb(88645,36,1,k);$a(k)}o=a+40|0;f=L[o>>3];r=a+32|0;l=L[r>>3];m=O(l);r:{if(m<89.999){if(G[321436]){k=G[24367];hb(88829,31,1,k);$a(k)}s:{if(H[3739672]){d=L[467461];c=L[467464];break s}G[934922]=0;G[934923]=1080367104;G[934928]=-1571644103;G[934929]=1066524486;G[934924]=1660415268;G[934925]=1058591923;G[934926]=537691728;G[934927]=1054926027;G[934920]=1660415268;G[934921]=1058591923;E[3739672]=1;d=168.75;c=.017453292519943295}d=f+d;f=c*(d>=360?d+-360:d);d=0;l=l*c;c=eb(l);if(!(m>=90)){d=L[467460]*ib(f)/c}m=L[467462];q=L[467463];L[o>>3]=d+L[o>>3];z=r,A=m*eb(f)*ib(l)+c*q+L[r>>3],L[z>>3]=A;if(G[321436]){k=G[24367];hb(89190,32,1,k);$a(k)}d=L[o>>3];if(d>360){while(1){d=d+-360;if(d>360){continue}break}L[o>>3]=d}if(d<0){while(1){d=d+360;if(d<0){continue}break}L[o>>3]=d}if(!(O(L[r>>3])>90)){break r}c=d+180;L[o>>3]=c>=360?c+-360:c;c=L[r>>3];L[r>>3]=c>0?180-c:-(c+180);break r}ij(f,l,j+24|0,j+16|0,1949.9997905544149,0);f=L[j+24>>3];l=L[j+16>>3];k=G[24367];if(G[321436]){hb(88929,35,1,k);$a(k)}t=j+8|0;hj(f,l,t,j);c=L[j>>3];d=f-L[t>>3];if(G[321436]){hb(89190,32,1,k);$a(k)}if(d>360){while(1){d=d+-360;if(d>360){continue}break}}c=l-c;if(d<0){while(1){d=d+360;if(d<0){continue}break}}if(O(c)>90){c=c>0?180-c:-(c+180);d=d+180;d=d>=360?d+-360:d}hj(d,c,t,j);c=L[j>>3];d=f-L[t>>3];if(G[321436]){hb(89190,32,1,k);$a(k)}if(d>360){while(1){d=d+-360;if(d>360){continue}break}}c=l-c;if(d<0){while(1){d=d+360;if(d<0){continue}break}}if(O(c)>90){c=c>0?180-c:-(c+180);d=d+180;d=d>=360?d+-360:d}hj(d,c,t,j);if(G[321436]){hb(89190,32,1,k);$a(k)}d=L[j+24>>3]-L[j+8>>3];L[j+24>>3]=d;L[j+16>>3]=L[j+16>>3]-L[j>>3];if(G[321436]){k=G[24367];hb(89190,32,1,k);$a(k);d=L[j+24>>3]}if(d>360){while(1){d=d+-360;if(d>360){continue}break}L[j+24>>3]=d}if(d<0){while(1){d=d+360;if(d<0){continue}break}L[j+24>>3]=d}c=L[j+16>>3];if(O(c)>90){c=c>0?180-c:-(c+180);L[j+16>>3]=c;d=d+180;d=d>=360?d+-360:d;L[j+24>>3]=d}jj(d,c,o,r,1949.9997905544149,0)}Fa=j+32|0;c=L[a+40>>3]+.00014583333333333335;if(c>360){while(1){c=c+-360;if(c>360){continue}break}}L[a+40>>3]=c;if(c<0){while(1){c=c+360;if(c<0){continue}break}L[a+40>>3]=c}if(G[321436]){j=G[24367];hb(89190,32,1,j);$a(j);c=L[a+40>>3]}if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[a+40>>3]=c}if(c<0){while(1){c=c+360;if(c<0){continue}break}L[a+40>>3]=c}f=L[a+32>>3];if(O(f)>90){f=f>0?180-f:-(f+180);L[a+32>>3]=f;c=c+180;c=c>=360?c+-360:c;L[a+40>>3]=c}Ug(1949.9997905544149,c,f,2e3,u,y);Fa=a- -64|0;if(b!=2e3){c=L[i+24>>3];L[i+8>>3]=c;d=L[i+16>>3];L[i>>3]=d;Ug(2e3,c,d,b,i+24|0,i+16|0)}c=L[i+24>>3];if(e){break k}L[g>>3]=c;L[h>>3]=L[i+16>>3];break c;case 0:break l;default:break j}}t:{switch(e|0){default:c=L[i>>3];f=L[i+8>>3];if(l!=2e3){Ug(l,f,c,2e3,i+24|0,i+16|0);f=L[i+24>>3];L[i+8>>3]=f;c=L[i+16>>3];L[i>>3]=c}t=i+24|0;u=i+16|0;d=0;j=Fa+-64|0;Fa=j;if(G[321436]){a=G[24367];hb(89051,34,1,a);$a(a)}q=b!=0?O(b):1950;n=f;s=c;l=1950;c=l+-1950;f=(c*365.2421988+2433282.4235+-2451545)/365.25+2e3;Ug(2e3,n,s,f,j+56|0,j+48|0);c=L[j+56>>3]+(c*.01*.085+.035)*-15/3600;if(c>360){while(1){c=c+-360;if(c>360){continue}break}}L[j+56>>3]=c;if(c<0){while(1){c=c+360;if(c<0){continue}break}L[j+56>>3]=c}a=Fa-16|0;Fa=a;if(G[321436]){k=G[24367];hb(88682,34,1,k);$a(k)}o=j+56|0;n=L[o>>3];r=j+48|0;m=L[r>>3];u:{if(O(m)<89.999){k=G[24367];v:{if(!G[321436]){break v}hb(88861,35,1,k);$a(k);if(!G[321436]){break v}hb(88829,31,1,k);$a(k)}w:{if(H[3739672]){d=L[467461];c=L[467464];break w}G[934922]=0;G[934923]=1080367104;G[934928]=-1571644103;G[934929]=1066524486;G[934924]=1660415268;G[934925]=1058591923;G[934926]=537691728;G[934927]=1054926027;G[934920]=1660415268;G[934921]=1058591923;E[3739672]=1;d=168.75;c=.017453292519943295}d=d+n;d=c*(d>=360?d+-360:d);p=c*m;c=eb(p);if(O(m)>=90){f=0}else{f=L[467460]*ib(d)/c}L[a+8>>3]=f;f=L[467463];d=L[467462]*eb(d)*ib(p)+c*f;L[a>>3]=d;c=n-L[a+8>>3];if(G[321436]){hb(89190,32,1,k);$a(k)}if(c>360){while(1){c=c+-360;if(c>360){continue}break}}d=m-d;if(c<0){while(1){c=c+360;if(c<0){continue}break}}if(O(d)>90){d=d>0?180-d:-(d+180);c=c+180;c=c>=360?c+-360:c}if(G[321436]){hb(88829,31,1,k);$a(k)}x:{if(!H[3739672]){G[934922]=0;G[934923]=1080367104;G[934928]=-1571644103;G[934929]=1066524486;G[934924]=1660415268;G[934925]=1058591923;G[934926]=537691728;G[934927]=1054926027;G[934920]=1660415268;G[934921]=1058591923;E[3739672]=1;p=.017453292519943295;f=168.75;break x}p=L[467464];f=L[467461]}c=c+f;c=p*(c>=360?c+-360:c);p=d*p;f=eb(p);if(O(d)>=90){d=0}else{d=L[467460]*ib(c)/f}L[a+8>>3]=d;d=L[467463];d=L[467462]*eb(c)*ib(p)+f*d;L[a>>3]=d;c=n-L[a+8>>3];if(G[321436]){hb(89190,32,1,k);$a(k)}if(c>360){while(1){c=c+-360;if(c>360){continue}break}}d=m-d;if(c<0){while(1){c=c+360;if(c<0){continue}break}}if(O(d)>90){d=d>0?180-d:-(d+180);c=c+180;c=c>=360?c+-360:c}if(G[321436]){hb(88829,31,1,k);$a(k)}y:{if(!H[3739672]){G[934922]=0;G[934923]=1080367104;G[934928]=-1571644103;G[934929]=1066524486;G[934924]=1660415268;G[934925]=1058591923;G[934926]=537691728;G[934927]=1054926027;G[934920]=1660415268;G[934921]=1058591923;E[3739672]=1;m=168.75;f=.017453292519943295;break y}m=L[467461];f=L[467464]}c=c+m;c=f*(c>=360?c+-360:c);m=d*f;f=eb(m);if(O(d)>=90){d=0}else{d=L[467460]*ib(c)/f}L[a+8>>3]=d;d=L[467463];z=a,A=L[467462]*eb(c)*ib(m)+f*d,L[z>>3]=A;L[o>>3]=L[o>>3]-L[a+8>>3];L[r>>3]=L[r>>3]-L[a>>3];if(G[321436]){k=G[24367];hb(89190,32,1,k);$a(k)}c=L[o>>3];if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[o>>3]=c}if(c<0){while(1){c=c+360;if(c<0){continue}break}L[o>>3]=c}if(!(O(L[r>>3])>90)){break u}c=c+180;L[o>>3]=c>=360?c+-360:c;c=L[r>>3];L[r>>3]=c>0?180-c:-(c+180);break u}ij(n,m,a+8|0,a,f,0);m=L[a>>3];n=L[a+8>>3];if(G[321436]){k=G[24367];hb(88897,31,1,k);$a(k)}if(!H[3739720]){G[934934]=-1124855371;G[934935]=1064784320;G[934932]=-1571644103;G[934933]=1066524486;E[3739720]=1}if(f!=L[23803]){L[23803]=f;c=(f+-2e3)*.01;p=c*c;L[467468]=p*-1.236e-7+(c*-42037e-9+.016708617);L[467469]=(p*46e-5+(c*.71953+102.93735))*L[467466]}if(O(m)>89.999){c=0}else{c=L[467467];d=L[467468];s=n;n=L[467466];p=L[467469]-s*n;s=ib(p);m=m*n;c=d*c;d=ib(m)*(s*c);c=c*eb(p)/eb(m)}c=c+L[a+8>>3];L[a+8>>3]=c;L[a>>3]=d+L[a>>3];if(G[321436]){k=G[24367];hb(89190,32,1,k);$a(k);c=L[a+8>>3]}if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[a+8>>3]=c}if(c<0){while(1){c=c+360;if(c<0){continue}break}L[a+8>>3]=c}d=L[a>>3];if(O(d)>90){d=d>0?180-d:-(d+180);L[a>>3]=d;c=c+180;c=c>=360?c+-360:c;L[a+8>>3]=c}jj(c,d,o,r,f,0)}Fa=a+16|0;z:{if(G[47601]){c=L[j+56>>3];A:{if(l==1950){L[j+40>>3]=c;f=L[j+48>>3];L[j+32>>3]=f;break A}ng(l,c,L[j+48>>3],1950,j+40|0,j+32|0);f=L[j+32>>3];c=L[j+40>>3]}a=j+24|0;k=j+16|0;o=j+8|0;B:{if(O(f)>89.999){G[a>>2]=0;G[a+4>>2]=0;G[k>>2]=0;G[k+4>>2]=0;G[o>>2]=0;G[o+4>>2]=0;G[j>>2]=0;G[j+4>>2]=0;break B}r=G[47600];G[47600]=-1;Oh(c,f,l,a,k,o,j);m=L[k>>3];d=c-L[a>>3];if(d<0){while(1){d=d+360;if(d<0){continue}break}}if(d>360){while(1){d=d+-360;if(d>360){continue}break}}Oh(d,f-m,l,a,k,o,j);m=L[k>>3];d=c-L[a>>3];if(d<0){while(1){d=d+360;if(d<0){continue}break}}if(d>360){while(1){d=d+-360;if(d>360){continue}break}}Oh(d,f-m,l,a,k,o,j);G[47600]=r}c=L[j+40>>3]-L[j+24>>3];L[j+40>>3]=c;L[j+32>>3]=L[j+32>>3]-L[j+16>>3];if(G[321436]){a=G[24367];hb(89190,32,1,a);$a(a);c=L[j+40>>3]}if(c>360){while(1){c=c+-360;if(c>360){continue}break}L[j+40>>3]=c}if(c<0){while(1){c=c+360;if(c<0){continue}break}L[j+40>>3]=c}f=L[j+32>>3];if(O(f)>90){f=f>0?180-f:-(f+180);L[j+32>>3]=f;c=c+180;c=c>=360?c+-360:c;L[j+40>>3]=c}if(q!=1950){ng(1950,c,f,q,t,u);break z}L[t>>3]=c;L[u>>3]=f;break z}c=L[j+56>>3];if(l!=q){ng(l,c,L[j+48>>3],q,t,u);break z}L[t>>3]=c;L[u>>3]=L[j+48>>3]}Fa=j- -64|0;c=L[i+24>>3];if((e|0)==1){L[g>>3]=c;L[h>>3]=L[i+16>>3];break c}L[i+8>>3]=c;L[i>>3]=L[i+16>>3];break j;case 0:case 2:break t}}if(b!=l){Ug(l,L[i+8>>3],L[i>>3],b,i+24|0,i+16|0);L[i+8>>3]=L[i+24>>3];L[i>>3]=L[i+16>>3]}if(e){break j}L[g>>3]=L[i+8>>3];L[h>>3]=L[i>>3];break c}L[i+8>>3]=c;L[i>>3]=L[i+16>>3]}if((v|0)==2){ij(L[i+8>>3],L[i>>3],g,h,b,(e|0)!=0&(e|0)!=2);break c}if((v|0)!=4){break c}m=L[i+8>>3];l=L[i>>3];if(G[321436]){a=G[24367];hb(89139,25,1,a);$a(a)}C:{if(H[3706664]){c=L[463350];d=L[463348];f=L[463334];n=L[463352];break C}G[926670]=442745336;G[926671]=1078765020;G[926668]=-1571644103;G[926669]=1066524486;G[926672]=-1929575474;G[926673]=-1078909396;G[926676]=2146916876;G[926677]=-1075057251;G[926680]=875303292;G[926681]=-1075908019;G[926684]=-102333635;G[926685]=1071614172;G[926688]=203628506;G[926689]=-1076047236;G[926692]=656523441;G[926693]=1072157603;G[926696]=-960750452;G[926697]=-1075068062;G[926700]=-1327103221;G[926701]=-1077404504;G[926704]=-867076380;G[926705]=1071477737;E[3706664]=1;d=-.8676008111514348;c=-.18837460172292028;f=.017453292519943295;n=.4601997847838517}q=f*l;l=eb(q);f=f*m;m=ib(f);f=eb(f);b=ib(q);s=d;d=f*l;f=c;c=m*l;f=n*b+(s*d+f*c);l=O(f);D:{if(l>=1){z=i,A=fc(f/l),L[z+16>>3]=A;b=0;break D}l=L[463346];m=L[463342];q=L[463344];n=L[463340];p=L[463336];s=L[463338];z=i,A=fc(f),L[z+16>>3]=A;b=Db(l*b+(m*d+c*q),n*b+(p*d+c*s))}c=L[463335];b=b*c;if(b<0){while(1){b=b+360;if(b<0){continue}break}}L[i+24>>3]=b;if(b>360){while(1){b=b+-360;if(b>360){continue}break}L[i+24>>3]=b}c=c*L[i+16>>3];L[i+16>>3]=c;b=90;E:{if(!(O(c)>=90)){break E}G[i+24>>2]=0;G[i+28>>2]=0;c=L[i+16>>3];if(!(c>90)){b=-90;if(!(c<-90)){break E}}L[i+16>>3]=b}b=L[i+24>>3];if((e|0)==5){dm(b,L[i+16>>3],g,h);break c}L[g>>3]=b;L[h>>3]=L[i+16>>3]}Fa=i+32|0}function xh(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=N(0),x=0,y=0,z=0,A=0,B=0,C=0,D=0,I=0,J=0,P=0,Q=0,R=0;o=Fa-896|0;Fa=o;G[o+248>>2]=0;G[o+252>>2]=1072693248;a:{if(!(g|h)|G[n>>2]>0){break a}p=G[a>>2];q=G[a+4>>2];b:{c:{if((p|0)!=G[q+76>>2]){mb(a,p+1|0,0,n);break c}if((G[q+128>>2]&G[q+132>>2])!=-1){break c}if((Rb(a,n)|0)>0){break b}}if(!((b|0)>0&G[G[a+4>>2]+936>>2]>=(b|0))){G[o>>2]=b;a=o+336|0;Ya(a,81,30457,o);Ua(a);G[n>>2]=302;break a}co(a,b,o+880|0,0,0,n);p=G[o+880>>2];if((p|0)<0){p=0-p|0;G[o+880>>2]=p}t=G[(G[G[a+4>>2]+968>>2]+M(b,160)|0)-80>>2];q=t>>31;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{q=(q^t)-q|0;switch(q-14|0){case 0:break k;case 2:break l;case 1:break d;default:break m}}if((q|0)==83){break j}if((q|0)!=163){break d}j=1;q=c;c=f<<1|e>>>31;e=e<<1;r=e-1|0;e=c-!e|0;c=g;f=h<<1|c>>>31;p=c<<1;c=lb(p,8);Id(a,b,q,d,r,e,p,f,1,1,-91191291391491e-49,c,l,m,n);if(G[n>>2]>0){break e}Ck(a,b,o+884|0,n);d=(G[o+884>>2]-3|0)/2|0;G[o+884>>2]=d;e=b;b=o+800|0;zb(34187,e,b,n);E[o+768|0]=0;G[o+888>>2]=0;if(Fc(a,b,o+736|0,0,o+888|0)){break h}Ai(o+736|0,o+768|0);switch(H[o+736|0]-65|0){case 0:break g;case 8:case 14:case 25:case 40:case 46:case 57:break i;default:break h}}t=a;y=i;z=j;D=k;p=Fa-29072|0;Fa=p;n:{if(!(g|h)|G[n>>2]>0){break n}a=G[t>>2];if((a|0)!=G[G[t+4>>2]+76>>2]){mb(t,a+1|0,0,n)}if(m){G[m>>2]=0}if((y|0)==2){cb(l,0,g)}o:{p:{if((b|0)>0){a=G[t+4>>2];if(G[a+936>>2]>=(b|0)){break p}}G[p>>2]=b;a=p+28864|0;Ya(a,81,30457,p);Ua(a);a=302;break o}a=G[(G[a+968>>2]+M(b,160)|0)-80>>2];G[p+29068>>2]=a;q:{r:{s:{if((a|0)!=16){if((a|0)!=-16){break q}g=1;h=0;if((yc(t,b,c,d,1,0,1,0,0,p+29e3|0,p+28992|0,p+28960|0,p+29056|0,p+29068|0,p+29064|0,p+29032|0,p+29024|0,p+29052|0,p+29040|0,p+29008|0,p+29060|0,p+29016|0,p+28832|0,n)|0)<=0){break s}break n}if((yc(t,b,c,d,e,f,g,h,0,p+29e3|0,p+28992|0,p+28960|0,p+29056|0,p+29068|0,p+29064|0,p+29032|0,p+29024|0,p+29052|0,p+29040|0,p+29008|0,p+29060|0,p+29016|0,p+28832|0,n)|0)>0){break n}b=G[p+29056>>2];if((b|0)<2881){break r}G[p+29052>>2]=b;G[p+29064>>2]=1;G[p+29040>>2]=1;G[p+29044>>2]=0;break r}b=G[p+29040>>2];G[p+29056>>2]=b}I=1;a=Va(p+28832|0);J=a?a:1;t:{if(z?0:(y|0)==1){break t}u:{if(!(!z|(y|0)!=1)){if(!H[z|0]){break t}if(H[p+28832|0]!=1){break u}break t}if(H[p+28832|0]==1){break t}}I=!y|(b|0)<(J|0)}R=p+31|0;c=0;d=0;while(1){a=G[p+29064>>2];i=a;e=a>>31;a=G[p+29040>>2];k=G[p+29044>>2];f=G[p+29036>>2];b=G[p+29032>>2];j=Au(G[p+29008>>2],G[p+29012>>2],P,r);b=b+j|0;f=Ia+f|0;f=b>>>0>>0?f+1|0:f;q=b;b=G[p+29024>>2];x=G[p+29028>>2];j=G[p+29052>>2];A=Au(b,x,j,j>>31);j=q+A|0;q=Ia+f|0;Jb(t,j,j>>>0>>0?q+1|0:q,0,n);i=g>>>0>>0&(e|0)>=(h|0)|(e|0)>(h|0)?g:i;q=i;f=q>>31;e=k-((a>>>0>>0)+x|0)|0;a=a-b|0;b=a;a=a>>>0>q>>>0&(e|0)>=(f|0)|(e|0)>(f|0);x=a?q:b;b=G[p+29052>>2];e=G[p+29056>>2];v:{if((b|0)==(e|0)){b=M(b,x);ic(t,b,b>>31,p+32|0,n);break v}Rd(t,e,x,b-e|0,p+32|0,n)}q=x;f=q>>31;e=q;a=c+e|0;q=d+f|0;q=a>>>0>>0?q+1|0:q;w:{A=a;v=a-1|0;a=v;b=a>>>0>>0;a=a>>31;if(b&(a|0)<=(d|0)|(a|0)<(d|0)){break w}a=G[p+29056>>2];k=M(x,a)+R|0;if(I){while(1){u=G[D+(v<<2)>>2];i=u+a|0;b=i-1|0;x:{y:{if((a|0)<=1){j=0;E[i|0]=0;if((a|0)==1){break y}break x}j=a-1|0;z:{if(H[k|0]!=32){break z}B=u+1|0;C=(k-a|0)+1|0;a=b;while(1){if((j|0)>1){j=j-1|0;i=a;b=a-1|0;a=b;k=k-1|0;if(H[k|0]==32){continue}break z}break}j=0;k=C;i=B;b=u}E[i|0]=0}i=0;a=j;u=a+1&3;if(u){while(1){E[b|0]=H[k|0];a=a-1|0;b=b-1|0;k=k-1|0;i=i+1|0;if((u|0)!=(i|0)){continue}break}}if(j>>>0<=2){break x}while(1){E[b|0]=H[k|0];E[b-1|0]=H[k-1|0];E[b-2|0]=H[k-2|0];E[b-3|0]=H[k-3|0];b=b-4|0;k=k-4|0;i=(a|0)==3;a=a-4|0;if(!i){continue}break}}v=v-1|0;a=v;b=a>>>0>>0;a=a>>31;if(b&(a|0)<=(d|0)|(a|0)<(d|0)){break w}a=G[p+29056>>2];continue}}while(1){Q=D+(v<<2)|0;u=G[Q>>2];i=u+a|0;b=i-1|0;A:{B:{if((a|0)>=2){j=a-1|0;C:{if(H[k|0]!=32){break C}B=u+1|0;C=(k-a|0)+1|0;while(1){D:{i=b;if((a|0)<=2){break D}a=j;j=a-1|0;b=i-1|0;k=k-1|0;if(H[k|0]==32){continue}break C}break}j=0;k=C;i=B;b=u}E[i|0]=0;break B}j=0;E[i|0]=0;if((a|0)!=1){break A}}i=0;a=j;u=a+1&3;if(u){while(1){E[b|0]=H[k|0];a=a-1|0;b=b-1|0;k=k-1|0;i=i+1|0;if((u|0)!=(i|0)){continue}break}}if(j>>>0<3){break A}while(1){E[b|0]=H[k|0];E[b-1|0]=H[k-1|0];E[b-2|0]=H[k-2|0];E[b-3|0]=H[k-3|0];b=b-4|0;k=k-4|0;i=(a|0)!=3;a=a-4|0;if(i){continue}break}}a=G[Q>>2];E:{if(fb(p+28832|0,a,J)){break E}G[m>>2]=1;if((y|0)==1){if(z){Za(a,z);break E}E[a|0]=32;E[a+1|0]=0;break E}E[l+v|0]=1}v=v-1|0;a=v;b=a>>>0>>0;a=a>>31;if(b&(a|0)<=(d|0)|(a|0)<(d|0)){break w}a=G[p+29056>>2];continue}}if(G[n>>2]>0){s=+(c>>>0)+ +(d|0)*4294967296;L[p+16>>3]=s+1;L[p+24>>3]=s+ +(x|0);a=p+28864|0;Ya(a,81,45884,p+16|0);Ua(a);break n}h=h-((e>>>0>g>>>0)+f|0)|0;g=g-e|0;if(!(h|g)){break n}f=f+G[p+29028>>2]|0;a=e+G[p+29024>>2]|0;f=a>>>0>>0?f+1|0:f;G[p+29024>>2]=a;G[p+29028>>2]=f;c=A;d=q;if(G[p+29040>>2]!=(a|0)|G[p+29044>>2]!=(f|0)){continue}G[p+29024>>2]=0;G[p+29028>>2]=0;f=r;a=P+1|0;f=a?f:f+1|0;P=a;r=f;continue}}a=309}G[n>>2]=a}Fa=p+29072|0;break b}r=ab(g);fg(a,b,c,d,e,f,g,h,i,E[j|0],r,l,m,n);F:{if(!g&(h|0)<=0|(h|0)<0|G[n>>2]>0){break F}d=g&1;i=0;a=0;if((g|0)!=1|h){j=g&-2;a=h;g=0;h=0;e=0;f=0;while(1){c=G[(g<<2)+k>>2];b=H[g+r|0];b=(b|0)==1?84:b?78:70;E[c|0]=b;E[c+1|0]=b>>>8;c=g|1;b=H[c+r|0];c=G[(c<<2)+k>>2];b=(b|0)==1?84:b?78:70;E[c|0]=b;E[c+1|0]=b>>>8;c=h;b=g+2|0;c=b>>>0<2?c+1|0:c;g=b;h=c;b=e+2|0;q=b>>>0<2?f+1|0:f;e=b;f=q;if((j|0)!=(b|0)|(a|0)!=(f|0)){continue}break}a=g}if(!(d|i)){break F}b=G[(a<<2)+k>>2];a=H[a+r|0];a=(a|0)==1?84:a?78:70;E[b|0]=a;E[b+1|0]=a>>>8}Wa(r);break b}j=1;r=c;q=f<<1|e>>>31;c=e<<1;f=c-1|0;p=q-!c|0;e=g;c=h<<1|e>>>31;e=e<<1;q=lb(e,4);ae(a,b,r,d,f,p,e,c,1,1,N(-9119119840596153e-51),q,l,m,n);G:{if(G[n>>2]>0){break G}Ck(a,b,o+884|0,n);c=(G[o+884>>2]-3|0)/2|0;G[o+884>>2]=c;d=b;b=o+800|0;zb(34187,d,b,n);E[o+768|0]=0;G[o+888>>2]=0;H:{I:{J:{if(Fc(a,b,o+736|0,0,o+888|0)){break J}Ai(o+736|0,o+768|0);K:{switch(H[o+736|0]-65|0){case 0:break I;case 8:case 14:case 25:case 40:case 46:case 57:break K;default:break J}}j=0}if(H[o+768|0]){break H}}a=H[35735]|H[35736]<<8|(H[35737]<<16|H[35738]<<24);E[o+771|0]=a;E[o+772|0]=a>>>8;E[o+773|0]=a>>>16;E[o+774|0]=a>>>24;G[o+768>>2]=H[35732]|H[35733]<<8|(H[35734]<<16|H[35735]<<24)}if(!g&(h|0)<=0|(h|0)<0){break G}e=0;f=0;a=0;while(1){b=(e<<2)+k|0;d=G[b>>2];E[d|0]=40;E[d+1|0]=0;m=a<<2;w=K[m+q>>2];L:{if(w==N(-9119119840596153e-51)){E[o+340|0]=H[34773];G[o+336>>2]=H[34769]|H[34770]<<8|(H[34771]<<16|H[34772]<<24);if((i|0)!=2){break L}E[e+l|0]=1;break L}if(!j){if(N(O(w))>2]=d;Ya(o+336|0,400,o+768|0,o+176|0);break L}L[o+160>>3]=w;Ya(o+336|0,400,o+768|0,o+160|0)}qb(G[b>>2],o+336|0,c);d=G[b>>2];d=Va(d)+d|0;E[d|0]=44;E[d+1|0]=0;w=K[q+(m|4)>>2];M:{if(w==N(-9119119840596153e-51)){E[o+340|0]=H[34773];G[o+336>>2]=H[34769]|H[34770]<<8|(H[34771]<<16|H[34772]<<24);if((i|0)!=2){break M}E[e+l|0]=1;break M}if(!j){if(N(O(w))>2]=d;Ya(o+336|0,400,o+768|0,o+144|0);break M}L[o+128>>3]=w;Ya(o+336|0,400,o+768|0,o+128|0)}qb(G[b>>2],o+336|0,c);b=G[b>>2];b=Va(b)+b|0;E[b|0]=41;E[b+1|0]=0;a=a+2|0;b=e+1|0;f=b?f:f+1|0;e=b;if((g|0)!=(b|0)|(f|0)!=(h|0)){continue}break}}Wa(q);break b}j=0}if(H[o+768|0]){break f}}G[o+768>>2]=775107109;G[o+772>>2]=4535601}if(!g&(h|0)<=0|(h|0)<0){break e}e=0;f=0;a=0;while(1){b=(e<<2)+k|0;m=G[b>>2];E[m|0]=40;E[m+1|0]=0;n=a<<3;s=L[n+c>>3];N:{if(s==-91191291391491e-49){E[o+340|0]=H[34773];G[o+336>>2]=H[34769]|H[34770]<<8|(H[34771]<<16|H[34772]<<24);if((i|0)!=2){break N}E[e+l|0]=1;break N}if(!j){if(O(s)<2147483648){m=~~s}else{m=-2147483648}G[o+240>>2]=m;Ya(o+336|0,400,o+768|0,o+240|0);break N}L[o+224>>3]=s;Ya(o+336|0,400,o+768|0,o+224|0)}qb(G[b>>2],o+336|0,d);m=G[b>>2];m=Va(m)+m|0;E[m|0]=44;E[m+1|0]=0;s=L[c+(n|8)>>3];O:{if(s==-91191291391491e-49){E[o+340|0]=H[34773];G[o+336>>2]=H[34769]|H[34770]<<8|(H[34771]<<16|H[34772]<<24);if((i|0)!=2){break O}E[e+l|0]=1;break O}if(!j){if(O(s)<2147483648){m=~~s}else{m=-2147483648}G[o+208>>2]=m;Ya(o+336|0,400,o+768|0,o+208|0);break O}L[o+192>>3]=s;Ya(o+336|0,400,o+768|0,o+192|0)}qb(G[b>>2],o+336|0,d);b=G[b>>2];b=Va(b)+b|0;E[b|0]=41;E[b+1|0]=0;a=a+2|0;b=e+1|0;f=b?f:f+1|0;e=b;if((g|0)!=(b|0)|(f|0)!=(h|0)){continue}break}}Wa(c);break b}P:{t=(q|0)!=81;if(!(t|(p|0)!=81)){q=lb(g,8);r=lb(g,1);G[o+884>>2]=20;Se(a,b,c,d,e,f,g,h,1,2,0,0,q,r,m,n);if(G[n>>2]>0){break P}Q:{if(j){a=rb(o+256|0,j,79);E[a+79|0]=0;a=Va(a);break Q}F[o+256>>1]=32;a=1}if(!g&(h|0)<=0|(h|0)<0){break P}e=0;f=0;b=(a|0)<21;while(1){R:{if(H[e+r|0]){a=(e<<2)+k|0;E[G[a>>2]]=0;a=G[a>>2];S:{if(!b){qb(a,o+256|0,20);break S}G[o+32>>2]=20;G[o+36>>2]=o+256;db(a,8725,o+32|0)}if((i|0)!=2){break R}E[e+l|0]=1;break R}a=q+(e<<3)|0;c=G[a+4>>2];G[o+16>>2]=G[a>>2];G[o+20>>2]=c;a=o+336|0;Ya(a,400,26734,o+16|0);c=(e<<2)+k|0;E[G[c>>2]]=0;qb(G[c>>2],a,20)}a=e+1|0;f=a?f:f+1|0;e=a;if((a|0)!=(g|0)|(f|0)!=(h|0)){continue}break}break P}r=lb(g,8);T:{if(!((p|0)!=80|t)){q=lb(g,1);G[o+884>>2]=20;hf(a,b,c,d,e,f,g,h,1,2,0,0,r,q,m,n);if(G[n>>2]>0){Wa(q);break T}U:{if(j){a=rb(o+256|0,j,79);E[a+79|0]=0;a=Va(a);break U}F[o+256>>1]=32;a=1}if(!!g&(h|0)>=0|(h|0)>0){e=0;f=0;b=(a|0)<21;while(1){V:{if(H[e+q|0]){a=(e<<2)+k|0;E[G[a>>2]]=0;a=G[a>>2];W:{if(!b){qb(a,o+256|0,20);break W}G[o+64>>2]=20;G[o+68>>2]=o+256;db(a,8725,o- -64|0)}if((i|0)!=2){break V}E[e+l|0]=1;break V}a=r+(e<<3)|0;c=G[a+4>>2];G[o+48>>2]=G[a>>2];G[o+52>>2]=c;a=o+336|0;Ya(a,400,4033,o+48|0);c=(e<<2)+k|0;E[G[c>>2]]=0;qb(G[c>>2],a,20)}c=f;a=e+1|0;c=a?c:c+1|0;e=a;f=c;if((g|0)!=(a|0)|(h|0)!=(c|0)){continue}break}}Wa(q);break T}if((Id(a,b,c,d,e,f,g,h,1,i,-91191291391491e-49,r,l,m,n)|0)>0){break T}Ck(a,b,o+884|0,n);c=o+800|0;zb(34838,b,c,n);G[o+888>>2]=0;e=o+888|0;d=Kc(a,c,o+248|0,e);s=L[o+248>>3];zb(34187,b,c,n);E[o+768|0]=0;G[o+888>>2]=0;d=!d&s!=1;m=!d&q>>>0<42;X:{Y:{Z:{if(Fc(a,c,o+736|0,0,e)){break Z}Ai(o+736|0,o+768|0);_:{switch(H[o+736|0]-65|0){case 0:E[o+768|0]=0;break Y;case 8:case 14:case 25:case 40:case 46:case 57:break _;default:break Z}}m=1}if(H[o+768|0]){break X}}c=b;b=o+800|0;zb(34641,c,b,n);Fc(a,b,o+736|0,0,n);if(d&q>>>0<22){G[o+768>>2]=875635493;G[o+772>>2]=4666926;break X}if(d&(q|0)==41){E[o+776|0]=H[35120];a=H[35116]|H[35117]<<8|(H[35118]<<16|H[35119]<<24);G[o+768>>2]=H[35112]|H[35113]<<8|(H[35114]<<16|H[35115]<<24);G[o+772>>2]=a;break X}if(d&(q|0)==81){E[o+776|0]=H[35120];a=H[35116]|H[35117]<<8|(H[35118]<<16|H[35119]<<24);G[o+768>>2]=H[35112]|H[35113]<<8|(H[35114]<<16|H[35115]<<24);G[o+772>>2]=a;break X}Dc(a,o+892|0,n);if(G[o+892>>2]==1){Ai(o+736|0,o+768|0);break X}$:{switch(q-1|0){case 0:G[o+768>>2]=6566949;break X;case 10:G[o+768>>2]=6566949;break X;case 20:G[o+768>>2]=6567461;break X;default:break $}}if((q|0)==41){m=0;a=H[19403]|H[19404]<<8|(H[19405]<<16|H[19406]<<24);E[o+771|0]=a;E[o+772|0]=a>>>8;E[o+773|0]=a>>>16;E[o+774|0]=a>>>24;G[o+768>>2]=H[19400]|H[19401]<<8|(H[19402]<<16|H[19403]<<24);break X}if((q|0)!=82){if((q|0)!=42){break X}G[o+768>>2]=875635493;G[o+772>>2]=4666926;break X}E[o+776|0]=H[35120];a=H[35116]|H[35117]<<8|(H[35118]<<16|H[35119]<<24);G[o+768>>2]=H[35112]|H[35113]<<8|(H[35114]<<16|H[35115]<<24);G[o+772>>2]=a}aa:{if(j){a=rb(o+256|0,j,79);E[a+79|0]=0;a=Va(a);break aa}F[o+256>>1]=32;a=1}if(!g&(h|0)<=0|(h|0)<0){break T}e=0;f=0;if((q|0)==1){while(1){b=(e<<2)+k|0;c=G[b>>2];s=L[r+(e<<3)>>3];ba:{if(O(s)<2147483648){a=~~s;break ba}a=-2147483648}E[c|0]=a&128?49:48;E[G[b>>2]+1|0]=a&64?49:48;E[G[b>>2]+2|0]=a&32?49:48;E[G[b>>2]+3|0]=a&16?49:48;E[G[b>>2]+4|0]=a&8?49:48;E[G[b>>2]+5|0]=a&4?49:48;E[G[b>>2]+6|0]=a&2?49:48;E[G[b>>2]+7|0]=a&1?49:48;E[G[b>>2]+8|0]=0;a=e+1|0;f=a?f:f+1|0;e=a;if((g|0)!=(a|0)|(f|0)!=(h|0)){continue}break T}}c=i-1|0;b=G[o+884>>2];d=(b|0)>=(a|0);while(1){ca:{da:{ea:{fa:{switch(c|0){case 1:a=e;if(!H[l+a|0]){break ea}break da;case 0:break fa;default:break ea}}a=e;if(L[r+(a<<3)>>3]==-91191291391491e-49){break da}}s=L[r+(e<<3)>>3];ga:{if(m){if(O(s)<2147483648){a=~~s}else{a=-2147483648}G[o+80>>2]=a;Ya(o+336|0,400,o+768|0,o+80|0);break ga}L[o+96>>3]=s;Ya(o+336|0,400,o+768|0,o+96|0)}if((Va(o+336|0)|0)>(b|0)){cb(o+336|0,42,b)}a=(e<<2)+k|0;E[G[a>>2]]=0;qb(G[a>>2],o+336|0,b);break ca}a=(a<<2)+k|0;E[G[a>>2]]=0;a=G[a>>2];if(!d){qb(a,o+256|0,b);break ca}G[o+112>>2]=b;G[o+116>>2]=o+256;db(a,8725,o+112|0)}a=e+1|0;f=a?f:f+1|0;e=a;if((g|0)!=(a|0)|(f|0)!=(h|0)){continue}break}}Wa(r);break b}Wa(r);Wa(q)}}Fa=o+896|0} -function Ef(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,P=0,Q=N(0),R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}yc(a,b,c,d,e,f,g,h,i>>31,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o);z=G[q+29084>>2];if(!((i|0)!=1|(z|0)!=14)){fg(a,b,c,d,e,f,g,h,j,k,l,m,n,o);p=G[o>>2];break a}if(jb(q+28992|0,65)){if(G[o>>2]==308){G[o>>2]=0;df()}G[q+29060>>2]=1;G[q+29084>>2]=11;c=G[q+29064>>2];d=c>>31;G[q+29064>>2]=1;G[q+29048>>2]=c;G[q+29052>>2]=d;G[q+29096>>2]=0;G[q+29100>>2]=1072693248;G[q+29088>>2]=0;G[q+29092>>2]=0;G[q+29024>>2]=1234554321;G[q+29028>>2]=0;G[q+29080>>2]=28800;z=11}p=G[o>>2];if((p|0)>0){break a}G[q+29060>>2]=M(G[q+29060>>2],i);C=1;b:{if((z|0)!=16|G[q+29076>>2]!=1){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);d=G[q+29068>>2];if((d|0)<=0){break b}if(d-1>>>0>=7){c=d&-8;p=0;while(1){C=C*10*10*10*10*10*10*10*10;p=p+8|0;if((c|0)!=(p|0)){continue}break}}c=d&7;if(!c){break b}p=0;while(1){C=C*10;p=p+1|0;if((c|0)!=(p|0)){continue}break}}z=0;c:{if(k?0:(j|0)==1){break c}f=G[q+29028>>2];c=G[q+29024>>2];p=G[q+29084>>2];if(!f&(c|0)==1234554321&((p|0)%10|0)==1){break c}e=f-(c>>>0<32768)|0;if(((e|0)==-1&c-32768>>>0<4294901760|(e|0)!=-1)&(p|0)==21|(!f&c>>>0>255|(f|0)!=0)&(p|0)==11){break c}z=(p|0)==16?H[q+28864|0]==1?0:j:j}X=0-i|0;e=0;f=0;d:{while(1){c=G[q+29080>>2];j=c>>31;c=(h|0)<=(j|0)&c>>>0>g>>>0|(h|0)<(j|0)?g:c;d=c>>31;u=c;x=d;e:{if((i|0)>=0){d=G[q+29036>>2];p=G[q+29052>>2]+(d^-1)|0;c=G[q+29032>>2];j=c^-1;v=j+G[q+29048>>2]|0;v=Bu(v,j>>>0>v>>>0?p+1|0:p,i,0);j=Ia;break e}c=G[q+29032>>2];d=G[q+29036>>2];v=Bu(c,d,X,0);j=Ia}s=G[q+29044>>2];w=G[q+29040>>2];p=Au(G[q+29016>>2],G[q+29020>>2],D,P);w=w+p|0;s=Ia+s|0;s=p>>>0>w>>>0?s+1|0:s;t=w;p=c;w=G[q+29060>>2];c=(w|0)/(i|0)|0;d=Au(p,d,c,c>>31);p=t+d|0;c=Ia+s|0;c=d>>>0>p>>>0?c+1|0:c;s=p;p=j;d=v+1|0;p=d;d=(j|0)<=(x|0)&u>>>0>v>>>0|(j|0)<(x|0);u=d?p:u;f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{d=G[q+29084>>2];switch(d-11|0){case 0:break g;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break h;case 5:break i;case 31:break k;case 30:break m;case 10:break n;default:break o}}switch(d-81|0){case 1:break j;case 0:break l;default:break h}}d=c;c=q- -64|0;Pe(a,s,d,u,w,c,o);Eo(c,u,L[q+29096>>3],L[q+29088>>3],z,F[q+29024>>1],k,e+m|0,n,e+l|0,o);break f}d=c;c=q- -64|0;Uc(a,s,d,u,w,c,o);Do(c,u,L[q+29096>>3],L[q+29088>>3],z,G[q+29024>>2],k,e+m|0,n,e+l|0,o);break f}t=q- -64|0;Tc(a,s,c,u,w,t,o);w=G[q+29024>>2];s=G[q+29028>>2];j=e+m|0;c=e+l|0;y=L[q+29096>>3];A=L[q+29088>>3];d=y==1&A==0x8000000000000000;p:{q:{r:{s:{t:{if(!z){if(d){if((u|0)<=0){break p}d=0;if((u|0)!=1){s=u&-2;j=0;while(1){x=c+d|0;p=t+(d<<3)|0;v=G[p+4>>2];p=G[p>>2];if((v|0)!=-2147483648|p>>>0>=128){G[o>>2]=-11;p=127}E[x|0]=p;x=d|1;p=t+(x<<3)|0;v=G[p+4>>2];p=G[p>>2];if(!((v|0)==-2147483648&p>>>0<=127)){G[o>>2]=-11;p=127}E[c+x|0]=p;d=d+2|0;j=j+2|0;if((s|0)!=(j|0)){continue}break}}if(!(u&1)){break p}j=t+(d<<3)|0;p=G[j+4>>2];j=G[j>>2];if((p|0)!=-2147483648|j>>>0>127){break t}break s}if(y==1&A==0){break q}d=0;if((u|0)<=0){break p}while(1){p=c+d|0;j=t+(d<<3)|0;r=(+J[j>>2]+ +G[j+4>>2]*4294967296)*y+A;u:{if(r<-128.49){G[o>>2]=-11;j=128;break u}if(r>127.49){G[o>>2]=-11;j=127;break u}j=~~r;if(O(r)<2147483648){break u}j=-2147483648}E[p|0]=j;d=d+1|0;if((u|0)!=(d|0)){continue}break}break p}if(d){if((u|0)<=0){break p}d=(z|0)==1;x=d?k:1;v=d?c:j;d=0;while(1){p=t+(d<<3)|0;j=G[p>>2];p=G[p+4>>2];v:{if((j|0)==(w|0)&(p|0)==(s|0)){G[n>>2]=1;j=x;p=v;break v}if((p|0)!=-2147483648|j>>>0>=128){G[o>>2]=-11;j=127}p=c}E[p+d|0]=j;d=d+1|0;if((u|0)!=(d|0)){continue}break}break p}if(y==1&A==0){break r}if((u|0)<=0){break p}d=(z|0)==1;x=d?k:1;v=d?c:j;d=0;while(1){j=t+(d<<3)|0;p=G[j>>2];j=G[j+4>>2];w:{if((p|0)==(w|0)&(j|0)==(s|0)){G[n>>2]=1;j=x;p=v;break w}r=(+(p>>>0)+ +(j|0)*4294967296)*y+A;x:{if(r<-128.49){G[o>>2]=-11;j=128;break x}if(r>127.49){G[o>>2]=-11;j=127;break x}j=~~r;if(O(r)<2147483648){break x}j=-2147483648}p=c}E[p+d|0]=j;d=d+1|0;if((u|0)!=(d|0)){continue}break}break p}G[o>>2]=-11;j=127}E[c+d|0]=j;break p}if((u|0)<=0){break p}d=(z|0)==1;x=d?k:1;v=d?c:j;d=0;while(1){p=t+(d<<3)|0;j=G[p>>2];p=G[p+4>>2];y:{if((j|0)==(w|0)&(p|0)==(s|0)){G[n>>2]=1;j=x;p=v;break y}z:{if((p|0)<0&j>>>0<=4294967167|(p|0)<-1){G[o>>2]=-11;j=128;break z}if((p|0)>=0&j>>>0>=128|(p|0)>0){G[o>>2]=-11;j=127}}p=c}E[p+d|0]=j;d=d+1|0;if((u|0)!=(d|0)){continue}break}break p}if((u|0)<=0){break p}d=0;while(1){v=c+d|0;p=t+(d<<3)|0;j=G[p+4>>2];p=G[p>>2];A:{if((j|0)<0&p>>>0<=4294967167|(j|0)<-1){G[o>>2]=-11;p=128;break A}if((j|0)>=0&p>>>0>=128|(j|0)>0){G[o>>2]=-11;p=127;break A}}E[v|0]=p;d=d+1|0;if((u|0)!=(d|0)){continue}break}}break f}d=s;s=q- -64|0;Uc(a,d,c,u,w,s,o);A=L[q+29096>>3];y=L[q+29088>>3];j=e+m|0;d=e+l|0;t=0;B:{C:{if(!z){if(A==1&y==0){break C}if((u|0)<=0){break B}while(1){c=d+t|0;r=+K[s+(t<<2)>>2]*A+y;D:{if(r<-128.49){G[o>>2]=-11;j=128;break D}if(r>127.49){G[o>>2]=-11;j=127;break D}j=~~r;if(O(r)<2147483648){break D}j=-2147483648}E[c|0]=j;t=t+1|0;if((u|0)!=(t|0)){continue}break}break B}t=s+2|0;E:{F:{if(!(A==1&y==0)){if((u|0)<=0){break B}c=(z|0)==1;x=c?k:1;v=c?d:j;if(!(O(y)<2147483648)){break F}p=~~y;break E}if((u|0)<=0){break B}c=(z|0)==1;v=c?k:1;c=c?d:j;w=0;while(1){p=d;j=0;G:{H:{I:{x=I[t>>1]&32640;switch(((x|0)==32640?1:!x<<1)|0){case 0:break H;case 1:break I;default:break G}}G[n>>2]=1;p=c;j=v;break G}Q=K[s+(w<<2)>>2];r=+Q;J:{if(r<-128.49){G[o>>2]=-11;j=128;break J}if(r>127.49){G[o>>2]=-11;j=127;break J}j=~~Q;if(N(O(Q))>1]&32640;switch(((c|0)==32640?1:!c<<1)|0){case 0:break M;case 1:break O;default:break N}}G[n>>2]=1;j=x;c=v;break K}if(y<-128.49){G[o>>2]=-11;j=128;break L}j=p;c=d;if(!(y>127.49)){break K}G[o>>2]=-11;j=127;break L}r=+K[s+(w<<2)>>2]*A+y;if(r<-128.49){G[o>>2]=-11;j=128;break L}if(r>127.49){G[o>>2]=-11;j=127;break L}j=~~r;if(O(r)<2147483648){break L}j=-2147483648}c=d}E[c+w|0]=j;t=t+4|0;w=w+1|0;if((u|0)!=(w|0)){continue}break}break B}if((u|0)<=0){break B}while(1){c=d+t|0;Q=K[s+(t<<2)>>2];r=+Q;P:{if(r<-128.49){G[o>>2]=-11;j=128;break P}if(r>127.49){G[o>>2]=-11;j=127;break P}j=~~Q;if(N(O(Q))>3];y=L[q+29088>>3];j=e+m|0;d=e+l|0;t=0;Q:{R:{if(!z){if(A==1&y==0){break R}if((u|0)<=0){break Q}while(1){c=d+t|0;r=L[s+(t<<3)>>3]*A+y;S:{if(r<-128.49){G[o>>2]=-11;j=128;break S}if(r>127.49){G[o>>2]=-11;j=127;break S}j=~~r;if(O(r)<2147483648){break S}j=-2147483648}E[c|0]=j;t=t+1|0;if((u|0)!=(t|0)){continue}break}break Q}t=s+6|0;T:{U:{if(!(A==1&y==0)){if((u|0)<=0){break Q}c=(z|0)==1;x=c?k:1;v=c?d:j;if(!(O(y)<2147483648)){break U}p=~~y;break T}if((u|0)<=0){break Q}c=(z|0)==1;v=c?k:1;c=c?d:j;w=0;while(1){p=d;j=0;V:{W:{X:{x=I[t>>1]&32752;switch(((x|0)==32752?1:!x<<1)|0){case 0:break W;case 1:break X;default:break V}}G[n>>2]=1;p=c;j=v;break V}r=L[s+(w<<3)>>3];Y:{if(r<-128.49){G[o>>2]=-11;j=128;break Y}if(r>127.49){G[o>>2]=-11;j=127;break Y}j=~~r;if(O(r)<2147483648){break Y}j=-2147483648}}E[p+w|0]=j;t=t+8|0;w=w+1|0;if((u|0)!=(w|0)){continue}break}break Q}p=-2147483648}w=0;while(1){Z:{_:{$:{aa:{ba:{c=I[t>>1]&32752;switch(((c|0)==32752?1:!c<<1)|0){case 0:break $;case 1:break ba;default:break aa}}G[n>>2]=1;j=x;c=v;break Z}if(y<-128.49){G[o>>2]=-11;j=128;break _}j=p;c=d;if(!(y>127.49)){break Z}G[o>>2]=-11;j=127;break _}r=L[s+(w<<3)>>3]*A+y;if(r<-128.49){G[o>>2]=-11;j=128;break _}if(r>127.49){G[o>>2]=-11;j=127;break _}j=~~r;if(O(r)<2147483648){break _}j=-2147483648}c=d}E[c+w|0]=j;t=t+8|0;w=w+1|0;if((u|0)!=(w|0)){continue}break}break Q}if((u|0)<=0){break Q}while(1){c=d+t|0;r=L[s+(t<<3)>>3];ca:{if(r<-128.49){G[o>>2]=-11;j=128;break ca}if(r>127.49){G[o>>2]=-11;j=127;break ca}j=~~r;if(O(r)<2147483648){break ca}j=-2147483648}E[c|0]=j;t=t+1|0;if((u|0)!=(t|0)){continue}break}}break f}Jb(a,s,c,0,o);d=G[q+29060>>2];c=G[q+29064>>2];da:{if((d|0)==(c|0)){c=M(d,u);ic(a,c,c>>31,q- -64|0,o);break da}Rd(a,c,u,d-c|0,q- -64|0,o)}d=q- -64|0;y=L[q+29096>>3];A=L[q+29088>>3];Y=G[q+29064>>2];j=e+m|0;t=e+l|0;S=0;B=Fa-112|0;Fa=B;T=q+28864|0;Z=Va(T);if((u|0)>0){ea:{c=(z|0)==1;w=c?k:1;s=c?t:j;while(1){v=d+Y|0;V=H[v|0];E[v|0]=0;j=d;fa:{ga:{ha:{if(H[T|0]==1){break ha}if(fb(T,d,Z)){break ha}d=v;if(!z){break fa}G[n>>2]=1;p=w;j=v;c=s;break ga}while(1){c=H[j|0];if((c|0)==32){j=j+1|0;continue}break}W=1;ia:{switch(c-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};W=(c|0)==45?-1:1;c=p;break;default:break ia}}R=0;if((c-48&255)>>>0<10){while(1){r=R*10+ +(c<<24>>24);p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}R=r+-48;if((c-48&255)>>>0<=9){continue}break}}r=C;ja:{ka:{switch(c-44|0){case 0:case 2:break ka;default:break ja}}p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}r=1;if((c-48&255)>>>0>=10){break ja}while(1){R=R*10+ +(c<<24>>24)+-48;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}r=r*10;if((c-48&255)>>>0<=9){continue}break}}la:{if((c&254)!=68){U=1;p=0;break la}while(1){U=1;p=j;j=p+1|0;c=H[p+1|0];if((c|0)==32){continue}break}ma:{switch(c-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=p+1|0;x=H[j|0];if((x|0)==32){continue}break};U=(c|0)==45?-1:1;c=x;break;default:break ma}}p=0;if((c-48&255)>>>0>=10){break la}while(1){x=c;_=M(p,10)-48|0;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}p=(x<<24>>24)+_|0;if((c-48&255)>>>0<=9){continue}break}}if(c){G[B+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[B+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[B+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[B+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[B+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[B+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[B+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[B+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[B+20>>2]=c;c=B+16|0;Ua(c);G[B>>2]=d;Ya(c,81,43022,B);Ua(c);E[v|0]=V;G[o>>2]=409;break ea}r=R*+(W|0)/r*$b(10,+(M(p,U)|0))*y+A;na:{if(r<-128.49){G[o>>2]=-11;p=128;break na}if(r>127.49){G[o>>2]=-11;p=127;break na}p=~~r;if(O(r)<2147483648){break na}p=-2147483648}c=t}E[c+S|0]=p;d=j}E[v|0]=V;S=S+1|0;if((u|0)!=(S|0)){continue}break}}}Fa=B+112|0;break f}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8979,q);Ua(a);p=311;if(G[q+29076>>2]==1){break d}p=312;break d}d=c;c=e+l|0;$d(a,s,d,u,w,c,o);Co(c,u,L[q+29096>>3],L[q+29088>>3],z,H[q+29024|0],k,e+m|0,n,c,o)}p=G[o>>2];if((p|0)>0){r=+(e>>>0)+ +(f|0)*4294967296;C=r+1;r=r+ +(u|0);oa:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=r;L[q+16>>3]=C;Ya(q+28896|0,81,47998,q+16|0);break oa}L[q+56>>3]=r;L[q+48>>3]=C;Ya(q+28896|0,81,47938,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}d=u;j=d>>31;h=h-((d>>>0>g>>>0)+j|0)|0;g=g-d|0;if(h|g){c=M(i,u);v=c+G[q+29032>>2]|0;p=G[q+29036>>2]+(c>>31)|0;p=c>>>0>v>>>0?p+1|0:p;c=v;G[q+29032>>2]=c;G[q+29036>>2]=p;s=f+j|0;e=d+e|0;s=e>>>0>>0?s+1|0:s;f=s;s=G[q+29052>>2];d=s;x=G[q+29048>>2];if((p|0)>=(d|0)&c>>>0>=x>>>0|(d|0)<(p|0)){j=Bu(c,p,x,s);v=D+j|0;d=Ia;P=P+d|0;P=v>>>0>>0?P+1|0:P;D=v;d=Au(x,s,j,d);G[q+29032>>2]=c-d;G[q+29036>>2]=p-(Ia+(c>>>0>>0)|0);continue}if((p|0)>0|(p|0)>=0){continue}j=D;D=Bu(c^-1,p^-1,x,s)+1|0;d=Ia;d=D?d:d+1|0;v=D;D=j-v|0;P=P-((j>>>0>>0)+d|0)|0;d=Au(x,s,v,d)+c|0;s=p+Ia|0;G[q+29032>>2]=d;G[q+29036>>2]=c>>>0>d>>>0?s+1|0:s;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function cc(a,b,c,d,e){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,F=0,H=0,I=0,J=0,K=0,N=0;j=Fa-144|0;Fa=j;a:{if(!a|!G[a+3312>>2]){break a}L[a+584>>3]=c;L[a+576>>3]=b;f=L[160676];G[a+3308>>2]=0;L[a+592>>3]=f;g=G[a+9392>>2];b:{if(g){cc(g,b,c,j+24|0,j+16|0);break b}f=b;h=c;g=0;b=0;c=0;s=Fa-80|0;c:{if(G[a+6048>>2]==1){i=h-L[a+24>>3];m=f-L[a+16>>3];o=G[a+6864>>2];q=G[a+6056>>2];d:{if((q|0)<0){break d}while(1){t=M(q-g|0,80)+a|0;l=g<<3;b=L[(t+l|0)+6064>>3];v=l+s|0;l=g;e:{if(!g){break e}k=0;y=l&3;if(y){while(1){g=g-1|0;b=i*b+L[(t+(g<<3)|0)+6064>>3];k=k+1|0;if((y|0)!=(k|0)){continue}break}}if(l-1>>>0<3){break e}while(1){y=t+6064|0;k=y+(g<<3)|0;b=i*(i*(i*(i*b+L[k-8>>3])+L[k-16>>3])+L[k-24>>3]);k=g-4|0;b=b+L[y+(k<<3)>>3];y=(g|0)>4;g=k;if(y){continue}break}}L[v>>3]=b;g=l+1|0;if((l|0)!=(q|0)){continue}break}b=L[s>>3];if((q|0)<=0){c=b;break d}l=q-1|0;g=q+1|0;t=q&3;f:{if(!t){c=b;break f}k=0;c=b;while(1){c=m*c+L[s+(g-q<<3)>>3];q=q-1|0;k=k+1|0;if((t|0)!=(k|0)){continue}break}}if(l>>>0<3){break d}while(1){l=s+(g-q<<3)|0;c=m*(m*(m*(m*c+L[l>>3])+L[l+8>>3])+L[l+16>>3]);l=q-3|0;c=c+L[s+(g-l<<3)>>3];q=q-4|0;if(l>>>0>1){continue}break}}L[j+24>>3]=c;g=0;g:{if((o|0)<0){break g}while(1){q=M(o-g|0,80)+a|0;l=g<<3;b=L[(q+l|0)+6872>>3];t=l+s|0;l=g;h:{if(!g){break h}k=0;v=l&3;if(v){while(1){g=g-1|0;b=i*b+L[(q+(g<<3)|0)+6872>>3];k=k+1|0;if((v|0)!=(k|0)){continue}break}}if(l-1>>>0<3){break h}while(1){v=q+6872|0;k=v+(g<<3)|0;b=i*(i*(i*(i*b+L[k-8>>3])+L[k-16>>3])+L[k-24>>3]);k=g-4|0;b=b+L[v+(k<<3)>>3];v=(g|0)>4;g=k;if(v){continue}break}}L[t>>3]=b;g=l+1|0;if((l|0)!=(o|0)){continue}break}b=L[s>>3];if((o|0)<=0){break g}l=o-1|0;g=o+1|0;q=o&3;if(q){k=0;while(1){b=m*b+L[s+(g-o<<3)>>3];o=o-1|0;k=k+1|0;if((q|0)!=(k|0)){continue}break}}if(l>>>0<3){break g}while(1){l=s+(g-o<<3)|0;b=m*(m*(m*(m*b+L[l>>3])+L[l+8>>3])+L[l+16>>3]);l=o-3|0;b=b+L[s+(g-l<<3)>>3];o=o-4|0;if(l>>>0>1){continue}break}}L[j+16>>3]=b;L[j+24>>3]=L[j+24>>3]+f;L[j+16>>3]=L[j+16>>3]+h;break c}L[j+24>>3]=f;L[j+16>>3]=h}}i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{g=G[a+3260>>2];switch(g-31|0){case 3:break q;case 2:break r;case 1:break s;case 0:break t;default:break p}}if(!Zg(L[j+24>>3],L[j+16>>3],a,j+8|0,j)){break o}break n}if(!rg(L[j+24>>3],L[j+16>>3],a,j+8|0,j)){break o}break n}h=L[j+24>>3]-L[a+616>>3];f=L[j+16>>3]-L[a+624>>3];u:{v:{if(G[a+3300>>2]){b=h*L[a+72>>3]+f*L[a+80>>3];c=h*L[a+56>>3]+f*L[a- -64>>3];break v}b=0;g=2;i=L[a+760>>3];if(i==0){c=0;break u}c=0;m=L[a+768>>3];if(m==0){break u}f=f*m;c=h*i;b=L[a+48>>3];if(b==0){b=f;break v}b=b*3.141592653589793/180;h=eb(b);i=ib(b);b=c*i+f*h;c=c*h-i*f}n=L[a+3176>>3];g=G[a+6040>>2];l=G[a+3304>>2];h=(90-L[((!l<<3)+a|0)+688>>3])*3.141592653589793/180;p=ib(h);u=eb(h);f=c;if(g){f=c+Ee(g,c,b)}g=G[a+6044>>2];if(g){b=b+Ee(g,c,b)}c=0;i=V(f*f+b*b);if(i!=0){c=Db(f,-b)}i=Db(L[a+3192>>3],i);m=eb(i);n=c-n*3.141592653589793/180;f=eb(n);w=ib(i);b=ib(n);g=(l|0)!=0;r=u*m;c=w*p-f*r;if(O(c)<1e-5){c=r*(1-f)-eb(h+i)}r=b*-m;w:{if(!(c==0&r==0)){b=Db(r,c);break w}b=n+3.141592653589793}x=L[((g<<3)+a|0)+688>>3];b=x+b*180/3.141592653589793;x:{if(x>=0){if(!(b<0)){break x}b=b+360;break x}if(!(b>0)){break x}b=b+-360}y:{if(b>360){b=b+-360;break y}if(!(b<-360)){break y}b=b+360}if(Yc(n,3.141592653589793)==0){g=0;c=(f*h+i)*180/3.141592653589793;c=c>90?180-c:c;if(!(c<-90)){break u}c=-180-c;break u}f=w*u+f*(p*m);z:{if(O(f)>.99){h=Sc(V(c*c+r*r));c=h*180/3.141592653589793;if(f>=0){break z}c=h*-180/3.141592653589793;break z}c=fc(f)*180/3.141592653589793}g=0}L[j+8>>3]=b;L[j>>3]=c;if(!g){break o}break n}f=0;k=0;b=L[j+24>>3]-L[a+616>>3];h=L[j+16>>3]-L[a+624>>3];A:{B:{if(G[a+3300>>2]){i=b*L[a+72>>3]+h*L[a+80>>3];b=b*L[a+56>>3]+h*L[a- -64>>3];break B}c=0;g=2;i=L[a+760>>3];if(i==0){break A}m=L[a+768>>3];if(m==0){break A}c=h*m;b=b*i;f=L[a+48>>3];if(f==0){i=c;break B}h=f*3.141592653589793/180;f=eb(h);h=ib(h);i=b*h+c*f;b=b*f-h*c}A=L[a+3176>>3];g=G[a+6040>>2];l=G[a+3276>>2];s=G[a+3304>>2];u=(90-L[((!s<<3)+a|0)+688>>3])*3.141592653589793/180;w=ib(u);x=eb(u);m=b;if(g){m=b+Ee(g,b,i)}g=G[a+6044>>2];if(g){i=i+Ee(g,b,i)}g=1;c=0;if((l|0)<=0){f=0;break A}p=V(m*m+i*i)/L[a+3192>>3];C:{D:{switch(l-1|0){case 0:b=(p-L[a+4176>>3])/L[a+4184>>3];break C;case 1:f=L[a+4184>>3];h=L[a+4192>>3];n=f*f+h*-4*(L[a+4176>>3]-p);if(n<0){f=0;break A}b=0;n=V(n);h=h+h;c=(n-f)/h;f=(-f-n)/h;h=cf?c:f:h;if(h<0){c=0;f=0;if(!(h<-1e-13)){break C}break A}b=3.141592653589793;if(!(h>3.141592653589793)){b=h;break C}c=0;f=0;if(!(h>3.141592653589893)){break C}break A;default:break D}}n=L[a+4176>>3];if(p>3];h=L[a+3248>>3];if(!(p>h)){q=l+1&3;f=b;while(1){b=.1;c=(h-p)/(h-n);E:{if(c<.1){break E}b=c;if(!(b>.9)){break E}b=.9}b=f-b*(f-r);o=0;c=0;g=l;if(q){while(1){c=c*b+L[((g<<3)+a|0)+4176>>3];g=g-1|0;o=o+1|0;if((q|0)!=(o|0)){continue}break}}if(l>>>0>=3){while(1){o=(g<<3)+a|0;c=(((c*b+L[o+4176>>3])*b+L[o+4168>>3])*b+L[o+4160>>3])*b+L[o+4152>>3];o=(g|0)>3;g=g-4|0;if(o){continue}break}}F:{if(!(c>>0<99;h=c;k=k+1|0;if(g){continue}break}break C}f=0;if(p>h+1e-13){break A}}c=0;if(p!=0){c=Db(m,-i)}h=1.5707963267948966-b;i=eb(h);m=c-A*3.141592653589793/180;b=eb(m);r=ib(h);c=ib(m);g=(s|0)!=0;n=x*i;f=r*w-b*n;if(O(f)<1e-5){f=n*(1-b)-eb(u+h)}n=c*-i;G:{if(!(f==0&n==0)){c=Db(n,f);break G}c=m+3.141592653589793}p=L[((g<<3)+a|0)+688>>3];c=p+c*180/3.141592653589793;H:{if(p>=0){if(!(c<0)){break H}c=c+360;break H}if(!(c>0)){break H}c=c+-360}I:{if(c>360){c=c+-360;break I}if(!(c<-360)){break I}c=c+360}if(Yc(m,3.141592653589793)==0){g=0;b=(b*u+h)*180/3.141592653589793;f=b>90?180-b:b;if(!(f<-90)){break A}f=-180-f;break A}b=r*x+w*i*b;J:{if(O(b)>.99){h=Sc(V(f*f+n*n));f=h*180/3.141592653589793;if(b>=0){break J}f=h*-180/3.141592653589793;break J}f=fc(b)*180/3.141592653589793}g=0}L[j+8>>3]=c;L[j>>3]=f;if(!g){break o}break n}b=L[j+16>>3];f=L[j+24>>3];if(!(G[a+3324>>2]!=2&(g|0)>0)){c=b-L[a+24>>3];f=f-L[a+16>>3];w=L[a+40>>3];x=L[a+32>>3];u=L[a+8>>3];h=L[a>>3];k=G[a+3260>>2];g=G[a+3300>>2];i=L[a+48>>3]*3.141592653589793/180;A=ib(i);B=eb(i);K:{L:{M:{if(g){b=f*L[a+72>>3]+c*L[a+80>>3];f=f*L[a+56>>3]+c*L[a- -64>>3];break M}b=0;if(!(x!=0&w!=0)){G[j+8>>2]=0;G[j+12>>2]=0;g=2;break L}c=c*w;f=f*x;if(i==0){b=c;break M}b=f*A+c*B;f=f*B-A*c}l=G[a+3304>>2];i=l?b:f;L[j+8>>3]=h+i;b=l?f:b;L[j>>3]=u+b;g=0;if((k|0)<=0){break K}c=(l?u:h)*3.141592653589793/180;n=i*3.141592653589793/180;D=n*n;i=b*3.141592653589793/180;p=D+i*i;h=(l?h:u)*3.141592653589793/180;m=ib(h);r=eb(h);f=0;b=0;N:{O:{switch(k-3|0){case 8:f=h+i;b=c+n;break N;case 1:g=1;if(p>1){break K}f=V(1-p);b=m*f+i*r;if(b>1|b<-1){break K}h=r*f-i*m;if(h==0&n==0){break K}f=fc(b);b=c+Db(n,h);break N;case 0:case 30:case 31:case 32:g=1;if(p>1){break K}f=r-i*m;if(f==0){break K}b=c+Db(n,f);f=Pd((i*r+m)*eb(b-c)/f);break N;case 3:g=1;if(p>=9.869604401089369){break K}f=V(p);h=eb(f);b=1;if(f!=0){b=ib(f)/f}f=i*r*b+m*h;if(f>1|f<-1){break K}h=h-f*m;b=r*(n*b);if(h==0&b==0){break K}f=fc(f);b=c+Db(b,h);break N;case 26:g=1;f=r-i*m;if(f==0){break K}b=c+Db(n,f);i=eb(b-c);if(i==0){break K}f=f/i;if(f>1|f<-1){break K}f=Sc(f);if(!(h<0)){break N}f=-f;break N;case 17:case 27:g=1;f=h+i;if(O(f)>1.5707963267948974){break K}b=eb(f);if(O(n)>b*6.28318530717959*.5){break K}if(!(b>1e-5)){b=c;break N}b=c+n/b;break N;case 9:b=(u*.5+45)*3.141592653589793/180;f=Mc(b);h=w*B+x*A;h=h==0?1:h;m=oc(Mc(h*.5*.01745329252+b));f=oc(f);g=1;b=eb(u*3.141592653589793/180);b=c+n/(b<=0?1:b);if(O(b-c)>6.28318530717959){break K}h=h*3.141592653589793/180/(m-f);if(h!=0){f=(i+f*h)/h}else{f=0}f=Pd(af(f));f=f+f+-1.5707963267948974;break N;case 19:b=u*3.141592653589793/180;m=eb(b);f=x*B-A*w;p=f==0?.017453292519943295:f*3.141592653589793/180;f=p*.5;u=ib(f);I=eb(f);f=w*B+x*A;w=f==0?.017453292519943295:f*3.141592653589793/180;f=b+w;x=eb(f);A=ib(f);r=ib(b);if(n==0){f=h;b=c;if(i==0){break N}}g=1;b=(m+m)*u;b=p*V((m*I+1)*.5)/(b==0?1:b);h=V((m+1)*.5);f=A/V((x+1)*.5)-r/h;f=w/(f==0?1:f);i=r*f/h+i;h=i/f;h=4-D/(b*(b*4))-h*h;if(h>4|h<2){break K}h=V(h)*.5;f=i*h/f;if(O(f)>1){break K}f=fc(f);i=eb(f);if(O(i)<1e-5){break K}b=n*h/((b+b)*i);if(O(b)>1){break K}b=fc(b);b=b+b+c;break N;case 2:g=1;b=(4-p)/(p+4);if(O(b)>1){break K}h=b+1;b=b*m+i*r*h*.5;if(O(b)>1){break K}f=fc(b);b=eb(f);if(O(b)<1e-5){break K}n=n*h/(b+b);if(O(n)>1){break K}h=ib(f);n=fc(n);p=eb(n);u=r*b*p+(h*m+1);if(O(u)<1e-5){break K}b=h*r-m*b*p;b=c+(O((b+b)/u-i)>1e-5?3.141592653589795-n:n);break N;case 13:break O;default:break N}}f=1/Mc(h)-i;b=c-Db(n,h<0?-f:f)/m;f=fc(1/(m+m)*(m*m*(1-(D+f*f))+1))}b=b-c>3.141592653589795?b+-6.28318530717959:b;b=b-c<-3.141592653589795?b+6.28318530717959:b;L[j+8>>3]=(b<0?b+6.28318530717959:b)*180/3.141592653589793;b=f*180/3.141592653589793;g=0}L[j>>3]=b}if(!g){break o}break n}G[j+96>>2]=0;G[j+100>>2]=0;G[j+104>>2]=0;G[j+108>>2]=0;G[j+8>>2]=0;G[j+12>>2]=0;G[j>>2]=0;G[j+4>>2]=0;G[j+80>>2]=0;G[j+84>>2]=0;G[j+88>>2]=0;G[j+92>>2]=0;L[j+56>>3]=b;L[j+48>>3]=f;G[j+72>>2]=0;G[j+76>>2]=1072693248;L[j+64>>3]=g-24>>>0<3?+(G[321354]+1|0):L[160676];q=a+3368|0;C=j+48|0;k=a+4036|0;t=j+80|0;l=a+4144|0;F=j+40|0;H=j+32|0;y=a+688|0;s=a+4064|0;v=j+112|0;o=a+4004|0;P:{if(G[o>>2]!=137){g=1;if(sj(G[k+4>>2],q,o)){break P}}g=4;if(Yh(C,k,t)){break P}k=G[k+4>>2];Q:{if((k|0)<=0){break Q}C=G[o+20>>2];g=0;if((k|0)!=1){J=k&-2;q=0;while(1){if(!((g|0)==(C|0)|G[o+24>>2]==(g|0))){z=g<<3;L[z+v>>3]=L[t+z>>3]+L[y+z>>3]}z=g|1;if(!((z|0)==(C|0)|(z|0)==G[o+24>>2])){z=z<<3;L[z+v>>3]=L[t+z>>3]+L[y+z>>3]}g=g+2|0;q=q+2|0;if((J|0)!=(q|0)){continue}break}}if(!(k&1)|(g|0)==(C|0)|G[o+24>>2]==(g|0)){break Q}g=g<<3;L[g+v>>3]=L[g+t>>3]+L[g+y>>3]}if(G[o>>2]!=999){k=G[o+28>>2];R:{if((k|0)==-1){break R}g=3;b=L[(k<<3)+t>>3];c=b+.5;S:{if(O(c)<2147483648){k=~~c;break S}k=-2147483648}if(O(b-+(k|0))>1e-10){break P}b=L[l+24>>3];b=b==0?90:b*3.141592653589793*.5;T:{switch(k|0){case 0:g=(G[o+24>>2]<<3)+t|0;L[g>>3]=b+L[g>>3];break R;case 2:g=(G[o+20>>2]<<3)+t|0;L[g>>3]=b+L[g>>3];break R;case 3:g=(G[o+20>>2]<<3)+t|0;L[g>>3]=b+b+L[g>>3];break R;case 4:g=(G[o+20>>2]<<3)+t|0;L[g>>3]=b*3+L[g>>3];break R;case 1:break R;case 5:break T;default:break P}}g=(G[o+24>>2]<<3)+t|0;L[g>>3]=L[g>>3]-b}k=o+4|0;if(!Xa(k,34233)){g=2;if(L[s+16>>3]==0){break P}E[k|0]=83;E[k+1|0]=73;E[k+2|0]=78;E[k+3|0]=0;G[l+40>>2]=0;G[l+44>>2]=0;K=l,N=Mb(L[s+16>>3])/Kb(L[s+16>>3]),L[K+48>>3]=N;G[l+4>>2]=G[l+4>>2]>>31}q=k;g=G[o+20>>2]<<3;b=L[g+t>>3];k=G[o+24>>2]<<3;c=L[k+t>>3];g=g+v|0;k=k+v|0;U:{V:{if(G[s>>2]!=137){o=1;if(um(q,s,l)){break V}}l=Ja[G[l+1892>>2]](b,c,l,F,H)|0;if(l){g=(l|0)==1?2:3;break U}b=L[F>>3];m=L[H>>3];f=Mb(m);p=Kb(m);n=b-L[s+56>>3];h=Mb(n);b=Kb(n);i=p*L[s+72>>3]-h*(f*L[s+64>>3]);if(O(i)<1e-5){c=Mb(L[s+48>>3]+m);i=f*L[s+64>>3]*(1-h)-c}r=b*-f;W:{if(!(i==0&r==0)){b=Ac(r,i);break W}b=n+180}b=b+L[s+40>>3];L[g>>3]=b;X:{Y:{if(L[s+40>>3]>=0){c=360;if(b<0){break Y}break X}c=-360;if(!(b>0)){break X}}b=b+c;L[g>>3]=b}c=-360;Z:{if(!(b>360)){c=360;if(!(b<-360)){break Z}}L[g>>3]=b+c}_:{$:{if(Yc(n,180)==0){b=h*L[s+48>>3]+m;b=b>90?180-b:b;L[k>>3]=b;if(!(b<-90)){break _}b=-180-b;break $}c=p*L[s+64>>3]+h*(f*L[s+72>>3]);if(O(c)>.99){b=Yg(V(i*i+r*r));if(!(c<0)){break $}b=-b;break $}b=Bc(c)}L[k>>3]=b}o=0}g=o}if(g){break P}}g=0}if(g){break n}g=j+112|0;L[j+8>>3]=L[g+(G[a+4024>>2]<<3)>>3];L[j>>3]=L[g+(G[a+4028>>2]<<3)>>3]}b=0;c=0;if(G[a+3308>>2]){break i}if(G[a+3260>>2]>0){Bm(G[a+3964>>2],G[a+3968>>2],L[a+120>>3],L[a+3952>>3],j+8|0,j,L[a+128>>3])}g=G[a+3264>>2];if((g|0)==-90){break l}if((g|0)==90){break m}c=L[j>>3];break j}G[a+3308>>2]=1;b=0;c=0;break i}c=90-L[j>>3];break k}c=L[j>>3]+-90}L[j>>3]=c}b=L[j+8>>3];L[a+608>>3]=c;L[a+600>>3]=b}L[d>>3]=b;L[e>>3]=c;a=G[a+3968>>2];if((a|0)<=0){break a}aa:{switch(a-6|0){case 0:case 4:break a;default:break aa}}c=360;b=L[d>>3];if(!(b<0)){c=-360;if(!(b>360)){break a}}L[d>>3]=b+c}Fa=j+144|0}function Wh(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a=Fa-34160|0;Fa=a;lm(G[321986]);b=G[321991];j=L[b+136>>3];l=(j+1)*.5;k=L[b+144>>3];i=(k+1)*.5;cc(b,l,i,a+1032|0,a+1024|0);E[a+1296|0]=0;b=H[33554]|H[33555]<<8|(H[33556]<<16|H[33557]<<24);G[a+1040>>2]=H[33550]|H[33551]<<8|(H[33552]<<16|H[33553]<<24);G[a+1044>>2]=b;G[a+1048>>2]=H[33558]|H[33559]<<8|(H[33560]<<16|H[33561]<<24);h=Va(a+1296|0);e=Va(a+1040|0);if(O(k)<2147483648){c=~~k}else{c=-2147483648}g=(e|0)<=0;if(O(j)<2147483648){b=~~j}else{b=-2147483648}a:{if(!g){bb(h+(a+1296|0)|0,a+1040|0,e);if(e>>>0>79){break a}}cb(a+1296+(e+h)|0,32,80-e|0)}E[(a+h|0)+1376|0]=0;h=a+1040|0;G[a+1008>>2]=h;_a(G[321986],70017,a+1008|0);e=H[40391]|H[40392]<<8|(H[40393]<<16|H[40394]<<24);g=H[40387]|H[40388]<<8|(H[40389]<<16|H[40390]<<24);F[a+1046>>1]=g;F[a+1048>>1]=g>>>16;F[a+1050>>1]=e;F[a+1052>>1]=e>>>16;g=H[40385]|H[40386]<<8|(H[40387]<<16|H[40388]<<24);G[a+1040>>2]=H[40381]|H[40382]<<8|(H[40383]<<16|H[40384]<<24);G[a+1044>>2]=g;g=Va(a+1296|0);h=Va(h);b:{if((h|0)>0){bb(g+(a+1296|0)|0,a+1040|0,h);if(h>>>0>79){break b}}cb(a+1296+(g+h)|0,32,80-h|0)}E[(a+g|0)+1376|0]=0;h=a+1040|0;G[a+992>>2]=h;_a(G[321986],70017,a+992|0);G[a+1048>>2]=H[40971]|H[40972]<<8|(H[40973]<<16|H[40974]<<24);g=H[40967]|H[40968]<<8|(H[40969]<<16|H[40970]<<24);G[a+1040>>2]=H[40963]|H[40964]<<8|(H[40965]<<16|H[40966]<<24);G[a+1044>>2]=g;g=Va(a+1296|0);h=Va(h);c:{if((h|0)>0){bb(g+(a+1296|0)|0,a+1040|0,h);if(h>>>0>79){break c}}cb(a+1296+(g+h)|0,32,80-h|0)}E[(a+g|0)+1376|0]=0;g=a+1040|0;G[a+976>>2]=g;_a(G[321986],70017,a+976|0);G[a+960>>2]=b;db(g,30391,a+960|0);b=Va(a+1296|0);g=Va(g);d:{if((g|0)>0){bb(b+(a+1296|0)|0,a+1040|0,g);if(g>>>0>79){break d}}cb(a+1296+(b+g)|0,32,80-g|0)}E[(a+b|0)+1376|0]=0;b=a+1040|0;G[a+944>>2]=b;_a(G[321986],70017,a+944|0);G[a+928>>2]=c;db(b,30378,a+928|0);c=Va(a+1296|0);b=Va(b);e:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break e}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+912>>2]=a+1040;_a(G[321986],70017,a+912|0);b=G[321991]+3512|0;f:{g:{if(!fb(b,35967,2)){E[a+1064|0]=H[65167];b=H[65163]|H[65164]<<8|(H[65165]<<16|H[65166]<<24);c=a+1056|0;G[c>>2]=H[65159]|H[65160]<<8|(H[65161]<<16|H[65162]<<24);G[c+4>>2]=b;b=H[65155]|H[65156]<<8|(H[65157]<<16|H[65158]<<24);G[a+1048>>2]=H[65151]|H[65152]<<8|(H[65153]<<16|H[65154]<<24);G[a+1052>>2]=b;b=H[65147]|H[65148]<<8|(H[65149]<<16|H[65150]<<24);G[a+1040>>2]=H[65143]|H[65144]<<8|(H[65145]<<16|H[65146]<<24);G[a+1044>>2]=b;b=Va(a+1296|0);c=Va(a+1040|0);h:{if((c|0)>0){bb(b+(a+1296|0)|0,a+1040|0,c);if(c>>>0>79){break h}}cb(a+1296+(b+c)|0,32,80-c|0)}E[(a+b|0)+1376|0]=0;g=a+1040|0;G[a+848>>2]=g;_a(G[321986],70017,a+848|0);E[a+1064|0]=H[65142];b=H[65138]|H[65139]<<8|(H[65140]<<16|H[65141]<<24);c=a+1056|0;G[c>>2]=H[65134]|H[65135]<<8|(H[65136]<<16|H[65137]<<24);G[c+4>>2]=b;b=H[65130]|H[65131]<<8|(H[65132]<<16|H[65133]<<24);G[a+1048>>2]=H[65126]|H[65127]<<8|(H[65128]<<16|H[65129]<<24);G[a+1052>>2]=b;b=H[65122]|H[65123]<<8|(H[65124]<<16|H[65125]<<24);G[a+1040>>2]=H[65118]|H[65119]<<8|(H[65120]<<16|H[65121]<<24);G[a+1044>>2]=b;f=Va(a+1296|0);d=Va(g);if((d|0)<=0){break g}bb((a+1296|0)+f|0,a+1040|0,d);if(d>>>0<=79){break g}break f}G[a+896>>2]=b;b=a+1040|0;db(b,65095,a+896|0);c=Va(a+1296|0);b=Va(b);i:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break i}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=a+1040|0;G[a+880>>2]=b;_a(G[321986],70017,a+880|0);G[a+864>>2]=G[321991]+3528;db(b,65072,a+864|0);f=Va(a+1296|0);d=Va(b);if((d|0)<=0){break g}bb((a+1296|0)+f|0,a+1040|0,d);if(d>>>0>79){break f}}cb(a+1296+(d+f)|0,32,80-d|0)}E[(a+f|0)+1376|0]=0;b=a+1040|0;G[a+832>>2]=b;_a(G[321986],70017,a+832|0);L[a+816>>3]=L[a+1032>>3];Eb(b,19350,a+816|0);c=Va(a+1296|0);b=Va(b);j:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break j}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=a+1040|0;G[a+800>>2]=b;_a(G[321986],70017,a+800|0);L[a+784>>3]=L[a+1024>>3];Eb(b,19314,a+784|0);c=Va(a+1296|0);b=Va(b);k:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break k}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=a+1040|0;G[a+768>>2]=b;_a(G[321986],70017,a+768|0);L[a+752>>3]=l;Eb(b,19332,a+752|0);c=Va(a+1296|0);b=Va(b);l:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break l}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=a+1040|0;G[a+736>>2]=b;_a(G[321986],70017,a+736|0);L[a+720>>3]=i;Eb(b,19296,a+720|0);c=Va(a+1296|0);b=Va(b);m:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break m}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+704>>2]=a+1040;_a(G[321986],70017,a+704|0);if(G[321992]){L[a+688>>3]=L[161030];b=a+1040|0;Eb(b,19384,a+688|0);c=Va(a+1296|0);b=Va(b);n:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break n}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+672>>2]=a+1040;_a(b,70017,a+672|0)}if(G[322016]){L[a+656>>3]=L[161031];b=a+1040|0;Eb(b,19368,a+656|0);c=Va(a+1296|0);b=Va(b);o:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break o}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+640>>2]=a+1040;_a(b,70017,a+640|0)}if(G[322070]){G[a+624>>2]=1288160;b=a+1040|0;db(b,9321,a+624|0);c=Va(a+1296|0);b=Va(b);p:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break p}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+608>>2]=a+1040;_a(b,70017,a+608|0)}if(G[322071]){G[a+592>>2]=1288336;b=a+1040|0;db(b,9425,a+592|0);c=Va(a+1296|0);b=Va(b);q:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break q}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+576>>2]=a+1040;_a(b,70017,a+576|0)}if(G[322072]){G[a+560>>2]=1288416;b=a+1040|0;db(b,9373,a+560|0);c=Va(a+1296|0);b=Va(b);r:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break r}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+544>>2]=a+1040;_a(b,70017,a+544|0)}if(G[322073]){G[a+528>>2]=1288496;b=a+1040|0;db(b,9399,a+528|0);c=Va(a+1296|0);b=Va(b);s:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break s}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+512>>2]=a+1040;_a(b,70017,a+512|0)}if(G[322074]){G[a+496>>2]=1288576;b=a+1040|0;db(b,9347,a+496|0);c=Va(a+1296|0);b=Va(b);t:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break t}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+480>>2]=a+1040;_a(b,70017,a+480|0)}if(G[322075]){G[a+464>>2]=1288656;b=a+1040|0;db(b,9438,a+464|0);c=Va(a+1296|0);b=Va(b);u:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break u}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+448>>2]=a+1040;_a(b,70017,a+448|0)}if(G[322076]){G[a+432>>2]=1288736;b=a+1040|0;db(b,9386,a+432|0);c=Va(a+1296|0);b=Va(b);v:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break v}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+416>>2]=a+1040;_a(b,70017,a+416|0)}if(G[322077]){G[a+400>>2]=1288816;b=a+1040|0;db(b,9412,a+400|0);c=Va(a+1296|0);b=Va(b);w:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break w}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+384>>2]=a+1040;_a(b,70017,a+384|0)}if(G[322078]){G[a+368>>2]=1288896;b=a+1040|0;db(b,9360,a+368|0);c=Va(a+1296|0);b=Va(b);x:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break x}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+352>>2]=a+1040;_a(b,70017,a+352|0)}if(G[322079]){G[a+336>>2]=1288976;b=a+1040|0;db(b,9334,a+336|0);c=Va(a+1296|0);b=Va(b);y:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break y}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+320>>2]=a+1040;_a(b,70017,a+320|0)}if(G[322080]){G[a+304>>2]=1289056;b=a+1040|0;db(b,9308,a+304|0);c=Va(a+1296|0);b=Va(b);z:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break z}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;b=G[321986];G[a+288>>2]=a+1040;_a(b,70017,a+288|0)}G[a+272>>2]=G[321985]-1;b=a+1040|0;db(b,30365,a+272|0);c=Va(a+1296|0);b=Va(b);A:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break A}}cb(a+1296+(b+c)|0,32,80-b|0)}e=0;E[(a+c|0)+1376|0]=0;G[a+256>>2]=a+1040;_a(G[321986],70017,a+256|0);f=G[321985];if((f|0)>0){while(1){d=0;if((f|0)>0){while(1){i=L[G[G[321987]+(e<<2)>>2]+(d<<3)>>3];G[a+240>>2]=e;G[a+244>>2]=d;L[a+248>>3]=i;b=a+1040|0;Eb(b,25553,a+240|0);c=Va(a+1296|0);b=Va(b);B:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break B}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+224>>2]=a+1040;_a(G[321986],70017,a+224|0);d=d+1|0;f=G[321985];if((d|0)<(f|0)){continue}break}}e=e+1|0;if((e|0)<(f|0)){continue}break}}G[a+208>>2]=f-1;b=a+1040|0;db(b,30352,a+208|0);c=Va(a+1296|0);b=Va(b);C:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break C}}cb(a+1296+(b+c)|0,32,80-b|0)}e=0;E[(a+c|0)+1376|0]=0;G[a+192>>2]=a+1040;_a(G[321986],70017,a+192|0);f=G[321985];if((f|0)>0){while(1){d=0;if((f|0)>0){while(1){i=L[G[G[321989]+(e<<2)>>2]+(d<<3)>>3];G[a+176>>2]=e;G[a+180>>2]=d;L[a+184>>3]=i;b=a+1040|0;Eb(b,25534,a+176|0);c=Va(a+1296|0);b=Va(b);D:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break D}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+160>>2]=a+1040;_a(G[321986],70017,a+160|0);d=d+1|0;f=G[321985];if((d|0)<(f|0)){continue}break}}e=e+1|0;if((e|0)<(f|0)){continue}break}}G[a+144>>2]=f-1;b=a+1040|0;db(b,30263,a+144|0);c=Va(a+1296|0);b=Va(b);E:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break E}}cb(a+1296+(b+c)|0,32,80-b|0)}e=0;E[(a+c|0)+1376|0]=0;G[a+128>>2]=a+1040;_a(G[321986],70017,a+128|0);f=G[321985];if((f|0)>0){while(1){d=0;if((f|0)>0){while(1){i=L[G[G[321988]+(e<<2)>>2]+(d<<3)>>3];G[a+112>>2]=e;G[a+116>>2]=d;L[a+120>>3]=i;b=a+1040|0;Eb(b,25515,a+112|0);c=Va(a+1296|0);b=Va(b);F:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break F}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+96>>2]=a+1040;_a(G[321986],70017,a+96|0);d=d+1|0;f=G[321985];if((d|0)<(f|0)){continue}break}}e=e+1|0;if((e|0)<(f|0)){continue}break}}G[a+80>>2]=f-1;b=a+1040|0;db(b,30250,a+80|0);c=Va(a+1296|0);b=Va(b);G:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break G}}cb(a+1296+(b+c)|0,32,80-b|0)}e=0;E[(a+c|0)+1376|0]=0;G[a+64>>2]=a+1040;_a(G[321986],70017,a- -64|0);f=G[321985];if((f|0)>0){while(1){d=0;if((f|0)>0){while(1){i=L[G[G[321990]+(e<<2)>>2]+(d<<3)>>3];G[a+48>>2]=e;G[a+52>>2]=d;L[a+56>>3]=i;b=a+1040|0;Eb(b,25496,a+48|0);c=Va(a+1296|0);b=Va(b);H:{if((b|0)>0){bb(c+(a+1296|0)|0,a+1040|0,b);if(b>>>0>79){break H}}cb(a+1296+(b+c)|0,32,80-b|0)}E[(a+c|0)+1376|0]=0;G[a+32>>2]=a+1040;_a(G[321986],70017,a+32|0);d=d+1|0;f=G[321985];if((d|0)<(f|0)){continue}break}}e=e+1|0;if((e|0)<(f|0)){continue}break}}G[a+1040>>2]=4476485;b=Va(a+1296|0);c=Va(a+1040|0);I:{if((c|0)>0){bb(b+(a+1296|0)|0,a+1040|0,c);if(c>>>0>79){break I}}cb(a+1296+(b+c)|0,32,80-c|0)}E[(a+b|0)+1376|0]=0;G[a+16>>2]=a+1040;_a(G[321986],70017,a+16|0);if(H[1287936]){yb(86205);h=Va(a+1296|0);f=0;while(1){d=0;cb(a+34064|0,0,80);g=M(f,80);while(1){J:{b=d+g|0;e=(b|0)>(h|0);if(e){break J}E[(a+34064|0)+d|0]=H[b+(a+1296|0)|0];c=d|1;b=c+g|0;e=(h|0)<(b|0);if(e){break J}E[c+(a+34064|0)|0]=H[(a+1296|0)+b|0];d=d+2|0;if((d|0)!=80){continue}}break}E[a+34144|0]=0;d=80;while(1){K:{b=(a+34064|0)+d|0;if((H[b|0]|32)!=32){break K}E[b|0]=0;b=(a+d|0)+34063|0;if((H[b|0]|32)!=32){break K}E[b|0]=0;c=d-2|0;b=c+(a+34064|0)|0;if((H[b|0]|32)!=32){break K}E[b|0]=0;d=d-3|0;if(c){continue}}break}f=f+1|0;if(H[a+34064|0]){G[a>>2]=f;G[a+4>>2]=a+34064;kb(69623,a)}if(!e){continue}break}id();$a(G[29763])}b=rd(a+1296|0);G[322064]=b;if(b){if(H[1287936]){yb(73585);$a(G[29763])}$a(G[321986]);Fa=a+34160|0;return}hb(84378,54,1,G[321435]);$a(G[321435]);Hb(G[321435]);sc(1);W()}function um(a,b,c){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;o=1;a:{b:{if(!Xa(a,34161)){yj(c);break b}if(!Xa(a,34157)){xj(c);break b}if(!Xa(a,34606)){E[c|0]=84;E[c+1|0]=65;E[c+2|0]=78;E[c+3|0]=0;G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;G[c+4>>2]=G[c+4>>2]<0?-103:103;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}G[c+1892>>2]=85;G[c+1888>>2]=86;a=99;c:{while(1){l=(a<<3)+c|0;if(L[l+280>>3]!=0|L[l+1080>>3]!=0){break c}j=a-1|0;if(L[((j<<3)+c|0)+280>>3]!=0){a=j;break c}if(L[l+1072>>3]!=0){a=j;break c}a=a-2|0;if(j){continue}break}a=-1}G[c+276>>2]=(a|0)>0?a:0;j=0;break a}if(!Xa(a,35072)){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=84;E[c+2|0]=71;E[c+3|0]=0;E[c+4|0]=104;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;d=L[c+24>>3];d:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=114.59155902616465;d=.008726646259971648;break d}e=d+d;d=1/e}G[c+1892>>2]=87;G[c+1888>>2]=88;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34543)){E[c|0]=83;E[c+1|0]=73;E[c+2|0]=78;E[c+3|0]=0;G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;G[c+4>>2]=G[c+4>>2]<0?-105:105;e=L[c+24>>3];if(e==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=57.29577951308232}G[c+1892>>2]=89;G[c+1888>>2]=90;L[c+112>>3]=1/e;d=L[c+40>>3];e=d*d;d=L[c+48>>3];d=e+d*d;L[c+120>>3]=d;L[c+136>>3]=d+-1;L[c+128>>3]=d+1;j=0;break a}if(!Xa(a,35873)){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=82;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=106;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;d=L[c+24>>3];e:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=1;d=1;break e}e=d*3.141592653589793/180;d=1/e}G[c+1892>>2]=91;G[c+1888>>2]=92;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34418)){wj(c);break b}if(!Xa(a,35981)){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=90;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=108;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;d=L[c+24>>3];f:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=114.59155902616465;d=.008726646259971648;break f}e=d+d;d=1/e}G[c+1892>>2]=93;G[c+1888>>2]=94;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,33992)){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=109;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;e=L[c+24>>3];if(e==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=57.29577951308232}g=e+e;L[c+112>>3]=g;d=L[c+40>>3];g:{h:{if(d==90){G[c+128>>2]=0;G[c+132>>2]=1072693248;G[c+120>>2]=0;G[c+124>>2]=-1075838976;e=1;break h}if(!(d>-90)){break g}f=Mb((90-d)*.5);d=f*f;d=oc(f)*d/(1-d);L[c+120>>3]=d;e=.5-d;L[c+128>>3]=e;g=L[c+112>>3]}G[c+1892>>2]=115;G[c+1888>>2]=116;L[c+160>>3]=57.29577951308232/e;L[c+152>>3]=e*1e-4;G[c+144>>2]=-350469331;G[c+148>>2]=1058682594;L[c+136>>3]=e*g}break b}if(!Xa(a,34172)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=89;E[c+2|0]=80;E[c+3|0]=0;E[c+4|0]=201;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;h=L[c+24>>3];i:{j:{if(h==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;d=L[c+48>>3];L[c+112>>3]=d;if(d==0){break i}L[c+120>>3]=1/d;e=(d+L[c+40>>3])*57.29577951308232;L[c+128>>3]=e;if(e!=0){break j}break i}d=L[c+48>>3];f=h*d*3.141592653589793/180;L[c+112>>3]=f;if(f==0){break i}L[c+120>>3]=1/f;e=h*(d+L[c+40>>3]);L[c+128>>3]=e;if(e==0){break i}}G[c+1892>>2]=117;G[c+1888>>2]=118;L[c+136>>3]=1/e}break b}if(!Xa(a,35985)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=202;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];k:{l:{if(f==0){G[c+112>>2]=0;G[c+116>>2]=1072693248;G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;d=L[c+40>>3];if(d<=0|d>1){break k}L[c+128>>3]=57.29577951308232/d;d=d/57.29577951308232;break l}L[c+120>>3]=57.29577951308232/f;L[c+112>>3]=f*3.141592653589793/180;d=L[c+40>>3];if(d<=0|d>1){break k}L[c+128>>3]=f/d;d=d/f}G[c+1892>>2]=119;G[c+1888>>2]=120;L[c+136>>3]=d}break b}if(!Xa(a,34150)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=203;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];m:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=1;d=1;break m}e=d*3.141592653589793/180;d=1/e}G[c+1892>>2]=95;G[c+1888>>2]=96;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34035)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=69;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=204;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];n:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=1;d=1;break n}e=d*3.141592653589793/180;d=1/e}G[c+1892>>2]=97;G[c+1888>>2]=98;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34777)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=70;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=45;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];o:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=1;d=1;break o}e=d*3.141592653589793/180;d=1/e}G[c+1892>>2]=99;G[c+1888>>2]=100;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34138)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=46;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];p:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=.005555555555555556;e=180;f=1;d=1;break p}e=d*3.141592653589793;g=1/e;f=e/180;d=1/f}G[c+1892>>2]=121;G[c+1888>>2]=122;L[c+112>>3]=f;L[c+136>>3]=g;L[c+128>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,34745)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=79;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=47;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;e=L[c+24>>3];if(e==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=57.29577951308232}G[c+1892>>2]=123;G[c+1888>>2]=124;G[c+144>>2]=1841940611;G[c+148>>2]=1071931184;L[c+136>>3]=90/e;d=e*1.4142135623730951;L[c+112>>3]=d;L[c+128>>3]=1/d;L[c+120>>3]=d/90;break b}if(!Xa(a,33400)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=84;E[c+3|0]=0;E[c+4|0]=145;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;e=L[c+24>>3];if(e==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=57.29577951308232}G[c+1892>>2]=125;G[c+1888>>2]=126;d=e+e;L[c+136>>3]=1/d;d=e*d;L[c+112>>3]=d;d=1/(d+d);L[c+120>>3]=d;L[c+128>>3]=d*.25;break b}if(!Xa(a,34213)){E[c|0]=67;E[c+1|0]=79;E[c+2|0]=80;E[c+3|0]=0;G[c+8>>2]=0;G[c+12>>2]=0;d=L[c+40>>3];L[c+16>>3]=d;G[c+4>>2]=G[c+4>>2]<0?-501:501;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}d=Kb(d);L[c+112>>3]=d;q:{if(d==0){break q}L[c+120>>3]=1/d;d=L[c+24>>3]*Mb(L[c+48>>3]);L[c+136>>3]=d;if(d==0){break q}L[c+144>>3]=1/d;d=Xe(L[c+40>>3]);G[c+1892>>2]=127;G[c+1888>>2]=128;d=1/d;L[c+152>>3]=d;L[c+128>>3]=d*L[c+136>>3]}break b}if(!Xa(a,35423)){vj(c);break b}if(!Xa(a,35777)){uj(c);break b}if(!Xa(a,34383)){tj(c);break b}if(!Xa(a,34532)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=66;E[c+1|0]=79;E[c+2|0]=78;E[c+3|0]=0;E[c+4|0]=89;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];r:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;d=Mb(L[c+40>>3])*57.29577951308232/Kb(L[c+40>>3])+L[c+40>>3];break r}L[c+120>>3]=d*3.141592653589793/180;d=d*(Mb(L[c+40>>3])/Kb(L[c+40>>3])+L[c+40>>3]*3.141592653589793/180)}G[c+1892>>2]=135;G[c+1888>>2]=136;L[c+128>>3]=d;break b}if(!Xa(a,34387)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=67;E[c+2|0]=79;E[c+3|0]=0;E[c+4|0]=90;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];s:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;d=114.59155902616465;break s}g=d*3.141592653589793/180;f=1/g;d=d+d}G[c+1892>>2]=137;G[c+1888>>2]=138;L[c+112>>3]=g;L[c+128>>3]=d;L[c+120>>3]=f;break b}if(!Xa(a,35861)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=84;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=189;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];t:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=45;d=.022222222222222223;break t}e=d*3.141592653589793*.25;d=1/e}G[c+1892>>2]=101;G[c+1888>>2]=102;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,35869)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=190;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];u:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=45;d=.022222222222222223;break u}e=d*3.141592653589793*.25;d=1/e}G[c+1892>>2]=103;G[c+1888>>2]=104;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,35865)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=81;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=191;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;d=L[c+24>>3];v:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;e=45;d=.022222222222222223;break v}e=d*3.141592653589793*.25;d=1/e}G[c+1892>>2]=105;G[c+1888>>2]=106;L[c+112>>3]=e;L[c+120>>3]=d;break b}if(!Xa(a,32859)){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=72;E[c+1|0]=80;E[c+2|0]=88;E[c+3|0]=0;E[c+4|0]=33;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;i=L[c+48>>3];w:{if(O(i)<2147483648){a=~~i;break w}a=-2147483648}G[c+272>>2]=(a|0)%2;d=L[c+24>>3];x:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;d=1;break x}f=57.29577951308232/d;d=d*3.141592653589793/180}L[c+112>>3]=d;G[c+1892>>2]=139;G[c+1888>>2]=140;L[c+120>>3]=f;f=i+-1;L[c+128>>3]=f/i;L[c+144>>3]=(i+1)*.5;k=L[c+40>>3];L[c+168>>3]=k/360;h=180/k;L[c+160>>3]=h;L[c+152>>3]=f*90/k;f=i*90/k;L[c+136>>3]=f;L[c+184>>3]=d*h;L[c+176>>3]=d*f;break b}if(!Xa(a,34928)){E[c|0]=88;E[c+1|0]=80;E[c+2|0]=72;E[c+3|0]=0;E[c+4|0]=34;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;d=L[c+24>>3];y:{if(d==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;d=1;break y}g=57.29577951308232/d;d=d*3.141592653589793/180}G[c+1892>>2]=141;G[c+1888>>2]=142;G[c+160>>2]=-1279502567;G[c+164>>2]=1066787723;G[c+152>>2]=1514773339;G[c+156>>2]=1079410611;G[c+144>>2]=1232524644;G[c+148>>2]=1078420498;G[c+136>>2]=-350469331;G[c+140>>2]=1058682594;G[c+128>>2]=1431655765;G[c+132>>2]=1071994197;L[c+120>>3]=g/1.4142135623730951;L[c+112>>3]=d/1.4142135623730951;break b}j=1;if(Xa(a,35970)){break a}G[c+1892>>2]=107;G[c+1888>>2]=108;E[c|0]=84;E[c+1|0]=79;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=35;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0}j=0}z:{if(j){break z}h=L[b+24>>3];d=L[c+16>>3];A:{if(d==90){if(h==999){G[b+24>>2]=0;G[b+28>>2]=1080459264}L[b+40>>3]=L[b+8>>3];e=L[b+16>>3];L[b+32>>3]=e;L[b+48>>3]=90-e;break A}f=L[b+16>>3];if(h==999){L[b+24>>3]=d>f?180:0}m=Mb(f);n=Kb(L[b+16>>3]);d=Mb(L[b+24>>3]);k=Kb(L[b+24>>3]);h=Mb(L[c+16>>3]);f=d*h;i=Kb(L[c+16>>3]);d=V(f*f+i*i);B:{if(d==0){if(n!=0){break z}e=L[b+32>>3];break B}d=n/d;if(O(d)>1){break z}f=Ac(i,f);d=Yg(d);e=f+d;C:{if(e>180){e=e+-360;break C}if(!(e<-180)){break C}e=e+360}g=f-d;D:{if(g>180){g=g+-360;break D}if(!(g<-180)){break D}g=g+360}d=L[b+32>>3];e=O(d-e)>3]=e}L[b+48>>3]=90-e;d=m*Mb(e);E:{F:{if(O(d)<1e-10){if(O(m)<1e-10){f=L[b+8>>3];L[b+40>>3]=f;L[b+48>>3]=90-L[c+16>>3];break E}if(e>0){G[b+48>>2]=0;G[b+52>>2]=0;L[b+40>>3]=L[b+8>>3]+L[b+24>>3]+-180;break F}if(!(e<0)){break F}G[b+48>>2]=0;G[b+52>>2]=1080459264;f=L[b+8>>3];L[b+40>>3]=f-L[b+24>>3];break E}f=(i-Kb(e)*n)/d;d=k*h/m;if(f==0&d==0){break z}p=b,q=L[b+8>>3]-Ac(d,f),L[p+40>>3]=q}f=L[b+8>>3]}d=L[b+40>>3];if(f>=0){if(!(d<0)){break A}L[b+40>>3]=d+360;break A}if(!(d>0)){break A}L[b+40>>3]=d+-360}L[b+56>>3]=L[b+24>>3];p=b- -64|0,q=Mb(L[b+48>>3]),L[p>>3]=q;d=Kb(L[b+48>>3]);G[b>>2]=137;L[b+72>>3]=d;o=(O(e)>90.0000000001)<<1}return o}function mk(a){var b=0,c=0,d=0,e=0,f=0,g=0;g=Fa-32|0;Fa=g;E[g|0]=0;d=qb(g,a,8);e=d+Va(d)|0;b=H[68293]|H[68294]<<8|(H[68295]<<16|H[68296]<<24);f=H[68289]|H[68290]<<8|(H[68291]<<16|H[68292]<<24);E[e|0]=f;E[e+1|0]=f>>>8;E[e+2|0]=f>>>16;E[e+3|0]=f>>>24;E[e+4|0]=b;E[e+5|0]=b>>>8;E[e+6|0]=b>>>16;E[e+7|0]=b>>>24;E[e+8|0]=H[68297];e=Va(d);if(e){while(1){f=c+d|0;b=E[f|0];E[f|0]=b-97>>>0<26?b&95:b;c=c+1|0;if((e|0)!=(c|0)){continue}break}}b=d+1|0;c=130;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{e=H[d|0];switch(e-32|0){case 52:break h;case 51:break i;case 50:break j;case 48:break k;case 46:break l;case 45:break m;case 44:break n;case 40:break o;case 39:break p;case 37:break q;case 36:break r;case 35:break s;case 34:break t;case 58:break u;case 0:break a;case 55:break f;case 56:break g;default:break e}}v:{w:{x:{a=H[b|0];switch(a-67|0){case 0:break w;case 6:break x;default:break v}}if(nb(b,67972,7)){break b}c=20;break a}if(nb(b,35409,7)){break b}c=20;break a}y:{z:{A:{B:{if((a|0)==78){if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1162690894){break B}c=20;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}c=0;C:{switch(a-66|0){case 20:if(nb(b,34815,3)){break b}c=20;if((H[d+4|0]-48&255)>>>0>=10){break b}break a;case 18:if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1162627412){break y}c=20;if((H[d+5|0]-48&255)>>>0>=10){break b}break a;case 24:break z;case 17:break A;case 0:break C;default:break c}}c=20;if(!nb(b,66555,7)){break a}if(!nb(b,67937,7)){break a}break d}if(nb(b,33788,5)){break d}c=20;a=H[d+6|0];if((a|0)==32){break a}if((a-48&255)>>>0>=10){break b}break a}c=20;if(!nb(b,67964,7)){break a}if(nb(b,66668,7)){break b}break a}if(nb(b,68017,7)){break b}c=20;break a}if(nb(b,34517,7)){break b}c=20;break a}D:{switch(H[b|0]-73|0){case 0:if(nb(b,67887,7)){break b}c=10;break a;case 3:if(!nb(b,66684,7)){c=10;break a}if(nb(b,68025,7)){break b}c=40;break a;case 10:if(nb(b,67964,7)){break b}c=30;break a;case 17:if(nb(b,68017,7)){break b}c=30;break a;case 12:break D;default:break b}}if(nb(b,68001,7)){break b}c=70;break a}E:{F:{G:{H:{I:{J:{K:{switch(H[b|0]-68|0){case 11:if(nb(b,33333,6)){break J}if(H[a|0]==67){c=10;if(!fb(a,40528,47)){break a}if(!fb(a,16350,47)){break a}if(!fb(a,40421,47)){break a}if(!fb(a,5281,47)){break a}if(!fb(a,17402,47)){break a}}c=H[d+7|0]==32?130:150;break a;case 0:break E;case 15:break F;case 14:break G;case 17:break H;case 16:break I;case 4:break K;default:break b}}if(nb(b,34624,7)){break b}c=100;break a}if(nb(b,35368,7)){break b}c=140;break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1162893652){break b}c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1414090325){break b}c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1279350354){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1481199698){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1096044370){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1380271186){break b}c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1380276563){break b}c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1414284612){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=65){break b}if(!nb(b,66628,7)){c=100;break a}c=60;if(!nb(b,66620,7)){break a}if(!nb(b,66563,7)){break a}if(nb(b,33924,7)){break b}c=120;break a}L:{M:{N:{O:{switch(H[b|0]-78|0){case 10:if(nb(b,67981,7)){break N}c=10;break a;case 2:break L;case 3:break M;case 0:break O;default:break b}}if(nb(b,68042,7)){break b}c=10;break a}if(!nb(b,66660,7)){c=90;if(H[a|0]!=69){break a}c=fb(a,65168,28)?90:20;break a}c=90;if(!nb(b,67929,7)){break a}if(nb(b,34796,7)){break b}break a}c=120;if(!nb(b,32864,6)){break a}if(nb(b,34881,3)|(H[d+4|0]-48&255)>>>0>=10){break b}break a}if(nb(b,68033,7)){break b}c=120;break a}P:{a=H[b|0]-67|0;if(a){if((a|0)==15){break P}else{break b}}if(nb(b,67905,7)){break b}c=10;break a}if(nb(b,67913,7)){break b}c=10;break a}Q:{switch(H[b|0]-68|0){case 0:c=90;if(!nb(b,66652,7)){break a}if(!nb(b,67921,7)){break a}if(nb(b,34787,7)){break b}break a;case 5:break Q;default:break b}}if(nb(b,32709,6)){break b}c=H[d+7|0]==32?130:150;break a}a=H[b|0]-65|0;if(a){if((a|0)!=14){break b}c=110;if(!nb(b,35546,6)){break a}if(nb(b,34217,3)|(H[d+4|0]-48&255)>>>0>=10){break b}break a}c=110;if(!nb(b,35538,6)){break a}if(nb(b,34183,3)|(H[d+4|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=74){break b}c=120;if(!nb(b,66612,7)){break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1112491082|(H[d+5|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=65|(H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1397315649){break b}c=10;a=H[d+5|0];if((a|0)==32){break a}if((a-48&255)>>>0>=10){break b}break a}R:{switch(H[b|0]-67|0){case 0:if(!nb(b,67905,7)){c=10;break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a;case 19:c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a;case 16:break R;default:break b}}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=65){break b}c=120;if(!nb(b,33585,7)){break a}if(!nb(b,33568,6)){break a}if(nb(b,35703,3)|(H[d+4|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=73){break b}if(nb(b,67956,7)){break b}c=10;break a}S:{T:{U:{V:{W:{X:{Y:{Z:{_:{$:{aa:{ba:{ca:{da:{ea:{fa:{ga:{switch(H[b|0]-66|0){case 18:if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1162893652){break b}c=10;if((H[d+5|0]-48&255)>>>0>=10){break b}break a;case 4:if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1297239878){break fa}c=10;if((H[d+5|0]-48&255)>>>0>=10){break b}break a;case 20:break T;case 14:break U;case 21:break W;case 1:break X;case 10:break Z;case 24:break _;case 17:break $;case 19:break ba;case 2:break ca;case 12:break da;case 6:break ea;case 0:break ga;default:break b}}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1280262978){break b}c=10;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(nb(b,66604,7)){break b}c=10;break a}if(nb(b,68009,7)){break b}c=10;break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1280070990){break b}c=40;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(nb(b,34662,3)){break aa}c=50;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1414090325){break b}c=70;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1347635524){break Y}c=80;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1279345491){break S}c=30;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1330791770){break b}c=30;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1313426764){c=60;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1480674636){break b}c=60;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1313426756){c=60;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))!=1480674628){break b}c=60;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1348031555){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,32700,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1229870403){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,34396,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1280725571){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,33155,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1481658947){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,34193,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1414484547){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1414284355){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,35699,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,35758,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(nb(b,32704,3)){break V}c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(nb(b,33911,3)){break b}c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}if(H[b|0]!=84){break b}if(nb(b,34517,7)){break b}c=10;break a}if(H[b|0]!=67){break b}c=110;if(!nb(b,33795,6)){break a}if(!nb(b,35489,6)){break a}if(!nb(b,33057,3)){if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(nb(b,34405,3)|(H[d+4|0]-48&255)>>>0>=10){break b}break a}if((e-48&255)>>>0>9){break b}ha:{ia:{ja:{ka:{a=H[b|0];switch(a-67|0){case 16:break ia;case 19:break ja;case 0:break ka;default:break ha}}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1348031555){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,32700,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1229870403){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,34396,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1280725571){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,33155,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1481658947){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,34193,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1414484547){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if((H[b|0]|H[b+1|0]<<8|(H[b+2|0]<<16|H[b+3|0]<<24))==1414284355){c=110;if((H[d+5|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,35699,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(!nb(b,35758,3)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if(nb(b,32704,3)){break b}c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}c=110;if((H[d+2|0]-48&255)>>>0>=10){break b}break a}if((a-48&255)>>>0>9){break b}b=H[d+2|0];a=H[d+3|0];if(!((b|0)!=80|(a|0)!=67)){c=110;if((H[d+4|0]-48&255)>>>0>=10){break b}break a}if((b|0)!=67|(a|0)!=68){break b}c=110;if((H[d+4|0]-48&255)>>>0<10){break a}break b}c=(a|0)!=78}la:{if((a|0)!=69){break la}if(nb(b,66676,7)){break la}c=20;break a}ma:{if(!c){break ma}if(nb(b,35828,7)){break ma}c=20;break a}na:{switch(a-68|0){case 12:if(nb(b,66571,7)){break b}c=20;break a;case 3:if(nb(b,66579,7)){break b}c=20;break a;case 13:if(nb(b,32674,7)){break b}c=20;break a;case 0:break na;default:break b}}if(nb(b,41551,7)){break b}c=20;break a}c=150}Fa=g+32|0;return c}function dh(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{b:{c:{d:{l=G[k>>2];if((l|0)<=0){if(c){E[c|0]=0}if(b){E[b|0]=0}if(d){E[d|0]=0}if(e){E[e|0]=0}if(g){E[g|0]=0}if(h){E[h|0]=0}if(f){E[f|0]=0}if(i){E[i|0]=0}if(j){E[j|0]=0}l=Va(a);if(l){u=l+1|0;p=lb(3,u);if(!p){G[k>>2]=113;return 113}e:{f:{g:{h:{if(H[a|0]!=45){break h}i:{j:{l=H[a+1|0];switch(l-32|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:break h;case 0:case 8:break i;default:break j}}if((l|0)==91){break i}if(l){break h}}o=a+1|0;if(!b){break f}n=Va(b)+b|0;m=H[42061]|H[42062]<<8|(H[42063]<<16|H[42064]<<24);l=H[42057]|H[42058]<<8|(H[42059]<<16|H[42060]<<24);E[n|0]=l;E[n+1|0]=l>>>8;E[n+2|0]=l>>>16;E[n+3|0]=l>>>24;E[n+4|0]=m;E[n+5|0]=m>>>8;E[n+6|0]=m>>>16;E[n+7|0]=m>>>24;E[n+8|0]=H[42065];break g}k:{if(!gc(a,15936,5)){if(b){n=Va(b)+b|0;m=H[42061]|H[42062]<<8|(H[42063]<<16|H[42064]<<24);l=H[42057]|H[42058]<<8|(H[42059]<<16|H[42060]<<24);E[n|0]=l;E[n+1|0]=l>>>8;E[n+2|0]=l>>>16;E[n+3|0]=l>>>24;E[n+4|0]=m;E[n+5|0]=m>>>8;E[n+6|0]=m>>>16;E[n+7|0]=m>>>24;E[n+8|0]=H[42065]}o=a+5|0;break k}m=Sb(a,42197);l=jb(a,40);if(!(!m|(l|0)!=0&l>>>0>>0)){l=m-a|0;if((l|0)>=17){Ua(43433);break a}if(b){qb(b,a,l+3|0)}o=m+3|0;break k}if(!fb(a,36983,4)){if(b){m=Va(b)+b|0;l=H[42036]|H[42037]<<8|(H[42038]<<16|H[42039]<<24);E[m|0]=l;E[m+1|0]=l>>>8;E[m+2|0]=l>>>16;E[m+3|0]=l>>>24;l=H[42039]|H[42040]<<8|(H[42041]<<16|H[42042]<<24);E[m+3|0]=l;E[m+4|0]=l>>>8;E[m+5|0]=l>>>16;E[m+6|0]=l>>>24}o=a+4|0;break k}if(!fb(a,36980,7)){if(b){n=Va(b)+b|0;m=H[42037]|H[42038]<<8|(H[42039]<<16|H[42040]<<24);l=H[42033]|H[42034]<<8|(H[42035]<<16|H[42036]<<24);E[n|0]=l;E[n+1|0]=l>>>8;E[n+2|0]=l>>>16;E[n+3|0]=l>>>24;E[n+4|0]=m;E[n+5|0]=m>>>8;E[n+6|0]=m>>>16;E[n+7|0]=m>>>24;l=H[42041]|H[42042]<<8;E[n+8|0]=l;E[n+9|0]=l>>>8}o=a+7|0;break k}if(!fb(a,36974,5)){if(b){l=Va(b)+b|0;E[l|0]=104;E[l+1|0]=116;E[l+2|0]=116;E[l+3|0]=112;E[l+4|0]=58;E[l+5|0]=47;E[l+6|0]=47;E[l+7|0]=0}o=a+5|0;break k}if(!fb(a,37360,4)){if(b){m=Va(b)+b|0;l=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);E[m|0]=l;E[m+1|0]=l>>>8;E[m+2|0]=l>>>16;E[m+3|0]=l>>>24;l=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[m+3|0]=l;E[m+4|0]=l>>>8;E[m+5|0]=l>>>16;E[m+6|0]=l>>>24}o=a+4|0;break k}if(!fb(a,37358,6)){if(b){n=Va(b)+b|0;m=H[42085]|H[42086]<<8|(H[42087]<<16|H[42088]<<24);l=H[42081]|H[42082]<<8|(H[42083]<<16|H[42084]<<24);E[n|0]=l;E[n+1|0]=l>>>8;E[n+2|0]=l>>>16;E[n+3|0]=l>>>24;E[n+4|0]=m;E[n+5|0]=m>>>8;E[n+6|0]=m>>>16;E[n+7|0]=m>>>24;E[n+8|0]=H[42089]}o=a+6|0;break k}if(!fb(a,38404,5)){if(b){l=Va(b)+b|0;E[l|0]=102;E[l+1|0]=105;E[l+2|0]=108;E[l+3|0]=101;E[l+4|0]=58;E[l+5|0]=47;E[l+6|0]=47;E[l+7|0]=0}o=a+5|0;break k}o=a;if(!b){break f}l=Va(b)+b|0;E[l|0]=102;E[l+1|0]=105;E[l+2|0]=108;E[l+3|0]=101;E[l+4|0]=58;E[l+5|0]=47;E[l+6|0]=47;E[l+7|0]=0;break g}if(!b){break f}}if(fb(b,42025,7)){break f}if(!jb(o,40)){if(!jb(o,91)){break f}}l=Va(o);m=l+o|0;while(1){m=m-1|0;n=H[m|0];if((n|0)==32){continue}break}if((n|0)==41|(n|0)==93){break f}if(!c){break e}if(l>>>0>=1025){Ua(43462);break a}Za(c,o);break e}if(H[o|0]==91){a=(H[a|0]!=45)+o|0}else{a=Sb(o,32652);a=a?a+2|0:o}m=jb(a,40);q=jb(a,91);l:{if(!m){m=0;break l}a=jb(m,41);if(!a){break l}while(1){l=H[a+1|0];a=a+1|0;if((l|0)==32){continue}if(!l|(l|0)==91){break l}m=jb(m+1|0,40);a=jb(a,41);if(!a){break l}if(m){continue}break}}m:{if((m|0)==(q|0)){Gb(p,o);break m}if(!(!m|m>>>0>=q>>>0?q:0)){l=qb(p,o,m-o|0);n=m+1|0;m=jb(n,41);if(!m){break b}if(d){a=m-n|0;if((a|0)>=1025){break b}qb(d,n,a)}q=jb(m,91);break m}qb(p,o,q-o|0)}a=Va(p);n:{if((a|0)<2){break n}while(1){l=a-1|0;m=l+p|0;if(H[m|0]!=32){break n}E[m|0]=0;m=a>>>0>2;a=l;if(m){continue}break}}o:{if(!d){break o}a=Va(d);if((a|0)<2){break o}while(1){l=a-1|0;m=l+d|0;if(H[m|0]!=32){break o}E[m|0]=0;m=a>>>0>2;a=l;if(m){continue}break}}a=Sb(p,17462);if(!(!a|!b|H[a+4|0])){a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[b+7|0]=a;E[b+8|0]=a>>>8;E[b+9|0]=a>>>16;E[b+10|0]=a>>>24;l=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);a=H[42090]|H[42091]<<8|(H[42092]<<16|H[42093]<<24);E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=a>>>16;E[b+3|0]=a>>>24;E[b+4|0]=l;E[b+5|0]=l>>>8;E[b+6|0]=l>>>16;E[b+7|0]=l>>>24}r=Va(p);m=r-1|0;o=1;p:{if((r|0)<=0){break p}a=m;while(1){t=a+p|0;if(H[t|0]!=43){l=(a|0)>0;a=a-1|0;if(l){continue}break p}break}if(!a){break p}n=r-a|0;if((n|0)>6){break p}q:{r:{l=a+1|0;a=l;if((r|0)<=(a|0)){break r}a=l;while(1){if(E[a+p|0]-48>>>0>9){break r}a=a+1|0;if((r|0)!=(a|0)){continue}break}break q}if((a|0)!=(r|0)){break p}}if(e){rb(e,l+p|0,n)}o=0;E[t|0]=0}if(!(!d|H[d|0]!=42|(r|0)<=0)){while(1){a=m;l=a+p|0;if(H[l|0]!=47){m=a-1|0;if(a){continue}}break}a=l+1|0;if(Va(a)>>>0>=1025){break c}Za(d,a)}if(c){if(Va(p)>>>0>=1025){break c}Za(c,p)}if(!q){break e}s:{if(!o){break s}l=q+1|0;s=jb(l,93);if(!s){Ua(65026);Wa(p);break a}t:{u:{switch(H[l|0]-66|0){case 0:case 2:case 4:case 7:case 8:case 16:case 19:case 32:case 34:case 36:case 39:case 40:case 48:case 51:break u;default:break t}}a=q+2|0;v:{w:{x:{d=H[q+2|0];switch(d-66|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break v;case 0:case 10:break w;default:break x}}switch(d-98|0){case 0:case 10:break w;default:break v}}a=q+3|0;d=H[q+3|0]}if((d<<24>>24)-48>>>0>=10){break t}while(1){d=E[a+1|0];a=a+1|0;if(d-48>>>0<10){continue}break}y:{z:{a=d&255;switch(a-44|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break t;case 0:case 14:break y;default:break z}}if((a|0)!=93){break t}}A:{if(!b){break A}if(Sb(b,15936)){a=H[42062]|H[42063]<<8|(H[42064]<<16|H[42065]<<24);E[b+8|0]=a;E[b+9|0]=a>>>8;E[b+10|0]=a>>>16;E[b+11|0]=a>>>24;d=H[42058]|H[42059]<<8|(H[42060]<<16|H[42061]<<24);a=H[42054]|H[42055]<<8|(H[42056]<<16|H[42057]<<24);E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=a>>>16;E[b+3|0]=a>>>24;E[b+4|0]=d;E[b+5|0]=d>>>8;E[b+6|0]=d>>>16;E[b+7|0]=d>>>24;break A}a=H[42118]|H[42119]<<8|(H[42120]<<16|H[42121]<<24);E[b+7|0]=a;E[b+8|0]=a>>>8;E[b+9|0]=a>>>16;E[b+10|0]=a>>>24;d=H[42115]|H[42116]<<8|(H[42117]<<16|H[42118]<<24);a=H[42111]|H[42112]<<8|(H[42113]<<16|H[42114]<<24);E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=a>>>16;E[b+3|0]=a>>>24;E[b+4|0]=d;E[b+5|0]=d>>>8;E[b+6|0]=d>>>16;E[b+7|0]=d>>>24}B:{if(!c){break B}if(Va(c)+Va(q)>>>0>=1025){break c}a=jb(Gb(c,q),93);if(!a){break B}E[a+1|0]=0}if(e){E[e|0]=48;E[e+1|0]=0}a=jb(s+1|0,91);if(!f|!a){break e}a=a+1|0;if(Va(f)+Va(a)>>>0>=1025){break c}a=jb(Gb(f,a),93);if(!a){break e}E[a|0]=0;break e}m=l;while(1){a=m;m=a+1|0;d=H[a|0];if((d|0)==32){continue}break}if((d<<24>>24)-48>>>0<=9){while(1){d=E[a+1|0];a=a+1|0;if(d-48>>>0<10){continue}break}}b=l;a=(d&255)-42|0;if(1<>>0<=16:0){break s}while(1){a=b;b=a+1|0;w=H[a|0];if((w|0)==32){continue}break}y=gc(a,66349,4);r=gc(a,15943,3);x=gc(a,3751,3);C:{if(gc(a,66032,9)){n=0;if(gc(a,31920,9)){break C}}n=1}if(!gc(a,64290,10)){break s}if(!gc(a,64301,10)){break s}v=s-l|0;D:{if((v|0)<0){d=0;c=0;break D}t=s-q|0;m=0;c=0;E:{while(1){b=1;d=0;F:{G:{H:{I:{J:{o=H[a|0];switch(o-32|0){case 92:break J;case 12:case 27:case 61:break D;case 0:break E;case 14:break F;case 28:case 29:case 30:break H;case 6:break I;default:break G}}if(H[a+1|0]==124){break H}break G}if(H[a+1|0]!=38){break G}}z=1}b=c}a=a+1|0;c=b;m=m+1|0;if((t|0)!=(m|0)){continue}break}break D}while(1){b=o&255;if((b|0)==32){o=H[a+1|0];a=a+1|0;continue}break}if((b|0)==93){break D}if(!y|(!r|!x)&m>>>0<=4){break s}K:{switch((o&255)-33|0){case 0:case 4:case 5:case 9:case 10:case 12:case 14:case 27:case 28:case 29:case 91:d=1;break;default:break K}}A=1;if(!x){break s}}if(d&A|((w|0)==64&(c|0)!=0|z|n)){break s}if(e){if((v|0)>=1025){break c}qb(e,l,v)}q=s+1|0}d=p+u|0;l=Gb(d,q);a=Va(l);L:{if((a|0)<=0){break L}while(1){b=a-1|0;c=b+l|0;if(H[c|0]!=32){break L}E[c|0]=0;c=a>>>0>1;a=b;if(c){continue}break}}if(!H[l|0]){break e}m=d+u|0;a=Sb(l,15942);M:{N:{if(a){break N}a=Sb(l,34574);if(a){break N}a=Sb(l,15947);if(!a){break M}}d=H[a+4|0];b=d-98|0;if(!(b>>>0>16|!(1<>>0>=1025){break c}b=jb(Za(g,b),93);if(!b){break d}E[b|0]=0;b=b-1|0;if(H[b|0]!=32){break O}E[b|0]=0}Za(a,Za(m,jb(a,93)+1|0))}P:{g=Sb(l,66348);Q:{if(g){break Q}g=Sb(l,66636);if(g){break Q}g=Sb(l,66354);if(!g){break P}}c=0;R:while(1){e=g+5|0;a=e;while(1){d=H[a|0];if((d|0)==32){a=a+1|0;continue}break}c=(d|0)!=64?c:1;while(1){S:{T:{b=d&255;U:{if((b|0)!=39){if((b|0)==93){break T}if(b){break U}Ua(65026);Wa(p);break a}a=jb(a+1|0,39);if(!a){Ua(20291);Wa(p);break a}d=H[a|0]}if((d&255)!=91){d=a;break S}d=jb(a+1|0,93);if(d){break S}Ua(5174);Wa(p);break a}V:{if(!h){break V}d=(g^-1)+a|0;if(Va(h)+d>>>0>=1025){break c}W:{if(!H[h|0]){B=rb(h,g+1|0,d)+d|0,C=0,E[B|0]=C;break W}b=Va(h)+h|0;E[b|0]=59;E[b+1|0]=0;qb(h,e,d-4|0);if(!c){break W}Ua(4201);Wa(p);break a}d=Va(h)-1|0;b=h+d|0;if(H[b|0]!=32){break V}while(1){E[b|0]=0;d=d-1|0;b=h+d|0;if(H[b|0]==32){continue}break}}Za(g,Za(m,a+1|0));g=Sb(l,66348);X:{if(g){break X}g=Sb(l,66636);if(g){break X}g=Sb(l,66354)}if(g){continue R}break P}a=d+1|0;d=H[d+1|0];continue}}}Y:{g=Sb(l,3750);Z:{if(g){break Z}g=Sb(l,32871);if(g){break Z}g=Sb(l,3774);if(!g){break Y}}d=4;_:{$:{b=H[g+4|0];switch(b-66|0){case 0:case 2:case 7:case 8:case 16:case 32:case 34:case 39:case 40:case 48:break $;default:break _}}b=H[g+5|0];d=5}a=32;d=(d+g|0)+((b&255)==49)|0;if(H[d|0]!=32){break Y}while(1){aa:{ba:{ca:{b=a&255;da:{if((b|0)!=39){if((b|0)==93){break ca}if(b){break da}Ua(65026);Wa(p);break a}d=jb(d+1|0,39);if(!d){break ba}a=H[d|0]}if((a&255)!=91){a=d;break aa}a=jb(d+1|0,93);if(a){break aa}Ua(5174);Wa(p);break a}ea:{if(!i){break ea}a=(g^-1)+d|0;if((a|0)>=1025){break c}c=rb(i,g+1|0,a);E[c+a|0]=0;a=a-1|0;b=c+a|0;if(H[b|0]!=32){break ea}while(1){E[b|0]=0;a=a-1|0;b=c+a|0;if(H[b|0]==32){continue}break}}Za(g,Za(m,d+1|0));break Y}Ua(20291);Wa(p);break a}d=a+1|0;a=H[a+1|0];continue}}b=Sb(l,5790);fa:{if(!b){break fa}a=H[b+9|0];if((a|0)!=93&(a|0)!=32){break fa}ga:{if(!j){break ga}a=b+1|0;if(Va(a)>>>0>=1025){break c}a=jb(Za(j,a),93);if(!a){break d}E[a|0]=0;a=a-1|0;if(H[a|0]!=32){break ga}E[a|0]=0}Za(b,Za(m,jb(b,93)+1|0))}if(!f){break e}a=H[l|0];if(!a){break e}ha:{if((a|0)!=91){break ha}e=0;a=l;ia:while(1){ja:{g=Sb(l,32631);d=g-a|0;if((d|0)<3){break ja}c=a+1|0;a=c;while(1){b=H[a|0];if((b|0)!=32){if((Va(f)+d|0)-1019>>>0<=4294966270){break c}e=(b|0)!=64?e:1;if(!(!H[f|0]|!e)){Ua(4146);Wa(p);break a}b=Va(f)+f|0;a=H[64752]|H[64753]<<8;E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=H[64754];a=qb(f,c,d-1|0);b=Va(a)+a|0;a=H[65324]|H[65325]<<8|(H[65326]<<16|H[65327]<<24);E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=a>>>16;E[b+3|0]=a>>>24;E[b+4|0]=H[65328];a=g+1|0;if(H[g+1|0]==91){continue ia}break ha}else{a=a+1|0;continue}}}break}c=(Va(l)+l|0)-1|0;if(H[c|0]!=93){break ha}g=a+1|0;d=g;while(1){b=H[d|0];if((b|0)!=32){c=c-a|0;d=E[f|0];if((((c|0)!=(0-d|0))<<2)+Va(f)>>>0>=1025){break c}if(!(!d|!((b|0)!=64?e:1))){Ua(4146);Wa(p);break a}if(d){b=Va(f)+f|0;a=H[64752]|H[64753]<<8;E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=H[64754];a=qb(f,g,c-1|0);b=Va(a)+a|0;a=H[63668]|H[63669]<<8;E[b|0]=a;E[b+1|0]=a>>>8;E[b+2|0]=H[63670];break e}qb(f,g,c-1|0);break e}else{d=d+1|0;continue}}}Ua(14908);G[k>>2]=125}Wa(p)}l=G[k>>2]}return l}Ua(65026);Ua(l);Wa(p);break a}Wa(p);break a}Wa(l)}G[k>>2]=125;return 125}function Ps(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|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;i=Fa-256|0;Fa=i;G[i+168>>2]=0;if(G[309801]){G[i+160>>2]=e;G[i+156>>2]=d;G[i+152>>2]=c;G[i+148>>2]=b;G[i+144>>2]=a;kb(87765,i+144|0)}l=e-1|0;a:{b:{if((b+1|0)!=(c|0)){g=G[309810];break b}G[309810]=g;G[g+16>>2]=0;b=G[g+12>>2];b=(b|0)>0?(a|0)>(b|0)?b:a:(b|0)<0?a:d;G[g+12>>2]=b;G[309805]=(b+c|0)-1;b=G[g+4>>2];c:{if(!b){b=M(l,244)+f|0;if(!G[b+84>>2]){Ua(65613);c=434;break a}G[309803]=G[b+88>>2];G[g>>2]=G[b+80>>2];G[309808]=0;G[309809]=0;G[i+172>>2]=0;d:{e:{if(!G[309736]){b=G[G[309731]+24>>2];if(!b){break d}k=b>>31;break e}b=M(l,244)+f|0;j=G[b>>2];o=G[b+4>>2];g=0;h=Fa-352|0;Fa=h;k=i+172|0;f:{if(G[k>>2]>0){break f}G[i+164>>2]=0;E[h+256|0]=0;u=qb(h+256|0,34755,74);p=Va(u);if(p){if((p|0)>0){while(1){n=g+u|0;b=E[n|0];E[n|0]=b-97>>>0<26?b&95:b;g=g+1|0;if((p|0)!=(g|0)){continue}break}}g:{if(G[k>>2]>0){g=G[j+4>>2];b=G[g+76>>2];break g}b=G[j>>2];g=G[j+4>>2];if((b|0)!=G[g+76>>2]){mb(j,b+1|0,0,k);g=G[j+4>>2];b=G[g+76>>2]}q=G[g+104>>2];n=G[g+96>>2]+(b<<3)|0;s=G[n>>2];q=Bu(q-s|0,G[g+108>>2]-(G[n+4>>2]+(q>>>0>>0)|0)|0,80,0)}n=G[j>>2];if((n|0)!=(b|0)){mb(j,n+1|0,0,k);g=G[j+4>>2];b=G[g+76>>2]}b=G[g+96>>2]+(b<<3)|0;n=G[b>>2]+160|0;b=G[b+4>>2];G[g+120>>2]=n;G[g+124>>2]=n>>>0<160?b+1|0:b;h:{i:{if((q|0)>=3){s=o+1|0;n=p+(h+160|0)|0;b=3;while(1){if((Jg(j,h+160|0,k)|0)>0){break f}g=b;j:{if(fb(u,h+160|0,p)){break j}E[h+248|0]=0;b=jb(h+160|0,61);if(!b){break j}b=b-n|0;v=207;if((b|0)>=8){break h}b=qb(h+248|0,n,b);G[h+348>>2]=0;if((ue(b,h+344|0,h+348|0)|0)>0){break j}b=G[h+344>>2];if((b|0)>=(s|0)|(b|0)<(o|0)){break j}b=h+80|0;mc(h+160|0,b,h,k);Ie(b,(G[h+344>>2]-o<<3)+1239232|0,k);b=G[h+344>>2]-o|0;if((b|0)>=G[i+164>>2]){G[i+164>>2]=b+1}if(G[k>>2]!=204){break j}G[k>>2]=0;w=1}b=g+1|0;if((g|0)!=(q|0)){continue}break}if(w){break i}}break f}if(G[k>>2]>0){break f}v=204}G[k>>2]=v}}Fa=h+352|0;g=G[309810];if(G[i+172>>2]!=403){break d}b=-32768;k=-1;k:{switch(G[g>>2]-21|0){case 10:case 20:break k;case 0:break e;default:break d}}b=-2147483648}G[309808]=b;G[309809]=k}b=(M(l,244)+f|0)+92|0;break c}G[309802]=b;b=G[g+8>>2];G[309803]=b?b:1239248;b=(G[309722]+M(G[309725],344)|0)+56|0}G[309806]=G[b>>2];b=1;l:{m:{n:{switch(G[g>>2]-1|0){case 20:b=2;break m;case 80:case 81:b=8;break m;case 0:case 10:case 13:break m;case 15:case 30:case 40:case 41:break n;default:break l}}b=4}G[309804]=b}o:{switch(G[(G[309722]+M(G[309725],344)|0)+52>>2]-258|0){case 0:G[309807]=1;break b;case 1:G[309807]=4;break b;case 2:break o;default:break b}}G[309807]=8}p:{if(G[g+4>>2]){break p}G[309802]=G[(M(l,244)+f|0)+88>>2]+G[309804];q:{switch(G[g>>2]-11|0){case 3:E[G[309803]]=85;break p;case 0:E[G[309803]]=G[309808];break p;case 10:F[G[309803]>>1]=G[309808];break p;case 20:G[G[309803]>>2]=G[309808];break p;case 30:G[G[309803]>>2]=G[309808];break p;case 70:g=G[309809];b=G[309803];G[b>>2]=G[309808];G[b+4>>2]=g;break p;case 31:G[G[309803]>>2]=-2059275978;break p;case 71:b=G[309803];G[b>>2]=1589294263;G[b+4>>2]=-1196933592;break p;case 5:break q;default:break p}}b=G[309803];E[G[b>>2]]=1;E[G[b>>2]+1|0]=0}G[309732]=c;b=G[309805]-c|0;k=(b|0)<(d|0)?b+1|0:d;G[309733]=k;r:{if((e|0)<=0){break r}u=k<<2;s:{t:{u:{while(1){v:{o=M(m,244)+f|0;if(G[o+84>>2]!=2){d=G[309730];j=d+M(m,124)|0;h=G[j+88>>2];b=M(h,k);w:{x:{y:{z:{A:{B:{C:{g=G[j+84>>2];switch(g-258|0){case 2:break y;case 1:break z;case 0:break A;case 3:break B;case 4:break C;default:break x}}b=G[j+120>>2];D:{if(!b){break D}g=G[b>>2];if(g){Wa(g);break D}G[i+132>>2]=1386;G[i+128>>2]=30721;kb(74561,i+128|0)}Wa(b);l=ab(u);if(!l){break u}q=h+1|0;b=ab(M(q,k));G[l>>2]=b;if(!b){break v}if((k|0)>0){n=(h+7|0)/8|0;p=0;while(1){b=l+(p<<2)|0;g=G[l>>2]+M(p,q)|0;G[b>>2]=g;if((h|0)>0){d=M(n,p)+1|0;g=0;while(1){s=g&7;E[G[b>>2]+g|0]=H[G[o+88>>2]+d|0]>>>(s^7)&1?49:48;d=((s|0)==7)+d|0;g=g+1|0;if((h|0)!=(g|0)){continue}break}g=G[b>>2];b=h}else{b=0}E[b+g|0]=0;p=p+1|0;if((p|0)!=(k|0)){continue}break}}G[j+116>>2]=l;G[j+120>>2]=l;break w}g=G[o+88>>2];b=G[j+116>>2];if(b){Wa(b)}b=ab(k);G[j+116>>2]=b;if(!b){break t}d=k;if(d){while(1){b=d-1|0;h=G[g>>2];l=H[h|0];if(l){d=G[g+(d<<2)>>2];if((l|0)==H[d|0]){d=Xa(h,d)}else{d=-1}}else{d=1}E[b+G[j+116>>2]|0]=!d;d=b;if(b){continue}break}}G[j+120>>2]=g+4;break w}d=G[o+88>>2];g=G[j+116>>2];if(g){Wa(g)}g=ab(b);G[j+116>>2]=g;if(!g){break t}E:{if(!b){break E}g=b;if(b&1){g=b-1|0;l=g+G[j+116>>2]|0;h=H[d|0];if(h){h=(h|0)==H[b+d|0]}else{h=0}E[l|0]=h}if((b|0)==1){break E}while(1){b=0;h=H[d|0];if(h){b=(h|0)==H[d+g|0]}h=g-1|0;E[h+G[j+116>>2]|0]=b;g=g-2|0;l=g+G[j+116>>2]|0;b=H[d|0];if(b){b=(b|0)==H[d+h|0]}else{b=0}E[l|0]=b;if(g){continue}break}}G[j+120>>2]=d+1;break w}d=G[o+88>>2];g=G[j+116>>2];if(g){Wa(g)}g=ab(b);G[j+116>>2]=g;if(!g){break t}F:{if(!b){break F}g=b;if(b&1){g=b-1|0;l=g+G[j+116>>2]|0;h=G[d>>2];if(h){h=(h|0)==G[d+(b<<2)>>2]}else{h=0}E[l|0]=h}if((b|0)==1){break F}while(1){b=0;h=G[d>>2];if(h){b=(h|0)==G[d+(g<<2)>>2]}h=g-1|0;E[h+G[j+116>>2]|0]=b;g=g-2|0;l=g+G[j+116>>2]|0;b=G[d>>2];if(b){b=(b|0)==G[d+(h<<2)>>2]}else{b=0}E[l|0]=b;if(g){continue}break}}G[j+120>>2]=d+4;break w}d=G[o+88>>2];g=G[j+116>>2];if(g){Wa(g)}g=ab(b);G[j+116>>2]=g;if(!g){break t}G:{if(!b){break G}g=b;if(b&1){g=b-1|0;l=g+G[j+116>>2]|0;r=L[d>>3];if(r==0){h=0}else{h=r==L[d+(b<<3)>>3]}E[l|0]=h}if((b|0)==1){break G}while(1){h=g-1|0;l=h+G[j+116>>2]|0;r=L[d>>3];if(r!=0){b=r==L[d+(g<<3)>>3]}else{b=0}E[l|0]=b;g=g-2|0;l=g+G[j+116>>2]|0;r=L[d>>3];if(r!=0){b=r==L[d+(h<<3)>>3]}else{b=0}E[l|0]=b;if(g){continue}break}}G[j+120>>2]=d+8;break w}G[i+112>>2]=g;b=i+176|0;Ya(b,80,75041,i+112|0);Ua(b)}if(G[309737]){break s}}m=m+1|0;if((m|0)!=(e|0)){continue}break r}break}Wa(l)}G[(d+M(m,124)|0)+116>>2]=0;G[j+120>>2]=0}G[309737]=113}if(!m){break r}while(1){m=m-1|0;b=G[309730]+M(m,124)|0;H:{if(G[b+84>>2]!=262){break H}d=G[G[b+120>>2]>>2];if(d){Wa(d);break H}G[i+100>>2]=1492;G[i+96>>2]=30721;kb(74649,i+96|0)}d=G[b+116>>2];I:{if(d){Wa(d);break I}G[i+84>>2]=1493;G[i+80>>2]=30721;kb(74444,i+80|0)}G[b+116>>2]=0;if(m){continue}break}}J:{K:{if(!k){break K}while(1){L:{j=(k|0)<2500?k:2500;pn(c,j);if(G[309737]){break L}h=G[309722]+M(G[309725],344)|0;t=G[h>>2]==-1e3?1:t;M:{N:{O:{switch(G[h+52>>2]-258|0){case 0:case 1:case 2:P:{if(t){E[i+176|0]=0;if((k|0)<=0){break P}b=(j|0)>1?j:1;f=h+88|0;d=G[309806];e=0;while(1){G[i+164>>2]=0;g=0;if((d|0)>0){while(1){li(G[309735],f,i+176|0,G[h+56>>2],G[G[309810]>>2],G[309803],G[309802]+M(G[309804],M(d,e)+g|0)|0,i+168|0);g=G[i+164>>2]+1|0;G[i+164>>2]=g;d=G[309806];if((g|0)<(d|0)){continue}break}}e=e+1|0;if((b|0)!=(e|0)){continue}break}break P}e=G[309806];b=G[h+56>>2];Q:{if((e|0)==(b|0)){li(G[309735],G[h+88>>2],G[h+84>>2],M(e,j),G[G[309810]>>2],G[309803],G[309802],i+168|0);break Q}if((b|0)==1){if((k|0)<=0){break Q}b=(j|0)>1?j:1;g=0;while(1){G[i+164>>2]=0;d=0;if((e|0)>0){while(1){li(G[309735],G[h+88>>2]+M(G[309807],g)|0,G[h+84>>2]+g|0,1,G[G[309810]>>2],G[309803],G[309802]+M(G[309804],M(e,g)+d|0)|0,i+168|0);d=G[i+164>>2]+1|0;G[i+164>>2]=d;e=G[309806];if((e|0)>(d|0)){continue}break}}g=g+1|0;if((b|0)!=(g|0)){continue}break}break Q}if((k|0)<=0){break Q}b=(b|0)>(e|0)?e:b;d=(j|0)>1?j:1;g=0;while(1){f=M(G[h+56>>2],g);li(G[309735],G[h+88>>2]+M(f,G[309807])|0,f+G[h+84>>2]|0,b,G[G[309810]>>2],G[309803],G[309802]+M(G[309804],M(e,g))|0,i+168|0);e=G[309806];if((b|0)<(e|0)){f=G[309804];cb(G[309802]+M(f,b+M(e,g)|0)|0,0,M(f,e-b|0))}g=g+1|0;if((d|0)!=(g|0)){continue}break}}if(G[h>>2]<=0){break P}b=G[h+88>>2];if(b){Wa(b);break P}G[i+4>>2]=1214;G[i>>2]=30721;kb(74324,i)}g=G[309737];if((g|0)!=-11){break M}G[309737]=412;Ua(20787);break N;case 4:R:{S:{switch(G[G[309810]>>2]-1|0){case 10:if((k|0)<=0){break R}f=(j|0)>1?j:1;e=h+88|0;m=0;b=G[309802];d=-1;while(1){G[i+164>>2]=0;T:{if(G[h+56>>2]<=0){break T}g=0;if(!t){while(1){if(!(g&7)){d=d+1|0;E[b+d|0]=0;g=G[i+164>>2]}if(H[G[G[e>>2]+(m<<2)>>2]+g|0]==49){l=b+d|0;E[l|0]=H[l|0]|128>>>(g&7);g=G[i+164>>2]}g=g+1|0;G[i+164>>2]=g;if(G[h+56>>2]>(g|0)){continue}break T}}while(1){if(!(g&7)){d=d+1|0;E[b+d|0]=0;g=G[i+164>>2]}if(H[e+g|0]==49){l=b+d|0;E[l|0]=H[l|0]|128>>>(g&7);g=G[i+164>>2]}g=g+1|0;G[i+164>>2]=g;if(G[h+56>>2]>(g|0)){continue}break}}m=m+1|0;if((f|0)!=(m|0)){continue}break};break R;case 0:case 13:if(t){if((k|0)<=0){break R}b=(j|0)>1?j:1;f=h+88|0;m=G[309802];e=0;while(1){G[i+164>>2]=0;g=0;d=G[h+56>>2];if((d|0)>0){while(1){E[m+(M(d,e)+g|0)|0]=H[f+g|0]==49;g=G[i+164>>2]+1|0;G[i+164>>2]=g;d=G[h+56>>2];if((g|0)<(d|0)){continue}break}}e=e+1|0;if((b|0)!=(e|0)){continue}break}break R}if((k|0)<=0){break R}b=(j|0)>1?j:1;f=G[309802];d=0;while(1){G[i+164>>2]=0;g=0;e=G[h+56>>2];if((e|0)>0){while(1){E[f+(M(d,e)+g|0)|0]=H[G[G[h+88>>2]+(d<<2)>>2]+g|0]==49;g=G[i+164>>2]+1|0;G[i+164>>2]=g;e=G[h+56>>2];if((g|0)<(e|0)){continue}break}}d=d+1|0;if((b|0)!=(d|0)){continue}break};break R;case 15:G[i+164>>2]=0;if(t){if((k|0)<=0){break R}b=h+88|0;g=0;d=G[309802];while(1){Za(G[d+(g<<2)>>2],b);g=G[i+164>>2]+1|0;G[i+164>>2]=g;if((g|0)<(j|0)){continue}break}break R}if((k|0)<=0){break R}g=0;b=G[309802];while(1){d=g<<2;Za(G[d+b>>2],G[d+G[h+88>>2]>>2]);g=G[i+164>>2]+1|0;G[i+164>>2]=g;if((g|0)<(j|0)){continue}break};break R;default:break S}}Ua(43732);G[309737]=432}if(G[h>>2]<=0){break N}b=G[G[h+88>>2]>>2];U:{if(b){Wa(b);break U}G[i+36>>2]=1274;G[i+32>>2]=30721;kb(74596,i+32|0)}b=G[h+88>>2];if(b){Wa(b);break N}G[i+20>>2]=1275;G[i+16>>2]=30721;kb(74274,i+16|0);break N;case 3:break O;default:break N}}V:{if(G[G[309810]>>2]==16){if(t){G[i+164>>2]=0;if((k|0)<=0){break V}b=h+88|0;g=0;d=G[309802];while(1){Za(G[d+(g<<2)>>2],b);g=G[i+164>>2]+1|0;G[i+164>>2]=g;if((g|0)<(j|0)){continue}break}break V}G[i+164>>2]=0;b=G[i+168>>2];W:{if((k|0)<=0){d=b;break W}g=0;f=G[309803];m=G[309802];while(1){l=g<<2;o=G[l+m>>2];d=1;e=f;if(!H[G[h+84>>2]+g|0]){e=l+G[h+88>>2]|0;d=b}Za(o,G[e>>2]);g=G[i+164>>2]+1|0;G[i+164>>2]=g;b=d;if((g|0)<(j|0)){continue}break}}G[i+168>>2]=d;break V}Ua(43779);G[309737]=432}if(G[h>>2]<=0){break N}b=G[G[h+88>>2]>>2];X:{if(b){Wa(b);break X}G[i+68>>2]=1300;G[i+64>>2]=30721;kb(74596,i- -64|0)}b=G[h+88>>2];if(b){Wa(b);break N}G[i+52>>2]=1301;G[i+48>>2]=30721;kb(74274,i+48|0)}g=G[309737]}c=c+j|0;if(g){break L}k=k-j|0;Y:{Z:{_:{switch(G[h+52>>2]-261|0){case 1:if(G[G[309810]>>2]!=11){break Z}b=G[309802]+M(M(j,G[309804]),(G[h+56>>2]+7|0)/8|0)|0;break Y;case 0:break _;default:break Z}}b=G[309802]+M(j,G[309804])|0;break Y}b=G[309802]+M(G[309806],M(j,G[309804]))|0}G[309802]=b;if(k){continue}}break}if(!G[i+168>>2]){break K}b=G[309810];G[b+16>>2]=1;break J}b=G[309810];if(G[b+4>>2]){break J}d=G[309803];if(G[b>>2]==16){d=G[d>>2];e=I[619624];E[d|0]=e;E[d+1|0]=e>>>8;break J}bb(d,1239248,G[309804])}$:{if(!G[309736]){g=G[309737];break $}g=G[309737];if(g|G[309805]!=(c-1|0)){break $}g=0;c=-1;if(G[b+12>>2]<(a|0)){break a}}c=g}Fa=i+256|0;return c|0}function Qc(a,b,c){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;y=Fa-16|0;Fa=y;G[y+12>>2]=c;d=Fa-144|0;Fa=d;e=cb(d,0,144);G[e+76>>2]=-1;G[e+44>>2]=a;G[e+32>>2]=4;G[e+84>>2]=a;d=b;v=c;a=0;j=Fa-304|0;Fa=j;a:{b:{c:{d:{if(G[e+4>>2]){break d}si(e);if(G[e+4>>2]){break d}break c}b=H[d|0];if(!b){break a}e:{f:{g:{h:{while(1){i:{b=b&255;j:{if((b|0)==32|b-9>>>0<5){while(1){b=d;d=d+1|0;c=H[b+1|0];if((c|0)==32|c-9>>>0<5){continue}break}te(e,0,0);while(1){c=G[e+4>>2];k:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;c=H[c|0];break k}c=jc(e)}if((c|0)==32|c-9>>>0<5){continue}break}d=G[e+4>>2];c=G[e+116>>2];if((c|0)>0|(c|0)>=0){d=d-1|0;G[e+4>>2]=d}c=d-G[e+44>>2]|0;d=c>>31;g=c;h=p+G[e+124>>2]|0;c=r+G[e+120>>2]|0;h=c>>>0>>0?h+1|0:h;f=c;c=g+c|0;h=d+h|0;r=c;p=c>>>0>>0?h+1|0:h;break j}l:{m:{n:{if(H[d|0]==37){b=H[d+1|0];if((b|0)==42){break n}if((b|0)!=37){break m}}te(e,0,0);o:{if(H[d|0]==37){while(1){b=G[e+4>>2];p:{if((b|0)!=G[e+104>>2]){G[e+4>>2]=b+1;b=H[b|0];break p}b=jc(e)}if((b|0)==32|b-9>>>0<5){continue}break}d=d+1|0;break o}b=G[e+4>>2];if((b|0)!=G[e+104>>2]){G[e+4>>2]=b+1;b=H[b|0];break o}b=jc(e)}if(H[d|0]!=(b|0)){c=G[e+116>>2];if((c|0)>0|(c|0)>=0){G[e+4>>2]=G[e+4>>2]-1}if((b|0)>=0){break a}g=0;if(w){break a}break c}b=G[e+4>>2]-G[e+44>>2]|0;f=b>>31;g=b;b=p+G[e+124>>2]|0;c=r+G[e+120>>2]|0;b=c>>>0>>0?b+1|0:b;h=c;c=g+c|0;g=b+f|0;r=c;p=c>>>0>>0?g+1|0:g;b=d;break j}l=0;b=d+2|0;break l}if(!(H[d+2|0]!=36|b-48>>>0>=10)){b=H[d+1|0]-48|0;c=Fa-16|0;G[c+12>>2]=v;b=(b>>>0>1?(b<<2)-4|0:0)+v|0;G[c+8>>2]=b+4;l=G[b>>2];b=d+3|0;break l}l=G[v>>2];v=v+4|0;b=d+1|0}m=0;d=0;if(H[b|0]-48>>>0<10){while(1){d=(H[b|0]+M(d,10)|0)-48|0;c=H[b+1|0];b=b+1|0;if(c-48>>>0<10){continue}break}}o=H[b|0];if((o|0)==109){n=0;m=(l|0)!=0;o=H[b+1|0];a=0;b=b+1|0}c=b;b=c+1|0;f=3;g=m;q:{r:{switch(o-65|0){case 39:f=c+2|0;c=H[c+1|0]==104;b=c?f:b;f=c?-2:-1;break q;case 43:f=c+2|0;c=H[c+1|0]==108;b=c?f:b;f=c?3:1;break q;case 51:case 57:f=1;break q;case 11:f=2;break q;case 41:break q;case 0:case 2:case 4:case 5:case 6:case 18:case 23:case 26:case 32:case 34:case 35:case 36:case 37:case 38:case 40:case 45:case 46:case 47:case 50:case 52:case 55:break r;default:break e}}f=0;b=c}g=f;c=H[b|0];f=(c&47)==3;t=f?1:g;s=f?c|32:c;s:{if((s|0)==91){break s}t:{if((s|0)!=110){if((s|0)!=99){break t}d=(d|0)>1?d:1;break s}wm(l,t,r,p);break j}te(e,0,0);while(1){c=G[e+4>>2];u:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;c=H[c|0];break u}c=jc(e)}if((c|0)==32|c-9>>>0<5){continue}break}c=G[e+4>>2];f=G[e+116>>2];if((f|0)>0|(f|0)>=0){c=c-1|0;G[e+4>>2]=c}c=c-G[e+44>>2]|0;f=c>>31;i=c;h=p+G[e+124>>2]|0;c=r+G[e+120>>2]|0;h=c>>>0>>0?h+1|0:h;g=c;c=i+c|0;p=f+h|0;p=c>>>0>>0?p+1|0:p;r=c}i=d;u=d>>31;te(e,d,u);c=G[e+4>>2];v:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;break v}if((jc(e)|0)<0){break f}}c=G[e+116>>2];if((c|0)>0|(c|0)>=0){G[e+4>>2]=G[e+4>>2]-1}c=16;w:{x:{y:{z:{A:{switch(s-88|0){default:c=s-65|0;if(c>>>0>6|!(1<>2]-G[e+44>>2]|0;if(G[e+120>>2]!=(0-c|0)|G[e+124>>2]!=(0-((c>>31)+((c|0)!=0)|0)|0)){break y}break g;case 3:case 11:case 27:if((s|16)==115){cb(j+32|0,-1,257);E[j+32|0]=0;if((s|0)!=115){break x}E[j+65|0]=0;E[j+46|0]=0;F[j+42>>1]=0;F[j+44>>1]=0;break x}f=H[b+1|0];g=(f|0)==94;cb(j+32|0,g,257);E[j+32|0]=0;c=g?b+2|0:b+1|0;B:{C:{D:{b=H[(g?2:1)+b|0];if((b|0)!=45){if((b|0)==93){break D}f=(f|0)!=94;b=c;break B}f=(f|0)!=94;E[j+78|0]=f;break C}f=(f|0)!=94;E[j+126|0]=f}b=c+1|0}while(1){c=H[b|0];E:{if((c|0)!=45){if(!c){break f}if((c|0)==93){break x}break E}c=45;g=H[b+1|0];if(!g|(g|0)==93){break E}h=b+1|0;b=H[b-1|0];F:{if(g>>>0<=b>>>0){c=g;break F}while(1){b=b+1|0;E[b+(j+32|0)|0]=f;c=H[h|0];if(c>>>0>b>>>0){continue}break}}b=h}E[(c+j|0)+33|0]=f;b=b+1|0;continue};case 23:c=8;break z;case 12:case 29:c=10;break z;case 1:case 2:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 22:case 25:case 26:case 28:case 30:case 31:break w;case 0:case 24:case 32:break z;case 17:break A}}c=0}i=0;h=0;f=0;g=0;o=0;u=Fa-16|0;Fa=u;G:{if(!((c|0)!=1&c>>>0<=36)){G[48624]=28;break G}while(1){d=G[e+4>>2];H:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break H}d=jc(e)}if((d|0)==32|d-9>>>0<5){continue}break}I:{J:{switch(d-43|0){case 0:case 2:break J;default:break I}}o=(d|0)==45?-1:0;d=G[e+4>>2];if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break I}d=jc(e)}K:{L:{M:{N:{if(!((c|0)!=0&(c|0)!=16|(d|0)!=48)){d=G[e+4>>2];O:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break O}d=jc(e)}if((d&-33)==88){c=16;d=G[e+4>>2];P:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break P}d=jc(e)}if(H[d+96993|0]<16){break M}c=G[e+116>>2];if((c|0)>0|(c|0)>=0){G[e+4>>2]=G[e+4>>2]-1}te(e,0,0);break G}if(c){break N}c=8;break M}c=c?c:10;if(c>>>0>H[d+96993|0]){break N}c=G[e+116>>2];if((c|0)>0|(c|0)>=0){G[e+4>>2]=G[e+4>>2]-1}te(e,0,0);G[48624]=28;break G}if((c|0)!=10){break M}f=d-48|0;if(f>>>0<=9){c=0;while(1){c=M(c,10)+f|0;g=c>>>0<429496729;d=G[e+4>>2];Q:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break Q}d=jc(e)}f=d-48|0;if(g&f>>>0<=9){continue}break}i=c}R:{if(f>>>0>9){break R}g=Au(i,0,10,0);c=Ia;while(1){d=f+g|0;h=d>>>0>>0?c+1|0:c;i=d;g=(h|0)==429496729&d>>>0>=2576980378|h>>>0>429496729;c=G[e+4>>2];S:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;d=H[c|0];break S}d=jc(e)}f=d-48|0;if(g|f>>>0>9){break R}g=Au(i,h,10,0);c=Ia;if((c|0)==-1&(f^-1)>>>0>=g>>>0|(c|0)!=-1){continue}break}c=10;break L}c=10;if(f>>>0<=9){break L}break K}if(c-1&c){g=H[d+96993|0];if(g>>>0>>0){while(1){f=M(c,f)+g|0;i=f>>>0<119304647;d=G[e+4>>2];T:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break T}d=jc(e)}g=H[d+96993|0];if(i&g>>>0>>0){continue}break}i=f}if(c>>>0<=g>>>0){break L}while(1){k=Au(i,h,c,0);f=Ia;g=g&255;if((f|0)==-1&(g^-1)>>>0>>0){break L}d=g+k|0;h=d>>>0>>0?f+1|0:f;i=d;d=G[e+4>>2];U:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break U}d=jc(e)}g=H[d+96993|0];if(c>>>0<=g>>>0){break L}ed(u,c,0,0,0,i,h,0,0);if(!(G[u+8>>2]|G[u+12>>2])){continue}break}break L}k=E[(M(c,23)>>>5&7)+97249|0];f=H[d+96993|0];if(f>>>0>>0){while(1){g=g<>>0<134217728;d=G[e+4>>2];V:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break V}d=jc(e)}f=H[d+96993|0];if(i&f>>>0>>0){continue}break}i=g}if(c>>>0<=f>>>0){break L}g=k;q=g&31;if((g&63)>>>0>=32){g=0;q=-1>>>q|0}else{g=-1>>>q|0;q=g|(1<>>0>q>>>0){break L}while(1){x=f&255;f=i;d=k&31;if((k&63)>>>0>=32){h=f<>>32-d|h<>2];W:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break W}d=jc(e)}f=H[d+96993|0];if(c>>>0<=f>>>0){break L}if((g|0)==(h|0)&i>>>0<=q>>>0|g>>>0>h>>>0){continue}break}}if(H[d+96993|0]>=c>>>0){break K}while(1){d=G[e+4>>2];X:{if((d|0)!=G[e+104>>2]){G[e+4>>2]=d+1;d=H[d|0];break X}d=jc(e)}if(H[d+96993|0]>>0){continue}break}G[48624]=68;o=0;i=-1;h=-1}c=G[e+116>>2];if((c|0)>0|(c|0)>=0){G[e+4>>2]=G[e+4>>2]-1}Y:{if((h&i)!=-1){break Y}}c=o;d=c^i;i=d-c|0;f=c>>31;h=(f^h)-((c>>>0>d>>>0)+f|0)|0}Fa=u+16|0;c=G[e+4>>2]-G[e+44>>2]|0;if(G[e+120>>2]==(0-c|0)&G[e+124>>2]==(0-((c>>31)+((c|0)!=0)|0)|0)){break g}if(!(!l|(s|0)!=112)){G[l>>2]=i;break w}wm(l,t,i,h);break w}if(!l){break w}d=G[j+16>>2];c=G[j+20>>2];i=G[j+8>>2];m=G[j+12>>2];Z:{switch(t|0){case 0:h=Fa-32|0;Fa=h;f=c&2147483647;g=f-1065418752|0;k=f-1082064896|0;_:{if((g|0)==(k|0)&0|g>>>0>>0){f=(c&33554431)<<7|d>>>25;g=0;o=g;k=d&33554431;if(!(!g&(k|0)==16777216?!(i|m):!g&k>>>0<16777216)){g=f+1073741825|0;break _}g=f+1073741824|0;if(k^16777216|i|(m|o)){break _}g=(f&1)+g|0;break _}if(!(!d&(f|0)==2147418112?!(i|m):f>>>0<2147418112)){g=((c&33554431)<<7|d>>>25)&4194303|2143289344;break _}g=2139095040;if(f>>>0>1082064895){break _}g=0;f=f>>>16|0;if(f>>>0<16145){break _}g=c&65535|65536;od(h+16|0,i,m,d,g,f-16129|0);eg(h,i,m,d,g,16257-f|0);i=G[h+8>>2];g=(G[h+12>>2]&33554431)<<7|i>>>25;k=G[h>>2]|(G[h+16>>2]|G[h+24>>2]|(G[h+20>>2]|G[h+28>>2]))!=0;m=G[h+4>>2];f=0;i=i&33554431;if(!(!f&(i|0)==16777216?!(k|m):!f&i>>>0<16777216)){g=g+1|0;break _}if(i^16777216|k|(f|m)){break _}g=(g&1)+g|0}Fa=h+32|0;G[l>>2]=c&-2147483648|g;break w;case 1:A=l,B=Ui(i,m,d,c),L[A>>3]=B;break w;case 2:break Z;default:break w}}G[l>>2]=i;G[l+4>>2]=m;G[l+8>>2]=d;G[l+12>>2]=c;break w}x=(s|0)==99;f=x?d+1|0:31;$:{if((t|0)==1){c=l;if(m){c=ab(f<<2);if(!c){break h}}G[j+296>>2]=0;G[j+300>>2]=0;d=0;while(1){a=c;aa:{while(1){c=G[e+4>>2];ba:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;c=H[c|0];break ba}c=jc(e)}if(!H[(c+j|0)+33|0]){break aa}E[j+27|0]=c;k=j+28|0;n=0;t=Fa-16|0;Fa=t;c=j+296|0;h=c?c:195176;c=G[h>>2];ca:{da:{g=j+27|0;ea:{if(!g){if(c){break ea}break ca}n=-2;k=k?k:t+12|0;fa:{if(c){o=1;break fa}c=H[g|0];o=c<<24>>24;if((o|0)>=0){G[k>>2]=c;n=(o|0)!=0;break ca}c=E[g|0];if(!G[G[48787]>>2]){G[k>>2]=c&57343;n=1;break ca}c=(c&255)-194|0;if(c>>>0>50){break ea}c=G[(c<<2)+97264>>2];break da}q=H[g|0];z=q>>>3|0;if((z-16|(c>>26)+z)>>>0>7){break ea}while(1){o=o-1|0;c=q-128|c<<6;if((c|0)>=0){G[h>>2]=0;G[k>>2]=c;n=1-o|0;break ca}if(!o){break da}g=g+1|0;q=H[g|0];if((q&192)==128){continue}break}}G[h>>2]=0;G[48624]=25;n=-1;break ca}G[h>>2]=c}Fa=t+16|0;c=n;if((c|0)==-2){continue}n=0;if((c|0)==-1){break f}if(a){G[(d<<2)+a>>2]=G[j+28>>2];d=d+1|0}if(!((d|0)==(f|0)&m)){continue}break}g=1;f=f<<1|1;c=ub(a,f<<2);if(c){continue}break e}break}n=0;f=a;if(j+296|0?G[j+296>>2]:0){break f}break $}if(m){d=0;c=ab(f);if(!c){break h}while(1){a=c;while(1){c=G[e+4>>2];ga:{if((c|0)!=G[e+104>>2]){G[e+4>>2]=c+1;c=H[c|0];break ga}c=jc(e)}if(!H[(c+j|0)+33|0]){f=0;n=a;break $}E[a+d|0]=c;d=d+1|0;if((f|0)!=(d|0)){continue}break}g=1;f=f<<1|1;c=ub(a,f);if(c){continue}break}n=a;a=0;break e}d=0;if(l){while(1){a=G[e+4>>2];ha:{if((a|0)!=G[e+104>>2]){G[e+4>>2]=a+1;a=H[a|0];break ha}a=jc(e)}if(H[(a+j|0)+33|0]){E[d+l|0]=a;d=d+1|0;continue}else{f=0;a=l;n=a;break $}}}while(1){a=G[e+4>>2];ia:{if((a|0)!=G[e+104>>2]){G[e+4>>2]=a+1;a=H[a|0];break ia}a=jc(e)}if(H[(a+j|0)+33|0]){continue}break}a=0;n=0;f=0}c=G[e+4>>2];g=G[e+116>>2];if((g|0)>0|(g|0)>=0){c=c-1|0;G[e+4>>2]=c}g=c-G[e+44>>2]|0;c=g+G[e+120>>2]|0;h=G[e+124>>2]+(g>>31)|0;h=c>>>0>>0?h+1|0:h;if(!(h|c)|((c|0)!=(i|0)|(h|0)!=(u|0))&(s|0)==99){break i}if(m){G[l>>2]=a}ja:{if(x){break ja}if(f){G[(d<<2)+f>>2]=0}if(!n){n=0;break ja}E[d+n|0]=0}a=f}c=G[e+4>>2]-G[e+44>>2]|0;d=c>>31;i=c;g=p+G[e+124>>2]|0;c=r+G[e+120>>2]|0;g=c>>>0>>0?g+1|0:g;f=c;c=i+c|0;p=d+g|0;p=c>>>0>>0?p+1|0:p;r=c;w=((l|0)!=0)+w|0}d=b+1|0;b=H[b+1|0];if(b){continue}break a}break}a=f;break g}g=1;n=0;a=0;break e}g=m;break b}g=m}if(w){break b}}w=-1}if(!g){break a}Wa(n);Wa(a)}Fa=j+304|0;Fa=e+144|0;Fa=y+16|0;return w}function ab(a){a=a|0;var 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;l=Fa-16|0;Fa=l;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{if(a>>>0<=244){e=G[48625];h=a>>>0<11?16:a+11&-8;c=h>>>3|0;b=e>>>c|0;if(b&3){c=c+((b^-1)&1)|0;a=c<<3;b=a+194540|0;d=G[a+194548>>2];a=G[d+8>>2];l:{if((b|0)==(a|0)){m=194500,n=Eu(-2,c)&e,G[m>>2]=n;break l}G[a+12>>2]=b;G[b+8>>2]=a}a=d+8|0;b=c<<3;G[d+4>>2]=b|3;b=b+d|0;G[b+4>>2]=G[b+4>>2]|1;break a}k=G[48627];if(k>>>0>=h>>>0){break k}if(b){a=2<>>12&16;c=a;b=b>>>a|0;a=b>>>5&8;c=c|a;b=b>>>a|0;a=b>>>2&4;c=c|a;b=b>>>a|0;a=b>>>1&2;c=c|a;b=b>>>a|0;a=b>>>1&1;d=(c|a)+(b>>>a|0)|0;a=d<<3;b=a+194540|0;g=G[a+194548>>2];a=G[g+8>>2];m:{if((b|0)==(a|0)){e=Eu(-2,d)&e;G[48625]=e;break m}G[a+12>>2]=b;G[b+8>>2]=a}G[g+4>>2]=h|3;c=g+h|0;a=d<<3;d=a-h|0;G[c+4>>2]=d|1;G[a+g>>2]=d;if(k){b=(k&-8)+194540|0;f=G[48630];a=1<<(k>>>3);n:{if(!(a&e)){G[48625]=a|e;a=b;break n}a=G[b+8>>2]}G[b+8>>2]=f;G[a+12>>2]=f;G[f+12>>2]=b;G[f+8>>2]=a}a=g+8|0;G[48630]=c;G[48627]=d;break a}j=G[48626];if(!j){break k}b=(0-j&j)-1|0;a=b>>>12&16;c=a;b=b>>>a|0;a=b>>>5&8;c=c|a;b=b>>>a|0;a=b>>>2&4;c=c|a;b=b>>>a|0;a=b>>>1&2;c=c|a;b=b>>>a|0;a=b>>>1&1;c=G[((c|a)+(b>>>a|0)<<2)+194804>>2];f=(G[c+4>>2]&-8)-h|0;b=c;while(1){o:{a=G[b+16>>2];if(!a){a=G[b+20>>2];if(!a){break o}}b=(G[a+4>>2]&-8)-h|0;d=b>>>0>>0;f=d?b:f;c=d?a:c;b=a;continue}break}i=G[c+24>>2];d=G[c+12>>2];if((d|0)!=(c|0)){a=G[c+8>>2];G[a+12>>2]=d;G[d+8>>2]=a;break b}b=c+20|0;a=G[b>>2];if(!a){a=G[c+16>>2];if(!a){break j}b=c+16|0}while(1){g=b;d=a;b=a+20|0;a=G[b>>2];if(a){continue}b=d+16|0;a=G[d+16>>2];if(a){continue}break}G[g>>2]=0;break b}h=-1;if(a>>>0>4294967231){break k}a=a+11|0;h=a&-8;j=G[48626];if(!j){break k}f=0-h|0;e=0;p:{if(h>>>0<256){break p}e=31;if(h>>>0>16777215){break p}a=a>>>8|0;g=a+1048320>>>16&8;a=a<>>16&4;a=a<>>16&2;a=(a<>>15|0)-(b|(c|g))|0;e=(a<<1|h>>>a+21&1)+28|0}b=G[(e<<2)+194804>>2];q:{r:{s:{if(!b){a=0;break s}a=0;c=h<<((e|0)==31?0:25-(e>>>1|0)|0);while(1){t:{g=(G[b+4>>2]&-8)-h|0;if(g>>>0>=f>>>0){break t}d=b;f=g;if(f){break t}f=0;a=b;break r}g=G[b+20>>2];b=G[((c>>>29&4)+b|0)+16>>2];a=g?(g|0)==(b|0)?a:g:a;c=c<<1;if(b){continue}break}}if(!(a|d)){d=0;a=2<>>12&16;c=a;b=b>>>a|0;a=b>>>5&8;c=c|a;b=b>>>a|0;a=b>>>2&4;c=c|a;b=b>>>a|0;a=b>>>1&2;c=c|a;b=b>>>a|0;a=b>>>1&1;a=G[((c|a)+(b>>>a|0)<<2)+194804>>2]}if(!a){break q}}while(1){b=(G[a+4>>2]&-8)-h|0;c=b>>>0>>0;f=c?b:f;d=c?a:d;b=G[a+16>>2];if(b){a=b}else{a=G[a+20>>2]}if(a){continue}break}}if(!d|G[48627]-h>>>0<=f>>>0){break k}e=G[d+24>>2];c=G[d+12>>2];if((d|0)!=(c|0)){a=G[d+8>>2];G[a+12>>2]=c;G[c+8>>2]=a;break c}b=d+20|0;a=G[b>>2];if(!a){a=G[d+16>>2];if(!a){break i}b=d+16|0}while(1){g=b;c=a;b=a+20|0;a=G[b>>2];if(a){continue}b=c+16|0;a=G[c+16>>2];if(a){continue}break}G[g>>2]=0;break c}c=G[48627];if(c>>>0>=h>>>0){d=G[48630];b=c-h|0;u:{if(b>>>0>=16){G[48627]=b;a=d+h|0;G[48630]=a;G[a+4>>2]=b|1;G[c+d>>2]=b;G[d+4>>2]=h|3;break u}G[48630]=0;G[48627]=0;G[d+4>>2]=c|3;a=c+d|0;G[a+4>>2]=G[a+4>>2]|1}a=d+8|0;break a}i=G[48628];if(i>>>0>h>>>0){b=i-h|0;G[48628]=b;c=G[48631];a=c+h|0;G[48631]=a;G[a+4>>2]=b|1;G[c+4>>2]=h|3;a=c+8|0;break a}a=0;j=h+47|0;if(G[48743]){c=G[48745]}else{G[48746]=-1;G[48747]=-1;G[48744]=4096;G[48745]=4096;G[48743]=l+12&-16^1431655768;G[48748]=0;G[48736]=0;c=4096}g=j+c|0;f=0-c|0;b=g&f;if(b>>>0<=h>>>0){break a}d=G[48735];if(d){c=G[48733];e=c+b|0;if(d>>>0>>0|c>>>0>=e>>>0){break a}}if(H[194944]&4){break f}v:{w:{d=G[48631];if(d){a=194948;while(1){c=G[a>>2];if(c>>>0<=d>>>0&d>>>0>2]>>>0){break w}a=G[a+8>>2];if(a){continue}break}}c=gg(0);if((c|0)==-1){break g}e=b;d=G[48744];a=d-1|0;if(a&c){e=(b-c|0)+(a+c&0-d)|0}if(e>>>0<=h>>>0|e>>>0>2147483646){break g}d=G[48735];if(d){a=G[48733];f=a+e|0;if(d>>>0>>0|a>>>0>=f>>>0){break g}}a=gg(e);if((c|0)!=(a|0)){break v}break e}e=f&g-i;if(e>>>0>2147483646){break g}c=gg(e);if((c|0)==(G[a>>2]+G[a+4>>2]|0)){break h}a=c}if(!((a|0)==-1|h+48>>>0<=e>>>0)){c=G[48745];c=c+(j-e|0)&0-c;if(c>>>0>2147483646){c=a;break e}if((gg(c)|0)!=-1){e=c+e|0;c=a;break e}gg(0-e|0);break g}c=a;if((a|0)!=-1){break e}break g}d=0;break b}c=0;break c}if((c|0)!=-1){break e}}G[48736]=G[48736]|4}if(b>>>0>2147483646){break d}c=gg(b);a=gg(0);if((c|0)==-1|(a|0)==-1|a>>>0<=c>>>0){break d}e=a-c|0;if(e>>>0<=h+40>>>0){break d}}a=G[48733]+e|0;G[48733]=a;if(a>>>0>J[48734]){G[48734]=a}x:{y:{z:{g=G[48631];if(g){a=194948;while(1){d=G[a>>2];b=G[a+4>>2];if((d+b|0)==(c|0)){break z}a=G[a+8>>2];if(a){continue}break}break y}a=G[48629];if(!(a>>>0<=c>>>0?a:0)){G[48629]=c}a=0;G[48738]=e;G[48737]=c;G[48633]=-1;G[48634]=G[48743];G[48740]=0;while(1){d=a<<3;b=d+194540|0;G[d+194548>>2]=b;G[d+194552>>2]=b;a=a+1|0;if((a|0)!=32){continue}break}d=e-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;G[48628]=b;a=a+c|0;G[48631]=a;G[a+4>>2]=b|1;G[(c+d|0)+4>>2]=40;G[48632]=G[48747];break x}if(H[a+12|0]&8|d>>>0>g>>>0|c>>>0<=g>>>0){break y}G[a+4>>2]=b+e;a=g+8&7?-8-g&7:0;c=a+g|0;G[48631]=c;b=G[48628]+e|0;a=b-a|0;G[48628]=a;G[c+4>>2]=a|1;G[(b+g|0)+4>>2]=40;G[48632]=G[48747];break x}if(J[48629]>c>>>0){G[48629]=c}b=c+e|0;a=194948;A:{B:{C:{D:{E:{F:{while(1){if((b|0)!=G[a>>2]){a=G[a+8>>2];if(a){continue}break F}break}if(!(H[a+12|0]&8)){break E}}a=194948;while(1){b=G[a>>2];if(b>>>0<=g>>>0){f=b+G[a+4>>2]|0;if(f>>>0>g>>>0){break D}}a=G[a+8>>2];continue}}G[a>>2]=c;G[a+4>>2]=G[a+4>>2]+e;j=(c+8&7?-8-c&7:0)+c|0;G[j+4>>2]=h|3;e=b+(b+8&7?-8-b&7:0)|0;i=h+j|0;a=e-i|0;if((e|0)==(g|0)){G[48631]=i;a=G[48628]+a|0;G[48628]=a;G[i+4>>2]=a|1;break B}if(G[48630]==(e|0)){G[48630]=i;a=G[48627]+a|0;G[48627]=a;G[i+4>>2]=a|1;G[a+i>>2]=a;break B}f=G[e+4>>2];if((f&3)==1){g=f&-8;G:{if(f>>>0<=255){d=G[e+8>>2];b=f>>>3|0;c=G[e+12>>2];if((c|0)==(d|0)){m=194500,n=G[48625]&Eu(-2,b),G[m>>2]=n;break G}G[d+12>>2]=c;G[c+8>>2]=d;break G}h=G[e+24>>2];c=G[e+12>>2];H:{if((e|0)!=(c|0)){b=G[e+8>>2];G[b+12>>2]=c;G[c+8>>2]=b;break H}I:{f=e+20|0;b=G[f>>2];if(b){break I}f=e+16|0;b=G[f>>2];if(b){break I}c=0;break H}while(1){d=f;c=b;f=b+20|0;b=G[f>>2];if(b){continue}f=c+16|0;b=G[c+16>>2];if(b){continue}break}G[d>>2]=0}if(!h){break G}d=G[e+28>>2];b=(d<<2)+194804|0;J:{if(G[b>>2]==(e|0)){G[b>>2]=c;if(c){break J}m=194504,n=G[48626]&Eu(-2,d),G[m>>2]=n;break G}G[h+(G[h+16>>2]==(e|0)?16:20)>>2]=c;if(!c){break G}}G[c+24>>2]=h;b=G[e+16>>2];if(b){G[c+16>>2]=b;G[b+24>>2]=c}b=G[e+20>>2];if(!b){break G}G[c+20>>2]=b;G[b+24>>2]=c}e=e+g|0;f=G[e+4>>2];a=a+g|0}G[e+4>>2]=f&-2;G[i+4>>2]=a|1;G[a+i>>2]=a;if(a>>>0<=255){b=(a&-8)+194540|0;c=G[48625];a=1<<(a>>>3);K:{if(!(c&a)){G[48625]=a|c;a=b;break K}a=G[b+8>>2]}G[b+8>>2]=i;G[a+12>>2]=i;G[i+12>>2]=b;G[i+8>>2]=a;break B}f=31;if(a>>>0<=16777215){b=a>>>8|0;f=b+1048320>>>16&8;b=b<>>16&4;b=b<>>16&2;b=(b<>>15|0)-(c|(d|f))|0;f=(b<<1|a>>>b+21&1)+28|0}G[i+28>>2]=f;G[i+16>>2]=0;G[i+20>>2]=0;b=(f<<2)+194804|0;d=G[48626];c=1<>2]=i;break L}f=a<<((f|0)==31?0:25-(f>>>1|0)|0);c=G[b>>2];while(1){b=c;if((G[b+4>>2]&-8)==(a|0)){break C}c=f>>>29|0;f=f<<1;d=(c&4)+b|0;c=G[d+16>>2];if(c){continue}break}G[d+16>>2]=i}G[i+24>>2]=b;G[i+12>>2]=i;G[i+8>>2]=i;break B}d=e-40|0;a=c+8&7?-8-c&7:0;b=d-a|0;G[48628]=b;a=a+c|0;G[48631]=a;G[a+4>>2]=b|1;G[(c+d|0)+4>>2]=40;G[48632]=G[48747];a=(f+(f-39&7?39-f&7:0)|0)-47|0;d=a>>>0>>0?g:a;G[d+4>>2]=27;a=G[48740];G[d+16>>2]=G[48739];G[d+20>>2]=a;a=G[48738];G[d+8>>2]=G[48737];G[d+12>>2]=a;G[48739]=d+8;G[48738]=e;G[48737]=c;G[48740]=0;a=d+24|0;while(1){G[a+4>>2]=7;b=a+8|0;a=a+4|0;if(b>>>0>>0){continue}break}if((d|0)==(g|0)){break x}G[d+4>>2]=G[d+4>>2]&-2;f=d-g|0;G[g+4>>2]=f|1;G[d>>2]=f;if(f>>>0<=255){b=(f&-8)+194540|0;c=G[48625];a=1<<(f>>>3);M:{if(!(c&a)){G[48625]=a|c;a=b;break M}a=G[b+8>>2]}G[b+8>>2]=g;G[a+12>>2]=g;G[g+12>>2]=b;G[g+8>>2]=a;break x}a=31;if(f>>>0<=16777215){a=f>>>8|0;d=a+1048320>>>16&8;a=a<>>16&4;a=a<>>16&2;a=(a<>>15|0)-(b|(c|d))|0;a=(a<<1|f>>>a+21&1)+28|0}G[g+28>>2]=a;G[g+16>>2]=0;G[g+20>>2]=0;b=(a<<2)+194804|0;d=G[48626];c=1<>2]=g;break N}a=f<<((a|0)==31?0:25-(a>>>1|0)|0);d=G[b>>2];while(1){b=d;if((f|0)==(G[b+4>>2]&-8)){break A}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;d=G[c+16>>2];if(d){continue}break}G[c+16>>2]=g}G[g+24>>2]=b;G[g+12>>2]=g;G[g+8>>2]=g;break x}a=G[b+8>>2];G[a+12>>2]=i;G[b+8>>2]=i;G[i+24>>2]=0;G[i+12>>2]=b;G[i+8>>2]=a}a=j+8|0;break a}a=G[b+8>>2];G[a+12>>2]=g;G[b+8>>2]=g;G[g+24>>2]=0;G[g+12>>2]=b;G[g+8>>2]=a}a=G[48628];if(a>>>0<=h>>>0){break d}b=a-h|0;G[48628]=b;c=G[48631];a=c+h|0;G[48631]=a;G[a+4>>2]=b|1;G[c+4>>2]=h|3;a=c+8|0;break a}G[48624]=48;a=0;break a}O:{if(!e){break O}b=G[d+28>>2];a=(b<<2)+194804|0;P:{if(G[a>>2]==(d|0)){G[a>>2]=c;if(c){break P}j=Eu(-2,b)&j;G[48626]=j;break O}G[e+(G[e+16>>2]==(d|0)?16:20)>>2]=c;if(!c){break O}}G[c+24>>2]=e;a=G[d+16>>2];if(a){G[c+16>>2]=a;G[a+24>>2]=c}a=G[d+20>>2];if(!a){break O}G[c+20>>2]=a;G[a+24>>2]=c}Q:{if(f>>>0<=15){a=f+h|0;G[d+4>>2]=a|3;a=a+d|0;G[a+4>>2]=G[a+4>>2]|1;break Q}G[d+4>>2]=h|3;e=d+h|0;G[e+4>>2]=f|1;G[e+f>>2]=f;if(f>>>0<=255){b=(f&-8)+194540|0;c=G[48625];a=1<<(f>>>3);R:{if(!(c&a)){G[48625]=a|c;a=b;break R}a=G[b+8>>2]}G[b+8>>2]=e;G[a+12>>2]=e;G[e+12>>2]=b;G[e+8>>2]=a;break Q}a=31;if(f>>>0<=16777215){a=f>>>8|0;g=a+1048320>>>16&8;a=a<>>16&4;a=a<>>16&2;a=(a<>>15|0)-(b|(c|g))|0;a=(a<<1|f>>>a+21&1)+28|0}G[e+28>>2]=a;G[e+16>>2]=0;G[e+20>>2]=0;b=(a<<2)+194804|0;S:{c=1<>2]=e;break T}a=f<<((a|0)==31?0:25-(a>>>1|0)|0);h=G[b>>2];while(1){b=h;if((G[b+4>>2]&-8)==(f|0)){break S}c=a>>>29|0;a=a<<1;c=(c&4)+b|0;h=G[c+16>>2];if(h){continue}break}G[c+16>>2]=e}G[e+24>>2]=b;G[e+12>>2]=e;G[e+8>>2]=e;break Q}a=G[b+8>>2];G[a+12>>2]=e;G[b+8>>2]=e;G[e+24>>2]=0;G[e+12>>2]=b;G[e+8>>2]=a}a=d+8|0;break a}U:{if(!i){break U}b=G[c+28>>2];a=(b<<2)+194804|0;V:{if(G[a>>2]==(c|0)){G[a>>2]=d;if(d){break V}m=194504,n=Eu(-2,b)&j,G[m>>2]=n;break U}G[i+(G[i+16>>2]==(c|0)?16:20)>>2]=d;if(!d){break U}}G[d+24>>2]=i;a=G[c+16>>2];if(a){G[d+16>>2]=a;G[a+24>>2]=d}a=G[c+20>>2];if(!a){break U}G[d+20>>2]=a;G[a+24>>2]=d}W:{if(f>>>0<=15){a=f+h|0;G[c+4>>2]=a|3;a=a+c|0;G[a+4>>2]=G[a+4>>2]|1;break W}G[c+4>>2]=h|3;d=c+h|0;G[d+4>>2]=f|1;G[d+f>>2]=f;if(k){b=(k&-8)+194540|0;g=G[48630];a=1<<(k>>>3);X:{if(!(a&e)){G[48625]=a|e;a=b;break X}a=G[b+8>>2]}G[b+8>>2]=g;G[a+12>>2]=g;G[g+12>>2]=b;G[g+8>>2]=a}G[48630]=d;G[48627]=f}a=c+8|0}Fa=l+16|0;return a|0}function ae(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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=N(0),C=N(0),D=0,I=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=N(0);p=Fa-29104|0;Fa=p;q=G[o>>2];a:{if(!(g|h)|(q|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,p+29096|0,p+29088|0,p+28992|0,p+29064|0,p+29084|0,p+29080|0,p+29040|0,p+29032|0,p+29060|0,p+29048|0,p+29016|0,p+29076|0,p+29024|0,p+28864|0,o)|0)>0){q=G[o>>2];break a}G[p+29060>>2]=M(G[p+29060>>2],i);D=1;c=G[p+29080>>2];R=c;S=c>>31;b:{if(G[p+29084>>2]!=16){break b}Gd(p+28992|0,p+29072|0,p+29056|0,p+29068|0,o);c=G[p+29068>>2];if((c|0)<=0){break b}if(c-1>>>0>=7){d=c&-8;while(1){D=D*10*10*10*10*10*10*10*10;z=z+8|0;if((d|0)!=(z|0)){continue}break}}c=c&7;if(!c){break b}z=0;while(1){D=D*10;z=z+1|0;if((c|0)!=(z|0)){continue}break}}z=0;d=G[p+29084>>2];c:{d:{if((j|0)==1&k==N(0)){break d}e=G[p+29028>>2];c=G[p+29024>>2];if(!e&(c|0)==1234554321&((d|0)%10|0)==1){break d}if(!((e-(c>>>0<32768)|0)==-1&c-32768>>>0>=4294901760|(d|0)!=21)){P=0;break c}P=0;if(!(!e&c>>>0<=255|(d|0)!=11)){break c}z=(d|0)==16?H[p+28864|0]==1?0:j:j}P=0;if((d|0)!=42){break c}c=g>>>0<536870911&(h|0)<=0|(h|0)<0;R=c?g:536870911;S=c?h:0;P=!z&L[p+29096>>3]==1&L[p+29088>>3]==0}W=0-i|0;e=0;f=0;e:{while(1){d=g>>>0>>0&(h|0)<=(S|0)|(h|0)<(S|0)?g:R;c=d;q=c>>31;u=c;f:{if((i|0)>=0){c=G[p+29036>>2];s=c;c=G[p+29052>>2]+(c^-1)|0;v=G[p+29032>>2];j=v^-1;d=j+G[p+29048>>2]|0;c=Bu(d,d>>>0>>0?c+1|0:c,i,0);d=Ia;break f}v=G[p+29032>>2];s=G[p+29036>>2];c=Bu(v,s,W,0);d=Ia}t=c;j=G[p+29044>>2];c=G[p+29040>>2];r=Au(G[p+29016>>2],G[p+29020>>2],I,O);c=c+r|0;j=Ia+j|0;j=c>>>0>>0?j+1|0:j;T=c;r=G[p+29060>>2];c=(r|0)/(i|0)|0;v=Au(v,s,c,c>>31);s=T+v|0;c=Ia+j|0;c=v>>>0>s>>>0?c+1|0:c;v=s;j=c;c=d;s=t+1|0;d=(d|0)<=(q|0)&u>>>0>t>>>0|(d|0)<(q|0);u=d?s:u;g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{c=G[p+29084>>2];switch(c-11|0){case 0:break h;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break i;case 5:break j;case 30:break m;case 10:break n;case 31:break o;default:break p}}switch(c-81|0){case 1:break k;case 0:break l;default:break i}}c=(e<<2)+l|0;Uc(a,v,j,u,r,c,o);if(P){break g}gl(c,u,L[p+29096>>3],L[p+29088>>3],z,k,e+m|0,n,c);break g}c=p- -64|0;Pe(a,v,j,u,r,c,o);jq(c,u,L[p+29096>>3],L[p+29088>>3],z,F[p+29024>>1],k,e+m|0,n,(e<<2)+l|0);break g}c=p- -64|0;Uc(a,v,j,u,r,c,o);fl(c,u,L[p+29096>>3],L[p+29088>>3],z,G[p+29024>>2],k,e+m|0,n,(e<<2)+l|0);break g}c=j;j=p- -64|0;Tc(a,v,c,u,r,j,o);q=G[p+29024>>2];v=G[p+29028>>2];C=k;r=e+m|0;d=(e<<2)+l|0;x=L[p+29096>>3];A=L[p+29088>>3];c=x==1&A==0x8000000000000000;q:{if(!z){if(c){if((u|0)<=0){break q}q=0;c=0;if(u-1>>>0>=3){v=u&-4;t=0;while(1){r=j+(c<<3)|0;K[d+(c<<2)>>2]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;r=c|1;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;r=c|2;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;r=c|3;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;c=c+4|0;t=t+4|0;if((v|0)!=(t|0)){continue}break}}t=u&3;if(!t){break q}while(1){v=j+(c<<3)|0;K[d+(c<<2)>>2]=+J[v>>2]+ +((G[v+4>>2]^-2147483648)>>>0)*4294967296;c=c+1|0;q=q+1|0;if((t|0)!=(q|0)){continue}break}break q}if(!(x==1&A==0)){if((u|0)<=0){break q}c=0;if((u|0)!=1){q=u&-2;t=0;while(1){v=j+(c<<3)|0;K[d+(c<<2)>>2]=(+J[v>>2]+ +G[v+4>>2]*4294967296)*x+A;v=c|1;s=d+(v<<2)|0;v=j+(v<<3)|0;K[s>>2]=(+J[v>>2]+ +G[v+4>>2]*4294967296)*x+A;c=c+2|0;t=t+2|0;if((q|0)!=(t|0)){continue}break}}if(!(u&1)){break q}d=d+(c<<2)|0;c=j+(c<<3)|0;K[d>>2]=(+J[c>>2]+ +G[c+4>>2]*4294967296)*x+A;break q}if((u|0)<=0){break q}q=0;c=0;if(u-1>>>0>=3){v=u&-4;t=0;while(1){r=j+(c<<3)|0;K[d+(c<<2)>>2]=+J[r>>2]+ +G[r+4>>2]*4294967296;r=c|1;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +G[r+4>>2]*4294967296;r=c|2;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +G[r+4>>2]*4294967296;r=c|3;s=d+(r<<2)|0;r=j+(r<<3)|0;K[s>>2]=+J[r>>2]+ +G[r+4>>2]*4294967296;c=c+4|0;t=t+4|0;if((v|0)!=(t|0)){continue}break}}t=u&3;if(!t){break q}while(1){v=j+(c<<3)|0;K[d+(c<<2)>>2]=+J[v>>2]+ +G[v+4>>2]*4294967296;c=c+1|0;q=q+1|0;if((t|0)!=(q|0)){continue}break}break q}if(c){if((u|0)<=0){break q}c=0;while(1){t=j+(c<<3)|0;s=G[t>>2];t=G[t+4>>2];r:{if((s|0)==(q|0)&(t|0)==(v|0)){G[n>>2]=1;if((z|0)==1){K[d+(c<<2)>>2]=C;break r}E[c+r|0]=1;break r}K[d+(c<<2)>>2]=+(s>>>0)+ +((t^-2147483648)>>>0)*4294967296}c=c+1|0;if((u|0)!=(c|0)){continue}break}break q}s:{if(!(x==1&A==0)){if((u|0)<=0){break q}if((z|0)==1){break s}c=0;while(1){t=j+(c<<3)|0;s=G[t>>2];t=G[t+4>>2];t:{if((s|0)==(q|0)&(t|0)==(v|0)){G[n>>2]=1;E[c+r|0]=1;break t}K[d+(c<<2)>>2]=(+(s>>>0)+ +(t|0)*4294967296)*x+A}c=c+1|0;if((u|0)!=(c|0)){continue}break}break q}if((u|0)<=0){break q}if((z|0)!=1){c=0;if((u|0)!=1){w=u&-2;t=0;while(1){s=j+(c<<3)|0;y=G[s>>2];s=G[s+4>>2];u:{if((y|0)==(q|0)&(s|0)==(v|0)){G[n>>2]=1;E[c+r|0]=1;break u}K[d+(c<<2)>>2]=+(y>>>0)+ +(s|0)*4294967296}s=c|1;y=j+(s<<3)|0;Q=G[y>>2];y=G[y+4>>2];v:{if((Q|0)!=(q|0)|(y|0)!=(v|0)){K[d+(s<<2)>>2]=+(Q>>>0)+ +(y|0)*4294967296;break v}G[n>>2]=1;E[r+s|0]=1}c=c+2|0;t=t+2|0;if((w|0)!=(t|0)){continue}break}}if(!(u&1)){break q}t=q;j=j+(c<<3)|0;q=G[j>>2];j=G[j+4>>2];if((t|0)!=(q|0)|(j|0)!=(v|0)){K[d+(c<<2)>>2]=+(q>>>0)+ +(j|0)*4294967296;break q}G[n>>2]=1;E[c+r|0]=1;break q}c=0;if((u|0)!=1){r=u&-2;t=0;while(1){s=d+(c<<2)|0;w=j+(c<<3)|0;y=G[w>>2];w=G[w+4>>2];w:{if((y|0)!=(q|0)|(w|0)!=(v|0)){B=N(+(y>>>0)+ +(w|0)*4294967296);break w}G[n>>2]=1;B=C}K[s>>2]=B;s=c|1;w=j+(s<<3)|0;y=G[w>>2];w=G[w+4>>2];x:{if((y|0)!=(q|0)|(w|0)!=(v|0)){B=N(+(y>>>0)+ +(w|0)*4294967296);break x}G[n>>2]=1;B=C}K[d+(s<<2)>>2]=B;c=c+2|0;t=t+2|0;if((r|0)!=(t|0)){continue}break}}if(!(u&1)){break q}t=q;j=j+(c<<3)|0;q=G[j>>2];j=G[j+4>>2];y:{if((t|0)!=(q|0)|(j|0)!=(v|0)){C=N(+(q>>>0)+ +(j|0)*4294967296);break y}G[n>>2]=1}K[d+(c<<2)>>2]=C;break q}c=0;if((u|0)!=1){r=u&-2;t=0;while(1){s=d+(c<<2)|0;w=j+(c<<3)|0;y=G[w>>2];w=G[w+4>>2];z:{if((y|0)!=(q|0)|(w|0)!=(v|0)){B=N((+(y>>>0)+ +(w|0)*4294967296)*x+A);break z}G[n>>2]=1;B=C}K[s>>2]=B;s=c|1;w=j+(s<<3)|0;y=G[w>>2];w=G[w+4>>2];A:{if((y|0)!=(q|0)|(w|0)!=(v|0)){B=N((+(y>>>0)+ +(w|0)*4294967296)*x+A);break A}G[n>>2]=1;B=C}K[d+(s<<2)>>2]=B;c=c+2|0;t=t+2|0;if((r|0)!=(t|0)){continue}break}}if(!(u&1)){break q}t=q;j=j+(c<<3)|0;q=G[j>>2];j=G[j+4>>2];B:{if((t|0)!=(q|0)|(j|0)!=(v|0)){C=N((+(q>>>0)+ +(j|0)*4294967296)*x+A);break B}G[n>>2]=1}K[d+(c<<2)>>2]=C}break g}c=p- -64|0;Tc(a,v,j,u,r,c,o);Wi(c,u,L[p+29096>>3],L[p+29088>>3],z,k,e+m|0,n,(e<<2)+l|0);break g}Jb(a,v,j,0,o);c=G[p+29060>>2];d=G[p+29064>>2];C:{if((c|0)==(d|0)){c=M(c,u);ic(a,c,c>>31,p- -64|0,o);break C}Rd(a,d,u,c-d|0,p- -64|0,o)}t=p- -64|0;X=L[p+29096>>3];Y=L[p+29088>>3];Z=G[p+29064>>2];_=e+m|0;y=(e<<2)+l|0;s=0;r=Fa-112|0;Fa=r;Q=p+28864|0;$=Va(Q);if((u|0)>0){while(1){D:{d=t+Z|0;U=H[d|0];E[d|0]=0;j=t;E:{F:{if(H[Q|0]==1){break F}if(fb(Q,t,$)){break F}j=d;if(!z){break E}G[n>>2]=1;if((z|0)==1){K[(s<<2)+y>>2]=k;break E}E[s+_|0]=1;break E}while(1){c=H[j|0];if((c|0)==32){j=j+1|0;continue}break}V=1;G:{switch(c-43|0){case 0:case 2:while(1){q=H[j+1|0];j=j+1|0;if((q|0)==32){continue}break};V=(c|0)==45?-1:1;c=q;break;default:break G}}A=0;if((c-48&255)>>>0<10){while(1){x=A*10+ +(c<<24>>24);q=j;while(1){c=H[q+1|0];j=q+1|0;q=j;if((c|0)==32){continue}break}A=x+-48;if((c-48&255)>>>0<=9){continue}break}}x=D;H:{I:{switch(c-44|0){case 0:case 2:break I;default:break H}}q=j;while(1){c=H[q+1|0];j=q+1|0;q=j;if((c|0)==32){continue}break}x=1;if((c-48&255)>>>0>=10){break H}while(1){A=A*10+ +(c<<24>>24)+-48;q=j;while(1){c=H[q+1|0];j=q+1|0;q=j;if((c|0)==32){continue}break}x=x*10;if((c-48&255)>>>0<=9){continue}break}}J:{if((c&254)!=68){w=1;q=0;break J}while(1){w=1;q=j;j=j+1|0;c=H[q+1|0];if((c|0)==32){continue}break}K:{switch(c-43|0){case 0:case 2:q=q+2|0;while(1){j=q;q=j+1|0;v=H[j|0];if((v|0)==32){continue}break};w=(c|0)==45?-1:1;c=v;break;default:break K}}q=0;if((c-48&255)>>>0>=10){break J}while(1){v=c;T=M(q,10)-48|0;q=j;while(1){c=H[q+1|0];j=q+1|0;q=j;if((c|0)==32){continue}break}q=T+(v<<24>>24)|0;if((c-48&255)>>>0<=9){continue}break}}if(c){G[r+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[r+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[r+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[r+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[r+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[r+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[r+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[r+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[r+20>>2]=c;c=r+16|0;Ua(c);G[r>>2]=t;Ya(c,81,43022,r);Ua(c);E[d|0]=U;G[o>>2]=409;break D}aa=(s<<2)+y|0,ba=N(A*+(V|0)/x*$b(10,+(M(q,w)|0))*X+Y),K[aa>>2]=ba}t=j;E[d|0]=U;s=s+1|0;if((s|0)!=(u|0)){continue}}break}}Fa=r+112|0;break g}G[p>>2]=b;G[p+4>>2]=p+28992;a=p+28896|0;Ya(a,81,8924,p);Ua(a);q=311;if(G[p+29076>>2]==1){break e}q=312;break e}c=p- -64|0;$d(a,v,j,u,r,c,o);iq(c,u,L[p+29096>>3],L[p+29088>>3],z,H[p+29024|0],k,e+m|0,n,(e<<2)+l|0)}q=G[o>>2];if((q|0)>0){x=+(e>>>0)+ +(f|0)*4294967296;D=x+1;x=x+ +(u|0);L:{if(G[p+29076>>2]>0){G[p+32>>2]=b;L[p+24>>3]=x;L[p+16>>3]=D;Ya(p+28896|0,81,47439,p+16|0);break L}L[p+56>>3]=x;L[p+48>>3]=D;Ya(p+28896|0,81,47380,p+48|0)}Ua(p+28896|0);q=G[o>>2];break a}c=u;j=c>>31;t=c;s=j;h=h-(j+(g>>>0>>0)|0)|0;g=g-c|0;if(h|g){c=M(i,u);j=c;d=c+G[p+29032>>2]|0;c=G[p+29036>>2]+(c>>31)|0;c=d>>>0>>0?c+1|0:c;G[p+29032>>2]=d;j=c;G[p+29036>>2]=c;c=f+s|0;q=e+t|0;c=q>>>0>>0?c+1|0:c;e=q;f=c;t=G[p+29052>>2];c=t;u=G[p+29048>>2];if((j|0)>=(c|0)&d>>>0>=u>>>0|(c|0)<(j|0)){q=Bu(d,j,u,t);c=I+q|0;s=Ia;O=O+s|0;O=c>>>0>>0?O+1|0:O;I=c;c=Au(q,s,u,t);G[p+29032>>2]=d-c;G[p+29036>>2]=j-(Ia+(c>>>0>d>>>0)|0);continue}if((j|0)>0|(j|0)>=0){continue}q=I;I=Bu(d^-1,j^-1,u,t)+1|0;c=Ia;c=I?c:c+1|0;s=I;I=q-s|0;O=O-((q>>>0>>0)+c|0)|0;q=Au(s,c,u,t)+d|0;c=j+Ia|0;G[p+29032>>2]=q;G[p+29036>>2]=d>>>0>q>>>0?c+1|0:c;continue}break}if((q|0)!=-11){break a}Ua(44994);q=412}G[o>>2]=q}Fa=p+29104|0;return q}function Id(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=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;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29068|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29080|0,q+29024|0,q+28864|0,o)|0)>0){p=G[o>>2];break a}G[q+29060>>2]=M(G[q+29060>>2],i);N=1;c=G[q+29068>>2];R=c;S=c>>31;b:{if(G[q+29084>>2]!=16){break b}Gd(q+28992|0,q+29076|0,q+29056|0,q+29072|0,o);c=G[q+29072>>2];if((c|0)<=0){break b}if(c-1>>>0>=7){d=c&-8;while(1){N=N*10*10*10*10*10*10*10*10;z=z+8|0;if((d|0)!=(z|0)){continue}break}}c=c&7;if(!c){break b}z=0;while(1){N=N*10;z=z+1|0;if((c|0)!=(z|0)){continue}break}}z=0;d=G[q+29084>>2];c:{d:{if((j|0)==1&k==0){break d}e=G[q+29028>>2];c=G[q+29024>>2];if(!e&(c|0)==1234554321&((d|0)%10|0)==1){break d}if(!((e-(c>>>0<32768)|0)==-1&c-32768>>>0>=4294901760|(d|0)!=21)){K=0;break c}K=0;if(!(!e&c>>>0<=255|(d|0)!=11)){break c}z=(d|0)==16?H[q+28864|0]==1?0:j:j}K=0;if((d|0)!=82){break c}c=g>>>0<268435455&(h|0)<=0|(h|0)<0;R=c?g:268435455;S=c?h:0;K=!z&L[q+29096>>3]==1&L[q+29088>>3]==0}U=0-i|0;e=0;f=0;e:{while(1){d=g>>>0>>0&(h|0)<=(S|0)|(h|0)<(S|0)?g:R;c=d;j=c>>31;t=c;p=j;f:{if((i|0)>=0){c=G[q+29036>>2];r=c;c=G[q+29052>>2]+(c^-1)|0;s=G[q+29032>>2];j=s^-1;d=j+G[q+29048>>2]|0;c=Bu(d,d>>>0>>0?c+1|0:c,i,0);d=Ia;break f}s=G[q+29032>>2];r=G[q+29036>>2];c=Bu(s,r,U,0);d=Ia}u=c;j=G[q+29044>>2];c=G[q+29040>>2];v=Au(G[q+29016>>2],G[q+29020>>2],O,Q);c=c+v|0;j=Ia+j|0;j=c>>>0>>0?j+1|0:j;I=c;v=G[q+29060>>2];c=(v|0)/(i|0)|0;s=Au(s,r,c,c>>31);r=I+s|0;c=Ia+j|0;c=s>>>0>r>>>0?c+1|0:c;s=r;j=c;c=d;r=u+1|0;d=(d|0)<=(p|0)&t>>>0>u>>>0|(d|0)<(p|0);t=d?r:t;g:{h:{i:{j:{k:{l:{m:{n:{o:{c=G[q+29084>>2];switch(c-11|0){case 0:break h;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break i;case 5:break j;case 31:break k;case 30:break m;case 10:break n;default:break o}}p:{switch(c-81|0){case 0:break l;case 1:break p;default:break i}}c=(e<<3)+l|0;Tc(a,s,j,t,v,c,o);if(K){break g}dl(c,t,L[q+29096>>3],L[q+29088>>3],z,k,e+m|0,n,c);break g}c=q- -64|0;Pe(a,s,j,t,v,c,o);fq(c,t,L[q+29096>>3],L[q+29088>>3],z,F[q+29024>>1],k,e+m|0,n,(e<<3)+l|0);break g}c=q- -64|0;Uc(a,s,j,t,v,c,o);cl(c,t,L[q+29096>>3],L[q+29088>>3],z,G[q+29024>>2],k,e+m|0,n,(e<<3)+l|0);break g}c=j;j=q- -64|0;Tc(a,s,c,t,v,j,o);u=G[q+29024>>2];s=G[q+29028>>2];y=k;v=e+m|0;d=(e<<3)+l|0;B=L[q+29096>>3];C=L[q+29088>>3];c=B==1&C==0x8000000000000000;q:{if(!z){if(c){if((t|0)<=0){break q}u=0;c=0;if(t-1>>>0>=3){v=t&-4;p=0;while(1){s=c<<3;r=j+s|0;L[s+d>>3]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;r=s|8;I=r+d|0;r=j+r|0;L[I>>3]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;r=s|16;I=r+d|0;r=j+r|0;L[I>>3]=+J[r>>2]+ +((G[r+4>>2]^-2147483648)>>>0)*4294967296;s=s|24;r=s+d|0;s=j+s|0;L[r>>3]=+J[s>>2]+ +((G[s+4>>2]^-2147483648)>>>0)*4294967296;c=c+4|0;p=p+4|0;if((v|0)!=(p|0)){continue}break}}p=t&3;if(!p){break q}while(1){s=c<<3;r=s+d|0;s=j+s|0;L[r>>3]=+J[s>>2]+ +((G[s+4>>2]^-2147483648)>>>0)*4294967296;c=c+1|0;u=u+1|0;if((p|0)!=(u|0)){continue}break}break q}if(!(B==1&C==0)){if((t|0)<=0){break q}c=0;if((t|0)!=1){s=t&-2;p=0;while(1){u=c<<3;v=j+u|0;L[u+d>>3]=(+J[v>>2]+ +G[v+4>>2]*4294967296)*B+C;u=u|8;r=u+d|0;u=j+u|0;L[r>>3]=(+J[u>>2]+ +G[u+4>>2]*4294967296)*B+C;c=c+2|0;p=p+2|0;if((s|0)!=(p|0)){continue}break}}if(!(t&1)){break q}c=c<<3;d=c+d|0;c=c+j|0;L[d>>3]=(+J[c>>2]+ +G[c+4>>2]*4294967296)*B+C;break q}if((t|0)<=0){break q}u=0;c=0;if(t-1>>>0>=3){v=t&-4;p=0;while(1){s=c<<3;r=j+s|0;L[s+d>>3]=+J[r>>2]+ +G[r+4>>2]*4294967296;r=s|8;I=r+d|0;r=j+r|0;L[I>>3]=+J[r>>2]+ +G[r+4>>2]*4294967296;r=s|16;I=r+d|0;r=j+r|0;L[I>>3]=+J[r>>2]+ +G[r+4>>2]*4294967296;s=s|24;r=s+d|0;s=j+s|0;L[r>>3]=+J[s>>2]+ +G[s+4>>2]*4294967296;c=c+4|0;p=p+4|0;if((v|0)!=(p|0)){continue}break}}p=t&3;if(!p){break q}while(1){s=c<<3;r=s+d|0;s=j+s|0;L[r>>3]=+J[s>>2]+ +G[s+4>>2]*4294967296;c=c+1|0;u=u+1|0;if((p|0)!=(u|0)){continue}break}break q}if(c){if((t|0)<=0){break q}c=0;while(1){p=c<<3;r=p+j|0;w=G[r>>2];r=G[r+4>>2];r:{if((w|0)==(u|0)&(r|0)==(s|0)){G[n>>2]=1;if((z|0)==1){L[d+p>>3]=y;break r}E[c+v|0]=1;break r}L[d+p>>3]=+(w>>>0)+ +((r^-2147483648)>>>0)*4294967296}c=c+1|0;if((t|0)!=(c|0)){continue}break}break q}s:{if(!(B==1&C==0)){if((t|0)<=0){break q}if((z|0)==1){break s}c=0;while(1){p=c<<3;r=p+j|0;w=G[r>>2];r=G[r+4>>2];t:{if((w|0)==(u|0)&(r|0)==(s|0)){G[n>>2]=1;E[c+v|0]=1;break t}L[d+p>>3]=(+(w>>>0)+ +(r|0)*4294967296)*B+C}c=c+1|0;if((t|0)!=(c|0)){continue}break}break q}if((t|0)<=0){break q}if((z|0)!=1){c=0;if((t|0)!=1){r=t&-2;p=0;while(1){w=c<<3;x=w+j|0;D=G[x>>2];x=G[x+4>>2];u:{if((D|0)==(u|0)&(x|0)==(s|0)){G[n>>2]=1;E[c+v|0]=1;break u}L[d+w>>3]=+(D>>>0)+ +(x|0)*4294967296}w=c|1;x=w<<3;D=x+j|0;P=G[D>>2];D=G[D+4>>2];v:{if((P|0)!=(u|0)|(D|0)!=(s|0)){L[d+x>>3]=+(P>>>0)+ +(D|0)*4294967296;break v}G[n>>2]=1;E[v+w|0]=1}c=c+2|0;p=p+2|0;if((r|0)!=(p|0)){continue}break}}if(!(t&1)){break q}r=u;p=j;j=c<<3;p=p+j|0;u=G[p>>2];p=G[p+4>>2];if((r|0)!=(u|0)|(p|0)!=(s|0)){L[d+j>>3]=+(u>>>0)+ +(p|0)*4294967296;break q}G[n>>2]=1;E[c+v|0]=1;break q}c=0;if((t|0)!=1){v=t&-2;p=0;while(1){r=c<<3;w=r+j|0;x=G[w>>2];w=G[w+4>>2];w:{if((x|0)!=(u|0)|(w|0)!=(s|0)){A=+(x>>>0)+ +(w|0)*4294967296;break w}G[n>>2]=1;A=y}L[d+r>>3]=A;r=(c|1)<<3;w=r+j|0;x=G[w>>2];w=G[w+4>>2];x:{if((x|0)!=(u|0)|(w|0)!=(s|0)){A=+(x>>>0)+ +(w|0)*4294967296;break x}G[n>>2]=1;A=y}L[d+r>>3]=A;c=c+2|0;p=p+2|0;if((v|0)!=(p|0)){continue}break}}if(!(t&1)){break q}j=j+(c<<3)|0;p=G[j>>2];j=G[j+4>>2];y:{if((p|0)!=(u|0)|(j|0)!=(s|0)){y=+(p>>>0)+ +(j|0)*4294967296;break y}G[n>>2]=1}L[d+(c<<3)>>3]=y;break q}c=0;if((t|0)!=1){v=t&-2;p=0;while(1){r=c<<3;w=r+j|0;x=G[w>>2];w=G[w+4>>2];z:{if((x|0)!=(u|0)|(w|0)!=(s|0)){A=(+(x>>>0)+ +(w|0)*4294967296)*B+C;break z}G[n>>2]=1;A=y}L[d+r>>3]=A;r=(c|1)<<3;w=r+j|0;x=G[w>>2];w=G[w+4>>2];A:{if((x|0)!=(u|0)|(w|0)!=(s|0)){A=(+(x>>>0)+ +(w|0)*4294967296)*B+C;break A}G[n>>2]=1;A=y}L[d+r>>3]=A;c=c+2|0;p=p+2|0;if((v|0)!=(p|0)){continue}break}}if(!(t&1)){break q}j=j+(c<<3)|0;p=G[j>>2];j=G[j+4>>2];B:{if((p|0)!=(u|0)|(j|0)!=(s|0)){y=(+(p>>>0)+ +(j|0)*4294967296)*B+C;break B}G[n>>2]=1}L[d+(c<<3)>>3]=y}break g}c=q- -64|0;Uc(a,s,j,t,v,c,o);bl(c,t,L[q+29096>>3],L[q+29088>>3],z,k,e+m|0,n,(e<<3)+l|0);break g}Jb(a,s,j,0,o);c=G[q+29060>>2];d=G[q+29064>>2];C:{if((c|0)==(d|0)){c=M(c,t);ic(a,c,c>>31,q- -64|0,o);break C}Rd(a,d,t,c-d|0,q- -64|0,o)}u=q- -64|0;B=L[q+29096>>3];C=L[q+29088>>3];V=G[q+29064>>2];W=e+m|0;x=(e<<3)+l|0;r=0;v=Fa-112|0;Fa=v;D=q+28864|0;X=Va(D);if((t|0)>0){while(1){D:{d=u+V|0;P=H[d|0];E[d|0]=0;j=u;E:{F:{if(H[D|0]==1){break F}if(fb(D,u,X)){break F}j=d;if(!z){break E}G[n>>2]=1;if((z|0)==1){L[(r<<3)+x>>3]=k;break E}E[r+W|0]=1;break E}while(1){c=H[j|0];if((c|0)==32){j=j+1|0;continue}break}T=1;G:{switch(c-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};T=(c|0)==45?-1:1;c=p;break;default:break G}}A=0;if((c-48&255)>>>0<10){while(1){y=A*10+ +(c<<24>>24);p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}A=y+-48;if((c-48&255)>>>0<=9){continue}break}}y=N;H:{I:{switch(c-44|0){case 0:case 2:break I;default:break H}}p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}y=1;if((c-48&255)>>>0>=10){break H}while(1){A=A*10+ +(c<<24>>24)+-48;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}y=y*10;if((c-48&255)>>>0<=9){continue}break}}J:{if((c&254)!=68){w=1;p=0;break J}while(1){w=1;p=j;j=j+1|0;c=H[p+1|0];if((c|0)==32){continue}break}K:{switch(c-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=j+1|0;s=H[j|0];if((s|0)==32){continue}break};w=(c|0)==45?-1:1;c=s;break;default:break K}}p=0;if((c-48&255)>>>0>=10){break J}while(1){s=c;I=M(p,10)-48|0;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}p=I+(s<<24>>24)|0;if((c-48&255)>>>0<=9){continue}break}}if(c){G[v+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[v+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[v+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[v+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[v+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[v+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[v+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[v+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[v+20>>2]=c;c=v+16|0;Ua(c);G[v>>2]=u;Ya(c,81,43022,v);Ua(c);E[d|0]=P;G[o>>2]=409;break D}Y=(r<<3)+x|0,Z=A*+(T|0)/y*$b(10,+(M(p,w)|0))*B+C,L[Y>>3]=Z}u=j;E[d|0]=P;r=r+1|0;if((r|0)!=(t|0)){continue}}break}}Fa=v+112|0;break g}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8924,q);Ua(a);p=311;if(G[q+29080>>2]==1){break e}p=312;break e}c=q- -64|0;$d(a,s,j,t,v,c,o);eq(c,t,L[q+29096>>3],L[q+29088>>3],z,H[q+29024|0],k,e+m|0,n,(e<<3)+l|0)}p=G[o>>2];if((p|0)>0){y=+(e>>>0)+ +(f|0)*4294967296;k=y+1;y=y+ +(t|0);L:{if(G[q+29080>>2]>0){G[q+32>>2]=b;L[q+24>>3]=y;L[q+16>>3]=k;Ya(q+28896|0,81,47713,q+16|0);break L}L[q+56>>3]=y;L[q+48>>3]=k;Ya(q+28896|0,81,47654,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}c=t;j=c>>31;u=c;h=h-((g>>>0>>0)+j|0)|0;g=g-c|0;if(h|g){c=M(i,t);p=c;d=c+G[q+29032>>2]|0;c=G[q+29036>>2]+(c>>31)|0;c=d>>>0

>>0?c+1|0:c;G[q+29032>>2]=d;p=c;G[q+29036>>2]=c;c=f+j|0;u=e+u|0;c=u>>>0>>0?c+1|0:c;e=u;f=c;t=G[q+29052>>2];c=t;r=G[q+29048>>2];if((p|0)>=(c|0)&d>>>0>=r>>>0|(c|0)<(p|0)){c=Bu(d,p,r,t);j=c>>31;s=c;u=O+c|0;c=j+Q|0;c=u>>>0>>0?c+1|0:c;O=u;Q=c;c=Au(s,j,r,t);G[q+29032>>2]=d-c;G[q+29036>>2]=p-(Ia+(c>>>0>d>>>0)|0);continue}if((p|0)>0|(p|0)>=0){continue}c=Bu(d^-1,p^-1,r,t);c=c+1|0;j=c>>31;u=O;O=u-c|0;Q=Q-((c>>>0>u>>>0)+j|0)|0;j=Au(c,j,r,t)+d|0;c=p+Ia|0;G[q+29032>>2]=j;G[q+29036>>2]=d>>>0>j>>>0?c+1|0:c;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function ao(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-192|0;Fa=e;if(G[d>>2]<=0){G[e+92>>2]=0;f=G[a>>2];if((f|0)!=G[G[a+4>>2]+76>>2]){mb(a,f+1|0,0,d)}f=b+1|0;a:{b:{switch(H[b+1|0]-66|0){case 18:if(fb(f,35418,4)){break a}G[48624]=0;G[e+80>>2]=0;d=b+5|0;i=e,j=nc(d,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){b=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);f=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=f;F[e+144>>1]=f>>>16;F[e+146>>1]=b;F[e+148>>1]=b>>>16;b=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=b;b=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=b;b=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=b;b=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=b;b=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=b;b=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=b;tb(5,qb(e+96|0,d,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}b=G[e+80>>2];if((b|0)<=0){break a}a=G[a+4>>2];if((b|0)>G[a+936>>2]){break a}a=G[a+968>>2];if((fd(c,e+96|0,e+92|0)|0)>0){break a}Za((a+M(b,160)|0)-160|0,e+96|0);break a;case 4:if(fb(f,34642,4)){break a}G[48624]=0;G[e+80>>2]=0;f=b+5|0;i=e,j=nc(f,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){b=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);g=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=g;F[e+144>>1]=g>>>16;F[e+146>>1]=b;F[e+148>>1]=b>>>16;b=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=b;b=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=b;b=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=b;b=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=b;b=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=b;b=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=b;tb(5,qb(e+96|0,f,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}b=G[e+80>>2];if((b|0)<=0){break a}f=G[a+4>>2];if((b|0)>G[f+936>>2]){break a}f=G[f+968>>2];if((fd(c,e+96|0,e+92|0)|0)>0){break a}b=(f+M(b,160)|0)-160|0;i=rb(b+140|0,e+96|0,9),j=0,E[i+9|0]=j;if(G[G[a+4>>2]+80>>2]==1){if((Gd(e+96|0,e+72|0,e+84|0,e+88|0,d)|0)>0){break a}G[b+88>>2]=1;G[b+92>>2]=0;G[b+80>>2]=16;G[b+152>>2]=G[e+84>>2];break a}if((Vf(e+96|0,e+72|0,e+88|0,e+84|0,d)|0)>0){break a}G[b+80>>2]=G[e+72>>2];a=G[e+88>>2];G[b+88>>2]=a;G[b+92>>2]=a>>31;if(G[e+72>>2]==16){c=G[b+152>>2];if((a|0)>=(c|0)?c:0){break a}G[b+152>>2]=G[e+84>>2];break a}G[b+152>>2]=G[e+84>>2];break a;case 0:if(fb(f,34750,4)){break a}G[48624]=0;G[e+80>>2]=0;g=b+5|0;i=e,j=nc(g,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){f=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);h=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=h;F[e+144>>1]=h>>>16;F[e+146>>1]=f;F[e+148>>1]=f>>>16;f=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=f;f=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=f;f=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=f;f=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=f;f=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=f;f=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=f;tb(5,qb(e+96|0,g,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}f=G[e+80>>2];if((f|0)<=0){break a}a=G[a+4>>2];if((f|0)>G[a+936>>2]|G[a+80>>2]==2){break a}a=G[a+968>>2];if((ue(c,e+72|0,d)|0)>0){G[e+4>>2]=c;G[e>>2]=b;a=e+96|0;Ya(a,81,9527,e);tb(5,a);break a}a=(a+M(f,160)|0)-160|0;b=G[e+72>>2]-1|0;G[a+72>>2]=b;G[a+76>>2]=b>>31;break a;case 17:if(fb(f,34839,4)){break a}G[48624]=0;G[e+80>>2]=0;f=b+5|0;i=e,j=nc(f,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){d=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);g=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=g;F[e+144>>1]=g>>>16;F[e+146>>1]=d;F[e+148>>1]=d>>>16;d=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=d;d=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=d;d=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=d;d=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=d;d=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=d;d=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=d;tb(5,qb(e+96|0,f,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}d=G[e+80>>2];if((d|0)<=0){break a}a=G[a+4>>2];if((d|0)>G[a+936>>2]){break a}a=G[a+968>>2];if((me(c,e+72|0,e+92|0)|0)>0){G[e+20>>2]=c;G[e+16>>2]=b;a=e+96|0;Ya(a,81,9932,e+16|0);tb(5,a);break a}L[(a+M(d,160)|0)+-64>>3]=L[e+72>>3];break a;case 24:if(fb(f,34378,4)){break a}G[48624]=0;G[e+80>>2]=0;f=b+5|0;i=e,j=nc(f,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){d=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);g=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=g;F[e+144>>1]=g>>>16;F[e+146>>1]=d;F[e+148>>1]=d>>>16;d=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=d;d=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=d;d=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=d;d=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=d;d=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=d;d=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=d;tb(5,qb(e+96|0,f,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}d=G[e+80>>2];if((d|0)<=0){break a}a=G[a+4>>2];if((d|0)>G[a+936>>2]){break a}a=G[a+968>>2];if((me(c,e+72|0,e+92|0)|0)>0){G[e+36>>2]=c;G[e+32>>2]=b;a=e+96|0;Ya(a,81,9932,e+32|0);tb(5,a);break a}L[(a+M(d,160)|0)-56>>3]=L[e+72>>3];break a;case 12:if(fb(f,34769,4)){break a}G[48624]=0;G[e+80>>2]=0;f=b+5|0;i=e,j=nc(f,e+72|0,10),G[i+80>>2]=j;if((H[G[e+72>>2]]|32)!=32){G[e+92>>2]=407}if(G[48624]==68){d=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);g=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[e+142>>1]=g;F[e+144>>1]=g>>>16;F[e+146>>1]=d;F[e+148>>1]=d>>>16;d=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[e+136>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[e+140>>2]=d;d=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[e+128>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[e+132>>2]=d;d=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[e+120>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[e+124>>2]=d;d=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[e+112>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[e+116>>2]=d;d=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[e+104>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[e+108>>2]=d;d=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[e+96>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[e+100>>2]=d;tb(5,qb(e+96|0,f,25));G[e+92>>2]=412;G[48624]=0}if(G[e+92>>2]>0){break a}d=G[e+80>>2];if((d|0)<=0){break a}f=G[a+4>>2];if((d|0)>G[f+936>>2]){break a}a=(G[f+968>>2]+M(d,160)|0)-160|0;if(G[f+80>>2]==1){if((fd(c,e+96|0,e+92|0)|0)>0){break a}i=rb(a+120|0,e+96|0,17),j=0,E[i+17|0]=j;break a}if((yi(c,e+72|0,e+92|0)|0)>0){G[e+52>>2]=c;G[e+48>>2]=b;a=e+96|0;Ya(a,81,9527,e+48|0);tb(5,a);break a}b=G[e+76>>2];G[a+112>>2]=G[e+72>>2];G[a+116>>2]=b;break a;case 2:if(fb(f,34662,3)|G[G[a+4>>2]+80>>2]==1){break a}if((ue(b+4|0,e+80|0,e+92|0)|0)>0){break a}b=G[e+80>>2];if((b|0)<=0){break a}a=G[a+4>>2];if((b|0)>G[a+936>>2]){break a}a=(G[a+968>>2]+M(b,160)|0)-160|0;b=G[a+80>>2];if((b|0)!=16&(b|0)!=-9999){break a}b=jb(c,40);if(!b){break a}b=b+1|0;G[e+96>>2]=b;b=nc(b,e+96|0,10);G[e+84>>2]=b;c=G[a+88>>2];d=c;f=(d|0)!=1;c=G[a+92>>2];g=b>>>0>d>>>0;d=b>>31;if((f|(c|0)!=0)&(g&(d|0)>=(c|0)|(c|0)<(d|0))){break a}G[a+152>>2]=b;break a;case 6:break b;default:break a}}if(fb(f,34351,4)|G[G[a+4>>2]+80>>2]==1){break a}if((yi(c,e+72|0,e+92|0)|0)>0){G[e+68>>2]=c;G[e+64>>2]=b;a=e+96|0;Ya(a,81,9527,e- -64|0);tb(5,a);break a}b=G[e+76>>2];a=G[a+4>>2];G[a+976>>2]=G[e+72>>2];G[a+980>>2]=b}}Fa=e+192|0}function md(a,b,c,d,e,f,g,h,i,j,k){var 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,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,Va=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=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;l=Fa-400|0;Fa=l;G[l+12>>2]=0;a:{if(G[k>>2]>0){break a}if(!Nb(a,k)){Ua(59600);G[k>>2]=414;break a}b:{c:{d:{switch(b-20|0){case 1:A=2;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<1);if(g){break c}q=0;break b;case 11:A=4;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<2);q=0;if(!g){break b}q=+G[g>>2];break b;case 21:A=4;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<2);q=0;if(!g){break b}q=+G[g>>2];break b;case 22:A=4;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<2);q=0;if(!g){break b}q=+K[g>>2];break b;case 62:A=8;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<3);q=0;if(!g){break b}q=L[g>>3];break b;case 0:A=2;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<1);q=0;if(!g){break b}q=+I[g>>1];break b;case 10:A=4;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<2);q=0;if(!g){break b}q=+J[g>>2];break b;case 20:A=4;s=G[a+4>>2];o=G[s+1136>>2];w=ab(o<<2);q=0;if(!g){break b}q=+J[g>>2];break b;default:break d}}A=1;if(b-11>>>0<=1){s=G[a+4>>2];o=G[s+1136>>2];w=ab(o);q=0;if(!g){break b}q=+H[g|0];break b}Ua(24407);G[k>>2]=410;break a}q=+F[g>>1]}e:{if(!w){Ua(59502);break e}f:{ba=(f|0)==1?q==0?0:f:f;if((ba|0)!=2){break f}ca=lb(o,1);if(ca){break f}Ua(59502);Wa(w);break e}O=1;G[l+272>>2]=1;G[l+304>>2]=1;G[l+308>>2]=1;G[l+240>>2]=1;G[l+244>>2]=1;G[l+208>>2]=1;G[l+212>>2]=1;G[l+112>>2]=1;G[l+116>>2]=1;G[l+312>>2]=1;G[l+276>>2]=1;G[l+280>>2]=1;G[l+248>>2]=1;G[l+252>>2]=1;G[l+216>>2]=1;G[l+220>>2]=1;G[l+120>>2]=1;G[l+124>>2]=1;G[l+316>>2]=1;G[l+320>>2]=1;G[l+284>>2]=1;G[l+288>>2]=1;G[l+324>>2]=1;G[l+292>>2]=1;G[l+256>>2]=1;G[l+260>>2]=1;G[l+224>>2]=1;G[l+228>>2]=1;G[l+128>>2]=1;G[l+132>>2]=1;N=G[s+1108>>2];if((N|0)>0){f=0;while(1){B=f<<2;n=G[B+e>>2];U=0-n|0;x=n;n=f<<3;p=n+c|0;v=G[p>>2];n=d+n|0;r=G[n>>2];p=G[p+4>>2];n=G[n+4>>2];o=v>>>0>r>>>0&(p|0)>=(n|0)|(n|0)<(p|0);G[B+(l+16|0)>>2]=o?U:x;o=o?v:r;G[B+(l+48|0)>>2]=o;r=r>>>0>v>>>0&(n|0)>=(p|0)|(n|0)>(p|0)?v:r;G[B+(l+80|0)>>2]=r;n=s+B|0;p=G[n+1112>>2];G[B+(l+304|0)>>2]=p;if((r|0)<=0){if((ba|0)==2){Wa(ca)}Wa(w);G[k>>2]=321;break a}v=G[n+1052>>2];G[B+(l+272|0)>>2]=v;G[B+(l+112|0)>>2]=O;G[B+(l+240|0)>>2]=((r-1|0)/(v|0)|0)+1;n=((o-1|0)/(v|0)|0)+1|0;p=((p-1|0)/(v|0)|0)+1|0;G[B+(l+208|0)>>2]=(n|0)<(p|0)?n:p;O=M(p,O);f=f+1|0;if((N|0)!=(f|0)){continue}break}}if(j){G[j>>2]=0}Q=G[l+228>>2];V=G[l+260>>2];g:{if((Q|0)<(V|0)){break g}R=G[l+324>>2];S=G[l+292>>2];W=G[l+224>>2];Ba=G[l+256>>2];if((W|0)<(Ba|0)){a=M(S,Q);G[l+164>>2]=(a|0)<(R|0)?a:R;G[l+196>>2]=M(Q-1|0,S)+1;break g}X=G[l+320>>2];Y=G[l+288>>2];Z=G[l+220>>2];Ca=G[l+252>>2];if((Z|0)<(Ca|0)){a=M(S,Q);G[l+164>>2]=(a|0)<(R|0)?a:R;G[l+196>>2]=M(Q-1|0,S)+1;G[l+192>>2]=M(W-1|0,Y)+1;a=M(Y,W);G[l+160>>2]=(a|0)<(X|0)?a:X;break g}_=G[l+316>>2];$=G[l+284>>2];ka=G[l+216>>2];B=G[l+248>>2];if((ka|0)>=(B|0)){Da=G[l+304>>2];Ea=G[l+272>>2];Ga=G[l+208>>2];Ha=G[l+240>>2];Va=G[l+116>>2];Ia=G[l+244>>2];Xa=G[l+120>>2];Ya=G[l+124>>2];Za=G[l+128>>2];_a=G[l+132>>2];la=G[l+280>>2];c=M(la,ka);ma=G[l+312>>2];Ja=(c|0)<(ma|0)?c:ma;c=M($,Z);$a=(c|0)<(_|0)?c:_;na=G[l+276>>2];oa=G[l+212>>2];c=M(na,oa);pa=G[l+308>>2];cb=(c|0)<(pa|0)?c:pa;Ka=M(ka-1|0,la)+1|0;db=M(Z-1|0,$)+1|0;eb=M(oa-1|0,na)+1|0;while(1){e=V-1|0;d=M(e,S);G[l+196>>2]=d+1;c=M(S,V);c=(c|0)<(R|0)?c:R;G[l+164>>2]=c;fb=c-d|0;gb=M(e,_a);e=Ba;while(1){f=e-1|0;d=M(f,Y);G[l+192>>2]=d+1;c=M(e,Y);c=(c|0)<(X|0)?c:X;G[l+160>>2]=c;h:{if((oa|0)>=(Ia|0)){hb=M(c-d|0,fb);ib=M(f,Za)+gb|0;s=Ca;while(1){f=s-1|0;d=M(f,$);G[l+188>>2]=d+1;c=M(s,$);c=(c|0)<(_|0)?c:_;G[l+156>>2]=c;i:{if((Ga|0)>=(Ha|0)){jb=M(c-d|0,hb);kb=M(f,Ya)+ib|0;U=B;while(1){f=U-1|0;d=M(f,la);G[l+184>>2]=d+1;c=M(U,la);c=(c|0)<(ma|0)?c:ma;G[l+152>>2]=c;mb=M(c-d|0,jb);nb=M(f,Xa)+kb|0;O=Ia;while(1){f=O-1|0;d=M(f,na);G[l+180>>2]=d+1;c=M(O,na);c=(c|0)<(pa|0)?c:pa;G[l+148>>2]=c;ob=M(c-d|0,mb);pb=M(f,Va)+nb|0;c=Ha;while(1){d=M(c,Ea);x=(d|0)<(Da|0)?d:Da;G[l+144>>2]=x;v=M(c-1|0,Ea);G[l+176>>2]=v+1;d=0;j:{k:{if(!((N|0)<=0|G[k>>2]>0)){while(1){u=d<<2;o=G[u+(l+144|0)>>2];z=G[u+(l+80|0)>>2];if((o|0)<(z|0)){break j}C=G[u+(l+176|0)>>2];n=G[u+(l+48|0)>>2];if((C|0)>(n|0)){break j}f=G[u+(l+16|0)>>2];p=f>>31;r=u+(l+368|0)|0;D=(f^p)-p|0;f=(n-z|0)/(D|0)|0;p=f+1|0;G[r>>2]=p;if((f|0)<0){break k}P=u+(l+336|0)|0;n=o-C|0;f=n+1|0;G[P>>2]=f;if((n|0)<0){break k}if(d){G[P>>2]=M(f,G[(l+u|0)+332>>2])}aa=z-1|0;f=o-1|0;o=C-1|0;while(1){if((o-aa|0)%(D|0)|0){n=(f|0)>(o|0);o=o+1|0;if(n){continue}break j}break}while(1){if((f-aa|0)%(D|0)|0){n=(f|0)>(o|0);f=f-1|0;if(n){continue}break j}break}f=z-C|0;o=(f|0)>0?f:0;f=C-z|0;while(1){if((f+o|0)%(D|0)|0){o=o+1|0;if((o|0)>2]){continue}break j}break}if(d){G[r>>2]=M(p,G[(l+u|0)+364>>2])}d=d+1|0;if((N|0)!=(d|0)){continue}break}}so(a,c+pb|0,M(x-v|0,ob),b,ba,g,w,ca,l+12|0,k);if(!(!j|!G[l+12>>2])){G[j>>2]=1}da=l+176|0;aa=l+144|0;ea=l+80|0;v=l+48|0;r=l+16|0;d=0;x=0;fa=0;E=0;ga=0;m=Fa-192|0;Fa=m;l:{if(G[k>>2]>0){break l}G[m+112>>2]=0;G[m+116>>2]=0;G[m+80>>2]=0;G[m+84>>2]=0;G[m+48>>2]=0;G[m+52>>2]=0;G[m+104>>2]=0;G[m+108>>2]=0;G[m+96>>2]=0;G[m+100>>2]=0;G[m+64>>2]=0;G[m+68>>2]=0;G[m+72>>2]=0;G[m+76>>2]=0;G[m+32>>2]=0;G[m+36>>2]=0;G[m+40>>2]=0;G[m+44>>2]=0;T=1;G[m>>2]=1;G[m+160>>2]=1;G[m+128>>2]=1;G[m+132>>2]=1;G[m+4>>2]=1;G[m+8>>2]=1;G[m+164>>2]=1;G[m+168>>2]=1;G[m+136>>2]=1;G[m+12>>2]=1;G[m+172>>2]=1;G[m+140>>2]=1;G[m+144>>2]=1;G[m+16>>2]=1;G[m+20>>2]=1;G[m+176>>2]=1;G[m+180>>2]=1;G[m+148>>2]=1;m:{n:{if((N|0)<=0){t=1;break n}while(1){y=E<<2;P=G[y+aa>>2];u=G[y+ea>>2];if((P|0)<(u|0)){break l}C=G[y+da>>2];d=G[y+v>>2];if((C|0)>(d|0)){break l}f=G[r+y>>2];G[m+y>>2]=f;o=y+(m+160|0)|0;n=d-u|0;d=f>>31;z=(d^f)-d|0;D=(n|0)/(z|0)|0;p=D+1|0;G[o>>2]=p;if((D|0)<0){break m}x=y+(m+128|0)|0;f=P-C|0;d=f+1|0;G[x>>2]=d;if((f|0)<0){break m}if(E){G[x>>2]=M(d,G[(m+y|0)+124>>2])}n=u-1|0;t=P-1|0;d=C-1|0;while(1){if((d-n|0)%(z|0)|0){f=(d|0)<(t|0);d=d+1|0;if(f){continue}break l}break}while(1){if((t-n|0)%(z|0)|0){f=(d|0)<(t|0);t=t-1|0;if(f){continue}break l}break}n=1-u|0;f=(n+t|0)/(z|0)|0;G[y+(m- -64|0)>>2]=(f|0)<(D|0)?f:D;d=(d+n|0)/(z|0)|0;G[y+(m+96|0)>>2]=(d|0)>0?d:0;d=u-C|0;d=(d|0)>0?d:0;f=C-u|0;n=y+(m+32|0)|0;o:{while(1){if(!((d+f|0)%(z|0)|0)){break o}d=d+1|0;if((d|0)>2]){continue}break}G[n>>2]=d;break l}G[n>>2]=d;if(E){G[o>>2]=M(p,G[(m+y|0)+156>>2])}E=E+1|0;if((N|0)!=(E|0)){continue}break}x=G[m+96>>2];E=G[m+64>>2];fa=G[m+112>>2];d=G[m+80>>2];t=G[m>>2];if((t|0)!=1){break n}T=(E-x|0)+1|0}if((d|0)<(fa|0)){break l}n=G[m+76>>2];qa=G[m+108>>2];if((n|0)<(qa|0)){break l}La=M(A,T);f=(t|0)>0;Ma=f?T:0-T|0;ta=G[m+160>>2];qb=f?x:ta+(x^-1)|0;ua=G[m+4>>2];f=ua>>31;rb=(f^ua)-f|0;va=G[m+8>>2];f=va>>31;sb=(f^va)-f|0;wa=G[m+12>>2];f=wa>>31;tb=(f^wa)-f|0;xa=G[m+16>>2];f=xa>>31;ub=(f^xa)-f|0;f=t>>31;Na=M((f^t)-f|0,T);vb=G[m+128>>2];wb=G[m+32>>2];Oa=G[m+36>>2];xb=G[m+132>>2];ya=G[m+164>>2];Pa=G[m+40>>2];yb=G[m+136>>2];za=G[m+168>>2];Qa=G[m+44>>2];zb=G[m+140>>2];Aa=G[m+172>>2];Ab=G[m+176>>2];Ra=G[m+48>>2];Bb=(d-fa|0)+1|0;Cb=(n-qa|0)+1|0;Sa=G[m+72>>2];ra=G[m+104>>2];Db=(Sa-ra|0)+1|0;Ta=G[m+68>>2];sa=G[m+100>>2];Eb=(Ta-sa|0)+1|0;Fb=(N|0)<5;Gb=(N|0)<4;Hb=(N|0)<3;Ib=(N|0)<2;y=(ba|0)!=2;d=0;while(1){p:{if(Fb){f=d;break p}p=G[ea+16>>2];n=G[da+16>>2];while(1){f=d;d=d+1|0;if((((f+n|0)+Ra|0)-p|0)%(ub|0)|0){continue}break}}v=(xa|0)>0?M(fa+ga|0,Aa):Ab-M((fa+ga|0)+1|0,Aa)|0;u=M(f+Ra|0,zb);ha=0;d=0;while(1){q:{if(Gb){o=d;break q}p=G[ea+12>>2];n=G[da+12>>2];while(1){o=d;d=d+1|0;if((((n+o|0)+Qa|0)-p|0)%(tb|0)|0){continue}break}}d=(wa|0)>0?M(za,ha+qa|0):Aa-M(za,(ha+qa|0)+1|0)|0;if((ra|0)<=(Sa|0)){z=d+v|0;C=M(o+Qa|0,yb)+u|0;ia=0;d=0;while(1){r:{if(Hb){p=d;break r}r=G[ea+8>>2];n=G[da+8>>2];while(1){p=d;d=d+1|0;if((((n+p|0)+Pa|0)-r|0)%(sb|0)|0){continue}break}}d=(va|0)>0?M(ya,ia+ra|0):za-M(ya,(ia+ra|0)+1|0)|0;if((sa|0)<=(Ta|0)){D=d+z|0;P=(M(p+Pa|0,xb)+C|0)+wb|0;ja=0;d=0;while(1){s:{if(Ib){n=d;break s}aa=G[ea+4>>2];r=G[da+4>>2];while(1){n=d;d=d+1|0;if((((n+r|0)+Oa|0)-aa|0)%(rb|0)|0){continue}break}}r=(ua|0)>0?M(ja+sa|0,ta):ya-M((ja+sa|0)+1|0,ta)|0;t:{if((x|0)>(E|0)){break t}d=M(n+Oa|0,vb)+P|0;t=(r+D|0)+qb|0;r=x;if(!y){while(1){bb(i+t|0,d+ca|0,T);bb(M(t,A)+h|0,M(d,A)+w|0,La);t=t+Ma|0;d=d+Na|0;r=r+T|0;if((E|0)>=(r|0)){continue}break t}}while(1){bb(M(t,A)+h|0,M(d,A)+w|0,La);t=t+Ma|0;d=d+Na|0;r=r+T|0;if((E|0)>=(r|0)){continue}break}}d=n+1|0;ja=ja+1|0;if((Eb|0)!=(ja|0)){continue}break}}d=p+1|0;ia=ia+1|0;if((Db|0)!=(ia|0)){continue}break}}d=o+1|0;ha=ha+1|0;if((Cb|0)!=(ha|0)){continue}break}d=f+1|0;ga=ga+1|0;if((Bb|0)!=(ga|0)){continue}break}break l}G[k>>2]=323}Fa=m+192|0;break j}G[k>>2]=323}d=(c|0)!=(Ga|0);c=c+1|0;if(d){continue}break}c=(O|0)!=(oa|0);O=O+1|0;if(c){continue}break}c=(U|0)!=(ka|0);U=U+1|0;if(c){continue}break}break i}G[l+152>>2]=Ja;G[l+184>>2]=Ka;G[l+180>>2]=eb;G[l+148>>2]=cb}c=(s|0)!=(Z|0);s=s+1|0;if(c){continue}break}break h}G[l+156>>2]=$a;G[l+188>>2]=db;G[l+184>>2]=Ka;G[l+152>>2]=Ja}c=(e|0)!=(W|0);e=e+1|0;if(c){continue}break}c=(Q|0)!=(V|0);V=V+1|0;if(c){continue}break}break g}a=M(S,Q);G[l+164>>2]=(a|0)<(R|0)?a:R;G[l+196>>2]=M(Q-1|0,S)+1;G[l+192>>2]=M(W-1|0,Y)+1;a=M(Y,W);G[l+160>>2]=(a|0)<(X|0)?a:X;G[l+188>>2]=M(Z-1|0,$)+1;a=M($,Z);G[l+156>>2]=(a|0)<(_|0)?a:_}if((ba|0)==2){Wa(ca)}Wa(w);break a}G[k>>2]=113}Fa=l+400|0}function zh(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}c=0;d=0;while(1){e=G[l+29096>>2];k=e;e=e>>31;r=G[l+29072>>2];q=G[l+29076>>2];f=G[l+29068>>2];m=G[l+29064>>2];o=Au(G[l+29048>>2],G[l+29052>>2],x,y);m=m+o|0;f=Ia+f|0;f=m>>>0>>0?f+1|0:f;u=m;m=G[l+29056>>2];s=G[l+29060>>2];o=G[l+29084>>2];n=Au(m,s,o,o>>31);o=u+n|0;f=Ia+f|0;Jb(a,o,o>>>0>>0?f+1|0:f,1,j);k=g>>>0>>0&(e|0)>=(h|0)|(e|0)>(h|0)?g:k;e=k;f=e>>31;e=q-((m>>>0>r>>>0)+s|0)|0;r=r-m|0;m=r;r=k>>>0>>0&(e|0)>=(f|0)|(e|0)>(f|0);m=r?k:m;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{e=G[l+29100>>2];switch(e-11|0){case 30:break g;case 0:break h;case 10:break i;case 31:break j;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break m;case 5:break n;default:break o}}p:{switch(e-81|0){case 1:break k;case 0:break p;default:break m}}s=(c<<3)+i|0;v=L[l+29032>>3];e=v!=1;t=L[l+29024>>3];if(!(e|t!=0x8000000000000000)){if((m|0)<=0){break e}q=0;k=0;if(m-1>>>0>=3){n=m&-4;o=0;while(1){e=k<<3;f=l+32|0;r=e+f|0;u=e+s|0;w=G[u>>2];u=G[u+4>>2]^-2147483648;G[r>>2]=w;G[r+4>>2]=u;r=e|8;u=r+f|0;r=r+s|0;w=G[r>>2];r=G[r+4>>2]^-2147483648;G[u>>2]=w;G[u+4>>2]=r;r=e|16;u=r+f|0;r=r+s|0;w=G[r>>2];r=G[r+4>>2]^-2147483648;G[u>>2]=w;G[u+4>>2]=r;e=e|24;f=e+f|0;e=e+s|0;r=G[e>>2];e=G[e+4>>2]^-2147483648;G[f>>2]=r;G[f+4>>2]=e;k=k+4|0;o=o+4|0;if((n|0)!=(o|0)){continue}break}}e=m&3;if(!e){break e}while(1){f=k<<3;o=f+(l+32|0)|0;f=f+s|0;n=G[f>>2];f=G[f+4>>2]^-2147483648;G[o>>2]=n;G[o+4>>2]=f;k=k+1|0;q=q+1|0;if((e|0)!=(q|0)){continue}break}break e}if(!e&t==0){break f}k=0;if((m|0)<=0){break e}while(1){q:{r:{o=k<<3;e=o+s|0;p=(+J[e>>2]+ +J[e+4>>2]*4294967296-t)/v;if(p<-0x8000000000000000){G[j>>2]=-11;break r}if(p>0x8000000000000000){G[j>>2]=-11;f=2147483647;e=-1;break q}if(p>=0){p=p+.5;if(!(O(p)<0x8000000000000000)){break r}f=O(p)>=1?~~(p>0?Q(S(p*2.3283064365386963e-10),4294967295):T((p-+(~~p>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~p>>>0;break q}p=p+-.5;if(!(O(p)<0x8000000000000000)){break r}f=O(p)>=1?~~(p>0?Q(S(p*2.3283064365386963e-10),4294967295):T((p-+(~~p>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~p>>>0;break q}f=-2147483648;e=0}o=o+(l+32|0)|0;G[o>>2]=e;G[o+4>>2]=f;k=k+1|0;if((k|0)!=(m|0)){continue}break}break e}if(H[l+28961|0]==115){break m}o=(c<<3)+i|0;s=l+28960|0;n=G[l+29088>>2];f=l+32|0;q=0;k=Fa-32|0;Fa=k;p=L[l+29032>>3];t=L[l+29024>>3];s:{if(!(p==1&t==0)){if((m|0)<=0){break s}e=f;while(1){r=o+(q<<3)|0;L[k+16>>3]=(+J[r>>2]+ +J[r+4>>2]*4294967296-t)/p;Eb(e,s,k+16|0);e=e+n|0;if(H[e|0]){G[j>>2]=-11}q=q+1|0;if((q|0)!=(m|0)){continue}break}break s}if((m|0)<=0){break s}e=f;while(1){r=o+(q<<3)|0;L[k>>3]=+J[r>>2]+ +J[r+4>>2]*4294967296;Eb(e,s,k);e=e+n|0;if(H[e|0]){G[j>>2]=-11}q=q+1|0;if((q|0)!=(m|0)){continue}break}}q=jb(f,44);if(q){while(1){E[q|0]=46;q=jb(q,44);if(q){continue}break}}Fa=k+32|0;e=G[l+29084>>2];f=G[l+29088>>2];if((e|0)!=(f|0)){break l}e=M(e,m);Wb(a,e,e>>31,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,f,m,e-f|0,l+32|0,j);break d}e=(c<<3)+i|0;p=L[l+29032>>3];t=L[l+29024>>3];t:{if(!(p==1&t==0)){if((m|0)<=0){break t}k=0;if((m|0)!=1){o=m&-2;q=0;while(1){f=k<<3;s=l+32|0;n=e+f|0;L[f+s>>3]=(+J[n>>2]+ +J[n+4>>2]*4294967296-t)/p;f=f|8;n=f+s|0;f=e+f|0;L[n>>3]=(+J[f>>2]+ +J[f+4>>2]*4294967296-t)/p;k=k+2|0;q=q+2|0;if((o|0)!=(q|0)){continue}break}}if(!(m&1)){break t}f=k<<3;e=e+f|0;L[f+(l+32|0)>>3]=(+J[e>>2]+ +J[e+4>>2]*4294967296-t)/p;break t}if((m|0)<=0){break t}q=0;k=0;if(m-1>>>0>=3){n=m&-4;o=0;while(1){f=k<<3;s=l+32|0;r=e+f|0;L[f+s>>3]=+J[r>>2]+ +J[r+4>>2]*4294967296;r=f|8;u=r+s|0;r=e+r|0;L[u>>3]=+J[r>>2]+ +J[r+4>>2]*4294967296;r=f|16;u=r+s|0;r=e+r|0;L[u>>3]=+J[r>>2]+ +J[r+4>>2]*4294967296;f=f|24;r=f+s|0;f=e+f|0;L[r>>3]=+J[f>>2]+ +J[f+4>>2]*4294967296;k=k+4|0;o=o+4|0;if((n|0)!=(o|0)){continue}break}}f=m&3;if(!f){break t}while(1){o=k<<3;n=o+(l+32|0)|0;o=e+o|0;L[n>>3]=+J[o>>2]+ +J[o+4>>2]*4294967296;k=k+1|0;q=q+1|0;if((f|0)!=(q|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}e=(c<<3)+i|0;p=L[l+29032>>3];t=L[l+29024>>3];u:{if(!(p==1&t==0)){if((m|0)<=0){break u}k=0;if((m|0)!=1){f=m&-2;o=0;while(1){q=l+32|0;s=e+(k<<3)|0;K[q+(k<<2)>>2]=(+J[s>>2]+ +J[s+4>>2]*4294967296-t)/p;s=k|1;n=q+(s<<2)|0;q=e+(s<<3)|0;K[n>>2]=(+J[q>>2]+ +J[q+4>>2]*4294967296-t)/p;k=k+2|0;o=o+2|0;if((f|0)!=(o|0)){continue}break}}if(!(m&1)){break u}e=e+(k<<3)|0;K[(l+32|0)+(k<<2)>>2]=(+J[e>>2]+ +J[e+4>>2]*4294967296-t)/p;break u}if((m|0)<=0){break u}o=0;k=0;if(m-1>>>0>=3){s=m&-4;q=0;while(1){f=l+32|0;n=e+(k<<3)|0;K[f+(k<<2)>>2]=+J[n>>2]+ +J[n+4>>2]*4294967296;n=k|1;r=f+(n<<2)|0;n=e+(n<<3)|0;K[r>>2]=+J[n>>2]+ +J[n+4>>2]*4294967296;n=k|2;r=f+(n<<2)|0;n=e+(n<<3)|0;K[r>>2]=+J[n>>2]+ +J[n+4>>2]*4294967296;n=k|3;r=f+(n<<2)|0;f=e+(n<<3)|0;K[r>>2]=+J[f>>2]+ +J[f+4>>2]*4294967296;k=k+4|0;q=q+4|0;if((s|0)!=(q|0)){continue}break}}f=m&3;if(!f){break u}while(1){q=e+(k<<3)|0;K[(l+32|0)+(k<<2)>>2]=+J[q>>2]+ +J[q+4>>2]*4294967296;k=k+1|0;o=o+1|0;if((f|0)!=(o|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}f=(c<<3)+i|0;t=L[l+29032>>3];v=L[l+29024>>3];v:{if(!(t==1&v==0)){k=0;if((m|0)<=0){break v}while(1){n=(l+32|0)+(k<<1)|0;e=f+(k<<3)|0;p=(+J[e>>2]+ +J[e+4>>2]*4294967296-v)/t;w:{if(p<-32768.49){G[j>>2]=-11;e=32768;break w}if(p>32767.49){G[j>>2]=-11;e=32767;break w}x:{if(p>=0){p=p+.5;if(!(O(p)<2147483648)){break x}e=~~p;break w}p=p+-.5;if(!(O(p)<2147483648)){break x}e=~~p;break w}e=-2147483648}F[n>>1]=e;k=k+1|0;if((m|0)!=(k|0)){continue}break}break v}if((m|0)<=0){break v}k=0;if((m|0)!=1){s=m&-2;o=0;while(1){n=(l+32|0)+(k<<1)|0;e=f+(k<<3)|0;q=G[e+4>>2];e=G[e>>2];if(!q&e>>>0>=32768|q){G[j>>2]=-11;e=32767}F[n>>1]=e;q=k|1;e=f+(q<<3)|0;n=G[e+4>>2];e=G[e>>2];if(!(!n&e>>>0<=32767)){G[j>>2]=-11;e=32767}F[(l+32|0)+(q<<1)>>1]=e;k=k+2|0;o=o+2|0;if((s|0)!=(o|0)){continue}break}}if(!(m&1)){break v}o=(l+32|0)+(k<<1)|0;e=f+(k<<3)|0;f=G[e+4>>2];e=G[e>>2];if(!(!f&e>>>0<=32767)){G[j>>2]=-11;e=32767}F[o>>1]=e}Oe(a,m,G[l+29084>>2],l+32|0,j);break d}f=(c<<3)+i|0;t=L[l+29032>>3];v=L[l+29024>>3];y:{if(!(t==1&v==0)){k=0;if((m|0)<=0){break y}while(1){n=(l+32|0)+k|0;z:{A:{e=f+(k<<3)|0;p=(+J[e>>2]+ +J[e+4>>2]*4294967296-v)/t;if(p<-.49){G[j>>2]=-11;break A}if(p>255.49){G[j>>2]=-11;e=255;break z}p=p+.5;if(!(p<4294967296&p>=0)){break A}e=~~p>>>0;break z}e=0}E[n|0]=e;k=k+1|0;if((m|0)!=(k|0)){continue}break}break y}if((m|0)<=0){break y}k=0;if((m|0)!=1){s=m&-2;o=0;while(1){n=(l+32|0)+k|0;e=f+(k<<3)|0;q=G[e+4>>2];e=G[e>>2];if(!q&e>>>0>=256|q){G[j>>2]=-11;e=255}E[n|0]=e;q=k|1;e=f+(q<<3)|0;n=G[e+4>>2];e=G[e>>2];if(!(!n&e>>>0<=255)){G[j>>2]=-11;e=255}E[q+(l+32|0)|0]=e;k=k+2|0;o=o+2|0;if((s|0)!=(o|0)){continue}break}}if(!(m&1)){break y}o=(l+32|0)+k|0;e=f+(k<<3)|0;f=G[e+4>>2];e=G[e>>2];if(!(!f&e>>>0<=255)){G[j>>2]=-11;e=255}E[o|0]=e}we(a,m,G[l+29084>>2],l+32|0,j);break d}f=(c<<3)+i|0;t=L[l+29032>>3];v=L[l+29024>>3];B:{if(!(t==1&v==0)){k=0;if((m|0)<=0){break B}while(1){n=(l+32|0)+(k<<2)|0;C:{D:{e=f+(k<<3)|0;p=(+J[e>>2]+ +J[e+4>>2]*4294967296-v)/t;if(p<-2147483648.49){G[j>>2]=-11;break D}if(p>2147483647.49){G[j>>2]=-11;e=2147483647;break C}if(p>=0){p=p+.5;if(!(O(p)<2147483648)){break D}e=~~p;break C}p=p+-.5;if(!(O(p)<2147483648)){break D}e=~~p;break C}e=-2147483648}G[n>>2]=e;k=k+1|0;if((m|0)!=(k|0)){continue}break}break B}if((m|0)<=0){break B}k=0;if((m|0)!=1){s=m&-2;o=0;while(1){n=(l+32|0)+(k<<2)|0;e=f+(k<<3)|0;q=G[e+4>>2];e=G[e>>2];if(!q&e>>>0>=2147483648|q){G[j>>2]=-11;e=2147483647}G[n>>2]=e;q=k|1;e=f+(q<<3)|0;n=G[e+4>>2];e=G[e>>2];if(!(!n&e>>>0<=2147483647)){G[j>>2]=-11;e=2147483647}G[(l+32|0)+(q<<2)>>2]=e;k=k+2|0;o=o+2|0;if((s|0)!=(o|0)){continue}break}}if(!(m&1)){break B}o=(l+32|0)+(k<<2)|0;e=f+(k<<3)|0;f=G[e+4>>2];e=G[e>>2];if(!(!f&e>>>0<=2147483647)){G[j>>2]=-11;e=2147483647}G[o>>2]=e}$c(a,m,G[l+29084>>2],l+32|0,j);break d}if((m|0)<=0){break e}k=0;if((m|0)!=1){q=m&-2;o=0;while(1){n=k<<3;e=n+s|0;f=G[e+4>>2];e=G[e>>2];n=n+(l+32|0)|0;if((f|0)<0){G[j>>2]=-11;f=2147483647;e=-1}G[n>>2]=e;G[n+4>>2]=f;n=(k|1)<<3;e=n+s|0;f=G[e+4>>2];e=G[e>>2];n=n+(l+32|0)|0;if((f|0)<0){G[j>>2]=-11;f=2147483647;e=-1}G[n>>2]=e;G[n+4>>2]=f;k=k+2|0;o=o+2|0;if((q|0)!=(o|0)){continue}break}}if(!(m&1)){break e}k=k<<3;e=k+s|0;f=G[e+4>>2];e=G[e>>2];k=k+(l+32|0)|0;if((f|0)<0){G[j>>2]=-11;f=2147483647;e=-1}G[k>>2]=e;G[k+4>>2]=f}_c(a,m,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){f=d;a=c+1|0;f=a?f:f+1|0;L[l+16>>3]=+(a>>>0)+ +(f|0)*4294967296;e=m;f=e>>31;a=c+e|0;f=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?f+1|0:f)|0)*4294967296;a=l+28864|0;Ya(a,81,46437,l+16|0);Ua(a);break c}e=m;f=e>>31;r=f;h=h-(f+(e>>>0>g>>>0)|0)|0;g=g-e|0;if(!(h|g)){break b}f=d+r|0;c=c+e|0;f=c>>>0>>0?f+1|0:f;d=f;f=r+G[l+29060>>2]|0;m=e+G[l+29056>>2]|0;f=m>>>0>>0?f+1|0:f;e=m;G[l+29056>>2]=e;G[l+29060>>2]=f;if(G[l+29072>>2]!=(e|0)|G[l+29076>>2]!=(f|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;e=y;f=x+1|0;e=f?e:e+1|0;x=f;y=e;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function Ud(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o)|0)>0){p=G[o>>2];break a}G[q+29060>>2]=M(G[q+29060>>2],i);A=1;c=G[q+29080>>2];N=c;P=c>>31;b:{if(G[q+29084>>2]!=16){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);c=G[q+29068>>2];if((c|0)<=0){break b}if(c-1>>>0>=7){d=c&-8;p=0;while(1){A=A*10*10*10*10*10*10*10*10;p=p+8|0;if((d|0)!=(p|0)){continue}break}}c=c&7;if(!c){break b}p=0;while(1){A=A*10;p=p+1|0;if((c|0)!=(p|0)){continue}break}}c:{if(k?0:(j|0)==1){break c}e=G[q+29028>>2];c=G[q+29024>>2];d=G[q+29084>>2];if(!e&(c|0)==1234554321&((d|0)%10|0)==1){break c}f=e-(c>>>0<32768)|0;if(((f|0)==-1&c-32768>>>0<4294901760|(f|0)!=-1)&(d|0)==21|(!e&c>>>0>255|(e|0)!=0)&(d|0)==11){break c}x=(d|0)==16?H[q+28864|0]==1?0:j:j}S=0-i|0;e=0;f=0;d:{while(1){d=g>>>0>>0&(h|0)<=(P|0)|(h|0)<(P|0)?g:N;c=d;d=c>>31;s=c;v=d;e:{if((i|0)>=0){d=G[q+29036>>2];j=G[q+29052>>2]+(d^-1)|0;c=G[q+29032>>2];r=c^-1;p=r+G[q+29048>>2]|0;j=Bu(p,p>>>0>>0?j+1|0:j,i,0);p=Ia;break e}c=G[q+29032>>2];d=G[q+29036>>2];j=Bu(c,d,S,0);p=Ia}r=j;j=G[q+29044>>2];u=G[q+29040>>2];t=Au(G[q+29016>>2],G[q+29020>>2],B,C);u=u+t|0;j=Ia+j|0;j=t>>>0>u>>>0?j+1|0:j;D=u;t=c;u=G[q+29060>>2];c=(u|0)/(i|0)|0;t=Au(t,d,c,c>>31);d=D+t|0;c=Ia+j|0;c=d>>>0>>0?c+1|0:c;t=r+1|0;p=r>>>0>>0&(p|0)<=(v|0)|(p|0)<(v|0);r=p?t:s;f:{g:{h:{i:{j:{k:{l:{m:{n:{j=G[q+29084>>2];switch(j-11|0){case 30:break g;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break h;case 5:break i;case 31:break k;case 10:break l;case 0:break m;default:break n}}o:{switch(j-81|0){case 1:break j;case 0:break o;default:break h}}j=u;u=q- -64|0;Tc(a,d,c,r,j,u,o);d=G[q+29024>>2];v=G[q+29028>>2];t=e+m|0;j=(e<<2)+l|0;w=L[q+29096>>3];y=L[q+29088>>3];c=w==1&y==0x8000000000000000;p:{q:{if(!x){r:{s:{if(c){if((r|0)<=0){break p}p=0;if((r|0)!=1){d=r&-2;v=0;while(1){t=j+(p<<2)|0;c=u+(p<<3)|0;s=G[c+4>>2];c=G[c>>2];if((s|0)!=-2147483648|c>>>0>=2147483648){G[o>>2]=-11;c=2147483647}G[t>>2]=c;t=p|1;c=u+(t<<3)|0;s=G[c+4>>2];c=G[c>>2];if(!((s|0)==-2147483648&c>>>0<=2147483647)){G[o>>2]=-11;c=2147483647}G[j+(t<<2)>>2]=c;p=p+2|0;v=v+2|0;if((d|0)!=(v|0)){continue}break}}if(!(r&1)){break p}c=u+(p<<3)|0;d=G[c+4>>2];c=G[c>>2];if((d|0)!=-2147483648|c>>>0>2147483647){break s}break r}if(w==1&y==0){break q}p=0;if((r|0)<=0){break p}while(1){d=j+(p<<2)|0;t:{u:{c=u+(p<<3)|0;z=(+J[c>>2]+ +G[c+4>>2]*4294967296)*w+y;if(z<-0x7ffffffffffffc00){G[o>>2]=-11;break u}if(z>0x7ffffffffffffc00){G[o>>2]=-11;c=2147483647;break t}if(!(O(z)<2147483648)){break u}c=~~z;break t}c=-2147483648}G[d>>2]=c;p=p+1|0;if((r|0)!=(p|0)){continue}break}break p}G[o>>2]=-11;c=2147483647}G[j+(p<<2)>>2]=c;break p}if(c){if((r|0)<=0){break p}p=0;while(1){s=u+(p<<3)|0;c=G[s>>2];s=G[s+4>>2];v:{if((c|0)==(d|0)&(s|0)==(v|0)){G[n>>2]=1;if((x|0)==1){G[j+(p<<2)>>2]=k;break v}E[p+t|0]=1;break v}if((s|0)!=-2147483648|c>>>0>=2147483648){G[o>>2]=-11;G[j+(p<<2)>>2]=2147483647;break v}G[j+(p<<2)>>2]=c}p=p+1|0;if((r|0)!=(p|0)){continue}break}break p}if(!(w==1&y==0)){if((r|0)<=0){break p}p=0;while(1){c=u+(p<<3)|0;s=G[c>>2];c=G[c+4>>2];w:{if((s|0)==(d|0)&(c|0)==(v|0)){G[n>>2]=1;if((x|0)==1){G[j+(p<<2)>>2]=k;break w}E[p+t|0]=1;break w}z=(+(s>>>0)+ +(c|0)*4294967296)*w+y;if(z<-0x7ffffffffffffc00){G[o>>2]=-11;G[j+(p<<2)>>2]=-2147483648;break w}if(z>0x7ffffffffffffc00){G[o>>2]=-11;G[j+(p<<2)>>2]=2147483647;break w}s=j+(p<<2)|0;if(O(z)<2147483648){c=~~z}else{c=-2147483648}G[s>>2]=c}p=p+1|0;if((r|0)!=(p|0)){continue}break}break p}if((r|0)<=0){break p}p=0;while(1){c=u+(p<<3)|0;s=G[c>>2];c=G[c+4>>2];x:{if((s|0)==(d|0)&(c|0)==(v|0)){G[n>>2]=1;if((x|0)==1){G[j+(p<<2)>>2]=k;break x}E[p+t|0]=1;break x}if((c|0)<0&s>>>0<=2147483647|(c|0)<-1){G[o>>2]=-11;G[j+(p<<2)>>2]=-2147483648;break x}if((c|0)>=0&s>>>0>=2147483648|(c|0)>0){G[o>>2]=-11;G[j+(p<<2)>>2]=2147483647;break x}G[j+(p<<2)>>2]=s}p=p+1|0;if((r|0)!=(p|0)){continue}break}break p}if((r|0)<=0){break p}p=0;if((r|0)!=1){t=r&-2;v=0;while(1){s=j+(p<<2)|0;d=u+(p<<3)|0;c=G[d+4>>2];d=G[d>>2];y:{if((c|0)<0&d>>>0<=2147483647|(c|0)<-1){G[o>>2]=-11;d=-2147483648;break y}if((c|0)>=0&d>>>0>=2147483648|(c|0)>0){G[o>>2]=-11;d=2147483647}}G[s>>2]=d;s=p|1;d=u+(s<<3)|0;c=G[d+4>>2];d=G[d>>2];z:{if((c|0)>=-1&d>>>0>=2147483648|(c|0)>=0){if((c|0)<=0&d>>>0<=2147483647|(c|0)<0){break z}G[o>>2]=-11;d=2147483647;break z}G[o>>2]=-11;d=-2147483648}G[j+(s<<2)>>2]=d;p=p+2|0;v=v+2|0;if((t|0)!=(v|0)){continue}break}}if(!(r&1)){break p}j=j+(p<<2)|0;d=u+(p<<3)|0;c=G[d+4>>2];d=G[d>>2];A:{if((c|0)>=-1&d>>>0>=2147483648|(c|0)>=0){if((c|0)<=0&d>>>0<=2147483647|(c|0)<0){break A}G[o>>2]=-11;d=2147483647;break A}G[o>>2]=-11;d=-2147483648}G[j>>2]=d}break f}j=c;c=q- -64|0;$d(a,d,j,r,u,c,o);bq(c,r,L[q+29096>>3],L[q+29088>>3],x,H[q+29024|0],k,e+m|0,n,(e<<2)+l|0,o);break f}j=c;c=q- -64|0;Pe(a,d,j,r,u,c,o);aq(c,r,L[q+29096>>3],L[q+29088>>3],x,F[q+29024>>1],k,e+m|0,n,(e<<2)+l|0,o);break f}j=c;c=q- -64|0;Uc(a,d,j,r,u,c,o);al(c,r,L[q+29096>>3],L[q+29088>>3],x,k,e+m|0,n,(e<<2)+l|0,o);break f}j=c;c=q- -64|0;Tc(a,d,j,r,u,c,o);$k(c,r,L[q+29096>>3],L[q+29088>>3],x,k,e+m|0,n,(e<<2)+l|0,o);break f}Jb(a,d,c,0,o);c=G[q+29060>>2];d=G[q+29064>>2];B:{if((c|0)==(d|0)){c=M(c,r);ic(a,c,c>>31,q- -64|0,o);break B}Rd(a,d,r,c-d|0,q- -64|0,o)}v=q- -64|0;z=L[q+29096>>3];T=L[q+29088>>3];U=G[q+29064>>2];V=e+m|0;D=(e<<2)+l|0;s=0;t=Fa-112|0;Fa=t;I=q+28864|0;W=Va(I);if((r|0)>0){while(1){C:{d=v+U|0;Q=H[d|0];E[d|0]=0;j=v;D:{E:{if(H[I|0]==1){break E}if(fb(I,v,W)){break E}j=d;if(!x){break D}G[n>>2]=1;if((x|0)==1){G[(s<<2)+D>>2]=k;break D}E[s+V|0]=1;break D}while(1){c=H[j|0];if((c|0)==32){j=j+1|0;continue}break}R=1;F:{switch(c-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};R=(c|0)==45?-1:1;c=p;break;default:break F}}y=0;if((c-48&255)>>>0<10){while(1){w=y*10+ +(c<<24>>24);p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}y=w+-48;if((c-48&255)>>>0<=9){continue}break}}w=A;G:{H:{switch(c-44|0){case 0:case 2:break H;default:break G}}p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}w=1;if((c-48&255)>>>0>=10){break G}while(1){y=y*10+ +(c<<24>>24)+-48;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}w=w*10;if((c-48&255)>>>0<=9){continue}break}}I:{if((c&254)!=68){K=1;p=0;break I}while(1){K=1;p=j;j=p+1|0;c=H[p+1|0];if((c|0)==32){continue}break}J:{switch(c-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=p+1|0;u=H[j|0];if((u|0)==32){continue}break};K=(c|0)==45?-1:1;c=u;break;default:break J}}p=0;if((c-48&255)>>>0>=10){break I}while(1){u=c;X=M(p,10)-48|0;p=j;while(1){c=H[p+1|0];j=p+1|0;p=j;if((c|0)==32){continue}break}p=(u<<24>>24)+X|0;if((c-48&255)>>>0<=9){continue}break}}if(c){G[t+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[t+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[t+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[t+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[t+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[t+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[t+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[t+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[t+20>>2]=c;c=t+16|0;Ua(c);G[t>>2]=v;Ya(c,81,43022,t);Ua(c);E[d|0]=Q;G[o>>2]=409;break C}w=y*+(R|0)/w*$b(10,+(M(p,K)|0))*z+T;K:{if(w<-0x7ffffffffffffc00){G[o>>2]=-11;G[(s<<2)+D>>2]=-2147483648;break K}if(w>0x7ffffffffffffc00){G[o>>2]=-11;G[(s<<2)+D>>2]=2147483647;break K}p=(s<<2)+D|0;if(O(w)<2147483648){c=~~w}else{c=-2147483648}G[p>>2]=c}}v=j;E[d|0]=Q;s=s+1|0;if((r|0)!=(s|0)){continue}}break}}Fa=t+112|0;break f}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8924,q);Ua(a);p=311;if(G[q+29076>>2]==1){break d}p=312;break d}j=c;c=q- -64|0;Uc(a,d,j,r,u,c,o);_k(c,r,L[q+29096>>3],L[q+29088>>3],x,G[q+29024>>2],k,e+m|0,n,(e<<2)+l|0,o)}p=G[o>>2];if((p|0)>0){w=+(e>>>0)+ +(f|0)*4294967296;A=w+1;w=w+ +(r|0);L:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=w;L[q+16>>3]=A;Ya(q+28896|0,81,46757,q+16|0);break L}L[q+56>>3]=w;L[q+48>>3]=A;Ya(q+28896|0,81,46698,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}j=r;c=j>>31;d=j;v=c;h=h-(c+(j>>>0>g>>>0)|0)|0;g=g-j|0;if(h|g){j=M(i,r);p=j;c=p+G[q+29032>>2]|0;j=G[q+29036>>2]+(p>>31)|0;j=c>>>0

>>0?j+1|0:j;G[q+29032>>2]=c;p=j;G[q+29036>>2]=p;j=e;e=d;j=j+d|0;d=f+v|0;d=e>>>0>j>>>0?d+1|0:d;e=j;f=d;v=G[q+29052>>2];d=v;r=G[q+29048>>2];if((p|0)>=(d|0)&c>>>0>=r>>>0|(d|0)<(p|0)){j=Bu(c,p,r,v);d=B+j|0;s=Ia;C=C+s|0;C=d>>>0>>0?C+1|0:C;B=d;d=Au(r,v,j,s);G[q+29032>>2]=c-d;G[q+29036>>2]=p-(Ia+(c>>>0>>0)|0);continue}if((p|0)>0|(p|0)>=0){continue}d=B;B=Bu(c^-1,p^-1,r,v)+1|0;j=Ia;j=B?j:j+1|0;s=B;B=d-s|0;C=C-((d>>>0>>0)+j|0)|0;j=Au(r,v,s,j)+c|0;d=p+Ia|0;G[q+29032>>2]=j;G[q+29036>>2]=c>>>0>j>>>0?d+1|0:d;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function yh(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;m=G[j>>2];a:{if((m|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}c=G[l+29096>>2];w=c;x=c>>31;if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){m=G[j>>2];break b}c=0;d=0;while(1){n=G[l+29072>>2];r=G[l+29076>>2];f=G[l+29068>>2];k=G[l+29064>>2];e=Au(G[l+29048>>2],G[l+29052>>2],y,z);k=k+e|0;f=Ia+f|0;f=e>>>0>k>>>0?f+1|0:f;p=k;k=G[l+29056>>2];q=G[l+29060>>2];e=G[l+29084>>2];e=Au(k,q,e,e>>31);p=p+e|0;f=Ia+f|0;Jb(a,p,e>>>0>p>>>0?f+1|0:f,1,j);e=g>>>0>>0&(h|0)<=(x|0)|(h|0)<(x|0)?g:w;t=e>>31;p=e;f=n;e=k;k=r-((f>>>0>>0)+q|0)|0;e=f-e|0;f=e;e=e>>>0>p>>>0&(k|0)>=(t|0)|(k|0)>(t|0);n=e?p:f;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{f=G[l+29100>>2];switch(f-11|0){case 30:break i;case 0:break j;case 10:break k;case 31:break l;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break o;case 5:break p;default:break q}}r:{switch(f-81|0){case 1:break m;case 0:break r;default:break o}}t=(c<<3)+i|0;s=L[l+29032>>3];f=s!=1;u=L[l+29024>>3];if(!(f|u!=0x8000000000000000)){if((n|0)<=0){break e}m=0;if((n|0)!=1){q=n&-2;e=0;while(1){p=m<<3;k=p+t|0;f=G[k+4>>2];k=G[k>>2];s:{if((f|0)<0){G[j>>2]=-11;k=0;r=-2147483648;break s}r=f^-2147483648}f=p+(l+32|0)|0;G[f>>2]=k;G[f+4>>2]=r;p=(m|1)<<3;k=p+t|0;f=G[k+4>>2];k=G[k>>2];r=f^-2147483648;t:{if((f|0)>0|(f|0)>=0){break t}G[j>>2]=-11;k=0;r=-2147483648}f=p+(l+32|0)|0;G[f>>2]=k;G[f+4>>2]=r;m=m+2|0;e=e+2|0;if((q|0)!=(e|0)){continue}break}}if(!(n&1)){break e}p=m<<3;k=p+t|0;f=G[k+4>>2];k=G[k>>2];if((f|0)<0){break h}q=f^-2147483648;break g}if(!f&u==0){break f}m=0;if((n|0)<=0){break e}while(1){u:{v:{k=m<<3;f=k+t|0;o=(+J[f>>2]+ +G[f+4>>2]*4294967296-u)/s;if(o<-0x8000000000000000){G[j>>2]=-11;break v}if(o>0x8000000000000000){G[j>>2]=-11;q=-1;p=2147483647;break u}if(o>=0){o=o+.5;if(!(O(o)<0x8000000000000000)){break v}q=~~o>>>0;p=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break u}o=o+-.5;if(!(O(o)<0x8000000000000000)){break v}q=~~o>>>0;p=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break u}q=0;p=-2147483648}f=k+(l+32|0)|0;G[f>>2]=q;G[f+4>>2]=p;m=m+1|0;if((n|0)!=(m|0)){continue}break}break e}if(H[l+28961|0]==115){break o}t=(c<<3)+i|0;r=l+28960|0;q=G[l+29088>>2];f=l+32|0;e=0;m=Fa-32|0;Fa=m;s=L[l+29032>>3];o=L[l+29024>>3];w:{if(!(s==1&o==0)){if((n|0)<=0){break w}k=f;while(1){p=t+(e<<3)|0;L[m+16>>3]=(+J[p>>2]+ +G[p+4>>2]*4294967296-o)/s;Eb(k,r,m+16|0);k=k+q|0;if(H[k|0]){G[j>>2]=-11}e=e+1|0;if((e|0)!=(n|0)){continue}break}break w}if((n|0)<=0){break w}k=f;while(1){p=t+(e<<3)|0;L[m>>3]=+J[p>>2]+ +G[p+4>>2]*4294967296;Eb(k,r,m);k=k+q|0;if(H[k|0]){G[j>>2]=-11}e=e+1|0;if((e|0)!=(n|0)){continue}break}}e=jb(f,44);if(e){while(1){E[e|0]=46;e=jb(e,44);if(e){continue}break}}Fa=m+32|0;k=G[l+29084>>2];f=G[l+29088>>2];if((k|0)!=(f|0)){break n}f=M(k,n);Wb(a,f,f>>31,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){m=311;G[j>>2]=311;break a}m=312;G[j>>2]=312;break a}wd(a,f,n,k-f|0,l+32|0,j);break d}m=(c<<3)+i|0;s=L[l+29032>>3];o=L[l+29024>>3];x:{if(!(s==1&o==0)){if((n|0)<=0){break x}e=0;if((n|0)!=1){p=n&-2;t=0;while(1){q=e<<3;k=l+32|0;f=m+q|0;L[q+k>>3]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;f=q|8;k=f+k|0;f=f+m|0;L[k>>3]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;e=e+2|0;t=t+2|0;if((p|0)!=(t|0)){continue}break}}if(!(n&1)){break x}f=e<<3;e=f+(l+32|0)|0;f=f+m|0;L[e>>3]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;break x}if((n|0)<=0){break x}t=0;e=0;if(n-1>>>0>=3){k=n&-4;p=0;while(1){r=e<<3;q=l+32|0;f=m+r|0;L[r+q>>3]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=r|8;v=f+q|0;f=f+m|0;L[v>>3]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=r|16;v=f+q|0;f=f+m|0;L[v>>3]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=r|24;r=f+q|0;f=f+m|0;L[r>>3]=+J[f>>2]+ +G[f+4>>2]*4294967296;e=e+4|0;p=p+4|0;if((k|0)!=(p|0)){continue}break}}k=n&3;if(!k){break x}while(1){f=e<<3;p=f+(l+32|0)|0;f=f+m|0;L[p>>3]=+J[f>>2]+ +G[f+4>>2]*4294967296;e=e+1|0;t=t+1|0;if((k|0)!=(t|0)){continue}break}}_c(a,n,G[l+29084>>2],l+32|0,j);break d}q=(c<<3)+i|0;s=L[l+29032>>3];o=L[l+29024>>3];y:{if(!(s==1&o==0)){if((n|0)<=0){break y}m=0;if((n|0)!=1){p=n&-2;e=0;while(1){k=l+32|0;f=q+(m<<3)|0;K[k+(m<<2)>>2]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;f=m|1;k=k+(f<<2)|0;f=q+(f<<3)|0;K[k>>2]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;m=m+2|0;e=e+2|0;if((p|0)!=(e|0)){continue}break}}if(!(n&1)){break y}f=q+(m<<3)|0;K[(l+32|0)+(m<<2)>>2]=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;break y}if((n|0)<=0){break y}e=0;m=0;if(n-1>>>0>=3){k=n&-4;t=0;while(1){p=l+32|0;f=q+(m<<3)|0;K[p+(m<<2)>>2]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=m|1;r=p+(f<<2)|0;f=q+(f<<3)|0;K[r>>2]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=m|2;r=p+(f<<2)|0;f=q+(f<<3)|0;K[r>>2]=+J[f>>2]+ +G[f+4>>2]*4294967296;f=m|3;p=p+(f<<2)|0;f=q+(f<<3)|0;K[p>>2]=+J[f>>2]+ +G[f+4>>2]*4294967296;m=m+4|0;t=t+4|0;if((k|0)!=(t|0)){continue}break}}k=n&3;if(!k){break y}while(1){f=q+(m<<3)|0;K[(l+32|0)+(m<<2)>>2]=+J[f>>2]+ +G[f+4>>2]*4294967296;m=m+1|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}$c(a,n,G[l+29084>>2],l+32|0,j);break d}q=(c<<3)+i|0;u=L[l+29032>>3];s=L[l+29024>>3];z:{if(!(u==1&s==0)){m=0;if((n|0)<=0){break z}while(1){k=(l+32|0)+(m<<1)|0;f=q+(m<<3)|0;o=(+J[f>>2]+ +G[f+4>>2]*4294967296-s)/u;A:{if(o<-32768.49){G[j>>2]=-11;e=32768;break A}if(o>32767.49){G[j>>2]=-11;e=32767;break A}B:{if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break B}e=~~o;break A}o=o+-.5;if(!(O(o)<2147483648)){break B}e=~~o;break A}e=-2147483648}F[k>>1]=e;m=m+1|0;if((n|0)!=(m|0)){continue}break}break z}m=0;if((n|0)<=0){break z}while(1){e=(l+32|0)+(m<<1)|0;k=q+(m<<3)|0;f=G[k+4>>2];k=G[k>>2];C:{if((f|0)<0&k>>>0<=4294934527|(f|0)<-1){G[j>>2]=-11;k=32768;break C}if((f|0)>=0&k>>>0>=32768|(f|0)>0){G[j>>2]=-11;k=32767;break C}}F[e>>1]=k;m=m+1|0;if((n|0)!=(m|0)){continue}break}}Oe(a,n,G[l+29084>>2],l+32|0,j);break d}q=(c<<3)+i|0;s=L[l+29032>>3];o=L[l+29024>>3];D:{if(!(s==1&o==0)){m=0;if((n|0)<=0){break D}while(1){k=(l+32|0)+m|0;E:{F:{f=q+(m<<3)|0;u=(+J[f>>2]+ +G[f+4>>2]*4294967296-o)/s;if(u<-.49){G[j>>2]=-11;break F}if(u>255.49){G[j>>2]=-11;e=255;break E}u=u+.5;if(!(u<4294967296&u>=0)){break F}e=~~u>>>0;break E}e=0}E[k|0]=e;m=m+1|0;if((n|0)!=(m|0)){continue}break}break D}m=0;if((n|0)<=0){break D}while(1){p=(l+32|0)+m|0;k=q+(m<<3)|0;f=G[k+4>>2];k=G[k>>2];G:{if((f|0)<0){G[j>>2]=-11;k=0;break G}if(!f&k>>>0>=256|f){G[j>>2]=-11;k=255}}E[p|0]=k;m=m+1|0;if((n|0)!=(m|0)){continue}break}}we(a,n,G[l+29084>>2],l+32|0,j);break d}r=(c<<3)+i|0;u=L[l+29032>>3];s=L[l+29024>>3];H:{if(!(u==1&s==0)){m=0;if((n|0)<=0){break H}while(1){k=(l+32|0)+(m<<2)|0;I:{J:{f=r+(m<<3)|0;o=(+J[f>>2]+ +G[f+4>>2]*4294967296-s)/u;if(o<-2147483648.49){G[j>>2]=-11;break J}if(o>2147483647.49){G[j>>2]=-11;e=2147483647;break I}if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break J}e=~~o;break I}o=o+-.5;if(!(O(o)<2147483648)){break J}e=~~o;break I}e=-2147483648}G[k>>2]=e;m=m+1|0;if((n|0)!=(m|0)){continue}break}break H}if((n|0)<=0){break H}m=0;if((n|0)!=1){q=n&-2;e=0;while(1){p=(l+32|0)+(m<<2)|0;k=r+(m<<3)|0;f=G[k+4>>2];k=G[k>>2];K:{if((f|0)<0&k>>>0<=2147483647|(f|0)<-1){G[j>>2]=-11;k=-2147483648;break K}if((f|0)>=0&k>>>0>=2147483648|(f|0)>0){G[j>>2]=-11;k=2147483647;break K}}G[p>>2]=k;p=m|1;k=r+(p<<3)|0;f=G[k+4>>2];k=G[k>>2];L:{if((f|0)>=-1&k>>>0>=2147483648|(f|0)>=0){if((f|0)<=0&k>>>0<=2147483647|(f|0)<0){break L}G[j>>2]=-11;k=2147483647;break L}G[j>>2]=-11;k=-2147483648}G[(l+32|0)+(p<<2)>>2]=k;m=m+2|0;e=e+2|0;if((q|0)!=(e|0)){continue}break}}if(!(n&1)){break H}p=(l+32|0)+(m<<2)|0;k=r+(m<<3)|0;f=G[k+4>>2];k=G[k>>2];M:{if((f|0)>=-1&k>>>0>=2147483648|(f|0)>=0){if((f|0)<=0&k>>>0<=2147483647|(f|0)<0){break M}G[j>>2]=-11;k=2147483647;break M}G[j>>2]=-11;k=-2147483648}G[p>>2]=k}$c(a,n,G[l+29084>>2],l+32|0,j);break d}G[j>>2]=-11;k=0;q=-2147483648}f=p+(l+32|0)|0;G[f>>2]=k;G[f+4>>2]=q;break e}if((n|0)<=0){break e}bb(l+32|0,t,n<<3)}_c(a,n,G[l+29084>>2],l+32|0,j)}m=G[j>>2];if((m|0)>0){f=d;a=c+1|0;f=a?f:f+1|0;L[l+16>>3]=+(a>>>0)+ +(f|0)*4294967296;k=n>>31;a=c+n|0;k=d+k|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?k+1|0:k)|0)*4294967296;a=l+28864|0;Ya(a,81,46630,l+16|0);Ua(a);break c}e=n;k=n>>31;h=h-((n>>>0>g>>>0)+k|0)|0;g=g-n|0;if(!(h|g)){break b}f=d+k|0;c=c+e|0;f=c>>>0>>0?f+1|0:f;d=f;k=k+G[l+29060>>2]|0;n=e+G[l+29056>>2]|0;k=n>>>0>>0?k+1|0:k;f=l;G[f+29056>>2]=n;G[f+29060>>2]=k;if(G[f+29072>>2]!=(n|0)|G[f+29076>>2]!=(k|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;e=z;f=y+1|0;e=f?e:e+1|0;y=f;z=e;continue}}m=G[j>>2];break a}if((m|0)!=-11){break a}Ua(44927);m=412;G[j>>2]=412}Fa=l+29104|0;return m}function sd(a,b,c){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;i=Fa-2208|0;Fa=i;G[a>>2]=0;d=G[c>>2];a:{if((d|0)>0){e=d;break a}if((d|0)==-106){G[c>>2]=0;m=1}if(G[47541]){e=ji();G[c>>2]=e;if((e|0)>0){break a}}b:{c:{d:{while(1){e=H[b|0];if((e|0)!=32){e:{if(!e){Ua(50141);break b}f:{g:{if((d|0)==-106){if(Va(b)>>>0<1025){break g}Ua(50183);break b}f=(e|0)==33;b=f+b|0;e=b;g=i+2176|0;h=i+1136|0;j=i+96|0;l=i+16|0;h:{i:{if(G[c>>2]<=0){if(g){E[g|0]=0}if(h){E[h|0]=0}if(j){E[j|0]=0}if(l){E[l|0]=0}while(1){d=H[e|0];if((d|0)!=32){j:{k:{l:{if((d|0)==45&(H[e+1|0]|32)==32){break l}if(!Xa(e,4377)){break l}if(Xa(e,33295)){break k}}if(!g){break j}e=H[41984]|H[41985]<<8;E[g+8|0]=e;E[g+9|0]=e>>>8;e=H[41980]|H[41981]<<8|(H[41982]<<16|H[41983]<<24);d=H[41976]|H[41977]<<8|(H[41978]<<16|H[41979]<<24);E[g|0]=d;E[g+1|0]=d>>>8;E[g+2|0]=d>>>16;E[g+3|0]=d>>>24;E[g+4|0]=e;E[g+5|0]=e>>>8;E[g+6|0]=e>>>16;E[g+7|0]=e>>>24;break j}d=Sb(e,42197);m:{if(d){if(g){k=d-e|0;if((k|0)>=17){break i}qb(g,e,k+3|0)}e=d+3|0;break m}if(!g){break m}d=Va(g)+g|0;E[d|0]=102;E[d+1|0]=105;E[d+2|0]=108;E[d+3|0]=101;E[d+4|0]=58;E[d+5|0]=47;E[d+6|0]=47;E[d+7|0]=0}d=jb(e,40);k=jb(e,91);n:{o:{p:{q:{if(h){if(d){n=d-e|0;if((n|0)>=1025){break i}qb(h,e,n);break q}if(k){d=k-e|0;if((d|0)>=1025){break i}qb(h,e,d);break o}if(Va(e)>>>0>=1025){break i}Za(h,e);break n}if(!d){break p}}e=d+1|0;d=jb(e,41);if(!d){break i}if(!j){break p}d=d-e|0;if((d|0)>=1025){break i}qb(j,e,d)}if(!k){break n}}e=k+1|0;d=jb(e,93);if(!d){break i}if(!l){break n}d=d-e|0;if((d|0)>=1025){break i}qb(l,e,d)}if(!g|!h){break j}if(Xa(g,42185)){break j}e=Sb(h,2750);if(!e|(H[e+3|0]|32)!=32){break j}e=H[42137]|H[42138]<<8|(H[42139]<<16|H[42140]<<24);E[g+15|0]=e;E[g+16|0]=e>>>8;E[g+17|0]=e>>>16;E[g+18|0]=e>>>24;e=H[42134]|H[42135]<<8|(H[42136]<<16|H[42137]<<24);d=H[42130]|H[42131]<<8|(H[42132]<<16|H[42133]<<24);E[g+8|0]=d;E[g+9|0]=d>>>8;E[g+10|0]=d>>>16;E[g+11|0]=d>>>24;E[g+12|0]=e;E[g+13|0]=e>>>8;E[g+14|0]=e>>>16;E[g+15|0]=e>>>24;e=H[42126]|H[42127]<<8|(H[42128]<<16|H[42129]<<24);d=H[42122]|H[42123]<<8|(H[42124]<<16|H[42125]<<24);E[g|0]=d;E[g+1|0]=d>>>8;E[g+2|0]=d>>>16;E[g+3|0]=d>>>24;E[g+4|0]=e;E[g+5|0]=e>>>8;E[g+6|0]=e>>>16;E[g+7|0]=e>>>24}e=G[c>>2]}else{e=e+1|0;continue}break}}break h}G[c>>2]=125}if(G[c>>2]<=0){break f}Ua(5e4);Ua(b);break d}Za(i+1136|0,b);E[i+96|0]=0;G[i+2176>>2]=1701603686;G[i+2180>>2]=3092282;E[i+16|0]=0}e=G[310142];while(1){if((e|0)<=0){break e}e=e-1|0;if(Xa(M(e,84)+1240576|0,i+2176|0)){continue}break}G[c>>2]=0;r:{if(!f){break r}d=G[(M(e,84)+1240576|0)+60>>2];if(!d){break r}Ja[d|0](i+1136|0)|0}s:{d=G[(M(e,84)+1240576|0)+48>>2];if(d){d=Ja[d|0](i+1136|0,i+12|0)|0;G[c>>2]=d;if(!d){break s}Ua(39966);Ua(b);break d}Ua(49952);Ua(b);break b}g=lb(1,8);G[a>>2]=g;if(!g){Ja[G[(M(e,84)+1240576|0)+56>>2]](G[i+12>>2])|0;Ua(54617);Ua(b);break c}d=lb(1,1736);G[g+4>>2]=d;if(!d){Ja[G[(M(e,84)+1240576|0)+56>>2]](G[i+12>>2])|0;Ua(54617);Ua(b);Wa(G[a>>2]);G[a>>2]=0;break c}h=Va(b)+1|0;h=ab((h|0)>32?h:32);G[d+12>>2]=h;if(!h){Ja[G[(M(e,84)+1240576|0)+56>>2]](G[i+12>>2])|0;Ua(50046);Ua(b);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break b}f=lb(1001,8);G[d+96>>2]=f;if(!f){Ja[G[(M(e,84)+1240576|0)+56>>2]](G[i+12>>2])|0;Ua(49841);Ua(b);Wa(G[G[G[a>>2]+4>>2]+12>>2]);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break c}f=lb(40,2880);G[d+1252>>2]=f;t:{u:{if(f){cb(d+1256|0,255,160);f=d+1728|0;G[f>>2]=38;G[f+4>>2]=39;f=d+1720|0;G[f>>2]=36;G[f+4>>2]=37;f=d+1712|0;G[f>>2]=34;G[f+4>>2]=35;f=d+1704|0;G[f>>2]=32;G[f+4>>2]=33;f=d+1696|0;G[f>>2]=30;G[f+4>>2]=31;f=d+1688|0;G[f>>2]=28;G[f+4>>2]=29;f=d+1680|0;G[f>>2]=26;G[f+4>>2]=27;f=d+1672|0;G[f>>2]=24;G[f+4>>2]=25;f=d+1664|0;G[f>>2]=22;G[f+4>>2]=23;f=d+1656|0;G[f>>2]=20;G[f+4>>2]=21;f=d+1648|0;G[f>>2]=18;G[f+4>>2]=19;f=d+1640|0;G[f>>2]=16;G[f+4>>2]=17;f=d+1632|0;G[f>>2]=14;G[f+4>>2]=15;f=d+1624|0;G[f>>2]=12;G[f+4>>2]=13;f=d+1616|0;G[f>>2]=10;G[f+4>>2]=11;f=d+1608|0;G[f>>2]=8;G[f+4>>2]=9;f=d+1600|0;G[f>>2]=6;G[f+4>>2]=7;f=d+1592|0;G[f>>2]=4;G[f+4>>2]=5;f=d+1584|0;G[f>>2]=2;G[f+4>>2]=3;G[d+1576>>2]=0;G[d+1580>>2]=1;G[d+92>>2]=1e3;f=G[i+12>>2];G[d+4>>2]=e;G[d>>2]=f;Za(h,b);G[d+40>>2]=0;G[d+44>>2]=0;G[d+32>>2]=0;G[d+36>>2]=0;G[d+128>>2]=-1;G[d+132>>2]=-1;G[d+84>>2]=1;G[d+72>>2]=-1;G[d+24>>2]=m;G[d+16>>2]=555;G[d+8>>2]=1;f=0;Hc(g,0,1,c);if(G[c>>2]>0){break t}d=G[G[a>>2]+4>>2];break u}Ja[G[(M(e,84)+1240576|0)+56>>2]](G[i+12>>2])|0;Ua(49897);Ua(b);Wa(G[G[G[a>>2]+4>>2]+96>>2]);Wa(G[G[G[a>>2]+4>>2]+12>>2]);Wa(G[G[a>>2]+4>>2]);Wa(G[a>>2]);G[a>>2]=0;break c}while(1){v:{e=f<<2;b=e+1243184|0;if(!G[b>>2]){break v}e=e+1243184|0;b=e+4|0;if(!G[b>>2]){break v}b=e+8|0;if(!G[b>>2]){break v}b=e+12|0;if(!G[b>>2]){break v}b=e+16|0;if(!G[b>>2]){break v}f=f+5|0;if((f|0)!=1e4){continue}break t}break}G[b>>2]=d}if(H[i+96|0]){j=G[a>>2];h=Fa-112|0;Fa=h;G[h+104>>2]=0;l=i+96|0;if(!(!l|G[c>>2]>0|!H[l|0])){ch(h+108|0,l,0,h+104|0);w:{if(G[h+104>>2]){tb(2,h);f=Fa-192|0;Fa=f;x:{if(G[c>>2]|!c){break x}b=362;y:{if(!j|!l){break y}G[47540]=1;G[309831]=0;G[309830]=0;E[1239392]=0;b=368;e=G[309833];d=G[309832];if(!e&(d|0)>0|((d|0)<=0?e:0)){break y}if(d?1:e){if((d|0)>0){b=0;while(1){d=b<<3;g=G[d+e>>2];if(g){Wa(g);G[d+G[309833]>>2]=0;e=G[309833]}G[(d+e|0)+4>>2]=0;b=b+1|0;if((b|0)>2]=G[j>>2]+1;z:{if(G[f+188>>2]>1){e=2;while(1){A:{G[c>>2]=0;mb(j,1,f+184|0,c);if(G[c>>2]){d=G[f+188>>2];break A}g=e;Cb(j,16,35480,f+16|0,0,c);B:{if(G[c>>2]){break B}Cb(j,41,33996,f+180|0,0,c);m=f+16|0;b=G[c>>2];if(b){if((b|0)!=204){break B}G[c>>2]=0;e=1}else{e=G[f+180>>2]}d=0;b=368;C:{if(!m){break C}k=G[309833];n=G[309832];if(!k&(n|0)>0|((n|0)<=0?k:0)){break C}if((n|0)>0){while(1){if(!Xa(m,G[k+(d<<3)>>2])){b=0;d=k+(d<<3)|0;if((e|0)<=G[d+4>>2]){break C}G[d+4>>2]=e;break C}d=d+1|0;if((n|0)!=(d|0)){continue}break}}b=360;D:{if(!k){d=ab(8);break D}d=ub(k,(n<<3)+8|0)}if(!d){break C}k=ab(Va(m)+1|0);if(!k){Wa(d);break C}b=0;k=Za(k,m);G[309833]=d;m=G[309832];d=d+(m<<3)|0;G[d+4>>2]=e;G[d>>2]=k;G[309832]=m+1}G[c>>2]=b}e=g+1|0;d=G[f+188>>2];if((g|0)<(d|0)){continue}}break}mb(j,d,f+184|0,c);if(G[c>>2]){break x}d=0;break z}b=f+184|0;mb(j,1,b,c);Td(j,f+16|0,f+180|0,c);mb(j,G[f+188>>2],b,c);if(G[c>>2]){break x}d=G[f+16>>2]<=0}b=dn(l);G[c>>2]=b;if(b){break x}b=Va(l);E:{while(1){e=b;b=e-1|0;if((b|0)<0){break E}if(H[b+l|0]!=47){continue}break}if((e|0)<=0){break E}b=(e|0)<999?e:999;o=bb(1239392,l,b)+b|0,p=0,E[o|0]=p}F:{G:{H:{while(1){I:{e=eh(1);if(e){break I}e=0;b=369;J:{K:{switch(G[47524]-1|0){case 3:if(!d){e=369;break I}e=G[309816];if(!e){b=363;break F}if(G[309823]){b=364;break G}b=G[309817];G[309823]=G[309816];G[309824]=b;G[309829]=G[309822];b=G[309821];G[309827]=G[309820];G[309828]=b;b=G[309819];G[309825]=G[309818];G[309826]=b;G[309816]=0;e=Qj(j,0,3);break J;case 2:e=G[309816];if(!e){b=363;break F}if(G[309823]){b=364;break G}b=G[309817];G[309823]=G[309816];G[309824]=b;G[309829]=G[309822];b=G[309821];G[309827]=G[309820];G[309828]=b;b=G[309819];G[309825]=G[309818];G[309826]=b;G[309816]=0;e=Qj(j,0,((d|0)!=0)<<1);break J;case 4:break I;case 0:break K;default:break H}}L:{if(G[310098]==2){rb(f+96|0,G[310118],80);break L}b=G[47540];G[47540]=b+1;G[f>>2]=b;Ya(f+96|0,80,29887,f)}E[f+175|0]=0;e=bn(j,f+96|0,0)}d=0;if(!e){continue}}break}b=e}e=G[309816];if(!e){break F}}Wa(e);G[309822]=0;G[309820]=0;G[309821]=0;G[309818]=0;G[309819]=0;G[309816]=0;G[309817]=0}e=G[309823];if(e){Wa(e);G[309829]=0;G[309827]=0;G[309828]=0;G[309825]=0;G[309826]=0;G[309823]=0;G[309824]=0}d=G[309833];e=G[309832];if(!(!d&(e|0)>0|((e|0)<=0?d:0)|!(e?1:d))){if((e|0)>0){e=0;while(1){g=e<<3;l=G[g+d>>2];if(l){Wa(l);G[g+G[309833]>>2]=0;d=G[309833]}G[(d+g|0)+4>>2]=0;e=e+1|0;if((e|0)>2]=b}Fa=f+192|0;break w}mb(G[h+108>>2],1,0,c);b=G[c>>2];if((b|0)<=0){d=h+25|0;while(1){Td(G[h+108>>2],h+100|0,h+96|0,c);b=1;if(G[h+100>>2]>0){while(1){e=b;Sd(G[h+108>>2],e,h,c);M:{if(G[h>>2]!=1431257936|G[h+4>>2]!=538989646){break M}if(!nb(d,41970,5)){break M}b=H[41971]|H[41972]<<8|(H[41973]<<16|H[41974]<<24);g=H[41967]|H[41968]<<8|(H[41969]<<16|H[41970]<<24);F[h+22>>1]=g;F[h+24>>1]=g>>>16;F[h+26>>1]=b;F[h+28>>1]=b>>>16;b=H[41965]|H[41966]<<8|(H[41967]<<16|H[41968]<<24);G[h+16>>2]=H[41961]|H[41962]<<8|(H[41963]<<16|H[41964]<<24);G[h+20>>2]=b;b=H[41957]|H[41958]<<8|(H[41959]<<16|H[41960]<<24);G[h+8>>2]=H[41953]|H[41954]<<8|(H[41955]<<16|H[41956]<<24);G[h+12>>2]=b;b=H[41949]|H[41950]<<8|(H[41951]<<16|H[41952]<<24);G[h>>2]=H[41945]|H[41946]<<8|(H[41947]<<16|H[41948]<<24);G[h+4>>2]=b}wb(j,h,c);b=e+1|0;if((e|0)>2]){continue}break}}xi(G[h+108>>2],0,c);Ke(j,c);b=G[c>>2];if((b|0)<=0){continue}break}}if((b|0)==107){G[c>>2]=0}Qb(G[h+108>>2],c)}mb(j,1,0,c)}Fa=h+112|0}if(!H[i+16|0]){break d}_m(G[a>>2],i+16|0,c);break d}}else{b=b+1|0;continue}break}G[c>>2]=124;Ua(50095);Ua(b)}e=G[c>>2];break a}e=113;G[c>>2]=113;break a}e=105;G[c>>2]=105}Fa=i+2208|0;return e}function Qe(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}c=0;d=0;while(1){e=G[l+29096>>2];k=e;e=k>>31;s=G[l+29072>>2];n=G[l+29076>>2];f=G[l+29068>>2];m=G[l+29064>>2];p=Au(G[l+29048>>2],G[l+29052>>2],v,w);m=m+p|0;f=Ia+f|0;f=m>>>0

>>0?f+1|0:f;x=m;m=G[l+29056>>2];q=G[l+29060>>2];p=G[l+29084>>2];r=Au(m,q,p,p>>31);p=x+r|0;f=Ia+f|0;Jb(a,p,p>>>0>>0?f+1|0:f,1,j);k=g>>>0>>0&(e|0)>=(h|0)|(e|0)>(h|0)?g:k;f=k>>31;e=n-((m>>>0>s>>>0)+q|0)|0;s=s-m|0;m=s;s=k>>>0>>0&(e|0)>=(f|0)|(e|0)>(f|0);m=s?k:m;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{e=G[l+29100>>2];switch(e-11|0){case 0:break h;case 10:break i;case 31:break j;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break m;case 5:break n;case 30:break o;default:break p}}switch(e-81|0){case 0:break g;case 1:break k;default:break m}}p=(c<<2)+i|0;u=L[l+29032>>3];e=u!=1;t=L[l+29024>>3];if(!(e|t!=2147483648)){if((m|0)<=0){break e}f=0;k=0;if(m-1>>>0>=3){r=m&-4;e=0;while(1){n=k<<2;q=l+32|0;G[n+q>>2]=G[p+n>>2]^-2147483648;s=n|4;G[s+q>>2]=G[p+s>>2]^-2147483648;s=n|8;G[s+q>>2]=G[p+s>>2]^-2147483648;n=n|12;G[n+q>>2]=G[p+n>>2]^-2147483648;k=k+4|0;e=e+4|0;if((r|0)!=(e|0)){continue}break}}e=m&3;if(!e){break e}while(1){n=k<<2;G[n+(l+32|0)>>2]=G[p+n>>2]^-2147483648;k=k+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}break e}if(!e&t==0){break f}k=0;if((m|0)<=0){break e}while(1){q:{r:{f=k<<2;o=(+J[f+p>>2]-t)/u;if(o<-2147483648.49){G[j>>2]=-11;break r}if(o>2147483647.49){G[j>>2]=-11;e=2147483647;break q}if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break r}e=~~o;break q}o=o+-.5;if(!(O(o)<2147483648)){break r}e=~~o;break q}e=-2147483648}G[f+(l+32|0)>>2]=e;k=k+1|0;if((k|0)!=(m|0)){continue}break}break e}if(H[l+28961|0]==115){break m}n=(c<<2)+i|0;q=l+28960|0;r=G[l+29088>>2];f=l+32|0;k=0;p=Fa-32|0;Fa=p;o=L[l+29032>>3];t=L[l+29024>>3];s:{if(!(o==1&t==0)){if((m|0)<=0){break s}e=f;while(1){L[p+16>>3]=(+J[n+(k<<2)>>2]-t)/o;Eb(e,q,p+16|0);e=e+r|0;if(H[e|0]){G[j>>2]=-11}k=k+1|0;if((k|0)!=(m|0)){continue}break}break s}if((m|0)<=0){break s}e=f;while(1){L[p>>3]=J[n+(k<<2)>>2];Eb(e,q,p);e=e+r|0;if(H[e|0]){G[j>>2]=-11}k=k+1|0;if((k|0)!=(m|0)){continue}break}}k=jb(f,44);if(k){while(1){E[k|0]=46;k=jb(k,44);if(k){continue}break}}Fa=p+32|0;e=G[l+29084>>2];f=G[l+29088>>2];if((e|0)!=(f|0)){break l}e=M(e,m);Wb(a,e,e>>31,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,f,m,e-f|0,l+32|0,j);break d}p=(c<<2)+i|0;o=L[l+29032>>3];t=L[l+29024>>3];t:{if(!(o==1&t==0)){if((m|0)<=0){break t}k=0;if((m|0)!=1){f=m&-2;e=0;while(1){n=l+32|0;L[n+(k<<3)>>3]=(+J[p+(k<<2)>>2]-t)/o;q=k|1;L[n+(q<<3)>>3]=(+J[p+(q<<2)>>2]-t)/o;k=k+2|0;e=e+2|0;if((f|0)!=(e|0)){continue}break}}if(!(m&1)){break t}L[(l+32|0)+(k<<3)>>3]=(+J[p+(k<<2)>>2]-t)/o;break t}if((m|0)<=0){break t}e=0;k=0;if(m-1>>>0>=3){q=m&-4;f=0;while(1){n=l+32|0;L[n+(k<<3)>>3]=J[p+(k<<2)>>2];r=k|1;L[n+(r<<3)>>3]=J[p+(r<<2)>>2];r=k|2;L[n+(r<<3)>>3]=J[p+(r<<2)>>2];r=k|3;L[n+(r<<3)>>3]=J[p+(r<<2)>>2];k=k+4|0;f=f+4|0;if((q|0)!=(f|0)){continue}break}}f=m&3;if(!f){break t}while(1){L[(l+32|0)+(k<<3)>>3]=J[p+(k<<2)>>2];k=k+1|0;e=e+1|0;if((f|0)!=(e|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}p=(c<<2)+i|0;o=L[l+29032>>3];t=L[l+29024>>3];u:{if(!(o==1&t==0)){if((m|0)<=0){break u}k=0;if((m|0)!=1){n=m&-2;f=0;while(1){e=k<<2;q=l+32|0;K[e+q>>2]=(+J[e+p>>2]-t)/o;e=e|4;K[e+q>>2]=(+J[e+p>>2]-t)/o;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(m&1)){break u}e=k<<2;K[e+(l+32|0)>>2]=(+J[e+p>>2]-t)/o;break u}if((m|0)<=0){break u}f=0;k=0;if(m-1>>>0>=3){r=m&-4;e=0;while(1){n=k<<2;q=l+32|0;K[n+q>>2]=J[p+n>>2];s=n|4;K[s+q>>2]=J[p+s>>2];s=n|8;K[s+q>>2]=J[p+s>>2];n=n|12;K[n+q>>2]=J[p+n>>2];k=k+4|0;e=e+4|0;if((r|0)!=(e|0)){continue}break}}e=m&3;if(!e){break u}while(1){n=k<<2;K[n+(l+32|0)>>2]=J[p+n>>2];k=k+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}p=(c<<2)+i|0;t=L[l+29032>>3];u=L[l+29024>>3];v:{if(!(t==1&u==0)){k=0;if((m|0)<=0){break v}while(1){f=(l+32|0)+(k<<1)|0;o=(+J[p+(k<<2)>>2]-u)/t;w:{if(o<-32768.49){G[j>>2]=-11;e=32768;break w}if(o>32767.49){G[j>>2]=-11;e=32767;break w}x:{if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break x}e=~~o;break w}o=o+-.5;if(!(O(o)<2147483648)){break x}e=~~o;break w}e=-2147483648}F[f>>1]=e;k=k+1|0;if((m|0)!=(k|0)){continue}break}break v}if((m|0)<=0){break v}k=0;if((m|0)!=1){n=m&-2;f=0;while(1){q=(l+32|0)+(k<<1)|0;e=G[p+(k<<2)>>2];if(e>>>0>=32768){G[j>>2]=-11;e=32767}F[q>>1]=e;q=k|1;e=G[p+(q<<2)>>2];if(e>>>0>32767){G[j>>2]=-11;e=32767}F[(l+32|0)+(q<<1)>>1]=e;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(m&1)){break v}f=(l+32|0)+(k<<1)|0;e=G[p+(k<<2)>>2];if(e>>>0>32767){G[j>>2]=-11;e=32767}F[f>>1]=e}Oe(a,m,G[l+29084>>2],l+32|0,j);break d}p=(c<<2)+i|0;t=L[l+29032>>3];u=L[l+29024>>3];y:{if(!(t==1&u==0)){k=0;if((m|0)<=0){break y}while(1){f=(l+32|0)+k|0;z:{A:{o=(+J[p+(k<<2)>>2]-u)/t;if(o<-.49){G[j>>2]=-11;break A}if(o>255.49){G[j>>2]=-11;e=255;break z}o=o+.5;if(!(o<4294967296&o>=0)){break A}e=~~o>>>0;break z}e=0}E[f|0]=e;k=k+1|0;if((m|0)!=(k|0)){continue}break}break y}if((m|0)<=0){break y}k=0;if((m|0)!=1){n=m&-2;f=0;while(1){q=(l+32|0)+k|0;e=G[p+(k<<2)>>2];if(e>>>0>=256){G[j>>2]=-11;e=255}E[q|0]=e;q=k|1;e=G[p+(q<<2)>>2];if(e>>>0>255){G[j>>2]=-11;e=255}E[q+(l+32|0)|0]=e;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(m&1)){break y}f=(l+32|0)+k|0;e=G[p+(k<<2)>>2];if(e>>>0>255){G[j>>2]=-11;e=255}E[f|0]=e}we(a,m,G[l+29084>>2],l+32|0,j);break d}p=(c<<2)+i|0;u=L[l+29032>>3];e=u!=1;t=L[l+29024>>3];B:{if(!(e|t!=0x8000000000000000)){if((m|0)<=0){break B}e=0;k=0;if(m-1>>>0>=3){q=m&-4;f=0;while(1){n=l+32|0;r=n+(k<<3)|0;G[r>>2]=G[p+(k<<2)>>2];G[r+4>>2]=-2147483648;r=k|1;s=n+(r<<3)|0;G[s>>2]=G[p+(r<<2)>>2];G[s+4>>2]=-2147483648;r=k|2;s=n+(r<<3)|0;G[s>>2]=G[p+(r<<2)>>2];G[s+4>>2]=-2147483648;r=k|3;n=n+(r<<3)|0;G[n>>2]=G[p+(r<<2)>>2];G[n+4>>2]=-2147483648;k=k+4|0;f=f+4|0;if((q|0)!=(f|0)){continue}break}}f=m&3;if(!f){break B}while(1){n=(l+32|0)+(k<<3)|0;G[n>>2]=G[p+(k<<2)>>2];G[n+4>>2]=-2147483648;k=k+1|0;e=e+1|0;if((f|0)!=(e|0)){continue}break}break B}if(!(!e&t==0)){k=0;if((m|0)<=0){break B}while(1){n=(l+32|0)+(k<<3)|0;C:{D:{o=(+J[p+(k<<2)>>2]-t)/u;if(o<-0x8000000000000000){G[j>>2]=-11;break D}if(o>0x8000000000000000){G[j>>2]=-11;f=2147483647;e=-1;break C}if(o>=0){o=o+.5;if(!(O(o)<0x8000000000000000)){break D}f=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~o>>>0;break C}o=o+-.5;if(!(O(o)<0x8000000000000000)){break D}f=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~o>>>0;break C}f=-2147483648;e=0}G[n>>2]=e;G[n+4>>2]=f;k=k+1|0;if((m|0)!=(k|0)){continue}break}break B}if((m|0)<=0){break B}e=0;k=0;if(m-1>>>0>=3){q=m&-4;f=0;while(1){n=l+32|0;r=n+(k<<3)|0;G[r>>2]=G[p+(k<<2)>>2];G[r+4>>2]=0;r=k|1;s=n+(r<<3)|0;G[s>>2]=G[p+(r<<2)>>2];G[s+4>>2]=0;r=k|2;s=n+(r<<3)|0;G[s>>2]=G[p+(r<<2)>>2];G[s+4>>2]=0;r=k|3;n=n+(r<<3)|0;G[n>>2]=G[p+(r<<2)>>2];G[n+4>>2]=0;k=k+4|0;f=f+4|0;if((q|0)!=(f|0)){continue}break}}f=m&3;if(!f){break B}while(1){n=(l+32|0)+(k<<3)|0;G[n>>2]=G[p+(k<<2)>>2];G[n+4>>2]=0;k=k+1|0;e=e+1|0;if((f|0)!=(e|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}if((m|0)<=0){break e}k=0;if((m|0)!=1){n=m&-2;f=0;while(1){q=k<<2;e=G[q+p>>2];if((e|0)<0){G[j>>2]=-11;e=2147483647}G[q+(l+32|0)>>2]=e;q=(k|1)<<2;e=G[q+p>>2];if((e|0)<0){G[j>>2]=-11;e=2147483647}G[q+(l+32|0)>>2]=e;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(m&1)){break e}e=k<<2;k=G[e+p>>2];if((k|0)<0){G[j>>2]=-11;k=2147483647}G[e+(l+32|0)>>2]=k}$c(a,m,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){f=d;a=c+1|0;f=a?f:f+1|0;L[l+16>>3]=+(a>>>0)+ +(f|0)*4294967296;e=m;f=e>>31;a=c+e|0;f=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?f+1|0:f)|0)*4294967296;a=l+28864|0;Ya(a,81,46437,l+16|0);Ua(a);break c}e=m;f=e>>31;s=f;h=h-(f+(e>>>0>g>>>0)|0)|0;g=g-e|0;if(!(h|g)){break b}f=d+s|0;c=c+e|0;f=c>>>0>>0?f+1|0:f;d=f;f=s+G[l+29060>>2]|0;m=e+G[l+29056>>2]|0;f=m>>>0>>0?f+1|0:f;e=m;G[l+29056>>2]=e;G[l+29060>>2]=f;if(G[l+29072>>2]!=(e|0)|G[l+29076>>2]!=(f|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;e=w;f=v+1|0;e=f?e:e+1|0;v=f;w=e;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function jf(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=0,N=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,i>>31,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o)|0)>0){p=G[o>>2];break a}G[q+29060>>2]=M(G[q+29060>>2],i);A=1;c=G[q+29080>>2];R=c;S=c>>31;b:{if(G[q+29084>>2]!=16){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);d=G[q+29068>>2];if((d|0)<=0){break b}if(d-1>>>0>=7){c=d&-8;while(1){A=A*10*10*10*10*10*10*10*10;w=w+8|0;if((c|0)!=(w|0)){continue}break}}c=d&7;if(!c){break b}w=0;while(1){A=A*10;w=w+1|0;if((c|0)!=(w|0)){continue}break}}w=0;p=G[q+29084>>2];c:{d:{e:{if(k?0:(j|0)==1){break e}f=G[q+29028>>2];c=G[q+29024>>2];if(!f&(c|0)==1234554321&((p|0)%10|0)==1){break e}e=f-(c>>>0<32768)|0;if(((e|0)==-1&c-32768>>>0<4294901760|(e|0)!=-1)&(p|0)==21){break d}N=0;if(!(!f&c>>>0<=255|(p|0)!=11)){break c}w=(p|0)==16?H[q+28864|0]==1?0:j:j}N=0;if((p|0)!=21){break c}}c=g>>>0<1073741823&(h|0)<=0|(h|0)<0;R=c?g:1073741823;S=c?h:0;N=!w&L[q+29096>>3]==1&L[q+29088>>3]==0}X=0-i|0;e=0;f=0;f:{while(1){c=g>>>0>>0&(h|0)<=(S|0)|(h|0)<(S|0)?g:R;d=c>>31;y=c;x=d;g:{if((i|0)>=0){d=G[q+29036>>2];p=G[q+29052>>2]+(d^-1)|0;c=G[q+29032>>2];j=c^-1;t=j+G[q+29048>>2]|0;t=Bu(t,j>>>0>t>>>0?p+1|0:p,i,0);j=Ia;break g}c=G[q+29032>>2];d=G[q+29036>>2];t=Bu(c,d,X,0);j=Ia}r=G[q+29044>>2];z=G[q+29040>>2];p=Au(G[q+29016>>2],G[q+29020>>2],B,D);s=z+p|0;r=Ia+r|0;r=p>>>0>s>>>0?r+1|0:r;p=c;v=G[q+29060>>2];c=(v|0)/(i|0)|0;d=Au(p,d,c,c>>31);p=d+s|0;c=Ia+r|0;c=d>>>0>p>>>0?c+1|0:c;z=p;p=j;d=t+1|0;p=d;d=t>>>0>>0&(j|0)<=(x|0)|(j|0)<(x|0);s=d?p:y;h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{d=G[q+29084>>2];switch(d-11|0){case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break j;case 5:break k;case 31:break m;case 30:break n;case 0:break o;case 10:break p;default:break q}}switch(d-81|0){case 0:break i;case 1:break l;default:break j}}d=c;c=(e<<1)+l|0;Pe(a,z,d,s,v,c,o);if(N){break h}Op(c,s,L[q+29096>>3],L[q+29088>>3],w,F[q+29024>>1],k,e+m|0,n,c,o);break h}d=c;c=q- -64|0;$d(a,z,d,s,v,c,o);Np(c,s,L[q+29096>>3],L[q+29088>>3],w,H[q+29024|0],k,e+m|0,n,(e<<1)+l|0,o);break h}d=c;c=q- -64|0;Uc(a,z,d,s,v,c,o);Yk(c,s,L[q+29096>>3],L[q+29088>>3],w,G[q+29024>>2],k,e+m|0,n,(e<<1)+l|0,o);break h}d=c;c=q- -64|0;Uc(a,z,d,s,v,c,o);Xk(c,s,L[q+29096>>3],L[q+29088>>3],w,k,e+m|0,n,(e<<1)+l|0,o);break h}d=c;c=q- -64|0;Tc(a,z,d,s,v,c,o);Wk(c,s,L[q+29096>>3],L[q+29088>>3],w,k,e+m|0,n,(e<<1)+l|0,o);break h}Jb(a,z,c,0,o);d=G[q+29060>>2];c=G[q+29064>>2];r:{if((d|0)==(c|0)){c=M(d,s);ic(a,c,c>>31,q- -64|0,o);break r}Rd(a,c,s,d-c|0,q- -64|0,o)}t=q- -64|0;I=L[q+29096>>3];K=L[q+29088>>3];Y=G[q+29064>>2];z=e+m|0;Q=(e<<1)+l|0;C=0;r=Fa-112|0;Fa=r;T=q+28864|0;v=Va(T);if((s|0)>0){while(1){s:{c=t+Y|0;V=H[c|0];E[c|0]=0;j=t;t:{u:{if(H[T|0]==1){break u}if(fb(T,t,v)){break u}j=c;if(!w){break t}G[n>>2]=1;if((w|0)==1){F[(C<<1)+Q>>1]=k;break t}E[z+C|0]=1;break t}while(1){d=H[j|0];if((d|0)==32){j=j+1|0;continue}break}W=1;v:{switch(d-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};W=(d|0)==45?-1:1;d=p;break;default:break v}}P=0;if((d-48&255)>>>0<10){while(1){u=P*10+ +(d<<24>>24);p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}P=u+-48;if((d-48&255)>>>0<=9){continue}break}}u=A;w:{x:{switch(d-44|0){case 0:case 2:break x;default:break w}}p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}u=1;if((d-48&255)>>>0>=10){break w}while(1){P=P*10+ +(d<<24>>24)+-48;p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}u=u*10;if((d-48&255)>>>0<=9){continue}break}}y:{if((d&254)!=68){U=1;p=0;break y}while(1){U=1;p=j;j=p+1|0;d=H[p+1|0];if((d|0)==32){continue}break}z:{switch(d-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=p+1|0;x=H[j|0];if((x|0)==32){continue}break};U=(d|0)==45?-1:1;d=x;break;default:break z}}p=0;if((d-48&255)>>>0>=10){break y}while(1){x=d;y=M(p,10)-48|0;p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}p=(x<<24>>24)+y|0;if((d-48&255)>>>0<=9){continue}break}}if(d){G[r+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);d=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[r+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[r+44>>2]=d;d=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[r+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[r+36>>2]=d;d=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[r+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[r+28>>2]=d;d=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[r+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[r+20>>2]=d;d=r+16|0;Ua(d);G[r>>2]=t;Ya(d,81,43022,r);Ua(d);E[c|0]=V;G[o>>2]=409;break s}u=P*+(W|0)/u*$b(10,+(M(p,U)|0))*I+K;A:{if(u<-32768.49){G[o>>2]=-11;F[(C<<1)+Q>>1]=32768;break A}if(u>32767.49){G[o>>2]=-11;F[(C<<1)+Q>>1]=32767;break A}d=(C<<1)+Q|0;if(O(u)<2147483648){p=~~u}else{p=-2147483648}F[d>>1]=p}}t=j;E[c|0]=V;C=C+1|0;if((C|0)!=(s|0)){continue}}break}}Fa=r+112|0;break h}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8924,q);Ua(a);p=311;if(G[q+29076>>2]==1){break f}p=312;break f}y=q- -64|0;Tc(a,z,c,s,v,y,o);x=G[q+29024>>2];t=G[q+29028>>2];j=e+m|0;v=(e<<1)+l|0;I=L[q+29096>>3];K=L[q+29088>>3];c=I==1&K==0x8000000000000000;B:{C:{D:{E:{F:{if(!w){if(c){if((s|0)<=0){break B}p=0;if((s|0)!=1){x=s&-2;t=0;while(1){j=v+(p<<1)|0;c=y+(p<<3)|0;d=G[c+4>>2];c=G[c>>2];if((d|0)!=-2147483648|c>>>0>=32768){G[o>>2]=-11;c=32767}F[j>>1]=c;j=p|1;c=y+(j<<3)|0;d=G[c+4>>2];c=G[c>>2];if(!((d|0)==-2147483648&c>>>0<=32767)){G[o>>2]=-11;c=32767}F[v+(j<<1)>>1]=c;p=p+2|0;t=t+2|0;if((x|0)!=(t|0)){continue}break}}if(!(s&1)){break B}c=y+(p<<3)|0;d=G[c+4>>2];c=G[c>>2];if((d|0)!=-2147483648|c>>>0>32767){break F}break E}if(I==1&K==0){break C}p=0;if((s|0)<=0){break B}while(1){d=v+(p<<1)|0;c=y+(p<<3)|0;u=(+J[c>>2]+ +G[c+4>>2]*4294967296)*I+K;G:{if(u<-32768.49){G[o>>2]=-11;c=32768;break G}if(u>32767.49){G[o>>2]=-11;c=32767;break G}c=~~u;if(O(u)<2147483648){break G}c=-2147483648}F[d>>1]=c;p=p+1|0;if((s|0)!=(p|0)){continue}break}break B}if(c){if((s|0)<=0){break B}p=0;while(1){c=y+(p<<3)|0;d=G[c>>2];c=G[c+4>>2];H:{if((d|0)==(x|0)&(c|0)==(t|0)){G[n>>2]=1;if((w|0)==1){F[v+(p<<1)>>1]=k;break H}E[j+p|0]=1;break H}if((c|0)!=-2147483648|d>>>0>=32768){G[o>>2]=-11;F[v+(p<<1)>>1]=32767;break H}F[v+(p<<1)>>1]=d}p=p+1|0;if((s|0)!=(p|0)){continue}break}break B}if(I==1&K==0){break D}if((s|0)<=0){break B}p=0;while(1){c=y+(p<<3)|0;d=G[c>>2];c=G[c+4>>2];I:{if((d|0)==(x|0)&(c|0)==(t|0)){G[n>>2]=1;if((w|0)==1){F[v+(p<<1)>>1]=k;break I}E[j+p|0]=1;break I}u=(+(d>>>0)+ +(c|0)*4294967296)*I+K;if(u<-32768.49){G[o>>2]=-11;F[v+(p<<1)>>1]=32768;break I}if(u>32767.49){G[o>>2]=-11;F[v+(p<<1)>>1]=32767;break I}c=v+(p<<1)|0;if(O(u)<2147483648){d=~~u}else{d=-2147483648}F[c>>1]=d}p=p+1|0;if((s|0)!=(p|0)){continue}break}break B}G[o>>2]=-11;c=32767}F[v+(p<<1)>>1]=c;break B}if((s|0)<=0){break B}p=0;while(1){c=y+(p<<3)|0;d=G[c>>2];c=G[c+4>>2];J:{if((d|0)==(x|0)&(c|0)==(t|0)){G[n>>2]=1;if((w|0)==1){F[v+(p<<1)>>1]=k;break J}E[j+p|0]=1;break J}if((c|0)<0&d>>>0<=4294934527|(c|0)<-1){G[o>>2]=-11;F[v+(p<<1)>>1]=32768;break J}if((c|0)>=0&d>>>0>=32768|(c|0)>0){G[o>>2]=-11;F[v+(p<<1)>>1]=32767;break J}F[v+(p<<1)>>1]=d}p=p+1|0;if((s|0)!=(p|0)){continue}break}break B}if((s|0)<=0){break B}p=0;while(1){j=v+(p<<1)|0;d=y+(p<<3)|0;c=G[d+4>>2];d=G[d>>2];K:{if((c|0)<0&d>>>0<=4294934527|(c|0)<-1){G[o>>2]=-11;d=32768;break K}if((c|0)>=0&d>>>0>=32768|(c|0)>0){G[o>>2]=-11;d=32767;break K}}F[j>>1]=d;p=p+1|0;if((s|0)!=(p|0)){continue}break}}}p=G[o>>2];if((p|0)>0){u=+(e>>>0)+ +(f|0)*4294967296;A=u+1;u=u+ +(s|0);L:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=u;L[q+16>>3]=A;Ya(q+28896|0,81,47140,q+16|0);break L}L[q+56>>3]=u;L[q+48>>3]=A;Ya(q+28896|0,81,47081,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}d=s;j=d>>31;h=h-((d>>>0>g>>>0)+j|0)|0;g=g-d|0;if(h|g){c=M(i,s);t=c+G[q+29032>>2]|0;p=G[q+29036>>2]+(c>>31)|0;p=c>>>0>t>>>0?p+1|0:p;c=t;G[q+29032>>2]=c;G[q+29036>>2]=p;r=f+j|0;e=d+e|0;r=e>>>0>>0?r+1|0:r;f=r;r=G[q+29052>>2];d=r;x=G[q+29048>>2];if((p|0)>=(d|0)&c>>>0>=x>>>0|(d|0)<(p|0)){j=Bu(c,p,x,r);t=B+j|0;d=Ia;D=D+d|0;D=t>>>0>>0?D+1|0:D;B=t;d=Au(x,r,j,d);G[q+29032>>2]=c-d;G[q+29036>>2]=p-(Ia+(c>>>0>>0)|0);continue}if((p|0)>0|(p|0)>=0){continue}j=B;B=Bu(c^-1,p^-1,x,r)+1|0;d=Ia;d=B?d:d+1|0;t=B;B=j-t|0;D=D-((j>>>0>>0)+d|0)|0;d=Au(x,r,t,d)+c|0;r=p+Ia|0;G[q+29032>>2]=d;G[q+29036>>2]=c>>>0>d>>>0?r+1|0:r;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function Ah(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}c=0;d=0;while(1){e=G[l+29096>>2];v=e;e=e>>31;o=G[l+29072>>2];p=G[l+29076>>2];f=G[l+29068>>2];m=G[l+29064>>2];n=Au(G[l+29048>>2],G[l+29052>>2],w,x);k=m+n|0;f=Ia+f|0;f=k>>>0>>0?f+1|0:f;t=k;k=G[l+29056>>2];m=G[l+29060>>2];n=G[l+29084>>2];r=Au(k,m,n,n>>31);n=t+r|0;f=Ia+f|0;Jb(a,n,n>>>0>>0?f+1|0:f,1,j);v=g>>>0>>0&(e|0)>=(h|0)|(e|0)>(h|0)?g:v;e=v;f=e>>31;e=p-((k>>>0>o>>>0)+m|0)|0;o=o-k|0;m=o;o=o>>>0>v>>>0&(e|0)>=(f|0)|(e|0)>(f|0);v=o?v:m;e=v;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{f=G[l+29100>>2];switch(f-11|0){case 0:break g;case 30:break h;case 31:break i;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break k;case 5:break l;case 10:break m;default:break n}}o:{switch(f-81|0){case 1:break j;case 0:break o;default:break k}}p=(c<<1)+i|0;u=L[l+29032>>3];f=u!=1;s=L[l+29024>>3];if(!(f|s!=0x8000000000000000)){if((e|0)<=0){break e}f=0;k=0;if(e-1>>>0>=3){r=e&-4;n=0;while(1){m=l+32|0;o=m+(k<<3)|0;G[o>>2]=I[p+(k<<1)>>1];G[o+4>>2]=-2147483648;o=k|1;t=m+(o<<3)|0;G[t>>2]=I[p+(o<<1)>>1];G[t+4>>2]=-2147483648;o=k|2;t=m+(o<<3)|0;G[t>>2]=I[p+(o<<1)>>1];G[t+4>>2]=-2147483648;o=m;m=k|3;o=o+(m<<3)|0;G[o>>2]=I[p+(m<<1)>>1];G[o+4>>2]=-2147483648;k=k+4|0;n=n+4|0;if((r|0)!=(n|0)){continue}break}}n=e&3;if(!n){break e}while(1){m=(l+32|0)+(k<<3)|0;G[m>>2]=I[p+(k<<1)>>1];G[m+4>>2]=-2147483648;k=k+1|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}break e}if(!f&s==0){break f}k=0;if((e|0)<=0){break e}while(1){m=(l+32|0)+(k<<3)|0;p:{q:{q=(+I[p+(k<<1)>>1]-s)/u;if(q<-0x8000000000000000){G[j>>2]=-11;break q}if(q>0x8000000000000000){G[j>>2]=-11;n=2147483647;f=-1;break p}if(q>=0){q=q+.5;if(!(O(q)<0x8000000000000000)){break q}n=O(q)>=1?~~(q>0?Q(S(q*2.3283064365386963e-10),4294967295):T((q-+(~~q>>>0>>>0))*2.3283064365386963e-10))>>>0:0;f=~~q>>>0;break p}q=q+-.5;if(!(O(q)<0x8000000000000000)){break q}n=O(q)>=1?~~(q>0?Q(S(q*2.3283064365386963e-10),4294967295):T((q-+(~~q>>>0>>>0))*2.3283064365386963e-10))>>>0:0;f=~~q>>>0;break p}n=-2147483648;f=0}G[m>>2]=f;G[m+4>>2]=n;k=k+1|0;if((e|0)!=(k|0)){continue}break}break e}n=(c<<1)+i|0;f=l+32|0;m=0;u=L[l+29032>>3];k=u!=1;s=L[l+29024>>3];r:{if(!(k|s!=32768)){if((e|0)<=0){break r}k=0;if(e-1>>>0>=3){o=e&-4;r=0;while(1){p=k<<1;F[p+f>>1]=I[p+n>>1]^32768;t=p|2;F[t+f>>1]=I[n+t>>1]^32768;t=p|4;F[t+f>>1]=I[n+t>>1]^32768;p=p|6;F[p+f>>1]=I[p+n>>1]^32768;k=k+4|0;r=r+4|0;if((o|0)!=(r|0)){continue}break}}p=e&3;if(!p){break r}while(1){r=k<<1;F[r+f>>1]=I[n+r>>1]^32768;k=k+1|0;m=m+1|0;if((p|0)!=(m|0)){continue}break}break r}if(!(!k&s==0)){k=0;if((e|0)<=0){break r}while(1){m=k<<1;q=(+I[m+n>>1]-s)/u;s:{if(q<-32768.49){G[j>>2]=-11;p=32768;break s}if(q>32767.49){G[j>>2]=-11;p=32767;break s}t:{if(q>=0){q=q+.5;if(!(O(q)<2147483648)){break t}p=~~q;break s}q=q+-.5;if(!(O(q)<2147483648)){break t}p=~~q;break s}p=-2147483648}F[f+m>>1]=p;k=k+1|0;if((e|0)!=(k|0)){continue}break}break r}if((e|0)<=0){break r}k=0;if((e|0)!=1){r=e&-2;while(1){o=k<<1;p=F[o+n>>1];if((p|0)<0){G[j>>2]=-11;p=32767}F[f+o>>1]=p;o=(k|1)<<1;p=F[o+n>>1];if((p|0)<0){G[j>>2]=-11;p=32767}F[f+o>>1]=p;k=k+2|0;m=m+2|0;if((r|0)!=(m|0)){continue}break}}if(!(e&1)){break r}m=n;n=k<<1;k=F[m+n>>1];if((k|0)<0){G[j>>2]=-11;k=32767}F[f+n>>1]=k}Oe(a,e,G[l+29084>>2],f,j);break d}if(H[l+28961|0]==115){break k}m=(c<<1)+i|0;k=e;r=l+28960|0;o=G[l+29088>>2];f=l+32|0;n=0;p=Fa-32|0;Fa=p;q=L[l+29032>>3];s=L[l+29024>>3];u:{if(!(q==1&s==0)){if((k|0)<=0){break u}e=f;while(1){L[p+16>>3]=(+I[m+(n<<1)>>1]-s)/q;Eb(e,r,p+16|0);e=e+o|0;if(H[e|0]){G[j>>2]=-11}n=n+1|0;if((k|0)!=(n|0)){continue}break}break u}if((k|0)<=0){break u}e=f;while(1){L[p>>3]=I[m+(n<<1)>>1];Eb(e,r,p);e=e+o|0;if(H[e|0]){G[j>>2]=-11}n=n+1|0;if((k|0)!=(n|0)){continue}break}}n=jb(f,44);if(n){while(1){E[n|0]=46;n=jb(n,44);if(n){continue}break}}Fa=p+32|0;e=G[l+29084>>2];f=G[l+29088>>2];if((e|0)==(f|0)){e=M(e,k);Wb(a,e,e>>31,l+32|0,j);break d}wd(a,f,k,e-f|0,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}p=(c<<1)+i|0;q=L[l+29032>>3];s=L[l+29024>>3];v:{if(!(q==1&s==0)){if((e|0)<=0){break v}k=0;if((e|0)!=1){n=e&-2;f=0;while(1){m=l+32|0;L[m+(k<<3)>>3]=(+I[p+(k<<1)>>1]-s)/q;o=m;m=k|1;L[o+(m<<3)>>3]=(+I[p+(m<<1)>>1]-s)/q;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(e&1)){break v}L[(l+32|0)+(k<<3)>>3]=(+I[p+(k<<1)>>1]-s)/q;break v}if((e|0)<=0){break v}f=0;k=0;if(e-1>>>0>=3){r=e&-4;n=0;while(1){m=l+32|0;L[m+(k<<3)>>3]=I[p+(k<<1)>>1];o=k|1;L[m+(o<<3)>>3]=I[p+(o<<1)>>1];o=k|2;L[m+(o<<3)>>3]=I[p+(o<<1)>>1];o=m;m=k|3;L[o+(m<<3)>>3]=I[p+(m<<1)>>1];k=k+4|0;n=n+4|0;if((r|0)!=(n|0)){continue}break}}n=e&3;if(!n){break v}while(1){L[(l+32|0)+(k<<3)>>3]=I[p+(k<<1)>>1];k=k+1|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}}_c(a,e,G[l+29084>>2],l+32|0,j);break d}p=(c<<1)+i|0;q=L[l+29032>>3];s=L[l+29024>>3];w:{if(!(q==1&s==0)){if((e|0)<=0){break w}k=0;if((e|0)!=1){n=e&-2;f=0;while(1){m=l+32|0;K[m+(k<<2)>>2]=(+I[p+(k<<1)>>1]-s)/q;o=m;m=k|1;K[o+(m<<2)>>2]=(+I[p+(m<<1)>>1]-s)/q;k=k+2|0;f=f+2|0;if((n|0)!=(f|0)){continue}break}}if(!(e&1)){break w}K[(l+32|0)+(k<<2)>>2]=(+I[p+(k<<1)>>1]-s)/q;break w}if((e|0)<=0){break w}f=0;k=0;if(e-1>>>0>=3){r=e&-4;n=0;while(1){m=l+32|0;K[m+(k<<2)>>2]=I[p+(k<<1)>>1];o=k|1;K[m+(o<<2)>>2]=I[p+(o<<1)>>1];o=k|2;K[m+(o<<2)>>2]=I[p+(o<<1)>>1];o=m;m=k|3;K[o+(m<<2)>>2]=I[p+(m<<1)>>1];k=k+4|0;n=n+4|0;if((r|0)!=(n|0)){continue}break}}n=e&3;if(!n){break w}while(1){K[(l+32|0)+(k<<2)>>2]=I[p+(k<<1)>>1];k=k+1|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}}$c(a,e,G[l+29084>>2],l+32|0,j);break d}p=(c<<1)+i|0;s=L[l+29032>>3];u=L[l+29024>>3];x:{if(!(s==1&u==0)){k=0;if((e|0)<=0){break x}while(1){m=(l+32|0)+(k<<2)|0;y:{z:{q=(+I[p+(k<<1)>>1]-u)/s;if(q<-2147483648.49){G[j>>2]=-11;break z}if(q>2147483647.49){G[j>>2]=-11;f=2147483647;break y}if(q>=0){q=q+.5;if(!(O(q)<2147483648)){break z}f=~~q;break y}q=q+-.5;if(!(O(q)<2147483648)){break z}f=~~q;break y}f=-2147483648}G[m>>2]=f;k=k+1|0;if((e|0)!=(k|0)){continue}break}break x}if((e|0)<=0){break x}f=0;k=0;if(e-1>>>0>=3){r=e&-4;n=0;while(1){m=l+32|0;G[m+(k<<2)>>2]=I[p+(k<<1)>>1];o=k|1;G[m+(o<<2)>>2]=I[p+(o<<1)>>1];o=k|2;G[m+(o<<2)>>2]=I[p+(o<<1)>>1];o=m;m=k|3;G[o+(m<<2)>>2]=I[p+(m<<1)>>1];k=k+4|0;n=n+4|0;if((r|0)!=(n|0)){continue}break}}n=e&3;if(!n){break x}while(1){G[(l+32|0)+(k<<2)>>2]=I[p+(k<<1)>>1];k=k+1|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}}$c(a,e,G[l+29084>>2],l+32|0,j);break d}p=(c<<1)+i|0;s=L[l+29032>>3];u=L[l+29024>>3];A:{if(!(s==1&u==0)){k=0;if((e|0)<=0){break A}while(1){m=(l+32|0)+k|0;B:{C:{q=(+I[p+(k<<1)>>1]-u)/s;if(q<-.49){G[j>>2]=-11;break C}if(q>255.49){G[j>>2]=-11;f=255;break B}q=q+.5;if(!(q<4294967296&q>=0)){break C}f=~~q>>>0;break B}f=0}E[m|0]=f;k=k+1|0;if((e|0)!=(k|0)){continue}break}break A}if((e|0)<=0){break A}k=0;if((e|0)!=1){m=e&-2;n=0;while(1){r=(l+32|0)+k|0;f=I[p+(k<<1)>>1];if(f>>>0>=256){G[j>>2]=-11;f=255}E[r|0]=f;r=k|1;f=I[p+(r<<1)>>1];if(f>>>0>255){G[j>>2]=-11;f=255}E[r+(l+32|0)|0]=f;k=k+2|0;n=n+2|0;if((m|0)!=(n|0)){continue}break}}if(!(e&1)){break A}n=(l+32|0)+k|0;f=I[p+(k<<1)>>1];if(f>>>0>255){G[j>>2]=-11;f=255}E[n|0]=f}we(a,e,G[l+29084>>2],l+32|0,j);break d}if((e|0)<=0){break e}f=0;k=0;if(e-1>>>0>=3){r=e&-4;n=0;while(1){m=l+32|0;o=m+(k<<3)|0;G[o>>2]=I[p+(k<<1)>>1];G[o+4>>2]=0;o=k|1;t=m+(o<<3)|0;G[t>>2]=I[p+(o<<1)>>1];G[t+4>>2]=0;o=k|2;t=m+(o<<3)|0;G[t>>2]=I[p+(o<<1)>>1];G[t+4>>2]=0;o=m;m=k|3;o=o+(m<<3)|0;G[o>>2]=I[p+(m<<1)>>1];G[o+4>>2]=0;k=k+4|0;n=n+4|0;if((r|0)!=(n|0)){continue}break}}n=e&3;if(!n){break e}while(1){m=(l+32|0)+(k<<3)|0;G[m>>2]=I[p+(k<<1)>>1];G[m+4>>2]=0;k=k+1|0;f=f+1|0;if((n|0)!=(f|0)){continue}break}}_c(a,e,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){f=d;a=c+1|0;f=a?f:f+1|0;L[l+16>>3]=+(a>>>0)+ +(f|0)*4294967296;e=v;f=e>>31;a=c+e|0;f=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?f+1|0:f)|0)*4294967296;a=l+28864|0;Ya(a,81,46820,l+16|0);Ua(a);break c}e=v;f=e>>31;o=f;h=h-(f+(e>>>0>g>>>0)|0)|0;g=g-e|0;if(!(h|g)){break b}f=d+o|0;c=c+e|0;f=c>>>0>>0?f+1|0:f;d=f;f=o+G[l+29060>>2]|0;k=e+G[l+29056>>2]|0;f=k>>>0>>0?f+1|0:f;G[l+29056>>2]=k;G[l+29060>>2]=f;if(G[l+29072>>2]!=(k|0)|G[l+29076>>2]!=(f|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;e=x;f=w+1|0;e=f?e:e+1|0;w=f;x=e;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function Bh(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}c=0;d=0;while(1){e=G[l+29096>>2];r=e;e=e>>31;o=G[l+29072>>2];t=G[l+29076>>2];f=G[l+29068>>2];m=G[l+29064>>2];k=Au(G[l+29048>>2],G[l+29052>>2],w,x);m=m+k|0;f=Ia+f|0;f=k>>>0>m>>>0?f+1|0:f;n=m;k=G[l+29056>>2];p=G[l+29060>>2];m=G[l+29084>>2];u=Au(k,p,m,m>>31);n=n+u|0;m=Ia+f|0;Jb(a,n,n>>>0>>0?m+1|0:m,1,j);m=g>>>0>>0&(e|0)>=(h|0)|(e|0)>(h|0)?g:r;e=m;f=e>>31;n=e;e=t-((k>>>0>o>>>0)+p|0)|0;o=o-k|0;m=m>>>0>>0&(e|0)>=(f|0)|(e|0)>(f|0);o=m?n:o;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{e=G[l+29100>>2];switch(e-11|0){case 10:break h;case 30:break i;case 31:break j;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break m;case 5:break n;case 0:break o;default:break p}}switch(e-81|0){case 0:break g;case 1:break k;default:break m}}r=c+i|0;v=L[l+29032>>3];e=v!=1;q=L[l+29024>>3];if(!(e|q!=-128)){if((o|0)<=0){break e}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;E[n+k|0]=H[k+r|0]^128;p=k|1;E[p+n|0]=H[r+p|0]^128;p=k|2;E[p+n|0]=H[r+p|0]^128;f=n;n=k|3;E[f+n|0]=H[r+n|0]^128;k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break e}while(1){E[(l+32|0)+k|0]=H[k+r|0]^128;k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}break e}if(!e&q==0){break f}k=0;if((o|0)<=0){break e}while(1){f=(l+32|0)+k|0;q:{r:{s=(+E[k+r|0]-q)/v;if(s<-.49){G[j>>2]=-11;break r}if(s>255.49){G[j>>2]=-11;e=255;break q}s=s+.5;if(!(s<4294967296&s>=0)){break r}e=~~s>>>0;break q}e=0}E[f|0]=e;k=k+1|0;if((o|0)!=(k|0)){continue}break}break e}if(jb(l+28992|0,65)){m=G[l+29084>>2];e=G[l+29088>>2];if((m|0)!=(e|0)){break l}e=o;m=e>>31;Wb(a,e,m,c+i|0,j);break d}if(H[l+28961|0]==115){break m}n=c+i|0;t=l+28960|0;p=G[l+29088>>2];m=l+32|0;k=0;r=Fa-32|0;Fa=r;q=L[l+29032>>3];s=L[l+29024>>3];s:{if(!(q==1&s==0)){if((o|0)<=0){break s}e=m;while(1){L[r+16>>3]=(+E[k+n|0]-s)/q;Eb(e,t,r+16|0);e=e+p|0;if(H[e|0]){G[j>>2]=-11}k=k+1|0;if((o|0)!=(k|0)){continue}break}break s}if((o|0)<=0){break s}e=m;while(1){L[r>>3]=E[k+n|0];Eb(e,t,r);e=e+p|0;if(H[e|0]){G[j>>2]=-11}k=k+1|0;if((o|0)!=(k|0)){continue}break}}k=jb(m,44);if(k){while(1){E[k|0]=46;k=jb(k,44);if(k){continue}break}}Fa=r+32|0;e=G[l+29084>>2];m=G[l+29088>>2];if((e|0)==(m|0)){e=M(e,o);Wb(a,e,e>>31,l+32|0,j);break d}wd(a,m,o,e-m|0,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,e,(o|0)/(e|0)|0,m-e|0,c+i|0,j);break d}r=c+i|0;q=L[l+29032>>3];s=L[l+29024>>3];t:{if(!(q==1&s==0)){if((o|0)<=0){break t}k=0;if((o|0)!=1){m=o&-2;e=0;while(1){n=l+32|0;L[n+(k<<3)>>3]=(+E[k+r|0]-s)/q;f=n;n=k|1;L[f+(n<<3)>>3]=(+E[r+n|0]-s)/q;k=k+2|0;e=e+2|0;if((m|0)!=(e|0)){continue}break}}if(!(o&1)){break t}L[(l+32|0)+(k<<3)>>3]=(+E[k+r|0]-s)/q;break t}if((o|0)<=0){break t}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;L[n+(k<<3)>>3]=E[k+r|0];p=k|1;L[n+(p<<3)>>3]=E[r+p|0];p=k|2;L[n+(p<<3)>>3]=E[r+p|0];p=k|3;L[n+(p<<3)>>3]=E[r+p|0];k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break t}while(1){L[(l+32|0)+(k<<3)>>3]=E[k+r|0];k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}_c(a,o,G[l+29084>>2],l+32|0,j);break d}r=c+i|0;q=L[l+29032>>3];s=L[l+29024>>3];u:{if(!(q==1&s==0)){if((o|0)<=0){break u}k=0;if((o|0)!=1){m=o&-2;e=0;while(1){n=l+32|0;K[n+(k<<2)>>2]=(+E[k+r|0]-s)/q;f=n;n=k|1;K[f+(n<<2)>>2]=(+E[r+n|0]-s)/q;k=k+2|0;e=e+2|0;if((m|0)!=(e|0)){continue}break}}if(!(o&1)){break u}K[(l+32|0)+(k<<2)>>2]=(+E[k+r|0]-s)/q;break u}if((o|0)<=0){break u}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;K[n+(k<<2)>>2]=E[k+r|0];p=k|1;K[n+(p<<2)>>2]=E[r+p|0];p=k|2;K[n+(p<<2)>>2]=E[r+p|0];p=k|3;K[n+(p<<2)>>2]=E[r+p|0];k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break u}while(1){K[(l+32|0)+(k<<2)>>2]=E[k+r|0];k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}$c(a,o,G[l+29084>>2],l+32|0,j);break d}r=c+i|0;s=L[l+29032>>3];v=L[l+29024>>3];v:{if(!(s==1&v==0)){k=0;if((o|0)<=0){break v}while(1){f=(l+32|0)+(k<<2)|0;w:{x:{q=(+E[k+r|0]-v)/s;if(q<-2147483648.49){G[j>>2]=-11;break x}if(q>2147483647.49){G[j>>2]=-11;e=2147483647;break w}if(q>=0){q=q+.5;if(!(O(q)<2147483648)){break x}e=~~q;break w}q=q+-.5;if(!(O(q)<2147483648)){break x}e=~~q;break w}e=-2147483648}G[f>>2]=e;k=k+1|0;if((o|0)!=(k|0)){continue}break}break v}if((o|0)<=0){break v}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;G[n+(k<<2)>>2]=E[k+r|0];p=k|1;G[n+(p<<2)>>2]=E[r+p|0];p=k|2;G[n+(p<<2)>>2]=E[r+p|0];p=k|3;G[n+(p<<2)>>2]=E[r+p|0];k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break v}while(1){G[(l+32|0)+(k<<2)>>2]=E[k+r|0];k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}$c(a,o,G[l+29084>>2],l+32|0,j);break d}r=c+i|0;s=L[l+29032>>3];v=L[l+29024>>3];y:{if(!(s==1&v==0)){k=0;if((o|0)<=0){break y}while(1){f=(l+32|0)+(k<<1)|0;q=(+E[k+r|0]-v)/s;z:{if(q<-32768.49){G[j>>2]=-11;e=32768;break z}if(q>32767.49){G[j>>2]=-11;e=32767;break z}A:{if(q>=0){q=q+.5;if(!(O(q)<2147483648)){break A}e=~~q;break z}q=q+-.5;if(!(O(q)<2147483648)){break A}e=~~q;break z}e=-2147483648}F[f>>1]=e;k=k+1|0;if((o|0)!=(k|0)){continue}break}break y}if((o|0)<=0){break y}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;F[n+(k<<1)>>1]=E[k+r|0];p=k|1;F[n+(p<<1)>>1]=E[r+p|0];p=k|2;F[n+(p<<1)>>1]=E[r+p|0];p=k|3;F[n+(p<<1)>>1]=E[r+p|0];k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break y}while(1){F[(l+32|0)+(k<<1)>>1]=E[k+r|0];k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}Oe(a,o,G[l+29084>>2],l+32|0,j);break d}r=c+i|0;B:{C:{D:{E:{v=L[l+29032>>3];e=v!=1;s=L[l+29024>>3];if(!(e|s!=0x8000000000000000)){if((o|0)<=0){break B}k=0;if((o|0)!=1){t=o&-2;e=0;while(1){m=(l+32|0)+(k<<3)|0;n=E[k+r|0];F:{if((n|0)<0){G[j>>2]=-11;f=0;break F}f=n&255}G[m>>2]=f;G[m+4>>2]=-2147483648;n=k|1;m=E[n+r|0];G:{if((m|0)>=0){m=m&255;break G}G[j>>2]=-11;m=0}n=(l+32|0)+(n<<3)|0;G[n>>2]=m;G[n+4>>2]=-2147483648;k=k+2|0;e=e+2|0;if((t|0)!=(e|0)){continue}break}}if(!(o&1)){break B}e=E[k+r|0];if((e|0)<0){break E}e=e&255;break D}if(!e&s==0){break C}k=0;if((o|0)<=0){break B}while(1){n=(l+32|0)+(k<<3)|0;H:{I:{q=(+E[k+r|0]-s)/v;if(q<-0x8000000000000000){G[j>>2]=-11;break I}if(q>0x8000000000000000){G[j>>2]=-11;m=2147483647;e=-1;break H}if(q>=0){q=q+.5;if(!(O(q)<0x8000000000000000)){break I}m=O(q)>=1?~~(q>0?Q(S(q*2.3283064365386963e-10),4294967295):T((q-+(~~q>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~q>>>0;break H}q=q+-.5;if(!(O(q)<0x8000000000000000)){break I}m=O(q)>=1?~~(q>0?Q(S(q*2.3283064365386963e-10),4294967295):T((q-+(~~q>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~q>>>0;break H}m=-2147483648;e=0}G[n>>2]=e;G[n+4>>2]=m;k=k+1|0;if((o|0)!=(k|0)){continue}break}break B}G[j>>2]=-11;e=0}m=(l+32|0)+(k<<3)|0;G[m>>2]=e;G[m+4>>2]=-2147483648;break B}if((o|0)<=0){break B}e=0;k=0;if(o-1>>>0>=3){t=o&-4;m=0;while(1){n=l+32|0;p=n+(k<<3)|0;u=E[k+r|0];G[p>>2]=u;G[p+4>>2]=u>>31;p=k|1;u=n+(p<<3)|0;p=E[r+p|0];G[u>>2]=p;G[u+4>>2]=p>>31;p=k|2;u=n+(p<<3)|0;p=E[r+p|0];G[u>>2]=p;G[u+4>>2]=p>>31;p=k|3;n=n+(p<<3)|0;p=E[r+p|0];G[n>>2]=p;G[n+4>>2]=p>>31;k=k+4|0;m=m+4|0;if((t|0)!=(m|0)){continue}break}}m=o&3;if(!m){break B}while(1){n=(l+32|0)+(k<<3)|0;t=E[k+r|0];G[n>>2]=t;G[n+4>>2]=t>>31;k=k+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}_c(a,o,G[l+29084>>2],l+32|0,j);break d}if((o|0)<=0){break e}k=0;if((o|0)!=1){n=o&-2;m=0;while(1){t=(l+32|0)+k|0;e=E[k+r|0];if((e|0)<0){G[j>>2]=-11;e=0}E[t|0]=e;t=k|1;e=E[t+r|0];if((e|0)<0){G[j>>2]=-11;e=0}E[t+(l+32|0)|0]=e;k=k+2|0;m=m+2|0;if((n|0)!=(m|0)){continue}break}}if(!(o&1)){break e}m=(l+32|0)+k|0;e=E[k+r|0];if((e|0)<0){G[j>>2]=-11;e=0}E[m|0]=e}we(a,o,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){m=d;a=c+1|0;m=a?m:m+1|0;L[l+16>>3]=+(a>>>0)+ +(m|0)*4294967296;e=o;f=e>>31;a=c+e|0;f=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?f+1|0:f)|0)*4294967296;a=l+28864|0;Ya(a,81,47869,l+16|0);Ua(a);break c}e=o;f=e>>31;h=h-((e>>>0>g>>>0)+f|0)|0;g=g-e|0;if(!(h|g)){break b}m=d+f|0;c=c+e|0;m=c>>>0>>0?m+1|0:m;d=m;f=f+G[l+29060>>2]|0;m=e+G[l+29056>>2]|0;f=m>>>0>>0?f+1|0:f;e=m;G[l+29056>>2]=e;G[l+29060>>2]=f;if(G[l+29072>>2]!=(e|0)|G[l+29076>>2]!=(f|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;e=x;f=w+1|0;e=f?e:e+1|0;w=f;x=e;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function qe(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,0,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o)|0)>0){p=G[o>>2];break a}G[q+29060>>2]=M(G[q+29060>>2],i);z=1;c=G[q+29080>>2];O=c;P=c>>31;b:{if(G[q+29084>>2]!=16){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);d=G[q+29068>>2];if((d|0)<=0){break b}if(d-1>>>0>=7){c=d&-8;p=0;while(1){z=z*10*10*10*10*10*10*10*10;p=p+8|0;if((c|0)!=(p|0)){continue}break}}c=d&7;if(!c){break b}p=0;while(1){z=z*10;p=p+1|0;if((c|0)!=(p|0)){continue}break}}c:{if(k?0:(j|0)==1){break c}c=G[q+29028>>2];p=c;d=!c;c=G[q+29024>>2];f=G[q+29084>>2];if(d&(c|0)==1234554321&((f|0)%10|0)==1){break c}e=p-(c>>>0<32768)|0;if(((e|0)==-1&c-32768>>>0<4294901760|(e|0)!=-1)&(f|0)==21|(!p&c>>>0>255|(p|0)!=0)&(f|0)==11){break c}y=(f|0)==16?H[q+28864|0]==1?0:j:j}U=i>>31;e=0;f=0;d:{while(1){c=G[q+29044>>2];j=G[q+29040>>2];d=Au(G[q+29016>>2],G[q+29020>>2],Q,R);j=j+d|0;c=Ia+c|0;c=d>>>0>j>>>0?c+1|0:c;s=G[q+29032>>2];p=G[q+29036>>2];w=G[q+29060>>2];d=(w|0)/(i|0)|0;d=Au(s,p,d,d>>31);j=d+j|0;c=Ia+c|0;u=j;j=d>>>0>j>>>0?c+1|0:c;p=G[q+29052>>2]+(p^-1)|0;c=s^-1;d=c+G[q+29048>>2]|0;v=Bu(d,c>>>0>d>>>0?p+1|0:p,i,U);c=Ia;s=c;d=v+1|0;c=d?c:c+1|0;p=d;r=p;c=g>>>0>>0&(h|0)<=(P|0)|(h|0)<(P|0)?g:O;p=c>>31;d=c;c=c>>>0>v>>>0&(p|0)>=(s|0)|(p|0)>(s|0);r=c?r:d;e:{f:{g:{h:{i:{j:{k:{l:{m:{c=G[q+29084>>2];switch(c-11|0){case 30:break f;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break g;case 5:break h;case 31:break j;case 10:break k;case 0:break l;default:break m}}n:{switch(c-81|0){case 1:break i;case 0:break n;default:break g}}c=w;w=q- -64|0;Tc(a,u,j,r,c,w,o);v=G[q+29024>>2];s=G[q+29028>>2];j=e+m|0;u=(e<<2)+l|0;B=L[q+29096>>3];C=L[q+29088>>3];c=B==1&C==0x8000000000000000;o:{p:{if(!y){q:{r:{if(c){if((r|0)<=0){break o}p=0;if((r|0)!=1){v=r&-2;s=0;while(1){d=u+(p<<2)|0;c=w+(p<<3)|0;j=G[c+4>>2];c=G[c>>2];if((j|0)>-2147483647|(j|0)>=-2147483647){G[o>>2]=-11;c=-1}G[d>>2]=c;j=p|1;c=w+(j<<3)|0;d=G[c+4>>2];c=G[c>>2];if((d|0)!=-2147483648){G[o>>2]=-11;c=-1}G[u+(j<<2)>>2]=c;p=p+2|0;s=s+2|0;if((v|0)!=(s|0)){continue}break}}if(!(r&1)){break o}c=w+(p<<3)|0;d=G[c+4>>2];c=G[c>>2];if((d|0)!=-2147483648){break r}break q}if(B==1&C==0){break p}p=0;if((r|0)<=0){break o}while(1){d=u+(p<<2)|0;s:{t:{c=w+(p<<3)|0;t=(+J[c>>2]+ +G[c+4>>2]*4294967296)*B+C;if(t<-.49){G[o>>2]=-11;break t}if(t>0xfffffffffffff800){G[o>>2]=-11;c=-1;break s}if(!(t<4294967296&t>=0)){break t}c=~~t>>>0;break s}c=0}G[d>>2]=c;p=p+1|0;if((r|0)!=(p|0)){continue}break}break o}G[o>>2]=-11;c=-1}G[u+(p<<2)>>2]=c;break o}if(c){if((r|0)<=0){break o}p=0;while(1){d=w+(p<<3)|0;c=G[d>>2];d=G[d+4>>2];u:{if((c|0)==(v|0)&(d|0)==(s|0)){G[n>>2]=1;if((y|0)==1){G[u+(p<<2)>>2]=k;break u}E[j+p|0]=1;break u}if((d|0)>-2147483647|(d|0)>=-2147483647){G[o>>2]=-11;G[u+(p<<2)>>2]=-1;break u}G[u+(p<<2)>>2]=c}p=p+1|0;if((r|0)!=(p|0)){continue}break}break o}if(!(B==1&C==0)){if((r|0)<=0){break o}p=0;while(1){c=w+(p<<3)|0;d=G[c>>2];c=G[c+4>>2];v:{if((d|0)==(v|0)&(c|0)==(s|0)){G[n>>2]=1;if((y|0)==1){G[u+(p<<2)>>2]=k;break v}E[j+p|0]=1;break v}t=(+(d>>>0)+ +(c|0)*4294967296)*B+C;if(t<-.49){G[o>>2]=-11;G[u+(p<<2)>>2]=0;break v}if(t>0xfffffffffffff800){G[o>>2]=-11;G[u+(p<<2)>>2]=-1;break v}c=u+(p<<2)|0;if(t<4294967296&t>=0){d=~~t>>>0}else{d=0}G[c>>2]=d}p=p+1|0;if((r|0)!=(p|0)){continue}break}break o}if((r|0)<=0){break o}p=0;while(1){d=w+(p<<3)|0;c=G[d>>2];d=G[d+4>>2];w:{if((c|0)==(v|0)&(d|0)==(s|0)){G[n>>2]=1;if((y|0)==1){G[u+(p<<2)>>2]=k;break w}E[j+p|0]=1;break w}if((d|0)<0){G[o>>2]=-11;G[u+(p<<2)>>2]=0;break w}if((d|0)==1|d>>>0>1){G[o>>2]=-11;G[u+(p<<2)>>2]=-1;break w}G[u+(p<<2)>>2]=c}p=p+1|0;if((r|0)!=(p|0)){continue}break}break o}if((r|0)<=0){break o}p=0;if((r|0)!=1){v=r&-2;s=0;while(1){j=u+(p<<2)|0;c=w+(p<<3)|0;d=G[c+4>>2];c=G[c>>2];x:{if((d|0)<0){G[o>>2]=-11;c=0;break x}if((d|0)==1|d>>>0>1){G[o>>2]=-11;c=-1}}G[j>>2]=c;j=p|1;d=w+(j<<3)|0;c=G[d+4>>2];d=G[d>>2];y:{if((c|0)>0|(c|0)>=0){if(!c){break y}G[o>>2]=-11;d=-1;break y}G[o>>2]=-11;d=0}G[u+(j<<2)>>2]=d;p=p+2|0;s=s+2|0;if((v|0)!=(s|0)){continue}break}}if(!(r&1)){break o}j=u+(p<<2)|0;d=w+(p<<3)|0;c=G[d+4>>2];d=G[d>>2];z:{if((c|0)>0|(c|0)>=0){if(!c){break z}G[o>>2]=-11;d=-1;break z}G[o>>2]=-11;d=0}G[j>>2]=d}break e}c=q- -64|0;$d(a,u,j,r,w,c,o);Ep(c,r,L[q+29096>>3],L[q+29088>>3],y,H[q+29024|0],k,e+m|0,n,(e<<2)+l|0,o);break e}c=q- -64|0;Pe(a,u,j,r,w,c,o);Dp(c,r,L[q+29096>>3],L[q+29088>>3],y,F[q+29024>>1],k,e+m|0,n,(e<<2)+l|0,o);break e}c=q- -64|0;Uc(a,u,j,r,w,c,o);Cp(c,r,L[q+29096>>3],L[q+29088>>3],y,k,e+m|0,n,(e<<2)+l|0,o);break e}c=q- -64|0;Tc(a,u,j,r,w,c,o);Bp(c,r,L[q+29096>>3],L[q+29088>>3],y,k,e+m|0,n,(e<<2)+l|0,o);break e}Jb(a,u,j,0,o);d=G[q+29060>>2];c=G[q+29064>>2];A:{if((d|0)==(c|0)){c=M(d,r);ic(a,c,c>>31,q- -64|0,o);break A}Rd(a,c,r,d-c|0,q- -64|0,o)}s=q- -64|0;B=L[q+29096>>3];C=L[q+29088>>3];V=G[q+29064>>2];W=e+m|0;I=(e<<2)+l|0;A=0;x=Fa-112|0;Fa=x;K=q+28864|0;u=Va(K);if((r|0)>0){while(1){B:{c=s+V|0;S=H[c|0];E[c|0]=0;j=s;C:{D:{if(H[K|0]==1){break D}if(fb(K,s,u)){break D}j=c;if(!y){break C}G[n>>2]=1;if((y|0)==1){G[(A<<2)+I>>2]=k;break C}E[A+W|0]=1;break C}while(1){d=H[j|0];if((d|0)==32){j=j+1|0;continue}break}T=1;E:{switch(d-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};T=(d|0)==45?-1:1;d=p;break;default:break E}}D=0;if((d-48&255)>>>0<10){while(1){t=D*10+ +(d<<24>>24);p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}D=t+-48;if((d-48&255)>>>0<=9){continue}break}}t=z;F:{G:{switch(d-44|0){case 0:case 2:break G;default:break F}}p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}t=1;if((d-48&255)>>>0>=10){break F}while(1){D=D*10+ +(d<<24>>24)+-48;p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}t=t*10;if((d-48&255)>>>0<=9){continue}break}}H:{if((d&254)!=68){N=1;p=0;break H}while(1){N=1;p=j;j=p+1|0;d=H[p+1|0];if((d|0)==32){continue}break}I:{switch(d-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=p+1|0;v=H[j|0];if((v|0)==32){continue}break};N=(d|0)==45?-1:1;d=v;break;default:break I}}p=0;if((d-48&255)>>>0>=10){break H}while(1){v=d;w=M(p,10)-48|0;p=j;while(1){d=H[p+1|0];j=p+1|0;p=j;if((d|0)==32){continue}break}p=(v<<24>>24)+w|0;if((d-48&255)>>>0<=9){continue}break}}if(d){G[x+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);d=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[x+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[x+44>>2]=d;d=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[x+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[x+36>>2]=d;d=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[x+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[x+28>>2]=d;d=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[x+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[x+20>>2]=d;d=x+16|0;Ua(d);G[x>>2]=s;Ya(d,81,43022,x);Ua(d);E[c|0]=S;G[o>>2]=409;break B}t=D*+(T|0)/t*$b(10,+(M(p,N)|0))*B+C;J:{if(t<-.49){G[o>>2]=-11;G[(A<<2)+I>>2]=0;break J}if(t>0xfffffffffffff800){G[o>>2]=-11;G[(A<<2)+I>>2]=-1;break J}d=(A<<2)+I|0;if(t<4294967296&t>=0){p=~~t>>>0}else{p=0}G[d>>2]=p}}s=j;E[c|0]=S;A=A+1|0;if((r|0)!=(A|0)){continue}}break}}Fa=x+112|0;break e}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8924,q);Ua(a);p=311;if(G[q+29076>>2]==1){break d}p=312;break d}c=q- -64|0;Uc(a,u,j,r,w,c,o);Uk(c,r,L[q+29096>>3],L[q+29088>>3],y,G[q+29024>>2],k,e+m|0,n,(e<<2)+l|0,o)}p=G[o>>2];if((p|0)>0){t=+(e>>>0)+ +(f|0)*4294967296;z=t+1;t=t+ +(r|0);K:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=t;L[q+16>>3]=z;Ya(q+28896|0,81,46566,q+16|0);break K}L[q+56>>3]=t;L[q+48>>3]=z;Ya(q+28896|0,81,46506,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}d=r;c=d>>31;h=h-((d>>>0>g>>>0)+c|0)|0;g=g-d|0;if(h|g){p=M(i,r);s=p;v=p+G[q+29032>>2]|0;p=G[q+29036>>2]+(p>>31)|0;p=s>>>0>v>>>0?p+1|0:p;s=v;G[q+29032>>2]=s;G[q+29036>>2]=p;c=c+f|0;e=d+e|0;c=e>>>0>>0?c+1|0:c;f=c;v=G[q+29048>>2];d=G[q+29052>>2];c=d;if(v>>>0>s>>>0&(c|0)>=(p|0)|(c|0)>(p|0)){continue}c=s;s=Bu(c,p,v,d);j=Ia;d=Au(s,j,v,d);G[q+29032>>2]=c-d;G[q+29036>>2]=p-(Ia+(c>>>0>>0)|0);c=j+R|0;d=Q;p=d+s|0;Q=p;R=d>>>0>p>>>0?c+1|0:c;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function Re(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=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;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}yc(a,b,c,d,e,f,g,h,(i|0)<0?15:16,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o);p=G[q+29080>>2];P=p;Q=p>>31;r=G[q+29084>>2];if(!((i|0)!=1|(r|0)!=14)){fg(a,b,c,d,e,f,g,h,j,k<<24>>24,l,m,n,o);p=G[o>>2];break a}p=G[o>>2];if((p|0)>0){break a}G[q+29060>>2]=M(G[q+29060>>2],i);A=1;b:{if((r|0)!=16|G[q+29076>>2]!=1){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);d=G[q+29068>>2];if((d|0)<=0){break b}if(d-1>>>0>=7){c=d&-8;p=0;while(1){A=A*10*10*10*10*10*10*10*10;p=p+8|0;if((c|0)!=(p|0)){continue}break}}c=d&7;if(!c){break b}p=0;while(1){A=A*10;p=p+1|0;if((c|0)!=(p|0)){continue}break}}f=G[q+29084>>2];c:{d:{e:{if(k?0:(j|0)==1){break e}e=G[q+29028>>2];c=G[q+29024>>2];if(!e&(c|0)==1234554321&((f|0)%10|0)==1){break e}if(!((e-(c>>>0<32768)|0)==-1&c-32768>>>0>=4294901760|(f|0)!=21)){N=0;break c}if((!e&c>>>0>255|(e|0)!=0)&(f|0)==11){break d}z=(f|0)==16?H[q+28864|0]==1?0:j:j}N=0;if((f|0)!=11){break c}}c=g>>>0<2147483647&(h|0)<=0|(h|0)<0;P=c?g:2147483647;Q=c?h:0;N=!z&L[q+29096>>3]==1&L[q+29088>>3]==0}V=0-i|0;e=0;f=0;f:{while(1){c=g>>>0

>>0&(h|0)<=(Q|0)|(h|0)<(Q|0)?g:P;d=c>>31;t=c;v=d;g:{if((i|0)>=0){d=G[q+29036>>2];p=G[q+29052>>2]+(d^-1)|0;c=G[q+29032>>2];j=c^-1;r=j+G[q+29048>>2]|0;r=Bu(r,j>>>0>r>>>0?p+1|0:p,i,0);j=Ia;break g}c=G[q+29032>>2];d=G[q+29036>>2];r=Bu(c,d,V,0);j=Ia}s=G[q+29044>>2];w=G[q+29040>>2];p=Au(G[q+29016>>2],G[q+29020>>2],B,C);w=w+p|0;s=Ia+s|0;s=p>>>0>w>>>0?s+1|0:s;x=w;p=c;w=G[q+29060>>2];c=(w|0)/(i|0)|0;d=Au(p,d,c,c>>31);p=x+d|0;c=Ia+s|0;c=d>>>0>p>>>0?c+1|0:c;s=p;p=j;d=r+1|0;p=d;d=(j|0)<=(v|0)&t>>>0>r>>>0|(j|0)<(v|0);t=d?p:t;h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{d=G[q+29084>>2];switch(d-11|0){case 10:break i;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break j;case 5:break k;case 31:break m;case 30:break o;case 0:break p;default:break q}}switch(d-81|0){case 1:break l;case 0:break n;default:break j}}d=c;c=e+l|0;$d(a,s,d,t,w,c,o);if(N){break h}vp(c,t,L[q+29096>>3],L[q+29088>>3],z,H[q+29024|0],k,e+m|0,n,c,o);break h}d=c;c=q- -64|0;Uc(a,s,d,t,w,c,o);up(c,t,L[q+29096>>3],L[q+29088>>3],z,G[q+29024>>2],k,e+m|0,n,e+l|0,o);break h}x=q- -64|0;Tc(a,s,c,t,w,x,o);w=G[q+29024>>2];s=G[q+29028>>2];j=e+m|0;c=e+l|0;D=L[q+29096>>3];I=L[q+29088>>3];d=D==1&I==0x8000000000000000;r:{s:{if(!z){t:{u:{if(d){if((t|0)<=0){break r}d=0;if((t|0)!=1){s=t&-2;j=0;while(1){v=c+d|0;p=x+(d<<3)|0;r=G[p+4>>2];p=G[p>>2];if((r|0)!=-2147483648|p>>>0>=256){G[o>>2]=-11;p=255}E[v|0]=p;v=d|1;p=x+(v<<3)|0;r=G[p+4>>2];p=G[p>>2];if(!((r|0)==-2147483648&p>>>0<=255)){G[o>>2]=-11;p=255}E[c+v|0]=p;d=d+2|0;j=j+2|0;if((s|0)!=(j|0)){continue}break}}if(!(t&1)){break r}j=x+(d<<3)|0;p=G[j+4>>2];j=G[j>>2];if((p|0)!=-2147483648|j>>>0>255){break u}break t}if(D==1&I==0){break s}d=0;if((t|0)<=0){break r}while(1){p=c+d|0;v:{w:{j=x+(d<<3)|0;u=(+J[j>>2]+ +G[j+4>>2]*4294967296)*D+I;if(u<-.49){G[o>>2]=-11;break w}if(u>255.49){G[o>>2]=-11;j=255;break v}if(!(u<4294967296&u>=0)){break w}j=~~u>>>0;break v}j=0}E[p|0]=j;d=d+1|0;if((t|0)!=(d|0)){continue}break}break r}G[o>>2]=-11;j=255}E[c+d|0]=j;break r}if(d){if((t|0)<=0){break r}d=(z|0)==1;v=d?k:1;r=d?c:j;d=0;while(1){p=x+(d<<3)|0;j=G[p>>2];p=G[p+4>>2];x:{if((j|0)==(w|0)&(p|0)==(s|0)){G[n>>2]=1;j=v;p=r;break x}if((p|0)!=-2147483648|j>>>0>=256){G[o>>2]=-11;j=255}p=c}E[p+d|0]=j;d=d+1|0;if((t|0)!=(d|0)){continue}break}break r}if(!(D==1&I==0)){if((t|0)<=0){break r}d=(z|0)==1;v=d?k:1;r=d?c:j;d=0;while(1){j=x+(d<<3)|0;p=G[j>>2];j=G[j+4>>2];y:{if((p|0)==(w|0)&(j|0)==(s|0)){G[n>>2]=1;j=v;p=r;break y}z:{A:{u=(+(p>>>0)+ +(j|0)*4294967296)*D+I;if(u<-.49){G[o>>2]=-11;break A}if(u>255.49){G[o>>2]=-11;j=255;break z}if(!(u<4294967296&u>=0)){break A}j=~~u>>>0;break z}j=0}p=c}E[p+d|0]=j;d=d+1|0;if((t|0)!=(d|0)){continue}break}break r}if((t|0)<=0){break r}d=(z|0)==1;v=d?k:1;r=d?c:j;d=0;while(1){p=x+(d<<3)|0;j=G[p>>2];p=G[p+4>>2];B:{if((j|0)==(w|0)&(p|0)==(s|0)){G[n>>2]=1;j=v;p=r;break B}C:{if((p|0)<0){G[o>>2]=-11;j=0;break C}if(!p&j>>>0>=256|p){G[o>>2]=-11;j=255}}p=c}E[p+d|0]=j;d=d+1|0;if((t|0)!=(d|0)){continue}break}break r}if((t|0)<=0){break r}d=0;while(1){r=c+d|0;p=x+(d<<3)|0;j=G[p+4>>2];p=G[p>>2];D:{if((j|0)<0){G[o>>2]=-11;p=0;break D}if(!j&p>>>0>=256|j){G[o>>2]=-11;p=255}}E[r|0]=p;d=d+1|0;if((t|0)!=(d|0)){continue}break}}break h}d=c;c=q- -64|0;Uc(a,s,d,t,w,c,o);tp(c,t,L[q+29096>>3],L[q+29088>>3],z,k,e+m|0,n,e+l|0,o);break h}d=c;c=q- -64|0;Tc(a,s,d,t,w,c,o);sp(c,t,L[q+29096>>3],L[q+29088>>3],z,k,e+m|0,n,e+l|0,o);break h}Jb(a,s,c,0,o);d=G[q+29060>>2];c=G[q+29064>>2];E:{if((d|0)==(c|0)){c=M(d,t);ic(a,c,c>>31,q- -64|0,o);break E}Rd(a,c,t,d-c|0,q- -64|0,o)}d=q- -64|0;D=L[q+29096>>3];I=L[q+29088>>3];W=G[q+29064>>2];j=e+m|0;x=e+l|0;O=0;y=Fa-112|0;Fa=y;R=q+28864|0;X=Va(R);if((t|0)>0){F:{c=(z|0)==1;w=c?k:1;s=c?x:j;while(1){r=d+W|0;T=H[r|0];E[r|0]=0;p=d;G:{H:{I:{if(H[R|0]==1){break I}if(fb(R,d,X)){break I}d=r;if(!z){break G}G[n>>2]=1;c=w;p=r;d=s;break H}while(1){c=H[p|0];if((c|0)==32){p=p+1|0;continue}break}U=1;J:{switch(c-43|0){case 0:case 2:while(1){j=H[p+1|0];p=p+1|0;if((j|0)==32){continue}break};U=(c|0)==45?-1:1;c=j;break;default:break J}}K=0;if((c-48&255)>>>0<10){while(1){u=K*10+ +(c<<24>>24);j=p;while(1){c=H[j+1|0];p=j+1|0;j=p;if((c|0)==32){continue}break}K=u+-48;if((c-48&255)>>>0<=9){continue}break}}u=A;K:{L:{switch(c-44|0){case 0:case 2:break L;default:break K}}j=p;while(1){c=H[j+1|0];p=j+1|0;j=p;if((c|0)==32){continue}break}u=1;if((c-48&255)>>>0>=10){break K}while(1){K=K*10+ +(c<<24>>24)+-48;j=p;while(1){c=H[j+1|0];p=j+1|0;j=p;if((c|0)==32){continue}break}u=u*10;if((c-48&255)>>>0<=9){continue}break}}M:{if((c&254)!=68){S=1;j=0;break M}while(1){S=1;j=p;p=p+1|0;c=H[j+1|0];if((c|0)==32){continue}break}N:{switch(c-43|0){case 0:case 2:j=j+2|0;while(1){p=j;j=p+1|0;v=H[p|0];if((v|0)==32){continue}break};S=(c|0)==45?-1:1;c=v;break;default:break N}}j=0;if((c-48&255)>>>0>=10){break M}while(1){v=c;Y=M(j,10)-48|0;j=p;while(1){c=H[j+1|0];p=j+1|0;j=p;if((c|0)==32){continue}break}j=(v<<24>>24)+Y|0;if((c-48&255)>>>0<=9){continue}break}}if(c){G[y+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);c=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[y+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[y+44>>2]=c;c=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[y+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[y+36>>2]=c;c=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[y+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[y+28>>2]=c;c=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[y+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[y+20>>2]=c;c=y+16|0;Ua(c);G[y>>2]=d;Ya(c,81,43022,y);Ua(c);E[r|0]=T;G[o>>2]=409;break F}O:{P:{u=K*+(U|0)/u*$b(10,+(M(j,S)|0))*D+I;if(u<-.49){G[o>>2]=-11;break P}if(u>255.49){G[o>>2]=-11;c=255;break O}if(!(u<4294967296&u>=0)){break P}c=~~u>>>0;break O}c=0}d=x}E[d+O|0]=c;d=p}E[r|0]=T;O=O+1|0;if((t|0)!=(O|0)){continue}break}}}Fa=y+112|0;break h}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8979,q);Ua(a);p=311;if(G[q+29076>>2]==1){break f}p=312;break f}d=c;c=q- -64|0;Pe(a,s,d,t,w,c,o);Tk(c,t,L[q+29096>>3],L[q+29088>>3],z,F[q+29024>>1],k,e+m|0,n,e+l|0,o)}p=G[o>>2];if((p|0)>0){u=+(e>>>0)+ +(f|0)*4294967296;A=u+1;u=u+ +(t|0);Q:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=u;L[q+16>>3]=A;Ya(q+28896|0,81,48189,q+16|0);break Q}L[q+56>>3]=u;L[q+48>>3]=A;Ya(q+28896|0,81,48130,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}d=t;j=d>>31;h=h-((d>>>0>g>>>0)+j|0)|0;g=g-d|0;if(h|g){c=M(i,t);r=c+G[q+29032>>2]|0;p=G[q+29036>>2]+(c>>31)|0;p=c>>>0>r>>>0?p+1|0:p;c=r;G[q+29032>>2]=c;G[q+29036>>2]=p;s=f+j|0;e=d+e|0;s=e>>>0>>0?s+1|0:s;f=s;s=G[q+29052>>2];d=s;v=G[q+29048>>2];if((p|0)>=(d|0)&c>>>0>=v>>>0|(d|0)<(p|0)){j=Bu(c,p,v,s);r=B+j|0;d=Ia;C=C+d|0;C=r>>>0>>0?C+1|0:C;B=r;d=Au(v,s,j,d);G[q+29032>>2]=c-d;G[q+29036>>2]=p-(Ia+(c>>>0>>0)|0);continue}if((p|0)>0|(p|0)>=0){continue}j=B;B=Bu(c^-1,p^-1,v,s)+1|0;d=Ia;d=B?d:d+1|0;r=B;B=j-r|0;C=C-((j>>>0>>0)+d|0)|0;d=Au(v,s,r,d)+c|0;s=p+Ia|0;G[q+29032>>2]=d;G[q+29036>>2]=c>>>0>d>>>0?s+1|0:s;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function Kf(a,b,c,d,e){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;f=Fa-4528|0;Fa=f;G[f+404>>2]=0;G[f+400>>2]=0;a:{b:{c:{d:{e:{f:{g:{h:{i=E[a|0];switch(i-102|0){case 1:case 2:case 4:case 5:case 7:case 8:case 9:case 10:case 11:case 12:case 14:break b;case 15:break c;case 13:break d;case 6:break e;case 3:break f;case 0:break g;default:break h}}if(!i|(i|0)==35){break a}break b}if(Xa(a,22609)){break b}i:{if(c){a=G[b>>2];j:{if(!a){break j}c=G[936854];if(!c){break j}while(1){b=G[c+4>>2];e=Sb(b,a);k:{if(!e){break k}if((Va(e)|0)!=(Va(a)|0)){break k}if((b|0)==(e|0)|H[b+(e+(b^-1)|0)|0]==47){break i}}c=G[c>>2];if(c){continue}break}}G[f+48>>2]=a;_a(G[24367],89497,f+48|0);h=1;break a}c=G[936855];if(c){break i}G[f+16>>2]=a;_a(G[24367],89404,f+16|0);h=1;break a}b=G[c+16>>2];if(!b){break a}a=G[29763];if(d){hb(68347,9,1,a);b=G[c+16>>2]}c=G[c+4>>2];G[f+36>>2]=b;G[f+32>>2]=c;_a(a,69095,f+32|0);$a(a);break a}if(!Xa(a,25125)){if(!c){G[f+68>>2]=1;G[f+72>>2]=0;G[f+64>>2]=a;_a(G[24367],88305,f- -64|0);h=1;break a}c=Il(G[b>>2]);if(!c){h=1;break a}G[936855]=c;if(d){hb(68357,6,1,G[29763])}a=G[c+16>>2];a=a?a:36147;b=Fd(33984);l:{if(!b){b=a;break l}if(!H[b|0]){b=a;break l}d=Sb(a,b);if(!d){b=a;break l}if(!H[d|0]){b=a;break l}if(Xa(d,a)){b=a;break l}b=qb(rb(f+432|0,1522,4095),Va(b)+a|0,4095);pb(a)}a=G[c+4>>2];G[f+84>>2]=b;G[f+80>>2]=a;a=G[29763];_a(a,69095,f+80|0);$a(a);break a}if(!Xa(a,31902)){if(!c){G[f+100>>2]=1;G[f+104>>2]=0;G[f+96>>2]=a;_a(G[24367],88305,f+96|0);h=1;break a}a=Il(G[b>>2]);if(!a){h=1;break a}G[936855]=a;break a}if(!Xa(a,14072)){i=G[936855];if(!i){G[f+112>>2]=a;_a(G[24367],89404,f+112|0);h=1;break a}h=1;if((c|0)<=1){G[f+132>>2]=2;G[f+128>>2]=a;_a(G[24367],88249,f+128|0);break a}a=0;n=Kj(G[i+16>>2],0,33281,0,f+408|0,f+404|0);if(G[f+404>>2]){G[f+240>>2]=G[i+16>>2];_a(G[24367],89535,f+240|0);break a}d=G[b+4>>2];p=G[b>>2];e=32824;h=0;m:{if(c>>>0<3){break m}a=G[b+8>>2];n:{if(!a){a=0;break n}a=le(a);l=Sb(a,36004);if(!l){break n}E[l|0]=0;e=l+2|0}if(c>>>0<4){break m}h=G[b+12>>2]}o:{if(d){l=G[f+408>>2];c=Fa-432|0;Fa=c;G[c+428>>2]=0;G[f+428>>2]=0;G[c+176>>2]=c+192;G[c+172>>2]=c+240;G[c+168>>2]=c+288;G[c+164>>2]=c+336;G[c+160>>2]=c+384;p:{q:{if((Qc(d,32013,c+160|0)|0)==5){g=sb(c+384|0);j=sb(c+336|0);k=sb(c+288|0);m=sb(c+240|0);q=f,r=vb(c+192|0,c+188|0),L[q+384>>3]=r;d=G[c+188>>2];if(!d){break q}d=E[d|0];if(!d|((d-65>>>0<26?d|32:d)|0)!=97){break q}G[f+428>>2]=1;break q}G[c+156>>2]=c+240;G[c+152>>2]=c+288;G[c+148>>2]=c+336;G[c+144>>2]=c+384;if((Qc(d,32215,c+144|0)|0)==4){g=sb(c+384|0);j=sb(c+336|0);k=sb(c+288|0);m=sb(c+240|0);G[f+384>>2]=0;G[f+388>>2]=1072693248;break q}G[c+136>>2]=c+288;G[c+132>>2]=c+336;G[c+128>>2]=c+384;r:{if((Qc(d,32047,c+128|0)|0)==3){g=sb(c+384|0);j=sb(c+336|0);q=f,r=vb(c+288|0,c+188|0),L[q+384>>3]=r;d=G[c+188>>2];if(!d){break r}d=E[d|0];if(!d|((d-65>>>0<26?d|32:d)|0)!=97){break r}G[f+428>>2]=1;break r}G[c+116>>2]=c+336;G[c+112>>2]=c+384;if((Qc(d,32249,c+112|0)|0)==2){g=sb(c+384|0);j=sb(c+336|0);G[f+384>>2]=0;G[f+388>>2]=1072693248;break r}G[c+96>>2]=c+192;G[c+92>>2]=c+240;G[c+88>>2]=c+288;G[c+84>>2]=c+336;G[c+80>>2]=c+384;s:{if((Qc(d,31930,c+80|0)|0)==5){g=sb(c+384|0);t:{if(O(g)<2147483648){d=~~g;break t}d=-2147483648}G[f+392>>2]=d;q=f,r=sb(c+336|0),L[q+368>>3]=r;g=sb(c+288|0);u:{if(O(g)<2147483648){d=~~g;break u}d=-2147483648}G[f+396>>2]=d;q=f,r=sb(c+240|0),L[q+376>>3]=r;q=f,r=vb(c+192|0,c+188|0),L[q+384>>3]=r;d=G[c+188>>2];if(!d){break s}d=E[d|0];if(!d|((d-65>>>0<26?d|32:d)|0)!=97){break s}G[f+428>>2]=1;break s}G[c+76>>2]=c+240;G[c+72>>2]=c+288;G[c+68>>2]=c+336;G[c+64>>2]=c+384;if((Qc(d,32151,c- -64|0)|0)==4){g=sb(c+384|0);v:{if(O(g)<2147483648){d=~~g;break v}d=-2147483648}G[f+392>>2]=d;q=f,r=sb(c+336|0),L[q+368>>3]=r;g=sb(c+288|0);w:{if(O(g)<2147483648){d=~~g;break w}d=-2147483648}G[f+396>>2]=d;q=f,r=sb(c+240|0),L[q+376>>3]=r;G[f+384>>2]=0;G[f+388>>2]=1072693248;break s}G[c+56>>2]=c+288;G[c+52>>2]=c+336;G[c+48>>2]=c+384;if((Qc(d,31963,c+48|0)|0)==3){g=sb(c+384|0);x:{if(O(g)<2147483648){d=~~g;break x}d=-2147483648}G[f+392>>2]=d;g=sb(c+336|0);L[f+368>>3]=g;G[f+396>>2]=d;L[f+376>>3]=g;q=f,r=vb(c+288|0,c+188|0),L[q+384>>3]=r;d=G[c+188>>2];if(!d){break s}d=E[d|0];if(!d|((d-65>>>0<26?d|32:d)|0)!=97){break s}G[f+428>>2]=1;break s}G[c+36>>2]=c+336;G[c+32>>2]=c+384;if((Qc(d,32184,c+32|0)|0)==2){g=sb(c+384|0);y:{if(O(g)<2147483648){d=~~g;break y}d=-2147483648}G[f+392>>2]=d;g=sb(c+336|0);L[f+368>>3]=g;G[f+396>>2]=d;L[f+376>>3]=g;G[f+384>>2]=0;G[f+388>>2]=1072693248;break s}G[c+24>>2]=c+288;G[c+20>>2]=c+336;G[c+16>>2]=c+384;z:{if((Qc(d,32098,c+16|0)|0)==3){g=sb(c+384|0);A:{if(O(g)<2147483648){d=~~g;break A}d=-2147483648}G[f+392>>2]=d;G[f+368>>2]=0;G[f+372>>2]=0;g=sb(c+336|0);B:{if(O(g)<2147483648){d=~~g;break B}d=-2147483648}G[f+396>>2]=d;G[f+376>>2]=0;G[f+380>>2]=0;q=f,r=vb(c+288|0,c+188|0),L[q+384>>3]=r;d=G[c+188>>2];if(!d){break z}d=E[d|0];if(!d|((d-65>>>0<26?d|32:d)|0)!=97){break z}G[f+428>>2]=1;break z}G[c+4>>2]=c+336;G[c>>2]=c+384;if((Qc(d,32281,c)|0)!=2){break p}g=sb(c+384|0);C:{if(O(g)<2147483648){d=~~g;break C}d=-2147483648}G[f+392>>2]=d;G[f+368>>2]=0;G[f+372>>2]=0;g=sb(c+336|0);D:{if(O(g)<2147483648){d=~~g;break D}d=-2147483648}G[f+396>>2]=d;G[f+376>>2]=0;G[f+380>>2]=0;G[f+384>>2]=0;G[f+388>>2]=1072693248}o=3;if(l){break p}de(n,2,c+420|0,c+428|0);o=0;if(G[c+428>>2]){break p}L[f+368>>3]=G[c+420>>2]/2|0;L[f+376>>3]=G[c+424>>2]/2|0}o=2;g=L[f+376>>3];l=G[f+396>>2];j=L[f+368>>3];k=+(G[f+392>>2]/2|0);m=j+k;E:{if(O(m)<2147483648){d=~~m;break E}d=-2147483648}G[f+424>>2]=d;j=j-k+1;F:{if(O(j)<2147483648){d=~~j;break F}d=-2147483648}G[f+420>>2]=d;j=+((l|0)/2|0);k=g+j;G:{if(O(k)<2147483648){d=~~k;break G}d=-2147483648}G[f+416>>2]=d;g=g-j+1;H:{if(O(g)<2147483648){d=~~g;break H}d=-2147483648}G[f+412>>2]=d;break p}k=g;m=j}if(O(j)<2147483648){d=~~j}else{d=-2147483648}G[f+424>>2]=d;if(O(g)<2147483648){d=~~g}else{d=-2147483648}G[f+420>>2]=d;if(O(m)<2147483648){d=~~m}else{d=-2147483648}G[f+416>>2]=d;if(O(k)<2147483648){d=~~k}else{d=-2147483648}G[f+412>>2]=d;o=1;G[f+392>>2]=(G[f+424>>2]-G[f+420>>2]|0)+1;G[f+396>>2]=(G[f+416>>2]-G[f+412>>2]|0)+1;L[f+368>>3]=(G[f+420>>2]+G[f+424>>2]|0)/2|0;L[f+376>>3]=(G[f+412>>2]+G[f+416>>2]|0)/2|0}Fa=c+432|0;if(o){break o}}a=G[b>>2];G[f+144>>2]=G[i+16>>2];G[f+148>>2]=a?a:35436;_a(G[24367],76842,f+144|0);h=1;break a}sd(f+364|0,p,f+404|0);b=G[f+404>>2];if(b){a=f+432|0;uc(b,a);G[f+224>>2]=G[i+16>>2];G[f+228>>2]=a;_a(G[24367],77036,f+224|0);h=1;break a}I:{if(!G[f+408>>2]){if(!Kl(n,G[f+364>>2],f+392|0,f+368|0,L[f+384>>3],G[f+428>>2],h,f+404|0)){break I}a=f+432|0;uc(G[f+404>>2],a);G[f+176>>2]=G[i+16>>2];G[f+180>>2]=a;_a(G[24367],76884,f+176|0);h=1;break a}b=0;c=Ij(n,a,e,f+392|0,f+368|0,1,0,f+404|0);d=G[f+404>>2];if(d){a=f+432|0;uc(d,a);G[f+208>>2]=G[i+16>>2];G[f+212>>2]=a;_a(G[24367],76984,f+208|0);h=1;break a}Cb(c,16,41295,f+432|0,0,f+404|0);J:{if(G[f+404>>2]){break J}if(!Sb(f+432|0,32857)){if(!Sb(f+432|0,3703)){break J}}b=f+368|0}G[f+404>>2]=0;if(Kl(c,G[f+364>>2],f+392|0,b,L[f+384>>3],G[f+428>>2],0,f+404|0)){a=f+432|0;uc(G[f+404>>2],a);G[f+192>>2]=G[i+16>>2];G[f+196>>2]=a;_a(G[24367],76884,f+192|0);h=1;break a}G[f+400>>2]=0;_e(c,f+400|0)}b=G[f+404>>2];if(b){a=f+432|0;uc(b,a);G[f+160>>2]=G[i+16>>2];G[f+164>>2]=a;_a(G[24367],76931,f+160|0);_e(G[f+364>>2],f+404|0);h=1;break a}h=0;G[f+400>>2]=0;b=f+400|0;_e(n,b);G[f+400>>2]=0;_e(G[f+364>>2],b);if(!a){break a}Wa(a);break a}if(Xa(a,13568)){break b}if(!e){break a}b=G[936855];if(!b){G[f+256>>2]=a;_a(G[24367],89404,f+256|0);h=1;break a}G[f+288>>2]=G[b+4>>2];a=G[29763];_a(a,69990,f+288|0);b=G[b+16>>2];G[f+272>>2]=b?b:36e3;_a(a,69980,f+272|0);$a(a);break a}if(!Xa(a,4458)){a=G[29763];b=G[936854];if(b){fe(G[b+4>>2],a);c=G[b>>2];if(c){while(1){Ub(32,a);fe(G[c+4>>2],a);c=G[c>>2];if(c){continue}break}}Ub(10,a)}$a(a);break a}if(Xa(a,5451)){break b}b=G[936855];if(!b){G[f+304>>2]=a;_a(G[24367],89404,f+304|0);h=1;break a}Pl(G[b+16>>2],0);$a(G[29763]);break a}if(Xa(a,17450)){break b}if(c){c=G[b>>2];K:{L:{a=Gg(34915,61);if((a|0)!=34915){a=a-34915|0;if(!H[a+34915|0]){break L}}G[48624]=28;break K}e=Va(c);b=ab((e+a|0)+2|0);if(!b){break K}bb(b,34915,a);i=a+b|0;E[i|0]=61;bb(i+1|0,c,e+1|0);Ul(b,a,b)}a=G[29763];if(d){hb(68334,12,1,a)}q=f,s=Fd(34915),G[q+336>>2]=s;_a(a,70017,f+336|0);$a(a);break a}G[f+324>>2]=1;G[f+328>>2]=0;G[f+320>>2]=a;_a(G[24367],88305,f+320|0);h=1;break a}if(Xa(a,24219)){break b}if(!c){G[f+356>>2]=1;G[f+360>>2]=0;G[f+352>>2]=a;_a(G[24367],88305,f+352|0);h=1;break a}Jl(G[b>>2]);break a}G[f>>2]=a;_a(G[24367],89569,f);h=2}Fa=f+4528|0;return h}function bo(a,b){var 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;g=Fa-8144|0;Fa=g;a:{if(G[b>>2]>0){break a}f=G[a>>2];c=G[a+4>>2];if((f|0)!=G[c+76>>2]){mb(a,f+1|0,0,b);c=G[a+4>>2]}G[c+80>>2]=0;f=G[c+44>>2];G[c+104>>2]=G[c+40>>2];G[c+108>>2]=f;G[g+8140>>2]=0;G[g+8136>>2]=G[b>>2];f=a;m=g+8132|0;e=g+8128|0;c=g+8124|0;n=g+112|0;k=g+8112|0;o=g+8108|0;s=g+8120|0;l=g+96|0;q=g+88|0;p=g+104|0;r=g+8116|0;d=Fa-832|0;Fa=d;b:{if(G[b>>2]>0){break b}a=G[f>>2];if((a|0)!=G[G[f+4>>2]+76>>2]){mb(f,a+1|0,0,b)}if(m){G[m>>2]=1}Cf(f,1,d+464|0,d+384|0,d+304|0,b);c:{d:{e:{f:{g:{if(!G[G[f+4>>2]+76>>2]){if(!nb(d+464|0,35530,7)){h:{a=H[d+384|0]-70|0;if(a){if((a|0)==14){break g}break h}if(!m){break g}G[m>>2]=0;break g}e=220;break c}G[d+176>>2]=d+464;a=d+720|0;Ya(a,81,10257,d+176|0);Ua(a);e=221;break c}if(!nb(d+464|0,34516,9)){if((fd(d+384|0,d+224|0,b)|0)>0){Ua(38683);Ua(d+384|0);break b}if(H[d+384|0]==39){if(!nb(d+224|0,35678,6)){break g}if(!nb(d+224|0,35675,9)){break g}}G[d+192>>2]=d+384;a=d+720|0;Ya(a,81,9729,d+192|0);Ua(a);if(!G[G[f+4>>2]+1088>>2]){h=1;break g}tb(3,d+720|0);i:{if(!e){break i}Eg(f,e,b);if(G[b>>2]<=0){break i}Ua(24871);break b}j:{if(!c){break j}Qd(f,c,b);if(G[b>>2]<=0){break j}Ua(24918);break b}i=9;if(!n){break f}nk(f,999,n,b);if(G[b>>2]<=0){break f}Ua(24823);break b}G[d+208>>2]=d+464;a=d+720|0;Ya(a,81,10206,d+208|0);Ua(a);e=225;break c}a=d+464|0;Cf(f,2,a,d+384|0,d+304|0,b);if(nb(a,32941,7)){G[d+160>>2]=d+464;a=d+720|0;Ya(a,81,10146,d+160|0);Ua(a);e=222;break c}if((ue(d+384|0,d+824|0,b)|0)>0){G[d>>2]=d+384;a=d+720|0;Ya(a,81,9481,d);Ua(a);e=211;break c}k:{m=G[d+824>>2];l:{if((m|0)<=7){if((m|0)==-64){break k}if((m|0)!=-32){break l}break k}a=m-8|0;if((m|0)==64|(1<>>0<=24:0)){break k}}G[d+16>>2]=d+384;a=d+720|0;Ya(a,81,10109,d+16|0);Ua(a);e=211;break c}if(e){G[e>>2]=m}no(f,3,33788,d+820|0,b);a=G[b>>2];e=223;if((a|0)==208){break c}e=(a|0)!=209;a=G[d+820>>2];if(!(e&(a|0)<1e3)){G[d+32>>2]=a;a=d+720|0;Ya(a,81,16947,d+32|0);Ua(a);e=212;break c}if(c){G[c>>2]=a}if((a|0)<=0){i=4;break f}a=0;i=4;if(!n){while(1){c=a+1|0;e=d+640|0;zb(33788,c,e,b);th(f,a+4|0,e,d+808|0,b);m:{switch(G[b>>2]-208|0){case 0:break d;case 1:break e;default:break m}}i=i+1|0;a=c;if((a|0)>2]){continue}break f}}while(1){c=a+1|0;e=d+640|0;zb(33788,c,e,b);th(f,a+4|0,e,d+808|0,b);n:{switch(G[b>>2]-208|0){case 0:break d;case 1:break e;default:break n}}if((a|0)<999){e=n+(a<<3)|0;a=G[d+812>>2];G[e>>2]=G[d+808>>2];G[e+4>>2]=a}i=i+1|0;a=c;if((a|0)>2]){continue}break}}if(l){G[l>>2]=0;G[l+4>>2]=1072693248}if(q){G[q>>2]=0;G[q+4>>2]=0}if(k){G[k>>2]=0}if(o){G[o>>2]=1}if(s){G[s>>2]=0}if(p){G[p>>2]=1234554321;G[p+4>>2]=0}G[r>>2]=0;e=G[b>>2];o:{p:{while(1){q:{r:{s:{if((Sd(f,i,d+544|0,b)|0)>0){if(G[b>>2]==203){break q}Ua(47776);break s}a=d+464|0;Fi(d+544|0,a,d+828|0);t:{if((go(a,b)|0)<=0){break t}G[d+148>>2]=d+464;G[d+144>>2]=i;a=d+720|0;Ya(a,81,10301,d+144|0);Ua(a);if((i>>>0)%36|0){break t}Ua(47502)}if(!(nb(d+464|0,35661,7)|!l)){G[r>>2]=0;c=d+384|0;mc(d+544|0,c,d+304|0,b);a=1;if((me(c,l,b)|0)<=0){break r}G[b>>2]=e;G[l>>2]=0;G[l+4>>2]=1072693248;G[d+48>>2]=d+384;c=d+720|0;Ya(c,81,10024,d+48|0);Ua(c);break r}if(!(nb(d+464|0,34377,6)|!q)){G[r>>2]=0;c=d+384|0;mc(d+544|0,c,d+304|0,b);a=1;if((me(c,q,b)|0)<=0){break r}G[b>>2]=e;G[q>>2]=0;G[q+4>>2]=0;G[d+64>>2]=d+384;c=d+720|0;Ya(c,81,9974,d- -64|0);Ua(c);break r}if(!(nb(d+464|0,34862,6)|!p)){G[r>>2]=0;c=d+384|0;mc(d+544|0,c,d+304|0,b);a=1;if((yi(c,p,b)|0)<=0){break r}G[b>>2]=e;G[p>>2]=1234554321;G[p+4>>2]=0;G[d+80>>2]=d+384;c=d+720|0;Ya(c,81,9677,d+80|0);Ua(c);break r}if(!(nb(d+464|0,33303,7)|!k)){G[r>>2]=0;c=d+384|0;mc(d+544|0,c,d+304|0,b);a=1;if((ue(c,k,b)|0)<=0){break r}G[d+96>>2]=d+384;c=d+720|0;Ya(c,81,9571,d+96|0);Ua(c);break r}if(!(nb(d+464|0,33311,7)|!o)){G[r>>2]=0;c=d+384|0;mc(d+544|0,c,d+304|0,b);a=1;if((ue(c,o,b)|0)<=0){break r}G[d+112>>2]=d+384;c=d+720|0;Ya(c,81,9624,d+112|0);Ua(c);break r}if(!(nb(d+464|0,35787,7)|!s)){G[r>>2]=0;mc(d+544|0,d+384|0,d+304|0,b);a=1;c=G[b>>2];if((c|0)<=0){G[s>>2]=H[d+384|0]==84;c=G[b>>2]}if((c|0)<=0){break r}G[b>>2]=e;G[s>>2]=0;G[d+128>>2]=d+384;c=d+720|0;Ya(c,81,9764,d+128|0);Ua(c);break r}a=0;if(G[d+464>>2]==4476485){break r}if(!H[d+544|0]){a=1;G[r>>2]=G[r>>2]+1;break r}G[r>>2]=0}a=1}if(G[b>>2]>0){break p}i=i+1|0;if(a){continue}break o}break}G[b>>2]=e;if((e|0)<=0){break o}}Ua(G[G[f+4>>2]+76>>2]?42900:42841);break b}if(!h){break b}e=233;break c}e=213;break c}e=224}G[b>>2]=e}Fa=d+832|0;a=G[b>>2];u:{if((a|0)==233){G[b>>2]=G[g+8136>>2];break u}if((a|0)>0){break a}}c=G[f+4>>2];a=G[c+120>>2];o=G[c+124>>2];e=M(G[g+8116>>2],80)+80|0;G[c+104>>2]=a-e;G[c+108>>2]=o-((e>>31)+(e>>>0>a>>>0)|0);e=Cu(a-80|0,o-(a>>>0<80)|0);h=(a-e|0)+2800|0;l=o-(Ia+(a>>>0>>0)|0)|0;G[c+128>>2]=h;G[c+132>>2]=h>>>0<2800?l+1|0:l;t=1;v:{if(G[g+112>>2]|G[g+116>>2]|G[g+8124>>2]<=0){break v}G[g+8136>>2]=0;ef(f,2,b);if(!po(f,33752,g+8140|0,g,g+8136|0)){break v}G[g+8140>>2]=0}w:{x:{y:{z:{A:{a=G[g+8128>>2];if((a|0)<=7){if((a|0)==-64){break A}if((a|0)!=-32){break y}t=4;i=42;break w}i=11;B:{switch(a-8|0){case 8:t=2;i=21;break w;case 0:break w;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break y;case 24:break B;default:break z}}t=4;i=41;break w}t=8;i=82;break w}if((a|0)==64){break x}}i=0;t=0;break w}t=8;i=81}c=G[f+4>>2];u=G[g+8124>>2];G[c+136>>2]=u;C:{if(!u){break C}h=G[g+8140>>2];e=G[g+116>>2];a=G[g+112>>2];G[c+144>>2]=a;G[c+148>>2]=e;v=h?1:a;w=h?0:e;if((u|0)<2){break C}a=u-1|0;d=a&3;D:{if(u-2>>>0<3){a=1;break D}o=a&-4;a=1;x=c+144|0;while(1){n=a<<3;k=g+112|0;e=n+k|0;r=G[e+4>>2];l=G[e>>2];e=n+x|0;G[e>>2]=l;G[e+4>>2]=r;h=n+8|0;e=h+k|0;q=G[e+4>>2];p=G[e>>2];e=h+x|0;G[e>>2]=p;G[e+4>>2]=q;h=n+16|0;e=h+k|0;s=G[e+4>>2];m=G[e>>2];e=h+x|0;G[e>>2]=m;G[e+4>>2]=s;h=n+24|0;e=h+k|0;n=G[e+4>>2];k=G[e>>2];e=h+x|0;G[e>>2]=k;G[e+4>>2]=n;v=Au(k,n,Au(m,s,Au(p,q,Au(v,w,l,r),Ia),Ia),Ia);w=Ia;a=a+4|0;j=j+4|0;if((o|0)!=(j|0)){continue}break}}if(!d){break C}k=0;while(1){e=a<<3;j=e+(g+112|0)|0;o=G[j+4>>2];h=G[j>>2];j=c+e|0;G[j+144>>2]=h;G[j+148>>2]=o;a=a+1|0;v=Au(v,w,h,o);w=Ia;k=k+1|0;if((d|0)!=(k|0)){continue}break}}j=G[c+96>>2]+(G[c+76>>2]<<3)|0;a=G[g+8112>>2];e=a+v|0;h=(a>>31)+w|0;n=Au(t,0,e,a>>>0>e>>>0?h+1|0:h);k=Ia;a=G[g+8108>>2];q=a;p=a>>31;s=Au(n,k,a,p);a=Ia;o=a;e=s+2879|0;a=e>>>0<2879?a+1|0:a;h=e;e=G[c+128>>2];m=h+e|0;l=G[c+132>>2]+a|0;l=e>>>0>m>>>0?l+1|0:l;e=m;a=Cu(h,a);G[j+8>>2]=e-a;G[j+12>>2]=l-(Ia+(a>>>0>e>>>0)|0);G[c+1088>>2]=0;G[c+984>>2]=0;G[c+988>>2]=0;G[c+976>>2]=s;G[c+980>>2]=o;E:{if(!u){G[c+936>>2]=0;G[c+960>>2]=0;G[c+964>>2]=0;if(G[c+1228>>2]){a=0;e=(G[c+1112>>2]-1|0)/G[c+1052>>2]|0;if((e|0)>=0){while(1){j=a<<2;c=G[f+4>>2];b=G[j+G[c+1240>>2]>>2];if(b){Wa(b);c=G[f+4>>2]}b=G[G[c+1244>>2]+j>>2];if(b){Wa(b)}b=(a|0)!=(e|0);a=a+1|0;if(b){continue}break}c=G[f+4>>2]}Wa(G[c+1248>>2]);Wa(G[G[f+4>>2]+1236>>2]);Wa(G[G[f+4>>2]+1232>>2]);Wa(G[G[f+4>>2]+1244>>2]);Wa(G[G[f+4>>2]+1240>>2]);Wa(G[G[f+4>>2]+1228>>2]);c=G[f+4>>2];a=c;G[a+1228>>2]=0;G[a+1232>>2]=0;a=a+1244|0;G[a>>2]=0;G[a+4>>2]=0;a=c+1236|0;G[a>>2]=0;G[a+4>>2]=0}a=G[c+968>>2];if(a){Wa(a);c=G[f+4>>2]}G[c+944>>2]=0;G[c+948>>2]=0;G[c+968>>2]=0;G[c+952>>2]=0;G[c+956>>2]=0;break E}G[c+960>>2]=n;G[c+964>>2]=k;G[c+944>>2]=q;G[c+948>>2]=p;G[c+952>>2]=q;G[c+956>>2]=p;G[c+936>>2]=2;if(G[c+1228>>2]){a=0;h=(G[c+1112>>2]-1|0)/G[c+1052>>2]|0;if((h|0)>=0){while(1){e=a<<2;c=G[f+4>>2];j=G[e+G[c+1240>>2]>>2];if(j){Wa(j);c=G[f+4>>2]}c=G[G[c+1244>>2]+e>>2];if(c){Wa(c)}c=(a|0)!=(h|0);a=a+1|0;if(c){continue}break}c=G[f+4>>2]}Wa(G[c+1248>>2]);Wa(G[G[f+4>>2]+1236>>2]);Wa(G[G[f+4>>2]+1232>>2]);Wa(G[G[f+4>>2]+1244>>2]);Wa(G[G[f+4>>2]+1240>>2]);Wa(G[G[f+4>>2]+1228>>2]);c=G[f+4>>2];a=c;G[a+1228>>2]=0;G[a+1232>>2]=0;a=a+1244|0;G[a>>2]=0;G[a+4>>2]=0;a=c+1236|0;G[a>>2]=0;G[a+4>>2]=0}a=G[c+968>>2];if(a){Wa(a)}e=lb(2,160);if(!e){tb(5,49776);G[G[f+4>>2]+968>>2]=0;G[b>>2]=111;break a}c=G[f+4>>2];G[c+968>>2]=e;G[e+152>>2]=t;G[e+80>>2]=i;G[e+72>>2]=0;G[e+76>>2]=0;a=G[g+8112>>2];G[e+104>>2]=0;G[e+108>>2]=0;G[e+96>>2]=0;G[e+100>>2]=1072693248;G[e+88>>2]=a;G[e+92>>2]=a>>31;j=G[g+104>>2];b=G[g+108>>2];G[e+312>>2]=t;G[e+240>>2]=i;a=M(a,t);G[e+232>>2]=a;G[e+236>>2]=a>>31;G[e+112>>2]=j;G[e+116>>2]=b;G[e+248>>2]=v;G[e+252>>2]=w;L[e+256>>3]=L[g+96>>3];y=L[g+88>>3];G[e+272>>2]=j;G[e+276>>2]=b;L[e+264>>3]=y}b=G[c+96>>2]+(G[c+76>>2]<<3)|0;a=G[b+4>>2];G[c+120>>2]=G[b>>2];G[c+124>>2]=a}Fa=g+8144|0}function Gf(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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,I=0,K=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0;q=Fa-29104|0;Fa=q;p=G[o>>2];a:{if(!(g|h)|(p|0)>0){break a}if(n){G[n>>2]=0}if((j|0)==2){cb(m,0,g)}if((yc(a,b,c,d,e,f,g,h,0,q+29096|0,q+29088|0,q+28992|0,q+29064|0,q+29084|0,q+29080|0,q+29040|0,q+29032|0,q+29060|0,q+29048|0,q+29016|0,q+29076|0,q+29024|0,q+28864|0,o)|0)>0){p=G[o>>2];break a}G[q+29060>>2]=M(G[q+29060>>2],i);C=1;c=G[q+29080>>2];d=c>>31;b:{if(G[q+29084>>2]!=16){break b}Gd(q+28992|0,q+29072|0,q+29056|0,q+29068|0,o);e=G[q+29068>>2];if((e|0)<=0){break b}if(e-1>>>0>=7){f=e&-8;p=0;while(1){C=C*10*10*10*10*10*10*10*10;p=p+8|0;if((f|0)!=(p|0)){continue}break}}e=e&7;if(!e){break b}p=0;while(1){C=C*10;p=p+1|0;if((e|0)!=(p|0)){continue}break}}f=G[q+29084>>2];c:{d:{if(k?0:(j|0)==1){break d}e=G[q+29028>>2];p=e;e=G[q+29024>>2];if(!p&(e|0)==1234554321&((f|0)%10|0)==1){break d}if(!((p-(e>>>0<32768)|0)==-1&e-32768>>>0>4294901759|(f|0)!=21)){d=g>>>0<1073741823&(h|0)<=0|(h|0)<0;c=d?g:1073741823;d=d?h:0;break c}if((!p&e>>>0>255|(p|0)!=0)&(f|0)==11){break c}A=(f|0)==16?H[q+28864|0]==1?0:j:j}if((f|0)!=21){break c}d=g>>>0<1073741823&(h|0)<=0|(h|0)<0;c=d?g:1073741823;d=d?h:0}S=i>>31;e=0;f=0;e:{while(1){j=G[q+29044>>2];p=G[q+29040>>2];r=Au(G[q+29016>>2],G[q+29020>>2],K,P);p=p+r|0;j=Ia+j|0;j=p>>>0>>0?j+1|0:j;v=p;r=G[q+29032>>2];t=G[q+29036>>2];y=G[q+29060>>2];p=(y|0)/(i|0)|0;u=Au(r,t,p,p>>31);p=v+u|0;j=Ia+j|0;v=p;u=p>>>0>>0?j+1|0:j;p=r^-1;j=p+G[q+29048>>2]|0;r=G[q+29052>>2]+(t^-1)|0;t=Bu(j,j>>>0

>>0?r+1|0:r,i,S);j=Ia;s=j;p=t+1|0;j=p?j:j+1|0;D=p;p=c>>>0>g>>>0&(d|0)>=(h|0)|(d|0)>(h|0)?g:c;j=p;p=p>>31;r=j;j=j>>>0>t>>>0&(p|0)>=(s|0)|(p|0)>(s|0);t=j?D:r;f:{g:{h:{i:{j:{k:{l:{m:{n:{j=G[q+29084>>2];switch(j-11|0){case 10:break g;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break h;case 5:break i;case 31:break k;case 30:break l;case 0:break m;default:break n}}o:{switch(j-81|0){case 1:break j;case 0:break o;default:break h}}j=y;y=q- -64|0;Tc(a,v,u,t,j,y,o);j=G[q+29024>>2];r=G[q+29028>>2];v=e+m|0;u=(e<<1)+l|0;x=L[q+29096>>3];B=L[q+29088>>3];p=x==1&B==0x8000000000000000;p:{q:{if(!A){r:{s:{if(p){if((t|0)<=0){break p}p=0;if((t|0)!=1){r=t&-2;v=0;while(1){s=u+(p<<1)|0;j=y+(p<<3)|0;w=G[j+4>>2];j=G[j>>2];if((w|0)!=-2147483648|j>>>0>=65536){G[o>>2]=-11;j=65535}F[s>>1]=j;s=p|1;j=y+(s<<3)|0;w=G[j+4>>2];j=G[j>>2];if(!((w|0)==-2147483648&j>>>0<=65535)){G[o>>2]=-11;j=65535}F[u+(s<<1)>>1]=j;p=p+2|0;v=v+2|0;if((r|0)!=(v|0)){continue}break}}if(!(t&1)){break p}j=y+(p<<3)|0;r=G[j+4>>2];j=G[j>>2];if((r|0)!=-2147483648|j>>>0>65535){break s}break r}if(x==1&B==0){break q}p=0;if((t|0)<=0){break p}while(1){r=u+(p<<1)|0;t:{u:{j=y+(p<<3)|0;z=(+J[j>>2]+ +G[j+4>>2]*4294967296)*x+B;if(z<-.49){G[o>>2]=-11;break u}if(z>65535.49){G[o>>2]=-11;j=65535;break t}if(!(z<4294967296&z>=0)){break u}j=~~z>>>0;break t}j=0}F[r>>1]=j;p=p+1|0;if((t|0)!=(p|0)){continue}break}break p}G[o>>2]=-11;j=65535}F[u+(p<<1)>>1]=j;break p}if(p){if((t|0)<=0){break p}p=0;while(1){w=y+(p<<3)|0;s=G[w>>2];w=G[w+4>>2];v:{if((s|0)==(j|0)&(w|0)==(r|0)){G[n>>2]=1;if((A|0)==1){F[u+(p<<1)>>1]=k;break v}E[p+v|0]=1;break v}if((w|0)!=-2147483648|s>>>0>=65536){G[o>>2]=-11;F[u+(p<<1)>>1]=65535;break v}F[u+(p<<1)>>1]=s}p=p+1|0;if((t|0)!=(p|0)){continue}break}break p}if(!(x==1&B==0)){if((t|0)<=0){break p}p=0;while(1){s=y+(p<<3)|0;w=G[s>>2];s=G[s+4>>2];w:{if((w|0)==(j|0)&(s|0)==(r|0)){G[n>>2]=1;if((A|0)==1){F[u+(p<<1)>>1]=k;break w}E[p+v|0]=1;break w}z=(+(w>>>0)+ +(s|0)*4294967296)*x+B;if(z<-.49){G[o>>2]=-11;F[u+(p<<1)>>1]=0;break w}if(z>65535.49){G[o>>2]=-11;F[u+(p<<1)>>1]=65535;break w}D=u+(p<<1)|0;if(z<4294967296&z>=0){s=~~z>>>0}else{s=0}F[D>>1]=s}p=p+1|0;if((t|0)!=(p|0)){continue}break}break p}if((t|0)<=0){break p}p=0;while(1){s=y+(p<<3)|0;w=G[s>>2];s=G[s+4>>2];x:{if((w|0)==(j|0)&(s|0)==(r|0)){G[n>>2]=1;if((A|0)==1){F[u+(p<<1)>>1]=k;break x}E[p+v|0]=1;break x}if((s|0)<0){G[o>>2]=-11;F[u+(p<<1)>>1]=0;break x}if(!s&w>>>0>=65536|s){G[o>>2]=-11;F[u+(p<<1)>>1]=65535;break x}F[u+(p<<1)>>1]=w}p=p+1|0;if((t|0)!=(p|0)){continue}break}break p}if((t|0)<=0){break p}p=0;while(1){v=u+(p<<1)|0;j=y+(p<<3)|0;r=G[j+4>>2];j=G[j>>2];y:{if((r|0)<0){G[o>>2]=-11;j=0;break y}if(!r&j>>>0>=65536|r){G[o>>2]=-11;j=65535}}F[v>>1]=j;p=p+1|0;if((t|0)!=(p|0)){continue}break}}break f}j=q- -64|0;$d(a,v,u,t,y,j,o);Jp(j,t,L[q+29096>>3],L[q+29088>>3],A,H[q+29024|0],k,e+m|0,n,(e<<1)+l|0,o);break f}j=q- -64|0;Uc(a,v,u,t,y,j,o);Vk(j,t,L[q+29096>>3],L[q+29088>>3],A,G[q+29024>>2],k,e+m|0,n,(e<<1)+l|0,o);break f}j=q- -64|0;Uc(a,v,u,t,y,j,o);Ip(j,t,L[q+29096>>3],L[q+29088>>3],A,k,e+m|0,n,(e<<1)+l|0,o);break f}j=q- -64|0;Tc(a,v,u,t,y,j,o);Hp(j,t,L[q+29096>>3],L[q+29088>>3],A,k,e+m|0,n,(e<<1)+l|0,o);break f}Jb(a,v,u,0,o);j=G[q+29060>>2];p=G[q+29064>>2];z:{if((j|0)==(p|0)){j=M(j,t);ic(a,j,j>>31,q- -64|0,o);break z}Rd(a,p,t,j-p|0,q- -64|0,o)}v=q- -64|0;z=L[q+29096>>3];T=L[q+29088>>3];U=G[q+29064>>2];V=e+m|0;I=(e<<1)+l|0;w=0;s=Fa-112|0;Fa=s;N=q+28864|0;W=Va(N);if((t|0)>0){while(1){A:{u=v+U|0;Q=H[u|0];E[u|0]=0;j=v;B:{C:{if(H[N|0]==1){break C}if(fb(N,v,W)){break C}j=u;if(!A){break B}G[n>>2]=1;if((A|0)==1){F[(w<<1)+I>>1]=k;break B}E[w+V|0]=1;break B}while(1){r=H[j|0];if((r|0)==32){j=j+1|0;continue}break}R=1;D:{switch(r-43|0){case 0:case 2:while(1){p=H[j+1|0];j=j+1|0;if((p|0)==32){continue}break};R=(r|0)==45?-1:1;r=p;break;default:break D}}B=0;if((r-48&255)>>>0<10){while(1){x=B*10+ +(r<<24>>24);p=j;while(1){r=H[p+1|0];j=p+1|0;p=j;if((r|0)==32){continue}break}B=x+-48;if((r-48&255)>>>0<=9){continue}break}}x=C;E:{F:{switch(r-44|0){case 0:case 2:break F;default:break E}}p=j;while(1){r=H[p+1|0];j=p+1|0;p=j;if((r|0)==32){continue}break}x=1;if((r-48&255)>>>0>=10){break E}while(1){B=B*10+ +(r<<24>>24)+-48;p=j;while(1){r=H[p+1|0];j=p+1|0;p=j;if((r|0)==32){continue}break}x=x*10;if((r-48&255)>>>0<=9){continue}break}}G:{if((r&254)!=68){O=1;p=0;break G}while(1){O=1;p=j;j=p+1|0;r=H[p+1|0];if((r|0)==32){continue}break}H:{switch(r-43|0){case 0:case 2:p=p+2|0;while(1){j=p;p=p+1|0;y=H[j|0];if((y|0)==32){continue}break};O=(r|0)==45?-1:1;r=y;break;default:break H}}p=0;if((r-48&255)>>>0>=10){break G}while(1){y=r;D=M(p,10)-48|0;p=j;while(1){r=H[p+1|0];j=p+1|0;p=j;if((r|0)==32){continue}break}p=(y<<24>>24)+D|0;if((r-48&255)>>>0<=9){continue}break}}if(r){G[s+48>>2]=H[23477]|H[23478]<<8|(H[23479]<<16|H[23480]<<24);j=H[23473]|H[23474]<<8|(H[23475]<<16|H[23476]<<24);G[s+40>>2]=H[23469]|H[23470]<<8|(H[23471]<<16|H[23472]<<24);G[s+44>>2]=j;j=H[23465]|H[23466]<<8|(H[23467]<<16|H[23468]<<24);G[s+32>>2]=H[23461]|H[23462]<<8|(H[23463]<<16|H[23464]<<24);G[s+36>>2]=j;j=H[23457]|H[23458]<<8|(H[23459]<<16|H[23460]<<24);G[s+24>>2]=H[23453]|H[23454]<<8|(H[23455]<<16|H[23456]<<24);G[s+28>>2]=j;j=H[23449]|H[23450]<<8|(H[23451]<<16|H[23452]<<24);G[s+16>>2]=H[23445]|H[23446]<<8|(H[23447]<<16|H[23448]<<24);G[s+20>>2]=j;j=s+16|0;Ua(j);G[s>>2]=v;Ya(j,81,43022,s);Ua(j);E[u|0]=Q;G[o>>2]=409;break A}x=B*+(R|0)/x*$b(10,+(M(p,O)|0))*z+T;I:{if(x<-.49){G[o>>2]=-11;F[(w<<1)+I>>1]=0;break I}if(x>65535.49){G[o>>2]=-11;F[(w<<1)+I>>1]=65535;break I}p=(w<<1)+I|0;if(x<4294967296&x>=0){r=~~x>>>0}else{r=0}F[p>>1]=r}}v=j;E[u|0]=Q;w=w+1|0;if((t|0)!=(w|0)){continue}}break}}Fa=s+112|0;break f}G[q>>2]=b;G[q+4>>2]=q+28992;a=q+28896|0;Ya(a,81,8924,q);Ua(a);p=311;if(G[q+29076>>2]==1){break e}p=312;break e}j=(e<<1)+l|0;Pe(a,v,u,t,y,j,o);Gp(j,t,L[q+29096>>3],L[q+29088>>3],A,F[q+29024>>1],k,e+m|0,n,j,o)}p=G[o>>2];if((p|0)>0){x=+(e>>>0)+ +(f|0)*4294967296;C=x+1;x=x+ +(t|0);J:{if(G[q+29076>>2]>0){G[q+32>>2]=b;L[q+24>>3]=x;L[q+16>>3]=C;Ya(q+28896|0,81,46949,q+16|0);break J}L[q+56>>3]=x;L[q+48>>3]=C;Ya(q+28896|0,81,46889,q+48|0)}Ua(q+28896|0);p=G[o>>2];break a}j=t;r=j>>31;u=r;h=h-(r+(g>>>0>>0)|0)|0;g=g-j|0;if(h|g){p=M(i,t);v=p;r=p+G[q+29032>>2]|0;p=G[q+29036>>2]+(p>>31)|0;p=r>>>0>>0?p+1|0:p;G[q+29032>>2]=r;G[q+29036>>2]=p;f=f+u|0;e=e+j|0;f=e>>>0>>0?f+1|0:f;j=G[q+29048>>2];u=G[q+29052>>2];if(j>>>0>r>>>0&(u|0)>=(p|0)|(p|0)<(u|0)){continue}v=Bu(r,p,j,u);t=Ia;j=Au(v,t,j,u);G[q+29032>>2]=r-j;G[q+29036>>2]=p-(Ia+(j>>>0>r>>>0)|0);r=t+P|0;j=v+K|0;r=j>>>0>>0?r+1|0:r;K=j;P=r;continue}break}if((p|0)!=-11){break a}Ua(44994);p=412}G[o>>2]=p}Fa=q+29104|0;return p}function xe(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}c=G[l+29096>>2];v=c;w=c>>31;if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}e=0;f=0;while(1){p=G[l+29072>>2];k=G[l+29076>>2];c=G[l+29068>>2];d=G[l+29064>>2];m=Au(G[l+29048>>2],G[l+29052>>2],x,y);d=d+m|0;c=Ia+c|0;c=d>>>0>>0?c+1|0:c;r=d;m=G[l+29056>>2];o=G[l+29060>>2];d=G[l+29084>>2];q=Au(m,o,d,d>>31);d=r+q|0;c=Ia+c|0;Jb(a,d,d>>>0>>0?c+1|0:c,1,j);d=g>>>0>>0&(h|0)<=(w|0)|(h|0)<(w|0)?g:v;c=d>>31;q=d;d=k-((m>>>0>p>>>0)+o|0)|0;p=p-m|0;m=p;p=(c|0)<=(d|0)&p>>>0>q>>>0|(c|0)<(d|0);m=p?q:m;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{c=G[l+29100>>2];switch(c-11|0){case 0:break h;case 10:break i;case 31:break j;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break m;case 5:break n;case 30:break o;default:break p}}switch(c-81|0){case 0:break g;case 1:break k;default:break m}}d=(e<<2)+i|0;s=L[l+29032>>3];u=L[l+29024>>3];if(s==1&u==0){break f}k=0;if((m|0)<=0){break e}while(1){q:{r:{o=k<<2;n=(+G[o+d>>2]-u)/s;if(n<-2147483648.49){G[j>>2]=-11;break r}if(n>2147483647.49){G[j>>2]=-11;c=2147483647;break q}if(n>=0){n=n+.5;if(!(O(n)<2147483648)){break r}c=~~n;break q}n=n+-.5;if(!(O(n)<2147483648)){break r}c=~~n;break q}c=-2147483648}G[o+(l+32|0)>>2]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break e}if(H[l+28961|0]==115){break m}q=(e<<2)+i|0;r=l+28960|0;p=G[l+29088>>2];d=l+32|0;o=0;k=Fa-32|0;Fa=k;n=L[l+29032>>3];s=L[l+29024>>3];s:{if(!(n==1&s==0)){if((m|0)<=0){break s}c=d;while(1){L[k+16>>3]=(+G[q+(o<<2)>>2]-s)/n;Eb(c,r,k+16|0);c=c+p|0;if(H[c|0]){G[j>>2]=-11}o=o+1|0;if((o|0)!=(m|0)){continue}break}break s}if((m|0)<=0){break s}c=d;while(1){L[k>>3]=G[q+(o<<2)>>2];Eb(c,r,k);c=c+p|0;if(H[c|0]){G[j>>2]=-11}o=o+1|0;if((o|0)!=(m|0)){continue}break}}o=jb(d,44);if(o){while(1){E[o|0]=46;o=jb(o,44);if(o){continue}break}}Fa=k+32|0;c=G[l+29084>>2];d=G[l+29088>>2];if((c|0)!=(d|0)){break l}c=M(c,m);Wb(a,c,c>>31,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,d,m,c-d|0,l+32|0,j);break d}c=(e<<2)+i|0;n=L[l+29032>>3];s=L[l+29024>>3];t:{if(!(n==1&s==0)){if((m|0)<=0){break t}k=0;if((m|0)!=1){o=m&-2;d=0;while(1){q=l+32|0;L[q+(k<<3)>>3]=(+G[c+(k<<2)>>2]-s)/n;r=k|1;L[q+(r<<3)>>3]=(+G[c+(r<<2)>>2]-s)/n;k=k+2|0;d=d+2|0;if((o|0)!=(d|0)){continue}break}}if(!(m&1)){break t}L[(l+32|0)+(k<<3)>>3]=(+G[c+(k<<2)>>2]-s)/n;break t}if((m|0)<=0){break t}d=0;k=0;if(m-1>>>0>=3){r=m&-4;o=0;while(1){q=l+32|0;L[q+(k<<3)>>3]=G[c+(k<<2)>>2];p=k|1;L[q+(p<<3)>>3]=G[c+(p<<2)>>2];p=k|2;L[q+(p<<3)>>3]=G[c+(p<<2)>>2];p=k|3;L[q+(p<<3)>>3]=G[c+(p<<2)>>2];k=k+4|0;o=o+4|0;if((r|0)!=(o|0)){continue}break}}o=m&3;if(!o){break t}while(1){L[(l+32|0)+(k<<3)>>3]=G[c+(k<<2)>>2];k=k+1|0;d=d+1|0;if((o|0)!=(d|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}c=(e<<2)+i|0;n=L[l+29032>>3];s=L[l+29024>>3];u:{if(!(n==1&s==0)){if((m|0)<=0){break u}d=0;if((m|0)!=1){q=m&-2;o=0;while(1){k=d<<2;r=l+32|0;K[k+r>>2]=(+G[c+k>>2]-s)/n;k=k|4;K[k+r>>2]=(+G[c+k>>2]-s)/n;d=d+2|0;o=o+2|0;if((q|0)!=(o|0)){continue}break}}if(!(m&1)){break u}d=d<<2;K[d+(l+32|0)>>2]=(+G[c+d>>2]-s)/n;break u}if((m|0)<=0){break u}o=0;d=0;if(m-1>>>0>=3){p=m&-4;r=0;while(1){k=d<<2;q=l+32|0;K[k+q>>2]=G[c+k>>2];t=k|4;K[t+q>>2]=G[c+t>>2];t=k|8;K[t+q>>2]=G[c+t>>2];k=k|12;K[k+q>>2]=G[c+k>>2];d=d+4|0;r=r+4|0;if((p|0)!=(r|0)){continue}break}}k=m&3;if(!k){break u}while(1){q=d<<2;K[q+(l+32|0)>>2]=G[c+q>>2];d=d+1|0;o=o+1|0;if((k|0)!=(o|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}q=(e<<2)+i|0;s=L[l+29032>>3];u=L[l+29024>>3];v:{if(!(s==1&u==0)){k=0;if((m|0)<=0){break v}while(1){d=(l+32|0)+(k<<1)|0;n=(+G[q+(k<<2)>>2]-u)/s;w:{if(n<-32768.49){G[j>>2]=-11;c=32768;break w}if(n>32767.49){G[j>>2]=-11;c=32767;break w}x:{if(n>=0){n=n+.5;if(!(O(n)<2147483648)){break x}c=~~n;break w}n=n+-.5;if(!(O(n)<2147483648)){break x}c=~~n;break w}c=-2147483648}F[d>>1]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break v}if((m|0)<=0){break v}k=0;if((m|0)!=1){c=m&-2;o=0;while(1){d=G[q+(k<<2)>>2];y:{if((d|0)<=-32769){G[j>>2]=-11;d=32768;break y}if((d|0)<32768){break y}G[j>>2]=-11;d=32767}F[(l+32|0)+(k<<1)>>1]=d;r=k|1;d=G[q+(r<<2)>>2];z:{if((d|0)>=-32768){if((d|0)<=32767){break z}G[j>>2]=-11;d=32767;break z}G[j>>2]=-11;d=32768}F[(l+32|0)+(r<<1)>>1]=d;k=k+2|0;o=o+2|0;if((c|0)!=(o|0)){continue}break}}if(!(m&1)){break v}d=G[q+(k<<2)>>2];A:{if((d|0)>=-32768){if((d|0)<=32767){break A}G[j>>2]=-11;d=32767;break A}G[j>>2]=-11;d=32768}F[(l+32|0)+(k<<1)>>1]=d}Oe(a,m,G[l+29084>>2],l+32|0,j);break d}c=(e<<2)+i|0;s=L[l+29032>>3];u=L[l+29024>>3];B:{if(!(s==1&u==0)){k=0;if((m|0)<=0){break B}while(1){p=(l+32|0)+k|0;C:{D:{n=(+G[c+(k<<2)>>2]-u)/s;if(n<-.49){G[j>>2]=-11;break D}if(n>255.49){G[j>>2]=-11;d=255;break C}n=n+.5;if(!(n<4294967296&n>=0)){break D}d=~~n>>>0;break C}d=0}E[p|0]=d;k=k+1|0;if((m|0)!=(k|0)){continue}break}break B}if((m|0)<=0){break B}k=0;if((m|0)!=1){q=m&-2;o=0;while(1){d=G[c+(k<<2)>>2];E:{if((d|0)<0){G[j>>2]=-11;d=0;break E}if(d>>>0<256){break E}G[j>>2]=-11;d=255}E[(l+32|0)+k|0]=d;r=k|1;d=G[c+(r<<2)>>2];F:{if((d|0)>=0){if(d>>>0<=255){break F}G[j>>2]=-11;d=255;break F}G[j>>2]=-11;d=0}E[r+(l+32|0)|0]=d;k=k+2|0;o=o+2|0;if((q|0)!=(o|0)){continue}break}}if(!(m&1)){break B}d=G[c+(k<<2)>>2];G:{if((d|0)>=0){if(d>>>0<=255){break G}G[j>>2]=-11;d=255;break G}G[j>>2]=-11;d=0}E[(l+32|0)+k|0]=d}we(a,m,G[l+29084>>2],l+32|0,j);break d}q=(e<<2)+i|0;H:{I:{J:{K:{u=L[l+29032>>3];c=u!=1;s=L[l+29024>>3];if(!(c|s!=0x8000000000000000)){if((m|0)<=0){break H}k=0;if((m|0)!=1){r=m&-2;d=0;while(1){o=(l+32|0)+(k<<3)|0;c=G[q+(k<<2)>>2];if((c|0)<0){G[j>>2]=-11;c=0}G[o>>2]=c;G[o+4>>2]=-2147483648;o=k|1;c=G[q+(o<<2)>>2];if((c|0)<0){G[j>>2]=-11;c=0}o=(l+32|0)+(o<<3)|0;G[o>>2]=c;G[o+4>>2]=-2147483648;k=k+2|0;d=d+2|0;if((r|0)!=(d|0)){continue}break}}if(!(m&1)){break H}c=G[q+(k<<2)>>2];if((c|0)<0){break K}break J}if(!c&s==0){break I}k=0;if((m|0)<=0){break H}while(1){o=(l+32|0)+(k<<3)|0;L:{M:{n=(+G[q+(k<<2)>>2]-s)/u;if(n<-0x8000000000000000){G[j>>2]=-11;break M}if(n>0x8000000000000000){G[j>>2]=-11;d=2147483647;c=-1;break L}if(n>=0){n=n+.5;if(!(O(n)<0x8000000000000000)){break M}d=O(n)>=1?~~(n>0?Q(S(n*2.3283064365386963e-10),4294967295):T((n-+(~~n>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~n>>>0;break L}n=n+-.5;if(!(O(n)<0x8000000000000000)){break M}d=O(n)>=1?~~(n>0?Q(S(n*2.3283064365386963e-10),4294967295):T((n-+(~~n>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~n>>>0;break L}d=-2147483648;c=0}G[o>>2]=c;G[o+4>>2]=d;k=k+1|0;if((m|0)!=(k|0)){continue}break}break H}G[j>>2]=-11;c=0}d=(l+32|0)+(k<<3)|0;G[d>>2]=c;G[d+4>>2]=-2147483648;break H}if((m|0)<=0){break H}d=0;k=0;if(m-1>>>0>=3){r=m&-4;o=0;while(1){c=l+32|0;p=c+(k<<3)|0;t=G[q+(k<<2)>>2];G[p>>2]=t;G[p+4>>2]=t>>31;p=k|1;t=c+(p<<3)|0;p=G[q+(p<<2)>>2];G[t>>2]=p;G[t+4>>2]=p>>31;p=k|2;t=c+(p<<3)|0;p=G[q+(p<<2)>>2];G[t>>2]=p;G[t+4>>2]=p>>31;p=k|3;c=c+(p<<3)|0;p=G[q+(p<<2)>>2];G[c>>2]=p;G[c+4>>2]=p>>31;k=k+4|0;o=o+4|0;if((r|0)!=(o|0)){continue}break}}c=m&3;if(!c){break H}while(1){o=(l+32|0)+(k<<3)|0;r=G[q+(k<<2)>>2];G[o>>2]=r;G[o+4>>2]=r>>31;k=k+1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}if((m|0)<=0){break e}bb(l+32|0,d,m<<2)}$c(a,m,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){c=f;a=e+1|0;c=a?c:c+1|0;L[l+16>>3]=+(a>>>0)+ +(c|0)*4294967296;c=m;d=c>>31;a=c+e|0;c=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?c+1|0:c)|0)*4294967296;a=l+28864|0;Ya(a,81,46630,l+16|0);Ua(a);break c}c=m;d=c>>31;p=c;h=h-((g>>>0>>0)+d|0)|0;g=g-c|0;if(!(h|g)){break b}c=d+f|0;m=e+p|0;c=m>>>0>>0?c+1|0:c;e=m;f=c;c=d+G[l+29060>>2]|0;m=p+G[l+29056>>2]|0;c=m>>>0

>>0?c+1|0:c;G[l+29056>>2]=m;G[l+29060>>2]=c;if(G[l+29072>>2]!=(m|0)|G[l+29076>>2]!=(c|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;c=y;d=x+1|0;c=d?c:c+1|0;x=d;y=c;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function Ng(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}c=G[l+29096>>2];v=c;w=c>>31;if(G[l+29100>>2]==16){Ne(l+28992|0,l+28960|0)}if(!(g|h)){k=G[j>>2];break b}e=0;f=0;while(1){n=G[l+29072>>2];k=G[l+29076>>2];c=G[l+29068>>2];d=G[l+29064>>2];m=Au(G[l+29048>>2],G[l+29052>>2],x,y);d=d+m|0;c=Ia+c|0;c=d>>>0>>0?c+1|0:c;s=d;m=G[l+29056>>2];q=G[l+29060>>2];d=G[l+29084>>2];p=Au(m,q,d,d>>31);d=s+p|0;c=Ia+c|0;Jb(a,d,d>>>0

>>0?c+1|0:c,1,j);d=g>>>0>>0&(h|0)<=(w|0)|(h|0)<(w|0)?g:v;c=d>>31;p=d;d=k-((m>>>0>n>>>0)+q|0)|0;n=n-m|0;m=n;n=(c|0)<=(d|0)&n>>>0>p>>>0|(c|0)<(d|0);m=n?p:m;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{c=G[l+29100>>2];switch(c-11|0){case 0:break j;case 30:break k;case 31:break l;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break o;case 5:break p;case 10:break s;default:break t}}switch(c-81|0){case 1:break m;case 0:break r;default:break o}}d=(e<<1)+i|0;r=L[l+29032>>3];t=L[l+29024>>3];if(r==1&t==0){break q}k=0;if((m|0)<=0){break e}while(1){q=k<<1;o=(+F[q+d>>1]-t)/r;u:{if(o<-32768.49){G[j>>2]=-11;c=32768;break u}if(o>32767.49){G[j>>2]=-11;c=32767;break u}v:{if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break v}c=~~o;break u}o=o+-.5;if(!(O(o)<2147483648)){break v}c=~~o;break u}c=-2147483648}F[q+(l+32|0)>>1]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break e}q=(e<<1)+i|0;t=L[l+29032>>3];c=t!=1;r=L[l+29024>>3];if(!(c|r!=0x8000000000000000)){if((m|0)<=0){break f}k=0;if((m|0)!=1){s=m&-2;c=0;while(1){d=(l+32|0)+(k<<3)|0;p=F[q+(k<<1)>>1];w:{if((p|0)<0){G[j>>2]=-11;p=0;break w}p=p&65535}G[d>>2]=p;G[d+4>>2]=-2147483648;p=k|1;d=F[q+(p<<1)>>1];x:{if((d|0)>=0){d=d&65535;break x}G[j>>2]=-11;d=0}p=(l+32|0)+(p<<3)|0;G[p>>2]=d;G[p+4>>2]=-2147483648;k=k+2|0;c=c+2|0;if((s|0)!=(c|0)){continue}break}}if(!(m&1)){break f}c=F[q+(k<<1)>>1];if((c|0)<0){break i}c=c&65535;break h}if(!c&r==0){break g}k=0;if((m|0)<=0){break f}while(1){p=(l+32|0)+(k<<3)|0;y:{z:{o=(+F[q+(k<<1)>>1]-r)/t;if(o<-0x8000000000000000){G[j>>2]=-11;break z}if(o>0x8000000000000000){G[j>>2]=-11;d=2147483647;c=-1;break y}if(o>=0){o=o+.5;if(!(O(o)<0x8000000000000000)){break z}d=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~o>>>0;break y}o=o+-.5;if(!(O(o)<0x8000000000000000)){break z}d=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~o>>>0;break y}d=-2147483648;c=0}G[p>>2]=c;G[p+4>>2]=d;k=k+1|0;if((m|0)!=(k|0)){continue}break}break f}bb(l+32|0,d,m<<1);break e}if(H[l+28961|0]==115){break o}p=(e<<1)+i|0;s=l+28960|0;n=G[l+29088>>2];d=l+32|0;k=0;q=Fa-32|0;Fa=q;o=L[l+29032>>3];r=L[l+29024>>3];A:{if(!(o==1&r==0)){if((m|0)<=0){break A}c=d;while(1){L[q+16>>3]=(+F[p+(k<<1)>>1]-r)/o;Eb(c,s,q+16|0);c=c+n|0;if(H[c|0]){G[j>>2]=-11}k=k+1|0;if((m|0)!=(k|0)){continue}break}break A}if((m|0)<=0){break A}c=d;while(1){L[q>>3]=F[p+(k<<1)>>1];Eb(c,s,q);c=c+n|0;if(H[c|0]){G[j>>2]=-11}k=k+1|0;if((m|0)!=(k|0)){continue}break}}k=jb(d,44);if(k){while(1){E[k|0]=46;k=jb(k,44);if(k){continue}break}}Fa=q+32|0;c=G[l+29084>>2];d=G[l+29088>>2];if((c|0)!=(d|0)){break n}c=M(c,m);Wb(a,c,c>>31,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,d,m,c-d|0,l+32|0,j);break d}q=(e<<1)+i|0;o=L[l+29032>>3];r=L[l+29024>>3];B:{if(!(o==1&r==0)){if((m|0)<=0){break B}k=0;if((m|0)!=1){d=m&-2;c=0;while(1){p=l+32|0;L[p+(k<<3)>>3]=(+F[q+(k<<1)>>1]-r)/o;n=p;p=k|1;L[n+(p<<3)>>3]=(+F[q+(p<<1)>>1]-r)/o;k=k+2|0;c=c+2|0;if((d|0)!=(c|0)){continue}break}}if(!(m&1)){break B}L[(l+32|0)+(k<<3)>>3]=(+F[q+(k<<1)>>1]-r)/o;break B}if((m|0)<=0){break B}c=0;k=0;if(m-1>>>0>=3){s=m&-4;d=0;while(1){p=l+32|0;L[p+(k<<3)>>3]=F[q+(k<<1)>>1];n=k|1;L[p+(n<<3)>>3]=F[q+(n<<1)>>1];n=k|2;L[p+(n<<3)>>3]=F[q+(n<<1)>>1];n=k|3;L[p+(n<<3)>>3]=F[q+(n<<1)>>1];k=k+4|0;d=d+4|0;if((s|0)!=(d|0)){continue}break}}d=m&3;if(!d){break B}while(1){L[(l+32|0)+(k<<3)>>3]=F[q+(k<<1)>>1];k=k+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}q=(e<<1)+i|0;o=L[l+29032>>3];r=L[l+29024>>3];C:{if(!(o==1&r==0)){if((m|0)<=0){break C}k=0;if((m|0)!=1){d=m&-2;c=0;while(1){p=l+32|0;K[p+(k<<2)>>2]=(+F[q+(k<<1)>>1]-r)/o;n=p;p=k|1;K[n+(p<<2)>>2]=(+F[q+(p<<1)>>1]-r)/o;k=k+2|0;c=c+2|0;if((d|0)!=(c|0)){continue}break}}if(!(m&1)){break C}K[(l+32|0)+(k<<2)>>2]=(+F[q+(k<<1)>>1]-r)/o;break C}if((m|0)<=0){break C}c=0;k=0;if(m-1>>>0>=3){s=m&-4;d=0;while(1){p=l+32|0;K[p+(k<<2)>>2]=F[q+(k<<1)>>1];n=k|1;K[p+(n<<2)>>2]=F[q+(n<<1)>>1];n=k|2;K[p+(n<<2)>>2]=F[q+(n<<1)>>1];n=k|3;K[p+(n<<2)>>2]=F[q+(n<<1)>>1];k=k+4|0;d=d+4|0;if((s|0)!=(d|0)){continue}break}}d=m&3;if(!d){break C}while(1){K[(l+32|0)+(k<<2)>>2]=F[q+(k<<1)>>1];k=k+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}q=(e<<1)+i|0;r=L[l+29032>>3];t=L[l+29024>>3];D:{if(!(r==1&t==0)){k=0;if((m|0)<=0){break D}while(1){d=(l+32|0)+(k<<2)|0;E:{F:{o=(+F[q+(k<<1)>>1]-t)/r;if(o<-2147483648.49){G[j>>2]=-11;break F}if(o>2147483647.49){G[j>>2]=-11;c=2147483647;break E}if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break F}c=~~o;break E}o=o+-.5;if(!(O(o)<2147483648)){break F}c=~~o;break E}c=-2147483648}G[d>>2]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break D}if((m|0)<=0){break D}c=0;k=0;if(m-1>>>0>=3){s=m&-4;d=0;while(1){p=l+32|0;G[p+(k<<2)>>2]=F[q+(k<<1)>>1];n=k|1;G[p+(n<<2)>>2]=F[q+(n<<1)>>1];n=k|2;G[p+(n<<2)>>2]=F[q+(n<<1)>>1];n=k|3;G[p+(n<<2)>>2]=F[q+(n<<1)>>1];k=k+4|0;d=d+4|0;if((s|0)!=(d|0)){continue}break}}d=m&3;if(!d){break D}while(1){G[(l+32|0)+(k<<2)>>2]=F[q+(k<<1)>>1];k=k+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}q=(e<<1)+i|0;r=L[l+29032>>3];t=L[l+29024>>3];G:{if(!(r==1&t==0)){k=0;if((m|0)<=0){break G}while(1){d=(l+32|0)+k|0;H:{I:{o=(+F[q+(k<<1)>>1]-t)/r;if(o<-.49){G[j>>2]=-11;break I}if(o>255.49){G[j>>2]=-11;c=255;break H}o=o+.5;if(!(o<4294967296&o>=0)){break I}c=~~o>>>0;break H}c=0}E[d|0]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break G}if((m|0)<=0){break G}k=0;if((m|0)!=1){p=m&-2;d=0;while(1){c=F[q+(k<<1)>>1];J:{if((c|0)<0){G[j>>2]=-11;c=0;break J}if(c>>>0<256){break J}G[j>>2]=-11;c=255}E[(l+32|0)+k|0]=c;s=k|1;c=F[q+(s<<1)>>1];K:{if((c|0)>=0){if(c>>>0<=255){break K}G[j>>2]=-11;c=255;break K}G[j>>2]=-11;c=0}E[s+(l+32|0)|0]=c;k=k+2|0;d=d+2|0;if((p|0)!=(d|0)){continue}break}}if(!(m&1)){break G}c=F[q+(k<<1)>>1];L:{if((c|0)>=0){if(c>>>0<=255){break L}G[j>>2]=-11;c=255;break L}G[j>>2]=-11;c=0}E[(l+32|0)+k|0]=c}we(a,m,G[l+29084>>2],l+32|0,j);break d}G[j>>2]=-11;c=0}d=(l+32|0)+(k<<3)|0;G[d>>2]=c;G[d+4>>2]=-2147483648;break f}if((m|0)<=0){break f}c=0;k=0;if(m-1>>>0>=3){s=m&-4;d=0;while(1){p=l+32|0;n=p+(k<<3)|0;u=F[q+(k<<1)>>1];G[n>>2]=u;G[n+4>>2]=u>>31;n=k|1;u=p+(n<<3)|0;n=F[q+(n<<1)>>1];G[u>>2]=n;G[u+4>>2]=n>>31;n=k|2;u=p+(n<<3)|0;n=F[q+(n<<1)>>1];G[u>>2]=n;G[u+4>>2]=n>>31;n=k|3;p=p+(n<<3)|0;n=F[q+(n<<1)>>1];G[p>>2]=n;G[p+4>>2]=n>>31;k=k+4|0;d=d+4|0;if((s|0)!=(d|0)){continue}break}}d=m&3;if(!d){break f}while(1){p=(l+32|0)+(k<<3)|0;s=F[q+(k<<1)>>1];G[p>>2]=s;G[p+4>>2]=s>>31;k=k+1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}Oe(a,m,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){c=f;a=e+1|0;c=a?c:c+1|0;L[l+16>>3]=+(a>>>0)+ +(c|0)*4294967296;c=m;d=c>>31;a=c+e|0;c=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?c+1|0:c)|0)*4294967296;a=l+28864|0;Ya(a,81,47013,l+16|0);Ua(a);break c}c=m;d=c>>31;n=c;h=h-((g>>>0>>0)+d|0)|0;g=g-c|0;if(!(h|g)){break b}c=d+f|0;m=e+n|0;c=m>>>0>>0?c+1|0:c;e=m;f=c;c=d+G[l+29060>>2]|0;m=n+G[l+29056>>2]|0;c=m>>>0>>0?c+1|0:c;G[l+29056>>2]=m;G[l+29060>>2]=c;if(G[l+29072>>2]!=(m|0)|G[l+29076>>2]!=(c|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;c=y;d=x+1|0;c=d?c:c+1|0;x=d;y=c;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k}function yc(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x){var y=0,z=0,A=0,B=0,C=0,D=0,F=0,I=0,K=0,N=0,O=0,P=0;y=Fa-448|0;Fa=y;G[y+444>>2]=0;a:{b:{c:{A=G[a>>2];z=G[a+4>>2];d:{e:{if((A|0)!=G[z+76>>2]){mb(a,A+1|0,0,x);break e}if((G[z+128>>2]&G[z+132>>2])==-1){if((Rb(a,x)|0)<=0){break e}break d}if((i|0)==15|(i|0)<=0){break e}A=G[49820];if(A-41>>>0<=4294967255){an(199280);z=G[a+4>>2];A=G[49820]}if((A|0)!=G[z+4>>2]){break e}B=G[z+128>>2];A=G[z+132>>2]-(B>>>0<2880)|0;C=G[z+104>>2];D=C;B=B-2880|0;F=B;B=C>>>0>B>>>0;C=G[z+108>>2];B=B&(A|0)<=(C|0)|(A|0)<(C|0);if(G[z+112>>2]==((B?D:F)|0)&G[z+116>>2]==((B?C:A)|0)){break e}rk(a,x)}z=G[a+4>>2];A=G[z+80>>2];if(!c&(d|0)<=0|(d|0)<0){I=+(c>>>0)+ +(d|0)*4294967296;if(!A){L[y>>3]=I;a=y+336|0;Ya(a,81,19547,y);tb(5,a);break c}L[y+16>>3]=I;a=y+336|0;Ya(a,81,19506,y+16|0);tb(5,a);break c}if(!(!!e&(f|0)>=0|(f|0)>0|(A|0)==1)){G[y+32>>2]=e;a=y+336|0;Ya(a,81,27597,y+32|0);break b}if((h|0)<0){L[y+48>>3]=+(g>>>0)+ +(h|0)*4294967296;a=y+336|0;Ya(a,81,19407,y+48|0);tb(5,a);G[x>>2]=306;a=306;break a}if(!((b|0)>0&G[z+936>>2]>=(b|0))){G[y+80>>2]=b;b=y+336|0;Ya(b,81,30457,y+80|0);tb(5,b);G[y+64>>2]=G[G[a+4>>2]+936>>2];Ya(b,81,44143,y- -64|0);tb(5,b);G[x>>2]=302;a=302;break a}G[u>>2]=A;A=G[z+964>>2];G[t>>2]=G[z+960>>2];G[t+4>>2]=A;A=G[z+128>>2];D=G[z+132>>2];F=G[z+968>>2]+M(b,160)|0;C=F-160|0;L[j>>3]=L[C+96>>3];L[k>>3]=L[C+104>>3];z=C;B=G[z+116>>2];G[v>>2]=G[z+112>>2];G[v+4>>2]=B;B=G[z+72>>2];K=G[z+76>>2];G[m>>2]=G[z+152>>2];G[r>>2]=G[z+152>>2];G[n>>2]=G[z+80>>2];N=G[z+92>>2];G[s>>2]=G[z+88>>2];G[s+4>>2]=N;Za(l,F-20|0);l=Za(w,F-40|0);if(!(H[l|0]|G[u>>2]!=1)){w=H[68296]|H[68297]<<8;E[l+16|0]=w;E[l+17|0]=w>>>8;w=H[68292]|H[68293]<<8|(H[68294]<<16|H[68295]<<24);z=H[68288]|H[68289]<<8|(H[68290]<<16|H[68291]<<24);E[l+8|0]=z;E[l+9|0]=z>>>8;E[l+10|0]=z>>>16;E[l+11|0]=z>>>24;E[l+12|0]=w;E[l+13|0]=w>>>8;E[l+14|0]=w>>>16;E[l+15|0]=w>>>24;w=H[68284]|H[68285]<<8|(H[68286]<<16|H[68287]<<24);z=H[68280]|H[68281]<<8|(H[68282]<<16|H[68283]<<24);E[l|0]=z;E[l+1|0]=z>>>8;E[l+2|0]=z>>>16;E[l+3|0]=z>>>24;E[l+4|0]=w;E[l+5|0]=w>>>8;E[l+6|0]=w>>>16;E[l+7|0]=w>>>24;w=G[m>>2];E[l+((w|0)<17?w:17)|0]=0}z=G[n>>2];if(i-15>>>0<=3){l=z>>31;if(!(G[u>>2]==1|((l^z)-l|0)!=16)){G[r>>2]=1;if((z|0)<0){l=G[m>>2];G[s>>2]=l;G[s+4>>2]=l>>31}G[m>>2]=1;G[j>>2]=0;G[j+4>>2]=1072693248;G[k>>2]=0;G[k+4>>2]=0;G[v>>2]=1234554321;G[v+4>>2]=0;G[o>>2]=28800;z=G[n>>2]<0?-11:11;G[n>>2]=z}i=i-16|0}j=z>>31;if(((j^z)-j|0)==1){z=M(z,11);G[n>>2]=z;j=G[s+4>>2];k=G[s>>2]+7|0;j=k>>>0<7?j+1|0:j;O=s,P=Bu(k,j,8,0),G[O>>2]=P;G[s+4>>2]=Ia}k=G[u>>2];f:{if((k|0)!=2){break f}if((z|0)!=-16){if((z|0)!=16){break f}j=G[m>>2];if(j){O=s,P=Bu(G[s>>2],G[s+4>>2],j,j>>31),G[O>>2]=P;G[s+4>>2]=Ia;break f}G[s>>2]=0;G[s+4>>2]=0;break f}G[r>>2]=1;G[m>>2]=g}j=(k|0)==1;G[q>>2]=j?0:e-1|0;G[q+4>>2]=j?0:f-!e|0;f=z>>31;if((f^z)-f>>>0>=83){z=(((z|0)<=0?-1:1)+z|0)/2|0;G[n>>2]=z;j=G[s>>2];f=G[s+4>>2]<<1|j>>>31;G[s>>2]=j<<1;G[s+4>>2]=f;G[m>>2]=G[m>>2]/2;G[r>>2]=G[r>>2]/2}g:{h:{i:{f=z>>31;j=(f^z)-f|0;if((j|0)!=16){f=7200;if((j|0)==42){break h}if((j|0)!=82){break i}f=3600;break h}j=G[m>>2];f=28799;if(!j){break h}f=28799/(j|0)|0;G[o>>2]=f;if(f){break g}G[y+324>>2]=28799;G[y+320>>2]=j;a=y+336|0;Ya(a,81,30110,y+320|0);tb(5,a);G[x>>2]=236;a=236;break a}f=28800/G[m>>2]|0}G[o>>2]=f}m=(i|0)==-1?0:i;f=D+K|0;j=A+B|0;f=j>>>0>>0?f+1|0:f;l=Au(G[t>>2],G[t+4>>2],c-1|0,d-!c|0);k=l+j|0;j=Ia+f|0;G[p>>2]=k;G[p+4>>2]=k>>>0>>0?j+1|0:j;o=G[u>>2];if(!(o|!m)){f=h+G[q+4>>2]|0;a=g+G[q>>2]|0;f=a>>>0>>0?f+1|0:f;b=G[s+4>>2];if((b|0)>=(f|0)&J[s>>2]>=a>>>0|(b|0)>(f|0)){break d}G[s>>2]=a;G[s+4>>2]=f;break d}f=G[n>>2];if((f|0)>0){f=G[q+4>>2];l=G[s+4>>2];b=G[q>>2];j=G[s>>2];if((f|0)>=(l|0)&b>>>0>=j>>>0|(f|0)>(l|0)){G[y+228>>2]=j;G[y+224>>2]=b+1;a=y+336|0;Ya(a,81,27330,y+224|0);break b}f=f+h|0;k=b+g|0;f=k>>>0>>0?f+1|0:f;b=k;f=Bu(b-1|0,f-!b|0,j,l)+c|0;b=d+Ia|0;b=c>>>0>f>>>0?b+1|0:b;k=b;j=G[a+4>>2];b=G[j+952>>2];l=G[j+956>>2];j:{k:{if(m){if(!(g|h)|((k|0)<=(l|0)&b>>>0>=f>>>0|(k|0)<(l|0))){break j}if(G[j+48>>2]){c=G[j+988>>2];if(!G[j+984>>2]&(c|0)<=0|(c|0)<0){break k}}c=a;d=b;a=f-b|0;b=k-((b>>>0>f>>>0)+l|0)|0;if((Ig(c,d,l,a,b,x)|0)<=0){break j}L[y+96>>3]=+(a>>>0)+ +(b|0)*4294967296;a=y+336|0;Ya(a,81,44236,y+96|0);tb(5,a);break d}if(!((b>>>0>>0&(k|0)>=(l|0)|(k|0)>(l|0))&(i|0)!=-1)){break j}l:{if(!o){if(b>>>0>>0&(d|0)>=(l|0)|(d|0)>(l|0)){G[y+128>>2]=c;b=y+336|0;Ya(b,81,48884,y+128|0);tb(5,b);G[y+112>>2]=G[G[a+4>>2]+952>>2];Ya(b,81,46003,y+112|0);break l}tb(5,36433);G[y+160>>2]=G[s>>2];a=y+336|0;Ya(a,81,36282,y+160|0);tb(5,a);G[y+148>>2]=e;G[y+144>>2]=g;Ya(a,81,44434,y+144|0);break l}tb(5,38480);a=G[a+4>>2];b=G[a+952>>2];a=G[a+956>>2];L[y+216>>3]=+J[s>>2]+ +G[s+4>>2]*4294967296;L[y+208>>3]=+(b>>>0)+ +(a|0)*4294967296;a=y+336|0;Ya(a,81,36180,y+208|0);tb(5,a);e=G[q+4>>2];b=G[q>>2]+1|0;e=b?e:e+1|0;L[y+192>>3]=+(b>>>0)+ +(e|0)*4294967296;L[y+184>>3]=+(c>>>0)+ +(d|0)*4294967296;L[y+176>>3]=+(g>>>0)+ +(h|0)*4294967296;Ya(a,81,43538,y+176|0)}tb(5,y+336|0);break c}G[j+952>>2]=f;G[j+956>>2]=k;c=G[j+980>>2];a=j;e=G[a+976>>2];d=Au(G[a+960>>2],G[a+964>>2],f-b|0,k-((b>>>0>f>>>0)+l|0)|0);b=e+d|0;j=Ia+c|0;G[a+976>>2]=b;G[a+980>>2]=b>>>0>>0?j+1|0:j}if(!h&g>>>0<2|(G[s>>2]!=1|G[s+4>>2])|(m|0)==2){break d}a=G[t>>2];b=G[t+4>>2];if(a>>>0>2147483647&(b|0)>=0|(b|0)>0){break d}G[r>>2]=a;G[s>>2]=g;G[s+4>>2]=h;break d}G[n>>2]=0-f;m:{n:{if(m){f=h+G[q+4>>2]|0;e=g+G[q>>2]|0;f=e>>>0>>0?f+1|0:f;G[s>>2]=e;G[s+4>>2]=f;o:{e=G[a+4>>2];f=c>>>0>J[e+952>>2];e=G[e+956>>2];if(f&(d|0)>=(e|0)|(d|0)>(e|0)){break o}Le(a,b,c,d,y+424|0,y+432|0,y+444|0);if(G[y+444>>2]){break o}g=G[C+80>>2];p:{q:{if((g|0)<=-83){e=G[y+424>>2];j=G[y+428>>2]<<1|e>>>31;e=e<<1;f=j;break q}e=G[y+424>>2];f=G[y+428>>2];if((g|0)!=-1){break p}e=e+7|0;f=e>>>0<7?f+1|0:f;e=Bu(e,f,8,0);f=Ia}G[y+424>>2]=e;G[y+428>>2]=f}h=J[s>>2]>e>>>0;e=G[s+4>>2];if(h&(e|0)>=(f|0)|(e|0)>(f|0)){break o}e=G[a+4>>2];f=G[e+976>>2];h=G[e+980>>2];j=f;k=G[y+436>>2];e=D+k|0;i=G[y+432>>2];f=A+i|0;e=f>>>0>>0?e+1|0:e;l=f;f=j+f|0;j=e+h|0;G[p>>2]=f;G[p+4>>2]=f>>>0>>0?j+1|0:j;e=a;f=b;a=G[s>>2];b=G[s+4>>2];j=Bu(a,b,2,0);h=a;a=(g|0)<-82;ph(e,f,c,d,a?j:h,a?Ia:b,i,k,x);break d}z=G[a+4>>2];f=z;e=G[f+952>>2];f=G[f+956>>2];if(e>>>0>>0&(f|0)<=(d|0)|(d|0)>(f|0)){h=e;g=c-e|0;e=d-((c>>>0>>0)+f|0)|0;if((Ig(a,h,f,g,e,x)|0)>0){break n}z=G[a+4>>2]}f=G[z+988>>2];j=D+G[z+980>>2]|0;e=A+G[z+976>>2]|0;j=e>>>0>>0?j+1|0:j;g=e;e=e+G[z+984>>2]|0;f=f+j|0;G[p>>2]=e;G[p+4>>2]=e>>>0>>0?f+1|0:f;e=b;f=c;b=G[s>>2];c=G[s+4>>2];h=Bu(b,c,2,0);g=b;b=G[C+80>>2]<-82;ph(a,e,f,d,b?h:g,b?Ia:c,G[z+984>>2],G[z+988>>2],x);z=G[a+4>>2];r:{if(G[z+48>>2]){break r}c=G[z+988>>2];f=D+G[z+980>>2]|0;b=A+G[z+976>>2]|0;f=b>>>0>>0?f+1|0:f;d=b;b=b+G[z+984>>2]|0;f=c+f|0;f=b>>>0>>0?f+1|0:f;d=b;b=G[r>>2];c=Au(G[s>>2],G[s+4>>2],b,b>>31);b=d+c|0;j=Ia+f|0;j=b>>>0>>0?j+1|0:j;c=G[z+96>>2]+(G[z+76>>2]<<3)|0;d=G[c+8>>2];c=G[c+12>>2];if(b>>>0<=d>>>0&(c|0)>=(j|0)|(c|0)>(j|0)){break r}f=(c^-1)+j|0;d=d^-1;b=d+b|0;b=Bu(b,b>>>0>>0?f+1|0:f,2880,0)+1|0;if((Bf(a,b,1,x)|0)>0){break m}z=G[a+4>>2]}b=G[z+988>>2];d=G[z+984>>2];a=G[r>>2];c=Au(G[s>>2],G[s+4>>2],a,a>>31);a=d+c|0;e=Ia+b|0;G[z+984>>2]=a;G[z+988>>2]=a>>>0>>0?e+1|0:e;break d}f=G[a+4>>2];g=J[f+952>>2]>>0;f=G[f+956>>2];if(g&(f|0)<=(d|0)|(d|0)>(f|0)){tb(5,23343);a=G[a+4>>2];b=G[a+952>>2];a=G[a+956>>2];L[y+280>>3]=+(c>>>0)+ +(d|0)*4294967296;L[y+272>>3]=+(b>>>0)+ +(a|0)*4294967296;a=y+336|0;Ya(a,81,43488,y+272|0);tb(5,a);break c}Le(a,b,c,d,y+424|0,y+432|0,x);d=G[y+428>>2];c=G[y+424>>2];G[s>>2]=c;G[s+4>>2]=d;b=G[C+80>>2];s:{if((b|0)<=-83){b=c;f=d<<1|b>>>31;c=b<<1;d=f}else{if((b|0)!=-1){break s}b=d;c=c+7|0;b=c>>>0<7?b+1|0:b;c=Bu(c,b,8,0);d=Ia}G[s>>2]=c;G[s+4>>2]=d}b=G[q+4>>2];if((b|0)>=(d|0)&J[q>>2]>=c>>>0|(b|0)>(d|0)){G[y+304>>2]=e;a=y+336|0;Ya(a,81,27528,y+304|0);tb(5,a);G[y+288>>2]=G[s>>2];Ya(a,81,5563,y+288|0);break b}a=G[a+4>>2];b=G[a+976>>2];c=G[a+980>>2];f=D+G[y+436>>2]|0;a=A+G[y+432>>2]|0;f=a>>>0>>0?f+1|0:f;d=b;b=a;a=d+a|0;j=c+f|0;G[p>>2]=a;G[p+4>>2]=a>>>0>>0?j+1|0:j;break d}L[y+240>>3]=+(g>>>0)+ +(e|0)*4294967296;a=y+336|0;Ya(a,81,44236,y+240|0);tb(5,a);break d}G[y+256>>2]=b;a=y+336|0;Ya(a,81,42616,y+256|0);tb(5,a)}a=G[x>>2];break a}G[x>>2]=307;a=307;break a}tb(5,a);G[x>>2]=308;a=308}Fa=y+448|0;return a}function pe(a,b,c,d,e,f,g,h,i,j){var 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;l=Fa-29104|0;Fa=l;k=G[j>>2];a:{if((k|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,17,l+29032|0,l+29024|0,l+28992|0,l+29088|0,l+29100|0,l+29096|0,l+29064|0,l+29056|0,l+29084|0,l+29072|0,l+29048|0,l+29092|0,l+29040|0,l+28832|0,j)|0)>0){break c}c=G[l+29096>>2];d=c>>31;k=G[l+29100>>2];if((k|0)==16){Ne(l+28992|0,l+28960|0);k=G[l+29100>>2]}if(!(g|h)){k=G[j>>2];break b}e=g>>>0<2147483647&(h|0)<=0|(h|0)<0;f=c;v=L[l+29032>>3]==1&L[l+29024>>3]==0&(k|0)==11;c=v;w=c?e?g:2147483647:f;x=c?e?h:0:d;e=0;f=0;while(1){n=G[l+29072>>2];q=G[l+29076>>2];c=G[l+29068>>2];d=G[l+29064>>2];m=Au(G[l+29048>>2],G[l+29052>>2],y,z);d=d+m|0;c=Ia+c|0;c=d>>>0>>0?c+1|0:c;k=d;m=G[l+29056>>2];p=G[l+29060>>2];d=G[l+29084>>2];s=Au(m,p,d,d>>31);k=k+s|0;d=Ia+c|0;Jb(a,k,k>>>0>>0?d+1|0:d,1,j);d=g>>>0>>0&(h|0)<=(x|0)|(h|0)<(x|0)?g:w;c=d>>31;k=d;d=q-((m>>>0>n>>>0)+p|0)|0;n=n-m|0;m=n;n=k>>>0>>0&(c|0)<=(d|0)|(c|0)<(d|0);m=n?k:m;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{d=G[l+29100>>2];switch(d-11|0){case 10:break g;case 30:break h;case 31:break i;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break l;case 5:break m;case 0:break n;default:break o}}switch(d-81|0){case 1:break j;case 0:break f;default:break l}}if(v){we(a,m,G[l+29084>>2],e+i|0,j);break d}n=e+i|0;r=L[l+29032>>3];t=L[l+29024>>3];if(!(r==1&t==0)){k=0;if((m|0)<=0){break e}while(1){d=(l+32|0)+k|0;p:{q:{o=(+H[k+n|0]-t)/r;if(o<-.49){G[j>>2]=-11;break q}if(o>255.49){G[j>>2]=-11;c=255;break p}o=o+.5;if(!(o<4294967296&o>=0)){break q}c=~~o>>>0;break p}c=0}E[d|0]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break e}bb(l+32|0,n,m);break e}if(jb(l+28992|0,65)){n=G[l+29084>>2];d=G[l+29088>>2];if((n|0)!=(d|0)){break k}n=m>>31;Wb(a,m,n,e+i|0,j);break d}if(H[l+28961|0]==115){break l}p=e+i|0;s=l+28960|0;c=G[l+29088>>2];n=l+32|0;k=0;q=Fa-32|0;Fa=q;o=L[l+29032>>3];r=L[l+29024>>3];r:{if(!(o==1&r==0)){if((m|0)<=0){break r}d=n;while(1){L[q+16>>3]=(+H[k+p|0]-r)/o;Eb(d,s,q+16|0);d=c+d|0;if(H[d|0]){G[j>>2]=-11}k=k+1|0;if((m|0)!=(k|0)){continue}break}break r}if((m|0)<=0){break r}d=n;while(1){L[q>>3]=H[k+p|0];Eb(d,s,q);d=c+d|0;if(H[d|0]){G[j>>2]=-11}k=k+1|0;if((m|0)!=(k|0)){continue}break}}k=jb(n,44);if(k){while(1){E[k|0]=46;k=jb(k,44);if(k){continue}break}}Fa=q+32|0;d=G[l+29084>>2];n=G[l+29088>>2];if((d|0)==(n|0)){d=M(d,m);Wb(a,d,d>>31,l+32|0,j);break d}wd(a,n,m,d-n|0,l+32|0,j);break d}G[l>>2]=b;G[l+4>>2]=l+28992;a=l+28864|0;Ya(a,81,8813,l);Ua(a);if(G[l+29092>>2]==1){k=311;G[j>>2]=311;break a}k=312;G[j>>2]=312;break a}wd(a,d,(m|0)/(d|0)|0,n-d|0,e+i|0,j);break d}q=e+i|0;o=L[l+29032>>3];r=L[l+29024>>3];s:{if(!(o==1&r==0)){if((m|0)<=0){break s}k=0;if((m|0)!=1){n=m&-2;d=0;while(1){p=l+32|0;L[p+(k<<3)>>3]=(+H[k+q|0]-r)/o;c=p;p=k|1;L[c+(p<<3)>>3]=(+H[q+p|0]-r)/o;k=k+2|0;d=d+2|0;if((n|0)!=(d|0)){continue}break}}if(!(m&1)){break s}L[(l+32|0)+(k<<3)>>3]=(+H[k+q|0]-r)/o;break s}if((m|0)<=0){break s}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;L[p+(k<<3)>>3]=H[k+q|0];c=k|1;L[p+(c<<3)>>3]=H[c+q|0];c=k|2;L[p+(c<<3)>>3]=H[c+q|0];c=k|3;L[p+(c<<3)>>3]=H[c+q|0];k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break s}while(1){L[(l+32|0)+(k<<3)>>3]=H[k+q|0];k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}q=e+i|0;o=L[l+29032>>3];r=L[l+29024>>3];t:{if(!(o==1&r==0)){if((m|0)<=0){break t}k=0;if((m|0)!=1){n=m&-2;d=0;while(1){p=l+32|0;K[p+(k<<2)>>2]=(+H[k+q|0]-r)/o;c=p;p=k|1;K[c+(p<<2)>>2]=(+H[q+p|0]-r)/o;k=k+2|0;d=d+2|0;if((n|0)!=(d|0)){continue}break}}if(!(m&1)){break t}K[(l+32|0)+(k<<2)>>2]=(+H[k+q|0]-r)/o;break t}if((m|0)<=0){break t}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;K[p+(k<<2)>>2]=H[k+q|0];c=k|1;K[p+(c<<2)>>2]=H[c+q|0];c=k|2;K[p+(c<<2)>>2]=H[c+q|0];c=k|3;K[p+(c<<2)>>2]=H[c+q|0];k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break t}while(1){K[(l+32|0)+(k<<2)>>2]=H[k+q|0];k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}q=e+i|0;r=L[l+29032>>3];t=L[l+29024>>3];u:{if(!(r==1&t==0)){k=0;if((m|0)<=0){break u}while(1){d=(l+32|0)+(k<<2)|0;v:{w:{o=(+H[k+q|0]-t)/r;if(o<-2147483648.49){G[j>>2]=-11;break w}if(o>2147483647.49){G[j>>2]=-11;c=2147483647;break v}if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break w}c=~~o;break v}o=o+-.5;if(!(O(o)<2147483648)){break w}c=~~o;break v}c=-2147483648}G[d>>2]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break u}if((m|0)<=0){break u}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;G[p+(k<<2)>>2]=H[k+q|0];c=k|1;G[p+(c<<2)>>2]=H[c+q|0];c=k|2;G[p+(c<<2)>>2]=H[c+q|0];c=k|3;G[p+(c<<2)>>2]=H[c+q|0];k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break u}while(1){G[(l+32|0)+(k<<2)>>2]=H[k+q|0];k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}$c(a,m,G[l+29084>>2],l+32|0,j);break d}q=e+i|0;r=L[l+29032>>3];t=L[l+29024>>3];x:{if(!(r==1&t==0)){k=0;if((m|0)<=0){break x}while(1){d=(l+32|0)+(k<<1)|0;o=(+H[k+q|0]-t)/r;y:{if(o<-32768.49){G[j>>2]=-11;c=32768;break y}if(o>32767.49){G[j>>2]=-11;c=32767;break y}z:{if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break z}c=~~o;break y}o=o+-.5;if(!(O(o)<2147483648)){break z}c=~~o;break y}c=-2147483648}F[d>>1]=c;k=k+1|0;if((m|0)!=(k|0)){continue}break}break x}if((m|0)<=0){break x}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;F[p+(k<<1)>>1]=H[k+q|0];c=k|1;F[p+(c<<1)>>1]=H[c+q|0];c=k|2;F[p+(c<<1)>>1]=H[c+q|0];c=k|3;F[p+(c<<1)>>1]=H[c+q|0];k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break x}while(1){F[(l+32|0)+(k<<1)>>1]=H[k+q|0];k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}Oe(a,m,G[l+29084>>2],l+32|0,j);break d}q=e+i|0;t=L[l+29032>>3];d=t!=1;r=L[l+29024>>3];A:{if(!(d|r!=0x8000000000000000)){if((m|0)<=0){break A}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;c=p+(k<<3)|0;G[c>>2]=H[k+q|0];G[c+4>>2]=-2147483648;c=k|1;u=p+(c<<3)|0;G[u>>2]=H[c+q|0];G[u+4>>2]=-2147483648;c=k|2;u=p+(c<<3)|0;G[u>>2]=H[c+q|0];G[u+4>>2]=-2147483648;c=k|3;p=p+(c<<3)|0;G[p>>2]=H[c+q|0];G[p+4>>2]=-2147483648;k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break A}while(1){p=(l+32|0)+(k<<3)|0;G[p>>2]=H[k+q|0];G[p+4>>2]=-2147483648;k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}break A}if(!(!d&r==0)){k=0;if((m|0)<=0){break A}while(1){p=(l+32|0)+(k<<3)|0;B:{C:{o=(+H[k+q|0]-r)/t;if(o<-0x8000000000000000){G[j>>2]=-11;break C}if(o>0x8000000000000000){G[j>>2]=-11;n=2147483647;c=-1;break B}if(o>=0){o=o+.5;if(!(O(o)<0x8000000000000000)){break C}n=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~o>>>0;break B}o=o+-.5;if(!(O(o)<0x8000000000000000)){break C}n=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;c=~~o>>>0;break B}n=-2147483648;c=0}G[p>>2]=c;G[p+4>>2]=n;k=k+1|0;if((m|0)!=(k|0)){continue}break}break A}if((m|0)<=0){break A}d=0;k=0;if(m-1>>>0>=3){s=m&-4;n=0;while(1){p=l+32|0;c=p+(k<<3)|0;G[c>>2]=H[k+q|0];G[c+4>>2]=0;c=k|1;u=p+(c<<3)|0;G[u>>2]=H[c+q|0];G[u+4>>2]=0;c=k|2;u=p+(c<<3)|0;G[u>>2]=H[c+q|0];G[u+4>>2]=0;c=k|3;p=p+(c<<3)|0;G[p>>2]=H[c+q|0];G[p+4>>2]=0;k=k+4|0;n=n+4|0;if((s|0)!=(n|0)){continue}break}}n=m&3;if(!n){break A}while(1){p=(l+32|0)+(k<<3)|0;G[p>>2]=H[k+q|0];G[p+4>>2]=0;k=k+1|0;d=d+1|0;if((n|0)!=(d|0)){continue}break}}_c(a,m,G[l+29084>>2],l+32|0,j);break d}we(a,m,G[l+29084>>2],l+32|0,j)}k=G[j>>2];if((k|0)>0){d=f;a=e+1|0;d=a?d:d+1|0;L[l+16>>3]=+(a>>>0)+ +(d|0)*4294967296;d=m>>31;a=m+e|0;d=d+f|0;L[l+24>>3]=+(a>>>0)+ +((a>>>0>>0?d+1|0:d)|0)*4294967296;a=l+28864|0;Ya(a,81,48062,l+16|0);Ua(a);break c}c=m;d=m>>31;n=d;h=h-(d+(m>>>0>g>>>0)|0)|0;g=g-m|0;if(!(h|g)){break b}d=f+n|0;m=c+e|0;d=m>>>0>>0?d+1|0:d;e=m;f=d;d=n+G[l+29060>>2]|0;m=c+G[l+29056>>2]|0;d=m>>>0>>0?d+1|0:d;G[l+29056>>2]=m;G[l+29060>>2]=d;if(G[l+29072>>2]!=(m|0)|G[l+29076>>2]!=(d|0)){continue}G[l+29056>>2]=0;G[l+29060>>2]=0;c=z;d=y+1|0;c=d?c:c+1|0;y=d;z=c;continue}}k=G[j>>2];break a}if((k|0)!=-11){break a}Ua(44927);k=412;G[j>>2]=412}Fa=l+29104|0;return k} -function Qq(a,b){a=a|0;b=b|0;var 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;e=Fa-1824|0;Fa=e;G[935247]=0;G[935248]=0;G[935249]=0;G[935250]=0;G[935251]=0;G[935252]=0;G[935253]=0;G[935254]=0;E[e+1568|0]=0;E[3741020]=0;G[935256]=0;G[935257]=0;G[935258]=0;G[935259]=0;E[e+1312|0]=0;G[935260]=0;m=G[29763];G[321435]=m;G[47589]=1;G[935261]=1;G[935262]=0;o=3741052,p=ab(16512),G[o>>2]=p;j=32;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:while(1){m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{c=of(a,b,2788);switch(c-67|0){case 49:break m;case 35:break n;case 48:break o;case 33:break p;case 31:break q;case 55:break r;case 30:break s;case 0:break t;case 32:break u;case 47:break v;case 38:break w;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 34:case 36:case 37:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 50:case 51:case 52:case 53:case 54:break f;default:break k}}G[935249]=1;continue}G[935257]=1;continue}G[935259]=1;continue}G[935261]=0;continue}G[935258]=1;continue}G[935260]=1;continue}G[935256]=1;continue}E[3741020]=1;continue}c=ac(G[321433],49010);G[321435]=c;if(c){continue}G[e+112>>2]=G[321433];kb(80991,e+112|0);break a}c=ac(G[321433],13287);G[935264]=c;if(!c){break j}if(!vc(e+288|0,1024,c)){continue}while(1){x:{y:{h=Va(e+288|0);c=h+e|0;switch(H[c+287|0]-10|0){case 0:case 3:break y;default:break x}}E[c+287|0]=0;continue}g=e+288|0;i=h+g|0;z:{if((h|0)<=0){break z}while(1){c=H[g|0];if((c|0)!=32&(c|0)!=9){break z}g=g+1|0;if(i>>>0>g>>>0){continue}break}}if((g|0)==(i|0)){continue l}A:{if(g>>>0>=i>>>0){c=g;break A}d=(e+288|0)+g+(h-g)|0;c=g;while(1){f=H[c|0];if((f|0)==9|(f|0)==32){break A}c=c+1|0;if((d|0)!=(c|0)){continue}break}c=d}E[c|0]=0;f=c+1|0;B:{if(i>>>0<=f>>>0){break B}c=(e+288|0)+c+(h-c)|0;while(1){d=H[f|0];if((d|0)!=32&(d|0)!=9){break B}f=f+1|0;if((c|0)!=(f|0)){continue}break}f=c}d=f;C:{if(i>>>0<=d>>>0){break C}c=(e+288|0)+f+(h-f)|0;while(1){k=H[d|0];if((k|0)==9|(k|0)==32){break C}d=d+1|0;if((c|0)!=(d|0)){continue}break}d=c}E[d|0]=0;c=d+1|0;D:{if(i>>>0<=c>>>0){break D}d=(e+288|0)+d+(h-d)|0;while(1){k=H[c|0];if((k|0)!=32&(k|0)!=9){break D}c=c+1|0;if((d|0)!=(c|0)){continue}break}c=d}d=c;E:{if(c>>>0>=i>>>0){break E}h=(e+288|0)+c+(h-c)|0;while(1){i=H[d|0];if((i|0)==9|(i|0)==32){break E}d=d+1|0;if((h|0)!=(d|0)){continue}break}d=h}E[d|0]=0;Za(G[935263]+M(G[935262],516)|0,g);Za((G[935263]+M(G[935262],516)|0)+128|0,f);h=G[935263];o=h+M(G[935262],516)|0,p=_b(c),G[o+512>>2]=p;d=G[935262];i=h+M(d,516)|0;k=Va(i);if(k>>>0>J[i+512>>2]){G[i+512>>2]=k;d=G[935262]}h=h+M(d,516)|0;if(!H[h|0]){break i}if(!H[h+128|0]){break h}E[h+256|0]=0;E[(G[935263]+M(G[935262],516)|0)+384|0]=0;if(H[3741020]){G[e+180>>2]=g;G[e+184>>2]=f;G[e+188>>2]=c;G[e+176>>2]=G[935262];kb(76089,e+176|0);$a(m)}c=G[935262]+1|0;G[935262]=c;if((c|0)>=(j|0)){j=j+32|0;o=3741052,p=ub(G[935263],M(j,516)),G[o>>2]=p}if(vc(e+288|0,1024,G[935264])){continue}break}continue}if((Rh(G[321433])|0)<=0){break g}n=1;l=Pb(21447);if((l|0)>=0){continue}l=Pb(22604);if((l|0)>=0){continue}break}hb(82832,65,1,G[321435]);break a}if((c|0)!=-1){break f}c=a;a=G[47589];if((c-a|0)<=1){break e}a=(a<<2)+b|0;b=Za(e+1568|0,G[a>>2]);h=Za(e+1312|0,G[a+4>>2]);a=Va(b);F:{if(a>>>0<2){break F}a=(a+b|0)-1|0;if(H[a|0]!=47){break F}E[a|0]=0}if(!(!G[935261]|G[47608]<=0)){a=G[935262];f=G[935263];g=0;while(1){c=M(a,516)+f|0;a=g<<5;Za(c,a+190448|0);Za((G[935263]+M(G[935262],516)|0)+128|0,a+190736|0);f=G[935263];G[(f+M(G[935262],516)|0)+512>>2]=G[(g<<2)+156848>>2];a=G[935262]+1|0;G[935262]=a;if((a|0)>=(j|0)){j=j+32|0;f=ub(f,M(j,516));G[935263]=f;a=G[935262]}g=g+1|0;if((g|0)>2]&61440)!=16384){break c}G[935265]=0;g=0;G:{if(H[b|0]==47){break G}a=Va(b);G[935265]=a;if(!a){break G}if(H[(a+b|0)-1|0]==47){g=a;break G}g=a+1|0;G[935265]=g}if(H[3741020]){G[e+80>>2]=b;G[e+84>>2]=g;_a(G[321435],87830,e+80|0);$a(m)}a=ac(h,49010);G[935266]=a;if(!a){break b}H:{if(n){a=Fa-600160|0;Fa=a;if((nf()|0)>=0){i=a+500157|0;g=G[29763];while(1){c=Za(a+160|0,G[925783]>(l|0)?G[(G[925773]+M(l,4108)|0)+4096>>2]:0);if(H[3741020]){G[a+64>>2]=c;kb(76135,a- -64|0);$a(g)}G[a+52>>2]=c;G[a+48>>2]=b;db(a+500160|0,8778,a+48|0);Za(3741076,c);if(H[3741020]){G[a+36>>2]=3741076;G[a+32>>2]=a+500160;kb(76239,a+32|0);$a(g)}I:{if(Be(a+500160|0,a+72|0)){break I}c=Va(a+500160|0);if(H[3741020]){G[a+16>>2]=a+500160;kb(77122,a+16|0);$a(g)}if(G[935260]){if(!fb(c+i|0,2750,3)){break I}}if(!G[935258]){d=c+(a+500160|0)|0;f=d-9|0;if(!fb(f,4996,9)){break I}if(!fb(f,33375,9)){break I}f=d-10|0;if(!fb(f,5641,10)){break I}if(!fb(f,33593,10)){break I}f=d-12|0;if(!fb(f,2685,12)){break I}if(!fb(f,2722,12)){break I}d=d-13|0;if(!fb(d,2698,13)){break I}if(!fb(d,2735,13)){break I}}c=c+(a+500160|0)|0;d=c-4|0;J:{if(!fb(d,5001,4)){break J}if(!fb(d,33380,4)){break J}d=c-5|0;if(!fb(d,5646,5)){break J}if(!fb(d,33598,5)){break J}d=c-7|0;if(!fb(d,2754,7)){break J}if(!fb(d,2771,7)){break J}if(!fb(d,2690,7)){break J}if(!fb(d,2727,7)){break J}d=c-8|0;if(!fb(d,2762,8)){break J}if(!fb(d,2779,8)){break J}if(!fb(d,2703,8)){break J}if(fb(d,2740,8)){break I}}E[a+400160|0]=0;K:{d=c-7|0;L:{if(!fb(d,2690,7)){break L}if(!fb(d,2727,7)){break L}c=c-8|0;if(!fb(c,2703,8)){break L}if(fb(c,2740,8)){break K}}c=H[32853]|H[32854]<<8|(H[32855]<<16|H[32856]<<24);d=H[32849]|H[32850]<<8|(H[32851]<<16|H[32852]<<24);F[a+100166>>1]=d;F[a+100168>>1]=d>>>16;F[a+100170>>1]=c;F[a+100172>>1]=c>>>16;c=H[32847]|H[32848]<<8|(H[32849]<<16|H[32850]<<24);G[a+100160>>2]=H[32843]|H[32844]<<8|(H[32845]<<16|H[32846]<<24);G[a+100164>>2]=c;d=Za(a+300160|0,kj(a+100160|0));c=Va(d)+d|0;f=H[5646]|H[5647]<<8|(H[5648]<<16|H[5649]<<24);E[c|0]=f;E[c+1|0]=f>>>8;E[c+2|0]=f>>>16;E[c+3|0]=f>>>24;f=H[5650]|H[5651]<<8;E[c+4|0]=f;E[c+5|0]=f>>>8;G[a+4>>2]=d;G[a>>2]=a+500160;c=a+200160|0;db(c,9290,a);ka(c|0)|0;c=Mh(d,3741072,a+400160|0);if(c){G[935248]=c+G[935248]}Vg(d);break I}c=Mh(a+500160|0,3741072,a+400160|0);if(!c){break I}G[935248]=c+G[935248]}if((nf()|0)>=0){continue}break}}Fa=a+600160|0;break H}Zl(b)}Hb(G[935266]);b=0;a=Fa-100256|0;Fa=a;c=H[32839]|H[32840]<<8|(H[32841]<<16|H[32842]<<24);d=H[32835]|H[32836]<<8|(H[32837]<<16|H[32838]<<24);E[a+7|0]=d;E[a+8|0]=d>>>8;E[a+9|0]=d>>>16;E[a+10|0]=d>>>24;E[a+11|0]=c;E[a+12|0]=c>>>8;E[a+13|0]=c>>>16;E[a+14|0]=c>>>24;c=H[32832]|H[32833]<<8|(H[32834]<<16|H[32835]<<24);G[a>>2]=H[32828]|H[32829]<<8|(H[32830]<<16|H[32831]<<24);G[a+4>>2]=c;c=Za(a+128|0,kj(a));M:{d=ac(h,13287);if(d){N:{O:{g=ac(c,49010);if(g){if(vc(a+256|0,1e5,d)){break O}break N}hb(84217,56,1,G[321435]);break a}while(1){E[a+100255|0]=0;f=a+256|0;i=Va(f);fe(f,g);i=i-1|0;b=(b|0)<(i|0)?i:b;if(vc(f,1e5,d)){continue}break}}Hb(d);Hb(g);d=ac(c,13287);if(!d){hb(84159,57,1,G[321435])}g=ac(h,49010);if(g){if(vc(a+256|0,1e5,d)){f=(a+256|0)+b|0;while(1){b=Va(a+256|0)+a|0;if(H[b+255|0]==10){E[b+255|0]=0}P:{if(H[a+256|0]==92){b=a+256|0;b=Va(b)+b|0;E[b|0]=10;E[b+1|0]=0;break P}b=Va(a+256|0);if((b|0)<=99999){cb(b+(a+256|0)|0,32,1e5-b|0)}E[f|0]=0;b=a+256|0;b=Va(b)+b|0;if(H[a+256|0]==124){E[b+2|0]=H[68369];h=H[68367]|H[68368]<<8;E[b|0]=h;E[b+1|0]=h>>>8;break P}E[b+2|0]=H[90053];h=H[90051]|H[90052]<<8;E[b|0]=h;E[b+1|0]=h>>>8}b=a+256|0;fe(b,g);if(vc(b,1e5,d)){continue}break}}Hb(g);Hb(d);Vg(c);Fa=a+100256|0;break M}hb(84105,53,1,G[321435]);break a}hb(83997,52,1,G[321435]);break a}G[e- -64>>2]=G[935246];G[e+48>>2]=G[935247];G[e+52>>2]=G[935250];G[e+56>>2]=G[935252];G[e+60>>2]=G[935251];_a(G[321435],79126,e+48|0);$a(G[321435]);Hb(G[321435]);sc(0);W()}G[e+128>>2]=G[321433];kb(80929,e+128|0);break a}G[e+144>>2]=d;_a(G[321435],84616,e+144|0);break a}G[e+160>>2]=d;_a(G[321435],84557,e+160|0);break a}G[e+192>>2]=G[321433];kb(80867,e+192|0);break a}G[e>>2]=c;_a(G[321435],83072,e);break a}G[e+16>>2]=G[b>>2];_a(G[321435],82507,e+16|0);break a}G[e+32>>2]=b;_a(G[321435],80593,e+32|0);break a}G[e+96>>2]=b;_a(G[321435],79410,e+96|0);break a}hb(84050,54,1,G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Xp(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;ma=1;j=Fa-400|0;Fa=j;a:{if(b-10>>>0<=4294967286){G[j>>2]=b;a=j+32|0;Ya(a,81,23817,j);Ua(a);G[i>>2]=320;break a}if(Nb(a,i)){if((b|0)!=1){c=b&-2;while(1){k=u<<3;n=j+32|0;o=k+n|0;p=u<<2;r=G[p+d>>2];G[o>>2]=r;G[o+4>>2]=r>>31;o=k;k=j+128|0;o=o+k|0;p=G[e+p>>2];G[o>>2]=p;G[o+4>>2]=p>>31;s=n;n=u|1;o=n<<3;p=s+o|0;n=n<<2;r=G[n+d>>2];G[p>>2]=r;G[p+4>>2]=r>>31;k=k+o|0;n=G[e+n>>2];G[k>>2]=n;G[k+4>>2]=n>>31;u=u+2|0;q=q+2|0;if((c|0)!=(q|0)){continue}break}}if(b&1){b=u<<3;c=b+(j+32|0)|0;k=d;d=u<<2;k=G[k+d>>2];G[c>>2]=k;G[c+4>>2]=k>>31;b=b+(j+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}G[j+352>>2]=0;G[j+356>>2]=0;md(a,81,j+32|0,j+128|0,f,1,j+352|0,g,0,h,i);break a}if((Dc(a,j+124|0,i)|0)>0){break a}w=G[j+124>>2];b:{if(!w){r=1;ma=2;p=1;o=1;break b}k=b<<2;r=G[k+f>>2];p=G[e+k>>2];o=G[d+k>>2]}if(h){G[h>>2]=0}G[j+352>>2]=1;G[j+356>>2]=1;k=1;G[j+128>>2]=1;G[j+132>>2]=0;G[j+304>>2]=1;G[j+308>>2]=1;G[j+256>>2]=1;G[j+260>>2]=1;G[j+136>>2]=1;G[j+140>>2]=0;G[j+208>>2]=1;G[j+212>>2]=1;G[j+360>>2]=1;G[j+144>>2]=1;G[j+148>>2]=0;G[j+312>>2]=1;G[j+316>>2]=1;G[j+264>>2]=1;G[j+268>>2]=1;G[j+152>>2]=1;G[j+156>>2]=0;G[j+216>>2]=1;G[j+220>>2]=1;G[j+364>>2]=1;G[j+368>>2]=1;G[j+320>>2]=1;G[j+272>>2]=1;G[j+160>>2]=1;G[j+164>>2]=0;G[j+224>>2]=1;G[j+372>>2]=1;G[j+376>>2]=1;G[j+168>>2]=1;G[j+172>>2]=0;G[j+324>>2]=1;G[j+328>>2]=1;G[j+276>>2]=1;G[j+280>>2]=1;G[j+176>>2]=1;G[j+180>>2]=0;G[j+228>>2]=1;G[j+232>>2]=1;G[j+184>>2]=1;G[j+188>>2]=0;G[j+380>>2]=1;G[j+384>>2]=1;G[j+332>>2]=1;G[j+336>>2]=1;G[j+284>>2]=1;G[j+288>>2]=1;G[j+192>>2]=1;G[j+196>>2]=0;G[j+236>>2]=1;G[j+240>>2]=1;c:{while(1){m=q<<2;t=G[m+e>>2];s=G[d+m>>2];d:{if((t|0)>=(s|0)){v=G[m+(j+208|0)>>2];break d}if(w){break c}G[m+(j+208|0)>>2]=-1;v=-1}G[m+(j+304|0)>>2]=t;G[m+(j+352|0)>>2]=s;G[m+(j+256|0)>>2]=G[f+m>>2];x=j+128|0;t=q+1|0;s=x+(t<<3)|0;m=G[c+m>>2];m=Au(k,n,m,m>>31);G[s>>2]=m;O=s;s=Ia;G[O+4>>2]=s;q=x+(q<<3)|0;Cb=q,Db=Au(k,n,v,v>>31),G[Cb>>2]=Db;G[q+4>>2]=Ia;k=m;n=s;q=t;if((q|0)!=(b|0)){continue}break}d=(j+128|0)+(b<<3)|0;e=G[d>>2];k=e;e=G[(j+208|0)+(b<<2)>>2];Cb=d,Db=Au(k,G[d+4>>2],e,e>>31),G[Cb>>2]=Db;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){u=(p-o|0)/(r|0)|0;p=o;e=r;break e}b=G[j+208>>2];e=M(b,G[j+256>>2]);u=(M(b,G[j+304>>2]-G[j+352>>2]|0)|0)/G[f>>2]|0}if((p|0)<(o|0)){break a}E=G[j+240>>2];na=M(E,G[j+384>>2]);b=M(E,G[j+336>>2]);if((na|0)>(b|0)){break a}x=G[j+236>>2];oa=M(x,G[j+380>>2]);c=M(x,G[j+332>>2]);if((oa|0)>(c|0)){break a}y=G[j+232>>2];P=M(y,G[j+376>>2]);d=M(y,G[j+328>>2]);if((P|0)>(d|0)){break a}z=G[j+228>>2];Q=M(z,G[j+372>>2]);f=M(z,G[j+324>>2]);if((Q|0)>(f|0)){break a}A=G[j+224>>2];R=M(A,G[j+368>>2]);k=M(A,G[j+320>>2]);if((R|0)>(k|0)){break a}B=G[j+220>>2];S=M(B,G[j+364>>2]);n=M(B,G[j+316>>2]);if((S|0)>(n|0)){break a}C=G[j+216>>2];T=M(C,G[j+360>>2]);q=M(C,G[j+312>>2]);if((T|0)>(q|0)){break a}D=G[j+212>>2];U=M(D,G[j+356>>2]);t=M(D,G[j+308>>2]);if((U|0)>(t|0)){break a}F=u+1|0;wa=F>>31;tb=G[j+192>>2];ub=G[j+196>>2];xa=G[j+184>>2];ya=G[j+188>>2];za=G[j+176>>2];Aa=G[j+180>>2];Ba=G[j+168>>2];Ca=G[j+172>>2];Da=G[j+160>>2];Ea=G[j+164>>2];Ga=G[j+152>>2];Ha=G[j+156>>2];Ja=G[j+144>>2];Ka=G[j+148>>2];La=G[j+136>>2];Ma=G[j+140>>2];m=G[j+352>>2];V=m;Na=m>>31;vb=p;Oa=p>>31;Pa=r;wb=r>>31;W=o;X=o>>31;xb=b;Qa=b>>31;yb=E>>31;zb=na>>31;Ra=c;Y=c>>31;Sa=x>>31;Ab=oa>>31;Ta=d;Z=d>>31;Va=y>>31;Wa=P>>31;Xa=f;_=f>>31;Za=z>>31;_a=Q>>31;$a=k;$=k>>31;ab=A>>31;bb=R>>31;cb=n;aa=n>>31;db=B>>31;eb=S>>31;fb=q;ba=q>>31;gb=C>>31;hb=T>>31;ib=t;ca=t>>31;jb=D>>31;O=U>>31;b=G[j+288>>2];kb=b;Bb=b>>31;b=G[j+284>>2];da=b;lb=b>>31;b=G[j+280>>2];ea=b;mb=b>>31;b=G[j+276>>2];fa=b;nb=b>>31;b=G[j+272>>2];ga=b;ob=b>>31;b=G[j+268>>2];ha=b;pb=b>>31;b=G[j+264>>2];ia=b;qb=b>>31;b=G[j+260>>2];ja=b;rb=b>>31;u=0;while(1){ka=na;pa=zb;while(1){la=Au(tb,ub,ka-E|0,pa-((E>>>0>ka>>>0)+yb|0)|0);sb=Ia;c=oa;v=c;d=Ab;w=d;f:{if(h){while(1){H=Au(xa,ya,c-x|0,d-((c>>>0>>0)+Sa|0)|0);qa=Ia;f=P;o=Wa;while(1){I=Au(za,Aa,f-y|0,o-((f>>>0>>0)+Va|0)|0);ra=Ia;p=Q;r=_a;while(1){J=Au(Ba,Ca,p-z|0,r-((p>>>0>>0)+Za|0)|0);sa=Ia;q=R;t=bb;while(1){K=Au(Da,Ea,q-A|0,t-((q>>>0>>0)+ab|0)|0);ta=Ia;v=S;w=eb;while(1){L=Au(Ga,Ha,v-B|0,w-((v>>>0>>0)+db|0)|0);ua=Ia;m=T;s=hb;while(1){N=Au(Ja,Ka,m-C|0,s-((m>>>0>>0)+gb|0)|0);va=Ia;k=U;n=O;while(1){l=Au(La,Ma,k-D|0,n-((k>>>0>>0)+jb|0)|0)+V|0;b=Na+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+H|0;b=b+qa|0;b=l>>>0>>0?b+1|0:b;l=l+la|0;b=b+sb|0;if((Se(a,ma,W,X,l,l>>>0>>0?b+1|0:b,F,wa,e,1,0,0,(u<<3)+g|0,j+123|0,j+32|0,i)|0)>0){break a}if(G[j+32>>2]){G[h>>2]=1}u=u+F|0;b=n+rb|0;k=k+ja|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=ib>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=s+qb|0;k=m+ia|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=fb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=w+pb|0;k=v+ha|0;b=k>>>0>>0?b+1|0:b;v=k;w=b;if(k>>>0<=cb>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=t+ob|0;k=q+ga|0;b=k>>>0>>0?b+1|0:b;q=k;t=b;if(k>>>0<=$a>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=r+nb|0;k=p+fa|0;b=k>>>0>>0?b+1|0:b;p=k;r=b;if(k>>>0<=Xa>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=o+mb|0;f=f+ea|0;b=f>>>0>>0?b+1|0:b;o=b;if(f>>>0<=Ta>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break}b=d+lb|0;c=c+da|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=Ra>>>0&(Y|0)>=(b|0)|(b|0)<(Y|0)){continue}break f}}while(1){H=Au(xa,ya,v-x|0,w-((v>>>0>>0)+Sa|0)|0);qa=Ia;f=P;o=Wa;while(1){I=Au(za,Aa,f-y|0,o-((f>>>0>>0)+Va|0)|0);ra=Ia;p=Q;r=_a;while(1){J=Au(Ba,Ca,p-z|0,r-((p>>>0>>0)+Za|0)|0);sa=Ia;q=R;t=bb;while(1){K=Au(Da,Ea,q-A|0,t-((q>>>0>>0)+ab|0)|0);ta=Ia;c=S;d=eb;while(1){L=Au(Ga,Ha,c-B|0,d-((c>>>0>>0)+db|0)|0);ua=Ia;m=T;s=hb;while(1){N=Au(Ja,Ka,m-C|0,s-((m>>>0>>0)+gb|0)|0);va=Ia;k=U;n=O;while(1){l=Au(La,Ma,k-D|0,n-((k>>>0>>0)+jb|0)|0)+V|0;b=Na+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+H|0;b=b+qa|0;b=l>>>0>>0?b+1|0:b;l=l+la|0;b=b+sb|0;if((Se(a,ma,W,X,l,l>>>0>>0?b+1|0:b,F,wa,e,1,0,0,(u<<3)+g|0,j+123|0,j+32|0,i)|0)>0){break a}u=u+F|0;b=n+rb|0;k=k+ja|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=ib>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=s+qb|0;k=m+ia|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=fb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=d+pb|0;c=c+ha|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=cb>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=t+ob|0;c=q+ga|0;b=c>>>0>>0?b+1|0:b;q=c;t=b;if(c>>>0<=$a>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=r+nb|0;c=p+fa|0;b=c>>>0>>0?b+1|0:b;p=c;r=b;if(c>>>0<=Xa>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=o+mb|0;c=f+ea|0;b=c>>>0>>0?b+1|0:b;f=c;o=b;if(c>>>0<=Ta>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break}b=w+lb|0;c=v+da|0;b=c>>>0>>0?b+1|0:b;v=c;w=b;if(c>>>0<=Ra>>>0&(Y|0)>=(b|0)|(b|0)<(Y|0)){continue}break}}b=pa+Bb|0;c=ka+kb|0;b=c>>>0>>0?b+1|0:b;ka=c;pa=b;if(c>>>0<=xb>>>0&(Qa|0)>=(b|0)|(b|0)<(Qa|0)){continue}break}b=X+wb|0;c=W+Pa|0;b=c>>>0>>0?b+1|0:b;W=c;X=b;if(c>>>0<=vb>>>0&(Oa|0)>=(b|0)|(b|0)<(Oa|0)){continue}break}break a}G[j+16>>2]=q+1;a=j+32|0;Ya(a,81,26967,j+16|0);Ua(a);G[i>>2]=321}Fa=j+400|0}function hq(a,b,c,d,e,f,g,h,i,j){var 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,H=0,I=0,J=0,L=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;oa=1;k=Fa-400|0;Fa=k;a:{if(b-10>>>0<=4294967286){G[k>>2]=b;a=k+32|0;Ya(a,81,23999,k);Ua(a);G[j>>2]=320;break a}if(Nb(a,j)){if((b|0)!=1){c=b&-2;while(1){l=v<<3;o=k+32|0;p=l+o|0;q=v<<2;s=G[q+d>>2];G[p>>2]=s;G[p+4>>2]=s>>31;p=l;l=k+128|0;p=p+l|0;q=G[e+q>>2];G[p>>2]=q;G[p+4>>2]=q>>31;t=o;o=v|1;p=o<<3;q=t+p|0;o=o<<2;s=G[o+d>>2];G[q>>2]=s;G[q+4>>2]=s>>31;l=l+p|0;o=G[e+o>>2];G[l>>2]=o;G[l+4>>2]=o>>31;v=v+2|0;r=r+2|0;if((c|0)!=(r|0)){continue}break}}if(b&1){b=v<<3;c=b+(k+32|0)|0;l=d;d=v<<2;l=G[l+d>>2];G[c>>2]=l;G[c+4>>2]=l>>31;b=b+(k+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}K[k+352>>2]=g;md(a,42,k+32|0,k+128|0,f,1,k+352|0,h,0,i,j);break a}if((Dc(a,k+124|0,j)|0)>0){break a}x=G[k+124>>2];b:{if(!x){s=1;oa=2;q=1;p=1;break b}l=b<<2;s=G[l+f>>2];q=G[e+l>>2];p=G[d+l>>2]}if(i){G[i>>2]=0}G[k+352>>2]=1;G[k+356>>2]=1;l=1;G[k+128>>2]=1;G[k+132>>2]=0;G[k+304>>2]=1;G[k+308>>2]=1;G[k+256>>2]=1;G[k+260>>2]=1;G[k+136>>2]=1;G[k+140>>2]=0;G[k+208>>2]=1;G[k+212>>2]=1;G[k+360>>2]=1;G[k+144>>2]=1;G[k+148>>2]=0;G[k+312>>2]=1;G[k+316>>2]=1;G[k+264>>2]=1;G[k+268>>2]=1;G[k+152>>2]=1;G[k+156>>2]=0;G[k+216>>2]=1;G[k+220>>2]=1;G[k+364>>2]=1;G[k+368>>2]=1;G[k+320>>2]=1;G[k+272>>2]=1;G[k+160>>2]=1;G[k+164>>2]=0;G[k+224>>2]=1;G[k+372>>2]=1;G[k+376>>2]=1;G[k+168>>2]=1;G[k+172>>2]=0;G[k+324>>2]=1;G[k+328>>2]=1;G[k+276>>2]=1;G[k+280>>2]=1;G[k+176>>2]=1;G[k+180>>2]=0;G[k+228>>2]=1;G[k+232>>2]=1;G[k+184>>2]=1;G[k+188>>2]=0;G[k+380>>2]=1;G[k+384>>2]=1;G[k+332>>2]=1;G[k+336>>2]=1;G[k+284>>2]=1;G[k+288>>2]=1;G[k+192>>2]=1;G[k+196>>2]=0;G[k+236>>2]=1;G[k+240>>2]=1;c:{while(1){n=r<<2;u=G[n+e>>2];t=G[d+n>>2];d:{if((u|0)>=(t|0)){w=G[n+(k+208|0)>>2];break d}if(x){break c}G[n+(k+208|0)>>2]=-1;w=-1}G[n+(k+304|0)>>2]=u;G[n+(k+352|0)>>2]=t;G[n+(k+256|0)>>2]=G[f+n>>2];y=k+128|0;u=r+1|0;t=y+(u<<3)|0;n=G[c+n>>2];n=Au(l,o,n,n>>31);G[t>>2]=n;Q=t;t=Ia;G[Q+4>>2]=t;r=y+(r<<3)|0;Eb=r,Fb=Au(l,o,w,w>>31),G[Eb>>2]=Fb;G[r+4>>2]=Ia;l=n;o=t;r=u;if((r|0)!=(b|0)){continue}break}d=(k+128|0)+(b<<3)|0;e=G[d>>2];l=e;e=G[(k+208|0)+(b<<2)>>2];Eb=d,Fb=Au(l,G[d+4>>2],e,e>>31),G[Eb>>2]=Fb;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){v=(q-p|0)/(s|0)|0;q=p;e=s;break e}b=G[k+208>>2];e=M(b,G[k+256>>2]);v=(M(b,G[k+304>>2]-G[k+352>>2]|0)|0)/G[f>>2]|0}if((q|0)<(p|0)){break a}F=G[k+240>>2];pa=M(F,G[k+384>>2]);b=M(F,G[k+336>>2]);if((pa|0)>(b|0)){break a}y=G[k+236>>2];qa=M(y,G[k+380>>2]);c=M(y,G[k+332>>2]);if((qa|0)>(c|0)){break a}z=G[k+232>>2];R=M(z,G[k+376>>2]);d=M(z,G[k+328>>2]);if((R|0)>(d|0)){break a}A=G[k+228>>2];S=M(A,G[k+372>>2]);f=M(A,G[k+324>>2]);if((S|0)>(f|0)){break a}B=G[k+224>>2];T=M(B,G[k+368>>2]);l=M(B,G[k+320>>2]);if((T|0)>(l|0)){break a}C=G[k+220>>2];U=M(C,G[k+364>>2]);o=M(C,G[k+316>>2]);if((U|0)>(o|0)){break a}D=G[k+216>>2];V=M(D,G[k+360>>2]);r=M(D,G[k+312>>2]);if((V|0)>(r|0)){break a}E=G[k+212>>2];W=M(E,G[k+356>>2]);u=M(E,G[k+308>>2]);if((W|0)>(u|0)){break a}H=v+1|0;ya=H>>31;vb=G[k+192>>2];wb=G[k+196>>2];za=G[k+184>>2];Aa=G[k+188>>2];Ba=G[k+176>>2];Ca=G[k+180>>2];Da=G[k+168>>2];Ea=G[k+172>>2];Ga=G[k+160>>2];Ha=G[k+164>>2];Ja=G[k+152>>2];Ka=G[k+156>>2];La=G[k+144>>2];Ma=G[k+148>>2];Na=G[k+136>>2];Oa=G[k+140>>2];n=G[k+352>>2];X=n;Pa=n>>31;xb=q;Qa=q>>31;Ra=s;yb=s>>31;Y=p;Z=p>>31;zb=b;Sa=b>>31;Ab=F>>31;Bb=pa>>31;Ta=c;_=c>>31;Va=y>>31;Cb=qa>>31;Wa=d;$=d>>31;Xa=z>>31;Za=R>>31;_a=f;aa=f>>31;$a=A>>31;ab=S>>31;bb=l;ba=l>>31;cb=B>>31;db=T>>31;eb=o;ca=o>>31;fb=C>>31;gb=U>>31;hb=r;da=r>>31;ib=D>>31;jb=V>>31;kb=u;ea=u>>31;lb=E>>31;Q=W>>31;b=G[k+288>>2];mb=b;Db=b>>31;b=G[k+284>>2];fa=b;nb=b>>31;b=G[k+280>>2];ga=b;ob=b>>31;b=G[k+276>>2];ha=b;pb=b>>31;b=G[k+272>>2];ia=b;qb=b>>31;b=G[k+268>>2];ja=b;rb=b>>31;b=G[k+264>>2];ka=b;sb=b>>31;b=G[k+260>>2];la=b;tb=b>>31;v=0;while(1){ma=pa;ra=Bb;while(1){na=Au(vb,wb,ma-F|0,ra-((F>>>0>ma>>>0)+Ab|0)|0);ub=Ia;c=qa;w=c;d=Cb;x=d;f:{if(i){while(1){I=Au(za,Aa,c-y|0,d-((c>>>0>>0)+Va|0)|0);sa=Ia;f=R;p=Za;while(1){J=Au(Ba,Ca,f-z|0,p-((f>>>0>>0)+Xa|0)|0);ta=Ia;q=S;s=ab;while(1){L=Au(Da,Ea,q-A|0,s-((q>>>0>>0)+$a|0)|0);ua=Ia;r=T;u=db;while(1){N=Au(Ga,Ha,r-B|0,u-((r>>>0>>0)+cb|0)|0);va=Ia;w=U;x=gb;while(1){O=Au(Ja,Ka,w-C|0,x-((w>>>0>>0)+fb|0)|0);wa=Ia;n=V;t=jb;while(1){P=Au(La,Ma,n-D|0,t-((n>>>0>>0)+ib|0)|0);xa=Ia;l=W;o=Q;while(1){m=Au(Na,Oa,l-E|0,o-((l>>>0>>0)+lb|0)|0)+X|0;b=Pa+Ia|0;b=m>>>0>>0?b+1|0:b;m=m+P|0;b=b+xa|0;b=m>>>0

>>0?b+1|0:b;m=m+O|0;b=b+wa|0;b=m>>>0>>0?b+1|0:b;m=m+N|0;b=b+va|0;b=m>>>0>>0?b+1|0:b;m=m+L|0;b=b+ua|0;b=m>>>0>>0?b+1|0:b;m=m+J|0;b=b+ta|0;b=m>>>0>>0?b+1|0:b;m=m+I|0;b=b+sa|0;b=m>>>0>>0?b+1|0:b;m=m+na|0;b=b+ub|0;if((ae(a,oa,Y,Z,m,m>>>0>>0?b+1|0:b,H,ya,e,1,g,(v<<2)+h|0,k+123|0,k+32|0,j)|0)>0){break a}if(G[k+32>>2]){G[i>>2]=1}v=v+H|0;b=o+tb|0;l=l+la|0;b=l>>>0>>0?b+1|0:b;o=b;if(l>>>0<=kb>>>0&(ea|0)>=(b|0)|(b|0)<(ea|0)){continue}break}b=t+sb|0;l=n+ka|0;b=l>>>0>>0?b+1|0:b;n=l;t=b;if(l>>>0<=hb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=x+rb|0;l=w+ja|0;b=l>>>0>>0?b+1|0:b;w=l;x=b;if(l>>>0<=eb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=u+qb|0;l=r+ia|0;b=l>>>0>>0?b+1|0:b;r=l;u=b;if(l>>>0<=bb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=s+pb|0;l=q+ha|0;b=l>>>0>>0?b+1|0:b;q=l;s=b;if(l>>>0<=_a>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=p+ob|0;f=f+ga|0;b=f>>>0>>0?b+1|0:b;p=b;if(f>>>0<=Wa>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=d+nb|0;c=c+fa|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=Ta>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break f}}while(1){I=Au(za,Aa,w-y|0,x-((w>>>0>>0)+Va|0)|0);sa=Ia;f=R;p=Za;while(1){J=Au(Ba,Ca,f-z|0,p-((f>>>0>>0)+Xa|0)|0);ta=Ia;q=S;s=ab;while(1){L=Au(Da,Ea,q-A|0,s-((q>>>0>>0)+$a|0)|0);ua=Ia;r=T;u=db;while(1){N=Au(Ga,Ha,r-B|0,u-((r>>>0>>0)+cb|0)|0);va=Ia;c=U;d=gb;while(1){O=Au(Ja,Ka,c-C|0,d-((c>>>0>>0)+fb|0)|0);wa=Ia;n=V;t=jb;while(1){P=Au(La,Ma,n-D|0,t-((n>>>0>>0)+ib|0)|0);xa=Ia;l=W;o=Q;while(1){m=Au(Na,Oa,l-E|0,o-((l>>>0>>0)+lb|0)|0)+X|0;b=Pa+Ia|0;b=m>>>0>>0?b+1|0:b;m=m+P|0;b=b+xa|0;b=m>>>0

>>0?b+1|0:b;m=m+O|0;b=b+wa|0;b=m>>>0>>0?b+1|0:b;m=m+N|0;b=b+va|0;b=m>>>0>>0?b+1|0:b;m=m+L|0;b=b+ua|0;b=m>>>0>>0?b+1|0:b;m=m+J|0;b=b+ta|0;b=m>>>0>>0?b+1|0:b;m=m+I|0;b=b+sa|0;b=m>>>0>>0?b+1|0:b;m=m+na|0;b=b+ub|0;if((ae(a,oa,Y,Z,m,m>>>0>>0?b+1|0:b,H,ya,e,1,g,(v<<2)+h|0,k+123|0,k+32|0,j)|0)>0){break a}v=v+H|0;b=o+tb|0;l=l+la|0;b=l>>>0>>0?b+1|0:b;o=b;if(l>>>0<=kb>>>0&(ea|0)>=(b|0)|(b|0)<(ea|0)){continue}break}b=t+sb|0;l=n+ka|0;b=l>>>0>>0?b+1|0:b;n=l;t=b;if(l>>>0<=hb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=d+rb|0;c=c+ja|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=eb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=u+qb|0;c=r+ia|0;b=c>>>0>>0?b+1|0:b;r=c;u=b;if(c>>>0<=bb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=s+pb|0;c=q+ha|0;b=c>>>0>>0?b+1|0:b;q=c;s=b;if(c>>>0<=_a>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=p+ob|0;c=f+ga|0;b=c>>>0>>0?b+1|0:b;f=c;p=b;if(c>>>0<=Wa>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=x+nb|0;c=w+fa|0;b=c>>>0>>0?b+1|0:b;w=c;x=b;if(c>>>0<=Ta>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}}b=ra+Db|0;c=ma+mb|0;b=c>>>0>>0?b+1|0:b;ma=c;ra=b;if(c>>>0<=zb>>>0&(Sa|0)>=(b|0)|(b|0)<(Sa|0)){continue}break}b=Z+yb|0;c=Y+Ra|0;b=c>>>0>>0?b+1|0:b;Y=c;Z=b;if(c>>>0<=xb>>>0&(Qa|0)>=(b|0)|(b|0)<(Qa|0)){continue}break}break a}G[k+16>>2]=r+1;a=k+32|0;Ya(a,81,27149,k+16|0);Ua(a);G[j>>2]=321}Fa=k+400|0}function dq(a,b,c,d,e,f,g,h,i,j){var 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,H=0,I=0,J=0,K=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;oa=1;k=Fa-400|0;Fa=k;a:{if(b-10>>>0<=4294967286){G[k>>2]=b;a=k+32|0;Ya(a,81,24044,k);Ua(a);G[j>>2]=320;break a}if(Nb(a,j)){if((b|0)!=1){c=b&-2;while(1){l=v<<3;o=k+32|0;p=l+o|0;q=v<<2;s=G[q+d>>2];G[p>>2]=s;G[p+4>>2]=s>>31;p=l;l=k+128|0;p=p+l|0;q=G[e+q>>2];G[p>>2]=q;G[p+4>>2]=q>>31;t=o;o=v|1;p=o<<3;q=t+p|0;o=o<<2;s=G[o+d>>2];G[q>>2]=s;G[q+4>>2]=s>>31;l=l+p|0;o=G[e+o>>2];G[l>>2]=o;G[l+4>>2]=o>>31;v=v+2|0;r=r+2|0;if((c|0)!=(r|0)){continue}break}}if(b&1){b=v<<3;c=b+(k+32|0)|0;l=d;d=v<<2;l=G[l+d>>2];G[c>>2]=l;G[c+4>>2]=l>>31;b=b+(k+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}L[k+352>>3]=g;md(a,82,k+32|0,k+128|0,f,1,k+352|0,h,0,i,j);break a}if((Dc(a,k+124|0,j)|0)>0){break a}x=G[k+124>>2];b:{if(!x){s=1;oa=2;q=1;p=1;break b}l=b<<2;s=G[l+f>>2];q=G[e+l>>2];p=G[d+l>>2]}if(i){G[i>>2]=0}G[k+352>>2]=1;G[k+356>>2]=1;l=1;G[k+128>>2]=1;G[k+132>>2]=0;G[k+304>>2]=1;G[k+308>>2]=1;G[k+256>>2]=1;G[k+260>>2]=1;G[k+136>>2]=1;G[k+140>>2]=0;G[k+208>>2]=1;G[k+212>>2]=1;G[k+360>>2]=1;G[k+144>>2]=1;G[k+148>>2]=0;G[k+312>>2]=1;G[k+316>>2]=1;G[k+264>>2]=1;G[k+268>>2]=1;G[k+152>>2]=1;G[k+156>>2]=0;G[k+216>>2]=1;G[k+220>>2]=1;G[k+364>>2]=1;G[k+368>>2]=1;G[k+320>>2]=1;G[k+272>>2]=1;G[k+160>>2]=1;G[k+164>>2]=0;G[k+224>>2]=1;G[k+372>>2]=1;G[k+376>>2]=1;G[k+168>>2]=1;G[k+172>>2]=0;G[k+324>>2]=1;G[k+328>>2]=1;G[k+276>>2]=1;G[k+280>>2]=1;G[k+176>>2]=1;G[k+180>>2]=0;G[k+228>>2]=1;G[k+232>>2]=1;G[k+184>>2]=1;G[k+188>>2]=0;G[k+380>>2]=1;G[k+384>>2]=1;G[k+332>>2]=1;G[k+336>>2]=1;G[k+284>>2]=1;G[k+288>>2]=1;G[k+192>>2]=1;G[k+196>>2]=0;G[k+236>>2]=1;G[k+240>>2]=1;c:{while(1){n=r<<2;u=G[n+e>>2];t=G[d+n>>2];d:{if((u|0)>=(t|0)){w=G[n+(k+208|0)>>2];break d}if(x){break c}G[n+(k+208|0)>>2]=-1;w=-1}G[n+(k+304|0)>>2]=u;G[n+(k+352|0)>>2]=t;G[n+(k+256|0)>>2]=G[f+n>>2];y=k+128|0;u=r+1|0;t=y+(u<<3)|0;n=G[c+n>>2];n=Au(l,o,n,n>>31);G[t>>2]=n;Q=t;t=Ia;G[Q+4>>2]=t;r=y+(r<<3)|0;Eb=r,Fb=Au(l,o,w,w>>31),G[Eb>>2]=Fb;G[r+4>>2]=Ia;l=n;o=t;r=u;if((r|0)!=(b|0)){continue}break}d=(k+128|0)+(b<<3)|0;e=G[d>>2];l=e;e=G[(k+208|0)+(b<<2)>>2];Eb=d,Fb=Au(l,G[d+4>>2],e,e>>31),G[Eb>>2]=Fb;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){v=(q-p|0)/(s|0)|0;q=p;e=s;break e}b=G[k+208>>2];e=M(b,G[k+256>>2]);v=(M(b,G[k+304>>2]-G[k+352>>2]|0)|0)/G[f>>2]|0}if((q|0)<(p|0)){break a}F=G[k+240>>2];pa=M(F,G[k+384>>2]);b=M(F,G[k+336>>2]);if((pa|0)>(b|0)){break a}y=G[k+236>>2];qa=M(y,G[k+380>>2]);c=M(y,G[k+332>>2]);if((qa|0)>(c|0)){break a}z=G[k+232>>2];R=M(z,G[k+376>>2]);d=M(z,G[k+328>>2]);if((R|0)>(d|0)){break a}A=G[k+228>>2];S=M(A,G[k+372>>2]);f=M(A,G[k+324>>2]);if((S|0)>(f|0)){break a}B=G[k+224>>2];T=M(B,G[k+368>>2]);l=M(B,G[k+320>>2]);if((T|0)>(l|0)){break a}C=G[k+220>>2];U=M(C,G[k+364>>2]);o=M(C,G[k+316>>2]);if((U|0)>(o|0)){break a}D=G[k+216>>2];V=M(D,G[k+360>>2]);r=M(D,G[k+312>>2]);if((V|0)>(r|0)){break a}E=G[k+212>>2];W=M(E,G[k+356>>2]);u=M(E,G[k+308>>2]);if((W|0)>(u|0)){break a}H=v+1|0;ya=H>>31;vb=G[k+192>>2];wb=G[k+196>>2];za=G[k+184>>2];Aa=G[k+188>>2];Ba=G[k+176>>2];Ca=G[k+180>>2];Da=G[k+168>>2];Ea=G[k+172>>2];Ga=G[k+160>>2];Ha=G[k+164>>2];Ja=G[k+152>>2];Ka=G[k+156>>2];La=G[k+144>>2];Ma=G[k+148>>2];Na=G[k+136>>2];Oa=G[k+140>>2];n=G[k+352>>2];X=n;Pa=n>>31;xb=q;Qa=q>>31;Ra=s;yb=s>>31;Y=p;Z=p>>31;zb=b;Sa=b>>31;Ab=F>>31;Bb=pa>>31;Ta=c;_=c>>31;Va=y>>31;Cb=qa>>31;Wa=d;$=d>>31;Xa=z>>31;Za=R>>31;_a=f;aa=f>>31;$a=A>>31;ab=S>>31;bb=l;ba=l>>31;cb=B>>31;db=T>>31;eb=o;ca=o>>31;fb=C>>31;gb=U>>31;hb=r;da=r>>31;ib=D>>31;jb=V>>31;kb=u;ea=u>>31;lb=E>>31;Q=W>>31;b=G[k+288>>2];mb=b;Db=b>>31;b=G[k+284>>2];fa=b;nb=b>>31;b=G[k+280>>2];ga=b;ob=b>>31;b=G[k+276>>2];ha=b;pb=b>>31;b=G[k+272>>2];ia=b;qb=b>>31;b=G[k+268>>2];ja=b;rb=b>>31;b=G[k+264>>2];ka=b;sb=b>>31;b=G[k+260>>2];la=b;tb=b>>31;v=0;while(1){ma=pa;ra=Bb;while(1){na=Au(vb,wb,ma-F|0,ra-((F>>>0>ma>>>0)+Ab|0)|0);ub=Ia;c=qa;w=c;d=Cb;x=d;f:{if(i){while(1){I=Au(za,Aa,c-y|0,d-((c>>>0>>0)+Va|0)|0);sa=Ia;f=R;p=Za;while(1){J=Au(Ba,Ca,f-z|0,p-((f>>>0>>0)+Xa|0)|0);ta=Ia;q=S;s=ab;while(1){K=Au(Da,Ea,q-A|0,s-((q>>>0>>0)+$a|0)|0);ua=Ia;r=T;u=db;while(1){N=Au(Ga,Ha,r-B|0,u-((r>>>0>>0)+cb|0)|0);va=Ia;w=U;x=gb;while(1){O=Au(Ja,Ka,w-C|0,x-((w>>>0>>0)+fb|0)|0);wa=Ia;n=V;t=jb;while(1){P=Au(La,Ma,n-D|0,t-((n>>>0>>0)+ib|0)|0);xa=Ia;l=W;o=Q;while(1){m=Au(Na,Oa,l-E|0,o-((l>>>0>>0)+lb|0)|0)+X|0;b=Pa+Ia|0;b=m>>>0>>0?b+1|0:b;m=m+P|0;b=b+xa|0;b=m>>>0

>>0?b+1|0:b;m=m+O|0;b=b+wa|0;b=m>>>0>>0?b+1|0:b;m=m+N|0;b=b+va|0;b=m>>>0>>0?b+1|0:b;m=m+K|0;b=b+ua|0;b=m>>>0>>0?b+1|0:b;m=m+J|0;b=b+ta|0;b=m>>>0>>0?b+1|0:b;m=m+I|0;b=b+sa|0;b=m>>>0>>0?b+1|0:b;m=m+na|0;b=b+ub|0;if((Id(a,oa,Y,Z,m,m>>>0>>0?b+1|0:b,H,ya,e,1,g,(v<<3)+h|0,k+123|0,k+32|0,j)|0)>0){break a}if(G[k+32>>2]){G[i>>2]=1}v=v+H|0;b=o+tb|0;l=l+la|0;b=l>>>0>>0?b+1|0:b;o=b;if(l>>>0<=kb>>>0&(ea|0)>=(b|0)|(b|0)<(ea|0)){continue}break}b=t+sb|0;l=n+ka|0;b=l>>>0>>0?b+1|0:b;n=l;t=b;if(l>>>0<=hb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=x+rb|0;l=w+ja|0;b=l>>>0>>0?b+1|0:b;w=l;x=b;if(l>>>0<=eb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=u+qb|0;l=r+ia|0;b=l>>>0>>0?b+1|0:b;r=l;u=b;if(l>>>0<=bb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=s+pb|0;l=q+ha|0;b=l>>>0>>0?b+1|0:b;q=l;s=b;if(l>>>0<=_a>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=p+ob|0;f=f+ga|0;b=f>>>0>>0?b+1|0:b;p=b;if(f>>>0<=Wa>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=d+nb|0;c=c+fa|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=Ta>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break f}}while(1){I=Au(za,Aa,w-y|0,x-((w>>>0>>0)+Va|0)|0);sa=Ia;f=R;p=Za;while(1){J=Au(Ba,Ca,f-z|0,p-((f>>>0>>0)+Xa|0)|0);ta=Ia;q=S;s=ab;while(1){K=Au(Da,Ea,q-A|0,s-((q>>>0>>0)+$a|0)|0);ua=Ia;r=T;u=db;while(1){N=Au(Ga,Ha,r-B|0,u-((r>>>0>>0)+cb|0)|0);va=Ia;c=U;d=gb;while(1){O=Au(Ja,Ka,c-C|0,d-((c>>>0>>0)+fb|0)|0);wa=Ia;n=V;t=jb;while(1){P=Au(La,Ma,n-D|0,t-((n>>>0>>0)+ib|0)|0);xa=Ia;l=W;o=Q;while(1){m=Au(Na,Oa,l-E|0,o-((l>>>0>>0)+lb|0)|0)+X|0;b=Pa+Ia|0;b=m>>>0>>0?b+1|0:b;m=m+P|0;b=b+xa|0;b=m>>>0

>>0?b+1|0:b;m=m+O|0;b=b+wa|0;b=m>>>0>>0?b+1|0:b;m=m+N|0;b=b+va|0;b=m>>>0>>0?b+1|0:b;m=m+K|0;b=b+ua|0;b=m>>>0>>0?b+1|0:b;m=m+J|0;b=b+ta|0;b=m>>>0>>0?b+1|0:b;m=m+I|0;b=b+sa|0;b=m>>>0>>0?b+1|0:b;m=m+na|0;b=b+ub|0;if((Id(a,oa,Y,Z,m,m>>>0>>0?b+1|0:b,H,ya,e,1,g,(v<<3)+h|0,k+123|0,k+32|0,j)|0)>0){break a}v=v+H|0;b=o+tb|0;l=l+la|0;b=l>>>0>>0?b+1|0:b;o=b;if(l>>>0<=kb>>>0&(ea|0)>=(b|0)|(b|0)<(ea|0)){continue}break}b=t+sb|0;l=n+ka|0;b=l>>>0>>0?b+1|0:b;n=l;t=b;if(l>>>0<=hb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=d+rb|0;c=c+ja|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=eb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=u+qb|0;c=r+ia|0;b=c>>>0>>0?b+1|0:b;r=c;u=b;if(c>>>0<=bb>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=s+pb|0;c=q+ha|0;b=c>>>0>>0?b+1|0:b;q=c;s=b;if(c>>>0<=_a>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=p+ob|0;c=f+ga|0;b=c>>>0>>0?b+1|0:b;f=c;p=b;if(c>>>0<=Wa>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=x+nb|0;c=w+fa|0;b=c>>>0>>0?b+1|0:b;w=c;x=b;if(c>>>0<=Ta>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}}b=ra+Db|0;c=ma+mb|0;b=c>>>0>>0?b+1|0:b;ma=c;ra=b;if(c>>>0<=zb>>>0&(Sa|0)>=(b|0)|(b|0)<(Sa|0)){continue}break}b=Z+yb|0;c=Y+Ra|0;b=c>>>0>>0?b+1|0:b;Y=c;Z=b;if(c>>>0<=xb>>>0&(Qa|0)>=(b|0)|(b|0)<(Qa|0)){continue}break}break a}G[k+16>>2]=r+1;a=k+32|0;Ya(a,81,27194,k+16|0);Ua(a);G[j>>2]=321}Fa=k+400|0}function Mp(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,E=0,H=0,I=0,J=0,K=0,L=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;na=1;j=Fa-400|0;Fa=j;a:{if(b-10>>>0<=4294967286){G[j>>2]=b;a=j+32|0;Ya(a,81,23908,j);Ua(a);G[i>>2]=320;break a}if(Nb(a,i)){if((b|0)!=1){c=b&-2;while(1){k=u<<3;n=j+32|0;o=k+n|0;p=u<<2;r=G[p+d>>2];G[o>>2]=r;G[o+4>>2]=r>>31;o=k;k=j+128|0;o=o+k|0;p=G[e+p>>2];G[o>>2]=p;G[o+4>>2]=p>>31;s=n;n=u|1;o=n<<3;p=s+o|0;n=n<<2;r=G[n+d>>2];G[p>>2]=r;G[p+4>>2]=r>>31;k=k+o|0;n=G[e+n>>2];G[k>>2]=n;G[k+4>>2]=n>>31;u=u+2|0;q=q+2|0;if((c|0)!=(q|0)){continue}break}}if(b&1){b=u<<3;c=b+(j+32|0)|0;k=d;d=u<<2;k=G[k+d>>2];G[c>>2]=k;G[c+4>>2]=k>>31;b=b+(j+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}F[j+352>>1]=0;md(a,21,j+32|0,j+128|0,f,1,j+352|0,g,0,h,i);break a}if((Dc(a,j+124|0,i)|0)>0){break a}w=G[j+124>>2];b:{if(!w){r=1;na=2;p=1;o=1;break b}k=b<<2;r=G[k+f>>2];p=G[e+k>>2];o=G[d+k>>2]}if(h){G[h>>2]=0}G[j+352>>2]=1;G[j+356>>2]=1;k=1;G[j+128>>2]=1;G[j+132>>2]=0;G[j+304>>2]=1;G[j+308>>2]=1;G[j+256>>2]=1;G[j+260>>2]=1;G[j+136>>2]=1;G[j+140>>2]=0;G[j+208>>2]=1;G[j+212>>2]=1;G[j+360>>2]=1;G[j+144>>2]=1;G[j+148>>2]=0;G[j+312>>2]=1;G[j+316>>2]=1;G[j+264>>2]=1;G[j+268>>2]=1;G[j+152>>2]=1;G[j+156>>2]=0;G[j+216>>2]=1;G[j+220>>2]=1;G[j+364>>2]=1;G[j+368>>2]=1;G[j+320>>2]=1;G[j+272>>2]=1;G[j+160>>2]=1;G[j+164>>2]=0;G[j+224>>2]=1;G[j+372>>2]=1;G[j+376>>2]=1;G[j+168>>2]=1;G[j+172>>2]=0;G[j+324>>2]=1;G[j+328>>2]=1;G[j+276>>2]=1;G[j+280>>2]=1;G[j+176>>2]=1;G[j+180>>2]=0;G[j+228>>2]=1;G[j+232>>2]=1;G[j+184>>2]=1;G[j+188>>2]=0;G[j+380>>2]=1;G[j+384>>2]=1;G[j+332>>2]=1;G[j+336>>2]=1;G[j+284>>2]=1;G[j+288>>2]=1;G[j+192>>2]=1;G[j+196>>2]=0;G[j+236>>2]=1;G[j+240>>2]=1;c:{while(1){m=q<<2;t=G[m+e>>2];s=G[d+m>>2];d:{if((t|0)>=(s|0)){v=G[m+(j+208|0)>>2];break d}if(w){break c}G[m+(j+208|0)>>2]=-1;v=-1}G[m+(j+304|0)>>2]=t;G[m+(j+352|0)>>2]=s;G[m+(j+256|0)>>2]=G[f+m>>2];x=j+128|0;t=q+1|0;s=x+(t<<3)|0;m=G[c+m>>2];m=Au(k,n,m,m>>31);G[s>>2]=m;P=s;s=Ia;G[P+4>>2]=s;q=x+(q<<3)|0;Db=q,Eb=Au(k,n,v,v>>31),G[Db>>2]=Eb;G[q+4>>2]=Ia;k=m;n=s;q=t;if((q|0)!=(b|0)){continue}break}d=(j+128|0)+(b<<3)|0;e=G[d>>2];k=e;e=G[(j+208|0)+(b<<2)>>2];Db=d,Eb=Au(k,G[d+4>>2],e,e>>31),G[Db>>2]=Eb;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){u=(p-o|0)/(r|0)|0;p=o;e=r;break e}b=G[j+208>>2];e=M(b,G[j+256>>2]);u=(M(b,G[j+304>>2]-G[j+352>>2]|0)|0)/G[f>>2]|0}if((p|0)<(o|0)){break a}E=G[j+240>>2];oa=M(E,G[j+384>>2]);b=M(E,G[j+336>>2]);if((oa|0)>(b|0)){break a}x=G[j+236>>2];pa=M(x,G[j+380>>2]);c=M(x,G[j+332>>2]);if((pa|0)>(c|0)){break a}y=G[j+232>>2];Q=M(y,G[j+376>>2]);d=M(y,G[j+328>>2]);if((Q|0)>(d|0)){break a}z=G[j+228>>2];R=M(z,G[j+372>>2]);f=M(z,G[j+324>>2]);if((R|0)>(f|0)){break a}A=G[j+224>>2];S=M(A,G[j+368>>2]);k=M(A,G[j+320>>2]);if((S|0)>(k|0)){break a}B=G[j+220>>2];T=M(B,G[j+364>>2]);n=M(B,G[j+316>>2]);if((T|0)>(n|0)){break a}C=G[j+216>>2];U=M(C,G[j+360>>2]);q=M(C,G[j+312>>2]);if((U|0)>(q|0)){break a}D=G[j+212>>2];V=M(D,G[j+356>>2]);t=M(D,G[j+308>>2]);if((V|0)>(t|0)){break a}H=u+1|0;xa=H>>31;ub=G[j+192>>2];vb=G[j+196>>2];ya=G[j+184>>2];za=G[j+188>>2];Aa=G[j+176>>2];Ba=G[j+180>>2];Ca=G[j+168>>2];Da=G[j+172>>2];Ea=G[j+160>>2];Ga=G[j+164>>2];Ha=G[j+152>>2];Ja=G[j+156>>2];Ka=G[j+144>>2];La=G[j+148>>2];Ma=G[j+136>>2];Na=G[j+140>>2];m=G[j+352>>2];W=m;Oa=m>>31;wb=p;Pa=p>>31;Qa=r;xb=r>>31;X=o;Y=o>>31;yb=b;Ra=b>>31;zb=E>>31;Ab=oa>>31;Sa=c;Z=c>>31;Ta=x>>31;Bb=pa>>31;Va=d;_=d>>31;Wa=y>>31;Xa=Q>>31;Za=f;$=f>>31;_a=z>>31;$a=R>>31;ab=k;aa=k>>31;bb=A>>31;cb=S>>31;db=n;ba=n>>31;eb=B>>31;fb=T>>31;gb=q;ca=q>>31;hb=C>>31;ib=U>>31;jb=t;da=t>>31;kb=D>>31;P=V>>31;b=G[j+288>>2];lb=b;Cb=b>>31;b=G[j+284>>2];ea=b;mb=b>>31;b=G[j+280>>2];fa=b;nb=b>>31;b=G[j+276>>2];ga=b;ob=b>>31;b=G[j+272>>2];ha=b;pb=b>>31;b=G[j+268>>2];ia=b;qb=b>>31;b=G[j+264>>2];ja=b;rb=b>>31;b=G[j+260>>2];ka=b;sb=b>>31;u=0;while(1){la=oa;qa=Ab;while(1){ma=Au(ub,vb,la-E|0,qa-((E>>>0>la>>>0)+zb|0)|0);tb=Ia;c=pa;v=c;d=Bb;w=d;f:{if(h){while(1){I=Au(ya,za,c-x|0,d-((c>>>0>>0)+Ta|0)|0);ra=Ia;f=Q;o=Xa;while(1){J=Au(Aa,Ba,f-y|0,o-((f>>>0>>0)+Wa|0)|0);sa=Ia;p=R;r=$a;while(1){K=Au(Ca,Da,p-z|0,r-((p>>>0>>0)+_a|0)|0);ta=Ia;q=S;t=cb;while(1){L=Au(Ea,Ga,q-A|0,t-((q>>>0>>0)+bb|0)|0);ua=Ia;v=T;w=fb;while(1){N=Au(Ha,Ja,v-B|0,w-((v>>>0>>0)+eb|0)|0);va=Ia;m=U;s=ib;while(1){O=Au(Ka,La,m-C|0,s-((m>>>0>>0)+hb|0)|0);wa=Ia;k=V;n=P;while(1){l=Au(Ma,Na,k-D|0,n-((k>>>0>>0)+kb|0)|0)+W|0;b=Oa+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+O|0;b=b+wa|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+ma|0;b=b+tb|0;if((jf(a,na,X,Y,l,l>>>0>>0?b+1|0:b,H,xa,e,1,0,(u<<1)+g|0,j+123|0,j+32|0,i)|0)>0){break a}if(G[j+32>>2]){G[h>>2]=1}u=u+H|0;b=n+sb|0;k=k+ka|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=jb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=s+rb|0;k=m+ja|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=gb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=w+qb|0;k=v+ia|0;b=k>>>0>>0?b+1|0:b;v=k;w=b;if(k>>>0<=db>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=t+pb|0;k=q+ha|0;b=k>>>0>>0?b+1|0:b;q=k;t=b;if(k>>>0<=ab>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=r+ob|0;k=p+ga|0;b=k>>>0>>0?b+1|0:b;p=k;r=b;if(k>>>0<=Za>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=o+nb|0;f=f+fa|0;b=f>>>0>>0?b+1|0:b;o=b;if(f>>>0<=Va>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=d+mb|0;c=c+ea|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=Sa>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break f}}while(1){I=Au(ya,za,v-x|0,w-((v>>>0>>0)+Ta|0)|0);ra=Ia;f=Q;o=Xa;while(1){J=Au(Aa,Ba,f-y|0,o-((f>>>0>>0)+Wa|0)|0);sa=Ia;p=R;r=$a;while(1){K=Au(Ca,Da,p-z|0,r-((p>>>0>>0)+_a|0)|0);ta=Ia;q=S;t=cb;while(1){L=Au(Ea,Ga,q-A|0,t-((q>>>0>>0)+bb|0)|0);ua=Ia;c=T;d=fb;while(1){N=Au(Ha,Ja,c-B|0,d-((c>>>0>>0)+eb|0)|0);va=Ia;m=U;s=ib;while(1){O=Au(Ka,La,m-C|0,s-((m>>>0>>0)+hb|0)|0);wa=Ia;k=V;n=P;while(1){l=Au(Ma,Na,k-D|0,n-((k>>>0>>0)+kb|0)|0)+W|0;b=Oa+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+O|0;b=b+wa|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+ma|0;b=b+tb|0;if((jf(a,na,X,Y,l,l>>>0>>0?b+1|0:b,H,xa,e,1,0,(u<<1)+g|0,j+123|0,j+32|0,i)|0)>0){break a}u=u+H|0;b=n+sb|0;k=k+ka|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=jb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=s+rb|0;k=m+ja|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=gb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=d+qb|0;c=c+ia|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=db>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=t+pb|0;c=q+ha|0;b=c>>>0>>0?b+1|0:b;q=c;t=b;if(c>>>0<=ab>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=r+ob|0;c=p+ga|0;b=c>>>0>>0?b+1|0:b;p=c;r=b;if(c>>>0<=Za>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=o+nb|0;c=f+fa|0;b=c>>>0>>0?b+1|0:b;f=c;o=b;if(c>>>0<=Va>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=w+mb|0;c=v+ea|0;b=c>>>0>>0?b+1|0:b;v=c;w=b;if(c>>>0<=Sa>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break}}b=qa+Cb|0;c=la+lb|0;b=c>>>0>>0?b+1|0:b;la=c;qa=b;if(c>>>0<=yb>>>0&(Ra|0)>=(b|0)|(b|0)<(Ra|0)){continue}break}b=Y+xb|0;c=X+Qa|0;b=c>>>0>>0?b+1|0:b;X=c;Y=b;if(c>>>0<=wb>>>0&(Pa|0)>=(b|0)|(b|0)<(Pa|0)){continue}break}break a}G[j+16>>2]=q+1;a=j+32|0;Ya(a,81,27058,j+16|0);Ua(a);G[i>>2]=321}Fa=j+400|0}function rp(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,F=0,H=0,I=0,J=0,K=0,L=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;na=1;j=Fa-400|0;Fa=j;a:{if(b-10>>>0<=4294967286){G[j>>2]=b;a=j+32|0;Ya(a,81,24089,j);Ua(a);G[i>>2]=320;break a}if(Nb(a,i)){if((b|0)!=1){c=b&-2;while(1){k=u<<3;n=j+32|0;o=k+n|0;p=u<<2;r=G[p+d>>2];G[o>>2]=r;G[o+4>>2]=r>>31;o=k;k=j+128|0;o=o+k|0;p=G[e+p>>2];G[o>>2]=p;G[o+4>>2]=p>>31;s=n;n=u|1;o=n<<3;p=s+o|0;n=n<<2;r=G[n+d>>2];G[p>>2]=r;G[p+4>>2]=r>>31;k=k+o|0;n=G[e+n>>2];G[k>>2]=n;G[k+4>>2]=n>>31;u=u+2|0;q=q+2|0;if((c|0)!=(q|0)){continue}break}}if(b&1){b=u<<3;c=b+(j+32|0)|0;k=d;d=u<<2;k=G[k+d>>2];G[c>>2]=k;G[c+4>>2]=k>>31;b=b+(j+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}E[j+352|0]=0;md(a,11,j+32|0,j+128|0,f,1,j+352|0,g,0,h,i);break a}if((Dc(a,j+124|0,i)|0)>0){break a}w=G[j+124>>2];b:{if(!w){r=1;na=2;p=1;o=1;break b}k=b<<2;r=G[k+f>>2];p=G[e+k>>2];o=G[d+k>>2]}if(h){G[h>>2]=0}G[j+352>>2]=1;G[j+356>>2]=1;k=1;G[j+128>>2]=1;G[j+132>>2]=0;G[j+304>>2]=1;G[j+308>>2]=1;G[j+256>>2]=1;G[j+260>>2]=1;G[j+136>>2]=1;G[j+140>>2]=0;G[j+208>>2]=1;G[j+212>>2]=1;G[j+360>>2]=1;G[j+144>>2]=1;G[j+148>>2]=0;G[j+312>>2]=1;G[j+316>>2]=1;G[j+264>>2]=1;G[j+268>>2]=1;G[j+152>>2]=1;G[j+156>>2]=0;G[j+216>>2]=1;G[j+220>>2]=1;G[j+364>>2]=1;G[j+368>>2]=1;G[j+320>>2]=1;G[j+272>>2]=1;G[j+160>>2]=1;G[j+164>>2]=0;G[j+224>>2]=1;G[j+372>>2]=1;G[j+376>>2]=1;G[j+168>>2]=1;G[j+172>>2]=0;G[j+324>>2]=1;G[j+328>>2]=1;G[j+276>>2]=1;G[j+280>>2]=1;G[j+176>>2]=1;G[j+180>>2]=0;G[j+228>>2]=1;G[j+232>>2]=1;G[j+184>>2]=1;G[j+188>>2]=0;G[j+380>>2]=1;G[j+384>>2]=1;G[j+332>>2]=1;G[j+336>>2]=1;G[j+284>>2]=1;G[j+288>>2]=1;G[j+192>>2]=1;G[j+196>>2]=0;G[j+236>>2]=1;G[j+240>>2]=1;c:{while(1){m=q<<2;t=G[m+e>>2];s=G[d+m>>2];d:{if((t|0)>=(s|0)){v=G[m+(j+208|0)>>2];break d}if(w){break c}G[m+(j+208|0)>>2]=-1;v=-1}G[m+(j+304|0)>>2]=t;G[m+(j+352|0)>>2]=s;G[m+(j+256|0)>>2]=G[f+m>>2];x=j+128|0;t=q+1|0;s=x+(t<<3)|0;m=G[c+m>>2];m=Au(k,n,m,m>>31);G[s>>2]=m;P=s;s=Ia;G[P+4>>2]=s;q=x+(q<<3)|0;Db=q,Eb=Au(k,n,v,v>>31),G[Db>>2]=Eb;G[q+4>>2]=Ia;k=m;n=s;q=t;if((q|0)!=(b|0)){continue}break}d=(j+128|0)+(b<<3)|0;e=G[d>>2];k=e;e=G[(j+208|0)+(b<<2)>>2];Db=d,Eb=Au(k,G[d+4>>2],e,e>>31),G[Db>>2]=Eb;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){u=(p-o|0)/(r|0)|0;p=o;e=r;break e}b=G[j+208>>2];e=M(b,G[j+256>>2]);u=(M(b,G[j+304>>2]-G[j+352>>2]|0)|0)/G[f>>2]|0}if((p|0)<(o|0)){break a}F=G[j+240>>2];oa=M(F,G[j+384>>2]);b=M(F,G[j+336>>2]);if((oa|0)>(b|0)){break a}x=G[j+236>>2];pa=M(x,G[j+380>>2]);c=M(x,G[j+332>>2]);if((pa|0)>(c|0)){break a}y=G[j+232>>2];Q=M(y,G[j+376>>2]);d=M(y,G[j+328>>2]);if((Q|0)>(d|0)){break a}z=G[j+228>>2];R=M(z,G[j+372>>2]);f=M(z,G[j+324>>2]);if((R|0)>(f|0)){break a}A=G[j+224>>2];S=M(A,G[j+368>>2]);k=M(A,G[j+320>>2]);if((S|0)>(k|0)){break a}B=G[j+220>>2];T=M(B,G[j+364>>2]);n=M(B,G[j+316>>2]);if((T|0)>(n|0)){break a}C=G[j+216>>2];U=M(C,G[j+360>>2]);q=M(C,G[j+312>>2]);if((U|0)>(q|0)){break a}D=G[j+212>>2];V=M(D,G[j+356>>2]);t=M(D,G[j+308>>2]);if((V|0)>(t|0)){break a}H=u+1|0;xa=H>>31;ub=G[j+192>>2];vb=G[j+196>>2];ya=G[j+184>>2];za=G[j+188>>2];Aa=G[j+176>>2];Ba=G[j+180>>2];Ca=G[j+168>>2];Da=G[j+172>>2];Ea=G[j+160>>2];Ga=G[j+164>>2];Ha=G[j+152>>2];Ja=G[j+156>>2];Ka=G[j+144>>2];La=G[j+148>>2];Ma=G[j+136>>2];Na=G[j+140>>2];m=G[j+352>>2];W=m;Oa=m>>31;wb=p;Pa=p>>31;Qa=r;xb=r>>31;X=o;Y=o>>31;yb=b;Ra=b>>31;zb=F>>31;Ab=oa>>31;Sa=c;Z=c>>31;Ta=x>>31;Bb=pa>>31;Va=d;_=d>>31;Wa=y>>31;Xa=Q>>31;Za=f;$=f>>31;_a=z>>31;$a=R>>31;ab=k;aa=k>>31;bb=A>>31;cb=S>>31;db=n;ba=n>>31;eb=B>>31;fb=T>>31;gb=q;ca=q>>31;hb=C>>31;ib=U>>31;jb=t;da=t>>31;kb=D>>31;P=V>>31;b=G[j+288>>2];lb=b;Cb=b>>31;b=G[j+284>>2];ea=b;mb=b>>31;b=G[j+280>>2];fa=b;nb=b>>31;b=G[j+276>>2];ga=b;ob=b>>31;b=G[j+272>>2];ha=b;pb=b>>31;b=G[j+268>>2];ia=b;qb=b>>31;b=G[j+264>>2];ja=b;rb=b>>31;b=G[j+260>>2];ka=b;sb=b>>31;u=0;while(1){la=oa;qa=Ab;while(1){ma=Au(ub,vb,la-F|0,qa-((F>>>0>la>>>0)+zb|0)|0);tb=Ia;c=pa;v=c;d=Bb;w=d;f:{if(h){while(1){I=Au(ya,za,c-x|0,d-((c>>>0>>0)+Ta|0)|0);ra=Ia;f=Q;o=Xa;while(1){J=Au(Aa,Ba,f-y|0,o-((f>>>0>>0)+Wa|0)|0);sa=Ia;p=R;r=$a;while(1){K=Au(Ca,Da,p-z|0,r-((p>>>0>>0)+_a|0)|0);ta=Ia;q=S;t=cb;while(1){L=Au(Ea,Ga,q-A|0,t-((q>>>0>>0)+bb|0)|0);ua=Ia;v=T;w=fb;while(1){N=Au(Ha,Ja,v-B|0,w-((v>>>0>>0)+eb|0)|0);va=Ia;m=U;s=ib;while(1){O=Au(Ka,La,m-C|0,s-((m>>>0>>0)+hb|0)|0);wa=Ia;k=V;n=P;while(1){l=Au(Ma,Na,k-D|0,n-((k>>>0>>0)+kb|0)|0)+W|0;b=Oa+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+O|0;b=b+wa|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+ma|0;b=b+tb|0;if((Re(a,na,X,Y,l,l>>>0>>0?b+1|0:b,H,xa,e,1,0,g+u|0,j+123|0,j+32|0,i)|0)>0){break a}if(G[j+32>>2]){G[h>>2]=1}u=u+H|0;b=n+sb|0;k=k+ka|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=jb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=s+rb|0;k=m+ja|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=gb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=w+qb|0;k=v+ia|0;b=k>>>0>>0?b+1|0:b;v=k;w=b;if(k>>>0<=db>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=t+pb|0;k=q+ha|0;b=k>>>0>>0?b+1|0:b;q=k;t=b;if(k>>>0<=ab>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=r+ob|0;k=p+ga|0;b=k>>>0>>0?b+1|0:b;p=k;r=b;if(k>>>0<=Za>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=o+nb|0;f=f+fa|0;b=f>>>0>>0?b+1|0:b;o=b;if(f>>>0<=Va>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=d+mb|0;c=c+ea|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=Sa>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break f}}while(1){I=Au(ya,za,v-x|0,w-((v>>>0>>0)+Ta|0)|0);ra=Ia;f=Q;o=Xa;while(1){J=Au(Aa,Ba,f-y|0,o-((f>>>0>>0)+Wa|0)|0);sa=Ia;p=R;r=$a;while(1){K=Au(Ca,Da,p-z|0,r-((p>>>0>>0)+_a|0)|0);ta=Ia;q=S;t=cb;while(1){L=Au(Ea,Ga,q-A|0,t-((q>>>0>>0)+bb|0)|0);ua=Ia;c=T;d=fb;while(1){N=Au(Ha,Ja,c-B|0,d-((c>>>0>>0)+eb|0)|0);va=Ia;m=U;s=ib;while(1){O=Au(Ka,La,m-C|0,s-((m>>>0>>0)+hb|0)|0);wa=Ia;k=V;n=P;while(1){l=Au(Ma,Na,k-D|0,n-((k>>>0>>0)+kb|0)|0)+W|0;b=Oa+Ia|0;b=l>>>0>>0?b+1|0:b;l=l+O|0;b=b+wa|0;b=l>>>0>>0?b+1|0:b;l=l+N|0;b=b+va|0;b=l>>>0>>0?b+1|0:b;l=l+L|0;b=b+ua|0;b=l>>>0>>0?b+1|0:b;l=l+K|0;b=b+ta|0;b=l>>>0>>0?b+1|0:b;l=l+J|0;b=b+sa|0;b=l>>>0>>0?b+1|0:b;l=l+I|0;b=b+ra|0;b=l>>>0>>0?b+1|0:b;l=l+ma|0;b=b+tb|0;if((Re(a,na,X,Y,l,l>>>0>>0?b+1|0:b,H,xa,e,1,0,g+u|0,j+123|0,j+32|0,i)|0)>0){break a}u=u+H|0;b=n+sb|0;k=k+ka|0;b=k>>>0>>0?b+1|0:b;n=b;if(k>>>0<=jb>>>0&(da|0)>=(b|0)|(b|0)<(da|0)){continue}break}b=s+rb|0;k=m+ja|0;b=k>>>0>>0?b+1|0:b;m=k;s=b;if(k>>>0<=gb>>>0&(ca|0)>=(b|0)|(b|0)<(ca|0)){continue}break}b=d+qb|0;c=c+ia|0;b=c>>>0>>0?b+1|0:b;d=b;if(c>>>0<=db>>>0&(ba|0)>=(b|0)|(b|0)<(ba|0)){continue}break}b=t+pb|0;c=q+ha|0;b=c>>>0>>0?b+1|0:b;q=c;t=b;if(c>>>0<=ab>>>0&(aa|0)>=(b|0)|(b|0)<(aa|0)){continue}break}b=r+ob|0;c=p+ga|0;b=c>>>0>>0?b+1|0:b;p=c;r=b;if(c>>>0<=Za>>>0&($|0)>=(b|0)|(b|0)<($|0)){continue}break}b=o+nb|0;c=f+fa|0;b=c>>>0>>0?b+1|0:b;f=c;o=b;if(c>>>0<=Va>>>0&(_|0)>=(b|0)|(b|0)<(_|0)){continue}break}b=w+mb|0;c=v+ea|0;b=c>>>0>>0?b+1|0:b;v=c;w=b;if(c>>>0<=Sa>>>0&(Z|0)>=(b|0)|(b|0)<(Z|0)){continue}break}}b=qa+Cb|0;c=la+lb|0;b=c>>>0>>0?b+1|0:b;la=c;qa=b;if(c>>>0<=yb>>>0&(Ra|0)>=(b|0)|(b|0)<(Ra|0)){continue}break}b=Y+xb|0;c=X+Qa|0;b=c>>>0>>0?b+1|0:b;X=c;Y=b;if(c>>>0<=wb>>>0&(Pa|0)>=(b|0)|(b|0)<(Pa|0)){continue}break}break a}G[j+16>>2]=q+1;a=j+32|0;Ya(a,81,27239,j+16|0);Ua(a);G[i>>2]=321}Fa=j+400|0}function $n(a,b){var 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;d=Fa-256|0;Fa=d;a:{if(G[b>>2]>0){break a}k=a;q=d+224|0;j=d+216|0;s=d+236|0;e=Fa-144|0;Fa=e;l=b;b:{if(G[b>>2]>0){break b}a=G[k>>2];c:{if((a|0)!=G[G[k+4>>2]+76>>2]){mb(k,a+1|0,0,l);break c}if((Rb(k,l)|0)>0){break b}}if(s){G[s>>2]=1}if(q){G[q>>2]=0;G[q+4>>2]=0}if(j){G[j>>2]=0;G[j+4>>2]=0}b=G[k+4>>2];if(G[b+80>>2]!=2){break b}g=G[b+984>>2];a=G[b+988>>2];if(!(g|a)){break b}d:{if((a|0)>=0&g>>>0>=2147483648|(a|0)>0){tb(5,52964);break d}o=lb(1,g);if(o){e:{if(G[b+936>>2]<=0){break e}c=g;i=c>>31;t=c;p=i;a=1;while(1){if(G[l>>2]>0){break e}h=a;qk(k,a,e+124|0,e+136|0,e+128|0,l);b=G[e+124>>2];f:{if((b|0)>0){f=G[k+4>>2];break f}m=1;i=0;f=G[k+4>>2];c=f;a=G[c+956>>2];if(!G[c+952>>2]&(a|0)<=0|(a|0)<0){break f}v=(0-b>>>0)/10|0;while(1){Le(k,h,m,i,e+112|0,e+104|0,l);a=G[e+112>>2];c=G[e+124>>2]==-1?(a+7|0)/8|0:M(a,v);a=G[e+104>>2];g:{h:{b=G[e+108>>2];if((b|0)<0){break h}b=(c>>31)+b|0;f=a+c|0;b=f>>>0>>0?b+1|0:b;if(f>>>0>t>>>0&(b|0)>=(p|0)|(b|0)>(p|0)){break h}if((c|0)<=0){break g}b=a;r=0;f=0;if(c-1>>>0>=3){u=c&-4;a=0;while(1){n=o+(b+f|0)|0;E[n|0]=H[n|0]+1;n=o+(b+(f|1)|0)|0;E[n|0]=H[n|0]+1;n=o+(b+(f|2)|0)|0;E[n|0]=H[n|0]+1;n=o+(b+(f|3)|0)|0;E[n|0]=H[n|0]+1;f=f+4|0;a=a+4|0;if((u|0)!=(a|0)){continue}break}}a=c&3;if(!a){break g}while(1){c=o+(b+f|0)|0;E[c|0]=H[c|0]+1;f=f+1|0;r=r+1|0;if((a|0)!=(r|0)){continue}break}break g}if(s){G[s>>2]=0}G[e+4>>2]=h;G[e>>2]=m;a=e+16|0;Ya(a,81,5800,e);tb(5,a)}c=i;a=m+1|0;c=a?c:c+1|0;m=a;f=G[k+4>>2];b=f;r=G[b+952>>2];i=c;b=G[b+956>>2];if((c|0)<=(b|0)&a>>>0<=r>>>0|(b|0)>(c|0)){continue}break}}a=h+1|0;if((h|0)>2]){continue}break}}i:{if((g|0)<=0){m=0;i=0;h=0;g=0;break i}p=g&1;j:{if((g|0)==1){f=0;h=0;g=0;m=0;i=0;break j}s=g&-2;f=0;h=0;g=0;m=0;i=0;a=0;while(1){b=h;t=E[f+o|0];h=(t|0)>1;c=b+h|0;b=g;b=c>>>0>>0?b+1|0:b;g=c;r=E[o+(f|1)|0];c=c+((r|0)>1)|0;h=c;g=c>>>0>>0?b+1|0:b;b=m;m=!(t&255);b=b+m|0;c=i;c=b>>>0>>0?c+1|0:c;m=b;b=b+!(r&255)|0;i=b>>>0>>0?c+1|0:c;m=b;f=f+2|0;a=a+2|0;if((s|0)!=(a|0)){continue}break}}if(!p){break i}b=g;c=E[f+o|0];f=(c|0)>1;a=f+h|0;h=a;g=a>>>0>>0?b+1|0:b;b=i;c=!(c&255);a=c+m|0;m=a;i=a>>>0>>0?b+1|0:b}if(q){G[q>>2]=m;G[q+4>>2]=i}if(j){G[j>>2]=h;G[j+4>>2]=g}Wa(o);break b}a=H[13452]|H[13453]<<8|(H[13454]<<16|H[13455]<<24);E[e+55|0]=a;E[e+56|0]=a>>>8;E[e+57|0]=a>>>16;E[e+58|0]=a>>>24;a=H[13449]|H[13450]<<8|(H[13451]<<16|H[13452]<<24);G[e+48>>2]=H[13445]|H[13446]<<8|(H[13447]<<16|H[13448]<<24);G[e+52>>2]=a;a=H[13441]|H[13442]<<8|(H[13443]<<16|H[13444]<<24);G[e+40>>2]=H[13437]|H[13438]<<8|(H[13439]<<16|H[13440]<<24);G[e+44>>2]=a;a=H[13433]|H[13434]<<8|(H[13435]<<16|H[13436]<<24);G[e+32>>2]=H[13429]|H[13430]<<8|(H[13431]<<16|H[13432]<<24);G[e+36>>2]=a;a=H[13425]|H[13426]<<8|(H[13427]<<16|H[13428]<<24);G[e+24>>2]=H[13421]|H[13422]<<8|(H[13423]<<16|H[13424]<<24);G[e+28>>2]=a;a=H[13417]|H[13418]<<8|(H[13419]<<16|H[13420]<<24);G[e+16>>2]=H[13413]|H[13414]<<8|(H[13415]<<16|H[13416]<<24);G[e+20>>2]=a;tb(5,e+16|0)}G[l>>2]=113}Fa=e+144|0;if(!G[d+236>>2]){G[l>>2]=264;break a}a=G[k+4>>2];k:{if(G[a+80>>2]!=2|!(G[a+984>>2]|G[a+988>>2])|(!(G[d+224>>2]|G[d+216>>2]|(G[d+228>>2]|G[d+220>>2]))|G[l>>2]>0)){break k}if(sd(d+244|0,21808,l)){a=H[13497]|H[13498]<<8|(H[13499]<<16|H[13500]<<24);b=H[13493]|H[13494]<<8|(H[13495]<<16|H[13496]<<24);E[d+53|0]=b;E[d+54|0]=b>>>8;E[d+55|0]=b>>>16;E[d+56|0]=b>>>24;E[d+57|0]=a;E[d+58|0]=a>>>8;E[d+59|0]=a>>>16;E[d+60|0]=a>>>24;a=H[13492]|H[13493]<<8|(H[13494]<<16|H[13495]<<24);G[d+48>>2]=H[13488]|H[13489]<<8|(H[13490]<<16|H[13491]<<24);G[d+52>>2]=a;a=H[13484]|H[13485]<<8|(H[13486]<<16|H[13487]<<24);G[d+40>>2]=H[13480]|H[13481]<<8|(H[13482]<<16|H[13483]<<24);G[d+44>>2]=a;a=H[13476]|H[13477]<<8|(H[13478]<<16|H[13479]<<24);G[d+32>>2]=H[13472]|H[13473]<<8|(H[13474]<<16|H[13475]<<24);G[d+36>>2]=a;a=H[13468]|H[13469]<<8|(H[13470]<<16|H[13471]<<24);G[d+24>>2]=H[13464]|H[13465]<<8|(H[13466]<<16|H[13467]<<24);G[d+28>>2]=a;a=H[13460]|H[13461]<<8|(H[13462]<<16|H[13463]<<24);G[d+16>>2]=H[13456]|H[13457]<<8|(H[13458]<<16|H[13459]<<24);G[d+20>>2]=a;tb(5,d+16|0);break k}if(ne(k,G[d+244>>2],l)){F[d+48>>1]=H[13533]|H[13534]<<8;a=H[13529]|H[13530]<<8|(H[13531]<<16|H[13532]<<24);G[d+40>>2]=H[13525]|H[13526]<<8|(H[13527]<<16|H[13528]<<24);G[d+44>>2]=a;a=H[13521]|H[13522]<<8|(H[13523]<<16|H[13524]<<24);G[d+32>>2]=H[13517]|H[13518]<<8|(H[13519]<<16|H[13520]<<24);G[d+36>>2]=a;a=H[13513]|H[13514]<<8|(H[13515]<<16|H[13516]<<24);G[d+24>>2]=H[13509]|H[13510]<<8|(H[13511]<<16|H[13512]<<24);G[d+28>>2]=a;a=H[13505]|H[13506]<<8|(H[13507]<<16|H[13508]<<24);G[d+16>>2]=H[13501]|H[13502]<<8|(H[13503]<<16|H[13504]<<24);G[d+20>>2]=a;tb(5,d+16|0);Qb(G[d+244>>2],l);break k}f=1e4;a=ab(1e4);if(!a){a=H[13409]|H[13410]<<8|(H[13411]<<16|H[13412]<<24);E[d+55|0]=a;E[d+56|0]=a>>>8;E[d+57|0]=a>>>16;E[d+58|0]=a>>>24;a=H[13406]|H[13407]<<8|(H[13408]<<16|H[13409]<<24);G[d+48>>2]=H[13402]|H[13403]<<8|(H[13404]<<16|H[13405]<<24);G[d+52>>2]=a;a=H[13398]|H[13399]<<8|(H[13400]<<16|H[13401]<<24);G[d+40>>2]=H[13394]|H[13395]<<8|(H[13396]<<16|H[13397]<<24);G[d+44>>2]=a;a=H[13390]|H[13391]<<8|(H[13392]<<16|H[13393]<<24);G[d+32>>2]=H[13386]|H[13387]<<8|(H[13388]<<16|H[13389]<<24);G[d+36>>2]=a;a=H[13382]|H[13383]<<8|(H[13384]<<16|H[13385]<<24);G[d+24>>2]=H[13378]|H[13379]<<8|(H[13380]<<16|H[13381]<<24);G[d+28>>2]=a;a=H[13374]|H[13375]<<8|(H[13376]<<16|H[13377]<<24);G[d+16>>2]=H[13370]|H[13371]<<8|(H[13372]<<16|H[13373]<<24);G[d+20>>2]=a;tb(5,d+16|0);Qb(G[d+244>>2],l);G[l>>2]=113;break a}c=G[k+4>>2];b=c;s=G[b+984>>2];r=G[b+988>>2];b=G[G[d+244>>2]+4>>2];h=G[b+976>>2];p=G[b+980>>2];i=G[b+128>>2];q=G[b+132>>2];G[c+984>>2]=0;G[c+988>>2]=0;e=G[c+128>>2];g=e+G[c+976>>2]|0;b=G[c+980>>2]+G[c+132>>2]|0;b=e>>>0>g>>>0?b+1|0:b;e=g;o=b;b=1;l:{if(G[c+936>>2]<=0){break l}c=p+q|0;g=i+h|0;c=g>>>0>>0?c+1|0:c;t=g;q=c;while(1){if(G[l>>2]>0){break l}p=b;qk(G[d+244>>2],b,d+240|0,d+112|0,d+248|0,l);m:{h=G[d+240>>2];if((h|0)>0){j=G[k+4>>2];break m}m=1;i=0;b=f;g=a;j=G[k+4>>2];c=G[j+956>>2];if(!G[j+952>>2]&(c|0)<=0|(c|0)<0){break m}v=(0-h>>>0)/10|0;while(1){Le(G[d+244>>2],p,m,i,d+208|0,d+200|0,l);a=G[d+208>>2];h=G[d+240>>2]==-1?(a+7|0)/8|0:M(a,v);n:{if((h|0)>(b|0)){a=ub(g,h);f=h;if(a){break n}G[l>>2]=113}a=g;f=b}c=G[k+4>>2];o:{if(G[c+48>>2]){g=h>>31;break o}u=G[c+988>>2];g=h>>31;b=g+o|0;j=e+h|0;b=j>>>0>>0?b+1|0:b;n=j;j=j+G[c+984>>2]|0;b=b+u|0;b=j>>>0>>0?b+1|0:b;c=G[c+96>>2]+(G[c+76>>2]<<3)|0;u=G[c+8>>2];n=G[c+12>>2];c=n;if(j>>>0<=u>>>0&(c|0)>=(b|0)|(b|0)<(c|0)){break o}b=(n^-1)+b|0;c=j;j=u^-1;c=c+j|0;b=Bu(c,c>>>0>>0?b+1|0:b,2880,0)+1|0;if((Bf(k,b,1,l)|0)<=0){break o}G[d>>2]=b;b=d+16|0;Ya(b,81,42616,d);tb(5,b)}c=G[d+204>>2]+q|0;j=G[d+200>>2];b=j+t|0;Jb(G[d+244>>2],b,b>>>0>>0?c+1|0:c,0,l);ic(G[d+244>>2],h,g,a,l);c=G[k+4>>2];b=e+G[c+984>>2]|0;c=o+G[c+988>>2]|0;Jb(k,b,b>>>0>>0?c+1|0:c,1,l);Wb(k,h,g,a,l);b=G[k+4>>2];ph(k,p,m,i,G[d+208>>2],G[d+212>>2],G[b+984>>2],G[b+988>>2],l);j=G[k+4>>2];b=g+G[j+988>>2]|0;c=h+G[j+984>>2]|0;b=c>>>0>>0?b+1|0:b;G[j+984>>2]=c;G[j+988>>2]=b;if(G[l>>2]<=0){b=f;g=a;c=i;i=m+1|0;c=i?c:c+1|0;m=i;i=c;c=G[j+956>>2];if(m>>>0>J[j+952>>2]&(i|0)>=(c|0)|(c|0)<(i|0)){break m}continue}break}Wa(a);Qb(G[d+244>>2],l);break k}b=p+1|0;if((p|0)>2]){continue}break}}Wa(a);Qb(G[d+244>>2],l);b=G[k+4>>2];i=(G[b+76>>2]<<3)+G[b+96>>2]|0;a=G[i+8>>2];g=G[i+12>>2];f=G[b+984>>2];c=f+e|0;h=G[b+988>>2];i=h+o|0;i=c>>>0>>0?i+1|0:i;a=Bu(a-c|0,g-(i+(a>>>0>>0)|0)|0,2880,0);if((a|0)>0){G[b+984>>2]=s;G[b+988>>2]=r;oh(k,a,l);a=G[k+4>>2];G[a+984>>2]=f;G[a+988>>2]=h}ef(k,2,l);_f(k,33303,d+248|0,d+112|0,l);a=G[k+4>>2];b=G[a+984>>2];a=G[a+988>>2];if((b|0)!=G[d+248>>2]|(a|0)!=G[d+252>>2]){Ad(k,33303,b,a,d+112|0,l)}Rb(k,l)}}Fa=d+256|0}function Ff(a,b,c,d,e,f,g,h,i,j){var 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;n=Fa-29104|0;Fa=n;l=G[j>>2];a:{if((l|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,n+29032|0,n+29024|0,n+28992|0,n+29088|0,n+29100|0,n+29096|0,n+29064|0,n+29056|0,n+29084|0,n+29072|0,n+29048|0,n+29092|0,n+29040|0,n+28832|0,j)|0)>0){break c}c=G[n+29096>>2];x=c;y=c>>31;if(G[n+29100>>2]==16){Ne(n+28992|0,n+28960|0)}if(!(g|h)){l=G[j>>2];break b}e=0;f=0;c=0;d=0;while(1){p=G[n+29072>>2];q=G[n+29076>>2];o=G[n+29068>>2];k=G[n+29064>>2];l=Au(G[n+29048>>2],G[n+29052>>2],c,d);k=k+l|0;o=Ia+o|0;o=l>>>0>k>>>0?o+1|0:o;u=k;l=G[n+29056>>2];r=G[n+29060>>2];k=G[n+29084>>2];t=Au(l,r,k,k>>31);u=u+t|0;k=Ia+o|0;Jb(a,u,t>>>0>u>>>0?k+1|0:k,1,j);k=g>>>0>>0&(h|0)<=(y|0)|(h|0)<(y|0)?g:x;o=k>>31;u=k;k=q-((l>>>0>p>>>0)+r|0)|0;p=p-l|0;l=p;p=(o|0)<=(k|0)&p>>>0>u>>>0|(o|0)<(k|0);u=p?u:l;o=u;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{k=G[n+29100>>2];switch(k-11|0){case 10:break h;case 30:break i;case 31:break j;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break k;case 5:break l;case 0:break o;default:break p}}q:{switch(k-81|0){case 0:break m;case 1:break q;default:break k}}k=(e<<3)+i|0;m=L[n+29032>>3];s=L[n+29024>>3];if(m==1&s==0){break n}if((o|0)<=0){break e}l=0;if((o|0)!=1){t=o&-2;q=0;while(1){r=l<<3;p=n+32|0;L[r+p>>3]=(L[k+r>>3]-s)/m;r=r|8;L[r+p>>3]=(L[k+r>>3]-s)/m;l=l+2|0;q=q+2|0;if((t|0)!=(q|0)){continue}break}}if(!(o&1)){break e}l=l<<3;L[l+(n+32|0)>>3]=(L[l+k>>3]-s)/m;break e}q=(e<<3)+i|0;s=L[n+29032>>3];v=L[n+29024>>3];if(s==1&v==0){break g}l=0;if((o|0)<=0){break f}while(1){p=(n+32|0)+l|0;r:{s:{m=(L[q+(l<<3)>>3]-v)/s;if(m<-.49){G[j>>2]=-11;break s}if(m>255.49){G[j>>2]=-11;k=255;break r}m=m+.5;if(!(m<4294967296&m>=0)){break s}k=~~m>>>0;break r}k=0}E[p|0]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}break f}bb(n+32|0,k,o<<3);break e}t=(e<<3)+i|0;q=n+32|0;v=L[n+29032>>3];k=v!=1;s=L[n+29024>>3];t:{if(!(k|s!=0x8000000000000000)){if((o|0)<=0){break t}l=0;while(1){p=l<<3;m=L[p+t>>3];u:{if(m<-.49){G[j>>2]=-11;k=0;r=-2147483648;break u}if(m>0x10000000000000000){G[j>>2]=-11;k=-1;r=2147483647;break u}v:{if(O(m)<0x8000000000000000){r=O(m)>=1?~~(m>0?Q(S(m*2.3283064365386963e-10),4294967295):T((m-+(~~m>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~m>>>0;break v}r=-2147483648;k=0}r=r^-2147483648}p=q+p|0;G[p>>2]=k;G[p+4>>2]=r;l=l+1|0;if((o|0)!=(l|0)){continue}break}break t}if(!(!k&s==0)){l=0;if((o|0)<=0){break t}while(1){w:{x:{p=l<<3;m=(L[p+t>>3]-s)/v;if(m<-0x8000000000000000){G[j>>2]=-11;break x}if(m>0x8000000000000000){G[j>>2]=-11;r=2147483647;k=-1;break w}if(m>=0){m=m+.5;if(!(O(m)<0x8000000000000000)){break x}r=O(m)>=1?~~(m>0?Q(S(m*2.3283064365386963e-10),4294967295):T((m-+(~~m>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~m>>>0;break w}m=m+-.5;if(!(O(m)<0x8000000000000000)){break x}r=O(m)>=1?~~(m>0?Q(S(m*2.3283064365386963e-10),4294967295):T((m-+(~~m>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~m>>>0;break w}r=-2147483648;k=0}p=q+p|0;G[p>>2]=k;G[p+4>>2]=r;l=l+1|0;if((o|0)!=(l|0)){continue}break}break t}if((o|0)<=0){break t}l=0;while(1){y:{z:{p=l<<3;m=L[p+t>>3];if(m<-0x8000000000000000){G[j>>2]=-11;break z}if(m>0x8000000000000000){G[j>>2]=-11;r=2147483647;k=-1;break y}if(!(O(m)<0x8000000000000000)){break z}r=O(m)>=1?~~(m>0?Q(S(m*2.3283064365386963e-10),4294967295):T((m-+(~~m>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~m>>>0;break y}r=-2147483648;k=0}p=q+p|0;G[p>>2]=k;G[p+4>>2]=r;l=l+1|0;if((o|0)!=(l|0)){continue}break}}_c(a,o,G[n+29084>>2],q,j);break d}if(H[n+28961|0]==115){break k}t=(e<<3)+i|0;l=o;p=n+28960|0;w=G[n+29088>>2];k=n+32|0;q=0;r=Fa-32|0;Fa=r;m=L[n+29032>>3];s=L[n+29024>>3];A:{if(!(m==1&s==0)){if((l|0)<=0){break A}o=k;while(1){L[r+16>>3]=(L[t+(q<<3)>>3]-s)/m;Eb(o,p,r+16|0);o=o+w|0;if(H[o|0]){G[j>>2]=-11}q=q+1|0;if((l|0)!=(q|0)){continue}break}break A}if((l|0)<=0){break A}o=k;while(1){L[r>>3]=L[t+(q<<3)>>3];Eb(o,p,r);o=o+w|0;if(H[o|0]){G[j>>2]=-11}q=q+1|0;if((l|0)!=(q|0)){continue}break}}q=jb(k,44);if(q){while(1){E[q|0]=46;q=jb(q,44);if(q){continue}break}}Fa=r+32|0;o=G[n+29084>>2];k=G[n+29088>>2];if((o|0)==(k|0)){o=M(l,o);Wb(a,o,o>>31,n+32|0,j);break d}wd(a,k,l,o-k|0,n+32|0,j);break d}G[n>>2]=b;G[n+4>>2]=n+28992;a=n+28864|0;Ya(a,81,8813,n);Ua(a);if(G[n+29092>>2]==1){l=311;G[j>>2]=311;break a}l=312;G[j>>2]=312;break a}k=(e<<3)+i|0;m=L[n+29032>>3];s=L[n+29024>>3];B:{if(!(m==1&s==0)){if((o|0)<=0){break B}l=0;if((o|0)!=1){q=o&-2;r=0;while(1){t=n+32|0;K[t+(l<<2)>>2]=(L[k+(l<<3)>>3]-s)/m;p=l|1;K[t+(p<<2)>>2]=(L[k+(p<<3)>>3]-s)/m;l=l+2|0;r=r+2|0;if((q|0)!=(r|0)){continue}break}}if(!(o&1)){break B}K[(n+32|0)+(l<<2)>>2]=(L[k+(l<<3)>>3]-s)/m;break B}if((o|0)<=0){break B}r=0;l=0;if(o-1>>>0>=3){p=o&-4;q=0;while(1){t=n+32|0;K[t+(l<<2)>>2]=L[k+(l<<3)>>3];w=l|1;K[t+(w<<2)>>2]=L[k+(w<<3)>>3];w=l|2;K[t+(w<<2)>>2]=L[k+(w<<3)>>3];w=t;t=l|3;K[w+(t<<2)>>2]=L[k+(t<<3)>>3];l=l+4|0;q=q+4|0;if((p|0)!=(q|0)){continue}break}}q=o&3;if(!q){break B}while(1){K[(n+32|0)+(l<<2)>>2]=L[k+(l<<3)>>3];l=l+1|0;r=r+1|0;if((q|0)!=(r|0)){continue}break}}$c(a,o,G[n+29084>>2],n+32|0,j);break d}q=(e<<3)+i|0;s=L[n+29032>>3];v=L[n+29024>>3];C:{if(!(s==1&v==0)){l=0;if((o|0)<=0){break C}while(1){p=(n+32|0)+(l<<2)|0;D:{E:{m=(L[q+(l<<3)>>3]-v)/s;if(m<-2147483648.49){G[j>>2]=-11;break E}if(m>2147483647.49){G[j>>2]=-11;k=2147483647;break D}if(m>=0){m=m+.5;if(!(O(m)<2147483648)){break E}k=~~m;break D}m=m+-.5;if(!(O(m)<2147483648)){break E}k=~~m;break D}k=-2147483648}G[p>>2]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}break C}l=0;if((o|0)<=0){break C}while(1){p=(n+32|0)+(l<<2)|0;F:{G:{m=L[q+(l<<3)>>3];if(m<-2147483648.49){G[j>>2]=-11;break G}if(m>2147483647.49){G[j>>2]=-11;k=2147483647;break F}if(!(O(m)<2147483648)){break G}k=~~m;break F}k=-2147483648}G[p>>2]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}}$c(a,o,G[n+29084>>2],n+32|0,j);break d}q=(e<<3)+i|0;s=L[n+29032>>3];v=L[n+29024>>3];H:{if(!(s==1&v==0)){l=0;if((o|0)<=0){break H}while(1){p=(n+32|0)+(l<<1)|0;m=(L[q+(l<<3)>>3]-v)/s;I:{if(m<-32768.49){G[j>>2]=-11;k=32768;break I}if(m>32767.49){G[j>>2]=-11;k=32767;break I}J:{if(m>=0){m=m+.5;if(!(O(m)<2147483648)){break J}k=~~m;break I}m=m+-.5;if(!(O(m)<2147483648)){break J}k=~~m;break I}k=-2147483648}F[p>>1]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}break H}l=0;if((o|0)<=0){break H}while(1){p=(n+32|0)+(l<<1)|0;m=L[q+(l<<3)>>3];K:{if(m<-32768.49){G[j>>2]=-11;k=32768;break K}if(m>32767.49){G[j>>2]=-11;k=32767;break K}k=~~m;if(O(m)<2147483648){break K}k=-2147483648}F[p>>1]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}}Oe(a,o,G[n+29084>>2],n+32|0,j);break d}l=0;if((o|0)<=0){break f}while(1){p=(n+32|0)+l|0;L:{M:{m=L[q+(l<<3)>>3];if(m<-.49){G[j>>2]=-11;break M}if(m>255.49){G[j>>2]=-11;k=255;break L}if(!(m<4294967296&m>=0)){break M}k=~~m>>>0;break L}k=0}E[p|0]=k;l=l+1|0;if((o|0)!=(l|0)){continue}break}}we(a,o,G[n+29084>>2],n+32|0,j);break d}_c(a,o,G[n+29084>>2],n+32|0,j)}l=G[j>>2];if((l|0)>0){k=f;a=e+1|0;k=a?k:k+1|0;L[n+16>>3]=+(a>>>0)+ +(k|0)*4294967296;o=u;k=o>>31;a=e+o|0;k=f+k|0;L[n+24>>3]=+(a>>>0)+ +((a>>>0>>0?k+1|0:k)|0)*4294967296;a=n+28864|0;Ya(a,81,47586,n+16|0);Ua(a);break c}o=u;k=o>>31;p=k;h=h-(k+(g>>>0>>0)|0)|0;g=g-o|0;if(!(h|g)){break b}k=f+p|0;e=e+o|0;k=e>>>0>>0?k+1|0:k;f=k;k=p+G[n+29060>>2]|0;l=o+G[n+29056>>2]|0;k=l>>>0>>0?k+1|0:k;G[n+29056>>2]=l;G[n+29060>>2]=k;if(G[n+29072>>2]!=(l|0)|G[n+29076>>2]!=(k|0)){continue}G[n+29056>>2]=0;G[n+29060>>2]=0;o=d;c=c+1|0;o=c?o:o+1|0;d=o;continue}}l=G[j>>2];break a}if((l|0)!=-11){break a}Ua(44927);l=412;G[j>>2]=412}Fa=n+29104|0;return l}function Kg(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=N(0),t=0,u=0,v=0,w=0,x=0,y=0,z=0;m=Fa-29104|0;Fa=m;l=G[j>>2];a:{if((l|0)>0){break a}b:{c:{if((yc(a,b,c,d,e,f,g,h,1,m+29032|0,m+29024|0,m+28992|0,m+29088|0,m+29100|0,m+29096|0,m+29064|0,m+29056|0,m+29084|0,m+29072|0,m+29048|0,m+29092|0,m+29040|0,m+28832|0,j)|0)>0){break c}c=G[m+29096>>2];y=c;z=c>>31;if(G[m+29100>>2]==16){Ne(m+28992|0,m+28960|0)}if(!(g|h)){l=G[j>>2];break b}e=0;f=0;c=0;d=0;while(1){r=G[m+29072>>2];q=G[m+29076>>2];n=G[m+29068>>2];k=G[m+29064>>2];l=Au(G[m+29048>>2],G[m+29052>>2],c,d);k=k+l|0;n=Ia+n|0;n=l>>>0>k>>>0?n+1|0:n;v=k;l=G[m+29056>>2];p=G[m+29060>>2];k=G[m+29084>>2];u=Au(l,p,k,k>>31);v=v+u|0;k=Ia+n|0;Jb(a,v,u>>>0>v>>>0?k+1|0:k,1,j);k=g>>>0>>0&(h|0)<=(z|0)|(h|0)<(z|0)?g:y;n=k>>31;v=k;k=q-((l>>>0>r>>>0)+p|0)|0;r=r-l|0;l=r;r=(n|0)<=(k|0)&r>>>0>v>>>0|(n|0)<(k|0);v=r?v:l;n=v;d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{k=G[m+29100>>2];switch(k-11|0){case 10:break h;case 30:break i;case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break k;case 5:break l;case 0:break o;case 31:break p;default:break q}}switch(k-81|0){case 1:break j;case 0:break m;default:break k}}k=(e<<2)+i|0;o=L[m+29032>>3];t=L[m+29024>>3];if(o==1&t==0){break n}if((n|0)<=0){break e}l=0;if((n|0)!=1){u=n&-2;q=0;while(1){p=l<<2;r=m+32|0;K[p+r>>2]=(+K[k+p>>2]-t)/o;p=p|4;K[p+r>>2]=(+K[k+p>>2]-t)/o;l=l+2|0;q=q+2|0;if((u|0)!=(q|0)){continue}break}}if(!(n&1)){break e}l=l<<2;K[l+(m+32|0)>>2]=(+K[l+k>>2]-t)/o;break e}q=(e<<2)+i|0;t=L[m+29032>>3];w=L[m+29024>>3];if(t==1&w==0){break g}l=0;if((n|0)<=0){break f}while(1){r=(m+32|0)+l|0;r:{s:{o=(+K[q+(l<<2)>>2]-w)/t;if(o<-.49){G[j>>2]=-11;break s}if(o>255.49){G[j>>2]=-11;k=255;break r}o=o+.5;if(!(o<4294967296&o>=0)){break s}k=~~o>>>0;break r}k=0}E[r|0]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}break f}bb(m+32|0,k,n<<2);break e}u=(e<<2)+i|0;q=m+32|0;w=L[m+29032>>3];k=w!=1;t=L[m+29024>>3];t:{if(!(k|t!=0x8000000000000000)){if((n|0)<=0){break t}l=0;while(1){r=q+(l<<3)|0;s=K[u+(l<<2)>>2];u:{if(+s<-.49){G[j>>2]=-11;k=0;p=-2147483648;break u}if(s>N(0x10000000000000000)){G[j>>2]=-11;k=-1;p=2147483647;break u}v:{if(N(O(s))=N(1)?~~(s>N(0)?N(Q(N(S(N(s*N(2.3283064365386963e-10)))),N(4294967296))):N(T(N(N(s-N(~~s>>>0>>>0))*N(2.3283064365386963e-10)))))>>>0:0;k=~~s>>>0;break v}p=-2147483648;k=0}p=p^-2147483648}G[r>>2]=k;G[r+4>>2]=p;l=l+1|0;if((n|0)!=(l|0)){continue}break}break t}if(!(!k&t==0)){l=0;if((n|0)<=0){break t}while(1){r=q+(l<<3)|0;w:{x:{o=(+K[u+(l<<2)>>2]-t)/w;if(o<-0x8000000000000000){G[j>>2]=-11;break x}if(o>0x8000000000000000){G[j>>2]=-11;p=2147483647;k=-1;break w}if(o>=0){o=o+.5;if(!(O(o)<0x8000000000000000)){break x}p=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~o>>>0;break w}o=o+-.5;if(!(O(o)<0x8000000000000000)){break x}p=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;k=~~o>>>0;break w}p=-2147483648;k=0}G[r>>2]=k;G[r+4>>2]=p;l=l+1|0;if((n|0)!=(l|0)){continue}break}break t}if((n|0)<=0){break t}l=0;while(1){r=q+(l<<3)|0;s=K[u+(l<<2)>>2];y:{if(s>2]=-11;k=0;p=-2147483648;break y}if(s>N(0x8000000000000000)){G[j>>2]=-11;k=-1;p=2147483647;break y}if(N(O(s))>31}G[r>>2]=k;G[r+4>>2]=p;l=l+1|0;if((n|0)!=(l|0)){continue}break}}_c(a,n,G[m+29084>>2],q,j);break d}if(H[m+28961|0]==115){break k}u=(e<<2)+i|0;l=n;r=m+28960|0;x=G[m+29088>>2];k=m+32|0;q=0;p=Fa-32|0;Fa=p;o=L[m+29032>>3];t=L[m+29024>>3];z:{if(!(o==1&t==0)){if((l|0)<=0){break z}n=k;while(1){L[p+16>>3]=(+K[u+(q<<2)>>2]-t)/o;Eb(n,r,p+16|0);n=n+x|0;if(H[n|0]){G[j>>2]=-11}q=q+1|0;if((l|0)!=(q|0)){continue}break}break z}if((l|0)<=0){break z}n=k;while(1){L[p>>3]=K[u+(q<<2)>>2];Eb(n,r,p);n=n+x|0;if(H[n|0]){G[j>>2]=-11}q=q+1|0;if((l|0)!=(q|0)){continue}break}}q=jb(k,44);if(q){while(1){E[q|0]=46;q=jb(q,44);if(q){continue}break}}Fa=p+32|0;n=G[m+29084>>2];k=G[m+29088>>2];if((n|0)==(k|0)){n=M(l,n);Wb(a,n,n>>31,m+32|0,j);break d}wd(a,k,l,n-k|0,m+32|0,j);break d}G[m>>2]=b;G[m+4>>2]=m+28992;a=m+28864|0;Ya(a,81,8813,m);Ua(a);if(G[m+29092>>2]==1){l=311;G[j>>2]=311;break a}l=312;G[j>>2]=312;break a}k=(e<<2)+i|0;o=L[m+29032>>3];t=L[m+29024>>3];A:{if(!(o==1&t==0)){if((n|0)<=0){break A}l=0;if((n|0)!=1){q=n&-2;p=0;while(1){u=m+32|0;L[u+(l<<3)>>3]=(+K[k+(l<<2)>>2]-t)/o;r=l|1;L[u+(r<<3)>>3]=(+K[k+(r<<2)>>2]-t)/o;l=l+2|0;p=p+2|0;if((q|0)!=(p|0)){continue}break}}if(!(n&1)){break A}L[(m+32|0)+(l<<3)>>3]=(+K[k+(l<<2)>>2]-t)/o;break A}if((n|0)<=0){break A}p=0;l=0;if(n-1>>>0>=3){r=n&-4;q=0;while(1){u=m+32|0;L[u+(l<<3)>>3]=K[k+(l<<2)>>2];x=l|1;L[u+(x<<3)>>3]=K[k+(x<<2)>>2];x=l|2;L[u+(x<<3)>>3]=K[k+(x<<2)>>2];x=u;u=l|3;L[x+(u<<3)>>3]=K[k+(u<<2)>>2];l=l+4|0;q=q+4|0;if((r|0)!=(q|0)){continue}break}}q=n&3;if(!q){break A}while(1){L[(m+32|0)+(l<<3)>>3]=K[k+(l<<2)>>2];l=l+1|0;p=p+1|0;if((q|0)!=(p|0)){continue}break}}_c(a,n,G[m+29084>>2],m+32|0,j);break d}q=(e<<2)+i|0;t=L[m+29032>>3];w=L[m+29024>>3];B:{if(!(t==1&w==0)){l=0;if((n|0)<=0){break B}while(1){C:{D:{p=l<<2;o=(+K[p+q>>2]-w)/t;if(o<-2147483648.49){G[j>>2]=-11;break D}if(o>2147483647.49){G[j>>2]=-11;k=2147483647;break C}if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break D}k=~~o;break C}o=o+-.5;if(!(O(o)<2147483648)){break D}k=~~o;break C}k=-2147483648}G[p+(m+32|0)>>2]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}break B}l=0;if((n|0)<=0){break B}while(1){E:{F:{p=l<<2;s=K[p+q>>2];o=+s;if(o<-2147483648.49){G[j>>2]=-11;break F}if(o>2147483647.49){G[j>>2]=-11;k=2147483647;break E}if(!(N(O(s))>2]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}}$c(a,n,G[m+29084>>2],m+32|0,j);break d}q=(e<<2)+i|0;t=L[m+29032>>3];w=L[m+29024>>3];G:{if(!(t==1&w==0)){l=0;if((n|0)<=0){break G}while(1){r=(m+32|0)+(l<<1)|0;o=(+K[q+(l<<2)>>2]-w)/t;H:{if(o<-32768.49){G[j>>2]=-11;k=32768;break H}if(o>32767.49){G[j>>2]=-11;k=32767;break H}I:{if(o>=0){o=o+.5;if(!(O(o)<2147483648)){break I}k=~~o;break H}o=o+-.5;if(!(O(o)<2147483648)){break I}k=~~o;break H}k=-2147483648}F[r>>1]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}break G}l=0;if((n|0)<=0){break G}while(1){r=(m+32|0)+(l<<1)|0;s=K[q+(l<<2)>>2];o=+s;J:{if(o<-32768.49){G[j>>2]=-11;k=32768;break J}if(o>32767.49){G[j>>2]=-11;k=32767;break J}k=~~s;if(N(O(s))>1]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}}Oe(a,n,G[m+29084>>2],m+32|0,j);break d}l=0;if((n|0)<=0){break f}while(1){r=(m+32|0)+l|0;K:{L:{s=K[q+(l<<2)>>2];o=+s;if(o<-.49){G[j>>2]=-11;break L}if(o>255.49){G[j>>2]=-11;k=255;break K}if(!(s=N(0))){break L}k=~~s>>>0;break K}k=0}E[r|0]=k;l=l+1|0;if((n|0)!=(l|0)){continue}break}}we(a,n,G[m+29084>>2],m+32|0,j);break d}$c(a,n,G[m+29084>>2],m+32|0,j)}l=G[j>>2];if((l|0)>0){k=f;a=e+1|0;k=a?k:k+1|0;L[m+16>>3]=+(a>>>0)+ +(k|0)*4294967296;n=v;k=n>>31;a=e+n|0;k=f+k|0;L[m+24>>3]=+(a>>>0)+ +((a>>>0>>0?k+1|0:k)|0)*4294967296;a=m+28864|0;Ya(a,81,47312,m+16|0);Ua(a);break c}n=v;k=n>>31;r=k;h=h-(k+(g>>>0>>0)|0)|0;g=g-n|0;if(!(h|g)){break b}k=f+r|0;e=e+n|0;k=e>>>0>>0?k+1|0:k;f=k;k=r+G[m+29060>>2]|0;l=n+G[m+29056>>2]|0;k=l>>>0>>0?k+1|0:k;G[m+29056>>2]=l;G[m+29060>>2]=k;if(G[m+29072>>2]!=(l|0)|G[m+29076>>2]!=(k|0)){continue}G[m+29056>>2]=0;G[m+29060>>2]=0;n=d;c=c+1|0;n=c?n:n+1|0;d=n;continue}}l=G[j>>2];break a}if((l|0)!=-11){break a}Ua(44927);l=412;G[j>>2]=412}Fa=m+29104|0;return l}function Rh(a){var 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;f=Fa-400|0;Fa=f;G[925783]=0;G[925774]=0;G[925775]=0;G[925776]=0;G[925763]=0;G[925764]=0;G[925765]=0;G[925778]=0;G[925777]=0;G[925766]=0;G[925769]=0;if(G[925767]){G[f+304>>2]=a;kb(85403,f+304|0);$a(G[29763])}while(1){c=ab(1e5);if(!c){continue}break}b=ac(a,G[925768]?49013:13287);G[925769]=b;h=-2;a:{if(!b){break a}l=G[29763];while(1){if(!vc(c,1e5,G[925769])){h=-4;break a}if(G[925767]){G[f+288>>2]=c;kb(85677,f+288|0);$a(l)}if(H[c|0]!=124){continue}break}b=Va(c)<<1;G[925766]=b;if(G[925767]){G[f+272>>2]=b;kb(85508,f+272|0);$a(l);b=G[925766]}b:{if((b|0)>1023){break b}G[925766]=1024;if(!G[925767]){break b}G[f+256>>2]=1024;kb(85445,f+256|0);$a(l)}Wa(c);lm(G[925769]);Hb(G[925769]);if(G[925767]){G[f+240>>2]=G[925766];kb(85550,f+240|0);$a(l)}b=G[925766];c:{if((b|0)<=G[925770]){d=G[925771];break c}if(G[925767]){G[f+224>>2]=b;kb(86064,f+224|0);$a(l);b=G[925766]}n=3703032,o=ub(G[925758],b),G[n>>2]=o;n=3703036,o=ub(G[925759],b),G[n>>2]=o;n=3703040,o=ub(G[925760],b),G[n>>2]=o;n=3703044,o=ub(G[925761],b),G[n>>2]=o;n=3703048,o=ub(G[925762],b),G[n>>2]=o;d=ub(G[925771],b);G[925770]=b;G[925771]=d}E[G[925758]]=0;E[G[925759]]=0;E[G[925760]]=0;E[G[925761]]=0;E[G[925762]]=0;E[d|0]=0;if(!G[925772]){G[925772]=1024;n=3703092,o=ab(4206592),G[n>>2]=o;c=0;while(1){d=0;while(1){e=M(c,4108);E[(e+G[925773]|0)+d|0]=0;E[((e+G[925773]|0)+d|0)+1024|0]=0;E[((e+G[925773]|0)+d|0)+2048|0]=0;E[((e+G[925773]|0)+d|0)+3072|0]=0;b=d|1;E[b+(e+G[925773]|0)|0]=0;E[(b+(e+G[925773]|0)|0)+1024|0]=0;E[(b+(e+G[925773]|0)|0)+2048|0]=0;E[(b+(e+G[925773]|0)|0)+3072|0]=0;d=d+2|0;if((d|0)!=1024){continue}break}b=e+G[925773]|0;G[b+4100>>2]=0;G[b+4104>>2]=0;c=c+1|0;if((c|0)!=1024){continue}break}}b=ac(a,G[925768]?49013:13287);G[925769]=b;if(!b){break a}G[925776]=-1;G[925775]=0;G[925774]=0;G[925777]=0;G[925778]=0;G[925763]=0;G[925764]=0;G[925765]=0;d:{if(!vc(G[925771],G[925766],b)){break d}while(1){if(G[925767]){G[f+208>>2]=G[925771];kb(85704,f+208|0);$a(l)}j=G[925771];b=Va(j);G[925775]=b;G[925774]=b+G[925774];b=(b+j|0)-1|0;if(H[b|0]==10){E[b|0]=0}b=(Va(j)+j|0)-1|0;if(H[b|0]==13){E[b|0]=0}b=0;e=Va(j);e:{if(!e){break e}while(1){c=H[b+j|0];if(!((c|0)!=32&(c|0)!=9)){b=b+1|0;if((e|0)!=(b|0)){continue}break e}break}if(H[j|0]!=92){break d}}b=G[925779];g=G[925777];f:{if((b|0)>(g|0)){c=G[925780];break f}i=b+1024|0;G[925779]=i;b=i<<2;c=ub(G[925780],b);G[925780]=c;h=ub(G[925781],b);G[925781]=h;e=ub(G[925782],b);G[925782]=e;b=g;if((i|0)<=(b|0)){break f}while(1){k=b<<2;n=k+c|0,o=ab(256),G[n>>2]=o;n=h+k|0,o=ab(256),G[n>>2]=o;n=e+k|0,o=ab(256),G[n>>2]=o;b=b+1|0;if((i|0)!=(b|0)){continue}break}}b=G[925778];Za(G[(b<<2)+c>>2],j);G[925778]=b+1;k=j+1|0;b=k;while(1){d=H[b|0];if(!(!d|(d|0)==61|(d|0)==32)){b=b+1|0;continue}break}while(1){c=d&255;if((c|0)==32){E[b|0]=0;d=H[b+1|0];b=b+1|0;continue}break}g:{if((c|0)!=61){break g}E[b|0]=0;while(1){e=b;b=b+1|0;if(H[e+1|0]==32){continue}break}h=Va(b);c=h-1|0;h:{if((c|0)<0){break h}while(1){h=e+h|0;if(H[h|0]!=32){break h}E[h|0]=0;h=c;c=c-1|0;if((c|0)>=0){continue}break}}if(!H[k|0]){break g}c=g<<2;Za(G[c+G[925781]>>2],k);Za(G[c+G[925782]>>2],b);G[925777]=g+1}if(vc(j,G[925766],G[925769])){continue}break}}j=G[925771];Za(G[925759],j);if(H[j|0]==124){E[j|0]=32}b=(G[925775]+G[925759]|0)-1|0;if(H[b|0]==10){E[b|0]=0}G[925783]=0;k=Va(j);i:{if((k|0)<=0){b=G[925773];G[b+4104>>2]=G[b+4100>>2]+1;break i}c=G[925772];i=0;d=0;g=0;while(1){j:{k:{l:{b=H[i+j|0];m:{if(b>>>0<=91){if((b|0)==32){break k}if((b|0)!=10){break m}break j}if((b|0)==124){break l}if((b|0)==92){break j}}E[(G[925773]+M(g,4108)|0)+d|0]=b;d=d+1|0;break k}b=G[925773]+M(g,4108)|0;G[b+4100>>2]=i;E[b+d|0]=0;b=g+1|0;G[925783]=b;if((c|0)<=(g|0)){e=c+1024|0;G[925772]=e;n=3703092,o=ub(G[925773],M(e,4108)),G[n>>2]=o;while(1){d=0;while(1){m=M(c,4108);E[(m+G[925773]|0)+d|0]=0;E[((G[925773]+m|0)+d|0)+1024|0]=0;E[((G[925773]+m|0)+d|0)+2048|0]=0;E[((G[925773]+m|0)+d|0)+3072|0]=0;h=d|1;E[h+(G[925773]+m|0)|0]=0;E[(h+(G[925773]+m|0)|0)+1024|0]=0;E[(h+(G[925773]+m|0)|0)+2048|0]=0;E[(h+(G[925773]+m|0)|0)+3072|0]=0;d=d+2|0;if((d|0)!=1024){continue}break}h=G[925773]+m|0;G[h+4100>>2]=0;G[h+4104>>2]=0;c=c+1|0;if((e|0)>(c|0)){continue}break}c=e}d=0;if(i){g=b;break k}G[925783]=g}i=i+1|0;if((k|0)!=(i|0)){continue}}break}d=1;k=G[925773];e=G[k+4100>>2];G[k+4104>>2]=e+1;if((g|0)<2){break i}b=g-1|0;h=b&3;if(g-2>>>0>=3){g=b&-4;c=0;while(1){i=k+M(d,4108)|0;b=G[i+4100>>2];G[i+4104>>2]=b-e;e=G[i+8208>>2];G[i+8212>>2]=e-b;b=G[i+12316>>2];G[i+12320>>2]=b-e;e=G[i+16424>>2];G[i+16428>>2]=e-b;d=d+4|0;c=c+4|0;if((g|0)!=(c|0)){continue}break}}if(!h){break i}b=0;while(1){g=k+M(d,4108)|0;c=G[g+4100>>2];G[g+4104>>2]=c-e;d=d+1|0;e=c;b=b+1|0;if((h|0)!=(b|0)){continue}break}}n:{if(!vc(j,G[925766],G[925769])){break n}while(1){if(G[925767]){G[f+192>>2]=G[925771];kb(85636,f+192|0);$a(l)}g=G[925771];if(H[g|0]!=124){break n}b=Va(g);G[925775]=b;G[925774]=b+G[925774];o:{if(!G[925763]){b=(Va(g)+g|0)-1|0;if(H[b|0]==10){E[b|0]=0}b=(Va(g)+g|0)-1|0;if(H[b|0]==13){E[b|0]=0}d=0;G[925763]=1;Za(G[925760],g);c=0;h=0;b=Va(g);if((b|0)<=0){break o}while(1){p:{q:{e=H[d+g|0];r:{if(e>>>0<=91){if((e|0)==32){break p}if((e|0)!=10){break r}break o}if((e|0)==124){break q}if((e|0)==92){break o}}E[((G[925773]+M(h,4108)|0)+c|0)+1024|0]=e;c=c+1|0;break p}if((h|0)>1023){h=-3;break a}c=0;h=((d|0)!=0)+h|0}d=d+1|0;if((b|0)!=(d|0)){continue}break}break o}if(!G[925764]){b=(Va(g)+g|0)-1|0;if(H[b|0]==10){E[b|0]=0}b=(Va(g)+g|0)-1|0;if(H[b|0]==13){E[b|0]=0}d=0;G[925764]=1;Za(G[925761],g);c=0;h=0;b=Va(g);if((b|0)<=0){break o}while(1){s:{t:{e=H[d+g|0];u:{if(e>>>0<=91){if((e|0)==32){break s}if((e|0)!=10){break u}break o}if((e|0)==124){break t}if((e|0)==92){break o}}E[((G[925773]+M(h,4108)|0)+c|0)+2048|0]=e;c=c+1|0;break s}if((h|0)>1023){h=-3;break a}c=0;h=((d|0)!=0)+h|0}d=d+1|0;if((b|0)!=(d|0)){continue}break}break o}if(G[925765]){break o}b=(Va(g)+g|0)-1|0;if(H[b|0]==10){E[b|0]=0}b=(Va(g)+g|0)-1|0;if(H[b|0]==13){E[b|0]=0}d=0;G[925765]=1;Za(G[925762],g);c=0;h=0;b=Va(g);if((b|0)<=0){break o}while(1){v:{w:{e=H[d+g|0];x:{if(e>>>0<=91){if((e|0)==32){break v}if((e|0)!=10){break x}break o}if((e|0)==124){break w}if((e|0)==92){break o}}E[((G[925773]+M(h,4108)|0)+c|0)+3072|0]=e;c=c+1|0;break v}if((h|0)>1023){h=-3;break a}c=0;h=((d|0)!=0)+h|0}d=d+1|0;if((b|0)!=(d|0)){continue}break}}if(vc(g,G[925766],G[925769])){continue}break}}if(vc(G[925771],G[925766],G[925769])){if(G[925767]){G[f+176>>2]=G[925771];kb(85747,f+176|0);$a(l)}n=3703100,o=Va(G[925771]),G[n>>2]=o}b=0;y:{if(!G[925767]){break y}G[f+160>>2]=G[925759];kb(85780,f+160|0);G[f+144>>2]=G[925760];kb(85815,f+144|0);G[f+128>>2]=G[925761];kb(85885,f+128|0);G[f+112>>2]=G[925762];kb(85850,f+112|0);G[f+96>>2]=G[925771];G[f+100>>2]=G[925775];kb(86025,f+96|0);$a(l);if(G[925783]<=0){break y}while(1){yb(36149);c=b+1|0;G[f+80>>2]=c;kb(86001,f+80|0);b=M(b,4108);G[f+64>>2]=b+G[925773];kb(85974,f- -64|0);G[f+48>>2]=(b+G[925773]|0)+1024;kb(85947,f+48|0);G[f+32>>2]=(b+G[925773]|0)+2048;kb(85920,f+32|0);G[f+16>>2]=G[(b+G[925773]|0)+4100>>2];kb(85584,f+16|0);G[f>>2]=G[(b+G[925773]|0)+4104>>2];kb(85610,f);$a(l);b=c;if((b|0)>2];b=G[925774];a=Bu(c-b|0,G[f+356>>2]-((b>>31)+(b>>>0>c>>>0)|0)|0,e,0)}G[925776]=a;He(G[925769],b,0);G[925756]=G[925774];G[925757]=G[925775];h=G[925783]}Fa=f+400|0;return h}function Nm(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,E=0,F=0,H=0,I=0,K=0,L=0,M=0,N=0;l=Fa-336|0;Fa=l;m=i&65535;p=d;q=e&65535;s=(e^i)&-2147483648;k=h;x=i>>>16&32767;y=e>>>16&32767;a:{b:{if(x-32767>>>0>4294934529&y-32767>>>0>=4294934530){break b}j=e&2147483647;if(!(!d&(j|0)==2147418112?!(b|c):j>>>0<2147418112)){o=d;s=e|32768;break a}e=i&2147483647;if(!(!h&(e|0)==2147418112?!(f|g):e>>>0<2147418112)){o=h;s=i|32768;b=f;c=g;break a}if(!(b|d|(j^2147418112|c))){if(!(f|h|(e^2147418112|g))){b=0;c=0;s=2147450880;break a}s=s|2147418112;b=0;c=0;break a}if(!(f|h|(e^2147418112|g))){b=0;c=0;break a}if(!(b|d|(c|j))){b=!(f|h|(e|g));o=b?0:o;s=b?2147450880:s;b=0;c=0;break a}if(!(f|h|(e|g))){s=s|2147418112;b=0;c=0;break a}if((j|0)==65535|j>>>0<65535){i=b;d=!(p|q);h=d<<6;j=P(d?b:p)+32|0;b=P(d?c:q);b=h+((b|0)==32?j:b)|0;od(l+320|0,i,c,p,q,b-15|0);n=16-b|0;p=G[l+328>>2];q=G[l+332>>2];c=G[l+324>>2];b=G[l+320>>2]}if(e>>>0>65535){break b}d=!(k|m);e=d<<6;h=P(d?f:k)+32|0;d=P(d?g:m);d=e+((d|0)==32?h:d)|0;od(l+304|0,f,g,k,m,d-15|0);n=(d+n|0)-16|0;k=G[l+312>>2];m=G[l+316>>2];f=G[l+304>>2];g=G[l+308>>2]}e=m|65536;z=e;A=k;d=k;k=e<<15|d>>>17;d=d<<15|g>>>17;h=0-d|0;e=k;i=1963258675-(e+((d|0)!=0)|0)|0;ed(l+288|0,d,e,0,0,h,i,0,0);j=G[l+296>>2];ed(l+272|0,0-j|0,0-(G[l+300>>2]+((j|0)!=0)|0)|0,0,0,h,i,0,0);h=G[l+280>>2];i=h<<1|G[l+276>>2]>>>31;h=G[l+284>>2]<<1|h>>>31;ed(l+256|0,i,h,0,0,d,e,0,0);j=h;h=G[l+264>>2];ed(l+240|0,i,j,0,0,0-h|0,0-(G[l+268>>2]+((h|0)!=0)|0)|0,0,0);h=G[l+248>>2];i=h<<1|G[l+244>>2]>>>31;h=G[l+252>>2]<<1|h>>>31;ed(l+224|0,i,h,0,0,d,e,0,0);j=h;h=G[l+232>>2];ed(l+208|0,i,j,0,0,0-h|0,0-(G[l+236>>2]+((h|0)!=0)|0)|0,0,0);h=G[l+216>>2];i=h<<1|G[l+212>>2]>>>31;h=G[l+220>>2]<<1|h>>>31;ed(l+192|0,i,h,0,0,d,e,0,0);e=h;h=G[l+200>>2];ed(l+176|0,i,e,0,0,0-h|0,0-(G[l+204>>2]+((h|0)!=0)|0)|0,0,0);i=d;h=G[l+184>>2];d=h<<1|G[l+180>>2]>>>31;e=d-1|0;h=(G[l+188>>2]<<1|h>>>31)-!d|0;ed(l+160|0,i,k,0,0,e,h,0,0);d=f;j=g<<15|d>>>17;ed(l+144|0,d<<15,j,0,0,e,h,0,0);k=G[l+172>>2];m=G[l+160>>2];B=G[l+152>>2];d=m+B|0;i=G[l+164>>2];j=i+G[l+156>>2]|0;j=d>>>0>>0?j+1|0:j;m=(i|0)==(j|0)&d>>>0>>0|i>>>0>j>>>0;i=m+G[l+168>>2]|0;k=i>>>0>>0?k+1|0:k;m=!j&d>>>0>1|(j|0)!=0;i=m+i|0;k=i>>>0>>0?k+1|0:k;ed(l+112|0,e,h,0,0,0-i|0,0-(((i|0)!=0)+k|0)|0,0,0);ed(l+128|0,1-d|0,0-((d>>>0>1)+j|0)|0,0,0,e,h,0,0);H=(y-x|0)+n|0;e=G[l+116>>2];w=e;d=G[l+112>>2];j=e<<1|d>>>31;m=d<<1;n=j;d=j;h=G[l+140>>2];u=h;e=G[l+136>>2];j=h<<1|e>>>31;i=e<<1|G[l+132>>2]>>>31;h=i+m|0;j=d+j|0;j=h>>>0>>0?j+1|0:j;i=h;e=j;j=j-(h>>>0<13927)|0;r=j;k=q|65536;L=k;B=p;j=p;k=k<<1|j>>>31;p=j<<1|c>>>31;d=0;j=d|k;q=j;v=Au(r,d,j,0);d=Ia;t=d;j=b;d=c<<1|j>>>31;x=j<<1;y=d;h=h-13927|0;j=(e|0)==(r|0)&h>>>0>>0|e>>>0>r>>>0;e=(e|0)==(n|0)&i>>>0>>0|e>>>0>>0;d=G[l+120>>2];k=G[l+124>>2]<<1|d>>>31;i=d<<1;m=j;n=e;e=u>>>31|0;d=e+(w>>>31|i)|0;j=k;j=d>>>0>>0?j+1|0:j;e=d;d=n+d|0;j=d>>>0>>0?j+1|0:j;e=d;d=m+d|0;k=d>>>0>>0?j+1|0:j;e=d;d=d-1|0;C=k-!e|0;D=0;i=Au(y,o,C,D);e=i+v|0;k=Ia+t|0;k=e>>>0>>0?k+1|0:k;m=(k|0)==(t|0)&e>>>0>>0|k>>>0>>0;v=d;i=Au(d,0,p,0);d=i+e|0;j=Ia+k|0;j=d>>>0>>0?j+1|0:j;n=d;i=j;e=(j|0)==(k|0)&d>>>0>>0|j>>>0>>0;d=m+e|0;k=0;k=d>>>0>>0?1:k;e=Au(q,o,C,D);d=e+d|0;j=Ia+k|0;u=d;d=d>>>0>>0?j+1|0:j;m=Au(q,o,v,o);k=Ia;w=Au(C,D,p,o);e=w+m|0;j=Ia+k|0;j=e>>>0>>0?j+1|0:j;w=e;e=j;j=(k|0)==(j|0)&m>>>0>w>>>0|j>>>0>>0;m=u+e|0;d=d+j|0;j=m;m=j>>>0>>0?d+1|0:d;u=j;e=0;d=e+n|0;j=i+w|0;j=d>>>0>>0?j+1|0:j;e=j;k=(j|0)==(i|0)&d>>>0>>0|i>>>0>j>>>0;i=u+k|0;j=m;u=i;i=i>>>0>>0?j+1|0:j;n=d;m=e;w=h;h=Au(h,0,p,o);e=Ia;t=Au(r,o,y,o);d=t+h|0;j=Ia+e|0;j=d>>>0>>0?j+1|0:j;e=(e|0)==(j|0)&d>>>0>>0|e>>>0>j>>>0;h=j;E=u;t=e;F=x&-2;k=Au(v,o,F,0);e=k+d|0;j=Ia+j|0;j=e>>>0>>0?j+1|0:j;u=e;k=e;e=j;h=(j|0)==(h|0)&d>>>0>k>>>0|h>>>0>j>>>0;d=t+h|0;k=0;k=d>>>0>>0?1:k;j=d;h=n+d|0;d=k+m|0;d=h>>>0>>0?d+1|0:d;t=h;j=h;h=d;k=(d|0)==(m|0)&j>>>0>>0|d>>>0>>0;d=E+k|0;j=i;M=d;n=d>>>0>>0?j+1|0:j;I=Au(q,o,w,o);E=Ia;i=Au(C,D,F,o);d=i+I|0;j=Ia+E|0;j=d>>>0>>0?j+1|0:j;C=d;k=Au(r,o,p,o);i=d+k|0;m=j;d=j+Ia|0;d=i>>>0>>0?d+1|0:d;K=i;j=Au(y,o,v,o);i=i+j|0;k=Ia+d|0;D=i;k=i>>>0>>0?k+1|0:k;i=k;v=0;N=(d|0)==(k|0)&D>>>0>>0|d>>>0>k>>>0;j=(d|0)==(m|0)&C>>>0>K>>>0|d>>>0>>0;d=j+((m|0)==(E|0)&C>>>0>>0|m>>>0>>0)|0;k=0;d=N+d|0;m=i|0;k=m+t|0;j=(d|v)+h|0;v=k;d=k;j=d>>>0>>0?j+1|0:j;m=j;h=(h|0)==(j|0)&d>>>0>>0|h>>>0>j>>>0;d=h+M|0;j=n;E=d;h=d>>>0>>0?j+1|0:j;t=Au(r,o,F,o);r=Ia;k=Au(y,o,w,o);d=k+t|0;j=Ia+r|0;j=d>>>0>>0?j+1|0:j;n=0;k=(j|0)==(r|0)&d>>>0>>0|j>>>0>>0;r=j;d=j+u|0;j=(k|n)+e|0;n=d;j=d>>>0>>0?j+1|0:j;u=(e|0)==(j|0)&d>>>0>>0|e>>>0>j>>>0;i=0;e=i+d|0;d=j;k=D+d|0;k=e>>>0>>0?k+1|0:k;e=(d|0)==(k|0)&e>>>0>>0|d>>>0>k>>>0;d=u+e|0;j=0;j=d>>>0>>0?1:j;e=d;d=d+v|0;j=j+m|0;j=d>>>0>>0?j+1|0:j;e=j;j=(m|0)==(j|0)&d>>>0>>0|j>>>0>>0;i=j+E|0;k=h;h=i;k=h>>>0>>0?k+1|0:k;i=k;c:{if((k|0)==131071|k>>>0<131071){ed(l+80|0,d,e,h,i,f,g,A,z);j=b<<17;b=0;c=G[l+88>>2];n=b-c|0;k=G[l+80>>2];m=G[l+84>>2];B=(k|m)!=0;r=n-B|0;n=(j-(G[l+92>>2]+(b>>>0>>0)|0)|0)-(n>>>0>>0)|0;b=k;k=0-k|0;m=0-(((b|0)!=0)+m|0)|0;b=H+16382|0;break c}k=h<<31;d=(e&1)<<31|d>>>1;e=e>>>1|k;h=(i&1)<<31|h>>>1;i=i>>>1|0;ed(l+96|0,d,e,h,i,f,g,A,z);q=0;m=G[l+104>>2];n=q-m|0;k=G[l+96>>2];p=G[l+100>>2];x=(k|p)!=0;r=n-x|0;n=((b<<16)-(G[l+108>>2]+(m>>>0>q>>>0)|0)|0)-(n>>>0>>0)|0;j=k;k=0-j|0;m=0-(((j|0)!=0)+p|0)|0;x=b;y=c;p=B;q=L;b=H+16383|0}if((b|0)>=32767){s=s|2147418112;b=0;c=0;break a}d:{if((b|0)>0){c=r;j=n<<1|c>>>31;r=c<<1|m>>>31;n=j;p=h;q=i&65535|b<<16;j=m<<1|k>>>31;b=k<<1;break d}if((b|0)<=-113){b=0;c=0;break a}eg(l- -64|0,d,e,h,i,1-b|0);od(l+48|0,x,y,p,q,b+112|0);d=G[l+64>>2];e=G[l+68>>2];p=G[l+72>>2];q=G[l+76>>2];ed(l+32|0,f,g,A,z,d,e,p,q);c=G[l+40>>2];i=c<<1;c=G[l+44>>2]<<1|c>>>31;b=G[l+56>>2];h=G[l+36>>2];n=h>>>31|i;i=b-n|0;n=G[l+60>>2]-((b>>>0>>0)+c|0)|0;c=G[l+32>>2];k=h<<1|c>>>31;c=c<<1;j=G[l+52>>2];b=G[l+48>>2];h=(k|0)==(j|0)&c>>>0>b>>>0|j>>>0>>0;r=i-h|0;n=n-(h>>>0>i>>>0)|0;h=b;b=h-c|0;j=j-((c>>>0>h>>>0)+k|0)|0}ed(l+16|0,f,g,A,z,3,0,0,0);ed(l,f,g,A,z,5,0,0,0);h=d;m=p;p=d&1;c=b+p|0;d=0;k=j+d|0;k=b>>>0>c>>>0?k+1|0:k;i=c;c=k;g=(k|0)==(g|0)&i>>>0>f>>>0|g>>>0>>0;d=(d|0)==(k|0)&i>>>0

>>0|d>>>0>k>>>0;b=d+r|0;j=n;j=b>>>0>>0?j+1|0:j;f=b;d=b;b=j;g=(d|0)==(A|0)&(j|0)==(z|0)?g:(z|0)==(j|0)&d>>>0>A>>>0|j>>>0>z>>>0;d=h+g|0;k=e;k=d>>>0>>0?k+1|0:k;g=(e|0)==(k|0)&d>>>0>>0|e>>>0>k>>>0;e=m+g|0;j=q;j=e>>>0>>0?j+1|0:j;g=e;e=d;m=g;d=G[l+20>>2];h=(d|0)==(c|0)&J[l+16>>2]>>0|c>>>0>d>>>0;d=G[l+28>>2];g=G[l+24>>2];h=j>>>0<2147418112&((f|0)==(g|0)&(b|0)==(d|0)?h:(d|0)==(b|0)&g>>>0>>0|b>>>0>d>>>0);g=e+h|0;d=k;d=g>>>0>>0?d+1|0:d;h=(d|0)==(k|0)&e>>>0>g>>>0|d>>>0>>0;e=m+h|0;k=e>>>0>>0?j+1|0:j;h=e;e=G[l+4>>2];i=(e|0)==(c|0)&J[l>>2]>>0|c>>>0>e>>>0;c=G[l+12>>2];e=G[l+8>>2];c=k>>>0<2147418112&((e|0)==(f|0)&(b|0)==(c|0)?i:(c|0)==(b|0)&e>>>0>>0|b>>>0>c>>>0);b=c+g|0;j=b>>>0>>0?d+1|0:d;c=j;f=(d|0)==(j|0)&b>>>0>>0|d>>>0>j>>>0;e=h+f|0;d=k;o=e|o;s=s|(e>>>0>>0?d+1|0:d)}G[a>>2]=b;G[a+4>>2]=c;G[a+8>>2]=o;G[a+12>>2]=s;Fa=l+336|0}function eh(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=Fa+-64|0;Fa=e;a:{b=G[309830];if((b|0)<=0){G[47524]=5;break a}c=365;if(b>>>0>10){break a}if(!G[(b<<2)+1239340>>2]){c=362;break a}while(1){h=G[(b<<2)+1239340>>2];c=G[309816];if(c){Wa(c);G[309820]=0;G[309821]=0;G[309818]=0;G[309819]=0;G[309816]=0;G[309817]=0}if(G[309823]){G[309822]=1;c=0;a=G[309824];G[309816]=G[309823];G[309817]=a;G[309823]=0;G[309824]=0;G[309829]=0;a=G[309828];G[309820]=G[309827];G[309821]=a;a=G[309826];G[309818]=G[309825];G[309819]=a;G[309825]=0;G[309826]=0;G[309827]=0;G[309828]=0;break a}G[309822]=0;b:{c=0;b=362;c:{d:{if(!h){break d}f=1;d=ab(1);G[309816]=d;b=360;if(!d){break c}e:{while(1){i=en(h);if((i|0)==13){continue}f:{switch(i+1|0){case 0:if(G[h+76>>2]<0){b=G[h>>2]}else{b=G[h>>2]}d=b>>>5&1?361:0;if(c){break e}b=367;break c;default:b=c+1|0;d=G[309816];g=c+1001|0;g=g-((g|0)%1e3|0)|0;if((g|0)>(f|0)){d=ub(d,g);if(!d){c=b;d=360;break e}G[309816]=d;f=g}E[c+d|0]=i;c=b;continue;case 11:break f}}break}d=0}b=G[309816];g=f;f=c+1|0;g:{if((g|0)!=(f|0)){b=ub(b,f);if(!b){d=360;break g}G[309816]=b}E[c+b|0]=0;b=0;if(!d){break d}}Wa(G[309816]);G[309816]=0;b=d}}c=b;if(c){if((c|0)!=367){break a}c=G[309830]-1|0;G[309830]=c;b=G[(c<<2)+1239344>>2];if(b){Hb(b);c=G[309830]}G[(c<<2)+1239344>>2]=0;if((c|0)>0){break b}c=0;G[47524]=5;break a}if(E[1239288]&1){c=0;break a}c=E[G[309816]];if((c|0)==35|!(a?c:1)){break b}f=0;c=362;b=G[309816];h:{if(!b){break h}G[309817]=0;G[309818]=0;G[309821]=0;G[309819]=0;G[309820]=0;c=b;i:{j:{k:{l:{m:{switch(H[b|0]){case 0:case 10:break j;case 9:case 32:break m;default:break l}}c=b+1|0;n:{switch(H[b+1|0]){case 0:case 10:break j;case 9:case 32:break n;default:break l}}c=b+2|0;o:{switch(H[b+2|0]){case 0:case 10:break j;case 9:case 32:break o;default:break l}}c=b+3|0;p:{switch(H[b+3|0]){case 0:case 10:break j;case 9:case 32:break p;default:break l}}c=b+4|0;q:{switch(H[b+4|0]){case 0:case 10:break j;case 9:case 32:break q;default:break l}}c=b+5|0;r:{switch(H[b+5|0]){case 0:case 10:break j;case 9:case 32:break r;default:break l}}c=b+6|0;s:{switch(H[b+6|0]){case 0:case 10:break j;case 9:case 32:break s;default:break l}}c=b+7|0;switch(H[b+7|0]){case 0:case 10:break j;case 9:case 32:break k;default:break l}}G[309817]=c;t:{u:{v:{w:{while(1){x:{b=c;switch(H[b|0]){case 0:case 10:break u;default:break x}}y:{if(!gc(34939,c,8)){b=jb(c,61);if(b){break y}}b=H[c|0];if((b|0)==9|(b|0)==32){break w}d=1;if((b|0)==61){break v}c=c+1|0;continue}break}c=b;f=1;d=1;if(H[b|0]){break v}break t}d=0}f=d;b=c+1|0}E[c|0]=0}z:{A:{if(!Ib(32708,G[309817])){break A}if(!Ib(33332,G[309817])){break A}if(Ib(35367,G[309817])){break z}}G[309820]=b;B:{while(1){C:{switch(H[b|0]){default:b=b+1|0;continue;case 0:break B;case 10:break C}}break}E[b|0]=0}G[309819]=7;c=0;break h}if(!Ib(35684,G[309817])){while(1){c=H[b|0];if(!((c|0)!=32&(c|0)!=9)){b=b+1|0;continue}break}G[309818]=b;D:{while(1){E:{switch(H[b|0]){default:b=b+1|0;continue;case 0:break D;case 10:break E}}break}E[b|0]=0}G[309819]=0;c=0;break h}while(1){F:{c=0;G:{H:{d=H[b|0];switch(d|0){case 0:case 10:break h;case 9:case 32:break G;default:break H}}if(f&1){break F}f=1;if((d|0)!=61){break F}}b=b+1|0;continue}break}I:{J:{K:{switch(d-39|0){case 8:c=H[b+1|0];if((c|0)==32|(c|0)==9){b=b+2|0}else{b=b+1|0}G[309820]=b;while(1){L:{c=H[b|0];switch(c|0){case 0:break h;case 10:break i;default:break L}}b=b+1|0;continue};case 0:G[309819]=2;c=b+1|0;G[309818]=c;b=c;while(1){d=H[c|0];M:{if((d|0)!=39){switch(d|0){case 0:case 10:break I;default:break M}}f=c+1|0;N:{switch(H[c+1|0]){case 0:case 10:break I;case 9:case 32:break J;case 39:break N;default:break M}}c=f}E[b|0]=d;b=b+1|0;c=c+1|0;continue};default:break K}}G[309819]=0;G[309818]=b;while(1){O:{switch(H[b|0]){default:b=b+1|0;continue;case 0:case 10:break I;case 9:case 32:break O}}break}f=b+1|0}c=0;E[b|0]=0;P:{while(1){Q:{switch(H[f|0]){case 9:case 32:f=f+1|0;continue;case 0:case 10:break h;case 47:break Q;default:break P}}break}c=H[f+1|0];if((c|0)==32|(c|0)==9){b=f+2|0}else{b=f+1|0}G[309820]=b;while(1){R:{c=H[b|0];switch(c|0){case 0:break h;case 10:break i;default:break R}}b=b+1|0;continue}}G[309821]=1;break h}break i}c=b+8|0;G[309820]=c;S:{while(1){T:{switch(H[c|0]){default:c=c+1|0;continue;case 0:break S;case 10:break T}}break}E[c|0]=0;b=G[309816]}E[b|0]=0;G[309819]=7;G[309817]=G[309816];c=0;break h}E[b|0]=0;G[309819]=7;c=G[309816];G[309820]=c;G[309817]=c;c=0;break h}E[b|0]=0;c=0}if(c){break a}c=G[309817];if(!c){break b}b=H[c|0];U:{if(!b){break U}if((b-97&255)>>>0<26){E[c|0]=b-32;c=G[309817]}if(Va(c)>>>0<=1){break U}b=H[c+1|0];if((b-97&255)>>>0<=25){E[c+1|0]=b-32;c=G[309817]}if(Va(c)>>>0<3){break U}b=H[c+2|0];if((b-97&255)>>>0<=25){E[c+2|0]=b-32;c=G[309817]}if(Va(c)>>>0<4){break U}b=H[c+3|0];if((b-97&255)>>>0<=25){E[c+3|0]=b-32;c=G[309817]}if(Va(c)>>>0<5){break U}b=H[c+4|0];if((b-97&255)>>>0<=25){E[c+4|0]=b-32;c=G[309817]}if(Va(c)>>>0<6){break U}b=H[c+5|0];if((b-97&255)>>>0<=25){E[c+5|0]=b-32;c=G[309817]}if(Va(c)>>>0<7){break U}b=H[c+6|0];if((b-97&255)>>>0<=25){E[c+6|0]=b-32;c=G[309817]}if(Va(c)>>>0<8){break U}b=H[c+7|0];if((b-97&255)>>>0>25){break U}E[c+7|0]=b-32}V:{W:{b=G[47529];if((b|0)==-1){break W}c=0;f=G[309817];if(Xa(f,G[47528])){while(1){c=c+1|0;d=(c<<3)+190112|0;b=G[d+4>>2];if((b|0)==-1){break W}if(Xa(f,G[d>>2])){continue}break}}G[47524]=b;if(b){break V}c=dn(G[309818]);if(!c){break b}break a}G[47524]=-1}G[310098]=0;a=G[309819];c=G[309818];X:{if(c){if((a|0)==2){G[310118]=c;G[310098]=2;break X}Y:{if(Ib(33560,c)){if(Ib(35337,G[309818])){break Y}}G[310098]=1;j=1240472,k=!Ib(33560,G[309818]),E[j|0]=k}if(G[310098]){break X}G[e+48>>2]=1240472;G[e+52>>2]=1240480;G[e+56>>2]=e+60;Z:{if((Qc(G[309818],16222,e+48|0)|0)!=2){break Z}_:{switch(H[G[309818]+G[e+60>>2]|0]){case 0:case 9:case 10:case 32:break _;default:break Z}}G[310098]=5;break X}if(G[310098]){break X}a=G[309818];$:{if(!jb(a,46)){break $}G[e+32>>2]=1240472;G[e+36>>2]=e+60;if((Qc(a,16211,e+32|0)|0)!=1){break $}aa:{ba:{ca:{a=G[e+60>>2];c=a+G[309818]|0;b=H[c|0];switch(b|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:break $;case 0:case 9:case 10:case 32:break ba;default:break ca}}if((b|0)!=68){break $}E[c|0]=69;G[e+16>>2]=1240472;G[e+20>>2]=e+60;Qc(G[309818],16211,e+16|0);da:{c=G[309818];switch(H[c+G[e+60>>2]|0]){case 0:case 9:case 10:case 32:break da;default:break aa}}G[310098]=4;break X}G[310098]=4;break X}E[a+c|0]=68}if(G[310098]){break X}G[e>>2]=1240472;G[e+4>>2]=e+60;ea:{if((Qc(G[309818],16217,e)|0)!=1){break ea}fa:{switch(H[G[309818]+G[e+60>>2]|0]){case 0:case 9:case 10:case 32:break fa;default:break ea}}G[310098]=3;break X}if(G[310098]){break X}G[310098]=2;G[310118]=G[309818];break X}if((a|0)==7){G[310098]=7;break X}G[310098]=6}a=G[309820];ga:{if(a){rb(1240488,a,80);E[1240567]=0;break ga}E[1240488]=0}rb(1240396,G[309817],75);E[1240470]=0;c=Va(1240396)>>>0>75?368:0;break a}b=G[309830];continue}}Fa=e- -64|0;return c} -function Wd(){var 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;c=Fa-8496|0;Fa=c;a:{b:{c:{d:{e:{b=G[948156];switch(b-2|0){case 5:case 7:break b;case 6:case 8:break c;case 2:break d;case 0:break e;default:break a}}if(!(E[3788484]&1)){if(!G[950330]){Lb()}a=Xb(5);Yb(41684,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);G[947121]=G[947121]+1;break a}if(!H[3792672]){break a}a=G[950330];b=Uf(G[G[(G[950332]+(a<<2)|0)-4>>2]+24>>2],44);if(!b){break a}E[b|0]=0;if(!H[3792672]){break a}if(!a){Lb()}a=Xb(Va(3792672)+1|0);Yb(3792672,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);break a}if(!(E[3788484]&1)){if(!G[950330]){Lb()}a=Xb(5);Yb(41684,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);G[947121]=G[947121]+1;break a}if(!H[3792672]){break a}a=G[950330];b=Uf(G[G[(G[950332]+(a<<2)|0)-4>>2]+24>>2],44);if(!b){break a}E[b|0]=0;if(!H[3792672]){break a}if(!a){Lb()}a=Xb(Va(3792672)+1|0);Yb(3792672,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);break a}if(E[3788484]&1){break b}if(!G[950330]){Lb()}a=Xb(5);Yb(41684,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);G[947121]=G[947121]+1;b=G[948156]}b=b-7|0;f:{if(b>>>0>=4){b=G[24367];g:{if(H[3780288]){G[c+276>>2]=3780288;G[c+272>>2]=4094;Tb(b,69475,c+272|0);break g}G[c+256>>2]=4094;Tb(b,68751,c+256|0)}b=0;a=G[945062];h:{if(!a){break h}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break h}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;e=G[a+4>>2];G[a+8>>2]=e;if((a|0)!=G[d>>2]){break h}a=G[a+16>>2];G[945064]=e;G[950324]=a;G[945070]=e;G[945057]=G[G[d>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1;break f}b=G[(b<<2)+188988>>2]}r=Lc(G[G[(G[950332]+(G[950330]<<2)|0)-4>>2]+24>>2]);i:{while(1){a=Uf(r,44);if(!a){break i}E[a|0]=0;a=a+1|0;s=(c+288|0)+(b<<3)|0,t=vb(a,c+4396|0),L[s>>3]=t;if((a|0)==G[c+4396>>2]){break i}a=(b|0)<=0;b=b-1|0;if(!a){continue}break}j:{k:{l:{switch(G[948156]-7|0){case 1:case 3:l=L[c+304>>3];i=L[c+320>>3];p=(L[c+312>>3]-l)/i;m=L[c+328>>3];j=L[c+360>>3];q=(L[c+344>>3]-m)/j;break k;default:b=G[24367];m:{if(H[3780288]){G[c+212>>2]=3780288;G[c+208>>2]=4094;Tb(b,69475,c+208|0);break m}G[c+192>>2]=4094;Tb(b,68751,c+192|0)}b=0;a=G[945062];n:{if(!a){break n}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break n}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;e=G[a+4>>2];G[a+8>>2]=e;if((a|0)!=G[d>>2]){break n}a=G[a+16>>2];G[945064]=e;G[950324]=a;G[945070]=e;G[945057]=G[G[d>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1;break j;case 0:case 2:break l}}l=L[c+304>>3];i=L[c+320>>3];p=(L[c+312>>3]-l)/i;m=L[c+328>>3];j=L[c+344>>3];q=(L[c+336>>3]-m)/j}n=1;if(O(i)<2147483648){e=~~i}else{e=-2147483648}a=(e|0)<=0;if(O(j)<2147483648){d=~~j}else{d=-2147483648}b=0;if((d|0)<=0|a){break j}while(1){i=+(n|0)*p+l;j=+(n-1|0)*p+l;o=1;while(1){L[c+248>>3]=i;L[c+240>>3]=j;L[c+232>>3]=+(o|0)*q+m;L[c+224>>3]=+(o-1|0)*q+m;Ya(c+4400|0,4096,19673,c+224|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];if(H[c+4400|0]){a=Va(c+4400|0);g=0;h=G[b+52>>2];if(!(!h|!H[h|0])){g=Va(h)}f=G[b+56>>2];a=a+g|0;if((f|0)<=(a+1|0)){a=a+2|0;k=f+1024|0;f=((f^-1)+((a|0)>(k|0)?a:k)&-1024)+k|0;G[b+56>>2]=f}o:{if(!g){a=Ic(f,1);break o}a=lf(h,f)}G[b+52>>2]=a;Gb(a,c+4400|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2]}f=0;h=G[b+52>>2];if(!(!h|!H[h|0])){f=Va(h)}g=G[b+56>>2];if((g|0)<=(f+2|0)){a=f+3|0;k=g+1024|0;g=((g^-1)+((a|0)>(k|0)?a:k)&-1024)+k|0;G[b+56>>2]=g}a=b;p:{if(!f){b=Ic(g,1);break p}b=lf(h,g)}G[a+52>>2]=b;b=Va(b)+b|0;E[b|0]=10;E[b+1|0]=0;b=(d|0)!=(o|0);o=o+1|0;if(b){continue}break}b=(e|0)!=(n|0);n=n+1|0;if(b){continue}break}b=M(d,e)}G[c+176>>2]=b;d=c+4400|0;Ya(d,4096,66542,c+176|0);a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,a+32|0,a+36|0);G[c+160>>2]=b<<1;Ya(d,4096,66542,c+160|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,b+40|0,b+44|0);b=G[950330];if(!b){Lb();b=G[950330]}b=G[(G[950332]+(b<<2)|0)-4>>2];G[b+4>>2]=G[b+4>>2]|32}pb(r);E[3805456]=1}a=G[947121];b=El(a);if((b|0)>0){G[c+152>>2]=a;d=b-1|0;a=d<<2;G[c+144>>2]=G[a+188864>>2];G[c+148>>2]=G[a+188928>>2];E[3780288]=0;Ya(c+4400|0,4096,(d&-3)==1?62159:b-9>>>0<2?62110:62077,c+144|0);a=G[24367];q:{if(H[3780288]){G[c+132>>2]=3780288;G[c+128>>2]=c+4400;Tb(a,69475,c+128|0);break q}G[c+112>>2]=c+4400;Tb(a,68751,c+112|0)}a=G[945062];r:{if(!a){break r}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break r}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;e=G[a+4>>2];G[a+8>>2]=e;if((a|0)!=G[d>>2]){break r}a=G[a+16>>2];G[945064]=e;G[950324]=a;G[945070]=e;G[945057]=G[G[d>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}s:{if(G[948156]!=13&(b|0)>=0){break s}if(H[G[(G[950332]+(G[950330]<<2)|0)-4>>2]+4|0]&32){a=G[24367];t:{if(H[3780288]){G[c+100>>2]=3780288;G[c+96>>2]=48740;Tb(a,69475,c+96|0);break t}G[c+80>>2]=48740;Tb(a,68751,c+80|0)}a=G[945062];u:{if(!a){break u}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break u}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;e=G[a+4>>2];G[a+8>>2]=e;if((a|0)!=G[d>>2]){break u}a=G[a+16>>2];G[945064]=e;G[950324]=a;G[945070]=e;G[945057]=G[G[d>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}G[c+72>>2]=0;G[c+76>>2]=1128267776;G[c+64>>2]=0;G[c+68>>2]=1128267776;Ya(3788528,4096,19679,c- -64|0);if(H[3788528]){if(!G[950330]){Lb()}d=Xb(Va(3788528)+1|0);Yb(3788528,d);a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,a+24|0,a+12|0);pb(d)}if(G[948156]==13){break s}d=G[(G[950332]+(G[950330]<<2)|0)-4>>2];a=G[d+28>>2];if(a){e=Lc(a+G[d+24>>2]|0);if(e){d=G[950330];a=G[(G[950332]+(d<<2)|0)-4>>2];E[G[a+24>>2]+G[a+28>>2]|0]=0;if(!d){Lb()}d=Xb(2);Yb(4031,d);a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,a+24|0,a+12|0);pb(d);if(H[e|0]){if(!G[950330]){Lb()}d=Xb(Va(e)+1|0);Yb(e,d);a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,a+24|0,a+12|0);pb(d)}v:{w:{switch(G[948156]-1|0){case 0:b=G[947121]-3|0;break v;case 1:b=(G[947121]-5|0)/2|0;break v;case 2:b=G[947121]-3|0;break v;case 3:b=(G[947121]-5|0)/2|0;break v;case 10:b=G[947121]-3|0;break v;case 11:b=G[947121]/2|0;break v;default:break w}}_i(36230)}G[c+48>>2]=b;a=c+288|0;Ya(a,4096,66542,c+48|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+32|0,b+36|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+40|0,b+44|0);E[3805456]=1;Wa(e)}b=G[950330];if(!b){Lb();b=G[950330]}b=G[(G[950332]+(b<<2)|0)-4>>2];G[b+4>>2]=G[b+4>>2]|64;break s}b=G[24367];x:{if(H[3780288]){G[c+36>>2]=3780288;G[c+32>>2]=7128;Tb(b,69475,c+32|0);break x}G[c+16>>2]=7128;Tb(b,68751,c+16|0)}b=G[945062];y:{if(!b){break y}a=b+(G[945063]<<2)|0;b=G[a>>2];if(!b){break y}G[b+16>>2]=0;E[G[b+4>>2]]=0;E[G[b+4>>2]+1|0]=0;G[b+44>>2]=0;G[b+28>>2]=1;d=G[b+4>>2];G[b+8>>2]=d;if((b|0)!=G[a>>2]){break y}b=G[b+16>>2];G[945064]=d;G[950324]=b;G[945070]=d;G[945057]=G[G[a>>2]>>2];E[3780260]=H[d|0]}E[3801300]=1}if(!H[3805456]){G[c>>2]=1;a=c+288|0;Ya(a,4096,66542,c);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+32|0,b+36|0);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+40|0,b+44|0)}a=G[950220];if(a){b=G[a+156>>2];if(b){b=Ja[b|0](a,64244)|0}else{b=64244}}else{b=0}Te(b);E[3792672]=0;E[3805456]=0;Fa=c+8496|0}function _j(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var 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;p=Fa-496|0;Fa=p;r=G[o>>2];a:{if((r|0)>0){break a}if((b|0)>=5){Ua(28364);r=320;G[o>>2]=320;break a}r=G[a>>2];if((r|0)!=G[G[a+4>>2]+76>>2]){mb(a,r+1|0,0,o)}E[p+421|0]=0;E[p+350|0]=0;E[p+279|0]=0;E[p+208|0]=0;G[p+28>>2]=0;Cb(a,16,35146,p+208|0,0,p+28|0);b:{if(G[p+28>>2]){break b}q=p+421|0;s=p+350|0;t=p+279|0;r=p+208|0;while(1){w=H[r|0];if(!w){break b}if((w|0)!=44){r=r+1|0;continue}break}E[r|0]=0;while(1){w=H[r+1|0];r=r+1|0;if((w|0)==32){continue}break}r=Za(t,r);while(1){t=H[r|0];if(!t){break b}if((t|0)!=44){r=r+1|0;continue}break}E[r|0]=0;while(1){t=H[r+1|0];r=r+1|0;if((t|0)==32){continue}break}r=Za(s,r);while(1){s=H[r|0];if(!s){break b}if((s|0)!=44){r=r+1|0;continue}break}E[r|0]=0;while(1){s=H[r+1|0];r=r+1|0;if((s|0)==32){continue}break}Za(q,r)}c:{d:{if((b|0)<=0){break d}r=0;while(1){w=M(r,71);s=w+c|0;e:{if(H[s|0]){break e}q=Za(s,w+(p+208|0)|0);if(H[q|0]|r>>>0>3){break e}z=r<<4;t=z&31;t=(z&63)>>>0>=32?5505114>>>t|0:((1<>>t;E[q|0]=t;E[q+1|0]=t>>>8}z=r<<2;t=z+j|0;if((dc(a,0,s,t,o)|0)>0){F[p+152>>1]=H[66839]|H[66840]<<8;a=H[66835]|H[66836]<<8|(H[66837]<<16|H[66838]<<24);G[p+144>>2]=H[66831]|H[66832]<<8|(H[66833]<<16|H[66834]<<24);G[p+148>>2]=a;a=H[66827]|H[66828]<<8|(H[66829]<<16|H[66830]<<24);G[p+136>>2]=H[66823]|H[66824]<<8|(H[66825]<<16|H[66826]<<24);G[p+140>>2]=a;a=H[66819]|H[66820]<<8|(H[66821]<<16|H[66822]<<24);G[p+128>>2]=H[66815]|H[66816]<<8|(H[66817]<<16|H[66818]<<24);G[p+132>>2]=a;a=H[66811]|H[66812]<<8|(H[66813]<<16|H[66814]<<24);G[p+120>>2]=H[66807]|H[66808]<<8|(H[66809]<<16|H[66810]<<24);G[p+124>>2]=a;a=H[66803]|H[66804]<<8|(H[66805]<<16|H[66806]<<24);G[p+112>>2]=H[66799]|H[66800]<<8|(H[66801]<<16|H[66802]<<24);G[p+116>>2]=a;a=p+112|0;Ua(qb(a,s,80-Va(a)|0));break d}q=G[t>>2];if(G[(G[G[a+4>>2]+968>>2]+M(q,160)|0)-72>>2]>=2){G[p+136>>2]=H[67342]|H[67343]<<8|(H[67344]<<16|H[67345]<<24);a=H[67338]|H[67339]<<8|(H[67340]<<16|H[67341]<<24);G[p+128>>2]=H[67334]|H[67335]<<8|(H[67336]<<16|H[67337]<<24);G[p+132>>2]=a;a=H[67330]|H[67331]<<8|(H[67332]<<16|H[67333]<<24);G[p+120>>2]=H[67326]|H[67327]<<8|(H[67328]<<16|H[67329]<<24);G[p+124>>2]=a;a=H[67322]|H[67323]<<8|(H[67324]<<16|H[67325]<<24);G[p+112>>2]=H[67318]|H[67319]<<8|(H[67320]<<16|H[67321]<<24);G[p+116>>2]=a;break c}eo(a,q,p+24|0,o);q=G[p+24>>2];if(!((q|0)>=0&(q|0)!=16)){a=H[67314]|H[67315]<<8|(H[67316]<<16|H[67317]<<24);G[p+152>>2]=H[67310]|H[67311]<<8|(H[67312]<<16|H[67313]<<24);G[p+156>>2]=a;a=H[67306]|H[67307]<<8|(H[67308]<<16|H[67309]<<24);G[p+144>>2]=H[67302]|H[67303]<<8|(H[67304]<<16|H[67305]<<24);G[p+148>>2]=a;a=H[67298]|H[67299]<<8|(H[67300]<<16|H[67301]<<24);G[p+136>>2]=H[67294]|H[67295]<<8|(H[67296]<<16|H[67297]<<24);G[p+140>>2]=a;a=H[67290]|H[67291]<<8|(H[67292]<<16|H[67293]<<24);G[p+128>>2]=H[67286]|H[67287]<<8|(H[67288]<<16|H[67289]<<24);G[p+132>>2]=a;a=H[67282]|H[67283]<<8|(H[67284]<<16|H[67285]<<24);G[p+120>>2]=H[67278]|H[67279]<<8|(H[67280]<<16|H[67281]<<24);G[p+124>>2]=a;a=H[67274]|H[67275]<<8|(H[67276]<<16|H[67277]<<24);G[p+112>>2]=H[67270]|H[67271]<<8|(H[67272]<<16|H[67273]<<24);G[p+116>>2]=a;break c}G[p+8>>2]=1589294263;G[p+12>>2]=-1196933592;G[p+16>>2]=1589294263;G[p+20>>2]=-1196933592;f:{q=g+w|0;if(!H[q|0]){break f}if(!Cb(a,82,q,(r<<3)+d|0,0,o)){break f}Ua(25703);Ua(q);break d}g:{q=r<<3;u=L[q+d>>3];if(u!=-91191291391491e-49){L[l+q>>3]=u;break g}v=p+32|0;zb(34547,G[t>>2],v,o);A=v;v=l+q|0;if((Cb(a,82,A,v,0,o)|0)<=0){break g}G[o>>2]=0;if((Cn(a,G[t>>2],v,p+8|0,o)|0)<=0){break g}a=H[67393]|H[67394]<<8|(H[67395]<<16|H[67396]<<24);E[p+159|0]=a;E[p+160|0]=a>>>8;E[p+161|0]=a>>>16;E[p+162|0]=a>>>24;a=H[67390]|H[67391]<<8|(H[67392]<<16|H[67393]<<24);G[p+152>>2]=H[67386]|H[67387]<<8|(H[67388]<<16|H[67389]<<24);G[p+156>>2]=a;a=H[67382]|H[67383]<<8|(H[67384]<<16|H[67385]<<24);G[p+144>>2]=H[67378]|H[67379]<<8|(H[67380]<<16|H[67381]<<24);G[p+148>>2]=a;a=H[67374]|H[67375]<<8|(H[67376]<<16|H[67377]<<24);G[p+136>>2]=H[67370]|H[67371]<<8|(H[67372]<<16|H[67373]<<24);G[p+140>>2]=a;a=H[67366]|H[67367]<<8|(H[67368]<<16|H[67369]<<24);G[p+128>>2]=H[67362]|H[67363]<<8|(H[67364]<<16|H[67365]<<24);G[p+132>>2]=a;a=H[67358]|H[67359]<<8|(H[67360]<<16|H[67361]<<24);G[p+120>>2]=H[67354]|H[67355]<<8|(H[67356]<<16|H[67357]<<24);G[p+124>>2]=a;a=H[67350]|H[67351]<<8|(H[67352]<<16|H[67353]<<24);G[p+112>>2]=H[67346]|H[67347]<<8|(H[67348]<<16|H[67349]<<24);G[p+116>>2]=a;a=p+112|0;Ua(qb(a,s,80-Va(a)|0));break d}h:{v=h+w|0;if(!H[v|0]){break h}if(!Cb(a,82,v,e+q|0,0,o)){break h}Ua(25659);Ua(v);break d}i:{u=L[e+q>>3];if(u!=-91191291391491e-49){L[m+q>>3]=u;break i}v=p+32|0;zb(33036,G[t>>2],v,o);C=1;A=v;v=m+q|0;if((Cb(a,82,A,v,0,o)|0)<=0){break i}G[o>>2]=0;u=L[p+8>>3];if(u!=-91191291391491e-49){L[v>>3]=u;break i}if((Cn(a,G[t>>2],p+16|0,v,o)|0)<=0){break i}a=H[67393]|H[67394]<<8|(H[67395]<<16|H[67396]<<24);E[p+159|0]=a;E[p+160|0]=a>>>8;E[p+161|0]=a>>>16;E[p+162|0]=a>>>24;a=H[67390]|H[67391]<<8|(H[67392]<<16|H[67393]<<24);G[p+152>>2]=H[67386]|H[67387]<<8|(H[67388]<<16|H[67389]<<24);G[p+156>>2]=a;a=H[67382]|H[67383]<<8|(H[67384]<<16|H[67385]<<24);G[p+144>>2]=H[67378]|H[67379]<<8|(H[67380]<<16|H[67381]<<24);G[p+148>>2]=a;a=H[67374]|H[67375]<<8|(H[67376]<<16|H[67377]<<24);G[p+136>>2]=H[67370]|H[67371]<<8|(H[67372]<<16|H[67373]<<24);G[p+140>>2]=a;a=H[67366]|H[67367]<<8|(H[67368]<<16|H[67369]<<24);G[p+128>>2]=H[67362]|H[67363]<<8|(H[67364]<<16|H[67365]<<24);G[p+132>>2]=a;a=H[67358]|H[67359]<<8|(H[67360]<<16|H[67361]<<24);G[p+120>>2]=H[67354]|H[67355]<<8|(H[67356]<<16|H[67357]<<24);G[p+124>>2]=a;a=H[67350]|H[67351]<<8|(H[67352]<<16|H[67353]<<24);G[p+112>>2]=H[67346]|H[67347]<<8|(H[67348]<<16|H[67349]<<24);G[p+116>>2]=a;a=p+112|0;Ua(qb(a,s,80-Va(a)|0));break d}j:{s=i+w|0;if(!H[s|0]){break j}if(!Cb(a,82,s,f+q|0,0,o)){break j}Ua(25747);Ua(s);break d}s=f+q|0;u=L[s>>3];if(u==0){Ua(41873);r=322;G[o>>2]=322;break a}k:{if(u!=-91191291391491e-49){L[n+q>>3]=u;break k}G[p+28>>2]=0;v=G[t>>2];t=p+32|0;w=p+28|0;zb(34579,v,t,w);if((Cb(a,82,t,s,0,w)|0)<=0){break k}s=n+q|0;u=(L[m+q>>3]-L[l+q>>3])/10;L[s>>3]=u;if(!(u>1)){break k}G[s>>2]=0;G[s+4>>2]=1072693248}v=l+q|0;u=L[v>>3];w=m+q|0;y=L[w>>3];l:{m:{if(u>y){x=L[n+q>>3];if(x>0){break m}}x=L[n+q>>3];if(!(u>3]=x;y=L[w>>3];u=L[v>>3]}t=G[p+24>>2];if(O(x)<2147483648){q=~~x}else{q=-2147483648}if(O(y)<2147483648){s=~~y}else{s=-2147483648}A=(t|0)>41;if(O(u)<2147483648){t=~~u}else{t=-2147483648}n:{if(!(A|+(t|0)!=u|(+(s|0)!=y|+(q|0)!=x))){G[k+z>>2]=((s-t|0)/(q|0)|0)+1;if(u>3]=u+-.5;L[w>>3]=L[w>>3]+.5;break n}L[v>>3]=u+.5;L[w>>3]=L[w>>3]+-.5;break n}B=(y-u)/x;if(C){q=k+z|0;u=B+1;if(O(u)<2147483648){G[q>>2]=~~u;break n}G[q>>2]=-2147483648;break n}s=k+z|0;if(O(B)<2147483648){q=~~B}else{q=-2147483648}G[s>>2]=q;x=+(q|0)*x+u;if(u>2]=q+1;break n}if(!(x>y)){break n}G[s>>2]=q+1}r=r+1|0;if((r|0)!=(b|0)){continue}break}}r=G[o>>2];break a}a=p+112|0;Ua(qb(a,s,80-Va(a)|0));r=410;G[o>>2]=410}Fa=p+496|0;return r}function Vp(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=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,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Va=0,Wa=0,Xa=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;ga=1;j=Fa-400|0;Fa=j;a:{if(b-10>>>0<=4294967286){G[j>>2]=b;a=j+32|0;Ya(a,81,23817,j);Ua(a);G[i>>2]=320;break a}if(Nb(a,i)){if((b|0)!=1){c=b&-2;while(1){l=k<<3;m=j+32|0;t=l+m|0;o=k<<2;s=G[o+d>>2];G[t>>2]=s;G[t+4>>2]=s>>31;r=l;l=j+128|0;t=r+l|0;o=G[e+o>>2];G[t>>2]=o;G[t+4>>2]=o>>31;r=m;m=k|1;t=m<<3;o=r+t|0;m=m<<2;s=G[m+d>>2];G[o>>2]=s;G[o+4>>2]=s>>31;l=l+t|0;m=G[e+m>>2];G[l>>2]=m;G[l+4>>2]=m>>31;k=k+2|0;p=p+2|0;if((c|0)!=(p|0)){continue}break}}if(b&1){b=k<<3;c=b+(j+32|0)|0;m=d;d=k<<2;l=G[m+d>>2];G[c>>2]=l;G[c+4>>2]=l>>31;b=b+(j+128|0)|0;c=G[d+e>>2];G[b>>2]=c;G[b+4>>2]=c>>31}G[j+352>>2]=0;md(a,31,j+32|0,j+128|0,f,1,j+352|0,g,0,h,i);break a}if((Dc(a,j+124|0,i)|0)>0){break a}v=G[j+124>>2];b:{if(!v){m=1;ga=2;o=1;l=1;break b}k=b<<2;m=G[k+f>>2];o=G[d+k>>2];l=G[e+k>>2]}if(h){G[h>>2]=0}G[j+352>>2]=1;G[j+356>>2]=1;k=1;G[j+128>>2]=1;G[j+132>>2]=0;G[j+304>>2]=1;G[j+308>>2]=1;G[j+256>>2]=1;G[j+260>>2]=1;G[j+136>>2]=1;G[j+140>>2]=0;G[j+208>>2]=1;G[j+212>>2]=1;G[j+360>>2]=1;G[j+144>>2]=1;G[j+148>>2]=0;G[j+312>>2]=1;G[j+316>>2]=1;G[j+264>>2]=1;G[j+268>>2]=1;G[j+152>>2]=1;G[j+156>>2]=0;G[j+216>>2]=1;G[j+220>>2]=1;G[j+364>>2]=1;G[j+368>>2]=1;G[j+320>>2]=1;G[j+272>>2]=1;G[j+160>>2]=1;G[j+164>>2]=0;G[j+224>>2]=1;G[j+372>>2]=1;G[j+376>>2]=1;G[j+168>>2]=1;G[j+172>>2]=0;G[j+324>>2]=1;G[j+328>>2]=1;G[j+276>>2]=1;G[j+280>>2]=1;G[j+176>>2]=1;G[j+180>>2]=0;G[j+228>>2]=1;G[j+232>>2]=1;G[j+184>>2]=1;G[j+188>>2]=0;G[j+380>>2]=1;G[j+384>>2]=1;G[j+332>>2]=1;G[j+336>>2]=1;G[j+284>>2]=1;G[j+288>>2]=1;G[j+192>>2]=1;G[j+196>>2]=0;G[j+236>>2]=1;G[j+240>>2]=1;c:{while(1){q=p<<2;s=G[q+e>>2];r=G[d+q>>2];d:{if((s|0)>=(r|0)){u=G[q+(j+208|0)>>2];break d}if(v){break c}G[q+(j+208|0)>>2]=-1;u=-1}G[q+(j+304|0)>>2]=s;G[q+(j+352|0)>>2]=r;G[q+(j+256|0)>>2]=G[f+q>>2];w=j+128|0;s=p+1|0;r=w+(s<<3)|0;q=G[c+q>>2];q=Au(k,t,q,q>>31);G[r>>2]=q;x=r;r=Ia;G[x+4>>2]=r;p=w+(p<<3)|0;Cb=p,Db=Au(k,t,u,u>>31),G[Cb>>2]=Db;G[p+4>>2]=Ia;k=q;t=r;p=s;if((p|0)!=(b|0)){continue}break}d=(j+128|0)+(b<<3)|0;e=G[d>>2];k=e;e=G[(j+208|0)+(b<<2)>>2];Cb=d,Db=Au(k,G[d+4>>2],e,e>>31),G[Cb>>2]=Db;G[d+4>>2]=Ia;e:{if(!((b|0)!=1|G[c>>2]!=1)){k=(l-o|0)/(m|0)|0;l=o;d=m;break e}b=G[j+208>>2];d=M(b,G[j+256>>2]);k=(M(b,G[j+304>>2]-G[j+352>>2]|0)|0)/G[f>>2]|0}if((l|0)<(o|0)){break a}y=G[j+240>>2];$=M(y,G[j+384>>2]);b=M(y,G[j+336>>2]);if(($|0)>(b|0)){break a}z=G[j+236>>2];v=M(z,G[j+380>>2]);P=M(z,G[j+332>>2]);if((v|0)>(P|0)){break a}A=G[j+232>>2];w=M(A,G[j+376>>2]);Q=M(A,G[j+328>>2]);if((w|0)>(Q|0)){break a}B=G[j+228>>2];R=M(B,G[j+372>>2]);S=M(B,G[j+324>>2]);if((R|0)>(S|0)){break a}C=G[j+224>>2];s=M(C,G[j+368>>2]);T=M(C,G[j+320>>2]);if((s|0)>(T|0)){break a}D=G[j+220>>2];q=M(D,G[j+364>>2]);U=M(D,G[j+316>>2]);if((q|0)>(U|0)){break a}E=G[j+216>>2];r=M(E,G[j+360>>2]);V=M(E,G[j+312>>2]);if((r|0)>(V|0)){break a}F=G[j+212>>2];u=M(F,G[j+356>>2]);W=M(F,G[j+308>>2]);if((u|0)>(W|0)){break a}X=k+1|0;Aa=X>>31;Ba=G[j+192>>2];Ca=G[j+196>>2];Da=G[j+184>>2];Ea=G[j+188>>2];Ga=G[j+176>>2];Ha=G[j+180>>2];Ja=G[j+168>>2];Ka=G[j+172>>2];La=G[j+160>>2];Ma=G[j+164>>2];Na=G[j+152>>2];Oa=G[j+156>>2];Pa=G[j+144>>2];Qa=G[j+148>>2];c=G[j+352>>2];ha=c;Ra=c>>31;Sa=G[j+136>>2];Ta=G[j+140>>2];Va=l;ia=l>>31;ja=m;Wa=m>>31;aa=o;ba=o>>31;Xa=b;ka=b>>31;Za=y>>31;_a=$>>31;la=P>>31;$a=z>>31;H=G[j+284>>2];b=H;H=b;ab=b>>31;bb=v>>31;ma=Q>>31;cb=A>>31;I=G[j+280>>2];b=I;I=b;db=b>>31;eb=w>>31;na=S>>31;fb=B>>31;J=G[j+276>>2];b=J;J=b;gb=b>>31;hb=R>>31;oa=T>>31;ib=C>>31;K=G[j+272>>2];b=K;K=b;jb=b>>31;kb=s>>31;pa=U>>31;lb=D>>31;L=G[j+268>>2];b=L;L=b;mb=b>>31;nb=q>>31;qa=V>>31;ob=E>>31;N=G[j+264>>2];b=N;N=b;pb=b>>31;qb=r>>31;ra=W>>31;rb=F>>31;O=G[j+260>>2];b=O;O=b;sb=b>>31;tb=u>>31;b=G[j+288>>2];sa=b;ub=b>>31;e=0;while(1){o=$;ca=_a;while(1){f:{if(X){ta=Au(Ba,Ca,o-y|0,ca-((o>>>0>>0)+Za|0)|0);vb=Ia;c=v;f=bb;while(1){ua=Au(Da,Ea,c-z|0,f-((c>>>0>>0)+$a|0)|0);wb=Ia;l=w;m=eb;while(1){va=Au(Ga,Ha,l-A|0,m-((l>>>0>>0)+cb|0)|0);xb=Ia;p=R;da=hb;while(1){wa=Au(Ja,Ka,p-B|0,da-((p>>>0>>0)+fb|0)|0);yb=Ia;Y=s;ea=kb;while(1){xa=Au(La,Ma,Y-C|0,ea-((C>>>0>Y>>>0)+ib|0)|0);zb=Ia;Z=q;fa=nb;while(1){ya=Au(Na,Oa,Z-D|0,fa-((D>>>0>Z>>>0)+lb|0)|0);Ab=Ia;_=r;x=qb;while(1){za=Au(Pa,Qa,_-E|0,x-((E>>>0>_>>>0)+ob|0)|0);Bb=Ia;k=u;t=tb;while(1){if(G[i>>2]>0){break a}n=Au(Sa,Ta,k-F|0,t-((k>>>0>>0)+rb|0)|0)+ha|0;b=Ra+Ia|0;b=n>>>0>>0?b+1|0:b;n=n+za|0;b=b+Bb|0;b=n>>>0>>0?b+1|0:b;n=n+ya|0;b=b+Ab|0;b=n>>>0>>0?b+1|0:b;n=n+xa|0;b=b+zb|0;b=n>>>0>>0?b+1|0:b;n=n+wa|0;b=b+yb|0;b=n>>>0>>0?b+1|0:b;n=n+va|0;b=b+xb|0;b=n>>>0>>0?b+1|0:b;n=n+ua|0;b=b+wb|0;b=n>>>0>>0?b+1|0:b;n=n+ta|0;b=b+vb|0;Ud(a,ga,aa,ba,n,n>>>0>>0?b+1|0:b,X,Aa,d,1,0,(e<<2)+g|0,j+123|0,j+32|0,i);if(G[i>>2]>0){break a}if(!(!h|!G[j+32>>2])){G[h>>2]=1}e=e+X|0;b=t+sb|0;k=k+O|0;b=k>>>0>>0?b+1|0:b;t=b;if(k>>>0<=W>>>0&(ra|0)>=(b|0)|(b|0)<(ra|0)){continue}break}b=x+pb|0;k=N+_|0;b=k>>>0>>0?b+1|0:b;_=k;x=b;if(k>>>0<=V>>>0&(qa|0)>=(b|0)|(b|0)<(qa|0)){continue}break}b=fa+mb|0;k=L+Z|0;b=k>>>0>>0?b+1|0:b;Z=k;fa=b;if(k>>>0<=U>>>0&(pa|0)>=(b|0)|(b|0)<(pa|0)){continue}break}b=ea+jb|0;k=K+Y|0;b=k>>>0>>0?b+1|0:b;Y=k;ea=b;if(k>>>0<=T>>>0&(oa|0)>=(b|0)|(b|0)<(oa|0)){continue}break}b=da+gb|0;k=p+J|0;b=k>>>0>>0?b+1|0:b;p=k;da=b;if(k>>>0<=S>>>0&(na|0)>=(b|0)|(b|0)<(na|0)){continue}break}b=m+db|0;l=l+I|0;b=l>>>0>>0?b+1|0:b;m=b;if(l>>>0<=Q>>>0&(ma|0)>=(b|0)|(b|0)<(ma|0)){continue}break}b=f+ab|0;c=c+H|0;b=c>>>0>>0?b+1|0:b;f=b;if(c>>>0<=P>>>0&(la|0)>=(b|0)|(b|0)<(la|0)){continue}break}break f}g:{if(!h){break g}m=v;if(!G[j+32>>2]){break g}while(1){k=w;while(1){l=R;while(1){f=s;while(1){b=q;while(1){c=r;while(1){p=u;while(1){if(G[i>>2]>0){break a}G[h>>2]=1;p=p+O|0;if((W|0)>=(p|0)){continue}break}c=c+N|0;if((V|0)>=(c|0)){continue}break}b=b+L|0;if((U|0)>=(b|0)){continue}break}f=f+K|0;if((T|0)>=(f|0)){continue}break}l=l+J|0;if((S|0)>=(l|0)){continue}break}k=k+I|0;if((Q|0)>=(k|0)){continue}break}m=m+H|0;if((P|0)>=(m|0)){continue}break}break f}if(G[i>>2]>0){break a}}b=ca+ub|0;c=o+sa|0;b=c>>>0>>0?b+1|0:b;o=c;ca=b;if(c>>>0<=Xa>>>0&(ka|0)>=(b|0)|(b|0)<(ka|0)){continue}break}b=ba+Wa|0;c=aa+ja|0;b=c>>>0>>0?b+1|0:b;aa=c;ba=b;if(c>>>0<=Va>>>0&(ia|0)>=(b|0)|(b|0)<(ia|0)){continue}break}break a}G[j+16>>2]=p+1;a=j+32|0;Ya(a,81,26876,j+16|0);Ua(a);G[i>>2]=321}Fa=j+400|0}function Un(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=Fa-10176|0;Fa=d;G[d+9108>>2]=0;G[d+9104>>2]=0;G[d+9100>>2]=0;G[d+9096>>2]=6;G[d+9076>>2]=0;G[d+9072>>2]=0;G[d+9068>>2]=0;G[d+9064>>2]=0;G[d+9060>>2]=0;G[d+9056>>2]=0;G[d+6652>>2]=5001813;E[d+1119|0]=0;G[d+1112>>2]=0;if(!G[c>>2]){G[d+9080>>2]=G[G[a+4>>2]+84>>2];a:{if(G[d+9080>>2]!=1){Ua(58442);G[c>>2]=349;b=0;break a}j=c,k=Mj(a,d+1112|0,c),G[j>>2]=k;e=mb(G[d+1112>>2],b,d+9100|0,c);G[c>>2]=e;b=0;if(e){break a}b=Fc(G[d+1112>>2],34516,d+6736|0,d+1120|0,c);G[c>>2]=b;b:{if((b|0)==202){G[d+6736>>2]=1296650832;G[d+6740>>2]=5853761;G[c>>2]=0;break b}b=Va(d+6736|0);if(H[d+6736|0]!=39|H[(b+d|0)+6735|0]!=39){break b}b=b-2|0;if((b|0)>0){e=d+6736|0;yd(e,e|1,b)}E[b+(d+6736|0)|0]=0}b=0;c:{d:{e=Va(d+6736|0)-1|0;if((e|0)<=0){break d}while(1){if(H[(d+6736|0)+b|0]!=32){break d}b=b+1|0;if((e|0)!=(b|0)){continue}break}break c}if((b|0)==(e|0)|(e|0)<0){break c}while(1){b=(d+6736|0)+e|0;if(H[b|0]!=32){break c}E[b|0]=0;b=(e|0)>0;e=e-1|0;if(b){continue}break}}b=Ec(G[d+1112>>2],33996,d+9076|0,d+1120|0,c);G[c>>2]=b;if((b|0)==202){G[d+9076>>2]=1;G[c>>2]=0}b=Fc(G[d+1112>>2],35480,d+6656|0,d+1120|0,c);G[c>>2]=b;e:{if((b|0)==202){E[d+6656|0]=0;G[c>>2]=0;break e}b=Va(d+6656|0);if(H[d+6656|0]!=39|H[(b+d|0)+6655|0]!=39){break e}b=b-2|0;if((b|0)>0){e=d+6656|0;yd(e,e|1,b)}E[b+(d+6656|0)|0]=0}b=0;f:{g:{e=Va(d+6656|0)-1|0;if((e|0)<=0){break g}while(1){if(H[(d+6656|0)+b|0]!=32){break g}b=b+1|0;if((e|0)!=(b|0)){continue}break}break f}if((b|0)==(e|0)|(e|0)<0){break f}while(1){b=(d+6656|0)+e|0;if(H[b|0]!=32){break f}E[b|0]=0;b=(e|0)>0;e=e-1|0;if(b){continue}break}}G[d+9108>>2]=G[G[d+1112>>2]>>2]+1;j=c,k=yf(G[d+1112>>2],d+7856|0,d+6816|0,d+8976|0,d+8896|0,d+9088|0,c),G[j>>2]=k;if(!H[d+7856|0]){Za(d+7856|0,d+6816|0);Za(d+8976|0,d+8896|0)}e=yf(a,d+5456|0,d+4416|0,d+6576|0,d+6496|0,d+9084|0,c);G[c>>2]=e;b=0;if(e){break a}if(!G[d+9084>>2]){Ua(58442);G[c>>2]=349;break a}h:{i:{if(!Ib(d+6576|0,42185)){break i}if(!Ib(d+8976|0,42185)){break i}E[d+1296|0]=0;break h}e=G[c>>2];j:{if(e){break j}if(!ui(d+9136|0,1025)){E[d+1296|0]=0;Ua(61910);e=125;break j}bf(d+9136|0,1025,d+1296|0,c);e=G[c>>2]}G[c>>2]=e;if(!Ib(d+8976|0,42185)){k:{if(H[d+7856|0]==47){Za(d+6816|0,d+7856|0);break k}e=Za(d+6816|0,d+1296|0);if((Va(e)+Va(d+7856|0)|0)-1024>>>0<=4294966270){Ua(58292);G[c>>2]=125;break a}g=Va(e)+e|0;E[g|0]=47;E[g+1|0]=0;Gb(e,d+7856|0)}j=c,k=_d(d+6816|0,d+7856|0,c),G[j>>2]=k}if(!Ib(d+6576|0,42185)){l:{if(H[d+5456|0]==47){Za(d+4416|0,d+5456|0);break l}e=Za(d+4416|0,d+1296|0);if((Va(e)+Va(d+5456|0)|0)-1024>>>0<=4294966270){Ua(58338);G[c>>2]=125;break a}g=Va(e)+e|0;E[g|0]=47;E[g+1|0]=0;Gb(e,d+5456|0)}j=c,k=_d(d+4416|0,d+5456|0,c),G[j>>2]=k}if(Ib(d+6576|0,42185)){break h}if(Ib(d+8976|0,42185)){break h}e=d+7856|0;g=d+5456|0;f=d+4416|0;Tn(e,g,f,c);h=d+6816|0;Tn(g,e,h,c);Za(e,h);Za(g,f)}j=c,k=Ec(a,33996,d+9072|0,d+1120|0,c),G[j>>2]=k;se(G[G[G[d+1112>>2]+4>>2]+12>>2],d+3376|0,c);se(G[G[a+4>>2]+12>>2],d+2336|0,c);m:{if(G[G[d+1112>>2]+4>>2]==G[a+4>>2]){break m}if(!fb(d+3376|0,d+2336|0,1025)){break m}G[d+9072>>2]=0-G[d+9072>>2]}j=c,k=ik(a,d+9064|0,c),G[j>>2]=k;e=hk(a,d+6736|0,d+6656|0,G[d+9076>>2],G[d+9108>>2],d+7856|0,d+9068|0,c);G[c>>2]=e;n:{if(e){if((e|0)!=342){break a}G[c>>2]=0;b=G[d+9064>>2];j=c,k=Ig(a,b,b>>31,1,0,c),G[j>>2]=k;G[d+9064>>2]=G[d+9064>>2]+1;j=c,k=jk(a,d+9132|0,d+9128|0,d+9124|0,d+9120|0,d+9116|0,d+9112|0,d+9104|0,c),G[j>>2]=k;G[d+1292>>2]=d+6736;b=G[d+9132>>2];if(b){e=b;b=G[d+9064>>2];dg(a,e,b,b>>31,1,0,1,0,d+1292|0,c)}G[d+1292>>2]=d+6656;b=G[d+9128>>2];o:{if(!b){break o}e=G[d+9064>>2];g=e>>31;if(H[d+6656|0]){dg(a,b,e,g,1,0,1,0,d+1292|0,c);break o}pe(a,b,e,g,1,0,1,0,d+1119|0,c)}b=G[d+9124>>2];if(b){e=b;b=G[d+9064>>2];xe(a,e,b,b>>31,1,0,1,0,d+9076|0,c)}b=G[d+9120>>2];if(b){e=b;b=G[d+9064>>2];Jo(a,e,b,b>>31,1,0,1,0,d+9108|0,c)}G[d+1292>>2]=d+7856;p:{if(!G[d+9116>>2]){break p}se(G[G[G[d+1112>>2]+4>>2]+12>>2],d+3376|0,c);se(G[G[a+4>>2]+12>>2],d+2336|0,c);q:{if(G[G[d+1112>>2]+4>>2]==G[a+4>>2]){break q}if(!fb(d+3376|0,d+2336|0,1025)){break q}b=G[d+9064>>2];dg(a,G[d+9116>>2],b,b>>31,1,0,1,0,d+1292|0,c);break p}b=G[d+9064>>2];pe(a,G[d+9116>>2],b,b>>31,1,0,1,0,d+1119|0,c)}G[d+1292>>2]=d+6652;b=0;if(!G[d+9112>>2]){break n}se(G[G[G[d+1112>>2]+4>>2]+12>>2],d+3376|0,c);se(G[G[a+4>>2]+12>>2],d+2336|0,c);r:{if(G[G[d+1112>>2]+4>>2]==G[a+4>>2]){break r}if(!fb(d+3376|0,d+2336|0,1025)){break r}e=G[d+9064>>2];dg(a,G[d+9112>>2],e,e>>31,1,0,1,0,d+1292|0,c);break n}e=G[d+9064>>2];pe(a,G[d+9112>>2],e,e>>31,1,0,1,0,d+1119|0,c);break n}Ua(58480);b=341}if(G[c>>2]){break a}G[d+9080>>2]=G[G[G[d+1112>>2]+4>>2]+84>>2];if(!(G[d+9080>>2]==1?G[d+9088>>2]:0)){Ua(58588);Ua(d+7856|0);break a}j=c,k=lh(G[d+1112>>2],d+9060|0,c),G[j>>2]=k;G[d+9092>>2]=1;s:{g=G[d+9060>>2];if((g|0)<=0){break s}h=H[d+1296|0];t:{while(1){if(G[c>>2]){break s}G[d+64>>2]=g;e=d+1216|0;Ya(e,75,30030,d- -64|0);j=c,k=Ec(G[d+1112>>2],e,d+9056|0,d+1120|0,c),G[j>>2]=k;e=0;f=G[d+9056>>2];u:{if((f|0)!=G[d+9072>>2]){break u}if((f|0)>=0){G[d+9092>>2]=G[d+9092>>2]+1;break t}G[d+48>>2]=g;f=d+1216|0;Ya(f,75,30038,d+48|0);f=Di(0,f,d+6812|0,d+1120|0,c);G[c>>2]=f;if(!f){f=G[d+6812>>2];Za(d+9136|0,f);Wa(f)}v:{w:{if(!h){break w}x:{if(ad(d+9136|0)){break x}bf(d+9136|0,1025,d+4416|0,c);if(H[d+4416|0]==47){break x}f=Za(d+80|0,d+1296|0);if((Va(f)+Va(d+4416|0)|0)-1024>>>0<4294966271){break v}i=Va(f)+f|0;E[i|0]=47;E[i+1|0]=0;_d(Gb(f,d+4416|0),d+9136|0,c)}if(ad(d+5456|0)){break w}bf(d+5456|0,1025,d+4416|0,c);if(H[d+4416|0]==47){break w}f=Za(d+80|0,d+1296|0);if((Va(f)+Va(d+4416|0)|0)-1024>>>0<4294966271){break v}e=Va(f)+f|0;E[e|0]=47;E[e+1|0]=0;e=d+4416|0;_d(Gb(f,e),e,c)}e=!Xa(d+9136|0,d+4416|0);break u}Ua(58247);G[c>>2]=125}f=G[d+9092>>2];G[d+9092>>2]=f+1;if(!e&(f|0)<(g|0)){continue}break}if(!e){break s}}Ua(58383);break a}if(!g){e=0;G[d+9092>>2]=0;f=202;G[c>>2]=202;h=G[d+9096>>2];y:{if((h|0)>0){while(1){if((f|0)!=202){break y}G[c>>2]=0;f=kc(G[d+1112>>2],G[(e<<2)+120048>>2],d+1120|0,c);G[c>>2]=f;e=e+1|0;G[d+9092>>2]=e;if((e|0)<(h|0)){continue}break}if((f|0)!=202){break y}}G[c>>2]=0;Td(G[d+1112>>2],d+9096|0,d+9092|0,c);Sd(G[d+1112>>2],G[d+9096>>2],d+1120|0,c);f=G[c>>2]}if(f){break a}}e=g+1|0;G[d+9060>>2]=e;se(G[G[G[d+1112>>2]+4>>2]+12>>2],d+3376|0,c);se(G[G[a+4>>2]+12>>2],d+2336|0,c);z:{if(G[G[d+1112>>2]+4>>2]!=G[a+4>>2]){if(fb(d+3376|0,d+2336|0,1025)){break z}}G[d>>2]=e;a=d+1216|0;Ya(a,75,30030,d);e=a;a=G[d+9072>>2];Fh(G[d+1112>>2],e,a,a>>31,33159,c);break a}G[d+32>>2]=e;a=d+1216|0;Ya(a,75,30030,d+32|0);g=G[d+9072>>2];Fh(G[d+1112>>2],a,g,g>>31,33159,c);G[d+16>>2]=e;Ya(a,75,30038,d+16|0);uq(G[d+1112>>2],a,d+5456|0,13320,c);nq(G[d+1112>>2],c)}a=Qb(G[d+1112>>2],c);G[c>>2]=a?a:b}Fa=d+10176|0}function qf(a,b,c,d,e){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,H=0;w=Fa-16|0;Fa=w;a:{if(!a){break a}g=d|e;if((g|0)<0){hb(86572,46,1,G[24367]);break a}if(!g){h=Ee(a,b,c);break a}k=ab(64);g=G[a+36>>2];f=G[a+40>>2];i=G[a+32>>2];G[k+32>>2]=i;b:{c:{if(i-1>>>0<=2){i=f-1|0;o=(e|0)>(i|0)?i:e;e=g-1|0;l=(d|0)>(e|0)?e:d;d=G[a+44>>2];G[k+44>>2]=d;d:{e:{f:{switch(d|0){case 0:d=(l|0)<=0;if(!(d|(o|0)<=0)){G[k+36>>2]=1;G[k+40>>2]=1;g=1;f=1;d=1;break e}if(!d){f=1;G[k+40>>2]=1;d=g-l|0;g=(d|0)>1?d:1;G[k+36>>2]=g;d=g;break e}d=1;if((o|0)<=0){break d}G[k+36>>2]=1;e=f-o|0;g=(e|0)>1?e:1;G[k+40>>2]=g;f=g;break e;case 2:d=((g|0)>(f|0)?g:f)-(l+o|0)|0;e=f-o|0;e=(d|0)<(e|0)?d:e;f=(e|0)>1?e:1;G[k+40>>2]=f;e=g-l|0;d=(d|0)<(e|0)?d:e;d=(d|0)>1?d:1;G[k+36>>2]=d;e=d>>>0>>0?d:f;g=M(d,f)+((M(e-1|0,e)|0)/-2|0)|0;break e;default:break f}}d=f-o|0;f=(d|0)>1?d:1;G[k+40>>2]=f;d=g-l|0;d=(d|0)>1?d:1;G[k+36>>2]=d;g=M(d,f)}G[k+48>>2]=g}L[k>>3]=L[a>>3];L[k+8>>3]=L[a+8>>3];L[k+16>>3]=L[a+16>>3];L[k+24>>3]=L[a+24>>3];F=k,H=ab(g<<3),G[F+52>>2]=H;F=k,H=ab(d<<3),G[F+56>>2]=H;F=k,H=ab(f<<3),G[F+60>>2]=H;f=G[a+48>>2];d=f<<3;e=G[321349];if((d|0)>(e|0)){break c}g=G[321350];break b}G[w>>2]=i;_a(G[24367],75005,w);break a}g:{if((e|0)>0){g=ub(G[321350],d);f=G[a+48>>2];break g}g=ab(d)}G[321349]=d;G[321350]=g}h:{if((f|0)<=0){break h}i=G[a+52>>2];e=0;d=0;if(f-1>>>0>=3){n=f&-4;while(1){j=d<<3;L[j+g>>3]=L[i+j>>3];q=j|8;L[q+g>>3]=L[i+q>>3];q=j|16;L[q+g>>3]=L[i+q>>3];j=j|24;L[j+g>>3]=L[i+j>>3];d=d+4|0;m=m+4|0;if((n|0)!=(m|0)){continue}break}}m=f&3;if(!m){break h}while(1){j=d<<3;L[j+g>>3]=L[i+j>>3];d=d+1|0;e=e+1|0;if((m|0)!=(e|0)){continue}break}}i:{j:{switch(G[k+44>>2]-1|0){case 0:d=G[a+40>>2];if((d|0)<=(o|0)){break i}e=G[k+36>>2];v=(e|0)<=0;t=v|(o|0)<=0;r=e&-4;q=e&3;u=e-1|0;d=d-1|0;m=G[a+36>>2];g=(M(d,m)<<3)+g|0;n=G[k+52>>2]+(M(e,G[k+40>>2]-1|0)<<3)|0;z=0-m<<3;A=0-e<<3;while(1){e=d;if(!t){i=e-o|0;a=e;while(1){h=+(a|0);f=0;d=0;j=0;if(u>>>0>=3){while(1){p=(d+l<<3)+g|0;L[p>>3]=L[p>>3]*h;p=((d|1)+l<<3)+g|0;L[p>>3]=L[p>>3]*h;p=((d|2)+l<<3)+g|0;L[p>>3]=L[p>>3]*h;p=((d|3)+l<<3)+g|0;L[p>>3]=L[p>>3]*h;d=d+4|0;j=j+4|0;if((r|0)!=(j|0)){continue}break}}if(q){while(1){j=(d+l<<3)+g|0;L[j>>3]=L[j>>3]*h;d=d+1|0;f=f+1|0;if((q|0)!=(f|0)){continue}break}}a=a-1|0;if((i|0)<(a|0)){continue}break}}i=0;a=m;if((l|0)<(a|0)){while(1){j=a-1|0;if((l|0)>0){f=m-(l+i|0)|0;d=m+(i^-1)|0;p=(d|0)>(f|0)?f:d;B=d-p|0;x=(j<<3)+g|0;h=L[x>>3];f=0;d=a;p=d-p&7;if(p){while(1){d=d-1|0;h=h*+(d|0);f=f+1|0;if((p|0)!=(f|0)){continue}break}}if(B>>>0>=7){a=a-l|0;while(1){h=h*+(d-1|0)*+(d-2|0)*+(d-3|0)*+(d-4|0)*+(d-5|0)*+(d-6|0)*+(d-7|0);d=d-8|0;h=h*+(d|0);if((a|0)<(d|0)){continue}break}}L[x>>3]=h}i=i+1|0;a=j;if((l|0)<(a|0)){continue}break}}k:{if(v){break k}f=0;d=0;j=0;if(u>>>0>=3){while(1){L[(d<<3)+n>>3]=L[(d+l<<3)+g>>3];a=d|1;L[(a<<3)+n>>3]=L[(a+l<<3)+g>>3];a=d|2;L[(a<<3)+n>>3]=L[(a+l<<3)+g>>3];a=d|3;L[(a<<3)+n>>3]=L[(a+l<<3)+g>>3];d=d+4|0;j=j+4|0;if((r|0)!=(j|0)){continue}break}}if(!q){break k}while(1){L[(d<<3)+n>>3]=L[(d+l<<3)+g>>3];d=d+1|0;f=f+1|0;if((q|0)!=(f|0)){continue}break}}d=e-1|0;g=g+z|0;n=n+A|0;if((e|0)>(o|0)){continue}break};break i;default:d=(l|0)<=0;if(!(d|(o|0)<=0)){a=G[k+52>>2];G[a>>2]=0;G[a+4>>2]=0;break i}if(!d){a=G[a+36>>2];if((a|0)<=(l|0)){break i}j=G[k+52>>2]+(G[k+48>>2]<<3)|0;m=0;e=a;while(1){f=a-(l+m|0)|0;d=a+(m^-1)|0;n=(d|0)>(f|0)?f:d;q=d-n|0;i=e-1|0;r=(i<<3)+g|0;h=L[r>>3];f=0;d=e;n=d-n&7;if(n){while(1){d=d-1|0;h=h*+(d|0);f=f+1|0;if((n|0)!=(f|0)){continue}break}}j=j-8|0;if(q>>>0>=7){e=e-l|0;while(1){h=h*+(d-1|0)*+(d-2|0)*+(d-3|0)*+(d-4|0)*+(d-5|0)*+(d-6|0)*+(d-7|0);d=d-8|0;h=h*+(d|0);if((d|0)>(e|0)){continue}break}}L[r>>3]=h;L[j>>3]=h;m=m+1|0;e=i;if((l|0)<(e|0)){continue}break}break i}if((o|0)<=0){break i}f=(f<<3)+g|0;g=G[k+52>>2];a=G[a+40>>2];l:{if((a|0)<=(o|0)){break l}i=o+1|0;e=a-o|0;if(e&1){f=f-8|0;h=L[f>>3];d=a;while(1){d=d-1|0;h=h*+(d|0);if((d|0)>(e|0)){continue}break}L[f>>3]=h;e=a-1|0}else{e=a}if((a|0)==(i|0)){break l}while(1){a=e-o|0;i=f-8|0;h=L[i>>3];d=e;while(1){d=d-1|0;h=h*+(d|0);if((a|0)<(d|0)){continue}break}L[i>>3]=h;d=e-1|0;a=d-o|0;f=f-16|0;h=L[f>>3];while(1){d=d-1|0;h=h*+(d|0);if((a|0)<(d|0)){continue}break}L[f>>3]=h;e=e-2|0;if((o|0)<(e|0)){continue}break}}i=G[k+48>>2];if((i|0)<=0){break i}e=0;d=0;if(i-1>>>0>=3){j=i&-4;m=0;while(1){a=d<<3;L[a+g>>3]=L[a+f>>3];n=a|8;L[n+g>>3]=L[f+n>>3];n=a|16;L[n+g>>3]=L[f+n>>3];a=a|24;L[a+g>>3]=L[a+f>>3];d=d+4|0;m=m+4|0;if((j|0)!=(m|0)){continue}break}}a=i&3;if(!a){break i}while(1){i=d<<3;L[i+g>>3]=L[f+i>>3];d=d+1|0;e=e+1|0;if((a|0)!=(e|0)){continue}break};break i;case 1:break j}}e=G[a+40>>2];if((o|0)>=(e|0)){break i}r=G[a+36>>2];a=(e|0)<(r|0)?r:e;z=a+1|0;A=1-o|0;B=(a-e|0)+1|0;g=(f<<3)+g|0;n=G[k+52>>2]+(G[k+48>>2]<<3)|0;q=G[k+36>>2];a=G[k+40>>2];a=((a|0)<(q|0)?q:a)+o|0;x=a+1|0;D=(a-e|0)+1|0;u=D;while(1){a=x-e|0;p=(a|0)<(q|0)?a:q;E=(p|0)>0?p:0;a=z-e|0;a=(a|0)<(r|0)?a:r;a=(a|0)>0?a:0;g=g-(a<<3)|0;t=e+A|0;if(!((p|0)<=0|(t|0)>=(e|0))){d=v+D|0;d=(d|0)>(q|0)?q:d;d=(d|0)>0?d:0;C=d-1|0;y=d&2147483644;m=d&3;i=e;while(1){i=i-1|0;h=+(i|0);f=0;d=0;j=0;if(C>>>0>=3){while(1){s=(d+l<<3)+g|0;L[s>>3]=L[s>>3]*h;s=((d|1)+l<<3)+g|0;L[s>>3]=L[s>>3]*h;s=((d|2)+l<<3)+g|0;L[s>>3]=L[s>>3]*h;s=((d|3)+l<<3)+g|0;L[s>>3]=L[s>>3]*h;d=d+4|0;j=j+4|0;if((y|0)!=(j|0)){continue}break}}if(m){while(1){j=(d+l<<3)+g|0;L[j>>3]=L[j>>3]*h;d=d+1|0;f=f+1|0;if((m|0)!=(f|0)){continue}break}}if((i|0)>(t|0)){continue}break}}if((a|0)>(l|0)){d=v+B|0;d=(d|0)>(r|0)?r:d;j=(d|0)>0?d:0;m=0;while(1){i=a-1|0;if((l|0)>0){f=j-(l+m|0)|0;d=j+(m^-1)|0;t=(d|0)>(f|0)?f:d;C=d-t|0;y=(i<<3)+g|0;h=L[y>>3];f=0;d=a;t=d-t&7;if(t){while(1){d=d-1|0;h=h*+(d|0);f=f+1|0;if((t|0)!=(f|0)){continue}break}}if(C>>>0>=7){a=a-l|0;while(1){h=h*+(d-1|0)*+(d-2|0)*+(d-3|0)*+(d-4|0)*+(d-5|0)*+(d-6|0)*+(d-7|0);d=d-8|0;h=h*+(d|0);if((a|0)<(d|0)){continue}break}}L[y>>3]=h}m=m+1|0;a=i;if((l|0)<(a|0)){continue}break}}n=n-(E<<3)|0;m:{if((p|0)<=0){break m}a=(q|0)<(u|0)?q:u;a=(a|0)>0?a:0;i=a&3;f=0;d=0;if(a-1>>>0>=3){a=a&2147483644;j=0;while(1){L[(d<<3)+n>>3]=L[(d+l<<3)+g>>3];m=d|1;L[(m<<3)+n>>3]=L[(l+m<<3)+g>>3];m=d|2;L[(m<<3)+n>>3]=L[(l+m<<3)+g>>3];m=d|3;L[(m<<3)+n>>3]=L[(l+m<<3)+g>>3];d=d+4|0;j=j+4|0;if((a|0)!=(j|0)){continue}break}}if(!i){break m}while(1){L[(d<<3)+n>>3]=L[(d+l<<3)+g>>3];d=d+1|0;f=f+1|0;if((i|0)!=(f|0)){continue}break}}v=v+1|0;u=u+1|0;e=e-1|0;if((o|0)<(e|0)){continue}break}}h=Ee(k,b,c);if(G[k+32>>2]!=3){b=L[k+16>>3];h=h*($b(L[k>>3],+(l|0))*$b(b,+(o|0)))}a=G[k+56>>2];if(a){Wa(a)}a=G[k+60>>2];if(a){Wa(a)}a=G[k+52>>2];if(a){Wa(a)}Wa(k)}Fa=w+16|0;return h}function Wl(a){var 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,A=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,M=0,N=0,P=0;g=Fa-544|0;Fa=g;if(a){j=G[935573];n=G[29763];y=1e99;k=a;while(1){a:{if((j|0)<=1){z=G[k+4>>2];s=z?z:a;break a}yb(48596);G[g+528>>2]=C;kb(86337,g+528|0);$a(n);z=G[k+4>>2];s=z?z:a;j=G[935573];if((j|0)<2){break a}j=G[G[k>>2]+48>>2];G[g+516>>2]=G[G[s>>2]+48>>2];G[g+512>>2]=j;kb(74948,g+512|0);$a(n);j=G[935573]}k=G[k>>2];b=L[k+16>>3];s=G[s>>2];e=L[s+24>>3];c=L[k+24>>3];f=L[s+16>>3];i=b*e-c*f;h=c;c=L[s+32>>3];d=L[k+32>>3];q=h*c-d*e;o=d*f-b*c;b=V(i*i+(q*q+o*o));if(!(!(b>3]=b;gb(73024,g+496|0);$a(n)}if(!(b<=0)){o=o/b;q=q/b;i=i/b}C=C+1|0;j=G[935573];l=L[23878];p=-q;v=-o;f=999;h=-999;s=a;while(1){A=G[s>>2];c=L[A+16>>3];e=L[A+24>>3];b=c*o+e*p;d=L[A+32>>3];e=e*i+d*v;c=q*d-c*i;d=V(b*b+(e*e+c*c));if(!(!(d>3]=d;gb(73024,g+480|0);$a(n)}if(!(d<=0)){c=c/d;e=e/d;b=b/d}d=L[k+32>>3];r=L[k+16>>3];m=L[k+24>>3];t=b*d+(e*r+c*m);l=L[23878];u=e*m-c*r;m=c*d-b*m;d=b*r-e*d;d=V(u*u+(m*m+d*d));j=G[935573];if(!(!(l>d)|(j|0)<3)){L[g+464>>3]=d;gb(73024,g+464|0);$a(n);l=L[23878];j=G[935573]}d=Db(d<=0?0:d,t);if(dh){D=e;E=c;F=b;h=d}s=G[s+4>>2];if(s){continue}break}if((j|0)>=2){L[g+448>>3]=f;gb(72101,g+448|0);L[g+432>>3]=h;gb(72086,g+432|0);$a(n);j=G[935573]}b=q*x-o*w;e=o*B-i*x;c=i*w-q*B;f=V(b*b+(e*e+c*c));if(!(!(f>3]=f;gb(73024,g+416|0);$a(n)}if(!(f<=0)){c=c/f;e=e/f;b=b/f}f=q*E-o*D;l=o*F-i*E;d=p*F+i*D;h=V(f*f+(l*l+d*d));if(!(!(h>3]=h;gb(73024,g+400|0);$a(n)}if(!(h<=0)){d=d/h;l=l/h;f=f/h}h=b+f;r=e+l;m=c+d;b=V(h*h+(r*r+m*m));if(!(!(b>3]=b;gb(73024,g+384|0);$a(n)}if(!(b<=0)){m=m/b;r=r/b;h=h/b}b=Db(m,r);e=fc(h);c=L[467827];b=b/c;if(b>=360){while(1){b=b+-360;if(b>=360){continue}break}}if(b<0){while(1){b=b+360;if(b<0){continue}break}}if(G[935573]>=2){yb(86384);L[g+376>>3]=e/c;L[g+368>>3]=b;gb(71544,g+368|0);$a(n)}v=r*o+m*p;t=m*i-h*o;u=q*h-r*i;p=V(v*v+(t*t+u*u));A=p<=0;b=A?1:p;H=u/b;I=v/b;J=t/b;P=-J;s=G[935573];l=L[23878];f=999;k=a;while(1){j=G[k>>2];if(!(!(l>p)|(s|0)<3)){L[g+352>>3]=p;gb(73024,g+352|0);$a(n);l=L[23878];s=G[935573]}e=L[j+24>>3];c=L[j+16>>3];b=J*e-H*c;d=L[j+32>>3];e=H*d-I*e;c=P*d+I*c;d=V(b*b+(e*e+c*c));if(!(!(d>3]=d;gb(73024,g+336|0);$a(n);l=L[23878];s=G[935573]}if(!(d<=0)){c=c/d;e=e/d;b=b/d}d=i*b+(q*e+o*c);if(d>2];if(k){continue}break}if(!(!(l>p)|(s|0)<3)){L[g+320>>3]=p;gb(73024,g+320|0);$a(n)}if(!A){t=t/p;u=u/p;v=v/p}e=K*u-M*t;c=M*v-N*u;f=N*t-K*v;b=V(e*e+(c*c+f*f));if(!(!(b>3]=b;gb(73024,g+304|0);$a(n)}if(!(b<=0)){f=f/b;c=c/b;e=e/b}b=Db(f,c);d=fc(e);i=L[467827];b=b/i;if(b>=360){while(1){b=b+-360;if(b>=360){continue}break}}if(b<0){while(1){b=b+360;if(b<0){continue}break}}j=G[935573];if((j|0)>=2){yb(86378);L[g+296>>3]=d/i;L[g+288>>3]=b;gb(71544,g+288|0);$a(n);j=G[935573]}o=h+e;q=r+c;p=m+f;b=V(o*o+(q*q+p*p));if(!(!(b>3]=b;gb(73024,g+272|0);$a(n)}if(!(b<=0)){p=p/b;q=q/b;o=o/b}b=Db(p,q);d=fc(o);u=b;b=L[467827];l=u/b;if(l>=360){while(1){l=l+-360;if(l>=360){continue}break}}if(l<0){while(1){l=l+360;if(l<0){continue}break}}v=d/b;j=G[935573];if((j|0)>=2){yb(86169);L[g+264>>3]=v;L[g+256>>3]=l;gb(71544,g+256|0);$a(n);j=G[935573]}i=c*m+f*-r;f=f*h-e*m;c=r*e-c*h;b=V(i*i+(f*f+c*c));if(!(!(b>3]=b;gb(73024,g+240|0);$a(n)}if(!(b<=0)){i=i/b;f=f/b;c=c/b}b=Db(c,f);d=fc(i);e=L[467827];b=b/e;if(b>=360){while(1){b=b+-360;if(b>=360){continue}break}}if(b<0){while(1){b=b+360;if(b<0){continue}break}}j=G[935573];if((j|0)>=2){yb(86373);L[g+232>>3]=d/e;L[g+224>>3]=b;gb(71544,g+224|0);$a(n);j=G[935573];e=L[467827]}d=Sc(i+(f*0+c*0));b=Sc(o+(q*0+p*0));c=Sc(o*i+(q*f+p*c));f=ib(b);h=ib(c);b=eb(b);c=eb(c);d=Sc((eb(d)-b*c)/(f*h))/e;if((j|0)>=2){yb(86236);L[g+208>>3]=d;gb(70953,g+208|0);$a(n);e=L[467827]}f=v*e;b=ib(f);L[467844]=b;L[467858]=b;i=d*e;c=eb(i);h=eb(f);r=c*h;L[467850]=r;f=ib(i);i=h*f;L[467847]=i;m=l*e;e=ib(m);t=h*e;L[467843]=t;u=h;h=eb(m);m=u*h;L[467842]=m;L[467860]=r;L[467859]=i;L[467855]=t;L[467852]=m;i=b*-c;r=f*h;L[467849]=e*i-r;m=f*e;L[467848]=m+h*i;i=c*h;t=b*-f;L[467846]=i+e*t;u=h*t;t=c*e;L[467845]=u-t;e=b*-e;L[467857]=c*e-r;L[467856]=e*f+i;b=b*-h;L[467854]=c*b+m;L[467853]=b*f-t;e=1e20;c=-1e20;f=-1e20;i=1e20;j=a;while(1){k=G[j>>2];Vl(L[k>>3],L[k+8>>3]);b=L[467839];c=b>c?b:c;e=bf?b:f;i=b>2];if(j){continue}break}j=G[935573];if((j|0)>=2){L[g+192>>3]=i;gb(71604,g+192|0);L[g+176>>3]=f;gb(71574,g+176|0);L[g+160>>3]=e;gb(71589,g+160|0);L[g+144>>3]=c;gb(71559,g+144|0);$a(n);j=G[935573]}b=O(i);f=O(f);b=b>f?b:f;b=b+b;e=O(e);c=O(c);e=c=2){L[g+128>>3]=e;gb(71619,g+128|0);$a(n);j=G[935573]}if(e=180){while(1){d=d+-360;if(d>=180){continue}break}}f=d>90?d+-180:d;f=f<-90?f+180:f;k=f>45;d=k?c:b;c=k?b:c;b=k?f+-90:f;k=b<-45;f=k?d:c;b=k?b+90:b;if(b<=0){while(1){b=b+360;if(b<=0){continue}break}}L[467823]=f;L[467822]=k?c:d;L[467819]=o;L[467818]=p;L[467817]=q;L[467816]=v;L[467815]=l;L[467824]=b;y=e}k=z;if(k){continue}break}}f=L[467827];c=L[467816]*f;b=ib(c);L[467844]=b;L[467858]=b;h=f*L[467824];e=eb(h);d=eb(c);y=e*d;L[467850]=y;c=ib(h);h=d*c;L[467847]=h;w=f*L[467815];f=ib(w);x=d*f;L[467843]=x;B=d;d=eb(w);w=B*d;L[467842]=w;L[467860]=y;L[467859]=h;L[467855]=x;L[467852]=w;h=b*-e;y=c*d;L[467849]=f*h-y;w=c*f;L[467848]=w+d*h;h=e*d;x=b*-c;L[467846]=h+f*x;B=d*x;x=e*f;L[467845]=B-x;f=b*-f;L[467857]=e*f-y;L[467856]=f*c+h;b=b*-d;L[467854]=e*b+w;L[467853]=b*c-x;mf(L[467822]*-.5,L[467823]*-.5);L[467787]=L[467840];L[467788]=L[467841];mf(L[467822]*.5,L[467823]*-.5);L[467794]=L[467840];L[467795]=L[467841];mf(L[467822]*.5,L[467823]*.5);L[467801]=L[467840];L[467802]=L[467841];mf(L[467822]*-.5,L[467823]*.5);L[467808]=L[467840];L[467809]=L[467841];if(G[935573]>=2){L[g+112>>3]=L[467815];L[g+120>>3]=L[467816];gb(71674,g+112|0);L[g+96>>3]=L[467822];gb(71917,g+96|0);L[g+80>>3]=L[467823];gb(71843,g+80|0);L[g+64>>3]=L[467824];gb(71823,g- -64|0);L[g+48>>3]=L[467787];L[g+56>>3]=L[467788];gb(71782,g+48|0);L[g+32>>3]=L[467794];L[g+40>>3]=L[467795];gb(71755,g+32|0);L[g+16>>3]=L[467801];L[g+24>>3]=L[467802];gb(71728,g+16|0);L[g>>3]=L[467808];L[g+8>>3]=L[467809];gb(71701,g);$a(G[29763])}Fa=g+544|0}function gt(a,b,c){a=a|0;b=b|0;c=c|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;f=Fa-1088|0;Fa=f;G[f+1072>>2]=G[30076];e=G[30075];G[f+1064>>2]=G[30074];G[f+1068>>2]=e;e=G[30073];G[f+1056>>2]=G[30072];G[f+1060>>2]=e;G[f+1052>>2]=0;G[f+8>>2]=0;a:{if(b){Ua(55927);Ua(a);a=112;break a}b:{e=jb(a,91);if(!e){Ua(55992);break b}E[f+16|0]=0;l=qb(f+16|0,a,e-a|0);q=1;n=32;j=4;while(1){b=e;e=b+1|0;i=H[b+1|0];if((i|0)==32){continue}break}c:{d:{e:{f:{switch(i-66|0){case 4:case 16:case 36:case 48:n=-32;t=1;break d;case 2:case 34:j=8;n=-64;u=1;q=0;break c;default:Ua(56104);break b;case 0:case 32:j=1;n=8;p=0;break e;case 7:case 39:j=2;n=16;v=1;p=0;break e;case 8:case 40:break c;case 19:case 51:break f}}j=2;n=20;p=1}}q=0}a=b+2|0;G[f+12>>2]=a;e=1;r=1;g:{h:{i:{j:{i=H[b+2|0];switch(i-66|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break g;case 10:break h;case 0:break i;default:break j}}switch(i-98|0){case 10:break h;case 0:break i;default:break g}}a=b+3|0;G[f+12>>2]=a;r=0;w=1;break g}a=b+3|0;G[f+12>>2]=a}m=nc(a,f+8|0,10);G[f+1056>>2]=m;b=G[f+8>>2];k:{if(!b){g=1;h=1;k=1;b=0;i=1;break k}if(H[b|0]!=44){g=1;h=1;k=1;i=1;break k}k=nc(b+1|0,f+12|0,10);G[f+1060>>2]=k;i=2;l:{a=G[f+12>>2];m:{if(!a){a=0;break m}if(H[a|0]==44){break l}}g=1;h=1;break k}h=nc(a+1|0,f+8|0,10);G[f+1064>>2]=h;i=3;b=G[f+8>>2];if(!b){b=0;g=1;break k}if(H[b|0]!=44){g=1;break k}g=nc(b+1|0,f+12|0,10);G[f+1068>>2]=g;a=G[f+12>>2];if(a){b=H[a|0]==44?5:4}else{b=4}i=b;e=nc(a+1|0,f+8|0,10);G[f+1072>>2]=e;b=G[f+8>>2]}a=a>>>0>b>>>0?a:b;G[f+12>>2]=a;if(H[a|0]==58){s=nc(a+1|0,0,10)}a=j;j=M(M(M(M(k,m),h),g),e);m=M(a,j);g=m+5759|0;k=(m+2879>>>0)%2880|0;h=g-k|0;G[f+1052>>2]=h;a=ce(l,0,f+1084|0);if(a){Ua(56205);Ua(l);break a}G[c>>2]=-1;a=0;n:{o:{p:{while(1){b=M(a,48)+757232|0;if(!G[b>>2]){e=a;break p}e=a+1|0;b=M(e,48)+757232|0;if(!G[b>>2]){break p}e=a+2|0;b=M(e,48)+757232|0;if(!G[b>>2]){break p}e=a+3|0;b=M(e,48)+757232|0;if(!G[b>>2]){break p}e=a+4|0;b=M(e,48)+757232|0;if(!G[b>>2]){break p}a=a+5|0;if((a|0)!=1e4){continue}break}a=103;break o}G[c>>2]=e;o=b;a=M(e,48);b=a+757236|0;G[o>>2]=b;e=a+757244|0;G[a+757240>>2]=e;if((g|0)==(k|0)){break n}o=b;b=ab(h);G[o>>2]=b;if(b){break n}Ua(57797);a=104}G[f+1076>>2]=a;Ua(56157);Hb(G[f+1084>>2]);a=G[f+1076>>2];break a}G[e>>2]=h;b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757248>>2]=2880;b=a+757264|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757252>>2]=17;G[f+1076>>2]=0;e=f+1080|0;b=G[M(G[c>>2],48)+757232>>2];o=f+1052|0;g=Fa-48|0;Fa=g;k=f+1076|0;q:{if(G[k>>2]>0){break q}G[e>>2]=0;if(G[47541]){a=ji();G[k>>2]=a;if((a|0)>0){break q}}a=H[141383]|H[141384]<<8|(H[141385]<<16|H[141386]<<24);E[g+23|0]=a;E[g+24|0]=a>>>8;E[g+25|0]=a>>>16;E[g+26|0]=a>>>24;a=G[35345];G[g+16>>2]=G[35344];G[g+20>>2]=a;h=G[310142];r:{s:{while(1){if((h|0)<=0){break s}h=h-1|0;if(Xa(M(h,84)+1240576|0,g+16|0)){continue}break}G[k>>2]=0;a=Hn(b,o,g+12|0);G[k>>2]=a;if((a|0)>0){Ua(57747);break q}l=lb(1,8);G[e>>2]=l;if(!l){Ja[G[(M(h,84)+1240576|0)+56>>2]](G[g+12>>2])|0;Ua(57631);break r}b=lb(1,1736);G[l+4>>2]=b;if(!b){Ja[G[(M(h,84)+1240576|0)+56>>2]](G[g+12>>2])|0;Ua(57631);Wa(G[e>>2]);G[e>>2]=0;break r}a=ab(32);G[b+12>>2]=a;if(!a){Ja[G[(M(h,84)+1240576|0)+56>>2]](G[g+12>>2])|0;Ua(57582);Wa(G[G[e>>2]+4>>2]);Wa(G[e>>2]);G[e>>2]=0;break r}d=lb(1001,8);G[b+96>>2]=d;if(!d){Ja[G[(M(h,84)+1240576|0)+56>>2]](G[g+12>>2])|0;Ua(57471);Wa(G[G[G[e>>2]+4>>2]+12>>2]);Wa(G[G[e>>2]+4>>2]);Wa(G[e>>2]);G[e>>2]=0;break r}d=lb(40,2880);G[b+1252>>2]=d;t:{if(d){cb(b+1256|0,255,160);d=b+1728|0;G[d>>2]=38;G[d+4>>2]=39;d=b+1720|0;G[d>>2]=36;G[d+4>>2]=37;d=b+1712|0;G[d>>2]=34;G[d+4>>2]=35;d=b+1704|0;G[d>>2]=32;G[d+4>>2]=33;d=b+1696|0;G[d>>2]=30;G[d+4>>2]=31;d=b+1688|0;G[d>>2]=28;G[d+4>>2]=29;d=b+1680|0;G[d>>2]=26;G[d+4>>2]=27;d=b+1672|0;G[d>>2]=24;G[d+4>>2]=25;d=b+1664|0;G[d>>2]=22;G[d+4>>2]=23;d=b+1656|0;G[d>>2]=20;G[d+4>>2]=21;d=b+1648|0;G[d>>2]=18;G[d+4>>2]=19;d=b+1640|0;G[d>>2]=16;G[d+4>>2]=17;d=b+1632|0;G[d>>2]=14;G[d+4>>2]=15;d=b+1624|0;G[d>>2]=12;G[d+4>>2]=13;d=b+1616|0;G[d>>2]=10;G[d+4>>2]=11;d=b+1608|0;G[d>>2]=8;G[d+4>>2]=9;d=b+1600|0;G[d>>2]=6;G[d+4>>2]=7;d=b+1592|0;G[d>>2]=4;G[d+4>>2]=5;d=b+1584|0;G[d>>2]=2;G[d+4>>2]=3;G[b+1576>>2]=0;G[b+1580>>2]=1;G[b+92>>2]=1e3;d=G[g+12>>2];G[b+4>>2]=h;G[b>>2]=d;E[a|0]=109;E[a+1|0]=101;E[a+2|0]=109;E[a+3|0]=102;E[a+4|0]=105;E[a+5|0]=108;E[a+6|0]=101;E[a+7|0]=0;a=G[o>>2];G[b+128>>2]=-1;G[b+132>>2]=-1;G[b+84>>2]=1;G[b+40>>2]=a;G[b+44>>2]=0;G[b+32>>2]=a;G[b+36>>2]=0;G[b+72>>2]=-1;h=0;G[b+24>>2]=0;G[b+16>>2]=555;G[b+8>>2]=1;Hc(l,0,1,k);if(G[k>>2]>0){break q}e=G[G[e>>2]+4>>2];break t}Ja[G[(M(h,84)+1240576|0)+56>>2]](G[g+12>>2])|0;Ua(57527);Wa(G[G[G[e>>2]+4>>2]+96>>2]);Wa(G[G[G[e>>2]+4>>2]+12>>2]);Wa(G[G[e>>2]+4>>2]);Wa(G[e>>2]);G[e>>2]=0;break r}while(1){u:{b=h<<2;a=b+1243184|0;if(!G[a>>2]){break u}b=b+1243184|0;a=b+4|0;if(!G[a>>2]){break u}a=b+8|0;if(!G[a>>2]){break u}a=b+12|0;if(!G[a>>2]){break u}a=b+16|0;if(!G[a>>2]){break u}h=h+5|0;if((h|0)!=1e4){continue}break q}break}G[a>>2]=e;break q}G[k>>2]=124;Ua(57686);break q}G[k>>2]=113}Fa=g+48|0;pd(G[f+1080>>2],n,i,f+1056|0,k);Qb(G[f+1080>>2],k);if(G[f+1076>>2]>0){Ua(56050);Hb(G[f+1084>>2]);a=M(G[c>>2],48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;a=G[f+1076>>2];break a}if((s|0)>0){He(G[f+1084>>2],s,0)}e=G[G[M(G[c>>2],48)+757232>>2]>>2]+2880|0;if((zc(e,1,m,G[f+1084>>2])|0)!=(m|0)){G[f+1076>>2]=108}Hb(G[f+1084>>2]);if(G[f+1076>>2]){a=M(G[c>>2],48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;Ua(55867);a=G[f+1076>>2];break a}v:{if(!p){break v}if(!r){if((j|0)<=0){break v}a=e;if(j-1>>>0>=3){i=j&-4;b=0;while(1){F[a>>1]=I[a>>1]^128;F[a+2>>1]=I[a+2>>1]^128;F[a+4>>1]=I[a+4>>1]^128;F[a+6>>1]=I[a+6>>1]^128;a=a+8|0;b=b+4|0;if((i|0)!=(b|0)){continue}break}}i=j&3;if(!i){break v}b=0;while(1){F[a>>1]=I[a>>1]^128;a=a+2|0;b=b+1|0;if((i|0)!=(b|0)){continue}break}break v}if((j|0)<=0){break v}a=e;if(j-1>>>0>=3){i=j&-4;b=0;while(1){F[a>>1]=I[a>>1]^32768;F[a+2>>1]=I[a+2>>1]^32768;F[a+4>>1]=I[a+4>>1]^32768;F[a+6>>1]=I[a+6>>1]^32768;a=a+8|0;b=b+4|0;if((i|0)!=(b|0)){continue}break}}i=j&3;if(!i){break v}b=0;while(1){F[a>>1]=I[a>>1]^32768;a=a+2|0;b=b+1|0;if((i|0)!=(b|0)){continue}break}}w:{if(w){break w}if(p|v){Af(e,j);break w}if(q|t){ke(e,j);break w}if(!u){break w}Ge(e,j)}a=M(G[c>>2],48);b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;a=a+757264|0;G[a>>2]=G[f+1052>>2];G[a+4>>2]=0;a=0;break a}Ua(a);a=125}Fa=f+1088|0;return a|0}function Yq(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=+g;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=N(0),q=0,r=0,s=0,t=0,u=0,v=0,w=N(0),x=0,y=0,z=0,A=0,B=0,C=0,D=0,I=0,J=N(0),P=0,Q=N(0),R=0,S=0,T=0,U=N(0),W=0,X=N(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=N(0),ka=N(0);n=Fa-128|0;Fa=n;J=N(g);G[n+116>>2]=0;if(G[968812]){G[n+108>>2]=i;G[n+104>>2]=h;L[n+96>>3]=J;G[n+88>>2]=d;G[n+84>>2]=c;G[n+80>>2]=b;gb(74134,n+80|0)}s=Fa-32|0;Fa=s;m=b-1|0;k=(b|0)<(i|0)?b:i;r=(k|0)>1?k:1;k=(m+r|0)/(r|0)|0;A=(k|0)>2?k:2;P=(m+A|0)/(A|0)|0;k=(P|0)>1?P:1;m=1;if(G[968812]){G[s+24>>2]=k;G[s+20>>2]=A;G[s+16>>2]=r;kb(74182,s+16|0);m=!G[968812]}i=(h|0)/(i|0)|0;i=(i|0)>1?i:1;h=((h+k|0)-1|0)/(k|0)|0;h=(c|0)>(h|0)?h:c;r=(h|0)<(i|0)?i:h;h=(c|0)/(r|0)|0;y=(h|0)>2?h:2;h=((y+c|0)-1|0)/(y|0)|0;if(!m){G[s+12>>2]=h;G[s+8>>2]=y;G[s+4>>2]=r;G[s>>2]=i;kb(74078,s)}Z=M(h,k);m=ab(Z<<2);G[n+116>>2]=m;R=b<<2;h=ab(R);u=y+1>>>1|0;a:{if((u|0)>=(c|0)){break a}aa=k&2147483646;ba=k&1;z=b&-4;r=b&3;v=b-1|0;ca=b<<1;da=b<<3;ea=M(b,y)<<2;fa=M(u-1|0,b)<<2;ga=d-8|0;ha=(d|0)==-64;ia=(d|0)==-32;while(1){b:{c:{d:{switch(ga|0){default:if(ha){break c}if(!ia|(b|0)<=0){break b}bb(h,(M(S,ea)+fa|0)+a|0,R);break b;case 0:if((b|0)<=0){break b}l=M(u-1|0,b)+a|0;i=0;d=0;k=0;if(v>>>0>=3){while(1){K[h+(d<<2)>>2]=E[d+l|0];o=d|1;K[h+(o<<2)>>2]=E[l+o|0];o=d|2;K[h+(o<<2)>>2]=E[l+o|0];o=d|3;K[h+(o<<2)>>2]=E[l+o|0];d=d+4|0;k=k+4|0;if((z|0)!=(k|0)){continue}break}}if(!r){break b}while(1){K[h+(d<<2)>>2]=E[d+l|0];d=d+1|0;i=i+1|0;if((r|0)!=(i|0)){continue}break};break b;case 8:if((b|0)<=0){break b}l=M(u+2147483647|0,ca)+a|0;i=0;d=0;k=0;if(v>>>0>=3){while(1){K[h+(d<<2)>>2]=F[l+(d<<1)>>1];o=d|1;K[h+(o<<2)>>2]=F[l+(o<<1)>>1];o=d|2;K[h+(o<<2)>>2]=F[l+(o<<1)>>1];o=d|3;K[h+(o<<2)>>2]=F[l+(o<<1)>>1];d=d+4|0;k=k+4|0;if((z|0)!=(k|0)){continue}break}}if(!r){break b}while(1){K[h+(d<<2)>>2]=F[l+(d<<1)>>1];d=d+1|0;i=i+1|0;if((r|0)!=(i|0)){continue}break};break b;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break b;case 24:break d}}if((b|0)<=0){break b}i=M(R,u+1073741823|0)+a|0;k=0;d=0;o=0;if(v>>>0>=3){while(1){l=d<<2;K[l+h>>2]=G[i+l>>2];T=l|4;K[T+h>>2]=G[i+T>>2];T=l|8;K[T+h>>2]=G[i+T>>2];l=l|12;K[l+h>>2]=G[i+l>>2];d=d+4|0;o=o+4|0;if((z|0)!=(o|0)){continue}break}}if(!r){break b}while(1){l=d<<2;K[l+h>>2]=G[i+l>>2];d=d+1|0;k=k+1|0;if((r|0)!=(k|0)){continue}break}break b}if((b|0)<=0){break b}l=M(u+536870911|0,da)+a|0;i=0;d=0;k=0;if(v>>>0>=3){while(1){K[h+(d<<2)>>2]=L[l+(d<<3)>>3];o=d|1;K[h+(o<<2)>>2]=L[l+(o<<3)>>3];o=d|2;K[h+(o<<2)>>2]=L[l+(o<<3)>>3];o=d|3;K[h+(o<<2)>>2]=L[l+(o<<3)>>3];d=d+4|0;k=k+4|0;if((z|0)!=(k|0)){continue}break}}if(!r){break b}while(1){K[h+(d<<2)>>2]=L[l+(d<<3)>>3];d=d+1|0;i=i+1|0;if((r|0)!=(i|0)){continue}break}}d=0;k=0;i=0;if((P|0)>=2){while(1){l=h+(k<<2)|0;w=K[l>>2];if((G[l>>2]&2139095040)!=2139095040){K[(d<<2)+m>>2]=w;d=d+1|0}k=k+A|0;l=h+(k<<2)|0;w=K[l>>2];if((G[l>>2]&2139095040)!=2139095040){K[(d<<2)+m>>2]=w;d=d+1|0}k=k+A|0;i=i+2|0;if((aa|0)!=(i|0)){continue}break}}e:{if(!ba){break e}i=h+(k<<2)|0;w=K[i>>2];if((G[i>>2]&2139095040)==2139095040){break e}K[(d<<2)+m>>2]=w;d=d+1|0}j=d+j|0;if((Z|0)<(j|0)){break a}S=S+1|0;m=(d<<2)+m|0;u=u+y|0;if((u|0)<(c|0)){continue}break}}Wa(h);Fa=s+32|0;c=G[n+116>>2];b=j;oe(c,b,4,143);d=1;h=(c+(b<<2)|0)-4|0;a=c;U=K[c>>2];Q=U;f:{if((b|0)<=0){break f}d=b+1>>>1|0;_=d-1|0;a=c+(_<<2)|0;Q=K[a>>2];if((b&-2147483647)==1|b>>>0<=d>>>0){break f}Q=N(N(Q+K[c+(d<<2)>>2])*N(.5))}w=K[h>>2];g=+(b|0);x=g*.5;g:{if(O(x)<2147483648){h=~~x;break g}h=-2147483648}P=(h|0)>5?h:5;i=c;g=g*.01+.5;h:{if(O(g)<2147483648){c=~~g;break h}c=-2147483648}A=(c|0)>1?c:1;j=0;m=0;g=0;x=0;y=0;c=0;i:{if((b|0)<=0){break i}if((b|0)==1){K[n+124>>2]=K[i+4>>2];G[n+120>>2]=0;c=1;break i}u=b-1|0;D=2/+(u|0);c=b<<2;s=ab(c);k=ab(c);r=lb(b,1);if(u>>>0>=3){h=b&-4;c=0;while(1){K[k+(j<<2)>>2]=+(j|0)*D+-1;l=j|1;K[k+(l<<2)>>2]=+(l|0)*D+-1;l=j|2;K[k+(l<<2)>>2]=+(l|0)*D+-1;l=j|3;K[k+(l<<2)>>2]=+(l|0)*D+-1;j=j+4|0;c=c+4|0;if((h|0)!=(c|0)){continue}break}}c=b&3;if(c){while(1){K[k+(j<<2)>>2]=+(j|0)*D+-1;j=j+1|0;m=m+1|0;if((c|0)!=(m|0)){continue}break}}m=b&1;j:{if(!u){j=0;break j}l=b&-2;j=0;c=0;while(1){h=j<<2;z=h|4;B=+K[z+i>>2];q=+K[k+z>>2];C=+K[h+i>>2];t=+K[h+k>>2];x=B*q+(C*t+x);I=I+C+B;g=q*q+(t*t+g);j=j+2|0;c=c+2|0;if((l|0)!=(c|0)){continue}break}}if(m){c=j<<2;t=+K[c+i>>2];q=+K[c+k>>2];x=t*q+x;I=I+t;g=q*q+g}q=+(b|0);t=q*.5;k:{if(O(t)<2147483648){c=~~t;break k}c=-2147483648}C=I/q;R=(c|0)>5?c:5;l=b&-2;z=b&1;h=b;$=x/g;B=$;while(1){l:{m=0;c=0;if(u){while(1){j=m<<2;K[j+s>>2]=+K[i+j>>2]-(+K[j+k>>2]*B+C);j=j|4;K[j+s>>2]=+K[i+j>>2]-(+K[j+k>>2]*B+C);m=m+2|0;c=c+2|0;if((l|0)!=(c|0)){continue}break}}if(z){c=m<<2;K[c+s>>2]=+K[c+i>>2]-(+K[c+k>>2]*B+C)}t=0;j=0;q=0;c=0;m=0;if(u){while(1){if(!H[j+r|0]){p=K[s+(j<<2)>>2];q=q+ +p;t=t+ +N(p*p);c=c+1|0}v=j|1;if(!H[v+r|0]){p=K[s+(v<<2)>>2];q=q+ +p;t=t+ +N(p*p);c=c+1|0}j=j+2|0;m=m+2|0;if((l|0)!=(m|0)){continue}break}}if(!(H[j+r|0]|!z)){p=K[s+(j<<2)>>2];q=q+ +p;t=t+ +N(p*p);c=c+1|0}W=-999;m:{if(c>>>0<2){break m}j=c-1|0;q=t/+(j|0)-q*q/+(M(c,j)|0);W=0;if(q<0){break m}W=V(q)}p=N(W*2.5);ja=N(-p);m=0;c=b;while(1){n:{if(H[m+r|0]!=1){X=K[s+(m<<2)>>2];if(!(X0?j:0;v=m+A|0;S=(b|0)>(v|0)?v:b;if((j|0)>=(S|0)){break n}while(1){v=j+r|0;o:{if(H[v|0]==1){break o}if(j>>>0<=m>>>0){o=j<<2;X=K[o+i>>2];ka=K[k+o>>2];E[v|0]=1;t=+X;q=+ka;x=x-t*q;c=c-1|0;I=I-t;Y=Y-q;g=g-q*q;break o}E[v|0]=2}j=j+1|0;if((S|0)>(j|0)){continue}break}break n}c=c-1|0}m=m+1|0;if((b|0)!=(m|0)){continue}break}if((c|0)>0){q=-Y/g;C=(q*x+I)/(q*Y+ +(c|0));B=(x-C*Y)/g}if((c|0)<(R|0)|(c|0)>=(h|0)){break l}h=c;y=y+1|0;if((y|0)<5){continue}}break}K[n+124>>2]=C-B;p=N(D*B);K[n+120>>2]=+(p>=N(0)?p:N(-p))<.001?N(D*$):p;Wa(s);Wa(k);Wa(r)}p:{if((c|0)<(P|0)){K[e>>2]=U;p=w;break p}p=K[n+120>>2];if(J>N(0)){p=N(p/J);K[n+120>>2]=p}J=N(Q-N(N(_|0)*p));K[e>>2]=Jw?w:p}K[f>>2]=p;if(G[968812]){p=K[a>>2];L[n+72>>3]=Q;L[n- -64>>3]=p;L[n+56>>3]=w;L[n+48>>3]=U;gb(70958,n+48|0);G[n+40>>2]=c;G[n+36>>2]=A;G[n+32>>2]=P;kb(74033,n+32|0);w=K[f>>2];L[n+16>>3]=K[e>>2];L[n+24>>3]=w;G[n+8>>2]=d;L[n>>3]=K[n+120>>2];gb(71049,n)}Wa(i);Fa=n+128|0}function rn(a){a=a|0;var 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;e=G[309722];f=G[a+12>>2];n=e+M(f,344)|0;a:{if(G[n>>2]==-1e3){b:{c:{switch(G[a>>2]-258|0){case 2:case 30:d:{e:{b=M(f,344)+e|0;switch(G[b+52>>2]-258|0){case 1:break e;case 0:break d;default:break b}}L[a+88>>3]=G[b+88>>2];break b}L[a+88>>3]=H[b+88|0]?1:0;break b;case 1:case 29:f:{g:{b=M(f,344)+e|0;switch(G[b+52>>2]-258|0){case 0:break f;case 2:break g;default:break b}}k=L[b+88>>3];if(O(k)<2147483648){G[a+88>>2]=~~k;break b}G[a+88>>2]=-2147483648;break b}G[a+88>>2]=H[b+88|0]!=0;break b;case 0:h:{i:{b=M(f,344)+e|0;switch(G[b+52>>2]-259|0){case 0:break h;case 1:break i;default:break b}}E[a+88|0]=L[b+88>>3]!=0;break b}E[a+88|0]=G[b+88>>2]!=0;break b;case 31:j:{k:{b=M(f,344)+e|0;switch(G[b+52>>2]-259|0){case 0:break j;case 1:break k;default:break b}}L[a+88>>3]=-L[b+88>>3];break b}G[a+88>>2]=0-G[b+88>>2];break b;case 28:break c;default:break b}}l:{m:{b=M(f,344)+e|0;switch(G[b+52>>2]-258|0){case 4:break l;case 0:break m;default:break b}}E[a+88|0]=!H[b+88|0];break b}c=a+88|0;g=b+88|0;h=Va(g);n:{if(!h){break n}d=h-1|0;b=h&3;if(b){while(1){i=H[g|0];E[c|0]=(i|0)==49?48:(i|0)==48?49:i;c=c+1|0;g=g+1|0;h=h-1|0;l=l+1|0;if((b|0)!=(l|0)){continue}break}}if(d>>>0<3){break n}while(1){b=H[g|0];E[c|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+1|0];E[c+1|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+2|0];E[c+2|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+3|0];E[c+3|0]=(b|0)==49?48:(b|0)==48?49:b;c=c+4|0;g=g+4|0;h=h-4|0;if(h){continue}break}}E[c|0]=0}G[a>>2]=-1e3;break a}Nd(a);if(G[309737]){break a}b=G[a+52>>2];o:{if((b|0)==262){break o}c=G[309727];c=(b|0)!=261?M(G[a+56>>2],c):c;if(!c){break o}d=c-1|0;i=M(f,344)+e|0;b=c&3;if(b){while(1){c=c-1|0;E[c+G[a+84>>2]|0]=H[G[i+84>>2]+c|0];h=h+1|0;if((b|0)!=(h|0)){continue}break}}if(d>>>0<3){break o}while(1){b=c-1|0;E[b+G[a+84>>2]|0]=H[b+G[i+84>>2]|0];b=c-2|0;E[b+G[a+84>>2]|0]=H[b+G[i+84>>2]|0];b=c-3|0;E[b+G[a+84>>2]|0]=H[b+G[i+84>>2]|0];c=c-4|0;E[c+G[a+84>>2]|0]=H[G[i+84>>2]+c|0];if(c){continue}break}}j=G[309727];b=M(j,G[a+56>>2]);p:{switch(G[a>>2]-258|0){case 0:q:{switch(G[(M(f,344)+e|0)+52>>2]-259|0){case 0:if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;E[c+G[a+88>>2]|0]=G[G[d+88>>2]+(c<<2)>>2]!=0}if((b|0)==1){break a}while(1){b=c-1|0;E[b+G[a+88>>2]|0]=G[G[d+88>>2]+(b<<2)>>2]!=0;c=c-2|0;E[c+G[a+88>>2]|0]=G[G[d+88>>2]+(c<<2)>>2]!=0;if(c){continue}break};break a;case 1:break q;default:break a}}if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;E[c+G[a+88>>2]|0]=L[G[d+88>>2]+(c<<3)>>3]!=0}if((b|0)==1){break a}while(1){b=c-1|0;E[b+G[a+88>>2]|0]=L[G[d+88>>2]+(b<<3)>>3]!=0;c=c-2|0;E[c+G[a+88>>2]|0]=L[G[d+88>>2]+(c<<3)>>3]!=0;if(c){continue}break};break a;case 2:case 30:r:{switch(G[(M(f,344)+e|0)+52>>2]-258|0){case 0:if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;L[G[a+88>>2]+(c<<3)>>3]=H[G[d+88>>2]+c|0]?1:0}if((b|0)==1){break a}while(1){b=c-1|0;L[G[a+88>>2]+(b<<3)>>3]=H[b+G[d+88>>2]|0]?1:0;c=c-2|0;L[G[a+88>>2]+(c<<3)>>3]=H[G[d+88>>2]+c|0]?1:0;if(c){continue}break};break a;case 1:break r;default:break a}}if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;L[G[a+88>>2]+(c<<3)>>3]=G[G[d+88>>2]+(c<<2)>>2]}if((b|0)==1){break a}while(1){b=c-1|0;L[G[a+88>>2]+(b<<3)>>3]=G[G[d+88>>2]+(b<<2)>>2];c=c-2|0;L[G[a+88>>2]+(c<<3)>>3]=G[G[d+88>>2]+(c<<2)>>2];if(c){continue}break};break a;case 1:case 29:s:{switch(G[(M(f,344)+e|0)+52>>2]-258|0){case 0:if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;G[G[a+88>>2]+(c<<2)>>2]=H[G[d+88>>2]+c|0]!=0}if((b|0)==1){break a}while(1){b=c-1|0;G[G[a+88>>2]+(b<<2)>>2]=H[b+G[d+88>>2]|0]!=0;c=c-2|0;G[G[a+88>>2]+(c<<2)>>2]=H[G[d+88>>2]+c|0]!=0;if(c){continue}break};break a;case 2:break s;default:break a}}if(!b){break a}m=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;j=G[a+88>>2]+(c<<2)|0;k=L[G[m+88>>2]+(c<<3)>>3];t:{if(O(k)<2147483648){l=~~k;break t}l=-2147483648}G[j>>2]=l}if((b|0)==1){break a}while(1){d=c-1|0;b=G[a+88>>2]+(d<<2)|0;k=L[G[m+88>>2]+(d<<3)>>3];u:{if(O(k)<2147483648){j=~~k;break u}j=-2147483648}G[b>>2]=j;c=c-2|0;b=G[a+88>>2]+(c<<2)|0;k=L[G[m+88>>2]+(c<<3)>>3];v:{if(O(k)<2147483648){j=~~k;break v}j=-2147483648}G[b>>2]=j;if(c){continue}break};break a;case 31:w:{switch(G[(M(f,344)+e|0)+52>>2]-259|0){case 0:if(!b){break a}i=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;d=c<<2;G[d+G[a+88>>2]>>2]=0-G[d+G[i+88>>2]>>2]}if((b|0)==1){break a}while(1){b=(c<<2)-4|0;G[b+G[a+88>>2]>>2]=0-G[b+G[i+88>>2]>>2];c=c-2|0;b=c<<2;G[b+G[a+88>>2]>>2]=0-G[b+G[i+88>>2]>>2];if(c){continue}break};break a;case 1:break w;default:break a}}if(!b){break a}i=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;d=c<<3;L[d+G[a+88>>2]>>3]=-L[d+G[i+88>>2]>>3]}if((b|0)==1){break a}while(1){b=(c<<3)-8|0;L[b+G[a+88>>2]>>3]=-L[b+G[i+88>>2]>>3];c=c-2|0;b=c<<3;L[b+G[a+88>>2]>>3]=-L[b+G[i+88>>2]>>3];if(c){continue}break};break a;case 28:break p;default:break a}}x:{switch(G[(M(f,344)+e|0)+52>>2]-258|0){case 4:if(!j){break a}i=M(f,344)+e|0;while(1){j=j-1|0;b=j<<2;c=G[b+G[a+88>>2]>>2];g=G[b+G[i+88>>2]>>2];h=Va(g);y:{if(!h){break y}d=h-1|0;l=0;b=h&3;if(b){while(1){m=H[g|0];E[c|0]=(m|0)==49?48:(m|0)==48?49:m;c=c+1|0;g=g+1|0;h=h-1|0;l=l+1|0;if((b|0)!=(l|0)){continue}break}}if(d>>>0<3){break y}while(1){b=H[g|0];E[c|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+1|0];E[c+1|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+2|0];E[c+2|0]=(b|0)==49?48:(b|0)==48?49:b;b=H[g+3|0];E[c+3|0]=(b|0)==49?48:(b|0)==48?49:b;c=c+4|0;g=g+4|0;h=h-4|0;if(h){continue}break}}E[c|0]=0;if(j){continue}break};break a;case 0:break x;default:break a}}if(!b){break a}d=M(f,344)+e|0;c=b;if(b&1){c=b-1|0;E[c+G[a+88>>2]|0]=!H[G[d+88>>2]+c|0]}if((b|0)==1){break a}while(1){b=c-1|0;E[b+G[a+88>>2]|0]=!H[b+G[d+88>>2]|0];c=c-2|0;E[c+G[a+88>>2]|0]=!H[G[d+88>>2]+c|0];if(c){continue}break}}if(G[n>>2]>0){Wa(G[(M(f,344)+e|0)+88>>2])}}function wj(a){var 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;E[a|0]=90;E[a+1|0]=80;E[a+2|0]=78;E[a+3|0]=0;G[a+16>>2]=0;G[a+20>>2]=1079410688;G[a+8>>2]=0;G[a+12>>2]=0;G[a+4>>2]=G[a+4>>2]<0?-107:107;g=L[a+24>>3];if(g==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020;g=57.29577951308232}a:{b:{c:{if(L[a+104>>3]!=0){h=9;break c}if(L[a+96>>3]!=0){h=8;break c}if(L[a+88>>3]!=0){h=7;break c}if(L[a+80>>3]!=0){h=6;break c}if(L[a+72>>3]!=0){h=5;break c}if(L[a- -64>>3]!=0){h=4;break c}if(L[a+56>>3]!=0){h=3;break c}d:{if(L[a+48>>3]!=0){b=2;break d}if(L[a+40>>3]!=0){b=1;break d}if(L[a+32>>3]!=0){break d}G[a+16>>2]=0;G[a+20>>2]=1079410688;G[a+8>>2]=0;G[a+12>>2]=0;E[a|0]=65;E[a+1|0]=82;E[a+2|0]=67;E[a+3|0]=0;E[a+4|0]=106;E[a+5|0]=0;E[a+6|0]=0;E[a+7|0]=0;e:{if(g==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020;g=1;j=1;break e}g=g*3.141592653589793/180;j=1/g}G[a+1892>>2]=91;G[a+1888>>2]=92;L[a+112>>3]=g;L[a+120>>3]=j;break b}G[a+1892>>2]=113;G[a+1888>>2]=114;G[a+272>>2]=b;break b}G[a+1892>>2]=113;G[a+1888>>2]=114;G[a+272>>2]=h;l=L[a+40>>3];b=1;if(l<=0){break a}d=h&3;o=h-1|0;p=a+32|0;f:{g:{h:{while(1){i=+(q|0)*3.141592653589793/180;f=0;b=h;c=0;if(d){while(1){f=f*i+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}if(o>>>0>=3){while(1){c=b-1|0;f=((f*i+L[(b<<3)+p>>3]*+(b|0))*i+L[(c<<3)+p>>3]*+(c|0))*i;c=b-2|0;f=(f+L[(c<<3)+p>>3]*+(c|0))*i;c=b-3|0;f=f+L[(c<<3)+p>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(f<=0){e=3.141592653589793;if((q|0)==180){break f}e=j-l*(i-j)/(f-l);g=0;c=h&3;if(c){break h}b=h;break g}j=i;l=f;q=q+1|0;if((q|0)!=180){continue}break}e=3.141592653589793;break f}d=0;b=h;while(1){g=g*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;m=((g*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;m=(m+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;g=m+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(g)<1e-13){break f}b=g<0;k=b?j:e;m=b?l:g;l=b?e:i;j=b?g:f;e=k-m*(l-k)/(j-m);c=h&3;i:{if(!c){b=h;break i}d=0;b=h;while(1){n=n*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((n*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;n=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(n)<1e-13){break f}g=0;b=n<0;k=b?k:e;i=b?m:n;l=b?e:l;j=b?n:j;e=k-i*(l-k)/(j-i);c=h&3;j:{if(!c){b=h;break j}d=0;b=h;while(1){g=g*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((g*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;g=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(g)<1e-13){break f}f=0;b=g<0;k=b?k:e;i=b?i:g;l=b?e:l;j=b?g:j;e=k-i*(l-k)/(j-i);c=h&3;k:{if(!c){b=h;break k}d=0;b=h;while(1){f=f*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((f*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;f=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(f)<1e-13){break f}g=0;b=f<0;k=b?k:e;i=b?i:f;l=b?e:l;j=b?f:j;e=k-i*(l-k)/(j-i);c=h&3;l:{if(!c){b=h;break l}d=0;b=h;while(1){g=g*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((g*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;g=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(g)<1e-13){break f}f=0;b=g<0;k=b?k:e;i=b?i:g;l=b?e:l;j=b?g:j;e=k-i*(l-k)/(j-i);c=h&3;m:{if(!c){b=h;break m}d=0;b=h;while(1){f=f*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((f*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;f=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(f)<1e-13){break f}g=0;b=f<0;k=b?k:e;i=b?i:f;l=b?e:l;j=b?f:j;e=k-i*(l-k)/(j-i);c=h&3;n:{if(!c){b=h;break n}d=0;b=h;while(1){g=g*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((g*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;g=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(g)<1e-13){break f}f=0;b=g<0;k=b?k:e;i=b?i:g;l=b?e:l;j=b?g:j;e=k-i*(l-k)/(j-i);c=h&3;o:{if(!c){b=h;break o}d=0;b=h;while(1){f=f*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;f=((f*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;f=(f+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;f=f+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(f)<1e-13){break f}g=0;b=f<0;n=b?k:e;m=b?i:f;k=b?e:l;i=b?f:j;e=n-m*(k-n)/(i-m);c=h&3;p:{if(!c){b=h;break p}d=0;b=h;while(1){g=g*e+L[((b<<3)+a|0)+32>>3]*+(b|0);b=b-1|0;d=d+1|0;if((c|0)!=(d|0)){continue}break}}if(o>>>0>=3){d=a+32|0;while(1){c=b-1|0;j=((g*e+L[d+(b<<3)>>3]*+(b|0))*e+L[d+(c<<3)>>3]*+(c|0))*e;c=b-2|0;j=(j+L[d+(c<<3)>>3]*+(c|0))*e;c=b-3|0;g=j+L[d+(c<<3)>>3]*+(c|0);c=(b|0)>4;b=b-4|0;if(c){continue}break}}if(O(g)<1e-13){break f}b=g<0;l=b?n:e;j=b?m:g;e=l-j*((b?e:k)-l)/((b?g:i)-j)}g=0;c=h+1&3;if(c){b=0;while(1){g=g*e+L[((h<<3)+a|0)+32>>3];h=h-1|0;b=b+1|0;if((c|0)!=(b|0)){continue}break}}while(1){b=(h<<3)+a|0;g=(((g*e+L[b+32>>3])*e+L[b+24>>3])*e+L[b+16>>3])*e+L[b+8>>3];b=(h|0)>3;h=h-4|0;if(b){continue}break}L[a+112>>3]=e;L[a+120>>3]=g}b=0}return b}function $j(a,b){var 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,w=0,y=0,B=0,C=0,D=0,E=0;n=Fa-48|0;Fa=n;A(+a);o=v(1)|0;d=v(0)|0;a:{b:{c=o;g=c&2147483647;c:{if(g>>>0<=1074752122){if((c&1048575)==598523){break c}if(g>>>0<=1073928572){if((o|0)>0|(o|0)>=0){a=a+-1.5707963267341256;f=a+-6077100506506192e-26;L[b>>3]=f;L[b+8>>3]=a-f+-6077100506506192e-26;d=1;break a}a=a+1.5707963267341256;f=a+6077100506506192e-26;L[b>>3]=f;L[b+8>>3]=a-f+6077100506506192e-26;d=-1;break a}if((o|0)>0|(o|0)>=0){a=a+-3.1415926534682512;f=a+-1.2154201013012384e-10;L[b>>3]=f;L[b+8>>3]=a-f+-1.2154201013012384e-10;d=2;break a}a=a+3.1415926534682512;f=a+1.2154201013012384e-10;L[b>>3]=f;L[b+8>>3]=a-f+1.2154201013012384e-10;d=-2;break a}if(g>>>0<=1075594811){if(g>>>0<=1075183036){if((g|0)==1074977148){break c}if((o|0)>0|(o|0)>=0){a=a+-4.712388980202377;f=a+-1.8231301519518578e-10;L[b>>3]=f;L[b+8>>3]=a-f+-1.8231301519518578e-10;d=3;break a}a=a+4.712388980202377;f=a+1.8231301519518578e-10;L[b>>3]=f;L[b+8>>3]=a-f+1.8231301519518578e-10;d=-3;break a}if((g|0)==1075388923){break c}if((o|0)>0|(o|0)>=0){a=a+-6.2831853069365025;f=a+-2.430840202602477e-10;L[b>>3]=f;L[b+8>>3]=a-f+-2.430840202602477e-10;d=4;break a}a=a+6.2831853069365025;f=a+2.430840202602477e-10;L[b>>3]=f;L[b+8>>3]=a-f+2.430840202602477e-10;d=-4;break a}if(g>>>0>1094263290){break b}}j=a*.6366197723675814+6755399441055744+-6755399441055744;f=a+j*-1.5707963267341256;q=j*6077100506506192e-26;s=f-q;c=s<-.7853981633974483;if(O(j)<2147483648){d=~~j}else{d=-2147483648}d:{if(c){d=d-1|0;j=j+-1;q=j*6077100506506192e-26;f=a+j*-1.5707963267341256;break d}if(!(s>.7853981633974483)){break d}d=d+1|0;j=j+1;q=j*6077100506506192e-26;f=a+j*-1.5707963267341256}a=f-q;L[b>>3]=a;A(+a);e=v(1)|0;v(0)|0;c=g>>>20|0;e:{if((c-(e>>>20&2047)|0)<17){break e}s=f;a=j*6077100506303966e-26;f=f-a;q=j*20222662487959506e-37-(s-f-a);a=f-q;L[b>>3]=a;e=c;A(+a);c=v(1)|0;v(0)|0;if((e-(c>>>20&2047)|0)<50){break e}s=f;a=j*20222662487111665e-37;f=f-a;q=j*84784276603689e-45-(s-f-a);a=f-q;L[b>>3]=a}L[b+8>>3]=f-a-q;break a}if(g>>>0>=2146435072){a=a-a;L[b>>3]=a;L[b+8>>3]=a;d=0;break a}x(0,d|0);x(1,o&1048575|1096810496);a=+z();d=0;c=1;while(1){e=(n+16|0)+(d<<3)|0;if(O(a)<2147483648){d=~~a}else{d=-2147483648}f=+(d|0);L[e>>3]=f;a=(a-f)*16777216;d=1;e=c;c=0;if(e){continue}break}L[n+32>>3]=a;d=2;while(1){c=d;d=c-1|0;if(L[(n+16|0)+(c<<3)>>3]==0){continue}break}w=n+16|0;e=0;h=Fa-560|0;Fa=h;d=(g>>>20|0)-1046|0;g=(d-3|0)/24|0;u=(g|0)>0?g:0;g=M(u,-24)+d|0;m=G[30113];r=c+1|0;i=r-1|0;if((m+i|0)>=0){d=m+r|0;c=u-i|0;while(1){L[(h+320|0)+(e<<3)>>3]=(c|0)<0?0:+G[(c<<2)+120464>>2];c=c+1|0;e=e+1|0;if((d|0)!=(e|0)){continue}break}}p=g-24|0;d=0;e=(m|0)>0?m:0;l=(r|0)<=0;while(1){f:{if(l){a=0;break f}k=d+i|0;c=0;a=0;while(1){a=L[(c<<3)+w>>3]*L[(h+320|0)+(k-c<<3)>>3]+a;c=c+1|0;if((r|0)!=(c|0)){continue}break}}L[(d<<3)+h>>3]=a;c=(d|0)==(e|0);d=d+1|0;if(!c){continue}break}D=47-g|0;y=48-g|0;E=g-25|0;d=m;g:{while(1){a=L[(d<<3)+h>>3];c=0;e=d;k=(d|0)<=0;if(!k){while(1){t=(h+480|0)+(c<<2)|0;f=a*5.960464477539063e-8;h:{if(O(f)<2147483648){l=~~f;break h}l=-2147483648}f=+(l|0);a=f*-16777216+a;i:{if(O(a)<2147483648){l=~~a;break i}l=-2147483648}G[t>>2]=l;e=e-1|0;a=L[(e<<3)+h>>3]+f;c=c+1|0;if((d|0)!=(c|0)){continue}break}}a=Qf(a,p);a=a+S(a*.125)*-8;j:{if(O(a)<2147483648){c=~~a;break j}c=-2147483648}l=c;a=a-+(l|0);k:{l:{m:{B=(p|0)<=0;n:{if(!B){e=(d<<2)+h|0;i=G[e+476>>2];c=i>>y;t=e;e=i-(c<>2]=e;l=c+l|0;c=e>>D;break n}if(p){break m}c=G[((d<<2)+h|0)+476>>2]>>23}i=c;if((i|0)<=0){break k}break l}i=2;if(a>=.5){break l}i=0;break k}c=0;e=0;if(!k){while(1){C=(h+480|0)+(c<<2)|0;t=G[C>>2];k=16777215;o:{p:{if(e){break p}k=16777216;if(t){break p}e=0;break o}G[C>>2]=k-t;e=1}c=c+1|0;if((d|0)!=(c|0)){continue}break}}q:{if(B){break q}c=8388607;r:{switch(E|0){case 1:c=4194303;break;case 0:break r;default:break q}}k=(d<<2)+h|0;G[k+476>>2]=G[k+476>>2]&c}l=l+1|0;if((i|0)!=2){break k}a=1-a;i=2;if(!e){break k}a=a-Qf(1,p)}if(a==0){e=0;s:{c=d;if((m|0)>=(c|0)){break s}while(1){c=c-1|0;e=G[(h+480|0)+(c<<2)>>2]|e;if((c|0)>(m|0)){continue}break}if(!e){break s}g=p;while(1){g=g-24|0;d=d-1|0;if(!G[(h+480|0)+(d<<2)>>2]){continue}break}break g}c=1;while(1){e=c;c=c+1|0;if(!G[(h+480|0)+(m-e<<2)>>2]){continue}break}e=d+e|0;while(1){i=d+r|0;d=d+1|0;L[(h+320|0)+(i<<3)>>3]=G[(u+d<<2)+120464>>2];c=0;a=0;if((r|0)>0){while(1){a=L[(c<<3)+w>>3]*L[(h+320|0)+(i-c<<3)>>3]+a;c=c+1|0;if((r|0)!=(c|0)){continue}break}}L[(d<<3)+h>>3]=a;if((d|0)<(e|0)){continue}break}d=e;continue}break}a=Qf(a,24-g|0);t:{if(a>=16777216){e=(h+480|0)+(d<<2)|0;f=a*5.960464477539063e-8;u:{if(O(f)<2147483648){c=~~f;break u}c=-2147483648}a=+(c|0)*-16777216+a;v:{if(O(a)<2147483648){p=~~a;break v}p=-2147483648}G[e>>2]=p;d=d+1|0;break t}if(O(a)<2147483648){c=~~a}else{c=-2147483648}g=p}G[(h+480|0)+(d<<2)>>2]=c}a=Qf(1,g);w:{if((d|0)<0){break w}c=d;while(1){e=c;L[(c<<3)+h>>3]=a*+G[(h+480|0)+(c<<2)>>2];c=c-1|0;a=a*5.960464477539063e-8;if(e){continue}break}k=0;if((d|0)<0){break w}g=(m|0)>0?m:0;e=d;while(1){p=g>>>0>>0?g:k;m=d-e|0;c=0;a=0;while(1){a=L[(c<<3)+123232>>3]*L[(c+e<<3)+h>>3]+a;r=(c|0)!=(p|0);c=c+1|0;if(r){continue}break}L[(h+160|0)+(m<<3)>>3]=a;e=e-1|0;c=(d|0)!=(k|0);k=k+1|0;if(c){continue}break}}a=0;if((d|0)>=0){c=d;while(1){e=c;c=c-1|0;a=a+L[(h+160|0)+(e<<3)>>3];if(e){continue}break}}L[n>>3]=i?-a:a;a=L[h+160>>3]-a;c=1;if((d|0)>0){while(1){a=a+L[(h+160|0)+(c<<3)>>3];e=(c|0)!=(d|0);c=c+1|0;if(e){continue}break}}L[n+8>>3]=i?-a:a;Fa=h+560|0;d=l&7;a=L[n>>3];if((o|0)<0){L[b>>3]=-a;L[b+8>>3]=-L[n+8>>3];d=0-d|0;break a}L[b>>3]=a;L[b+8>>3]=L[n+8>>3]}Fa=n+48|0;return d}function Lt(a,b,c,d,e,f){a=a|0;b=+b;c=c|0;d=d|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,w=0,x=0,y=0,z=0;l=Fa-560|0;Fa=l;G[l+44>>2]=0;A(+b);g=v(1)|0;v(0)|0;a:{if((g|0)<0){s=1;w=3848;b=-b;A(+b);g=v(1)|0;v(0)|0;break a}if(e&2048){s=1;w=3851;break a}s=e&1;w=s?3854:3849;z=!s}b:{if((g&2146435072)==2146435072){d=s+3|0;nd(a,32,c,d,e&-65537);gd(a,w,s);f=f&32;gd(a,b!=b?f?16008:34610:f?18603:35135,3);nd(a,32,c,d,e^8192);i=(c|0)<(d|0)?d:c;break b}u=l+16|0;c:{d:{e:{b=Lp(b,l+44|0);b=b+b;if(b!=0){g=G[l+44>>2];G[l+44>>2]=g-1;r=f|32;if((r|0)!=97){break e}break c}r=f|32;if((r|0)==97){break c}k=G[l+44>>2];m=(d|0)<0?6:d;break d}k=g-29|0;G[l+44>>2]=k;b=b*268435456;m=(d|0)<0?6:d}p=(l+48|0)+((k|0)<0?0:288)|0;h=p;while(1){if(b<4294967296&b>=0){d=~~b>>>0}else{d=0}G[h>>2]=d;h=h+4|0;b=(b-+(d>>>0))*1e9;if(b!=0){continue}break}f:{if((k|0)<=0){d=k;g=h;j=p;break f}j=p;d=k;while(1){d=(d|0)<29?d:29;g=h-4|0;g:{if(j>>>0>g>>>0){break g}i=0;while(1){o=G[g>>2];n=d&31;x=i;if((d&63)>>>0>=32){i=o<>>32-n;o=o<>>0>>0?i+1|0:i;i=Du(n,i,1e9,0);o=Au(i,Ia,1e9,0);G[g>>2]=n-o;g=g-4|0;if(j>>>0<=g>>>0){continue}break}if(!i){break g}j=j-4|0;G[j>>2]=i}while(1){g=h;if(j>>>0>>0){h=g-4|0;if(!G[h>>2]){continue}}break}d=G[l+44>>2]-d|0;G[l+44>>2]=d;h=g;if((d|0)>0){continue}break}}if((d|0)<0){t=((m+25>>>0)/9|0)+1|0;n=(r|0)==102;while(1){d=0-d|0;i=(d|0)<9?d:9;h:{if(g>>>0<=j>>>0){h=G[j>>2];break h}o=1e9>>>i|0;y=-1<>2];G[h>>2]=x+(d>>>i|0);d=M(o,d&y);h=h+4|0;if(h>>>0>>0){continue}break}h=G[j>>2];if(!d){break h}G[g>>2]=d;g=g+4|0}d=i+G[l+44>>2]|0;G[l+44>>2]=d;j=(!h<<2)+j|0;h=n?p:j;g=g-h>>2>(t|0)?h+(t<<2)|0:g;if((d|0)<0){continue}break}}d=0;i:{if(g>>>0<=j>>>0){break i}d=M(p-j>>2,9);h=10;i=G[j>>2];if(i>>>0<10){break i}while(1){d=d+1|0;h=M(h,10);if(i>>>0>=h>>>0){continue}break}}h=(m-((r|0)==102?0:d)|0)-((r|0)==103&(m|0)!=0)|0;if((h|0)<(M(g-p>>2,9)-9|0)){i=h+9216|0;n=(i|0)/9|0;k=((((k|0)<0?4:292)+l|0)+(n<<2)|0)-4048|0;h=10;i=i-M(n,9)|0;if((i|0)<=7){while(1){h=M(h,10);i=i+1|0;if((i|0)!=8){continue}break}}n=G[k>>2];t=(n>>>0)/(h>>>0)|0;i=n-M(h,t)|0;o=k+4|0;j:{if(!i&(o|0)==(g|0)){break j}k:{if(!(t&1)){b=9007199254740992;if(!(E[k-4|0]&1)|((h|0)!=1e9|j>>>0>=k>>>0)){break k}}b=9007199254740994}q=(g|0)==(o|0)?1:1.5;o=h>>>1|0;q=i>>>0>>0?.5:(o|0)==(i|0)?q:1.5;if(!(H[w|0]!=45|z)){q=-q;b=-b}i=n-i|0;G[k>>2]=i;if(b+q==b){break j}d=h+i|0;G[k>>2]=d;if(d>>>0>=1e9){while(1){G[k>>2]=0;k=k-4|0;if(k>>>0>>0){j=j-4|0;G[j>>2]=0}d=G[k>>2]+1|0;G[k>>2]=d;if(d>>>0>999999999){continue}break}}d=M(p-j>>2,9);h=10;i=G[j>>2];if(i>>>0<10){break j}while(1){d=d+1|0;h=M(h,10);if(i>>>0>=h>>>0){continue}break}}h=k+4|0;g=g>>>0>h>>>0?h:g}while(1){h=g;i=g>>>0<=j>>>0;if(!i){g=h-4|0;if(!G[g>>2]){continue}}break}l:{if((r|0)!=103){k=e&8;break l}g=m?m:1;k=(g|0)>(d|0)&(d|0)>-5;m=(k?d^-1:-1)+g|0;f=(k?-1:-2)+f|0;k=e&8;if(k){break l}g=-9;m:{if(i){break m}n=G[h-4>>2];if(!n){break m}i=10;g=0;if((n>>>0)%10|0){break m}while(1){k=g;g=g+1|0;i=M(i,10);if(!((n>>>0)%(i>>>0)|0)){continue}break}g=k^-1}i=M(h-p>>2,9);if((f&-33)==70){k=0;g=(g+i|0)-9|0;g=(g|0)>0?g:0;m=(g|0)>(m|0)?m:g;break l}k=0;g=((d+i|0)+g|0)-9|0;g=(g|0)>0?g:0;m=(g|0)>(m|0)?m:g}i=-1;r=k|m;if(((r?2147483645:2147483646)|0)<(m|0)){break b}n=(((r|0)!=0)+m|0)+1|0;o=f&-33;n:{if((o|0)==70){if((2147483647-n|0)<(d|0)){break b}g=(d|0)>0?d:0;break n}g=d>>31;g=Lg((g^d)-g|0,0,u);if((u-g|0)<=1){while(1){g=g-1|0;E[g|0]=48;if((u-g|0)<2){continue}break}}t=g-2|0;E[t|0]=f;E[g-1|0]=(d|0)<0?45:43;g=u-t|0;if((g|0)>(2147483647-n|0)){break b}}d=g+n|0;if((d|0)>(s^2147483647)){break b}f=d+s|0;nd(a,32,c,f,e);gd(a,w,s);nd(a,48,c,f,e^65536);o:{p:{q:{if((o|0)==70){g=l+16|0;d=g|8;k=g|9;i=j>>>0>p>>>0?p:j;j=i;while(1){g=Lg(G[j>>2],0,k);r:{if((i|0)!=(j|0)){if(l+16>>>0>=g>>>0){break r}while(1){g=g-1|0;E[g|0]=48;if(l+16>>>0>>0){continue}break}break r}if((g|0)!=(k|0)){break r}E[l+24|0]=48;g=d}gd(a,g,k-g|0);j=j+4|0;if(p>>>0>=j>>>0){continue}break}if(r){gd(a,48504,1)}if((m|0)<=0|h>>>0<=j>>>0){break q}while(1){g=Lg(G[j>>2],0,k);if(g>>>0>l+16>>>0){while(1){g=g-1|0;E[g|0]=48;if(l+16>>>0>>0){continue}break}}gd(a,g,(m|0)<9?m:9);g=m-9|0;j=j+4|0;if(h>>>0<=j>>>0){break p}d=(m|0)>9;m=g;if(d){continue}break}break p}s:{if((m|0)<0){break s}i=h>>>0>j>>>0?h:j+4|0;g=l+16|0;d=g|8;p=g|9;h=j;while(1){g=Lg(G[h>>2],0,p);if((p|0)==(g|0)){E[l+24|0]=48;g=d}t:{if((h|0)!=(j|0)){if(l+16>>>0>=g>>>0){break t}while(1){g=g-1|0;E[g|0]=48;if(l+16>>>0>>0){continue}break}break t}gd(a,g,1);g=g+1|0;if(!(k|m)){break t}gd(a,48504,1)}x=g;g=p-g|0;gd(a,x,(g|0)>(m|0)?m:g);m=m-g|0;h=h+4|0;if(i>>>0<=h>>>0){break s}if((m|0)>=0){continue}break}}nd(a,48,m+18|0,18,0);gd(a,t,u-t|0);break o}g=m}nd(a,48,g+9|0,9,0)}nd(a,32,c,f,e^8192);i=(c|0)<(f|0)?f:c;break b}m=(f<<26>>31&9)+w|0;u:{if(d>>>0>11){break u}g=12-d|0;q=16;while(1){q=q*16;g=g-1|0;if(g){continue}break}if(H[m|0]==45){b=-(q+(-b-q));break u}b=b+q-q}h=G[l+44>>2];g=h>>31;g=Lg((g^h)-g|0,0,u);if((u|0)==(g|0)){E[l+15|0]=48;g=l+15|0}k=s|2;j=f&32;h=G[l+44>>2];p=g-2|0;E[p|0]=f+15;E[g-1|0]=(h|0)<0?45:43;i=e&8;h=l+16|0;while(1){f=h;if(O(b)<2147483648){g=~~b}else{g=-2147483648}E[h|0]=j|H[g+92512|0];b=(b-+(g|0))*16;h=f+1|0;if(!(!((d|0)>0|i)&b==0|(h-(l+16|0)|0)!=1)){E[f+1|0]=46;h=f+2|0}if(b!=0){continue}break}i=-1;n=u-p|0;f=n+k|0;if((2147483645-f|0)<(d|0)){break b}v:{w:{if(!d){break w}j=h-(l+16|0)|0;if((j-2|0)>=(d|0)){break w}g=d+2|0;break v}j=h-(l+16|0)|0;g=j}d=g+f|0;nd(a,32,c,d,e);gd(a,m,k);nd(a,48,c,d,e^65536);gd(a,l+16|0,j);nd(a,48,g-j|0,0,0);gd(a,p,n);nd(a,32,c,d,e^8192);i=(c|0)<(d|0)?d:c}Fa=l+560|0;return i|0}function fg(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;o=Fa-29056|0;Fa=o;a:{if(!(g|h)|G[n>>2]>0){break a}if(m){G[m>>2]=0}if((i|0)==2){cb(l,0,g)}if((yc(a,b,c,d,e,f,g,h,0,o+28984|0,o+28976|0,o+28944|0,o+29040|0,o+29052|0,o+29048|0,o+29016|0,o+29008|0,o+29036|0,o+29024|0,o+28992|0,o+29044|0,o+29e3|0,o+28816|0,n)|0)>0){break a}b:{c:{d:{if(G[o+29052>>2]==14){b=g;if(!b){break a}if((i|0)!=2){break d}e=0;f=0;if(m){break c}while(1){d=G[o+29020>>2];c=G[o+29016>>2];m=Au(G[o+28992>>2],G[o+28996>>2],s,t);c=c+m|0;i=Ia+d|0;i=c>>>0>>0?i+1|0:i;p=c;c=G[o+29008>>2];m=G[o+29012>>2];r=G[o+29036>>2];d=r;q=Au(c,m,d,d>>31);d=p+q|0;p=Ia+i|0;p=d>>>0>>0?p+1|0:p;i=d;d=m;m=G[o+29024>>2];d=G[o+29028>>2]-(d+(c>>>0>m>>>0)|0)|0;c=m-c|0;m=G[o+29048>>2];m=(b|0)>(m|0)?m:b;b=m>>31;q=m;m=c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0);c=m?c:q;$d(a,i,p,c,r,o+16|0,n);if((c|0)>0){b=c+e|0;p=o+16|0;while(1){e:{f:{g:{h:{i:{j:{k:{i=H[p|0];switch(i|0){case 0:break i;case 1:break j;default:break k}}m=i-70|0;if(!m){break h}if((m|0)==14){break g}break f}E[e+k|0]=49;break e}E[e+k|0]=j;E[e+l|0]=1;break e}E[e+k|0]=0;break e}E[e+k|0]=1;break e}E[e+k|0]=i}p=p+1|0;i=f;e=e+1|0;i=e?i:i+1|0;f=i;if((b|0)!=(e|0)){continue}break}}if(G[n>>2]>0){break b}i=c>>31;b=c;h=h-((b>>>0>g>>>0)+i|0)|0;g=g-b|0;if(!(h|g)){break a}p=i+G[o+29012>>2]|0;c=b+G[o+29008>>2]|0;p=c>>>0>>0?p+1|0:p;b=c;G[o+29008>>2]=b;G[o+29012>>2]=p;if((b|0)==G[o+29024>>2]&(p|0)==G[o+29028>>2]){G[o+29008>>2]=0;G[o+29012>>2]=0;i=t;b=s+1|0;i=b?i:i+1|0;s=b;t=i}b=g;if(b){continue}break}break a}G[n>>2]=310;break a}if(m){e=0;f=0;while(1){d=G[o+29020>>2];c=G[o+29016>>2];l=Au(G[o+28992>>2],G[o+28996>>2],s,t);c=c+l|0;i=Ia+d|0;i=c>>>0>>0?i+1|0:i;d=c;c=G[o+29008>>2];l=G[o+29012>>2];p=G[o+29036>>2];r=Au(c,l,p,p>>31);d=d+r|0;i=Ia+i|0;i=d>>>0>>0?i+1|0:i;r=d;d=l;l=G[o+29024>>2];d=G[o+29028>>2]-(d+(c>>>0>l>>>0)|0)|0;c=l-c|0;l=G[o+29048>>2];l=(b|0)>(l|0)?l:b;b=l>>31;q=l;l=c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0);c=l?c:q;$d(a,r,i,c,p,o+16|0,n);if((c|0)>0){b=c+e|0;p=o+16|0;while(1){l:{m:{n:{o:{p:{i=H[p|0];switch(i|0){case 1:break n;case 0:break o;default:break p}}l=i-70|0;if(l){if((l|0)!=14){break m}E[e+k|0]=1;break l}E[e+k|0]=0;break l}E[e+k|0]=j;G[m>>2]=1;break l}E[e+k|0]=49;break l}E[e+k|0]=i}p=p+1|0;i=f;e=e+1|0;i=e?i:i+1|0;f=i;if((b|0)!=(e|0)){continue}break}}if(G[n>>2]>0){break b}i=c;p=i>>31;b=i;h=h-((i>>>0>g>>>0)+p|0)|0;g=g-i|0;if(!(h|g)){break a}p=p+G[o+29012>>2]|0;c=b+G[o+29008>>2]|0;p=c>>>0>>0?p+1|0:p;b=c;G[o+29008>>2]=b;G[o+29012>>2]=p;if((b|0)==G[o+29024>>2]&(p|0)==G[o+29028>>2]){G[o+29008>>2]=0;G[o+29012>>2]=0;i=t;b=s+1|0;i=b?i:i+1|0;s=b;t=i}b=g;if(b){continue}break}break a}l=o+16|1;e=0;f=0;while(1){d=G[o+29020>>2];c=G[o+29016>>2];m=Au(G[o+28992>>2],G[o+28996>>2],s,t);c=c+m|0;i=Ia+d|0;i=c>>>0>>0?i+1|0:i;p=c;c=G[o+29008>>2];m=G[o+29012>>2];r=G[o+29036>>2];d=r;q=Au(c,m,d,d>>31);d=p+q|0;p=Ia+i|0;p=d>>>0>>0?p+1|0:p;i=d;d=m;m=G[o+29024>>2];d=G[o+29028>>2]-(d+(c>>>0>m>>>0)|0)|0;c=m-c|0;m=G[o+29048>>2];m=(b|0)>(m|0)?m:b;b=m>>31;q=m;m=c>>>0>>0&(b|0)>=(d|0)|(b|0)>(d|0);c=m?c:q;$d(a,i,p,c,r,o+16|0,n);q:{if((c|0)<=0){break q}b=e;p=o+16|0;if(c&1){p=49;r:{s:{t:{u:{v:{w:{i=H[o+16|0];switch(i|0){case 1:break r;case 0:break v;default:break w}}m=i-70|0;if(!m){break u}if((m|0)==14){break t}break s}p=j;break r}p=0;break r}p=1;break r}p=i}E[b+k|0]=p;p=l;i=f;e=e+1|0;i=e?i:i+1|0;f=i}if((c|0)==1){break q}r=b+c|0;while(1){b=49;m=49;x:{y:{z:{A:{B:{C:{i=H[p|0];switch(i|0){case 1:break x;case 0:break B;default:break C}}m=i-70|0;if(!m){break A}if((m|0)==14){break z}break y}m=j;break x}m=0;break x}m=1;break x}m=i}q=e+k|0;E[q|0]=m;D:{E:{F:{G:{H:{I:{i=H[p+1|0];switch(i|0){case 1:break D;case 0:break H;default:break I}}b=i-70|0;if(!b){break G}if((b|0)==14){break F}break E}b=j;break D}b=0;break D}b=1;break D}b=i}E[q+1|0]=b;p=p+2|0;i=f;b=e+2|0;i=b>>>0<2?i+1|0:i;e=b;f=i;if((b|0)!=(r|0)){continue}break}}if(G[n>>2]>0){break b}i=c>>31;b=c;h=h-((b>>>0>g>>>0)+i|0)|0;g=g-b|0;if(!(h|g)){break a}p=i+G[o+29012>>2]|0;c=b+G[o+29008>>2]|0;p=c>>>0>>0?p+1|0:p;b=c;G[o+29008>>2]=b;G[o+29012>>2]=p;if((b|0)==G[o+29024>>2]&(p|0)==G[o+29028>>2]){G[o+29008>>2]=0;G[o+29012>>2]=0;i=t;b=s+1|0;i=b?i:i+1|0;s=b;t=i}b=g;if(b){continue}break}break a}while(1){d=G[o+29020>>2];c=G[o+29016>>2];p=Au(G[o+28992>>2],G[o+28996>>2],s,t);c=c+p|0;i=Ia+d|0;i=c>>>0

>>0?i+1|0:i;u=c;c=G[o+29008>>2];p=G[o+29012>>2];r=G[o+29036>>2];d=r;q=Au(c,p,d,d>>31);d=u+q|0;i=Ia+i|0;i=d>>>0>>0?i+1|0:i;q=d;d=p;p=G[o+29024>>2];d=G[o+29028>>2]-(d+(c>>>0>p>>>0)|0)|0;c=p-c|0;p=G[o+29048>>2];p=(b|0)>(p|0)?p:b;b=p>>31;u=p;p=c>>>0

>>0&(b|0)>=(d|0)|(b|0)>(d|0);c=p?c:u;$d(a,q,i,c,r,o+16|0,n);if((c|0)>0){b=c+e|0;p=o+16|0;while(1){J:{K:{L:{M:{N:{O:{P:{i=H[p|0];switch(i|0){case 0:break N;case 1:break O;default:break P}}r=i-70|0;if(!r){break M}if((r|0)==14){break L}break K}E[e+k|0]=49;break J}E[e+k|0]=j;G[m>>2]=1;E[e+l|0]=1;break J}E[e+k|0]=0;break J}E[e+k|0]=1;break J}E[e+k|0]=i}p=p+1|0;i=f;e=e+1|0;i=e?i:i+1|0;f=i;if((b|0)!=(e|0)){continue}break}}if(G[n>>2]>0){break b}i=c;p=i>>31;b=i;h=h-((i>>>0>g>>>0)+p|0)|0;g=g-i|0;if(!(h|g)){break a}p=p+G[o+29012>>2]|0;c=b+G[o+29008>>2]|0;p=c>>>0>>0?p+1|0:p;b=c;G[o+29008>>2]=b;G[o+29012>>2]=p;if((b|0)==G[o+29024>>2]&(p|0)==G[o+29028>>2]){G[o+29008>>2]=0;G[o+29012>>2]=0;i=t;b=s+1|0;i=b?i:i+1|0;s=b;t=i}b=g;if(b){continue}break}break a}v=+(e>>>0)+ +(f|0)*4294967296;L[o>>3]=v+1;L[o+8>>3]=+(c|0)+v;a=o+28848|0;Ya(a,81,46369,o);Ua(a)}Fa=o+29056|0}function Bm(a,b,c,d,e,f,g){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;h=Fa-112|0;Fa=h;n=(b|0)==11;j=c==0?(a|0)==2?1950:2e3:c;i=n&(a|0)==1&j==2e3;q=i?11:a;c=i?j:d==0?(b|0)==2?1950:2e3:d;c=(a|0)==11?n?j:c:c;n=(b|0)==1&(q|0)==11&c==2e3;a=n?1:q;d=n?c:j;a:{if((a|0)==(b|0)&d==c){break a}q=c==d;b:{if(q){break b}if(!((a|0)!=2|d==1950)){Fm(d,1950,e,f);break b}if((a|0)!=1|d==2e3){break b}ai(d,2e3,e,f)}c:{if((b|0)==2){d:{switch(a-1|0){case 0:if(g>0){G[h+16>>2]=0;G[h+20>>2]=0;G[h+8>>2]=0;G[h+12>>2]=0;G[h+32>>2]=0;G[h+36>>2]=0;$h(e,f,h+16|0,h+8|0,h+32|0,h+24|0);d=g+-1950;L[e>>3]=L[h+16>>3]*d+L[e>>3];L[f>>3]=L[h+8>>3]*d+L[f>>3];break c}G[h+16>>2]=0;G[h+20>>2]=0;G[h+8>>2]=0;G[h+12>>2]=0;G[h+32>>2]=0;G[h+36>>2]=0;$h(e,f,h+16|0,h+8|0,h+32|0,h+24|0);break c;case 2:a=Fa-80|0;Fa=a;g=L[e>>3];p=L[f>>3];j=p*3.141592653589793/180;d=eb(j);k=g*3.141592653589793/180;l=ib(k);k=eb(k);j=ib(j);k=k*d;d=l*d;l=j*-.188374601723+(k*-.872755765852+d*-.45034695802);m=j*-.867600811151+(k*-.066988739415+d*.492728466075);o=Db(l,m);o=o<0?o+6.283185307179586:o;o=(o>6.283185307179586?o+-6.283185307179586:o)*180/3.141592653589793;L[e>>3]=o;d=Db(j*.460199784784+(k*-.483538914632+d*.744584633283),V(m*m+l*l))*180/3.141592653589793;L[f>>3]=d;if(G[321348]){L[a+72>>3]=p;L[a+64>>3]=g;r=G[24367];xb(r,72215,a- -64|0);n=ab(32);s=d<0;d=s?-d:d;e:{if(O(d)<2147483648){i=~~d;break e}i=-2147483648}G[a+36>>2]=i;G[a+32>>2]=s?45:43;d=(d-+(i|0))*60;f:{if(O(d)<2147483648){i=~~d;break f}i=-2147483648}G[a+40>>2]=i;L[a+48>>3]=(d-+(i|0))*60;d=o/15;g:{if(O(d)<2147483648){i=~~d;break g}i=-2147483648}G[a+16>>2]=i;d=(d-+(i|0))*60;h:{if(O(d)<2147483648){i=~~d;break h}i=-2147483648}G[a+20>>2]=i;L[a+24>>3]=(d-+(i|0))*60;Eb(n,19241,a+16|0);if(H[n+6|0]==32){E[n+6|0]=48}if(H[n+20|0]==32){E[n+20|0]=48}G[a>>2]=n;_a(r,69295,a);Wa(n)}Fa=a+80|0;break c;case 3:break d;default:break c}}if(g>0){_h(e,f,g);G[h+16>>2]=0;G[h+20>>2]=0;G[h+8>>2]=0;G[h+12>>2]=0;G[h+32>>2]=0;G[h+36>>2]=0;$h(e,f,h+16|0,h+8|0,h+32|0,h+24|0);d=g+-1950;L[e>>3]=L[h+16>>3]*d+L[e>>3];L[f>>3]=L[h+8>>3]*d+L[f>>3];break c}d=L[f>>3];g=L[e>>3]*3.141592653589793/180;k=eb(g);j=d*3.141592653589793/180;d=eb(j);l=ib(g);g=ib(j);j=l*d;k=k*d;m=k*0+0;d=g*-.3978812701051372+(j*.9174369160326626+m);k=g*0+(j*0+(k+0));l=Db(d,k);l=l<0?l+6.283185307179586:l;L[e>>3]=(l>6.283185307179586?l+-6.283185307179586:l)*180/3.141592653589793;d=Db(g*.9174369160326626+(j*.3978812701051372+m),V(k*k+d*d))*180/3.141592653589793;L[f>>3]=d;j=L[e>>3];a=h+32|0;Cj(-.005589114674240335,.004859078490463986,-.005590075450722788,a);d=d*3.141592653589793/180;g=eb(d);j=j*3.141592653589793/180;k=ib(j);l=L[h+40>>3];m=eb(j);o=L[h+32>>3];p=L[h+48>>3];d=ib(d);t=L[h+96>>3];u=L[h+80>>3];v=L[h+88>>3];j=g*k;g=g*m;k=d*L[h+72>>3]+(j*L[h+64>>3]+(g*L[h+56>>3]+0));l=d*p+(j*l+(g*o+0));m=Db(k,l);m=m<0?m+6.283185307179586:m;L[e>>3]=(m>6.283185307179586?m+-6.283185307179586:m)*180/3.141592653589793;w=f,x=Db(d*t+(j*v+(g*u+0)),V(l*l+k*k))*180/3.141592653589793,L[w>>3]=x;G[h+16>>2]=0;G[h+20>>2]=0;G[h+8>>2]=0;G[h+12>>2]=0;G[h+32>>2]=0;G[h+36>>2]=0;$h(e,f,h+16|0,h+8|0,a,h+24|0);L[e>>3]=L[h+16>>3]*0+L[e>>3];L[f>>3]=L[h+8>>3]*0+L[f>>3];break c}if((b|0)==1){i:{switch(a-2|0){case 0:if(g>0){a=Fa-32|0;Fa=a;G[a+8>>2]=0;G[a+12>>2]=0;G[a>>2]=0;G[a+4>>2]=0;G[a+24>>2]=0;G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;Dj(e,f,a+8|0,a,a+24|0,a+16|0);d=g+-2e3;L[e>>3]=L[a+8>>3]*d+L[e>>3];L[f>>3]=L[a>>3]*d+L[f>>3];Fa=a+32|0;break c}a=Fa-32|0;Fa=a;G[a+8>>2]=0;G[a+12>>2]=0;G[a>>2]=0;G[a+4>>2]=0;G[a+24>>2]=0;G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;Dj(e,f,a+8|0,a,a+24|0,a+16|0);Fa=a+32|0;break c;case 1:Em(e,f);break c;case 2:break i;default:break c}}if(g>0){_h(e,f,g);break c}_h(e,f,2e3);break c}j:{switch(b-3|0){case 0:k:{switch(a-1|0){case 1:a=Fa-80|0;Fa=a;g=L[e>>3];d=L[f>>3];k=d*3.141592653589793/180;j=eb(k);l=g*3.141592653589793/180;m=ib(l);l=eb(l);k=ib(k);l=l*j;j=m*j;m=k*.744584633283+(l*.492728466075+j*-.45034695802);o=k*-.483538914632+(l*-.066988739415+j*-.872755765852);p=Db(m,o);p=p<0?p+6.283185307179586:p;p=(p>6.283185307179586?p+-6.283185307179586:p)*180/3.141592653589793;L[e>>3]=p;j=Db(k*.460199784784+(l*-.867600811151+j*-.188374601723),V(o*o+m*m))*180/3.141592653589793;L[f>>3]=j;if(G[321348]){n=ab(32);i=d<0;G[a+48>>2]=i?45:43;d=i?-d:d;l:{if(O(d)<2147483648){i=~~d;break l}i=-2147483648}G[a+52>>2]=i;d=(d-+(i|0))*60;m:{if(O(d)<2147483648){i=~~d;break m}i=-2147483648}G[a+56>>2]=i;L[a- -64>>3]=(d-+(i|0))*60;d=g/15;n:{if(O(d)<2147483648){i=~~d;break n}i=-2147483648}G[a+32>>2]=i;d=(d-+(i|0))*60;o:{if(O(d)<2147483648){i=~~d;break o}i=-2147483648}G[a+36>>2]=i;L[a+40>>3]=(d-+(i|0))*60;Eb(n,19241,a+32|0);if(H[n+6|0]==32){E[n+6|0]=48}if(H[n+20|0]==32){E[n+20|0]=48}G[a+16>>2]=n;i=G[24367];_a(i,69268,a+16|0);L[a+8>>3]=j;L[a>>3]=p;xb(i,72149,a);Wa(n)}Fa=a+80|0;break c;case 0:Dm(e,f);break c;case 3:break k;default:break c}}_h(e,f,g>0?g:2e3);Dm(e,f);break c;case 1:break j;default:break c}}p:{switch(a-1|0){case 1:if(g>0){Cm(e,f,g);break c}Cm(e,f,1950);break c;case 0:if(g>0){_g(e,f,g);break c}_g(e,f,2e3);break c;case 2:break p;default:break c}}Em(e,f);if(g>0){_g(e,f,g);break c}_g(e,f,2e3)}q:{if(q){break q}if(!((b|0)!=2|c==1950)){Fm(1950,c,e,f)}if((b|0)!=1|c==2e3){break q}ai(2e3,c,e,f)}c=L[f>>3];r:{if(c>90){L[f>>3]=180-c;c=L[e>>3]+180;L[e>>3]=c;break r}if(c<-90){L[f>>3]=-180-c;c=L[e>>3]+180;L[e>>3]=c;break r}c=L[e>>3]}d=-360;if(!(c>360)){d=360;if(!(c<0)){break a}}L[e>>3]=c+d}Fa=h+112|0}function tu(a,b,c){a=a|0;b=+b;c=+c;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if((a|0)<=0|G[968816]<=(a|0)){break a}d=G[968817];if(!d){break a}a=d+M(a,65544)|0;e=G[a>>2];if(!e){break a}E[a+8|0]=0;f=a+8|0;h=65536;g=Fa-144|0;Fa=g;b:{if(!(G[e+3312>>2]?e:0)){E[f|0]=0;break b}cc(e,b,c,g+136|0,g+128|0);if(G[e+3308>>2]){E[f|0]=79;E[f+1|0]=102;E[f+2|0]=102;E[f+3|0]=32;E[f+4|0]=109;E[f+5|0]=97;E[f+6|0]=112;E[f+7|0]=0;break b}c:{d:{e:{switch(G[e+3292>>2]){case 1:a=G[e+3288>>2];d=(a<<1)+9|0;if((d|0)<65536){h=g+96|0;zm(h,L[g+136>>3],a);a=g- -64|0;zm(a,L[g+128>>3],G[e+3288>>2]);j=G[e+3296>>2];G[g+36>>2]=a;G[g+32>>2]=h;db(f,j?10358:9032,g+32|0);h=65536-d|0;break c}if(G[e+3296>>2]){rb(f,49098,65536);break d}rb(f,49050,65536);break d;case 0:break e;default:break c}}a=G[e+3288>>2];d=(a<<1)+18|0;if((d|0)<65536){b=L[g+136>>3];f:{if(G[e+3968>>2]-1>>>0<=1){Bj(g+96|0,32,b,a);Mf(g- -64|0,32,L[g+128>>3],G[e+3288>>2]-1|0);break f}Mf(g+96|0,32,b,a);Mf(g- -64|0,32,L[g+128>>3],G[e+3288>>2])}a=G[e+3296>>2];G[g+52>>2]=g- -64;G[g+48>>2]=g+96;db(f,a?10358:9032,g+48|0);h=65536-d|0;break c}if(G[e+3296>>2]){rb(f,49070,65536);break d}rb(f,49043,65536)}h=0}g:{switch(G[e+3968>>2]-1|0){case 2:if(!G[e+3284>>2]|(h|0)<10){break b}a=Va(f)+f|0;if(G[e+3296>>2]){d=H[30684]|H[30685]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[30680]|H[30681]<<8|(H[30682]<<16|H[30683]<<24);e=H[30676]|H[30677]<<8|(H[30678]<<16|H[30679]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b}d=H[30674]|H[30675]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[30670]|H[30671]<<8|(H[30672]<<16|H[30673]<<24);e=H[30666]|H[30667]<<8|(H[30668]<<16|H[30669]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b;case 3:if(!G[e+3284>>2]|(h|0)<10){break b}a=Va(f)+f|0;if(G[e+3296>>2]){d=H[30664]|H[30665]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[30660]|H[30661]<<8|(H[30662]<<16|H[30663]<<24);e=H[30656]|H[30657]<<8|(H[30658]<<16|H[30659]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b}d=H[30654]|H[30655]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[30650]|H[30651]<<8|(H[30652]<<16|H[30653]<<24);e=H[30646]|H[30647]<<8|(H[30648]<<16|H[30649]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b;case 8:if(!G[e+3284>>2]|(h|0)<10){break b}a=Va(f)+f|0;if(G[e+3296>>2]){E[a|0]=9;E[a+1|0]=112;E[a+2|0]=108;E[a+3|0]=97;E[a+4|0]=110;E[a+5|0]=101;E[a+6|0]=116;E[a+7|0]=0;break b}E[a|0]=32;E[a+1|0]=112;E[a+2|0]=108;E[a+3|0]=97;E[a+4|0]=110;E[a+5|0]=101;E[a+6|0]=116;E[a+7|0]=0;break b;case 4:if(!G[e+3284>>2]|(h|0)<8){break b}a=Va(f)+f|0;if(G[e+3296>>2]){E[a|0]=9;E[a+1|0]=97;E[a+2|0]=108;E[a+3|0]=116;E[a+4|0]=45;E[a+5|0]=97;E[a+6|0]=122;E[a+7|0]=0;break b}E[a|0]=32;E[a+1|0]=97;E[a+2|0]=108;E[a+3|0]=116;E[a+4|0]=45;E[a+5|0]=97;E[a+6|0]=122;E[a+7|0]=0;break b;case 6:if(!G[e+3284>>2]|(h|0)<8){break b}a=Va(f)+f|0;if(G[e+3296>>2]){d=H[31029]|H[31030]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[31025]|H[31026]<<8|(H[31027]<<16|H[31028]<<24);e=H[31021]|H[31022]<<8|(H[31023]<<16|H[31024]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b}d=H[31019]|H[31020]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[31015]|H[31016]<<8|(H[31017]<<16|H[31018]<<24);e=H[31011]|H[31012]<<8|(H[31013]<<16|H[31014]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b;case 7:if(!G[e+3284>>2]|(h|0)<8){break b}a=Va(f)+f|0;if(G[e+3296>>2]){d=H[31009]|H[31010]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[31005]|H[31006]<<8|(H[31007]<<16|H[31008]<<24);e=H[31001]|H[31002]<<8|(H[31003]<<16|H[31004]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b}d=H[30999]|H[31e3]<<8;E[a+8|0]=d;E[a+9|0]=d>>>8;d=H[30995]|H[30996]<<8|(H[30997]<<16|H[30998]<<24);e=H[30991]|H[30992]<<8|(H[30993]<<16|H[30994]<<24);E[a|0]=e;E[a+1|0]=e>>>8;E[a+2|0]=e>>>16;E[a+3|0]=e>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;break b;case 0:case 1:a=e+3880|0;if((Va(a)+1|0)>=(h|0)|!G[e+3284>>2]){break b}d=Va(f)+f|0;e=G[e+3296>>2]?9:32;E[d|0]=e;E[d+1|0]=e>>>8;Gb(f,a);break b;default:break g}}a=g+96|0;ym(a,L[g+136>>3],G[e+3288>>2]);d=g- -64|0;ym(d,L[g+128>>3],G[e+3288>>2]);a=Va(a);d=Va(d);k=e+3560|0;i=Va(k);j=e+3592|0;l=(i+Va(j)|0)+2|0;a=(a+d|0)+1|0;h:{if(G[e+3964>>2]!=6|G[e+3328>>2]!=1){break h}d=a+l|0;if((d|0)>=(h|0)){break h}if(i){a=g+96|0;i=Va(a)+a|0;E[i|0]=32;E[i+1|0]=0;Gb(a,k)}if(H[j|0]){a=g- -64|0;i=Va(a)+a|0;E[i|0]=32;E[i+1|0]=0;Gb(a,j)}a=d}d=G[e+3296>>2];i:{if((a|0)<(h|0)){if(d){G[g+20>>2]=g- -64;G[g+16>>2]=g+96;db(f,10358,g+16|0);break i}G[g+4>>2]=g- -64;G[g>>2]=g+96;db(f,9032,g);break i}if(d){rb(f,49119,h);break i}rb(f,49050,h)}if(G[e+3964>>2]!=6){break b}d=a+7|0;a=G[e+3328>>2];if(!((a|0)==1|(d|0)>=(h|0))){a=Va(f)+f|0;E[a|0]=32;E[a+1|0]=108;E[a+2|0]=105;E[a+3|0]=110;E[a+4|0]=101;E[a+5|0]=97;E[a+6|0]=114;E[a+7|0]=0;if(G[e+3964>>2]!=6){break b}a=G[e+3328>>2]}if((a|0)!=2|(d+l|0)>=(h|0)){break b}if(H[k|0]){a=Va(f)+f|0;E[a|0]=32;E[a+1|0]=0;Gb(f,k)}if(!H[j|0]){break b}a=Va(f)+f|0;E[a|0]=32;E[a+1|0]=0;Gb(f,j)}Fa=g+144|0}return f|0}function Hc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;h=G[a>>2];e=G[a+4>>2];if((h|0)!=G[e+76>>2]){mb(a,h+1|0,0,d);e=G[a+4>>2]}a:{b:{c:{f=G[e+1732>>2];if(G[((f<<2)+e|0)+1256>>2]!=(b|0)){g=38;f=G[e+1728>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=37;f=G[e+1724>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=36;f=G[e+1720>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=35;f=G[e+1716>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=34;f=G[e+1712>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=33;f=G[e+1708>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=32;f=G[e+1704>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=31;f=G[e+1700>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=30;f=G[e+1696>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=29;f=G[e+1692>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=28;f=G[e+1688>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=27;f=G[e+1684>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=26;f=G[e+1680>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=25;f=G[e+1676>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=24;f=G[e+1672>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=23;f=G[e+1668>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=22;f=G[e+1664>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=21;f=G[e+1660>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=20;f=G[e+1656>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=19;f=G[e+1652>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=18;f=G[e+1648>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=17;f=G[e+1644>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=16;f=G[e+1640>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=15;f=G[e+1636>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=14;f=G[e+1632>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=13;f=G[e+1628>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=12;f=G[e+1624>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=11;f=G[e+1620>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=10;f=G[e+1616>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=9;f=G[e+1612>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=8;f=G[e+1608>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=7;f=G[e+1604>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=6;f=G[e+1600>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=5;f=G[e+1596>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=4;f=G[e+1592>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=3;f=G[e+1588>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=2;f=G[e+1584>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=1;f=G[e+1580>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}g=0;f=G[e+1576>>2];if(G[((f<<2)+e|0)+1256>>2]==(b|0)){break c}i=Au(b,b>>31,2880,0);h=Ia;d:{if(c){break d}c=G[e+44>>2];if(J[e+40>>2]>i>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){break d}G[d>>2]=107;return}if((f|0)<0){G[d>>2]=103;return}if(G[((f<<2)+e|0)+1416>>2]){Hg(e,f,d);e=G[a+4>>2]}c=G[e+36>>2];e:{if((h|0)>=(c|0)&i>>>0>=J[e+32>>2]|(c|0)<(h|0)){c=G[e+1252>>2]+M(f,2880)|0;f:{if(G[e+80>>2]==1){cb(c,32,2880);break f}cb(c,0,2880)}e=G[a+4>>2];c=G[e+44>>2];i=i+2880|0;h=i>>>0<2880?h+1|0:h;d=G[e+40>>2];a=d;d=d>>>0>i>>>0&(c|0)>=(h|0)|(c|0)>(h|0);G[e+40>>2]=d?a:i;G[e+44>>2]=d?c:h;G[((f<<2)+e|0)+1416>>2]=1;break e}if(G[e+64>>2]!=(i|0)|G[e+68>>2]!=(h|0)){Ja[G[(M(G[e+4>>2],84)+1240576|0)+72>>2]](G[e>>2],i,h)|0;e=G[a+4>>2]}Lj(e,2880,G[e+1252>>2]+M(f,2880)|0,d);c=i+2880|0;h=c>>>0<2880?h+1|0:h;e=G[a+4>>2];G[e+64>>2]=c;G[e+68>>2]=h}G[((f<<2)+e|0)+1256>>2]=b;G[e+72>>2]=f;if(G[e+1576>>2]==(f|0)){break b}g=1;if(G[e+1580>>2]==(f|0)){break b}g=2;if(G[e+1584>>2]==(f|0)){break b}g=3;if(G[e+1588>>2]==(f|0)){break b}g=4;if(G[e+1592>>2]==(f|0)){break b}g=5;if(G[e+1596>>2]==(f|0)){break b}g=6;if(G[e+1600>>2]==(f|0)){break b}g=7;if(G[e+1604>>2]==(f|0)){break b}g=8;if(G[e+1608>>2]==(f|0)){break b}g=9;if(G[e+1612>>2]==(f|0)){break b}g=10;if(G[e+1616>>2]==(f|0)){break b}g=11;if(G[e+1620>>2]==(f|0)){break b}g=12;if(G[e+1624>>2]==(f|0)){break b}g=13;if(G[e+1628>>2]==(f|0)){break b}g=14;if(G[e+1632>>2]==(f|0)){break b}g=15;if(G[e+1636>>2]==(f|0)){break b}g=16;if(G[e+1640>>2]==(f|0)){break b}g=17;if(G[e+1644>>2]==(f|0)){break b}g=18;if(G[e+1648>>2]==(f|0)){break b}g=19;if(G[e+1652>>2]==(f|0)){break b}g=20;if(G[e+1656>>2]==(f|0)){break b}g=21;if(G[e+1660>>2]==(f|0)){break b}g=22;if(G[e+1664>>2]==(f|0)){break b}g=23;if(G[e+1668>>2]==(f|0)){break b}g=24;if(G[e+1672>>2]==(f|0)){break b}g=25;if(G[e+1676>>2]==(f|0)){break b}g=26;if(G[e+1680>>2]==(f|0)){break b}g=27;if(G[e+1684>>2]==(f|0)){break b}g=28;if(G[e+1688>>2]==(f|0)){break b}g=29;if(G[e+1692>>2]==(f|0)){break b}g=30;if(G[e+1696>>2]==(f|0)){break b}g=31;if(G[e+1700>>2]==(f|0)){break b}g=32;if(G[e+1704>>2]==(f|0)){break b}g=33;if(G[e+1708>>2]==(f|0)){break b}g=34;if(G[e+1712>>2]==(f|0)){break b}g=35;if(G[e+1716>>2]==(f|0)){break b}g=36;if(G[e+1720>>2]==(f|0)){break b}g=37;if(G[e+1724>>2]==(f|0)){break b}g=38;if(G[e+1728>>2]==(f|0)){break b}break a}G[e+72>>2]=f;break a}G[e+72>>2]=f}a=g;d=3-a&3;if(d){b=0;c=e+1576|0;while(1){h=c+(a<<2)|0;a=a+1|0;G[h>>2]=G[c+(a<<2)>>2];b=b+1|0;if((d|0)!=(b|0)){continue}break}}if(g-36>>>0<3){break a}c=e+1576|0;while(1){b=c+(a<<2)|0;d=G[b+4>>2];h=G[b+8>>2];G[b+8>>2]=G[b+12>>2];G[b>>2]=d;G[b+4>>2]=h;a=a+4|0;G[b+12>>2]=G[c+(a<<2)>>2];if((a|0)!=39){continue}break}}G[e+1732>>2]=f}function fp(a,b,c,d,e,f,g){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;h=Fa-80|0;Fa=h;G[h+76>>2]=b;x=h+55|0;s=h+56|0;b=0;a:{b:{c:{d:{e:while(1){if((2147483647-o|0)<(b|0)){break d}o=b+o|0;f:{g:{h:{j=G[h+76>>2];b=j;l=H[b|0];if(l){while(1){i:{i=l&255;j:{if(!i){l=b;break j}if((i|0)!=37){break i}l=b;while(1){if(H[b+1|0]!=37){break j}i=b+2|0;G[h+76>>2]=i;l=l+1|0;k=H[b+2|0];b=i;if((k|0)==37){continue}break}}b=l-j|0;w=2147483647-o|0;if((b|0)>(w|0)){break d}if(a){gd(a,j,b)}if(b){continue e}r=-1;i=1;b=G[h+76>>2];if(!(E[b+1|0]-48>>>0>=10|H[b+2|0]!=36)){r=E[b+1|0]-48|0;u=1;i=3}b=i+b|0;G[h+76>>2]=b;p=0;m=E[b|0];l=m-32|0;k:{if(l>>>0>31){i=b;break k}i=b;k=1<>2]=i;p=k|p;m=E[b+1|0];l=m-32|0;if(l>>>0>=32){break k}b=i;k=1<>>0>=10){break n}b=G[h+76>>2];if(H[b+2|0]!=36){break n}G[((E[b+1|0]<<2)+e|0)-192>>2]=10;q=G[((E[b+1|0]<<3)+d|0)-384>>2];u=1;b=b+3|0;break m}if(u){break h}u=0;q=0;if(a){b=G[c>>2];G[c>>2]=b+4;q=G[b>>2]}b=G[h+76>>2]+1|0}G[h+76>>2]=b;if((q|0)>=0){break l}q=0-q|0;p=p|8192;break l}q=Wo(h+76|0);if((q|0)<0){break d}b=G[h+76>>2]}i=0;k=-1;n=0;o:{if(H[b|0]!=46){break o}if(H[b+1|0]==42){p:{q:{if(E[b+2|0]-48>>>0>=10){break q}b=G[h+76>>2];if(H[b+3|0]!=36){break q}G[((E[b+2|0]<<2)+e|0)-192>>2]=10;k=G[((E[b+2|0]<<3)+d|0)-384>>2];b=b+4|0;break p}if(u){break h}if(a){b=G[c>>2];G[c>>2]=b+4;k=G[b>>2]}else{k=0}b=G[h+76>>2]+2|0}G[h+76>>2]=b;n=(k^-1)>>>31|0;break o}G[h+76>>2]=b+1;k=Wo(h+76|0);b=G[h+76>>2];n=1}v=n;while(1){t=i;l=28;if(E[b|0]-123>>>0<4294967238){break c}m=b+1|0;G[h+76>>2]=m;i=E[b|0];b=m;i=H[(i+M(t,58)|0)+91983|0];if(i-1>>>0<8){continue}break}r:{s:{if((i|0)!=27){if(!i){break c}if((r|0)>=0){G[(r<<2)+e>>2]=i;b=(r<<3)+d|0;i=G[b+4>>2];G[h+64>>2]=G[b>>2];G[h+68>>2]=i;break s}if(!a){break f}Oo(h- -64|0,i,c,g);m=G[h+76>>2];break r}if((r|0)>=0){break c}}b=0;if(!a){continue e}}n=p&-65537;i=p&8192?n:p;p=0;r=3838;l=s;t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{b=E[m-1|0];b=t?(b&15)==3?b&-33:b:b;switch(b-88|0){case 11:break t;case 9:case 13:case 14:case 15:break u;case 27:break z;case 12:case 17:break C;case 23:break D;case 0:case 32:break E;case 24:break F;case 22:break G;case 29:break H;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 10:case 16:case 18:case 19:case 20:case 21:case 25:case 26:case 28:case 30:case 31:break g;default:break I}}J:{switch(b-65|0){case 0:case 4:case 5:case 6:break u;case 2:break x;case 1:case 3:break g;default:break J}}if((b|0)==83){break y}break g}m=G[h+64>>2];j=G[h+68>>2];r=3838;break B}b=0;K:{switch(t&255){case 0:G[G[h+64>>2]>>2]=o;continue e;case 1:G[G[h+64>>2]>>2]=o;continue e;case 2:i=G[h+64>>2];G[i>>2]=o;G[i+4>>2]=o>>31;continue e;case 3:F[G[h+64>>2]>>1]=o;continue e;case 4:E[G[h+64>>2]]=o;continue e;case 6:G[G[h+64>>2]>>2]=o;continue e;case 7:break K;default:continue e}}i=G[h+64>>2];G[i>>2]=o;G[i+4>>2]=o>>31;continue e}k=k>>>0>8?k:8;i=i|8;b=120}n=s;y=b&32;m=G[h+64>>2];j=G[h+68>>2];if(m|j){while(1){n=n-1|0;E[n|0]=y|H[(m&15)+92512|0];z=!j&m>>>0>15|(j|0)!=0;t=j;j=j>>>4|0;m=(t&15)<<28|m>>>4;if(z){continue}break}}j=n;if(!(G[h+64>>2]|G[h+68>>2])|!(i&8)){break A}r=(b>>>4|0)+3838|0;p=2;break A}b=s;m=G[h+64>>2];j=G[h+68>>2];if(m|j){while(1){b=b-1|0;E[b|0]=m&7|48;t=!j&m>>>0>7|(j|0)!=0;n=j;j=j>>>3|0;m=(n&7)<<29|m>>>3;if(t){continue}break}}j=b;if(!(i&8)){break A}b=s-j|0;k=(b|0)<(k|0)?k:b+1|0;break A}b=G[h+68>>2];j=b;m=G[h+64>>2];if((b|0)<0){j=0-(j+((m|0)!=0)|0)|0;m=0-m|0;G[h+64>>2]=m;G[h+68>>2]=j;p=1;r=3838;break B}if(i&2048){p=1;r=3839;break B}p=i&1;r=p?3840:3838}j=Lg(m,j,s)}if((k|0)<0?v:0){break d}i=v?i&-65537:i;n=G[h+64>>2];b=G[h+68>>2];if(!(k|(n|b)!=0)){j=s;l=j;k=0;break g}b=!(b|n)+(s-j|0)|0;k=(b|0)<(k|0)?k:b;break g}b=G[h+64>>2];j=b?b:59377;b=k>>>0<2147483647?k:2147483647;i=Vi(j,0,b);b=i?i-j|0:b;l=b+j|0;if((k|0)>=0){i=n;k=b;break g}i=n;k=b;if(H[l|0]){break d}break g}if(k){l=G[h+64>>2];break w}b=0;nd(a,32,q,0,i);break v}G[h+12>>2]=0;G[h+8>>2]=G[h+64>>2];l=h+8|0;G[h+64>>2]=l;k=-1}b=0;L:{while(1){j=G[l>>2];if(!j){break L}j=Sp(h+4|0,j);n=(j|0)<0;if(!(n|j>>>0>k-b>>>0)){l=l+4|0;b=b+j|0;if(k>>>0>b>>>0){continue}break L}break}if(n){break b}}l=61;if((b|0)<0){break c}nd(a,32,q,b,i);if(!b){b=0;break v}k=0;l=G[h+64>>2];while(1){j=G[l>>2];if(!j){break v}j=Sp(h+4|0,j);k=j+k|0;if(k>>>0>b>>>0){break v}gd(a,h+4|0,j);l=l+4|0;if(b>>>0>k>>>0){continue}break}}nd(a,32,q,b,i^8192);b=(b|0)<(q|0)?q:b;continue e}if((k|0)<0?v:0){break d}l=61;b=Ja[f|0](a,L[h+64>>3],q,k,i,b)|0;if((b|0)>=0){continue e}break c}E[h+55|0]=G[h+64>>2];k=1;j=x;i=n;break g}i=b+1|0;G[h+76>>2]=i;l=H[b+1|0];b=i;continue}}if(a){break a}if(!u){break f}b=1;while(1){a=G[(b<<2)+e>>2];if(a){Oo((b<<3)+d|0,a,c,g);o=1;b=b+1|0;if((b|0)!=10){continue}break a}break}o=1;if(b>>>0>=10){break a}while(1){if(G[(b<<2)+e>>2]){break h}b=b+1|0;if((b|0)!=10){continue}break}break a}l=28;break c}n=l-j|0;m=(k|0)>(n|0)?k:n;if((m|0)>(2147483647-p|0)){break d}l=61;k=m+p|0;b=(k|0)<(q|0)?q:k;if((w|0)<(b|0)){break c}nd(a,32,b,k,i);gd(a,r,p);nd(a,48,b,k,i^65536);nd(a,48,m,n,0);gd(a,j,n);nd(a,32,b,k,i^8192);continue}break}o=0;break a}l=61}G[48624]=l}o=-1}Fa=h+80|0;return o}function Ok(a,b){var 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;l=Fa-32|0;k=G[b>>2];c=G[b+8>>2];d=G[c>>2];j=G[c+12>>2];G[a+5200>>2]=0;G[a+5204>>2]=573;q=-1;c=0;a:{if((j|0)>0){while(1){e=(c<<2)+k|0;b:{if(I[e>>1]){e=G[a+5200>>2]+1|0;G[a+5200>>2]=e;G[((e<<2)+a|0)+2908>>2]=c;E[(a+c|0)+5208|0]=0;q=c;break b}F[e+2>>1]=0}c=c+1|0;if((j|0)!=(c|0)){continue}break}c=G[a+5200>>2];if((c|0)>1){break a}}while(1){c=c+1|0;G[a+5200>>2]=c;f=((c<<2)+a|0)+2908|0;e=q+1|0;i=(q|0)<2;c=i?e:0;G[f>>2]=c;f=c<<2;F[f+k>>1]=1;E[(a+c|0)+5208|0]=0;G[a+5800>>2]=G[a+5800>>2]-1;if(d){G[a+5804>>2]=G[a+5804>>2]-I[(d+f|0)+2>>1]}q=i?e:q;c=G[a+5200>>2];if((c|0)<2){continue}break}}G[b+4>>2]=q;c=c>>>1|0;while(1){i=c;h=G[((c<<2)+a|0)+2908>>2];d=c<<1;f=G[a+5200>>2];c:{if((d|0)>(f|0)){break c}g=(a+h|0)+5208|0;n=(h<<2)+k|0;e=i;while(1){d:{if((d|0)>=(f|0)){c=d;break d}c=a+2908|0;f=d|1;m=G[c+(f<<2)>>2];o=I[(m<<2)+k>>1];p=G[c+(d<<2)>>2];c=I[(p<<2)+k>>1];if(o>>>0>=c>>>0){if((c|0)!=(o|0)){c=d;break d}c=d;d=a+5208|0;if(H[d+m|0]>H[d+p|0]){break d}}c=f}f=I[n>>1];d=G[((c<<2)+a|0)+2908>>2];m=I[(d<<2)+k>>1];if(f>>>0>>0){c=e;break c}if(!((f|0)!=(m|0)|H[g|0]>H[(a+d|0)+5208|0])){c=e;break c}G[((e<<2)+a|0)+2908>>2]=d;e=c;d=c<<1;f=G[a+5200>>2];if((d|0)<=(f|0)){continue}break}}G[((c<<2)+a|0)+2908>>2]=h;c=i-1|0;if((i|0)>1){continue}break}d=G[a+5200>>2];while(1){i=j;f=d-1|0;G[a+5200>>2]=f;g=G[a+2912>>2];h=G[((d<<2)+a|0)+2908>>2];G[a+2912>>2]=h;c=1;e:{if((d|0)<3){break e}n=(a+h|0)+5208|0;d=2;m=(h<<2)+k|0;e=1;while(1){f:{if((d|0)>=(f|0)){c=d;break f}c=a+2908|0;j=d|1;f=G[c+(j<<2)>>2];o=I[(f<<2)+k>>1];p=G[c+(d<<2)>>2];c=I[(p<<2)+k>>1];if(o>>>0>=c>>>0){if((c|0)!=(o|0)){c=d;break f}c=d;d=a+5208|0;if(H[d+f|0]>H[d+p|0]){break f}}c=j}j=I[m>>1];d=G[((c<<2)+a|0)+2908>>2];f=I[(d<<2)+k>>1];if(j>>>0>>0){c=e;break e}if(!((f|0)!=(j|0)|H[n|0]>H[(a+d|0)+5208|0])){c=e;break e}G[((e<<2)+a|0)+2908>>2]=d;e=c;d=c<<1;f=G[a+5200>>2];if((d|0)<=(f|0)){continue}break}}d=2;j=a+2908|0;G[j+(c<<2)>>2]=h;e=G[a+5204>>2]-1|0;G[a+5204>>2]=e;c=G[a+2912>>2];G[j+(e<<2)>>2]=g;e=G[a+5204>>2]-1|0;G[a+5204>>2]=e;G[j+(e<<2)>>2]=c;n=(i<<2)+k|0;e=(c<<2)+k|0;f=(g<<2)+k|0;F[n>>1]=I[e>>1]+I[f>>1];h=a+5208|0;m=h+i|0;g=H[h+g|0];c=H[c+h|0];E[m|0]=(c>>>0>>0?g:c)+1;F[e+2>>1]=i;F[f+2>>1]=i;G[a+2912>>2]=i;e=1;c=1;f=G[a+5200>>2];g:{if((f|0)<2){break g}while(1){h:{if((d|0)>=(f|0)){break h}c=d|1;f=G[j+(c<<2)>>2];g=I[(f<<2)+k>>1];o=G[j+(d<<2)>>2];p=I[(o<<2)+k>>1];if(g>>>0>=p>>>0){if((g|0)!=(p|0)|H[f+h|0]>H[h+o|0]){break h}}d=c}f=I[n>>1];c=d;d=G[((c<<2)+a|0)+2908>>2];g=I[(d<<2)+k>>1];if(f>>>0>>0){c=e;break g}if(!((f|0)!=(g|0)|H[m|0]>H[(a+d|0)+5208|0])){c=e;break g}G[((e<<2)+a|0)+2908>>2]=d;e=c;d=c<<1;f=G[a+5200>>2];if((d|0)<=(f|0)){continue}break}}j=i+1|0;G[((c<<2)+a|0)+2908>>2]=i;d=G[a+5200>>2];if((d|0)>1){continue}break}c=G[a+5204>>2]-1|0;G[a+5204>>2]=c;e=a+2908|0;G[e+(c<<2)>>2]=G[a+2912>>2];f=G[b+4>>2];c=G[b+8>>2];d=G[c+16>>2];n=G[c+8>>2];p=G[c+4>>2];m=G[c>>2];i=G[b>>2];r=a+2900|0;b=r;F[b>>1]=0;F[b+2>>1]=0;F[b+4>>1]=0;F[b+6>>1]=0;s=a+2892|0;b=s;F[b>>1]=0;F[b+2>>1]=0;F[b+4>>1]=0;F[b+6>>1]=0;t=a+2884|0;b=t;F[b>>1]=0;F[b+2>>1]=0;F[b+4>>1]=0;F[b+6>>1]=0;u=a+2876|0;b=u;F[b>>1]=0;F[b+2>>1]=0;F[b+4>>1]=0;F[b+6>>1]=0;j=0;F[(i+(G[e+(G[a+5204>>2]<<2)>>2]<<2)|0)+2>>1]=0;b=G[a+5204>>2];i:{if((b|0)>571){break i}c=b+1|0;e=0;while(1){b=G[((c<<2)+a|0)+2908>>2];v=b<<2;o=i+v|0;g=I[(i+(I[o+2>>1]<<2)|0)+2>>1];h=(d|0)>(g|0)?g+1|0:d;F[o+2>>1]=h;w=(d|0)<=(g|0);j:{if((b|0)>(f|0)){break j}g=((h<<1)+a|0)+2876|0;F[g>>1]=I[g>>1]+1;g=0;g=(b|0)>=(n|0)?G[p+(b-n<<2)>>2]:g;b=I[o>>1];G[a+5800>>2]=G[a+5800>>2]+M(h+g|0,b);if(!m){break j}G[a+5804>>2]=G[a+5804>>2]+M(b,I[(m+v|0)+2>>1]+g|0)}e=e+w|0;c=c+1|0;if((c|0)!=573){continue}break}if(!e){break i}h=((d<<1)+a|0)+2876|0;while(1){c=d;while(1){b=c;c=b-1|0;g=((c<<1)+a|0)+2876|0;n=I[g>>1];if(!n){continue}break}F[g>>1]=n-1;b=((b<<1)+a|0)+2876|0;F[b>>1]=I[b>>1]+2;F[h>>1]=I[h>>1]-1;b=(e|0)>2;e=e-2|0;if(b){continue}break}if(!d){break i}c=573;while(1){e=I[((d<<1)+a|0)+2876>>1];if(e){while(1){c=c-1|0;b=G[((c<<2)+a|0)+2908>>2];if((b|0)>(f|0)){continue}b=i+(b<<2)|0;h=I[b+2>>1];if((h|0)!=(d|0)){G[a+5800>>2]=G[a+5800>>2]+M(I[b>>1],d-h|0);F[b+2>>1]=d}e=e-1|0;if(e){continue}break}}d=d-1|0;if(d){continue}break}}b=I[u>>1]<<1;F[l+2>>1]=b;b=b+I[a+2878>>1]<<1;F[l+4>>1]=b;b=b+I[a+2880>>1]<<1;F[l+6>>1]=b;b=b+I[a+2882>>1]<<1;F[l+8>>1]=b;b=b+I[t>>1]<<1;F[l+10>>1]=b;b=b+I[a+2886>>1]<<1;F[l+12>>1]=b;b=b+I[a+2888>>1]<<1;F[l+14>>1]=b;b=b+I[a+2890>>1]<<1;F[l+16>>1]=b;b=b+I[s>>1]<<1;F[l+18>>1]=b;b=b+I[a+2894>>1]<<1;F[l+20>>1]=b;b=b+I[a+2896>>1]<<1;F[l+22>>1]=b;b=b+I[a+2898>>1]<<1;F[l+24>>1]=b;b=b+I[r>>1]<<1;F[l+26>>1]=b;b=b+I[a+2902>>1]<<1;F[l+28>>1]=b;F[l+30>>1]=b+I[a+2904>>1]<<1;if((q|0)>=0){while(1){i=(j<<2)+k|0;a=I[i+2>>1];if(a){b=(a<<1)+l|0;c=I[b>>1];F[b>>1]=c+1;b=a&3;d=0;k:{if(a-1>>>0<3){a=0;break k}h=a&65532;a=0;e=0;while(1){f=c>>>3&1|(c>>>2&1|(c&2|(c&1|a)<<2))<<1;a=f<<1;c=c>>>4|0;e=e+4|0;if((h|0)!=(e|0)){continue}break}}if(b){while(1){f=c&1|a;a=f<<1;c=c>>>1|0;d=d+1|0;if((b|0)!=(d|0)){continue}break}}F[i>>1]=f}a=(j|0)!=(q|0);j=j+1|0;if(a){continue}break}}}function qu(a,b,c){a=a|0;b=b|0;c=c|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-196992|0;Fa=d;k=G[968816];j=G[968817];G[d+380>>2]=0;G[d+376>>2]=0;a:{if(!j|((a|0)<=0|(a|0)>=(k|0))){break a}m=j+M(a,65544)|0;if(!G[m>>2]){break a}k=ul(a,0);a=j+M(a,65544)|0;p=G[a+4>>2];r=0;b:{if(!Xc(k,30677)){break b}r=0;if(!Xc(k,30657)){break b}p=Xc(k,13234)?p:1;r=1}E[a+8|0]=0;s=a+8|0;t=le(b);g=pc(t,36383);if(g){k=d+131456|1;while(1){a=jb(g,32);c:{if(a){G[d+380>>2]=a+1;E[a|0]=0;a=G[d+380>>2];break c}G[d+380>>2]=92041;g=0;a=92041}l=vb(a,d+376|0);d:{if(l==0){break d}e=vb(G[d+376>>2],d+380|0);if(e==0){break d}cc(G[m>>2],l,e,d+368|0,d+360|0);if(g){G[d+304>>2]=g;b=d+131456|0;Ya(b,65536,64286,d+304|0);qb(s,b,65535)}e:{f:{switch(p|0){case 1:L[d+272>>3]=L[d+368>>3];L[d+280>>3]=L[d+360>>3];Ya(d+131456|0,65536,18883,d+272|0);break e;case 0:e=L[d+368>>3];g:{if(!r){Mf(d+65920|0,65535,e,3);break g}Bj(d+65920|0,65535,e,3)}b=d+384|0;Mf(b,65535,L[d+360>>3],3);G[d+292>>2]=b;G[d+288>>2]=d+65920;Ya(d+131456|0,65536,8807,d+288|0);break e;default:break f}}L[d+256>>3]=L[d+368>>3];L[d+264>>3]=L[d+360>>3];Ya(d+131456|0,65536,18883,d+256|0)}i=qb(s,d+131456|0,65535);h:{if(!Xa(g,4316)){E[d+131456|0]=44;a=G[d+380>>2];q=H[a|0];i:{if(!q){j=k;b=a;break i}j:{while(1){b=q<<24>>24;if(!((b|0)==32|b-9>>>0<5)){break j}b=a+1|0;G[d+380>>2]=b;q=H[a+1|0];a=b;if(q){continue}break}j=k;break i}j=k;b=a;if((u|0)>1){break i}while(1){b=a+1|0;G[d+380>>2]=b;E[j|0]=H[a|0];j=j+1|0;u=((q|0)==34)+u|0;q=H[a+1|0];if(!q){break i}a=b;if((u|0)<2){continue}break}}E[j|0]=0;qb(i,d+131456|0,65535);vb(b,d+376|0);break h}k:{if(Xa(g,15727)){if(Xa(g,21330)){break k}}f=vb(G[d+380>>2],d+376|0);l:{if(f==0){break l}while(1){e=vb(G[d+376>>2],d+380|0);if(e==0){break l}cc(G[m>>2],f,e,d+368|0,d+360|0);m:{n:{switch(p|0){case 1:L[d+96>>3]=L[d+368>>3];L[d+104>>3]=L[d+360>>3];Ya(d+131456|0,65536,18882,d+96|0);break m;case 0:e=L[d+368>>3];o:{if(!r){Mf(d+65920|0,65535,e,3);break o}Bj(d+65920|0,65535,e,3)}b=d+384|0;Mf(b,65535,L[d+360>>3],3);G[d+116>>2]=b;G[d+112>>2]=d+65920;Ya(d+131456|0,65536,8806,d+112|0);break m;default:break n}}L[d+80>>3]=L[d+368>>3];L[d+88>>3]=L[d+360>>3];Ya(d+131456|0,65536,18882,d+80|0)}qb(i,d+131456|0,65535);f=vb(G[d+380>>2],d+376|0);if(f!=0){continue}break}}if(Xa(g,21330)){break h}G[d+380>>2]=a;n=vb(a,d+376|0);if(n==0){break h}l=vb(G[d+376>>2],d+380|0);if(l==0){break h}f=vb(G[d+380>>2],d+376|0);if(f==0){break h}while(1){e=vb(G[d+376>>2],d+380|0);if(e==0){break h}cc(G[m>>2],n,l,d+368|0,d+360|0);cc(G[m>>2],f,e,d+352|0,d+344|0);h=h+pg(L[d+368>>3],L[d+360>>3],L[d+352>>3],L[d+344>>3]);l=e;n=f;f=vb(G[d+380>>2],d+376|0);if(f!=0){continue}break}break h}p:{q:{if(c){f=vb(G[d+380>>2],d+376|0);if(f==0){break p}n=vb(G[d+376>>2],d+380|0);if(n!=0){break q}break p}b=G[m>>2];a=G[b+3304>>2];e=L[(a?768:760)+b>>3];L[d+328>>3]=O(L[b+(a?760:768)>>3]);L[d+320>>3]=O(e);a=G[d+380>>2];if(!a|!H[a|0]){break h}while(1){e=vb(a,d+376|0);if(G[d+380>>2]==G[d+376>>2]){break h}h=e*L[(d+320|0)+((o|0)%2<<3)>>3];r:{s:{switch(p|0){case 1:L[d+144>>3]=h;Ya(d+131456|0,65536,18887,d+144|0);break r;case 0:if(h<1){L[d+160>>3]=h*3600;Ya(d+131456|0,65536,65564,d+160|0);break r}L[d+176>>3]=h;Ya(d+131456|0,65536,27743,d+176|0);break r;default:break s}}L[d+128>>3]=h;Ya(d+131456|0,65536,18887,d+128|0)}qb(i,d+131456|0,65535);a=G[d+376>>2];G[d+380>>2]=a;b=o+1|0;t:{if(!Xa(g,3720)){o=2;if((b|0)!=2){break t}break h}if(!Xa(g,22631)){if(o){break t}o=1;break h}if(!Xa(g,5777)){o=2;if((b|0)==2){break h}break t}if(Xa(g,20708)|(b|0)!=2){break t}o=2;break h}if(!a){o=b;break h}o=b;if(H[a|0]){continue}break}break h}while(1){l=vb(G[d+380>>2],d+376|0);if(l==0){break p}e=vb(G[d+376>>2],d+380|0);if(e==0){break p}cc(G[m>>2],f,n,d+368|0,d+360|0);cc(G[m>>2],l,e,d+352|0,d+344|0);h=pg(L[d+368>>3],L[d+360>>3],L[d+352>>3],L[d+344>>3]);f=vb(G[d+380>>2],d+376|0);if(f==0){break p}n=vb(G[d+376>>2],d+380|0);if(n!=0){continue}break}}u:{switch(p|0){case 1:L[d+208>>3]=h;a=d+131456|0;Ya(a,65536,18887,d+208|0);qb(i,a,65535);break h;case 0:if(h<1){L[d+224>>3]=h*3600;a=d+131456|0;Ya(a,65536,65564,d+224|0);qb(i,a,65535);break h}L[d+240>>3]=h;a=d+131456|0;Ya(a,65536,27743,d+240|0);qb(i,a,65535);break h;default:break u}}L[d+192>>3]=h;a=d+131456|0;Ya(a,65536,18887,d+192|0);qb(i,a,65535)}v:{w:{if(!Xa(g,3720)){break w}if(!Xa(g,5777)){break w}if(!Xa(g,20708)){break w}if(Xa(g,4316)){break v}}f=vb(G[d+380>>2],d+376|0);if(f==0|G[d+380>>2]==G[d+376>>2]){break v}if(f<0){while(1){f=f+6.283185307179586;if(f<0){continue}break}}L[d+64>>3]=f*57.29577951308232;a=d+131456|0;Ya(a,65536,18887,d- -64|0);qb(i,a,65535)}if(g){F[d+131456>>1]=41;qb(i,d+131456|0,65535)}if(!Xa(g,21330)){x:{y:{switch(p|0){case 1:L[d+16>>3]=h;Ya(d+131456|0,65536,1533,d+16|0);break x;case 0:if(h<1){L[d+32>>3]=h*3600;Ya(d+131456|0,65536,1750,d+32|0);break x}L[d+48>>3]=h;Ya(d+131456|0,65536,1533,d+48|0);break x;default:break y}}L[d>>3]=h;Ya(d+131456|0,65536,1533,d)}qb(i,d+131456|0,65535)}F[d+131456>>1]=59;qb(i,d+131456|0,65535)}g=pc(0,36383);if(g){continue}break}}if(!t){break a}Wa(t)}Fa=d+196992|0;return s|0}function Xi(a,b,c){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;j=Fa-448|0;Fa=j;e=G[c>>2];a:{if((e|0)>0){break a}l=ac(b,13287);if(l){b:{if(!vc(j+176|0,160,l)){break b}o=j+392|0;while(1){E[j+336|0]=0;b=j+176|0;p=Va(b)+j|0,q=0,E[p+175|0]=q;g=j+352|0;i=Fa-528|0;Fa=i;e=G[c>>2];c:{if((e|0)>0){break c}E[g|0]=0;G[j+12>>2]=0;d:{e:{f:{if(H[b|0]!=32){break f}if(fb(b,68289,8)){break f}qb(g,b,80);G[j+12>>2]=1;break e}E[i+304|0]=0;E[i+448|0]=0;E[i+160|0]=0;b=Me(b,68332)+b|0;if(!fb(b,48648,20)){break d}if(H[b|0]==45){G[j+12>>2]=-1;b=b+1|0;f=Me(b,68332)+b|0;b=qc(f,49016);if((b|0)>=75){break d}h=qb(g,f,b);g:{if((b|0)>8){break g}d=Va(h);if(d){e=0;while(1){k=e+h|0;g=E[k|0];E[k|0]=g-97>>>0<26?g&95:g;e=e+1|0;if((d|0)!=(e|0)){continue}break}}G[i+12>>2]=0;if((ve(h,i+12|0)|0)<=0){break g}E[h|0]=0;qb(h,f,b)}e=b+f|0;if(H[e|0]==43){b=Va(h)+h|0;E[b|0]=43;E[b+1|0]=0;break e}f=Me(e,68332)+e|0;e=H[f|0];if((e|0)==61|!e){break e}G[j+12>>2]=-2;e=qc(f,68332);if((b|0)>=41){E[h|0]=0;break d}if((e|0)>=41){E[h|0]=0;break d}b=Va(h)+h|0;g=H[68261]|H[68262]<<8|(H[68263]<<16|H[68264]<<24);d=H[68257]|H[68258]<<8|(H[68259]<<16|H[68260]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24;E[b+4|0]=g;E[b+5|0]=g>>>8;E[b+6|0]=g>>>16;E[b+7|0]=g>>>24;E[b+40|0]=H[68297];g=H[68293]|H[68294]<<8|(H[68295]<<16|H[68296]<<24);d=H[68289]|H[68290]<<8|(H[68291]<<16|H[68292]<<24);E[b+32|0]=d;E[b+33|0]=d>>>8;E[b+34|0]=d>>>16;E[b+35|0]=d>>>24;E[b+36|0]=g;E[b+37|0]=g>>>8;E[b+38|0]=g>>>16;E[b+39|0]=g>>>24;g=H[68285]|H[68286]<<8|(H[68287]<<16|H[68288]<<24);d=H[68281]|H[68282]<<8|(H[68283]<<16|H[68284]<<24);E[b+24|0]=d;E[b+25|0]=d>>>8;E[b+26|0]=d>>>16;E[b+27|0]=d>>>24;E[b+28|0]=g;E[b+29|0]=g>>>8;E[b+30|0]=g>>>16;E[b+31|0]=g>>>24;g=H[68277]|H[68278]<<8|(H[68279]<<16|H[68280]<<24);d=H[68273]|H[68274]<<8|(H[68275]<<16|H[68276]<<24);E[b+16|0]=d;E[b+17|0]=d>>>8;E[b+18|0]=d>>>16;E[b+19|0]=d>>>24;E[b+20|0]=g;E[b+21|0]=g>>>8;E[b+22|0]=g>>>16;E[b+23|0]=g>>>24;g=H[68269]|H[68270]<<8|(H[68271]<<16|H[68272]<<24);d=H[68265]|H[68266]<<8|(H[68267]<<16|H[68268]<<24);E[b+8|0]=d;E[b+9|0]=d>>>8;E[b+10|0]=d>>>16;E[b+11|0]=d>>>24;E[b+12|0]=g;E[b+13|0]=g>>>8;E[b+14|0]=g>>>16;E[b+15|0]=g>>>24;b=rb(h+40|0,f,e);E[h+80|0]=0;if((e|0)>8){break e}Yf(b);G[i+12>>2]=0;if((ve(b,i+12|0)|0)<=0){break e}rb(b,f,e);break e}f=qc(b,36177);if((f|0)>=75){break d}h=qb(i+448|0,b,f);h:{if((f|0)>8){break h}k=Va(h);if(k){e=0;while(1){n=e+h|0;d=E[n|0];E[n|0]=d-97>>>0<26?d&95:d;e=e+1|0;if((k|0)!=(e|0)){continue}break}}G[i+12>>2]=0;if((ve(h,i+12|0)|0)<=0){break h}E[h|0]=0;qb(h,b,f)}d=G[h>>2];if(!(H[h|0]!=69|(d|0)!=4476485)){E[g|0]=69;E[g+1|0]=78;E[g+2|0]=68;E[g+3|0]=0;G[j+12>>2]=2;break e}e=b+f|0;i:{b=G[h>>2];f=G[h+4>>2];if(!((b|0)==1296912195&(f|0)==5525061&(d&255)==67|(b|0)==1414744392&(f|0)==5853775&(b&255)==72)){if((b&255)!=72){break i}if(nb(h,34939,9)){break i}}G[j+12>>2]=1;qb(Za(g,h),e,72);break e}b=139;j:{k:{l:{m:{n:{e=Me(e,36177)+e|0;d=H[e|0];switch(d-39|0){case 8:break k;case 1:case 2:case 3:case 4:case 5:case 6:case 7:break l;case 0:break n;default:break m}}while(1){d=qc(e+1|0,65322);f=d+2|0;if((f|0)>(b|0)){break d}qb(i+304|0,e,f);d=(e+d|0)+1|0;if(H[d|0]==39){e=d+1|0;b=b-f|0;if(H[d+1|0]!=39){break j}continue}break}e=205;G[c>>2]=205;break c}if(!d){break k}}b=qc(e,42204);if((b|0)>=140){break d}f=qb(i+304|0,e,b);d=d-70|0;o:{p:{if((d|0)!=14?d:0){break p}q:{d=H[e+1|0];switch(d-32|0){case 0:case 15:break o;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break p;default:break q}}if(!d){break o}}m=vb(f,i+156|0);r:{s:{t:{d=H[G[i+156>>2]];switch(d-32|0){case 0:case 15:break r;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break s;default:break t}}if(!d){break r}}d=Za(i+16|0,f);k=jb(d,68);u:{if(k){E[k|0]=69;break u}k=jb(d,100);if(k){E[k|0]=69;break u}k=jb(d,46);if(!k){break r}E[k|0]=44}m=vb(d,i+156|0)}v:{w:{x:{d=H[G[i+156>>2]];switch(d-32|0){case 0:case 15:break v;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break w;default:break x}}if(!d){break v}}if((b|0)>=138){break d}F[f>>1]=39;f=qb(f,e,b);f=Va(f)+f|0;E[f|0]=39;E[f+1|0]=0;if(m!=0){break o}if(O(m)<2147483648){b=~~m+b|0;break o}b=b- -2147483648|0;break o}d=jb(f,101);if(d){E[d|0]=69;break o}f=jb(f,100);if(!f){break o}E[f|0]=68}e=b+e|0;break j}b=i+304|0;b=Va(b)+b|0;E[b|0]=32;E[b+1|0]=0}b=Me(e,42204)+e|0;e=Va(i+304|0);f=e-1|0;if(!(f>>>0>8|H[i+304|0]!=39)){d=f;f=i+304|0;E[d+f|0]=0;e=qb(f,68289,10-e|0)+9|0;e=Va(e)+e|0;E[e|0]=39;E[e+1|0]=0}Ob(h,i+304|0,qb(i+160|0,b,70),g,c)}e=G[c>>2];break c}e=207;G[c>>2]=207}Fa=i+528|0;if((e|0)>0){break b}b=rb(j+96|0,j+352|0,8);E[j+104|0]=0;y:{z:{switch(G[j+12>>2]+2|0){case 0:e=rb(j+16|0,o,8);E[j+24|0]=0;pl(a,b,e,c);break y;case 1:kf(a,b,c);break y;case 2:Dq(a,b,j+352|0,c);break y;case 3:break z;default:break b}}wb(a,j+352|0,c)}if(vc(j+176|0,160,l)){continue}break}}Hb(l);e=G[c>>2];break a}Ua(38301);Ua(b);e=104;G[c>>2]=104}Fa=j+448|0;return e}function Lf(a,b,c){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;d=Fa-2528|0;Fa=d;G[d+2484>>2]=0;e=G[321443];if(!e){e=ab(8e4);G[321442]=8e4;G[321443]=e}G[321445]=0;G[321444]=0;G[321446]=0;G[321447]=0;G[321448]=0;G[321449]=0;G[321450]=0;G[321451]=0;G[321452]=0;G[321453]=0;G[321454]=0;G[321455]=0;G[321456]=0;G[321457]=0;G[321458]=0;G[321459]=0;G[321460]=0;G[321461]=0;G[321462]=0;G[321464]=0;G[321463]=0;G[321465]=0;G[321466]=0;G[321440]=0;a:{b:{c:{d:{f=G[321438];if(f){e=ac(f,49010);G[321467]=e;if(!e){break d}e=G[321443]}E[e|0]=0;f=Rc(d+188|0,a,0,d+2484|0);e=G[321439];e:{f:{g:{h:{if(!f){if(e){yb(22598);$a(G[29763])}if((b|0)==1){break e}if((c|0)>0){if(mb(G[d+188>>2],c+1|0,0,d+2484|0)){break f}}if(Td(G[d+188>>2],d+2492|0,d+2488|0,d+2484|0)){break g}a=G[d+2492>>2];if((a|0)>=1001){n=1285772,o=ub(G[321443],M(a,80)+1024|0),G[n>>2]=o}if(G[321439]){G[d+80>>2]=G[d+2492>>2];kb(75434,d+80|0);$a(G[29763])}if(G[d+2492>>2]>0){l=d+2400|1;g=1;while(1){if(Cf(G[d+188>>2],g,d+192|0,d+2400|0,d+2320|0,d+2484|0)){break h}i:{if(H[d+2400|0]==39){a=Za(d+2240|0,l);a=(Va(a)+a|0)-1|0;if(H[a|0]!=39){break i}E[a|0]=0;break i}Za(d+2240|0,d+2400|0)}a=d+192|0;mm(a,d+2240|0);G[d+52>>2]=d+2400;G[d+48>>2]=a;a=d+1216|0;db(a,8711,d+48|0);if(nb(a,33332,7)){a=G[321443];b=Va(a);f=Va(d+1216|0);j:{if((f|0)>0){j=0;e=0;if(f-1>>>0>=3){k=f&-4;c=0;while(1){m=d+1216|0;h=m;E[a+(b+e|0)|0]=H[h+e|0];i=e|1;E[a+(b+i|0)|0]=H[h+i|0];i=e|2;E[a+(i+b|0)|0]=H[h+i|0];h=e|3;E[a+(h+b|0)|0]=H[h+m|0];e=e+4|0;c=c+4|0;if((k|0)!=(c|0)){continue}break}}c=f&3;if(c){while(1){E[a+(b+e|0)|0]=H[(d+1216|0)+e|0];e=e+1|0;j=j+1|0;if((c|0)!=(j|0)){continue}break}}if((f|0)>79){break j}}cb(a+(b+f|0)|0,32,80-f|0)}E[(a+b|0)+80|0]=0}a=G[d+2492>>2]>(g|0);g=g+1|0;if(a){continue}break}}a=G[321443];a=Va(a)+a|0;E[a|0]=69;E[a+1|0]=78;E[a+2|0]=68;cb(a+3|0,32,77);E[a+80|0]=0;if(!Qb(G[d+188>>2],d+2484|0)){break b}a=G[d+2484>>2];b=d+2496|0;uc(a,b);G[d+32>>2]=a;G[d+36>>2]=b;_a(G[321435],80427,d+32|0);break a}if(e){yb(22187);$a(G[29763])}f=ac(a,13287);k:{if(!b){if(!f){break k}Hb(f);G[d+144>>2]=a;_a(G[321435],82961,d+144|0);break a}if(f){if(!vc(d+1216|0,1024,f)){break c}l:while(1){a=(Va(d+1216|0)+d|0)+1215|0;if(H[a|0]==10){E[a|0]=0}a=(Va(d+1216|0)+d|0)+1215|0;if(H[a|0]==13){E[a|0]=0}a=d+1216|0;b=Za(d+192|0,a);if((Va(a)|0)<81){g=Va(b)+b|0;while(1){a=b;e=H[a|0];if((e|0)==32){b=a+1|0;if(a>>>0>>0){continue}}break}c=a;while(1){b=e&255;if(!(!((b|0)==32|(b|0)==61)&c>>>0>>0)){b=c;while(1){e=(e&255)-32|0;if(!(e>>>0>29|!(1<>>0>=g>>>0)){e=H[b+1|0];b=b+1|0;continue}break}E[c|0]=0;e=(H[b|0]==39)+b|0;while(1){m:{n:{switch(H[e|0]-32|0){case 0:case 7:break m;default:break n}}if(e>>>0>=g>>>0){break m}e=e+1|0;continue}break}E[e|0]=0;mm(a,b);a=G[321443];b=Va(a);g=Va(d+1216|0);o:{if((g|0)>0){j=0;e=0;if(g-1>>>0>=3){l=g&-4;c=0;while(1){i=d+1216|0;E[a+(b+e|0)|0]=H[i+e|0];h=e|1;E[a+(h+b|0)|0]=H[h+i|0];h=e|2;E[a+(h+b|0)|0]=H[h+i|0];k=e|3;E[a+(k+b|0)|0]=H[k+i|0];e=e+4|0;c=c+4|0;if((l|0)!=(c|0)){continue}break}}c=g&3;if(c){while(1){E[a+(b+e|0)|0]=H[(d+1216|0)+e|0];e=e+1|0;j=j+1|0;if((c|0)!=(j|0)){continue}break}}if((g|0)>79){break o}}cb(a+(b+g|0)|0,32,80-g|0)}E[(a+b|0)+80|0]=0;c=Va(a)+160|0;b=G[321442];if((c|0)>(b|0)){b=b+8e4|0;G[321442]=b;n=1285772,o=ub(a,b),G[n>>2]=o}if(vc(d+1216|0,1024,f)){continue l}break c}e=H[c+1|0];c=c+1|0;continue}}break}hb(83460,85,1,G[321435]);break a}G[d+160>>2]=a;_a(G[321435],84274,d+160|0);break a}G[d+128>>2]=a;_a(G[321435],84274,d+128|0);break a}a=G[d+2484>>2];b=d+2496|0;uc(a,b);G[d+64>>2]=a;G[d+68>>2]=b;_a(G[321435],80427,d- -64|0);break a}a=G[d+2484>>2];b=d+1216|0;uc(a,b);G[d+96>>2]=a;G[d+100>>2]=b;_a(G[321435],80427,d+96|0);break a}a=G[d+2484>>2];b=d+1216|0;uc(a,b);G[d+112>>2]=a;G[d+116>>2]=b;_a(G[321435],80427,d+112|0);break a}G[d>>2]=a;_a(G[321435],82751,d);break a}G[d+176>>2]=G[321438];_a(G[321435],83763,d+176|0);break a}Hb(f)}if(!G[321446]){hc(11884)}if(!G[321447]){hc(11917)}if(!G[321448]){hc(12114)}if(!G[321449]){hc(11982)}p:{q:{if(G[321444]){Wa(G[321443]);G[321443]=0;G[321442]=0;break q}if(!G[321450]){hc(12180)}if(!G[321451]){hc(12048)}if(!G[321452]){hc(12081)}if(!G[321453]){hc(11949)}if(!G[321460]){hc(12147)}if(!G[321461]){hc(12015)}r:{if(G[321456]|G[321457]|(G[321458]|G[321459])){break r}if(G[321454]){if(G[321455]){break r}a=12213}else{a=12272}hc(a)}if(Va(1285872)>>>0<=7){hc(6352)}if(Va(1286896)>>>0<=7){hc(6315)}e=1285872;while(1){a=H[e|0];if(!((a|0)==45|!a)){e=e+1|0;continue}break}while(1){a=e;e=a+1|0;c=H[a|0];if((c|0)==45){continue}break}e=1286896;while(1){b=H[e|0];if(!((b|0)==45|!b)){e=e+1|0;continue}break}while(1){b=e;e=b+1|0;f=H[b|0];if((f|0)==45){continue}break}if(!(f?c:0)){hc(14710)}if(Xa(a,b)){hc(17467)}s:{if(!G[321441]){break s}if((Va(a)|0)!=3){hc(14796)}if((Va(b)|0)==3){break s}hc(14758)}a=rd(G[321443]);G[321980]=a;Wg(a,0);a=G[321980];if(a){Ce(a)}a=G[321440];if((a|0)>0){break p}}Fa=d+2528|0;return}G[d+16>>2]=a;_a(G[321435],79975,d+16|0)}$a(G[321435]);Hb(G[321435]);sc(1);W()}function xg(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=Fa-512|0;Fa=g;a:{b:{if(!((a|0)!=1032|(c|0)!=-99)){if((mi(35455,g)|0)==269){c=xf(G[g>>2]);break b}if(!G[309737]){G[309737]=431}a=g+368|0;bb(a,136341,80);E[g+447|0]=0;Ua(a);h=-1;break a}if((a|0)!=1047){break b}if(!((c|0)!=-99&(d|0)!=-99)){if(!G[309737]){G[309737]=431}a=bb(g,136260,80);E[a+79|0]=0;Ua(a);h=-1;break a}i=1;d=Fb(260,0,d);if((d|0)>=0){break b}h=-1;break a}o=Fb(260,0,c);c:{j=G[309723];if((j|0)==G[309724]){c=G[309722];d:{if(c){G[309724]=j<<1;c=ub(c,M(j,688));break d}G[309724]=100;c=ab(34400)}if(!c){break c}G[309722]=c;j=G[309723]}G[309723]=j+1;h=-1;if((o|j)<0){break a}c=G[309712];G[g+508>>2]=c;G[g+484>>2]=G[c>>2]+1;G[g+472>>2]=0;e:{if(Kc(G[g+508>>2],34368,g+336|0,g+472|0)){G[g+472>>2]=0;if(Kc(G[g+508>>2],34889,g+336|0,g+472|0)){G[g+336>>2]=0;G[g+340>>2]=0;G[g+320>>2]=0;G[g+324>>2]=0;break e}if(!Kc(G[g+508>>2],35126,g+320|0,g+472|0)){break e}G[g+320>>2]=0;G[g+324>>2]=0;break e}G[g+320>>2]=0;G[g+324>>2]=0}f:{g:{h:{i:{j:{c=E[b|0];if((c|0)==91){c=1;while(1){k=b+c|0;n=H[k|0];if(!n){break i}if((n|0)==93){break j}c=c+1|0;continue}}if((c|0)==43){break h}if(c){break g}G[g+488>>2]=1;break f}G[g+504>>2]=c;n=0;E[k|0]=0;Pj(b+1|0,g+488|0,g+368|0,g+480|0,g+476|0,g+288|0,g+256|0,1238948);if(H[g+368|0]){Je(G[g+508>>2],G[g+476>>2],g+368|0,G[g+480>>2],1238948);G[g+488>>2]=G[G[g+508>>2]>>2]+1;break f}b=G[g+488>>2];if(b){b=b+1|0;G[g+488>>2]=b;mb(G[g+508>>2],b,g+492|0,1238948);break f}if(G[309737]){break a}wc(11017);break a}G[g+504>>2]=c;if(!G[309737]){G[309737]=431}a=g+368|0;bb(a,136179,80);E[g+447|0]=0;Ua(a);break a}b=_b(b);c=b+1|0;G[g+488>>2]=c;if((b|0)>0){mb(G[g+508>>2],c,g+492|0,1238948);break f}if(!G[309737]){G[309737]=431}a=g+368|0;bb(a,136098,80);E[g+447|0]=0;Ua(a);break a}n=1;if(ch(g+508|0,b,0,1238948)){break f}G[g+488>>2]=G[G[g+508>>2]>>2]+1}if(G[309737]){break a}k:{if(G[g+488>>2]!=1){break k}G[g+488>>2]=2;l:{if(mb(G[g+508>>2],2,g+492|0,1238948)){break l}while(1){m:{if(!G[g+492>>2]){break m}G[g+472>>2]=0;if(Fc(G[g+508>>2],35480,g+368|0,0,g+472|0)){break m}b=g+368|0;Yf(b);if(Sb(b,34885)){break l}}b=G[g+488>>2]+1|0;G[g+488>>2]=b;if(!mb(G[g+508>>2],b,g+492|0,1238948)){continue}break}}b=G[309737];if(!b){break k}if((b|0)!=107){break a}wc(21984);break a}dc(G[g+508>>2],0,e,g+500|0,1238948);dc(G[g+508>>2],0,f,g+496|0,1238948);if(G[309737]){break a}G[g+472>>2]=0;c=g+336|8;n:{o:{if(Kc(G[g+508>>2],34368,c,g+472|0)){G[g+472>>2]=0;if(Kc(G[g+508>>2],34889,c,g+472|0)){G[g+328>>2]=0;G[g+332>>2]=0;break o}c=g+320|8;if(Kc(G[g+508>>2],35126,c,g+472|0)){break o}break n}c=g+320|8}G[c>>2]=0;G[c+4>>2]=0}c=0;p:{q:{b=G[309723];if((b|0)==G[309724]){e=G[309722];r:{if(e){G[309724]=b<<1;b=ub(e,M(b,688));break r}G[309724]=100;b=ab(34400)}if(!b){break q}G[309722]=b;b=G[309723]}G[309723]=b+1;break p}G[309737]=113;b=-1}s:{if((b|0)<0){break s}k=G[309722];f=k+M(b,344)|0;e=(a|0)==1032;G[f+8>>2]=e?2:3;G[f>>2]=a;G[f+52>>2]=e?258:260;G[f+4>>2]=e?27:28;G[f+16>>2]=o;e=k+M(o,344)|0;G[f+56>>2]=G[e+56>>2];G[f+60>>2]=G[e+60>>2];G[g+504>>2]=0;if(G[e+60>>2]>0){while(1){l=c<<2;G[(l+f|0)- -64>>2]=G[(e+l|0)- -64>>2];c=c+1|0;G[g+504>>2]=c;if(G[e+60>>2]>(c|0)){continue}break}}t:{if(!i){break t}G[(k+M(b,344)|0)+20>>2]=d;if(G[e+56>>2]==G[(k+M(d,344)|0)+56>>2]){break t}wc(34245);break a}G[f+12>>2]=j;e=k+M(j,344)|0;G[e>>2]=-1e3;G[e+4>>2]=0;G[e+88>>2]=0;if(Ec(G[g+508>>2],40853,g+364|0,0,1238948)){break a}G[e+56>>2]=G[g+364>>2];c=G[g+364>>2];u:{if(!c){break u}c=ab(c<<4);G[e+88>>2]=c;if(!c){G[309737]=113;break a}l=G[g+364>>2];p=l;q=l>>31;l=g+504|0;Hf(G[g+508>>2],G[g+500>>2],1,0,1,0,p,q,0,c,l,1238948);c=G[g+364>>2];Hf(G[g+508>>2],G[g+496>>2],1,0,1,0,c,c>>31,0,G[e+88>>2]+(c<<3)|0,l,1238948);if(G[309737]){Wa(G[e+88>>2]);break a}l=k+M(j,344)|0;G[l+52>>2]=1;h=G[g+364>>2];j=h;v:{w:{while(1){c=j-1|0;G[g+504>>2]=c;if(!c){break w}k=G[e+88>>2];j=j-2|0;if(!(L[k+(j<<3)>>3]>=L[k+(c<<3)>>3])){m=L[k+(h+j<<3)>>3];j=c;if(!(m>=L[k+(c+h<<3)>>3])){continue}}break}G[l+52>>2]=0;c=1;break v}c=G[l+52>>2]!=1}if(c&i){wc(34304);h=-1;break a}m=L[g+344>>3]-L[g+336>>3]+(L[g+328>>3]-L[g+320>>3]);c=G[e+88>>2];if(!(O(m/(L[(c+(h<<4)|0)-8>>3]-L[c>>3]))>1e-12)){break u}c=0;G[g+504>>2]=0;if((h|0)<=0){break u}h=h<<1;h=(h|0)>1?h:1;j=h&3;if(h-1>>>0>=3){k=h&2147483644;h=0;while(1){i=G[e+88>>2]+(c<<3)|0;L[i>>3]=m+L[i>>3];i=c|1;G[g+504>>2]=i;i=G[e+88>>2]+(i<<3)|0;L[i>>3]=m+L[i>>3];i=c|2;G[g+504>>2]=i;i=G[e+88>>2]+(i<<3)|0;L[i>>3]=m+L[i>>3];i=c|3;G[g+504>>2]=i;i=G[e+88>>2]+(i<<3)|0;L[i>>3]=m+L[i>>3];c=c+4|0;G[g+504>>2]=c;h=h+4|0;if((k|0)!=(h|0)){continue}break}}if(!j){break u}h=0;while(1){k=G[e+88>>2]+(c<<3)|0;L[k>>3]=m+L[k>>3];c=c+1|0;G[g+504>>2]=c;h=h+1|0;if((j|0)!=(h|0)){continue}break}}c=G[309722];if(G[c+M(o,344)>>2]!=-1e3|(a|0)!=1032&G[c+M(d,344)>>2]!=-1e3){break s}Ja[G[f+4>>2]](f)}a=G[g+508>>2];x:{if(!n){mb(a,G[g+484>>2],g+492|0,1238948);break x}Qb(a,1238948)}h=b;break a}G[309737]=113;h=-1}Fa=g+512|0;return h}function Rs(a){a=a|0;var 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;h=G[309722];k=G[a+16>>2];q=h+M(k,344)|0;l=G[a+12>>2];o=M(l,344)+h|0;a:{if(G[o>>2]!=-1e3){i=G[o+56>>2];d=0;break a}d=G[o+88>>2]}b:{if(G[q>>2]!=-1e3){j=G[(M(k,344)+h|0)+56>>2];b=0;break b}b=G[(M(k,344)+h|0)+88>>2]}c=G[a>>2];c:{if(!(i|j)){d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{switch(c-37|0){case 10:break h;case 0:break i;case 57:break j;case 87:break k;case 1:break l;case 5:break m;case 8:break n;case 6:break o;case 89:break u;case 2:case 3:case 4:case 7:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 88:break d;default:break v}}switch(c-278|0){case 7:break g;case 5:break p;case 4:break q;case 3:break r;case 2:break s;case 1:break t;case 0:break u;case 13:break e;case 12:break f;default:break d}}E[a+88|0]=(b|0)==(d|0);break d}E[a+88|0]=(b|0)!=(d|0);break d}E[a+88|0]=(b|0)<(d|0);break d}E[a+88|0]=(b|0)>(d|0);break d}E[a+88|0]=(b|0)>=(d|0);break d}E[a+88|0]=(b|0)<=(d|0);break d}G[a+88>>2]=b+d;break d}G[a+88>>2]=d-b;break d}G[a+88>>2]=M(b,d);break d}G[a+88>>2]=b&d;break d}G[a+88>>2]=b|d;break d}G[a+88>>2]=b^d;break d}if(b){G[a+88>>2]=(d|0)%(b|0);break d}wc(13540);break d}if(b){G[a+88>>2]=(d|0)/(b|0);break d}wc(13540);break d}m=$b(+(d|0),+(b|0));if(O(m)<2147483648){G[a+88>>2]=~~m;break d}G[a+88>>2]=-2147483648;break d}G[a+88>>2]=d;break d}G[a+88>>2]=0}G[a>>2]=-1e3;break c}e=G[a+56>>2];f=G[309727];if((c&-2)==290){Nd(a);if(G[309737]){break c}d=M(e,f);f=M(k,344)+h|0;g=G[f+84>>2];e=G[f+88>>2];w:{if(G[a>>2]!=290){if((d|0)<=0){break w}i=M(l,344)+h|0;j=G[i+84>>2];c=0;while(1){n=c<<2;b=G[n+G[i+88>>2]>>2];p=b-e|0;e=H[c+j|0]|g;G[n+G[a+88>>2]>>2]=e?0:p;E[G[a+84>>2]+c|0]=(e|0)!=0;j=G[i+84>>2];g=E[j+c|0];e=b;b=c+1|0;c=b;if((b|0)!=(d|0)){continue}break}break w}if((d|0)<=0){break w}b=M(l,344)+h|0;c=0;while(1){e=H[G[b+84>>2]+c|0]?e:G[G[b+88>>2]+(c<<2)>>2]+e|0;G[G[a+88>>2]+(c<<2)>>2]=e;E[G[a+84>>2]+c|0]=0;c=c+1|0;if((d|0)!=(c|0)){continue}break}}G[f+88>>2]=e;G[f+84>>2]=g;break c}Nd(a);if(G[309737]|!f){break c}c=M(e,f);n=M(k,344)+h|0;p=M(l,344)+h|0;r=(i|0)>1;while(1){f=f-1|0;g=0;x:{if(!e){break x}while(1){c=c-1|0;if(i){d=r?c:f;s=H[d+G[p+84>>2]|0];d=G[G[p+88>>2]+(d<<2)>>2]}if(j){b=(j|0)>1?c:f;t=H[b+G[n+84>>2]|0];b=G[G[n+88>>2]+(b<<2)>>2]}e=e-1|0;E[G[a+84>>2]+c|0]=(s|t)!=0;y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{K:{L:{M:{N:{O:{g=G[a>>2];switch(g-37|0){case 2:case 3:case 4:case 7:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:case 70:case 71:case 72:case 73:case 74:case 75:case 76:case 77:case 78:case 79:case 80:case 81:case 82:case 83:case 84:case 85:case 86:case 88:break y;case 10:break A;case 0:break B;case 57:break C;case 87:break D;case 1:break E;case 5:break F;case 8:break G;case 6:break H;case 89:break N;default:break O}}switch(g-278|0){case 7:break z;case 5:break I;case 4:break J;case 3:break K;case 2:break L;case 1:break M;case 0:break N;default:break y}}E[G[a+88>>2]+c|0]=(b|0)==(d|0);break y}E[G[a+88>>2]+c|0]=(b|0)!=(d|0);break y}E[G[a+88>>2]+c|0]=(b|0)<(d|0);break y}E[G[a+88>>2]+c|0]=(b|0)>(d|0);break y}E[G[a+88>>2]+c|0]=(b|0)>=(d|0);break y}E[G[a+88>>2]+c|0]=(b|0)<=(d|0);break y}G[G[a+88>>2]+(c<<2)>>2]=b+d;break y}G[G[a+88>>2]+(c<<2)>>2]=d-b;break y}G[G[a+88>>2]+(c<<2)>>2]=M(b,d);break y}G[G[a+88>>2]+(c<<2)>>2]=b&d;break y}G[G[a+88>>2]+(c<<2)>>2]=b|d;break y}G[G[a+88>>2]+(c<<2)>>2]=b^d;break y}if(b){G[G[a+88>>2]+(c<<2)>>2]=(d|0)%(b|0);break y}G[G[a+88>>2]+(c<<2)>>2]=0;E[G[a+84>>2]+c|0]=1;break y}if(b){G[G[a+88>>2]+(c<<2)>>2]=(d|0)/(b|0);break y}G[G[a+88>>2]+(c<<2)>>2]=0;E[G[a+84>>2]+c|0]=1;break y}u=G[a+88>>2]+(c<<2)|0;m=$b(+(d|0),+(b|0));P:{if(O(m)<2147483648){g=~~m;break P}g=-2147483648}G[u>>2]=g}g=G[309737];if(!e){break x}if(!g){continue}break}}if(!f){break c}e=G[a+56>>2];if(!g){continue}break}}if(G[o>>2]>0){Wa(G[(M(l,344)+h|0)+88>>2])}if(G[q>>2]>0){Wa(G[(M(k,344)+h|0)+88>>2])}}function uk(a,b,c,d,e,f,g){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,F=0,I=0,J=0,K=0,L=0,N=0;i=Fa-224|0;Fa=i;G[i+124>>2]=0;G[i+120>>2]=0;G[i+116>>2]=0;G[i+112>>2]=0;G[i+108>>2]=0;a:{if(G[g>>2]>0){break a}Td(a,i+220|0,i+216|0,g);if(G[g>>2]|G[i+220>>2]<(c|0)){break a}N=i+16|1;while(1){E[i+16|0]=0;h=i+128|0;Sd(a,c,h,g);l=Va(h);b:{if((l|0)<9){break b}h=8;if((l|0)!=9){j=l-8&-2;k=0;while(1){m=(i+128|0)+h|0;if((H[m|0]-127&255)>>>0<=160){E[m|0]=32}m=(i+128|0)+(h|1)|0;if((H[m|0]-127&255)>>>0<=160){E[m|0]=32}h=h+2|0;k=k+2|0;if((j|0)!=(k|0)){continue}break}}if(!(l&1)){break b}h=(i+128|0)+h|0;if((H[h|0]-127&255)>>>0>160){break b}E[h|0]=32}n=i+128|0;v=i+16|0;D=i+108|0;F=i+124|0;I=i+120|0;J=i+112|0;K=i+116|0;j=0;r=0;m=0;s=0;u=0;w=0;x=0;z=0;c:{if(G[g>>2]>0){break c}if(!(v?n:0)){G[g>>2]=115;break c}E[v|0]=0;if(!H[n|0]){E[n+8|0]=H[68297];h=H[68293]|H[68294]<<8|(H[68295]<<16|H[68296]<<24);l=H[68289]|H[68290]<<8|(H[68291]<<16|H[68292]<<24);E[n|0]=l;E[n+1|0]=l>>>8;E[n+2|0]=l>>>16;E[n+3|0]=l>>>24;E[n+4|0]=h;E[n+5|0]=h>>>8;E[n+6|0]=h>>>16;E[n+7|0]=h>>>24}d:{if((e|0)<=0){A=32;break d}r=-1;A=32;e:{while(1){L=G[(u<<3)+d>>2];t=H[L|0];if((t|0)==42){w=1;m=0;s=-1;break d}f:{g:{if(!(!x|(t|0)!=(j&255))){x=1;B=32;h=-1;k=0;l=0;s=-1;break g}x=1;k=0;B=32;s=-1;C=0;o=-1;m=0;q=0;l=0;h=-1;j=0;w=0;p=t;if(!p){break f}h:{while(1){j=E[k+n|0];l=k;h=o;i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{y=p&255;switch(y-63|0){case 0:break i;case 46:case 47:break k;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 44:case 45:break n;case 34:break q;case 43:break r;case 42:break s;default:break o}}j=j-48|0;if(j>>>0>=10){break p}q=j;break i}j=j-48|0;if(j>>>0>=10){break p}m=j;break i}if((j|0)==32|j-65>>>0<26){break l}}if(x){break h}break m}if((y|0)==35){break k}}if((j&255)==(y|0)){break m}break h}l=k;break j}B=j;break j}p=0;if(j-48>>>0>9){break h}while(1){t:{h=(j<<24>>24)-48|0;if(h>>>0>9){l=k;break t}p=h+M(p,10)|0;l=8;k=k+1|0;j=H[n+k|0];if((k|0)!=8){continue}}break}l=l-1|0;h=o;u:{switch(y-109|0){case 1:if(p-1>>>0>998){break h}if((f|0)==(p|0)){h=p;break i}break h;case 0:break u;default:break i}}s=p}h=o}k=l+1|0;C=C+1|0;p=H[L+C|0];if(p){x=0;o=h;if((l|0)<7){continue}}break}x=0;if(!t){k=q;l=m;j=0;break g}v:{if((l|0)>6){w=1;break v}o=k+n|0;w=1;k=q;l=m;j=t;if(H[o|0]!=32){break f}}k=q;break e}k=q;l=m;h=o;j=t;break f}w=0}u=u+1|0;if((u|0)!=(e|0)){continue}break}u=e;m=l}z=k;r=h;A=B}if(F){G[F>>2]=z}if(I){G[I>>2]=m}if(K){G[K>>2]=r}if(J){G[J>>2]=s}if(D){G[D>>2]=u}k=0;if(!w){break c}q=G[((u<<3)+d|0)+4>>2];if(!Xa(q,48737)){E[v|0]=45;E[v+1|0]=0;h=qb(v,n,8);E[h+9|0]=0;if(H[h+8|0]!=32){break c}E[h+8|0]=0;if(H[h+7|0]!=32){break c}E[h+7|0]=0;if(H[h+6|0]!=32){break c}E[h+6|0]=0;if(H[h+5|0]!=32){break c}E[h+5|0]=0;if(H[h+4|0]!=32){break c}E[h+4|0]=0;if(H[h+3|0]!=32){break c}E[h+3|0]=0;if(H[h+2|0]!=32){break c}E[h+2|0]=0;break c}if(!H[q|0]){break c}if(!Xa(q,48783)){break c}o=Za(v,n);j=H[q|0];if((j|0)==43){break c}p=z+48|0;t=m+48|0;h=0;while(1){w:{x:{y:{z:{A:{B:{l=j&255;switch(l-105|0){case 2:case 3:case 4:break x;case 5:break y;case 1:break z;case 0:break A;default:break B}}if(l){break x}if((k|0)<=7){cb(k+o|0,32,8-k|0)}break c}E[k+o|0]=p;break w}E[k+o|0]=t;break w}r=(r|0)==-1?f:r;if((r|0)<=0){break w}j=1;C:{if((r|0)<=0){break C}while(1){j=M(j,10);if(((r|0)/(j|0)|0)>0){continue}break}if(j>>>0<10){break C}while(1){l=(j>>>0)/10|0;E[k+o|0]=(((r|0)/(l|0)|0)%10|0)+48;k=k+1|0;m=j>>>0>99;j=l;if(m){continue}break}}k=k-1|0;break w}if(!((l|0)!=109|(s|0)<0)){j=1;D:{if((s|0)<=0){break D}while(1){j=M(j,10);if(((s|0)/(j|0)|0)>0){continue}break}if(j>>>0<10){break D}while(1){l=(j>>>0)/10|0;E[k+o|0]=(((s|0)/(l|0)|0)%10|0)+48;k=k+1|0;m=j>>>0>99;j=l;if(m){continue}break}}k=k-1|0;break w}m=k+o|0;if((l|0)==97){E[m|0]=A;break w}E[m|0]=j}k=k+1|0;h=h+1|0;j=H[q+h|0];continue}}E:{F:{if(G[g>>2]){break F}h=H[i+16|0];if(!h){break F}if((h|0)==45){E[i+25|0]=0;G:{if(H[i+24|0]!=32){break G}E[i+24|0]=0;if(H[i+23|0]!=32){break G}E[i+23|0]=0;if(H[i+22|0]!=32){break G}E[i+22|0]=0;if(H[i+21|0]!=32){break G}E[i+21|0]=0;if(H[i+20|0]!=32){break G}E[i+20|0]=0;if(H[i+19|0]!=32){break G}E[i+19|0]=0;if(H[i+18|0]!=32){break G}E[i+18|0]=0}tb(6,0);kf(b,N,g);H:{if(G[g>>2]){break H}Td(a,i+12|0,i+216|0,g);h=G[i+12>>2];if((h|0)==G[i+220>>2]){break H}G[i+220>>2]=h;c=c-1|0}l=c;G[g>>2]=0;h=G[50359];if((h|0)<=0){break E}while(1){I:{c=h-1|0;k=G[(c<<2)+199296>>2];j=H[k|0];E[k|0]=0;if((j|0)==27){break I}k=h>>>0>1;h=c;if(k){continue}}break}G[50359]=c;break E}wb(b,i+16|0,g)}l=c}E[i+24|0]=0;E[i+136|0]=0;if(G[g>>2]){break a}c=l+1|0;if(G[i+220>>2]>(l|0)){continue}break}}Fa=i+224|0}function wk(a,b,c){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,H=0,I=0,J=0,K=0,L=0,N=0,O=0,P=0,Q=0;r=Fa-176|0;Fa=r;g=G[c>>2];a:{if((g|0)>0){break a}e=G[a>>2];d=G[a+4>>2];b:{c:{if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);break c}if((G[d+128>>2]&G[d+132>>2])!=-1){break c}if((Rb(a,c)|0)>0){break b}}f=G[a+4>>2];i=G[f+80>>2];if(!i){Ua(59312);g=235;G[c>>2]=235;break a}d:{if((b|0)>0){d=G[f+936>>2];if((d|0)>=(b|0)){break d}}g=302;G[c>>2]=302;break a}e=G[f+968>>2];j=e+M(b-1|0,160)|0;m=G[j+72>>2];u=G[j+76>>2];e:{if((i|0)==1){i=G[j+152>>2];n=i>>31;if((b|0)<(d|0)){d=G[(e+M(b,160)|0)+72>>2];j=i+m|0;e=i+((d-j|0)>0)|0;d=n;d=e>>>0>>0?d+1|0:d;i=e;n=d;break e}if(b>>>0<2){break e}d=j-160|0;j=G[d+152>>2];e=G[d+72>>2]+j|0;if((m-e|0)<=0){break e}d=m;m=d-1|0;u=u-!d|0;d=n;e=i+1|0;d=e?d:d+1|0;i=e;n=d;break e}if((b|0)<(d|0)){d=e+M(b,160)|0;e=G[d+72>>2];i=e-m|0;n=G[d+76>>2]-((e>>>0>>0)+u|0)|0;break e}d=G[f+960>>2];i=d-m|0;n=G[f+964>>2]-((d>>>0>>0)+u|0)|0}d=f;I=G[d+984>>2];J=G[d+988>>2];E=G[d+976>>2];K=G[d+980>>2];j=G[d+960>>2];v=G[d+964>>2];e=G[d+956>>2];q=e;o=Fa-1e4|0;Fa=o;s=G[d+952>>2];if(!(!(e|s)|G[c>>2]>0)){f:{k=v-((i>>>0>j>>>0)+n|0)|0;t=j-i|0;if((k|0)<=0&t>>>0<=1e4|(k|0)<0){d=u;e=m+1|0;d=e?d:d+1|0;p=e;e=i+e|0;g=d;d=n+d|0;w=e;l=e>>>0>>0?d+1|0:d;if((q|0)>=0&s>>>0>=2|(q|0)>0){h=1;e=0;while(1){ee(a,h,e,w,l,t,k,o,c);d=G[a+4>>2];G[d+960>>2]=t;G[d+964>>2]=k;ld(a,h,e,p,g,t,k,o,c);d=G[a+4>>2];G[d+960>>2]=j;G[d+964>>2]=v;d=e;e=h+1|0;d=e?d:d+1|0;h=e;e=d;if((s|0)!=(h|0)|(q|0)!=(d|0)){continue}break}}f=n+u|0;d=i+m|0;f=d>>>0>>0?f+1|0:f;y=d;d=j;e=v-((y>>>0>d>>>0)+f|0)|0;f=d-y|0;d=e;if(!f&(d|0)<=0|(d|0)<0){break f}ee(a,s,q,w,l,f,d,o,c);e=G[a+4>>2];G[e+960>>2]=t;G[e+964>>2]=k;ld(a,s,q,p,g,f,d,o,c);d=G[a+4>>2];G[d+960>>2]=j;G[d+964>>2]=v;break f}d=k;e=t+9999|0;d=e>>>0<9999?d+1|0:d;F=Du(e,d,1e4,0);H=Ia;if((q|0)>=0&s>>>0>=2|(q|0)>0){f=Au(F,H,-1e4,-1);e=f+t|0;d=Ia+k|0;d=e>>>0>>0?d+1|0:d;e=e+1e4|0;d=e>>>0<1e4?d+1|0:d;A=e;l=d;e=d;d=u;f=m+1|0;d=f?d:d+1|0;B=f;g=f;f=f+A|0;C=d;d=d+e|0;L=f;w=f>>>0>>0?d+1|0:d;f=n+C|0;d=i+g|0;f=d>>>0>>0?f+1|0:f;N=d;g=d;e=d+A|0;O=f;d=f+l|0;P=e;y=e>>>0>>0?d+1|0:d;Q=!k&t>>>0<10001;x=1;g=0;while(1){ee(a,x,g,N,O,A,l,o,c);d=G[a+4>>2];G[d+960>>2]=t;G[d+964>>2]=k;ld(a,x,g,B,C,A,l,o,c);d=G[a+4>>2];G[d+960>>2]=j;G[d+964>>2]=v;D=1;p=0;h=P;e=y;z=L;f=w;if(!Q){while(1){ee(a,x,g,h,e,1e4,0,o,c);d=G[a+4>>2];G[d+960>>2]=t;G[d+964>>2]=k;ld(a,x,g,z,f,1e4,0,o,c);d=G[a+4>>2];G[d+960>>2]=j;G[d+964>>2]=v;d=e;e=h+1e4|0;d=e>>>0<1e4?d+1|0:d;h=e;e=d;d=f;f=z+1e4|0;d=f>>>0<1e4?d+1|0:d;z=f;f=d;d=p;p=D+1|0;d=p?d:d+1|0;D=p;p=d;if((F|0)!=(D|0)|(H|0)!=(d|0)){continue}break}}e=g;d=x+1|0;e=d?e:e+1|0;x=d;g=e;if((s|0)!=(d|0)|(q|0)!=(e|0)){continue}break}}f=n+u|0;d=i+m|0;f=d>>>0>>0?f+1|0:f;e=d;d=j;g=v-((e>>>0>d>>>0)+f|0)|0;l=d-e|0;if(!l&(g|0)<=0|(g|0)<0){break f}e=u;d=m+1|0;e=d?e:e+1|0;y=d;f=i+d|0;d=e+n|0;p=f;d=f>>>0>>0?d+1|0:d;w=d;d=g;h=l+9999|0;d=h>>>0<9999?d+1|0:d;B=Du(h,d,1e4,0);d=Ia;C=d;h=Au(B,d,-1e4,-1);f=h+l|0;d=Ia+g|0;d=f>>>0>>0?d+1|0:d;h=f+1e4|0;f=d;d=h;f=d>>>0<1e4?f+1|0:f;ee(a,s,q,p,w,d,f,o,c);h=G[a+4>>2];G[h+960>>2]=t;G[h+964>>2]=k;ld(a,s,q,y,e,d,f,o,c);h=G[a+4>>2];G[h+960>>2]=j;G[h+964>>2]=v;if(!g&l>>>0<10001){break f}e=e+f|0;g=d+y|0;e=g>>>0>>0?e+1|0:e;h=g;g=d;l=d+p|0;d=f+w|0;z=l;f=g>>>0>l>>>0?d+1|0:d;x=1;g=0;while(1){ee(a,s,q,z,f,1e4,0,o,c);d=G[a+4>>2];G[d+960>>2]=t;G[d+964>>2]=k;ld(a,s,q,h,e,1e4,0,o,c);d=G[a+4>>2];G[d+960>>2]=j;G[d+964>>2]=v;d=z+1e4|0;f=d>>>0<1e4?f+1|0:f;z=d;d=e;e=h+1e4|0;d=e>>>0<1e4?d+1|0:d;h=e;e=d;d=g;g=x+1|0;d=g?d:d+1|0;x=g;g=d;if((B|0)!=(x|0)|(C|0)!=(d|0)){continue}break}}}Fa=o+1e4|0;f=Au(i,n,s,q);d=Ia;l=d;g=d;e=J+K|0;d=E+I|0;e=d>>>0>>0?e+1|0:e;k=d+2879|0;d=e;d=Cu(k,k>>>0<2879?d+1|0:d);e=(f-d|0)+2879|0;d=g-(Ia+(d>>>0>f>>>0)|0)|0;e=Bu(e,e>>>0<2879?d+1|0:d,2880,0);g=G[a+4>>2];d=G[g+988>>2];p=G[g+984>>2];k=d;if(!!p&(d|0)>=0|(d|0)>0){d=g;w=G[d+128>>2];g=G[d+976>>2]+w|0;d=G[d+980>>2]+G[d+132>>2]|0;if((Ci(a,g,g>>>0>>0?d+1|0:d,p,k,0-f|0,0-(((f|0)!=0)+l|0)|0,c)|0)>0){break b}}g=1;if((e|0)>0){oh(a,e,c)}d=G[a+4>>2];e=G[d+976>>2];k=G[d+980>>2]-((e>>>0>>0)+l|0)|0;e=e-f|0;G[d+976>>2]=e;G[d+980>>2]=k;G[r+172>>2]=0;Ad(a,34350,e,e>>31,65398,r+172|0);e=G[a+4>>2];d=G[e+936>>2];if(!(G[e+80>>2]!=1|(d|0)<=0)){while(1){d=r+80|0;zb(34749,g,d,c);_f(a,d,r+160|0,r,c);d=G[r+160>>2];e=G[r+164>>2];if(d>>>0>m>>>0&(e|0)>=(u|0)|(e|0)>(u|0)){e=e-((d>>>0>>0)+n|0)|0;d=d-i|0;G[r+160>>2]=d;G[r+164>>2]=e;Ad(a,r+80|0,d,e,65398,c)}d=G[G[a+4>>2]+936>>2];e=(g|0)<(d|0);g=g+1|0;if(e){continue}break}}d=d-1|0;Ad(a,33837,d,d>>31,65398,c);Ad(a,41261,j-i|0,v-((i>>>0>j>>>0)+n|0)|0,65398,c);ko(a,b,G[G[a+4>>2]+936>>2],-1,c);Rb(a,c)}g=G[c>>2]}Fa=r+176|0;return g}function du(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-1114256|0;Fa=g;h=ab(40);G[h>>2]=0;G[g+852016>>2]=5609;j=4;l=1;a:{b:{c:{if(!d|!H[d|0]){break c}G[321387]=0;m=aa(158,d|0)|0;d=G[321387];G[321387]=0;e=-1;d:{if(!d){break d}f=G[321388];if(!f){break d}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;k=pc(m,92039);d=G[321387];G[321387]=0;e=-1;e:{if(!d){break e}f=G[321388];if(!f){break e}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}f:{if(!k){break f}e=0;while(1){G[321387]=0;i=rb((g+196656|0)+(e<<16)|0,k,65535);d=G[321387];G[321387]=0;k=-1;g:{if(!d){break g}f=G[321388];if(!f){break g}k=Ab(G[d>>2],h,4);if(!k){break a}_(f|0)}d=Z()|0;if((k|0)==1){break b}G[(g+852016|0)+(l<<2)>>2]=i;G[321387]=0;k=pc(0,92039);d=G[321387];G[321387]=0;i=-1;h:{if(!d){break h}f=G[321388];if(!f){break h}i=Ab(G[d>>2],h,4);if(!i){break a}_(f|0)}d=Z()|0;if((i|0)==1){break b}l=l+1|0;if(!k){break f}d=e>>>0<9;e=e+1|0;if(d){continue}break}}if(!m){break c}Wa(m)}G[(g+852016|0)+(l<<2)>>2]=25581;d=G[968813];G[968813]=d+1;G[321387]=0;G[g+32>>2]=42205;G[g+36>>2]=d;$(156,g+131120|0,65535,4292,g+32|0)|0;d=G[321387];G[321387]=0;e=-1;i:{if(!d){break i}f=G[321388];if(!f){break i}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}d=G[968813];G[968813]=d+1;e=(l<<2)+g|0;G[e+852020>>2]=g+131120;G[e+852024>>2]=13578;G[321387]=0;G[g+16>>2]=42205;G[g+20>>2]=d;$(156,g+65584|0,65535,4275,g+16|0)|0;d=G[321387];G[321387]=0;e=-1;j:{if(!d){break j}f=G[321388];if(!f){break j}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g>>2]=42205;G[g+4>>2]=a;G[((l<<2)+g|0)+852028>>2]=g+65584;$(156,g+48|0,65535,8740,g|0)|0;d=G[321387];G[321387]=0;e=-1;k:{if(!d){break k}f=G[321388];if(!f){break k}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}a=l<<2;G[(a+g|0)+852032>>2]=g+48;a=a+(g+852016|0)|0;G[a+24>>2]=c;G[a+20>>2]=b;h=We(1285568,1,h,4);j=Z()|0;d=0}l:{while(1){if(!d){G[321387]=0;ba(171,l+7|0,g+852016|0)|0;d=G[321387];G[321387]=0;e=-1;m:{if(!d){break m}f=G[321388];if(!f){break m}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}}G[321387]=0;a=ba(162,g+131120|0,13287)|0;d=G[321387];G[321387]=0;e=-1;n:{if(!d){break n}f=G[321388];if(!f){break n}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}o:{if(!a){break o}G[321387]=0;b=$(163,3809712,1,65535,a|0)|0;d=G[321387];G[321387]=0;e=-1;p:{if(!d){break p}f=G[321388];if(!f){break p}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(164,a|0)|0;d=G[321387];G[321387]=0;e=-1;q:{if(!d){break q}f=G[321388];if(!f){break q}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}E[b+3809712|0]=0;if((b|0)<=0){break o}G[321387]=0;aa(165,g+131120|0)|0;d=G[321387];G[321387]=0;e=-1;r:{if(!d){break r}f=G[321388];if(!f){break r}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(165,g+65584|0)|0;d=G[321387];G[321387]=0;e=-1;s:{if(!d){break s}f=G[321388];if(!f){break s}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}a=3809712;break l}G[321387]=0;a=ba(172,g+65584|0,g+1114168|0)|0;d=G[321387];G[321387]=0;e=-1;t:{if(!d){break t}f=G[321388];if(!f){break t}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}u:{v:{if((a|0)<0){break v}e=G[968814];k=G[968815];a=G[g+1114208>>2];if((k|0)<=(a|0)){if(e){Wa(e)}G[321387]=0;k=a+1|0;e=ba(173,k|0,1)|0;d=G[321387];G[321387]=0;i=-1;w:{if(!d){break w}f=G[321388];if(!f){break w}i=Ab(G[d>>2],h,j);if(!i){break a}_(f|0)}d=Z()|0;if((i|0)==1){continue}G[968814]=e;if(!e){break v}G[968815]=k}G[321387]=0;a=ba(162,g+65584|0,13287)|0;d=G[321387];G[321387]=0;i=-1;x:{if(!d){break x}f=G[321388];if(!f){break x}i=Ab(G[d>>2],h,j);if(!i){break a}_(f|0)}d=Z()|0;if((i|0)==1){continue}if(a){break u}}a=28734;break l}G[321387]=0;i=-1;b=$(163,e|0,1,k-1|0,a|0)|0;d=G[321387];G[321387]=0;y:{if(!d){break y}f=G[321388];if(!f){break y}i=Ab(G[d>>2],h,j);if(!i){break a}_(f|0)}d=Z()|0;if((i|0)==1){continue}G[321387]=0;aa(164,a|0)|0;d=G[321387];G[321387]=0;i=-1;z:{if(!d){break z}f=G[321388];if(!f){break z}i=Ab(G[d>>2],h,j);if(!i){break a}_(f|0)}d=Z()|0;if((i|0)==1){continue}E[b+e|0]=0;a=28734;if((b|0)<0){break l}G[321387]=0;aa(165,g+131120|0)|0;d=G[321387];G[321387]=0;e=-1;A:{if(!d){break A}f=G[321388];if(!f){break A}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(165,g+65584|0)|0;d=G[321387];G[321387]=0;e=-1;B:{if(!d){break B}f=G[321388];if(!f){break B}e=Ab(G[d>>2],h,j);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}break}a=G[968814]}Wa(h);Fa=g+1114256|0;return a|0}Wa(h);Ve(d,f);W()}function sn(a){a=a|0;var 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;f=Fa-176|0;Fa=f;p=G[a+8>>2];g=p-2|0;k=G[a+12>>2];j=G[309722];c=1;l=p-1|0;a:{if(!l){d=1;break a}e=g;i=l;while(1){b=e;n=b<<2;h=M(G[((i<<2)+a|0)+12>>2],344)+j|0;G[n+(f- -64|0)>>2]=h;e=G[h>>2];G[n+(f+32|0)>>2]=(e|0)==-1e3;d=0;if((e|0)==-1e3){G[f+n>>2]=G[h+88>>2];d=c}e=b-1|0;c=d;i=b;if(b){continue}break}}e=0;c=G[a+52>>2]-258|0;if(c>>>0<=2){e=G[(c<<2)+137092>>2]}s=M(k,344)+j|0;Nd(a);b:{if(G[309737]){break b}c:{if(!d){b=G[(M(k,344)+j|0)+60>>2];break c}c=M(k,344)+j|0;i=c;b=G[c+60>>2];if((l|0)==(b|0)){d:{if(!l){d=0;break d}d=0;b=l;e=G[(g<<2)+f>>2];e:{if((e|0)<=0){break e}h=M(k,344)+j|0;c=l;while(1){b=g;g=G[(h+(b<<2)|0)- -64>>2];if((g|0)<(e|0)){b=c;break e}d=(M(d,g)+e|0)-1|0;if(!b){break d}c=b;g=b-1|0;e=G[(g<<2)+f>>2];if((e|0)>0){continue}break}}if((b|0)<=0){break d}G[309737]=431;c=f+96|0;bb(c,135693,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2]);break b}if(G[309727]<=0){break b}g=M(k,344)+j|0;b=0;while(1){e=b;f:{g:{h:{switch(G[a+52>>2]-261|0){default:e=d;break;case 1:break g;case 0:break h}}E[G[a+84>>2]+b|0]=H[G[g+84>>2]+e|0];i:{switch(G[a+52>>2]-258|0){case 2:L[G[a+88>>2]+(b<<3)>>3]=L[G[g+88>>2]+(d<<3)>>3];break f;case 1:G[G[a+88>>2]+(b<<2)>>2]=G[G[g+88>>2]+(d<<2)>>2];break f;case 0:break i;default:break g}}E[G[a+88>>2]+b|0]=H[G[g+88>>2]+d|0];break f}c=b<<2;E[G[c+G[a+88>>2]>>2]]=H[G[G[g+88>>2]>>2]+(b+d|0)|0];E[G[c+G[a+88>>2]>>2]+1|0]=0}d=G[i+56>>2]+d|0;b=b+1|0;if((b|0)>2];if(!((d|0)>0&(d|0)<=G[((M(k,344)+j|0)+(b<<2)|0)+60>>2])){G[309737]=431;c=f+96|0;bb(c,135693,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2]);break b}c=G[309727];if(G[a+52>>2]-261>>>0<=1){if((c|0)<=0){break b}d=M(G[a+56>>2],d-1|0);e=M(k,344)+j|0;b=0;while(1){c=G[a+84>>2];if(c){E[b+c|0]=H[G[e+84>>2]+b|0]}c=G[a+56>>2];bb(G[G[a+88>>2]>>2]+M(c+1|0,b)|0,G[G[e+88>>2]>>2]+d|0,c);E[G[G[a+88>>2]+(b<<2)>>2]+G[a+56>>2]|0]=0;d=(G[i+56>>2]+d|0)+1|0;b=b+1|0;if((b|0)>2],d-1|0);g=M(k,344)+j|0;d=0;while(1){c=G[a+56>>2];bb(G[a+84>>2]+M(c,d)|0,G[g+84>>2]+b|0,c);c=M(G[a+56>>2],e);bb(G[a+88>>2]+M(c,d)|0,G[g+88>>2]+M(b,e)|0,c);b=G[i+56>>2]+b|0;d=d+1|0;if((d|0)>2];j:{if(G[309727]<=0){break j}q=G[f+64>>2];if(!H[G[q+84>>2]]){o=M(k,344)+j|0;b=0;while(1){h=b<<2;d=G[h+G[q+88>>2]>>2];k:{if(!((d|0)>0&G[((G[i+60>>2]<<2)+o|0)+60>>2]>=(d|0))){if(!G[309737]){G[309737]=431}c=f+96|0;bb(c,135693,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2]);break k}c=G[a+56>>2];m=M(c,d-1|0);n=G[r+56>>2];if(G[a+52>>2]-261>>>0<=1){g=G[a+84>>2];if(g){E[b+g|0]=H[G[o+84>>2]+b|0];c=G[a+56>>2]}bb(G[G[a+88>>2]>>2]+M(c+1|0,b)|0,G[G[o+88>>2]>>2]+(m+M(n+1|0,b)|0)|0,c);E[G[h+G[a+88>>2]>>2]+G[a+56>>2]|0]=0;break k}g=m+M(b,n)|0;bb(G[a+84>>2]+M(b,c)|0,g+G[o+84>>2]|0,c);c=M(G[a+56>>2],e);bb(G[a+88>>2]+M(c,b)|0,G[o+88>>2]+M(e,g)|0,c)}b=b+1|0;if((b|0)>=G[309727]){break j}if(!H[G[q+84>>2]+b|0]){continue}break}}G[f>>2]=d;if(!G[309737]){G[309737]=431}c=f+96|0;bb(c,135612,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2]);break b}G[f>>2]=d;break b}if(G[309727]<=0){break b}m=M(k,344)+j|0;n=(g<<2)+f|0;e=0;while(1){b=0;l:{if((p|0)<2){break l}while(1){d=b<<2;if(!G[d+(f+32|0)>>2]){c=G[d+(f- -64|0)>>2];if(H[G[c+84>>2]+e|0]){if(!G[309737]){G[309737]=431}c=f+96|0;bb(c,135612,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2]);break l}G[d+f>>2]=G[G[c+88>>2]+(e<<2)>>2]}b=b+1|0;if((l|0)!=(b|0)){continue}break}}if(G[309737]){break b}m:{n:{o:{if(!l){i=0;break o}i=0;h=g;c=l;b=c;d=G[n>>2];p:{if((d|0)<=0){break p}while(1){b=h;h=G[(m+(b<<2)|0)- -64>>2];if((h|0)>=(d|0)){i=(M(i,h)+d|0)-1|0;if(!b){break o}c=b;h=b-1|0;d=G[(h<<2)+f>>2];if((d|0)>0){continue}break p}break}b=c}if((b|0)>0){break n}}c=M(G[r+56>>2],e)+i|0;d=e;q:{r:{switch(G[a+52>>2]-261|0){default:d=c;break;case 1:break q;case 0:break r}}E[G[a+84>>2]+e|0]=H[G[m+84>>2]+d|0];s:{switch(G[a+52>>2]-258|0){case 2:L[G[a+88>>2]+(e<<3)>>3]=L[G[m+88>>2]+(c<<3)>>3];break m;case 1:G[G[a+88>>2]+(e<<2)>>2]=G[G[m+88>>2]+(c<<2)>>2];break m;case 0:break s;default:break q}}E[G[a+88>>2]+e|0]=H[c+G[m+88>>2]|0];break m}b=e<<2;E[G[b+G[a+88>>2]>>2]]=H[G[G[m+88>>2]>>2]+(c+e|0)|0];E[G[b+G[a+88>>2]>>2]+1|0]=0;break m}G[309737]=431;c=f+96|0;bb(c,135693,80);E[f+175|0]=0;Ua(c);Wa(G[a+88>>2])}e=e+1|0;if((e|0)>2]>0){c=M(k,344)+j|0;a=G[c+88>>2];if(G[c+52>>2]-261>>>0<=1){a=G[a>>2]}Wa(a)}if((p|0)>=2){b=0;while(1){a=G[(f- -64|0)+(b<<2)>>2];if(G[a>>2]>0){Wa(G[a+88>>2])}b=b+1|0;if((l|0)!=(b|0)){continue}break}}Fa=f+176|0}function ji(){var a=0,b=0,c=0,d=0;a:{if(G[47541]){b:{d=G[310142];c:{if((d|0)<0){Ua(65667);Ua(43041);a=122;break c}a=122;if(d>>>0>30){break c}a=Rn();if(!a){break b}}Ua(53700);return a}c=G[310142];a=M(c,84)+1240576|0;d=H[142020]|H[142021]<<8|(H[142022]<<16|H[142023]<<24);E[a+16|0]=d;E[a+17|0]=d>>>8;E[a+18|0]=d>>>16;E[a+19|0]=d>>>24;d=H[142008]|H[142009]<<8|(H[142010]<<16|H[142011]<<24);b=H[142004]|H[142005]<<8|(H[142006]<<16|H[142007]<<24);E[a|0]=b;E[a+1|0]=b>>>8;E[a+2|0]=b>>>16;E[a+3|0]=b>>>24;E[a+4|0]=d;E[a+5|0]=d>>>8;E[a+6|0]=d>>>16;E[a+7|0]=d>>>24;G[a+80>>2]=38;G[a+76>>2]=39;G[a+72>>2]=40;G[a+68>>2]=41;G[a+64>>2]=42;G[a+60>>2]=43;G[a+56>>2]=44;G[a+52>>2]=45;G[a+48>>2]=46;G[a+44>>2]=47;G[a+40>>2]=48;G[a+36>>2]=49;G[a+32>>2]=50;G[a+28>>2]=51;G[a+24>>2]=52;G[a+20>>2]=53;d=H[142016]|H[142017]<<8|(H[142018]<<16|H[142019]<<24);b=H[142012]|H[142013]<<8|(H[142014]<<16|H[142015]<<24);E[a+8|0]=b;E[a+9|0]=b>>>8;E[a+10|0]=b>>>16;E[a+11|0]=b>>>24;E[a+12|0]=d;E[a+13|0]=d>>>8;E[a+14|0]=d>>>16;E[a+15|0]=d>>>24;E[a+19|0]=0;d=c+1|0;G[310142]=d;d:{e:{if((c|0)<=-2){Ua(65667);Ua(43041);a=122;break e}a=122;if(d>>>0>30){break e}a=In();if(!a){break d}}Ua(53354);return a}d=G[310142];a=M(d,84)+1240576|0;b=H[142041]|H[142042]<<8|(H[142043]<<16|H[142044]<<24);E[a+16|0]=b;E[a+17|0]=b>>>8;E[a+18|0]=b>>>16;E[a+19|0]=b>>>24;G[a+40>>2]=0;G[a+44>>2]=0;b=H[142029]|H[142030]<<8|(H[142031]<<16|H[142032]<<24);c=H[142025]|H[142026]<<8|(H[142027]<<16|H[142028]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;G[a+80>>2]=54;G[a+76>>2]=55;G[a+72>>2]=56;G[a+68>>2]=0;G[a+64>>2]=57;G[a+60>>2]=0;G[a+56>>2]=58;G[a+52>>2]=59;G[a+48>>2]=60;G[a+36>>2]=61;G[a+32>>2]=62;G[a+28>>2]=63;G[a+24>>2]=64;G[a+20>>2]=65;b=H[142037]|H[142038]<<8|(H[142039]<<16|H[142040]<<24);c=H[142033]|H[142034]<<8|(H[142035]<<16|H[142036]<<24);E[a+8|0]=c;E[a+9|0]=c>>>8;E[a+10|0]=c>>>16;E[a+11|0]=c>>>24;E[a+12|0]=b;E[a+13|0]=b>>>8;E[a+14|0]=b>>>16;E[a+15|0]=b>>>24;E[a+19|0]=0;a=d+1|0;G[310142]=a;f:{g:{if((d|0)<=-2){Ua(65667);Ua(43041);break g}if(a>>>0<31){break f}}Ua(53128);return 122}a=M(a,84)+1240576|0;b=H[142062]|H[142063]<<8|(H[142064]<<16|H[142065]<<24);E[a+16|0]=b;E[a+17|0]=b>>>8;E[a+18|0]=b>>>16;E[a+19|0]=b>>>24;b=H[142050]|H[142051]<<8|(H[142052]<<16|H[142053]<<24);c=H[142046]|H[142047]<<8|(H[142048]<<16|H[142049]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;G[a+80>>2]=54;G[a+76>>2]=55;G[a+72>>2]=56;G[a+68>>2]=0;G[a+64>>2]=57;G[a+60>>2]=0;G[a+56>>2]=66;G[a+52>>2]=59;G[a+48>>2]=0;G[a+40>>2]=0;G[a+44>>2]=0;G[a+36>>2]=61;G[a+32>>2]=62;G[a+28>>2]=63;G[a+24>>2]=64;G[a+20>>2]=0;b=H[142058]|H[142059]<<8|(H[142060]<<16|H[142061]<<24);c=H[142054]|H[142055]<<8|(H[142056]<<16|H[142057]<<24);E[a+8|0]=c;E[a+9|0]=c>>>8;E[a+10|0]=c>>>16;E[a+11|0]=c>>>24;E[a+12|0]=b;E[a+13|0]=b>>>8;E[a+14|0]=b>>>16;E[a+15|0]=b>>>24;E[a+19|0]=0;a=d+2|0;G[310142]=a;if(a>>>0>=31){Ua(53184);return 122}a=M(a,84)+1240576|0;b=H[142083]|H[142084]<<8|(H[142085]<<16|H[142086]<<24);E[a+16|0]=b;E[a+17|0]=b>>>8;E[a+18|0]=b>>>16;E[a+19|0]=b>>>24;b=H[142071]|H[142072]<<8|(H[142073]<<16|H[142074]<<24);c=H[142067]|H[142068]<<8|(H[142069]<<16|H[142070]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;G[a+80>>2]=54;G[a+76>>2]=55;G[a+72>>2]=56;G[a+68>>2]=0;G[a+64>>2]=57;G[a+60>>2]=0;G[a+56>>2]=58;G[a+52>>2]=59;G[a+48>>2]=0;G[a+44>>2]=67;G[a+40>>2]=68;G[a+36>>2]=61;G[a+32>>2]=62;G[a+28>>2]=63;G[a+24>>2]=64;G[a+20>>2]=0;b=H[142079]|H[142080]<<8|(H[142081]<<16|H[142082]<<24);c=H[142075]|H[142076]<<8|(H[142077]<<16|H[142078]<<24);E[a+8|0]=c;E[a+9|0]=c>>>8;E[a+10|0]=c>>>16;E[a+11|0]=c>>>24;E[a+12|0]=b;E[a+13|0]=b>>>8;E[a+14|0]=b>>>16;E[a+15|0]=b>>>24;E[a+19|0]=0;G[310142]=d+3;a=$e(42180,64,63,62,61,67,0,45,44,43,42,41,40,39,38);if(a){Ua(53642);break a}a=$e(41976,64,63,62,61,0,60,59,69,0,57,0,56,55,54);if(a){Ua(53016);break a}a=$e(42090,64,63,62,61,70,0,59,58,0,57,0,56,55,54);if(a){Ua(53298);break a}a=$e(42111,64,63,62,61,71,0,59,58,0,57,0,56,55,54);if(a){Ua(53461);break a}a=$e(42013,64,63,62,61,72,0,59,58,0,57,0,56,55,54);if(a){Ua(53071);break a}a=$e(42066,64,63,62,61,73,0,59,58,0,57,0,56,55,54);if(a){Ua(53238);break a}a=$e(42141,52,51,50,49,74,46,45,44,43,42,41,40,39,38);if(a){Ua(53581);break a}a=$e(42122,64,63,62,61,0,75,59,76,43,57,0,56,55,54);if(a){Ua(53517);break a}a=$e(42101,0,0,0,0,77,78,0,79,0,80,81,82,83,84);if(a){Ua(53406);break a}G[47541]=0}return 0}return a}function hm(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-384|0;Fa=d;G[d+140>>2]=0;G[d+304>>2]=H[41295]|H[41296]<<8|(H[41297]<<16|H[41298]<<24);f=H[41298]|H[41299]<<8|(H[41300]<<16|H[41301]<<24);E[d+307|0]=f;E[d+308|0]=f>>>8;E[d+309|0]=f>>>16;E[d+310|0]=f>>>24;i=d+224|0;g=Fa-96|0;Fa=g;e=Za(g+6|0,d+304|0);f=Va(e);if((f|0)<=7){while(1){h=Va(e)+e|0;E[h|0]=32;E[h+1|0]=0;f=f+1|0;if((f|0)!=8){continue}break}}f=Va(e)+e|0;E[f|0]=61;E[f+1|0]=0;f=1;e=Sb(a,e);a:{if(!e){break a}e=jb(e,61);if(!e){break a}while(1){f=H[e+1|0];e=e+1|0;if((f|0)==32){continue}break}f=1;h=qc(e,68332);if((h|0)>79){break a}f=0;e=rb(g+16|0,e,h);E[e+h|0]=0;Za(i,e)}Fa=g+96|0;b:{c:{if(f){G[d+128>>2]=d+304;_a(G[24367],76211,d+128|0);break c}if((Va(d+224|0)|0)==8){break b}f=rb(d+144|0,d+224|9,4);E[f+4|0]=0;c=-1;if(nb(f,34221,5)){break b}G[d+304>>2]=1380933441;G[d+308>>2]=5391684;if(Vh(a,d+140|0,d+304|0)){G[d+112>>2]=d+304;_a(G[24367],76211,d+112|0)}g=G[d+140>>2];G[b>>2]=g;c=0;d:{if((g|0)<0){break d}f=g+1|0;h=f&3;e=(g<<3)+8|0;if(g>>>0>=3){i=f&-4;f=0;while(1){cb((M(c,80)+b|0)+8|0,0,e);cb((M(c|1,80)+b|0)+8|0,0,e);cb((M(c|2,80)+b|0)+8|0,0,e);cb((M(c|3,80)+b|0)+8|0,0,e);c=c+4|0;f=f+4|0;if((i|0)!=(f|0)){continue}break}}if(h){f=0;while(1){cb((M(c,80)+b|0)+8|0,0,e);c=c+1|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}e=0;if((g|0)<0){break d}f=g+1|0;while(1){c=0;if((e|0)<=(g|0)){while(1){G[d+96>>2]=e;G[d+100>>2]=c;h=d+304|0;db(h,29871,d+96|0);og(a,((M(e,80)+b|0)+(c<<3)|0)+8|0,h);c=c+1|0;if((f|0)!=(c|0)){continue}break}}f=f-1|0;c=(e|0)!=(g|0);e=e+1|0;if(c){continue}break}}G[d+304>>2]=1380933442;G[d+308>>2]=5391684;if(Vh(a,d+140|0,d+304|0)){G[d+80>>2]=d+304;_a(G[24367],76211,d+80|0)}g=G[d+140>>2];G[b+808>>2]=g;c=0;e:{if((g|0)<0){break e}f=g+1|0;h=f&3;e=(g<<3)+8|0;if(g>>>0>=3){i=f&-4;f=0;while(1){cb((M(c,80)+b|0)+816|0,0,e);cb((M(c|1,80)+b|0)+816|0,0,e);cb((M(c|2,80)+b|0)+816|0,0,e);cb((M(c|3,80)+b|0)+816|0,0,e);c=c+4|0;f=f+4|0;if((i|0)!=(f|0)){continue}break}}if(h){f=0;while(1){cb((M(c,80)+b|0)+816|0,0,e);c=c+1|0;f=f+1|0;if((h|0)!=(f|0)){continue}break}}e=0;if((g|0)<0){break e}f=g+1|0;while(1){c=0;if((e|0)<=(g|0)){while(1){G[d+64>>2]=e;G[d+68>>2]=c;h=d+304|0;db(h,29863,d- -64|0);og(a,((M(e,80)+b|0)+(c<<3)|0)+816|0,h);c=c+1|0;if((f|0)!=(c|0)){continue}break}}f=f-1|0;c=(e|0)!=(g|0);e=e+1|0;if(c){continue}break}}E[d+312|0]=H[34117];c=H[34113]|H[34114]<<8|(H[34115]<<16|H[34116]<<24);G[d+304>>2]=H[34109]|H[34110]<<8|(H[34111]<<16|H[34112]<<24);G[d+308>>2]=c;if(Vh(a,d+140|0,d+304|0)){G[d+48>>2]=d+304;_a(G[24367],76211,d+48|0)}g=G[d+140>>2];G[b+1616>>2]=g;f:{if((g|0)<0){break f}h=g+1|0;i=h&3;e=(g<<3)+8|0;f=0;c=0;if(g>>>0>=3){j=h&-4;h=0;while(1){cb((M(c,80)+b|0)+1624|0,0,e);cb((M(c|1,80)+b|0)+1624|0,0,e);cb((M(c|2,80)+b|0)+1624|0,0,e);cb((M(c|3,80)+b|0)+1624|0,0,e);c=c+4|0;h=h+4|0;if((j|0)!=(h|0)){continue}break}}if(i){while(1){cb((M(c,80)+b|0)+1624|0,0,e);c=c+1|0;f=f+1|0;if((i|0)!=(f|0)){continue}break}}if((g|0)<0){break f}f=g+1|0;e=0;while(1){c=0;if((e|0)<=(g|0)){while(1){E[d+304|0]=0;G[d+32>>2]=e;G[d+36>>2]=c;h=d+304|0;db(h,29854,d+32|0);og(a,((M(e,80)+b|0)+(c<<3)|0)+1624|0,h);c=c+1|0;if((f|0)!=(c|0)){continue}break}}f=f-1|0;c=(e|0)!=(g|0);e=e+1|0;if(c){continue}break}}E[d+312|0]=H[34108];c=H[34104]|H[34105]<<8|(H[34106]<<16|H[34107]<<24);G[d+304>>2]=H[34100]|H[34101]<<8|(H[34102]<<16|H[34103]<<24);G[d+308>>2]=c;if(Vh(a,d+140|0,d+304|0)){G[d+16>>2]=d+304;_a(G[24367],76211,d+16|0)}g=G[d+140>>2];G[b+2424>>2]=g;g:{if((g|0)<0){break g}h=g+1|0;i=h&3;e=(g<<3)+8|0;f=0;c=0;if(g>>>0>=3){j=h&-4;h=0;while(1){cb((M(c,80)+b|0)+2432|0,0,e);cb((M(c|1,80)+b|0)+2432|0,0,e);cb((M(c|2,80)+b|0)+2432|0,0,e);cb((M(c|3,80)+b|0)+2432|0,0,e);c=c+4|0;h=h+4|0;if((j|0)!=(h|0)){continue}break}}if(i){while(1){cb((M(c,80)+b|0)+2432|0,0,e);c=c+1|0;f=f+1|0;if((i|0)!=(f|0)){continue}break}}e=0;if((g|0)<0){break g}f=g+1|0;while(1){c=0;if((e|0)<=(g|0)){while(1){G[d>>2]=e;G[d+4>>2]=c;h=d+304|0;db(h,29845,d);og(a,((M(e,80)+b|0)+(c<<3)|0)+2432|0,h);c=c+1|0;if((f|0)!=(c|0)){continue}break}}f=f-1|0;c=(e|0)!=(g|0);e=e+1|0;if(c){continue}break}}c=H[41204]|H[41205]<<8|(H[41206]<<16|H[41207]<<24);E[d+307|0]=c;E[d+308|0]=c>>>8;E[d+309|0]=c>>>16;E[d+310|0]=c>>>24;G[d+304>>2]=H[41201]|H[41202]<<8|(H[41203]<<16|H[41204]<<24);if(og(a,b+3232|0,d+304|0)){hb(86511,21,1,G[24367]);break c}c=H[40802]|H[40803]<<8|(H[40804]<<16|H[40805]<<24);E[d+307|0]=c;E[d+308|0]=c>>>8;E[d+309|0]=c>>>16;E[d+310|0]=c>>>24;G[d+304>>2]=H[40799]|H[40800]<<8|(H[40801]<<16|H[40802]<<24);c=1;if(!og(a,b+3240|0,d+304|0)){break b}hb(86511,21,1,G[24367])}c=-1}Fa=d+384|0;return c}function Iq(a,b){var 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;l=Fa-32|0;Fa=l;G[l+28>>2]=0;a:{i=G[b+68>>2];b:{if(i){if(G[b+76>>2]<=0){break b}o=G[b+84>>2];m=G[b+112>>2];while(1){e=(n<<4)+m|0;a=G[e+4>>2];c=G[b+20>>2];h=(o+(G[e>>2]<<2)|0)-4|0;G[h>>2]=(G[h>>2]+(G[e+12>>2]-G[e+8>>2]|0)|0)+1;h=M(c,a-1|0);c:{d:{switch(Eu(G[b+24>>2]- -64|0,29)|0){case 9:g=G[e+12>>2];f=G[e+8>>2];if((g|0)<(f|0)){break c}a=f-1|0;c=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[c>>3];e=0;f=g-f|0;j=f+1&3;if(j){while(1){d=d+ +E[i+(a+h|0)|0];L[c>>3]=d;a=a+1|0;e=e+1|0;if((j|0)!=(e|0)){continue}break}}if(f>>>0<3){break c}while(1){e=i+(a+h|0)|0;d=d+ +E[e|0];L[c>>3]=d;d=d+ +E[e+1|0];L[c>>3]=d;d=d+ +E[e+2|0];L[c>>3]=d;d=d+ +E[e+3|0];L[c>>3]=d;a=a+4|0;if((g|0)!=(a|0)){continue}break};break c;case 10:g=G[e+12>>2];f=G[e+8>>2];if((g|0)<(f|0)){break c}a=f-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];c=0;f=g-f|0;j=f+1&3;if(j){while(1){d=d+ +F[i+(a+h<<1)>>1];a=a+1|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}if(f>>>0>=3){while(1){c=i+(a+h<<1)|0;d=d+ +F[c>>1]+ +F[c+2>>1]+ +F[c+4>>1]+ +F[c+6>>1];a=a+4|0;if((g|0)!=(a|0)){continue}break}}L[e>>3]=d;break c;case 6:g=G[e+12>>2];f=G[e+8>>2];if((g|0)<(f|0)){break c}a=f-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];c=0;f=g-f|0;j=f+1&3;if(j){while(1){d=d+ +I[i+(a+h<<1)>>1];a=a+1|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}if(f>>>0>=3){while(1){c=i+(a+h<<1)|0;d=d+ +I[c>>1]+ +I[c+2>>1]+ +I[c+4>>1]+ +I[c+6>>1];a=a+4|0;if((g|0)!=(a|0)){continue}break}}L[e>>3]=d;break c;case 12:g=G[e+12>>2];f=G[e+8>>2];if((g|0)<(f|0)){break c}a=f-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];c=0;f=g-f|0;j=f+1&3;if(j){while(1){d=d+ +G[i+(a+h<<2)>>2];a=a+1|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}if(f>>>0>=3){while(1){c=i+(a+h<<2)|0;d=d+ +G[c>>2]+ +G[c+4>>2]+ +G[c+8>>2]+ +G[c+12>>2];a=a+4|0;if((g|0)!=(a|0)){continue}break}}L[e>>3]=d;break c;case 16:g=G[e+12>>2];f=G[e+8>>2];if((g|0)<(f|0)){break c}a=f-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];c=0;f=g-f|0;j=f+1&3;if(j){while(1){p=i+(a+h<<3)|0;d=d+(+J[p>>2]+ +G[p+4>>2]*4294967296);a=a+1|0;c=c+1|0;if((j|0)!=(c|0)){continue}break}}if(f>>>0>=3){while(1){c=i+(a+h<<3)|0;d=d+(+J[c>>2]+ +G[c+4>>2]*4294967296)+(+J[c+8>>2]+ +G[c+12>>2]*4294967296)+(+J[c+16>>2]+ +G[c+20>>2]*4294967296)+(+J[c+24>>2]+ +G[c+28>>2]*4294967296);a=a+4|0;if((g|0)!=(a|0)){continue}break}}L[e>>3]=d;break c;case 4:g=G[e+12>>2];c=G[e+8>>2];if((g|0)<(c|0)){break c}a=c-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];if((g-c|0)+1&1){a=i+(a+h<<2)|0;d=d+((G[a>>2]&2147483647)>>>0>2139095040?0:+K[a>>2]);a=c}if((c|0)!=(g|0)){while(1){c=i+(a+h<<2)|0;d=d+((G[c>>2]&2147483647)>>>0>2139095040?0:+K[c>>2])+((G[c+4>>2]&2147483647)>>>0>2139095040?0:+K[c+4>>2]);a=a+2|0;if((g|0)!=(a|0)){continue}break}}L[e>>3]=d;break c;case 0:break d;default:break c}}g=G[e+12>>2];c=G[e+8>>2];if((g|0)<(c|0)){break c}a=c-1|0;e=(G[b+104>>2]+(G[e>>2]<<3)|0)-8|0;d=L[e>>3];if((g-c|0)+1&1){k=d;d=L[i+(a+h<<3)>>3];A(+d);a=v(1)|0;f=v(0)|0;a=a&2147483647;d=k+((a|0)==2146435072&(f|0)!=0|a>>>0>2146435072?0:d);L[e>>3]=d;a=c}if((c|0)==(g|0)){break c}while(1){k=d;c=i+(a+h<<3)|0;d=L[c>>3];A(+d);f=v(1)|0;j=v(0)|0;f=f&2147483647;d=k+((f|0)==2146435072&(j|0)!=0|f>>>0>2146435072?0:d);L[e>>3]=d;k=d;d=L[c+8>>3];A(+d);c=v(1)|0;f=v(0)|0;c=c&2147483647;d=k+((c|0)==2146435072&(f|0)!=0|c>>>0>2146435072?0:d);L[e>>3]=d;a=a+2|0;if((g|0)!=(a|0)){continue}break}}n=n+1|0;if((n|0)>2]){continue}break}break b}g=Xb((G[b+8>>2]-G[b+4>>2]<<3)+8|0);if(G[b+76>>2]>0){f=G[b+112>>2];i=-1;while(1){h=n<<4;c=G[(h+f|0)+4>>2];if((c|0)!=(i|0)){G[l+8>>2]=1;G[l+12>>2]=1;G[l+4>>2]=c;G[l>>2]=1;e=G[b+8>>2];cg(G[b+124>>2],82,l,e,e>>31,0,g,0,l+28|0);e=G[l+28>>2];if(e){break a}f=G[b+112>>2];i=c}h=f+h|0;c=(G[b+84>>2]+(G[h>>2]<<2)|0)-4|0;G[c>>2]=(G[c>>2]+(G[h+12>>2]-G[h+8>>2]|0)|0)+1;o=G[h+12>>2];e=G[h+8>>2];e:{if((o|0)<(e|0)){break e}c=e-1|0;h=(G[b+104>>2]+(G[h>>2]<<3)|0)-8|0;d=L[h>>3];if((o-e|0)+1&1){k=d;d=L[g+(c<<3)>>3];A(+d);c=v(1)|0;m=v(0)|0;c=c&2147483647;d=k+((c|0)==2146435072&(m|0)!=0|c>>>0>2146435072?0:d);L[h>>3]=d;c=e}if((e|0)==(o|0)){break e}while(1){k=d;e=g+(c<<3)|0;d=L[e>>3];A(+d);m=v(1)|0;j=v(0)|0;m=m&2147483647;d=k+((m|0)==2146435072&(j|0)!=0|m>>>0>2146435072?0:d);L[h>>3]=d;k=d;d=L[e+8>>3];A(+d);e=v(1)|0;m=v(0)|0;e=e&2147483647;d=k+((e|0)==2146435072&(m|0)!=0|e>>>0>2146435072?0:d);L[h>>3]=d;c=c+2|0;if((o|0)!=(c|0)){continue}break}}n=n+1|0;if((n|0)>2]){continue}break}}pb(g)}Fa=l+32|0;return}a=G[(a?a+68|0:97468)>>2];wf(a,e);$a(a);Gh();sc(e);W()}function pm(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-176|0;Fa=d;G[d+172>>2]=0;E[d+128|0]=0;E[d+96|0]=0;f=E[c|0];a:{if(f){G[d+16>>2]=f;db(d- -64|0,30760,d+16|0);G[d>>2]=E[c|0];db(d+80|0,30770,d);break a}G[d+64>>2]=1230328133;G[d+68>>2]=5787470;c=H[33588]|H[33589]<<8|(H[33590]<<16|H[33591]<<24);G[d+80>>2]=H[33584]|H[33585]<<8|(H[33586]<<16|H[33587]<<24);G[d+84>>2]=c;E[d+88|0]=H[33592]}b:{if(ie(a,d- -64|0,31,d+96|0)){break b}if(!ie(a,32863,31,d+96|0)){break b}G[d+64>>2]=1230328133;G[d+68>>2]=5787470}c:{if(ie(a,d+80|0,31,d+128|0)){break c}if(!ie(a,33584,31,d+128|0)){break c}E[d+88|0]=H[33592];c=H[33588]|H[33589]<<8|(H[33590]<<16|H[33591]<<24);G[d+80>>2]=H[33584]|H[33585]<<8|(H[33586]<<16|H[33587]<<24);G[d+84>>2]=c}d:{e:{f:{switch(H[d+96|0]-66|0){case 8:f=1;c=d+96|1;h=b,i=sb(c),L[h+120>>3]=i;c=_b(c);G[d+128>>2]=3492678;G[d+172>>2]=c;break e;case 0:f=1;c=d+96|1;h=b,i=sb(c),L[h+120>>3]=i;e=sb(c);G[d+128>>2]=3427142;if(O(e)<2147483648){c=~~e;G[d+172>>2]=c;break e}c=-2147483648;G[d+172>>2]=-2147483648;break e;default:break f}}g:{h:{c=d- -64|0;if(Md(a,c,d+172|0)){break h}c=34948;if(Md(a,34948,d+172|0)){if(G[d+172>>2]){break h}G[d+172>>2]=1950;G[b+120>>2]=0;G[b+124>>2]=1084127232;f=1;break d}f=1;if(!H[d+128|0]){break g}if(!nb(d+128|0,40370,3)){G[b+120>>2]=0;G[b+124>>2]=1084127232;G[d+172>>2]=1950;break d}if(G[d+128>>2]==1397900105){G[b+120>>2]=0;G[b+124>>2]=1084178432;G[d+172>>2]=2e3;break d}if(!nb(d+128|0,40253,3)){G[b+120>>2]=0;G[b+124>>2]=1084178432;G[d+172>>2]=2e3;break d}if(!nb(d+128|0,34820,3)){G[b+120>>2]=0;G[b+124>>2]=1084178432;G[d+172>>2]=2e3;break d}if(nb(d+128|0,34809,3)){break g}G[b+120>>2]=0;G[b+124>>2]=1084178432;G[d+172>>2]=2e3;break d}ob(a,c,b+120|0);f=0}c=G[d+172>>2]}if(c){break d}G[b+120>>2]=0;G[b+124>>2]=1084178432;G[d+172>>2]=2e3;c=b+3512|0;if(fb(c,35967,2)){if(fb(c,35895,3)){break d}}G[d+128>>2]=3492678}i:{j:{c=b+128|0;if(!vg(a,33923,c)){if(vg(a,35389,c)){break j}if(ob(a,34948,c)){break j}e=L[b+120>>3];L[b+128>>3]=e;break i}g=d+32|0;ie(a,33923,32,g);if(jb(g,84)){break j}if(ob(a,33299,d+24|0)){e=L[c>>3]+L[d+24>>3]/8765.812770744;L[c>>3]=e;break i}if(!ob(a,35806,d+24|0)){break j}e=L[c>>3]+L[d+24>>3]/8765.812770744;L[c>>3]=e;break i}e=L[c>>3]}if(e==0){L[b+128>>3]=L[b+120>>3]}k:{l:{if(!H[d+128|0]){ie(a,d+80|0,31,d+128|0);if(!H[d+128|0]){break l}}a=Za(b+3848|0,d+128|0);if(!f){break k}if(!fb(a,40370,3)){G[b+120>>2]=0;G[b+124>>2]=1084127232;break k}if(!fb(a,40253,3)){G[b+120>>2]=0;G[b+124>>2]=1084178432;break k}if(!fb(a,33747,4)){G[b+120>>2]=0;G[b+124>>2]=1084178432;break k}if(fb(a,34820,3)|G[d+172>>2]){break k}G[b+120>>2]=0;G[b+124>>2]=1084178432;break k}if(G[b+3964>>2]==7){break k}if(G[d+172>>2]>=1981){E[b+3848|0]=70;E[b+3849|0]=75;E[b+3850|0]=53;E[b+3851|0]=0;break k}E[b+3848|0]=70;E[b+3849|0]=75;E[b+3850|0]=52;E[b+3851|0]=0}m:{n:{switch(H[b+3512|0]-65|0){case 6:E[b+3856|0]=H[35894];a=H[35890]|H[35891]<<8|(H[35892]<<16|H[35893]<<24);c=H[35886]|H[35887]<<8|(H[35888]<<16|H[35889]<<24);E[b+3848|0]=c;E[b+3849|0]=c>>>8;E[b+3850|0]=c>>>16;E[b+3851|0]=c>>>24;E[b+3852|0]=a;E[b+3853|0]=a>>>8;E[b+3854|0]=a>>>16;E[b+3855|0]=a>>>24;break m;case 4:E[b+3856|0]=H[35885];a=H[35881]|H[35882]<<8|(H[35883]<<16|H[35884]<<24);c=H[35877]|H[35878]<<8|(H[35879]<<16|H[35880]<<24);E[b+3848|0]=c;E[b+3849|0]=c>>>8;E[b+3850|0]=c>>>16;E[b+3851|0]=c>>>24;E[b+3852|0]=a;E[b+3853|0]=a>>>8;E[b+3854|0]=a>>>16;E[b+3855|0]=a>>>24;break m;case 18:E[b+3856|0]=H[35860];a=H[35856]|H[35857]<<8|(H[35858]<<16|H[35859]<<24);c=H[35852]|H[35853]<<8|(H[35854]<<16|H[35855]<<24);E[b+3848|0]=c;E[b+3849|0]=c>>>8;E[b+3850|0]=c>>>16;E[b+3851|0]=c>>>24;E[b+3852|0]=a;E[b+3853|0]=a>>>8;E[b+3854|0]=a>>>16;E[b+3855|0]=a>>>24;break m;case 7:E[b+3856|0]=H[34812];a=H[34808]|H[34809]<<8|(H[34810]<<16|H[34811]<<24);c=H[34804]|H[34805]<<8|(H[34806]<<16|H[34807]<<24);E[b+3848|0]=c;E[b+3849|0]=c>>>8;E[b+3850|0]=c>>>16;E[b+3851|0]=c>>>24;E[b+3852|0]=a;E[b+3853|0]=a>>>8;E[b+3854|0]=a>>>16;E[b+3855|0]=a>>>24;break m;case 0:a=b+3852|0;c=H[32686]|H[32687]<<8;E[a|0]=c;E[a+1|0]=c>>>8;a=H[32682]|H[32683]<<8|(H[32684]<<16|H[32685]<<24);E[b+3848|0]=a;E[b+3849|0]=a>>>8;E[b+3850|0]=a>>>16;E[b+3851|0]=a>>>24;break m;case 11:break n;default:break m}}a=b+3851|0;c=H[34145]|H[34146]<<8|(H[34147]<<16|H[34148]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;a=H[34142]|H[34143]<<8|(H[34144]<<16|H[34145]<<24);E[b+3848|0]=a;E[b+3849|0]=a>>>8;E[b+3850|0]=a>>>16;E[b+3851|0]=a>>>24}h=b,j=Nf(b+3848|0),G[h+3964>>2]=j;Fa=d+176|0}function ge(a,b,c,d){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;p=!b;a:{if(G[a+132>>2]>0){f=G[a>>2];if(G[f+44>>2]==2){e=-201342849;b:{while(1){if(!(!(e&1)|!I[((g<<2)+a|0)+148>>1])){e=0;break b}if(!(!(e&2)|!I[((g<<2|4)+a|0)+148>>1])){e=0;break b}e=e>>>2|0;g=g+2|0;if((g|0)!=32){continue}break}c:{if(I[a+200>>1]|(I[a+184>>1]|I[a+188>>1])){break c}g=32;while(1){e=g<<2;if(I[(e+a|0)+148>>1]|I[((e|4)+a|0)+148>>1]|(I[((e|8)+a|0)+148>>1]|I[((e|12)+a|0)+148>>1])){break c}e=0;g=g+4|0;if((g|0)!=256){continue}break}break b}e=1}G[f+44>>2]=e}Ok(a,a+2840|0);Ok(a,a+2852|0);e=I[a+150>>1];n=a+148|0;l=G[a+2844>>2];F[(n+(l<<2)|0)+6>>1]=65535;if((l|0)>=0){i=e?7:138;m=e?4:3;k=-1;f=0;while(1){g=e;o=f;f=f+1|0;e=I[(n+(f<<2)|0)+2>>1];j=h+1|0;d:{if(!((g|0)!=(e|0)|(j|0)>=(i|0))){h=j;break d}e:{if((m|0)>(j|0)){h=((g<<2)+a|0)+2684|0;F[h>>1]=j+I[h>>1];break e}if(g){if((g|0)!=(k|0)){h=((g<<2)+a|0)+2684|0;F[h>>1]=I[h>>1]+1}F[a+2748>>1]=I[a+2748>>1]+1;break e}if((h|0)<=9){F[a+2752>>1]=I[a+2752>>1]+1;break e}F[a+2756>>1]=I[a+2756>>1]+1}h=0;f:{if(!e){m=3;i=138;break f}i=(e|0)==(g|0);m=i?3:4;i=i?6:7}k=g}if((l|0)!=(o|0)){continue}break}}e=I[a+2442>>1];n=a+2440|0;l=G[a+2856>>2];F[(n+(l<<2)|0)+6>>1]=65535;h=0;if((l|0)>=0){i=e?7:138;m=e?4:3;k=-1;f=0;while(1){g=e;o=f;f=f+1|0;e=I[(n+(f<<2)|0)+2>>1];j=h+1|0;g:{if(!((g|0)!=(e|0)|(j|0)>=(i|0))){h=j;break g}h:{if((m|0)>(j|0)){h=((g<<2)+a|0)+2684|0;F[h>>1]=j+I[h>>1];break h}if(g){if((g|0)!=(k|0)){h=((g<<2)+a|0)+2684|0;F[h>>1]=I[h>>1]+1}F[a+2748>>1]=I[a+2748>>1]+1;break h}if((h|0)<=9){F[a+2752>>1]=I[a+2752>>1]+1;break h}F[a+2756>>1]=I[a+2756>>1]+1}h=0;i:{if(!e){m=3;i=138;break i}i=(e|0)==(g|0);m=i?3:4;i=i?6:7}k=g}if((l|0)!=(o|0)){continue}break}}Ok(a,a+2864|0);g=G[a+5800>>2];f=18;j:{if(I[a+2746>>1]){break j}f=17;if(I[a+2690>>1]){break j}f=16;if(I[a+2742>>1]){break j}f=15;if(I[a+2694>>1]){break j}f=14;if(I[a+2738>>1]){break j}f=13;if(I[a+2698>>1]){break j}f=12;if(I[a+2734>>1]){break j}f=11;if(I[a+2702>>1]){break j}f=10;if(I[a+2730>>1]){break j}f=9;if(I[a+2706>>1]){break j}f=8;if(I[a+2726>>1]){break j}f=7;if(I[a+2710>>1]){break j}f=6;if(I[a+2722>>1]){break j}f=5;if(I[a+2714>>1]){break j}f=4;if(I[a+2718>>1]){break j}f=I[a+2686>>1]?3:2}e=g+M(f,3)|0;G[a+5800>>2]=e+17;g=G[a+5804>>2]+10>>>3|0;e=e+27>>>3|0;e=e>>>0>g>>>0?g:e;break a}g=c+5|0;e=g}k:{if(!(p|e>>>0>>0)){Si(a,b,c,d);break k}b=G[a+5820>>2];if(!(G[a+136>>2]!=4&(e|0)!=(g|0))){c=d+2|0;l:{if((b|0)>=14){b=I[a+5816>>1]|c<>1]=b;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=G[a+5820>>2];F[a+5816>>1]=(c&65535)>>>16-b;b=b-13|0;break l}F[a+5816>>1]=I[a+5816>>1]|c<>2]=b;mp(a,116528,117680);break k}c=d+4|0;m:{if((b|0)>=14){b=I[a+5816>>1]|c<>1]=b;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=G[a+5820>>2];h=(c&65535)>>>16-b|0;b=b-13|0;break m}h=I[a+5816>>1]|c<>2]=b;k=G[a+2844>>2];c=k+65280|0;i=G[a+2856>>2];n:{if((b|0)>=12){b=c<>1]=b;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=G[a+5820>>2];e=(c&65535)>>>16-b|0;g=b-11|0;break n}e=c<>2]=g;b=i+65536|0;o:{if((g|0)>=12){b=b<>1]=b;c=G[a+20>>2];G[a+20>>2]=c+1;E[c+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=G[a+5820>>2];h=(i&65535)>>>16-b|0;b=b-11|0;break o}h=b<>2]=b;c=f+65533|0;p:{if((b|0)>=13){b=c<>1]=b;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=c&65535;c=G[a+5820>>2];b=b>>>16-c|0;e=c-12|0;break p}e=b+4|0;b=c<>2]=e;g=0;c=a+5817|0;while(1){h=I[((H[g+118144|0]<<2)+a|0)+2686>>1];b=h<>1]=b;q:{if((e|0)>=14){e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=b;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[c|0];e=G[a+5820>>2];b=h>>>16-e|0;F[a+5816>>1]=b;e=e-13|0;break q}e=e+3|0}G[a+5820>>2]=e;h=(g|0)!=(f|0);g=g+1|0;if(h){continue}break}b=a+148|0;lp(a,b,k);c=a+2440|0;lp(a,c,i);mp(a,b,c)}np(a);if(d){b=G[a+5820>>2];r:{if((b|0)>=9){b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5816|0];b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];break r}if((b|0)<=0){break r}b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5816|0]}G[a+5820>>2]=0;F[a+5816>>1]=0}}function yf(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=Fa-6240|0;Fa=h;j=G[g>>2];if(!j){E[h+1040|0]=0;E[h|0]=0;E[h+2080|0]=0;E[h+3120|0]=0;j=h+3120|0;p=g,q=io(a,j,g),G[p>>2]=q;l=h+2080|0;k=h+1040|0;p=g,q=dh(j,0,h+5200|0,h+4160|0,0,l,k,h,0,0,g),G[p>>2]=q;m=H[h|0];n=H[h+1040|0];o=H[h+2080|0];p=g,q=Ym(a,k,g),G[p>>2]=q;i=Za(h,k);p=g,q=se(j,l,g),G[p>>2]=q;j=Za(j,l);a:{b:{if(!Ib(k,42185)){c:{if(H[h+4160|0]){Za(j,h+4160|0);break c}E[h+2080|0]=0}a=Sb(j,42197);if(a){Za(j,Za(h+5200|0,a+3|0))}k=1;a=Sb(h+2080|0,42197);if(!a){break b}Za(h+2080|0,Za(h+5200|0,a+3|0));break b}a=n|o|m;if(!Ib(h+1040|0,42094)){if(a){Ua(58879);G[g>>2]=125;break a}E[h+2080|0]=0;k=1;break b}if(!Ib(h+1040|0,42043)){a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);E[i|0]=0;E[h+2080|0]=0;k=1;break b}if(!Ib(h+1040|0,42081)){E[i|0]=0;E[h+2080|0]=0;k=1;break b}if(!Ib(h+1040|0,41986)){E[i|0]=0;E[h+2080|0]=0;k=1;break b}if(!Ib(h+1040|0,42141)){Za(j,h+4160|0);Za(h+2080|0,h+5200|0);G[h+1040>>2]=1701603686;G[h+1044>>2]=3092282;G[i>>2]=1701603686;G[i+4>>2]=3092282;k=1;break b}if(!Ib(h+1040|0,42157)){Za(j,h+4160|0);G[h+1040>>2]=1701603686;G[h+1044>>2]=3092282;G[i>>2]=1886680168;G[i+4>>2]=3092282;k=1;break b}if(!Ib(h+1040|0,42169)){Za(j,h+4160|0);G[h+1040>>2]=1701603686;G[h+1044>>2]=3092282;a=H[42039]|H[42040]<<8|(H[42041]<<16|H[42042]<<24);E[i+3|0]=a;E[i+4|0]=a>>>8;E[i+5|0]=a>>>16;E[i+6|0]=a>>>24;a=H[42036]|H[42037]<<8|(H[42038]<<16|H[42039]<<24);E[i|0]=a;E[i+1|0]=a>>>8;E[i+2|0]=a>>>16;E[i+3|0]=a>>>24;k=1;break b}if(!Ib(h+1040|0,42180)){Za(j,h+4160|0);G[h+1040>>2]=1701603686;G[h+1044>>2]=3092282;E[i+8|0]=H[42065];a=H[42061]|H[42062]<<8|(H[42063]<<16|H[42064]<<24);k=H[42057]|H[42058]<<8|(H[42059]<<16|H[42060]<<24);E[i|0]=k;E[i+1|0]=k>>>8;E[i+2|0]=k>>>16;E[i+3|0]=k>>>24;E[i+4|0]=a;E[i+5|0]=a>>>8;E[i+6|0]=a>>>16;E[i+7|0]=a>>>24;k=1;break b}if(!Ib(h+1040|0,42013)){k=0;E[j|0]=0;Za(h+2080|0,h+5200|0);a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);G[i>>2]=1701603686;G[i+4>>2]=3092282;break b}if(!Ib(h+1040|0,42025)){k=0;E[j|0]=0;a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);G[i>>2]=1886680168;G[i+4>>2]=3092282;break b}if(!Ib(h+1040|0,41994)){k=0;E[j|0]=0;a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);G[i>>2]=1886680168;G[i+4>>2]=3092282;break b}if(!Ib(h+1040|0,42036)){k=0;E[j|0]=0;a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);a=H[42039]|H[42040]<<8|(H[42041]<<16|H[42042]<<24);E[i+3|0]=a;E[i+4|0]=a>>>8;E[i+5|0]=a>>>16;E[i+6|0]=a>>>24;a=H[42036]|H[42037]<<8|(H[42038]<<16|H[42039]<<24);E[i|0]=a;E[i+1|0]=a>>>8;E[i+2|0]=a>>>16;E[i+3|0]=a>>>24;break b}if(!Ib(h+1040|0,42010)){k=0;E[j|0]=0;a=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[h+1043|0]=a;E[h+1044|0]=a>>>8;E[h+1045|0]=a>>>16;E[h+1046|0]=a>>>24;G[h+1040>>2]=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);a=H[42039]|H[42040]<<8|(H[42041]<<16|H[42042]<<24);E[i+3|0]=a;E[i+4|0]=a>>>8;E[i+5|0]=a>>>16;E[i+6|0]=a>>>24;a=H[42036]|H[42037]<<8|(H[42038]<<16|H[42039]<<24);E[i|0]=a;E[i+1|0]=a>>>8;E[i+2|0]=a>>>16;E[i+3|0]=a>>>24;break b}k=a?-1:0;if(!Ib(h+1040|0,42057)){G[g>>2]=125;Ua(58984);E[h+2080|0]=0;E[j|0]=0;break b}if(!Ib(h+1040|0,41976)){G[g>>2]=125;Ua(58932);E[h+2080|0]=0;E[j|0]=0;break b}if(Ib(h+1040|0,42090)){break b}G[g>>2]=125;Ua(59035);E[h+2080|0]=0;E[j|0]=0}if(G[g>>2]){break a}d:{if(!b){break d}if(!H[j|0]){E[b|0]=0;break d}a=Sb(j,42197);e:{if(!a){l=0;break e}a=a+3|0;l=a-j|0;rb(b,j,l);j=a}p=g,q=bf(j,1025-l|0,b+l|0,g),G[p>>2]=q}f:{if(!c){break f}if(!H[h+2080|0]){E[c|0]=0;break f}a=Sb(h+2080|0,42197);g:{if(!a){b=h+2080|0;j=0;break g}b=a+3|0;a=h+2080|0;j=b-a|0;rb(c,a,j)}p=g,q=bf(b,1025-j|0,c+j|0,g),G[p>>2]=q}if(d){Za(d,h+1040|0)}if(e){Za(e,i)}if(!f){break a}G[f>>2]=k}j=G[g>>2]}Fa=h+6240|0;return j}function jg(a){var 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;f=Fa-4208|0;Fa=f;Bl(f+112|0,4096);b=G[948156];a:{b:{if(a){c:{d:{d=G[947121];if((d|0)<3){break d}switch(b-6|0){case 0:case 7:break d;default:break c}}c=oj(f+112|0);if((d&-2147483647)==1){L[473562]=c;break b}e:{f:{switch(a-1|0){default:c=L[473564];i=L[473563];break e;case 0:L[473564]=c;i=L[473562];L[473563]=i;break e;case 1:break f}}m=L[473562];i=L[475688]+(m*L[475684]+c*L[475686]);L[473563]=i;c=L[475689]+(m*L[475685]+c*L[475687]);L[473564]=c}L[f+40>>3]=c;L[f+32>>3]=i;Ya(3788528,4096,19679,f+32|0);if(!H[3788528]){break b}if(!G[950330]){Lb()}a=Xb(Va(3788528)+1|0);Yb(3788528,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);break b}g:{e=d-3|0;if(!((b|0)==7&e>>>0<2|(b|0)==8&e>>>0<2|((b|0)==9&e>>>0<2|(b|0)==11))){if(!((b|0)==10&e>>>0<2)){break g}}c=vb(f+112|0,0);L[474079]=c;a=G[948160];h:{if(!a){break h}if(!Xa(a,25125)){break h}if(Xa(a,16977)){c=c+L[474081];L[474079]=c}if(!Xa(a,16977)|!G[G[947122]+3256>>2]){break h}c=-c;L[474079]=c}L[f+48>>3]=c;Ya(3788528,4096,19682,f+48|0);if(!H[3788528]){break b}if(!G[950330]){Lb()}a=Xb(Va(3788528)+1|0);Yb(3788528,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);break b}i:{e=(b|0)==7;j:{if((b|0)==8&(d|0)==5|(e&(d|0)==5|(d|0)==8&e)){break j}e=(b|0)==9;if(e&(d|0)==8){break j}g=(d|0)==10;if(g&(b|0)==8){break j}h=e;e=(d|0)==5;if(h&e){break j}h=e;e=(b|0)==10;if(h&e){break j}if(!(e&g)){break i}}c=vb(f+112|0,0);L[474079]=c;L[f+64>>3]=c;Ya(3788528,4096,19682,f- -64|0);Te(3788528);break b}k:{switch(b-2|0){case 0:case 2:c=vb(f+112|0,0);L[474079]=c;b=G[948160];l:{if(!b){break l}if(!Xa(b,25125)){break l}if(Xa(b,16977)){c=c+L[474081];L[474079]=c}if(!Xa(b,16977)|!G[G[947122]+3256>>2]){break l}c=-c;L[474079]=c}L[f+96>>3]=c;Ya(3792672,4096,19682,f+96|0);d=G[947121];break;default:break k}}m:{if((d&-2147483647)==1){c=vb(f+112|0,0);i=vb(f+112|0,0);c=c<0?-i:i;L[473562]=c;n:{switch(a-1|0){default:c=L[473563];a=3788504;break m;case 0:L[473563]=c;a=3788504;break m;case 1:break n}}c=c*L[475684];L[473563]=c;L[473564]=L[475687]*0;a=3788504;break m}G[947124]=0;G[947125]=0;c=vb(f+112|0,0);i=vb(f+112|0,0);c=c<0?-i:i;o:{p:{switch(a-1|0){default:c=L[473564];break o;case 1:L[473563]=L[473562]*L[475684];c=c*L[475687];break;case 0:break p}}L[473564]=c}a=3788512}L[f+80>>3]=c;Ya(3788528,4096,19682,f+80|0);Tg(L[a>>3]);Te(3788528);break b}q:{d=(b|0)!=7;a=G[947121];r:{if(!d&(a|0)==3|!d&(a|0)==4){break r}d=(b|0)==8;if(d&(a|0)==3|d&(a|0)==4){break r}d=(b|0)==9;if(d&(a|0)==3|d&(a|0)==4){break r}d=(b|0)==10;if(d&(a|0)==3|d&(a|0)==4){break r}if((b|0)!=11|(a|0)<3){break q}}c=vb(f+112|0,0);L[474079]=c;a=G[948160];s:{if(!a){break s}if(!Xa(a,25125)){break s}if(Xa(a,16977)){c=c+L[474081];L[474079]=c}if(!Xa(a,16977)|!G[G[947122]+3256>>2]){break s}c=-c;L[474079]=c}L[f>>3]=c;Ya(3788528,4096,19682,f);if(!H[3788528]){break b}if(!G[950330]){Lb()}a=Xb(Va(3788528)+1|0);Yb(3788528,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);break b}t:{e=(b|0)==7;u:{if((b|0)==8&(a|0)==5|(e&(a|0)==5|(a|0)==8&e)){break u}d=(a|0)==10;if(d&(b|0)==8){break u}e=(b|0)==9;g=(a|0)==5;if(e&g|e&(a|0)==8){break u}a=(b|0)==10;if(a&g){break u}if(!(a&d)){break t}}c=vb(f+112|0,0);L[474079]=c;L[f+16>>3]=c;Ya(3788528,4096,19682,f+16|0);Te(3788528);break b}n=Lc(f+112|0);g=G[945070];a=G[945064];E[a|0]=H[3780260];v:{w:{k=G[945062]+(G[945063]<<2)|0;b=G[k>>2];d=G[b+4>>2];if(d+2>>>0>a>>>0){l=G[950324]+2|0;e=l+d|0;h=G[b+12>>2];j=(h+d|0)+2|0;if((l|0)>0){while(1){j=j-1|0;e=e-1|0;E[j|0]=H[e|0];b=G[k>>2];d=G[b+4>>2];if(e>>>0>d>>>0){continue}break}h=G[b+12>>2]}G[950324]=h;G[b+16>>2]=h;b=j-e|0;a=b+a|0;if(a>>>0>>0){break w}g=b+g|0}a=a-1|0;E[a|0]=100;G[945070]=g;b=H[a|0];G[945064]=a;E[3780260]=b;break v}qd(3987);W()}h=G[945071]-1|0;if((h|0)>=0){l=G[945062]+(G[945063]<<2)|0;j=G[945070];b=G[945064];a=H[3780260];e=G[950324];while(1){p=H[h+n|0];E[b|0]=a;g=G[l>>2];d=G[g+4>>2];if(d+2>>>0>b>>>0){o=e+2|0;a=o+d|0;e=G[g+12>>2];k=(e+d|0)+2|0;if((o|0)>0){while(1){k=k-1|0;a=a-1|0;E[k|0]=H[a|0];g=G[l>>2];d=G[g+4>>2];if(d>>>0>>0){continue}break}e=G[g+12>>2]}G[950324]=e;G[g+16>>2]=e;a=k-a|0;b=a+b|0;if(b>>>0>>0){break a}j=a+j|0}b=b-1|0;E[b|0]=p;G[945070]=j;a=H[b|0];G[945064]=b;E[3780260]=a;h=h-1|0;if((h|0)>=0){continue}break}}pb(n);G[947121]=G[947121]-1}Fa=f+4208|0;return}qd(3987);W()}function tc(a,b,c,d,e,f,g,h,i){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,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,Q=0,R=0;k=Fa-96|0;Fa=k;t=h;u=i&65535;m=(e^i)&-2147483648;l=e&65535;p=l;z=l;J=i>>>16&32767;K=e>>>16&32767;a:{b:{if(J-32767>>>0>4294934529&K-32767>>>0>=4294934530){break b}l=e&2147483647;j=d;if(!(!d&(l|0)==2147418112?!(b|c):l>>>0<2147418112)){o=d;m=e|32768;break a}e=i&2147483647;if(!(!h&(e|0)==2147418112?!(f|g):e>>>0<2147418112)){o=h;m=i|32768;b=f;c=g;break a}if(!(b|j|(l^2147418112|c))){if(!(f|h|(e|g))){m=2147450880;b=0;c=0;break a}m=m|2147418112;b=0;c=0;break a}if(!(f|h|(e^2147418112|g))){d=b|j;e=c|l;b=0;c=0;if(!(d|e)){m=2147450880;break a}m=m|2147418112;break a}if(!(b|j|(c|l))){b=0;c=0;break a}if(!(f|h|(e|g))){b=0;c=0;break a}if((l|0)==65535|l>>>0<65535){j=b;h=!(d|p);i=h<<6;l=P(h?b:d)+32|0;b=P(h?c:p);b=i+((b|0)==32?l:b)|0;od(k+80|0,j,c,d,p,b-15|0);s=16-b|0;d=G[k+88>>2];z=G[k+92>>2];c=G[k+84>>2];b=G[k+80>>2]}if(e>>>0>65535){break b}e=!(t|u);h=e<<6;i=P(e?f:t)+32|0;e=P(e?g:u);e=h+((e|0)==32?i:e)|0;od(k- -64|0,f,g,t,u,e-15|0);s=(s-e|0)+16|0;t=G[k+72>>2];u=G[k+76>>2];f=G[k+64>>2];g=G[k+68>>2]}e=f;j=g<<15|e>>>17;h=e<<15;e=j;p=h&-32768;q=c;A=Au(p,0,c,0);c=Ia;w=c;B=e;i=0;j=Au(e,0,b,i);e=j+A|0;h=Ia+c|0;h=e>>>0>>0?h+1|0:h;c=e;j=e;n=Au(b,i,p,i);l=0+n|0;e=Ia+e|0;e=l>>>0>>0?e+1|0:e;x=l;n=l;l=e;C=(j|0)==(e|0)&r>>>0>n>>>0|e>>>0>>0;r=d;L=Au(p,i,d,0);F=Ia;e=Au(q,i,B,i);d=e+L|0;j=Ia+F|0;n=d;d=d>>>0>>0?j+1|0:j;e=t;j=u<<15|e>>>17;y=e<<15|g>>>17;g=j;j=Au(y,0,b,i);e=j+n|0;f=Ia+d|0;H=e;f=e>>>0>>0?f+1|0:f;u=f;e=f;f=(h|0)==(w|0)&c>>>0>>0|h>>>0>>0;c=h+H|0;f=e+f|0;A=c;f=c>>>0>>0?f+1|0:f;t=f;c=f;D=z|65536;z=v;M=Au(p,i,D,v);I=Ia;h=Au(r,o,B,i);f=h+M|0;e=Ia+I|0;N=f;e=f>>>0>>0?e+1|0:e;v=e;E=g|-2147483648;w=0;g=Au(E,w,b,i);b=g+f|0;f=Ia+e|0;f=b>>>0>>0?f+1|0:f;O=b;e=Au(y,o,q,i);b=b+e|0;p=f;j=f+Ia|0;Q=b;g=b>>>0>>0?j+1|0:j;f=0;b=f+A|0;e=c+Q|0;e=b>>>0>>0?e+1|0:e;R=b;c=b;b=b+C|0;C=e;f=b>>>0>>0?e+1|0:e;c=f;s=((K+J|0)+s|0)-16383|0;j=Au(E,w,q,i);h=Ia;i=Au(D,z,B,i);e=i+j|0;f=Ia+h|0;f=e>>>0>>0?f+1|0:f;i=(f|0)==(h|0)&e>>>0>>0|f>>>0>>0;h=e;q=i;i=Au(y,o,r,o);e=i+e|0;j=Ia+f|0;j=e>>>0>>0?j+1|0:j;i=(f|0)==(j|0)&e>>>0>>0|f>>>0>j>>>0;f=q+i|0;h=0;h=f>>>0>>0?1:h;q=Au(E,w,D,z);i=q+f|0;f=Ia+h|0;f=i>>>0>>0?f+1|0:f;q=e;h=j;B=i;e=(d|0)==(u|0)&n>>>0>H>>>0|d>>>0>u>>>0;d=e+((d|0)==(F|0)&n>>>0>>0|d>>>0>>0)|0;j=0;j=d>>>0>>0?1:j;i=d;d=q+d|0;e=h+j|0;e=d>>>0>>0?e+1|0:e;n=d;i=e;e=(e|0)==(h|0)&d>>>0>>0|e>>>0>>0;d=B+e|0;h=d>>>0>>0?f+1|0:f;q=d;j=Au(y,o,D,z);e=Ia;r=Au(E,w,r,o);d=r+j|0;f=Ia+e|0;f=d>>>0>>0?f+1|0:f;r=d;d=f;f=(e|0)==(f|0)&j>>>0>r>>>0|e>>>0>f>>>0;y=d+q|0;e=f+h|0;e=d>>>0>y>>>0?e+1|0:e;h=0;d=h+n|0;f=i+r|0;f=d>>>0>>0?f+1|0:f;h=f;j=(i|0)==(f|0)&d>>>0>>0|f>>>0>>0;i=j+y|0;n=i;i=i>>>0>>0?e+1|0:e;r=d;e=d;d=h;j=(p|0)==(v|0)&N>>>0>O>>>0|p>>>0>>0;f=j+((v|0)==(I|0)&N>>>0>>0|v>>>0>>0)|0;h=0;j=f+((g|0)==(p|0)&O>>>0>Q>>>0|g>>>0

>>0)|0;f=g+e|0;e=d+j|0;e=f>>>0>>0?e+1|0:e;g=f;h=(d|0)==(e|0)&f>>>0>>0|d>>>0>e>>>0;d=h+n|0;f=i;f=d>>>0>>0?f+1|0:f;h=e;n=d;i=(t|0)==(C|0)&A>>>0>R>>>0|t>>>0>C>>>0;d=i+((t|0)==(u|0)&A>>>0>>0|t>>>0>>0)|0;j=0;j=d>>>0>>0?1:j;i=d;d=d+g|0;e=e+j|0;e=d>>>0>>0?e+1|0:e;h=(e|0)==(h|0)&d>>>0>>0|e>>>0>>0;g=n+h|0;f=g>>>0>>0?f+1|0:f;h=g;i=f;c:{if(f&65536){s=s+1|0;break c}v=l>>>31|0;f=i<<1|h>>>31;h=g<<1|e>>>31;i=f;f=e<<1|d>>>31;d=d<<1|c>>>31;e=f;g=x;f=l<<1|g>>>31;x=g<<1;l=f;f=c<<1|b>>>31;b=b<<1|v;c=f}if((s|0)>=32767){m=m|2147418112;b=0;c=0;break a}d:{if((s|0)<=0){f=1-s|0;if(f>>>0>=128){b=0;c=0;break a}g=s+127|0;od(k+48|0,x,l,b,c,g);od(k+32|0,d,e,h,i,g);eg(k+16|0,x,l,b,c,f);eg(k,d,e,h,i,f);x=G[k+32>>2]|G[k+16>>2]|(G[k+48>>2]|G[k+56>>2]|(G[k+52>>2]|G[k+60>>2]))!=0;l=G[k+36>>2]|G[k+20>>2];b=G[k+40>>2]|G[k+24>>2];c=G[k+44>>2]|G[k+28>>2];d=G[k>>2];e=G[k+4>>2];f=G[k+8>>2];g=G[k+12>>2];break d}f=h;g=i&65535|s<<16}o=f|o;m=g|m;if(!(!b&(c|0)==-2147483648?!(l|x):(c|0)>0|(c|0)>=0)){b=d+1|0;j=b?e:e+1|0;c=j;f=(e|0)==(j|0)&b>>>0>>0|e>>>0>j>>>0;d=f+o|0;e=m;o=d;m=d>>>0>>0?e+1|0:e;break a}if(b|x|(c^-2147483648|l)){b=d;c=e;break a}j=m;c=d&1;b=c+d|0;f=b>>>0>>0?e+1|0:e;c=f;e=(e|0)==(f|0)&b>>>0>>0|e>>>0>f>>>0;d=e+o|0;o=d;m=d>>>0>>0?j+1|0:j}G[a>>2]=b;G[a+4>>2]=c;G[a+8>>2]=o;G[a+12>>2]=m;Fa=k+96|0}function yn(a){var 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;f=a+48|0;d=1;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{g=G[a+4>>2];switch(g|0){case 1:break k;case 11:break l;case 8:break m;case 9:break r;case 7:break t;case 6:break v;case 5:break x;case 4:break z;case 3:break B;case 13:case 14:break D;case 10:break E;case 12:break F;case 0:break g;case 2:break i;default:break a}}b=L[a- -64>>3];if(b>180){while(1){b=b+-360;if(b>180){continue}break}L[a+64>>3]=b}if(b<=-180){while(1){b=b+360;if(b<=-180){continue}break}L[a+64>>3]=b}c=L[a+72>>3];if(c>180){while(1){c=c+-360;if(c>180){continue}break}L[a+72>>3]=c}if(c<=-180){while(1){c=c+360;if(c<=-180){continue}break}L[a+72>>3]=c}e=L[a+88>>3];L[a+152>>3]=e*e;e=L[a+96>>3];L[a+160>>3]=e*e;break C}b=L[a- -64>>3];if(b>180){while(1){b=b+-360;if(b>180){continue}break}L[a+64>>3]=b}if(b<=-180){while(1){b=b+360;if(b<=-180){continue}break}L[a+64>>3]=b}c=L[a+72>>3];if(c>180){while(1){c=c+-360;if(c>180){continue}break}L[a+72>>3]=c}if(!(c<=-180)){break C}while(1){c=c+360;if(c<=-180){continue}break}L[a+72>>3]=c;break C}b=L[a- -64>>3];if(b>180){while(1){b=b+-360;if(b>180){continue}break}L[a+64>>3]=b}if(b<=-180){while(1){b=b+360;if(b<=-180){continue}break}L[a+64>>3]=b}c=L[a+72>>3];if(c>180){while(1){c=c+-360;if(c>180){continue}break}L[a+72>>3]=c}if(c<=-180){while(1){c=c+360;if(c<=-180){continue}break}L[a+72>>3]=c}e=L[a+128>>3]/180*3.141592653589793;m=a,n=eb(e),L[m+144>>3]=n;m=a,n=ib(e),L[m+136>>3]=n}switch(g|0){case 1:break j;case 14:break n;case 13:break o;case 12:break p;case 9:break q;case 7:break s;case 6:break u;case 5:break w;case 4:break y;case 3:break A;case 10:break c;case 11:break d;case 8:break e;case 0:break g;case 2:break h;default:break a}}b=L[a- -64>>3];L[a+152>>3]=b*b;c=L[a+72>>3];L[a+160>>3]=c*c}b=c;break h}b=L[a+80>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+144>>3]=n;m=a,n=ib(b),L[m+136>>3]=n;c=L[a+72>>3];b=L[a- -64>>3]}b=b>c?b:c;break h}b=L[a+96>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+160>>3]=n;m=a,n=ib(b),L[m+152>>3]=n;b=L[a+104>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+144>>3]=n;m=a,n=ib(b),L[m+136>>3]=n}b=L[a+80>>3];d=L[a+88>>3];b=b>d?b:d;break h}b=L[a+80>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+144>>3]=n;m=a,n=ib(b),L[m+136>>3]=n;c=L[a+72>>3];b=L[a- -64>>3]}b=V(b*b+c*c)*.5;break h}b=L[a+96>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+160>>3]=n;m=a,n=ib(b),L[m+152>>3]=n;b=L[a+104>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+144>>3]=n;m=a,n=ib(b),L[m+136>>3]=n}b=L[a+80>>3]*L[a+88>>3];b=V(b+b)*.5;break h}b=L[a+80>>3]/180*3.141592653589793;m=a,n=eb(b),L[m+144>>3]=n;m=a,n=ib(b),L[m+136>>3]=n;c=L[a+72>>3];b=L[a- -64>>3]}if(b>c){b=b*.5;break h}b=c*.5;break h}b=L[a+96>>3];break h}b=L[a+104>>3];d=L[a+112>>3];b=b>d?b:d;break h}b=L[a+104>>3]*L[a+112>>3];b=V(b+b)*.5;break h}c=L[a+72>>3];e=L[a+56>>3];L[a+96>>3]=(c+e)*.5;h=L[a- -64>>3];j=L[a+48>>3];L[a+88>>3]=(h+j)*.5;d=L[a+80>>3]/180*3.141592653589793;b=eb(d);L[a+144>>3]=b;d=ib(d);L[a+136>>3]=d;c=(c-e)*.5;e=(h-j)*.5;L[a+160>>3]=O(b*c-d*e);L[a+152>>3]=O(e*b+d*c);break e}f=G[f+4>>2];break d}b=L[a- -64>>3];c=b-L[a+48>>3];e=L[a+72>>3]-L[a+56>>3];d=V(c*c+e*e);L[a+152>>3]=d+.5;f=d!=0;L[a+144>>3]=f?c/d:1;L[a+136>>3]=f?e/d:0}d=L[a+48>>3];f=d>b;L[a+24>>3]=f?d:b;L[a+16>>3]=f?b:d;b=L[a+56>>3];d=L[a+72>>3];if(b>d){L[a+32>>3]=d;break b}L[a+32>>3]=b;b=d;break b}b=L[a- -64>>3];L[a+152>>3]=b*b}d=b;if(!(b>0)){break f}}b=L[a+48>>3];L[a+24>>3]=d+b;L[a+16>>3]=b-d;b=L[a+56>>3];L[a+32>>3]=b-d;b=d+b;break b}switch(g-8|0){case 2:break c;case 3:break d;case 0:break e;default:break a}}d=L[a+88>>3];b=d-L[a+48>>3];e=b*b;c=L[a+96>>3];b=c-L[a+56>>3];b=V(e+b*b);L[a+32>>3]=c-b;L[a+24>>3]=d+b;L[a+16>>3]=d-b;b=c+b;break b}d=L[f>>3];L[a+16>>3]=d;c=L[f>>3];L[a+24>>3]=c;h=L[f+8>>3];L[a+32>>3]=h;e=L[f+8>>3];L[a+40>>3]=e;k=G[a+48>>2];if((k|0)<3){break a}g=2;while(1){i=g<<3;l=i+f|0;b=L[l>>3];if(d>b){L[a+16>>3]=b;d=b;b=L[l>>3]}if(b>c){L[a+24>>3]=b;c=b}i=(i|8)+f|0;b=L[i>>3];if(h>b){L[a+32>>3]=b;h=b;b=L[i>>3]}if(b>e){L[a+40>>3]=b;e=b}g=g+2|0;if((k|0)>(g|0)){continue}break}break a}G[a+32>>2]=0;G[a+36>>2]=1072693248;G[a+24>>2]=0;G[a+28>>2]=-1074790400;G[a+16>>2]=0;G[a+20>>2]=1072693248;b=-1}L[a+40>>3]=b}}function Wg(a,b){var c=0,d=0;c=Fa-816|0;Fa=c;a:{b:{c:{if(!a){d=1;if(b){break c}hb(84487,69,1,G[321435]);break a}if(G[321437]){G[c+800>>2]=G[a+3260>>2];kb(75671,c+800|0);G[c+784>>2]=a+3544;kb(76709,c+784|0);L[c+768>>3]=L[a+136>>3];gb(70763,c+768|0);L[c+752>>3]=L[a+144>>3];gb(70745,c+752|0);G[c+736>>2]=a+3512;kb(76668,c+736|0);G[c+720>>2]=a+3528;kb(76649,c+720|0);G[c+704>>2]=G[a+3316>>2];kb(75688,c+704|0);if(G[a+3316>>2]>0){while(1){L[c+696>>3]=L[((d<<3)+a|0)+688>>3];G[c+688>>2]=d;gb(70635,c+688|0);d=d+1|0;if((d|0)>2]){continue}break}}L[c+672>>3]=L[a>>3];gb(70836,c+672|0);L[c+656>>3]=L[a+8>>3];gb(70818,c+656|0);if(G[a+3316>>2]>0){d=0;while(1){L[c+648>>3]=L[((d<<3)+a|0)+616>>3];G[c+640>>2]=d;gb(70597,c+640|0);d=d+1|0;if((d|0)>2]){continue}break}}L[c+624>>3]=L[a+16>>3];gb(70690,c+624|0);L[c+608>>3]=L[a+24>>3];gb(70672,c+608|0);d:{if(G[a+3300>>2]){L[c+600>>3]=L[a+56>>3];G[c+592>>2]=0;gb(70799,c+592|0);L[c+584>>3]=L[a- -64>>3];G[c+576>>2]=1;gb(70799,c+576|0);L[c+568>>3]=L[a+72>>3];G[c+560>>2]=2;gb(70799,c+560|0);L[c+552>>3]=L[a+80>>3];G[c+544>>2]=3;gb(70799,c+544|0);break d}if(G[a+3316>>2]<=0){break d}d=0;while(1){L[c+536>>3]=L[((d<<3)+a|0)+760>>3];G[c+528>>2]=d;gb(70616,c+528|0);d=d+1|0;if((d|0)>2]){continue}break}}L[c+512>>3]=L[a+32>>3];gb(70872,c+512|0);L[c+496>>3]=L[a+40>>3];gb(70854,c+496|0);L[c+480>>3]=L[a+48>>3];gb(70890,c+480|0);L[c+464>>3]=L[a+120>>3];gb(70654,c+464|0);L[c+448>>3]=L[a+128>>3];gb(70781,c+448|0);L[c+440>>3]=L[a+832>>3];G[c+432>>2]=0;gb(70726,c+432|0);L[c+424>>3]=L[a+840>>3];G[c+416>>2]=1;gb(70726,c+416|0);L[c+408>>3]=L[a+848>>3];G[c+400>>2]=2;gb(70726,c+400|0);L[c+392>>3]=L[a+856>>3];G[c+384>>2]=3;gb(70726,c+384|0);L[c+376>>3]=L[a+864>>3];G[c+368>>2]=4;gb(70726,c+368|0);L[c+360>>3]=L[a+872>>3];G[c+352>>2]=5;gb(70726,c+352|0);L[c+344>>3]=L[a+880>>3];G[c+336>>2]=6;gb(70726,c+336|0);L[c+328>>3]=L[a+888>>3];G[c+320>>2]=7;gb(70726,c+320|0);L[c+312>>3]=L[a+896>>3];G[c+304>>2]=8;gb(70726,c+304|0);L[c+296>>3]=L[a+904>>3];G[c+288>>2]=9;gb(70726,c+288|0);L[c+280>>3]=L[a+912>>3];G[c+272>>2]=10;gb(70726,c+272|0);L[c+264>>3]=L[a+920>>3];G[c+256>>2]=11;gb(70726,c+256|0);L[c+248>>3]=L[a+928>>3];G[c+240>>2]=12;gb(70726,c+240|0);L[c+232>>3]=L[a+936>>3];G[c+224>>2]=13;gb(70726,c+224|0);L[c+216>>3]=L[a+944>>3];G[c+208>>2]=14;gb(70726,c+208|0);L[c+200>>3]=L[a+952>>3];G[c+192>>2]=15;gb(70726,c+192|0);L[c+184>>3]=L[a+1480>>3];G[c+176>>2]=0;gb(70560,c+176|0);L[c+168>>3]=L[a+1488>>3];G[c+160>>2]=1;gb(70560,c+160|0);L[c+152>>3]=L[a+1496>>3];G[c+144>>2]=2;gb(70560,c+144|0);L[c+136>>3]=L[a+1504>>3];G[c+128>>2]=3;gb(70560,c+128|0);L[c+120>>3]=L[a+1512>>3];G[c+112>>2]=4;gb(70560,c+112|0);L[c+104>>3]=L[a+1520>>3];G[c+96>>2]=5;gb(70560,c+96|0);L[c+88>>3]=L[a+1528>>3];G[c+80>>2]=6;gb(70560,c+80|0);L[c+72>>3]=L[a+1536>>3];G[c+64>>2]=7;gb(70560,c- -64|0);L[c+56>>3]=L[a+1544>>3];G[c+48>>2]=8;gb(70560,c+48|0);L[c+40>>3]=L[a+1552>>3];G[c+32>>2]=9;gb(70560,c+32|0);L[c+16>>3]=L[a+3176>>3];gb(70579,c+16|0);L[c>>3]=L[a+3184>>3];gb(70708,c)}d=1;if(G[a+3316>>2]<=1){if(b){break c}hb(80015,63,1,G[321435]);break a}if(G[a+3260>>2]<=0){if(b){break c}hb(82316,48,1,G[321435]);break a}if(L[a+136>>3]<=0){if(b){break c}hb(83370,44,1,G[321435]);break a}if(L[a+144>>3]<=0){if(b){break c}hb(83280,44,1,G[321435]);break a}e:{d=a+3512|0;if(!Xa(d,35967)){if(!Xa(a+3528|0,35895)){break e}d=1;if(b){break c}break b}if(!Xa(d,35895)){if(!Xa(a+3528|0,35967)){break e}d=1;if(b){break c}break b}if(!Xa(d,34433)){if(!Xa(a+3528|0,33498)){break e}d=1;if(b){break c}break b}if(!Xa(d,33498)){if(!Xa(a+3528|0,34433)){break e}d=1;if(b){break c}break b}if(!Xa(d,34438)){if(!Xa(a+3528|0,33503)){break e}d=1;if(b){break c}break b}if(!Xa(d,33503)){if(!Xa(a+3528|0,34438)){break e}d=1;if(b){break c}break b}d=1;if(b){break c}hb(83415,44,1,G[321435]);break a}if(G[a+3300>>2]){if(!(L[a+56>>3]==0&L[a- -64>>3]==0)){d=0;if(L[a+72>>3]!=0|L[a+80>>3]!=0){break c}}d=1;if(b){break c}hb(79614,47,1,G[321435]);break a}if(L[a+32>>3]==0){d=1;if(b){break c}hb(83325,44,1,G[321435]);break a}if(L[a+40>>3]!=0){d=0;break c}d=1;if(b){break c}hb(83235,44,1,G[321435]);break a}Fa=c+816|0;return d}hb(82624,59,1,G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Oh(a,b,c,d,e,f,g){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,F=0;if(!H[3707e3]){G[926752]=-1571644103;G[926753]=1066524486;p=bb(3728656,145760,724);q=bb(3729392,146496,724);s=bb(3730128,147232,724);y=bb(3730864,147968,724);bb(3731600,148704,500);bb(3732100,149216,500);bb(3732600,149728,500);bb(3733100,150240,400);bb(3733504,150640,500);bb(3734004,151152,500);bb(3734504,151664,500);bb(3735004,152176,400);bb(3735408,152576,500);bb(3735908,153088,500);bb(3736408,153600,500);bb(3736908,154112,400);bb(3737312,154512,500);bb(3737812,155024,500);bb(3738312,155536,500);bb(3738812,156048,400);bb(3739216,156448,140);bb(3739360,156592,140);while(1){h=i<<3;j=i<<2;L[h+3707024>>3]=+G[j+p>>2]*.001;L[h+3708480>>3]=+G[j+q>>2]*.001;L[h+3709936>>3]=+G[j+s>>2]*.01;L[h+3711392>>3]=+G[j+y>>2]*.01;i=i+1|0;if((i|0)!=181){continue}break}while(1){i=0;while(1){h=M(n,200)+(i<<3)|0;j=M(n,100)+(i<<2)|0;L[h+3712848>>3]=+G[j+3731600>>2]*.001;L[h+3716656>>3]=+G[j+3733504>>2]*.001;L[h+3720464>>3]=+G[j+3735408>>2]*.01;L[h+3724272>>3]=+G[j+3737312>>2]*.01;i=i+1|0;if((i|0)!=25){continue}break}n=n+1|0;if((n|0)!=19){continue}break}j=0;while(1){i=M(j,56);h=M(j,28);L[i+3728080>>3]=+G[h+3739216>>2]*.001;L[i+3728368>>3]=+G[h+3739360>>2]*.001;L[i+3728088>>3]=+G[h+3739220>>2]*.001;L[i+3728376>>3]=+G[h+3739364>>2]*.001;L[i+3728096>>3]=+G[h+3739224>>2]*.001;L[i+3728384>>3]=+G[h+3739368>>2]*.001;L[i+3728104>>3]=+G[h+3739228>>2]*.001;L[i+3728392>>3]=+G[h+3739372>>2]*.001;L[i+3728112>>3]=+G[h+3739232>>2]*.001;L[i+3728400>>3]=+G[h+3739376>>2]*.001;L[i+3728120>>3]=+G[h+3739236>>2]*.001;L[i+3728408>>3]=+G[h+3739380>>2]*.001;L[i+3728128>>3]=+G[h+3739240>>2]*.001;L[i+3728416>>3]=+G[h+3739384>>2]*.001;j=j+1|0;if((j|0)!=5){continue}break}E[3707e3]=1}G[d>>2]=0;G[d+4>>2]=0;G[e>>2]=0;G[e+4>>2]=0;G[f>>2]=0;G[f+4>>2]=0;G[g>>2]=0;G[g+4>>2]=0;a:{if(O(b)>89.999){break a}if(a<0){while(1){a=a+360;if(a<0){continue}break}}if(a>360){while(1){a=a+-360;if(a>360){continue}break}}i=1;l=91-b;b:{if(O(l)<2147483648){h=~~l;break b}h=-2147483648}h=(h|0)<180?h:180;j=(h|0)>1?h:1;h=j<<3;u=L[h+3711384>>3];k=+(91-j|0);l=+(90-j|0)-k;k=b-k;z=(L[h+3711392>>3]-u)/l*k;v=L[h+3709928>>3];A=(L[h+3709936>>3]-v)/l*k;w=L[h+3708472>>3];B=(L[h+3708480>>3]-w)/l*k;x=L[h+3707016>>3];C=(L[h+3707024>>3]-x)/l*k;h=1;c:{if(b>=80){break c}h=2;if(b>=70){break c}h=3;if(b>=60){break c}h=4;if(b>=50){break c}h=5;if(b>=40){break c}h=6;if(b>=30){break c}h=7;if(b>=20){break c}h=8;if(b>=10){break c}h=9;if(b>=0){break c}h=10;if(b>=-10){break c}h=11;if(b>=-20){break c}h=12;if(b>=-30){break c}h=13;if(b>=-40){break c}h=14;if(b>=-50){break c}h=15;if(b>=-60){break c}h=16;if(b>=-70){break c}h=17;if(b>=-80){break c}h=18;if(b>=-85){break c}h=19}p=h>>>0<18?h:18;q=p-1|0;d:{if(a<=15){break d}i=2;if(a<=30){break d}i=3;if(a<=45){break d}i=4;if(a<=60){break d}i=5;if(a<=75){break d}i=6;if(a<=90){break d}i=7;if(a<=105){break d}i=8;if(a<=120){break d}i=9;if(a<=135){break d}i=10;if(a<=150){break d}i=11;if(a<=165){break d}i=12;if(a<=180){break d}i=13;if(a<=195){break d}i=14;if(a<=210){break d}i=15;if(a<=225){break d}i=16;if(a<=240){break d}i=17;if(a<=255){break d}i=18;if(a<=270){break d}i=19;if(a<=285){break d}i=20;if(a<=300){break d}i=21;if(a<=315){break d}i=22;if(a<=330){break d}i=23;if(a<=345){break d}i=24;if(a<=360){break d}i=25}i=(i>>>0<24?i:24)<<3;j=M(q,200);h=j+3724272|0;r=L[i+h>>3];n=h;h=i-8|0;o=L[n+h>>3];n=M(p,200);s=n+3724272|0;k=L[(q<<3)+145392>>3];l=L[(p<<3)+145392>>3]-k;k=b-k;o=(L[h+s>>3]-o)/l*k+o;t=(L[i+s>>3]-r)/l*k+r-o;m=L[i+145544>>3];r=L[i+145552>>3]-m;a=a-m;t=t/r*a+o;p=j+3720464|0;o=L[p+i>>3];q=n+3720464|0;m=L[h+p>>3];m=(L[q+h>>3]-m)/l*k+m;D=((L[i+q>>3]-o)/l*k+o-m)/r*a+m;p=j+3712848|0;o=L[p+i>>3];q=n+3712848|0;m=L[h+p>>3];m=(L[q+h>>3]-m)/l*k+m;F=((L[i+q>>3]-o)/l*k+o-m)/r*a+m;j=j+3716656|0;o=L[j+i>>3];n=n+3716656|0;m=L[h+j>>3];m=(L[n+h>>3]-m)/l*k+m;k=B+w+(((L[i+n>>3]-o)/l*k+o-m)/r*a+m)+0;a=eb(L[463376]*b);k=k/a;l=(C+x+F+0)/a;r=z+u+t;a=A+v+D;if(!(!(c>0)|c==1950)){c=(c+-1950)*.01;a=r*c+a;l=k*c+l}a=a/3600;e:{if(G[47600]>=0){if(!(O(a+b)>89.999)){break e}break a}if(O(b-a)>89.999){break a}}L[e>>3]=a;L[d>>3]=l*15/3600;L[f>>3]=k;L[g>>3]=r}}function rk(a,b){var 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,A=0,B=0,C=0,D=0,F=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;h=Fa-288|0;Fa=h;d=cb(h,0,81);i=G[b>>2];a:{if((i|0)>0){break a}e=G[a+4>>2];f=e;h=G[f+104>>2];m=G[f+108>>2];g=G[f+132>>2];n=g;t=G[f+128>>2];if((g&t)==-1){f=Cu(h,m);g=(h-f|0)+2880|0;f=m-(Ia+(f>>>0>h>>>0)|0)|0;t=g;G[e+128>>2]=g;f=g>>>0<2880?f+1|0:f;G[e+132>>2]=f;n=f}i=0;u=H[68297];E[d+232|0]=u;e=H[68293]|H[68294]<<8|(H[68295]<<16|H[68296]<<24);p=e;f=H[68289]|H[68290]<<8|(H[68291]<<16|H[68292]<<24);G[d+224>>2]=f;G[d+228>>2]=e;g=H[68285]|H[68286]<<8|(H[68287]<<16|H[68288]<<24);q=g;e=H[68281]|H[68282]<<8|(H[68283]<<16|H[68284]<<24);G[d+216>>2]=e;G[d+220>>2]=g;j=H[68277]|H[68278]<<8|(H[68279]<<16|H[68280]<<24);r=j;g=H[68273]|H[68274]<<8|(H[68275]<<16|H[68276]<<24);G[d+208>>2]=g;G[d+212>>2]=j;k=H[68269]|H[68270]<<8|(H[68271]<<16|H[68272]<<24);s=k;j=H[68265]|H[68266]<<8|(H[68267]<<16|H[68268]<<24);G[d+200>>2]=j;G[d+204>>2]=k;o=H[68261]|H[68262]<<8|(H[68263]<<16|H[68264]<<24);k=H[68257]|H[68258]<<8|(H[68259]<<16|H[68260]<<24);G[d+192>>2]=k;G[d+196>>2]=o;c=d+192|0;c=Va(c)+c|0;E[c|0]=k;v=k>>>8|0;E[c+1|0]=v;w=k>>>16|0;E[c+2|0]=w;x=k>>>24|0;E[c+3|0]=x;E[c+4|0]=o;y=o>>>8|0;E[c+5|0]=y;z=o>>>16|0;E[c+6|0]=z;A=o>>>24|0;E[c+7|0]=A;l=H[68115]|H[68116]<<8|(H[68117]<<16|H[68118]<<24);G[d+112>>2]=H[68111]|H[68112]<<8|(H[68113]<<16|H[68114]<<24);G[d+116>>2]=l;l=H[68123]|H[68124]<<8|(H[68125]<<16|H[68126]<<24);G[d+120>>2]=H[68119]|H[68120]<<8|(H[68121]<<16|H[68122]<<24);G[d+124>>2]=l;l=H[68131]|H[68132]<<8|(H[68133]<<16|H[68134]<<24);G[d+128>>2]=H[68127]|H[68128]<<8|(H[68129]<<16|H[68130]<<24);G[d+132>>2]=l;E[d+136|0]=H[68135];E[c+40|0]=u;E[c+32|0]=f;l=f>>>8|0;E[c+33|0]=l;B=f>>>16|0;E[c+34|0]=B;C=f>>>24|0;E[c+35|0]=C;E[c+36|0]=p;D=p>>>8|0;E[c+37|0]=D;F=p>>>16|0;E[c+38|0]=F;I=p>>>24|0;E[c+39|0]=I;E[c+24|0]=e;J=e>>>8|0;E[c+25|0]=J;K=e>>>16|0;E[c+26|0]=K;L=e>>>24|0;E[c+27|0]=L;E[c+28|0]=q;M=q>>>8|0;E[c+29|0]=M;N=q>>>16|0;E[c+30|0]=N;O=q>>>24|0;E[c+31|0]=O;E[c+16|0]=g;P=g>>>8|0;E[c+17|0]=P;Q=g>>>16|0;E[c+18|0]=Q;R=g>>>24|0;E[c+19|0]=R;E[c+20|0]=r;S=r>>>8|0;E[c+21|0]=S;T=r>>>16|0;E[c+22|0]=T;U=r>>>24|0;E[c+23|0]=U;E[c+8|0]=j;V=j>>>8|0;E[c+9|0]=V;W=j>>>16|0;E[c+10|0]=W;X=j>>>24|0;E[c+11|0]=X;E[c+12|0]=s;Y=s>>>8|0;E[c+13|0]=Y;Z=s>>>16|0;E[c+14|0]=Z;_=s>>>24|0;E[c+15|0]=_;c=H[68099]|H[68100]<<8|(H[68101]<<16|H[68102]<<24);G[d+96>>2]=H[68095]|H[68096]<<8|(H[68097]<<16|H[68098]<<24);G[d+100>>2]=c;c=H[68107]|H[68108]<<8|(H[68109]<<16|H[68110]<<24);G[d+104>>2]=H[68103]|H[68104]<<8|(H[68105]<<16|H[68106]<<24);G[d+108>>2]=c;c=d+96|0;c=Va(c)+c|0;E[c|0]=k;E[c+1|0]=v;E[c+2|0]=w;E[c+3|0]=x;E[c+4|0]=o;E[c+5|0]=y;E[c+6|0]=z;E[c+7|0]=A;E[c+40|0]=u;E[c+32|0]=f;E[c+33|0]=l;E[c+34|0]=B;E[c+35|0]=C;E[c+36|0]=p;E[c+37|0]=D;E[c+38|0]=F;E[c+39|0]=I;E[c+24|0]=e;E[c+25|0]=J;E[c+26|0]=K;E[c+27|0]=L;E[c+28|0]=q;E[c+29|0]=M;E[c+30|0]=N;E[c+31|0]=O;E[c+16|0]=g;E[c+17|0]=P;E[c+18|0]=Q;E[c+19|0]=R;E[c+20|0]=r;E[c+21|0]=S;E[c+22|0]=T;E[c+23|0]=U;E[c+8|0]=j;E[c+9|0]=V;E[c+10|0]=W;E[c+11|0]=X;E[c+12|0]=s;E[c+13|0]=Y;E[c+14|0]=Z;E[c+15|0]=_;G[d+284>>2]=0;Jb(a,h,m,0,d+284|0);b:{c:{f=Bu(t-h|0,n-((h>>>0>t>>>0)+m|0)|0,80,0);d:{if((f|0)>0){while(1){ic(a,80,0,d,d+284|0);if(G[d+284>>2]){break c}e:{if(!fb(d,d+192|0,80)){break e}if(!fb(d,d+96|0,80)){break e}e=0;break d}i=i+1|0;if((f|0)!=(i|0)){continue}break}i=f;e=0;break d}e=G[d+284>>2]!=0}if(e|(f|0)!=(i|0)){break c}e=G[a+4>>2];g=G[e+128>>2];j=g-2880|0;n=h>>>0>j>>>0;e=G[e+132>>2]-(g>>>0<2880)|0;g=n&(e|0)<=(m|0)|(e|0)<(m|0);h=g?h:j;e=g?m:e;g=d+284|0;Jb(a,h,e,0,g);ic(a,80,0,d,g);if(fb(d,d+96|0,80)|G[d+284>>2]){break c}a=G[a+4>>2];G[a+112>>2]=h;G[a+116>>2]=e;break b}e=G[a+4>>2];h=G[e+108>>2];e=G[e+104>>2];Jb(a,e,h,1,b);if((f|0)>0){i=0;while(1){Wb(a,80,0,d+192|0,b);i=i+1|0;if((f|0)!=(i|0)){continue}break}}n=e;f=G[a+4>>2];g=G[f+128>>2];j=g-2880|0;f=G[f+132>>2]-(g>>>0<2880)|0;e=(f|0)<=(h|0)&e>>>0>j>>>0|(f|0)<(h|0);g=e?n:j;h=e?h:f;Jb(a,g,h,0,b);Wb(a,80,0,d+96|0,b);a=G[a+4>>2];G[a+112>>2]=g;G[a+116>>2]=h;i=G[b>>2];if((i|0)<=0){break a}tb(5,47547)}i=G[b>>2]}Fa=d+288|0;return i}function wo(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;d=Fa-96|0;Fa=d;e=G[c>>2];a:{if((e|0)>0){break a}if((a|0)==(b|0)){e=101;G[c>>2]=101;break a}e=G[a>>2];if((e|0)!=G[G[a+4>>2]+76>>2]){mb(a,e+1|0,0,c)}b:{if((Td(a,d+92|0,0,c)|0)<=0){f=G[d+92>>2];g=ab(M(f,81));if(!g){break b}e=0;if((f|0)>0){while(1){f=e+1|0;Sd(a,f,M(e,81)+g|0,c);e=f;if((e|0)>2]){continue}break}}h=G[a>>2];G[d+88>>2]=-1;if(!G[G[a+4>>2]+80>>2]){Ec(a,33788,d+88|0,0,c)}e=G[b>>2];a=G[b+4>>2];if((e|0)!=G[a+76>>2]){mb(b,e+1|0,0,c);a=G[b+4>>2];e=G[a+76>>2]}e=G[a+96>>2]+(e<<3)|0;if(G[a+104>>2]!=G[e>>2]|G[a+108>>2]!=G[e+4>>2]){Ke(b,c)}f=1;c:{if(G[b>>2]){break c}if(G[d+88>>2]>=0){i=1;f=0;break c}pd(b,8,0,d+84|0,c);Ke(b,c);f=1}e=G[c>>2];if((e|0)>0){Wa(g);break a}a=1;d:{if(!(f^1|(h|0)!=0)){e=H[15459]|H[15460]<<8|(H[15461]<<16|H[15462]<<24);G[d+8>>2]=H[15455]|H[15456]<<8|(H[15457]<<16|H[15458]<<24);G[d+12>>2]=e;e=H[15451]|H[15452]<<8|(H[15453]<<16|H[15454]<<24);G[d>>2]=H[15447]|H[15448]<<8|(H[15449]<<16|H[15450]<<24);G[d+4>>2]=e;lc(b,34516,35678,d,c);if(G[d+88>>2]>=-1){while(1){wb(b,M(a,81)+g|0,c);e=(G[d+88>>2]+2|0)>(a|0);a=a+1|0;if(e){continue}break}}F[d+32>>1]=H[6071]|H[6072]<<8;a=H[6067]|H[6068]<<8|(H[6069]<<16|H[6070]<<24);G[d+24>>2]=H[6063]|H[6064]<<8|(H[6065]<<16|H[6066]<<24);G[d+28>>2]=a;a=H[6059]|H[6060]<<8|(H[6061]<<16|H[6062]<<24);G[d+16>>2]=H[6055]|H[6056]<<8|(H[6057]<<16|H[6058]<<24);G[d+20>>2]=a;a=H[6051]|H[6052]<<8|(H[6053]<<16|H[6054]<<24);G[d+8>>2]=H[6047]|H[6048]<<8|(H[6049]<<16|H[6050]<<24);G[d+12>>2]=a;a=H[6043]|H[6044]<<8|(H[6045]<<16|H[6046]<<24);G[d>>2]=H[6039]|H[6040]<<8|(H[6041]<<16|H[6042]<<24);G[d+4>>2]=a;hd(b,33303,0,0,d,c);a=H[6512]|H[6513]<<8|(H[6514]<<16|H[6515]<<24);G[d+16>>2]=H[6508]|H[6509]<<8|(H[6510]<<16|H[6511]<<24);G[d+20>>2]=a;a=H[6504]|H[6505]<<8|(H[6506]<<16|H[6507]<<24);G[d+8>>2]=H[6500]|H[6501]<<8|(H[6502]<<16|H[6503]<<24);G[d+12>>2]=a;a=H[6496]|H[6497]<<8|(H[6498]<<16|H[6499]<<24);G[d>>2]=H[6492]|H[6493]<<8|(H[6494]<<16|H[6495]<<24);G[d+4>>2]=a;hd(b,33311,1,0,d,c);a=G[d+88>>2]+3|0;e=G[d+92>>2];if((a|0)>=(e|0)){break d}while(1){e:{f:{g:{h:{f=M(a,81)+g|0;switch(H[f|0]-67|0){case 0:break g;case 2:break h;default:break f}}if(fb(f,67980,8)){break f}break e}if(!fb(f,7011,58)){break e}if(!fb(f,40528,47)){break e}}wb(b,f,c);e=G[d+92>>2]}a=a+1|0;if((e|0)>(a|0)){continue}break}break d}if(!((h|0)!=0&i)){a=0;if(G[d+92>>2]<=0){break d}while(1){wb(b,M(a,81)+g|0,c);a=a+1|0;if((a|0)>2]){continue}break}break d}e=H[26031]|H[26032]<<8|(H[26033]<<16|H[26034]<<24);E[d+31|0]=e;E[d+32|0]=e>>>8;E[d+33|0]=e>>>16;E[d+34|0]=e>>>24;e=H[26028]|H[26029]<<8|(H[26030]<<16|H[26031]<<24);G[d+24>>2]=H[26024]|H[26025]<<8|(H[26026]<<16|H[26027]<<24);G[d+28>>2]=e;e=H[26020]|H[26021]<<8|(H[26022]<<16|H[26023]<<24);G[d+16>>2]=H[26016]|H[26017]<<8|(H[26018]<<16|H[26019]<<24);G[d+20>>2]=e;e=H[26012]|H[26013]<<8|(H[26014]<<16|H[26015]<<24);G[d+8>>2]=H[26008]|H[26009]<<8|(H[26010]<<16|H[26011]<<24);G[d+12>>2]=e;e=H[26004]|H[26005]<<8|(H[26006]<<16|H[26007]<<24);G[d>>2]=H[26e3]|H[26001]<<8|(H[26002]<<16|H[26003]<<24);G[d+4>>2]=e;Rg(b,35530,1,d,c);if(G[d+88>>2]>=-1){while(1){wb(b,M(a,81)+g|0,c);e=(G[d+88>>2]+2|0)>(a|0);a=a+1|0;if(e){continue}break}}G[d+32>>2]=H[6580]|H[6581]<<8|(H[6582]<<16|H[6583]<<24);a=H[6576]|H[6577]<<8|(H[6578]<<16|H[6579]<<24);G[d+24>>2]=H[6572]|H[6573]<<8|(H[6574]<<16|H[6575]<<24);G[d+28>>2]=a;a=H[6568]|H[6569]<<8|(H[6570]<<16|H[6571]<<24);G[d+16>>2]=H[6564]|H[6565]<<8|(H[6566]<<16|H[6567]<<24);G[d+20>>2]=a;a=H[6560]|H[6561]<<8|(H[6562]<<16|H[6563]<<24);G[d+8>>2]=H[6556]|H[6557]<<8|(H[6558]<<16|H[6559]<<24);G[d+12>>2]=a;a=H[6552]|H[6553]<<8|(H[6554]<<16|H[6555]<<24);G[d>>2]=H[6548]|H[6549]<<8|(H[6550]<<16|H[6551]<<24);G[d+4>>2]=a;Rg(b,35787,1,d,c);wb(b,3277,c);wb(b,34961,c);a=G[d+88>>2]+3|0;e=G[d+92>>2];if((a|0)>=(e|0)){break d}while(1){i:{j:{k:{l:{f=M(a,81)+g|0;switch(H[f|0]-71|0){case 0:break k;case 9:break l;default:break j}}if(fb(f,67895,8)){break j}break i}if(!fb(f,67904,8)){break i}}wb(b,f,c);e=G[d+92>>2]}a=a+1|0;if((e|0)>(a|0)){continue}break}}Wa(g)}e=G[c>>2];break a}e=113;G[c>>2]=113}Fa=d+96|0;return e}function Jr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,F=0,H=0,I=0,J=0,K=0,N=0,O=0,P=0;f=Fa-160|0;Fa=f;if(G[c+4>>2]!=803){G[c+1892>>2]=107;G[c+1888>>2]=108;E[c|0]=84;E[c+1|0]=79;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=35;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0}if(a<0){while(1){a=a+360;if(a<0){continue}break}}if(a>=360){while(1){a=a+-360;if(a>=360){continue}break}}j=90;a:{if(b>90){break a}j=b;if(!(b<-90)){break a}j=-90}j=j*.017453292519943295;t=eb(j);b=a*.017453292519943295;h=ib(b);g=eb(b);w=ib(j);b:{if(a<90){G[f+48>>2]=0;G[f+52>>2]=0;G[f+128>>2]=0;G[f+132>>2]=0;G[f+88>>2]=0;G[f+92>>2]=-1068072960;G[f+80>>2]=0;G[f+84>>2]=0;G[f+8>>2]=0;G[f+12>>2]=1079410688;G[f>>2]=0;G[f+4>>2]=0;G[f+40>>2]=0;G[f+44>>2]=0;G[f+120>>2]=0;G[f+124>>2]=1079410688;c=1;j=0;b=1.5707963267948966;q=1.5707963267948966;a=-1.5707963267948966;break b}c:{if(a<180){G[f+128>>2]=0;G[f+132>>2]=-1068072960;G[f+88>>2]=0;G[f+92>>2]=0;G[f+48>>2]=0;G[f+52>>2]=1079410688;G[f+120>>2]=0;G[f+124>>2]=0;G[f+80>>2]=0;G[f+84>>2]=1079410688;G[f+40>>2]=0;G[f+44>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[f>>2]=0;G[f+4>>2]=1080459264;c=0;r=3.141592653589793;l=1.5707963267948966;j=-1.5707963267948966;k=1.5707963267948966;b=0;break c}if(a<270){G[f+128>>2]=0;G[f+132>>2]=0;G[f+88>>2]=0;G[f+92>>2]=1079410688;G[f+48>>2]=0;G[f+52>>2]=0;G[f+120>>2]=0;G[f+124>>2]=1080459264;G[f+80>>2]=0;G[f+84>>2]=0;G[f+40>>2]=0;G[f+44>>2]=1081139200;G[f+8>>2]=0;G[f+12>>2]=-1068072960;G[f>>2]=0;G[f+4>>2]=0;c=1;i=4.71238898038469;j=0;b=3.141592653589793;q=-1.5707963267948966;a=1.5707963267948966;break b}G[f+48>>2]=0;G[f+52>>2]=-1068072960;G[f+88>>2]=0;G[f+92>>2]=0;G[f+128>>2]=0;G[f+132>>2]=1079410688;G[f+120>>2]=0;G[f+124>>2]=0;G[f+40>>2]=0;G[f+44>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[f>>2]=0;G[f+4>>2]=1081139200;G[f+80>>2]=0;G[f+84>>2]=0;c=0;r=4.71238898038469;k=-1.5707963267948966;j=1.5707963267948966;b=0}a=0}x=h*t;y=g*t;O=f,P=ib(j),L[O+152>>3]=P;O=f,P=ib(a),L[O+112>>3]=P;O=f,P=ib(k),L[O+72>>3]=P;j=eb(j);O=f,P=j*ib(b),L[O+144>>3]=P;O=f,P=j*eb(b),L[O+136>>3]=P;a=eb(a);O=f,P=a*ib(l),L[O+104>>3]=P;O=f,P=a*eb(l),L[O+96>>3]=P;a=eb(k);O=f- -64|0,P=a*ib(i),L[O>>3]=P;O=f,P=a*eb(i),L[O+56>>3]=P;O=f,P=ib(q),L[O+32>>3]=P;a=eb(q);O=f,P=a*ib(r),L[O+24>>3]=P;O=f,P=a*eb(r),L[O+16>>3]=P;J=1;while(1){q=L[f+32>>3];j=L[f+152>>3];m=q+j;r=L[f+16>>3];b=L[f+136>>3];t=r+b;k=L[f+24>>3];h=L[f+144>>3];l=k+h;a=V(m*m+(t*t+l*l));u=a==0?1:a;K=M(c,40)+f|0;v=(c+2|0)%4|0;N=M(v,40)+f|0;a=L[K+16>>3]+L[N+16>>3];s=a;i=L[K+32>>3]+L[N+32>>3];g=L[K+24>>3]+L[N+24>>3];a=V(i*i+(a*a+g*g));a=a==0?1:a;n=s/a;z=l/u;o=g/a;A=t/u;B=m/u;p=i/a;u=(n*z-o*A)*w+((o*B-p*z)*y+x*(A*p-n*B));g=L[f+112>>3];l=g+j;j=L[f+96>>3];i=j+b;b=L[f+104>>3];h=b+h;a=V(l*l+(i*i+h*h));a=a==0?1:a;C=l/a;D=h/a;F=i/a;t=(o*C-p*D)*y+x*(F*p-n*C);l=(n*D-o*F)*w;i=L[f+72>>3];m=i+g;h=L[f+56>>3];j=h+j;g=L[f+64>>3];b=g+b;a=V(m*m+(j*j+b*b));a=a==0?1:a;H=b/a;I=m/a;m=j/a;j=(H*p-I*o)*y+x*(I*n-m*p);b=(m*o-H*n)*w;i=i+q;h=h+r;g=g+k;a=V(i*i+(h*h+g*g));k=a==0?1:a;q=h/k;r=g/k;a=q*o-r*n;s=a;k=i/k;h=r*p-k*o;i=k*n-q*p;a=V(a*a+(h*h+i*i));g=a==0?1:a;a=s/g;s=a;h=h/g;i=i/g;a=V(a*a+(h*h+i*i));g=a==0?1:a;a=s/g;s=a;h=h/g;i=i/g;a=V(a*a+(h*h+i*i));g=a==0?1:a;a=s/g;s=a;h=h/g;g=i/g;a=V(a*a+(h*h+g*g));a=a==0?1:a;a=s/a*w+(h/a*y+x*(g/a));if(!(!(a>=0)|!(u>=0))){L[f+152>>3]=B;L[f+144>>3]=z;L[f+136>>3]=A;L[f+112>>3]=p;L[f+104>>3]=o;L[f+96>>3]=n;L[f+72>>3]=k;L[f+64>>3]=r;L[f+56>>3]=q;c=(c|0)!=0&(v|0)!=0}g=l+t;b=b+j;if(!(!(a<0)|!(b>=0))){L[f+152>>3]=p;L[f+144>>3]=o;L[f+136>>3]=n;L[f+112>>3]=I;L[f+104>>3]=H;L[f+96>>3]=m;L[f+32>>3]=k;L[f+24>>3]=r;L[f+16>>3]=q;c=(c|0)==1|(v|0)==1}if(!(!(g>=0)|!(u<0))){L[f+112>>3]=C;L[f+104>>3]=D;L[f+96>>3]=F;L[f+72>>3]=p;L[f+64>>3]=o;L[f+56>>3]=n;L[f+32>>3]=B;L[f+24>>3]=z;L[f+16>>3]=A;c=(c|0)==3?3:(v|0)==3?3:0}if(!(!(g<0)|!(b<0))){L[f+152>>3]=C;L[f+144>>3]=D;L[f+136>>3]=F;L[f+72>>3]=I;L[f+64>>3]=H;L[f+56>>3]=m;L[f+32>>3]=p;L[f+24>>3]=o;L[f+16>>3]=n;c=(c|0)==2?2:(v|0)==2?2:1}J=J+1|0;if((J|0)!=27){continue}break}L[d>>3]=L[d>>3]+1;L[e>>3]=L[e>>3]+1;Fa=f+160|0;return 0}function Fl(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0;c=Fa-4144|0;Fa=c;G[947121]=0;E[3805456]=0;b=1;e=Xb(Va(3780288)+1|0);Yb(3780288,e);a:{b:{switch(H[e|0]-33|0){case 10:b=4;G[951365]=4;d=e+1|0;break a;case 12:G[951365]=1;d=e+1|0;break a;case 0:b=2;G[951365]=2;d=e+1|0;break a;default:break b}}b=4;G[951365]=4;d=e}Za(3796768,d);a=G[950330];if(!a){Lb();a=G[950330]}a=G[(G[950332]+(a<<2)|0)-4>>2];G[a+4>>2]=G[a+4>>2]|b;a=jb(3796768,40);if(a){E[a|0]=0;d=1}else{d=0}G[950216]=d;Rl(3796768);Yb(3796768,e);Za(3796768,e);c:{d:{if(!nb(3796768,15735,3)){G[949192]=1970171489;G[949193]=7566700;b=1;break d}if(!nb(3796768,3720,3)){G[949192]=7892834;b=2;break d}b=3;if(!nb(3796768,10939,3)){a=H[22634]|H[22635]<<8|(H[22636]<<16|H[22637]<<24);E[3796771]=a;E[3796772]=a>>>8;E[3796773]=a>>>16;E[3796774]=a>>>24;G[949192]=H[22631]|H[22632]<<8|(H[22633]<<16|H[22634]<<24);break d}if(!nb(3796768,16766,3)){G[949192]=1768713317;G[949193]=6648688;b=4;break d}if(!nb(3796768,23671,3)){F[1898386]=H[26857]|H[26858]<<8;G[949192]=H[26853]|H[26854]<<8|(H[26855]<<16|H[26856]<<24);b=5;break d}if(!nb(3796768,15932,3)){E[3796772]=H[21334];G[949192]=H[21330]|H[21331]<<8|(H[21332]<<16|H[21333]<<24);b=6;break d}if(!nb(3796768,16003,3)){F[1898386]=H[31653]|H[31654]<<8;G[949192]=H[31649]|H[31650]<<8|(H[31651]<<16|H[31652]<<24);b=7;break d}if(!nb(3796768,31039,3)){a=H[31651]|H[31652]<<8|(H[31653]<<16|H[31654]<<24);E[3796771]=a;E[3796772]=a>>>8;E[3796773]=a>>>16;E[3796774]=a>>>24;G[949192]=H[31648]|H[31649]<<8|(H[31650]<<16|H[31651]<<24);b=8;break d}if(!nb(3796768,31035,3)){a=H[31644]|H[31645]<<8|(H[31646]<<16|H[31647]<<24);E[3796771]=a;E[3796772]=a>>>8;E[3796773]=a>>>16;E[3796774]=a>>>24;G[949192]=H[31641]|H[31642]<<8|(H[31643]<<16|H[31644]<<24);b=9;break d}if(!nb(3796768,31031,3)){a=H[31637]|H[31638]<<8|(H[31639]<<16|H[31640]<<24);E[3796771]=a;E[3796772]=a>>>8;E[3796773]=a>>>16;E[3796774]=a>>>24;G[949192]=H[31634]|H[31635]<<8|(H[31636]<<16|H[31637]<<24);b=10;break d}if(!nb(3796768,23667,3)){G[949192]=6646128;b=11;break d}if(!nb(3796768,13354,3)){F[1898386]=H[23669]|H[23670]<<8;G[949192]=H[23665]|H[23666]<<8|(H[23667]<<16|H[23668]<<24);b=11;break d}if(!nb(3796768,17346,3)){F[1898386]=H[4714]|H[4715]<<8;G[949192]=H[4710]|H[4711]<<8|(H[4712]<<16|H[4713]<<24);b=12;break d}if(nb(3796768,16721,3)){break c}G[949192]=2037149552;G[949193]=7237479;b=13}G[948156]=b}a=G[G[950220]+104>>2];if(!(!a|!H[a|0])){if(!G[950330]){Lb()}d=a;a=Xb(Va(a)+1|0);Yb(d,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}if(!G[950330]){Lb()}a=Xb(3);Yb(16241,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];G[a+48>>2]=0;f=a,g=Va(G[a+24>>2]),G[f+28>>2]=g;a=G[950220];if(a){b=G[a+152>>2];if(b){d=Ja[b|0](a,3796768)|0}else{d=3796768}}else{d=0}Te(d);if(!G[950330]){Lb()}a=Xb(8);Yb(48929,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);e:{f:{g:{h:{switch(G[951365]-1|0){case 3:G[c>>2]=4;Ya(c+48|0,4096,30095,c);if(!H[c+48|0]){break e}if(!G[950330]){break g}break f;case 1:G[c+16>>2]=2;Ya(c+48|0,4096,30100,c+16|0);if(!H[c+48|0]){break e}if(!G[950330]){break g}break f;case 0:break h;default:break e}}G[c+32>>2]=1;Ya(c+48|0,4096,30100,c+32|0);if(!H[c+48|0]){break e}if(G[950330]){break f}}Lb()}b=c+48|0;a=Xb(Va(b)+1|0);Yb(b,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}if(!G[950330]){Lb()}a=Xb(2);Yb(49008,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);if(G[G[950220]+4>>2]==1){if(!G[950330]){Lb()}a=Xb(9);Yb(60969,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}if(!G[950330]){Lb()}a=Xb(2);Yb(3870,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);if(!G[950330]){Lb()}a=Xb(2);Yb(49008,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);if(G[G[950220]+4>>2]==1){if(!G[950330]){Lb()}a=Xb(9);Yb(60969,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}if(!G[950330]){Lb()}a=Xb(2);Yb(3696,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a);pb(e);Fa=c+4144|0}function Cb(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=Fa-192|0;Fa=g;h=G[f>>2];if((h|0)<=0){a:{b:{switch(b-11|0){case 5:E[g+16|0]=0;c:{if(e){E[e|0]=0;if(G[f>>2]>0){break c}}if((kc(a,c,g+96|0,f)|0)>0){break c}mc(g+96|0,g+16|0,e,f)}E[d|0]=0;fd(g+16|0,d,f);break a;case 0:E[g+16|0]=0;d:{if(e){E[e|0]=0;if(G[f>>2]>0){break d}}if((kc(a,c,g+96|0,f)|0)>0){break d}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}a=G[g+12>>2];b=G[g+8>>2];if(!a&b>>>0>=256|a){G[f>>2]=412;break a}E[d|0]=b;break a;case 1:E[g+16|0]=0;e:{if(e){E[e|0]=0;if(G[f>>2]>0){break e}}if((kc(a,c,g+96|0,f)|0)>0){break e}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}b=G[g+8>>2];a=G[g+12>>2]-(b>>>0<128)|0;c=b-128|0;if((a|0)==-1&c>>>0<=4294967039|(a|0)!=-1){G[f>>2]=412;break a}E[d|0]=b;break a;case 9:E[g+16|0]=0;f:{if(e){E[e|0]=0;if(G[f>>2]>0){break f}}if((kc(a,c,g+96|0,f)|0)>0){break f}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}a=G[g+12>>2];b=G[g+8>>2];if(!a&b>>>0>=65536|a){G[f>>2]=412;break a}F[d>>1]=b;break a;case 10:E[g+16|0]=0;g:{if(e){E[e|0]=0;if(G[f>>2]>0){break g}}if((kc(a,c,g+96|0,f)|0)>0){break g}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}b=G[g+8>>2];a=G[g+12>>2]-(b>>>0<32768)|0;c=b-32768|0;if((a|0)==-1&c>>>0<=4294901759|(a|0)!=-1){G[f>>2]=412;break a}F[d>>1]=b;break a;case 19:E[g+16|0]=0;h:{if(e){E[e|0]=0;if(G[f>>2]>0){break h}}if((kc(a,c,g+96|0,f)|0)>0){break h}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}G[f>>2]=412;break a;case 20:E[g+16|0]=0;i:{if(e){E[e|0]=0;if(G[f>>2]>0){break i}}if((kc(a,c,g+96|0,f)|0)>0){break i}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}b=G[g+8>>2];a=G[g+12>>2]-(b>>>0<2147483648)|0;if((a|0)==-2|a>>>0<4294967294){G[f>>2]=412;break a}G[d>>2]=b;break a;case 3:E[g+16|0]=0;j:{if(e){E[e|0]=0;if(G[f>>2]>0){break j}}if((kc(a,c,g+96|0,f)|0)>0){break j}mc(g+96|0,g+16|0,e,f)}Wn(g+16|0,d,f);break a;case 29:E[g+16|0]=0;k:{if(e){E[e|0]=0;if(G[f>>2]>0){break k}}if((kc(a,c,g+96|0,f)|0)>0){break k}mc(g+96|0,g+16|0,e,f)}Xn(g+16|0,g+96|0,f);if(G[f>>2]>0){break a}b=G[g+96>>2];a=G[g+100>>2];if((a|0)==1|a>>>0>1){G[f>>2]=412;break a}G[d>>2]=b;break a;case 30:E[g+16|0]=0;l:{if(e){E[e|0]=0;if(G[f>>2]>0){break l}}if((kc(a,c,g+96|0,f)|0)>0){break l}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,g+8|0,f);if(G[f>>2]>0){break a}h=G[g+8>>2];b=G[g+12>>2]-(h>>>0<2147483648)|0;if((b|0)==-2|b>>>0<4294967294){G[f>>2]=412;break a}G[d>>2]=h;if(G[f>>2]>0){break a}E[g+16|0]=0;m:{if(e){E[e|0]=0;if(G[f>>2]>0){break m}}if((kc(a,c,g+96|0,f)|0)>0){break m}mc(g+96|0,g+16|0,e,f)}lk(g+16|0,d,f);break a;case 69:E[g+16|0]=0;n:{if(e){E[e|0]=0;if(G[f>>2]>0){break n}}if((kc(a,c,g+96|0,f)|0)>0){break n}mc(g+96|0,g+16|0,e,f)}Xn(g+16|0,d,f);break a;case 70:E[g+16|0]=0;o:{if(e){E[e|0]=0;if(G[f>>2]>0){break o}}if((kc(a,c,g+96|0,f)|0)>0){break o}mc(g+96|0,g+16|0,e,f)}Ie(g+16|0,d,f);break a;case 31:E[g+16|0]=0;p:{if(e){E[e|0]=0;if(G[f>>2]>0){break p}}if((kc(a,c,g+96|0,f)|0)>0){break p}mc(g+96|0,g+16|0,e,f)}kk(g+16|0,d,f);break a;case 71:E[g+16|0]=0;q:{if(e){E[e|0]=0;if(G[f>>2]>0){break q}}if((kc(a,c,g+96|0,f)|0)>0){break q}mc(g+96|0,g+16|0,e,f)}wi(g+16|0,d,f);break a;case 72:b=Fa-192|0;Fa=b;r:{if(G[f>>2]>0){break r}E[b+16|0]=0;s:{t:{if(e){E[e|0]=0;if(G[f>>2]>0){break t}}if((kc(a,c,b+96|0,f)|0)>0){break t}mc(b+96|0,b+16|0,e,f);if(H[b+16|0]==40){break s}}G[b>>2]=c;a=b+96|0;Ya(a,81,39915,b);Ua(a);Ua(b+16|0);G[f>>2]=408;break r}E[b+16|0]=32;a=b+16|0;i=qc(a,64244)+a|0,j=0,E[i|0]=j;c=qc(a,49008)+a|0;E[c|0]=0;kk(a,d,f);kk(c+1|0,d+4|0,f)}Fa=b+192|0;break a;case 152:b=Fa-192|0;Fa=b;u:{if(G[f>>2]>0){break u}E[b+16|0]=0;v:{w:{if(e){E[e|0]=0;if(G[f>>2]>0){break w}}if((kc(a,c,b+96|0,f)|0)>0){break w}mc(b+96|0,b+16|0,e,f);if(H[b+16|0]==40){break v}}G[b>>2]=c;a=b+96|0;Ya(a,81,39864,b);Ua(a);Ua(b+16|0);G[f>>2]=409;break u}E[b+16|0]=32;a=b+16|0;i=qc(a,64244)+a|0,j=0,E[i|0]=j;c=qc(a,49008)+a|0;E[c|0]=0;wi(a,d,f);wi(c+1|0,d+8|0,f)}Fa=b+192|0;break a;default:break b}}G[f>>2]=410}h=G[f>>2]}Fa=g+192|0;return h|0}function _s(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|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;a:{if((c|0)!=1){break a}bb(1238296,g,168);G[309616]=G[309614];G[309565]=G[f+88>>2];c=G[309576];b:{if((c|0)<2){break b}G[309566]=G[f+332>>2];G[309570]=G[309582];c=G[309576];if((c|0)<3){break b}G[309567]=G[f+576>>2];G[309571]=M(G[309583],G[309570]);c=G[309576];if((c|0)<4){break b}G[309568]=G[f+820>>2];G[309572]=M(G[309584],G[309571]);c=G[309576]}if((c|0)>=(e|0)){break a}G[309569]=G[(M(c,244)+f|0)+88>>2]}if((d|0)>0){f=G[309569];l=G[309572];m=G[309568];n=G[309571];o=G[309567];p=G[309570];q=G[309566];r=G[309565];c=G[309616];g=1;while(1){a=g;g=0;c:{if(c){b=H[c|0];g=c+1|0;G[309616]=g;c=g;if(!b){break c}}c=g;e=a<<3;h=L[e+r>>3];if(h==-91191291391491e-49){break c}h=(h-L[154793])/L[154801];k=h+1;d:{if(O(k)<2147483648){g=~~k;break d}g=-2147483648}if((g|0)<=0|G[309582]<(g|0)|h>L[154797]){break c}i=G[309576];e:{if((i|0)<2){break e}h=L[e+q>>3];if(h==-91191291391491e-49){break c}h=(h-L[154794])/L[154802];j=h<0;if(O(h)<2147483648){b=~~h}else{b=-2147483648}if((b|0)>=G[309583]|h>L[154798]|j){break c}g=M(b,p)+g|0;if(i>>>0<3){break e}h=L[e+o>>3];if(h==-91191291391491e-49){break c}h=(h-L[154795])/L[154803];j=h<0;if(O(h)<2147483648){b=~~h}else{b=-2147483648}if((b|0)>=G[309584]|h>L[154799]|j){break c}g=M(b,n)+g|0;if(i>>>0<4){break e}h=L[e+m>>3];if(h==-91191291391491e-49){break c}h=(h-L[154796])/L[154804];i=h<0;if(O(h)<2147483648){b=~~h}else{b=-2147483648}if((b|0)>=G[309585]|h>L[154800]|i){break c}g=M(b,l)+g|0}h=L[154806];if(h!=-91191291391491e-49){f:{g:{h:{i:{j:{b=G[309581];switch(b-11|0){case 0:break f;case 31:break g;case 10:break h;case 20:break i;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:break c;default:break j}}if((b|0)!=82){break c}b=G[309574]+(g<<3)|0;L[b>>3]=h+L[b>>3];break c}b=G[309574]+(g<<2)|0;g=G[b>>2];if(O(h)<2147483648){e=~~h}else{e=-2147483648}G[b>>2]=e+g;break c}b=G[309574]+(g<<1)|0;g=I[b>>1];if(O(h)<2147483648){e=~~h}else{e=-2147483648}F[b>>1]=e+g;break c}b=G[309574]+(g<<2)|0;K[b>>2]=h+ +K[b>>2];break c}b=G[309574]+g|0;g=H[b|0];if(O(h)<2147483648){e=~~h}else{e=-2147483648}E[b|0]=e+g;break c}b=G[309581];if(G[309610]){k:{switch(b-11|0){default:if((b|0)!=82){break c}b=G[309574]+(g<<3)|0;L[b>>3]=1/L[e+f>>3]+L[b>>3];break c;case 20:b=G[309574]+(g<<2)|0;g=G[b>>2];h=1/L[e+f>>3];l:{if(O(h)<2147483648){e=~~h;break l}e=-2147483648}G[b>>2]=e+g;break c;case 10:b=G[309574]+(g<<1)|0;g=I[b>>1];h=1/L[e+f>>3];m:{if(O(h)<2147483648){e=~~h;break m}e=-2147483648}F[b>>1]=e+g;break c;case 31:b=G[309574]+(g<<2)|0;K[b>>2]=K[b>>2]+N(1/L[e+f>>3]);break c;case 0:break k;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:break c}}b=G[309574]+g|0;g=H[b|0];h=1/L[e+f>>3];n:{if(O(h)<2147483648){e=~~h;break n}e=-2147483648}E[b|0]=e+g;break c}o:{switch(b-11|0){default:if((b|0)!=82){break c}b=G[309574]+(g<<3)|0;L[b>>3]=L[e+f>>3]+L[b>>3];break c;case 20:b=G[309574]+(g<<2)|0;g=G[b>>2];h=L[e+f>>3];p:{if(O(h)<2147483648){e=~~h;break p}e=-2147483648}G[b>>2]=e+g;break c;case 10:b=G[309574]+(g<<1)|0;g=I[b>>1];h=L[e+f>>3];q:{if(O(h)<2147483648){e=~~h;break q}e=-2147483648}F[b>>1]=e+g;break c;case 31:b=G[309574]+(g<<2)|0;K[b>>2]=L[e+f>>3]+ +K[b>>2];break c;case 0:break o;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:break c}}b=G[309574]+g|0;g=H[b|0];h=L[e+f>>3];r:{if(O(h)<2147483648){e=~~h;break r}e=-2147483648}E[b|0]=e+g}g=a+1|0;if((a|0)!=(d|0)){continue}break}}return 0}function Pl(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;c=Fa-864|0;Fa=c;G[c+460>>2]=0;g=G[29763];d=g;a:{if(!Rc(c+860|0,a,0,c+460|0)){d=g;b:{if(!b|!H[b|0]){break b}d=ac(b,4017);if(d){break b}G[c+352>>2]=b;_a(G[24367],69497,c+352|0);break a}mb(G[c+860>>2],1,c+452|0,c+460|0);G[c+456>>2]=G[G[c+860>>2]>>2]+1;G[c+456>>2]=G[c+456>>2]-1;Ub(91,d);c:{if(G[c+460>>2]){break c}while(1){Ub(123,d);a=c+460|0;Dc(G[c+860>>2],c+452|0,a);G[c+336>>2]=G[c+456>>2];_a(d,30059,c+336|0);Cb(G[c+860>>2],16,35480,c+784|0,0,a);if(!G[c+460>>2]){G[c+320>>2]=c+784;_a(d,65529,c+320|0)}G[c+460>>2]=0;a=G[c+860>>2];d:{if(!G[c+452>>2]){mh(a,10,c+448|0,c+444|0,c+384|0,c+460|0);G[c+240>>2]=G[c+444>>2];_a(d,30068,c+240|0);hb(32644,10,1,d);e:{if(G[c+444>>2]<=0){break e}G[c+224>>2]=G[c+384>>2];_a(d,27698,c+224|0);a=1;if(G[c+444>>2]<2){break e}while(1){Ub(44,d);G[c+208>>2]=G[(c+384|0)+(a<<2)>>2];_a(d,27698,c+208|0);a=a+1|0;if((a|0)>2]){continue}break}}Ub(93,d);G[c+192>>2]=G[c+448>>2];_a(d,30046,c+192|0);a=1;while(1){G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(35417,a,b,e);Cb(G[c+860>>2],16,b,c+624|0,0,e);if(!G[c+436>>2]){G[c+180>>2]=c+624;G[c+176>>2]=c+544;_a(d,65493,c+176|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(33363,a,b,e);Cb(G[c+860>>2],16,b,c+624|0,0,e);if(!G[c+436>>2]){G[c+164>>2]=c+624;G[c+160>>2]=c+544;_a(d,65493,c+160|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(32948,a,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+152>>3]=L[c+368>>3];G[c+144>>2]=c+544;xb(d,19664,c+144|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(34813,a,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+136>>3]=L[c+368>>3];G[c+128>>2]=c+544;xb(d,19664,c+128|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(33351,a,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+120>>3]=L[c+368>>3];G[c+112>>2]=c+544;xb(d,19664,c+112|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(35922,a,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+104>>3]=L[c+368>>3];G[c+96>>2]=c+544;xb(d,19664,c+96|0)}G[c+80>>2]=a;G[c+436>>2]=0;b=c+464|0;Ya(b,75,31909,c+80|0);f=b;b=c+544|0;e=c+436|0;zb(f,1,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+72>>3]=L[c+368>>3];G[c+64>>2]=c+544;xb(d,19664,c- -64|0)}G[c+48>>2]=a;G[c+436>>2]=0;b=c+464|0;Ya(b,75,31909,c+48|0);f=b;b=c+544|0;e=c+436|0;zb(f,2,b,e);Cb(G[c+860>>2],82,b,c+368|0,0,e);if(!G[c+436>>2]){L[c+40>>3]=L[c+368>>3];G[c+32>>2]=c+544;xb(d,19664,c+32|0)}a=a+1|0;if((a|0)!=3){continue}break}G[c+436>>2]=0;a=H[33588]|H[33589]<<8|(H[33590]<<16|H[33591]<<24);G[c+544>>2]=H[33584]|H[33585]<<8|(H[33586]<<16|H[33587]<<24);G[c+548>>2]=a;E[c+552|0]=H[33592];Cb(G[c+860>>2],16,c+544|0,c+624|0,0,c+436|0);if(!G[c+436>>2]){G[c+20>>2]=c+624;G[c+16>>2]=c+544;_a(d,65493,c+16|0)}G[c+544>>2]=1230328133;G[c+548>>2]=5787470;G[c+436>>2]=0;Cb(G[c+860>>2],16,c+544|0,c+624|0,0,c+436|0);if(G[c+436>>2]){break d}G[c+4>>2]=c+624;G[c>>2]=c+544;_a(d,65493,c);break d}b=a;a=c+460|0;zi(b,c+380|0,a);pk(G[c+860>>2],c+440|0,a);a=1;hb(G[c+452>>2]==1?65548:65571,15,1,d);G[c+304>>2]=G[c+380>>2];_a(d,26864,c+304|0);hb(32634,9,1,d);if(G[c+440>>2]>0){while(1){b=c+544|0;e=c+460|0;zb(35402,a,b,e);f=c+784|0;Cb(G[c+860>>2],16,b,f,0,e);zb(34641,a,b,e);h=c+704|0;Cb(G[c+860>>2],16,b,h,0,e);G[c+292>>2]=h;G[c+288>>2]=f;_a(d,65504,c+288|0);G[c+436>>2]=0;e=c+436|0;zb(34547,a,b,e);Cb(G[c+860>>2],16,b,c+624|0,0,e);if(!G[c+436>>2]){G[c+272>>2]=c+624;_a(d,8768,c+272|0)}G[c+436>>2]=0;b=c+544|0;e=c+436|0;zb(33036,a,b,e);Cb(G[c+860>>2],16,b,c+624|0,0,e);if(!G[c+436>>2]){G[c+256>>2]=c+624;_a(d,8758,c+256|0)}Ub(125,d);if(G[c+440>>2]!=(a|0)){Ub(44,d);b=G[c+440>>2]}else{b=a}b=(b|0)>(a|0);a=a+1|0;if(b){continue}break}}Ub(93,d)}Ub(125,d);xi(G[c+860>>2],0,c+460|0);if(G[c+460>>2]){G[c+456>>2]=G[c+456>>2]+1;break c}Ub(44,d);G[c+456>>2]=G[c+456>>2]+1;if(!G[c+460>>2]){continue}break}}Ub(93,d);if(G[c+460>>2]==107){G[c+460>>2]=0}Qb(G[c+860>>2],c+460|0)}a=G[c+460>>2];if(a){wf(G[24367],a)}f:{if((d|0)==(g|0)){$a(g);break f}Hb(d)}}Fa=c+864|0}function Pk(a,b,c,d,e,f){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;i=Fa+-64|0;G[i+48>>2]=0;G[i+52>>2]=0;G[i+56>>2]=0;G[i+60>>2]=0;G[i+32>>2]=0;G[i+36>>2]=0;G[i+40>>2]=0;G[i+44>>2]=0;a:{b:{c:{d:{e:{if(c){if(c-1>>>0>=3){n=c&-4;while(1){m=i+32|0;l=k<<1;h=m+(I[l+b>>1]<<1)|0;F[h>>1]=I[h>>1]+1;h=m+(I[(l|2)+b>>1]<<1)|0;F[h>>1]=I[h>>1]+1;h=m+(I[(l|4)+b>>1]<<1)|0;F[h>>1]=I[h>>1]+1;h=m+(I[(l|6)+b>>1]<<1)|0;F[h>>1]=I[h>>1]+1;k=k+4|0;g=g+4|0;if((n|0)!=(g|0)){continue}break}}h=c&3;if(h){while(1){g=(i+32|0)+(I[(k<<1)+b>>1]<<1)|0;F[g>>1]=I[g>>1]+1;k=k+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}k=G[e>>2];l=15;g=I[i+62>>1];if(g){break d}break e}k=G[e>>2]}l=14;g=0;if(I[i+60>>1]){break d}l=13;if(I[i+58>>1]){break d}l=12;if(I[i+56>>1]){break d}l=11;if(I[i+54>>1]){break d}l=10;if(I[i+52>>1]){break d}l=9;if(I[i+50>>1]){break d}l=8;if(I[i+48>>1]){break d}l=7;if(I[i+46>>1]){break d}l=6;if(I[i+44>>1]){break d}l=5;if(I[i+42>>1]){break d}l=4;if(I[i+40>>1]){break d}l=3;if(I[i+38>>1]){break d}l=2;if(I[i+36>>1]){break d}if(!I[i+34>>1]){a=G[d>>2];G[d>>2]=a+4;F[a>>1]=320;F[a+2>>1]=0;a=G[d>>2];G[d>>2]=a+4;F[a>>1]=320;F[a+2>>1]=0;m=1;break b}r=(k|0)!=0;l=1;k=1;break c}r=k>>>0>>0?k:l;p=1;k=1;while(1){if(I[(i+32|0)+(k<<1)>>1]){break c}k=k+1|0;if((l|0)!=(k|0)){continue}break}k=l}j=-1;o=I[i+34>>1];if(o>>>0>2){break a}s=I[i+36>>1];h=4-(s+(o<<1)|0)|0;if((h|0)<0){break a}q=I[i+38>>1];h=(h<<1)-q|0;if((h|0)<0){break a}t=I[i+40>>1];h=(h<<1)-t|0;if((h|0)<0){break a}u=I[i+42>>1];h=(h<<1)-u|0;if((h|0)<0){break a}w=I[i+44>>1];h=(h<<1)-w|0;if((h|0)<0){break a}x=I[i+46>>1];h=(h<<1)-x|0;if((h|0)<0){break a}z=I[i+48>>1];h=(h<<1)-z|0;if((h|0)<0){break a}A=I[i+50>>1];h=(h<<1)-A|0;if((h|0)<0){break a}y=I[i+52>>1];h=(h<<1)-y|0;if((h|0)<0){break a}B=I[i+54>>1];h=(h<<1)-B|0;if((h|0)<0){break a}v=I[i+56>>1];h=(h<<1)-v|0;if((h|0)<0){break a}m=I[i+58>>1];h=(h<<1)-m|0;if((h|0)<0){break a}n=I[i+60>>1];h=(h<<1)-n|0;if((h|0)<0){break a}h=h<<1;if(h>>>0>>0|(!a|p?(g|0)!=(h|0):0)){break a}C=k>>>0>>0;j=0;F[i+2>>1]=0;F[i+4>>1]=o;g=o+s|0;F[i+6>>1]=g;g=g+q|0;F[i+8>>1]=g;g=g+t|0;F[i+10>>1]=g;g=g+u|0;F[i+12>>1]=g;g=g+w|0;F[i+14>>1]=g;g=g+x|0;F[i+16>>1]=g;g=g+z|0;F[i+18>>1]=g;g=g+A|0;F[i+20>>1]=g;g=g+y|0;F[i+22>>1]=g;g=g+B|0;F[i+24>>1]=g;g=g+v|0;F[i+26>>1]=g;g=g+m|0;F[i+28>>1]=g;F[i+30>>1]=g+n;f:{if(!c){break f}if((c|0)!=1){m=c&-2;g=0;while(1){h=I[(j<<1)+b>>1];if(h){h=(h<<1)+i|0;n=I[h>>1];F[h>>1]=n+1;F[(n<<1)+f>>1]=j}n=j|1;h=I[(n<<1)+b>>1];if(h){h=(h<<1)+i|0;v=I[h>>1];F[h>>1]=v+1;F[(v<<1)+f>>1]=n}j=j+2|0;g=g+2|0;if((m|0)!=(g|0)){continue}break}}if(!(c&1)){break f}c=I[(j<<1)+b>>1];if(!c){break f}c=(c<<1)+i|0;g=I[c>>1];F[c>>1]=g+1;F[(g<<1)+f>>1]=j}m=C?r:k;s=20;z=0;n=f;w=n;A=0;g:{h:{switch(a|0){case 1:j=1;if(m>>>0>9){break a}s=257;w=113280;n=113216;A=1;break g;case 0:break g;default:break h}}z=(a|0)==2;s=0;w=113408;n=113344;if((a|0)!=2){break g}j=1;if(m>>>0>9){break a}}q=1<>2];u=0;g=m;o=0;p=0;a=-1;while(1){h=1<>1];c=0;j:{if(g+1>>>0>>0){break j}if(g>>>0>>0){g=0;c=96;break j}c=g-s<<1;g=I[c+n>>1];c=H[c+w|0]}v=p>>>o|0;C=-1<>1]=g;E[y+1|0]=x;E[y|0]=c;if(j){continue}break}g=1<>>1|0;if(c&p){continue}break}g=(i+32|0)+(k<<1)|0;j=I[g>>1]-1|0;F[g>>1]=j;p=c?c+(c-1&p)|0:0;u=u+1|0;if(!(j&65535)){if((k|0)==(l|0)){break i}k=I[(I[(u<<1)+f>>1]<<1)+b>>1]}if(k>>>0<=m>>>0){continue}c=p&B;if((c|0)==(a|0)){continue}break}o=o?o:m;g=k-o|0;r=1<>>0>>0){a=l-o|0;j=k;k:{while(1){j=r-I[(i+32|0)+(j<<1)>>1]|0;if((j|0)<=0){break k}r=j<<1;g=g+1|0;j=o+g|0;if(l>>>0>j>>>0){continue}break}g=a}r=1<>>0>852&A|q>>>0>592&z){break a}a=G[d>>2];j=a+(c<<2)|0;E[j+1|0]=m;E[j|0]=g;t=(h<<2)+t|0;F[j+2>>1]=t-a>>>2;a=c;continue}break}if(p){a=(p<<2)+t|0;F[a+2>>1]=0;E[a+1|0]=x;E[a|0]=64}G[d>>2]=G[d>>2]+(q<<2)}G[e>>2]=m;j=0}return j}function Kr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,F=0,H=0,I=0,J=0;f=Fa-160|0;Fa=f;if(G[c+4>>2]!=803){G[c+1892>>2]=107;G[c+1888>>2]=108;E[c|0]=84;E[c+1|0]=79;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=35;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0}g=L[c+40>>3];a:{if(O(g)<2147483648){t=~~g;break a}t=-2147483648}c=2;b:{if(a<0){break b}t=1<g){break b}g=+(t|0);b=(b+-1)/g*134217728+.5;c:{if(O(b)<2147483648){c=~~b;break c}c=-2147483648}J=c;n=J>>>26&1;a=(a+-1)/g*134217728+.5;d:{if(O(a)<2147483648){t=~~a;break d}t=-2147483648}c=t>>>26&1;e:{if(!(n|c)){G[f+128>>2]=0;G[f+132>>2]=0;G[f+88>>2]=0;G[f+92>>2]=1079410688;G[f+48>>2]=0;G[f+52>>2]=0;G[f+120>>2]=0;G[f+124>>2]=1080459264;G[f+80>>2]=0;G[f+84>>2]=0;G[f+40>>2]=0;G[f+44>>2]=1081139200;G[f+8>>2]=0;G[f+12>>2]=-1068072960;G[f>>2]=0;G[f+4>>2]=0;c=1;b=4.71238898038469;r=1.5707963267948966;m=3.141592653589793;g=-1.5707963267948966;a=0;break e}if(!(n|!c)){G[f+48>>2]=0;G[f+52>>2]=-1068072960;G[f+88>>2]=0;G[f+92>>2]=0;G[f+128>>2]=0;G[f+132>>2]=1079410688;G[f+120>>2]=0;G[f+124>>2]=0;G[f+40>>2]=0;G[f+44>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[f>>2]=0;G[f+4>>2]=1081139200;G[f+80>>2]=0;G[f+84>>2]=0;c=0;l=4.71238898038469;j=-1.5707963267948966;b=0;g=0;a=1.5707963267948966;break e}if(!(!n|c)){G[f+128>>2]=0;G[f+132>>2]=-1068072960;G[f+88>>2]=0;G[f+92>>2]=0;G[f+48>>2]=0;G[f+52>>2]=1079410688;G[f+120>>2]=0;G[f+124>>2]=0;G[f+80>>2]=0;G[f+84>>2]=1079410688;G[f+40>>2]=0;G[f+44>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[f>>2]=0;G[f+4>>2]=1080459264;c=0;l=3.141592653589793;h=1.5707963267948966;b=0;j=1.5707963267948966;g=0;a=-1.5707963267948966;break e}G[f+48>>2]=0;G[f+52>>2]=0;G[f+128>>2]=0;G[f+132>>2]=0;G[f+88>>2]=0;G[f+92>>2]=-1068072960;G[f+80>>2]=0;G[f+84>>2]=0;G[f+8>>2]=0;G[f+12>>2]=1079410688;G[f>>2]=0;G[f+4>>2]=0;G[f+40>>2]=0;G[f+44>>2]=0;G[f+120>>2]=0;G[f+124>>2]=1079410688;c=1;r=-1.5707963267948966;m=1.5707963267948966;b=0;g=1.5707963267948966;a=0}u=ib(a);L[f+152>>3]=u;v=ib(r);L[f+112>>3]=v;k=ib(j);L[f+72>>3]=k;a=eb(a);w=a*ib(m);L[f+144>>3]=w;x=a*eb(m);L[f+136>>3]=x;a=eb(r);y=a*ib(h);L[f+104>>3]=y;s=a*eb(h);L[f+96>>3]=s;a=eb(j);r=a*ib(b);L[f- -64>>3]=r;m=a*eb(b);L[f+56>>3]=m;j=ib(g);L[f+32>>3]=j;a=eb(g);h=a*ib(l);L[f+24>>3]=h;l=a*eb(l);L[f+16>>3]=l;H=27;I=1;while(1){z=M(c,40)+f|0;A=c+2&3;n=M(A,40)+f|0;a=L[z+32>>3]+L[n+32>>3];g=a;i=L[z+16>>3]+L[n+16>>3];b=L[z+24>>3]+L[n+24>>3];a=V(a*a+(i*i+b*b));a=a==0?1:a;g=g/a;b=b/a;a=i/a;o=j+u;p=l+x;q=h+w;i=V(o*o+(p*p+q*q));i=i==0?1:i;B=o/i;C=q/i;D=p/i;o=k+j;p=m+l;q=r+h;i=V(o*o+(p*p+q*q));i=i==0?1:i;F=o/i;o=q/i;p=p/i;n=H-2|0;z=J>>>n&1;n=t>>>n&1;f:{if(!(z|n)){L[f+152>>3]=B;L[f+144>>3]=C;L[f+136>>3]=D;L[f+112>>3]=g;L[f+104>>3]=b;L[f+96>>3]=a;L[f+72>>3]=F;L[f+64>>3]=o;L[f+56>>3]=p;u=B;w=C;x=D;v=g;y=b;s=a;k=F;r=o;m=p;c=(c|0)!=0&(A|0)!=0;break f}l=k+v;i=m+s;j=r+y;h=V(l*l+(i*i+j*j));h=h==0?1:h;q=l/h;l=j/h;i=i/h;if(!(!n|z)){L[f+152>>3]=g;L[f+144>>3]=b;L[f+136>>3]=a;L[f+112>>3]=q;L[f+104>>3]=l;L[f+96>>3]=i;L[f+32>>3]=F;L[f+24>>3]=o;L[f+16>>3]=p;u=g;w=b;x=a;v=q;y=l;s=i;j=F;h=o;l=p;c=(c|0)==1|(A|0)==1;break f}j=v+u;m=s+x;h=y+w;k=V(j*j+(m*m+h*h));k=k==0?1:k;j=j/k;h=h/k;k=m/k;if(!(n|!z)){L[f+112>>3]=j;L[f+104>>3]=h;L[f+96>>3]=k;L[f+72>>3]=g;L[f+64>>3]=b;L[f+56>>3]=a;L[f+32>>3]=B;L[f+24>>3]=C;L[f+16>>3]=D;v=j;y=h;s=k;j=B;k=g;h=C;r=b;l=D;m=a;c=(c|0)==3?3:(A|0)==3?3:0;break f}L[f+152>>3]=j;L[f+144>>3]=h;L[f+136>>3]=k;L[f+72>>3]=q;L[f+64>>3]=l;L[f+56>>3]=i;L[f+32>>3]=g;L[f+24>>3]=b;L[f+16>>3]=a;u=j;w=h;x=k;j=g;k=q;h=b;r=l;l=a;m=i;c=(c|0)==2?2:(A|0)==2?2:1}H=H-1|0;I=I+1|0;if((I|0)!=27){continue}break}k=j+k+v+u;g=l+m+s+x;b=h+r+y+w;a=V(k*k+(g*g+b*b));s=a==0?1:a;a=Db(b/s,g/s);b=fc(k/s);a=a/.017453292519943295;if(a>=360){while(1){a=a+-360;if(a>=360){continue}break}}if(a<0){while(1){a=a+360;if(a<0){continue}break}}L[d>>3]=a;L[e>>3]=b/.017453292519943295;c=0}Fa=f+160|0;return c|0}function pi(a,b,c){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;q=G[c>>2];if((q|0)>0){c=G[c+4>>2];r=G[c+8>>2];while(1){k=G[c+8>>2];if(!((k|0)==(r|0)?p:0)){s=(g|s)!=0;g=!H[c|0];r=k}k=H[c|0];a:{b:{if(!g){if(k){break b}g=0;break a}g=1;if(k){break a}k=0}g=1;c:{d:{switch(G[c+4>>2]){case 6:f=a-L[c+48>>3];e=L[c+144>>3];h=b-L[c+56>>3];i=L[c+136>>3];j=f*e+h*i;d=L[c- -64>>3]*.5;g=(j<-d^-1)&(d>3]*.5;g=g&(f<-d^-1)&!(d>3];h=L[c+144>>3];f=b-L[c+56>>3];i=L[c+136>>3];j=d*h+f*i;e=L[c+80>>3]*.5;if(j<-e|e>3]*.5;if(h<-e|e>3];i=L[c+152>>3];j=d*h+f*i;e=L[c- -64>>3]*.5;g=!(j>=-e)|!(e>=j);d=-d*i+f*h;e=L[c+72>>3]*.5;g=g|!(d>=-e)|!(d<=e);break c;case 8:f=a-L[c+88>>3];e=L[c+144>>3];h=b-L[c+96>>3];i=L[c+136>>3];j=f*e+h*i;d=L[c+152>>3];g=(j<-d^-1)&(d>3];g=g&(f<-d^-1)&!(d>3];f=L[c+144>>3];e=b-L[c+56>>3];h=L[c+136>>3];if(!(O((d*f+e*h)/(L[c- -64>>3]*.5))+O((e*f-d*h)/(L[c+72>>3]*.5))>1)){break c}g=0;break c;case 2:d=a-L[c+48>>3];e=d*d;d=b-L[c+56>>3];if(!(L[c+152>>3]>3];e=d*d;d=b-L[c+56>>3];d=e+d*d;if(!(d>L[c+160>>3]?1:d>3])){break c}g=0;break c;case 10:f=a-L[c+48>>3];d=b-L[c+56>>3];if(f==0&d==0){break c}d=Db(d,f)*180/3.141592653589793;f=L[c- -64>>3];e=L[c+72>>3];if(f<=e){g=!(d>e)&(de);break c;case 4:d=a-L[c+48>>3];f=L[c+144>>3];e=b-L[c+56>>3];h=L[c+136>>3];i=(d*f+e*h)/L[c- -64>>3];d=(e*f-d*h)/L[c+72>>3];if(!(i*i+d*d>1)){break c}g=0;break c;case 5:g=0;d=a-L[c+48>>3];e=L[c+144>>3];f=b-L[c+56>>3];h=L[c+136>>3];i=(d*e+f*h)/L[c+80>>3];e=(f*e-d*h)/L[c+88>>3];if(i*i+e*e>1){break c}g=1;e=L[c+160>>3];h=L[c+152>>3];i=(d*e+f*h)/L[c- -64>>3];d=(-d*h+f*e)/L[c+72>>3];if(!(i*i+d*d<1)){break c}g=0;break c;case 1:d=b-L[c+56>>3];f=L[c+144>>3];e=a-L[c+48>>3];h=L[c+136>>3];i=d*f-e*h;e:{if(i<-.5|i>=.5){break e}d=e*f+d*h;if(d<-.5){break e}if(!(d>=L[c+152>>3])){break c}}g=0;break c;case 0:d=a-L[c+48>>3];g=(d<-.5^-1)&(d>=.5^-1);d=b-L[c+56>>3];g=g&(d<-.5^-1)&!(d>=.5);break c;case 11:g=0;if(L[c+24>>3]>3]>a|(L[c+40>>3]>3]>b)){break c}o=G[c+48>>2];if((o|0)<=0){break c}l=G[c+52>>2];t=o-1|0;d=L[l+(t<<3)>>3];f=L[((o<<3)+l|0)-16>>3];m=0;while(1){e=f;f=L[(m<<3)+l>>3];h=d;n=m|1;d=L[(n<<3)+l>>3];f:{if(a>e&a>=f|(hf|a>=e)){break g}i=b-h;j=d-h;if(O(j)<1e-10){if(!(O(i)<1e-10)){break f}g=1;break c}e=(f-e)/j*i+e-a;if(e<-1e-10){break f}if(!(e<1e-10)){break g}g=1;break c}if(b==h){while(1){n=(n|0)>1?n-2|0:t;e=L[(n<<3)+l>>3];if(e==b){continue}break}if(!((d-b)*(b-e)>0)){break f}}g=1-g|0}m=m+2|0;if((o|0)>(m|0)){continue}break};break c;case 12:g=0;d=a-L[c+48>>3];f=b-L[c+56>>3];e=d*d+f*f;if(e>3]|e>L[c+160>>3]){break c}if(d==0){g=1;if(f==0){break c}}d=Db(f,d)*180/3.141592653589793;f=L[c- -64>>3];e=L[c+72>>3];if(f<=e){g=!(d>e)&(de);break c;case 13:g=0;f=a-L[c+48>>3];e=L[c+144>>3];h=b-L[c+56>>3];i=L[c+136>>3];d=f*e+h*i;j=d/L[c+104>>3];f=h*e-f*i;e=f/L[c+112>>3];if(j*j+e*e>1){break c}e=d/L[c+88>>3];h=e*e;e=f/L[c+96>>3];if(h+e*e<1){break c}if(d==0){g=1;if(f==0){break c}}d=Db(f,d)*180/3.141592653589793;f=L[c- -64>>3];e=L[c+72>>3];if(f<=e){g=!(d>e)&(de);break c;case 14:break d;default:break c}}g=0;e=a-L[c+48>>3];h=L[c+144>>3];i=b-L[c+56>>3];j=L[c+136>>3];d=e*h+i*j;f=L[c+104>>3]*.5;if(d<-f|d>f){break c}f=i*h-e*j;e=L[c+112>>3]*.5;if(f<-e|f>e){break c}e=L[c+88>>3]*.5;h:{if(!(d>=-e)|!(d<=e)){break h}e=L[c+96>>3]*.5;if(!(f>=-e)){break h}if(e>=f){break c}}if(d==0){g=1;if(f==0){break c}}d=Db(f,d)*180/3.141592653589793;f=L[c- -64>>3];e=L[c+72>>3];if(f<=e){g=!(d>e)&(de)}if(k){break a}g=!g}c=c+168|0;p=p+1|0;if((q|0)!=(p|0)){continue}break}}return(g|s)!=0}function Nt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;while(1){a:{b:{c:{if(J[a+116>>2]>261){break c}Ri(a);c=G[a+116>>2];if(!(c>>>0>=262|b)){return 0}if(!c){break a}if(c>>>0>2){break c}d=G[a+96>>2];G[a+120>>2]=d;G[a+100>>2]=G[a+112>>2];g=2;G[a+96>>2]=2;break b}g=2;f=G[a+108>>2];c=G[a+84>>2]&(H[(f+G[a+56>>2]|0)+2|0]^G[a+72>>2]<>2]);G[a+72>>2]=c;c=G[a+68>>2]+(c<<1)|0;e=I[c>>1];F[G[a+64>>2]+((f&G[a+52>>2])<<1)>>1]=e;F[c>>1]=f;d=G[a+96>>2];G[a+120>>2]=d;G[a+100>>2]=G[a+112>>2];G[a+96>>2]=2;if(!e){break b}d:{if(G[a+44>>2]-262>>>0>>0|J[a+128>>2]<=d>>>0){break d}g=ip(a,e);G[a+96>>2]=g;if(g>>>0>5){break d}if(G[a+136>>2]!=1){if((g|0)!=3){break d}g=3;if(G[a+108>>2]-G[a+112>>2]>>>0<4097){break d}}g=2;G[a+96>>2]=2}d=G[a+120>>2]}if(!(d>>>0<3|d>>>0>>0)){h=G[a+116>>2];c=G[a+5792>>2];f=G[a+108>>2];e=f+(G[a+100>>2]^-1)|0;F[G[a+5796>>2]+(c<<1)>>1]=e;G[a+5792>>2]=c+1;i=c+G[a+5784>>2]|0;c=d-3|0;E[i|0]=c;c=((H[(c&255)+116208|0]<<2)+a|0)+1176|0;F[c>>1]=I[c>>1]+1;c=e-1&65535;c=((H[(c>>>0<256?c:(c>>>7|0)+256|0)+115696|0]<<2)+a|0)+2440|0;F[c>>1]=I[c>>1]+1;c=G[a+120>>2];g=c-2|0;G[a+120>>2]=g;G[a+116>>2]=(G[a+116>>2]-c|0)+1;i=(f+h|0)-3|0;h=G[a+5788>>2]-1|0;d=G[a+108>>2];f=G[a+5792>>2];while(1){c=d;d=c+1|0;G[a+108>>2]=d;if(d>>>0<=i>>>0){e=G[a+84>>2]&(H[(c+G[a+56>>2]|0)+3|0]^G[a+72>>2]<>2]);G[a+72>>2]=e;e=G[a+68>>2]+(e<<1)|0;F[G[a+64>>2]+((G[a+52>>2]&d)<<1)>>1]=I[e>>1];F[e>>1]=d}g=g-1|0;G[a+120>>2]=g;if(g){continue}break}G[a+96>>2]=2;G[a+104>>2]=0;c=c+2|0;G[a+108>>2]=c;if((f|0)!=(h|0)){continue}e=G[a+92>>2];if((e|0)>=0){d=e+G[a+56>>2]|0}else{d=0}ge(a,d,c-e|0,0);G[a+92>>2]=G[a+108>>2];f=G[a>>2];e=G[f+28>>2];cd(e);d=G[e+20>>2];c=G[f+16>>2];d=c>>>0>d>>>0?d:c;e:{if(!d){break e}bb(G[f+12>>2],G[e+16>>2],d);G[f+12>>2]=d+G[f+12>>2];G[e+16>>2]=d+G[e+16>>2];G[f+20>>2]=d+G[f+20>>2];G[f+16>>2]=G[f+16>>2]-d;c=G[e+20>>2];G[e+20>>2]=c-d;if((c|0)!=(d|0)){break e}G[e+16>>2]=G[e+8>>2]}if(G[G[a>>2]+16>>2]){continue}return 0}if(G[a+104>>2]){d=H[(G[a+108>>2]+G[a+56>>2]|0)-1|0];c=G[a+5792>>2];F[G[a+5796>>2]+(c<<1)>>1]=0;G[a+5792>>2]=c+1;E[c+G[a+5784>>2]|0]=d;c=(d<<2)+a|0;F[c+148>>1]=I[c+148>>1]+1;f:{if(G[a+5792>>2]!=(G[a+5788>>2]-1|0)){break f}d=G[a+92>>2];if((d|0)>=0){c=d+G[a+56>>2]|0}else{c=0}ge(a,c,G[a+108>>2]-d|0,0);G[a+92>>2]=G[a+108>>2];f=G[a>>2];e=G[f+28>>2];cd(e);d=G[e+20>>2];c=G[f+16>>2];d=c>>>0>d>>>0?d:c;if(!d){break f}bb(G[f+12>>2],G[e+16>>2],d);G[f+12>>2]=d+G[f+12>>2];G[e+16>>2]=d+G[e+16>>2];G[f+20>>2]=d+G[f+20>>2];G[f+16>>2]=G[f+16>>2]-d;c=G[e+20>>2];G[e+20>>2]=c-d;if((c|0)!=(d|0)){break f}G[e+16>>2]=G[e+8>>2]}G[a+108>>2]=G[a+108>>2]+1;G[a+116>>2]=G[a+116>>2]-1;if(G[G[a>>2]+16>>2]){continue}return 0}else{G[a+104>>2]=1;G[a+108>>2]=G[a+108>>2]+1;G[a+116>>2]=G[a+116>>2]-1;continue}}break}if(G[a+104>>2]){d=H[(G[a+108>>2]+G[a+56>>2]|0)-1|0];c=G[a+5792>>2];F[G[a+5796>>2]+(c<<1)>>1]=0;G[a+5792>>2]=c+1;E[c+G[a+5784>>2]|0]=d;c=(d<<2)+a|0;F[c+148>>1]=I[c+148>>1]+1;G[a+104>>2]=0}d=G[a+108>>2];G[a+5812>>2]=d>>>0<2?d:2;if((b|0)==4){c=G[a+92>>2];if((c|0)>=0){b=c+G[a+56>>2]|0}else{b=0}ge(a,b,d-c|0,1);G[a+92>>2]=G[a+108>>2];e=G[a>>2];d=G[e+28>>2];cd(d);c=G[d+20>>2];b=G[e+16>>2];c=b>>>0>c>>>0?c:b;g:{if(!c){break g}bb(G[e+12>>2],G[d+16>>2],c);G[e+12>>2]=c+G[e+12>>2];G[d+16>>2]=c+G[d+16>>2];G[e+20>>2]=c+G[e+20>>2];G[e+16>>2]=G[e+16>>2]-c;b=G[d+20>>2];G[d+20>>2]=b-c;if((b|0)!=(c|0)){break g}G[d+16>>2]=G[d+8>>2]}return(G[G[a>>2]+16>>2]?3:2)|0}h:{if(!G[a+5792>>2]){break h}c=G[a+92>>2];if((c|0)>=0){b=c+G[a+56>>2]|0}else{b=0}ge(a,b,d-c|0,0);G[a+92>>2]=G[a+108>>2];e=G[a>>2];d=G[e+28>>2];cd(d);c=G[d+20>>2];b=G[e+16>>2];c=b>>>0>c>>>0?c:b;i:{if(!c){break i}bb(G[e+12>>2],G[d+16>>2],c);G[e+12>>2]=c+G[e+12>>2];G[d+16>>2]=c+G[d+16>>2];G[e+20>>2]=c+G[e+20>>2];G[e+16>>2]=G[e+16>>2]-c;b=G[d+20>>2];G[d+20>>2]=b-c;if((b|0)!=(c|0)){break i}G[d+16>>2]=G[d+8>>2]}if(G[G[a>>2]+16>>2]){break h}return 0}return 1}function tm(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;g=Fa-192|0;Fa=g;G[g+176>>2]=4280148;e=g;G[e+168>>2]=5787738;G[e+172>>2]=5656660;G[e+160>>2]=5524560;G[e+164>>2]=5787220;G[e+152>>2]=5459015;G[e+156>>2]=5460804;G[e+144>>2]=4739160;G[e+148>>2]=5260110;G[e+136>>2]=4412244;G[e+140>>2]=5787720;G[e+128>>2]=4412227;G[e+132>>2]=4412241;G[e+120>>2]=5523777;G[e+124>>2]=5001037;G[e+112>>2]=4998739;G[e+116>>2]=5390672;G[e+104>>2]=5132098;G[e+108>>2]=5194576;G[e+96>>2]=4542275;G[e+100>>2]=5197635;G[e+88>>2]=5263171;G[e+92>>2]=4476739;G[e+80>>2]=5391693;G[e+84>>2]=4277571;G[e+72>>2]=5265731;G[e+76>>2]=5390659;G[e+64>>2]=4277594;G[e+68>>2]=5392705;G[e+56>>2]=4411969;G[e+60>>2]=5132378;G[e+48>>2]=5130579;G[e+52>>2]=4674643;G[e+40>>2]=5266003;G[e+44>>2]=5128532;G[e+32>>2]=5130572;G[e+36>>2]=5265985;if(!fb(b,35076,4)){E[b|0]=88;E[b+1|0]=76;E[b+2|0]=79;E[b+3|0]=78}f=Za(a+3368|0,b);i=Za(a+3512|0,b);e=Za(a+3544|0,b);a:{b:{if(!fb(b,34142,6)){G[a+3260>>2]=0;break b}if(!fb(b,34781,6)){G[a+3260>>2]=-1;break b}if(ug(b,33404)){G[a+3260>>2]=-1;break b}c:{d=H[b|0];h=d-65|0;if(!(!(1<>>0<=17:0)&H[b+1|0]!=76)){E[i|0]=d;E[a+3513|0]=H[b+1|0];d=H[b+2|0];d:{if((d|0)==45){E[a+3514|0]=0;d=3;break d}E[a+3514|0]=d;d=H[b+3|0];e:{if((d|0)==45){E[a+3515|0]=0;break e}E[a+3515|0]=d;E[a+3516|0]=0}d=4}d=(H[d+b|0]==45)+d|0;d=(H[d+b|0]==45)+d|0;d=(H[d+b|0]==45)+d|0;d=((H[d+b|0]==45)+d|0)+b|0;E[e|0]=H[d|0];E[a+3545|0]=H[d+1|0];d=H[d+2|0];E[a+3547|0]=0;E[a+3546|0]=d;G[g+20>>2]=e;G[g+16>>2]=i;db(f,8692,g+16|0);if(H[f|0]==32){E[f|0]=45}if(H[a+3369|0]==32){E[a+3369|0]=45}if(H[a+3370|0]==32){E[a+3370|0]=45}if(H[a+3371|0]==32){E[a+3371|0]=45}if(H[a+3372|0]==32){E[a+3372|0]=45}if(H[a+3373|0]==32){E[a+3373|0]=45}if(H[a+3374|0]==32){E[a+3374|0]=45}if(H[a+3375|0]==32){E[a+3375|0]=45}d=0;G[a+3260>>2]=0;f=1;while(1){if(!fb(e,(g+32|0)+(f<<2)|0,3)){G[a+3260>>2]=f;d=f}f=f+1|0;if((f|0)!=37){continue}break}f:{switch(G[a+3324>>2]){case 1:G[a+3324>>2]=2;break;case 2:break f;case 0:break c;default:break b}}g:{switch(d-33|0){case 0:G[a+3260>>2]=3;F[a+3374>>1]=20033;break b;case 1:break g;default:break b}}G[a+3260>>2]=7;F[a+3374>>1]=20048;break b}G[a+3260>>2]=0;break a}G[a+3324>>2]=3}h:{if(!fb(c,34740,4)){E[c|0]=H[b|0];f=H[33504]|H[33505]<<8;E[c+1|0]=f;E[c+2|0]=f>>>8;E[c+3|0]=H[33506];G[a+3264>>2]=90;f=H[35547]|H[35548]<<8|(H[35549]<<16|H[35550]<<24);E[a+3848|0]=f;E[a+3849|0]=f>>>8;E[a+3850|0]=f>>>16;E[a+3851|0]=f>>>24;f=a+3852|0;d=H[35551]|H[35552]<<8;E[f|0]=d;E[f+1|0]=d>>>8;G[a+3964>>2]=7;break h}if(!fb(c,48511,4)){E[c|0]=H[b|0];f=H[33504]|H[33505]<<8;E[c+1|0]=f;E[c+2|0]=f>>>8;E[c+3|0]=H[33506];G[a+3964>>2]=8;E[a+3848|0]=83;E[a+3849|0]=80;E[a+3850|0]=65;E[a+3851|0]=0;G[a+3264>>2]=-90;break h}G[a+3264>>2]=0}f=Za(a+3384|0,c);i=Za(a+3528|0,c);i:{if(!fb(c,34142,6)){G[a+3260>>2]=0;break i}if(!fb(c,34781,6)){G[a+3260>>2]=-1;break i}d=H[c|0];h=d-65|0;if(!(!(1<>>0<=17:0)&H[c+1|0]!=76)){E[i|0]=d;E[a+3529|0]=H[c+1|0];d=H[c+2|0];j:{if((d|0)==45){E[a+3530|0]=0;d=3;break j}E[a+3530|0]=d;d=H[c+3|0];k:{if((d|0)==45){E[a+3531|0]=0;break k}E[a+3531|0]=d;E[a+3532|0]=0}d=4}d=(H[d+c|0]==45)+d|0;d=(H[d+c|0]==45)+d|0;d=(H[d+c|0]==45)+d|0;d=((H[d+c|0]==45)+d|0)+c|0;E[e|0]=H[d|0];h=1;E[a+3545|0]=H[d+1|0];d=H[d+2|0];E[a+3547|0]=0;E[a+3546|0]=d;if(fb(b,35895,3)){d=fb(b+1|0,33504,3)}else{d=0}G[a+3304>>2]=!d;if(H[c+1|0]!=76){h=H[c|0]==65;c=h?5:3}else{c=5}G[a+3288>>2]=c;G[a+3292>>2]=h;G[g+4>>2]=e;G[g>>2]=i;db(f,8692,g);if(H[f|0]==32){E[f|0]=45}if(H[a+3385|0]==32){E[a+3385|0]=45}if(H[a+3386|0]==32){E[a+3386|0]=45}if(H[a+3387|0]==32){E[a+3387|0]=45}if(H[a+3388|0]==32){E[a+3388|0]=45}if(H[a+3389|0]==32){E[a+3389|0]=45}if(H[a+3390|0]==32){E[a+3390|0]=45}if(H[a+3391|0]!=32){break i}E[a+3391|0]=45;break i}G[a+3260>>2]=0}l:{if((Va(b)|0)<=8){G[a+6048>>2]=0;break l}if(!fb(b+8|0,34221,4)){G[a+6048>>2]=1;break l}G[a+6048>>2]=0}}Fa=g+192|0;return 0}function xp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;n=Fa-16|0;Fa=n;a:{if(!g&(h|0)<=0|(h|0)<0|G[j>>2]>0){break a}if(!c&(d|0)<=0|(d|0)<0){G[j>>2]=307;break a}b:{if(!e&(f|0)<=0|(f|0)<0){break b}k=G[a>>2];m=G[a+4>>2];c:{d:{if((k|0)!=G[m+76>>2]){mb(a,k+1|0,0,j);break d}if((G[m+128>>2]&G[m+132>>2])!=-1){break d}if((Rb(a,j)|0)>0){break c}}l=G[a+4>>2];s=G[l+968>>2];o=b-1|0;p=G[(s+M(o,160)|0)+80>>2];k=p>>31;if((k^p)-k>>>0>=12){G[j>>2]=310;break a}t=c-1|0;u=d-!c|0;k=f;m=e+7|0;k=m>>>0<7?k+1|0:k;q=(k&7)<<29|m>>>3;e:{if((p|0)>0){b=G[(M(o,160)+s|0)+88>>2];b=(p|0)==1?(b+7|0)/8|0:b;G[n+8>>2]=b;if((b|0)<(q|0)){break b}b=(M(o,160)+s|0)+72|0;d=G[l+132>>2];f=G[l+128>>2];c=Au(G[l+960>>2],G[l+964>>2],t,u);k=f+c|0;f=Ia+d|0;f=c>>>0>k>>>0?f+1|0:f;c=k;break e}nh(a,b,c,d,n+8|0,n+12|0,j);b=G[n+8>>2];if((p|0)==-1){b=(b+7|0)/8|0;G[n+8>>2]=b}c=b>>31;k=b;d=f+h|0;b=e+g|0;d=b>>>0>>0?d+1|0:d;b=b+6|0;d=b>>>0<6?d+1|0:d;f=d>>>3|0;if(k>>>0<((d&7)<<29|b>>>3)>>>0&(f|0)>=(c|0)|(c|0)<(f|0)){break b}f=G[a+4>>2];b=f+976|0;c=G[n+12>>2];d=c+G[f+128>>2]|0;k=G[f+132>>2]+(c>>31)|0;k=c>>>0>d>>>0?k+1|0:k;c=d;f=k}d=q-1|0;k=d>>31;r=d;q=k;d=c;c=G[b>>2];d=d+c|0;f=G[b+4>>2]+f|0;f=c>>>0>d>>>0?f+1|0:f;b=d;c=d+r|0;d=f+k|0;if((Jb(a,c,b>>>0>c>>>0?d+1|0:d,0,j)|0)>0){break c}if((ic(a,1,0,n+7|0,j)|0)>0){break c}b=e-1&7;l=0;if((p|0)>0){o=M(o,160)+s|0;while(1){e=l>>31;c=e;f:{if(g>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){c=l;d=e;break f}f=H[n+7|0];E[i+l|0]=(f&H[b+103800|0])!=0;k=e;c=l+1|0;k=c?k:k+1|0;d=k;g:{if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|(b|0)==7){break g}E[c+i|0]=(f&H[b+103801|0])!=0;c=l+2|0;m=c>>>0<2?e+1|0:e;d=m;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>5){break g}E[c+i|0]=(f&H[b+103802|0])!=0;d=e;c=l+3|0;d=c>>>0<3?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>4){break g}E[c+i|0]=(f&H[b+103803|0])!=0;k=e;c=l+4|0;k=c>>>0<4?k+1|0:k;d=k;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>3){break g}E[c+i|0]=(f&H[b+103804|0])!=0;c=l+5|0;m=c>>>0<5?e+1|0:e;d=m;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>2){break g}E[c+i|0]=(f&H[b+103805|0])!=0;d=e;c=l+6|0;d=c>>>0<6?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>1){break g}E[c+i|0]=(f&H[b+103806|0])!=0;k=e;c=l+7|0;k=c>>>0<7?k+1|0:k;d=k;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b){break g}E[c+i|0]=(f&H[b+103807|0])!=0;b=l+8|0;m=b>>>0<8?e+1|0:e;c=b;d=m}l=c}if((c|0)==(g|0)&(d|0)==(h|0)){break c}d=q;b=r+1|0;d=b?d:d+1|0;r=b;b=G[n+8>>2];q=d;if((r|0)==(b|0)&(d|0)==b>>31){c=G[o+76>>2];f=G[o+72>>2];k=u;b=t+1|0;k=b?k:k+1|0;t=b;u=k;e=G[a+4>>2];d=Au(b,k,G[e+960>>2],G[e+964>>2]);b=G[e+128>>2];d=d+b|0;m=Ia+G[e+132>>2]|0;m=b>>>0>d>>>0?m+1|0:m;b=d;d=f+d|0;f=c+m|0;Jb(a,d,b>>>0>d>>>0?f+1|0:f,0,j);r=0;q=0}b=0;if((ic(a,1,0,n+7|0,j)|0)<=0){continue}break}break c}while(1){e=l>>31;c=e;h:{if(g>>>0<=l>>>0&(c|0)>=(h|0)|(c|0)>(h|0)){c=l;d=e;break h}k=H[n+7|0];E[i+l|0]=(k&H[b+103800|0])!=0;d=e;c=l+1|0;d=c?d:d+1|0;i:{if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|(b|0)==7){break i}E[c+i|0]=(k&H[b+103801|0])!=0;d=e;c=l+2|0;d=c>>>0<2?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>5){break i}E[c+i|0]=(k&H[b+103802|0])!=0;c=l+3|0;f=c>>>0<3?e+1|0:e;d=f;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>4){break i}E[c+i|0]=(k&H[b+103803|0])!=0;d=e;c=l+4|0;d=c>>>0<4?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>3){break i}E[c+i|0]=(k&H[b+103804|0])!=0;d=e;c=l+5|0;d=c>>>0<5?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>2){break i}E[c+i|0]=(k&H[b+103805|0])!=0;c=l+6|0;f=c>>>0<6?e+1|0:e;d=f;if((h|0)<=(d|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b>>>0>1){break i}E[c+i|0]=(k&H[b+103806|0])!=0;d=e;c=l+7|0;d=c>>>0<7?d+1|0:d;if((d|0)>=(h|0)&c>>>0>=g>>>0|(d|0)>(h|0)|b){break i}E[c+i|0]=(k&H[b+103807|0])!=0;d=e;b=l+8|0;d=b>>>0<8?d+1|0:d;c=b}l=c}if((c|0)==(g|0)&(d|0)==(h|0)){break c}b=0;if((ic(a,1,0,n+7|0,j)|0)<=0){continue}break}}break a}G[j>>2]=308}Fa=n+16|0}function Ys(a){a=a|0;var 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;n=G[309722];o=G[(n+M(G[a+16>>2],344)|0)+88>>2];p=G[a+12>>2];Nd(a);g=G[309726]+o|0;h=1;j=G[a+52>>2];h=j-261>>>0>=2?G[a+56>>2]:h;a:{b:{c:{d=G[309732];if((d|0)>(g|0)){d=d-g|0;b=G[309727];d=(b|0)>(d|0)?d:b;k=b-d|0;if((d|0)<=0|(g|0)>0){break b}i=h&3;j=h-1>>>0<3;while(1){d:{if(G[a+52>>2]!=262){if(!h){break d}c=0;b=h;if(i){while(1){E[G[a+84>>2]+e|0]=1;e=e+1|0;b=b-1|0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}if(j){break d}while(1){E[G[a+84>>2]+e|0]=1;E[(G[a+84>>2]+e|0)+1|0]=1;E[(G[a+84>>2]+e|0)+2|0]=1;E[(G[a+84>>2]+e|0)+3|0]=1;e=e+4|0;b=b-4|0;if(b){continue}break}break d}b=G[a+56>>2];c=e<<2;E[b+G[c+G[a+88>>2]>>2]|0]=0;e:{if(!b){break e}l=b-1|0;f=0;m=b&3;if(m){while(1){b=b-1|0;E[b+G[c+G[a+88>>2]>>2]|0]=48;f=f+1|0;if((m|0)!=(f|0)){continue}break}}if(l>>>0<3){break e}while(1){E[(G[c+G[a+88>>2]>>2]+b|0)-1|0]=48;E[(G[c+G[a+88>>2]>>2]+b|0)-2|0]=48;E[(G[c+G[a+88>>2]>>2]+b|0)-3|0]=48;b=b-4|0;E[b+G[c+G[a+88>>2]>>2]|0]=48;if(b){continue}break}}e=e+1|0}b=d-1|0;c=g+1|0;if((g|0)>=0){break c}f=(d|0)>1;g=c;d=b;if(f){continue}break}break c}b=G[309727];c=b+g|0;f=d+G[309733]|0;if((c|0)<=(f|0)){k=b;break a}c=c-f|0;g=(c|0)>(b|0)?g:f;d=(b|0)>(c|0)?c:b;k=b-d|0;e=M(k,h);if((d|0)<=0){break b}i=G[309734];if((i|0)>=(d+g|0)){break b}if(h){i=h&3;b=M(b,h);l=h-1>>>0<3;while(1){f:{if(G[a+52>>2]!=262){f=0;c=h;if(i){while(1){b=b-1|0;E[b+G[a+84>>2]|0]=1;c=c-1|0;f=f+1|0;if((i|0)!=(f|0)){continue}break}}if(l){break f}while(1){E[(G[a+84>>2]+b|0)-1|0]=1;E[(G[a+84>>2]+b|0)-2|0]=1;E[(G[a+84>>2]+b|0)-3|0]=1;b=b-4|0;E[b+G[a+84>>2]|0]=1;c=c-4|0;if(c){continue}break}break f}c=G[a+56>>2];b=b-1|0;f=b<<2;E[c+G[f+G[a+88>>2]>>2]|0]=0;if(!c){break f}m=c-1|0;j=0;q=c&3;if(q){while(1){c=c-1|0;E[c+G[f+G[a+88>>2]>>2]|0]=48;j=j+1|0;if((q|0)!=(j|0)){continue}break}}if(m>>>0<3){break f}while(1){E[(G[f+G[a+88>>2]>>2]+c|0)-1|0]=48;E[(G[f+G[a+88>>2]>>2]+c|0)-2|0]=48;E[(G[f+G[a+88>>2]>>2]+c|0)-3|0]=48;c=c-4|0;E[c+G[f+G[a+88>>2]>>2]|0]=48;if(c){continue}break}}c=d-1|0;if((d|0)>=2){d=c;if(G[309734]<(c+g|0)){continue}}break}d=c;break b}if((j|0)==262){i=0;while(1){g:{if(G[a+52>>2]!=262){break g}b=G[a+56>>2];i=i-1|0;c=i<<2;E[b+G[c+G[a+88>>2]>>2]|0]=0;if(!b){break g}j=b-1|0;f=0;l=b&3;if(l){while(1){b=b-1|0;E[b+G[c+G[a+88>>2]>>2]|0]=48;f=f+1|0;if((l|0)!=(f|0)){continue}break}}if(j>>>0<3){break g}while(1){E[(G[c+G[a+88>>2]>>2]+b|0)-1|0]=48;E[(G[c+G[a+88>>2]>>2]+b|0)-2|0]=48;E[(G[c+G[a+88>>2]>>2]+b|0)-3|0]=48;b=b-4|0;E[b+G[c+G[a+88>>2]>>2]|0]=48;if(b){continue}break}}b=d-1|0;if((d|0)<2){d=b;break b}d=b;if(G[309734]<(b+g|0)){continue}break}break b}e=0;b=((d+f|0)+((b|0)>(c|0)?b:c)|0)+(b^-1)|0;d=d-1|0;b=(((b|0)>(i|0)?i:b)-b|0)+d|0;d=b>>>0>d>>>0?0:b;break b}d=b;g=c}if((d|0)<=0){break a}b=M(p,344)+n|0;h:{switch(G[a+52>>2]-258|0){case 3:case 4:Ja[G[309714]](0-G[b>>2]|0,g,d,G[a+88>>2]+(e<<2)|0,G[a+84>>2]+e|0)|0;break a;case 0:Ja[G[309714]](0-G[b>>2]|0,g,d,G[a+88>>2]+e|0,G[a+84>>2]+e|0)|0;break a;case 1:Ja[G[309714]](0-G[b>>2]|0,g,d,G[a+88>>2]+(e<<2)|0,G[a+84>>2]+e|0)|0;break a;case 2:break h;default:break a}}Ja[G[309714]](0-G[b>>2]|0,g,d,G[a+88>>2]+(e<<3)|0,G[a+84>>2]+e|0)|0}i:{if(!h|(G[309737]|(k|0)<=0)){break i}g=M(h,o);d=M(p,344)+n|0;e=M((o|0)>0?k:G[309727],h);while(1){k=k-1|0;b=h;while(1){e=e-1|0;b=b-1|0;j:{k:{if(G[a+52>>2]==262){c=e+g|0;break k}c=e+g|0;E[G[a+84>>2]+e|0]=H[c+G[d+84>>2]|0];l:{switch(G[a+52>>2]-258|0){case 2:L[G[a+88>>2]+(e<<3)>>3]=L[G[d+88>>2]+(c<<3)>>3];break j;case 1:G[G[a+88>>2]+(e<<2)>>2]=G[G[d+88>>2]+(c<<2)>>2];break j;case 0:E[G[a+88>>2]+e|0]=H[G[d+88>>2]+c|0];break j;case 4:break k;case 3:break l;default:break j}}Za(G[G[a+88>>2]+(e<<2)>>2],G[G[d+88>>2]+(c<<2)>>2]);break j}Za(G[G[a+88>>2]+(e<<2)>>2],G[G[d+88>>2]+(c<<2)>>2])}c=G[309737];if(c?0:b){continue}break}if(!k){break i}if(!c){continue}break}}}function Ls(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=Fa-16|0;Fa=d;i=21833;h=Fa-7648|0;Fa=h;a:{if(G[f>>2]>0){break a}G[d+12>>2]=0;if(G[47541]){j=ji();G[f>>2]=j;if((j|0)>0){break a}}while(1){j=i;i=i+1|0;if(H[j|0]==32){continue}break}dh(j,h+7520|0,h+6480|0,h+5440|0,h+4400|0,h+3360|0,h+2320|0,h+1280|0,0,0,f);i=H[141383]|H[141384]<<8|(H[141385]<<16|H[141386]<<24);E[h+7527|0]=i;E[h+7528|0]=i>>>8;E[h+7529|0]=i>>>16;E[h+7530|0]=i>>>24;i=G[35345];G[h+7520>>2]=G[35344];G[h+7524>>2]=i;i=G[310142];b:{c:{while(1){if((i|0)<=0){break c}i=i-1|0;if(Xa(M(i,84)+1240576|0,h+7520|0)){continue}break}G[f>>2]=0;a=Hn(a,b,h+7644|0);G[f>>2]=a;if((a|0)>0){Ua(57248);break a}a=M(i,84)+1240576|0;b=Ja[G[a+64>>2]](G[h+7644>>2],h+7544|0)|0;G[f>>2]=b;if((b|0)>0){Ja[G[a+56>>2]](G[h+7644>>2])|0;Ua(57298);break a}b=lb(1,8);G[d+12>>2]=b;if(!b){Ja[G[(M(i,84)+1240576|0)+56>>2]](G[h+7644>>2])|0;Ua(57347);Ua(j);break b}a=lb(1,1736);G[b+4>>2]=a;if(!a){Ja[G[(M(i,84)+1240576|0)+56>>2]](G[h+7644>>2])|0;Ua(57347);Ua(j);Wa(G[d+12>>2]);G[d+12>>2]=0;break b}k=Va(j)+1|0;k=ab((k|0)>32?k:32);G[a+12>>2]=k;if(!k){Ja[G[(M(i,84)+1240576|0)+56>>2]](G[h+7644>>2])|0;Ua(57138);Ua(j);Wa(G[G[d+12>>2]+4>>2]);Wa(G[d+12>>2]);G[d+12>>2]=0;break b}g=lb(1001,8);G[a+96>>2]=g;if(!g){Ja[G[(M(i,84)+1240576|0)+56>>2]](G[h+7644>>2])|0;Ua(57027);Ua(j);Wa(G[G[G[d+12>>2]+4>>2]+12>>2]);Wa(G[G[d+12>>2]+4>>2]);Wa(G[d+12>>2]);G[d+12>>2]=0;break b}g=lb(40,2880);G[a+1252>>2]=g;d:{e:{if(g){cb(a+1256|0,255,160);g=a+1728|0;G[g>>2]=38;G[g+4>>2]=39;g=a+1720|0;G[g>>2]=36;G[g+4>>2]=37;g=a+1712|0;G[g>>2]=34;G[g+4>>2]=35;g=a+1704|0;G[g>>2]=32;G[g+4>>2]=33;g=a+1696|0;G[g>>2]=30;G[g+4>>2]=31;g=a+1688|0;G[g>>2]=28;G[g+4>>2]=29;g=a+1680|0;G[g>>2]=26;G[g+4>>2]=27;g=a+1672|0;G[g>>2]=24;G[g+4>>2]=25;g=a+1664|0;G[g>>2]=22;G[g+4>>2]=23;g=a+1656|0;G[g>>2]=20;G[g+4>>2]=21;g=a+1648|0;G[g>>2]=18;G[g+4>>2]=19;g=a+1640|0;G[g>>2]=16;G[g+4>>2]=17;g=a+1632|0;G[g>>2]=14;G[g+4>>2]=15;g=a+1624|0;G[g>>2]=12;G[g+4>>2]=13;g=a+1616|0;G[g>>2]=10;G[g+4>>2]=11;g=a+1608|0;G[g>>2]=8;G[g+4>>2]=9;g=a+1600|0;G[g>>2]=6;G[g+4>>2]=7;g=a+1592|0;G[g>>2]=4;G[g+4>>2]=5;g=a+1584|0;G[g>>2]=2;G[g+4>>2]=3;G[a+1576>>2]=0;G[a+1580>>2]=1;G[a+92>>2]=1e3;g=G[h+7644>>2];G[a+4>>2]=i;G[a>>2]=g;Za(k,j);i=G[h+7544>>2];k=G[h+7548>>2];G[a+128>>2]=-1;G[a+132>>2]=-1;G[a+84>>2]=1;G[a+40>>2]=i;G[a+44>>2]=k;G[a+32>>2]=i;G[a+36>>2]=k;G[a+72>>2]=-1;G[a+24>>2]=0;G[a+16>>2]=555;G[a+8>>2]=1;Hc(b,0,0,f);a=G[d+12>>2];if(G[f>>2]>0){break d}k=G[a+4>>2];break e}Ja[G[(M(i,84)+1240576|0)+56>>2]](G[h+7644>>2])|0;Ua(57083);Ua(j);Wa(G[G[G[d+12>>2]+4>>2]+96>>2]);Wa(G[G[G[d+12>>2]+4>>2]+12>>2]);Wa(G[G[d+12>>2]+4>>2]);Wa(G[d+12>>2]);G[d+12>>2]=0;break b}while(1){f:{b=l<<2;i=b+1243184|0;if(!G[i>>2]){break f}b=b+1243184|0;i=b+4|0;if(!G[i>>2]){break f}i=b+8|0;if(!G[i>>2]){break f}i=b+12|0;if(!G[i>>2]){break f}i=b+16|0;if(!G[i>>2]){break f}l=l+5|0;if((l|0)!=1e4){continue}break d}break}G[i>>2]=k;a=G[d+12>>2]}if((Wf(a,h+7640|0,f)|0)>0){Ua(57405);Ua(j);if(G[f>>2]==252){Ua(44068)}Qb(G[d+12>>2],f);G[d+12>>2]=0}E[h+160|0]=0;E[h+1200|0]=0;if(!H[h+4400|0]){break a}Pj(h+4400|0,h+7628|0,h+7552|0,h+7632|0,h+7636|0,h+1200|0,h+160|0,f);if(G[f>>2]>0){break a}a=G[h+7628>>2];g:{if(a){mb(G[d+12>>2],a+1|0,h+7640|0,f);break g}if(!H[h+7552|0]){break g}Je(G[d+12>>2],G[h+7636>>2],h+7552|0,G[h+7632>>2],f)}if(G[f>>2]<=0){break a}Ua(37257);h:{if((a|0)>0){G[h>>2]=a;i=h- -64|0;Ya(i,81,44578,h);break h}G[h+48>>2]=h+7552;a=h- -64|0;Ya(a,81,48820,h+48|0);Ua(a);a=G[h+7632>>2];if(a){G[h+32>>2]=a;a=h- -64|0;Ya(a,81,48850,h+32|0);Ua(a)}i=44598;a=G[h+7636>>2];if((a|0)==-1){break h}G[h+16>>2]=G[(a<<2)+141388>>2];a=h- -64|0;Ya(a,81,48785,h+16|0);Ua(a)}Ua(i);break a}G[f>>2]=124;Ua(57187);break a}G[f>>2]=113}Fa=h+7648|0;if(!G[f>>2]){m=Um(G[d+12>>2],c,e,f)}Fa=d+16|0;return m|0}function ou(a,b,c){a=+a;b=b|0;c=c|0;var d=0,e=0,f=N(0),g=0,h=0,i=0,j=0,k=0,l=N(0),m=N(0),n=0;e=Fa-240|0;Fa=e;a:{b:{c:{d:{e:{f:{g:{h=E[b|0];b=h;switch(b-58|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 41:case 43:case 44:case 45:case 47:case 48:case 49:case 50:case 52:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:break a;case 0:case 51:break b;case 42:case 46:break c;case 62:break d;case 53:break e;case 40:break f;default:break g}}if((h|0)==32){break b}break a}E[3809712]=48;E[3809713]=98;h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{F:{G:{H:{I:{J:{if(O(a)<2147483648){b=~~a}else{b=-2147483648}c=b&32768;K:{if(c){E[3809714]=49;d=3;c=(b&16384)>>>14|0;break K}d=c;c=b&16384;if(!(d|c)){break J}d=2;c=c>>>14|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&8192)>>>13|0;break I}c=b&8192;if(!c){break H}d=2;c=c>>>13|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&4096)>>>12|0;break G}c=b&4096;if(!c){break F}d=2;c=c>>>12|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&2048)>>>11|0;break E}c=b&2048;if(!c){break D}d=2;c=c>>>11|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&1024)>>>10|0;break C}c=b&1024;if(!c){break B}d=2;c=c>>>10|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&512)>>>9|0;break A}c=b&512;if(!c){break z}d=2;c=c>>>9|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&256)>>>8|0;break y}c=b&256;if(!c){break x}d=2;c=c>>>8|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&128)>>>7|0;break w}c=b&128;if(!c){break v}d=2;c=c>>>7|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&64)>>>6|0;break u}c=b&64;if(!c){break t}d=2;c=c>>>6|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&32)>>>5|0;break s}c=b&32;if(!c){break r}d=2;c=c>>>5|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&16)>>>4|0;break q}c=b&16;if(!c){break p}d=2;c=c>>>4|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&8)>>>3|0;break o}c=b&8;if(!c){break n}d=2;c=c>>>3|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&4)>>>2|0;break m}c=b&4;if(!c){break l}d=2;c=c>>>2|0}E[d+3809712|0]=c?49:48;d=d+1|0;c=(b&2)>>>1|0;break k}d=2;c=b&2;if(!c){break j}c=c>>>1|0}E[d+3809712|0]=c?49:48;b=b&1;d=d+1|0;break i}b=b&1;c=2;if(!b){break h}}E[d+3809712|0]=b?49:48;c=d+1|0}E[c+3809712|0]=0;break a}if(O(a)<2147483648){b=~~a}else{b=-2147483648}G[e>>2]=b;db(3809712,13581,e);break a}if(O(a)<2147483648){b=~~a}else{b=-2147483648}G[e+16>>2]=b;db(3809712,3867,e+16|0);break a}b=109}f=N(a);g=f>3]=a;G[e+40>>2]=b;G[e+36>>2]=c;G[e+32>>2]=g;Eb(3809712,18593,e+32|0);break a}L[e+80>>3]=a;G[e+72>>2]=b;G[e+68>>2]=c;G[e+64>>2]=g;Eb(3809712,18568,e- -64|0);break a}if(f>3]=a;G[e+112>>2]=b;G[e+108>>2]=d;G[e+104>>2]=h;G[e+100>>2]=i;G[e+96>>2]=g;Eb(3809712,18577,e+96|0);break a}L[e+152>>3]=a;G[e+144>>2]=b;G[e+140>>2]=d;G[e+136>>2]=h;G[e+132>>2]=i;G[e+128>>2]=g;Eb(3809712,18554,e+128|0);break a}a=$b(10,+(c|0));j=+f*a+.5;O:{if(O(j)<2147483648){k=~~j;break O}k=-2147483648}if(+(k|0)/a>=60){k=(d|0)>58;d=k?0:d+1|0;f=N(0);i=i+k|0}G[e+200>>2]=c;G[e+196>>2]=b;G[e+192>>2]=h;c=e+208|0;j=+f;n=j*a+.5;P:{if(O(n)<2147483648){b=~~n;break P}b=-2147483648}db(c,+(b|0)/a<10?18643:18620,e+192|0);L[e+176>>3]=j;G[e+168>>2]=d;G[e+164>>2]=i;G[e+160>>2]=g;Eb(3809712,c,e+160|0)}Fa=e+240|0;return 3809712}function Bk(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;l=G[k>>2];if((l|0)<=0){a:{b:{switch(b-1|0){case 0:i=Fa-128|0;Fa=i;m=h;c:{if((h|0)<=0|G[k>>2]>0){break c}if(!d&(e|0)<=0|(e|0)<0){G[k>>2]=307;break c}d:{if((f|0)<=0){break d}e:{g=G[a>>2];b=G[a+4>>2];f:{if((g|0)!=G[b+76>>2]){mb(a,g+1|0,0,k);break f}if((G[b+128>>2]&G[b+132>>2])!=-1){break f}if((Rb(a,k)|0)>0){break e}}r=f+7|0;p=r>>>3|0;h=f+m|0;b=((h+6>>>3|0)-p|0)+1|0;f=b;g=b>>31;b=i+56|0;if((yc(a,c,d,e,p,0,f,g,1,b,b,i+44|0,i+84|0,i+76|0,i+72|0,i+120|0,i+96|0,i+80|0,i+112|0,i+104|0,i+68|0,i+88|0,i+32|0,k)|0)>0){break e}b=G[a+4>>2];n=G[b+968>>2];l=c-1|0;o=G[(n+M(l,160)|0)+80>>2];G[i+76>>2]=o;f=o>>31;if((o^f)-f>>>0>=12){G[k>>2]=310;break c}f=d-1|0;g=e-!d|0;g:{if((o|0)>0){d=n+M(l,160)|0;c=G[d+92>>2];d=G[d+88>>2];e=d+7|0;h=e>>>0<7?c+1|0:c;q=d;d=(o|0)==1;e=(s=Bu(e,h,8,0),t=q,u=d,u?s:t);G[i+112>>2]=e;c=d?Ia:c;G[i+116>>2]=c;if(e>>>0

>>0&(c|0)<=0|(c|0)<0){break d}c=n+M(l,160)|0;d=G[c+72>>2];h=G[c+76>>2];e=G[b+132>>2];q=G[b+128>>2];c=Au(G[b+960>>2],G[b+964>>2],f,g);b=q+c|0;e=Ia+e|0;e=b>>>0>>0?e+1|0:e;c=d;d=b;c=c+b|0;b=e+h|0;b=c>>>0>>0?b+1|0:b;h=c;break g}G[i+112>>2]=h-1;G[i+116>>2]=0;if((o|0)==-1){Le(a,c,d,e,i+8|0,i+16|0,k);b=G[i+112>>2];ph(a,c,d,e,b,b>>31,G[i+16>>2],G[i+20>>2],k)}b=G[i+124>>2];h=G[i+120>>2]}c=r&7;e=0;d=p-1|0;h=h+d|0;b=d>>>0>h>>>0?b+1|0:b;G[i+120>>2]=h;G[i+124>>2]=b;Jb(a,h,b,1,k);n=n+M(l,160)|0;l=0;while(1){if((ic(a,1,0,i+31|0,k)|0)==107){G[k>>2]=0;E[i+31|0]=0}Jb(a,G[i+120>>2],G[i+124>>2],1,k);if((l|0)<(m|0)){b=H[i+31|0];if(H[j+l|0]){b=b|H[c+118756|0]}else{b=b&H[c+118764|0]}h=l+1|0;h:{if(c>>>0>6|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118757|0]|b}else{b=H[c+118765|0]&b}h=l+2|0;if(c>>>0>5|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118758|0]|b}else{b=H[c+118766|0]&b}h=l+3|0;if(c>>>0>4|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118759|0]|b}else{b=H[c+118767|0]&b}h=l+4|0;if(c>>>0>3|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118760|0]|b}else{b=H[c+118768|0]&b}h=l+5|0;if(c>>>0>2|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118761|0]|b}else{b=H[c+118769|0]&b}h=l+6|0;if(c>>>0>1|(h|0)>=(m|0)){break h}if(H[h+j|0]){b=H[c+118762|0]|b}else{b=H[c+118770|0]&b}h=l+7|0;if((h|0)>=(m|0)|c){break h}if(H[h+j|0]){b=H[c+118763|0]|b}else{b=H[c+118771|0]&b}h=l+8|0}E[i+31|0]=b;l=h}Wb(a,1,0,i+31|0,k);if((l|0)==(m|0)){break e}h=G[i+124>>2];b=G[i+120>>2]+1|0;h=b?h:h+1|0;G[i+120>>2]=b;G[i+124>>2]=h;c=0;if((o|0)<=0){continue}b=d+1|0;e=b?e:e+1|0;d=b;if((b|0)!=G[i+112>>2]|G[i+116>>2]!=(e|0)){continue}e=G[n+76>>2];q=G[n+72>>2];b=g;d=f+1|0;b=d?b:b+1|0;f=d;g=b;b=G[a+4>>2];d=Au(d,g,G[b+960>>2],G[b+964>>2]);h=G[b+128>>2];d=d+h|0;b=Ia+G[b+132>>2]|0;b=d>>>0>>0?b+1|0:b;p=d;d=q+d|0;h=b+e|0;b=d;G[i+120>>2]=b;h=b>>>0

>>0?h+1|0:h;G[i+124>>2]=h;Jb(a,b,h,1,k);d=0;e=0;continue}}break c}G[k>>2]=308}Fa=i+128|0;break a;case 10:pe(a,c,d,e,f,g,h,i,j,k);break a;case 11:Bh(a,c,d,e,f,g,h,i,j,k);break a;case 19:Ah(a,c,d,e,f,g,h,i,j,k);break a;case 20:Ng(a,c,d,e,f,g,h,i,j,k);break a;case 29:if(G[k>>2]<=0){Qe(a,c,d,e,f,g,h,i,j,k)}break a;case 30:Jo(a,c,d,e,f,g,h,i,j,k);break a;case 39:Qe(a,c,d,e,f,g,h,i,j,k);break a;case 40:xe(a,c,d,e,f,g,h,i,j,k);break a;case 79:zh(a,c,d,e,f,g,h,i,j,k);break a;case 80:yh(a,c,d,e,f,g,h,i,j,k);break a;case 41:Kg(a,c,d,e,f,g,h,i,j,k);break a;case 81:Ff(a,c,d,e,f,g,h,i,j,k);break a;case 82:l=a;a=f;b=g<<1|a>>>31;a=a<<1;f=a-1|0;b=b-!a|0;a=h;h=i<<1|h>>>31;Kg(l,c,d,e,f,b,a<<1,h,j,k);break a;case 162:l=a;a=f;b=g<<1|a>>>31;a=a<<1;f=a-1|0;a=b-!a|0;b=i<<1|h>>>31;Ff(l,c,d,e,f,a,h<<1,b,j,k);break a;case 13:Go(a,c,d,e,f,g,h,i,j,k);break a;case 15:dg(a,c,d,e,f,g,h,i,j,k);break a;default:break b}}G[k>>2]=410}l=G[k>>2]}return l}function Qj(a,b,c){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;d=Fa-4160|0;Fa=d;E[d+4048|0]=0;g=eh(0);a:{if(g){break a}f=G[47524];b:{if(!(c&1)){g=369;if((f|0)==3){break b}break a}g=369;if((f|0)!=4){break a}}g=360;f=ab(176);if(!f){break a}i=bb(f,1240392,176);c:{if(G[310098]!=2){break c}e=G[310118];if(!e){break c}h=i;i=ab(Va(e)+1|0);G[h+80>>2]=i;if(!i){break a}Za(i,e)}i=1;d:{e:{f:{g:{g=eh(0);if(!g){while(1){g=369;h:{i:{j:{k:{l:{switch(G[47524]-1|0){case 0:case 1:case 2:G[d+44>>2]=f;G[d+40>>2]=i;if(G[309816]){break g}G[d+4156>>2]=363;break e;case 4:break j;case 3:break k;default:break l}}g=Va(1240396);m:{if(g-2>>>0>4){break m}e=g-1|0;if(H[e+1240396|0]!=35){break m}if(!H[d+4048|0]){h=d+4048|0;bb(h,1240396,e);E[e+h|0]=0}if((Va(d+4048|0)|0)==(e|0)){k=!nb(d+4048|0,1240396,e)+k|0}G[d>>2]=k;Ya(g+1240395|0,76-g|0,30633,d)}g=360;h=M(i,176);e=ub(f,h+176|0);if(!e){break k}h=bb(e+h|0,1240392,176);if(G[310098]!=2){break h}f=G[310118];if(!f){break h}l=h;h=ab(Va(f)+1|0);G[l+80>>2]=h;if(h){break i}f=e}G[d+44>>2]=f;G[d+40>>2]=i;G[d+4156>>2]=g;break e}G[d+44>>2]=f;G[d+40>>2]=i;G[d+4156>>2]=0;break f}Za(h,f)}i=i+1|0;f=e;g=eh(0);if(!g){continue}break}}G[d+40>>2]=i;break a}if(G[309823]){G[d+4156>>2]=364;break e}e=G[309817];G[309823]=G[309816];G[309824]=e;G[309829]=G[309822];e=G[309821];G[309827]=G[309820];G[309828]=e;e=G[309819];G[309825]=G[309818];G[309826]=e;G[d+4156>>2]=0;G[309816]=0}cb(d+48|0,0,3996);k=0;g=0;while(1){l=M(g,176);e=l+f|0;h=e+4|0;n:{if(!Xa(34516,h)){if(G[e>>2]!=2){break n}k=(o=(r=gc(35618,G[e+80>>2],8)?k:3,s=2,t=gc(35630,G[(f+l|0)+80>>2],5),t?r:s),p=1,q=gc(35678,G[(f+l|0)+80>>2],5),q?o:p);break n}if(!Xa(35530,h)){if(G[e>>2]!=1){break n}k=H[e+80|0]?1:k;break n}if(!Xa(32941,h)){if(G[e>>2]!=3){break n}n=G[e+80>>2];break n}if(!Xa(33788,h)){if(G[e>>2]!=3){break n}j=G[e+80>>2];break n}if(!Xa(35480,h)){if(G[e>>2]!=2){break n}m=G[e+80>>2];break n}G[d+20>>2]=d+4047;G[d+16>>2]=d+4144;if((Qc(h,30730,d+16|0)|0)!=1){break n}e=f+l|0;if(G[e>>2]!=3){break n}h=G[d+4144>>2]-1|0;if(h>>>0>998){break n}G[(d+48|0)+(h<<2)>>2]=G[e+80>>2]}g=g+1|0;if(i>>>0>g>>>0){continue}break}o:{p:{q:{switch(k-1|0){case 0:if((c&3)==2){pd(a,16,0,0,d+4156|0)}pd(a,n,j,d+48|0,d+4156|0);if(G[d+4156>>2]){break e}g=Rj(d+40|0,a);G[d+4156>>2]=g;break p;case 1:case 2:break q;default:break o}}nl(a,(k|0)==2?1:2,0,0,0,0,0,0,0,d+4156|0);if(G[d+4156>>2]){break e}c=cn(a,d+40|0,0);G[d+4156>>2]=c;if(c){break e}g=Rj(d+40|0,a);G[d+4156>>2]=g;if(g){break p}c=G[d+52>>2];if((c|0)<=0){break p}Ig(a,0,0,c,0,d+4156|0);g=G[d+4156>>2]}if(!(!m|g)){j=368;e=d+4140|0;r:{if(!m|!e){break r}c=G[309833];f=G[309832];if(!c&(f|0)>0|((f|0)<=0?c:0)){break r}if((f|0)>0){j=0;while(1){if(!Xa(m,G[c+(j<<3)>>2])){f=c+(j<<3)|0;c=G[f+4>>2]+1|0;G[f+4>>2]=c;G[e>>2]=c;j=0;break r}j=j+1|0;if((f|0)!=(j|0)){continue}break}}j=360;s:{if(!c){c=ab(8);break s}c=ub(c,(f<<3)+8|0)}if(!c){break r}f=ab(Va(m)+1|0);if(!f){Wa(c);break r}j=0;f=Za(f,m);G[309833]=c;c=c+(G[309832]<<3)|0;G[c+4>>2]=1;G[c>>2]=f;G[e>>2]=1;G[309832]=G[309832]+1}G[d+4156>>2]=j;G[d+36>>2]=G[d+4140>>2];xd(a,41,33996,d+36|0,11175,d+4156|0);g=G[d+4156>>2]}if(!(g|(b|0)<=0)){G[d+4152>>2]=G[a>>2]+1;e=b;c=d+4148|0;b=d+4156|0;mb(a,e,c,b);Un(a,G[d+4152>>2],b);mb(a,G[d+4152>>2],c,b);g=G[d+4156>>2];if(!g){break d}break a}if(!g){break d}break e}G[d+4156>>2]=368}G[d+4148>>2]=0;vo(a,0,d+4148|0)}b=0;a=d+40|0;if(a){c=G[a>>2];if((c|0)>0){while(1){f=M(b,176);e=f+G[a+4>>2]|0;t:{if(G[e>>2]!=2){break t}e=G[e+80>>2];if(!e){break t}Wa(e);G[(f+G[a+4>>2]|0)+80>>2]=0;c=G[a>>2]}b=b+1|0;if((b|0)<(c|0)){continue}break}}b=G[a+4>>2];if(b){Wa(b)}G[a>>2]=0;G[a+4>>2]=0}g=G[d+4156>>2]}Fa=d+4160|0;return g}function dg(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;k=Fa-29072|0;Fa=k;m=G[j>>2];a:{if((m|0)>0){break a}b:{n=G[a>>2];l=G[a+4>>2];c:{if((n|0)!=G[l+76>>2]){mb(a,n+1|0,0,j);break c}if((G[l+128>>2]&G[l+132>>2])!=-1){break c}if((Rb(a,j)|0)>0){break b}}d:{if((b|0)>0){l=G[a+4>>2];if(G[l+936>>2]>=(b|0)){break d}}G[k>>2]=b;a=k+28864|0;Ya(a,81,30457,k);Ua(a);m=302;G[j>>2]=302;break a}l=G[(G[l+968>>2]+M(b,160)|0)-80>>2];G[k+29068>>2]=l;e:{if((l|0)!=16){if((l|0)!=-16){break e}e=b;f=c;b=Va(G[i>>2]);b=b?b:1;c=b>>31;if((yc(a,e,f,d,1,0,b,c,1,k+29e3|0,k+28992|0,k+28960|0,k+29056|0,k+29068|0,k+29064|0,k+29032|0,k+29024|0,k+29052|0,k+29040|0,k+29016|0,k+29060|0,k+29008|0,k+28832|0,j)|0)>0){break b}Jb(a,G[k+29032>>2],G[k+29036>>2],1,j);Wb(a,b,c,G[i>>2],j);m=G[j>>2];if((m|0)<=0){break a}E[k+28920|0]=H[46002];b=H[45998]|H[45999]<<8|(H[46e3]<<16|H[46001]<<24);a=k+28912|0;G[a>>2]=H[45994]|H[45995]<<8|(H[45996]<<16|H[45997]<<24);G[a+4>>2]=b;b=H[45990]|H[45991]<<8|(H[45992]<<16|H[45993]<<24);a=k+28904|0;G[a>>2]=H[45986]|H[45987]<<8|(H[45988]<<16|H[45989]<<24);G[a+4>>2]=b;b=H[45982]|H[45983]<<8|(H[45984]<<16|H[45985]<<24);a=k+28896|0;G[a>>2]=H[45978]|H[45979]<<8|(H[45980]<<16|H[45981]<<24);G[a+4>>2]=b;b=H[45974]|H[45975]<<8|(H[45976]<<16|H[45977]<<24);a=k+28888|0;G[a>>2]=H[45970]|H[45971]<<8|(H[45972]<<16|H[45973]<<24);G[a+4>>2]=b;b=H[45966]|H[45967]<<8|(H[45968]<<16|H[45969]<<24);a=k+28880|0;G[a>>2]=H[45962]|H[45963]<<8|(H[45964]<<16|H[45965]<<24);G[a+4>>2]=b;a=H[45958]|H[45959]<<8|(H[45960]<<16|H[45961]<<24);G[k+28872>>2]=H[45954]|H[45955]<<8|(H[45956]<<16|H[45957]<<24);G[k+28876>>2]=a;a=H[45950]|H[45951]<<8|(H[45952]<<16|H[45953]<<24);G[k+28864>>2]=H[45946]|H[45947]<<8|(H[45948]<<16|H[45949]<<24);G[k+28868>>2]=a;Ua(k+28864|0);break b}if((yc(a,b,c,d,e,f,g,h,1,k+29e3|0,k+28992|0,k+28960|0,k+29056|0,k+29068|0,k+29064|0,k+29032|0,k+29024|0,k+29052|0,k+29040|0,k+29016|0,k+29060|0,k+29008|0,k+28832|0,j)|0)>0){break b}b=G[k+29056>>2];if((b|0)>=2881){G[k+29052>>2]=b;G[k+29064>>2]=1;G[k+29040>>2]=1;G[k+29044>>2]=0}c=0;d=0;if(!(g|h)){break b}e=0;f=0;while(1){b=G[k+29064>>2];o=b;m=b>>31;n=G[k+29040>>2];r=G[k+29044>>2];l=G[k+29036>>2];b=G[k+29032>>2];p=Au(G[k+29016>>2],G[k+29020>>2],e,f);b=b+p|0;l=Ia+l|0;l=b>>>0

>>0?l+1|0:l;q=b;p=G[k+29024>>2];s=G[k+29028>>2];b=G[k+29052>>2];t=Au(p,s,b,b>>31);q=q+t|0;b=Ia+l|0;Jb(a,q,q>>>0>>0?b+1|0:b,1,j);l=g>>>0>>0&(h|0)<=(m|0)|(h|0)<(m|0)?g:o;b=l;l=b>>31;m=b;b=r-((n>>>0

>>0)+s|0)|0;n=n-p|0;p=m>>>0>>0&(b|0)>=(l|0)|(b|0)>(l|0);n=p?m:n;f:{if((n|0)<=0){o=G[k+29056>>2];break f}p=c+n|0;m=k+32|0;o=G[k+29056>>2];while(1){g:{if((o|0)<=0){b=0;break g}b=0;q=G[(c<<2)+i>>2];r=H[q|0];if(!r){break g}while(1){E[m|0]=r;m=m+1|0;b=b+1|0;o=G[k+29056>>2];if((b|0)>=(o|0)){break g}r=H[q+1|0];q=q+1|0;if(r){continue}break}}if((b|0)<(o|0)){while(1){E[m|0]=32;m=m+1|0;b=b+1|0;o=G[k+29056>>2];if((b|0)<(o|0)){continue}break}}b=d;c=c+1|0;b=c?b:b+1|0;d=b;if((c|0)!=(p|0)){continue}break}}b=G[k+29052>>2];h:{if((b|0)==(o|0)){b=M(n,o);Wb(a,b,b>>31,k+32|0,j);break h}wd(a,o,n,b-o|0,k+32|0,j)}m=G[j>>2];if((m|0)>0){b=d;a=c+1|0;b=a?b:b+1|0;L[k+16>>3]=+(a>>>0)+ +(b|0)*4294967296;l=n;b=l>>31;a=c+l|0;b=b+d|0;L[k+24>>3]=+(a>>>0)+ +((a>>>0>>0?b+1|0:b)|0)*4294967296;a=k+28864|0;Ya(a,81,45816,k+16|0);Ua(a);break b}l=n;b=l>>31;h=h-((g>>>0>>0)+b|0)|0;g=g-l|0;if(!(h|g)){break a}b=b+G[k+29028>>2]|0;n=l+G[k+29024>>2]|0;b=n>>>0>>0?b+1|0:b;l=n;G[k+29024>>2]=l;G[k+29028>>2]=b;if(G[k+29040>>2]!=(l|0)|G[k+29044>>2]!=(b|0)){continue}G[k+29024>>2]=0;G[k+29028>>2]=0;b=f;e=e+1|0;b=e?b:b+1|0;f=b;continue}}m=309;G[j>>2]=309;break a}m=G[j>>2]}Fa=k+29072|0;return m}function Ie(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=Fa-208|0;Fa=d;a:{if(G[c>>2]>0){break a}if(!H[a|0]){G[c>>2]=204;break a}i=d+112|0;e=Fa-96|0;Fa=e;b:{c:{d:{e:{f:{if(G[c>>2]<=0){f=67;g:{h=H[a|0];switch(h-39|0){case 0:break c;case 1:break e;default:break g}}h:{switch(h-70|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break d;case 0:case 14:break f;default:break h}}if(h){break d}G[c>>2]=204}f=H[d+207|0];break b}f=76;break c}f=88;break c}f=70;if(jb(a,46)){break c}if(jb(a,69)){break c}f=jb(a,68)?70:73}E[d+207|0]=f}i:{j:{switch((f&255)-70|0){case 3:if(G[c>>2]>0){break i}G[48624]=0;G[b>>2]=0;G[b+4>>2]=0;j=b,k=Fn(a,e+92|0),G[j>>2]=k;G[b+4>>2]=Ia;if((H[G[e+92>>2]]|32)!=32){G[c>>2]=407}if(G[48624]!=68){break i}F[e+56>>1]=H[66897]|H[66898]<<8;f=H[66893]|H[66894]<<8|(H[66895]<<16|H[66896]<<24);G[e+48>>2]=H[66889]|H[66890]<<8|(H[66891]<<16|H[66892]<<24);G[e+52>>2]=f;f=H[66885]|H[66886]<<8|(H[66887]<<16|H[66888]<<24);G[e+40>>2]=H[66881]|H[66882]<<8|(H[66883]<<16|H[66884]<<24);G[e+44>>2]=f;f=H[66877]|H[66878]<<8|(H[66879]<<16|H[66880]<<24);G[e+32>>2]=H[66873]|H[66874]<<8|(H[66875]<<16|H[66876]<<24);G[e+36>>2]=f;f=H[66869]|H[66870]<<8|(H[66871]<<16|H[66872]<<24);G[e+24>>2]=H[66865]|H[66866]<<8|(H[66867]<<16|H[66868]<<24);G[e+28>>2]=f;f=H[66861]|H[66862]<<8|(H[66863]<<16|H[66864]<<24);G[e+16>>2]=H[66857]|H[66858]<<8|(H[66859]<<16|H[66860]<<24);G[e+20>>2]=f;f=H[66853]|H[66854]<<8|(H[66855]<<16|H[66856]<<24);G[e+8>>2]=H[66849]|H[66850]<<8|(H[66851]<<16|H[66852]<<24);G[e+12>>2]=f;f=H[66845]|H[66846]<<8|(H[66847]<<16|H[66848]<<24);G[e>>2]=H[66841]|H[66842]<<8|(H[66843]<<16|H[66844]<<24);G[e+4>>2]=f;tb(5,qb(e,a,23));G[c>>2]=412;G[48624]=0;break i;case 0:me(a,d,c);break i;case 6:if(G[c>>2]>0){break i}G[d+12>>2]=H[a|0]==84;break i;default:break j}}fd(a,i,c)}Fa=e+96|0;e=403;k:{l:{m:{n:{o:{switch(H[d+207|0]-67|0){case 0:if((me(d+112|0,d,c)|0)>0){break m}e=412;g=L[d>>3];if(g>0x8000000000000000|g<-0x8000000000000000){break l}if(O(g)<0x8000000000000000){e=~~g>>>0;f=O(g)>=1?~~(g>0?Q(S(g*2.3283064365386963e-10),4294967295):T((g-+(~~g>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break n}e=0;f=-2147483648;break n;case 3:e=412;g=L[d>>3];if(g>0x8000000000000000|g<-0x8000000000000000){break l}if(O(g)<0x8000000000000000){e=~~g>>>0;f=O(g)>=1?~~(g>0?Q(S(g*2.3283064365386963e-10),4294967295):T((g-+(~~g>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break n}e=0;f=-2147483648;break n;case 21:break l;case 9:break o;default:break m}}e=G[d+12>>2];f=e>>31}G[b>>2]=e;G[b+4>>2]=f}if(G[c>>2]>0){break k}break a}G[c>>2]=e}G[b>>2]=0;G[b+4>>2]=0;b=H[67242]|H[67243]<<8|(H[67244]<<16|H[67245]<<24);c=H[67238]|H[67239]<<8|(H[67240]<<16|H[67241]<<24);E[d+61|0]=c;E[d+62|0]=c>>>8;E[d+63|0]=c>>>16;E[d+64|0]=c>>>24;E[d+65|0]=b;E[d+66|0]=b>>>8;E[d+67|0]=b>>>16;E[d+68|0]=b>>>24;b=H[67237]|H[67238]<<8|(H[67239]<<16|H[67240]<<24);G[d+56>>2]=H[67233]|H[67234]<<8|(H[67235]<<16|H[67236]<<24);G[d+60>>2]=b;b=H[67229]|H[67230]<<8|(H[67231]<<16|H[67232]<<24);G[d+48>>2]=H[67225]|H[67226]<<8|(H[67227]<<16|H[67228]<<24);G[d+52>>2]=b;b=H[67221]|H[67222]<<8|(H[67223]<<16|H[67224]<<24);G[d+40>>2]=H[67217]|H[67218]<<8|(H[67219]<<16|H[67220]<<24);G[d+44>>2]=b;b=H[67213]|H[67214]<<8|(H[67215]<<16|H[67216]<<24);G[d+32>>2]=H[67209]|H[67210]<<8|(H[67211]<<16|H[67212]<<24);G[d+36>>2]=b;b=H[67205]|H[67206]<<8|(H[67207]<<16|H[67208]<<24);G[d+24>>2]=H[67201]|H[67202]<<8|(H[67203]<<16|H[67204]<<24);G[d+28>>2]=b;b=H[67197]|H[67198]<<8|(H[67199]<<16|H[67200]<<24);G[d+16>>2]=H[67193]|H[67194]<<8|(H[67195]<<16|H[67196]<<24);G[d+20>>2]=b;tb(5,qb(d+16|0,a,30))}Fa=d+208|0}function rc(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=Fa-304|0;Fa=j;E[j+206|0]=0;G[j+40>>2]=-1;G[j+44>>2]=-1;m=G[i>>2];a:{if((m|0)>0){break a}m=j+300|0;vd(a,b,m,0,0,i);k=G[j+300>>2];n=k>>31;b:{q=c;o=d;l=f<<1|e>>>31;d=e<<1;c=(k^n)-n>>>0>82;p=c?d-1|0:e;l=c?l-!d|0:f;e=g;d=c&31;if((c&63)>>>0>=32){h=e<>>32-d|h<>>30^-1)&2,j+216|0,j+208|0,j+176|0,j+280|0,m,j+296|0,j+240|0,j+232|0,j+276|0,j+248|0,j+224|0,j+292|0,j+264|0,j+48|0,i)|0)>0){break c}m=0;d:{e:{f:{g:{d=G[j+300>>2];switch(d-11|0){case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break d;case 0:case 10:case 30:break e;case 5:break g;default:break f}}if(H[j+48|0]==1){Ua(48313);break b}c=G[j+280>>2];c=(c|0)>20?c:20;d=ab(c);if(!d){m=113;G[i>>2]=113;break a}c=cb(d,32,c);d=j+48|0;e=Va(d);m=rb(c,d,(G[j+292>>2]==2)+e|0);break d}if((d|0)!=81){break d}}e=G[j+268>>2];c=G[j+264>>2];if(!e&(c|0)==1234554321){Ua(48252);break b}h:{i:{switch(d-11|0){case 0:E[j+207|0]=c;break d;case 10:F[j+290>>1]=c;Af(j+290|0,1);break d;default:if((d|0)==41){break h}break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break i}}G[j+256>>2]=c;G[j+260>>2]=e;Ge(j+256|0,1);break d}G[j+284>>2]=c;ke(j+284|0,1)}j:{k:{if(!(f|n)){break k}c=0;d=0;while(1){e=G[j+248>>2];k=G[j+252>>2];h=G[j+244>>2];g=G[j+240>>2];l=Au(G[j+224>>2],G[j+228>>2],r,s);g=g+l|0;h=Ia+h|0;h=g>>>0>>0?h+1|0:h;q=g;g=G[j+232>>2];o=G[j+236>>2];l=G[j+276>>2];p=Au(g,o,l,l>>31);l=q+p|0;h=Ia+h|0;Jb(a,l,l>>>0

>>0?h+1|0:h,1,i);h=k-((e>>>0>>0)+o|0)|0;e=e-g|0;g=(f|0)<=(h|0)&e>>>0>n>>>0|(f|0)<(h|0);e=g?n:e;k=g?f:h;l:{m:{switch(G[j+300>>2]-11|0){case 0:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,1,0,j+207|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break};break l;case 10:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,2,0,j+290|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break};break l;case 30:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,4,0,j+284|0,i);g=g+1|0;l=g?h:h+1|0;h=l;if((e|0)!=(g|0)|(k|0)!=(h|0)){continue}break};break l;case 70:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,8,0,j+256|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break};break l;case 31:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,4,0,j+40|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break};break l;case 71:g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,8,0,j+40|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break};break l;case 5:g=G[j+280>>2];Wb(a,g,g>>31,m,i);break l;default:G[j>>2]=b;G[j+4>>2]=j+176;a=j+80|0;Ya(a,81,8867,j);Ua(a);break c;case 3:break m}}g=0;h=0;if(!e&(k|0)<=0|(k|0)<0){break l}while(1){Wb(a,1,0,j+206|0,i);g=g+1|0;h=g?h:h+1|0;if((e|0)!=(g|0)|(h|0)!=(k|0)){continue}break}}if(G[i>>2]>0){l=d+k|0;a=c+e|0;l=a>>>0>>0?l+1|0:l;L[j+24>>3]=+(a>>>0)+ +(l|0)*4294967296;h=d;a=c+1|0;h=a?h:h+1|0;L[j+16>>3]=+(a>>>0)+ +(h|0)*4294967296;a=j+80|0;Ya(a,81,45314,j+16|0);Ua(a);if(m){break j}break c}f=f-((e>>>0>n>>>0)+k|0)|0;n=n-e|0;if(!(f|n)){break k}h=d+k|0;c=c+e|0;h=c>>>0>>0?h+1|0:h;d=h;h=k+G[j+236>>2]|0;g=e+G[j+232>>2]|0;h=g>>>0>>0?h+1|0:h;e=g;G[j+232>>2]=e;G[j+236>>2]=h;if(G[j+248>>2]!=(e|0)|G[j+252>>2]!=(h|0)){continue}G[j+232>>2]=0;G[j+236>>2]=0;l=s;e=r+1|0;l=e?l:l+1|0;r=e;s=l;continue}}if(!m){break c}}Wa(m)}m=G[i>>2];break a}m=314;G[i>>2]=314}Fa=j+304|0;return m}function lt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(H[1237232]){a=ck(1237232,c);if(a){Ua(39807);Ua(1237232);return a|0}i=G[c>>2];e=Fa-1008|0;Fa=e;a:{b:{h=G[30060];g=Tf(h);if((g|0)!=-1){while(1){a=0;c:{if(E[d+35530|0]!=(g|0)){break c}a=d+1|0;if((a|0)!=6){break c}F[e+4>>1]=H[35534]|H[35535]<<8;G[e>>2]=H[35530]|H[35531]<<8|(H[35532]<<16|H[35533]<<24);break b}g=Tf(h);if((g|0)!=-1){j=f>>>0<1999;f=f+1|0;d=a;if(j){continue}}break}if((a|0)==6){break b}}Ua(16450);f=104;break a}f=bk(i,e,zc(e|6,1,994,h)+6|0);if(f){break a}while(1){a=zc(e,1,1e3,h);if(!a){f=0;break a}f=bk(i,e,a);if(!f){continue}break}}Fa=e+1008|0;On(G[c>>2]);if(f){Ua(55718);Ua(1237232);return f|0}return dk(1237232,b,c)|0}f=G[30060];d=Tf(f)<<24;ak(d>>24,f);if(!((d|0)!=1258291200&(d|0)!=520093696)){f=Fa-16|0;Fa=f;d:{if(b){Ua(55362);d=112;break d}G[c>>2]=-1;d=0;e:{f:{g:{while(1){e=M(d,48)+757232|0;if(!G[e>>2]){b=d;break g}b=d+1|0;e=M(b,48)+757232|0;if(!G[e>>2]){break g}b=d+2|0;e=M(b,48)+757232|0;if(!G[e>>2]){break g}b=d+3|0;e=M(b,48)+757232|0;if(!G[e>>2]){break g}b=d+4|0;e=M(b,48)+757232|0;if(!G[e>>2]){break g}d=d+5|0;if((d|0)!=1e4){continue}break}d=103;break f}G[c>>2]=b;b=M(b,48);d=b+757236|0;G[e>>2]=d;e=b+757244|0;G[b+757240>>2]=e;g=d;d=ab(28800);G[g>>2]=d;if(d){break e}Ua(57797);d=104}Ua(55567);break d}G[e>>2]=28800;d=b+757256|0;G[d>>2]=0;G[d+4>>2]=0;G[b+757248>>2]=2880;d=b+757264|0;G[d>>2]=0;G[d+4>>2]=0;G[b+757252>>2]=17;b=G[c>>2];G[f+8>>2]=0;e=M(b,48);d=G[e+757240>>2];e=G[e+757232>>2];h=G[30060];h:{if(Sb(a,32688)){Ln(a,h,e,d,f+12|0,f+8|0);break h}hp(h,e,d,f+12|0,f+8|0)}a=M(b,48);b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;a=a+757264|0;G[a>>2]=G[f+12>>2];G[a+4>>2]=0;a=G[c>>2];d=G[f+8>>2];if(d){a=M(a,48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;Ua(55442);break d}d=0;e=M(a,48);b=G[e+757264>>2];if(J[G[e+757240>>2]>>2]<=b+256>>>0){break d}b=ub(G[G[M(a,48)+757232>>2]>>2],b);if(!b){Ua(55503);d=113;break d}a=M(G[c>>2],48);G[G[a+757232>>2]>>2]=b;G[G[a+757240>>2]>>2]=G[a+757264>>2]}Fa=f+16|0;return d|0}if(b){Ua(5895);return 112}G[c>>2]=-1;b=0;i:{j:{k:{while(1){a=M(b,48)+757232|0;if(!G[a>>2]){d=b;break k}d=b+1|0;a=M(d,48)+757232|0;if(!G[a>>2]){break k}d=b+2|0;a=M(d,48)+757232|0;if(!G[a>>2]){break k}d=b+3|0;a=M(d,48)+757232|0;if(!G[a>>2]){break k}d=b+4|0;a=M(d,48)+757232|0;if(!G[a>>2]){break k}b=b+5|0;if((b|0)!=1e4){continue}break}a=103;break j}G[c>>2]=d;g=a;a=M(d,48);b=a+757236|0;G[g>>2]=b;d=a+757244|0;G[a+757240>>2]=d;g=b;b=ab(2880);G[g>>2]=b;if(b){break i}Ua(57797);a=104}Ua(55670);return a|0}G[d>>2]=2880;b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757248>>2]=2880;b=a+757264|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757252>>2]=17;i=G[c>>2];a=M(i,48);e=G[a+757248>>2];k=a+757240|0;f=G[G[k>>2]>>2];l=a+757232|0;d=G[G[l>>2]>>2];l:{m:{h=G[30060];g=Tf(h);n:{if((g|0)==-1){break n}b=0;while(1){a=0;o:{if(E[b+35530|0]!=(g|0)){break o}a=b+1|0;if((a|0)!=6){break o}a=H[35534]|H[35535]<<8;E[d+4|0]=a;E[d+5|0]=a>>>8;a=H[35530]|H[35531]<<8|(H[35532]<<16|H[35533]<<24);E[d|0]=a;E[d+1|0]=a>>>8;E[d+2|0]=a>>>16;E[d+3|0]=a>>>24;a=0;b=zc(d+6|0,1,f-6|0,h)+6|0;if(b>>>0>=f>>>0){break m}a=M(i,48)+757264|0;G[a>>2]=b;G[a+4>>2]=0;a=0;break l}g=Tf(h);if((g|0)==-1){break n}m=j>>>0<1999;j=j+1|0;b=a;if(m){continue}break}}Ua(43331);Ua(44068);a=104;break l}while(1){f=e+f|0;d=ub(d,f);if(!d){Ua(57845);a=113;break l}g=zc(b+d|0,1,e,h);b=b+g|0;a=b>>>0>>0?a+1|0:a;if(e>>>0<=g>>>0){continue}break}e=M(i,48)+757264|0;G[e>>2]=b;G[e+4>>2]=a;G[G[l>>2]>>2]=d;G[G[k>>2]>>2]=f;a=0}if(!a){return 0}Ua(55624);Wa(G[M(G[c>>2],48)+757236>>2]);return a|0}function mj(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;c=Fa-800736|0;Fa=c;if(G[323091]>=3){G[c+208>>2]=a;kb(76323,c+208|0);$a(G[29763])}a:{b:{l=ac(a,13287);if(l){E[c+224|0]=0;n=b&-3;i=G[29763];c:while(1){if(!vc(c+800224|0,256,l)){break b}a=(Va(c+800224|0)+c|0)+800223|0;if(H[a|0]==10){E[a|0]=0}a=(Va(c+800224|0)+c|0)+800223|0;if(H[a|0]==13){E[a|0]=0}if(G[323091]>=3){G[c+192>>2]=c+800224;kb(76800,c+192|0);$a(i)}e=Za(c+800480|0,c+800224|0);j=e+Va(e)|0;while(1){g=e;a=H[e|0];if((a|0)==32){e=g+1|0;if(g>>>0>>0){continue}}break}f=g;while(1){e=a&255;if(!(!((e|0)==61|(e|0)==32)&f>>>0>>0)){e=f;while(1){a=(a&255)-32|0;if(!(a>>>0>29|!(1<>>0>=j>>>0)){a=H[e+1|0];e=e+1|0;continue}break}E[f|0]=0;a=(H[e|0]==39)+e|0;while(1){d:{e:{switch(H[a|0]-32|0){case 0:case 7:break d;default:break e}}if(a>>>0>=j>>>0){break d}a=a+1|0;continue}break}E[a|0]=0;if(G[323091]>=2){G[c+180>>2]=e;G[c+176>>2]=g;kb(76184,c+176|0);$a(i)}f:{if(n){break f}if(!Xa(g,41261)){d=L[161745];d=d+d;h=d+ +(_b(e)|0);g:{if(O(h)<2147483648){a=~~h;break g}a=-2147483648}G[323493]=a;d=d+ +(_b(e)|0);h:{if(O(d)<2147483648){f=~~d;break h}f=-2147483648}G[925223]=f;G[c+160>>2]=a;db(c+800224|0,27455,c+160|0)}if(!Xa(g,40853)){d=L[161745];d=d+d;h=d+ +(_b(e)|0);i:{if(O(h)<2147483648){a=~~h;break i}a=-2147483648}G[323494]=a;d=d+ +(_b(e)|0);j:{if(O(d)<2147483648){f=~~d;break j}f=-2147483648}G[925224]=f;G[c+144>>2]=a;db(c+800224|0,27441,c+144|0)}if(!Xa(g,41201)){d=sb(e)+L[161745];L[462616]=d;L[c+128>>3]=d;Eb(c+800224|0,18850,c+128|0)}if(!Xa(g,40799)){d=sb(e)+L[161745];L[462617]=d;L[c+112>>3]=d;Eb(c+800224|0,18818,c+112|0)}if(!Xa(g,41229)){d=sb(e)+L[161745];L[462618]=d;L[c+96>>3]=d;Eb(c+800224|0,18867,c+96|0)}if(Xa(g,40821)){break f}d=sb(e)+L[161745];L[462619]=d;L[c+80>>3]=d;Eb(c+800224|0,18835,c+80|0)}e=Va(c+224|0);a=Va(c+800224|0);k:{if((a|0)>0){bb(e+(c+224|0)|0,c+800224|0,a);if(a>>>0>79){break k}}cb(c+224+(a+e)|0,32,80-a|0)}E[(c+e|0)+304|0]=0;m=m+1|0;if((m|0)!=1e4){continue c}break b}a=H[f+1|0];f=f+1|0;continue}}}G[c+16>>2]=a;a=c+800224|0;db(a,44404,c+16|0);G[c>>2]=a;_a(G[321435],80471,c);break a}a=G[323091];l:{m:{n:{if((b|0)==1){if((a|0)>=3){G[c+32>>2]=c+224;kb(69844,c+32|0);$a(i)}a=c+224|0;Za(1300832,a);b=rd(a);G[323483]=b;if(!b){break l}d=2e3;a=4;o:{p:{switch(G[b+3964>>2]-1|0){case 0:a=0;if(L[b+120>>3]!=1950){break o}d=1950;break o;case 1:a=1;if(L[b+120>>3]==2e3){break o}d=1950;break o;case 3:if(L[b+120>>3]!=1950){a=2;break o}a=3;d=1950;break o;case 2:break o;default:break p}}a=0}L[161743]=d;G[323484]=a;G[323488]=0;d=L[b+32>>3];if(!(d<0&L[b+40>>3]<0|d>0&L[b+40>>3]>0)){G[323488]=1;a=43704;if(G[323091]>2){break n}break m}a=43640;if(G[323091]>2){break n}break m}q:{r:{if((a|0)>=3){if((b|0)==2){G[c+48>>2]=c+224;kb(69735,c+48|0);$a(i);e=2100832;break q}G[c+64>>2]=c+224;kb(69790,c- -64|0);$a(i);break r}e=2100832;if((b|0)==2){break q}}e=2900832}a=c+224|0;Za(e,a);b=rd(a);G[323495]=b;if(!b){break l}G[925225]=b;h=L[b+32>>3];k=L[b+40>>3];L[462610]=O(h*k)*.017453292519943295*.017453292519943295;d=2e3;a=4;s:{t:{switch(G[b+3964>>2]-1|0){case 0:a=0;if(L[b+120>>3]!=1950){break s}d=1950;break s;case 1:a=1;if(L[b+120>>3]==2e3){break s}d=1950;break s;case 3:if(L[b+120>>3]!=1950){a=2;break s}a=3;d=1950;break s;case 2:break s;default:break t}}a=0}L[161749]=d;G[323496]=a;L[462614]=d;G[925226]=a;G[323500]=0;if(!(h<0&k<0|h>0&k>0)){a=43604;if(G[323091]>2){break n}break m}G[323500]=1;a=43675;if(G[323091]<3){break m}}yb(a)}Fa=c+800736|0;return}hb(84378,54,1,G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()}function vf(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if(j==0){Gj(a,a,c,d,e,k,k,h,i,k);return}r=G[a+16>>2];f=+G[a+32>>2];g=k/f;k=(i-+G[a+24>>2])/f+1;i=g+k;a:{if(O(i)<2147483648){m=~~i;break a}m=-2147483648}o=m-1|0;q=i==+(m|0);n=q?o:m;i=k-g;b:{if(O(i)<2147483648){b=~~i;break b}b=-2147483648}l=b+1|0;c:{if((n|0)>(l|0)){p=G[a+8>>2];b=G[a+44>>2];L[(p+M(c,168)|0)+8>>3]=((b|0)>(l|0)?b:l)|0;b=G[a+48>>2];l=(n|0)>(b|0);m=l?b:m;m=l?m:q?o:m;break c}b=G[a+48>>2];n=(n|0)>(b|0);p=G[a+8>>2];m=n?b:m;L[(p+M(c,168)|0)+8>>3]=(n?m:q?o:m)|0;m=G[a+44>>2];m=(l|0)<(m|0)?m:l}l=M(c,168);o=l+p|0;L[o+16>>3]=m|0;q=lb(b+1|0,4);G[o+24>>2]=q;Pf(a,c,d,e);b=l+G[a+8>>2]|0;s=L[b+16>>3];i=L[b+8>>3];d:{if(O(i)<2147483648){m=~~i;break d}m=-2147483648}i=+(m|0);if(s>=i){j=j/f;f=(h-+(r|0))/f+1;t=M(c,168);while(1){h=i-k;i=h*-h;h=g*g+i;e:{if(!(h>0)){break e}s=V(h);h=f+s;f:{if(O(h)<2147483648){b=~~h;break f}b=-2147483648}o=b-(h==+(b|0))|0;h=f-s;g:{if(O(h)<2147483648){l=~~h;break g}l=-2147483648}h:{if((o|0)<=(l|0)){break h}b=G[a+48>>2];c=G[a+44>>2];r=lb(1,8);n=l+1|0;G[r+4>>2]=n;i:{if(!q){break i}c=(c|0)>(m|0)?c:m;p=((b|0)>(c|0)?c:b)<<2;b=p+q|0;c=G[b>>2];j:{if(!c){c=0;break j}if((n|0)>2]){break j}while(1){b=c;c=G[b>>2];if(!c){c=0;break j}if((l|0)>=G[c+4>>2]){continue}break}}G[r>>2]=c;G[b>>2]=r;if((e|0)==1){break i}if(d){b=p+G[a+56>>2]|0;if((l|0)>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(n|0)?b:n}b=p+G[a+60>>2]|0;if((n|0)>2]){break i}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(n|0)?b:n;break i}G[p+G[a+56>>2]>>2]=G[a+36>>2];G[p+G[a+60>>2]>>2]=G[a+40>>2]}b=G[a+48>>2];c=G[a+44>>2];n=lb(1,8);G[n+4>>2]=o;if(!q){break h}c=(c|0)>(m|0)?c:m;l=((b|0)>(c|0)?c:b)<<2;b=l+q|0;c=G[b>>2];k:{if(!c){c=0;break k}if((o|0)>2]){break k}while(1){b=c;c=G[b>>2];if(!c){c=0;break k}if((o|0)>G[c+4>>2]){continue}break}}G[n>>2]=c;G[b>>2]=n;if((e|0)==1){break h}if(d){b=l+G[a+56>>2]|0;if((o|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(o|0)?b:o}b=l+G[a+60>>2]|0;if((o|0)>2]){break h}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(o|0)?b:o;break h}G[l+G[a+56>>2]>>2]=G[a+36>>2];G[l+G[a+60>>2]>>2]=G[a+40>>2]}h=j*j+i;if(!(h>0)){break e}i=V(h);h=f+i;l:{if(O(h)<2147483648){b=~~h;break l}b=-2147483648}o=b-(h==+(b|0))|0;h=f-i;m:{if(O(h)<2147483648){l=~~h;break m}l=-2147483648}if((o|0)<=(l|0)){break e}b=G[a+48>>2];c=G[a+44>>2];r=lb(1,8);n=l+1|0;G[r+4>>2]=n;n:{if(!q){break n}c=(c|0)>(m|0)?c:m;p=((b|0)>(c|0)?c:b)<<2;b=p+q|0;c=G[b>>2];o:{if(!c){c=0;break o}if((n|0)>2]){break o}while(1){b=c;c=G[b>>2];if(!c){c=0;break o}if((l|0)>=G[c+4>>2]){continue}break}}G[r>>2]=c;G[b>>2]=r;if((e|0)==1){break n}if(d){b=p+G[a+56>>2]|0;if((l|0)>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(n|0)?b:n}b=p+G[a+60>>2]|0;if((n|0)>2]){break n}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(n|0)?b:n;break n}G[p+G[a+56>>2]>>2]=G[a+36>>2];G[p+G[a+60>>2]>>2]=G[a+40>>2]}b=G[a+48>>2];c=G[a+44>>2];n=lb(1,8);G[n+4>>2]=o;if(!q){break e}c=(c|0)>(m|0)?c:m;l=((b|0)>(c|0)?c:b)<<2;b=l+q|0;c=G[b>>2];p:{if(!c){c=0;break p}if((o|0)>2]){break p}while(1){b=c;c=G[b>>2];if(!c){c=0;break p}if((o|0)>G[c+4>>2]){continue}break}}G[n>>2]=c;G[b>>2]=n;if((e|0)==1){break e}if(d){b=l+G[a+56>>2]|0;if((o|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(o|0)?b:o}b=l+G[a+60>>2]|0;if((o|0)>2]){break e}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(o|0)?b:o;break e}G[l+G[a+56>>2]>>2]=G[a+36>>2];G[l+G[a+60>>2]>>2]=G[a+40>>2]}m=m+1|0;i=+(m|0);if(i<=L[(G[a+8>>2]+t|0)+16>>3]){continue}break}}}function jp(a,b){a=a|0;b=b|0;var 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;c=G[a+12>>2]-5|0;d=G[a+44>>2];m=c>>>0>>0?c:d;g=G[G[a>>2]+4>>2];n=(b|0)!=4;a:{while(1){f=1;d=G[a>>2];c=G[d+16>>2];i=G[a+5820>>2]+42>>3;if(c>>>0>>0){break a}j=G[a+108>>2];k=G[a+92>>2];h=j-k|0;e=h+G[d+4>>2]|0;c=c-i|0;c=c>>>0>e>>>0?e:c;c=c>>>0<65535?c:65535;if(m>>>0>c>>>0){if(!b|!c&n|(c|0)!=(e|0)){break a}}i=(b|0)==4&(c|0)==(e|0);Si(a,0,0,i);E[(G[a+20>>2]+G[a+8>>2]|0)-4|0]=c;E[(G[a+20>>2]+G[a+8>>2]|0)-3|0]=c>>>8;d=c^-1;E[(G[a+20>>2]+G[a+8>>2]|0)-2|0]=d;E[(G[a+20>>2]+G[a+8>>2]|0)-1|0]=d>>>8;d=G[a>>2];e=G[d+28>>2];cd(e);f=G[e+20>>2];l=G[d+16>>2];f=f>>>0>>0?f:l;b:{if(!f){break b}bb(G[d+12>>2],G[e+16>>2],f);G[d+12>>2]=f+G[d+12>>2];G[e+16>>2]=f+G[e+16>>2];G[d+20>>2]=f+G[d+20>>2];G[d+16>>2]=G[d+16>>2]-f;d=G[e+20>>2];G[e+20>>2]=d-f;if((d|0)!=(f|0)){break b}G[e+16>>2]=G[e+8>>2]}if((j|0)!=(k|0)){d=c>>>0>h>>>0?h:c;bb(G[G[a>>2]+12>>2],G[a+56>>2]+G[a+92>>2]|0,d);e=G[a>>2];G[e+12>>2]=d+G[e+12>>2];G[e+16>>2]=G[e+16>>2]-d;G[e+20>>2]=d+G[e+20>>2];G[a+92>>2]=d+G[a+92>>2];c=c-d|0}if(c){e=G[a>>2];f=G[e+12>>2];h=G[e+4>>2];d=c>>>0>h>>>0?h:c;if(d){G[e+4>>2]=h-d;f=bb(f,G[e>>2],d);c:{d:{switch(G[G[e+28>>2]+24>>2]-1|0){case 0:o=e,p=gf(G[e+48>>2],f,d),G[o+48>>2]=p;break c;case 1:break d;default:break c}}o=e,p=Oc(G[e+48>>2],f,d),G[o+48>>2]=p}G[e>>2]=d+G[e>>2];G[e+8>>2]=d+G[e+8>>2];e=G[a>>2];f=G[e+12>>2]}G[e+12>>2]=c+f;G[e+16>>2]=G[e+16>>2]-c;G[e+20>>2]=G[e+20>>2]+c}if(!i){continue}break}d=G[a>>2];f=0}c=G[d+4>>2];e:{if((c|0)==(g|0)){c=G[a+108>>2];break e}e=g-c|0;c=G[a+44>>2];f:{if(e>>>0>=c>>>0){G[a+5808>>2]=2;bb(G[a+56>>2],G[d>>2]-c|0,c);d=G[a+44>>2];G[a+108>>2]=d;c=d;break f}d=G[a+108>>2];g:{if(e>>>0>2]-d>>>0){break g}d=d-c|0;G[a+108>>2]=d;g=G[a+56>>2];bb(g,c+g|0,d);c=G[a+5808>>2];if(c>>>0>1){break g}G[a+5808>>2]=c+1}bb(G[a+56>>2]+G[a+108>>2]|0,G[G[a>>2]>>2]-e|0,e);c=e+G[a+108>>2]|0;G[a+108>>2]=c;d=G[a+44>>2]}G[a+92>>2]=c;g=d;d=G[a+5812>>2];g=g-d|0;G[a+5812>>2]=(e>>>0>>0?e:g)+d}if(J[a+5824>>2]>>0){G[a+5824>>2]=c}e=3;h:{if(!f){break h}i:{j:{switch(b|0){case 0:case 4:break i;default:break j}}if(G[G[a>>2]+4>>2]){break i}e=1;if(G[a+92>>2]==(c|0)){break h}}e=G[a>>2];d=G[e+4>>2];f=G[a+60>>2]+(c^-1)|0;k:{if(d>>>0<=f>>>0){break k}h=G[a+92>>2];g=G[a+44>>2];if((h|0)<(g|0)){break k}c=c-g|0;G[a+108>>2]=c;G[a+92>>2]=h-g;d=G[a+56>>2];bb(d,d+g|0,c);c=G[a+5808>>2];if(c>>>0<=1){G[a+5808>>2]=c+1}f=G[a+44>>2]+f|0;e=G[a>>2];d=G[e+4>>2]}c=d>>>0>f>>>0?f:d;l:{if(!c){c=G[a+108>>2];break l}f=G[a+108>>2];g=G[a+56>>2];G[e+4>>2]=d-c;d=bb(f+g|0,G[e>>2],c);m:{n:{switch(G[G[e+28>>2]+24>>2]-1|0){case 0:o=e,p=gf(G[e+48>>2],d,c),G[o+48>>2]=p;break m;case 1:break n;default:break m}}o=e,p=Oc(G[e+48>>2],d,c),G[o+48>>2]=p}G[e>>2]=c+G[e>>2];G[e+8>>2]=c+G[e+8>>2];c=c+G[a+108>>2]|0;G[a+108>>2]=c}if(J[a+5824>>2]>>0){G[a+5824>>2]=c}g=G[a+92>>2];f=c-g|0;d=G[a+12>>2]-(G[a+5820>>2]+42>>3)|0;d=d>>>0<65535?d:65535;e=G[a+44>>2];if(f>>>0<(e>>>0>d>>>0?d:e)>>>0){e=0;if(!b|!((b|0)==4|(c|0)!=(g|0))|(G[G[a>>2]+4>>2]|d>>>0>>0)){break h}}e=0;e=(b|0)==4?!G[G[a>>2]+4>>2]&d>>>0>=f>>>0:e;b=d>>>0>f>>>0?f:d;Si(a,g+G[a+56>>2]|0,b,e);G[a+92>>2]=b+G[a+92>>2];a=G[a>>2];b=G[a+28>>2];cd(b);c=G[b+20>>2];d=G[a+16>>2];c=c>>>0>>0?c:d;o:{if(!c){break o}bb(G[a+12>>2],G[b+16>>2],c);G[a+12>>2]=c+G[a+12>>2];G[b+16>>2]=c+G[b+16>>2];G[a+20>>2]=c+G[a+20>>2];G[a+16>>2]=G[a+16>>2]-c;a=G[b+20>>2];G[b+20>>2]=a-c;if((a|0)!=(c|0)){break o}G[b+16>>2]=G[b+8>>2]}e=e?2:0}return e|0}function km(a,b,c){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;l=Fa-112|0;Fa=l;a:{b:{c:{d=b<<2;u=ab(d);if(u){v=ab(d);if(v){x=ab(d);if(x){if((b|0)<=0){break b}q=cb(x,0,d);A=b&-2;B=b&1;z=b&-4;r=b&3;w=b-1|0;while(1){g=0;e=0;d:{e:{f:{g:{while(1){d=g<<2;if(G[d+q>>2]!=1){h=a+d|0;d=0;while(1){j=G[q+(d<<2)>>2];h:{if(!j){t=O(L[G[h>>2]+(d<<3)>>3]);if(!(t>=e)){break h}e=t;s=g;p=d;break h}if((j|0)>=2){break g}}d=d+1|0;if((d|0)!=(b|0)){continue}break}}g=g+1|0;if((g|0)!=(b|0)){continue}break}m=p<<2;d=m+q|0;G[d>>2]=G[d>>2]+1;if((p|0)==(s|0)){break d}j=G[a+m>>2];n=s<<2;f=G[n+a>>2];h=0;d=0;g=0;if(w>>>0>2){break f}break e}G[l+96>>2]=41380;_a(G[321435],80504,l+96|0);break a}while(1){i=d<<3;k=i+f|0;e=L[k>>3];o=k;k=j+i|0;L[o>>3]=L[k>>3];L[k>>3]=e;k=i|8;o=k+f|0;e=L[o>>3];k=j+k|0;L[o>>3]=L[k>>3];L[k>>3]=e;k=i|16;o=k+f|0;e=L[o>>3];k=j+k|0;L[o>>3]=L[k>>3];L[k>>3]=e;i=i|24;k=i+f|0;e=L[k>>3];i=j+i|0;L[k>>3]=L[i>>3];L[i>>3]=e;d=d+4|0;g=g+4|0;if((z|0)!=(g|0)){continue}break}}if(r){while(1){g=d<<3;i=g+f|0;e=L[i>>3];g=g+j|0;L[i>>3]=L[g>>3];L[g>>3]=e;d=d+1|0;h=h+1|0;if((r|0)!=(h|0)){continue}break}}g=G[c+m>>2];j=G[c+n>>2];h=0;d=0;while(1){f=d<<3;i=f+j|0;e=L[i>>3];f=g+f|0;L[i>>3]=L[f>>3];L[f>>3]=e;d=d+1|0;h=h+1|0;if((h|0)!=1){continue}break}}d=y<<2;G[d+v>>2]=s;G[d+u>>2]=p;i:{j:{j=G[a+m>>2];i=p<<3;d=j+i|0;e=L[d>>3];if(e!=0){G[d>>2]=0;G[d+4>>2]=1072693248;e=1/e;g=0;d=0;h=0;if(w>>>0>2){break j}break i}G[l+48>>2]=40903;_a(G[321435],80504,l+48|0);break a}while(1){f=d<<3;n=f+j|0;L[n>>3]=e*L[n>>3];n=j+(f|8)|0;L[n>>3]=e*L[n>>3];n=j+(f|16)|0;L[n>>3]=e*L[n>>3];f=j+(f|24)|0;L[f>>3]=e*L[f>>3];d=d+4|0;h=h+4|0;if((z|0)!=(h|0)){continue}break}}if(r){while(1){h=j+(d<<3)|0;L[h>>3]=e*L[h>>3];d=d+1|0;g=g+1|0;if((r|0)!=(g|0)){continue}break}}g=G[c+m>>2];h=0;d=0;while(1){f=g+(d<<3)|0;L[f>>3]=e*L[f>>3];d=d+1|0;h=h+1|0;if((h|0)!=1){continue}break}n=c+m|0;g=0;while(1){if((g|0)!=(p|0)){k=g<<2;m=G[k+a>>2];d=m+i|0;e=L[d>>3];G[d>>2]=0;G[d+4>>2]=0;d=0;h=0;if(w){while(1){f=d<<3;o=f+m|0;L[o>>3]=L[o>>3]-L[f+j>>3]*e;f=f|8;o=f+m|0;L[o>>3]=L[o>>3]-L[f+j>>3]*e;d=d+2|0;h=h+2|0;if((A|0)!=(h|0)){continue}break}}if(B){d=d<<3;h=d+m|0;L[h>>3]=L[h>>3]-L[d+j>>3]*e}d=G[c+k>>2];L[d>>3]=L[d>>3]-L[G[n>>2]>>3]*e}g=g+1|0;if((g|0)!=(b|0)){continue}break}y=y+1|0;if((y|0)!=(b|0)){continue}break}break c}G[l+32>>2]=63787;_a(G[321435],80504,l+32|0);break a}G[l+16>>2]=63787;_a(G[321435],80504,l+16|0);break a}G[l>>2]=63787;_a(G[321435],80504,l);break a}if((b|0)<=0){break b}j=b&-2;m=b&1;p=b;while(1){g=p;p=g-1|0;c=p<<2;s=G[c+v>>2];h=G[c+u>>2];k:{if((s|0)==(h|0)){break k}d=0;c=0;if(w){while(1){f=d<<2;r=G[f+a>>2];i=s<<3;q=r+i|0;e=L[q>>3];k=q;q=r;r=h<<3;q=q+r|0;L[k>>3]=L[q>>3];L[q>>3]=e;f=G[(f|4)+a>>2];i=f+i|0;e=L[i>>3];f=f+r|0;L[i>>3]=L[f>>3];L[f>>3]=e;d=d+2|0;c=c+2|0;if((j|0)!=(c|0)){continue}break}}if(!m){break k}c=G[(d<<2)+a>>2];d=c+(s<<3)|0;e=L[d>>3];c=c+(h<<3)|0;L[d>>3]=L[c>>3];L[c>>3]=e}if((g|0)>1){continue}break}}if(H[1287936]){yb(36476);p=-1;e=0;l:{if((b|0)<=0){g=-1;break l}c=0;g=-1;while(1){s=(c<<2)+a|0;d=0;while(1){h=G[(d<<2)+a>>2];j=c<<3;t=L[h+j>>3]/V(O(L[h+(d<<3)>>3]*L[j+G[s>>2]>>3]));L[l+80>>3]=t;gb(66395,l+80|0);m:{if((c|0)==(d|0)){break m}t=O(t);if(!(t>e)){break m}g=d;p=c;e=t}d=d+1|0;if((d|0)!=(b|0)){continue}break}id();c=c+1|0;if((c|0)!=(b|0)){continue}break}}G[l+76>>2]=p;G[l+72>>2]=g;L[l+64>>3]=e;gb(91999,l- -64|0)}Wa(x);Wa(v);Wa(u);Fa=l+112|0;return}$a(G[321435]);Hb(G[321435]);sc(1);W()}function Og(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=Fa-304|0;Fa=j;E[j+206|0]=0;G[j+40>>2]=-1;G[j+44>>2]=-1;k=G[i>>2];a:{if((k|0)>0){break a}k=j+300|0;vd(a,b,k,0,0,i);b:{c:{if((yc(a,b,c,d,e,f,g,h,(G[j+300>>2]>>>30^-1)&2,j+216|0,j+208|0,j+176|0,j+280|0,k,j+296|0,j+240|0,j+232|0,j+276|0,j+248|0,j+224|0,j+292|0,j+264|0,j+48|0,i)|0)>0){break c}k=0;d:{e:{f:{g:{d=G[j+300>>2];switch(d-11|0){case 1:case 2:case 3:case 4:case 6:case 7:case 8:case 9:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break d;case 0:case 10:case 30:break e;case 5:break g;default:break f}}if(H[j+48|0]==1){Ua(48313);break b}c=G[j+280>>2];c=(c|0)>20?c:20;d=ab(c);if(!d){k=113;G[i>>2]=113;break a}c=cb(d,32,c);d=j+48|0;e=Va(d);k=rb(c,d,(G[j+292>>2]==2)+e|0);break d}if((d|0)!=81){break d}}e=G[j+268>>2];c=G[j+264>>2];if(!e&(c|0)==1234554321){Ua(48252);break b}h:{i:{switch(d-11|0){case 0:E[j+207|0]=c;break d;case 10:F[j+290>>1]=c;Af(j+290|0,1);break d;default:if((d|0)==41){break h}break;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break i}}G[j+256>>2]=c;G[j+260>>2]=e;Ge(j+256|0,1);break d}G[j+284>>2]=c;ke(j+284|0,1)}j:{k:{if(!(g|h)){break k}while(1){c=G[j+248>>2];r=G[j+252>>2];d=G[j+244>>2];e=G[j+240>>2];f=Au(G[j+224>>2],G[j+228>>2],n,o);e=e+f|0;d=Ia+d|0;d=e>>>0>>0?d+1|0:d;s=e;e=G[j+232>>2];p=G[j+236>>2];f=G[j+276>>2];q=Au(e,p,f,f>>31);f=s+q|0;d=Ia+d|0;Jb(a,f,f>>>0>>0?d+1|0:d,1,i);d=r-((c>>>0>>0)+p|0)|0;c=c-e|0;e=c;c=c>>>0>g>>>0&(d|0)>=(h|0)|(d|0)>(h|0);e=c?g:e;f=c?h:d;l:{m:{switch(G[j+300>>2]-11|0){case 0:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,1,0,j+207|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 10:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,2,0,j+290|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 30:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,4,0,j+284|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 70:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,8,0,j+256|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 31:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,4,0,j+40|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 71:c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,8,0,j+40|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break};break l;case 5:c=G[j+280>>2];Wb(a,c,c>>31,k,i);break l;default:G[j>>2]=b;G[j+4>>2]=j+176;a=j+80|0;Ya(a,81,8867,j);Ua(a);break c;case 3:break m}}c=0;d=0;if(!e&(f|0)<=0|(f|0)<0){break l}while(1){Wb(a,1,0,j+206|0,i);c=c+1|0;d=c?d:d+1|0;if((e|0)!=(c|0)|(d|0)!=(f|0)){continue}break}}if(G[i>>2]>0){d=f+m|0;a=e+l|0;d=a>>>0>>0?d+1|0:d;L[j+24>>3]=+(a>>>0)+ +(d|0)*4294967296;d=m;a=l+1|0;d=a?d:d+1|0;L[j+16>>3]=+(a>>>0)+ +(d|0)*4294967296;a=j+80|0;Ya(a,81,45314,j+16|0);Ua(a);if(k){break j}break c}h=h-((e>>>0>g>>>0)+f|0)|0;g=g-e|0;if(!(h|g)){break k}d=f+m|0;c=e+l|0;d=c>>>0>>0?d+1|0:d;l=c;m=d;d=f+G[j+236>>2]|0;c=e+G[j+232>>2]|0;d=c>>>0>>0?d+1|0:d;G[j+232>>2]=c;G[j+236>>2]=d;if(G[j+248>>2]!=(c|0)|G[j+252>>2]!=(d|0)){continue}G[j+232>>2]=0;G[j+236>>2]=0;d=o;c=n+1|0;d=c?d:d+1|0;n=c;o=d;continue}}if(!k){break c}}Wa(k)}k=G[i>>2];break a}k=314;G[i>>2]=314}Fa=j+304|0;return k}function Li(a,b,c,d,e,f){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,F=0;u=(d|0)>(e|0)?d:e;x=oc(+N(u|0))/.6931471805599453+.5;a:{if(O(x)<2147483648){g=~~x;break a}g=-2147483648}h=e+1|0;j=d+1|0;y=M((h|0)/2|0,(j|0)/2|0);v=(y+1|0)/2|0;k=ab(v<<1);t=ab(v);if(!(!k|!t)){if((f|0)>0){z=g+((u|0)>1<>1;B=j>>1;C=M(A,B);while(1){u=f;f=f-1|0;bp(b,c,d,e,k,f);q=0;i=0;j=0;r=0;b:{c:{if((C|0)>0){while(1){g=H[i+k|0];d:{if(!g){break d}g=g<<2;r=G[g+118592>>2]<>2]+j|0;if((j|0)<8){break d}E[q+t|0]=r;q=q+1|0;if((v|0)<=(q|0)){break c}j=j-8|0;r=r>>8}i=i+1|0;if((C|0)!=(i|0)){continue}break}}w=1;m=A;o=B;if((z|0)>1){while(1){g=0;e:{if((o|0)<2){n=0;break e}if((m|0)>=2){D=o-1|0;F=m&-2;s=(m-2>>>1|0)+1|0;n=0;while(1){p=g+s|0;i=M(m,n);l=m+i|0;while(1){h=k+l|0;E[g+k|0]=(H[h|0]!=0)<<1|H[h+1|0]!=0|(H[(i|1)+k|0]!=0)<<2|(H[i+k|0]!=0)<<3;l=l+2|0;i=i+2|0;h=g;g=g+1|0;if((p|0)!=(g|0)){continue}break}f:{if(m>>>0>F>>>0){E[k+p|0]=(H[i+k|0]!=0)<<3|(H[k+l|0]!=0)<<1;g=h+2|0;break f}g=p}n=n+2|0;if((D|0)>(n|0)){continue}break}break e}if((m|0)!=1){n=o&-2;break e}h=o-2|0;g=(h>>>1|0)+1|0;p=g&1;i=0;n=0;if(h>>>0>=2){h=g&-2;l=0;while(1){E[i+k|0]=(H[k+n|0]!=0)<<3|(H[(n|1)+k|0]!=0)<<1;E[(i|1)+k|0]=(H[(n|2)+k|0]!=0)<<3|(H[(n|3)+k|0]!=0)<<1;n=n+4|0;i=i+2|0;l=l+2|0;if((h|0)!=(l|0)){continue}break}}if(!p){break e}E[i+k|0]=(H[k+n|0]!=0)<<3|(H[(n|1)+k|0]!=0)<<1;n=n+2|0}g:{if((n|0)>=(o|0)){break g}i=M(m,n);l=0;if((m|0)>=2){h=m-1|0;while(1){E[g+k|0]=(H[i+k|0]!=0)<<3|(H[(i|1)+k|0]!=0)<<2;i=i+2|0;g=g+1|0;l=l+2|0;if((h|0)>(l|0)){continue}break}h=m&-2}else{h=0}if((h|0)>=(m|0)){break g}E[g+k|0]=(H[i+k|0]!=0)<<3}i=0;m=m+1>>1;o=o+1>>1;h=M(m,o);if((h|0)>0){while(1){g=H[i+k|0];h:{if(!g){break h}g=g<<2;r=G[g+118592>>2]<>2]+j|0;if((j|0)<8){break h}E[q+t|0]=r;q=q+1|0;if((v|0)<=(q|0)){break c}j=j-8|0;r=r>>8}i=i+1|0;if((h|0)!=(i|0)){continue}break}}w=w+1|0;if((w|0)!=(z|0)){continue}break}}h=G[48830];i=h-4|0;G[48830]=i;l=G[48829]<<4|15;G[48829]=l;if((h|0)<=4){g=G[48828];E[g+a|0]=l>>4-h;if((g|0)>>0<4?g+1|0:g;s=p;G[48832]=p;G[48833]=g;if(!q){if((j|0)>0){o=i-j|0;G[48830]=o;h=G[(j<<2)+118720>>2]&((-1<>0-o;if((p|0)>>0>>0?g+1|0:g;G[48832]=h;G[48833]=g;break b}G[48830]=i-6;g=l<<6|62;G[48829]=g;if((i|0)<=6){j=G[48828];E[j+a|0]=g>>6-i;if((j|0)>>0<10?h+1|0:h;G[48832]=g;G[48833]=h;break b}if((j|0)>0){i=i-j|0;G[48830]=i;l=G[(j<<2)+118720>>2]&((-1<>0-i;if((h|0)>>0>>0?g+1|0:g;s=h;G[48832]=h;G[48833]=g}if((q|0)<=0){break b}p=G[48827];m=G[48828];while(1){j=q;q=j-1|0;l=H[t+q|0]|l<<8;i:{if((i|0)>8){i=i-8|0;break i}E[a+m|0]=l>>8-i;if((m|0)>=(p|0)){break i}m=m+1|0;G[48828]=m}h=s+8|0;g=h>>>0<8?g+1|0:g;s=h;if(j>>>0>1){continue}break}G[48830]=i;G[48829]=l;G[48832]=s;G[48833]=g;break b}g=G[48829]<<4;G[48829]=g;h=G[48830];G[48830]=h-4;if((h|0)<=4){j=G[48828];E[j+a|0]=g>>4-h;if((j|0)>>0<4?g+1|0:g;G[48832]=j;G[48833]=g;bp(b,c,d,e,k,f);ap(a,y,k)}if((u|0)>1){continue}break}}Wa(t);Wa(k);return 0}Ua(3023);return 413}function Ki(a,b,c,d,e,f){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,F=0;u=(d|0)>(e|0)?d:e;x=oc(+N(u|0))/.6931471805599453+.5;a:{if(O(x)<2147483648){g=~~x;break a}g=-2147483648}h=e+1|0;j=d+1|0;y=M((h|0)/2|0,(j|0)/2|0);v=(y+1|0)/2|0;k=ab(v<<1);t=ab(v);if(!(!k|!t)){if((f|0)>0){z=g+((u|0)>1<>1;B=j>>1;C=M(A,B);while(1){u=f;f=f-1|0;$o(b,c,d,e,k,f);q=0;i=0;j=0;r=0;b:{c:{if((C|0)>0){while(1){g=H[i+k|0];d:{if(!g){break d}g=g<<2;r=G[g+118592>>2]<>2]+j|0;if((j|0)<8){break d}E[q+t|0]=r;q=q+1|0;if((v|0)<=(q|0)){break c}j=j-8|0;r=r>>8}i=i+1|0;if((C|0)!=(i|0)){continue}break}}w=1;m=A;o=B;if((z|0)>1){while(1){g=0;e:{if((o|0)<2){n=0;break e}if((m|0)>=2){D=o-1|0;F=m&-2;s=(m-2>>>1|0)+1|0;n=0;while(1){p=g+s|0;i=M(m,n);l=m+i|0;while(1){h=k+l|0;E[g+k|0]=(H[h|0]!=0)<<1|H[h+1|0]!=0|(H[(i|1)+k|0]!=0)<<2|(H[i+k|0]!=0)<<3;l=l+2|0;i=i+2|0;h=g;g=g+1|0;if((p|0)!=(g|0)){continue}break}f:{if(m>>>0>F>>>0){E[k+p|0]=(H[i+k|0]!=0)<<3|(H[k+l|0]!=0)<<1;g=h+2|0;break f}g=p}n=n+2|0;if((D|0)>(n|0)){continue}break}break e}if((m|0)!=1){n=o&-2;break e}h=o-2|0;g=(h>>>1|0)+1|0;p=g&1;i=0;n=0;if(h>>>0>=2){h=g&-2;l=0;while(1){E[i+k|0]=(H[k+n|0]!=0)<<3|(H[(n|1)+k|0]!=0)<<1;E[(i|1)+k|0]=(H[(n|2)+k|0]!=0)<<3|(H[(n|3)+k|0]!=0)<<1;n=n+4|0;i=i+2|0;l=l+2|0;if((h|0)!=(l|0)){continue}break}}if(!p){break e}E[i+k|0]=(H[k+n|0]!=0)<<3|(H[(n|1)+k|0]!=0)<<1;n=n+2|0}g:{if((n|0)>=(o|0)){break g}i=M(m,n);l=0;if((m|0)>=2){h=m-1|0;while(1){E[g+k|0]=(H[i+k|0]!=0)<<3|(H[(i|1)+k|0]!=0)<<2;i=i+2|0;g=g+1|0;l=l+2|0;if((h|0)>(l|0)){continue}break}h=m&-2}else{h=0}if((h|0)>=(m|0)){break g}E[g+k|0]=(H[i+k|0]!=0)<<3}i=0;m=m+1>>1;o=o+1>>1;h=M(m,o);if((h|0)>0){while(1){g=H[i+k|0];h:{if(!g){break h}g=g<<2;r=G[g+118592>>2]<>2]+j|0;if((j|0)<8){break h}E[q+t|0]=r;q=q+1|0;if((v|0)<=(q|0)){break c}j=j-8|0;r=r>>8}i=i+1|0;if((h|0)!=(i|0)){continue}break}}w=w+1|0;if((w|0)!=(z|0)){continue}break}}h=G[48830];i=h-4|0;G[48830]=i;l=G[48829]<<4|15;G[48829]=l;if((h|0)<=4){g=G[48828];E[g+a|0]=l>>4-h;if((g|0)>>0<4?g+1|0:g;s=p;G[48832]=p;G[48833]=g;if(!q){if((j|0)>0){o=i-j|0;G[48830]=o;h=G[(j<<2)+118720>>2]&((-1<>0-o;if((p|0)>>0>>0?g+1|0:g;G[48832]=h;G[48833]=g;break b}G[48830]=i-6;g=l<<6|62;G[48829]=g;if((i|0)<=6){j=G[48828];E[j+a|0]=g>>6-i;if((j|0)>>0<10?h+1|0:h;G[48832]=g;G[48833]=h;break b}if((j|0)>0){i=i-j|0;G[48830]=i;l=G[(j<<2)+118720>>2]&((-1<>0-i;if((h|0)>>0>>0?g+1|0:g;s=h;G[48832]=h;G[48833]=g}if((q|0)<=0){break b}p=G[48827];m=G[48828];while(1){j=q;q=j-1|0;l=H[t+q|0]|l<<8;i:{if((i|0)>8){i=i-8|0;break i}E[a+m|0]=l>>8-i;if((m|0)>=(p|0)){break i}m=m+1|0;G[48828]=m}h=s+8|0;g=h>>>0<8?g+1|0:g;s=h;if(j>>>0>1){continue}break}G[48830]=i;G[48829]=l;G[48832]=s;G[48833]=g;break b}g=G[48829]<<4;G[48829]=g;h=G[48830];G[48830]=h-4;if((h|0)<=4){j=G[48828];E[j+a|0]=g>>4-h;if((j|0)>>0<4?g+1|0:g;G[48832]=j;G[48833]=g;$o(b,c,d,e,k,f);ap(a,y,k)}if((u|0)>1){continue}break}}Wa(t);Wa(k);return 0}Ua(3149);return 413}function Qs(a){a=a|0;var 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;h=G[309722];k=G[a+16>>2];p=h+M(k,344)|0;l=G[a+12>>2];o=M(l,344)+h|0;a:{if(G[o>>2]!=-1e3){j=G[o+56>>2];d=0;break a}d=L[o+88>>3]}b:{if(G[p>>2]!=-1e3){i=G[(M(k,344)+h|0)+56>>2];c=0;break b}c=L[(M(k,344)+h|0)+88>>3]}b=G[a>>2];c:{if(!(i|j)){d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{switch(b-278|0){default:n:{switch(b-37|0){case 10:break h;case 0:break i;case 5:break j;case 8:break k;case 6:break l;case 1:case 2:case 3:case 4:case 7:case 9:break d;default:break n}}if((b|0)!=126){break d}E[a+88|0]=O(d-c)<1e-7;break d;case 0:E[a+88|0]=c==d;break d;case 1:E[a+88|0]=c!=d;break d;case 2:E[a+88|0]=cd;break d;case 4:E[a+88|0]=c>=d;break d;case 7:break g;case 5:break m;case 6:case 8:case 9:case 10:case 11:break d;case 13:break e;case 12:break f}}E[a+88|0]=c<=d;break d}L[a+88>>3]=d+c;break d}L[a+88>>3]=d-c;break d}L[a+88>>3]=d*c;break d}if(c!=0){m=d/c;o:{if(O(m)<2147483648){b=~~m;break o}b=-2147483648}L[a+88>>3]=d-c*+(b|0);break d}wc(13540);break d}if(c!=0){L[a+88>>3]=d/c;break d}wc(13540);break d}v=a,w=$b(d,c),L[v+88>>3]=w;break d}L[a+88>>3]=d;break d}G[a+88>>2]=0;G[a+92>>2]=0}G[a>>2]=-1e3;break c}g=G[a+56>>2];f=G[309727];if((b&-2)==290){Nd(a);if(G[309737]){break c}f=M(f,g);g=M(k,344)+h|0;e=G[g+84>>2];c=L[g+88>>3];p:{if(G[a>>2]!=290){if((f|0)<=0){break p}j=M(l,344)+h|0;i=G[j+84>>2];b=0;while(1){n=b<<3;d=L[n+G[j+88>>2]>>3];e=H[b+i|0]|e;L[n+G[a+88>>2]>>3]=e?0:d-c;E[G[a+84>>2]+b|0]=(e|0)!=0;i=G[j+84>>2];e=E[i+b|0];c=d;b=b+1|0;if((f|0)!=(b|0)){continue}break}break p}if((f|0)<=0){break p}i=M(l,344)+h|0;b=0;while(1){c=H[G[i+84>>2]+b|0]?c:c+L[G[i+88>>2]+(b<<3)>>3];L[G[a+88>>2]+(b<<3)>>3]=c;E[G[a+84>>2]+b|0]=0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}L[g+88>>3]=c;G[g+84>>2]=e;break c}Nd(a);if(G[309737]|!f){break c}b=M(f,g);n=M(k,344)+h|0;q=M(l,344)+h|0;r=(j|0)>1;while(1){f=f-1|0;e=0;q:{if(!g){break q}while(1){b=b-1|0;if(j){e=r?b:f;s=H[e+G[q+84>>2]|0];d=L[G[q+88>>2]+(e<<3)>>3]}if(i){e=(i|0)>1?b:f;t=H[e+G[n+84>>2]|0];c=L[G[n+88>>2]+(e<<3)>>3]}g=g-1|0;E[G[a+84>>2]+b|0]=(s|t)!=0;r:{s:{t:{u:{v:{w:{x:{y:{z:{A:{B:{C:{D:{E:{e=G[a>>2];switch(e-278|0){case 6:break r;case 7:break s;case 5:break y;case 4:break z;case 3:break A;case 2:break B;case 1:break C;case 0:break D;default:break E}}F:{switch(e-37|0){case 1:case 2:case 3:case 4:case 7:case 9:break r;case 10:break t;case 0:break u;case 5:break v;case 8:break w;case 6:break x;default:break F}}if((e|0)!=126){break r}E[G[a+88>>2]+b|0]=O(d-c)<1e-7;break r}E[G[a+88>>2]+b|0]=c==d;break r}E[G[a+88>>2]+b|0]=c!=d;break r}E[G[a+88>>2]+b|0]=c>2]+b|0]=c>d;break r}E[G[a+88>>2]+b|0]=c>=d;break r}E[G[a+88>>2]+b|0]=c<=d;break r}L[G[a+88>>2]+(b<<3)>>3]=d+c;break r}L[G[a+88>>2]+(b<<3)>>3]=d-c;break r}L[G[a+88>>2]+(b<<3)>>3]=d*c;break r}if(c!=0){u=G[a+88>>2]+(b<<3)|0;m=d/c;G:{if(O(m)<2147483648){e=~~m;break G}e=-2147483648}L[u>>3]=d-c*+(e|0);break r}e=G[a+88>>2]+(b<<3)|0;G[e>>2]=0;G[e+4>>2]=0;E[G[a+84>>2]+b|0]=1;break r}if(c!=0){L[G[a+88>>2]+(b<<3)>>3]=d/c;break r}e=G[a+88>>2]+(b<<3)|0;G[e>>2]=0;G[e+4>>2]=0;E[G[a+84>>2]+b|0]=1;break r}v=G[a+88>>2]+(b<<3)|0,w=$b(d,c),L[v>>3]=w}e=G[309737];if(!g){break q}if(!e){continue}break}}if(!f){break c}g=G[a+56>>2];if(!e){continue}break}}if(G[o>>2]>0){Wa(G[(M(l,344)+h|0)+88>>2])}if(G[p>>2]>0){Wa(G[(M(k,344)+h|0)+88>>2])}}function Nc(a,b,c,d,e,f,g,h,i,j,k,l){var 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;m=Fa-208|0;Fa=m;a:{if(G[l>>2]>0){break a}w=vk(b);G[m+88>>2]=0;G[m+92>>2]=0;G[m+80>>2]=0;G[m+84>>2]=0;G[m+72>>2]=0;G[m+76>>2]=0;n=m- -64|0;G[n>>2]=0;G[n+4>>2]=0;G[m+16>>2]=0;G[m+20>>2]=0;G[m+24>>2]=0;G[m+28>>2]=0;G[m+32>>2]=0;G[m+36>>2]=0;G[m+40>>2]=0;G[m+44>>2]=0;G[m+56>>2]=0;G[m+60>>2]=0;G[m+48>>2]=0;G[m+52>>2]=0;G[m>>2]=0;G[m+4>>2]=0;G[m+8>>2]=0;G[m+12>>2]=0;G[m+176>>2]=1;G[m+144>>2]=1;G[m+180>>2]=1;G[m+184>>2]=1;G[m+148>>2]=1;G[m+152>>2]=1;G[m+188>>2]=1;G[m+156>>2]=1;G[m+192>>2]=1;G[m+196>>2]=1;G[m+160>>2]=1;G[m+164>>2]=1;Qd(a,m+204|0,l);de(a,6,m+176|0,l);G[m+96>>2]=1;G[m+100>>2]=0;s=G[m+180>>2];x=G[m+176>>2];p=x;n=p>>31;G[m+104>>2]=p;G[m+108>>2]=n;n=Au(p,n,s,s>>31);G[m+112>>2]=n;p=Ia;G[m+116>>2]=p;o=n;n=G[m+184>>2];n=Au(o,p,n,n>>31);G[m+120>>2]=n;p=Ia;G[m+124>>2]=p;o=n;n=G[m+188>>2];n=Au(o,p,n,n>>31);G[m+128>>2]=n;p=Ia;G[m+132>>2]=p;o=n;n=G[m+192>>2];A=m,B=Au(o,p,n,n>>31),G[A+136>>2]=B;G[m+140>>2]=Ia;p=G[m+204>>2];if((p|0)>0){n=e;e=c;c=c-1|0;n=n+c|0;d=d-!e|0;f=d+f|0;f=c>>>0>n>>>0?f+1|0:f;e=n-1|0;f=f-!n|0;n=p;while(1){v=n-1|0;o=v<<3;t=o+(m+96|0)|0;q=G[t>>2];t=G[t+4>>2];y=Bu(c,d,q,t);r=Ia;z=r;u=o+(m+48|0)|0;G[u>>2]=y;G[u+4>>2]=r;o=m+o|0;r=Bu(e,f,q,t);G[o>>2]=r;u=Ia;G[o+4>>2]=u;o=e;r=Au(q,t,r,u);e=e-r|0;f=f-(Ia+(o>>>0>>0)|0)|0;o=c;q=Au(q,t,y,z);c=c-q|0;d=d-(Ia+(o>>>0>>0)|0)|0;o=n>>>0>1;n=v;if(o){continue}break}}b:{c:{switch(p-1|0){case 1:qo(a,b,w,0,m+48|0,m,m+144|0,m+176|0,g,h,i,j,k,m+172|0,l);break b;case 2:d:{if(G[m+48>>2]|G[m+56>>2]|(G[m+52>>2]|G[m+60>>2])){break d}d=G[m>>2];e=x-1|0;c=G[m+4>>2];if((d|0)!=(e|0)|(c|0)!=e>>31){break d}e=G[m+8>>2];n=s-1|0;f=G[m+12>>2];if((e|0)!=(n|0)|(f|0)!=n>>31){break d}G[m+48>>2]=1;G[m+52>>2]=0;G[m+56>>2]=1;G[m+60>>2]=0;d=d+1|0;c=d?c:c+1|0;G[m>>2]=d;G[m+4>>2]=c;c=e+1|0;f=c?f:f+1|0;G[m+8>>2]=c;G[m+12>>2]=f;c=G[m+68>>2];d=G[m+64>>2]+1|0;c=d?c:c+1|0;G[m+64>>2]=d;G[m+68>>2]=c;d=G[m+20>>2];c=G[m+16>>2]+1|0;d=c?d:d+1|0;G[m+16>>2]=c;G[m+20>>2]=d;f=G[m+76>>2];c=G[m+72>>2]+1|0;f=c?f:f+1|0;G[m+72>>2]=c;G[m+76>>2]=f;c=G[m+28>>2];d=G[m+24>>2]+1|0;c=d?c:c+1|0;G[m+24>>2]=d;G[m+28>>2]=c;d=G[m+84>>2];c=G[m+80>>2]+1|0;d=c?d:d+1|0;G[m+80>>2]=c;G[m+84>>2]=d;f=G[m+36>>2];c=G[m+32>>2]+1|0;f=c?f:f+1|0;G[m+32>>2]=c;G[m+36>>2]=f;c=G[m+92>>2];d=G[m+88>>2]+1|0;c=d?c:c+1|0;G[m+88>>2]=d;G[m+92>>2]=c;d=G[m+44>>2];c=G[m+40>>2]+1|0;d=c?d:d+1|0;G[m+40>>2]=c;G[m+44>>2]=d;md(a,b,m+48|0,m,m+144|0,g,h,i,j,k,l);break b}if(k){G[k>>2]=0}p=G[m+8>>2];v=G[m+12>>2];o=G[m>>2];q=G[m+4>>2];e=G[m+64>>2];n=G[m+16>>2];d=G[m+68>>2];c=G[m+20>>2];if(e>>>0>>0&(d|0)<=(c|0)|(c|0)>(d|0)){f=s-1|0;G[m+8>>2]=f;G[m+12>>2]=f>>31;f=x-1|0;G[m>>2]=f;G[m+4>>2]=f>>31}d=e;f=d>>31;if((c|0)<=(f|0)&d>>>0>n>>>0|(c|0)<(f|0)){break b}d=(g|0)==2;while(1){if((e|0)==(n|0)&(c|0)==(f|0)){G[m+8>>2]=p;G[m+12>>2]=v;G[m>>2]=o;G[m+4>>2]=q}qo(a,b,w,e,m+48|0,m,m+144|0,m+176|0,g,h,i,j,m+200|0,m+172|0,l);if(!(!k|!G[m+200>>2])){G[k>>2]=1}G[m+56>>2]=0;G[m+60>>2]=0;G[m+48>>2]=0;G[m+52>>2]=0;s=G[m+172>>2];j=(d?j?s:0:0)+j|0;i=M(s,w)+i|0;e=e+1|0;f=e?f:f+1|0;if(e>>>0<=n>>>0&(c|0)>=(f|0)|(c|0)>(f|0)){continue}break};break b;default:Ua(28010);G[l>>2]=414;break a;case 0:break c}}c=G[m+52>>2];d=G[m+48>>2]+1|0;c=d?c:c+1|0;G[m+48>>2]=d;G[m+52>>2]=c;d=G[m+4>>2];c=G[m>>2]+1|0;d=c?d:d+1|0;G[m>>2]=c;G[m+4>>2]=d;md(a,b,m+48|0,m,m+144|0,g,h,i,j,k,l)}}Fa=m+208|0}function Rq(a,b){a=a|0;b=b|0;var 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;c=Fa-752|0;Fa=c;G[47589]=1;f=G[29763];G[321435]=f;G[47590]=0;G[926536]=0;e=200;a:{b:{while(1){c:{d:{e:{f:{g:{d=of(a,b,38930);switch(d-100|0){case 15:break c;case 0:break e;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break f;default:break g}}if((d|0)==83){break d}if((d|0)==-1){break b}}G[c>>2]=G[b>>2];_a(G[321435],81902,c);break a}G[926536]=1;continue}e=+(_b(G[321433])|0);continue}d=ac(G[321433],49010);G[321435]=d;if(d){continue}break}G[c+224>>2]=G[321433];_a(0,80991,c+224|0);break a}h:{d=a;a=G[47589];if((d-a|0)>1){b=(a<<2)+b|0;a=Za(c+496|0,G[b>>2]);d=ac(Za(c+240|0,G[b+4>>2]),49010);if(!d){break h}Lf(a,1,0);if(G[926536]){yb(44716);$a(f)}b=Fa-80384|0;Fa=b;i:{j:{l=ac(a,13287);if(l){E[b+32|0]=0;while(1){if(vc(b+80032|0,256,l)){a=(Va(b+80032|0)+b|0)+80031|0;if(H[a|0]==10){E[a|0]=0}a=(Va(b+80032|0)+b|0)+80031|0;if(H[a|0]==13){E[a|0]=0}f=Va(b+32|0);a=Va(b+80032|0);k:{if((a|0)>0){bb(f+(b+32|0)|0,b+80032|0,a);if(a>>>0>79){break k}}cb(b+32+(a+f)|0,32,80-a|0)}E[(b+f|0)+112|0]=0;j=j+1|0;if((j|0)!=1e3){continue}}break}if(G[926536]){yb(86179);n=G[29763];$a(n);j=Va(b+32|0);f=0;while(1){a=0;cb(b+80288|0,0,80);g=M(f,80);while(1){l:{h=a+g|0;k=(h|0)>(j|0);if(k){break l}E[(b+80288|0)+a|0]=H[h+(b+32|0)|0];h=a|1;o=h+g|0;k=(j|0)<(o|0);if(k){break l}E[h+(b+80288|0)|0]=H[(b+32|0)+o|0];a=a+2|0;if((a|0)!=80){continue}}break}E[b+80368|0]=0;a=80;while(1){m:{g=(b+80288|0)+a|0;if((H[g|0]|32)!=32){break m}E[g|0]=0;g=(a+b|0)+80287|0;if((H[g|0]|32)!=32){break m}E[g|0]=0;g=a-2|0;h=g+(b+80288|0)|0;if((H[h|0]|32)!=32){break m}E[h|0]=0;a=a-3|0;if(g){continue}}break}f=f+1|0;if(H[b+80288|0]){G[b+16>>2]=f;G[b+20>>2]=b+80288;kb(69623,b+16|0)}if(!k){continue}break}id();$a(n)}a=rd(b+32|0);G[926537]=a;if(!a){break j}a=a+3512|0;if(!fb(a,35967,2)){G[926538]=0}if(!fb(a,34801,2)){G[926538]=2}if(!fb(a,34774,2)){G[926538]=4}if(G[926536]){yb(73546);$a(G[29763])}Hb(l);Fa=b+80384|0;break i}G[b>>2]=a;_a(G[321435],80820,b);break a}hb(84378,54,1,G[321435]);break a}a=G[926537];i=L[a+144>>3];m=L[a+136>>3];e=e/(i>m?i:m);L[a+32>>3]=L[a+32>>3]/e;L[a+40>>3]=L[a+40>>3]/e;L[a+16>>3]=L[a+16>>3]*e+2.5;L[a+24>>3]=L[a+24>>3]*e+2.5;i=i*e;n:{if(O(i)<2147483648){b=~~i;break n}b=-2147483648}L[a+144>>3]=+(b|0)+5;e=m*e;o:{if(O(e)<2147483648){b=~~e;break o}b=-2147483648}L[a+136>>3]=+(b|0)+5;hb(85307,12,1,d);hb(86411,14,1,d);hb(86498,12,1,d);e=L[G[926537]+136>>3];p:{if(O(e)<2147483648){a=~~e;break p}a=-2147483648}G[c+208>>2]=a;_a(d,75530,c+208|0);e=L[G[926537]+144>>3];q:{if(O(e)<2147483648){a=~~e;break q}a=-2147483648}G[c+192>>2]=a;_a(d,75516,c+192|0);G[c+176>>2]=G[926537]+3368;_a(d,89614,c+176|0);G[c+160>>2]=G[926537]+3384;_a(d,89598,c+160|0);L[c+144>>3]=L[G[926537]+688>>3];xb(d,71955,c+144|0);L[c+128>>3]=L[G[926537]+696>>3];xb(d,71881,c+128|0);L[c+112>>3]=L[G[926537]+16>>3];xb(d,71937,c+112|0);L[c+96>>3]=L[G[926537]+24>>3];xb(d,71863,c+96|0);L[c+80>>3]=L[G[926537]+32>>3];xb(d,71355,c+80|0);L[c+64>>3]=L[G[926537]+40>>3];xb(d,71301,c- -64|0);L[c+48>>3]=L[G[926537]+48>>3];xb(d,71899,c+48|0);L[c+32>>3]=L[G[926537]+120>>3];xb(d,72284,c+32|0);hb(85385,4,1,d);Hb(d);hb(83215,19,1,G[321435]);$a(G[321435]);Hb(G[321435]);sc(0);W()}G[c+16>>2]=G[b>>2];_a(G[321435],81902,c+16|0);break a}hb(82898,62,1,G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()} -function Jj(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=Fa-16|0;Fa=j;if(G[d>>2]<=0){a:{if(Nb(a,d)){if((sd(j+12|0,42094,d)|0)>0){break a}f=G[j+12>>2];g=Fa-256|0;Fa=g;e=G[d>>2];b:{if((e|0)>0){break b}if((e|0)==-1){G[d>>2]=0}if(!Nb(a,d)){Ua(50428);e=414;G[d>>2]=414;break b}G[g+136>>2]=G[a>>2]+1;G[g+140>>2]=G[f>>2]+1;Td(f,g+132|0,0,d);G[g+128>>2]=0;c:{d:{e:{if(kc(a,35504,g+32|0,g+128|0)){break e}k=1;if(G[g+140>>2]!=1){break e}if(!G[g+132>>2]){break d}mh(f,6,g+24|0,g+28|0,g,d);if(G[g+28>>2]){break e}k=G[g+136>>2]!=2;e=G[g+132>>2];if((e|0)<=0){break d}while(1){ig(f,e,d);h=e>>>0>1;e=e-1|0;if(h){continue}break}break d}G[g+128>>2]=0;if(kc(a,34458,g+32|0,g+128|0)){k=1;e=G[a+4>>2];if((pd(f,G[e+1104>>2],G[e+1108>>2],e+1112|0,d)|0)<=0){i=1;break d}Ua(33195);break c}if((e|0)==-1){k=1;e=G[a+4>>2];if((pd(f,G[e+1104>>2],G[e+1108>>2],e+1112|0,d)|0)<=0){i=1;break d}Ua(33195);break c}if(!G[g+132>>2]){pd(f,8,0,g,d);k=1;if((Ke(f,d)|0)<=0){break d}Ua(33195);break c}Ke(f,d);k=1}if(G[d>>2]>0){Ua(33195);break c}e=Fa-432|0;Fa=e;F[e+14>>1]=45;G[e+8>>2]=0;h=G[d>>2];if((h|0)<=0){G[e+276>>2]=49026;G[e+268>>2]=49026;G[e+260>>2]=48783;G[e+252>>2]=48783;G[e+244>>2]=48783;G[e+236>>2]=48783;G[e+228>>2]=48783;G[e+220>>2]=48783;G[e+212>>2]=48783;G[e+204>>2]=48783;G[e+196>>2]=48783;G[e+188>>2]=48783;G[e+180>>2]=48783;G[e+172>>2]=48783;G[e+164>>2]=48783;G[e+156>>2]=48783;G[e+148>>2]=48783;G[e+140>>2]=48783;G[e+132>>2]=48783;G[e+124>>2]=48783;G[e+116>>2]=48783;G[e+108>>2]=48783;h=e+14|0;G[e+68>>2]=i?h:35828;G[e+60>>2]=i?h:35787;G[e+256>>2]=34633;G[e+100>>2]=i?h:34633;G[e+248>>2]=34623;G[e+92>>2]=i?h:34623;G[e+144>>2]=33311;G[e+84>>2]=i?h:33311;G[e+136>>2]=33303;G[e+76>>2]=i?h:33303;G[e+128>>2]=16595;G[e+52>>2]=i?h:16595;G[e+120>>2]=33788;G[e+44>>2]=i?h:33788;G[e+112>>2]=32941;G[e+36>>2]=i?h:32941;G[e+272>>2]=49138;G[e+264>>2]=35480;G[e+240>>2]=16623;G[e+232>>2]=16649;G[e+224>>2]=34861;G[e+216>>2]=35408;G[e+208>>2]=16656;G[e+200>>2]=41550;G[e+192>>2]=32673;G[e+184>>2]=35668;G[e+176>>2]=34350;G[e+168>>2]=16609;G[e+160>>2]=16642;G[e+152>>2]=33837;G[e+96>>2]=34632;G[e+88>>2]=34614;G[e+80>>2]=33310;G[e+72>>2]=33302;G[e+64>>2]=35827;G[e+56>>2]=35786;G[e+48>>2]=16594;G[e+40>>2]=33763;G[e+32>>2]=32893;G[e+24>>2]=34458;G[e+16>>2]=35504;G[e+20>>2]=i?h:35530;G[e+104>>2]=34516;G[e+28>>2]=i?h:34516;kc(a,35480,e+336|0,e+8|0);f:{if(G[e+8>>2]){break f}if(nb(e+336|0,65168,28)){break f}G[e+268>>2]=e+14}h=0;uk(a,f,1,e+16|0,33,0,d);Td(a,e+4|0,e,d);i=G[e>>2];G[e>>2]=(i|0)/36;if((i|0)>=36){while(1){wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);wb(f,68293,d);h=h+1|0;if((h|0)>2]){continue}break}}h=G[d>>2]}Fa=e+432|0;if((h|0)>0){Ua(24771)}if(k){break c}mb(a,1,0,d);Rb(f,d);bb(g+144|0,119088,104);g:{if(G[d>>2]<=0){uk(a,f,1,g+144|0,13,0,d);if(G[d>>2]<=0){break g}}Ua(22429)}mb(a,2,0,d)}e=G[d>>2]}Fa=g+256|0;a=G[j+12>>2];if((e|0)>0){Xm(a,d);break a}lo(a,b,c,d);Qb(G[j+12>>2],d);break a}lo(a,b,c,d)}}Fa=j+16|0}function sg(a,b,c){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;a:{b:{d=a<<2;n=ab(d);if(n){q=ab(d);if(!q){Wa(n);return 1}l=a<<3;s=ab(l);if(!s){Wa(n);Wa(q);return 1}j=ab(M(a,l));if(!j){break a}c:{if((a|0)<=0){break c}k=a&-4;p=a&3;v=a-1|0;while(1){G[(e<<2)+n>>2]=e;d=h<<3;bb(d+j|0,b+d|0,l);i=0;d=h;g=0;if(v>>>0>=3){while(1){o=(d<<3)+b|0;w=O(L[o+24>>3]);x=O(L[o+16>>3]);t=O(L[o+8>>3]);f=O(L[o>>3]);f=f>i?f:i;f=f>3]);i=f>i?f:i;d=d+1|0;g=g+1|0;if((p|0)!=(g|0)){continue}break}}L[(e<<3)+s>>3]=i;if(i==0){break b}h=a+h|0;e=e+1|0;if((e|0)!=(a|0)){continue}break}if((a|0)<=0){break c}z=a&-2;A=a&1;B=a-2|0;e=0;while(1){k=e;e=e+1|0;o=(e|0)>=(a|0);d:{if(o){break d}p=M(a,k);y=(p+k<<3)+j|0;l=(k<<3)+s|0;t=L[l>>3];i=O(L[y>>3])/t;d=e;g=k;while(1){f=O(L[(k+M(a,d)<<3)+j>>3])/L[(d<<3)+s>>3];b=f>i;i=b?f:i;g=b?d:g;d=d+1|0;if((d|0)!=(a|0)){continue}break}if((g|0)>(k|0)){d=M(a,g);h=0;b=p;if(v){while(1){r=(d<<3)+j|0;f=L[r>>3];m=(b<<3)+j|0;L[r>>3]=L[m>>3];L[m>>3]=f;f=L[r+8>>3];L[r+8>>3]=L[m+8>>3];L[m+8>>3]=f;b=b+2|0;d=d+2|0;h=h+2|0;if((z|0)!=(h|0)){continue}break}}if(A){d=(d<<3)+j|0;f=L[d>>3];b=(b<<3)+j|0;L[d>>3]=L[b>>3];L[b>>3]=f}b=(g<<3)+s|0;f=L[b>>3];L[b>>3]=t;L[l>>3]=f;b=(g<<2)+n|0;d=G[b>>2];h=b;b=(k<<2)+n|0;G[h>>2]=G[b>>2];G[b>>2]=d}if(o){break d}b=k+2|0;m=v-k&1;o=(e+p<<3)+j|0;h=e;while(1){r=M(a,h);u=(r+k<<3)+j|0;f=L[u>>3];e:{if(f==0){break e}L[u>>3]=f/L[y>>3];d=e;if(m){d=(e+r<<3)+j|0;L[d>>3]=L[d>>3]-L[u>>3]*L[o>>3];d=b}if((k|0)==(B|0)){break e}while(1){g=(d+r<<3)+j|0;L[g>>3]=L[g>>3]-L[u>>3]*L[(d+p<<3)+j>>3];l=d+1|0;g=(l+r<<3)+j|0;L[g>>3]=L[g>>3]-L[u>>3]*L[(l+p<<3)+j>>3];d=d+2|0;if((d|0)!=(a|0)){continue}break}}h=h+1|0;if((h|0)!=(a|0)){continue}break}}if((a|0)!=(e|0)){continue}break}if((a|0)<=0){break c}g=0;d=0;if(v>>>0>=3){h=a&-4;b=0;while(1){G[(G[(d<<2)+n>>2]<<2)+q>>2]=d;e=d|1;G[(G[(e<<2)+n>>2]<<2)+q>>2]=e;e=d|2;G[(G[(e<<2)+n>>2]<<2)+q>>2]=e;e=d|3;G[(G[(e<<2)+n>>2]<<2)+q>>2]=e;d=d+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}b=a&3;if(b){while(1){G[(G[(d<<2)+n>>2]<<2)+q>>2]=d;d=d+1|0;g=g+1|0;if((b|0)!=(g|0)){continue}break}}b=0;if((a|0)<=0){break c}m=cb(c,0,M(a,a)<<3);while(1){c=G[(b<<2)+q>>2];g=m+(M(c,a)+b<<3)|0;G[g>>2]=0;G[g+4>>2]=1072693248;d=c+1|0;if((d|0)<(a|0)){p=c+1|0;h=0;e=c;while(1){k=e;e=d;f:{if((c|0)>(k|0)){break f}o=M(a,e);l=m+(o+b<<3)|0;i=L[l>>3];if(h&1){d=c}else{i=i-L[(c+o<<3)+j>>3]*L[g>>3];L[l>>3]=i;d=p}if(!h){break f}while(1){f=i-L[(d+o<<3)+j>>3]*L[m+(M(a,d)+b<<3)>>3];L[l>>3]=f;k=d+1|0;i=f-L[(k+o<<3)+j>>3]*L[m+(M(a,k)+b<<3)>>3];L[l>>3]=i;d=d+2|0;if((e|0)!=(d|0)){continue}break}}h=h+1|0;d=e+1|0;if((d|0)!=(a|0)){continue}break}}e=0;h=a;while(1){c=h;h=h-1|0;l=M(h,a);p=l+b|0;g:{if((a|0)<=(c|0)){break g}g=m+(p<<3)|0;i=L[g>>3];if(e&1){i=i-L[(c+l<<3)+j>>3]*L[m+(M(a,c)+b<<3)>>3];L[g>>3]=i;d=c+1|0}else{d=c}if((e|0)==1){break g}while(1){f=i-L[(d+l<<3)+j>>3]*L[m+(M(a,d)+b<<3)>>3];L[g>>3]=f;k=d+1|0;i=f-L[(k+l<<3)+j>>3]*L[m+(M(a,k)+b<<3)>>3];L[g>>3]=i;d=d+2|0;if((d|0)!=(a|0)){continue}break}}d=m+(p<<3)|0;L[d>>3]=L[d>>3]/L[(h+l<<3)+j>>3];e=e+1|0;if((c|0)>1){continue}break}b=b+1|0;if((b|0)!=(a|0)){continue}break}}Wa(n);Wa(q);Wa(s);Wa(j);a=0}else{a=1}return a}Wa(n);Wa(q);Wa(s);Wa(j);return 2}Wa(n);Wa(q);Wa(s);return 1}function Os(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=Fa-128|0;Fa=j;f=G[309729];G[j+44>>2]=0;g=f+M(a,244)|0;a:{if(!G[309736]){f=G[g>>2];k=G[g+80>>2];h=b>>31;i=j+48|0;g=c>>31;a=j+44|0;if(!(!(g|c)|G[a>>2]>0)){b:{c:{switch(k-11|0){case 0:d:{if(Nb(f,a)){Nc(f,11,b,h,c,g,2,0,d,e,i,a);break d}Re(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 1:e:{if(Nb(f,a)){Nc(f,12,b,h,c,g,2,0,d,e,i,a);break e}Ef(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 9:f:{if(Nb(f,a)){Nc(f,20,b,h,c,g,2,0,d,e,i,a);break f}Gf(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 10:g:{if(Nb(f,a)){Nc(f,21,b,h,c,g,2,0,d,e,i,a);break g}jf(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 19:h:{if(Nb(f,a)){Nc(f,30,b,h,c,g,2,0,d,e,i,a);break h}if(!(!(c|g)|G[a>>2]>0)){qe(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}}break b;case 20:i:{if(Nb(f,a)){Nc(f,31,b,h,c,g,2,0,d,e,i,a);break i}if(!(!(c|g)|G[a>>2]>0)){Ud(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}}break b;case 29:j:{if(Nb(f,a)){Nc(f,40,b,h,c,g,2,0,d,e,i,a);break j}qe(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 30:k:{if(Nb(f,a)){Nc(f,41,b,h,c,g,2,0,d,e,i,a);break k}Ud(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;case 69:l:{if(Nb(f,a)){Nc(f,80,b,h,c,g,2,0,d,e,i,a);break l}hf(f,2,1,0,b,h,c,g,1,2,0,0,d,e,i,a)}break b;case 70:m:{if(Nb(f,a)){Nc(f,81,b,h,c,g,2,0,d,e,i,a);break m}Se(f,2,1,0,b,h,c,g,1,2,0,0,d,e,i,a)}break b;case 31:n:{if(Nb(f,a)){Nc(f,42,b,h,c,g,2,0,d,e,i,a);break n}ae(f,2,1,0,b,h,c,g,1,2,N(0),d,e,i,a)}break b;case 71:o:{if(Nb(f,a)){Nc(f,82,b,h,c,g,2,0,d,e,i,a);break o}Id(f,2,1,0,b,h,c,g,1,2,0,d,e,i,a)}break b;default:break c}}G[a>>2]=410}}if(!G[309801]){break a}G[j>>2]=b;G[j+4>>2]=c;G[j+8>>2]=G[j+44>>2];kb(75163,j);break a}k=G[g+92>>2];h=M(k,c);p:{q:{r:{s:{t:{u:{v:{w:{i=G[g+80>>2];switch(i-11|0){case 1:case 2:case 4:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:break r;case 30:break t;case 3:break u;case 5:break v;case 0:break w;default:break s}}e=M((k+7|0)/8|0,c);h=ab(e);i=0;k=Fa-16|0;Fa=k;Re(G[g>>2],G[(f+M(a,244)|0)+4>>2],b,b>>31,1,0,e,e>>31,1,1,0,h,k+15|0,j+48|0,j+44|0);Fa=k+16|0;x:{if((c|0)<=0){break x}b=G[g+92>>2];g=(b+7|0)/8|0;if((b|0)>0){while(1){f=(i<<2)+d|0;a=M(g,i)+1|0;e=0;while(1){k=e&7;E[G[f>>2]+e|0]=H[a+h|0]>>>(k^7)&1?49:48;a=((k|0)==7)+a|0;e=e+1|0;if((b|0)!=(e|0)){continue}break}E[b+G[f>>2]|0]=0;i=i+1|0;if((i|0)!=(c|0)){continue}break p}}f=0;e=0;if(c-1>>>0>=3){g=c&-4;b=0;while(1){a=e<<2;E[G[a+d>>2]]=0;E[G[(a|4)+d>>2]]=0;E[G[(a|8)+d>>2]]=0;E[G[(a|12)+d>>2]]=0;e=e+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}a=c&3;if(!a){break x}while(1){E[G[(e<<2)+d>>2]]=0;e=e+1|0;f=f+1|0;if((a|0)!=(f|0)){continue}break}}if(h){break p}G[j+36>>2]=2563;G[j+32>>2]=30721;kb(74236,j+32|0);break a}h=Fa-16|0;Fa=h;xh(G[g>>2],G[(f+M(a,244)|0)+4>>2],b,b>>31,1,0,c,c>>31,2,h+14|0,d,e,j+48|0,j+44|0);Fa=h+16|0;break a}fg(G[g>>2],G[(f+M(a,244)|0)+4>>2],b,b>>31,1,0,h,h>>31,2,0,d,e,j+48|0,j+44|0);break a}Ud(G[g>>2],G[(f+M(a,244)|0)+4>>2],b,b>>31,1,0,h,h>>31,1,2,0,d,e,j+48|0,j+44|0);break a}if((i|0)==82){break q}}G[j+16>>2]=i;a=j+48|0;Ya(a,80,30174,j+16|0);Ua(a);break a}Id(G[g>>2],G[(f+M(a,244)|0)+4>>2],b,b>>31,1,0,h,h>>31,1,2,0,d,e,j+48|0,j+44|0);break a}Wa(h)}Fa=j+128|0;a=G[j+44>>2];if(a){G[309737]=a;a=-1}else{a=0}return a|0}function nl(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;o=Fa-160|0;Fa=o;if(G[j>>2]<=0){m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,j);l=G[a+4>>2];m=G[l+76>>2]}k=G[l+96>>2]+(m<<3)|0;if(G[l+104>>2]!=G[k>>2]|G[l+108>>2]!=G[k+4>>2]){Ke(a,j);l=G[a+4>>2];m=G[l+76>>2]}if(!m){m=0;if(G[j>>2]<=0){k=G[a>>2];if(k){mb(a,k+1|0,0,j);l=G[a+4>>2];m=G[l+76>>2]}m=G[l+96>>2]+(m<<3)|0;if(G[l+104>>2]!=G[m>>2]|G[l+108>>2]!=G[m+4>>2]){Ke(a,j)}Yi(a,16,0,o,j)}Ke(a,j)}a:{b:{switch(b-1|0){case 1:qq(a,c,d,e,f,g,h,i,j);break a;case 0:k=Fa-624|0;Fa=k;b=G[a>>2];if((b|0)!=G[G[a+4>>2]+76>>2]){mb(a,b+1|0,0,j)}c:{if(G[j>>2]>0){break c}b=G[a+4>>2];m=G[b+96>>2]+(G[b+76>>2]<<3)|0;if(G[b+104>>2]!=G[m>>2]|G[b+108>>2]!=G[m+4>>2]){G[j>>2]=201;break c}if((d|0)<0){G[j>>2]=218;break c}if(e>>>0>=1e3){G[j>>2]=216;break c}E[k+160|0]=0;if(i){qb(k+160|0,i,70)}G[k+444>>2]=0;m=lb((e|0)>5?e:5,4);d:{if(!m){m=0;b=1;break d}l=0;b=Fa-16|0;Fa=b;e:{if(G[j>>2]>0){break e}G[k+444>>2]=0;if((e|0)<=0){break e}G[m>>2]=1;i=G[k+444>>2];while(1){n=l<<2;G[n+m>>2]=i+1;Gd(G[g+n>>2],b+12|0,b+4|0,b+8|0,j);i=G[k+444>>2]+(G[b+4>>2]+1|0)|0;G[k+444>>2]=i;l=l+1|0;if((l|0)!=(e|0)){continue}break}G[k+444>>2]=i-1}Fa=b+16|0;b=0}lc(a,34516,35630,15365,j);f:{if(G[j>>2]>0){break f}G[k+144>>2]=8;G[k+148>>2]=0;E[k+320|0]=0;if((db(k+320|0,26741,k+144|0)|0)<0){Ua(17884);G[j>>2]=401}i=k+448|0;Ob(32941,k+320|0,6292,i,j);wb(a,i,j);if(G[j>>2]>0){break f}G[k+128>>2]=2;G[k+132>>2]=0;E[k+320|0]=0;if((db(k+320|0,26741,k+128|0)|0)<0){Ua(17884);G[j>>2]=401}i=k+448|0;Ob(33788,k+320|0,23481,i,j);wb(a,i,j);if(G[j>>2]>0){break f}i=G[k+444>>2];G[k+112>>2]=i;G[k+116>>2]=i>>31;E[k+320|0]=0;if((db(k+320|0,26741,k+112|0)|0)<0){Ua(17884);G[j>>2]=401}i=k+448|0;Ob(41261,k+320|0,6217,i,j);wb(a,i,j);if(G[j>>2]>0){break f}G[k+96>>2]=c;G[k+100>>2]=d;E[k+320|0]=0;if((db(k+320|0,26741,k+96|0)|0)<0){Ua(17884);G[j>>2]=401}c=k+448|0;Ob(40853,k+320|0,23289,c,j);wb(a,c,j);if(G[j>>2]>0){break f}G[k+80>>2]=0;G[k+84>>2]=0;E[k+320|0]=0;if((db(k+320|0,26741,k+80|0)|0)<0){Ua(17884);G[j>>2]=401}c=k+448|0;Ob(33303,k+320|0,61953,c,j);wb(a,c,j);if(G[j>>2]>0){break f}G[k+64>>2]=1;G[k+68>>2]=0;E[k+320|0]=0;if((db(k+320|0,26741,k- -64|0)|0)<0){Ua(17884);G[j>>2]=401}c=k+448|0;Ob(33311,k+320|0,61992,c,j);wb(a,c,j);if(G[j>>2]>0){break f}E[k+320|0]=0;G[k+48>>2]=e;G[k+52>>2]=0;if((db(k+320|0,26741,k+48|0)|0)<0){Ua(17884);G[j>>2]=401}c=k+448|0;Ob(33837,k+320|0,3872,c,j);wb(a,c,j)}i=0;while(1){g:{if((e|0)==(i|0)){break g}c=i<<2;d=c+f|0;if(H[G[d>>2]]){l=i+1|0;G[k+32>>2]=l;n=k+240|0;Ya(n,73,29741,k+32|0);p=l;l=k+320|0;zb(35402,p,l,j);lc(a,l,G[d>>2],n,j)}d=c+m|0;l=G[d>>2];if(!((l|0)>0&(l|0)<=G[k+444>>2])){G[j>>2]=234}i=i+1|0;G[k+16>>2]=i;Ya(k+240|0,73,29761,k+16|0);zb(34749,i,k+320|0,j);if(G[j>>2]<=0){d=G[d>>2];G[k>>2]=d;G[k+4>>2]=d>>31;E[k+544|0]=0;if((db(k+544|0,26741,k)|0)<0){Ua(17884);G[j>>2]=401}d=k+448|0;Ob(k+320|0,k+544|0,k+240|0,d,j);wb(a,d,j)}d=G[c+g>>2];if(Va(d)>>>0>=30){Ua(63127);G[j>>2]=261;break g}d=Za(k+400|0,d);Yf(d);l=k+320|0;zb(34641,i,l,j);lc(a,l,d,26806,j);h:{if(!h){break h}c=c+h|0;d=G[c>>2];if(!d|!H[d|0]){break h}d=k+320|0;zb(33357,i,d,j);lc(a,d,G[c>>2],26762,j)}if(G[j>>2]<=0){continue}}break}if(H[k+160|0]){lc(a,35480,k+160|0,15352,j)}if(G[j>>2]>0){Ua(63074)}if(!b){Wa(m)}}Fa=k+624|0;break a;default:break b}}G[j>>2]=235}}Fa=o+160|0}function Bf(a,b,c,d){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;g=Fa-5872|0;Fa=g;h=G[d>>2];a:{if((b|0)<=0){e=h;break a}if((h|0)>0){e=h;break a}l=G[a+4>>2];b:{c:{d:{e:{f:{g:{if(c){m=(G[l+80>>2]==1)<<5;if((c|0)==-1){break g}i=G[l+984>>2];e=G[l+988>>2];j=G[l+976>>2];n=G[l+980>>2];f=G[l+128>>2];o=G[l+132>>2];cb(g+96|0,m,2880);m=i;i=n+o|0;j=f+j|0;i=j>>>0>>0?i+1|0:i;f=m+j|0;e=e+i|0;e=f>>>0>>0?e+1|0:e;f=f+2879|0;e=f>>>0<2879?e+1|0:e;i=Cu(f,e);j=f-i|0;i=e-(Ia+(f>>>0>>0)|0)|0;if((b|0)==1){break d}break f}j=G[l+128>>2];i=G[l+132>>2];cb(g+96|0,32,2880);if((b|0)==1){break d}break f}e=H[15459]|H[15460]<<8|(H[15461]<<16|H[15462]<<24);G[g+40>>2]=H[15455]|H[15456]<<8|(H[15457]<<16|H[15458]<<24);G[g+44>>2]=e;e=H[15451]|H[15452]<<8|(H[15453]<<16|H[15454]<<24);G[g+32>>2]=H[15447]|H[15448]<<8|(H[15449]<<16|H[15450]<<24);G[g+36>>2]=e;e=H[15443]|H[15444]<<8|(H[15445]<<16|H[15446]<<24);G[g+24>>2]=H[15439]|H[15440]<<8|(H[15441]<<16|H[15442]<<24);G[g+28>>2]=e;e=H[15435]|H[15436]<<8|(H[15437]<<16|H[15438]<<24);G[g+16>>2]=H[15431]|H[15432]<<8|(H[15433]<<16|H[15434]<<24);G[g+20>>2]=e;e=H[15427]|H[15428]<<8|(H[15429]<<16|H[15430]<<24);G[g+8>>2]=H[15423]|H[15424]<<8|(H[15425]<<16|H[15426]<<24);G[g+12>>2]=e;e=H[15419]|H[15420]<<8|(H[15421]<<16|H[15422]<<24);G[g>>2]=H[15415]|H[15416]<<8|(H[15417]<<16|H[15418]<<24);G[g+4>>2]=e;cb(g+96|0,m,2880);if((b|0)==1){break e}}e=G[l+76>>2];while(1){mb(a,G[a>>2]+2|0,g+5868|0,d);f=G[d>>2];if((f|0)<=0){continue}break}if((f|0)==107){G[d>>2]=h}mb(a,e+1|0,g+5868|0,d);if((c|0)==-1){rl(a,1,g,d)}e=G[a+4>>2];e=(G[e+88>>2]<<3)+G[e+96>>2]|0;f=G[e+8>>2];h=G[e+12>>2];n=Bu(f-j|0,h-((f>>>0>>0)+i|0)|0,2880,0);if((n|0)>0){l=Au(b,b>>31,2880,0);o=Ia;while(1){h=h-(f>>>0<2880)|0;f=f-2880|0;if((Jb(a,f,h,0,d)|0)>0){break b}p=g+2976|0;ic(a,2880,0,p,d);e=h+o|0;m=f+l|0;e=m>>>0>>0?e+1|0:e;Jb(a,m,e,1,d);Wb(a,2880,0,p,d);k=k+1|0;if((n|0)!=(k|0)){continue}break}}Jb(a,j,i,1,d);if((b|0)<=0){break c}k=0;while(1){Wb(a,2880,0,g+96|0,d);k=k+1|0;if((k|0)!=(b|0)){continue}break}break c}rl(a,1,g,d)}Jb(a,j,i,0,d);ic(a,2880,0,g+2976|0,d);e=g+96|0;h:{if(G[d>>2]>0){f=e;break h}k=g+2976|0;while(1){f=k;Jb(a,j,i,0,d);k=e;Wb(a,2880,0,e,d);e=G[d>>2];if((e|0)>0){break a}e=i;i=j+2880|0;e=i>>>0<2880?e+1|0:e;j=i;i=e;Jb(a,j,e,0,d);ic(a,2880,0,k,d);e=f;if(G[d>>2]<=0){continue}break}}G[d>>2]=h;Jb(a,j,i,1,d);Wb(a,2880,0,f,d)}i:{if(c){k=G[a+4>>2];break i}k=G[a+4>>2];a=k;e=G[a+132>>2];c=G[a+128>>2];f=Au(b,b>>31,2880,0);c=c+f|0;e=Ia+e|0;G[a+128>>2]=c;G[a+132>>2]=c>>>0>>0?e+1|0:e}a=G[k+76>>2];i=G[k+88>>2];if((a|0)>(i|0)){break b}c=Au(b,b>>31,2880,0);f=Ia;k=G[k+96>>2];j=i-a|0;l=j+1&3;if(l){b=0;while(1){a=a+1|0;e=k+(a<<3)|0;m=e;h=c+G[e>>2]|0;e=f+G[e+4>>2]|0;G[m>>2]=h;G[m+4>>2]=c>>>0>h>>>0?e+1|0:e;b=b+1|0;if((l|0)!=(b|0)){continue}break}}if(j>>>0<3){break b}while(1){b=k+(a<<3)|0;j=b+8|0;e=f+G[b+12>>2]|0;h=c+G[b+8>>2]|0;e=h>>>0>>0?e+1|0:e;G[j>>2]=h;G[j+4>>2]=e;e=f+G[b+20>>2]|0;h=c+G[b+16>>2]|0;e=h>>>0>>0?e+1|0:e;G[b+16>>2]=h;G[b+20>>2]=e;j=a+3|0;b=k+(j<<3)|0;e=f+G[b+4>>2]|0;h=c+G[b>>2]|0;e=h>>>0>>0?e+1|0:e;G[b>>2]=h;G[b+4>>2]=e;a=a+4|0;b=k+(a<<3)|0;e=f+G[b+4>>2]|0;h=c+G[b>>2]|0;e=h>>>0>>0?e+1|0:e;G[b>>2]=h;G[b+4>>2]=e;if((i|0)!=(j|0)){continue}break}}e=G[d>>2]}Fa=g+5872|0;return e}function iu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-1179712|0;Fa=g;h=ab(40);G[h>>2]=0;G[g+917568>>2]=16921;k=4;i=1;a:{b:{c:{if(!d|!H[d|0]){break c}G[321387]=0;m=aa(158,d|0)|0;d=G[321387];G[321387]=0;e=-1;d:{if(!d){break d}f=G[321388];if(!f){break d}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;j=pc(m,92039);d=G[321387];G[321387]=0;e=-1;e:{if(!d){break e}f=G[321388];if(!f){break e}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}f:{if(!j){break f}e=0;while(1){G[321387]=0;l=rb((g+262208|0)+(e<<16)|0,j,65535);d=G[321387];G[321387]=0;j=-1;g:{if(!d){break g}f=G[321388];if(!f){break g}j=Ab(G[d>>2],h,4);if(!j){break a}_(f|0)}d=Z()|0;if((j|0)==1){break b}G[(g+917568|0)+(i<<2)>>2]=l;G[321387]=0;j=pc(0,92039);d=G[321387];G[321387]=0;l=-1;h:{if(!d){break h}f=G[321388];if(!f){break h}l=Ab(G[d>>2],h,4);if(!l){break a}_(f|0)}d=Z()|0;if((l|0)==1){break b}i=i+1|0;if(!j){break f}d=e>>>0<9;e=e+1|0;if(d){continue}break}}if(!m){break c}Wa(m)}G[(g+917568|0)+(i<<2)>>2]=8722;d=G[968813];G[968813]=d+1;G[321387]=0;G[g+48>>2]=42205;G[g+52>>2]=d;$(156,g+196672|0,65535,4259,g+48|0)|0;d=G[321387];G[321387]=0;e=-1;i:{if(!d){break i}f=G[321388];if(!f){break i}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}d=(i<<2)+g|0;G[d+917572>>2]=g+196672;G[d+917576>>2]=5329;G[321387]=0;G[g+32>>2]=42205;G[g+36>>2]=a;$(156,g+131136|0,65535,8740,g+32|0)|0;d=G[321387];G[321387]=0;e=-1;j:{if(!d){break j}f=G[321388];if(!f){break j}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+16>>2]=42205;G[g+20>>2]=b;G[((i<<2)+g|0)+917580>>2]=g+131136;$(156,g+65600|0,65535,8740,g+16|0)|0;d=G[321387];G[321387]=0;e=-1;k:{if(!d){break k}f=G[321388];if(!f){break k}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g>>2]=42205;G[g+4>>2]=c;G[((i<<2)+g|0)+917584>>2]=g+65600;$(156,g- -64|0,65535,8740,g|0)|0;d=G[321387];G[321387]=0;e=-1;l:{if(!d){break l}f=G[321388];if(!f){break l}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[((i<<2)+g|0)+917588>>2]=g- -64;h=We(1285568,1,h,4);k=Z()|0;d=0}m:{while(1){if(!d){G[321387]=0;ba(168,i+6|0,g+917568|0)|0;d=G[321387];G[321387]=0;e=-1;n:{if(!d){break n}f=G[321388];if(!f){break n}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}}G[321387]=0;b=ba(162,g+196672|0,13287)|0;d=G[321387];G[321387]=0;e=-1;o:{if(!d){break o}f=G[321388];if(!f){break o}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}a=29011;if(!b){break m}G[321387]=0;c=$(163,3809712,1,65535,b|0)|0;d=G[321387];G[321387]=0;e=-1;p:{if(!d){break p}f=G[321388];if(!f){break p}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(164,b|0)|0;d=G[321387];G[321387]=0;e=-1;q:{if(!d){break q}f=G[321388];if(!f){break q}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}E[c+3809712|0]=0;if((c|0)<=0){break m}G[321387]=0;aa(165,g+196672|0)|0;d=G[321387];G[321387]=0;e=-1;r:{if(!d){break r}f=G[321388];if(!f){break r}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}break}a=3809712}Wa(h);Fa=g+1179712|0;return a|0}Wa(h);Ve(d,f);W()}function gu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-1179712|0;Fa=g;h=ab(40);G[h>>2]=0;G[g+917568>>2]=13173;l=4;i=1;a:{b:{c:{if(!d|!H[d|0]){break c}G[321387]=0;m=aa(158,d|0)|0;d=G[321387];G[321387]=0;e=-1;d:{if(!d){break d}f=G[321388];if(!f){break d}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;j=pc(m,92039);d=G[321387];G[321387]=0;e=-1;e:{if(!d){break e}f=G[321388];if(!f){break e}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}f:{if(!j){break f}e=0;while(1){G[321387]=0;k=rb((g+262208|0)+(e<<16)|0,j,65535);d=G[321387];G[321387]=0;j=-1;g:{if(!d){break g}f=G[321388];if(!f){break g}j=Ab(G[d>>2],h,4);if(!j){break a}_(f|0)}d=Z()|0;if((j|0)==1){break b}G[(g+917568|0)+(i<<2)>>2]=k;G[321387]=0;j=pc(0,92039);d=G[321387];G[321387]=0;k=-1;h:{if(!d){break h}f=G[321388];if(!f){break h}k=Ab(G[d>>2],h,4);if(!k){break a}_(f|0)}d=Z()|0;if((k|0)==1){break b}i=i+1|0;if(!j){break f}d=e>>>0<9;e=e+1|0;if(d){continue}break}}if(!m){break c}Wa(m)}G[(g+917568|0)+(i<<2)>>2]=33947;G[321387]=0;G[g+48>>2]=a;$(156,g+196672|0,65535,30633,g+48|0)|0;d=G[321387];G[321387]=0;e=-1;i:{if(!d){break i}f=G[321388];if(!f){break i}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}a=G[968813];G[968813]=a+1;d=(i<<2)+g|0;G[d+917572>>2]=g+196672;G[d+917576>>2]=8722;G[321387]=0;G[g+32>>2]=42205;G[g+36>>2]=a;$(156,g+131136|0,65535,4259,g+32|0)|0;d=G[321387];G[321387]=0;e=-1;j:{if(!d){break j}f=G[321388];if(!f){break j}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+16>>2]=42205;G[g+20>>2]=b;G[((i<<2)+g|0)+917580>>2]=g+131136;$(156,g+65600|0,65535,8740,g+16|0)|0;d=G[321387];G[321387]=0;e=-1;k:{if(!d){break k}f=G[321388];if(!f){break k}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g>>2]=42205;G[g+4>>2]=c;G[((i<<2)+g|0)+917584>>2]=g+65600;$(156,g- -64|0,65535,8740,g|0)|0;d=G[321387];G[321387]=0;e=-1;l:{if(!d){break l}f=G[321388];if(!f){break l}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[((i<<2)+g|0)+917588>>2]=g- -64;h=We(1285568,1,h,4);l=Z()|0;d=0}m:{while(1){if(!d){G[321387]=0;ba(170,i+6|0,g+917568|0)|0;d=G[321387];G[321387]=0;e=-1;n:{if(!d){break n}f=G[321388];if(!f){break n}e=Ab(G[d>>2],h,l);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}}G[321387]=0;a=ba(162,g+131136|0,13287)|0;d=G[321387];G[321387]=0;e=-1;o:{if(!d){break o}f=G[321388];if(!f){break o}e=Ab(G[d>>2],h,l);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}k=28917;if(!a){break m}G[321387]=0;b=$(163,3809712,1,65535,a|0)|0;d=G[321387];G[321387]=0;e=-1;p:{if(!d){break p}f=G[321388];if(!f){break p}e=Ab(G[d>>2],h,l);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(164,a|0)|0;d=G[321387];G[321387]=0;e=-1;q:{if(!d){break q}f=G[321388];if(!f){break q}e=Ab(G[d>>2],h,l);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}E[b+3809712|0]=0;if((b|0)<=0){break m}G[321387]=0;aa(165,g+131136|0)|0;d=G[321387];G[321387]=0;e=-1;r:{if(!d){break r}f=G[321388];if(!f){break r}e=Ab(G[d>>2],h,l);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}break}k=3809712}Wa(h);Fa=g+1179712|0;return k|0}Wa(h);Ve(d,f);W()}function ud(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=Fa-176|0;Fa=i;l=Va(b);j=Va(c);a:{b:{if((l|0)!=7){break b}if(fb(b,33332,7)){if(fb(b,32708,7)){break b}}c:{d:{e:{while(1){f=a+d|0;if(!H[f|0]){e=d;break e}e=1;g=a+d|0;f=g+1|0;if(!H[f|0]){break e}f=g+2|0;if(!H[f|0]){break e}f=g+3|0;if(!H[f|0]){break e}f=g+4|0;if(!H[f|0]){break e}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0;break d}if(e){break d}break c}e=a;while(1){g=ec(e,35790,f-e|0);if(!g){break c}d=(g-a|0)%80|0;f:{if((d|0)>=8){e=g+1|0;break f}h=H[g+3|0];if(!((h|0)==61|(h-33&255)>>>0>93)){e=g+1|0;break f}h=g-d|0;if((d|0)>0){l=g+1|0;d=h;while(1){e=H[d|0]==32?e:l;d=d+1|0;if(g>>>0>d>>>0){continue}break}}if(e>>>0<=g>>>0){break c}}h=0;if(e>>>0>>0){continue}break}}rb(h+80|0,h,80);a=rb(h,b,7);cb(a+7|0,32,73);rb(a+9|0,c,j);break a}g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{while(1){f=a+d|0;if(!H[f|0]){e=d;break p}e=1;h=a+d|0;f=h+1|0;if(!H[f|0]){break p}f=h+2|0;if(!H[f|0]){break p}f=h+3|0;if(!H[f|0]){break p}f=h+4|0;if(!H[f|0]){break p}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0;break o}if(!e){break n}}e=a;while(1){g=ec(e,b,f-e|0);if(!g){break n}d=(g-a|0)%80|0;q:{if((d|0)>=8){e=g+1|0;break q}h=H[Va(b)+g|0];if(!((h|0)==61|(h-33&255)>>>0>93)){e=g+1|0;break q}h=g-d|0;if((d|0)>0){k=g+1|0;d=h;while(1){e=H[d|0]==32?e:k;d=d+1|0;if(g>>>0>d>>>0){continue}break}}if(e>>>0<=g>>>0){break m}}if(e>>>0>>0){continue}break}}d=0;while(1){f=a+d|0;if(!H[f|0]){e=d;break l}e=1;h=a+d|0;f=h+1|0;if(!H[f|0]){break l}f=h+2|0;if(!H[f|0]){break l}f=h+3|0;if(!H[f|0]){break l}f=h+4|0;if(!H[f|0]){break l}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0;break k}d=rb(i- -64|0,h,80);E[d+80|0]=0;e=h+80|0;a=d;g=jb(d,39);if(g){a=jb(g+1|0,39)}g=a;g=jb(g,47);if(!g){break h}d=(d-g|0)+80|0;a=rb(i,g+1|0,d);d=(a+d|0)-1|0;r:{if(a>>>0>=d>>>0){break r}while(1){d=d-1|0;if(H[d|0]!=32){break r}E[d|0]=0;if(a>>>0>>0){continue}break}}a=Va(a);break g}if(!e){break j}}e=a;while(1){h=ec(e,35790,f-e|0);if(!h){break j}s:{d=(h-a|0)%80|0;t:{if((d|0)>=8){e=h+1|0;break t}g=H[h+3|0];if(!((g|0)==61|(g-33&255)>>>0>93)){e=h+1|0;break t}g=h-d|0;if((d|0)>0){k=h+1|0;d=g;while(1){e=H[d|0]==32?e:k;d=d+1|0;if(h>>>0>d>>>0){continue}break}}if(e>>>0<=h>>>0){break s}}if(e>>>0>>0){continue}break j}break}if((a|0)==(g|0)){break j}d=g;while(1){h=d;d=d-80|0;if(!fb(d,68289,8)){continue}break}if(g>>>0>h>>>0){break i}}d=0;u:{while(1){f=a+d|0;if(!H[f|0]){break u}e=a+d|0;f=e+1|0;if(!H[f|0]){break u}f=e+2|0;if(!H[f|0]){break u}f=e+3|0;if(!H[f|0]){break u}f=e+4|0;if(!H[f|0]){break u}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0}e=a;while(1){g=ec(e,35790,f-e|0);d=(g-a|0)%80|0;if((d|0)>=8){e=g+1|0;continue}h=H[g+3|0];if(!((h|0)==61|(h-33&255)>>>0>93)){e=g+1|0;continue}h=g-d|0;if((d|0)>0){k=g+1|0;d=h;while(1){e=H[d|0]==32?e:k;d=d+1|0;if(g>>>0>d>>>0){continue}break}}if(e>>>0>g>>>0){continue}break}e=rb(h+80|0,h,80);break h}e=h+80|0}E[i|0]=0;a=0}h=cb(h,32,e-h|0);d=rb(h,b,l);E[d+8|0]=61;E[d+9|0]=32;v:{if(H[c|0]==39){rb(d+10|0,c,j);b=(j|0)>19?j+12|0:30;break v}rb((d-j|0)+30|0,c,j);b=30}if((a|0)<=0){break a}c=b+d|0;E[c+2|0]=47;d=a;a=(a+b|0)+2|0;b=a>>>0>80?78-b|0:d;b=rb(c+3|0,i,b)+b|0;if(b>>>0>=e>>>0){break a}cb(b,32,((h^-1)+e|0)-(a>>>0<80?a:80)|0)}Fa=i+176|0}function ju(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-1179712|0;Fa=g;h=ab(40);G[h>>2]=0;G[g+917568>>2]=29524;k=4;i=1;a:{b:{c:{if(!d|!H[d|0]){break c}G[321387]=0;m=aa(158,d|0)|0;d=G[321387];G[321387]=0;e=-1;d:{if(!d){break d}f=G[321388];if(!f){break d}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;j=pc(m,92039);d=G[321387];G[321387]=0;e=-1;e:{if(!d){break e}f=G[321388];if(!f){break e}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}f:{if(!j){break f}e=0;while(1){G[321387]=0;l=rb((g+262208|0)+(e<<16)|0,j,65535);d=G[321387];G[321387]=0;j=-1;g:{if(!d){break g}f=G[321388];if(!f){break g}j=Ab(G[d>>2],h,4);if(!j){break a}_(f|0)}d=Z()|0;if((j|0)==1){break b}G[(g+917568|0)+(i<<2)>>2]=l;G[321387]=0;j=pc(0,92039);d=G[321387];G[321387]=0;l=-1;h:{if(!d){break h}f=G[321388];if(!f){break h}l=Ab(G[d>>2],h,4);if(!l){break a}_(f|0)}d=Z()|0;if((l|0)==1){break b}i=i+1|0;if(!j){break f}d=e>>>0<9;e=e+1|0;if(d){continue}break}}if(!m){break c}Wa(m)}G[(g+917568|0)+(i<<2)>>2]=8722;d=G[968813];G[968813]=d+1;G[321387]=0;G[g+48>>2]=42205;G[g+52>>2]=d;$(156,g+196672|0,65535,4259,g+48|0)|0;d=G[321387];G[321387]=0;e=-1;i:{if(!d){break i}f=G[321388];if(!f){break i}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+32>>2]=42205;G[g+36>>2]=a;G[((i<<2)+g|0)+917572>>2]=g+196672;$(156,g+131136|0,65535,8740,g+32|0)|0;d=G[321387];G[321387]=0;e=-1;j:{if(!d){break j}f=G[321388];if(!f){break j}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+16>>2]=42205;G[g+20>>2]=b;G[((i<<2)+g|0)+917576>>2]=g+131136;$(156,g+65600|0,65535,8740,g+16|0)|0;d=G[321387];G[321387]=0;e=-1;k:{if(!d){break k}f=G[321388];if(!f){break k}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g>>2]=42205;G[g+4>>2]=c;G[((i<<2)+g|0)+917580>>2]=g+65600;$(156,g- -64|0,65535,8740,g|0)|0;d=G[321387];G[321387]=0;e=-1;l:{if(!d){break l}f=G[321388];if(!f){break l}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[((i<<2)+g|0)+917584>>2]=g- -64;h=We(1285568,1,h,4);k=Z()|0;d=0}m:{while(1){if(!d){G[321387]=0;ba(167,i+5|0,g+917568|0)|0;d=G[321387];G[321387]=0;e=-1;n:{if(!d){break n}f=G[321388];if(!f){break n}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}}G[321387]=0;b=ba(162,g+196672|0,13287)|0;d=G[321387];G[321387]=0;e=-1;o:{if(!d){break o}f=G[321388];if(!f){break o}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}a=29056;if(!b){break m}G[321387]=0;c=$(163,3809712,1,65535,b|0)|0;d=G[321387];G[321387]=0;e=-1;p:{if(!d){break p}f=G[321388];if(!f){break p}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(164,b|0)|0;d=G[321387];G[321387]=0;e=-1;q:{if(!d){break q}f=G[321388];if(!f){break q}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}E[c+3809712|0]=0;if((c|0)<=0){break m}G[321387]=0;aa(165,g+196672|0)|0;d=G[321387];G[321387]=0;e=-1;r:{if(!d){break r}f=G[321388];if(!f){break r}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}break}a=3809712}Wa(h);Fa=g+1179712|0;return a|0}Wa(h);Ve(d,f);W()}function ku(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-1179712|0;Fa=g;h=ab(40);G[h>>2]=0;G[g+917568>>2]=34197;k=4;i=1;a:{b:{c:{if(!d|!H[d|0]){break c}G[321387]=0;m=aa(158,d|0)|0;d=G[321387];G[321387]=0;e=-1;d:{if(!d){break d}f=G[321388];if(!f){break d}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;j=pc(m,92039);d=G[321387];G[321387]=0;e=-1;e:{if(!d){break e}f=G[321388];if(!f){break e}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}f:{if(!j){break f}e=0;while(1){G[321387]=0;l=rb((g+262208|0)+(e<<16)|0,j,65535);d=G[321387];G[321387]=0;j=-1;g:{if(!d){break g}f=G[321388];if(!f){break g}j=Ab(G[d>>2],h,4);if(!j){break a}_(f|0)}d=Z()|0;if((j|0)==1){break b}G[(g+917568|0)+(i<<2)>>2]=l;G[321387]=0;j=pc(0,92039);d=G[321387];G[321387]=0;l=-1;h:{if(!d){break h}f=G[321388];if(!f){break h}l=Ab(G[d>>2],h,4);if(!l){break a}_(f|0)}d=Z()|0;if((l|0)==1){break b}i=i+1|0;if(!j){break f}d=e>>>0<9;e=e+1|0;if(d){continue}break}}if(!m){break c}Wa(m)}G[(g+917568|0)+(i<<2)>>2]=8722;d=G[968813];G[968813]=d+1;G[321387]=0;G[g+48>>2]=42205;G[g+52>>2]=d;$(156,g+196672|0,65535,4259,g+48|0)|0;d=G[321387];G[321387]=0;e=-1;i:{if(!d){break i}f=G[321388];if(!f){break i}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+32>>2]=42205;G[g+36>>2]=a;G[((i<<2)+g|0)+917572>>2]=g+196672;$(156,g+131136|0,65535,8740,g+32|0)|0;d=G[321387];G[321387]=0;e=-1;j:{if(!d){break j}f=G[321388];if(!f){break j}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g+16>>2]=42205;G[g+20>>2]=b;G[((i<<2)+g|0)+917576>>2]=g+131136;$(156,g+65600|0,65535,8740,g+16|0)|0;d=G[321387];G[321387]=0;e=-1;k:{if(!d){break k}f=G[321388];if(!f){break k}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[321387]=0;G[g>>2]=42205;G[g+4>>2]=c;G[((i<<2)+g|0)+917580>>2]=g+65600;$(156,g- -64|0,65535,8740,g|0)|0;d=G[321387];G[321387]=0;e=-1;l:{if(!d){break l}f=G[321388];if(!f){break l}e=Ab(G[d>>2],h,4);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){break b}G[((i<<2)+g|0)+917584>>2]=g- -64;h=We(1285568,1,h,4);k=Z()|0;d=0}m:{while(1){if(!d){G[321387]=0;ba(166,i+5|0,g+917568|0)|0;d=G[321387];G[321387]=0;e=-1;n:{if(!d){break n}f=G[321388];if(!f){break n}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}}G[321387]=0;b=ba(162,g+196672|0,13287)|0;d=G[321387];G[321387]=0;e=-1;o:{if(!d){break o}f=G[321388];if(!f){break o}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}a=28824;if(!b){break m}G[321387]=0;c=$(163,3809712,1,65535,b|0)|0;d=G[321387];G[321387]=0;e=-1;p:{if(!d){break p}f=G[321388];if(!f){break p}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}G[321387]=0;aa(164,b|0)|0;d=G[321387];G[321387]=0;e=-1;q:{if(!d){break q}f=G[321388];if(!f){break q}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}E[c+3809712|0]=0;if((c|0)<0){break m}G[321387]=0;aa(165,g+196672|0)|0;d=G[321387];G[321387]=0;e=-1;r:{if(!d){break r}f=G[321388];if(!f){break r}e=Ab(G[d>>2],h,k);if(!e){break a}_(f|0)}d=Z()|0;if((e|0)==1){continue}break}a=3809712}Wa(h);Fa=g+1179712|0;return a|0}Wa(h);Ve(d,f);W()}function Xf(a,b){var 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;m=Fa-112|0;Fa=m;e=G[a>>2];c=G[a+4>>2];a:{if((e|0)!=G[c+76>>2]){mb(a,e+1|0,0,b);break a}if(G[c+84>>2]!=1){break a}an(m+12|0);c=G[a+4>>2];if(G[c+4>>2]!=G[m+12>>2]){Rb(a,b);c=G[a+4>>2]}e=!!G[c+984>>2];c=G[c+988>>2];if(e&(c|0)>=0|(c|0)>0){d=Fa-608|0;Fa=d;ef(a,2,b);c=d+496|0;_f(a,40853,d+584|0,c,b);Ec(a,33837,d+596|0,c,b);b:{if(G[d+596>>2]<=0){break b}o=1;while(1){c=d+416|0;zb(34641,o,c,b);if((Fc(a,c,d+336|0,d+496|0,b)|0)>0){c=d+16|0;bb(c,47203,68);tb(5,c);break b}c:{d:{if((H[d+336|0]&254)==80){break d}c=H[d+337|0];if((c|0)==80){break d}if((c|0)!=81){break c}}g=G[d+584>>2];c=G[d+588>>2];e:{if(!g&(c|0)<=0|(c|0)<0){j=0;i=0;break e}if(G[b>>2]<=0){p=o-1|0;j=0;i=0;f=1;c=0;while(1){g=f;e=c;G[d+600>>2]=0;G[d+604>>2]=0;G[d+24>>2]=0;G[d+28>>2]=0;G[d+16>>2]=0;G[d+20>>2]=0;f:{if(G[b>>2]>0){break f}f=G[a>>2];c=G[a+4>>2];g:{if((f|0)!=G[c+76>>2]){mb(a,f+1|0,0,b);break g}if((G[c+128>>2]&G[c+132>>2])!=-1){break g}if((Rb(a,b)|0)>0){break f}}c=G[a+4>>2];f=G[c+968>>2]+M(p,160)|0;if(G[f+80>>2]>=0){G[b>>2]=317;break f}q=G[f+76>>2];n=G[c+132>>2];s=G[f+72>>2];h=G[c+128>>2];r=Au(G[c+960>>2],G[c+964>>2],g-1|0,e-!g|0);h=h+r|0;c=Ia+n|0;c=h>>>0>>0?c+1|0:c;n=h;h=s+h|0;c=c+q|0;c=h>>>0>>0?c+1|0:c;if(!(H[f+140|0]!=80&H[f+141|0]!=80)){if((Uc(a,h,c,2,4,d+600|0,b)|0)>0){break f}l=G[d+600>>2];k=0;break f}c=Tc(a,h,c,2,8,d+16|0,b);c=(c|0)<=0;l=c?G[d+16>>2]:l;k=c?G[d+20>>2]:k}c=j>>>0>>0&(i|0)<=(k|0)|(i|0)<(k|0);j=c?l:j;i=c?k:i;c=e;f=g+1|0;c=f?c:c+1|0;h=J[d+584>>2]>g>>>0;g=G[d+588>>2];if(h&(g|0)>=(e|0)|(e|0)<(g|0)){continue}break}break e}p=0;e=0;j=0;i=0;f=c-!g|0;if(!f&g-1>>>0>=7|f){q=g&-8;h=c;f=0;c=0;while(1){n=j>>>0>>0&(i|0)<=(k|0)|(i|0)<(k|0);j=n?l:j;i=n?k:i;f=f+8|0;c=f>>>0<8?c+1|0:c;if((q|0)!=(f|0)|(c|0)!=(h|0)){continue}break}}c=0;f=c;g=g&7;if(!(c|g)){break e}while(1){c=j>>>0>>0&(i|0)<=(k|0)|(i|0)<(k|0);j=c?l:j;i=c?k:i;c=e;e=p+1|0;c=e?c:c+1|0;p=e;e=c;if((g|0)!=(p|0)|(f|0)!=(c|0)){continue}break}}F[d+256>>1]=39;c=jb(d+336|0,40);if(c){E[c|0]=0}c=Va(d+336|0);L[d>>3]=+(j>>>0)+ +(i|0)*4294967296;e=d+208|0;Ya(e,40,59992,d);if((Va(e)+c|0)-69>>>0<=4294967224){tb(5,47271);G[b>>2]=261;break b}c=Gb(Gb(d+256|0,d+336|0),d+208|0);if(Va(c)>>>0<=8){while(1){e=Va(c)+c|0;E[e|0]=32;E[e+1|0]=0;if(Va(c)>>>0<9){continue}break}}e=Va(c)+c|0;E[e|0]=39;E[e+1|0]=0;e=c;c=d+112|0;Ob(d+416|0,e,d+496|0,c,b);Hd(a,c,b)}c=G[d+596>>2]>(o|0);o=o+1|0;if(c){continue}break}}Fa=d+608|0}_n(a,b)}c=G[a+4>>2];h:{if(G[c+8>>2]!=1){break h}e=G[c+968>>2];if(!e){break h}Wa(e);e=0;c=G[a+4>>2];G[c+968>>2]=0;if(!G[c+1228>>2]){break h}g=(G[c+1112>>2]-1|0)/G[c+1052>>2]|0;if((g|0)>=0){while(1){f=e<<2;c=G[a+4>>2];h=G[f+G[c+1240>>2]>>2];if(h){Wa(h);c=G[a+4>>2]}c=G[G[c+1244>>2]+f>>2];if(c){Wa(c)}c=(e|0)!=(g|0);e=e+1|0;if(c){continue}break}c=G[a+4>>2]}Wa(G[c+1248>>2]);Wa(G[G[a+4>>2]+1236>>2]);Wa(G[G[a+4>>2]+1232>>2]);Wa(G[G[a+4>>2]+1244>>2]);Wa(G[G[a+4>>2]+1240>>2]);Wa(G[G[a+4>>2]+1228>>2]);c=G[a+4>>2];G[c+1228>>2]=0;G[c+1232>>2]=0;a=c+1244|0;G[a>>2]=0;G[a+4>>2]=0;a=c+1236|0;G[a>>2]=0;G[a+4>>2]=0}e=G[b>>2];if(!((e|0)<=0|(e|0)==999)){G[m>>2]=G[c+76>>2];a=m+16|0;Ya(a,81,45414,m);tb(5,a);e=G[b>>2]}Fa=m+112|0;return e}function Rj(a,b){var 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;f=Fa-224|0;Fa=f;c=362;a:{if(!a|!b){break a}G[f+220>>2]=0;g=G[a>>2];if((g|0)>0){while(1){d=G[a+4>>2]+M(q,176)|0;c=362;b:{if(!d){break b}c:{e=d+4|0;if(!Xa(35530,e)){break c}if(!Xa(34516,e)){break c}if(!Xa(32941,e)){break c}if(!Xa(33788,e)){break c}if(!Xa(33303,e)){break c}if(!Xa(33311,e)){break c}if(!Xa(33837,e)){break c}if(!Xa(34350,e)){break c}if(!Xa(35787,e)){break c}if(!Xa(33996,e)){break c}d:{e:{if(!fb(33788,e,5)){break e}if(!fb(34641,e,5)){break e}c=0;if(fb(35402,e,5)){break d}}c=0;if((H[d+9|0]-58&255)>>>0<247){break d}c=1;f:{e=H[d+10|0];g:{if((e-48&255)>>>0>=10){if(!e){break c}c=0;if((e|0)!=32){break g}}e=H[d+11|0];if(c){break f}c=368;if((e|0)==32){break d}}c=0;break b}c=368;if((e-48&255)>>>0<10){break d}c=e&223?0:368}break b}c=368}G[f+220>>2]=c;h:{i:{j:{if(!c){k:{switch(G[d>>2]-1|0){case 0:G[f+216>>2]=E[d+80|0];xd(b,14,d+4|0,f+216|0,d+96|0,f+220|0);break j;case 1:t=d+4|0;m=G[d+80>>2];n=d+96|0;i=0;r=0;o=0;k=0;h=Fa-400|0;Fa=h;G[h+12>>2]=-1;l=f+220|0;if(G[l>>2]<=0){c=Va(m);if(n){d=Va(n);r=(d|0)<47?d:47}E[h+16|0]=0;s=qb(h+16|0,m,68);d=jb(s,39);if(d){while(1){i=i+1|0;d=jb(d+1|0,39);if(d){continue}break}}j=c>>>0>1?c:1;c=rb(h+112|0,t,80);E[c+80|0]=0;while(1){d=c;c=d+1|0;if(H[d|0]==32){continue}break}l:{m:{c=Va(d);if((c|0)>8){break m}if((ve(d,h+12|0)|0)>0){break m}c=68-i|0;break l}c=75-(c+i|0)|0}e=c;if((j|0)>0){u=1;while(1){E[s|0]=0;p=qb(s,m+o|0,e);if(G[l>>2]<=0){E[h+304|0]=39;c=0;d=1;n:{o:{p:{g=Va(p);v=g>>>0<68?g:68;if(v){while(1){g=H[c+p|0];E[(h+304|0)+d|0]=g;q:{if((g|0)!=39){g=d;break q}g=d+1|0;E[g+(h+304|0)|0]=39}d=g+1|0;c=c+1|0;if(g>>>0<68&v>>>0>c>>>0){continue}break}if(g>>>0>7){break p}}c=9;cb((h+304|0)+d|0,32,9-d|0);break o}c=d;g=69;if((d|0)==70){break n}}E[(h+304|0)+c|0]=39;g=c+1|0}E[g+(h+304|0)|0]=0}r:{if((e|0)>=(j|0)){break r}e=e-1|0;c=h+304|0;c=Va(c)+c|0;d=c-2|0;if(H[d|0]!=39){E[d|0]=38;break r}E[c-1|0]=0;E[c-3|0]=38}s:{if(!u){Ob(35367,h+304|0,k?0:n,h+208|0,l);F[h+216>>1]=8224;break s}Ob(t,h+304|0,n,h+208|0,l)}wb(b,h+208|0,l);o=e+o|0;j=j-e|0;if((j|0)>0){i=0;E[p|0]=0;d=jb(qb(p,m+o|0,68),39);if(d){while(1){i=i+1|0;d=jb(d+1|0,39);if(d){continue}break}}e=68-i|0}u=0;t:{if((r|0)<=0){k=0;break t}c=i+j|0;if((c|0)>68){k=0;break t}k=(c+r|0)>65&(e|0)>18;e=k?j-15|0:e}if((j|0)>0){continue}break}}}Fa=h+400|0;break j;case 2:G[f+12>>2]=G[d+80>>2];xd(b,41,d+4|0,f+12|0,d+96|0,f+220|0);break j;case 3:xd(b,82,d+4|0,d+80|0,d+96|0,f+220|0);break j;case 4:xd(b,163,d+4|0,d+80|0,d+96|0,f+220|0);break j;case 5:e=d+4|0;g=d+96|0;c=Fa-176|0;Fa=c;d=f+220|0;if(G[d>>2]<=0){F[c+96>>1]=32;Ob(e,c+96|0,g,c,d);wb(b,c,d)}Fa=c+176|0;break j;case 6:break k;default:break i}}c=d+4|0;if(!Xa(32708,c)){ze(b,d+96|0,f+220|0);break j}d=d+96|0;if(!Xa(33332,c)){Pg(b,d,f+220|0);break j}G[f+4>>2]=d;G[f>>2]=c;c=f+16|0;Ya(c,200,8729,f);wb(b,c,f+220|0);break j}G[f+220>>2]=0;if(!H[d+96|0]|(c|0)!=368){break h}e=d+4|0;g=d+96|0;c=Fa-256|0;Fa=c;d=f+220|0;if(G[d>>2]<=0){if((Vc(b,e,c+96|0,c+176|0,d)|0)<=0){Ob(e,c+96|0,g,c,d);Hd(b,c,d)}}Fa=c+256|0}c=G[f+220>>2]}if(c){break a}g=G[a>>2]}q=q+1|0;if((q|0)<(g|0)){continue}break}}Rb(b,f+220|0);c=G[f+220>>2]}Fa=f+224|0;return c}function Bo(a,b,c,d,e,f,g,h,i){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;j=Fa-208|0;Fa=j;bb(j+48|0,118784,72);G[j+32>>2]=G[29724];l=G[29723];G[j+24>>2]=G[29722];G[j+28>>2]=l;l=G[29721];G[j+16>>2]=G[29720];G[j+20>>2]=l;l=G[29719];G[j+8>>2]=G[29718];G[j+12>>2]=l;l=G[29717];G[j>>2]=G[29716];G[j+4>>2]=l;a:{if(!(d|e)|G[i>>2]>0){break a}Qd(a,j+204|0,i);nk(a,9,j+128|0,i);b:{c:{d:{l=G[j+204>>2];if(!(!l|!(G[j+128>>2]|G[j+132>>2]))){if((l|0)<=0){break b}bb(j+48|0,c,l<<3);x=l&1;if((l|0)!=1){break d}o=1;break c}G[i>>2]=320;break a}y=l&-2;l=1;while(1){m=t<<3;o=m|8;s=o+c|0;q=G[s>>2];r=q-1|0;u=G[s+4>>2]-!q|0;s=j+128|0;q=s+m|0;q=Au(G[q>>2],G[q+4>>2],l,n);v=Ia;r=Au(r,u,q,v);z=Ia;u=r;m=c+m|0;r=G[m>>2];l=Au(r-1|0,G[m+4>>2]-!r|0,l,n)+p|0;k=k+Ia|0;k=l>>>0

>>0?k+1|0:k;m=l;l=u+m|0;k=k+z|0;k=m>>>0>l>>>0?k+1|0:k;p=l;t=t+2|0;l=o+s|0;o=Au(G[l>>2],G[l+4>>2],q,v);n=Ia;m=n;l=o;w=w+2|0;if((w|0)!=(y|0)){continue}break}}if(!x){break b}l=(t<<3)+c|0;n=G[l>>2];l=Au(n-1|0,G[l+4>>2]-!n|0,o,m)+p|0;k=k+Ia|0;k=l>>>0

>>0?k+1|0:k;p=l}l=p+1|0;k=l?k:k+1|0;m=l;e:{if(Nb(a,i)){f:{if(G[c>>2]!=1|G[c+4>>2]|(G[j+204>>2]&-2)!=2){break f}p=G[j+128>>2];o=G[j+132>>2];l=Bu(d,e,p,o);n=Ia;if((Au(l,n,p,o)|0)!=(d|0)|(Ia|0)!=(e|0)){break f}G[j+48>>2]=p;G[j+52>>2]=o;k=n+G[c+12>>2]|0;d=l+G[c+8>>2]|0;k=d>>>0>>0?k+1|0:k;e=d;l=e-1|0;d=G[j+136>>2];n=k-!e|0;e=n;k=G[j+140>>2];if(l>>>0>d>>>0&(e|0)>=(k|0)|(e|0)>(k|0)){o=G[j+64>>2];m=G[j+68>>2];while(1){e=o+1|0;m=e?m:m+1|0;o=e;e=l;l=e-d|0;n=n-((d>>>0>e>>>0)+k|0)|0;e=n;if(d>>>0>>0&(k|0)<=(e|0)|(e|0)>(k|0)){continue}break}G[j+64>>2]=o;G[j+68>>2]=m}G[j+56>>2]=l;G[j+60>>2]=n;md(a,b,c,j+48|0,j,1,f,g,0,h,i);break e}Nc(a,b,m,k,d,e,1,f,g,0,h,i);break e}g:{switch(b-11|0){case 0:if(!f){Re(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}Re(a,2,1,0,m,k,d,e,1,1,H[f|0],g,j+203|0,h,i);break e;case 1:if(!f){Ef(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}Ef(a,2,1,0,m,k,d,e,1,1,E[f|0],g,j+203|0,h,i);break e;case 9:if(!f){Gf(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}Gf(a,2,1,0,m,k,d,e,1,1,I[f>>1],g,j+203|0,h,i);break e;case 10:if(!f){jf(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}jf(a,2,1,0,m,k,d,e,1,1,F[f>>1],g,j+203|0,h,i);break e;case 19:if(!f){Dh(a,2,1,0,m,k,d,e,1,0,g,j+203|0,h,i);break e}Dh(a,2,1,0,m,k,d,e,1,G[f>>2],g,j+203|0,h,i);break e;case 20:if(!f){Eh(a,2,1,0,m,k,d,e,1,0,g,j+203|0,h,i);break e}Eh(a,2,1,0,m,k,d,e,1,G[f>>2],g,j+203|0,h,i);break e;case 29:if(!f){qe(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}qe(a,2,1,0,m,k,d,e,1,1,G[f>>2],g,j+203|0,h,i);break e;case 30:if(!f){Ud(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}Ud(a,2,1,0,m,k,d,e,1,1,G[f>>2],g,j+203|0,h,i);break e;case 69:if(!f){hf(a,2,1,0,m,k,d,e,1,1,0,0,g,j+203|0,h,i);break e}hf(a,2,1,0,m,k,d,e,1,1,G[f>>2],G[f+4>>2],g,j+203|0,h,i);break e;case 70:if(!f){Se(a,2,1,0,m,k,d,e,1,1,0,0,g,j+203|0,h,i);break e}Se(a,2,1,0,m,k,d,e,1,1,G[f>>2],G[f+4>>2],g,j+203|0,h,i);break e;case 31:if(!f){ae(a,2,1,0,m,k,d,e,1,1,N(0),g,j+203|0,h,i);break e}ae(a,2,1,0,m,k,d,e,1,1,K[f>>2],g,j+203|0,h,i);break e;case 71:if(!f){Id(a,2,1,0,m,k,d,e,1,1,0,g,j+203|0,h,i);break e}Id(a,2,1,0,m,k,d,e,1,1,L[f>>3],g,j+203|0,h,i);break e;default:break g}}G[i>>2]=410}}Fa=j+208|0}function Nn(a,b){a=a|0;b=b|0;var 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;G[119132]=b;a:{b:{b=G[110920];c:{d:{if(b>>>0>>0<2){break f}b=b+d|0;G[110921]=b;if(b>>>0<32768){continue}break e}break}if(b){break e}Ua(443536);Ua(22164);G[47520]=1;G[47519]=0;b=2;break c}G[110920]=1;G[110923]=G[110923]+b;b=443696}b=H[b|0];G[47520]=b;G[47519]=b&128;if(b&96){Ua(443536);Ua(15074);b=G[47520]}d=b&31;G[47520]=d;if(d>>>0>=17){break b}b=1<>3;d=e-h|0;h:{if((d|0)<=0){break h}i=0;b=0;if(e+(h^-1)>>>0>=3){m=d&-4;l=0;while(1){E[b+443696|0]=H[(b+h|0)+443696|0];e=b|1;E[e+443696|0]=H[(e+h|0)+443696|0];e=b|2;E[e+443696|0]=H[(e+h|0)+443696|0];e=b|3;E[e+443696|0]=H[(e+h|0)+443696|0];b=b+4|0;l=l+4|0;if((m|0)!=(l|0)){continue}break}}e=d&3;if(!e){break h}while(1){E[b+443696|0]=H[(b+h|0)+443696|0];b=b+1|0;i=i+1|0;if((e|0)!=(i|0)){continue}break}}G[110921]=d;if(d>>>0<=63){n=zc(d+443696|0,1,32768,a);if((n|0)==-1){Ua(443536);Ua(22164);return 1}d=G[110921]+n|0;G[110921]=d;G[110923]=G[110923]+n}f=0;if(n){h=d-((d>>>0)%(k>>>0)|0)<<3}else{h=(d<<3)+t|0}i:{if((h|0)<=0){break i}while(1){if((j|0)>(r|0)){b=k+1|0;o=-1<>3;b=d+443696|0;d=(H[b|0]|H[b+1|0]<<8|H[d+443698|0]<<16)>>>(f&7)&o;f=f+k|0;j:{if((g|0)!=-1){m=d;d=g;e=c;break j}if(d>>>0>=256){break a}E[c+673152|0]=d;e=c+1|0;if((f|0)>=(h|0)){c=e;g=d;p=d;break i}c=f>>3;b=c+443696|0;m=(H[b|0]|H[b+1|0]<<8|H[c+443698|0]<<16)>>>(f&7)&o;f=f+k|0;p=d}if(!(!G[47519]|(m|0)!=256)){j=256;cb(476544,0,256);c=k<<3;b=(c+f|0)-1|0;f=b-((b|0)%(c|0)|0)|0;g=d;c=e;o=511;r=511;k=9;continue g}c=757118;b=m;if((j|0)<=(b|0)){if((j|0)<(m|0)){if((e|0)>0){Mn(e);G[110922]=G[110922]+e}break a}E[757117]=p;c=757117;b=d}if(b>>>0>=256){while(1){c=c-1|0;E[c|0]=H[b+607616|0];b=I[(b<<1)+476544>>1];if(b>>>0>255){continue}break}}i=c-1|0;p=H[b+607616|0];E[i|0]=p;b=757119-c|0;c=e+b|0;k:{if((c|0)>=16384){c=e;while(1){g=16384-c|0;q=(b|0)<(g|0)?b:g;if((q|0)>0){bb(c+673152|0,i,q);c=c+q|0}b=c;l:{if((b|0)<16384){break l}e=G[110919];m:{if(!e){if((hb(673152,1,b,G[119132])|0)==(b|0)){break m}Ua(443536);Ua(59704);break m}c=G[G[110917]>>2];n:{l=G[110922];g=b+l|0;if(g>>>0<=J[G[110918]>>2]){break n}c=Ja[e|0](c,g)|0;G[G[110917]>>2]=c;l=G[110922];G[G[110918]>>2]=b+l;if(c){break n}Ua(443536);Ua(59658);break m}bb(c+l|0,673152,b)}G[110922]=b+G[110922];b=0}c=b;i=i+q|0;b=757118-i|0;if((b|0)>0){continue}break}break k}bb(e+673152|0,i,b)}if((j|0)<(s|0)){F[(j<<1)+476544>>1]=d;E[j+607616|0]=p;j=j+1|0}g=m;if((f|0)<(h|0)){continue}break}}if(n){continue}break}break}if((c|0)<=0){return 0}Mn(c);G[110922]=G[110922]+c;return 0}Ua(443536);Ua(22202);return 1}Ua(443536);Ua(42389);return 1}function tk(a,b,c,d){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,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,F=0,I=0,J=0,K=0;w=9;f=Fa-1008|0;Fa=f;G[f+812>>2]=0;i=bb(f,119248,792);g=G[d>>2];if((g|0)<=0){Td(a,i+1004|0,i+1e3|0,d);if(G[i+1004>>2]>=9){while(1){E[i+816|0]=0;l=i+912|0;Sd(a,w,l,d);x=i+816|0;z=i+812|0;A=i+808|0;B=i+804|0;C=i+800|0;D=i+796|0;F=i+792|0;g=0;o=0;m=0;p=0;s=0;t=0;u=0;a:{if(G[d>>2]>0){break a}if(!(x?l:0)){G[d>>2]=115;break a}E[x|0]=0;if(!H[l|0]){break a}I=32;b:{c:{while(1){J=G[(m<<3)+i>>2];k=H[J|0];if((k|0)==42){v=1;q=0;break b}d:{e:{if(!(!p|(k|0)!=(g&255))){p=1;n=32;f=0;q=0;break e}p=1;f=0;n=32;e=0;y=0;j=0;q=0;g=0;v=0;h=k;if(!h){break d}f:{while(1){g=e;e=E[l+e|0];g:{h:{i:{j:{k:{r=h&255;switch(r-105|0){case 1:break j;case 0:break k;default:break i}}e=e-48|0;if(e>>>0>=10){break h}j=e;break g}e=e-48|0;if(e>>>0>=10){break h}q=e;break g}l:{m:{n:{switch(r-63|0){default:if((r|0)!=35){break m}case 45:case 46:case 47:if(e-48>>>0>9){break f}K=h-109|0;h=0;while(1){o:{f=(e<<24>>24)-48|0;if(f>>>0>9){f=g;break o}h=f+M(h,10)|0;f=8;g=g+1|0;e=H[l+g|0];if((g|0)!=8){continue}}break};g=f-1|0;if((K&255)>>>0>1){break l}if(h-1>>>0>998){break f}f=1;e=1;p:{if(G[c>>2]==(h|0)){break p}e=2;if(G[c+4>>2]==(h|0)){break p}e=3;if(G[c+8>>2]==(h|0)){break p}f=G[c+12>>2]==(h|0);e=f<<2}h=(r|0)==110;s=h?s:e;t=h?e:t;break h;case 0:break g;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:break m;case 34:break n}}if(e-65>>>0<26){n=e;break g}if((e|0)!=32){break h}n=e;break g}if((e&255)==(r|0)){break g}break f}o=(r|0)==108?h:o;break g}if(f){break g}break f}f=1;e=g+1|0;y=y+1|0;h=H[J+y|0];if(h){p=0;if((g|0)<7){continue}}break}p=0;if(!k){f=j;g=0;break e}q:{if((g|0)>6){v=1;break q}v=1;f=j;g=k;if(H[e+l|0]!=32){break d}}f=j;break c}f=j;g=k;break d}v=0}m=m+1|0;if((m|0)!=99){continue}break}m=99}u=f;I=n}if(A){G[A>>2]=u}if(B){G[B>>2]=q}if(C){G[C>>2]=t}if(D){G[D>>2]=s}if(F){G[F>>2]=o}if(z){G[z>>2]=m}g=0;if(!v){break a}k=G[((m<<3)+i|0)+4>>2];f=H[k|0];if(!f|(f|0)==45){break a}j=Za(x,l);e=H[k|0];if((e|0)==43){break a}u=u+48|0;q=q+48|0;l=(t>>>0)%10|48;m=(s>>>0)%10|48;p=(t|0)<=0;h=0;while(1){r:{s:{t:{u:{v:{f=e&255;switch(f-105|0){case 1:break t;case 0:break u;default:break v}}if(f){break s}if((g|0)<=7){cb(g+j|0,32,8-g|0)}break a}E[g+j|0]=u;break r}E[g+j|0]=q;break r}if(!(p|(f|0)!=110)){E[g+j|0]=l;break r}if(!((f|0)!=109|(s|0)<=0)){E[g+j|0]=m;break r}if(!((f|0)!=108|(o|0)<0)){e=1;w:{if((o|0)<=0){break w}while(1){e=M(e,10);if(((o|0)/(e|0)|0)>0){continue}break}if(e>>>0<10){break w}while(1){f=(e>>>0)/10|0;E[g+j|0]=(((o|0)/(f|0)|0)%10|0)+48;g=g+1|0;n=e>>>0>99;e=f;if(n){continue}break}}g=g-1|0;break r}n=g+j|0;if((f|0)==97){E[n|0]=I;break r}E[n|0]=e}g=g+1|0;h=h+1|0;e=H[k+h|0];continue}}if(H[i+816|0]){wb(b,i+816|0,d)}E[i+824|0]=0;E[i+920|0]=0;f=G[i+1004>>2]>(w|0);w=w+1|0;if(f){continue}break}}g=G[d>>2]}Fa=i+1008|0;return g}function Th(a,b){var 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,w=0,x=0,y=0,z=0,B=0,C=0,D=0,E=0,F=0,H=0,I=0,J=0,K=0,M=0,N=0,P=0,Q=0;J=1;f=rd(a);g=rd(b);k=Fa-48|0;Fa=k;m=G[g+3304>>2];w=L[(m?72:56)+g>>3];x=L[(m?80:64)+g>>3];o=L[(m?56:72)+g>>3];n=L[(m?64:80)+g>>3];d=G[f+3304>>2];y=L[f+(d?72:56)>>3];l=L[f+(d?80:64)>>3];q=L[f+(d?56:72)>>3];r=L[f+(d?64:80)>>3];s=L[(!m<<3)+g>>3];D=L[f+(!d<<3)>>3];t=L[(((m|0)!=0)<<3)+g>>3];E=L[f+(((d|0)!=0)<<3)>>3];z=L[g+24>>3];u=L[g+16>>3];B=L[f+24>>3];C=L[f+16>>3];K=L[g+40>>3];F=L[g+32>>3];M=L[f+40>>3];H=L[f+32>>3];i=L[g+48>>3];h=L[f+48>>3];c=L[f+136>>3];a:{if(O(c)<2147483648){d=~~c;break a}d=-2147483648}G[323532]=d;c=L[f+144>>3];b:{if(O(c)<2147483648){d=~~c;break b}d=-2147483648}G[323534]=d;c=L[g+136>>3];c:{if(O(c)<2147483648){d=~~c;break c}d=-2147483648}G[323533]=d;c=L[g+144>>3];d:{if(O(c)<2147483648){d=~~c;break d}d=-2147483648}G[323535]=d;G[f+6048>>2]=0;G[g+6048>>2]=0;e:{f:{if(!(t!=E|s!=D)){L[162598]=n;L[162597]=o;L[162596]=x;L[162595]=w;L[162589]=r;L[162588]=q;L[162587]=l;L[162586]=y;L[162590]=L[f+88>>3];L[162591]=L[f+96>>3];L[162592]=L[f+104>>3];L[162593]=L[f+112>>3];L[162599]=L[g+88>>3];L[162600]=L[g+96>>3];L[162601]=L[g+104>>3];L[162602]=L[g+112>>3];e=i*.0174532925199433;j=h*.0174532925199433;c=0;break f}Bd(g,E,D,k+24|0,k+16|0,k+12|0);h=L[k+16>>3];c=L[k+24>>3];g:{if(c!=u){h=h-z;j=c-u;I=Pd(K*h/F/j);break g}I=h!=z?1.5707963267948966:0;h=h-z;j=c-u}c=Db(o*j+n*h,w*j+x*h);e=ib(c);c=eb(c);p=n*c-e*x;L[162598]=p;i=o*c-e*w;L[162597]=i;h=c*x+n*e;L[162596]=h;c=c*w+o*e;L[162595]=c;e=1/(c*p-i*h);A(+e);d=v(1)|0;m=v(0)|0;d=d&2147483647;if((d|0)==2146435072&(m|0)!=0|d>>>0>2146435072){hb(72731,72,1,G[24367]);d=1;break e}L[162602]=c*e;L[162600]=e*-h;L[162599]=p*e;L[162601]=e*-i;Bd(f,t,s,k+40|0,k+32|0,k+12|0);h=L[k+32>>3];c=L[k+40>>3];h:{if(c!=C){e=h-B;j=c-C;h=Pd(M*e/H/j);break h}e=h-B;j=c-C;h=h!=B?1.5707963267948966:0}p=L[k+24>>3];c=Db(q*j+r*e,y*j+l*e)+3.141592653589793;i=ib(c);c=eb(c);o=r*c-i*l;L[162589]=o;n=q*c-i*y;L[162588]=n;e=c*l+r*i;L[162587]=e;c=c*y+q*i;L[162586]=c;i=1;l=1/(c*o-n*e);A(+l);d=v(1)|0;m=v(0)|0;d=d&2147483647;if((d|0)==2146435072&(m|0)!=0|d>>>0>2146435072){hb(72659,71,1,G[24367]);d=1;break e}q=h+3.141592653589793;m=H*j>0;r=I+3.141592653589793;d=F*(p-u)<0;L[162593]=c*l;L[162591]=l*-e;L[162590]=o*l;L[162592]=l*-n;s=s*.0174532925199433;l=eb(s);p=t*.0174532925199433;o=ib(p);n=D*.0174532925199433;t=eb(n);c=E*.0174532925199433;e=ib(c);p=eb(p);c=eb(c);c=ib(s)*ib(n)+(c*(t*(p*l))+e*(t*(o*l)));i:{if(c>1){break i}i=c;if(!(c<-1)){break i}i=-1}j=m?q:h;e=d?r:I;c=Sc(i)}L[161765]=K;L[161764]=F;L[161763]=M;L[161762]=H;L[161755]=z;L[161754]=u;L[161753]=B;L[161752]=C;N=1294088,P=ib(c),L[N>>3]=P;N=1294080,P=eb(c),L[N>>3]=P;N=1294072,P=ib(e),L[N>>3]=P;N=1294064,P=eb(e),L[N>>3]=P;N=1294056,P=ib(j),L[N>>3]=P;N=1294048,P=eb(j),L[N>>3]=P;d=Za(1294008,f+3544|0);Za(d+4|0,g+3544|0);G[d+6744>>2]=1;G[d+6664>>2]=0;G[d+6668>>2]=0;G[d+6672>>2]=1;G[d+6676>>2]=1;d=0}Fa=k+48|0;j:{if(d){break j}N=1300672,Q=hm(a,1294144),G[N>>2]=Q;N=1300676,Q=hm(b,1297408),G[N>>2]=Q;if(g){Wa(g)}J=0;if(!f){break j}Wa(f)}return J}function ve(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;j=Fa-128|0;Fa=j;k=G[b>>2];a:{if((k|0)>0){d=k;break a}d=Va(a);f=d>>>0<8?d:8;if(!f){d=k;break a}b:{c:{d:{if(k){while(1){e:{f:{h=a+e|0;i=E[h|0];d=i;d=d-97>>>0<26?d&95:d;g:{if((d-65&255)>>>0<26|(d-48&255)>>>0<10){break g}d=d&255;if((d|0)==95){break g}if((d|0)!=45){break f}}d=0;if(g){break b}break e}d=1;if((i|0)!=32){break d}}g=d;e=e+1|0;if((f|0)!=(e|0)){continue}break}d=k;break a}d=H[a|0];h:{i:{if((d-65&255)>>>0<26|(d-48&255)>>>0<10){break i}h=a;j:{switch(d-32|0){case 0:break h;case 13:break i;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break j}}if((d|0)!=95){break d}}e=1}d=0;if((f|0)==1){break a}g=e;c=H[a+1|0];k:{l:{m:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break m}h=a+1|0;e=1;n:{switch(c-32|0){case 0:break l;case 13:break m;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break n}}if((c|0)!=95){break d}}i=1;if(!g){break k}}if((f|0)==2){break a}c=H[a+2|0];o:{p:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break p}h=a+2|0;g=0;e=2;q:{switch(c-32|0){case 0:break o;case 13:break p;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break q}}if((c|0)!=95){break d}}g=1;if(!i){break k}}if((f|0)==3){break a}c=H[a+3|0];r:{s:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break s}h=a+3|0;i=0;e=3;t:{switch(c-32|0){case 0:break r;case 13:break s;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break t}}if((c|0)!=95){break d}}i=1;if(!g){break k}}if((f|0)==4){break a}c=H[a+4|0];u:{v:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break v}h=a+4|0;g=0;e=4;w:{switch(c-32|0){case 0:break u;case 13:break v;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break w}}if((c|0)!=95){break d}}g=1;if(!i){break k}}if((f|0)==5){break a}c=H[a+5|0];x:{y:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break y}h=a+5|0;i=0;e=5;z:{switch(c-32|0){case 0:break x;case 13:break y;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break z}}if((c|0)!=95){break d}}i=1;if(!g){break k}}if((f|0)==6){break a}c=H[a+6|0];A:{B:{if((c-65&255)>>>0<26|(c-48&255)>>>0<10){break B}h=a+6|0;g=0;e=6;C:{switch(c-32|0){case 0:break A;case 13:break B;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break C}}if((c|0)!=95){break d}}g=1;if(!i){break k}}if((f|0)==7){break a}f=H[a+7|0];D:{if((f-65&255)>>>0<26|(f-48&255)>>>0<10){break D}h=a+7|0;e=7;E:{switch(f-32|0){case 0:break a;case 13:break D;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:break d;default:break E}}if((f|0)!=95){break d}}if(g){break a}}G[j>>2]=a;e=j+32|0;Ya(e,81,8605,j);break c}if(k){break b}G[j+20>>2]=a;G[j+16>>2]=e+1;a=j+32|0;Ya(a,81,8559,j+16|0);tb(5,a);e=46083;F:{switch(H[h|0]){case 9:break F;case 0:break c;default:break b}}e=46047}tb(5,e)}d=207;G[b>>2]=207}Fa=j+128|0;return d}function tb(a,b){var c=0,d=0,e=0,f=0,g=0;a:{b:{c:{switch(a-1|0){case 4:if(H[b|0]){a=G[50359];while(1){d:{e:{f:{g:{if((a|0)!=25){if(H[199408]){break g}c=199408;break f}c=G[49824];G[49849]=c;E[c|0]=0;yd(199296,199300,96);G[49848]=c;a=24;break d}c=199489;if(!H[199489]){break f}c=199570;if(!H[199570]){break f}c=199651;if(!H[199651]){break f}c=199732;if(!H[199732]){break f}c=199813;if(!H[199813]){break f}c=199894;if(!H[199894]){break f}c=199975;if(!H[199975]){break f}c=200056;if(!H[200056]){break f}c=200137;if(!H[200137]){break f}c=200218;if(!H[200218]){break f}c=200299;if(!H[200299]){break f}c=200380;if(!H[200380]){break f}c=200461;if(!H[200461]){break f}c=200542;if(!H[200542]){break f}c=200623;if(!H[200623]){break f}c=200704;if(!H[200704]){break f}c=200785;if(!H[200785]){break f}c=200866;if(!H[200866]){break f}c=200947;if(!H[200947]){break f}c=201028;if(!H[201028]){break f}c=201109;if(!H[201109]){break f}c=201190;if(!H[201190]){break f}c=201271;if(!H[201271]){break f}if(H[201352]){break e}c=201352}G[(a<<2)+199296>>2]=c;break d}c=G[(a<<2)+199296>>2]}qb(c,b,80);a=a+1|0;c=b;b=Va(b);b=c+(b>>>0<80?b:80)|0;if(H[b|0]){continue}break}G[50359]=a}G[49850]=b;return;case 5:h:{i:{j:{k:{a=G[50359];if((a|0)!=25){if(H[199408]){break k}b=199408;break j}b=G[49824];G[49849]=b;E[b|0]=0;yd(199296,199300,96);G[49848]=b;a=24;break h}b=199489;if(!H[199489]){break j}b=199570;if(!H[199570]){break j}b=199651;if(!H[199651]){break j}b=199732;if(!H[199732]){break j}b=199813;if(!H[199813]){break j}b=199894;if(!H[199894]){break j}b=199975;if(!H[199975]){break j}b=200056;if(!H[200056]){break j}b=200137;if(!H[200137]){break j}b=200218;if(!H[200218]){break j}b=200299;if(!H[200299]){break j}b=200380;if(!H[200380]){break j}b=200461;if(!H[200461]){break j}b=200542;if(!H[200542]){break j}b=200623;if(!H[200623]){break j}b=200704;if(!H[200704]){break j}b=200785;if(!H[200785]){break j}b=200866;if(!H[200866]){break j}b=200947;if(!H[200947]){break j}b=201028;if(!H[201028]){break j}b=201109;if(!H[201109]){break j}b=201190;if(!H[201190]){break j}b=201271;if(!H[201271]){break j}if(H[201352]){break i}b=201352}G[(a<<2)+199296>>2]=b;break h}b=G[(a<<2)+199296>>2]}E[b|0]=27;E[b+1|0]=0;G[50359]=a+1;break b;case 3:c=G[50359];e=(c<<2)-4|0;f=(c>>31^-1)&c;a=0;while(1){if((a|0)!=(f|0)){d=G[49824];g=Za(b,d);E[d|0]=0;d=c-1|0;G[50359]=d;if((c|0)!=1){yd(199296,199300,e-(a<<2)|0)}a=a+1|0;c=d;if(H[g|0]==27){continue}break b}break};E[b|0]=0;return;case 2:a=G[50359];if((a|0)<=0){break b}a=a-1|0;G[50359]=a;E[G[(a<<2)+199296>>2]]=0;return;case 0:break a;case 1:break c;default:break b}}b=G[50359];if((b|0)<=0){break b}while(1){l:{a=b-1|0;c=G[(a<<2)+199296>>2];d=H[c|0];E[c|0]=0;if((d|0)==27){break l}c=b>>>0>1;b=a;if(c){continue}}break}G[50359]=a;return}return}a=G[50359];m:{if((a|0)<=0){break m}b=0;if(a-1>>>0>=3){e=a&-4;while(1){d=b<<2;E[G[d+199296>>2]]=0;E[G[(d|4)+199296>>2]]=0;E[G[(d|8)+199296>>2]]=0;E[G[(d|12)+199296>>2]]=0;b=b+4|0;c=c+4|0;if((e|0)!=(c|0)){continue}break}}c=a&3;if(!c){break m}a=0;while(1){E[G[(b<<2)+199296>>2]]=0;b=b+1|0;a=a+1|0;if((c|0)!=(a|0)){continue}break}}G[50359]=0}function _m(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=N(0),j=0,k=0,l=0,m=0,n=N(0),o=0,p=0;f=Fa-32|0;Fa=f;G[f+16>>2]=0;G[f+20>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[f>>2]=0;G[f+4>>2]=0;while(1){d=b;b=d+1|0;if(H[d|0]==32){continue}break}a:{b:{if(fb(d,5791,8)){if(fb(d,33720,8)){break b}}b=d+8|0;h=11;c:{d:{e:{f:{while(1){g:{G[f+28>>2]=b;e=H[b|0];if((e|0)!=32){switch(e-71|0){case 11:case 43:break g;case 1:case 33:break d;case 9:case 41:break e;case 0:case 32:break f;default:break c}}else{b=b+1|0;continue}}break}while(1){d=e&255;if(!d|(d|0)==32|(d|0)==59){break c}d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];b=d;continue}}while(1){h=21;d=e&255;if(!d|(d|0)==32|(d|0)==59){break c}d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];b=d;continue}}while(1){h=31;d=e&255;if(!d|(d|0)==32|(d|0)==59){break c}d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];b=d;continue}}d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];g=e-83&-33;b=d;while(1){d=e&255;if(!(!d|(d|0)==32|(d|0)==59)){d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];b=d;continue}break}l=!(g&255);h=41;m=1}h:{if((e&255)!=32){d=b;break h}while(1){d=b+1|0;G[f+28>>2]=d;e=H[b+1|0];b=d;if((e|0)==32){continue}break}}i:{if((e<<24>>24)-48>>>0>=10){break i}g=0;while(1){o=(g<<2)+f|0,p=_b(d),G[o>>2]=p;e=E[d|0];if(e-48>>>0<=9){while(1){b=d+1|0;G[f+28>>2]=b;e=E[d+1|0];d=b;if(e-48>>>0<10){continue}break}}if((e|0)==44){b=d+1|0;G[f+28>>2]=b;e=H[d+1|0];d=b}if((e&255)==32){while(1){b=d+1|0;G[f+28>>2]=b;e=H[d+1|0];d=b;if((e|0)==32){continue}break}}if((e<<24>>24)-48>>>0>9){break i}b=g>>>0>7;g=g+1|0;if(!b){continue}break}}j:{if((e&255)!=59){i=N(-99);g=1;break j}while(1){g=1;e=d+1|0;G[f+28>>2]=e;b=H[d+1|0];d=e;if((b|0)==32){continue}break}i=N(-99);while(1){k:{l:{m:{n:{o:{b=b&255;switch(b-81|0){case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 33:break b;case 0:case 32:break n;case 2:case 34:break o;default:break k}}while(1){b=e+1|0;G[f+28>>2]=b;d=H[e+1|0];e=b;if((d|0)==32){continue}break}j=vb(e,f+28|0);e=G[f+28>>2];while(1){b=H[e|0];d=b-32|0;if(!(!d|(d|0)==12)){break m}e=e+1|0;G[f+28>>2]=e;continue}}b=e+1|0;G[f+28>>2]=b;k=2;d=H[e+1|0];p:{if(!((d|0)==122|(d|0)==90)){k=g;if((d|0)!=48){break p}k=-1}b=e+2|0;G[f+28>>2]=b;d=H[e+2|0]}if((d&255)==32){while(1){d=b+1|0;G[f+28>>2]=d;g=H[b+1|0];b=d;if((g|0)==32){continue}break}}j=vb(b,f+28|0);e=G[f+28>>2];while(1){b=H[e|0];d=b-32|0;if(!(!d|(d|0)==12)){break l}e=e+1|0;G[f+28>>2]=e;continue}}n=N(j);continue}i=N(j);g=k;continue}break}if(b){break b}}q:{r:{switch(h+1|0){default:Ua(60223);G[c>>2]=413;break q;case 0:case 1:case 12:case 22:case 23:case 32:case 42:case 52:break r}}G[G[a+4>>2]+992>>2]=h}b=G[a+4>>2];G[b+996>>2]=G[f>>2];G[b+1e3>>2]=G[f+4>>2];G[b+1004>>2]=G[f+8>>2];G[b+1008>>2]=G[f+12>>2];G[b+1012>>2]=G[f+16>>2];G[b+1016>>2]=G[f+20>>2];if(m){K[G[a+4>>2]+1040>>2]=n;G[G[a+4>>2]+1044>>2]=l}if(i!=N(-99)){K[G[a+4>>2]+1020>>2]=i==N(0)?N(9999):i;s:{if(g-3>>>0<=4294967291){Ua(62026);G[c>>2]=413;break s}G[G[a+4>>2]+1024>>2]=g?g:1}}break a}G[c>>2]=125}Fa=f+32|0}function sk(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=N(0);d=Fa-176|0;Fa=d;e=G[c>>2];a:{if((e|0)>0){break a}e=H[201440];if(!e){e=H[G[29798]];E[201440]=e}G[48624]=0;G[b>>2]=0;b:{if(!(!jb(a,68)&(e&255)!=44)){if(Va(a)>>>0>=73){E[d+120|0]=H[10453];a=H[10449]|H[10450]<<8|(H[10451]<<16|H[10452]<<24);G[d+112>>2]=H[10445]|H[10446]<<8|(H[10447]<<16|H[10448]<<24);G[d+116>>2]=a;a=H[10441]|H[10442]<<8|(H[10443]<<16|H[10444]<<24);G[d+104>>2]=H[10437]|H[10438]<<8|(H[10439]<<16|H[10440]<<24);G[d+108>>2]=a;a=H[10433]|H[10434]<<8|(H[10435]<<16|H[10436]<<24);G[d+96>>2]=H[10429]|H[10430]<<8|(H[10431]<<16|H[10432]<<24);G[d+100>>2]=a;a=H[10425]|H[10426]<<8|(H[10427]<<16|H[10428]<<24);G[d+88>>2]=H[10421]|H[10422]<<8|(H[10423]<<16|H[10424]<<24);G[d+92>>2]=a;a=H[10417]|H[10418]<<8|(H[10419]<<16|H[10420]<<24);G[d+80>>2]=H[10413]|H[10414]<<8|(H[10415]<<16|H[10416]<<24);G[d+84>>2]=a;tb(5,d+80|0);e=408;G[c>>2]=408;break a}f=Za(d,a);g=jb(f,68);G[d+172>>2]=g;if(g){E[g|0]=69}c:{if((e&255)!=44){break c}e=jb(f,46);G[d+172>>2]=e;if(!e){break c}E[e|0]=44}h=vb(f,d+172|0);break b}h=vb(a,d+172|0)}i=N(h);K[b>>2]=i;if((H[G[d+172>>2]]|32)==32){e=(B(i),v(2))>>>16|0}else{e=H[67094]|H[67095]<<8|(H[67096]<<16|H[67097]<<24);f=H[67090]|H[67091]<<8|(H[67092]<<16|H[67093]<<24);E[d+117|0]=f;E[d+118|0]=f>>>8;E[d+119|0]=f>>>16;E[d+120|0]=f>>>24;E[d+121|0]=e;E[d+122|0]=e>>>8;E[d+123|0]=e>>>16;E[d+124|0]=e>>>24;e=H[67089]|H[67090]<<8|(H[67091]<<16|H[67092]<<24);G[d+112>>2]=H[67085]|H[67086]<<8|(H[67087]<<16|H[67088]<<24);G[d+116>>2]=e;e=H[67081]|H[67082]<<8|(H[67083]<<16|H[67084]<<24);G[d+104>>2]=H[67077]|H[67078]<<8|(H[67079]<<16|H[67080]<<24);G[d+108>>2]=e;e=H[67073]|H[67074]<<8|(H[67075]<<16|H[67076]<<24);G[d+96>>2]=H[67069]|H[67070]<<8|(H[67071]<<16|H[67072]<<24);G[d+100>>2]=e;e=H[67065]|H[67066]<<8|(H[67067]<<16|H[67068]<<24);G[d+88>>2]=H[67061]|H[67062]<<8|(H[67063]<<16|H[67064]<<24);G[d+92>>2]=e;e=H[67057]|H[67058]<<8|(H[67059]<<16|H[67060]<<24);G[d+80>>2]=H[67053]|H[67054]<<8|(H[67055]<<16|H[67056]<<24);G[d+84>>2]=e;tb(5,qb(d+80|0,a,30));G[c>>2]=408;e=I[b+2>>1]}if(!(G[48624]!=68&(e&32640)!=32640)){e=H[67094]|H[67095]<<8|(H[67096]<<16|H[67097]<<24);f=H[67090]|H[67091]<<8|(H[67092]<<16|H[67093]<<24);E[d+117|0]=f;E[d+118|0]=f>>>8;E[d+119|0]=f>>>16;E[d+120|0]=f>>>24;E[d+121|0]=e;E[d+122|0]=e>>>8;E[d+123|0]=e>>>16;E[d+124|0]=e>>>24;e=H[67089]|H[67090]<<8|(H[67091]<<16|H[67092]<<24);G[d+112>>2]=H[67085]|H[67086]<<8|(H[67087]<<16|H[67088]<<24);G[d+116>>2]=e;e=H[67081]|H[67082]<<8|(H[67083]<<16|H[67084]<<24);G[d+104>>2]=H[67077]|H[67078]<<8|(H[67079]<<16|H[67080]<<24);G[d+108>>2]=e;e=H[67073]|H[67074]<<8|(H[67075]<<16|H[67076]<<24);G[d+96>>2]=H[67069]|H[67070]<<8|(H[67071]<<16|H[67072]<<24);G[d+100>>2]=e;e=H[67065]|H[67066]<<8|(H[67067]<<16|H[67068]<<24);G[d+88>>2]=H[67061]|H[67062]<<8|(H[67063]<<16|H[67064]<<24);G[d+92>>2]=e;e=H[67057]|H[67058]<<8|(H[67059]<<16|H[67060]<<24);G[d+80>>2]=H[67053]|H[67054]<<8|(H[67055]<<16|H[67056]<<24);G[d+84>>2]=e;tb(5,qb(d+80|0,a,30));G[b>>2]=0;G[c>>2]=412;G[48624]=0}e=G[c>>2]}Fa=d+176|0;return e}function $b(a,b){var 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,w=0,y=0,B=0,C=0,D=0,E=0,F=0;p=Fa-16|0;Fa=p;A(+b);g=v(1)|0;j=v(0)|0;A(+a);d=v(1)|0;c=v(0)|0;s=g>>>20|0;t=s&2047;u=t-1086|0;k=d>>>20|0;a:{b:{if(u>>>0>4294967167&k-2047>>>0>=4294965250){break b}i=j;f=g<<1|i>>>31;i=i<<1;q=f-!i|0;if((q|0)==-2097153&(i-1|0)==-1|q>>>0>4292870143){e=1;if(!(f|i)|!c&(d|0)==1072693248){break a}i=!i&(f|0)==-2097152|f>>>0<4292870144;f=c;c=d<<1|c>>>31;d=f<<1;if(!(i&(!d&(c|0)==-2097152|c>>>0<4292870144))){e=a+b;break a}if(!d&(c|0)==2145386496){break a}e=((g|0)>0|(g|0)>=0)^c>>>0>2145386495?0:b*b;break a}f=d<<1|c>>>31;i=c<<1;q=i-1|0;f=f-!i|0;if((f|0)==-2097153&(q|0)==-1|f>>>0>4292870143){e=a*a;if((d|0)<0){e=(kq(j,g)|0)==1?-e:e}if((g|0)>0|(g|0)>=0){break a}L[p+8>>3]=1/e;e=L[p+8>>3];break a}if((d|0)<0){f=kq(j,g);if(!f){a=a-a;e=a/a;break a}k=k&2047;r=((f|0)==1)<<18;d=d&2147483647}if(u>>>0<=4294967167){e=1;if(!c&(d|0)==1072693248){break a}if(t>>>0<=957){e=((d|0)==1072693248&(c|0)!=0|d>>>0>1072693248?b:-b)+1;break a}if((!c&(d|0)==1072693248|d>>>0<1072693248)!=(s>>>0<2048|0)){c=Fa-16|0;L[c+8>>3]=3105036184601418e216;e=L[c+8>>3]*3105036184601418e216;break a}c=Fa-16|0;L[c+8>>3]=12882297539194267e-247;e=L[c+8>>3]*12882297539194267e-247;break a}if(k){break b}A(+(a*4503599627370496));d=v(1)|0;c=v(0)|0;d=(d&2147483647)-54525952|0}x(0,j&-134217728);x(1,g|0);w=+z();f=d;g=d-1072076117|0;d=0;f=f-((g&-1048576)+(d>>>0>c>>>0)|0)|0;j=c-d|0;d=f;x(0,0);x(1,(j- -2147483648>>>0<2147483648?d+1|0:d)|0);e=+z();f=(g>>>13&127)<<5;h=L[f+97544>>3];a=e*h+-1;o=L[12186];l=a*o;y=a*l;B=+(g>>20);C=B*L[12184]+L[f+97560>>3];x(0,j|0);x(1,d|0);m=h*(+z()-e);a=a+m;n=C+a;e=y+n;o=o*a;h=a*o;n=y+(n-e)+(m*(l+o)+(B*L[12185]+L[f+97568>>3]+(a+(C-n))))+a*h*(h*(h*(a*L[12192]+L[12191])+(a*L[12190]+L[12189]))+(a*L[12188]+L[12187]));h=e+n;A(+h);c=v(1)|0;x(0,v(0)&-134217728);x(1,c|0);l=+z();a=w*l;A(+a);c=v(1)|0;v(0)|0;c:{k=c>>>20&2047;if(k-969>>>0<63){break c}if(k>>>0<=968){a=a+1;e=r?-a:a;break a}d=k>>>0<1033;k=0;if(d){break c}if((c|0)<0){c=Fa-16|0;L[c+8>>3]=r?-12882297539194267e-247:12882297539194267e-247;e=L[c+8>>3]*12882297539194267e-247;break a}c=Fa-16|0;L[c+8>>3]=r?-3105036184601418e216:3105036184601418e216;e=L[c+8>>3]*3105036184601418e216;break a}m=(b-w)*l+(n+(e-h)+(h-l))*b;b=L[12706];e=a*L[12705]+b;b=e-b;a=m+(b*L[12708]+(b*L[12707]+a));b=a*a;m=b*b*(a*L[12712]+L[12711]);b=b*(a*L[12710]+L[12709]);A(+e);v(1)|0;j=v(0)|0;c=j<<4&2032;a=m+(b+(L[c+101752>>3]+a));c=c+101760|0;d=G[c>>2];g=G[c+4>>2];c=j+r|0;c=c<<13;f=0;d=f+d|0;c=c+g|0;c=d>>>0>>0?c+1|0:c;g=d;if(!k){d=Fa-16|0;Fa=d;d:{if(!(j&-2147483648)){x(0,g|0);x(1,c-1058013184|0);b=+z();a=(b*a+b)*5486124068793689e288;break d}c=c+1071644672|0;f=c;x(0,g|0);x(1,c|0);b=+z();h=b*a;a=h+b;if(O(a)<1){c=d;G[c+8>>2]=0;G[c+12>>2]=1048576;L[c+8>>3]=L[c+8>>3]*22250738585072014e-324;x(0,0);x(1,f&-2147483648);e=a<0?-1:1;l=a+e;a=l+(h+(b-a)+(a+(e-l)))-e;a=(D=+z(),E=a,F=a==0,F?D:E)}a=a*22250738585072014e-324}e=a;Fa=d+16|0;break a}x(0,g|0);x(1,c|0);b=+z();e=b*a+b}Fa=p+16|0;return e}function Ot(a,b){a=a|0;b=b|0;var 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;a:{while(1){b:{c:{if(J[a+116>>2]<=261){Ri(a);c=G[a+116>>2];if(!(c>>>0>=262|b)){return 0}if(!c){break a}if(c>>>0<3){break c}}e=G[a+108>>2];c=G[a+84>>2]&(H[(e+G[a+56>>2]|0)+2|0]^G[a+72>>2]<>2]);G[a+72>>2]=c;c=G[a+68>>2]+(c<<1)|0;d=I[c>>1];F[G[a+64>>2]+((e&G[a+52>>2])<<1)>>1]=d;F[c>>1]=e;if(!d|G[a+44>>2]-262>>>0>>0){break c}d=ip(a,d);G[a+96>>2]=d;break b}d=G[a+96>>2]}d:{if(d>>>0>=3){c=G[a+5792>>2];e=G[a+108>>2]-G[a+112>>2]|0;F[G[a+5796>>2]+(c<<1)>>1]=e;G[a+5792>>2]=c+1;i=c+G[a+5784>>2]|0;c=d-3|0;E[i|0]=c;c=((H[(c&255)+116208|0]<<2)+a|0)+1176|0;F[c>>1]=I[c>>1]+1;c=e-1&65535;c=((H[(c>>>0<256?c:(c>>>7|0)+256|0)+115696|0]<<2)+a|0)+2440|0;F[c>>1]=I[c>>1]+1;d=G[a+96>>2];c=G[a+116>>2]-d|0;G[a+116>>2]=c;j=G[a+5788>>2]-1|0;k=G[a+5792>>2];if(!(c>>>0<3|d>>>0>J[a+128>>2])){g=d-1|0;G[a+96>>2]=g;h=G[a+72>>2];d=G[a+108>>2];l=G[a+52>>2];m=G[a+64>>2];n=G[a+68>>2];o=G[a+84>>2];i=G[a+56>>2];f=G[a+88>>2];while(1){c=d;d=c+1|0;G[a+108>>2]=d;h=(H[(c+i|0)+3|0]^h<>2]=h;e=(h<<1)+n|0;F[((d&l)<<1)+m>>1]=I[e>>1];F[e>>1]=d;g=g-1|0;G[a+96>>2]=g;if(g){continue}break}d=c+2|0;G[a+108>>2]=d;if((j|0)!=(k|0)){continue}break d}G[a+96>>2]=0;d=d+G[a+108>>2]|0;G[a+108>>2]=d;e=G[a+56>>2]+d|0;c=H[e|0];G[a+72>>2]=c;G[a+72>>2]=G[a+84>>2]&(H[e+1|0]^c<>2]);if((j|0)!=(k|0)){continue}break d}d=H[G[a+56>>2]+G[a+108>>2]|0];c=G[a+5792>>2];F[G[a+5796>>2]+(c<<1)>>1]=0;G[a+5792>>2]=c+1;E[c+G[a+5784>>2]|0]=d;c=(d<<2)+a|0;F[c+148>>1]=I[c+148>>1]+1;G[a+116>>2]=G[a+116>>2]-1;d=G[a+108>>2]+1|0;G[a+108>>2]=d;if(G[a+5792>>2]!=(G[a+5788>>2]-1|0)){continue}}e=G[a+92>>2];if((e|0)>=0){c=e+G[a+56>>2]|0}else{c=0}ge(a,c,d-e|0,0);G[a+92>>2]=G[a+108>>2];f=G[a>>2];e=G[f+28>>2];cd(e);d=G[e+20>>2];c=G[f+16>>2];d=c>>>0>d>>>0?d:c;e:{if(!d){break e}bb(G[f+12>>2],G[e+16>>2],d);G[f+12>>2]=d+G[f+12>>2];G[e+16>>2]=d+G[e+16>>2];G[f+20>>2]=d+G[f+20>>2];G[f+16>>2]=G[f+16>>2]-d;c=G[e+20>>2];G[e+20>>2]=c-d;if((c|0)!=(d|0)){break e}G[e+16>>2]=G[e+8>>2]}if(G[G[a>>2]+16>>2]){continue}break}return 0}d=G[a+108>>2];G[a+5812>>2]=d>>>0<2?d:2;if((b|0)==4){c=G[a+92>>2];if((c|0)>=0){b=c+G[a+56>>2]|0}else{b=0}ge(a,b,d-c|0,1);G[a+92>>2]=G[a+108>>2];e=G[a>>2];d=G[e+28>>2];cd(d);c=G[d+20>>2];b=G[e+16>>2];c=b>>>0>c>>>0?c:b;f:{if(!c){break f}bb(G[e+12>>2],G[d+16>>2],c);G[e+12>>2]=c+G[e+12>>2];G[d+16>>2]=c+G[d+16>>2];G[e+20>>2]=c+G[e+20>>2];G[e+16>>2]=G[e+16>>2]-c;b=G[d+20>>2];G[d+20>>2]=b-c;if((b|0)!=(c|0)){break f}G[d+16>>2]=G[d+8>>2]}return(G[G[a>>2]+16>>2]?3:2)|0}g:{if(!G[a+5792>>2]){break g}c=G[a+92>>2];if((c|0)>=0){b=c+G[a+56>>2]|0}else{b=0}ge(a,b,d-c|0,0);G[a+92>>2]=G[a+108>>2];e=G[a>>2];d=G[e+28>>2];cd(d);c=G[d+20>>2];b=G[e+16>>2];c=b>>>0>c>>>0?c:b;h:{if(!c){break h}bb(G[e+12>>2],G[d+16>>2],c);G[e+12>>2]=c+G[e+12>>2];G[d+16>>2]=c+G[d+16>>2];G[e+20>>2]=c+G[e+20>>2];G[e+16>>2]=G[e+16>>2]-c;b=G[d+20>>2];G[d+20>>2]=b-c;if((b|0)!=(c|0)){break h}G[d+16>>2]=G[d+8>>2]}if(G[G[a>>2]+16>>2]){break g}return 0}return 1}function Wa(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}d=a-8|0;b=G[a-4>>2];a=b&-8;f=d+a|0;b:{if(b&1){break b}if(!(b&3)){break a}b=G[d>>2];d=d-b|0;if(d>>>0>>0<=255){e=G[d+8>>2];b=b>>>3|0;c=G[d+12>>2];if((c|0)==(e|0)){i=194500,j=G[48625]&Eu(-2,b),G[i>>2]=j;break b}G[e+12>>2]=c;G[c+8>>2]=e;break b}h=G[d+24>>2];b=G[d+12>>2];c:{if((d|0)!=(b|0)){c=G[d+8>>2];G[c+12>>2]=b;G[b+8>>2]=c;break c}d:{e=d+20|0;c=G[e>>2];if(c){break d}e=d+16|0;c=G[e>>2];if(c){break d}b=0;break c}while(1){g=e;b=c;e=b+20|0;c=G[e>>2];if(c){continue}e=b+16|0;c=G[b+16>>2];if(c){continue}break}G[g>>2]=0}if(!h){break b}e=G[d+28>>2];c=(e<<2)+194804|0;e:{if(G[c>>2]==(d|0)){G[c>>2]=b;if(b){break e}i=194504,j=G[48626]&Eu(-2,e),G[i>>2]=j;break b}G[h+(G[h+16>>2]==(d|0)?16:20)>>2]=b;if(!b){break b}}G[b+24>>2]=h;c=G[d+16>>2];if(c){G[b+16>>2]=c;G[c+24>>2]=b}c=G[d+20>>2];if(!c){break b}G[b+20>>2]=c;G[c+24>>2]=b;break b}b=G[f+4>>2];if((b&3)!=3){break b}G[48627]=a;G[f+4>>2]=b&-2;G[d+4>>2]=a|1;G[a+d>>2]=a;return}if(d>>>0>=f>>>0){break a}b=G[f+4>>2];if(!(b&1)){break a}f:{if(!(b&2)){if(G[48631]==(f|0)){G[48631]=d;a=G[48628]+a|0;G[48628]=a;G[d+4>>2]=a|1;if(G[48630]!=(d|0)){break a}G[48627]=0;G[48630]=0;return}if(G[48630]==(f|0)){G[48630]=d;a=G[48627]+a|0;G[48627]=a;G[d+4>>2]=a|1;G[a+d>>2]=a;return}a=(b&-8)+a|0;g:{if(b>>>0<=255){e=G[f+8>>2];b=b>>>3|0;c=G[f+12>>2];if((c|0)==(e|0)){i=194500,j=G[48625]&Eu(-2,b),G[i>>2]=j;break g}G[e+12>>2]=c;G[c+8>>2]=e;break g}h=G[f+24>>2];b=G[f+12>>2];h:{if((f|0)!=(b|0)){c=G[f+8>>2];G[c+12>>2]=b;G[b+8>>2]=c;break h}i:{e=f+20|0;c=G[e>>2];if(c){break i}e=f+16|0;c=G[e>>2];if(c){break i}b=0;break h}while(1){g=e;b=c;e=b+20|0;c=G[e>>2];if(c){continue}e=b+16|0;c=G[b+16>>2];if(c){continue}break}G[g>>2]=0}if(!h){break g}e=G[f+28>>2];c=(e<<2)+194804|0;j:{if(G[c>>2]==(f|0)){G[c>>2]=b;if(b){break j}i=194504,j=G[48626]&Eu(-2,e),G[i>>2]=j;break g}G[h+(G[h+16>>2]==(f|0)?16:20)>>2]=b;if(!b){break g}}G[b+24>>2]=h;c=G[f+16>>2];if(c){G[b+16>>2]=c;G[c+24>>2]=b}c=G[f+20>>2];if(!c){break g}G[b+20>>2]=c;G[c+24>>2]=b}G[d+4>>2]=a|1;G[a+d>>2]=a;if(G[48630]!=(d|0)){break f}G[48627]=a;return}G[f+4>>2]=b&-2;G[d+4>>2]=a|1;G[a+d>>2]=a}if(a>>>0<=255){b=(a&-8)+194540|0;c=G[48625];a=1<<(a>>>3);k:{if(!(c&a)){G[48625]=a|c;a=b;break k}a=G[b+8>>2]}G[b+8>>2]=d;G[a+12>>2]=d;G[d+12>>2]=b;G[d+8>>2]=a;return}e=31;if(a>>>0<=16777215){b=a>>>8|0;g=b+1048320>>>16&8;b=b<>>16&4;b=b<>>16&2;b=(b<>>15|0)-(c|(e|g))|0;e=(b<<1|a>>>b+21&1)+28|0}G[d+28>>2]=e;G[d+16>>2]=0;G[d+20>>2]=0;g=(e<<2)+194804|0;l:{m:{c=G[48626];b=1<>2]=d;G[d+24>>2]=g;break n}e=a<<((e|0)==31?0:25-(e>>>1|0)|0);b=G[g>>2];while(1){c=b;if((G[b+4>>2]&-8)==(a|0)){break m}b=e>>>29|0;e=e<<1;g=c+(b&4)|0;b=G[g+16>>2];if(b){continue}break}G[g+16>>2]=d;G[d+24>>2]=c}G[d+12>>2]=d;G[d+8>>2]=d;break l}a=G[c+8>>2];G[a+12>>2]=d;G[c+8>>2]=d;G[d+24>>2]=0;G[d+12>>2]=c;G[d+8>>2]=a}a=G[48633]-1|0;G[48633]=a?a:-1}}function is(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;s=Fa-16|0;Fa=s;G[s+12>>2]=j;a:{m=G[a+8>>2];q=G[a>>2]+M(c,3)|0;r=q-2|0;o=M(r,168);e=m+o|0;j=G[e+32>>2];if(j){break a}l=lb(1e3,8);G[e+32>>2]=l;j=0;G[e+28>>2]=0;k=1e3;while(1){if((j|0)>=(k|0)){k=k+1e3|0;e=ub(l,k<<3);m=G[a+8>>2];G[(o+m|0)+32>>2]=e}e=G[s+12>>2]+7&-8;G[s+12>>2]=e+8;p=m+o|0;l=G[p+32>>2];j=G[p+28>>2];h=L[e>>3];L[l+(j<<3)>>3]=h;b:{if(!(O(h+-9007199254740992)<=1e-15)){break b}e=j-1|0;if(!(O(L[(e<<3)+l>>3]+-9007199254740992)<=1e-15)){break b}G[p+28>>2]=e;p=M(r,168);e=p+G[a+8>>2]|0;j=ub(G[e+32>>2],G[e+28>>2]<<3);m=G[a+8>>2];G[(p+m|0)+32>>2]=j;break a}j=j+1|0;G[p+28>>2]=j;continue}}t=G[(m+o|0)+28>>2];l=t-1|0;c:{if((l|0)==2){d:{if(L[j>>3]==0&L[j+8>>3]==0){break d}h=L[(M(c,168)+m|0)+8>>3];if(d){if(g>3]=h)|!(L[(M(c,168)+m|0)+16>>3]>=g)){break d}l=0;e=G[(M(c,168)+m|0)+24>>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}j=G[e+(c<<2)>>2];e:{if(!j){break e}while(1){if(!(+G[j+4>>2]<=f)){break e}l=l+1|0;j=G[j>>2];if(j){continue}break}}if((l&1)!=(d|0)){break c}if(!b){n=1;break c}if(!d){n=1;break c}G[a+12>>2]=b;n=1;break c}n=!d;break c}e=(t<<3)+j|0;e=L[e-24>>3]==0&L[e-16>>3]==0;if(d){if(e){break c}e=M(r,168)+m|0;i=L[e+8>>3];if(i>g){break c}h=L[e+16>>3];if(!(g>=i)|h>2];if(O(g)<2147483648){p=~~g}else{p=-2147483648}k=G[o+(p<<2)>>2];f:{if(!k){break f}while(1){if(!(+G[k+4>>2]<=f)){break f}e=e+1|0;k=G[k>>2];if(k){continue}break}}if((e&1)!=(d|0)){break c}g:{h:{if(L[j>>3]==0&L[j+8>>3]==0){break h}o=q-1|0;e=M(o,168)+m|0;i=L[e+8>>3];if(i>g){break h}h=L[e+16>>3];if(!(g>=i)|h>2]+(p<<2)>>2];i:{if(!k){break i}while(1){if(!(+G[k+4>>2]<=f)){break i}e=e+1|0;k=G[k>>2];if(k){continue}break}}if((e&1)==(d|0)){break c}if((t|0)>3){break g}break c}if((t|0)<4){break c}}l=((l|0)>4?l:4)-3>>>1|0;e=0;k=2;while(1){o=e;j:{e=k<<3;if(L[e+j>>3]==0&L[(e|8)+j>>3]==0){break j}q=M(c+o|0,168)+m|0;i=L[q+8>>3];if(i>g){break j}h=L[q+16>>3];if(!(g>=i)|h>2]+(p<<2)>>2];k:{if(!n){break k}while(1){if(!(+G[n+4>>2]<=f)){break k}e=e+1|0;n=G[n>>2];if(n){continue}break}}if((e&1)!=(d|0)){break j}n=1;b=b+o|0;if(!b){break c}G[a+12>>2]=b;break c}e=o+1|0;k=k+2|0;n=0;if((l|0)!=(o|0)){continue}break}break c}n=1;if(e){break c}a=M(r,168)+m|0;i=L[a+8>>3];if(i>g){break c}h=L[a+16>>3];if(!(g>=i)|(!(h>=g)|g>h)){break c}b=G[(M(r,168)+m|0)+24>>2];if(O(g)<2147483648){a=~~g}else{a=-2147483648}l=G[b+(a<<2)>>2];if(!l){break c}k=0;while(1){if(+G[l+4>>2]<=f){k=k+1|0;l=G[l>>2];if(l){continue}}break}if(!(k&1)){break c}n=0;if(L[j>>3]==0&L[j+8>>3]==0){break c}c=q-1|0;b=M(c,168)+m|0;i=L[b+8>>3];if(i>g){break c}h=L[b+16>>3];if(!(g>=i)|(!(h>=g)|g>h)){break c}j=G[G[(M(c,168)+m|0)+24>>2]+(a<<2)>>2];if(!j){break c}while(1){if(+G[j+4>>2]<=f){n=n+1|0;j=G[j>>2];if(j){continue}}break}n=n&1}Fa=s+16|0;return n|0}function hk(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;i=Fa-10448|0;Fa=i;G[i+9380>>2]=0;G[i+9368>>2]=0;G[i+9364>>2]=0;E[i+15|0]=0;k=G[h>>2];a:{if(k){break a}G[g>>2]=0;G[i+8>>2]=i+7296;G[i+4>>2]=i+8336;b:{if(!f){E[i+6256|0]=0;break b}if(!H[f|0]){E[i+6256|0]=0;break b}if(!ad(f)){bf(f,1025,i+6256|0,h);if(H[i+6256|0]==47){break b}k=i+16|0;cf(k,h);if((Va(k)+Va(i+6256|0)|0)-1024>>>0<=4294966270){Ua(59913);k=125;G[h>>2]=125;break a}k=i+16|0;j=Va(k)+k|0;E[j|0]=47;E[j+1|0]=0;j=k;k=i+6256|0;_d(Gb(j,k),k,h);break b}Za(i+6256|0,f)}q=h,r=jk(a,i+9404|0,i+9400|0,i+9396|0,i+9392|0,i+9388|0,i+9384|0,i+9376|0,h),G[q>>2]=r;q=h,r=ik(a,i+9368|0,h),G[q>>2]=r;c:{if(G[i+9368>>2]>0){p=G[i+9376>>2]-2|0;l=1;j=0;while(1){if(G[g>>2]|G[h>>2]){break c}n=l;k=j;j=G[i+9404>>2];d:{if(j){Df(a,j,n,k,i+15|0,i+4|0,i+9372|0,h);if(Ib(G[i+4>>2],b)){break d}}j=G[i+9400>>2];if(j){Df(a,j,n,k,i+15|0,i+4|0,i+9372|0,h);if(Ib(G[i+4>>2],c)){break d}}j=G[i+9396>>2];if(j){Zk(a,j,n,k,i+9364|0,i+9372|0,h);if(G[i+9364>>2]!=(d|0)){break d}}j=G[i+9392>>2];e:{if(!j){break e}f:{switch(p|0){case 0:case 10:break f;default:break e}}Up(a,j,n,k,i+9380|0,i+9372|0,h);if(G[i+9380>>2]!=(e|0)){break d}}g:{h:{i:{if(!f){Ua(59767);break i}j:{k:{j=G[i+9388>>2];l:{if(!j){E[i+5216|0]=0;break l}Df(a,j,n,k,i+15|0,i+4|0,i+9372|0,h);j=Za(i+5216|0,G[i+4>>2]);E[i+4176|0]=0;l=H[j|0];if(l){break k}}j=yf(a,i+5216|0,i+4176|0,0,0,0,h);G[h>>2]=j;l=H[i+5216|0];m:{if(!l){break m}if(ad(i+5216|0)|(l|0)==47){break m}n:{if(j){break n}if(!ui(i+9408|0,1025)){E[i+16|0]=0;Ua(61910);G[h>>2]=125;break n}bf(i+9408|0,1025,i+16|0,h)}if((Va(i+16|0)+Va(i+5216|0)|0)-1024>>>0<=4294966270){break g}j=i+16|0;l=Va(j)+j|0;E[l|0]=47;E[l+1|0]=0;o=j;j=i+5216|0;_d(Gb(o,j),j,h)}j=H[i+4176|0];if(!j){break j}if(ad(i+4176|0)|(j|0)==47){break j}j=i+16|0;cf(j,h);if((Va(j)+Va(i+4176|0)|0)-1024>>>0<=4294966270){break g}j=i+16|0;l=Va(j)+j|0;E[l|0]=47;E[l+1|0]=0;o=j;j=i+4176|0;_d(Gb(o,j),j,h);break j}if(ad(j)|(l|0)==47){break j}l=Za(i+4176|0,j);q=h,r=yf(a,i+2096|0,i+1056|0,0,0,0,h),G[q>>2]=r;m=H[i+2096|0];o:{if(m){if(!(ad(i+2096|0)|(m|0)==47)){m=i+16|0;cf(m,h);if((Va(m)+Va(i+2096|0)|0)-1024>>>0<=4294966270){break h}m=i+16|0;o=Va(m)+m|0;E[o|0]=47;E[o+1|0]=0;o=m;m=i+2096|0;_d(Gb(o,m),m,h)}Dg(i+2096|0,j,i+3136|0,h);m=G[h>>2];if((m|0)!=125){if(m){break o}Za(j,i+3136|0);break o}G[h>>2]=0}E[j|0]=0}j=H[i+1056|0];if(j){if(!(ad(i+1056|0)|(j|0)==47)){j=i+16|0;cf(j,h);if((Va(j)+Va(i+1056|0)|0)-1024>>>0<=4294966270){break h}j=i+16|0;m=Va(j)+j|0;E[m|0]=47;E[m+1|0]=0;o=j;j=i+1056|0;_d(Gb(o,j),j,h)}Dg(i+1056|0,l,i+3136|0,h);j=G[h>>2];if((j|0)!=125){if(j){break j}Za(l,i+3136|0);break j}G[h>>2]=0}E[l|0]=0}if(!Xa(i+5216|0,i+6256|0)){break i}if(Xa(i+4176|0,i+6256|0)){break d}}G[g>>2]=n;break d}Ua(59868);G[h>>2]=125;break d}Ua(59822);G[h>>2]=125}j=k;l=n+1|0;j=l?j:j+1|0;o=n;n=G[i+9368>>2];o=o>>>0>>0;n=n>>31;if(o&(n|0)>=(k|0)|(k|0)<(n|0)){continue}break}}if(G[g>>2]|G[h>>2]){break c}G[h>>2]=342;Ua(59951)}k=G[h>>2]}Fa=i+10448|0;return k}function xo(a,b,c,d,e,f){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;h=f&31;if((f&63)>>>0>=32){k=1<>>32-h}l=f;if((b|0)>=2){r=b-1|0;p=c&-2;s=c-1|0;t=(c-2>>>1|0)+1|0;u=(c|0)<2;while(1){f=M(e,o);h=m;n=0;if(u){h=0}else{while(1){g=f;a:{b:{c:{d:{switch(H[a+h|0]-1|0){case 0:g=(e+f|0)+1|0;break b;case 1:g=e+f|0;break b;case 2:g=e+f|0;i=(g<<3)+d|0;j=G[i+8>>2];q=i+8|0;i=k|G[i+12>>2];G[q>>2]=j|l;G[q+4>>2]=i;break b;case 3:g=f|1;break b;case 4:g=(e+f<<3)+d|0;i=G[g+8>>2];j=g+8|0;g=k|G[g+12>>2];G[j>>2]=i|l;G[j+4>>2]=g;g=f|1;break b;case 5:g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;g=f|1;break b;case 6:g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;i=k|G[g+12>>2];G[g+8>>2]=l|G[g+8>>2];G[g+12>>2]=i;g=f|1;break b;case 8:g=(e+f<<3)+d|0;i=G[g+8>>2];j=g+8|0;g=k|G[g+12>>2];G[j>>2]=i|l;G[j+4>>2]=g;break c;case 9:g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;break c;case 10:g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;i=k|G[g+12>>2];G[g+8>>2]=l|G[g+8>>2];G[g+12>>2]=i;break c;case 11:g=(f<<3|8)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;break c;case 12:g=(e+f<<3)+d|0;i=G[g+8>>2];j=g+8|0;g=k|G[g+12>>2];G[j>>2]=i|l;G[j+4>>2]=g;g=(f<<3|8)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;break c;case 13:g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;g=(f<<3|8)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;break c;case 7:break b;case 14:break d;default:break a}}g=(e+f<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j;i=k|G[g+12>>2];G[g+8>>2]=l|G[g+8>>2];G[g+12>>2]=i;g=(f<<3|8)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j}g=f}g=(g<<3)+d|0;i=G[g>>2];j=k|G[g+4>>2];G[g>>2]=i|l;G[g+4>>2]=j}h=h+1|0;f=f+2|0;n=n+2|0;if((s|0)>(n|0)){continue}break}m=m+t|0;h=p}if((h|0)<(c|0)){e:{f:{g:{switch(H[a+m|0]-2|0){case 0:case 1:case 4:case 5:f=e+f|0;break f;case 8:h=(e+f<<3)+d|0;g=G[h>>2];n=k|G[h+4>>2];G[h>>2]=g|l;G[h+4>>2]=n;break f;case 9:h=(e+f<<3)+d|0;g=G[h>>2];n=k|G[h+4>>2];G[h>>2]=g|l;G[h+4>>2]=n;break f;case 12:h=(e+f<<3)+d|0;g=G[h>>2];n=k|G[h+4>>2];G[h>>2]=g|l;G[h+4>>2]=n;break f;case 6:case 7:case 10:case 11:break f;case 13:break g;default:break e}}h=(e+f<<3)+d|0;g=G[h>>2];n=k|G[h+4>>2];G[h>>2]=g|l;G[h+4>>2]=n}f=(f<<3)+d|0;h=G[f>>2];g=k|G[f+4>>2];G[f>>2]=h|l;G[f+4>>2]=g}m=m+1|0}o=o+2|0;if((r|0)>(o|0)){continue}break}}h:{if((b|0)<=(o|0)){break h}f=M(e,o);if((c|0)>=2){e=c-1|0;p=(c-2>>>1|0)+m|0;g=0;while(1){h=f;i:{j:{k:{switch(H[a+m|0]-4|0){case 0:case 1:case 2:case 3:h=f|1;break j;case 4:case 5:case 6:case 7:break j;case 8:case 9:case 10:case 11:break k;default:break i}}b=(f<<3|8)+d|0;h=G[b>>2];o=k|G[b+4>>2];G[b>>2]=h|l;G[b+4>>2]=o;h=f}b=(h<<3)+d|0;h=G[b>>2];o=k|G[b+4>>2];G[b>>2]=h|l;G[b+4>>2]=o}m=m+1|0;f=f+2|0;g=g+2|0;if((e|0)>(g|0)){continue}break}m=p+1|0;b=c&-2}else{b=0}if((b|0)>=(c|0)|(H[a+m|0]&248)!=8){break h}a=(f<<3)+d|0;b=G[a>>2];c=k|G[a+4>>2];G[a>>2]=b|l;G[a+4>>2]=c}}function Zc(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=Fa-112|0;Fa=j;k=i&2147483647;l=e&2147483647;m=l;a:{b:{p=!(b|c);if(!(d|l?l-2147418112>>>0<2147549184:p)){n=k-2147418112|0;if(!h&(n|0)==-2147418112?f|g:(n|0)==-2147418112&(h|0)!=0|n>>>0>2147549184){break b}}if(!(!d&(m|0)==2147418112?p:m>>>0<2147418112)){h=d;i=e|32768;f=b;g=c;break a}if(!(!h&(k|0)==2147418112?!(f|g):k>>>0<2147418112)){i=i|32768;break a}if(!(b|d|(m^2147418112|c))){m=d;d=!(b^f|d^h|(c^g|e^i^-2147483648));h=d?0:m;i=d?2147450880:e;f=d?0:b;g=d?0:c;break a}if(!(f|h|(k^2147418112|g))){break a}if(!(b|d|(c|m))){if(f|h|(g|k)){break a}f=b&f;g=c&g;h=d&h;i=e&i;break a}if(f|h|(g|k)){break b}f=b;g=c;h=d;i=e;break a}l=(k|0)==(m|0);k=l&(d|0)==(h|0)?(c|0)==(g|0)&b>>>0>>0|c>>>0>>0:l&d>>>0>>0|k>>>0>m>>>0;o=k?f:b;l=k?g:c;m=k?i:e;r=m;q=k?h:d;n=m&65535;e=k?e:i;s=e;h=k?d:h;m=e>>>16&32767;p=r>>>16&32767;if(!p){d=!(n|q);e=d<<6;i=P(d?o:q)+32|0;d=P(d?l:n);d=e+((d|0)==32?i:d)|0;od(j+96|0,o,l,q,n,d-15|0);q=G[j+104>>2];n=G[j+108>>2];o=G[j+96>>2];p=16-d|0;l=G[j+100>>2]}f=k?b:f;g=k?c:g;i=s&65535;if(!m){b=!(h|i);c=b<<6;d=P(b?f:h)+32|0;b=P(b?g:i);b=c+((b|0)==32?d:b)|0;od(j+80|0,f,g,h,i,b-15|0);m=16-b|0;h=G[j+88>>2];i=G[j+92>>2];g=G[j+84>>2];f=G[j+80>>2]}b=h;k=i<<3|b>>>29;d=b<<3|g>>>29;e=k|524288;b=q;c=n<<3|b>>>29;h=b<<3|l>>>29;i=c;b=f;c=g<<3|b>>>29;b=b<<3;g=r^s;c:{if((m|0)==(p|0)){break c}f=p-m|0;if(f>>>0>127){d=0;e=0;b=1;c=0;break c}od(j- -64|0,b,c,d,e,128-f|0);eg(j+48|0,b,c,d,e,f);b=G[j+48>>2]|(G[j+64>>2]|G[j+72>>2]|(G[j+68>>2]|G[j+76>>2]))!=0;c=G[j+52>>2];d=G[j+56>>2];e=G[j+60>>2]}m=h;q=i|524288;f=o;k=l<<3|f>>>29;n=f<<3;d:{if((g|0)<0){f=0;g=0;h=0;i=0;if(!(b^n|d^m|(c^k|e^q))){break a}o=n-b|0;l=k-((b>>>0>n>>>0)+c|0)|0;f=m-d|0;b=(c|0)==(k|0)&b>>>0>n>>>0|c>>>0>k>>>0;i=(q-((d>>>0>m>>>0)+e|0)|0)-(f>>>0>>0)|0;h=f-b|0;if(i>>>0>524287){break d}b=!(h|i);c=b<<6;d=P(b?o:h)+32|0;b=P(b?l:i);b=c+((b|0)==32?d:b)|0;b=b-12|0;od(j+32|0,o,l,h,i,b);p=p-b|0;h=G[j+40>>2];i=G[j+44>>2];o=G[j+32>>2];l=G[j+36>>2];break d}k=c+k|0;f=b+n|0;k=f>>>0>>0?k+1|0:k;o=f;l=k;f=(c|0)==(k|0)&b>>>0>f>>>0|c>>>0>k>>>0;c=e+q|0;b=d+m|0;c=b>>>0>>0?c+1|0:c;d=b;b=f+b|0;h=b;i=b>>>0>>0?c+1|0:c;if(!(i&1048576)){break d}o=o&1|((l&1)<<31|o>>>1);c=h;l=c<<31|l>>>1;p=p+1|0;h=(i&1)<<31|c>>>1;i=i>>>1|0}d=0;e=r&-2147483648;if((p|0)>=32767){h=d;i=e|2147418112;f=0;g=0;break a}m=0;e:{if((p|0)>0){m=p;break e}od(j+16|0,o,l,h,i,p+127|0);eg(j,o,l,h,i,1-p|0);o=G[j>>2]|(G[j+16>>2]|G[j+24>>2]|(G[j+20>>2]|G[j+28>>2]))!=0;l=G[j+4>>2];h=G[j+8>>2];i=G[j+12>>2]}c=h<<29;b=l>>>3|0;n=(l&7)<<29|o>>>3;l=o&7;g=l>>>0>4;f=n+g|0;b=b|c;k=f>>>0>>0?b+1|0:b;c=f;g=k;b=(b|0)==(k|0)&c>>>0>>0|b>>>0>k>>>0;c=d|((i&7)<<29|h>>>3);b=b+c|0;i=e|(i>>>3&65535|m<<16);i=b>>>0>>0?i+1|0:i;h=b;f:{if((l|0)==4){c=g+0|0;e=f&1;b=f+e|0;c=b>>>0>>0?c+1|0:c;f=b;g=c;c=(d|0)==(c|0)&b>>>0>>0|c>>>0>>0;b=c+h|0;i=b>>>0>>0?i+1|0:i;h=b;break f}if(!l){break a}}}G[a>>2]=f;G[a+4>>2]=g;G[a+8>>2]=h;G[a+12>>2]=i;Fa=j+112|0}function Zp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=N(0),q=0,r=0,s=0,t=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){g=(q<<3)+j|0;c:{d:{o=+K[(q<<2)+a>>2]*c+d;if(o<-0x8000000000000000){G[k>>2]=-11;break d}if(o>0x8000000000000000){G[k>>2]=-11;f=2147483647;e=-1;break c}if(!(O(o)<0x8000000000000000)){break d}f=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~o>>>0;break c}f=-2147483648;e=0}G[g>>2]=e;G[g+4>>2]=f;q=q+1|0;if((q|0)!=(b|0)){continue}break}break a}q=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<0x8000000000000000)){break f}r=O(d)>=1?~~(d>0?Q(S(d*2.3283064365386963e-10),4294967295):T((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0:0;n=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{n=I[q>>1]&32640;switch(((n|0)==32640?1:!n<<1)|0){case 0:break h;case 1:break j;default:break i}}G[i>>2]=1;if((e|0)==1){n=(m<<3)+j|0;G[n>>2]=f;G[n+4>>2]=g;break g}E[h+m|0]=1;break g}n=(m<<3)+j|0;G[n>>2]=0;G[n+4>>2]=0;break g}p=K[(m<<2)+a>>2];if(p>2]=-11;n=(m<<3)+j|0;G[n>>2]=0;G[n+4>>2]=-2147483648;break g}if(p>N(0x8000000000000000)){G[k>>2]=-11;n=(m<<3)+j|0;G[n>>2]=-1;G[n+4>>2]=2147483647;break g}n=(m<<3)+j|0;k:{if(N(O(p))=N(1)?~~(p>N(0)?N(Q(N(S(N(p*N(2.3283064365386963e-10)))),N(4294967296))):N(T(N(N(p-N(~~p>>>0>>>0))*N(2.3283064365386963e-10)))))>>>0:0;r=~~p>>>0;break k}l=-2147483648;r=0}G[n>>2]=r;G[n+4>>2]=l}q=q+4|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}r=-2147483648;n=0}while(1){l:{m:{n:{o:{l=I[q>>1]&32640;switch(((l|0)==32640?1:!l<<1)|0){case 0:break m;case 1:break o;default:break n}}G[i>>2]=1;if((e|0)==1){l=(m<<3)+j|0;G[l>>2]=f;G[l+4>>2]=g;break l}E[h+m|0]=1;break l}if(d<-0x8000000000000000){G[k>>2]=-11;l=(m<<3)+j|0;G[l>>2]=0;G[l+4>>2]=-2147483648;break l}if(d>0x8000000000000000){G[k>>2]=-11;l=(m<<3)+j|0;G[l>>2]=-1;G[l+4>>2]=2147483647;break l}l=(m<<3)+j|0;G[l>>2]=n;G[l+4>>2]=r;break l}o=+K[(m<<2)+a>>2]*c+d;if(o<-0x8000000000000000){G[k>>2]=-11;l=(m<<3)+j|0;G[l>>2]=0;G[l+4>>2]=-2147483648;break l}if(o>0x8000000000000000){G[k>>2]=-11;l=(m<<3)+j|0;G[l>>2]=-1;G[l+4>>2]=2147483647;break l}l=(m<<3)+j|0;p:{if(O(o)<0x8000000000000000){s=O(o)>=1?~~(o>0?Q(S(o*2.3283064365386963e-10),4294967295):T((o-+(~~o>>>0>>>0))*2.3283064365386963e-10))>>>0:0;t=~~o>>>0;break p}s=-2147483648;t=0}G[l>>2]=t;G[l+4>>2]=s}q=q+4|0;m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){g=(q<<3)+j|0;q:{r:{p=K[(q<<2)+a>>2];if(p>2]=-11;break r}if(p>N(0x8000000000000000)){G[k>>2]=-11;f=2147483647;e=-1;break q}if(!(N(O(p))=N(1)?~~(p>N(0)?N(Q(N(S(N(p*N(2.3283064365386963e-10)))),N(4294967296))):N(T(N(N(p-N(~~p>>>0>>>0))*N(2.3283064365386963e-10)))))>>>0:0;e=~~p>>>0;break q}f=-2147483648;e=0}G[g>>2]=e;G[g+4>>2]=f;q=q+1|0;if((q|0)!=(b|0)){continue}break}}}function Or(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=N(0),g=N(0),h=0,i=N(0),j=0,k=N(0),l=N(0),m=0,n=0,o=0,p=0,q=0;a:{if(G[c+4>>2]==702){h=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=190;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;h=L[c+24>>3];b:{if(h==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;j=45;h=.022222222222222223;break b}j=h*3.141592653589793*.25;h=1/j}G[c+1892>>2]=103;G[c+1888>>2]=104;L[c+112>>3]=j;L[c+120>>3]=h}k=N(h*b);i=N(h*a);f=N(O(i));c:{d:{if(f<=N(1)){c=2;if(!(N(O(k))>N(3))){break d}break c}c=2;if(f>N(7)|N(O(k))>N(1)){break c}}i=iN(5)){f=N(i+N(-6));break h}if(i>N(3)){f=N(i+N(-4));c=0;m=1;break e}if(i>N(1)){f=N(i+N(-2));c=0;n=1;break f}if(k>N(1)){k=N(k+N(-2));f=i;c=1;break g}if(!(kN(5)){b=h*+N(-f);j=h;h=h*+N(-l);break i}j=h*+N(-l);b=h;h=h*+N(-f)}if(h==0&j==0){a=0}else{a=Ac(j,h)}L[d>>3]=a;p=e,q=Bc(b),L[p>>3]=q;c=0}return c|0}function me(a,b,c){var d=0,e=0,f=0,g=0,h=0;d=Fa-176|0;Fa=d;e=G[c>>2];a:{if((e|0)>0){break a}e=H[201441];if(!e){e=H[G[29798]];E[201441]=e}G[48624]=0;G[b>>2]=0;G[b+4>>2]=0;b:{if(!(!jb(a,68)&(e&255)!=44)){if(Va(a)>>>0>=73){F[d+120>>1]=H[29569]|H[29570]<<8;a=H[29565]|H[29566]<<8|(H[29567]<<16|H[29568]<<24);G[d+112>>2]=H[29561]|H[29562]<<8|(H[29563]<<16|H[29564]<<24);G[d+116>>2]=a;a=H[29557]|H[29558]<<8|(H[29559]<<16|H[29560]<<24);G[d+104>>2]=H[29553]|H[29554]<<8|(H[29555]<<16|H[29556]<<24);G[d+108>>2]=a;a=H[29549]|H[29550]<<8|(H[29551]<<16|H[29552]<<24);G[d+96>>2]=H[29545]|H[29546]<<8|(H[29547]<<16|H[29548]<<24);G[d+100>>2]=a;a=H[29541]|H[29542]<<8|(H[29543]<<16|H[29544]<<24);G[d+88>>2]=H[29537]|H[29538]<<8|(H[29539]<<16|H[29540]<<24);G[d+92>>2]=a;a=H[29533]|H[29534]<<8|(H[29535]<<16|H[29536]<<24);G[d+80>>2]=H[29529]|H[29530]<<8|(H[29531]<<16|H[29532]<<24);G[d+84>>2]=a;tb(5,d+80|0);e=409;G[c>>2]=409;break a}f=Za(d,a);g=jb(f,68);G[d+172>>2]=g;if(g){E[g|0]=69}c:{if((e&255)!=44){break c}e=jb(f,46);G[d+172>>2]=e;if(!e){break c}E[e|0]=44}h=vb(f,d+172|0);break b}h=vb(a,d+172|0)}L[b>>3]=h;if((H[G[d+172>>2]]|32)==32){A(+h);e=v(1)|0;v(0)|0;e=e>>>16|0}else{e=H[67545]|H[67546]<<8|(H[67547]<<16|H[67548]<<24);f=H[67541]|H[67542]<<8|(H[67543]<<16|H[67544]<<24);F[d+118>>1]=f;F[d+120>>1]=f>>>16;F[d+122>>1]=e;F[d+124>>1]=e>>>16;e=H[67539]|H[67540]<<8|(H[67541]<<16|H[67542]<<24);G[d+112>>2]=H[67535]|H[67536]<<8|(H[67537]<<16|H[67538]<<24);G[d+116>>2]=e;e=H[67531]|H[67532]<<8|(H[67533]<<16|H[67534]<<24);G[d+104>>2]=H[67527]|H[67528]<<8|(H[67529]<<16|H[67530]<<24);G[d+108>>2]=e;e=H[67523]|H[67524]<<8|(H[67525]<<16|H[67526]<<24);G[d+96>>2]=H[67519]|H[67520]<<8|(H[67521]<<16|H[67522]<<24);G[d+100>>2]=e;e=H[67515]|H[67516]<<8|(H[67517]<<16|H[67518]<<24);G[d+88>>2]=H[67511]|H[67512]<<8|(H[67513]<<16|H[67514]<<24);G[d+92>>2]=e;e=H[67507]|H[67508]<<8|(H[67509]<<16|H[67510]<<24);G[d+80>>2]=H[67503]|H[67504]<<8|(H[67505]<<16|H[67506]<<24);G[d+84>>2]=e;tb(5,qb(d+80|0,a,30));G[c>>2]=409;e=I[b+6>>1]}if(!(G[48624]!=68&(e&32752)!=32752)){e=H[67545]|H[67546]<<8|(H[67547]<<16|H[67548]<<24);f=H[67541]|H[67542]<<8|(H[67543]<<16|H[67544]<<24);F[d+118>>1]=f;F[d+120>>1]=f>>>16;F[d+122>>1]=e;F[d+124>>1]=e>>>16;e=H[67539]|H[67540]<<8|(H[67541]<<16|H[67542]<<24);G[d+112>>2]=H[67535]|H[67536]<<8|(H[67537]<<16|H[67538]<<24);G[d+116>>2]=e;e=H[67531]|H[67532]<<8|(H[67533]<<16|H[67534]<<24);G[d+104>>2]=H[67527]|H[67528]<<8|(H[67529]<<16|H[67530]<<24);G[d+108>>2]=e;e=H[67523]|H[67524]<<8|(H[67525]<<16|H[67526]<<24);G[d+96>>2]=H[67519]|H[67520]<<8|(H[67521]<<16|H[67522]<<24);G[d+100>>2]=e;e=H[67515]|H[67516]<<8|(H[67517]<<16|H[67518]<<24);G[d+88>>2]=H[67511]|H[67512]<<8|(H[67513]<<16|H[67514]<<24);G[d+92>>2]=e;e=H[67507]|H[67508]<<8|(H[67509]<<16|H[67510]<<24);G[d+80>>2]=H[67503]|H[67504]<<8|(H[67505]<<16|H[67506]<<24);G[d+84>>2]=e;tb(5,qb(d+80|0,a,30));G[b>>2]=0;G[b+4>>2]=0;G[c>>2]=412;G[48624]=0}e=G[c>>2]}Fa=d+176|0;return e}function lu(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=Fa-1114160|0;Fa=f;g=ab(40);G[g>>2]=0;G[f+852016>>2]=13193;j=4;i=1;a:{b:{c:{if(!c|!H[c|0]){break c}G[321387]=0;l=aa(158,c|0)|0;c=G[321387];G[321387]=0;d=-1;d:{if(!c){break d}e=G[321388];if(!e){break d}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;h=pc(l,92039);c=G[321387];G[321387]=0;d=-1;e:{if(!c){break e}e=G[321388];if(!e){break e}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}f:{if(!h){break f}d=0;while(1){G[321387]=0;k=rb((f+196656|0)+(d<<16)|0,h,65535);c=G[321387];G[321387]=0;h=-1;g:{if(!c){break g}e=G[321388];if(!e){break g}h=Ab(G[c>>2],g,4);if(!h){break a}_(e|0)}c=Z()|0;if((h|0)==1){break b}G[(f+852016|0)+(i<<2)>>2]=k;G[321387]=0;h=pc(0,92039);c=G[321387];G[321387]=0;k=-1;h:{if(!c){break h}e=G[321388];if(!e){break h}k=Ab(G[c>>2],g,4);if(!k){break a}_(e|0)}c=Z()|0;if((k|0)==1){break b}i=i+1|0;if(!h){break f}c=d>>>0<9;d=d+1|0;if(c){continue}break}}if(!l){break c}Wa(l)}G[(f+852016|0)+(i<<2)>>2]=8722;c=G[968813];G[968813]=c+1;G[321387]=0;G[f+32>>2]=42205;G[f+36>>2]=c;$(156,f+131120|0,65535,4259,f+32|0)|0;c=G[321387];G[321387]=0;d=-1;i:{if(!c){break i}e=G[321388];if(!e){break i}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;G[f+16>>2]=42205;G[f+20>>2]=a;G[((i<<2)+f|0)+852020>>2]=f+131120;$(156,f+65584|0,65535,8740,f+16|0)|0;c=G[321387];G[321387]=0;d=-1;j:{if(!c){break j}e=G[321388];if(!e){break j}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;G[f>>2]=42205;G[f+4>>2]=b;G[((i<<2)+f|0)+852024>>2]=f+65584;$(156,f+48|0,65535,8740,f|0)|0;c=G[321387];G[321387]=0;d=-1;k:{if(!c){break k}e=G[321388];if(!e){break k}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[((i<<2)+f|0)+852028>>2]=f+48;g=We(1285568,1,g,4);j=Z()|0;c=0}l:{while(1){if(!c){G[321387]=0;ba(161,i+4|0,f+852016|0)|0;c=G[321387];G[321387]=0;d=-1;m:{if(!c){break m}e=G[321388];if(!e){break m}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}}G[321387]=0;b=ba(162,f+131120|0,13287)|0;c=G[321387];G[321387]=0;d=-1;n:{if(!c){break n}e=G[321388];if(!e){break n}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}a=28872;if(!b){break l}G[321387]=0;h=$(163,3809712,1,65535,b|0)|0;c=G[321387];G[321387]=0;d=-1;o:{if(!c){break o}e=G[321388];if(!e){break o}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}G[321387]=0;aa(164,b|0)|0;c=G[321387];G[321387]=0;d=-1;p:{if(!c){break p}e=G[321388];if(!e){break p}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}E[h+3809712|0]=0;if((h|0)<=0){break l}G[321387]=0;aa(165,f+131120|0)|0;c=G[321387];G[321387]=0;d=-1;q:{if(!c){break q}e=G[321388];if(!e){break q}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}break}a=3809712}Wa(g);Fa=f+1114160|0;return a|0}Wa(g);Ve(c,e);W()}function hu(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=Fa-1114160|0;Fa=f;g=ab(40);G[g>>2]=0;G[f+852016>>2]=13184;j=4;i=1;a:{b:{c:{if(!c|!H[c|0]){break c}G[321387]=0;l=aa(158,c|0)|0;c=G[321387];G[321387]=0;d=-1;d:{if(!c){break d}e=G[321388];if(!e){break d}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;h=pc(l,92039);c=G[321387];G[321387]=0;d=-1;e:{if(!c){break e}e=G[321388];if(!e){break e}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}f:{if(!h){break f}d=0;while(1){G[321387]=0;k=rb((f+196656|0)+(d<<16)|0,h,65535);c=G[321387];G[321387]=0;h=-1;g:{if(!c){break g}e=G[321388];if(!e){break g}h=Ab(G[c>>2],g,4);if(!h){break a}_(e|0)}c=Z()|0;if((h|0)==1){break b}G[(f+852016|0)+(i<<2)>>2]=k;G[321387]=0;h=pc(0,92039);c=G[321387];G[321387]=0;k=-1;h:{if(!c){break h}e=G[321388];if(!e){break h}k=Ab(G[c>>2],g,4);if(!k){break a}_(e|0)}c=Z()|0;if((k|0)==1){break b}i=i+1|0;if(!h){break f}c=d>>>0<9;d=d+1|0;if(c){continue}break}}if(!l){break c}Wa(l)}G[(f+852016|0)+(i<<2)>>2]=8722;c=G[968813];G[968813]=c+1;G[321387]=0;G[f+32>>2]=42205;G[f+36>>2]=c;$(156,f+131120|0,65535,4259,f+32|0)|0;c=G[321387];G[321387]=0;d=-1;i:{if(!c){break i}e=G[321388];if(!e){break i}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;G[f+16>>2]=42205;G[f+20>>2]=a;G[((i<<2)+f|0)+852020>>2]=f+131120;$(156,f+65584|0,65535,8740,f+16|0)|0;c=G[321387];G[321387]=0;d=-1;j:{if(!c){break j}e=G[321388];if(!e){break j}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[321387]=0;G[f>>2]=42205;G[f+4>>2]=b;G[((i<<2)+f|0)+852024>>2]=f+65584;$(156,f+48|0,65535,8740,f|0)|0;c=G[321387];G[321387]=0;d=-1;k:{if(!c){break k}e=G[321388];if(!e){break k}d=Ab(G[c>>2],g,4);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){break b}G[((i<<2)+f|0)+852028>>2]=f+48;g=We(1285568,1,g,4);j=Z()|0;c=0}l:{while(1){if(!c){G[321387]=0;ba(169,i+4|0,f+852016|0)|0;c=G[321387];G[321387]=0;d=-1;m:{if(!c){break m}e=G[321388];if(!e){break m}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}}G[321387]=0;b=ba(162,f+131120|0,13287)|0;c=G[321387];G[321387]=0;d=-1;n:{if(!c){break n}e=G[321388];if(!e){break n}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}a=28965;if(!b){break l}G[321387]=0;h=$(163,3809712,1,65535,b|0)|0;c=G[321387];G[321387]=0;d=-1;o:{if(!c){break o}e=G[321388];if(!e){break o}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}G[321387]=0;aa(164,b|0)|0;c=G[321387];G[321387]=0;d=-1;p:{if(!c){break p}e=G[321388];if(!e){break p}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}E[h+3809712|0]=0;if((h|0)<=0){break l}G[321387]=0;aa(165,f+131120|0)|0;c=G[321387];G[321387]=0;d=-1;q:{if(!c){break q}e=G[321388];if(!e){break q}d=Ab(G[c>>2],g,j);if(!d){break a}_(e|0)}c=Z()|0;if((d|0)==1){continue}break}a=3809712}Wa(g);Fa=f+1114160|0;return a|0}Wa(g);Ve(c,e);W()}function Ee(a,b,c){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;a:{b:{c:{d:{e:{switch(G[a+32>>2]-1|0){case 0:f=L[a>>3];n=L[a+8>>3];i=G[a+36>>2];h=G[a+56>>2];G[h>>2]=0;G[h+4>>2]=1072693248;f:{if((i|0)==1){break f}b=(n+b)*f;L[h+8>>3]=b;if((i|0)<3){break f}f=b+b;d=2;if((i|0)!=3){l=i-2&-2;while(1){m=d<<3;e=m+h|0;b=f*b-L[e-16>>3];L[e>>3]=b;b=f*b-L[e-8>>3];L[(m|8)+h>>3]=b;d=d+2|0;k=k+2|0;if((l|0)!=(k|0)){continue}break}}if(!(i&1)){break f}d=(d<<3)+h|0;L[d>>3]=f*b-L[d-16>>3]}b=L[a+16>>3];f=L[a+24>>3];g=G[a+40>>2];j=G[a+60>>2];G[j>>2]=0;G[j+4>>2]=1072693248;if((g|0)==1){break d}b=(f+c)*b;L[j+8>>3]=b;if((g|0)<3){break c}c=b+b;d=2;if((g|0)!=3){l=g-2&-2;k=0;while(1){m=d<<3;e=m+j|0;b=c*b-L[e-16>>3];L[e>>3]=b;b=c*b-L[e-8>>3];L[(m|8)+j>>3]=b;d=d+2|0;k=k+2|0;if((l|0)!=(k|0)){continue}break}}if(!(g&1)){break c}d=(d<<3)+j|0;L[d>>3]=c*b-L[d-16>>3];break c;case 1:f=L[a>>3];n=L[a+8>>3];i=G[a+36>>2];h=G[a+56>>2];G[h>>2]=0;G[h+4>>2]=1072693248;g:{if((i|0)==1){break g}b=(n+b)*f;L[h+8>>3]=b;if((i|0)<3){break g}d=2;f=b;while(1){n=+(d|0);e=(d<<3)+h|0;f=(b*(n+n+-1)*f-L[e-16>>3]*(n+-1))/n;L[e>>3]=f;d=d+1|0;if((i|0)!=(d|0)){continue}break}}b=L[a+16>>3];f=L[a+24>>3];g=G[a+40>>2];j=G[a+60>>2];G[j>>2]=0;G[j+4>>2]=1072693248;if((g|0)==1){break d}b=(f+c)*b;L[j+8>>3]=b;if((g|0)<3){break c}d=2;c=b;while(1){f=+(d|0);e=(d<<3)+j|0;c=(b*(f+f+-1)*c-L[e-16>>3]*(f+-1))/f;L[e>>3]=c;d=d+1|0;if((g|0)!=(d|0)){continue}break};break c;case 2:i=G[a+36>>2];h=G[a+56>>2];G[h>>2]=0;G[h+4>>2]=1072693248;h:{if((i|0)==1){break h}L[h+8>>3]=b;if((i|0)<3){break h}e=i-2|0;l=e&3;d=2;f=b;if(i-3>>>0>=3){m=e&-4;while(1){g=d<<3;e=g+h|0;f=f*b;L[e>>3]=f;f=f*b;L[(g|8)+h>>3]=f;n=f*b;f=n*b;L[e+24>>3]=f;L[e+16>>3]=n;d=d+4|0;k=k+4|0;if((m|0)!=(k|0)){continue}break}}if(!l){break h}e=0;while(1){f=f*b;L[(d<<3)+h>>3]=f;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break}}g=G[a+40>>2];j=G[a+60>>2];G[j>>2]=0;G[j+4>>2]=1072693248;if((g|0)==1){break d}L[j+8>>3]=c;if((g|0)<3){break c}e=g-2|0;l=e&3;d=2;b=c;if(g-3>>>0>=3){m=e&-4;k=0;while(1){o=d<<3;e=o+j|0;b=b*c;L[e>>3]=b;b=b*c;L[(o|8)+j>>3]=b;f=b*c;b=f*c;L[e+24>>3]=b;L[e+16>>3]=f;d=d+4|0;k=k+4|0;if((m|0)!=(k|0)){continue}break}}if(!l){break c}e=0;while(1){b=b*c;L[(d<<3)+j>>3]=b;d=d+1|0;e=e+1|0;if((l|0)!=(e|0)){continue}break};break c;default:break e}}hb(72625,33,1,G[24367]);break b}g=1;o=(i|0)>1?i:1;break a}if((g|0)<=0){break b}o=(g|0)<(i|0)?i:g;break a}return 0}t=G[a+44>>2];c=0;m=0;d=i;while(1){l=d;if((d|0)<=0){b=0}else{u=l&1;q=G[a+52>>2];i:{if((l|0)==1){b=0;d=0;e=m;break i}v=l&-2;b=0;d=0;e=m;k=0;while(1){r=(e<<3)+q|0;s=d<<3;b=L[r+8>>3]*L[(s|8)+h>>3]+(L[r>>3]*L[h+s>>3]+b);d=d+2|0;e=e+2|0;k=k+2|0;if((v|0)!=(k|0)){continue}break}}m=l+m|0;if(u){b=L[(e<<3)+q>>3]*L[(d<<3)+h>>3]+b}}b=b*L[(p<<3)+j>>3];d=1;j:{k:{switch(t|0){case 2:d=l-(((i+p|0)+1|0)>(o|0))|0;break j;case 0:break j;default:break k}}d=l}c=c+b;p=p+1|0;if((p|0)!=(g|0)){continue}break}return c}function xm(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=a+b|0;c=G[a+4>>2];a:{b:{if(c&1){break b}if(!(c&3)){break a}c=G[a>>2];b=c+b|0;c:{a=a-c|0;if((a|0)!=G[48630]){if(c>>>0<=255){e=G[a+8>>2];c=c>>>3|0;d=G[a+12>>2];if((d|0)!=(e|0)){break c}i=194500,j=G[48625]&Eu(-2,c),G[i>>2]=j;break b}h=G[a+24>>2];c=G[a+12>>2];d:{if((c|0)!=(a|0)){d=G[a+8>>2];G[d+12>>2]=c;G[c+8>>2]=d;break d}e:{e=a+20|0;d=G[e>>2];if(d){break e}e=a+16|0;d=G[e>>2];if(d){break e}c=0;break d}while(1){g=e;c=d;e=c+20|0;d=G[e>>2];if(d){continue}e=c+16|0;d=G[c+16>>2];if(d){continue}break}G[g>>2]=0}if(!h){break b}e=G[a+28>>2];d=(e<<2)+194804|0;f:{if(G[d>>2]==(a|0)){G[d>>2]=c;if(c){break f}i=194504,j=G[48626]&Eu(-2,e),G[i>>2]=j;break b}G[h+(G[h+16>>2]==(a|0)?16:20)>>2]=c;if(!c){break b}}G[c+24>>2]=h;d=G[a+16>>2];if(d){G[c+16>>2]=d;G[d+24>>2]=c}d=G[a+20>>2];if(!d){break b}G[c+20>>2]=d;G[d+24>>2]=c;break b}c=G[f+4>>2];if((c&3)!=3){break b}G[48627]=b;G[f+4>>2]=c&-2;G[a+4>>2]=b|1;G[f>>2]=b;return}G[e+12>>2]=d;G[d+8>>2]=e}c=G[f+4>>2];g:{if(!(c&2)){if(G[48631]==(f|0)){G[48631]=a;b=G[48628]+b|0;G[48628]=b;G[a+4>>2]=b|1;if(G[48630]!=(a|0)){break a}G[48627]=0;G[48630]=0;return}if(G[48630]==(f|0)){G[48630]=a;b=G[48627]+b|0;G[48627]=b;G[a+4>>2]=b|1;G[a+b>>2]=b;return}b=(c&-8)+b|0;h:{if(c>>>0<=255){e=G[f+8>>2];c=c>>>3|0;d=G[f+12>>2];if((d|0)==(e|0)){i=194500,j=G[48625]&Eu(-2,c),G[i>>2]=j;break h}G[e+12>>2]=d;G[d+8>>2]=e;break h}h=G[f+24>>2];c=G[f+12>>2];i:{if((f|0)!=(c|0)){d=G[f+8>>2];G[d+12>>2]=c;G[c+8>>2]=d;break i}j:{d=f+20|0;e=G[d>>2];if(e){break j}d=f+16|0;e=G[d>>2];if(e){break j}c=0;break i}while(1){g=d;c=e;d=c+20|0;e=G[d>>2];if(e){continue}d=c+16|0;e=G[c+16>>2];if(e){continue}break}G[g>>2]=0}if(!h){break h}e=G[f+28>>2];d=(e<<2)+194804|0;k:{if(G[d>>2]==(f|0)){G[d>>2]=c;if(c){break k}i=194504,j=G[48626]&Eu(-2,e),G[i>>2]=j;break h}G[h+(G[h+16>>2]==(f|0)?16:20)>>2]=c;if(!c){break h}}G[c+24>>2]=h;d=G[f+16>>2];if(d){G[c+16>>2]=d;G[d+24>>2]=c}d=G[f+20>>2];if(!d){break h}G[c+20>>2]=d;G[d+24>>2]=c}G[a+4>>2]=b|1;G[a+b>>2]=b;if(G[48630]!=(a|0)){break g}G[48627]=b;return}G[f+4>>2]=c&-2;G[a+4>>2]=b|1;G[a+b>>2]=b}if(b>>>0<=255){c=(b&-8)+194540|0;d=G[48625];b=1<<(b>>>3);l:{if(!(d&b)){G[48625]=b|d;b=c;break l}b=G[c+8>>2]}G[c+8>>2]=a;G[b+12>>2]=a;G[a+12>>2]=c;G[a+8>>2]=b;return}e=31;if(b>>>0<=16777215){c=b>>>8|0;g=c+1048320>>>16&8;c=c<>>16&4;c=c<>>16&2;c=(c<>>15|0)-(d|(e|g))|0;e=(c<<1|b>>>c+21&1)+28|0}G[a+28>>2]=e;G[a+16>>2]=0;G[a+20>>2]=0;g=(e<<2)+194804|0;m:{d=G[48626];c=1<>2]=a;G[a+24>>2]=g;break n}e=b<<((e|0)==31?0:25-(e>>>1|0)|0);c=G[g>>2];while(1){d=c;if((G[c+4>>2]&-8)==(b|0)){break m}c=e>>>29|0;e=e<<1;g=d+(c&4)|0;c=G[g+16>>2];if(c){continue}break}G[g+16>>2]=a;G[a+24>>2]=d}G[a+12>>2]=a;G[a+8>>2]=a;return}b=G[d+8>>2];G[b+12>>2]=a;G[d+8>>2]=a;G[a+24>>2]=0;G[a+12>>2]=d;G[a+8>>2]=b}}function Yp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){c:{d:{g=p<<3;n=L[g+a>>3]*c+d;if(n<-0x8000000000000000){G[k>>2]=-11;break d}if(n>0x8000000000000000){G[k>>2]=-11;f=2147483647;e=-1;break c}if(!(O(n)<0x8000000000000000)){break d}f=O(n)>=1?~~(n>0?Q(S(n*2.3283064365386963e-10),4294967295):T((n-+(~~n>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~n>>>0;break c}f=-2147483648;e=0}g=g+j|0;G[g>>2]=e;G[g+4>>2]=f;p=p+1|0;if((p|0)!=(b|0)){continue}break}break a}p=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<0x8000000000000000)){break f}q=O(d)>=1?~~(d>0?Q(S(d*2.3283064365386963e-10),4294967295):T((d-+(~~d>>>0>>>0))*2.3283064365386963e-10))>>>0:0;m=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{m=I[p>>1]&32752;switch(((m|0)==32752?1:!m<<1)|0){case 0:break h;case 1:break j;default:break i}}G[i>>2]=1;if((e|0)==1){m=(o<<3)+j|0;G[m>>2]=f;G[m+4>>2]=g;break g}E[h+o|0]=1;break g}m=(o<<3)+j|0;G[m>>2]=0;G[m+4>>2]=0;break g}m=o<<3;c=L[m+a>>3];if(c<-0x8000000000000000){G[k>>2]=-11;m=j+m|0;G[m>>2]=0;G[m+4>>2]=-2147483648;break g}if(c>0x8000000000000000){G[k>>2]=-11;m=j+m|0;G[m>>2]=-1;G[m+4>>2]=2147483647;break g}m=j+m|0;k:{if(O(c)<0x8000000000000000){l=O(c)>=1?~~(c>0?Q(S(c*2.3283064365386963e-10),4294967295):T((c-+(~~c>>>0>>>0))*2.3283064365386963e-10))>>>0:0;q=~~c>>>0;break k}l=-2147483648;q=0}G[m>>2]=q;G[m+4>>2]=l}p=p+8|0;o=o+1|0;if((o|0)!=(b|0)){continue}break}break a}q=-2147483648;m=0}while(1){l:{m:{n:{o:{l=I[p>>1]&32752;switch(((l|0)==32752?1:!l<<1)|0){case 0:break m;case 1:break o;default:break n}}G[i>>2]=1;if((e|0)==1){l=(o<<3)+j|0;G[l>>2]=f;G[l+4>>2]=g;break l}E[h+o|0]=1;break l}if(d<-0x8000000000000000){G[k>>2]=-11;l=(o<<3)+j|0;G[l>>2]=0;G[l+4>>2]=-2147483648;break l}if(d>0x8000000000000000){G[k>>2]=-11;l=(o<<3)+j|0;G[l>>2]=-1;G[l+4>>2]=2147483647;break l}l=(o<<3)+j|0;G[l>>2]=m;G[l+4>>2]=q;break l}l=o<<3;n=L[l+a>>3]*c+d;if(n<-0x8000000000000000){G[k>>2]=-11;l=j+l|0;G[l>>2]=0;G[l+4>>2]=-2147483648;break l}if(n>0x8000000000000000){G[k>>2]=-11;l=(o<<3)+j|0;G[l>>2]=-1;G[l+4>>2]=2147483647;break l}l=(o<<3)+j|0;p:{if(O(n)<0x8000000000000000){r=O(n)>=1?~~(n>0?Q(S(n*2.3283064365386963e-10),4294967295):T((n-+(~~n>>>0>>>0))*2.3283064365386963e-10))>>>0:0;s=~~n>>>0;break p}r=-2147483648;s=0}G[l>>2]=s;G[l+4>>2]=r}p=p+8|0;o=o+1|0;if((o|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){q:{r:{g=p<<3;c=L[g+a>>3];if(c<-0x8000000000000000){G[k>>2]=-11;break r}if(c>0x8000000000000000){G[k>>2]=-11;f=2147483647;e=-1;break q}if(!(O(c)<0x8000000000000000)){break r}f=O(c)>=1?~~(c>0?Q(S(c*2.3283064365386963e-10),4294967295):T((c-+(~~c>>>0>>>0))*2.3283064365386963e-10))>>>0:0;e=~~c>>>0;break q}f=-2147483648;e=0}g=g+j|0;G[g>>2]=e;G[g+4>>2]=f;p=p+1|0;if((p|0)!=(b|0)){continue}break}}}function se(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=Fa-1072|0;Fa=f;d=G[c>>2];a:{if((d|0)>0){break a}E[b|0]=0;E[f|0]=0;E[f+1040|0]=0;b:{c:{if(H[a|0]==45){d=f+1040|0;d=Va(d)+d|0;E[d|0]=45;E[d+1|0]=0;a=a+1|0;break c}d:{if(fb(a,15936,5)){if(fb(a,34568,5)){break d}}d=f+1040|0;d=Va(d)+d|0;E[d|0]=45;E[d+1|0]=0;a=a+5|0;break c}d=Sb(a,42197);e=jb(a,40);if(!(!d|(e|0)!=0&d>>>0>e>>>0)){e=d-a|0;if((e|0)>=17){break b}qb(f+1040|0,a,e+3|0);a=d+3|0;break c}if(!fb(a,36983,4)){d=f+1040|0;d=Va(d)+d|0;e=H[42036]|H[42037]<<8|(H[42038]<<16|H[42039]<<24);E[d|0]=e;E[d+1|0]=e>>>8;E[d+2|0]=e>>>16;E[d+3|0]=e>>>24;e=H[42039]|H[42040]<<8|(H[42041]<<16|H[42042]<<24);E[d+3|0]=e;E[d+4|0]=e>>>8;E[d+5|0]=e>>>16;E[d+6|0]=e>>>24;a=a+4|0;break c}if(!fb(a,36980,7)){d=f+1040|0;d=Va(d)+d|0;e=H[42037]|H[42038]<<8|(H[42039]<<16|H[42040]<<24);g=H[42033]|H[42034]<<8|(H[42035]<<16|H[42036]<<24);E[d|0]=g;E[d+1|0]=g>>>8;E[d+2|0]=g>>>16;E[d+3|0]=g>>>24;E[d+4|0]=e;E[d+5|0]=e>>>8;E[d+6|0]=e>>>16;E[d+7|0]=e>>>24;e=H[42041]|H[42042]<<8;E[d+8|0]=e;E[d+9|0]=e>>>8;a=a+7|0;break c}if(!fb(a,36974,5)){d=f+1040|0;d=Va(d)+d|0;E[d|0]=104;E[d+1|0]=116;E[d+2|0]=116;E[d+3|0]=112;E[d+4|0]=58;E[d+5|0]=47;E[d+6|0]=47;E[d+7|0]=0;a=a+5|0;break c}if(!fb(a,37360,4)){d=f+1040|0;d=Va(d)+d|0;e=H[42094]|H[42095]<<8|(H[42096]<<16|H[42097]<<24);E[d|0]=e;E[d+1|0]=e>>>8;E[d+2|0]=e>>>16;E[d+3|0]=e>>>24;e=H[42097]|H[42098]<<8|(H[42099]<<16|H[42100]<<24);E[d+3|0]=e;E[d+4|0]=e>>>8;E[d+5|0]=e>>>16;E[d+6|0]=e>>>24;a=a+4|0;break c}if(!fb(a,37358,6)){d=f+1040|0;d=Va(d)+d|0;e=H[42085]|H[42086]<<8|(H[42087]<<16|H[42088]<<24);g=H[42081]|H[42082]<<8|(H[42083]<<16|H[42084]<<24);E[d|0]=g;E[d+1|0]=g>>>8;E[d+2|0]=g>>>16;E[d+3|0]=g>>>24;E[d+4|0]=e;E[d+5|0]=e>>>8;E[d+6|0]=e>>>16;E[d+7|0]=e>>>24;E[d+8|0]=H[42089];a=a+6|0;break c}a=(fb(a,38404,5)?0:5)+a|0}e=jb(a,40);g=jb(a,91);e:{if(!e){e=0;break e}d=jb(e,41);if(!d){break e}while(1){h=H[d+1|0];d=d+1|0;if((h|0)==32){continue}if(!h|(h|0)==91){break e}e=jb(e+1|0,40);d=jb(d,41);if(!d){break e}if(e){continue}break}}f:{if((e|0)==(g|0)){if(Va(a)>>>0>=1025){break b}Gb(f,a);break f}if(!g){d=e-a|0;if((d|0)>=1025){break b}qb(f,a,d);if(!jb(e+1|0,41)){break b}break f}if(!(!e|e>>>0>=g>>>0)){d=e-a|0;if((d|0)>=1025){break b}qb(f,a,d);if(!jb(e+1|0,41)){break b}break f}d=g-a|0;if((d|0)>=1025){break b}qb(f,a,d)}d=Va(f);g:{if((d|0)<2){break g}while(1){a=d-1|0;e=a+f|0;if(H[e|0]!=32){break g}E[e|0]=0;e=d>>>0>2;d=a;if(e){continue}break}}e=Va(f);a=e;h:{while(1){d=a;if((d|0)<=0){break h}a=d-1|0;g=f+a|0;if(H[g|0]!=43){continue}break}if(d>>>0<2|(e-a|0)>4){break h}i:{j:{if((d|0)>=(e|0)){break j}while(1){if(E[d+f|0]-48>>>0>9){break j}d=d+1|0;if((e|0)!=(d|0)){continue}break}break i}if((d|0)!=(e|0)){break h}}E[g|0]=0}if(Va(f+1040|0)+Va(f)>>>0>=1025){break b}Gb(Gb(b,f+1040|0),f);d=G[c>>2];break a}d=125;G[c>>2]=125}Fa=f+1072|0;return d}function Ts(a){a=a|0;var 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;d=G[309722];b=G[a+12>>2];l=d+M(b,344)|0;e=G[l>>2];f=(e|0)==-1e3?l+88|0:0;h=G[a+16>>2];m=d+M(h,344)|0;n=G[m>>2];g=(n|0)==-1e3?m+88|0:0;a:{if(!((e|0)!=-1e3|(n|0)!=-1e3)){b:{c:{d:{e:{f:{g:{h:{c=G[a>>2];switch(c-278|0){case 4:break d;case 5:break e;case 3:break f;case 2:break g;case 0:case 1:break h;default:break c}}if(H[f|0]==H[g|0]){b=Xa(f,g)}else{b=1}E[a+88|0]=!b^(c|0)!=278;break b}d=E[f|0];e=E[g|0];b=0;i:{if((d|0)<(e|0)){break i}b=1;if((e|0)<(d|0)){break i}b=(Xa(f,g)|0)>0}E[a+88|0]=b;break b}d=E[f|0];e=E[g|0];b=1;j:{if((d|0)<(e|0)){break j}b=0;if((e|0)<(d|0)){break j}b=Xa(f,g)>>>31|0}E[a+88|0]=b;break b}d=E[f|0];e=E[g|0];b=0;k:{if((d|0)<(e|0)){break k}b=1;if((e|0)<(d|0)){break k}b=(Xa(f,g)|0)>=0}E[a+88|0]=b;break b}d=E[f|0];e=E[g|0];b=1;l:{if((d|0)<(e|0)){break l}b=0;if((e|0)<(d|0)){break l}b=(Xa(f,g)|0)<=0}E[a+88|0]=b;break b}if((c|0)!=43){break b}Gb(Za(a+88|0,f),g)}G[a>>2]=-1e3;break a}Nd(a);if(G[309737]){break a}c=G[309727];j=G[a>>2];i=j-278|0;if(i>>>0>5){if(!c|(j|0)!=43){break a}h=d+M(h,344)|0;j=d+M(b,344)|0;b=(e|0)==-1e3;d=0;e=0;while(1){c=c-1|0;e=b?e:H[G[j+84>>2]+c|0];i=(n|0)==-1e3;d=i?d:H[G[h+84>>2]+c|0];E[G[a+84>>2]+c|0]=(e|d)!=0;if(!H[G[a+84>>2]+c|0]){f=b?f:G[G[l+88>>2]+(c<<2)>>2];g=i?g:G[G[m+88>>2]+(c<<2)>>2];i=c<<2;Za(G[i+G[a+88>>2]>>2],f);Gb(G[i+G[a+88>>2]>>2],g)}if(c){continue}break}break a}m:{j=1<>2]+c|0];b=(n|0)==-1e3;d=b?d:H[G[j+84>>2]+c|0];E[G[a+84>>2]+c|0]=(e|d)!=0;if(!H[G[a+84>>2]+c|0]){f=h?f:G[G[l+88>>2]+(c<<2)>>2];g=b?g:G[G[m+88>>2]+(c<<2)>>2];o=E[f|0];b=E[g|0];k=-1;n:{if((o|0)<(b|0)){break n}k=1;if((b|0)<(o|0)){break n}k=Xa(f,g)}b=k;E[G[a+88>>2]+c|0]=G[a>>2]==280?(b|0)>0:b>>>31|0}if(c){continue}break}break a}if(!c){break a}j=d+M(h,344)|0;i=d+M(b,344)|0;b=(e|0)==-1e3;d=0;e=0;while(1){c=c-1|0;e=b?e:H[G[i+84>>2]+c|0];h=(n|0)==-1e3;d=h?d:H[G[j+84>>2]+c|0];E[G[a+84>>2]+c|0]=(e|d)!=0;if(!H[G[a+84>>2]+c|0]){f=b?f:G[G[l+88>>2]+(c<<2)>>2];g=h?g:G[G[m+88>>2]+(c<<2)>>2];h=-1;if(H[f|0]==H[g|0]){h=Xa(f,g)}E[G[a+88>>2]+c|0]=!h^G[a>>2]!=278}if(c){continue}break}break a}if(!c){break a}j=d+M(h,344)|0;i=d+M(b,344)|0;h=(e|0)==-1e3;d=0;e=0;while(1){c=c-1|0;e=h?e:H[G[i+84>>2]+c|0];b=(n|0)==-1e3;d=b?d:H[G[j+84>>2]+c|0];E[G[a+84>>2]+c|0]=(e|d)!=0;if(!H[G[a+84>>2]+c|0]){f=h?f:G[G[l+88>>2]+(c<<2)>>2];g=b?g:G[G[m+88>>2]+(c<<2)>>2];o=E[f|0];b=E[g|0];k=-1;o:{if((o|0)<(b|0)){break o}k=1;if((b|0)<(o|0)){break o}k=Xa(f,g)}b=k;E[G[a+88>>2]+c|0]=G[a>>2]==283?(b|0)>=0:(b|0)<=0}if(c){continue}break}}if(G[l>>2]>0){Wa(G[G[l+88>>2]>>2]);Wa(G[l+88>>2])}if(G[m>>2]>0){Wa(G[G[m+88>>2]>>2]);Wa(G[m+88>>2])}}function Co(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==-128;a:{b:{if(!e){if(l){if((b|0)<=0){break a}g=b&3;e=0;f=0;if(b-1>>>0>=3){h=b&-4;b=0;while(1){E[f+j|0]=H[a+f|0]^128;i=f|1;E[i+j|0]=H[a+i|0]^128;i=f|2;E[i+j|0]=H[a+i|0]^128;i=f|3;E[i+j|0]=H[a+i|0]^128;f=f+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}if(!g){break a}while(1){E[f+j|0]=H[a+f|0]^128;f=f+1|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}break a}if(c==1&d==0){break b}f=0;if((b|0)<=0){break a}while(1){g=f+j|0;n=+H[a+f|0]*c+d;c:{if(n<-128.49){G[k>>2]=-11;e=128;break c}if(n>127.49){G[k>>2]=-11;e=127;break c}e=~~n;if(O(n)<2147483648){break c}e=-2147483648}E[g|0]=e;f=f+1|0;if((f|0)!=(b|0)){continue}break}break a}d:{e:{f:{g:{if(l){if((b|0)<=0){break a}if((e|0)==1){break d}l=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){g=H[a+e|0];h:{if((g|0)==(f|0)){G[i>>2]=1;k=h;g=1;break h}k=j;g=g^-128}E[e+k|0]=g;o=e|1;g=H[o+a|0];i:{if((g|0)!=(f|0)){k=g^-128;g=j;break i}k=1;G[i>>2]=1;g=h}E[g+o|0]=k;e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!l){break a}a=H[a+e|0];if((a|0)==(f|0)){break g}a=a^-128;break f}if(c==1&d==0){break e}if((b|0)<=0){break a}e=(e|0)==1;l=e?g:1;m=e?j:h;e=0;while(1){g=H[a+e|0];j:{if((g|0)==(f|0)){G[i>>2]=1;h=l;g=m;break j}n=+(g>>>0)*c+d;k:{if(n<-128.49){G[k>>2]=-11;h=128;break k}if(n>127.49){G[k>>2]=-11;h=127;break k}h=~~n;if(O(n)<2147483648){break k}h=-2147483648}g=j}E[g+e|0]=h;e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}G[i>>2]=1;j=h;a=1}E[e+j|0]=a;break a}if((b|0)<=0){break a}if((e|0)!=1){e=0;if((b|0)!=1){m=b&-2;k=0;while(1){g=H[a+e|0];if((g|0)==(f|0)){g=1;G[i>>2]=1;l=h}else{l=j}E[l+e|0]=g;o=e|1;g=H[o+a|0];if((g|0)==(f|0)){g=1;G[i>>2]=1;l=h}else{l=j}E[l+o|0]=g;e=e+2|0;k=k+2|0;if((m|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=H[a+e|0];if((f|0)==(a|0)){G[i>>2]=1;j=h;a=1}E[e+j|0]=a;break a}k=b&1;e=0;if((b|0)!=1){l=b&-2;h=0;while(1){m=e+j|0;b=H[a+e|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}E[m|0]=b;m=e|1;b=H[m+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}E[j+m|0]=b;e=e+2|0;h=h+2|0;if((l|0)!=(h|0)){continue}break}}if(!k){break a}b=e+j|0;a=H[a+e|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}E[b|0]=g;break a}k=b&1;e=0;if((b|0)!=1){l=b&-2;b=0;while(1){m=e+j|0;h=H[a+e|0];l:{if((h|0)!=(f|0)){h=h^-128;break l}G[i>>2]=1;h=g}E[m|0]=h;m=e|1;h=H[m+a|0];m:{if((h|0)!=(f|0)){h=h^-128;break m}G[i>>2]=1;h=g}E[j+m|0]=h;e=e+2|0;b=b+2|0;if((l|0)!=(b|0)){continue}break}}if(!k){break a}a=H[a+e|0];n:{if((a|0)!=(f|0)){g=a^-128;break n}G[i>>2]=1}E[e+j|0]=g;break a}if((b|0)<=0){break a}g=b&1;f=0;if((b|0)!=1){h=b&-2;b=0;while(1){i=f+j|0;e=E[a+f|0];if((e|0)<0){G[k>>2]=-11;e=127}E[i|0]=e;i=f|1;e=E[i+a|0];if((e|0)<0){G[k>>2]=-11;e=127}E[i+j|0]=e;f=f+2|0;b=b+2|0;if((h|0)!=(b|0)){continue}break}}if(!g){break a}b=f+j|0;a=E[a+f|0];if((a|0)<0){G[k>>2]=-11;a=127}E[b|0]=a}}function $g(a,b){var 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;c=Fa-320|0;Fa=c;r=G[a+12>>2];g=G[a+4>>2];j=G[a>>2];p=G[a+16>>2];a:{if(!p){break a}h=G[a+20>>2];f=p-1|0;b:{if(!f){break b}cb(c+240|4,0,(p<<2)-4|0);d=c+272|0;k=f&7;if(k){while(1){G[d+8>>2]=0;G[d+12>>2]=1072693248;f=f-1|0;d=d+8|0;i=i+1|0;if((k|0)!=(i|0)){continue}break}}if(p-2>>>0<7){break b}while(1){G[d+64>>2]=0;G[d+68>>2]=1072693248;G[d+56>>2]=0;G[d+60>>2]=1072693248;G[d+48>>2]=0;G[d+52>>2]=1072693248;G[d+40>>2]=0;G[d+44>>2]=1072693248;G[d+32>>2]=0;G[d+36>>2]=1072693248;G[d+24>>2]=0;G[d+28>>2]=1072693248;G[d+16>>2]=0;G[d+20>>2]=1072693248;G[d+8>>2]=0;G[d+12>>2]=1072693248;d=d- -64|0;f=f-8|0;if(f){continue}break}}d=G[a+24>>2];if(d){bb(c+208|0,h,d<<2)}d=(c+208|0)+(G[r>>2]<<2)|0;f=G[d>>2];if(!f){break a}G[d>>2]=f-1}td(c+192|0,L[g>>3]);G[j>>2]=0;G[j+4>>2]=1072693248;G[c+240>>2]=1;e=L[b>>3];L[c+272>>3]=e;k=G[c+200>>2];m=G[c+204>>2];n=G[c+192>>2];o=G[c+196>>2];a=G[a+8>>2];l=a-1|0;c:{if(!l){break c}h=j+8|0;g=g+8|0;d=0;if((p|0)>0){while(1){e=L[c+272>>3];L[h>>3]=e;td(c+16|0,e*L[g>>3]);Zc(c,n,o,k,m,G[c+16>>2],G[c+20>>2],G[c+24>>2],G[c+28>>2]);k=G[c+8>>2];m=G[c+12>>2];f=c+240|0;d=c+272|0;n=G[c>>2];o=G[c+4>>2];a=b;i=0;j=r;d:{while(1){e:{q=(c+208|0)+(G[j>>2]<<2)|0;s=G[q>>2];G[q>>2]=s-1;t=G[f>>2];if(s){break e}G[q>>2]=t;G[f>>2]=0;G[d>>2]=0;G[d+4>>2]=1072693248;j=j+4|0;a=a+8|0;d=d+8|0;f=f+4|0;i=i+1|0;if((p|0)!=(i|0)){continue}break d}break}G[f>>2]=t+1;e=L[a>>3]*L[d>>3];L[d>>3]=e;if(!i){break d}a=i-1|0;f=0;j=i&7;if(j){while(1){d=d-8|0;L[d>>3]=e;i=i-1|0;f=f+1|0;if((j|0)!=(f|0)){continue}break}}if(a>>>0<7){break d}while(1){L[d-16>>3]=e;L[d-8>>3]=e;L[d-24>>3]=e;L[d-32>>3]=e;L[d-40>>3]=e;L[d-48>>3]=e;L[d-56>>3]=e;d=d+-64|0;L[d>>3]=e;i=i-8|0;if(i){continue}break}}g=g+8|0;h=h+8|0;l=l-1|0;if(l){continue}break c}}b=l&3;if(b){while(1){L[h>>3]=e;td(c+176|0,e*L[g>>3]);Zc(c+160|0,n,o,k,m,G[c+176>>2],G[c+180>>2],G[c+184>>2],G[c+188>>2]);l=l-1|0;g=g+8|0;h=h+8|0;k=G[c+168>>2];m=G[c+172>>2];n=G[c+160>>2];o=G[c+164>>2];d=d+1|0;if((b|0)!=(d|0)){continue}break}}if(a-2>>>0<3){break c}while(1){L[h>>3]=e;td(c+144|0,e*L[g>>3]);Zc(c+80|0,n,o,k,m,G[c+144>>2],G[c+148>>2],G[c+152>>2],G[c+156>>2]);L[h+8>>3]=e;td(c+128|0,e*L[g+8>>3]);Zc(c- -64|0,G[c+80>>2],G[c+84>>2],G[c+88>>2],G[c+92>>2],G[c+128>>2],G[c+132>>2],G[c+136>>2],G[c+140>>2]);L[h+16>>3]=e;td(c+112|0,e*L[g+16>>3]);Zc(c+48|0,G[c+64>>2],G[c+68>>2],G[c+72>>2],G[c+76>>2],G[c+112>>2],G[c+116>>2],G[c+120>>2],G[c+124>>2]);L[h+24>>3]=e;td(c+96|0,e*L[g+24>>3]);Zc(c+32|0,G[c+48>>2],G[c+52>>2],G[c+56>>2],G[c+60>>2],G[c+96>>2],G[c+100>>2],G[c+104>>2],G[c+108>>2]);g=g+32|0;h=h+32|0;k=G[c+40>>2];m=G[c+44>>2];n=G[c+32>>2];o=G[c+36>>2];l=l-4|0;if(l){continue}break}}e=Ui(n,o,k,m);Fa=c+320|0;return e}function Xn(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=Fa-208|0;Fa=d;a:{if(G[c>>2]>0){break a}if(!H[a|0]){G[c>>2]=204;break a}i=d+112|0;g=Fa-96|0;Fa=g;b:{c:{d:{e:{f:{if(G[c>>2]<=0){f=67;g:{h=H[a|0];switch(h-39|0){case 0:break c;case 1:break e;default:break g}}h:{switch(h-70|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break d;case 0:case 14:break f;default:break h}}if(h){break d}G[c>>2]=204}f=H[d+207|0];break b}f=76;break c}f=88;break c}f=70;if(jb(a,46)){break c}if(jb(a,69)){break c}f=jb(a,68)?70:73}E[d+207|0]=f}i:{j:{switch((f&255)-70|0){case 3:if(G[c>>2]>0){break i}G[48624]=0;G[b>>2]=0;G[b+4>>2]=0;j=b,k=ti(a,g+92|0,10,-1,-1),G[j>>2]=k;G[b+4>>2]=Ia;if((H[G[g+92>>2]]|32)!=32){G[c>>2]=407}if(G[48624]!=68){break i}tb(5,qb(bb(g,66899,68),a,25));G[c>>2]=412;G[48624]=0;break i;case 0:me(a,d,c);break i;case 6:if(G[c>>2]>0){break i}G[d+12>>2]=H[a|0]==84;break i;default:break j}}fd(a,i,c)}Fa=g+96|0;f=403;k:{l:{m:{n:{o:{switch(H[d+207|0]-67|0){case 0:if((me(d+112|0,d,c)|0)>0){break m}f=412;e=L[d>>3];if(e>0x10000000000000000|e<-.49){break l}if(e<0x10000000000000000&e>=0){f=~~e>>>0;g=O(e)>=1?~~(e>0?Q(S(e*2.3283064365386963e-10),4294967295):T((e-+(~~e>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break n}f=0;g=0;break n;case 3:f=412;e=L[d>>3];if(e>0x10000000000000000|e<-.49){break l}if(e<0x10000000000000000&e>=0){f=~~e>>>0;g=O(e)>=1?~~(e>0?Q(S(e*2.3283064365386963e-10),4294967295):T((e-+(~~e>>>0>>>0))*2.3283064365386963e-10))>>>0:0;break n}f=0;g=0;break n;case 21:break l;case 9:break o;default:break m}}f=G[d+12>>2];g=f>>31}G[b>>2]=f;G[b+4>>2]=g}if(G[c>>2]>0){break k}break a}G[c>>2]=f}G[b>>2]=0;G[b+4>>2]=0;b=H[67242]|H[67243]<<8|(H[67244]<<16|H[67245]<<24);c=H[67238]|H[67239]<<8|(H[67240]<<16|H[67241]<<24);E[d+61|0]=c;E[d+62|0]=c>>>8;E[d+63|0]=c>>>16;E[d+64|0]=c>>>24;E[d+65|0]=b;E[d+66|0]=b>>>8;E[d+67|0]=b>>>16;E[d+68|0]=b>>>24;b=H[67237]|H[67238]<<8|(H[67239]<<16|H[67240]<<24);G[d+56>>2]=H[67233]|H[67234]<<8|(H[67235]<<16|H[67236]<<24);G[d+60>>2]=b;b=H[67229]|H[67230]<<8|(H[67231]<<16|H[67232]<<24);G[d+48>>2]=H[67225]|H[67226]<<8|(H[67227]<<16|H[67228]<<24);G[d+52>>2]=b;b=H[67221]|H[67222]<<8|(H[67223]<<16|H[67224]<<24);G[d+40>>2]=H[67217]|H[67218]<<8|(H[67219]<<16|H[67220]<<24);G[d+44>>2]=b;b=H[67213]|H[67214]<<8|(H[67215]<<16|H[67216]<<24);G[d+32>>2]=H[67209]|H[67210]<<8|(H[67211]<<16|H[67212]<<24);G[d+36>>2]=b;b=H[67205]|H[67206]<<8|(H[67207]<<16|H[67208]<<24);G[d+24>>2]=H[67201]|H[67202]<<8|(H[67203]<<16|H[67204]<<24);G[d+28>>2]=b;b=H[67197]|H[67198]<<8|(H[67199]<<16|H[67200]<<24);G[d+16>>2]=H[67193]|H[67194]<<8|(H[67195]<<16|H[67196]<<24);G[d+20>>2]=b;tb(5,qb(d+16|0,a,30))}Fa=d+208|0}function zn(a,b,c,d,e,f,g,h,i,j,k,l){var m=0,n=0,o=0,p=0,q=0,r=0;a:{b:{if(G[309737]<=0){m=(b-f)*h;f=(a-e)*g;a=i*.01745329252;o=ib(a);p=eb(a);c:{if(i==0){b=m;break c}b=m*p+f*o;f=f*p-o*m}r=H[j|0];i=d*.01745329252;m=ib(i);e=eb(i);if((r|0)!=45){break a}f=f*.01745329252;q=f*f;b=b*.01745329252;n=q+b*b;a=c*.01745329252;d:{e:{f:{switch(H[j+1|0]-65|0){case 2:if(H[j+2|0]!=65|H[j+3|0]!=82){break a}i=i+b;h=a+f;break d;case 19:if(H[j+2|0]!=65|H[j+3|0]!=78){break a}c=eb(a);d=ib(a);g=e*d+c*f-d*b*m;c=e*c-d*f-c*b*m;h=Db(g,c);i=Pd((b*e+m)/V(c*c+g*g));break d;case 18:g:{switch(H[j+2|0]-73|0){case 0:if(H[j+3|0]!=78){break a}if(n>1){break b}d=V(1-n);c=m*d+e*b;if(c>1|c<-1){break b}b=e*d-b*m;if(b==0&f==0){break b}i=fc(c);h=a+Db(f,b);break d;case 11:break g;default:break a}}if(H[j+3|0]!=71){break a}c=(4-n)/(n+4);if(O(c)>1){break b}d=c+1;c=c*m+e*b*d*.5;if(O(c)>1){break b}i=fc(c);c=eb(i);if(O(c)<1e-5){break b}f=f*d/(c+c);if(O(f)>1){break b}d=ib(i);f=fc(f);g=eb(f);h=e*c*g+(d*m+1);if(O(h)<1e-5){break b}c=d*e-m*c*g;h=a+(O((c+c)/h-b)>1e-5?3.141592653589795-f:f);break d;case 0:h:{switch(H[j+2|0]-73|0){case 9:if(H[j+3|0]!=67){break a}if(n>=9.869604401089369){break b}c=V(n);d=eb(c);h=1;if(c!=0){h=ib(c)/c}b=e*b*h+m*d;if(b>1|b<-1){break b}c=d-b*m;d=e*(f*h);if(c==0&d==0){break b}i=fc(b);h=a+Db(d,c);break d;case 0:break h;default:break a}}if(H[j+3|0]!=84){break a}c=g*p-o*h;c=c==0?.01745329252:c*.01745329252;d=c*.5;n=ib(d);d=eb(d);g=h*p+o*g;g=g==0?.01745329252:g*.01745329252;h=i+g;o=eb(h);p=ib(h);if(f==0){h=a;if(b==0){break d}}d=c*V((e*d+1)*.5);c=(e+e)*n;c=d/(c==0?1:c);e=V((e+1)*.5);d=p/V((o+1)*.5)-m/e;d=g/(d==0?1:d);e=m*d/e+b;b=e/d;b=4-q/(c*(c*4))-b*b;if(b>4|b<2){break b}b=V(b)*.5;d=e*b/d;if(O(d)>1){break b}i=fc(d);d=eb(i);if(O(d)<1e-5){break b}b=f*b/((c+c)*d);if(O(b)>1){break b}b=fc(b);h=b+b+a;break d;case 13:if(H[j+2|0]!=67|H[j+3|0]!=80){break a}b=e-b*m;if(b==0){break b}h=a+Db(f,b);c=eb(h-a);if(c==0){break b}b=b/c;if(b>1|b<-1){break b}j=i<0;i=Sc(b);if(!j){break d}i=-i;break d;case 6:if(H[j+2|0]!=76|H[j+3|0]!=83){break a}i=i+b;if(O(i)>1.5707963267948974){break b}b=eb(i);if(O(f)>b*6.28318530717959*.5){break b}if(b>1e-5){break e}h=a;break d;case 12:break f;default:break a}}if(H[j+2|0]!=69|H[j+3|0]!=82){break a}c=(d*.5+45)*.01745329252;d=Mc(c);g=h*p+o*g;g=g==0?1:g;i=oc(Mc(g*.5*.01745329252+c));c=oc(d);h=a+f/(e<=0?1:e);if(O(h-a)>6.28318530717959){break b}d=g*.01745329252/(i-c);if(d!=0){b=(b+c*d)/d}else{b=0}b=Pd(af(b));i=b+b+-1.5707963267948974;break d}h=a+f/b}b=h-a>3.141592653589795?h+-6.28318530717959:h;a=b-a<-3.141592653589795?b+6.28318530717959:b;L[k>>3]=(a<0?a+6.28318530717959:a)/.01745329252;L[l>>3]=i/.01745329252}return}G[309737]=501;return}G[309737]=504} -function lp(a,b,c){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;if((c|0)>=0){j=I[b+2>>1];g=j?4:3;e=j?7:138;i=a+5817|0;h=-1;while(1){o=n;k=j;n=n+1|0;j=I[((n<<2)+b|0)+2>>1];d=f+1|0;a:{if(!((k|0)!=(j|0)|(e|0)<=(d|0))){f=d;break a}b:{if((d|0)<(g|0)){f=(k<<2)+a|0;g=f+2686|0;h=f+2684|0;f=G[a+5820>>2];while(1){e=I[g>>1];l=I[h>>1];m=I[a+5816>>1]|l<>1]=m;c:{if((16-e|0)<(f|0)){f=G[a+20>>2];G[a+20>>2]=f+1;E[f+G[a+8>>2]|0]=m;f=G[a+20>>2];G[a+20>>2]=f+1;E[f+G[a+8>>2]|0]=H[i|0];f=G[a+5820>>2];F[a+5816>>1]=l>>>16-f;f=(e+f|0)-16|0;break c}f=e+f|0}G[a+5820>>2]=f;d=d-1|0;if(d){continue}break}break b}m=a;d:{if(k){e:{if((h|0)==(k|0)){e=G[a+5820>>2];f=d;break e}d=(k<<2)+a|0;e=I[d+2686>>1];h=I[d+2684>>1];g=G[a+5820>>2];l=I[a+5816>>1]|h<>1]=l;f:{if((g|0)>(16-e|0)){g=G[a+20>>2];G[a+20>>2]=g+1;E[g+G[a+8>>2]|0]=l;g=G[a+20>>2];G[a+20>>2]=g+1;E[g+G[a+8>>2]|0]=H[i|0];g=G[a+5820>>2];F[a+5816>>1]=h>>>16-g;d=(e+g|0)-16|0;break f}d=e+g|0}e=d;G[a+5820>>2]=e}h=I[a+2748>>1];d=I[a+5816>>1]|h<>1];g:{if((16-g|0)<(e|0)){F[a+5816>>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=G[a+5820>>2];e=(d+g|0)-16|0;d=h>>>16-d|0;break g}e=e+g|0}G[a+5820>>2]=e;f=f+65533|0;if((e|0)>=15){d=f<>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=f&65535;f=G[a+5820>>2];F[a+5816>>1]=d>>>16-f;f=f-14|0;break d}F[a+5816>>1]=f<>1];e=G[a+5820>>2];d=I[a+5816>>1]|h<>1];h:{if((e|0)>(16-g|0)){F[a+5816>>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=G[a+5820>>2];e=(d+g|0)-16|0;d=h>>>16-d|0;break h}e=e+g|0}G[a+5820>>2]=e;f=f+65534|0;if((e|0)>=14){d=f<>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=f&65535;f=G[a+5820>>2];F[a+5816>>1]=d>>>16-f;f=f-13|0;break d}F[a+5816>>1]=f<>1];e=G[a+5820>>2];d=I[a+5816>>1]|h<>1];i:{if((e|0)>(16-g|0)){F[a+5816>>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=G[a+5820>>2];e=(d+g|0)-16|0;d=h>>>16-d|0;break i}e=e+g|0}G[a+5820>>2]=e;f=f+65526|0;if((e|0)>=10){d=f<>1]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[i|0];d=f&65535;f=G[a+5820>>2];F[a+5816>>1]=d>>>16-f;f=f-9|0;break d}F[a+5816>>1]=f<>2]=f}f=0;j:{if(!j){e=138;d=3;break j}d=(k|0)==(j|0);e=d?6:7;d=d?3:4}g=d;h=k}if((c|0)!=(o|0)){continue}break}}}function Sb(a,b){var 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;c=E[b|0];if(!c){return a}a=jb(a,c);a:{if(!a){break a}if(!H[b+1|0]){return a}if(!H[a+1|0]){break a}if(!H[b+2|0]){c=H[a+1|0];e=(c|0)!=0;b:{if(!c){break b}c=c|H[a|0]<<8;h=H[b+1|0]|H[b|0]<<8;if((c|0)==(h|0)){break b}b=a+1|0;while(1){a=b;d=H[a+1|0];e=(d|0)!=0;if(!d){break b}b=a+1|0;c=d|c<<8&65280;if((h|0)!=(c|0)){continue}break}}return e?a:0}if(!H[a+2|0]){break a}if(!H[b+3|0]){d=b;b=a+2|0;c=H[a+2|0];e=(c|0)!=0;c:{d:{if(!c){break d}c=H[a+1|0]<<16|H[a|0]<<24|c<<8;h=H[d+1|0]<<16|H[d|0]<<24|H[d+2|0]<<8;if((c|0)==(h|0)){break d}while(1){a=b+1|0;d=H[b+1|0];e=(d|0)!=0;if(!d){break c}b=a;c=(c|d)<<8;if((h|0)!=(c|0)){continue}break}break c}a=b}return e?a-2|0:0}if(!H[a+3|0]){break a}if(!H[b+4|0]){d=b;b=a+3|0;c=H[a+3|0];e=(c|0)!=0;e:{f:{if(!c){break f}c=c|(H[a+1|0]<<16|H[a|0]<<24|H[a+2|0]<<8);a=H[d|0]|H[d+1|0]<<8|(H[d+2|0]<<16|H[d+3|0]<<24);h=a<<24|a<<8&16711680|(a>>>8&65280|a>>>24);if((c|0)==(h|0)){break f}while(1){a=b+1|0;d=H[b+1|0];e=(d|0)!=0;if(!d){break e}b=a;c=d|c<<8;if((h|0)!=(c|0)){continue}break}break e}a=b}return e?a-3|0:0}h=a;i=Fa-1056|0;Fa=i;a=i+1048|0;G[a>>2]=0;G[a+4>>2]=0;a=i+1040|0;G[a>>2]=0;G[a+4>>2]=0;G[i+1032>>2]=0;G[i+1036>>2]=0;G[i+1024>>2]=0;G[i+1028>>2]=0;k=b;g:{h:{i:{j:{c=H[b|0];k:{if(!c){j=-1;a=1;break k}while(1){if(!H[f+h|0]){break h}a=c&255;f=f+1|0;G[(a<<2)+i>>2]=f;a=(i+1024|0)+(a>>>3&28)|0;G[a>>2]=G[a>>2]|1<>>0>1){break j}}g=-1;d=1;break i}b=1;c=1;while(1){g=H[(c+j|0)+k|0];e=H[a+k|0];l:{if((g|0)==(e|0)){if((b|0)==(c|0)){d=b+d|0;c=1;break l}c=c+1|0;break l}if(e>>>0>>0){b=a-j|0;d=a;c=1;break l}j=d;d=d+1|0;b=1;c=1}a=c+d|0;if(f>>>0>a>>>0){continue}break}d=1;g=-1;if(f>>>0<=1){a=b;break i}a=0;e=1;c=1;while(1){m=H[(c+g|0)+k|0];l=H[d+k|0];m:{if((m|0)==(l|0)){if((c|0)==(e|0)){a=a+e|0;c=1;break m}c=c+1|0;break m}if(l>>>0>m>>>0){e=d-g|0;a=d;c=1;break m}g=a;a=a+1|0;e=1;c=1}d=a+c|0;if(f>>>0>d>>>0){continue}break}a=b;d=e}b=a;a=g+1>>>0>j+1>>>0;e=a?d:b;l=a?g:j;m=l+1|0;n:{if(nb(k,e+k|0,m)){a=(l^-1)+f|0;e=(a>>>0>>0?l:a)+1|0;b=0;break n}b=f-e|0}o=f-1|0;n=f|63;g=0;a=h;while(1){o:{if(h-a>>>0>=f>>>0){break o}c=Vi(h,0,n);if(c){h=c;if(c-a>>>0>>0){break h}break o}h=h+n|0}d=H[a+o|0];c=f;p:{q:{if(!(G[(i+1024|0)+(d>>>3&28)>>2]>>>d&1)){break q}c=G[(d<<2)+i>>2];if((c|0)!=(f|0)){c=f-c|0;c=c>>>0>g>>>0?c:g;break q}r:{c=m;d=c>>>0>g>>>0?c:g;j=H[k+d|0];if(j){while(1){if(H[a+d|0]!=(j&255)){break r}d=d+1|0;j=H[k+d|0];if(j){continue}break}}while(1){if(c>>>0<=g>>>0){break g}c=c-1|0;if(H[k+c|0]==H[a+c|0]){continue}break}c=e;g=b;break p}c=d-l|0}g=0}a=a+c|0;continue}}a=0}Fa=i+1056|0;d=a}return d}function vm(a,b,c,d,e){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;g=L[a+288>>3]*c+L[a+280>>3];v=d;f=L[a+1088>>3]*b+L[a+1080>>3];d=G[a+276>>2];a:{if((d|0)==1){break a}g=L[a+296>>3]*b+g;f=L[a+1096>>3]*c+f;if((d|0)==2){break a}h=b*b;i=c*c;l=V(h+i);g=L[a+304>>3]*l+g;f=L[a+1104>>3]*l+f;if((d|0)==3){break a}g=L[a+312>>3]*i+g;f=L[a+1112>>3]*h+f;if((d|0)==4){break a}j=b*c;g=L[a+320>>3]*j+g;f=L[a+1120>>3]*j+f;if((d|0)==5){break a}g=L[a+328>>3]*h+g;f=L[a+1128>>3]*i+f;if((d|0)==6){break a}j=i*c;g=L[a+336>>3]*j+g;k=h*b;f=L[a+1136>>3]*k+f;if((d|0)==7){break a}g=i*L[a+344>>3]*b+g;f=h*L[a+1144>>3]*c+f;if((d|0)==8){break a}g=L[a+352>>3]*c*h+g;f=L[a+1152>>3]*b*i+f;if((d|0)==9){break a}g=L[a+360>>3]*k+g;f=L[a+1160>>3]*j+f;if((d|0)==10){break a}m=l*(l*l);g=L[a+368>>3]*m+g;f=L[a+1168>>3]*m+f;if((d|0)==11){break a}n=i*i;g=L[a+376>>3]*n+g;o=h*h;f=L[a+1176>>3]*o+f;if((d|0)==12){break a}g=j*L[a+384>>3]*b+g;f=k*L[a+1184>>3]*c+f;if((d|0)==13){break a}g=h*L[a+392>>3]*i+g;f=h*L[a+1192>>3]*i+f;if((d|0)==14){break a}g=L[a+400>>3]*c*k+g;f=L[a+1200>>3]*b*j+f;if((d|0)==15){break a}g=L[a+408>>3]*o+g;f=L[a+1208>>3]*n+f;if((d|0)==16){break a}p=n*c;g=L[a+416>>3]*p+g;q=o*b;f=L[a+1216>>3]*q+f;if((d|0)==17){break a}g=n*L[a+424>>3]*b+g;f=o*L[a+1224>>3]*c+f;if((d|0)==18){break a}g=j*L[a+432>>3]*h+g;f=k*L[a+1232>>3]*i+f;if((d|0)==19){break a}g=i*L[a+440>>3]*k+g;f=h*L[a+1240>>3]*j+f;if((d|0)==20){break a}g=L[a+448>>3]*c*o+g;f=L[a+1248>>3]*b*n+f;if((d|0)==21){break a}g=L[a+456>>3]*q+g;f=L[a+1256>>3]*p+f;if((d|0)==22){break a}s=l*(l*m);g=L[a+464>>3]*s+g;f=L[a+1264>>3]*s+f;if((d|0)==23){break a}m=p*c;g=L[a+472>>3]*m+g;r=q*b;f=L[a+1272>>3]*r+f;if((d|0)==24){break a}g=p*L[a+480>>3]*b+g;f=q*L[a+1280>>3]*c+f;if((d|0)==25){break a}g=n*L[a+488>>3]*h+g;f=o*L[a+1288>>3]*i+f;if((d|0)==26){break a}g=j*L[a+496>>3]*k+g;f=k*L[a+1296>>3]*j+f;if((d|0)==27){break a}g=i*L[a+504>>3]*o+g;f=h*L[a+1304>>3]*n+f;if((d|0)==28){break a}g=L[a+512>>3]*c*q+g;f=L[a+1312>>3]*b*p+f;if((d|0)==29){break a}g=L[a+520>>3]*r+g;f=L[a+1320>>3]*m+f;if((d|0)==30){break a}t=m*c;g=L[a+528>>3]*t+g;u=r*b;f=L[a+1328>>3]*u+f;if((d|0)==31){break a}g=m*L[a+536>>3]*b+g;f=r*L[a+1336>>3]*c+f;if((d|0)==32){break a}g=p*L[a+544>>3]*h+g;f=q*L[a+1344>>3]*i+f;if((d|0)==33){break a}g=n*L[a+552>>3]*k+g;f=o*L[a+1352>>3]*j+f;if((d|0)==34){break a}g=j*L[a+560>>3]*o+g;f=k*L[a+1360>>3]*n+f;if((d|0)==35){break a}g=i*L[a+568>>3]*q+g;f=h*L[a+1368>>3]*p+f;if((d|0)==36){break a}g=L[a+576>>3]*c*r+g;b=L[a+1376>>3]*b*m+f;f=b;if((d|0)==37){break a}g=L[a+584>>3]*u+g;b=L[a+1384>>3]*t+b;f=b;if((d|0)==38){break a}c=l*(l*s);g=L[a+592>>3]*c+g;f=L[a+1392>>3]*c+b}L[v>>3]=f;L[e>>3]=g}function Es(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;o=G[a+16>>2];b=G[a+8>>2]+M(c,168)|0;f=+G[a+24>>2];g=k-f;k=+G[a+32>>2];g=g/k+1;i=(i-f)/k+1;l=g>i;f=l?g:i;q=f+.5;a:{if(O(q)<2147483648){m=~~q;break a}m=-2147483648}L[b+16>>3]=m|0;g=l?i:g;i=g+.5;b:{if(O(i)<2147483648){m=~~i;break b}m=-2147483648}L[b+8>>3]=m|0;s=b,t=lb(G[a+48>>2]+1|0,4),G[s+24>>2]=t;Pf(a,c,d,e);i=h;h=+(o|0);i=(i-h)/k+1;h=(j-h)/k+1;k=l?i:h;h=l?h:i;i=g-f;c:{if(O(i)<=1e-15){b=G[(G[a+8>>2]+M(c,168)|0)+24>>2];l=G[a+48>>2];n=G[a+44>>2];p=lb(1,8);f=h>k?k:h;d:{if(O(f)<2147483648){m=~~f;break d}m=-2147483648}G[p+4>>2]=m;if(O(g)<2147483648){o=~~g}else{o=-2147483648}e:{if(!b){break e}n=(o|0)<(n|0)?n:o;n=(l|0)>(n|0)?n:l;l=b+(n<<2)|0;b=G[l>>2];f:{if(!b){b=0;break f}if((m|0)>2]){break f}while(1){l=b;b=G[b>>2];if(!b){b=0;break f}if((m|0)>G[b+4>>2]){continue}break}}G[p>>2]=b;G[l>>2]=p;if((e|0)==1){break e}if(d){b=n<<2;l=b+G[a+56>>2]|0;if((m|0)<=G[l>>2]){n=l;l=G[a+36>>2];G[n>>2]=(l|0)>(m|0)?l:m}b=b+G[a+60>>2]|0;if((m|0)>2]){break e}l=b;b=G[a+40>>2];G[l>>2]=(b|0)<(m|0)?b:m;break e}b=n<<2;G[b+G[a+56>>2]>>2]=G[a+36>>2];G[b+G[a+60>>2]>>2]=G[a+40>>2]}b=G[(G[a+8>>2]+M(c,168)|0)+24>>2];c=G[a+48>>2];m=G[a+44>>2];n=lb(1,8);f=h>2]=l;if(!b){break c}m=(m|0)>(o|0)?m:o;m=(c|0)>(m|0)?m:c;c=b+(m<<2)|0;b=G[c>>2];h:{if(!b){b=0;break h}if((l|0)>2]){break h}while(1){c=b;b=G[b>>2];if(!b){b=0;break h}if((l|0)>G[b+4>>2]){continue}break}}G[n>>2]=b;G[c>>2]=n;if((e|0)==1){break c}if(d){b=m<<2;c=b+G[a+56>>2]|0;if((l|0)<=G[c>>2]){d=c;c=G[a+36>>2];G[d>>2]=(c|0)>(l|0)?c:l}b=b+G[a+60>>2]|0;if((l|0)>2]){break c}a=G[a+40>>2];G[b>>2]=(a|0)<(l|0)?a:l;return}b=m<<2;G[b+G[a+56>>2]>>2]=G[a+36>>2];G[b+G[a+60>>2]>>2]=G[a+40>>2];return}if(O(g)<2147483648){l=~~g}else{l=-2147483648}if(!(+(l|0)<=f)){break c}p=M(c,168);if(!G[(p+G[a+8>>2]|0)+24>>2]){break c}g=(k-h)/i;while(1){b=G[(p+G[a+8>>2]|0)+24>>2];c=G[a+48>>2];o=G[a+44>>2];n=lb(1,8);if(O(k)<2147483648){m=~~k}else{m=-2147483648}G[n+4>>2]=m;i:{if(!b){break i}r=b;b=(l|0)<(o|0)?o:l;o=((b|0)<(c|0)?b:c)<<2;c=r+o|0;b=G[c>>2];j:{if(!b){b=0;break j}if((m|0)>2]){break j}while(1){c=b;b=G[b>>2];if(!b){b=0;break j}if((m|0)>G[b+4>>2]){continue}break}}G[n>>2]=b;G[c>>2]=n;if((e|0)==1){break i}if(d){b=o+G[a+56>>2]|0;if((m|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(m|0)?b:m}b=o+G[a+60>>2]|0;if((m|0)>2]){break i}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(m|0)?b:m;break i}G[o+G[a+56>>2]>>2]=G[a+36>>2];G[o+G[a+60>>2]>>2]=G[a+40>>2]}k=g+k;l=l+1|0;if(f>=+(l|0)){continue}break}}}function yt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0;d=Fa-1040|0;Fa=d;a:{b:{if(!ce(b,0,d+1036|0)){break b}if(Va(b)>>>0>1020){break a}g=Za(d,b);e=Va(b)+b|0;E[e|0]=46;E[e+1|0]=103;E[e+2|0]=122;E[e+3|0]=0;if(!ce(b,0,d+1036|0)){break b}b=Za(b,g);e=Va(b)+b|0;f=H[32688]|H[32689]<<8;E[e|0]=f;E[e+1|0]=f>>>8;E[e+2|0]=H[32690];if(!ce(b,0,d+1036|0)){break b}b=Za(b,g);e=Va(b)+b|0;f=H[2803]|H[2804]<<8;E[e|0]=f;E[e+1|0]=f>>>8;E[e+2|0]=H[2805];if(!ce(b,0,d+1036|0)){break b}e=Za(b,g);b=Va(e)+e|0;f=H[13365]|H[13366]<<8|(H[13367]<<16|H[13368]<<24);E[b|0]=f;E[b+1|0]=f>>>8;E[b+2|0]=f>>>16;E[b+3|0]=f>>>24;E[b+4|0]=H[13369];if(!ce(e,0,d+1036|0)){break b}b=Za(e,g);e=Va(b)+b|0;f=H[2806]|H[2807]<<8;E[e|0]=f;E[e+1|0]=f>>>8;E[e+2|0]=H[2808];if(!ce(b,0,d+1036|0)){break b}b=Za(b,g);e=Va(b)+b|0;E[e|0]=45;E[e+1|0]=103;E[e+2|0]=122;E[e+3|0]=0;if(!ce(b,0,d+1036|0)){break b}Za(b,g);break a}b=G[d+1036>>2];g=zc(d+1034|0,1,2,b);Hb(b);if((g|0)!=2){break a}if((H[d+1034|0]|H[d+1035|0]<<8)==35615){h=1;break a}if((H[d+1034|0]|H[d+1035|0]<<8)==19280){h=1;break a}if((H[d+1034|0]|H[d+1035|0]<<8)==7711){h=1;break a}h=1;if((H[d+1034|0]|H[d+1035|0]<<8)==40223){break a}h=(H[d+1034|0]|H[d+1035|0]<<8)==40991}Fa=d+1040|0;b=H[c|0];if(h){if(b){if(!fb(c,37360,4)){b=H[42077]|H[42078]<<8|(H[42079]<<16|H[42080]<<24);c=H[42073]|H[42074]<<8|(H[42075]<<16|H[42076]<<24);E[a+7|0]=c;E[a+8|0]=c>>>8;E[a+9|0]=c>>>16;E[a+10|0]=c>>>24;E[a+11|0]=b;E[a+12|0]=b>>>8;E[a+13|0]=b>>>16;E[a+14|0]=b>>>24;b=H[42070]|H[42071]<<8|(H[42072]<<16|H[42073]<<24);c=H[42066]|H[42067]<<8|(H[42068]<<16|H[42069]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;E[442496]=0;return 0}b=H[42153]|H[42154]<<8|(H[42155]<<16|H[42156]<<24);d=H[42149]|H[42150]<<8|(H[42151]<<16|H[42152]<<24);E[a+8|0]=d;E[a+9|0]=d>>>8;E[a+10|0]=d>>>16;E[a+11|0]=d>>>24;E[a+12|0]=b;E[a+13|0]=b>>>8;E[a+14|0]=b>>>16;E[a+15|0]=b>>>24;b=H[42145]|H[42146]<<8|(H[42147]<<16|H[42148]<<24);d=H[42141]|H[42142]<<8|(H[42143]<<16|H[42144]<<24);E[a|0]=d;E[a+1|0]=d>>>8;E[a+2|0]=d>>>16;E[a+3|0]=d>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;if(!fb(c,42185,7)){Za(442496,c+7|0);return 0}Za(442496,c);return 0}b=H[42021]|H[42022]<<8|(H[42023]<<16|H[42024]<<24);E[a+8|0]=b;E[a+9|0]=b>>>8;E[a+10|0]=b>>>16;E[a+11|0]=b>>>24;b=H[42017]|H[42018]<<8|(H[42019]<<16|H[42020]<<24);c=H[42013]|H[42014]<<8|(H[42015]<<16|H[42016]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;E[442496]=0;return 0}if(b){E[442496]=0;qb(442496,c,1024)}return 0}function tf(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;var 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;if(j==k){Gj(a,c,c,d,e,l,l,h,i,j);return}f=k;k=+G[a+32>>2];f=f/k;t=(i-+G[a+24>>2])/k+1;if(l>=360){while(1){l=l+-360;if(l>=360){continue}break}}u=G[a+16>>2];l=l/180*3.141592653589793;g=eb(l);i=j/k;j=ib(l);l=O(i*j)+O(f*g);q=f>i?f:i;q=l(o|0)){s=G[a+8>>2];m=G[a+44>>2];L[(s+M(c,168)|0)+8>>3]=((m|0)>(o|0)?m:o)|0;m=G[a+48>>2];o=(p|0)>(m|0);b=o?m:b;b=o?b:r?n:b;break c}m=G[a+48>>2];p=(p|0)>(m|0);s=G[a+8>>2];b=p?m:b;L[(s+M(c,168)|0)+8>>3]=(p?b:r?n:b)|0;b=G[a+44>>2];b=(b|0)>(o|0)?b:o}o=M(c,168);n=o+s|0;L[n+16>>3]=b|0;r=lb(m+1|0,4);G[n+24>>2]=r;Pf(a,c,d,e);b=o+G[a+8>>2]|0;q=L[b+16>>3];l=L[b+8>>3];d:{if(O(l)<2147483648){o=~~l;break d}o=-2147483648}l=+(o|0);if(q>=l){q=(h-+(u|0))/k+1;k=j*j;h=i*i;i=g*g;f=f*f;v=k/h+i/f;w=(j+j)*(g/h-g/f);g=i/h+k/f;x=g*-4;u=O(g)<=1e-15;y=M(c,168);while(1){f=l-t;h=v*f*f+-1;f=w*f;e:{f:{g:{h:{if(u){if(O(f)<=1e-15){break e}j=-h/f;break h}i=f*f+x*h;if(i>0){j=h;h=V(i);f=(f+(f<0?-h:h))*-.5;j=j/f;k=j;l=f/g;if(l>j){break g}break f}if(!(O(i)<=1e-15)){break e}j=f*-.5/g}l=j}k=l;l=j}c=G[a+48>>2];p=G[a+44>>2];s=lb(1,8);f=q+l;i:{if(O(f)<2147483648){m=~~f;break i}m=-2147483648}n=m+1|0;G[s+4>>2]=n;j:{if(!r){break j}b=(p|0)>(o|0)?p:o;p=((b|0)<(c|0)?b:c)<<2;b=p+r|0;c=G[b>>2];k:{if(!c){c=0;break k}if((n|0)>2]){break k}while(1){b=c;c=G[b>>2];if(!c){c=0;break k}if((m|0)>=G[c+4>>2]){continue}break}}G[s>>2]=c;G[b>>2]=s;if((e|0)==1){break j}if(d){b=p+G[a+56>>2]|0;if((m|0)>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(n|0)?b:n}b=p+G[a+60>>2]|0;if((n|0)>2]){break j}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(n|0)?b:n;break j}G[p+G[a+56>>2]>>2]=G[a+36>>2];G[p+G[a+60>>2]>>2]=G[a+40>>2]}c=G[a+48>>2];n=G[a+44>>2];p=lb(1,8);f=q+k;l:{if(O(f)<2147483648){b=~~f;break l}b=-2147483648}m=b-(f==+(b|0))|0;G[p+4>>2]=m;if(!r){break e}b=(n|0)>(o|0)?n:o;n=((b|0)<(c|0)?b:c)<<2;b=n+r|0;c=G[b>>2];m:{if(!c){c=0;break m}if((m|0)>2]){break m}while(1){b=c;c=G[b>>2];if(!c){c=0;break m}if((m|0)>G[c+4>>2]){continue}break}}G[p>>2]=c;G[b>>2]=p;if((e|0)==1){break e}if(d){b=n+G[a+56>>2]|0;if((m|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(m|0)?b:m}b=n+G[a+60>>2]|0;if((m|0)>2]){break e}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(m|0)?b:m;break e}G[n+G[a+56>>2]>>2]=G[a+36>>2];G[n+G[a+60>>2]>>2]=G[a+40>>2]}o=o+1|0;l=+(o|0);if(l<=L[(G[a+8>>2]+y|0)+16>>3]){continue}break}}}function Hk(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;x=G[l+80>>2];c:{if((x|0)<=0){d:{if((x|0)>=0){break d}if((Ff(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;n=m-1|0;l=l-!m|0;s=x-1>>>0<4294967213;m=s;if((m&63)>>>0>=32){l=n<>>32-m|l<>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(L[(r<<3)+i>>3]==j){l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0;break e}if(e|f){l=s+(o-((e>>>0>r>>>0)+f|0)|0)|0;p=m+(r-e|0)|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;w=l;v=t+1|0;l=v?l:l+1|0;y=l;l=Au(q,n,t,w);if((Og(a,b,v,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}s=G[l+92>>2];n=G[l+88>>2];l=x>>>0>82;m=l;if((l&63)>>>0>=32){l=n<>>32-m|s<>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(L[(r<<3)+i>>3]!=j){if(e|f){l=s+(o-((e>>>0>r>>>0)+f|0)|0)|0;p=m+(r-e|0)|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;w=l;v=t+1|0;l=v?l:l+1|0;y=l;l=Au(q,n,t,w);if((Og(a,b,v,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=s+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;p=m+w|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;v=l;z=t+1|0;l=z?l:l+1|0;y=l;l=Au(q,n,t,v);if((Ff(a,b,z,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,c,d,(w<<3)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((x|0)<=0){break h}e=a;l=s+(h-((c>>>0>g>>>0)+d|0)|0)|0;o=g-c|0;a=m+o|0;l=a>>>0>>0?l+1|0:l;f=l;g=Bu(a-1|0,l-!a|0,q,n);l=Ia;h=l;m=b;b=g+1|0;l=b?l:l+1|0;u=b;b=Au(q,n,g,h);Ff(e,m,u,l,a-b|0,f-(Ia+(a>>>0>>0)|0)|0,c,d,(o<<3)+i|0,k);break h}if(!(e|f)){break h}c=a;l=s+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,q,n);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;o=b;b=Au(g,h,q,n);Og(c,i,o,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Dk(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;x=G[l+80>>2];c:{if((x|0)<=0){d:{if((x|0)>=0){break d}if((Kg(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;n=m-1|0;l=l-!m|0;s=x-1>>>0<4294967213;m=s;if((m&63)>>>0>=32){l=n<>>32-m|l<>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(K[(r<<2)+i>>2]==j){l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0;break e}if(e|f){l=s+(o-((e>>>0>r>>>0)+f|0)|0)|0;p=m+(r-e|0)|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;w=l;v=t+1|0;l=v?l:l+1|0;y=l;l=Au(q,n,t,w);if((Og(a,b,v,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}s=G[l+92>>2];n=G[l+88>>2];l=x>>>0>82;m=l;if((l&63)>>>0>=32){l=n<>>32-m|s<>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(K[(r<<2)+i>>2]!=j){if(e|f){l=s+(o-((e>>>0>r>>>0)+f|0)|0)|0;p=m+(r-e|0)|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;w=l;v=t+1|0;l=v?l:l+1|0;y=l;l=Au(q,n,t,w);if((Og(a,b,v,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=s+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;p=m+w|0;l=p>>>0>>0?l+1|0:l;u=l;t=Bu(p-1|0,l-!p|0,q,n);l=Ia;v=l;z=t+1|0;l=z?l:l+1|0;y=l;l=Au(q,n,t,v);if((Kg(a,b,z,y,p-l|0,u-(Ia+(l>>>0>p>>>0)|0)|0,c,d,(w<<2)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((x|0)<=0){break h}e=a;l=s+(h-((c>>>0>g>>>0)+d|0)|0)|0;o=g-c|0;a=m+o|0;l=a>>>0>>0?l+1|0:l;f=l;g=Bu(a-1|0,l-!a|0,q,n);l=Ia;h=l;m=b;b=g+1|0;l=b?l:l+1|0;u=b;b=Au(q,n,g,h);Kg(e,m,u,l,a-b|0,f-(Ia+(a>>>0>>0)|0)|0,c,d,(o<<2)+i|0,k);break h}if(!(e|f)){break h}c=a;l=s+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,q,n);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;o=b;b=Au(g,h,q,n);Og(c,i,o,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Xt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=a;a=0;g=Fa-16|0;Fa=g;F[g+8>>1]=0;G[g>>2]=0;G[g+4>>2]=0;a:{if(!b){break a}f=9;d=H[b|0];if(d){while(1){a=0;b:{c:{d:{e:{f:{d=d<<24>>24;switch(d-114|0){case 0:break b;case 1:break e;case 5:break f;default:break d}}a=1;break b}h=1;break c}a=d-48|0;f=a>>>0<10?a:f}a=e}d=H[b+1|0];b=b+1|0;e=a;if(d){continue}break}}b=Va(g)+g|0;e=a?119:114;E[b|0]=e;E[b+1|0]=e>>>8;b=Va(g)+g|0;E[b|0]=98;E[b+1|0]=0;if(H[c|0]?c:0){b=ac(c,g)}else{b=G[(a?119052:120240)>>2]}if(!b){d=0;break a}g:{h:{if(a){if(G[b+76>>2]<0){a=G[b>>2]}else{a=G[b>>2]}if(a>>>5&1){break g}d=ab(5068);if(!d){break g}E[d+5064|0]=0;G[d+5004>>2]=0;E[d+5008|0]=1;G[d>>2]=b;a=d+5056|0;G[a>>2]=0;G[a+4>>2]=0;a=d+5048|0;G[a>>2]=0;G[a+4>>2]=0;c=d+5012|0;a=(f|0)>1?f:1;f=a>>>0<9?a:9;e=-2;i:{if(!c|f-10>>>0<4294967287){break i}a=G[c+36>>2];if(!a){G[c+36>>2]=174;a=174}if(!G[c+40>>2]){G[c+40>>2]=175}a=Ja[a|0](G[c+44>>2],55728,1)|0;e=-3;if(!a){break i}G[a+24>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;G[a>>2]=c;e=M(f,4e5);j=a,k=Ja[G[c+36>>2]](G[c+44>>2],e,1)|0,G[j+16>>2]=k;j=a,k=Ja[G[c+36>>2]](G[c+44>>2],e+136|0,1)|0,G[j+20>>2]=k;e=Ja[G[c+36>>2]](G[c+44>>2],262148,1)|0;G[a+24>>2]=e;j:{h=G[a+16>>2];if(h){i=G[a+20>>2];if(e?i:0){break j}Ja[G[c+40>>2]](G[c+44>>2],h)}e=G[a+20>>2];if(e){Ja[G[c+40>>2]](G[c+44>>2],e)}e=G[a+24>>2];if(e){Ja[G[c+40>>2]](G[c+44>>2],e)}Ja[G[c+40>>2]](G[c+44>>2],a);e=-3;break i}G[a+624>>2]=f;G[a+612>>2]=0;G[a+4>>2]=2;G[a+8>>2]=2;G[a+616>>2]=0;G[a+48>>2]=30;G[a+44>>2]=0;G[a+40>>2]=h;G[a+36>>2]=i;G[a+32>>2]=h;G[a+72>>2]=M(f,1e5)-19;G[c+8>>2]=0;G[c+12>>2]=0;G[c+24>>2]=0;G[c+28>>2]=0;G[c+32>>2]=a;G[a+608>>2]=-1;G[a+76>>2]=0;G[a+80>>2]=0;G[a+68>>2]=0;G[a+52>>2]=256;G[a+56>>2]=0;cb(a+88|0,0,256);G[a+620>>2]=1;e=0}if(e){break h}E[d+5064|0]=1;G[d+5016>>2]=0;break a}if(G[b+76>>2]<0){a=G[b>>2]}else{a=G[b>>2]}if(a>>>5&1){break g}d=ab(5068);if(!d){break g}E[d+5064|0]=0;E[d+5008|0]=0;G[d+5004>>2]=0;G[d>>2]=b;a=d+5056|0;G[a>>2]=0;G[a+4>>2]=0;a=d+5048|0;G[a>>2]=0;G[a+4>>2]=0;a=-2;f=d+5012|0;k:{if(!(!f|h>>>0>1)){a=G[f+36>>2];if(!a){G[f+36>>2]=174;a=174}if(!G[f+40>>2]){G[f+40>>2]=175}c=Ja[a|0](G[f+44>>2],64116,1)|0;a=-3;if(!c){break k}G[c>>2]=f;G[f+32>>2]=c;G[c+4>>2]=10;G[c+3172>>2]=0;G[c+28>>2]=0;G[c+32>>2]=0;G[f+24>>2]=0;G[f+28>>2]=0;G[f+8>>2]=0;G[f+12>>2]=0;G[c+3156>>2]=0;E[c+40|0]=h;G[c+3148>>2]=0;G[c+3152>>2]=0;G[c+48>>2]=0;G[c+44>>2]=0;a=0}}if(a){break h}E[d+5064|0]=1;G[d+5016>>2]=G[d+5004>>2];G[d+5012>>2]=d+4;break a}Wa(d)}d=0;if((b|0)==G[30060]|(b|0)==G[29763]){break a}Hb(b)}Fa=g+16|0;return d|0}function Jc(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=N(0);k=G[f>>2];if((k|0)<=0){a:{b:{c:{switch(b-11|0){case 5:if((gj(a,c,d,e,f)|0)!=202){break a}G[f>>2]=k;lc(a,c,d,e,f);break a;case 0:Gc(a,c,H[d|0],0,e,f);break a;case 1:b=a;a=E[d|0];Gc(b,c,a,a>>31,e,f);break a;case 9:Gc(a,c,I[d>>1],0,e,f);break a;case 10:b=a;a=F[d>>1];Gc(b,c,a,a>>31,e,f);break a;case 20:b=a;a=G[d>>2];Gc(b,c,a,a>>31,e,f);break a;case 19:Sl(a,c,+J[d>>2],e,f);break a;case 3:Kh(a,c,G[d>>2],e,f);break a;case 29:Sl(a,c,+J[d>>2],e,f);break a;case 30:b=a;a=G[d>>2];Gc(b,c,a,a>>31,e,f);break a;case 70:Gc(a,c,G[d>>2],G[d+4>>2],e,f);break a;case 31:l=K[d>>2];d=Fa-256|0;Fa=d;g=G[f>>2];d:{if((g|0)>0){break d}if((Vc(a,c,d+176|0,d+96|0,f)|0)<=0){b=d+176|0;hg(l,-7,b,f);Ob(c,b,e?H[e|0]==38?d+96|0:e:d+96|0,d,f);Hd(a,d,f)}if(G[f>>2]!=202){break d}G[f>>2]=g;Qg(a,c,l,-7,e,f)}Fa=d+256|0;break a;case 71:Kd(a,c,L[d>>3],-15,e,f);break a;case 72:g=Fa-336|0;Fa=g;b=G[f>>2];e:{if((b|0)>0){break e}f:{if((Vc(a,c,g+256|0,g+96|0,f)|0)<=0){F[g+256>>1]=40;b=g+176|0;hg(K[d>>2],-7,b,f);if(Va(b)-68>>>0<=4294967224){break f}h=g+176|0;b=Gb(g+256|0,h);i=Va(b)+b|0;j=H[67812]|H[67813]<<8;E[i|0]=j;E[i+1|0]=j>>>8;E[i+2|0]=H[67814];hg(K[d+4>>2],-7,h,f);if((Va(b)+Va(h)|0)-70>>>0<=4294967224){break f}b=Gb(b,g+176|0);h=Va(b)+b|0;E[h|0]=41;E[h+1|0]=0;Ob(c,b,e?H[e|0]==38?g+96|0:e:g+96|0,g,f);Hd(a,g,f)}b=G[f>>2];break e}Ua(62685);b=402;G[f>>2]=402}Fa=g+336|0;if((b|0)!=202){break a}G[f>>2]=k;pq(a,c,d,e,f);break a;default:if((b|0)==163){break b}break;case 2:case 4:case 6:case 7:case 8:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:case 58:case 59:case 60:case 61:case 62:case 63:case 64:case 65:case 66:case 67:case 68:case 69:break c}}G[f>>2]=410;break a}g=Fa-336|0;Fa=g;b=G[f>>2];g:{if((b|0)>0){break g}h:{if((Vc(a,c,g+256|0,g+96|0,f)|0)<=0){F[g+256>>1]=40;b=g+176|0;If(L[d>>3],-15,b,f);if(Va(b)-68>>>0<=4294967224){break h}h=g+176|0;b=Gb(g+256|0,h);i=Va(b)+b|0;j=H[67812]|H[67813]<<8;E[i|0]=j;E[i+1|0]=j>>>8;E[i+2|0]=H[67814];If(L[d+8>>3],-15,h,f);if((Va(b)+Va(h)|0)-70>>>0<=4294967224){break h}b=Gb(b,g+176|0);h=Va(b)+b|0;E[h|0]=41;E[h+1|0]=0;Ob(c,b,e?H[e|0]==38?g+96|0:e:g+96|0,g,f);Hd(a,g,f)}b=G[f>>2];break g}Ua(56403);b=402;G[f>>2]=402}Fa=g+336|0;if((b|0)!=202){break a}G[f>>2]=k;oq(a,c,d,e,f)}}}function Uk(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==2147483648;a:{b:{if(!e){if(l){if((b|0)<=0){break a}f=0;if(b-1>>>0>=3){g=b&-4;i=0;while(1){e=f<<2;G[e+j>>2]=G[a+e>>2]^-2147483648;h=e|4;G[h+j>>2]=G[a+h>>2]^-2147483648;h=e|8;G[h+j>>2]=G[a+h>>2]^-2147483648;e=e|12;G[e+j>>2]=G[a+e>>2]^-2147483648;f=f+4|0;i=i+4|0;if((g|0)!=(i|0)){continue}break}}b=b&3;if(!b){break a}while(1){e=f<<2;G[e+j>>2]=G[a+e>>2]^-2147483648;f=f+1|0;m=m+1|0;if((b|0)!=(m|0)){continue}break}break a}if(c==1&d==0){break b}f=0;if((b|0)<=0){break a}while(1){c:{d:{g=f<<2;n=+G[g+a>>2]*c+d;if(n<-.49){G[k>>2]=-11;break d}if(n>0xfffffffffffff800){G[k>>2]=-11;e=-1;break c}if(!(n<4294967296&n>=0)){break d}e=~~n>>>0;break c}e=0}G[g+j>>2]=e;f=f+1|0;if((f|0)!=(b|0)){continue}break}break a}e:{f:{g:{if(l){if((b|0)<=0){break a}if((e|0)==1){break e}e=b&1;if((b|0)!=1){g=b&-2;b=0;while(1){k=m<<2;l=G[k+a>>2];h:{if((l|0)==(f|0)){G[i>>2]=1;E[h+m|0]=1;break h}G[j+k>>2]=l^-2147483648}k=m|1;l=k<<2;o=G[l+a>>2];i:{if((o|0)!=(f|0)){G[j+l>>2]=o^-2147483648;break i}G[i>>2]=1;E[h+k|0]=1}m=m+2|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}b=a;a=m<<2;b=G[b+a>>2];if((b|0)==(f|0)){break g}G[a+j>>2]=b^-2147483648;break a}if(c==1&d==0){break f}if((b|0)<=0){break a}while(1){l=m<<2;o=G[l+a>>2];j:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+l>>2]=g;break j}E[h+m|0]=1;break j}n=+(o|0)*c+d;if(n<-.49){G[k>>2]=-11;G[j+l>>2]=0;break j}if(n>0xfffffffffffff800){G[k>>2]=-11;G[j+l>>2]=-1;break j}o=j+l|0;if(n<4294967296&n>=0){l=~~n>>>0}else{l=0}G[o>>2]=l}m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}G[i>>2]=1;E[h+m|0]=1;break a}if((b|0)<=0){break a}while(1){l=m<<2;o=G[l+a>>2];k:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+l>>2]=g;break k}E[h+m|0]=1;break k}if((o|0)<0){G[k>>2]=-11;G[j+l>>2]=0;break k}G[j+l>>2]=o}m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}h=b&1;if((b|0)!=1){k=b&-2;b=0;while(1){l=m<<2;e=G[l+a>>2];l:{if((e|0)!=(f|0)){e=e^-2147483648;break l}G[i>>2]=1;e=g}G[j+l>>2]=e;l=(m|1)<<2;e=G[l+a>>2];m:{if((e|0)!=(f|0)){e=e^-2147483648;break m}G[i>>2]=1;e=g}G[j+l>>2]=e;m=m+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(m<<2)+a>>2];n:{if((a|0)!=(f|0)){g=a^-2147483648;break n}G[i>>2]=1}G[(m<<2)+j>>2]=g;break a}if((b|0)<=0){break a}e=b&1;f=0;if((b|0)!=1){g=b&-2;while(1){h=f<<2;b=G[h+a>>2];if((b|0)<0){G[k>>2]=-11;b=0}G[h+j>>2]=b;h=(f|1)<<2;b=G[h+a>>2];if((b|0)<0){G[k>>2]=-11;b=0}G[h+j>>2]=b;f=f+2|0;m=m+2|0;if((g|0)!=(m|0)){continue}break}}if(!e){break a}b=f<<2;a=G[b+a>>2];if((a|0)<0){G[k>>2]=-11;a=0}G[b+j>>2]=a}}function yp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==2147483648;a:{b:{if(!e){if(l){if((b|0)<=0){break a}f=0;if(b-1>>>0>=3){g=b&-4;i=0;while(1){e=f<<2;G[e+j>>2]=G[a+e>>2]^-2147483648;h=e|4;G[h+j>>2]=G[a+h>>2]^-2147483648;h=e|8;G[h+j>>2]=G[a+h>>2]^-2147483648;e=e|12;G[e+j>>2]=G[a+e>>2]^-2147483648;f=f+4|0;i=i+4|0;if((g|0)!=(i|0)){continue}break}}b=b&3;if(!b){break a}while(1){e=f<<2;G[e+j>>2]=G[a+e>>2]^-2147483648;f=f+1|0;m=m+1|0;if((b|0)!=(m|0)){continue}break}break a}if(c==1&d==0){break b}f=0;if((b|0)<=0){break a}while(1){c:{d:{g=f<<2;n=+G[g+a>>2]*c+d;if(n<-.49){G[k>>2]=-11;break d}if(n>4294967295.49){G[k>>2]=-11;e=-1;break c}if(!(n<4294967296&n>=0)){break d}e=~~n>>>0;break c}e=0}G[g+j>>2]=e;f=f+1|0;if((f|0)!=(b|0)){continue}break}break a}e:{f:{g:{if(l){if((b|0)<=0){break a}if((e|0)==1){break e}e=b&1;if((b|0)!=1){g=b&-2;b=0;while(1){k=m<<2;l=G[k+a>>2];h:{if((l|0)==(f|0)){G[i>>2]=1;E[h+m|0]=1;break h}G[j+k>>2]=l^-2147483648}k=m|1;l=k<<2;o=G[l+a>>2];i:{if((o|0)!=(f|0)){G[j+l>>2]=o^-2147483648;break i}G[i>>2]=1;E[h+k|0]=1}m=m+2|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}b=a;a=m<<2;b=G[b+a>>2];if((b|0)==(f|0)){break g}G[a+j>>2]=b^-2147483648;break a}if(c==1&d==0){break f}if((b|0)<=0){break a}while(1){l=m<<2;o=G[l+a>>2];j:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+l>>2]=g;break j}E[h+m|0]=1;break j}n=+(o|0)*c+d;if(n<-.49){G[k>>2]=-11;G[j+l>>2]=0;break j}if(n>4294967295.49){G[k>>2]=-11;G[j+l>>2]=-1;break j}o=j+l|0;if(n<4294967296&n>=0){l=~~n>>>0}else{l=0}G[o>>2]=l}m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}G[i>>2]=1;E[h+m|0]=1;break a}if((b|0)<=0){break a}while(1){l=m<<2;o=G[l+a>>2];k:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+l>>2]=g;break k}E[h+m|0]=1;break k}if((o|0)<0){G[k>>2]=-11;G[j+l>>2]=0;break k}G[j+l>>2]=o}m=m+1|0;if((m|0)!=(b|0)){continue}break}break a}h=b&1;if((b|0)!=1){k=b&-2;b=0;while(1){l=m<<2;e=G[l+a>>2];l:{if((e|0)!=(f|0)){e=e^-2147483648;break l}G[i>>2]=1;e=g}G[j+l>>2]=e;l=(m|1)<<2;e=G[l+a>>2];m:{if((e|0)!=(f|0)){e=e^-2147483648;break m}G[i>>2]=1;e=g}G[j+l>>2]=e;m=m+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(m<<2)+a>>2];n:{if((a|0)!=(f|0)){g=a^-2147483648;break n}G[i>>2]=1}G[(m<<2)+j>>2]=g;break a}if((b|0)<=0){break a}e=b&1;f=0;if((b|0)!=1){g=b&-2;while(1){h=f<<2;b=G[h+a>>2];if((b|0)<0){G[k>>2]=-11;b=0}G[h+j>>2]=b;h=(f|1)<<2;b=G[h+a>>2];if((b|0)<0){G[k>>2]=-11;b=0}G[h+j>>2]=b;f=f+2|0;m=m+2|0;if((g|0)!=(m|0)){continue}break}}if(!e){break a}b=f<<2;a=G[b+a>>2];if((a|0)<0){G[k>>2]=-11;a=0}G[b+j>>2]=a}}function Ns(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=Fa-224|0;Fa=c;if(G[309801]){G[c+80>>2]=a;kb(87511,c+80|0)}a:{if(H[a|0]==35){d=gn(a+1|0,b);break a}h=G[309728];G[c+220>>2]=0;b:{if(!G[309736]){f=G[309731];if(!f){G[309737]=219;Ua(11057);d=-1;break a}e=-1;G[c+216>>2]=-1;c:{if(G[f>>2]>0){while(1){if(!Ib(a,G[G[f+8>>2]+(d<<2)>>2])){G[c+216>>2]=d;e=d}d=d+1|0;f=G[309731];if((d|0)>2]){continue}break}d=-1;if((e|0)>=0){break c}}G[c>>2]=a;a=c+112|0;Ya(a,80,26096,c);Ua(a);G[309737]=219;d=-1;break a}if(ki(h,1238948)){break a}g=G[309729];f=G[G[G[309731]+12>>2]+(e<<2)>>2];e=G[309730]+M(h,124)|0;mh(f,5,c+212|0,e+92|0,e+96|0,c+220|0);G[e+88>>2]=1;g=g+M(h,244)|0;if(fn(f,a,G[c+212>>2],e,g)){break a}G[g>>2]=f;G[g+84>>2]=0;break b}f=G[309712];d:{if(G[309715]){d=G[309718];G[c+216>>2]=d;break d}if(!dc(f,0,a,c+216|0,c+220|0)){d=G[c+216>>2];break d}d=G[c+220>>2];if((d|0)==219){d=-1;a=gn(a,b);if((a|0)==-1){break a}df();d=a;break a}G[309737]=d;d=-1;break a}if(vd(f,d,c+212|0,c+208|0,c+204|0,c+220|0)){G[309737]=G[c+220>>2];d=-1;break a}d=-1;if(ki(h,1238948)){break a}e=G[309730];j=G[c+216>>2];g=G[309729]+M(h,244)|0;d=g;G[d+84>>2]=0;G[d+80>>2]=0;G[d+4>>2]=j;G[d>>2]=f;e=e+M(h,124)|0}a=rb(e,a,80);E[a+80|0]=0;e=G[309736];e:{if(!e){d=269;break e}f:{g:{h:{i:{j:{k:{l:{d=G[c+212>>2];switch(d-1|0){case 0:break g;case 15:break i;case 13:break j;case 41:case 80:case 81:break k;case 10:case 20:case 40:break l;default:break h}}G[c+48>>2]=G[c+216>>2];d=c+112|0;Ya(d,80,29949,c+48|0);G[c+92>>2]=0;if(Cb(f,82,d,c+104|0,0,c+92|0)){G[c+104>>2]=0;G[c+108>>2]=0}G[c+32>>2]=G[c+216>>2];d=c+112|0;Ya(d,80,29979,c+32|0);G[c+92>>2]=0;m:{n:{if(Cb(f,82,d,c+96|0,0,c+92|0)){G[c+96>>2]=0;G[c+100>>2]=1072693248;break n}if(L[c+96>>3]!=1){break m}}i=L[c+104>>3];if(i!=0&i!=32768){break m}G[a+84>>2]=259;G[g+80>>2]=41;d=269;break f}G[a+84>>2]=260;G[g+80>>2]=82;d=269;break f}G[a+84>>2]=260;G[g+80>>2]=82;d=269;break f}G[a+84>>2]=258;G[g+80>>2]=14;d=270;break f}G[a+84>>2]=261;G[g+80>>2]=16;g=G[c+204>>2];if((g|0)>=256){G[c+64>>2]=G[c+216>>2];G[c+68>>2]=255;a=c+112|0;Ya(a,80,6246,c- -64|0);Ua(a);G[309737]=433;d=-1;break a}d=271;if((e|0)!=1){break f}G[c+208>>2]=g;break f}if((d|0)<0){G[c+16>>2]=d;a=c+112|0;Ya(a,80,30276,c+16|0);Ua(a)}G[309737]=432;d=-1;break a}G[a+84>>2]=262;G[g+80>>2]=11;d=272}e=G[c+208>>2];G[a+88>>2]=e;if(!(G[c+212>>2]==16|(e|0)<2)){if(!Zf(f,G[c+216>>2],5,a+92|0,a+96|0,c+220|0)){break e}G[309737]=G[c+220>>2];d=-1;break a}G[a+92>>2]=1;G[a+96>>2]=1}G[309728]=G[309728]+1;G[b>>2]=h}Fa=c+224|0;return d|0}function Gp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0;n=c==1&d==32768;a:{b:{if(!e){if(n){if((b|0)<=0){break a}i=0;if(b-1>>>0>=3){g=b&-4;e=0;while(1){f=l<<1;F[f+j>>1]=I[a+f>>1]^32768;h=f|2;F[h+j>>1]=I[a+h>>1]^32768;h=f|4;F[h+j>>1]=I[a+h>>1]^32768;f=f|6;F[f+j>>1]=I[a+f>>1]^32768;l=l+4|0;e=e+4|0;if((g|0)!=(e|0)){continue}break}}b=b&3;if(!b){break a}while(1){e=l<<1;F[e+j>>1]=I[a+e>>1]^32768;l=l+1|0;i=i+1|0;if((b|0)!=(i|0)){continue}break}break a}if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){c:{d:{f=l<<1;o=+F[f+a>>1]*c+d;if(o<-.49){G[k>>2]=-11;break d}if(o>65535.49){G[k>>2]=-11;e=65535;break c}if(!(o<4294967296&o>=0)){break d}e=~~o>>>0;break c}e=0}F[f+j>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}e:{f:{g:{if(n){if((b|0)<=0){break a}if((e|0)==1){break e}if((b|0)!=1){k=b&-2;g=f&65535;e=0;while(1){n=l<<1;m=I[n+a>>1];h:{if((m|0)==(g|0)){G[i>>2]=1;E[h+l|0]=1;break h}F[j+n>>1]=m^32768}n=l|1;m=n<<1;p=I[m+a>>1];i:{if((g|0)!=(p|0)){F[j+m>>1]=p^32768;break i}G[i>>2]=1;E[h+n|0]=1}l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!(b&1)){break a}b=a;a=l<<1;b=I[b+a>>1];if((b|0)==(f&65535)){break g}F[a+j>>1]=b^32768;break a}if(c==1&d==0){break f}if((b|0)<=0){break a}n=f&65535;while(1){f=l<<1;m=I[f+a>>1];j:{if((m|0)==(n|0)){G[i>>2]=1;if((e|0)==1){F[f+j>>1]=g;break j}E[h+l|0]=1;break j}o=+(m<<16>>16)*c+d;if(o<-.49){G[k>>2]=-11;F[f+j>>1]=0;break j}if(o>65535.49){G[k>>2]=-11;F[f+j>>1]=65535;break j}m=f+j|0;if(o<4294967296&o>=0){f=~~o>>>0}else{f=0}F[m>>1]=f}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}G[i>>2]=1;E[h+l|0]=1;break a}if((b|0)<=0){break a}n=f&65535;while(1){f=l<<1;m=I[f+a>>1];k:{if((m|0)==(n|0)){G[i>>2]=1;if((e|0)==1){F[f+j>>1]=g;break k}E[h+l|0]=1;break k}m=m<<16>>16;if((m|0)<0){G[k>>2]=-11;F[f+j>>1]=0;break k}F[f+j>>1]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)!=1){n=b&-2;k=f&65535;e=0;while(1){m=l<<1;h=I[m+a>>1];l:{if((h|0)!=(k|0)){h=h^-32768;break l}G[i>>2]=1;h=g}F[j+m>>1]=h;m=(l|1)<<1;h=I[m+a>>1];m:{if((h|0)!=(k|0)){h=h^-32768;break m}G[i>>2]=1;h=g}F[j+m>>1]=h;l=l+2|0;e=e+2|0;if((n|0)!=(e|0)){continue}break}}if(!(b&1)){break a}a=I[(l<<1)+a>>1];n:{if((a|0)!=(f&65535)){g=a^-32768;break n}G[i>>2]=1}F[(l<<1)+j>>1]=g;break a}if((b|0)<=0){break a}e=b&1;if((b|0)!=1){f=b&-2;i=0;while(1){g=l<<1;b=F[g+a>>1];if((b|0)<0){G[k>>2]=-11;b=0}F[g+j>>1]=b;g=(l|1)<<1;b=F[g+a>>1];if((b|0)<0){G[k>>2]=-11;b=0}F[g+j>>1]=b;l=l+2|0;i=i+2|0;if((f|0)!=(i|0)){continue}break}}if(!e){break a}b=l<<1;a=F[b+a>>1];if((a|0)<0){G[k>>2]=-11;a=0}F[b+j>>1]=a}}function Bn(a,b,c,d,e,f,g,h,i,j,k,l){var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;p=Fa-32|0;Fa=p;m=G[l>>2];a:{if((m|0)>0){break a}G[p+28>>2]=c;G[p+24>>2]=b;G[p+16>>2]=10;G[p+20>>2]=10;sd(p+12|0,42094,l);pd(G[p+12>>2],32,2,p+16|0,l);b=p+24|0;tk(a,G[p+12>>2],b,l);Zj(a,G[p+12>>2],2,b,l);m=G[l>>2];if((m|0)>0){break a}c=G[p+12>>2];m=Fa-144|0;Fa=m;G[m+140>>2]=0;G[m+56>>2]=0;G[m+60>>2]=0;G[m+48>>2]=0;G[m+52>>2]=0;G[m+40>>2]=0;G[m+44>>2]=0;G[m+32>>2]=0;G[m+36>>2]=0;G[m+24>>2]=0;G[m+28>>2]=1072693248;G[m+16>>2]=0;G[m+20>>2]=0;G[m+8>>2]=0;G[m+12>>2]=1072693248;G[m>>2]=0;G[m+4>>2]=0;if(G[l>>2]<=0){G[m+140>>2]=0;if(Kc(c,41279,d,m+140|0)){G[d>>2]=0;G[d+4>>2]=0}G[m+140>>2]=0;if(Kc(c,40866,e,m+140|0)){G[e>>2]=0;G[e+4>>2]=0}G[m+140>>2]=0;if(Kc(c,41201,f,m+140|0)){G[f>>2]=0;G[f+4>>2]=0}G[m+140>>2]=0;if(Kc(c,40799,g,m+140|0)){G[g>>2]=0;G[g+4>>2]=0}G[m+140>>2]=0;b:{c:{if(Kc(c,41234,h,m+140|0)){G[m+140>>2]=0;a=1;b=1;if(Kc(c,41174,m+56|0,m+140|0)){G[m+140>>2]=0;b=0}if(Kc(c,41149,m+48|0,m+140|0)){G[m+140>>2]=0;a=b}d:{if(!Kc(c,40778,m+32|0,m+140|0)){a=1;break d}G[m+140>>2]=0}if(!(t=0,u=Kc(c,40759,m+40|0,m+140|0),v=a,v?t:u)){n=L[m+56>>3];s=Db(L[m+48>>3],n);r=L[m+40>>3];q=Db(-L[m+32>>3],r);o=q>s?s:q;q=q1.5707963267948966?o+3.141592653589793:o;if(O(o-q)>2e-4){G[l>>2]=506}s=n;n=(q+o)*.5;o=eb(n);L[h>>3]=s/o;L[i>>3]=r/o;L[j>>3]=n*180/3.141592653589793;if(!(L[i>>3]<0)){break b}L[h>>3]=-L[h>>3];L[i>>3]=-L[i>>3];n=L[j>>3]+-180;break c}G[h>>2]=0;G[h+4>>2]=1072693248;G[m+140>>2]=0;if(Kc(c,40826,i,m+140|0)){G[i>>2]=0;G[i+4>>2]=1072693248}G[m+140>>2]=0;n=0;if(Kc(c,40896,j,m+140|0)){break c}break b}if(Kc(c,40826,i,m+140|0)){G[i>>2]=0;G[i+4>>2]=1072693248}G[m+140>>2]=0;if(!Kc(c,40896,j,m+140|0)){break b}G[j>>2]=0;G[j+4>>2]=0;G[m+140>>2]=0;a=1;b=1;if(Kc(c,41180,m+24|0,m+140|0)){G[m+140>>2]=0;b=0}if(Kc(c,41155,m+16|0,m+140|0)){G[m+140>>2]=0;a=b}e:{if(!Kc(c,40784,m,m+140|0)){a=1;break e}G[m+140>>2]=0}if(t=0,u=Kc(c,40765,m+8|0,m+140|0),v=a,v?t:u){break b}r=Db(L[m+16>>3],L[m+24>>3]);n=Db(-L[m>>3],L[m+8>>3]);o=n>r?r:n;n=n1.5707963267948966?o+3.141592653589793:o;if(O(o-n)>2e-4){G[l>>2]=506}n=(n+o)*.5*180/3.141592653589793}L[j>>3]=n}G[m+140>>2]=0;f:{if(Fc(c,41295,m- -64|0,0,m+140|0)){E[k|0]=0;break f}t=rb(k,m- -64|4,4),u=0,E[t+4|0]=u;if(G[m+64>>2]!=759383364){if(nb(m- -64|1,33504,3)){break f}}L[j>>3]=90-L[j>>3];L[i>>3]=-L[i>>3];o=L[d>>3];L[d>>3]=L[e>>3];L[e>>3]=o}}Fa=m+144|0;if(G[l>>2]>0){Ua(8157);m=505;G[l>>2]=505;break a}Xm(G[p+12>>2],l);m=G[l>>2]}Fa=p+32|0;return m}function Ob(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;k=Fa-176|0;Fa=k;G[k+12>>2]=-1;a:{if(G[e>>2]>0){break a}E[k+16|0]=0;E[k+96|0]=0;E[d|0]=0;while(1){f=a+i|0;i=i+1|0;if(H[f|0]==32){continue}break}j=qb(k+96|0,f,74);n=Va(b);b:{c:{d:{e:{f:{g:{h:{i:{j:{k:{l:{m:{n:{o:{f=Va(j);if(f){i=(f+j|0)-1|0;if(H[i|0]==32){while(1){E[i|0]=0;i=i-1|0;if(H[i|0]==32){continue}break}}if(!jb(j,61)){break o}break c}if(jb(j,61)){break c}break n}l=(i-j|0)+1|0;if(l>>>0>8){break m}}if((ve(j,k+12|0)|0)>0){break m}f=Gb(d,j);if(l>>>0<=7){cb(f+l|0,32,8-l|0)}E[f+10|0]=0;E[f+8|0]=61;E[f+9|0]=32;i=0;if(!n){break h}g=10;f=0;if(H[b|0]!=39){break l}break g}p:{q:{r:{f=H[j|0];s:{if((f|0)!=104){if((f|0)!=72){break r}if(!nb(j,66642,9)){break s}break r}if(nb(j,66365,9)){break r}}f=Gb(d,j);h=Va(f)+f|0;g=l+3|0;if(n+g>>>0>=81){i=0;E[h+2|0]=H[66742];f=H[66740]|H[66741]<<8;E[h|0]=f;E[h+1|0]=f>>>8;g=l+2|0;break q}E[h|0]=32;E[h+1|0]=61;E[h+2|0]=32;E[h+3|0]=0;i=0;break q}t:{g=pc(qb(k+16|0,j,74),68332);if(g){i=0;while(1){G[k+12>>2]=-1;i=(ve(g,k+12|0)|0)<=0?i:1;m=m+1|0;g=pc(0,68332);if(g){continue}break}if(l-70>>>0<=4294967214){tb(5,38782);tb(5,a);break b}g=Va(d)+d|0;f=H[66646]|H[66647]<<8|(H[66648]<<16|H[66649]<<24);h=H[66642]|H[66643]<<8|(H[66644]<<16|H[66645]<<24);E[g|0]=h;E[g+1|0]=h>>>8;E[g+2|0]=h>>>16;E[g+3|0]=h>>>24;E[g+4|0]=f;E[g+5|0]=f>>>8;E[g+6|0]=f>>>16;E[g+7|0]=f>>>24;f=H[66650]|H[66651]<<8;E[g+8|0]=f;E[g+9|0]=f>>>8;f=Gb(d,j);h=Va(f)+f|0;g=l+12|0;if(n+g>>>0<81){break t}E[h+2|0]=H[66742];f=H[66740]|H[66741]<<8;E[h|0]=f;E[h+1|0]=f>>>8;g=l+11|0;if(!n){break i}break p}G[k+12>>2]=-1;i=0;if((ve(j,k+12|0)|0)<=0){f=qb(d,j,74);h=Va(f)+f|0;f=H[66740]|H[66741]<<8;E[h|0]=f;E[h+1|0]=f>>>8;E[h+2|0]=H[66742];g=l+2|0;break q}tb(5,37813);tb(5,j);break b}E[h|0]=32;E[h+1|0]=61;E[h+2|0]=32;E[h+3|0]=0;if(n){break p}break i}if(!n){break i}}if(H[b|0]==39){break k}f=m}m=g+n|0;if(m>>>0<81){break j}tb(5,38722);tb(5,a);tb(5,b);break b}f=i;if(g>>>0<78){break g}tb(5,38722);tb(5,a);tb(5,b);break b}if(m>>>0<=29){qb(d,68277,30-m|0)}qb(d,b,80-g|0);a=m>>>0>30?m:30;m=f;break f}if((g|0)!=10){break d}}E[d+8|0]=32;a=70;if(!c){break d}break e}e=qb(d,b,80-g|0);b=g+n|0;a=b>>>0<80;if(!a){E[e+79|0]=39}if(!c){i=f;break d}b=a?b:80;if(!(!H[c|0]|b>>>0>29)){a=30;cb(b+e|0,32,30-b|0);E[e+30|0]=0;i=f;break f}i=f;a=b}if(!H[c|0]|(!c|a>>>0>76)){break d}b=Va(d)+d|0;E[b|0]=32;E[b+1|0]=47;E[b+2|0]=32;E[b+3|0]=0;a=77-a|0}qb(d,c,a)}if(!((m|0)!=1&(i|0)!=1)){tb(5,13872);tb(5,d)}break a}tb(5,63296);tb(5,j)}G[e>>2]=207}Fa=k+176|0}function No(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{d:{if((y|0)<=0){e:{if((y|0)>=0){break e}l=G[k>>2];if((l|0)<=0){Qe(a,b,c,d,e,f,g,h,i,k);l=G[k>>2];if((l|0)<=0){break e}}if((l|0)!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;t=c>>>0>>0?l+1|0:l;if((y|0)>0){break d}e=0;f=0;c=0;d=0;while(1){f:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=t+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;v=s+1|0;l=v?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,v,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;t=c>>>0>>0?l+1|0:l}e=0;f=0;c=0;d=0;while(1){g:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=t+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;v=s+1|0;l=v?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,v,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break g}h:{if(!(c|d)){break h}l=G[k>>2];if((l|0)<=0){l=t+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;v=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,v);Qe(a,b,z,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,c,d,(w<<2)+i|0,k);l=G[k>>2];if((l|0)<=0){break h}}if((l|0)!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}i:{if(c|d){if((y|0)<=0|G[k>>2]>0){break i}e=a;l=t+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;u=b;b=Au(p,q,f,g);Qe(e,h,u,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<2)+i|0,k);break i}if(!(e|f)){break i}c=a;l=t+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Io(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{d:{if((y|0)<=0){e:{if((y|0)>=0){break e}l=G[k>>2];if((l|0)<=0){xe(a,b,c,d,e,f,g,h,i,k);l=G[k>>2];if((l|0)<=0){break e}}if((l|0)!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;t=c>>>0>>0?l+1|0:l;if((y|0)>0){break d}e=0;f=0;c=0;d=0;while(1){f:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=t+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;v=s+1|0;l=v?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,v,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;t=c>>>0>>0?l+1|0:l}e=0;f=0;c=0;d=0;while(1){g:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=t+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;v=s+1|0;l=v?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,v,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break g}h:{if(!(c|d)){break h}l=G[k>>2];if((l|0)<=0){l=t+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;u=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;v=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,v);xe(a,b,z,x,n-l|0,u-(Ia+(l>>>0>n>>>0)|0)|0,c,d,(w<<2)+i|0,k);l=G[k>>2];if((l|0)<=0){break h}}if((l|0)!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}i:{if(c|d){if((y|0)<=0|G[k>>2]>0){break i}e=a;l=t+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;u=b;b=Au(p,q,f,g);xe(e,h,u,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<2)+i|0,k);break i}if(!(e|f)){break i}c=a;l=t+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function mm(a,b){var c=0,d=0;c=Fa-16|0;Fa=c;if(G[321439]){G[c+4>>2]=b;G[c>>2]=a;kb(76362,c);$a(G[29763])}a:{if(!Xa(a,35530)){G[321445]=1;if(!Xa(b,33560)){break a}if(!Xa(b,35337)){break a}hc(35309);break a}b:{c:{d:{if(!Xa(a,32941)){G[321446]=1;a=nc(b,c+12|0,0);if(J[c+12>>2]>>0){hc(11287)}if((a|0)<=7){if((a|0)==-64){break a}if((a|0)!=-32){break b}break a}b=a-8|0;if(b>>>0<=24){break d}break c}if(!Xa(a,33788)){G[321447]=1;a=nc(b,c+12|0,0);if(J[c+12>>2]>>0){hc(11332)}if((a|0)>1){break a}hc(40921);break a}if(!Xa(a,41261)){G[321448]=1;a=nc(b,c+12|0,0);if(J[c+12>>2]>>0){hc(11421)}if((a|0)>=0){break a}hc(41766);break a}if(!Xa(a,40853)){G[321449]=1;a=nc(b,c+12|0,0);if(J[c+12>>2]>>0){hc(11376)}if((a|0)>=0){break a}hc(41724);break a}if(!Xa(a,34954)){G[321444]=1;break a}if(!Xa(a,41295)){G[321450]=1;Za(1285872,b);break a}if(!Xa(a,40882)){G[321451]=1;Za(1286896,b);break a}if(!Xa(a,41201)){G[321452]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12994);break a}if(!Xa(a,40799)){G[321453]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12755);break a}if(!Xa(a,41279)){G[321460]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(13090);break a}if(!Xa(a,40866)){G[321461]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12851);break a}if(!Xa(a,41234)){G[321454]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(13042);break a}if(!Xa(a,40826)){G[321455]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12803);break a}if(!Xa(a,40896)){vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12899);break a}if(!Xa(a,41174)){G[321456]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12947);break a}if(!Xa(a,40778)){G[321457]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12708);break a}if(!Xa(a,41149)){G[321458]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12708);break a}if(!Xa(a,40759)){G[321459]=1;vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12661);break a}if(!Xa(a,35661)){vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12613);break a}if(!Xa(a,34377)){vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12472);break a}if(!Xa(a,34862)){vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12519);break a}if(!Xa(a,34948)){vb(b,c+12|0);if(J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12566);break a}if(Xa(a,32863)){break a}d=vb(b,c+12|0);if(!(d<1900|d>2050)|J[c+12>>2]>=Va(b)+b>>>0){break a}hc(12423);break a}if(1<>2]>0){break a}b:{n=G[a>>2];m=G[a+4>>2];if((n|0)!=G[m+76>>2]){mb(a,n+1|0,0,l);break b}if((G[m+128>>2]&G[m+132>>2])!=-1){break b}if((Rb(a,l)|0)<=0){break b}return}m=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;z=G[m+80>>2];c:{if((z|0)<=0){d:{if((z|0)>=0){break d}if((yh(a,b,c,d,e,f,g,h,i,l)|0)<=0){break d}if(G[l>>2]!=412){break a}G[l>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}m=f+h|0;n=e+g|0;m=n>>>0>>0?m+1|0:m;q=n-1|0;r=m-!n|0;c=Au(q,r,c-1|0,d-!c|0)+e|0;m=f+Ia|0;n=c;v=c>>>0>>0?m+1|0:m;e=0;f=0;c=0;d=0;while(1){m=(s<<3)+i|0;e:{if(G[m>>2]!=(j|0)|G[m+4>>2]!=(k|0)){if(e|f){m=v+(p-((e>>>0>s>>>0)+f|0)|0)|0;o=n+(s-e|0)|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;w=m;u=t+1|0;m=u?m:m+1|0;y=m;m=Au(q,r,t,w);if((rc(a,b,u,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,e,f,l)|0)>0){break a}}e=0;f=0;m=d;c=c+1|0;m=c?m:m+1|0;d=m;break e}m=f;c=e+1|0;m=c?m:m+1|0;e=c;f=m;c=0;d=0}m=p;p=s+1|0;m=p?m:m+1|0;s=p;p=m;if((g|0)!=(s|0)|(h|0)!=(m|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}q=G[m+88>>2];r=G[m+92>>2];c=Au(q,r,c-1|0,d-!c|0)+e|0;m=f+Ia|0;n=c;v=c>>>0>>0?m+1|0:m;e=0;f=0;c=0;d=0;while(1){m=(s<<3)+i|0;f:{if(G[m>>2]!=(j|0)|G[m+4>>2]!=(k|0)){if(e|f){m=v+(p-((e>>>0>s>>>0)+f|0)|0)|0;o=n+(s-e|0)|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;w=m;u=t+1|0;m=u?m:m+1|0;y=m;m=Au(q,r,t,w);if((rc(a,b,u,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,e,f,l)|0)>0){break a}}e=0;f=0;m=d;c=c+1|0;m=c?m:m+1|0;d=m;break f}g:{if(!(c|d)){break g}m=v+(p-((c>>>0>s>>>0)+d|0)|0)|0;w=s-c|0;o=n+w|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;u=m;A=t+1|0;m=A?m:m+1|0;y=m;m=Au(q,r,t,u);if((yh(a,b,A,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,c,d,(w<<3)+i|0,l)|0)<=0){break g}if(G[l>>2]!=412){break a}G[l>>2]=0;B=1}m=f;c=e+1|0;m=c?m:m+1|0;e=c;f=m;c=0;d=0}m=p;p=s+1|0;m=p?m:m+1|0;s=p;p=m;if((g|0)!=(s|0)|(h|0)!=(m|0)){continue}break}}h:{if(c|d){if((z|0)<=0){break h}e=a;m=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=n+j|0;m=a>>>0>>0?m+1|0:m;f=m;g=Bu(a-1|0,m-!a|0,q,r);m=Ia;h=m;k=b;b=g+1|0;m=b?m:m+1|0;p=b;b=Au(g,h,q,r);yh(e,k,p,m,a-b|0,f-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<3)+i|0,l);break h}if(!(e|f)){break h}c=a;m=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=n+(g-e|0)|0;m=a>>>0>>0?m+1|0:m;d=m;g=Bu(a-1|0,m-!a|0,q,r);m=Ia;h=m;i=b;b=g+1|0;m=b?m:m+1|0;j=b;b=Au(g,h,q,r);rc(c,i,j,m,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,l)}if(!B|G[l>>2]>0){break a}G[l>>2]=412}} -function Qo(a,b,c,d,e,f,g,h,i,j,k,l){var 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;a:{if(G[l>>2]>0){break a}b:{n=G[a>>2];m=G[a+4>>2];if((n|0)!=G[m+76>>2]){mb(a,n+1|0,0,l);break b}if((G[m+128>>2]&G[m+132>>2])!=-1){break b}if((Rb(a,l)|0)<=0){break b}return}m=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;z=G[m+80>>2];c:{if((z|0)<=0){d:{if((z|0)>=0){break d}if((zh(a,b,c,d,e,f,g,h,i,l)|0)<=0){break d}if(G[l>>2]!=412){break a}G[l>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}m=f+h|0;n=e+g|0;m=n>>>0>>0?m+1|0:m;q=n-1|0;r=m-!n|0;c=Au(q,r,c-1|0,d-!c|0)+e|0;m=f+Ia|0;n=c;v=c>>>0>>0?m+1|0:m;e=0;f=0;c=0;d=0;while(1){m=(s<<3)+i|0;e:{if(G[m>>2]!=(j|0)|G[m+4>>2]!=(k|0)){if(e|f){m=v+(p-((e>>>0>s>>>0)+f|0)|0)|0;o=n+(s-e|0)|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;w=m;u=t+1|0;m=u?m:m+1|0;y=m;m=Au(q,r,t,w);if((rc(a,b,u,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,e,f,l)|0)>0){break a}}e=0;f=0;m=d;c=c+1|0;m=c?m:m+1|0;d=m;break e}m=f;c=e+1|0;m=c?m:m+1|0;e=c;f=m;c=0;d=0}m=p;p=s+1|0;m=p?m:m+1|0;s=p;p=m;if((g|0)!=(s|0)|(h|0)!=(m|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}q=G[m+88>>2];r=G[m+92>>2];c=Au(q,r,c-1|0,d-!c|0)+e|0;m=f+Ia|0;n=c;v=c>>>0>>0?m+1|0:m;e=0;f=0;c=0;d=0;while(1){m=(s<<3)+i|0;f:{if(G[m>>2]!=(j|0)|G[m+4>>2]!=(k|0)){if(e|f){m=v+(p-((e>>>0>s>>>0)+f|0)|0)|0;o=n+(s-e|0)|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;w=m;u=t+1|0;m=u?m:m+1|0;y=m;m=Au(q,r,t,w);if((rc(a,b,u,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,e,f,l)|0)>0){break a}}e=0;f=0;m=d;c=c+1|0;m=c?m:m+1|0;d=m;break f}g:{if(!(c|d)){break g}m=v+(p-((c>>>0>s>>>0)+d|0)|0)|0;w=s-c|0;o=n+w|0;m=o>>>0>>0?m+1|0:m;x=m;t=Bu(o-1|0,m-!o|0,q,r);m=Ia;u=m;A=t+1|0;m=A?m:m+1|0;y=m;m=Au(q,r,t,u);if((zh(a,b,A,y,o-m|0,x-(Ia+(m>>>0>o>>>0)|0)|0,c,d,(w<<3)+i|0,l)|0)<=0){break g}if(G[l>>2]!=412){break a}G[l>>2]=0;B=1}m=f;c=e+1|0;m=c?m:m+1|0;e=c;f=m;c=0;d=0}m=p;p=s+1|0;m=p?m:m+1|0;s=p;p=m;if((g|0)!=(s|0)|(h|0)!=(m|0)){continue}break}}h:{if(c|d){if((z|0)<=0){break h}e=a;m=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=n+j|0;m=a>>>0>>0?m+1|0:m;f=m;g=Bu(a-1|0,m-!a|0,q,r);m=Ia;h=m;k=b;b=g+1|0;m=b?m:m+1|0;p=b;b=Au(g,h,q,r);zh(e,k,p,m,a-b|0,f-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<3)+i|0,l);break h}if(!(e|f)){break h}c=a;m=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=n+(g-e|0)|0;m=a>>>0>>0?m+1|0:m;d=m;g=Bu(a-1|0,m-!a|0,q,r);m=Ia;h=m;i=b;b=g+1|0;m=b?m:m+1|0;j=b;b=Au(g,h,q,r);rc(c,i,j,m,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,l)}if(!B|G[l>>2]>0){break a}G[l>>2]=412}}function Gn(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;e=Fa-16|0;Fa=e;a:{if(b){Ua(54912);Ua(a);b=112;break a}b=ce(a,0,e+4|0);if(b){Ua(55310);Ua(a);break a}if((zc(e,1,2,G[e+4>>2])|0)!=2){Hb(G[e+4>>2]);b=108;break a}b:{c:{d:{e:{if((H[e|0]|H[e+1|0]<<8)==35615){He(G[e+4>>2],0,2);ek(G[e+4>>2]);He(G[e+4>>2],-4,1);break e}if((H[e|0]|H[e+1|0]<<8)!=19280){break d}He(G[e+4>>2],22,0)}zc(e,1,4,G[e+4>>2]);g=H[e|0]|H[e+1|0]<<8|(H[e+2|0]<<16|H[e+3|0]<<24);if(g){break b}break c}i=1;b=H[e|0]|H[e+1|0]<<8;if((b|0)==7711|(b|0)==40223|(H[e|0]|H[e+1|0]<<8)==40991){break c}Hb(G[e+4>>2]);b=1;break a}He(G[e+4>>2],0,2);g=M(ek(G[e+4>>2]),3)}b=0;He(G[e+4>>2],0,0);G[c>>2]=-1;f:{g:{h:{i:{j:{k:{l:{while(1){d=M(b,48)+757232|0;if(!G[d>>2]){f=b;break l}f=b+1|0;d=M(f,48)+757232|0;if(!G[d>>2]){break l}f=b+2|0;d=M(f,48)+757232|0;if(!G[d>>2]){break l}f=b+3|0;d=M(f,48)+757232|0;if(!G[d>>2]){break l}f=b+4|0;d=M(f,48)+757232|0;if(!G[d>>2]){break l}b=b+5|0;if((b|0)!=1e4){continue}break}b=103;break k}G[c>>2]=f;h=d;b=M(f,48);d=b+757236|0;G[h>>2]=d;h=b+757240|0;b=b+757244|0;G[h>>2]=b;if(!g){break j}h=d;d=ab(g);G[h>>2]=d;if(d){break j}Ua(57797);b=104}if(!i){break h}G[c>>2]=-1;i=(g>>>0)/3|0;b=0;while(1){d=M(b,48)+757232|0;if(!G[d>>2]){f=b;break i}f=b+1|0;d=M(f,48)+757232|0;if(!G[d>>2]){break i}f=b+2|0;d=M(f,48)+757232|0;if(!G[d>>2]){break i}f=b+3|0;d=M(f,48)+757232|0;if(!G[d>>2]){break i}f=b+4|0;d=M(f,48)+757232|0;if(!G[d>>2]){break i}b=b+5|0;if((b|0)!=1e4){continue}break}b=103;break h}G[b>>2]=g;break f}G[c>>2]=f;h=d;b=M(f,48);d=b+757236|0;G[h>>2]=d;h=b+757240|0;b=b+757244|0;G[h>>2]=b;if(g>>>0<3){break g}h=d;d=ab(i);G[h>>2]=d;if(d){break g}Ua(57797);b=104}Hb(G[e+4>>2]);Ua(55259);break a}G[b>>2]=i}b=M(f,48);f=b+757256|0;G[f>>2]=0;G[f+4>>2]=0;G[b+757248>>2]=2880;f=b+757264|0;G[f>>2]=0;G[f+4>>2]=0;G[b+757252>>2]=17;b=G[c>>2];f=G[e+4>>2];G[e+8>>2]=0;g=M(b,48);d=G[g+757240>>2];g=G[g+757232>>2];m:{if(Sb(a,32688)){Ln(a,f,g,d,e+12|0,e+8|0);break m}hp(f,g,d,e+12|0,e+8|0)}a=M(b,48);b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;a=a+757264|0;G[a>>2]=G[e+12>>2];G[a+4>>2]=0;b=G[e+8>>2];Hb(G[e+4>>2]);a=G[c>>2];if(b){a=M(a,48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;Ua(55147);break a}b=0;d=M(a,48);f=G[d+757264>>2];if(J[G[d+757240>>2]>>2]<=f+256>>>0){break a}f=ub(G[G[M(a,48)+757232>>2]>>2],f);if(!f){Ua(55201);b=113;break a}a=M(G[c>>2],48);G[G[a+757232>>2]>>2]=f;G[G[a+757240>>2]>>2]=G[a+757264>>2]}Fa=e+16|0;return b|0}function ul(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if((a|0)<=0|G[968816]<=(a|0)){break a}e=G[968817];if(!e){break a}h=e+M(a,65544)|0;f=G[h>>2];if(!f){break a}a=e+M(a,65544)|0;E[a+8|0]=0;a=a+8|0;b:{if(!b|!H[b|0]){break b}c:{if(!Xc(b,30677)){break c}if(!Xc(b,30657)){break c}if(!Xc(b,13234)){break c}if(!(Zh(b)>0)){break b}f=G[h>>2]}sm(f,b);f=Fa-32|0;Fa=f;e=G[h>>2];d:{if(!e|!G[e+3312>>2]){break d}e:{if(H[b|0]?b:0){break e}G[e+3960>>2]=G[e+3964>>2];c=Za(e+3912|0,e+3848|0);g=L[e+120>>3];L[e+3944>>3]=g;f:{switch(G[e+3960>>2]-1|0){case 1:if(g!=1950){E[c|0]=66;L[f>>3]=g;Eb(e+3913|0,18949,f);d=(Va(c)+e|0)+3911|0;if(H[d|0]==48){E[d|0]=0}d=(Va(c)+e|0)+3911|0;if(H[d|0]==48){E[d|0]=0}c=(Va(c)+e|0)+3911|0;if(H[c|0]!=48){break e}E[c|0]=0;break e}d=H[41563]|H[41564]<<8;E[c+4|0]=d;E[c+5|0]=d>>>8;d=H[41559]|H[41560]<<8|(H[41561]<<16|H[41562]<<24);E[c|0]=d;E[c+1|0]=d>>>8;E[c+2|0]=d>>>16;E[c+3|0]=d>>>24;break e;case 0:break f;default:break e}}if(g!=2e3){E[c|0]=74;L[f+16>>3]=g;Eb(e+3913|0,18949,f+16|0);d=(Va(c)+e|0)+3911|0;if(H[d|0]==48){E[d|0]=0}d=(Va(c)+e|0)+3911|0;if(H[d|0]==48){E[d|0]=0}c=(Va(c)+e|0)+3911|0;if(H[c|0]!=48){break e}E[c|0]=0;break e}d=H[41649]|H[41650]<<8;E[c+4|0]=d;E[c+5|0]=d>>>8;d=H[41645]|H[41646]<<8|(H[41647]<<16|H[41648]<<24);E[c|0]=d;E[c+1|0]=d>>>8;E[c+2|0]=d>>>16;E[c+3|0]=d>>>24}c=Nf(b);if((c|0)<0){break d}G[e+3960>>2]=c;i=e,j=Zh(b),L[i+3944>>3]=j;Za(e+3912|0,b)}Fa=f+32|0}b=G[h>>2];if(b){b=G[b+3312>>2]?b+3880|0:0}else{b=0}c=rb(a,b,65536);if(!Xc(c,30677)){E[c+8|0]=H[30685];a=H[30681]|H[30682]<<8|(H[30683]<<16|H[30684]<<24);b=H[30677]|H[30678]<<8|(H[30679]<<16|H[30680]<<24);E[c|0]=b;E[c+1|0]=b>>>8;E[c+2|0]=b>>>16;E[c+3|0]=b>>>24;E[c+4|0]=a;E[c+5|0]=a>>>8;E[c+6|0]=a>>>16;E[c+7|0]=a>>>24;return c|0}if(!Xc(c,30657)){E[c+8|0]=H[30665];a=H[30661]|H[30662]<<8|(H[30663]<<16|H[30664]<<24);b=H[30657]|H[30658]<<8|(H[30659]<<16|H[30660]<<24);E[c|0]=b;E[c+1|0]=b>>>8;E[c+2|0]=b>>>16;E[c+3|0]=b>>>24;E[c+4|0]=a;E[c+5|0]=a>>>8;E[c+6|0]=a>>>16;E[c+7|0]=a>>>24;return c|0}if(!Xc(c,13234)){a=H[13237]|H[13238]<<8|(H[13239]<<16|H[13240]<<24);E[c+3|0]=a;E[c+4|0]=a>>>8;E[c+5|0]=a>>>16;E[c+6|0]=a>>>24;a=H[13234]|H[13235]<<8|(H[13236]<<16|H[13237]<<24);E[c|0]=a;E[c+1|0]=a>>>8;E[c+2|0]=a>>>16;E[c+3|0]=a>>>24;return c|0}b=H[c|0];if(!b){break a}a=c;while(1){b=b<<24>>24;if(b-97>>>0<26){E[a|0]=b-97>>>0<26?b&95:b}b=H[a+1|0];a=a+1|0;if(b){continue}break}}return c|0}function pp(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;x=G[l+80>>2];c:{if((x|0)<=0){d:{if((x|0)>=0){break d}if((Ng(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;n=m-1|0;o=l-!m|0;c=Au(n,o,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;u=c>>>0>>0?l+1|0:l;y=j&65535;e=0;f=0;c=0;d=0;while(1){e:{if((y|0)!=I[(q<<1)+i>>1]){if(e|f){l=u+(p-((e>>>0>q>>>0)+f|0)|0)|0;j=m+(q-e|0)|0;l=j>>>0>>0?l+1|0:l;r=l;s=Bu(j-1|0,l-!j|0,n,o);l=Ia;v=l;t=s+1|0;l=t?l:l+1|0;w=l;l=Au(n,o,s,v);if((rc(a,b,t,w,j-l|0,r-(Ia+(j>>>0>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;j=d;c=c+1|0;j=c?j:j+1|0;d=j;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}j=q+1|0;p=j?p:p+1|0;q=j;if((g|0)!=(j|0)|(h|0)!=(p|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}n=G[l+88>>2];o=G[l+92>>2];c=Au(n,o,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;u=c>>>0>>0?l+1|0:l;y=j&65535;e=0;f=0;c=0;d=0;while(1){f:{if((y|0)!=I[(q<<1)+i>>1]){if(e|f){j=u+(p-((e>>>0>q>>>0)+f|0)|0)|0;l=m+(q-e|0)|0;j=l>>>0>>0?j+1|0:j;r=l;s=Bu(l-1|0,j-!l|0,n,o);l=Ia;v=l;t=s+1|0;l=t?l:l+1|0;w=l;l=Au(n,o,s,v);if((rc(a,b,t,w,r-l|0,j-(Ia+(l>>>0>r>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;j=d;c=c+1|0;j=c?j:j+1|0;d=j;break f}g:{if(!(c|d)){break g}l=u+(p-((c>>>0>q>>>0)+d|0)|0)|0;v=q-c|0;j=m+v|0;l=j>>>0>>0?l+1|0:l;r=l;s=Bu(j-1|0,l-!j|0,n,o);l=Ia;t=l;z=s+1|0;l=z?l:l+1|0;w=l;l=Au(n,o,s,t);if((Ng(a,b,z,w,j-l|0,r-(Ia+(j>>>0>>0)|0)|0,c,d,(v<<1)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}j=f;c=e+1|0;j=c?j:j+1|0;e=c;f=j;c=0;d=0}l=p;j=q+1|0;l=j?l:l+1|0;q=j;p=l;if((g|0)!=(j|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((x|0)<=0){break h}e=a;j=u+(h-((c>>>0>g>>>0)+d|0)|0)|0;l=g-c|0;a=m+l|0;j=a>>>0>>0?j+1|0:j;f=Bu(a-1|0,j-!a|0,n,o);p=Ia;g=p;h=b;b=f+1|0;p=b?g:g+1|0;r=b;b=Au(n,o,f,g);Ng(e,h,r,p,a-b|0,j-(Ia+(a>>>0>>0)|0)|0,c,d,(l<<1)+i|0,k);break h}if(!(e|f)){break h}c=a;j=u+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;j=a>>>0>>0?j+1|0:j;d=j;g=Bu(a-1|0,j-!a|0,n,o);j=Ia;h=j;i=b;b=g+1|0;j=b?j:j+1|0;l=b;b=Au(g,h,n,o);rc(c,i,l,j,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Uo(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{if((y|0)<=0){d:{if((y|0)>=0){break d}if((Ah(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(I[(r<<1)+i>>1]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(I[(r<<1)+i>>1]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=v+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;u=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,u);if((Ah(a,b,z,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,c,d,(w<<1)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((y|0)<=0){break h}e=a;l=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;t=b;b=Au(p,q,f,g);Ah(e,h,t,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<1)+i|0,k);break h}if(!(e|f)){break h}c=a;l=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function So(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{if((y|0)<=0){d:{if((y|0)>=0){break d}if((Qe(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=v+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;u=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,u);if((Qe(a,b,z,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,c,d,(w<<2)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((y|0)<=0){break h}e=a;l=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;t=b;b=Au(p,q,f,g);Qe(e,h,t,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<2)+i|0,k);break h}if(!(e|f)){break h}c=a;l=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Lo(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{if((y|0)<=0){d:{if((y|0)>=0){break d}if((xe(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(G[(r<<2)+i>>2]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=v+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;u=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,u);if((xe(a,b,z,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,c,d,(w<<2)+i|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((y|0)<=0){break h}e=a;l=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;t=b;b=Au(p,q,f,g);xe(e,h,t,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,(j<<2)+i|0,k);break h}if(!(e|f)){break h}c=a;l=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function nq(a,b){var c=0,d=0,e=0,f=0,g=0;f=Fa-272|0;Fa=f;a:{if(G[b>>2]>0){break a}G[f+12>>2]=0;if(Fc(a,34409,f+96|0,f+16|0,f+12|0)){lc(a,34409,41661,44530,b);if(G[b>>2]>0){break a}E[f+184|0]=H[66595];c=H[66591]|H[66592]<<8|(H[66593]<<16|H[66594]<<24);G[f+176>>2]=H[66587]|H[66588]<<8|(H[66589]<<16|H[66590]<<24);G[f+180>>2]=c;c=f+176|0;bb(Va(c)+c|0,20722,65);wb(a,c,b);if(G[b>>2]>0){break a}d=H[66595];E[f+184|0]=d;g=H[66591]|H[66592]<<8|(H[66593]<<16|H[66594]<<24);c=H[66587]|H[66588]<<8|(H[66589]<<16|H[66590]<<24);G[f+176>>2]=c;G[f+180>>2]=g;e=f+176|0;bb(Va(e)+e|0,65329,71);wb(a,e,b);if(G[b>>2]>0){break a}E[f+184|0]=d;G[f+176>>2]=c;G[f+180>>2]=g;c=f+176|0;bb(Va(c)+c|0,27920,65);wb(a,c,b);if(G[b>>2]>0){break a}E[f+184|0]=H[66595];c=H[66591]|H[66592]<<8|(H[66593]<<16|H[66594]<<24);G[f+176>>2]=H[66587]|H[66588]<<8|(H[66589]<<16|H[66590]<<24);G[f+180>>2]=c;g=f+176|0;c=Va(g)+g|0;e=H[45194]|H[45195]<<8|(H[45196]<<16|H[45197]<<24);d=H[45190]|H[45191]<<8|(H[45192]<<16|H[45193]<<24);E[c|0]=d;E[c+1|0]=d>>>8;E[c+2|0]=d>>>16;E[c+3|0]=d>>>24;E[c+4|0]=e;E[c+5|0]=e>>>8;E[c+6|0]=e>>>16;E[c+7|0]=e>>>24;d=H[45237]|H[45238]<<8|(H[45239]<<16|H[45240]<<24);E[c+47|0]=d;E[c+48|0]=d>>>8;E[c+49|0]=d>>>16;E[c+50|0]=d>>>24;e=H[45234]|H[45235]<<8|(H[45236]<<16|H[45237]<<24);d=H[45230]|H[45231]<<8|(H[45232]<<16|H[45233]<<24);E[c+40|0]=d;E[c+41|0]=d>>>8;E[c+42|0]=d>>>16;E[c+43|0]=d>>>24;E[c+44|0]=e;E[c+45|0]=e>>>8;E[c+46|0]=e>>>16;E[c+47|0]=e>>>24;e=H[45226]|H[45227]<<8|(H[45228]<<16|H[45229]<<24);d=H[45222]|H[45223]<<8|(H[45224]<<16|H[45225]<<24);E[c+32|0]=d;E[c+33|0]=d>>>8;E[c+34|0]=d>>>16;E[c+35|0]=d>>>24;E[c+36|0]=e;E[c+37|0]=e>>>8;E[c+38|0]=e>>>16;E[c+39|0]=e>>>24;e=H[45218]|H[45219]<<8|(H[45220]<<16|H[45221]<<24);d=H[45214]|H[45215]<<8|(H[45216]<<16|H[45217]<<24);E[c+24|0]=d;E[c+25|0]=d>>>8;E[c+26|0]=d>>>16;E[c+27|0]=d>>>24;E[c+28|0]=e;E[c+29|0]=e>>>8;E[c+30|0]=e>>>16;E[c+31|0]=e>>>24;e=H[45210]|H[45211]<<8|(H[45212]<<16|H[45213]<<24);d=H[45206]|H[45207]<<8|(H[45208]<<16|H[45209]<<24);E[c+16|0]=d;E[c+17|0]=d>>>8;E[c+18|0]=d>>>16;E[c+19|0]=d>>>24;E[c+20|0]=e;E[c+21|0]=e>>>8;E[c+22|0]=e>>>16;E[c+23|0]=e>>>24;e=H[45202]|H[45203]<<8|(H[45204]<<16|H[45205]<<24);d=H[45198]|H[45199]<<8|(H[45200]<<16|H[45201]<<24);E[c+8|0]=d;E[c+9|0]=d>>>8;E[c+10|0]=d>>>16;E[c+11|0]=d>>>24;E[c+12|0]=e;E[c+13|0]=e>>>8;E[c+14|0]=e>>>16;E[c+15|0]=e>>>24;wb(a,g,b)}}Fa=f+272|0}function Xo(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;x=G[l+80>>2];c:{if((x|0)<=0){d:{if((x|0)>=0){break d}if((Bh(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;n=m-1|0;o=l-!m|0;c=Au(n,o,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;u=c>>>0>>0?l+1|0:l;y=j&255;e=0;f=0;c=0;d=0;while(1){e:{if((y|0)!=H[i+q|0]){if(e|f){l=u+(p-((e>>>0>q>>>0)+f|0)|0)|0;j=m+(q-e|0)|0;l=j>>>0>>0?l+1|0:l;r=l;s=Bu(j-1|0,l-!j|0,n,o);l=Ia;v=l;t=s+1|0;l=t?l:l+1|0;w=l;l=Au(n,o,s,v);if((rc(a,b,t,w,j-l|0,r-(Ia+(j>>>0>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;j=d;c=c+1|0;j=c?j:j+1|0;d=j;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}j=q+1|0;p=j?p:p+1|0;q=j;if((g|0)!=(j|0)|(h|0)!=(p|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}n=G[l+88>>2];o=G[l+92>>2];c=Au(n,o,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;u=c>>>0>>0?l+1|0:l;y=j&255;e=0;f=0;c=0;d=0;while(1){f:{if((y|0)!=H[i+q|0]){if(e|f){j=u+(p-((e>>>0>q>>>0)+f|0)|0)|0;l=m+(q-e|0)|0;j=l>>>0>>0?j+1|0:j;r=l;s=Bu(l-1|0,j-!l|0,n,o);l=Ia;v=l;t=s+1|0;l=t?l:l+1|0;w=l;l=Au(n,o,s,v);if((rc(a,b,t,w,r-l|0,j-(Ia+(l>>>0>r>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;j=d;c=c+1|0;j=c?j:j+1|0;d=j;break f}g:{if(!(c|d)){break g}l=u+(p-((c>>>0>q>>>0)+d|0)|0)|0;v=q-c|0;j=m+v|0;l=j>>>0>>0?l+1|0:l;r=l;s=Bu(j-1|0,l-!j|0,n,o);l=Ia;t=l;z=s+1|0;l=z?l:l+1|0;w=l;l=Au(n,o,s,t);if((Bh(a,b,z,w,j-l|0,r-(Ia+(j>>>0>>0)|0)|0,c,d,i+v|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}j=f;c=e+1|0;j=c?j:j+1|0;e=c;f=j;c=0;d=0}l=p;j=q+1|0;l=j?l:l+1|0;q=j;p=l;if((g|0)!=(j|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((x|0)<=0){break h}e=a;j=u+(h-((c>>>0>g>>>0)+d|0)|0)|0;l=g-c|0;a=m+l|0;j=a>>>0>>0?j+1|0:j;f=Bu(a-1|0,j-!a|0,n,o);p=Ia;g=p;h=b;b=f+1|0;p=b?g:g+1|0;r=b;b=Au(n,o,f,g);Bh(e,h,r,p,a-b|0,j-(Ia+(a>>>0>>0)|0)|0,c,d,i+l|0,k);break h}if(!(e|f)){break h}c=a;j=u+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;j=a>>>0>>0?j+1|0:j;d=j;g=Bu(a-1|0,j-!a|0,n,o);j=Ia;h=j;i=b;b=g+1|0;j=b?j:j+1|0;l=b;b=Au(g,h,n,o);rc(c,i,l,j,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function qp(a,b,c,d,e,f,g,h,i,j,k){var 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;a:{if(G[k>>2]>0){break a}b:{m=G[a>>2];l=G[a+4>>2];if((m|0)!=G[l+76>>2]){mb(a,m+1|0,0,k);break b}if((G[l+128>>2]&G[l+132>>2])!=-1){break b}if((Rb(a,k)|0)<=0){break b}return}l=G[G[a+4>>2]+968>>2]+M(b-1|0,160)|0;y=G[l+80>>2];c:{if((y|0)<=0){d:{if((y|0)>=0){break d}if((pe(a,b,c,d,e,f,g,h,i,k)|0)<=0){break d}if(G[k>>2]!=412){break a}G[k>>2]=0}if(!g&(h|0)<=0|(h|0)<0){break a}l=f+h|0;m=e+g|0;l=m>>>0>>0?l+1|0:l;p=m-1|0;q=l-!m|0;c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){e:{if(H[i+r|0]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break e}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=r+1|0;o=l?o:o+1|0;r=l;if((g|0)!=(l|0)|(h|0)!=(o|0)){continue}break}break c}if(!g&(h|0)<=0|(h|0)<0){break a}p=G[l+88>>2];q=G[l+92>>2];c=Au(p,q,c-1|0,d-!c|0)+e|0;l=f+Ia|0;m=c;v=c>>>0>>0?l+1|0:l;e=0;f=0;c=0;d=0;while(1){f:{if(H[i+r|0]!=(j|0)){if(e|f){l=v+(o-((e>>>0>r>>>0)+f|0)|0)|0;n=m+(r-e|0)|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;w=l;u=s+1|0;l=u?l:l+1|0;x=l;l=Au(p,q,s,w);if((rc(a,b,u,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,e,f,k)|0)>0){break a}}e=0;f=0;l=d;c=c+1|0;l=c?l:l+1|0;d=l;break f}g:{if(!(c|d)){break g}l=v+(o-((c>>>0>r>>>0)+d|0)|0)|0;w=r-c|0;n=m+w|0;l=n>>>0>>0?l+1|0:l;t=l;s=Bu(n-1|0,l-!n|0,p,q);l=Ia;u=l;z=s+1|0;l=z?l:l+1|0;x=l;l=Au(p,q,s,u);if((pe(a,b,z,x,n-l|0,t-(Ia+(l>>>0>n>>>0)|0)|0,c,d,i+w|0,k)|0)<=0){break g}if(G[k>>2]!=412){break a}G[k>>2]=0;A=1}l=f;c=e+1|0;l=c?l:l+1|0;e=c;f=l;c=0;d=0}l=o;o=r+1|0;l=o?l:l+1|0;r=o;o=l;if((g|0)!=(r|0)|(h|0)!=(l|0)){continue}break}}h:{if(c|d){if((y|0)<=0){break h}e=a;l=v+(h-((c>>>0>g>>>0)+d|0)|0)|0;j=g-c|0;a=m+j|0;l=a>>>0>>0?l+1|0:l;f=Bu(a-1|0,l-!a|0,p,q);o=Ia;g=o;h=b;b=f+1|0;o=b?g:g+1|0;t=b;b=Au(p,q,f,g);pe(e,h,t,o,a-b|0,l-(Ia+(a>>>0>>0)|0)|0,c,d,i+j|0,k);break h}if(!(e|f)){break h}c=a;l=v+(h-((e>>>0>g>>>0)+f|0)|0)|0;a=m+(g-e|0)|0;l=a>>>0>>0?l+1|0:l;d=l;g=Bu(a-1|0,l-!a|0,p,q);l=Ia;h=l;i=b;b=g+1|0;l=b?l:l+1|0;j=b;b=Au(g,h,p,q);rc(c,i,j,l,a-b|0,d-(Ia+(a>>>0>>0)|0)|0,e,f,k)}if(!A|G[k>>2]>0){break a}G[k>>2]=412}}function Gd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=N(0);f=Fa-208|0;Fa=f;g=G[e>>2];a:{if((g|0)>0){break a}if(b){G[b>>2]=0}if(c){G[c>>2]=0}if(d){G[d>>2]=0}g=0;while(1){h=a+g|0;g=g+1|0;if(H[h|0]==32){continue}break}b:{if(Va(h)>>>0>=71){tb(5,56692);break b}j=Za(f+32|0,h);i=Va(j);if(i){g=0;while(1){h=g+j|0;k=E[h|0];E[h|0]=k-97>>>0<26?k&95:k;g=g+1|0;if((i|0)!=(g|0)){continue}break}}g=H[j|0];if(!g){tb(5,17083);break b}h=16;c:{if((g|0)==65){break c}h=41;l=1;d:{e:{switch(g-68|0){case 0:h=82;break d;default:G[f+16>>2]=a;a=f+112|0;Ya(a,81,64785,f+16|0);tb(5,a);g=262;G[e>>2]=262;break a;case 5:break c;case 1:case 2:break e}}h=42}l=0}if(b){G[b>>2]=h}k=j+1|0;f:{g:{h:{if(!(!l&(g|0)!=65)){if(G[e>>2]>0){break g}G[48624]=0;g=nc(k,f+204|0,10);if((H[G[f+204>>2]]|32)!=32){G[e>>2]=407}if(G[48624]==68){i=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);d=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[f+158>>1]=d;F[f+160>>1]=d>>>16;F[f+162>>1]=i;F[f+164>>1]=i>>>16;d=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[f+152>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[f+156>>2]=d;d=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[f+144>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[f+148>>2]=d;d=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[f+136>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[f+140>>2]=d;d=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[f+128>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[f+132>>2]=d;d=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[f+120>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[f+124>>2]=d;d=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[f+112>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[f+116>>2]=d;tb(5,qb(f+112|0,k,25));G[e>>2]=412;G[48624]=0}if(G[e>>2]>0){break g}if((g|0)<=0){g=0;break g}h=l?g>>>0<5?21:h:h;break h}if((sk(k,f+108|0,e)|0)>0){break h}m=K[f+108>>2];if(m<=N(0)){break g}l=H[j|0]==70?82:h;if(N(O(m))7?l:h;i=(g|0)<10;if(H[(i?2:3)+j|0]!=46){break h}if((ue((i?3:4)+j|0,f+204|0,e)|0)>0){break h}i=G[f+204>>2];if(d){G[d>>2]=i}if((g|0)<=(i|0)){G[e>>2]=261}h=(i|0)>6?H[j|0]==69?82:h:h}if(G[e>>2]<=0){break f}}G[e>>2]=261;G[f>>2]=a;a=f+112|0;Ya(a,81,64827,f);tb(5,a)}if(b){G[b>>2]=h}if(c){G[c>>2]=g}g=G[e>>2];break a}g=261;G[e>>2]=261}Fa=f+208|0;return g}function vg(a,b,c){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;g=Ye(a,b);a:{if(!g){break a}a=jb(g,47);b=jb(g,45);b:{if(a>>>0>g>>>0){E[a|0]=0;e=sb(g);E[a|0]=47;d=a+1|0;if(O(e)<2147483648){a=~~e}else{a=-2147483648}b=jb(d,47);if(!b){b=jb(d,45)}if(b>>>0<=g>>>0){break a}E[b|0]=0;e=sb(d);E[b|0]=47;f=(a|0)>31;k=sb(b+1|0);c:{if(O(k)<2147483648){d=~~k;break c}d=-2147483648}b=f?a:d;g=b>>>0<50?b+2e3|0:(b|0)<100?b+1900|0:b;b=(((g|0)%100|0)!=0|!((g|0)%400|0))&!(g&3);G[47545]=b?29:28;d=f?d:a;h=(d|0)>1?d:1;if(O(e)<2147483648){a=~~e}else{a=-2147483648}e=b?366:365;b=a;f=b-1|0;a=G[(f<<2)+190176>>2];a=((a|0)<(d|0)?a:h)-1|0;d:{if((b|0)<2){break d}h=f&3;e:{if(b-2>>>0<3){b=0;break e}i=f&-4;b=0;f=0;while(1){d=b<<2;a=G[(d|12)+190176>>2]+(G[(d|8)+190176>>2]+(G[(d|4)+190176>>2]+(G[d+190176>>2]+a|0)|0)|0)|0;b=b+4|0;f=f+4|0;if((i|0)!=(f|0)){continue}break}}if(!h){break d}while(1){a=G[(b<<2)+190176>>2]+a|0;b=b+1|0;j=j+1|0;if((h|0)!=(j|0)){continue}break}}e=+(a|0)/e+ +(g|0);break b}if(b>>>0<=g>>>0){break a}E[b|0]=0;e=sb(g);E[b|0]=45;d=1;f=b+1|0;b=jb(f,45);i=b>>>0<=g>>>0;if(O(e)<2147483648){a=~~e}else{a=-2147483648}h=1;f:{if(i){break f}E[b|0]=0;e=sb(f);E[b|0]=45;b=b+1|0;j=jb(b,84);f=g>>>0>>0;if(O(e)<2147483648){d=~~e}else{d=-2147483648}g:{if(!f){e=sb(b);if(!(O(e)<2147483648)){break g}h=~~e;break f}E[j|0]=0;e=sb(b);E[j|0]=84;if(!(O(e)<2147483648)){break g}h=~~e;break f}h=-2147483648}b=0;m=(a|0)<32;i=m?h+1900|0:a;f=(((i|0)%100|0)!=0|!((i|0)%400|0))&!(i&3);G[47545]=f?29:28;k=f?366:365;f=1;n=d-1|0;o=G[(n<<2)+190176>>2];a=m?a:h;a=((a|0)>(o|0)?o:(a|0)>1?a:1)-1|0;h:{if((d|0)<2){break h}if(d-2>>>0>=3){m=n&-4;h=0;while(1){d=b<<2;a=G[(d|12)+190176>>2]+(G[(d|8)+190176>>2]+(G[(d|4)+190176>>2]+(G[d+190176>>2]+a|0)|0)|0)|0;b=b+4|0;h=h+4|0;if((m|0)!=(h|0)){continue}break}}h=n&3;if(!h){break h}d=0;while(1){a=G[(b<<2)+190176>>2]+a|0;b=b+1|0;d=d+1|0;if((h|0)!=(d|0)){continue}break}}L[c>>3]=+(a|0)/k+ +(i|0);if(g>>>0>=j>>>0){break a}b=0;e=0;d=j+1|0;a=jb(d,58);i:{if(a>>>0<=g>>>0){a=0;break i}E[a|0]=0;l=sb(d);E[a|0]=58;d=a+1|0;a=jb(d,58);g=a>>>0<=g>>>0;if(O(l)<2147483648){b=~~l}else{b=-2147483648}if(!g){E[a|0]=0;e=sb(d);E[a|0]=58;d=a+1|0;if(O(e)<2147483648){a=~~e;e=sb(d);break i}a=-2147483648;e=sb(d);break i}l=sb(d);if(O(l)<2147483648){a=~~l;break i}a=-2147483648}e=L[c>>3]+(e+(+(b|0)*3600+ +(a|0)*60))/86400/k}L[c>>3]=e;f=1}return f}function Sm(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0;i=Fa-112|0;Fa=i;g=g!=0?g:1;a:{if(!h){break a}k=L[h+8>>3];l=L[h>>3];E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41201,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=(L[i+96>>3]+1-l+-.5)/g+.5;Jc(b,82,41201,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40799,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=(L[i+96>>3]+1-k+-.5)/g+.5;Jc(b,82,40799,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41234,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=g*L[i+96>>3];Jc(b,82,41234,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40826,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=g*L[i+96>>3];Jc(b,82,40826,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41174,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=g*L[i+96>>3];Jc(b,82,41174,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40778,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=g*L[i+96>>3];Jc(b,82,40778,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41149,i+96|0,i,i+108|0);if(!G[i+108>>2]){L[i+96>>3]=g*L[i+96>>3];Jc(b,82,41149,i+96|0,i,i+108|0)}E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40759,i+96|0,i,i+108|0);if(G[i+108>>2]){break a}L[i+96>>3]=g*L[i+96>>3];Jc(b,82,40759,i+96|0,i,i+108|0)}if(!(!e|!f)){E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=1072693248;G[i+108>>2]=0;h=i+96|0;j=i+108|0;Cb(a,82,41167,h,i,j);G[i+108>>2]=0;L[i+96>>3]=L[i+96>>3]/g;Jc(b,82,41167,h,i,j);E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40771,h,i,j);G[i+108>>2]=0;L[i+96>>3]=L[i+96>>3]/g;Jc(b,82,40771,h,i,j);E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41142,h,i,j);G[i+108>>2]=0;L[i+96>>3]=L[i+96>>3]/g;Jc(b,82,41142,h,i,j);E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=1072693248;G[i+108>>2]=0;Cb(a,82,40752,h,i,j);G[i+108>>2]=0;L[i+96>>3]=L[i+96>>3]/g;Jc(b,82,40752,h,i,j);E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,41229,h,i,j);G[i+108>>2]=0;L[i+96>>3]=(L[i+96>>3]-(+(c|0)+ +(e|0)*-.5)+-.5)/g+.5;Jc(b,82,41229,h,i,j);E[i|0]=0;G[i+96>>2]=0;G[i+100>>2]=0;G[i+108>>2]=0;Cb(a,82,40821,h,i,j);G[i+108>>2]=0;L[i+96>>3]=(L[i+96>>3]-(+(d|0)+ +(f|0)*-.5)+-.5)/g+.5;Jc(b,82,40821,h,i,j)}Fa=i+112|0}function Xs(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=G[309722];i=c+M(G[a+12>>2],344)|0;e=G[i>>2];d=(e|0)==-1e3?i+88|0:0;g=c+M(G[a+16>>2],344)|0;h=G[g>>2];c=(h|0)==-1e3?g+88|0:0;a:{b:{c:{if(!((e|0)!=-1e3|(h|0)!=-1e3)){d:{e:{f:{g:{h:{i:{j:{k:{b=G[a>>2];switch(b-278|0){case 0:break i;case 1:break j;case 6:case 7:case 8:case 9:case 10:case 11:break b;case 12:break e;case 2:case 3:case 4:case 5:break h;default:break k}}switch(b-38|0){case 1:case 2:case 3:case 4:break b;case 5:break f;case 0:break g;default:break d}}k=a,l=!ni(d,c),E[k+88|0]=l;break b}k=a,l=ni(d,c),E[k+88|0]=l;break b}k=a,l=nn(d,b,c),E[k+88|0]=l;break b}mn(a+88|0,d,c);break b}Gb(Za(a+88|0,d),c);break b}c=0;G[a+88>>2]=0;while(1){b=H[d|0];l:{if((b|0)!=49){if(b){break l}break b}c=c+1|0;G[a+88>>2]=c}d=d+1|0;continue}}if((b|0)==124){break c}break b}Nd(a);if(G[309737]){break a}b=G[309727];m:{n:{o:{p:{q:{f=G[a>>2];switch(f-278|0){case 6:case 7:case 8:case 9:case 10:case 11:break a;case 12:break m;case 0:case 1:case 2:case 3:case 4:case 5:break p;default:break q}}switch(f-38|0){case 1:case 2:case 3:case 4:break a;case 0:case 5:break n;default:break o}}if(!b){break a}f=(e|0)==-1e3;while(1){b=b-1|0;d=f?d:G[G[i+88>>2]+(b<<2)>>2];c=(h|0)!=-1e3?G[G[g+88>>2]+(b<<2)>>2]:c;r:{s:{t:{u:{v:{e=G[a>>2];switch(e-278|0){case 2:case 3:case 4:case 5:break t;case 0:break u;case 1:break v;default:break r}}e=!ni(d,c);break s}e=ni(d,c);break s}e=nn(d,e,c)}E[G[a+88>>2]+b|0]=e}E[G[a+84>>2]+b|0]=0;if(b){continue}break}break a}if((f|0)!=124){break a}}if(!b){break a}e=(e|0)==-1e3;while(1){b=b-1|0;d=e?d:G[G[i+88>>2]+(b<<2)>>2];c=(h|0)!=-1e3?G[G[g+88>>2]+(b<<2)>>2]:c;w:{f=G[a>>2];if((f|0)!=38){if((f|0)!=124){break w}ln(G[G[a+88>>2]+(b<<2)>>2],d,c);if(b){continue}break a}mn(G[G[a+88>>2]+(b<<2)>>2],d,c);if(b){continue}break a}f=b<<2;Za(G[f+G[a+88>>2]>>2],d);Gb(G[f+G[a+88>>2]>>2],c);if(b){continue}break}break a}h=G[g+88>>2];x:{if((b|0)<=0){break x}e=0;y:while(1){f=e<<2;d=G[f+G[i+88>>2]>>2];c=0;while(1){j=H[d|0];z:{if((j|0)!=49){if(j){break z}h=c+h|0;G[f+G[a+88>>2]>>2]=h;E[G[a+84>>2]+e|0]=0;e=e+1|0;if((e|0)!=(b|0)){continue y}break x}c=c+1|0}d=d+1|0;continue}}}G[g+88>>2]=h;break a}ln(a+88|0,d,c)}G[a>>2]=-1e3}if(G[i>>2]>0){Wa(G[G[i+88>>2]>>2]);Wa(G[i+88>>2])}if(G[g>>2]>0){Wa(G[G[g+88>>2]>>2]);Wa(G[g+88>>2])}}function ri(a,b,c,d,e,f,g,h,i,j,k,l){var 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;a:{if(H[j|0]!=45){break a}i=i*.01745329252;q=ib(i);r=eb(i);b:{c:{d:{e:{f:{g:{if(!(g!=0&h!=0)){G[k>>2]=0;G[k+4>>2]=0;G[l>>2]=0;G[l+4>>2]=0;break g}o=a+-360;i=a;a=a-c;i=a>180?o:i;i=a<-180?i+360:i;a=i-c;n=b-d;L[k>>3]=(a*r+n*q)/g+e;L[l>>3]=(n*r-q*a)/h+f;x=H[j+1|0];if((x|0)==67){if(H[j+2|0]!=65|H[j+3|0]!=82){break a}break c}p=b*.01745329252;b=eb(p);o=d*.01745329252;a=eb(o);v=i*.01745329252;u=c*.01745329252;t=v-u;c=eb(t);s=ib(p);i=ib(o);w=s*i;y=c*(b*a);m=w+y;n=b*ib(t);h:{switch(x-65|0){case 19:if(H[j+2|0]!=65|H[j+3|0]!=78){break a}if(m<=0){break b}i:{if(a<.001){c=b*c/w;c=(a*(c*c+1)-c)/i;break i}c=(s/m-i)/a}d=ib(u);if(!(O(d)<.3)){break e}n=(d*c*i+(b*ib(v)/m-a*d))/eb(u);break d;case 18:j:{switch(H[j+2|0]-73|0){case 0:if(H[j+3|0]!=78){break a}if(m<0){break b}c=s*a-i*b*c;break d;case 11:break j;default:break a}}if(H[j+3|0]!=71){break a}if(O(p)>1.5707963267948974){break b}d=y+(w+1);if(O(d)<1e-5){break b}d=2/d;c=d*(s*a-i*b*c);n=n*d;break d;case 0:k:{switch(H[j+2|0]-73|0){case 9:if(H[j+3|0]!=67){break a}d=1;m=Sc(Q(R(m,-1),1));if(m!=0){d=m/ib(m)}c=(s*a-i*b*c)*d;n=n*d;break d;case 0:break k;default:break a}}if(H[j+3|0]!=84){break a}d=t*.5;if(O(d)>1.5707963267948974){break b}n=V((b*eb(d)+1)*.5);if(O(n)<1e-5){G[309737]=503;return 503}c=h*r+q*g;c=c==0?.01745329252:c*.01745329252;m=o+c;p=eb(m);o=c;c=V((a+1)*.5);m=ib(m)/V((p+1)*.5)-i/c;m=o/(m==0?1:m);c=s*m/n-i*m/c;i=g*r-q*h;i=i==0?.01745329252:i*.01745329252;m=i*.5;p=ib(m);i=i*V((a*eb(m)+1)*.5);a=p*(a+a);a=i/(a==0?1:a);n=ib(d)*(b*(a+a))/n;break d;case 13:if(H[j+2|0]!=67|H[j+3|0]!=80){break a}if(o==0){break b}c=(a-b*c)/i;break d;case 6:if(H[j+2|0]!=76|H[j+3|0]!=83){break a}if(O(p)>1.5707963267948974|O(o)>1.5707963267948974){break b}n=b*t;c=p-o;break d;case 12:break h;default:break a}}if(H[j+2|0]!=69|H[j+3|0]!=82){break a}b=Mc(p*.5+.7853981633974487);if(!(b<1e-5)){break f}}G[309737]=502;return 502}c=h*r+q*g;c=c==0?1:c;d=(d*.5+45)*.01745329252;i=oc(Mc(c*.5*.01745329252+d));o=c*.01745329252;c=oc(Mc(d));d=o/(i-c);c=d*oc(b)-c*d;n=(a<=0?1:a)*t;break d}n=eb(u);n=(n*c*i+(b*eb(v)/m-a*n))/-d}a=n/.01745329252;b=c/.01745329252;L[k>>3]=(a*r+q*b)/g+e;L[l>>3]=(b*r-q*a)/h+f}return G[309737]}G[309737]=501;return 501}G[309737]=504;return 504}function Od(a,b,c,d,e,f,g){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;h=Fa-112|0;Fa=h;l=-1;a:{if((a|c|d|e|f|g)<0){break a}i=G[309722];j=i+M(a,344)|0;if(!(G[j>>2]!=-1e3&G[j+56>>2]!=1)){if(!G[309737]){G[309737]=431}a=h+32|0;bb(a,135936,80);E[h+111|0]=0;Ua(a);break a}b:{j=G[309723];if((j|0)==G[309724]){G[309724]=j<<1;i=ub(i,M(j,688));if(!i){break b}G[309722]=i;j=G[309723]}G[309723]=j+1;c:{d:{if((j|0)<0){break d}k=M(j,344)+i|0;G[k+12>>2]=a;G[k+8>>2]=b+1;G[k+16>>2]=c;G[h>>2]=M(c,344)+i;G[k+20>>2]=d;G[h+4>>2]=M(d,344)+i;G[k+24>>2]=e;G[h+8>>2]=M(e,344)+i;G[k+28>>2]=f;G[h+12>>2]=M(f,344)+i;G[k+32>>2]=g;G[h+16>>2]=M(g,344)+i;m=M(a,344)+i|0;c=G[m>>2]==-1e3;e:{if((b|0)<=0){break e}n=b&3;e=0;f:{if(b-1>>>0<3){d=0;break f}p=b&-4;d=0;f=0;while(1){g=0;g:{if(!(c&1)){break g}c=d<<2;g=0;if(G[G[c+h>>2]>>2]!=-1e3){break g}g=0;if(G[G[(c|4)+h>>2]>>2]!=-1e3){break g}g=0;if(G[G[(c|8)+h>>2]>>2]!=-1e3){break g}g=G[G[(c|12)+h>>2]>>2]==-1e3}c=g;d=d+4|0;f=f+4|0;if((p|0)!=(f|0)){continue}break}}if(n){while(1){f=c&1;c=0;c=f?G[G[(d<<2)+h>>2]>>2]==-1e3:c;d=d+1|0;e=e+1|0;if((n|0)!=(e|0)){continue}break}}d=0;while(1){e=G[(d<<2)+h>>2];if(G[e+56>>2]>=2){a=G[309723];if(a){G[309723]=a-1}if(!G[309737]){G[309737]=431}a=h+32|0;bb(a,135855,80);E[h+111|0]=0;Ua(a);break a}if(G[e+52>>2]==259){d=d+1|0;if((d|0)==(b|0)){break e}continue}break}a=G[309723];if(a){G[309723]=a-1}if(!G[309737]){G[309737]=431}a=h+32|0;bb(a,135774,80);E[h+111|0]=0;Ua(a);break a}G[k>>2]=91;G[k+4>>2]=24;G[k+52>>2]=G[m+52>>2];d=G[m+60>>2];h:{if((d|0)==(b|0)){a=M(j,344)+i|0;G[a+56>>2]=1;G[a+60>>2]=1;G[a- -64>>2]=1;break h}f=1;if((b|0)!=1){break c}r=M(j,344)+i|0;e=d-1|0;G[r+60>>2]=e;i:{if((d|0)<2){break i}m=e&3;b=0;j:{if(d-2>>>0<3){d=0;break j}t=e&-4;d=0;n=0;while(1){e=d<<2;g=(M(a,344)+i|0)- -64|0;p=G[e+g>>2];l=(M(j,344)+i|0)- -64|0;G[e+l>>2]=p;o=e|4;s=G[o+g>>2];G[l+o>>2]=s;q=e|8;o=G[q+g>>2];G[l+q>>2]=o;q=g;g=e|12;e=G[q+g>>2];G[g+l>>2]=e;f=M(e,M(o,M(s,M(f,p))));d=d+4|0;n=n+4|0;if((t|0)!=(n|0)){continue}break}}if(!m){break i}while(1){g=d<<2;e=G[(g+(M(a,344)+i|0)|0)- -64>>2];G[(g+(M(j,344)+i|0)|0)- -64>>2]=e;f=M(e,f);d=d+1|0;b=b+1|0;if((m|0)!=(b|0)){continue}break}}G[r+56>>2]=f}if(!(c&1)){break d}sn(k)}l=j;break a}a=G[309723];if(a){G[309723]=a-1}wc(10454);break a}G[309737]=113}Fa=h+112|0;return l}function Ye(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Fa-208|0;Fa=d;E[d+204|0]=39;E[d+205|0]=0;E[d+202|0]=34;E[d+203|0]=0;E[d+200|0]=91;E[d+201|0]=0;E[d+198|0]=93;E[d+199|0]=0;E[d+196|0]=47;E[d+197|0]=0;E[d+194|0]=44;E[d+195|0]=0;b=rb(d+112|0,b,80);e=Va(b);a:{b:{c=ec(b,d+200|0,e);if(c){break b}c=ec(b,d+194|0,e);if(c){break b}e=0;break a}E[c|0]=0;e=c+1|0}c:{d:{a=Pc(a,b);e:{if(!a){break e}f=cb(d,0,100);g=rb(f,a,80);b=Va(g);a=ec(g,f+204|0,b);c=ec(g,f+196|0,b);f:{g:{h:{if(a){if(!(!c|a>>>0>=c>>>0)){b=a+1|0;b=ec(b,f+204|0,Va(b));if(!b){while(1){b=c;c=b-1|0;if(H[c|0]==32){continue}break h}}if(b>>>0<=c>>>0){break h}ec(b,f+196|0,Va(b));break h}if(c){break g}b=a+1|0;b=ec(b,f+204|0,Va(b));if(b){break h}b=g+79|0;while(1){c=b;b=b-1|0;if(H[c|0]==32){continue}break}b=c+1|0;break h}a=ec(g,f+202|0,b);if(!a){break g}if(!(!c|a>>>0>=c>>>0)){b=a+1|0;b=ec(b,f+202|0,Va(b));if(!b){while(1){b=c;c=b-1|0;if(H[c|0]==32){continue}break h}}if(b>>>0<=c>>>0){break h}ec(b,f+196|0,Va(b));break h}if(c){break g}b=a+1|0;b=ec(b,f+202|0,Va(b));if(b){break h}b=g+79|0;while(1){c=b;b=b-1|0;if(H[c|0]==32){continue}break}b=c+1|0}a=a+1|0;break f}a=ec(g,36178,b);a=a?a+1|0:g+9|0;b=ec(g,42205,b);b=b?b:g+79|0}i:{if(H[1285300]){c=a;break i}while(1){c=a;if(H[c|0]!=32){break i}a=c+1|0;if(b>>>0>c>>>0){continue}break}}E[b|0]=0;j:{if(H[1285300]){break j}while(1){b=b-1|0;a=H[b|0]-13|0;if(((a|0)!=19?a:0)|b>>>0<=c>>>0){break j}E[b|0]=0;continue}}b=1285312;a=!Xa(c,41689)+c|0;Za(1285312,a);if(!e){break c}c=ec(e,f+198|0,Va(e));if(c){E[c|0]=0}if(ah(e)){c=_b(e);E[f+206|0]=32;E[f+207|0]=0;if((c|0)>0){a=pc(a,f+206|0);if((c|0)!=1){b=2;while(1){e=(b|0)!=(c|0);a=pc(0,f+206|0);b=b+1|0;if(e){continue}break}}if(a){break d}break e}if((c|0)>=0){break c}if((c|0)!=-1){b=0;c=0-c|0;e=(c|0)>2?c:2;c=1;while(1){a=jb(a,32);if(!a){break c}a=a+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}break d}if(a){break d}break e}a=Va(e);k:{if((a|0)<=0){break k}b=0;if((a|0)!=1){f=a&-2;c=0;while(1){g=b+e|0;h=H[g|0];if((h-65&255)>>>0<=25){E[g|0]=h+32}g=e+(b|1)|0;h=H[g|0];if((h-65&255)>>>0<=25){E[g|0]=h+32}b=b+2|0;c=c+2|0;if((f|0)!=(c|0)){continue}break}}if(!(a&1)){break k}a=b+e|0;b=H[a|0];if((b-65&255)>>>0>25){break k}E[a|0]=b+32}a=ci(1285312,e);if(a){break d}}b=0;break c}b=1285312;Za(1285312,a)}Fa=d+208|0;return b}function rj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;L[a+760>>3]=b;L[a+32>>3]=b;f=c!=0?c:b;L[a+768>>3]=f;L[a+40>>3]=f;g=G[a+3316>>2];if((g|0)>0){e=a+832|0;k=(g|0)==1?1:2;l=k-1>>>0<3;while(1){g=0;h=0;if(!l){while(1){L[e>>3]=(g|0)==(i|0)?1:0;L[e+24>>3]=(g|3)==(i|0)?1:0;L[e+16>>3]=(g|2)==(i|0)?1:0;L[e+8>>3]=(g|1)==(i|0)?1:0;g=g+4|0;e=e+32|0;h=h+4|0;if(h){continue}break}}h=0;while(1){L[e>>3]=(g|0)==(i|0)?1:0;g=g+1|0;e=e+8|0;h=h+1|0;if((k|0)!=(h|0)){continue}break}i=i+1|0;if((k|0)!=(i|0)){continue}break}}G[a+3300>>2]=0;d=d<0?d+360:d;f=d>=360?d+-360:d;L[a+48>>3]=f;d=L[a+760>>3];j=f*3.141592653589793/180;f=eb(j);L[a+56>>3]=d*f;m=f;f=L[a+768>>3];L[a+80>>3]=m*f;j=ib(j);b=b*c>0?-j:j;c=O(d);L[a+72>>3]=b*(f<0?c:-c);c=b;b=O(f);L[a- -64>>3]=c*(d<0?-b:b);sg(2,a+56|0,a+88|0);rm(a);b=L[a+760>>3];a:{b:{if(G[a+3304>>2]){if(!(!(b<0)|!(L[a+768>>3]>0))){G[a+3256>>2]=1;b=L[a+48>>3];L[a+3208>>3]=b;b=b+-90;L[a+3216>>3]=b;c=b+360;e=b<-180;L[a+3200>>3]=e?c:b;if(!e){break b}L[a+3216>>3]=c;return}c:{if(!(b>0)){break c}c=L[a+768>>3];if(c<0){G[a+3256>>2]=1;b=L[a+48>>3];L[a+3208>>3]=b;c=b+-90;L[a+3216>>3]=c;b=b+90;L[a+3200>>3]=b>180?b+-360:b;if(!(c<-180)){break b}L[a+3216>>3]=c+360;return}if(!(c>0)){break c}G[a+3256>>2]=0;b=L[a+48>>3]+90;L[a+3216>>3]=b;c=b+-360;e=b>180;b=e?c:b;L[a+3208>>3]=b;L[a+3200>>3]=b;if(!e){break b}L[a+3216>>3]=c;return}if(!(b<0)|!(L[a+768>>3]<0)){break b}G[a+3256>>2]=0;c=L[a+48>>3];b=c+90;L[a+3216>>3]=b;c=c+-90;c=c<-180?c+360:c;L[a+3208>>3]=c;L[a+3200>>3]=c;if(!(b>180)){break b}L[a+3216>>3]=b+-360;return}if(!(!(b<0)|!(L[a+768>>3]>0))){G[a+3256>>2]=0;b=L[a+48>>3];L[a+3200>>3]=b;c=b+180;L[a+3216>>3]=c;b=b+90;L[a+3208>>3]=b>180?b+-360:b;if(!(c>180)){break b}break a}d:{if(!(b>0)){break d}c=L[a+768>>3];if(c<0){G[a+3256>>2]=0;b=L[a+48>>3]+180;b=b>180?b+-360:b;L[a+3200>>3]=b;c=b+180;L[a+3216>>3]=c;b=b+90;L[a+3208>>3]=b>180?b+-360:b;if(!(c>180)){break b}break a}if(!(c>0)){break d}G[a+3256>>2]=1;b=L[a+48>>3];L[a+3216>>3]=b;L[a+3200>>3]=-b;b=90-b;L[a+3208>>3]=b>180?b+-360:b;return}if(!(b<0)|!(L[a+768>>3]<0)){break b}G[a+3256>>2]=1;c=L[a+48>>3];b=c+90;L[a+3216>>3]=b;c=c+180;c=c>180?c+-360:c;L[a+3200>>3]=c;c=c+90;L[a+3208>>3]=c>180?c+-360:c;if(!(b>180)){break b}L[a+3216>>3]=b+-360}return}L[a+3216>>3]=c+-360}function Ri(a){var 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;j=G[a+44>>2];m=j-262|0;e=G[a+116>>2];while(1){h=G[a+108>>2];i=G[a+60>>2]-(h+e|0)|0;if(G[a+44>>2]+m>>>0<=h>>>0){b=G[a+56>>2];bb(b,b+j|0,j-i|0);G[a+112>>2]=G[a+112>>2]-j;h=G[a+108>>2]-j|0;G[a+108>>2]=h;G[a+92>>2]=G[a+92>>2]-j;b=G[a+76>>2];g=b-1|0;d=G[a+68>>2]+(b<<1)|0;c=G[a+44>>2];e=0;k=b&3;if(k){while(1){d=d-2|0;l=I[d>>1];f=l-c|0;F[d>>1]=f>>>0>l>>>0?0:f;b=b-1|0;e=e+1|0;if((k|0)!=(e|0)){continue}break}}if(g>>>0>=3){while(1){f=d-2|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;f=d-4|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;f=d-6|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;d=d-8|0;f=I[d>>1];e=f-c|0;F[d>>1]=e>>>0>f>>>0?0:e;b=b-4|0;if(b){continue}break}}d=G[a+64>>2]+(c<<1)|0;e=0;b=c;g=c&3;if(g){while(1){d=d-2|0;k=I[d>>1];f=k-c|0;F[d>>1]=f>>>0>k>>>0?0:f;b=b-1|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}}if(c-1>>>0>=3){while(1){f=d-2|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;f=d-4|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;f=d-6|0;g=I[f>>1];e=g-c|0;F[f>>1]=e>>>0>g>>>0?0:e;d=d-8|0;f=I[d>>1];e=f-c|0;F[d>>1]=e>>>0>f>>>0?0:e;b=b-4|0;if(b){continue}break}}i=i+j|0}c=G[a>>2];e=G[c+4>>2];a:{if(!e){break a}b=G[a+116>>2];d=e>>>0>>0?e:i;if(d){i=G[a+56>>2];G[c+4>>2]=e-d;b=bb(b+(i+h|0)|0,G[c>>2],d);b:{c:{switch(G[G[c+28>>2]+24>>2]-1|0){case 0:n=c,o=gf(G[c+48>>2],b,d),G[n+48>>2]=o;break b;case 1:break c;default:break b}}n=c,o=Oc(G[c+48>>2],b,d),G[n+48>>2]=o}G[c>>2]=d+G[c>>2];G[c+8>>2]=d+G[c+8>>2];b=G[a+116>>2]}e=b+d|0;G[a+116>>2]=e;d=G[a+5812>>2];d:{if(d+e>>>0<3){break d}c=G[a+108>>2]-d|0;i=G[a+56>>2];b=c+i|0;h=H[b|0];G[a+72>>2]=h;f=G[a+84>>2];g=h;h=G[a+88>>2];b=f&(H[b+1|0]^g<>2]=b;while(1){if(!d){break d}b=f&(H[(c+i|0)+2|0]^b<>2]=b;g=G[a+68>>2]+(b<<1)|0;F[G[a+64>>2]+((G[a+52>>2]&c)<<1)>>1]=I[g>>1];F[g>>1]=c;d=d-1|0;G[a+5812>>2]=d;c=c+1|0;if(e+d>>>0>2){continue}break}}if(e>>>0>261){break a}if(G[G[a>>2]+4>>2]){continue}}break}d=G[a+60>>2];b=G[a+5824>>2];e:{if(d>>>0<=b>>>0){break e}c=G[a+116>>2]+G[a+108>>2]|0;f:{if(c>>>0>b>>>0){b=d-c|0;b=b>>>0<258?b:258;cb(c+G[a+56>>2]|0,0,b);b=b+c|0;break f}c=c+258|0;if(c>>>0<=b>>>0){break e}h=b+G[a+56>>2]|0;c=c-b|0;b=d-b|0;b=b>>>0>c>>>0?c:b;cb(h,0,b);b=b+G[a+5824>>2]|0}G[a+5824>>2]=b}}function fo(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=Fa-112|0;Fa=g;k=G[f>>2];a:{b:{if((k|0)<=0){h=G[a+4>>2]+940|0;break b}n=237;h=f;if((k|0)!=237){break a}}G[h>>2]=0;E[d|0]=0;G[e>>2]=0;i=G[a>>2];h=G[a+4>>2];c:{d:{if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,f);break d}if((G[h+128>>2]&G[h+132>>2])!=-1){break d}if((Rb(a,f)|0)>0){break c}}e:{f:{h=G[a+4>>2];j=G[h+940>>2];if((j|0)>=G[h+936>>2]){break f}h=G[h+968>>2]+M(j,160)|0;i=0;while(1){Fg(c,h,b,g+12|0,g+8|0);g:{if(!G[g+12>>2]){break g}l=G[g+8>>2];if(!(!i|!l)){G[G[a+4>>2]+940>>2]=G[e>>2];G[f>>2]=237;break a}if(i){i=1;break g}if(l){Za(d,h);i=1;G[e>>2]=j+1;break g}i=0;if(m){m=1;o=0;break g}Za(d,h);m=1;l=j+1|0;G[e>>2]=l;G[G[a+4>>2]+940>>2]=l;o=1}h=h+160|0;j=j+1|0;if((j|0)>2]+936>>2]){continue}break}if(i){if((k|0)<=0){break e}G[f>>2]=237;break e}if(!m){break f}if(!(!o|(k|0)>0)){break e}G[f>>2]=237;break e}h:{i:{if((k|0)<=0){G[48624]=0;b=nc(c,g+108|0,10);j:{if((H[G[g+108>>2]]|32)==32){if(G[48624]==68){break j}if((b|0)<=0){break i}h=G[a+4>>2];if((b|0)>G[h+936>>2]){break i}G[e>>2]=b;Za(d,(G[h+968>>2]+M(b,160)|0)-160|0);break e}if(G[48624]!=68){break i}}b=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);d=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[g+62>>1]=d;F[g+64>>1]=d>>>16;F[g+66>>1]=b;F[g+68>>1]=b>>>16;b=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[g+56>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[g+60>>2]=b;b=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[g+48>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[g+52>>2]=b;b=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[g+40>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[g+44>>2]=b;b=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[g+32>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[g+36>>2]=b;b=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[g+24>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[g+28>>2]=b;b=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[g+16>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[g+20>>2]=b;tb(5,qb(g+16|0,c,25));G[48624]=0;n=412}G[f>>2]=219;if((n|0)!=237){break h}break e}G[f>>2]=219}G[g>>2]=c;b=g+16|0;Ya(b,81,8656,g);tb(5,b)}G[G[a+4>>2]+940>>2]=G[e>>2]}}Fa=g+112|0}function bg(a,b,c,d,e,f,g,h,i,j,k,l,m){var n=0,o=0;n=Fa-16|0;Fa=n;o=G[m>>2];if((o|0)<=0){a:{b:{switch(b-1|0){case 0:xp(a,c,d,e,f,g,h,i,k,m);break a;case 10:if(!j){Re(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}Re(a,c,d,e,f,g,h,i,1,1,H[j|0],k,n+14|0,l,m);break a;case 11:if(!j){Ef(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}Ef(a,c,d,e,f,g,h,i,1,1,E[j|0],k,n+14|0,l,m);break a;case 19:if(!j){Gf(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}Gf(a,c,d,e,f,g,h,i,1,1,I[j>>1],k,n+14|0,l,m);break a;case 20:if(!j){jf(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}jf(a,c,d,e,f,g,h,i,1,1,F[j>>1],k,n+14|0,l,m);break a;case 29:if(!j){Dh(a,c,d,e,f,g,h,i,1,0,k,n+14|0,l,m);break a}Dh(a,c,d,e,f,g,h,i,1,G[j>>2],k,n+14|0,l,m);break a;case 30:if(!j){Eh(a,c,d,e,f,g,h,i,1,0,k,n+14|0,l,m);break a}Eh(a,c,d,e,f,g,h,i,1,G[j>>2],k,n+14|0,l,m);break a;case 39:if(!j){qe(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}qe(a,c,d,e,f,g,h,i,1,1,G[j>>2],k,n+14|0,l,m);break a;case 40:if(!j){Ud(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}Ud(a,c,d,e,f,g,h,i,1,1,G[j>>2],k,n+14|0,l,m);break a;case 79:if(!j){hf(a,c,d,e,f,g,h,i,1,1,0,0,k,n+14|0,l,m);break a}hf(a,c,d,e,f,g,h,i,1,1,G[j>>2],G[j+4>>2],k,n+14|0,l,m);break a;case 80:if(!j){Se(a,c,d,e,f,g,h,i,1,1,0,0,k,n+14|0,l,m);break a}Se(a,c,d,e,f,g,h,i,1,1,G[j>>2],G[j+4>>2],k,n+14|0,l,m);break a;case 41:if(!j){ae(a,c,d,e,f,g,h,i,1,1,N(0),k,n+14|0,l,m);break a}ae(a,c,d,e,f,g,h,i,1,1,K[j>>2],k,n+14|0,l,m);break a;case 81:if(!j){Id(a,c,d,e,f,g,h,i,1,1,0,k,n+14|0,l,m);break a}Id(a,c,d,e,f,g,h,i,1,1,L[j>>3],k,n+14|0,l,m);break a;case 82:b=i<<1|h>>>31;h=h<<1;i=f;f=g<<1|i>>>31;i=i<<1;g=i-1|0;f=f-!i|0;if(!j){ae(a,c,d,e,g,f,h,b,1,1,N(0),k,n+14|0,l,m);break a}ae(a,c,d,e,g,f,h,b,1,1,K[j>>2],k,n+14|0,l,m);break a;case 162:b=i<<1|h>>>31;h=h<<1;i=f;f=g<<1|i>>>31;i=i<<1;g=i-1|0;f=f-!i|0;if(!j){Id(a,c,d,e,g,f,h,b,1,1,0,k,n+14|0,l,m);break a}Id(a,c,d,e,g,f,h,b,1,1,L[j>>3],k,n+14|0,l,m);break a;case 13:if(!j){fg(a,c,d,e,f,g,h,i,1,0,k,n+14|0,l,m);break a}fg(a,c,d,e,f,g,h,i,1,E[j|0],k,n+14|0,l,m);break a;case 15:if(!j){E[n+14|0]=0;b=a;a=n+14|0;xh(b,c,d,e,f,g,h,i,1,a,k,a,l,m);break a}xh(a,c,d,e,f,g,h,i,1,j,k,n+14|0,l,m);break a;default:break b}}G[m>>2]=410}o=G[m>>2]}Fa=n+16|0;return o}function Dn(a,b,c,d,e,f,g,h,i,j,k,l,m,n){var o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;o=Fa-560|0;Fa=o;p=G[n>>2];a:{if((p|0)>0){break a}if((d|0)>=5){Ua(6766);p=320;G[n>>2]=320;break a}p=11;b:{c:{d:{e:{f:{switch(c-8|0){case 0:break b;case 24:break c;case 8:break d;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:break e;default:break f}}if((c|0)!=-64){if((c|0)!=-32){break e}p=42;break b}p=82;break b}p=410;G[n>>2]=410;break a}p=21;break b}p=31}s=G[a>>2];if((s|0)!=G[G[a+4>>2]+76>>2]){mb(a,s+1|0,0,n)}G[o+396>>2]=k;L[o+400>>3]=j;G[o+392>>2]=l;G[o+276>>2]=p;G[o+252>>2]=a;G[o+408>>2]=m;G[o+256>>2]=d;if((d|0)>0){c=0;while(1){k=c<<3;m=c<<2;t=+G[m+e>>2];L[k+(o+512|0)>>3]=t;l=k+(o+480|0)|0;q=L[g+k>>3];L[l>>3]=q;r=L[h+k>>3];g:{h:{if(r>3];if(j>0){break h}}j=L[i+k>>3];if(!(q>3]=j;eo(a,G[f+m>>2],o+556|0,n);i:{j:{if(G[o+556>>2]>41){break j}if(O(q)<2147483648){m=~~q}else{m=-2147483648}u=+(m|0);if(O(j)<2147483648){m=~~j}else{m=-2147483648}v=q!=u;if(O(r)<2147483648){s=~~r}else{s=-2147483648}if(v|r!=+(s|0)|+(m|0)!=j){break j}L[k+(o+416|0)>>3]=t+1;if(q>3]=q+-.5;break i}L[l>>3]=q+.5;break i}L[k+(o+416|0)>>3]=(r-q)/j}c=c+1|0;if((d|0)!=(c|0)){continue}break}j=L[o+512>>3];k:{if(O(j)<2147483648){c=~~j;break k}c=-2147483648}j=L[o+448>>3];q=L[o+416>>3];r=L[o+480>>3];d=G[o+256>>2]}a=G[f>>2];L[o+360>>3]=j;L[o+328>>3]=q;L[o+296>>3]=r;G[o+260>>2]=a;G[o+280>>2]=c;l:{if((d|0)<2){break l}G[o+264>>2]=G[f+4>>2];L[o+304>>3]=L[o+488>>3];L[o+336>>3]=L[o+424>>3];L[o+368>>3]=L[o+456>>3];j=L[o+520>>3];m:{if(O(j)<2147483648){a=~~j;break m}a=-2147483648}G[o+284>>2]=a;if((d|0)==2){break l}G[o+268>>2]=G[f+8>>2];L[o+312>>3]=L[o+496>>3];L[o+344>>3]=L[o+432>>3];L[o+376>>3]=L[o+464>>3];j=L[o+528>>3];n:{if(O(j)<2147483648){a=~~j;break n}a=-2147483648}G[o+288>>2]=a;if(d>>>0<4){break l}G[o+272>>2]=G[f+12>>2];L[o+320>>3]=L[o+504>>3];L[o+352>>3]=L[o+440>>3];L[o+384>>3]=L[o+472>>3];j=L[o+536>>3];o:{if(O(j)<2147483648){a=~~j;break o}a=-2147483648}G[o+292>>2]=a}G[o>>2]=b;G[o+80>>2]=p;G[o+84>>2]=2;$f(1,o,0,-1,19,o+248|0,n);p=G[n>>2]}Fa=o+560|0;return p}function jq(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=N(0),o=0,p=0;k=c==1&d==0;a:{if(!e){if(!k){if((b|0)<=0){break a}e=0;if((b|0)!=1){f=b&-2;i=0;while(1){K[(e<<2)+j>>2]=+F[(e<<1)+a>>1]*c+d;h=e|1;K[(h<<2)+j>>2]=+F[(h<<1)+a>>1]*c+d;e=e+2|0;i=i+2|0;if((f|0)!=(i|0)){continue}break}}if(!(b&1)){break a}K[(e<<2)+j>>2]=+F[(e<<1)+a>>1]*c+d;break a}if((b|0)<=0){break a}f=b&3;i=0;e=0;if(b-1>>>0>=3){h=b&-4;b=0;while(1){K[(e<<2)+j>>2]=F[(e<<1)+a>>1];k=e|1;K[(k<<2)+j>>2]=F[(k<<1)+a>>1];k=e|2;K[(k<<2)+j>>2]=F[(k<<1)+a>>1];k=e|3;K[(k<<2)+j>>2]=F[(k<<1)+a>>1];e=e+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}if(!f){break a}while(1){K[(e<<2)+j>>2]=F[(e<<1)+a>>1];e=e+1|0;i=i+1|0;if((f|0)!=(i|0)){continue}break}break a}b:{if(!k){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;f=f&65535;while(1){k=I[(e<<1)+a>>1];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}K[(e<<2)+j>>2]=+(k<<16>>16)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){e=0;if((b|0)!=1){m=b&-2;o=f&65535;k=0;while(1){l=I[(e<<1)+a>>1];d:{if((l|0)==(o|0)){G[i>>2]=1;E[e+h|0]=1;break d}K[(e<<2)+j>>2]=l<<16>>16}l=e|1;p=I[(l<<1)+a>>1];e:{if((o|0)!=(p|0)){K[(l<<2)+j>>2]=p<<16>>16;break e}G[i>>2]=1;E[h+l|0]=1}e=e+2|0;k=k+2|0;if((m|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];if((a|0)!=(f&65535)){K[(e<<2)+j>>2]=a<<16>>16;break a}G[i>>2]=1;E[e+h|0]=1;break a}e=0;if((b|0)!=1){o=b&-2;h=f&65535;k=0;while(1){m=(e<<2)+j|0;l=I[(e<<1)+a>>1];f:{if((l|0)!=(h|0)){n=N(l<<16>>16);break f}G[i>>2]=1;n=g}K[m>>2]=n;l=e|1;m=I[(l<<1)+a>>1];g:{if((m|0)!=(h|0)){n=N(m<<16>>16);break g}G[i>>2]=1;n=g}K[(l<<2)+j>>2]=n;e=e+2|0;k=k+2|0;if((o|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];h:{if((a|0)!=(f&65535)){g=N(a<<16>>16);break h}G[i>>2]=1}K[(e<<2)+j>>2]=g;break a}e=0;if((b|0)!=1){o=b&-2;h=f&65535;k=0;while(1){m=(e<<2)+j|0;l=I[(e<<1)+a>>1];i:{if((l|0)!=(h|0)){n=N(+(l<<16>>16)*c+d);break i}G[i>>2]=1;n=g}K[m>>2]=n;l=e|1;m=I[(l<<1)+a>>1];j:{if((m|0)!=(h|0)){n=N(+(m<<16>>16)*c+d);break j}G[i>>2]=1;n=g}K[(l<<2)+j>>2]=n;e=e+2|0;k=k+2|0;if((o|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];k:{if((a|0)!=(f&65535)){g=N(+(a<<16>>16)*c+d);break k}G[i>>2]=1}K[(e<<2)+j>>2]=g}}function fq(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;k=c==1&d==0;a:{if(!e){if(!k){if((b|0)<=0){break a}e=0;if((b|0)!=1){f=b&-2;i=0;while(1){L[(e<<3)+j>>3]=+F[(e<<1)+a>>1]*c+d;h=e|1;L[(h<<3)+j>>3]=+F[(h<<1)+a>>1]*c+d;e=e+2|0;i=i+2|0;if((f|0)!=(i|0)){continue}break}}if(!(b&1)){break a}L[(e<<3)+j>>3]=+F[(e<<1)+a>>1]*c+d;break a}if((b|0)<=0){break a}f=b&3;i=0;e=0;if(b-1>>>0>=3){h=b&-4;b=0;while(1){L[(e<<3)+j>>3]=F[(e<<1)+a>>1];k=e|1;L[(k<<3)+j>>3]=F[(k<<1)+a>>1];k=e|2;L[(k<<3)+j>>3]=F[(k<<1)+a>>1];k=e|3;L[(k<<3)+j>>3]=F[(k<<1)+a>>1];e=e+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}if(!f){break a}while(1){L[(e<<3)+j>>3]=F[(e<<1)+a>>1];e=e+1|0;i=i+1|0;if((f|0)!=(i|0)){continue}break}break a}b:{if(!k){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;f=f&65535;while(1){k=I[(e<<1)+a>>1];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}L[(e<<3)+j>>3]=+(k<<16>>16)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){e=0;if((b|0)!=1){m=b&-2;n=f&65535;k=0;while(1){l=I[(e<<1)+a>>1];d:{if((l|0)==(n|0)){G[i>>2]=1;E[e+h|0]=1;break d}L[(e<<3)+j>>3]=l<<16>>16}l=e|1;p=I[(l<<1)+a>>1];e:{if((n|0)!=(p|0)){L[(l<<3)+j>>3]=p<<16>>16;break e}G[i>>2]=1;E[h+l|0]=1}e=e+2|0;k=k+2|0;if((m|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];if((a|0)!=(f&65535)){L[(e<<3)+j>>3]=a<<16>>16;break a}G[i>>2]=1;E[e+h|0]=1;break a}e=0;if((b|0)!=1){n=b&-2;h=f&65535;k=0;while(1){m=(e<<3)+j|0;l=I[(e<<1)+a>>1];f:{if((l|0)!=(h|0)){c=+(l<<16>>16);break f}G[i>>2]=1;c=g}L[m>>3]=c;l=e|1;m=I[(l<<1)+a>>1];g:{if((m|0)!=(h|0)){c=+(m<<16>>16);break g}G[i>>2]=1;c=g}L[(l<<3)+j>>3]=c;e=e+2|0;k=k+2|0;if((n|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];h:{if((a|0)!=(f&65535)){g=+(a<<16>>16);break h}G[i>>2]=1}L[(e<<3)+j>>3]=g;break a}e=0;if((b|0)!=1){n=b&-2;h=f&65535;k=0;while(1){m=(e<<3)+j|0;l=I[(e<<1)+a>>1];i:{if((l|0)!=(h|0)){o=+(l<<16>>16)*c+d;break i}G[i>>2]=1;o=g}L[m>>3]=o;l=e|1;m=I[(l<<1)+a>>1];j:{if((m|0)!=(h|0)){o=+(m<<16>>16)*c+d;break j}G[i>>2]=1;o=g}L[(l<<3)+j>>3]=o;e=e+2|0;k=k+2|0;if((n|0)!=(k|0)){continue}break}}if(!(b&1)){break a}a=I[(e<<1)+a>>1];k:{if((a|0)!=(f&65535)){g=+(a<<16>>16)*c+d;break k}G[i>>2]=1}L[(e<<3)+j>>3]=g}}function ig(a,b,c){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;f=Fa-208|0;Fa=f;a:{if(G[c>>2]>0){break a}e=G[a>>2];if((e|0)!=G[G[a+4>>2]+76>>2]){mb(a,e+1|0,0,c)}b:{if((b|0)<=0){break b}h=G[a+4>>2];i=G[h+96>>2]+(G[h+76>>2]<<3)|0;e=G[i+4>>2];k=G[i>>2];l=Bu(k,e,-80,-1);i=G[h+104>>2];j=l+i|0;l=G[h+108>>2];g=l+Ia|0;g=j>>>0>>0?g+1|0:g;if((g|0)<=0&b>>>0>j>>>0|(g|0)<0){break b}j=M(b,80)-80|0;k=j+k|0;g=(j>>31)+e|0;e=k;G[h+120>>2]=e;g=j>>>0>e>>>0?g+1|0:g;G[h+124>>2]=g;r=Bu(i-e|0,l-((e>>>0>i>>>0)+g|0)|0,80,0);if((r|0)<=0){G[f>>2]=b;a=f+112|0;Ya(a,81,42454,f);Ua(a);break b}s=H[68297];E[f+56|0]=s;m=H[68293]|H[68294]<<8|(H[68295]<<16|H[68296]<<24);g=H[68289]|H[68290]<<8|(H[68291]<<16|H[68292]<<24);G[f+48>>2]=g;G[f+52>>2]=m;n=H[68285]|H[68286]<<8|(H[68287]<<16|H[68288]<<24);k=H[68281]|H[68282]<<8|(H[68283]<<16|H[68284]<<24);G[f+40>>2]=k;G[f+44>>2]=n;o=H[68277]|H[68278]<<8|(H[68279]<<16|H[68280]<<24);j=H[68273]|H[68274]<<8|(H[68275]<<16|H[68276]<<24);G[f+32>>2]=j;G[f+36>>2]=o;p=H[68269]|H[68270]<<8|(H[68271]<<16|H[68272]<<24);h=H[68265]|H[68266]<<8|(H[68267]<<16|H[68268]<<24);G[f+24>>2]=h;G[f+28>>2]=p;q=H[68261]|H[68262]<<8|(H[68263]<<16|H[68264]<<24);e=H[68257]|H[68258]<<8|(H[68259]<<16|H[68260]<<24);G[f+16>>2]=e;G[f+20>>2]=q;b=f+16|0;d=b+Va(b)|0;E[d|0]=e;E[d+1|0]=e>>>8;E[d+2|0]=e>>>16;E[d+3|0]=e>>>24;E[d+4|0]=q;E[d+5|0]=q>>>8;E[d+6|0]=q>>>16;E[d+7|0]=q>>>24;E[d+40|0]=s;E[d+32|0]=g;E[d+33|0]=g>>>8;E[d+34|0]=g>>>16;E[d+35|0]=g>>>24;E[d+36|0]=m;E[d+37|0]=m>>>8;E[d+38|0]=m>>>16;E[d+39|0]=m>>>24;E[d+24|0]=k;E[d+25|0]=k>>>8;E[d+26|0]=k>>>16;E[d+27|0]=k>>>24;E[d+28|0]=n;E[d+29|0]=n>>>8;E[d+30|0]=n>>>16;E[d+31|0]=n>>>24;E[d+16|0]=j;E[d+17|0]=j>>>8;E[d+18|0]=j>>>16;E[d+19|0]=j>>>24;E[d+20|0]=o;E[d+21|0]=o>>>8;E[d+22|0]=o>>>16;E[d+23|0]=o>>>24;E[d+8|0]=h;E[d+9|0]=h>>>8;E[d+10|0]=h>>>16;E[d+11|0]=h>>>24;E[d+12|0]=p;E[d+13|0]=p>>>8;E[d+14|0]=p>>>16;E[d+15|0]=p>>>24;h=f+112|0;while(1){e=l-(i>>>0<80)|0;i=i-80|0;Jb(a,i,e,0,c);ic(a,80,0,h,c);l=e;Jb(a,i,e,0,c);e=b;Wb(a,80,0,e,c);b=h;h=e;t=t+1|0;if((t|0)!=(r|0)){continue}break}a=G[a+4>>2];c=a;b=G[a+104>>2];a=G[a+108>>2]-(b>>>0<80)|0;G[c+104>>2]=b-80;G[c+108>>2]=a;break a}G[c>>2]=203}Fa=f+208|0}function Gj(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;a:{if(j==0){break a}q=G[a+16>>2];g=+G[a+32>>2];f=j/g;j=(i-+G[a+24>>2])/g+1;i=f+j;b:{if(O(i)<2147483648){k=~~i;break b}k=-2147483648}m=k-1|0;n=i==+(k|0);o=n?m:k;i=j-f;c:{if(O(i)<2147483648){b=~~i;break c}b=-2147483648}l=b+1|0;d:{if((o|0)>(l|0)){p=G[a+8>>2];b=G[a+44>>2];L[(p+M(c,168)|0)+8>>3]=((b|0)>(l|0)?b:l)|0;b=G[a+48>>2];l=(o|0)>(b|0);k=l?b:k;k=l?k:n?m:k;break d}b=G[a+48>>2];o=(o|0)>(b|0);p=G[a+8>>2];k=o?b:k;L[(p+M(c,168)|0)+8>>3]=(o?k:n?m:k)|0;k=G[a+44>>2];k=(k|0)>(l|0)?k:l}l=M(c,168);m=l+p|0;L[m+16>>3]=k|0;o=lb(b+1|0,4);G[m+24>>2]=o;Pf(a,c,d,e);b=l+G[a+8>>2]|0;r=L[b+16>>3];i=L[b+8>>3];e:{if(O(i)<2147483648){k=~~i;break e}k=-2147483648}i=+(k|0);if(!(r>=i)){break a}g=(h-+(q|0))/g+1;s=M(c,168);while(1){h=i-j;h=f*f-h*h;f:{if(!(h>=0)){break f}i=V(h);h=g+i;g:{if(O(h)<2147483648){b=~~h;break g}b=-2147483648}m=b-(h==+(b|0))|0;h=g-i;h:{if(O(h)<2147483648){l=~~h;break h}l=-2147483648}if((m|0)<=(l|0)){break f}b=G[a+48>>2];c=G[a+44>>2];q=lb(1,8);n=l+1|0;G[q+4>>2]=n;i:{if(!o){break i}c=(c|0)>(k|0)?c:k;p=((b|0)>(c|0)?c:b)<<2;b=p+o|0;c=G[b>>2];j:{if(!c){c=0;break j}if((n|0)>2]){break j}while(1){b=c;c=G[b>>2];if(!c){c=0;break j}if((l|0)>=G[c+4>>2]){continue}break}}G[q>>2]=c;G[b>>2]=q;if((e|0)==1){break i}if(d){b=p+G[a+56>>2]|0;if((l|0)>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(n|0)?b:n}b=p+G[a+60>>2]|0;if((n|0)>2]){break i}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(n|0)?b:n;break i}G[p+G[a+56>>2]>>2]=G[a+36>>2];G[p+G[a+60>>2]>>2]=G[a+40>>2]}b=G[a+48>>2];c=G[a+44>>2];n=lb(1,8);G[n+4>>2]=m;if(!o){break f}c=(c|0)>(k|0)?c:k;l=((b|0)>(c|0)?c:b)<<2;b=l+o|0;c=G[b>>2];k:{if(!c){c=0;break k}if((m|0)>2]){break k}while(1){b=c;c=G[b>>2];if(!c){c=0;break k}if((m|0)>G[c+4>>2]){continue}break}}G[n>>2]=c;G[b>>2]=n;if((e|0)==1){break f}if(d){b=l+G[a+56>>2]|0;if((m|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(m|0)?b:m}b=l+G[a+60>>2]|0;if((m|0)>2]){break f}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(m|0)?b:m;break f}G[l+G[a+56>>2]>>2]=G[a+36>>2];G[l+G[a+60>>2]>>2]=G[a+40>>2]}k=k+1|0;i=+(k|0);if(i<=L[(G[a+8>>2]+s|0)+16>>3]){continue}break}}}function Zl(a){var b=0,c=0,d=0,e=0,f=0,g=0;b=Fa-20672|0;Fa=b;f=em(a);if(G[926536]){G[b+96>>2]=a;kb(77093,b+96|0);$a(G[29763])}if(f){c=Ph(f);if(c){g=G[29763];while(1){if(G[926536]){G[b+80>>2]=c+19;kb(76135,b+80|0);$a(g)}G[b+64>>2]=a;c=c+19|0;G[b+68>>2]=c;d=b+16576|0;db(d,8778,b- -64|0);Za(3739772,d+(I[b+16576>>1]==12078?2:G[935265])|0);if(G[926536]){G[b+52>>2]=3739772;G[b+48>>2]=b+16576;kb(76239,b+48|0);$a(g)}a:{if(Be(b+16576|0,b+104|0)){break a}if((G[b+116>>2]&61440)==16384){if(!G[935257]){break a}if(!Xa(c,48504)){break a}if(!Xa(c,45311)){break a}if(G[926536]){G[b>>2]=b+16576;kb(76155,b);$a(g)}Zl(b+16576|0);break a}d=Va(b+16576|0);if(G[926536]){G[b+32>>2]=b+16576;kb(77122,b+32|0);$a(g)}if(!G[935258]){c=d+(b+16576|0)|0;e=c-9|0;if(!fb(e,4996,9)){break a}if(!fb(e,33375,9)){break a}e=c-10|0;if(!fb(e,5641,10)){break a}if(!fb(e,33593,10)){break a}e=c-12|0;if(!fb(e,2685,12)){break a}if(!fb(e,2722,12)){break a}c=c-13|0;if(!fb(c,2698,13)){break a}if(!fb(c,2735,13)){break a}}c=d+(b+16576|0)|0;d=c-4|0;b:{if(!fb(d,5001,4)){break b}if(!fb(d,33380,4)){break b}d=c-5|0;if(!fb(d,5646,5)){break b}if(!fb(d,33598,5)){break b}d=c-7|0;if(!fb(d,2754,7)){break b}if(!fb(d,2771,7)){break b}if(!fb(d,2690,7)){break b}if(!fb(d,2727,7)){break b}d=c-8|0;if(!fb(d,2762,8)){break b}if(!fb(d,2779,8)){break b}if(!fb(d,2703,8)){break b}if(fb(d,2740,8)){break a}}E[b+12480|0]=0;c:{d=c-7|0;d:{if(!fb(d,2690,7)){break d}if(!fb(d,2727,7)){break d}c=c-8|0;if(!fb(c,2703,8)){break d}if(fb(c,2740,8)){break c}}c=H[32839]|H[32840]<<8|(H[32841]<<16|H[32842]<<24);d=H[32835]|H[32836]<<8|(H[32837]<<16|H[32838]<<24);E[b+8391|0]=d;E[b+8392|0]=d>>>8;E[b+8393|0]=d>>>16;E[b+8394|0]=d>>>24;E[b+8395|0]=c;E[b+8396|0]=c>>>8;E[b+8397|0]=c>>>16;E[b+8398|0]=c>>>24;c=H[32832]|H[32833]<<8|(H[32834]<<16|H[32835]<<24);G[b+8384>>2]=H[32828]|H[32829]<<8|(H[32830]<<16|H[32831]<<24);G[b+8388>>2]=c;c=Za(b+4288|0,kj(b+8384|0));G[b+20>>2]=c;G[b+16>>2]=b+16576;d=b+192|0;db(d,9290,b+16|0);ka(d|0)|0;d=Mh(c,3739768,b+12480|0);Vg(c);if(!d){break a}G[935248]=d+G[935248];break a}c=Mh(b+16576|0,3739768,b+12480|0);if(!c){break a}G[935248]=c+G[935248]}c=Ph(f);if(c){continue}break}}_l(f)}Fa=b+20672|0}function Wb(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=G[e>>2];if((g|0)<=0){g=G[a>>2];if((g|0)!=G[G[a+4>>2]+76>>2]){mb(a,g+1|0,0,e)}if((c|0)>=0&b>>>0>=2147483648|(c|0)>0){Ua(45458);G[e>>2]=106;return 106}g=G[a+4>>2];if(G[g+72>>2]<0){Hc(a,Bu(G[g+56>>2],G[g+60>>2],2880,0),0,e)}g=b;a:{if((c|0)>=0&b>>>0>=8640|(c|0)>0){j=b;b=G[a+4>>2];h=G[b+56>>2];k=j+h|0;j=c;c=G[b+60>>2];f=j+c|0;f=h>>>0>k>>>0?f+1|0:f;k=Bu(k-1|0,f-!k|0,2880,0);l=G[b+72>>2];j=l<<2;m=G[(j+b|0)+1256>>2];f=Au(m,0,-2880,0)+h|0;if((f|0)!=2880){b=f+(G[b+1252>>2]+M(l,2880)|0)|0;f=2880-f|0;bb(b,d,f);b=G[a+4>>2];G[(j+b|0)+1416>>2]=1;g=g-f|0;c=(f>>31)+c|0;h=f+h|0;c=h>>>0>>0?c+1|0:c;d=d+f|0}while(1){f=i<<2;j=f+b|0;n=G[j+1256>>2];if(!((n|0)<(m|0)|(k|0)<(n|0))){if(G[j+1416>>2]){Hg(b,i,e);b=G[a+4>>2]}G[(b+f|0)+1256>>2]=-1}i=i+1|0;if((i|0)!=40){continue}break}if(G[b+64>>2]!=(h|0)|G[b+68>>2]!=(c|0)){Ja[G[(M(G[b+4>>2],84)+1240576|0)+72>>2]](G[b>>2],h,c)|0;b=G[a+4>>2]}j=b;b=g-1|0;f=b-((b|0)%2880|0)|0;fi(j,f,d,e);b=(f>>31)+c|0;h=f+h|0;b=h>>>0>>0?b+1|0:b;i=G[a+4>>2];G[i+64>>2]=h;G[i+68>>2]=b;j=d+f|0;c=g-f|0;d=G[i+36>>2];b:{if((b|0)>=(d|0)&h>>>0>=J[i+32>>2]|(b|0)>(d|0)){G[i+32>>2]=h;G[i+36>>2]=b;d=M(l,2880);g=d+G[i+1252>>2]|0;if(G[i+80>>2]==1){cb(g,32,2880);break b}cb(g,0,2880);break b}d=M(l,2880);Lj(i,2880,d+G[i+1252>>2]|0,e);g=G[a+4>>2];f=G[g+68>>2];i=G[g+64>>2]+2880|0;f=i>>>0<2880?f+1|0:f;G[g+64>>2]=i;G[g+68>>2]=f}bb(G[G[a+4>>2]+1252>>2]+d|0,j,c);a=G[a+4>>2];d=a+(l<<2)|0;G[d+1256>>2]=k;G[d+1416>>2]=1;b=(c>>31)+b|0;d=c+h|0;b=d>>>0>>0?b+1|0:b;G[a+56>>2]=d;G[a+60>>2]=b;c=G[a+44>>2];d=k+1|0;b=d>>31;g=G[a+40>>2];b=Au(d,b,2880,0);j=b;d=b>>>0>>0;b=Ia;d=d&(c|0)>=(b|0)|(b|0)<(c|0);G[a+40>>2]=d?g:j;G[a+44>>2]=d?c:b;break a}if(!g){break a}b=G[a+4>>2];b=Au(G[((G[b+72>>2]<<2)+b|0)+1256>>2],0,-2880,0)+G[b+56>>2]|0;i=2880-b|0;while(1){j=b;b=G[a+4>>2];c=(g|0)<(i|0)?g:i;bb(j+(G[b+1252>>2]+M(G[b+72>>2],2880)|0)|0,d,c);h=G[a+4>>2];f=c+G[h+56>>2]|0;b=G[h+60>>2]+(c>>31)|0;b=c>>>0>f>>>0?b+1|0:b;G[h+56>>2]=f;G[h+60>>2]=b;G[(h+(G[h+72>>2]<<2)|0)+1416>>2]=1;g=g-c|0;if(!g){break a}Hc(a,Bu(f,b,2880,0),1,e);d=c+d|0;b=0;i=2880;continue}}g=G[e>>2]}return g}function Lr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;if(G[c+4>>2]!=703){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=81;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=191;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=45;j=.022222222222222223;break a}f=f*3.141592653589793*.25;j=1/f}G[c+1892>>2]=105;G[c+1888>>2]=106;L[c+112>>3]=f;L[c+120>>3]=j}r=e;b:{c:{if(O(b)==90){G[d>>2]=0;G[d+4>>2]=0;a=L[c+112>>3];a=O(a+a);a=b<0?-a:a;break c}f=Mb(b);k=Mb(a);h=Kb(a);j=Kb(b);g=-j;h=f*h;l=-h;k=f*k;f=-k;n=j180?a+-360:a)*.017453292519943295;f=a*a;a=b*3.141592653589793/180;g=(f+a*a)*.5;break e;case 2:i=0;m=2;if(!(g<1e-8)){break f}a=Yc(a,360);a=(90-(a<-180?a+360:a))*3.141592653589793/180;h=a*a;a=b*3.141592653589793/180;g=(h+a*a)*.5;break f;case 3:i=0;m=4;if(!(g<1e-8)){break g}a=Yc(a,360);a=(180-(a<0?a+360:a))*3.141592653589793/180;f=a*a;a=b*3.141592653589793/180;g=(f+a*a)*.5;break g;case 4:i=0;m=6;if(!(g<1e-8)){break h}a=Yc(a,360);a=a>180?a+-360:a;a=a*((a+90)*3.141592653589793/180);f=a*a;a=b*3.141592653589793/180;g=(f+a*a)*.5;break h;default:break i}}i=-2;if(g<1e-8){a=(b+90)*3.141592653589793/180;g=a*a*.5}f=k;break d}h=k;f=j;break d}h=l;f=j;break d}h=f;f=j;break d}f=j;i=0}b=0;j:{if(!(h!=0|f!=0)){a=0;break j}a=O(f);if(a<=-h){a=f/h;b=a*a+1;f=V(g/(1-1/V(b+1)));a=f/-15*(De(a)-Bc(a/V(b+b)));b=-f;break j}if(a<=h){a=f/h;f=a*a+1;b=V(g/(1-1/V(f+1)));a=b/15*(De(a)-Bc(a/V(f+f)));break j}j=O(h);if(j<-f){a=h/f;b=a*a+1;f=V(g/(1-1/V(b+1)));b=f/-15*(De(a)-Bc(a/V(b+b)));a=-f;break j}a=0;if(!(f>j)){break j}b=h/f;f=b*b+1;a=V(g/(1-1/V(f+1)));b=a/15*(De(b)-Bc(b/V(f+f)))}f=O(b);if(f>1){e=2;if(f>1.000000000001){break b}b=b<0?-1:1}f=O(a);if(f>1){e=2;if(f>1.000000000001){break b}a=a<0?-1:1}L[d>>3]=(m+b)*L[c+112>>3];a=(i+a)*L[c+112>>3]}L[r>>3]=a;e=0}return e|0}function Ck(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;f=Fa-176|0;Fa=f;a:{if(G[d>>2]>0){break a}e=G[a>>2];if((e|0)!=G[G[a+4>>2]+76>>2]){mb(a,e+1|0,0,d)}b:{if((b|0)>0){e=G[a+4>>2];if(G[e+936>>2]>=(b|0)){break b}}G[f>>2]=b;a=f+80|0;Ya(a,81,30457,f);Ua(a);G[d>>2]=302;break a}e=G[(G[e+968>>2]+M(b,160)|0)-80>>2];h=f+80|0;zb(34187,b,h,d);G[c>>2]=0;G[f+40>>2]=0;g=e;e=e>>31;g=(g^e)-e|0;c:{d:{e:{if(Fc(a,h,f+48|0,0,f+40|0)){break e}e=f+48|0;while(1){f:{switch(H[e|0]-32|0){case 0:e=e+1|0;continue;case 33:case 36:case 37:case 38:case 39:case 41:case 47:case 58:case 65:case 68:case 69:case 70:case 71:case 73:case 79:case 90:break f;default:break e}}break}while(1){h=e;i=E[e|0];if(i-48>>>0>=10){e=h+1|0;if(i){continue}}break}e=_b(h);G[c>>2]=e;if(g>>>0<83){break d}G[c>>2]=(e<<1)+3;break c}e=G[c>>2]}if(e){break c}e=f+80|0;zb(34641,b,e,d);Fc(a,e,f+48|0,0,d);zb(34838,b,e,d);G[f+40>>2]=0;e=!Kc(a,e,f+32|0,f+40|0)&L[f+32>>3]!=1;if(!(!e|g>>>0>21)){G[c>>2]=14;break c}if(e&(g|0)==41){G[c>>2]=23;break c}if(e&(g|0)==81){G[c>>2]=23;break c}Dc(a,f+44|0,d);if(G[f+44>>2]==1){e=f+48|0;while(1){a=e;b=E[e|0];if(b-48>>>0>=10){e=a+1|0;if(b){continue}}break}j=c,k=_b(a),G[j>>2]=k;break c}g:{switch(g-1|0){case 0:G[c>>2]=8;break c;case 10:G[c>>2]=4;break c;case 20:G[c>>2]=6;break c;default:break g}}if((g|0)==41){G[c>>2]=11;break c}if((g|0)==81){G[c>>2]=20;break c}h:{i:{j:{k:{l:{m:{switch(g-14|0){default:switch(g-82|0){case 1:break k;case 0:break l;default:break j};case 2:break h;case 0:break i;case 28:break m;case 1:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:break c}}G[c>>2]=14;break c}G[c>>2]=23;break c}G[c>>2]=31;break c}if((g|0)!=163){break c}G[c>>2]=49;break c}G[c>>2]=1;break c}G[f+24>>2]=0;G[f+20>>2]=0;G[f+16>>2]=0;e=f+48|0;n:{o:{if(vd(a,b,f+28|0,f+24|0,f+20|0,f+16|0)){break o}a=G[f+20>>2];if((a|0)<=0){break o}if(G[f+24>>2]>(a|0)){break n}}while(1){a=e;b=E[e|0];if(b-48>>>0>=10){e=a+1|0;if(b){continue}}break}a=_b(a)}G[c>>2]=(a|0)>1?a:1}}Fa=f+176|0}function mp(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a:{if(!G[a+5792>>2]){e=G[a+5820>>2];break a}l=a+5817|0;while(1){m=d+1|0;h=H[G[a+5784>>2]+d|0];n=a;k=I[G[a+5796>>2]+(d<<1)>>1];b:{c:{if(!k){d=(h<<2)+b|0;f=I[d+2>>1];g=I[d>>1];d=G[a+5820>>2];e=I[a+5816>>1]|g<>1]=e;if((d|0)>(16-f|0)){d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[l|0];d=G[a+5820>>2];F[a+5816>>1]=g>>>16-d;e=(d+f|0)-16|0;break c}e=d+f|0;break c}f=H[h+116208|0];j=f<<2;d=j+b|0;i=I[d+1030>>1];g=I[d+1028>>1];d=G[a+5820>>2];e=I[a+5816>>1]|g<>1]=e;d:{if((d|0)>(16-i|0)){d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[l|0];d=G[a+5820>>2];e=g>>>16-d|0;F[a+5816>>1]=e;d=(d+i|0)-16|0;break d}d=d+i|0}G[a+5820>>2]=d;if(f-28>>>0>=4294967276){f=h-G[j+118176>>2]|0;g=G[j+117808>>2];e:{if((16-g|0)<(d|0)){e=f<>1]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[l|0];d=G[a+5820>>2];e=(f&65535)>>>16-d|0;F[a+5816>>1]=e;d=(d+g|0)-16|0;break e}e=f<>1]=e;d=d+g|0}G[a+5820>>2]=d}i=k-1|0;f=H[(i>>>0<256?i:(i>>>7|0)+256|0)+115696|0];k=f<<2;g=k+c|0;j=I[g+2>>1];h=e;e=I[g>>1];h=h|e<>1]=h;f:{if((16-j|0)<(d|0)){d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=h;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[l|0];d=G[a+5820>>2];h=e>>>16-d|0;F[a+5816>>1]=h;e=(d+j|0)-16|0;break f}e=d+j|0}G[a+5820>>2]=e;if(f>>>0<4){break b}f=i-G[k+118304>>2]|0;g=G[k+117936>>2];if((16-g|0)<(e|0)){e=f<>1]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=e;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[l|0];d=G[a+5820>>2];F[a+5816>>1]=(f&65535)>>>16-d;e=(d+g|0)-16|0;break c}F[a+5816>>1]=f<>2]=e}d=m;if(d>>>0>2]){continue}break}}m=I[b+1026>>1];d=I[b+1024>>1];c=I[a+5816>>1]|d<>1]=c;if((16-m|0)<(e|0)){b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=c;b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];b=G[a+5820>>2];F[a+5816>>1]=d>>>16-b;G[a+5820>>2]=(b+m|0)-16;return}G[a+5820>>2]=e+m}function mc(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=G[d>>2];if((e|0)<=0){E[b|0]=0;if(c){E[c|0]=0}f=Va(a);a:{b:{c:{d:{e:{f:{g:{h:{e=H[a|0];if((e|0)==72){if(fb(a,66642,9)){break h}e=qc(a,36178);if((e|0)==(f|0)){if(!c|f>>>0<9){break a}c=Za(c,a+8|0);a=f-9|0;if((a|0)<0){break a}while(1){b=a+c|0;if(H[b|0]!=32){break a}E[b|0]=0;b=(a|0)>0;a=a-1|0;if(b){continue}break}break a}e=e+1|0;break b}if(f>>>0<9){break a}switch(e-67|0){case 1:break c;case 0:break f;case 2:break g;default:break e}}if(f>>>0<9){break a}if(!fb(a,66546,8)){break d}break c}if(!fb(a,68041,8)){break d}break c}if(!fb(a,66587,8)){break d}if(!fb(a,35367,8)){break d}break c}if((e|0)!=32){break c}if(fb(a,68289,8)){break c}}if(!c){break a}c=Za(c,a+8|0);a=f-9|0;if((a|0)<0){break a}while(1){b=a+c|0;if(H[b|0]!=32){break a}E[b|0]=0;b=(a|0)>0;a=a-1|0;if(b){continue}break}break a}g=a+8|0;i:{if(H[a+8|0]!=61){break i}if(fb(g,66740,2)){break i}e=10;break b}e=qc(a,36178);if((e|0)==(f|0)){if(!c){break a}c=Za(c,g);a=f-9|0;if((a|0)<0){break a}while(1){b=a+c|0;if(H[b|0]!=32){break a}E[b|0]=0;b=(a|0)>0;a=a-1|0;if(b){continue}break}break a}e=e+1|0}h=Me(a+e|0,68332)+e|0;if((h|0)==(f|0)){break a}j:{k:{l:{m:{n:{g=a+h|0;switch(H[g|0]-39|0){case 1:break l;case 0:break m;case 8:break n;default:break k}}f=h+1|0;break j}E[b|0]=39;i=1;g=h+1|0;o:{if(g>>>0>=f>>>0){break o}while(1){j=H[a+g|0];if((j|0)!=39){e=g}else{e=h+2|0;k=e+a|0;j=H[k|0];E[b+i|0]=39;if((j|0)!=39){break o}i=i+1|0;j=H[k|0]}E[b+i|0]=j;i=i+1|0;h=e;g=e+1|0;if(g>>>0>>0){continue}break}}if((f|0)==(g|0)){b=((i|0)<69?i:69)+b|0;E[b|0]=39;E[b+1|0]=0;tb(5,37677);tb(5,a);break j}E[(b+i|0)+1|0]=0;f=h+2|0;break j}e=qc(g,64244);if((Va(g)|0)==(e|0)){tb(5,40121);tb(5,a);G[d>>2]=205;return 205}f=b;b=e+1|0;l=rb(f,g,b)+b|0,m=0,E[l|0]=m;f=b+h|0;break j}e=b;b=qc(g,42204);l=rb(e,g,b)+b|0,m=0,E[l|0]=m;f=b+h|0}if(!c){break a}b=Me(a+f|0,68332)+f|0;if(b>>>0>79){break a}if(H[a+b|0]==47){e=b+2|0;b=b+1|0;b=H[a+b|0]==32?e:b}e=Gb(c,a+b|0);a=Va(e);if((a|0)<=0){break a}while(1){b=a-1|0;c=b+e|0;if(H[c|0]!=32){break a}E[c|0]=0;c=a>>>0>1;a=b;if(c){continue}break}}e=G[d>>2]}return e}function bc(a,b,c,d){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,r=0,s=0,t=0,u=0,v=0;t=Fa-80|0;Fa=t;n=-1;a:{if((b|d)<0){break a}b:{i=G[309723];if((i|0)==G[309724]){g=G[309722];c:{if(g){G[309724]=i<<1;g=ub(g,M(i,688));break c}G[309724]=100;g=ab(34400)}if(!g){break b}G[309722]=g;i=G[309723]}G[309723]=i+1;d:{if((i|0)<0){break d}f=G[309722];o=f+M(i,344)|0;G[o+52>>2]=a;G[o+12>>2]=b;G[o+8>>2]=2;G[o>>2]=c;G[o+16>>2]=d;g=M(d,344)+f|0;a=M(b,344);l=a+f|0;v=G[l>>2]==-1e3?G[g>>2]==-1e3:v;a=a+f|0;u=G[a+56>>2];e:{f:{g:{j=G[a+52>>2];if(j-261>>>0<2){break g}if((u|0)==1){break f}e=M(d,344)+f|0;a=G[e+56>>2];if((a|0)==1){break e}h:{if((j|0)!=G[e+52>>2]|(a|0)!=(u|0)){break h}p=G[(M(b,344)+f|0)+60>>2];if((p|0)!=G[(M(d,344)+f|0)+60>>2]){break h}h=1;if((p|0)<=0){break e}a=0;if(p-1>>>0>=3){j=p&-4;while(1){q=a<<2;e=q|4;r=h;s=(M(b,344)+f|0)- -64|0;h=(M(d,344)+f|0)- -64|0;r=G[e+s>>2]==G[e+h>>2]?G[s+q>>2]==G[h+q>>2]?r:0:0;e=q|8;r=G[e+s>>2]==G[e+h>>2]?r:0;e=q|12;h=G[e+s>>2]==G[e+h>>2]?r:0;a=a+4|0;k=k+4|0;if((j|0)!=(k|0)){continue}break}}e=p&3;if(e){while(1){k=a<<2;h=G[(k+(M(b,344)+f|0)|0)- -64>>2]==G[(k+(M(d,344)+f|0)|0)- -64>>2]?h:0;a=a+1|0;m=m+1|0;if((e|0)!=(m|0)){continue}break}}if(h){break g}}a=G[309723];if(a){G[309723]=a-1}if(!G[309737]){G[309737]=431}a=bb(t,135531,80);E[a+79|0]=0;Ua(a);break a}if((u|0)!=1){break e}}l=g}e=M(i,344)+f|0;G[e+56>>2]=G[l+56>>2];G[e+60>>2]=G[l+60>>2];k=G[l+60>>2];i:{if((k|0)<=0){break i}n=0;d=0;if(k-1>>>0>=3){b=k&-4;h=(M(i,344)+f|0)- -64|0;g=0;while(1){j=d<<2;m=l- -64|0;G[j+h>>2]=G[m+j>>2];a=j|4;G[a+h>>2]=G[a+m>>2];a=j|8;G[a+h>>2]=G[a+m>>2];a=j|12;G[a+h>>2]=G[a+m>>2];d=d+4|0;g=g+4|0;if((b|0)!=(g|0)){continue}break}}g=k&3;if(!g){break i}b=M(i,344)+f|0;while(1){a=d<<2;G[(a+b|0)- -64>>2]=G[(a+l|0)- -64>>2];d=d+1|0;n=n+1|0;if((g|0)!=(n|0)){continue}break}}b=M(i,344)+f|0;a=G[l+52>>2];j:{k:{if(!((c|0)!=290|(a|0)!=262)){G[e+56>>2]=1;G[e+60>>2]=1;G[(M(i,344)+f|0)- -64>>2]=1;a=23;break k}a=a-258|0;if(a>>>0>4){break j}a=G[(a<<2)+137072>>2]}G[b+4>>2]=a}if(!v){break d}Ja[G[(M(i,344)+f|0)+4>>2]](o)}n=i;break a}G[309737]=113}Fa=t+80|0;return n}function yo(a,b,c,d,e,f){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;h=1<=2){o=b-1|0;l=c&-2;p=c-1|0;q=(c-2>>>1|0)+1|0;r=(c|0)<2;while(1){f=M(e,k);i=j;m=0;if(r){g=0}else{while(1){g=f;a:{b:{c:{d:{switch(H[a+i|0]-1|0){case 0:g=(e+f|0)+1|0;break b;case 1:g=e+f|0;break b;case 2:g=e+f|0;n=(g<<2)+d|0;G[n+4>>2]=G[n+4>>2]|h;break b;case 3:g=f|1;break b;case 4:g=(e+f<<2)+d|0;G[g+4>>2]=G[g+4>>2]|h;g=f|1;break b;case 5:g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;g=f|1;break b;case 6:g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;G[g+4>>2]=G[g+4>>2]|h;g=f|1;break b;case 8:g=(e+f<<2)+d|0;G[g+4>>2]=G[g+4>>2]|h;break c;case 9:g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;break c;case 10:g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;G[g+4>>2]=G[g+4>>2]|h;break c;case 11:g=(f<<2|4)+d|0;G[g>>2]=G[g>>2]|h;break c;case 12:g=(e+f<<2)+d|0;G[g+4>>2]=G[g+4>>2]|h;g=(f<<2|4)+d|0;G[g>>2]=G[g>>2]|h;break c;case 13:g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;g=(f<<2|4)+d|0;G[g>>2]=G[g>>2]|h;break c;case 7:break b;case 14:break d;default:break a}}g=(e+f<<2)+d|0;G[g>>2]=G[g>>2]|h;G[g+4>>2]=G[g+4>>2]|h;g=(f<<2|4)+d|0;G[g>>2]=G[g>>2]|h}g=f}g=(g<<2)+d|0;G[g>>2]=G[g>>2]|h}i=i+1|0;f=f+2|0;m=m+2|0;if((p|0)>(m|0)){continue}break}j=j+q|0;g=l}if((g|0)<(c|0)){e:{f:{g:{switch(H[a+j|0]-2|0){case 0:case 1:case 4:case 5:f=e+f|0;break f;case 8:i=(e+f<<2)+d|0;G[i>>2]=G[i>>2]|h;break f;case 9:i=(e+f<<2)+d|0;G[i>>2]=G[i>>2]|h;break f;case 12:i=(e+f<<2)+d|0;G[i>>2]=G[i>>2]|h;break f;case 6:case 7:case 10:case 11:break f;case 13:break g;default:break e}}i=(e+f<<2)+d|0;G[i>>2]=G[i>>2]|h}f=(f<<2)+d|0;G[f>>2]=G[f>>2]|h}j=j+1|0}k=k+2|0;if((o|0)>(k|0)){continue}break}}h:{if((b|0)<=(k|0)){break h}f=M(e,k);if((c|0)>=2){l=c-1|0;e=(c-2>>>1|0)+j|0;g=0;while(1){i=f;i:{j:{k:{switch(H[a+j|0]-4|0){case 0:case 1:case 2:case 3:i=f|1;break j;case 4:case 5:case 6:case 7:break j;case 8:case 9:case 10:case 11:break k;default:break i}}b=(f<<2|4)+d|0;G[b>>2]=G[b>>2]|h}b=(i<<2)+d|0;G[b>>2]=G[b>>2]|h}j=j+1|0;f=f+2|0;g=g+2|0;if((l|0)>(g|0)){continue}break}j=e+1|0;b=c&-2}else{b=0}if((b|0)>=(c|0)|(H[a+j|0]&248)!=8){break h}a=(f<<2)+d|0;G[a>>2]=G[a>>2]|h}}function xd(a,b,c,d,e,f){var g=0;g=Fa-336|0;Fa=g;if(G[f>>2]<=0){a:{b:{switch(b-11|0){case 5:lc(a,c,d,e,f);break a;case 0:G[g+16>>2]=H[d|0];G[g+20>>2]=0;E[g+256|0]=0;if((db(g+256|0,26741,g+16|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 1:b=E[d|0];G[g+32>>2]=b;G[g+36>>2]=b>>31;E[g+256|0]=0;if((db(g+256|0,26741,g+32|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 9:G[g+48>>2]=I[d>>1];G[g+52>>2]=0;E[g+256|0]=0;if((db(g+256|0,26741,g+48|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 10:b=F[d>>1];G[g+64>>2]=b;G[g+68>>2]=b>>31;E[g+256|0]=0;if((db(g+256|0,26741,g- -64|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 19:b=g+256|0;ml(+J[d>>2],b,f);d=b;b=g+160|0;Ob(c,d,e,b,f);wb(a,b,f);break a;case 20:b=G[d>>2];G[g+80>>2]=b;G[g+84>>2]=b>>31;E[g+256|0]=0;if((db(g+256|0,26741,g+80|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 3:F[g+256>>1]=G[d>>2]?84:70;b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 29:G[g+96>>2]=G[d>>2];G[g+100>>2]=0;E[g+256|0]=0;if((db(g+256|0,4040,g+96|0)|0)<0){Ua(17840);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 69:b=G[d+4>>2];G[g+112>>2]=G[d>>2];G[g+116>>2]=b;E[g+256|0]=0;if((db(g+256|0,4040,g+112|0)|0)<0){Ua(17840);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 30:b=G[d>>2];G[g+128>>2]=b;G[g+132>>2]=b>>31;E[g+256|0]=0;if((db(g+256|0,26741,g+128|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 70:b=G[d+4>>2];G[g+144>>2]=G[d>>2];G[g+148>>2]=b;E[g+256|0]=0;if((db(g+256|0,26741,g+144|0)|0)<0){Ua(17884);G[f>>2]=401}b=g+160|0;Ob(c,g+256|0,e,b,f);wb(a,b,f);break a;case 31:b=g+256|0;hg(K[d>>2],-7,b,f);d=b;b=g+160|0;Ob(c,d,e,b,f);wb(a,b,f);break a;case 71:b=g+256|0;If(L[d>>3],-15,b,f);d=b;b=g+160|0;Ob(c,d,e,b,f);wb(a,b,f);break a;case 72:pq(a,c,d,e,f);break a;case 152:oq(a,c,d,e,f);break a;default:break b}}G[g>>2]=b;a=g+160|0;Ya(a,81,49140,g);Ua(a);G[f>>2]=410}}Fa=g+336|0}function cl(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0;k=c==1&d==0;a:{if(!e){if(!k){if((b|0)<=0){break a}f=0;if((b|0)!=1){h=b&-2;e=0;while(1){L[(f<<3)+j>>3]=+G[(f<<2)+a>>2]*c+d;i=f|1;L[(i<<3)+j>>3]=+G[(i<<2)+a>>2]*c+d;f=f+2|0;e=e+2|0;if((h|0)!=(e|0)){continue}break}}if(!(b&1)){break a}L[(f<<3)+j>>3]=+G[(f<<2)+a>>2]*c+d;break a}if((b|0)<=0){break a}e=0;f=0;if(b-1>>>0>=3){h=b&-4;i=0;while(1){L[(f<<3)+j>>3]=G[(f<<2)+a>>2];k=f|1;L[(k<<3)+j>>3]=G[(k<<2)+a>>2];k=f|2;L[(k<<3)+j>>3]=G[(k<<2)+a>>2];k=f|3;L[(k<<3)+j>>3]=G[(k<<2)+a>>2];f=f+4|0;i=i+4|0;if((h|0)!=(i|0)){continue}break}}b=b&3;if(!b){break a}while(1){L[(f<<3)+j>>3]=G[(f<<2)+a>>2];f=f+1|0;e=e+1|0;if((b|0)!=(e|0)){continue}break}break a}b:{if(!k){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;while(1){k=G[(e<<2)+a>>2];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}L[(e<<3)+j>>3]=+(k|0)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){k=G[(e<<2)+a>>2];d:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break d}L[(e<<3)+j>>3]=k|0}k=e|1;o=G[(k<<2)+a>>2];e:{if((o|0)!=(f|0)){L[(k<<3)+j>>3]=o|0;break e}G[i>>2]=1;E[h+k|0]=1}e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!l){break a}a=G[(e<<2)+a>>2];if((a|0)!=(f|0)){L[(e<<3)+j>>3]=a|0;break a}G[i>>2]=1;E[e+h|0]=1;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<3)+j|0;l=G[(e<<2)+a>>2];f:{if((l|0)!=(f|0)){c=+(l|0);break f}G[i>>2]=1;c=g}L[m>>3]=c;l=e|1;m=G[(l<<2)+a>>2];g:{if((m|0)!=(f|0)){c=+(m|0);break g}G[i>>2]=1;c=g}L[(l<<3)+j>>3]=c;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(e<<2)+a>>2];h:{if((a|0)!=(f|0)){g=+(a|0);break h}G[i>>2]=1}L[(e<<3)+j>>3]=g;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<3)+j|0;l=G[(e<<2)+a>>2];i:{if((l|0)!=(f|0)){n=+(l|0)*c+d;break i}G[i>>2]=1;n=g}L[m>>3]=n;l=e|1;m=G[(l<<2)+a>>2];j:{if((m|0)!=(f|0)){n=+(m|0)*c+d;break j}G[i>>2]=1;n=g}L[(l<<3)+j>>3]=n;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(e<<2)+a>>2];k:{if((a|0)!=(f|0)){g=+(a|0)*c+d;break k}G[i>>2]=1}L[(e<<3)+j>>3]=g}}function bd(a,b,c,d,e,f,g,h,i,j){var 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;k=Fa-160|0;Fa=k;a:{if(G[j>>2]>0){break a}s=vk(b);G[k+48>>2]=0;G[k+52>>2]=0;G[k+16>>2]=0;G[k+20>>2]=0;G[k+40>>2]=0;G[k+44>>2]=0;G[k+32>>2]=0;G[k+36>>2]=0;G[k>>2]=0;G[k+4>>2]=0;G[k+8>>2]=0;G[k+12>>2]=0;G[k+144>>2]=1;G[k+148>>2]=1;G[k+136>>2]=1;G[k+140>>2]=1;G[k+128>>2]=1;G[k+132>>2]=1;Qd(a,k+156|0,j);de(a,6,k+128|0,j);G[k+64>>2]=1;G[k+68>>2]=0;p=G[k+132>>2];t=G[k+128>>2];m=t;l=m>>31;G[k+72>>2]=m;G[k+76>>2]=l;l=Au(m,l,p,p>>31);G[k+80>>2]=l;m=Ia;G[k+84>>2]=m;n=l;l=G[k+136>>2];l=Au(n,m,l,l>>31);G[k+88>>2]=l;m=Ia;G[k+92>>2]=m;n=l;l=G[k+140>>2];l=Au(n,m,l,l>>31);G[k+96>>2]=l;m=Ia;G[k+100>>2]=m;n=l;l=G[k+144>>2];x=k,y=Au(n,m,l,l>>31),G[x+104>>2]=y;G[k+108>>2]=Ia;u=G[k+156>>2];if((u|0)>0){l=e;e=c;c=c-1|0;l=l+c|0;d=d-!e|0;o=d+f|0;e=l-1|0;f=(c>>>0>l>>>0?o+1|0:o)-!l|0;l=u;while(1){v=l-1|0;m=v<<2;o=(k- -64|0)+(v<<3)|0;q=G[o>>2];r=G[o+4>>2];w=Bu(c,d,q,r);G[m+(k+32|0)>>2]=w;n=k+m|0;m=Bu(e,f,q,r);G[n>>2]=m;o=m>>31;n=e;m=Au(q,r,m,o);e=e-m|0;f=f-(Ia+(m>>>0>n>>>0)|0)|0;m=w;o=m>>31;n=c;m=Au(q,r,m,o);c=c-m|0;d=d-(Ia+(m>>>0>n>>>0)|0)|0;m=l>>>0>1;l=v;if(m){continue}break}}b:{c:{switch(u-1|0){case 1:ro(a,b,s,0,k+32|0,k,k+128|0,g,h,i,k+124|0,j);break b;case 2:c=G[k>>2];d:{if(G[k+32>>2]|G[k+36>>2]|(c|0)!=(t-1|0)){break d}d=G[k+4>>2];if((d|0)!=(p-1|0)){break d}G[k+32>>2]=1;G[k+36>>2]=1;G[k>>2]=c+1;G[k+4>>2]=d+1;G[k+40>>2]=G[k+40>>2]+1;G[k+8>>2]=G[k+8>>2]+1;G[k+44>>2]=G[k+44>>2]+1;G[k+12>>2]=G[k+12>>2]+1;G[k+48>>2]=G[k+48>>2]+1;G[k+16>>2]=G[k+16>>2]+1;G[k+52>>2]=G[k+52>>2]+1;G[k+20>>2]=G[k+20>>2]+1;uh(a,b,k+32|0,k,g,h,i,j);break b}e=G[k+4>>2];l=G[k+40>>2];d=G[k+8>>2];if((l|0)<(d|0)){G[k+4>>2]=p-1;G[k>>2]=t-1}if((d|0)<(l|0)){break b}while(1){if((d|0)==(l|0)){G[k+4>>2]=e;G[k>>2]=c}ro(a,b,s,l,k+32|0,k,k+128|0,g,h,i,k+124|0,j);G[k+32>>2]=0;G[k+36>>2]=0;h=M(G[k+124>>2],s)+h|0;f=(d|0)==(l|0);l=l+1|0;if(!f){continue}break};break b;default:Ua(28010);G[j>>2]=413;break a;case 0:break c}}G[k+32>>2]=G[k+32>>2]+1;G[k>>2]=G[k>>2]+1;uh(a,b,k+32|0,k,g,h,i,j)}}Fa=k+160|0}function kc(a,b,c,d){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,r=0,s=0,t=0,u=0,v=0,w=0;i=Fa-176|0;Fa=i;e=G[d>>2];a:{if((e|0)>0){break a}E[i+80|0]=0;while(1){g=b+f|0;f=f+1|0;if(H[g|0]==32){continue}break}h=qb(i+80|0,g,74);e=Va(h);b=e&e>>31;b:{c:{while(1){g=e;if((e|0)<=0){break c}e=g-1|0;if(H[h+e|0]==32){continue}break}e=0;E[g+h|0]=0;while(1){k=e+h|0;b=E[k|0];E[k|0]=b-97>>>0<26?b&95:b;e=e+1|0;if((g|0)!=(e|0)){continue}break}b=g;break b}E[b+h|0]=0}d:{e:{f:{if(H[h|0]!=72){g=b;break f}if(G[h>>2]!=1380272456|G[h+4>>2]!=1212371521){g=b;break f}g=8;if((b|0)==8){break e}b=h+8|0;while(1){f=b;b=f+1|0;e=H[f|0];if((e|0)==32){continue}break}g=e;b=h;if(e){g=0;while(1){E[b|0]=e;g=g+1|0;b=b+1|0;e=H[f+1|0];f=f+1|0;if(e){continue}break}}E[b|0]=0}r=1;o=1;b=g;if((g|0)>8){break d}}o=0;g:{if(jb(h,63)){break g}m=jb(h,42);if(m){break g}m=0;if(jb(h,35)){break g}o=1;b=g;break d}b=m?g-2|0:g;m=1}e=G[a>>2];f=G[a+4>>2];if((e|0)!=G[f+76>>2]){mb(a,e+1|0,0,d);f=G[a+4>>2];e=G[f+76>>2]}k=G[f+104>>2];j=G[f+96>>2]+(e<<3)|0;e=G[j>>2];j=G[j+4>>2];l=Bu(k-e|0,G[f+108>>2]-(j+(e>>>0>k>>>0)|0)|0,80,0);k=G[f+120>>2];k=Bu(k-e|0,G[f+124>>2]-((e>>>0>k>>>0)+j|0)|0,80,0);e=l-k|0;s=!o;p=((g|0)>2?g:2)-1|0;t=p+h|0;u=i+p|0;h:{while(1){i:{if((e|0)<=0){break i}j=0;if(r){while(1){Jg(a,c,d);Fi(c,i,i+172|0);j:{n=G[i+172>>2];if((n|0)<(b|0)|!((g|0)==(n|0)|s)){break j}f=0;if((n|0)>0){while(1){l=f+i|0;q=E[l|0];if((q|0)>=97){v=l;l=q&255;E[v|0]=l-97>>>0<26?l&95:l}f=f+1|0;if((n|0)!=(f|0)){continue}break}}if(!o){Fg(h,i,1,i+168|0,i+164|0);if(!G[i+168>>2]){break j}break h}k:{if(H[t|0]!=H[u|0]){if(g|n){break j}break k}if(H[h|0]!=H[i|0]){break j}if(fb(h,i,p)){break j}}e=G[d>>2];break a}j=j+1|0;if((j|0)!=(e|0)){continue}break i}}while(1){Jg(a,c,d);if(H[c|0]==72){if(!fb(34939,c,8)){break h}}j=j+1|0;if((j|0)!=(e|0)){continue}break}}if(!((m|w)&1)){e=G[a>>2];f=G[a+4>>2];if((e|0)!=G[f+76>>2]){mb(a,e+1|0,0,d);f=G[a+4>>2];e=G[f+76>>2]}e=G[f+96>>2]+(e<<3)|0;j=G[e+4>>2];G[f+120>>2]=G[e>>2];G[f+124>>2]=j;w=1;e=k;continue}break}e=202;G[d>>2]=202;break a}e=G[d>>2]}Fa=i+176|0;return e}function Mm(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=Fa-128|0;Fa=j;a:{b:{c:{if(!Sf(f,g,h,i,0,0,0,0)){break c}m=i&65535;n=i>>>16&32767;d:{e:{if((n|0)!=32767){l=4;if(n){break e}l=f|h|(g|m)?3:2;break d}l=!(f|h|(g|m))}}r=e>>>16|0;o=r&32767;if((o|0)==32767){break c}if(l){break b}}tc(j+16|0,b,c,d,e,f,g,h,i);e=G[j+16>>2];d=G[j+20>>2];c=G[j+24>>2];b=G[j+28>>2];Nm(j,e,d,c,b,e,d,c,b);d=G[j+8>>2];e=G[j+12>>2];h=G[j>>2];i=G[j+4>>2];break a}m=e&65535|o<<16;p=m;l=d;m=h;q=i>>>16&32767;k=i&65535|q<<16;if((Sf(b,c,l,p,f,g,h,k)|0)<=0){if(Sf(b,c,l,p,f,g,m,k)){h=b;i=c;break a}tc(j+112|0,b,c,d,e,0,0,0,0);d=G[j+120>>2];e=G[j+124>>2];h=G[j+112>>2];i=G[j+116>>2];break a}if(o){i=c;h=b}else{tc(j+96|0,b,c,l,p,0,0,0,1081540608);h=G[j+108>>2];p=h;l=G[j+104>>2];o=(h>>>16|0)-120|0;i=G[j+100>>2];h=G[j+96>>2]}if(!q){tc(j+80|0,f,g,m,k,0,0,0,1081540608);f=G[j+92>>2];k=f;m=G[j+88>>2];q=(k>>>16|0)-120|0;g=G[j+84>>2];f=G[j+80>>2]}s=k&65535|65536;p=p&65535|65536;if((o|0)>(q|0)){while(1){t=l-m|0;k=(g|0)==(i|0)&f>>>0>h>>>0|g>>>0>i>>>0;n=(p-((l>>>0>>0)+s|0)|0)-(t>>>0>>0)|0;k=t-k|0;f:{if((n|0)>0|(n|0)>=0){l=h;h=h-f|0;i=i-((f>>>0>l>>>0)+g|0)|0;if(!(h|k|(i|n))){tc(j+32|0,b,c,d,e,0,0,0,0);d=G[j+40>>2];e=G[j+44>>2];h=G[j+32>>2];i=G[j+36>>2];break a}n=n<<1|k>>>31;l=k<<1|i>>>31;p=n;break f}n=p<<1|l>>>31;l=l<<1|i>>>31;p=n}n=i<<1|h>>>31;h=h<<1;i=n;o=o-1|0;if((q|0)<(o|0)){continue}break}o=q}q=l-m|0;n=(g|0)==(i|0)&f>>>0>h>>>0|g>>>0>i>>>0;k=(p-((l>>>0>>0)+s|0)|0)-(q>>>0>>0)|0;m=q-n|0;g:{if((k|0)<0){m=l;k=p;break g}l=h;h=h-f|0;i=i-((f>>>0>l>>>0)+g|0)|0;if(h|m|(i|k)){break g}tc(j+48|0,b,c,d,e,0,0,0,0);d=G[j+56>>2];e=G[j+60>>2];h=G[j+48>>2];i=G[j+52>>2];break a}if((k|0)==65535|k>>>0<65535){while(1){b=i>>>31|0;o=o-1|0;p=i<<1|h>>>31;h=h<<1;i=p;c=b;b=m;k=k<<1|b>>>31;m=c|b<<1;if(k>>>0<65536){continue}break}}b=r&32768;if((o|0)<=0){tc(j- -64|0,h,i,m,k&65535|(b|o+120)<<16,0,0,0,1065811968);d=G[j+72>>2];e=G[j+76>>2];h=G[j+64>>2];i=G[j+68>>2];break a}d=m;e=k&65535|(b|o)<<16}G[a>>2]=h;G[a+4>>2]=i;G[a+8>>2]=d;G[a+12>>2]=e;Fa=j+128|0}function sj(a,b,c){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;d=Fa-256|0;Fa=d;E[c+4|0]=0;E[d+240|0]=0;G[c+28>>2]=-1;G[c+20>>2]=-1;G[c+24>>2]=-1;g=c+4|0;a:{if((a|0)>0){m=c+24|0;n=c+20|0;h=c+13|0;k=c+8|0;while(1){b:{c:{d:{e:{e=(l<<4)+b|0;if(H[e+4|0]==45){i=e+5|0;j=0;o=G[47556];if((o|0)<=0){break e}while(1){if(!fb(i,(j<<2)+190240|0,3)){break e}j=j+1|0;if((o|0)!=(j|0)){continue}break}break d}if(Xa(e,35723)){break b}i=1;if(G[c+28>>2]!=-1){break a}G[c+28>>2]=l;break b}if((j|0)!=(o|0)){break c}}if(!fb(i,145328,3)){break c}if(fb(i,145332,3)){break b}}if(!H[g|0]){G[d+224>>2]=i;db(g,8706,d+224|0);if(!fb(e,48516,4)){G[n>>2]=l;E[k+2|0]=H[35969];f=H[35967]|H[35968]<<8;E[k|0]=f;E[k+1|0]=f>>>8;E[h|0]=68;E[h+1|0]=69;E[h+2|0]=67;E[h+3|0]=0;G[d>>2]=g;db(d+240|0,8790,d);f=m;break b}if(!fb(e,48506,4)){G[m>>2]=l;E[k+2|0]=H[35969];f=H[35967]|H[35968]<<8;E[k|0]=f;E[k+1|0]=f>>>8;E[h|0]=68;E[h+1|0]=69;E[h+2|0]=67;E[h+3|0]=0;G[d+16>>2]=g;db(d+240|0,8798,d+16|0);f=n;break b}f=e+1|0;if(!fb(f,34439,3)){G[n>>2]=l;G[d+64>>2]=E[e|0];db(k,34422,d- -64|0);G[d+48>>2]=E[e|0];db(h,33487,d+48|0);G[d+36>>2]=g;G[d+32>>2]=h;db(d+240|0,8784,d+32|0);f=m;break b}if(!fb(f,33504,3)){G[m>>2]=l;G[d+112>>2]=E[e|0];db(k,34422,d+112|0);G[d+96>>2]=E[e|0];db(h,33487,d+96|0);G[d+84>>2]=g;G[d+80>>2]=k;db(d+240|0,8784,d+80|0);f=n;break b}j=e+2|0;if(!fb(j,34540,2)){G[n>>2]=l;j=E[e|0];G[d+164>>2]=E[f|0];G[d+160>>2]=j;db(k,34536,d+160|0);e=E[e|0];G[d+148>>2]=E[f|0];G[d+144>>2]=e;db(h,33344,d+144|0);G[d+132>>2]=g;G[d+128>>2]=h;db(d+240|0,8784,d+128|0);f=m;break b}i=1;if(fb(j,33354,2)){break a}G[m>>2]=l;j=E[e|0];G[d+212>>2]=E[f|0];G[d+208>>2]=j;db(k,34536,d+208|0);e=E[e|0];G[d+196>>2]=E[f|0];G[d+192>>2]=e;db(h,33344,d+192|0);G[d+180>>2]=g;G[d+176>>2]=k;db(d+240|0,8784,d+176|0);f=n;break b}i=1;if(fb(e,d+240|0,8)|!f){break a}G[f>>2]=l;E[d+240|0]=0}l=l+1|0;if((l|0)!=(a|0)){continue}break}i=1;if(H[d+240|0]){break a}}f:{if(fb(g,33759,3)){a=H[g|0]?137:999;break f}E[g|0]=83;E[g+1|0]=70;E[g+2|0]=76;E[g+3|0]=0;a=137}G[c>>2]=a;i=0}j=i;Fa=d+256|0;return j}function Nr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=N(0),g=N(0),h=0,i=0,j=0,k=N(0),l=0,m=N(0),n=0,o=N(0),p=N(0),q=N(0),r=0,s=N(0),t=0,u=0,v=0,w=0,x=N(0),y=N(0),z=N(0),A=N(0);if(G[c+4>>2]!=702){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=190;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;h=L[c+24>>3];a:{if(h==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;h=45;j=.022222222222222223;break a}h=h*3.141592653589793*.25;j=1/h}G[c+1892>>2]=103;G[c+1888>>2]=104;L[c+112>>3]=h;L[c+120>>3]=j}j=Mb(b);i=Mb(a);a=Kb(a);h=Kb(b);n=-h;b=j*a;r=-b;j=j*i;a=-j;l=h1e-16?N(f*f):N(0);y=+g>1e-16?N(g*g):N(0);z=N((+N(O(N(k*o)))>1e-16?N(g*f):N(0))*N(.15384112298488617));k=N(N(N(q*N(N(g*N(N(-.15959623456001282)-N(q*N(N(g*N(-.021776249632239342))+N(.07591962069272995)))))+N(N(f*N(N(p*N(N(x*N(.10695946961641312))+N(N(y*N(-.1782512068748474))+N(z+N(N(f*N(-.2815285325050354))+N(N(g*N(.08097013086080551))+N(.14118963479995728)))))))+N(N(q*N(-.1316167116165161))+N(g*N(.004869491793215275)))))+N(1.374848484992981))))+g)*k);A=N(O(k));d:{if(A>N(1)){l=2;if(+A>1.0000001000000012){break d}k=kN(1)){l=2;if(+g>1.0000001000000012){break d}f=f>3]=L[c+112>>3]*+N(s+k);L[e>>3]=L[c+112>>3]*+N(m+f);l=0}return l|0}function xl(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=Fa+-64|0;Fa=c;G[c+4>>2]=0;d=Kj(G[b+56>>2],0,33281,0,c+56|0,c+4|0);G[b+124>>2]=d;a:{b:{c:{d:{e:{e=G[c+4>>2];if(!e){f:{if(!G[c+56>>2]){Qd(d,c+52|0,c+4|0);g:{h:{i:{d=G[c+52>>2];switch(d-2|0){case 1:break i;case 0:break g;default:break h}}if(G[a+48>>2]){break g}G[a+48>>2]=16840;G[a+12>>2]=1;G[a+16>>2]=1;break g}G[c>>2]=d;Tb(G[24367],88360,c)}Jj(G[b+124>>2],b+60|0,c+60|0,c+4|0);d=G[c+4>>2];if(d){break e}if(G[a+16>>2]){d=0;j:{k:{switch(G[b>>2]){case 1:if(!G[b+28>>2]){break j}break;case 0:break k;default:break j}}d=G[a+48>>2]}i=b,j=ei(G[b+124>>2],0,0,1,0,d,0,c+32|0,c+16|0,b+24|0,c+4|0),G[i+68>>2]=j;d=G[c+4>>2];if(d){break b}e=(G[c+20>>2]-G[c+36>>2]|0)+1|0;d=(G[c+16>>2]-G[c+32>>2]|0)+1|0}G[b+32>>2]=e;G[b+20>>2]=d;if(!G[a+12>>2]){break f}l:{switch(G[b>>2]){case 1:if(!G[b+28>>2]){break f}break;case 0:break l;default:break f}}G[b+36>>2]=0;f=G[c+40>>2];g=G[c+24>>2];G[b+64>>2]=G[b+68>>2];G[b+40>>2]=(g-f|0)+1;g=G[b+24>>2];f=g>>31;G[b+44>>2]=(M((f^g)-f|0,M(d,e))|0)/8;break f}d=Ij(d,0,0,0,0,L[a+56>>3],0,c+4|0);e=G[c+4>>2];if(e){break d}Jj(d,b+60|0,c+60|0,c+4|0);e=G[c+4>>2];if(e){break d}if(G[a+16>>2]){i=b,j=ei(d,0,0,1,0,0,0,c+32|0,c+16|0,b+24|0,c+4|0),G[i+68>>2]=j;e=G[c+4>>2];if(e){break d}G[b+20>>2]=(G[c+16>>2]-G[c+32>>2]|0)+1;G[b+32>>2]=(G[c+20>>2]-G[c+36>>2]|0)+1;_e(d,c+4|0);break f}_e(G[b+124>>2],c+4|0);e=G[c+4>>2];if(e){break d}G[b+124>>2]=d}bi(G[b+60>>2],256e3);d=rd(G[b+60>>2]);G[b+120>>2]=d;m:{if(G[a+16>>2]){G[b+4>>2]=1;G[b+12>>2]=1;G[b+72>>2]=1;G[b+8>>2]=G[b+20>>2];G[b+16>>2]=G[b+32>>2];break m}de(G[b+124>>2],2,c+8|0,c+4|0);d=G[c+4>>2];if(d){break b}G[b+4>>2]=1;a=G[c+8>>2];G[b+12>>2]=1;G[b+8>>2]=a;a=G[c+12>>2];G[b+72>>2]=1;G[b+16>>2]=a;d=G[b+120>>2]}if(!(!d|!(d?G[d+3312>>2]:0))){a=G[b+120>>2];h=L[(G[a+3304>>2]?768:760)+a>>3];L[b+96>>3]=(h<0?-h:h)*+G[b+72>>2]}Fa=c- -64|0;return}a=G[(a?a+68|0:97468)>>2];wf(a,e);break c}a=G[(a?a+68|0:97468)>>2];wf(a,d);break a}a=G[a+68>>2];wf(a,e)}$a(a);Gh();sc(e);W()}a=G[a+68>>2];wf(a,d)}$a(a);Gh();sc(d);W()}function Ss(a){a=a|0;var 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;h=G[309722];l=G[a+16>>2];r=h+M(l,344)|0;n=G[a+12>>2];o=M(n,344)+h|0;a:{if(G[o>>2]!=-1e3){p=G[o+56>>2];e=0;break a}e=H[o+88|0]}b:{if(G[r>>2]!=-1e3){q=G[(M(l,344)+h|0)+56>>2];f=0;break b}f=H[(M(l,344)+h|0)+88|0]}b=G[a>>2];c:{if(!(p|q)){d:{e:{switch(b-276|0){case 0:E[a+88|0]=(e|f)!=0;break d;case 1:E[a+88|0]=(e|0)!=0&(f|0)!=0;break d;case 2:f:{if(e){b=1;if(f){break f}}b=!(e|f)}E[a+88|0]=b;break d;case 3:b=!e;d=(f|0)!=0;E[a+88|0]=!(b|d)|b&d;break d;case 14:break e;default:break d}}G[a+88>>2]=e<<24>>24}G[a>>2]=-1e3;break c}g=G[a+56>>2];m=G[309727];Nd(a);i=M(g,m);d=G[309737];if((b|0)==290){if(d){break c}d=M(l,344)+h|0;c=G[d+88>>2];if((i|0)>0){b=M(n,344)+h|0;g=0;while(1){c=H[G[b+84>>2]+g|0]?c:E[G[b+88>>2]+g|0]+c|0;G[G[a+88>>2]+(g<<2)>>2]=c;E[G[a+84>>2]+g|0]=0;g=g+1|0;if((i|0)!=(g|0)){continue}break}}G[d+88>>2]=c;break c}if(d){break c}if(G[a>>2]==290){d=M(l,344)+h|0;k=G[d+88>>2];if((i|0)>0){b=M(n,344)+h|0;while(1){k=H[G[b+84>>2]+c|0]?k:E[G[b+88>>2]+c|0]+k|0;G[G[a+88>>2]+(c<<2)>>2]=k;E[G[a+84>>2]+c|0]=0;c=c+1|0;if((i|0)!=(c|0)){continue}break}}G[d+88>>2]=k}if(!m){break c}d=a+88|0;s=a+84|0;t=M(l,344)+h|0;u=M(n,344)+h|0;v=(p|0)>1;c=0;k=0;while(1){m=m-1|0;if(g){while(1){i=i-1|0;if(p){b=v?i:m;k=H[b+G[u+84>>2]|0];e=H[b+G[u+88>>2]|0]}if(q){b=(q|0)>1?i:m;c=H[b+G[t+84>>2]|0];f=H[b+G[t+88>>2]|0]}g=g-1|0;j=((c|k)&255)!=0;E[G[a+84>>2]+i|0]=j;g:{h:{i:{j:{switch(G[a>>2]-276|0){case 0:b=(e|f)!=0;if(!j){break i}b=k&255;if(f?!b|c&255:1){if(!e|(!(c&255)|b)){break g}}E[G[d>>2]+i|0]=1;j=0;b=s;break h;case 1:b=(e|0)!=0&(f|0)!=0;if(!j){break i}b=k&255;if(f?1:!b|c&255){if(e|(!(c&255)|b)){break g}}j=0;E[G[d>>2]+i|0]=0;b=s;break h;case 2:if(e){j=1;b=d;if(f){break h}}b=!(e|f);break i;case 3:break j;default:break g}}b=!e;j=(f|0)!=0;b=!(b|j)|b&j}j=b;b=d}E[G[b>>2]+i|0]=j}if(g){continue}break}}g=G[a+56>>2];if(m){continue}break}}if(G[o>>2]>0){Wa(G[(M(n,344)+h|0)+88>>2])}if(G[r>>2]>0){Wa(G[(M(l,344)+h|0)+88>>2])}}function aq(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<2)+j|0;c:{d:{n=+F[(l<<1)+a>>1]*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;break d}if(n>0x7ffffffffffffc00){G[k>>2]=-11;e=2147483647;break c}if(!(O(n)<2147483648)){break d}e=~~n;break c}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;m=f&65535;while(1){f=I[(l<<1)+a>>1];e:{if((f|0)==(m|0)){G[i>>2]=1;if((e|0)==1){G[(l<<2)+j>>2]=g;break e}E[h+l|0]=1;break e}n=+(f<<16>>16)*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;G[(l<<2)+j>>2]=-2147483648;break e}if(n>0x7ffffffffffffc00){G[k>>2]=-11;G[(l<<2)+j>>2]=2147483647;break e}o=(l<<2)+j|0;if(O(n)<2147483648){f=~~n}else{f=-2147483648}G[o>>2]=f}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=0;if((b|0)!=1){k=b&-2;e=f&65535;while(1){g=I[(l<<1)+a>>1];f:{if((g|0)==(e|0)){G[i>>2]=1;E[h+l|0]=1;break f}G[(l<<2)+j>>2]=g<<16>>16}g=l|1;o=I[(g<<1)+a>>1];g:{if((o|0)!=(e|0)){G[(g<<2)+j>>2]=o<<16>>16;break g}G[i>>2]=1;E[g+h|0]=1}l=l+2|0;m=m+2|0;if((k|0)!=(m|0)){continue}break}}if(!(b&1)){break a}a=I[(l<<1)+a>>1];if((a|0)!=(f&65535)){G[(l<<2)+j>>2]=a<<16>>16;return}G[i>>2]=1;E[h+l|0]=1;break a}l=0;if((b|0)!=1){k=b&-2;h=f&65535;while(1){o=(l<<2)+j|0;e=I[(l<<1)+a>>1];h:{if((e|0)!=(h|0)){e=e<<16>>16;break h}G[i>>2]=1;e=g}G[o>>2]=e;o=l|1;e=I[(o<<1)+a>>1];i:{if((e|0)!=(h|0)){e=e<<16>>16;break i}G[i>>2]=1;e=g}G[(o<<2)+j>>2]=e;l=l+2|0;m=m+2|0;if((k|0)!=(m|0)){continue}break}}if(!(b&1)){break a}a=I[(l<<1)+a>>1];j:{if((a|0)!=(f&65535)){g=a<<16>>16;break j}G[i>>2]=1}G[(l<<2)+j>>2]=g;return}if((b|0)<=0){break a}e=b&3;l=0;if(b-1>>>0>=3){f=b&-4;b=0;while(1){G[(l<<2)+j>>2]=F[(l<<1)+a>>1];g=l|1;G[(g<<2)+j>>2]=F[(g<<1)+a>>1];g=l|2;G[(g<<2)+j>>2]=F[(g<<1)+a>>1];g=l|3;G[(g<<2)+j>>2]=F[(g<<1)+a>>1];l=l+4|0;b=b+4|0;if((f|0)!=(b|0)){continue}break}}if(!e){break a}while(1){G[(l<<2)+j>>2]=F[(l<<1)+a>>1];l=l+1|0;m=m+1|0;if((e|0)!=(m|0)){continue}break}}}function $o(a,b,c,d,e,f){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;j=f;f=f&31;if((j&63)>>>0>=32){g=8<>>32-f;p=8<>>0>=32){g=4<>>32-f;f=4<>>0>=32){g=2<>>32-f;s=2<=2){y=c-1|0;f=j&31;if((j&63)>>>0>=32){g=1<>>32-f}z=m;m=g;A=(d-2>>>1|0)+1|0;B=(d&-2)<(d|0);while(1){i=h+A|0;f=M(b,n);l=f+b|0;while(1){o=h;C=e+h|0;x=f<<3;g=(x|8)+a|0;k=G[g+4>>2];h=G[g>>2];g=k<<2|h>>>30;h=v&h<<2;t=g&w;u=h;h=(l<<3)+a|0;g=h;k=G[g>>2];g=G[g+4>>2]<<1|k>>>31;k=u|(s&k<<1|z&G[h+8>>2]);t=g&r|m&G[h+12>>2]|t;u=k;g=a+x|0;k=G[g+4>>2];h=G[g>>2];g=k<<3|h>>>29;k=u|p&h<<3;h=g&q|t;g=j&31;E[C|0]=(j&63)>>>0>=32?h>>g:((1<>>g;l=l+2|0;f=f+2|0;h=o+1|0;if((i|0)!=(h|0)){continue}break}b:{if(B){h=e+i|0;f=(f<<3)+a|0;g=G[f+4>>2];f=G[f>>2];g=g<<3|f>>>29;f=p&f<<3;i=g&q;k=h;h=f;f=(l<<3)+a|0;g=G[f+4>>2];f=G[f>>2];g=g<<1|f>>>31;h=h|s&f<<1;g=g&r|i;f=j&31;E[k|0]=(j&63)>>>0>=32?g>>f:((1<>>f;h=o+2|0;break b}h=i}n=n+2|0;if((y|0)>(n|0)){continue}break}break a}if((d|0)!=1){n=c&-2;break a}o=c-2>>>1|0;h=o+1|0;f=0;while(1){l=M(b,n);g=(l<<3)+a|0;k=G[g+4>>2];i=G[g>>2];g=k<<3|i>>>29;i=p&i<<3;k=g&q;m=i;g=(b+l<<3)+a|0;l=G[g+4>>2];i=G[g>>2];g=l<<1|i>>>31;m=m|s&i<<1;i=g&r|k;g=j&31;E[e+f|0]=(j&63)>>>0>=32?i>>g:((1<>>g;n=n+2|0;g=(f|0)!=(o|0);f=f+1|0;if(g){continue}break}}c:{if((c|0)<=(n|0)){break c}f=M(b,n);l=0;if((d|0)>=2){r=d-1|0;while(1){i=f<<3;b=i+a|0;g=G[b+4>>2];b=G[b>>2];g=g<<3|b>>>29;b=p&b<<3;o=g&q;c=b;b=(i|8)+a|0;g=G[b+4>>2];b=G[b>>2];g=g<<2|b>>>30;b=c|v&b<<2;c=g&w|o;g=b;b=j&31;E[e+h|0]=(j&63)>>>0>=32?c>>b:((1<>>b;f=f+2|0;h=h+1|0;l=l+2|0;if((r|0)>(l|0)){continue}break}b=d&-2}else{b=0}if((b|0)>=(d|0)){break c}a=(f<<3)+a|0;c=G[a+4>>2];a=G[a>>2];g=c<<3|a>>>29;c=p&a<<3;b=g&q;a=j&31;E[e+h|0]=(j&63)>>>0>=32?b>>a:((1<>>a}}function fl(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=N(0),o=0,p=0;m=c==1&d==0;a:{if(!e){if(!m){if((b|0)<=0){break a}f=0;if((b|0)!=1){h=b&-2;i=0;while(1){e=f<<2;K[e+j>>2]=+G[a+e>>2]*c+d;e=e|4;K[e+j>>2]=+G[a+e>>2]*c+d;f=f+2|0;i=i+2|0;if((h|0)!=(i|0)){continue}break}}if(!(b&1)){break a}b=f<<2;K[b+j>>2]=+G[a+b>>2]*c+d;break a}if((b|0)<=0){break a}h=b&3;i=0;f=0;if(b-1>>>0>=3){m=b&-4;b=0;while(1){e=f<<2;K[e+j>>2]=G[a+e>>2];k=e|4;K[k+j>>2]=G[a+k>>2];k=e|8;K[k+j>>2]=G[a+k>>2];e=e|12;K[e+j>>2]=G[a+e>>2];f=f+4|0;b=b+4|0;if((m|0)!=(b|0)){continue}break}}if(!h){break a}while(1){b=f<<2;K[b+j>>2]=G[a+b>>2];f=f+1|0;i=i+1|0;if((h|0)!=(i|0)){continue}break}break a}b:{if(!m){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;while(1){m=e<<2;k=G[m+a>>2];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}K[j+m>>2]=+(k|0)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){m=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){l=e<<2;o=G[l+a>>2];d:{if((o|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break d}K[j+l>>2]=o|0}l=e|1;o=l<<2;p=G[o+a>>2];e:{if((p|0)!=(f|0)){K[j+o>>2]=p|0;break e}G[i>>2]=1;E[h+l|0]=1}e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!m){break a}b=e<<2;a=G[a+b>>2];if((a|0)!=(f|0)){K[b+j>>2]=a|0;break a}G[i>>2]=1;E[e+h|0]=1;break a}h=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){k=e<<2;l=G[k+a>>2];f:{if((l|0)!=(f|0)){n=N(l|0);break f}G[i>>2]=1;n=g}K[j+k>>2]=n;k=(e|1)<<2;l=G[k+a>>2];g:{if((l|0)!=(f|0)){n=N(l|0);break g}G[i>>2]=1;n=g}K[j+k>>2]=n;e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(e<<2)+a>>2];h:{if((a|0)!=(f|0)){g=N(a|0);break h}G[i>>2]=1}K[(e<<2)+j>>2]=g;break a}h=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){k=e<<2;l=G[k+a>>2];i:{if((l|0)!=(f|0)){n=N(+(l|0)*c+d);break i}G[i>>2]=1;n=g}K[j+k>>2]=n;k=(e|1)<<2;l=G[k+a>>2];j:{if((l|0)!=(f|0)){n=N(+(l|0)*c+d);break j}G[i>>2]=1;n=g}K[j+k>>2]=n;e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!h){break a}a=G[(e<<2)+a>>2];k:{if((a|0)!=(f|0)){g=N(+(a|0)*c+d);break k}G[i>>2]=1}K[(e<<2)+j>>2]=g}}function iq(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=N(0),o=0;k=c==1&d==0;a:{if(!e){if(!k){if((b|0)<=0){break a}f=0;if((b|0)!=1){h=b&-2;e=0;while(1){K[(f<<2)+j>>2]=+H[a+f|0]*c+d;i=f|1;K[(i<<2)+j>>2]=+H[a+i|0]*c+d;f=f+2|0;e=e+2|0;if((h|0)!=(e|0)){continue}break}}if(!(b&1)){break a}K[(f<<2)+j>>2]=+H[a+f|0]*c+d;break a}if((b|0)<=0){break a}e=0;f=0;if(b-1>>>0>=3){h=b&-4;i=0;while(1){K[(f<<2)+j>>2]=H[a+f|0];k=f|1;K[(k<<2)+j>>2]=H[a+k|0];k=f|2;K[(k<<2)+j>>2]=H[a+k|0];k=f|3;K[(k<<2)+j>>2]=H[a+k|0];f=f+4|0;i=i+4|0;if((h|0)!=(i|0)){continue}break}}b=b&3;if(!b){break a}while(1){K[(f<<2)+j>>2]=H[a+f|0];f=f+1|0;e=e+1|0;if((b|0)!=(e|0)){continue}break}break a}b:{if(!k){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;while(1){k=H[a+e|0];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}K[(e<<2)+j>>2]=+(k>>>0)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){k=H[a+e|0];d:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break d}K[(e<<2)+j>>2]=k>>>0}k=e|1;o=H[k+a|0];e:{if((o|0)!=(f|0)){K[(k<<2)+j>>2]=o>>>0;break e}G[i>>2]=1;E[h+k|0]=1}e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!l){break a}a=H[a+e|0];if((a|0)!=(f|0)){K[(e<<2)+j>>2]=a>>>0;break a}G[i>>2]=1;E[e+h|0]=1;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<2)+j|0;l=H[a+e|0];f:{if((l|0)!=(f|0)){n=N(l>>>0);break f}G[i>>2]=1;n=g}K[m>>2]=n;l=e|1;m=H[l+a|0];g:{if((m|0)!=(f|0)){n=N(m>>>0);break g}G[i>>2]=1;n=g}K[(l<<2)+j>>2]=n;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=H[a+e|0];h:{if((a|0)!=(f|0)){g=N(a>>>0);break h}G[i>>2]=1}K[(e<<2)+j>>2]=g;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<2)+j|0;l=H[a+e|0];i:{if((l|0)!=(f|0)){n=N(+(l>>>0)*c+d);break i}G[i>>2]=1;n=g}K[m>>2]=n;l=e|1;m=H[l+a|0];j:{if((m|0)!=(f|0)){n=N(+(m>>>0)*c+d);break j}G[i>>2]=1;n=g}K[(l<<2)+j>>2]=n;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=H[a+e|0];k:{if((a|0)!=(f|0)){g=N(+(a>>>0)*c+d);break k}G[i>>2]=1}K[(e<<2)+j>>2]=g}}function eq(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0;k=c==1&d==0;a:{if(!e){if(!k){if((b|0)<=0){break a}f=0;if((b|0)!=1){h=b&-2;e=0;while(1){L[(f<<3)+j>>3]=+H[a+f|0]*c+d;i=f|1;L[(i<<3)+j>>3]=+H[a+i|0]*c+d;f=f+2|0;e=e+2|0;if((h|0)!=(e|0)){continue}break}}if(!(b&1)){break a}L[(f<<3)+j>>3]=+H[a+f|0]*c+d;break a}if((b|0)<=0){break a}e=0;f=0;if(b-1>>>0>=3){h=b&-4;i=0;while(1){L[(f<<3)+j>>3]=H[a+f|0];k=f|1;L[(k<<3)+j>>3]=H[a+k|0];k=f|2;L[(k<<3)+j>>3]=H[a+k|0];k=f|3;L[(k<<3)+j>>3]=H[a+k|0];f=f+4|0;i=i+4|0;if((h|0)!=(i|0)){continue}break}}b=b&3;if(!b){break a}while(1){L[(f<<3)+j>>3]=H[a+f|0];f=f+1|0;e=e+1|0;if((b|0)!=(e|0)){continue}break}break a}b:{if(!k){if((b|0)<=0){break a}if((e|0)==1){break b}e=0;while(1){k=H[a+e|0];c:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break c}L[(e<<3)+j>>3]=+(k>>>0)*c+d}e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=b&1;e=0;if((b|0)!=1){m=b&-2;b=0;while(1){k=H[a+e|0];d:{if((k|0)==(f|0)){G[i>>2]=1;E[e+h|0]=1;break d}L[(e<<3)+j>>3]=k>>>0}k=e|1;o=H[k+a|0];e:{if((o|0)!=(f|0)){L[(k<<3)+j>>3]=o>>>0;break e}G[i>>2]=1;E[h+k|0]=1}e=e+2|0;b=b+2|0;if((m|0)!=(b|0)){continue}break}}if(!l){break a}a=H[a+e|0];if((a|0)!=(f|0)){L[(e<<3)+j>>3]=a>>>0;break a}G[i>>2]=1;E[e+h|0]=1;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<3)+j|0;l=H[a+e|0];f:{if((l|0)!=(f|0)){c=+(l>>>0);break f}G[i>>2]=1;c=g}L[m>>3]=c;l=e|1;m=H[l+a|0];g:{if((m|0)!=(f|0)){c=+(m>>>0);break g}G[i>>2]=1;c=g}L[(l<<3)+j>>3]=c;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=H[a+e|0];h:{if((a|0)!=(f|0)){g=+(a>>>0);break h}G[i>>2]=1}L[(e<<3)+j>>3]=g;break a}h=b&1;e=0;if((b|0)!=1){k=b&-2;b=0;while(1){m=(e<<3)+j|0;l=H[a+e|0];i:{if((l|0)!=(f|0)){n=+(l>>>0)*c+d;break i}G[i>>2]=1;n=g}L[m>>3]=n;l=e|1;m=H[l+a|0];j:{if((m|0)!=(f|0)){n=+(m>>>0)*c+d;break j}G[i>>2]=1;n=g}L[(l<<3)+j>>3]=n;e=e+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!h){break a}a=H[a+e|0];k:{if((a|0)!=(f|0)){g=+(a>>>0)*c+d;break k}G[i>>2]=1}L[(e<<3)+j>>3]=g}}function he(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;i=Fa-6528|0;Fa=i;G[c>>2]=0;G[c+4>>2]=0;G[d>>2]=0;G[d+4>>2]=0;g=-1;a:{if(G[325170]!=1){break a}if(G[325168]>0){g=i+3264|0;bb(g,1294144,3264);jm(a,b,g,c,d);b=L[d>>3];a=L[c>>3]}b:{if(G[325171]){e=a-L[161752];b=b-L[161753];a=L[162588]*e+b*L[162589];b=L[162586]*e+L[162587]*b;break b}e=L[161756];b=L[161763]*(b-L[161753]);f=L[161762]*(a-L[161752]);h=L[161757];a=e*b-f*h;b=f*e+h*b}b=b*.0174532925199433;c:{if(!Xa(1294008,34606)){break c}if(!Xa(1294008,34543)){g=2;e=b*b+a*a*.0174532925199433*.0174532925199433;if(e>1){break a}e=e<1?V(1-e):0;a=a/e;b=b/e;break c}if(!Xa(1294008,35981)){g=2;e=(b*b+a*a*.0174532925199433*.0174532925199433)*.25;if(e>.5){break a}e=V(1-e)*.5/(1-(e+e));a=a*e;b=b*e;break c}if(!Xa(1294008,35072)){g=2;e=(b*b+a*a*.0174532925199433*.0174532925199433)*.25;if(e>=1){break a}e=1-e;a=a*e;b=b*e;break c}if(!Xa(1294008,35873)){g=2;e=a*a+b*b/.00030461741978670873;if(e<=0){break a}f=a;a=V(e);e=Mc(a)/a;a=f*e;b=b*e;break c}g=2;if(L[161760]-b*L[161761]<=0){break a}}f=L[161760];h=L[161761];e=f-b*h;b=(b*f+h)/e/.0174532925199433;a=a/e;d:{if(!Xa(1294012,34606)){break d}if(!Xa(1294012,34543)){e=1/V((b*b+a*a)*.0174532925199433*.0174532925199433+1);a=a*e;b=b*e;break d}if(!Xa(1294012,35981)){e=(b*b+a*a)*.0174532925199433*.0174532925199433;if(!(e>1e-23)){break d}f=a;a=1-1/V(e+1);e=V(a+a)/V(e);a=f*e;b=b*e;break d}if(!Xa(1294012,35072)){e=1/(V((b*b+a*a)*.0174532925199433*.0174532925199433+1)+1);a=a*e;b=b*e;break d}if(Xa(1294012,35873)){break d}g=2;e=(b*b+a*a)*.0174532925199433*.0174532925199433;if(e<=0){break a}f=a;a=V(e);e=Pd(a)/a;a=f*e;b=b*e}e:{if(G[325188]){e=L[162601]*b+a*L[162602];a=L[162599]*b+a*L[162600];break e}f=L[161759];h=L[161758];e=(b*f+a*h)/L[161765];a=(b*h-f*a)/L[161764]}b=e+L[161755];a=a+L[161754];f:{if(G[325169]>0){im(a,b,bb(i,1297408,3264),c,d);break f}L[c>>3]=a;L[d>>3]=b}g=1;a=L[c>>3];if(a<.5|a>+G[323533]+.5){break a}a=L[d>>3];if(a<.5|a>+G[323535]+.5){break a}g=0}Fa=i+6528|0;return g}function co(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;m=Fa-16|0;Fa=m;a:{if(G[f>>2]>0){break a}j=G[a>>2];h=G[a+4>>2];b:{c:{if((j|0)!=G[h+76>>2]){mb(a,j+1|0,0,f);break c}if((G[h+128>>2]&G[h+132>>2])!=-1){break c}if((Rb(a,f)|0)>0){break b}}d:{if((b|0)>0){h=G[a+4>>2];if(G[h+936>>2]>=(b|0)){break d}}G[f>>2]=302;break a}if(G[f>>2]>0){break a}b=b-1|0;j=G[h+968>>2];e:{f:{g:{n=G[a>>2];if(!(G[h+104>>2]|G[h+108>>2]?1:n)){break g}h:{i:{if(G[h+76>>2]!=(n|0)){mb(a,n+1|0,0,f);break i}if((G[h+128>>2]&G[h+132>>2])!=-1){break i}if((Rb(a,f)|0)>0){break h}}a=G[a+4>>2];h=G[a+1088>>2]?0:G[a+80>>2]}if(G[f>>2]>0){break a}if((h|0)!=1){break g}Gd((j+M(b,160)|0)+140|0,c,m+8|0,m+12|0,f);if(e){a=G[m+8>>2];G[e>>2]=a;G[e+4>>2]=a>>31}a=1;e=0;if(d){break f}break e}if(c){G[c>>2]=G[(j+M(b,160)|0)+80>>2]}if(e){a=G[(j+M(b,160)|0)+152>>2];G[e>>2]=a;G[e+4>>2]=a>>31}if(!d){break e}e=j+M(b,160)|0;a=G[e+88>>2];e=G[e+92>>2]}G[d>>2]=a;G[d+4>>2]=e}if(!c){break b}a=j+M(b,160)|0;g=L[a+104>>3];k=L[a+96>>3];if(k==1&g==0){break b}i=255;b=G[c>>2];a=b>>31;j:{k:{l:{m:{a=(a^b)-a|0;switch(a-11|0){case 0:break j;case 10:break l;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break b;default:break m}}if((a|0)==41){break k}if((a|0)!=81){break b}i=0x8000000000000000;l=-0x8000000000000000;break j}i=32767;l=-32768;break j}i=2147483647;l=-2147483648}n:{o:{if(g==2147483648|g==0x8000000000000000){break o}e=g<2147483648;if(O(g)<2147483648){d=~~g}else{d=-2147483648}e=(e?+(d|0):0)==g;if(O(k)<2147483648){d=~~k}else{d=-2147483648}if(e&+(d|0)==k){break o}a=(a|0)==21?42:(a|0)==11?42:82;break n}l=k*l+g;a=k>=0;i=a?k*i+g:l;g=a?l:k*l+g;if(g==-128){a=12;if(i==127){break n}}if(g>=-32768){a=21;if(i<=32767){break n}}if(g>=0){a=20;if(i<=65535){break n}}if(g>=-2147483648){a=41;if(i<=2147483647){break n}}if(g>=0){a=40;if(i<4294967296){break n}}if(g>=-0x8000000000000000){a=81;if(i<=0x8000000000000000){break n}}a=g>=0?i<=0x10000000000000000?80:82:82}G[c>>2]=(b|0)<0?0-a|0:a}}Fa=m+16|0}function Pc(a,b){var 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;d=G[321300];d=d?d:256e3;a:{if((d|0)<=0){break a}b:{while(1){if(E[a+c|0]<=0){break b}c=c+1|0;if((d|0)!=(c|0)){continue}break}c=d}c:{if((c|0)<=0){break c}n=a+c|0;h=a;while(1){i=n-h|0;d=0;j=0;c=h;d:{e:{if(!c|!b){break e}e=Va(b);if(!e){break d}if(!i){break e}f:{if((e|0)<=2){d=H[b|0];g:{if((d-97&255)>>>0<=25){f=d-32|0;break g}f=(d-65&255)>>>0<26?d+32|0:d}g=32;if((e|0)<2){k=32;break f}g=H[b+1|0];if((g-97&255)>>>0<=25){k=g-32|0;break f}k=(g-65&255)>>>0<26?g+32|0:g;break f}j=lb(e,1);while(1){g=d+j|0;f=H[b+d|0];h:{if((f-97&255)>>>0<=25){f=f-32|0;break h}f=(f-65&255)>>>0<26?f+32|0:f}E[g|0]=f;d=d+1|0;if((e|0)!=(d|0)){continue}break}d=e-1|0;k=H[d+j|0];g=H[b+d|0];d=H[b|0];f=H[j|0]}i:{j:{i=(c+i|0)-e|0;k:{if(i+1>>>0<=c>>>0){break k}l:{m:{n:{m=e-1|0;switch(m|0){case 1:break m;case 0:break n;default:break l}}while(1){e=H[c|0];if((e|0)==(d&255)|(e|0)==(f&255)){break j}e=c>>>0>>0;c=c+1|0;if(e){continue}break}break k}while(1){e=H[c|0];if(!((e|0)!=(d&255)&(e|0)!=(f&255))){e=H[c+m|0];if((e|0)==(g|0)|(e|0)==(k&255)){break j}}e=c>>>0>>0;c=c+1|0;if(e){continue}break}break k}if((e|0)>=2){o=d&255;while(1){d=c;o:{c=H[c|0];if((c|0)!=(o|0)&(c|0)!=(f&255)){break o}c=1;l=H[d+m|0];if((l|0)!=(g|0)&(l|0)!=(k&255)){break o}while(1){l=H[c+d|0];if((l|0)!=H[b+c|0]&(l|0)!=H[c+j|0]){break o}c=c+1|0;if((e|0)!=(c|0)){continue}break}break i}c=d+1|0;if(d>>>0>>0){continue}break}break k}d=d&255;while(1){e=H[c|0];if(!((e|0)!=(d|0)&(e|0)!=(f&255))){e=H[c+m|0];if((e|0)==(g|0)|(e|0)==(k&255)){break j}}e=c>>>0>>0;c=c+1|0;if(e){continue}break}}d=0;break i}d=c}if(!j){break e}Wa(j)}c=d}f=c;if(!c){break c}d=(f-a|0)%80|0;p:{if((d|0)>=8){h=f+1|0;break p}c=H[Va(b)+f|0];if(!((c|0)==61|(c-33&255)>>>0>93)){h=f+1|0;break p}c=f-d|0;if((d|0)>0){e=f+1|0;d=c;while(1){h=H[d|0]==32?h:e;d=d+1|0;if(f>>>0>d>>>0){continue}break}}if(f>>>0>=h>>>0){break a}}if(h>>>0>>0){continue}break}}c=0}return c}function $k(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;c:{d:{m=L[(l<<3)+a>>3]*c+d;if(m<-0x7ffffffffffffc00){G[j>>2]=-11;break d}if(m>0x7ffffffffffffc00){G[j>>2]=-11;e=2147483647;break c}if(!(O(m)<2147483648)){break d}e=~~m;break c}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break f}n=~~d;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{n=I[l>>1]&32752;switch(((n|0)==32752?1:!n<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}c=L[(k<<3)+a>>3];if(c<-0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break g}if(c>0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break g}o=(k<<2)+i|0;if(O(c)<2147483648){n=~~c}else{n=-2147483648}G[o>>2]=n}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=-2147483648}while(1){k:{l:{m:{n:{o=I[l>>1]&32752;switch(((o|0)==32752?1:!o<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(d>0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}G[(k<<2)+i>>2]=n;break k}m=L[(k<<3)+a>>3]*c+d;if(m<-0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(m>0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}p=(k<<2)+i|0;if(O(m)<2147483648){o=~~m}else{o=-2147483648}G[p>>2]=o}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;o:{p:{c=L[(l<<3)+a>>3];if(c<-0x7ffffffffffffc00){G[j>>2]=-11;break p}if(c>0x7ffffffffffffc00){G[j>>2]=-11;e=2147483647;break o}if(!(O(c)<2147483648)){break p}e=~~c;break o}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function al(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=N(0),q=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){c:{d:{f=l<<2;o=+K[f+a>>2]*c+d;if(o<-0x7ffffffffffffc00){G[j>>2]=-11;break d}if(o>0x7ffffffffffffc00){G[j>>2]=-11;e=2147483647;break c}if(!(O(o)<2147483648)){break d}e=~~o;break c}e=-2147483648}G[f+i>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break f}m=~~d;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{m=I[l>>1]&32640;switch(((m|0)==32640?1:!m<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}m=k<<2;p=K[m+a>>2];c=+p;if(c<-0x7ffffffffffffc00){G[j>>2]=-11;G[i+m>>2]=-2147483648;break g}if(c>0x7ffffffffffffc00){G[j>>2]=-11;G[i+m>>2]=2147483647;break g}n=i+m|0;if(N(O(p))>2]=m}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}m=-2147483648}while(1){k:{l:{m:{n:{n=I[l>>1]&32640;switch(((n|0)==32640?1:!n<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(d>0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}G[(k<<2)+i>>2]=m;break k}n=k<<2;o=+K[n+a>>2]*c+d;if(o<-0x7ffffffffffffc00){G[j>>2]=-11;G[i+n>>2]=-2147483648;break k}if(o>0x7ffffffffffffc00){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}q=(k<<2)+i|0;if(O(o)<2147483648){n=~~o}else{n=-2147483648}G[q>>2]=n}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){o:{p:{f=l<<2;p=K[f+a>>2];c=+p;if(c<-0x7ffffffffffffc00){G[j>>2]=-11;break p}if(c>0x7ffffffffffffc00){G[j>>2]=-11;e=2147483647;break o}if(!(N(O(p))>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function ub(a,b){a=a|0;b=b|0;var 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;if(!a){return ab(b)|0}if(b>>>0>=4294967232){G[48624]=48;return 0}g=b>>>0<11?16:b+11&-8;f=a-8|0;j=G[f+4>>2];e=j&-8;a:{if(!(j&3)){if(g>>>0<256){break a}if(e>>>0>=g+4>>>0){c=f;if(e-g>>>0<=G[48745]<<1>>>0){break a}}c=0;break a}h=e+f|0;b:{if(e>>>0>=g>>>0){d=e-g|0;if(d>>>0<16){break b}G[f+4>>2]=j&1|g|2;c=f+g|0;G[c+4>>2]=d|3;G[h+4>>2]=G[h+4>>2]|1;xm(c,d);break b}if(G[48631]==(h|0)){e=e+G[48628]|0;if(e>>>0<=g>>>0){break a}G[f+4>>2]=j&1|g|2;d=f+g|0;c=e-g|0;G[d+4>>2]=c|1;G[48628]=c;G[48631]=d;break b}if(G[48630]==(h|0)){d=e+G[48627]|0;if(d>>>0>>0){break a}c=d-g|0;c:{if(c>>>0>=16){G[f+4>>2]=j&1|g|2;e=f+g|0;G[e+4>>2]=c|1;d=d+f|0;G[d>>2]=c;G[d+4>>2]=G[d+4>>2]&-2;break c}G[f+4>>2]=d|j&1|2;c=d+f|0;G[c+4>>2]=G[c+4>>2]|1;c=0;e=0}G[48630]=e;G[48627]=c;break b}d=G[h+4>>2];if(d&2){break a}k=e+(d&-8)|0;if(k>>>0>>0){break a}m=k-g|0;d:{if(d>>>0<=255){e=G[h+8>>2];c=d>>>3|0;d=G[h+12>>2];if((d|0)==(e|0)){n=194500,o=G[48625]&Eu(-2,c),G[n>>2]=o;break d}G[e+12>>2]=d;G[d+8>>2]=e;break d}l=G[h+24>>2];i=G[h+12>>2];e:{if((i|0)!=(h|0)){c=G[h+8>>2];G[c+12>>2]=i;G[i+8>>2]=c;break e}f:{e=h+20|0;c=G[e>>2];if(c){break f}e=h+16|0;c=G[e>>2];if(c){break f}i=0;break e}while(1){d=e;i=c;e=c+20|0;c=G[e>>2];if(c){continue}e=i+16|0;c=G[i+16>>2];if(c){continue}break}G[d>>2]=0}if(!l){break d}d=G[h+28>>2];c=(d<<2)+194804|0;g:{if(G[c>>2]==(h|0)){G[c>>2]=i;if(i){break g}n=194504,o=G[48626]&Eu(-2,d),G[n>>2]=o;break d}G[(G[l+16>>2]==(h|0)?16:20)+l>>2]=i;if(!i){break d}}G[i+24>>2]=l;c=G[h+16>>2];if(c){G[i+16>>2]=c;G[c+24>>2]=i}c=G[h+20>>2];if(!c){break d}G[i+20>>2]=c;G[c+24>>2]=i}if(m>>>0<=15){G[f+4>>2]=j&1|k|2;c=f+k|0;G[c+4>>2]=G[c+4>>2]|1;break b}G[f+4>>2]=j&1|g|2;d=f+g|0;G[d+4>>2]=m|3;c=f+k|0;G[c+4>>2]=G[c+4>>2]|1;xm(d,m)}c=f}if(c){return c+8|0}f=ab(b);if(!f){return 0}c=G[a-4>>2];c=(c&3?-4:-8)+(c&-8)|0;bb(f,a,b>>>0>c>>>0?c:b);Wa(a);return f|0}function Dp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<2)+j|0;c:{d:{m=+F[(l<<1)+a>>1]*c+d;if(m<-.49){G[k>>2]=-11;break d}if(m>0xfffffffffffff800){G[k>>2]=-11;e=-1;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}o=f&65535;l=0;while(1){f=I[(l<<1)+a>>1];e:{if((f|0)==(o|0)){G[i>>2]=1;if((e|0)==1){G[(l<<2)+j>>2]=g;break e}E[h+l|0]=1;break e}m=+(f<<16>>16)*c+d;if(m<-.49){G[k>>2]=-11;G[(l<<2)+j>>2]=0;break e}if(m>0xfffffffffffff800){G[k>>2]=-11;G[(l<<2)+j>>2]=-1;break e}n=(l<<2)+j|0;if(m<4294967296&m>=0){f=~~m>>>0}else{f=0}G[n>>2]=f}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=0;e=f&65535;while(1){f=I[(l<<1)+a>>1];f:{if((f|0)==(e|0)){G[i>>2]=1;E[h+l|0]=1;break f}f=f<<16>>16;if((f|0)<0){G[k>>2]=-11;G[(l<<2)+j>>2]=0;break f}G[(l<<2)+j>>2]=f}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}o=b&1;l=0;if((b|0)!=1){p=b&-2;e=f&65535;h=0;while(1){b=I[(l<<1)+a>>1];g:{if((b|0)!=(e|0)){b=b<<16>>16;if((b|0)>=0){break g}G[k>>2]=-11;b=0;break g}G[i>>2]=1;b=g}G[(l<<2)+j>>2]=b;n=l|1;b=I[(n<<1)+a>>1];h:{if((b|0)!=(e|0)){b=b<<16>>16;if((b|0)>=0){break h}G[k>>2]=-11;b=0;break h}G[i>>2]=1;b=g}G[(n<<2)+j>>2]=b;l=l+2|0;h=h+2|0;if((p|0)!=(h|0)){continue}break}}if(!o){break a}a=I[(l<<1)+a>>1];i:{if((a|0)!=(f&65535)){g=a<<16>>16;if((g|0)>=0){break i}G[k>>2]=-11;g=0;break i}G[i>>2]=1}G[(l<<2)+j>>2]=g;break a}if((b|0)<=0){break a}f=b&1;l=0;if((b|0)!=1){g=b&-2;b=0;while(1){h=(l<<2)+j|0;e=F[(l<<1)+a>>1];j:{if((e|0)<0){G[k>>2]=-11;e=0;break j}e=e&65535}G[h>>2]=e;h=l|1;e=F[(h<<1)+a>>1];k:{if((e|0)>=0){e=e&65535;break k}G[k>>2]=-11;e=0}G[(h<<2)+j>>2]=e;l=l+2|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(!f){break a}b=0;a=F[(l<<1)+a>>1];l:{if((a|0)>=0){b=a&65535;break l}G[k>>2]=-11}G[(l<<2)+j>>2]=b}}function Fe(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=Fa-208|0;Fa=d;E[d+204|0]=39;E[d+205|0]=0;E[d+202|0]=34;E[d+203|0]=0;E[d+200|0]=91;E[d+201|0]=0;E[d+198|0]=93;E[d+199|0]=0;E[d+196|0]=47;E[d+197|0]=0;E[d+194|0]=44;E[d+195|0]=0;h=rb(d+112|0,b,80);E[h+80|0]=0;c=Va(h);b=ec(h,d+200|0,c);a:{if(!b){b=ec(h,d+194|0,c);if(!b){break a}}E[b|0]=0;i=b+1|0}b=0;b:{c:{d:{while(1){f=a+b|0;if(!H[f|0]){c=b;break d}c=1;e=a+b|0;f=e+1|0;if(!H[f|0]){break d}f=e+2|0;if(!H[f|0]){break d}f=e+3|0;if(!H[f|0]){break d}f=e+4|0;if(!H[f|0]){break d}b=b+5|0;if((b|0)!=57600){continue}break}f=a+57600|0;break c}if(c){break c}break b}c=a;while(1){g=ec(c,h,f-c|0);if(!g){break b}e:{f:{b=(g-a|0)%80|0;if((b|0)<8){e=H[Va(h)+g|0];if((e|0)==61|(e-33&255)>>>0>93){break f}}c=g+1|0;break e}e=g-b|0;if((b|0)>0){k=g+1|0;b=e;while(1){c=H[b|0]==32?c:k;b=b+1|0;if(g>>>0>b>>>0){continue}break}}if(c>>>0>g>>>0){break e}G[d+96>>2]=0;G[d+88>>2]=0;G[d+92>>2]=0;G[d+80>>2]=0;G[d+84>>2]=0;a=rb(d,e,80);e=Va(a);b=ec(a,d+204|0,e);c=ec(a,d+196|0,e);g:{h:{i:{if(b){if(!(!c|b>>>0>=c>>>0)){a=b+1|0;c=ec(a,d+204|0,Va(a));break i}if(c){break h}a=b+1|0;c=ec(a,d+204|0,Va(a));break i}b=ec(a,d+202|0,e);if(!b){break h}if(!(!c|b>>>0>=c>>>0)){a=b+1|0;c=ec(a,d+202|0,Va(a));break i}if(c){break h}a=b+1|0;c=ec(a,d+202|0,Va(a))}ec(c,42205,Va(c));break g}b=ec(a,36178,e);c=ec(a,42205,e);c=c?c:a+79|0}while(1){j:{a=b;b=b+1|0;if(H[a+1|0]!=32){break j}if(b>>>0>>0){continue}}break}E[c|0]=0;c=c-1|0;k:{if(H[c|0]!=32|b>>>0>=c>>>0){break k}while(1){E[c|0]=0;c=c-1|0;if(H[c|0]!=32){break k}if(b>>>0>>0){continue}break}}j=757136;b=Xa(b,41689)?b:a+2|0;Za(757136,b);if(!i){break b}a=ec(i,d+198|0,Va(i));if(a){E[a|0]=0}a=_b(i);if((a|0)<=0){break b}E[d+206|0]=32;E[d+207|0]=0;c=pc(b,d+206|0);if((a|0)!=1){b=2;while(1){e=(a|0)!=(b|0);c=pc(0,d+206|0);b=b+1|0;if(e){continue}break}}if(!c){j=0;break b}Za(757136,c);break b}if(c>>>0>>0){continue}break}}Fa=d+208|0;return j}function Uh(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;h=Fa-6528|0;Fa=h;G[c>>2]=0;G[c+4>>2]=0;G[d>>2]=0;G[d+4>>2]=0;a:{if(G[325170]!=1){break a}if(G[325169]>0){i=h+3264|0;bb(i,1297408,3264);jm(a,b,i,c,d);b=L[d>>3];a=L[c>>3]}b:{if(G[325188]){e=a-L[161754];b=b-L[161755];a=L[162597]*e+b*L[162598];b=L[162595]*e+L[162596]*b;break b}e=L[161758];b=L[161765]*(b-L[161755]);f=L[161764]*(a-L[161754]);g=L[161759];a=e*b-f*g;b=f*e+g*b}b=b*.0174532925199433;c:{if(!Xa(1294012,34606)){break c}if(!Xa(1294012,34543)){e=b*b+a*a*.0174532925199433*.0174532925199433;if(e>1){break a}e=e<1?V(1-e):0;a=a/e;b=b/e;break c}if(!Xa(1294012,35981)){e=(b*b+a*a*.0174532925199433*.0174532925199433)*.25;if(e>.5){break a}e=V(1-e)*.5/(1-(e+e));a=a*e;b=b*e;break c}if(!Xa(1294012,35072)){e=(b*b+a*a*.0174532925199433*.0174532925199433)*.25;if(e>=1){break a}e=1-e;a=a*e;b=b*e;break c}if(Xa(1294012,35873)){break c}e=a*a+b*b/.00030461741978670873;if(e<=0){break a}f=a;a=V(e);e=Mc(a)/a;a=f*e;b=b*e}f=L[161761];g=L[161760];e=b*f+g;if(e<=0){break a}a=a/e;b=(b*g-f)/e/.0174532925199433;d:{if(!Xa(1294008,34606)){break d}if(!Xa(1294008,34543)){e=1/V((b*b+a*a)*.0174532925199433*.0174532925199433+1);a=a*e;b=b*e;break d}if(!Xa(1294008,35981)){e=(b*b+a*a)*.0174532925199433*.0174532925199433;if(!(e>1e-23)){break d}f=a;a=1-1/V(e+1);e=V(a+a)/V(e);a=f*e;b=b*e;break d}if(!Xa(1294008,35072)){e=1/(V((b*b+a*a)*.0174532925199433*.0174532925199433+1)+1);a=a*e;b=b*e;break d}if(Xa(1294008,35873)){break d}e=(b*b+a*a)*.0174532925199433*.0174532925199433;if(e<=0){break a}f=a;a=V(e);e=Pd(a)/a;a=f*e;b=b*e}e:{if(G[325171]){e=L[162592]*b+a*L[162593];a=L[162590]*b+a*L[162591];break e}f=L[161757];g=L[161756];e=(b*f+a*g)/L[161763];a=(b*g-f*a)/L[161762]}b=e+L[161753];a=a+L[161752];f:{if(G[325168]>0){im(a,b,bb(h,1294144,3264),c,d);break f}L[c>>3]=a;L[d>>3]=b}a=L[c>>3];if(a<.5|a>+G[323532]+.5){break a}a=L[d>>3];if(a<.5|a>+G[323534]+.5){break a}}Fa=h+6528|0}function Oc(a,b,c){var d=0,e=0;if(b){d=a^-1;a:{if(!c|!(b&3)){break a}d=G[((H[b|0]^d&255)<<2)+105024>>2]^d>>>8;e=c-1|0;a=b+1|0;if(!(!e|!(a&3))){d=G[((H[b+1|0]^d&255)<<2)+105024>>2]^d>>>8;e=c-2|0;a=b+2|0;if(!(!e|!(a&3))){d=G[((H[b+2|0]^d&255)<<2)+105024>>2]^d>>>8;e=c-3|0;a=b+3|0;if(!(!e|!(a&3))){d=G[((H[b+3|0]^d&255)<<2)+105024>>2]^d>>>8;c=c-4|0;b=b+4|0;break a}b=a;c=e;break a}b=a;c=e;break a}b=a;c=e}if(c>>>0>31){while(1){a=G[b>>2]^d;a=G[b+4>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+8>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+12>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+16>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+20>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+24>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);a=G[b+28>>2]^(G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2]);d=G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2];b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}if(c>>>0>3){while(1){a=G[b>>2]^d;d=G[(a>>>6&1020)+107072>>2]^G[((a&255)<<2)+108096>>2]^G[(a>>>14&1020)+106048>>2]^G[(a>>>22&1020)+105024>>2];b=b+4|0;c=c-4|0;if(c>>>0>3){continue}break}}b:{if(!c){break b}if(c&1){d=G[((H[b|0]^d&255)<<2)+105024>>2]^d>>>8;b=b+1|0;a=c-1|0}else{a=c}if((c|0)==1){break b}while(1){c=G[((H[b|0]^d&255)<<2)+105024>>2]^d>>>8;d=G[((H[b+1|0]^c&255)<<2)+105024>>2]^c>>>8;b=b+2|0;a=a-2|0;if(a){continue}break}}a=d^-1}else{a=0}return a}function gf(a,b,c){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=a&65535;e=a>>>16|0;a:{if((c|0)==1){a=H[b|0]+d|0;a=a>>>0>65520?a-65521|0:a;b=a+e|0;c=b<<16;a=(b>>>0>65520?c+983040|0:c)|a;break a}if(b){if(c>>>0>=16){b:{c:{d:{if(c>>>0>5551){while(1){c=c-5552|0;f=347;a=b;while(1){g=H[a|0]+d|0;h=g+H[a+1|0]|0;i=h+H[a+2|0]|0;j=i+H[a+3|0]|0;k=j+H[a+4|0]|0;l=k+H[a+5|0]|0;m=l+H[a+6|0]|0;n=m+H[a+7|0]|0;o=n+H[a+8|0]|0;p=o+H[a+9|0]|0;q=p+H[a+10|0]|0;r=q+H[a+11|0]|0;s=r+H[a+12|0]|0;t=s+H[a+13|0]|0;u=t+H[a+14|0]|0;d=u+H[a+15|0]|0;e=d+(u+(t+(s+(r+(q+(p+(o+(n+(m+(l+(k+(j+(i+(h+(e+g|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0;a=a+16|0;f=f-1|0;if(f){continue}break}e=(e>>>0)%65521|0;d=(d>>>0)%65521|0;b=b+5552|0;if(c>>>0>5551){continue}break}if(!c){break b}if(c>>>0<16){break d}}while(1){a=H[b|0]+d|0;f=a+H[b+1|0]|0;g=f+H[b+2|0]|0;h=g+H[b+3|0]|0;i=h+H[b+4|0]|0;j=i+H[b+5|0]|0;k=j+H[b+6|0]|0;l=k+H[b+7|0]|0;m=l+H[b+8|0]|0;n=m+H[b+9|0]|0;o=n+H[b+10|0]|0;p=o+H[b+11|0]|0;q=p+H[b+12|0]|0;r=q+H[b+13|0]|0;s=r+H[b+14|0]|0;d=s+H[b+15|0]|0;e=d+(s+(r+(q+(p+(o+(n+(m+(l+(k+(j+(i+(h+(g+(f+(a+e|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0)|0;b=b+16|0;c=c-16|0;if(c>>>0>15){continue}break}if(!c){break c}}g=c-1|0;h=c&3;if(h){f=0;a=b;while(1){c=c-1|0;d=H[a|0]+d|0;e=e+d|0;b=a+1|0;a=b;f=f+1|0;if((h|0)!=(f|0)){continue}break}}if(g>>>0<3){break c}while(1){a=H[b|0]+d|0;f=a+H[b+1|0]|0;g=f+H[b+2|0]|0;d=g+H[b+3|0]|0;e=d+(g+(f+(a+e|0)|0)|0)|0;b=b+4|0;c=c-4|0;if(c){continue}break}}e=(e>>>0)%65521|0;d=(d>>>0)%65521|0}a=e<<16|d;break a}e:{if(!c){break e}g=c-1|0;h=c&3;if(h){a=b;while(1){c=c-1|0;d=H[a|0]+d|0;e=e+d|0;b=a+1|0;a=b;f=f+1|0;if((h|0)!=(f|0)){continue}break}}if(g>>>0<3){break e}while(1){a=H[b|0]+d|0;f=a+H[b+1|0]|0;g=f+H[b+2|0]|0;d=g+H[b+3|0]|0;e=d+(g+(f+(a+e|0)|0)|0)|0;b=b+4|0;c=c-4|0;if(c){continue}break}}a=(e>>>0)%65521<<16|(d>>>0>65520?d-65521|0:d)}else{a=1}}return a}function Qp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;c:{d:{m=L[(l<<3)+a>>3]*c+d;if(m<-2147483648.49){G[j>>2]=-11;break d}if(m>2147483647.49){G[j>>2]=-11;e=2147483647;break c}if(!(O(m)<2147483648)){break d}e=~~m;break c}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break f}n=~~d;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{n=I[l>>1]&32752;switch(((n|0)==32752?1:!n<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}c=L[(k<<3)+a>>3];if(c<-2147483648.49){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break g}if(c>2147483647.49){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break g}o=(k<<2)+i|0;if(O(c)<2147483648){n=~~c}else{n=-2147483648}G[o>>2]=n}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=-2147483648}while(1){k:{l:{m:{n:{o=I[l>>1]&32752;switch(((o|0)==32752?1:!o<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-2147483648.49){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(d>2147483647.49){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}G[(k<<2)+i>>2]=n;break k}m=L[(k<<3)+a>>3]*c+d;if(m<-2147483648.49){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(m>2147483647.49){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}p=(k<<2)+i|0;if(O(m)<2147483648){o=~~m}else{o=-2147483648}G[p>>2]=o}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;o:{p:{c=L[(l<<3)+a>>3];if(c<-2147483648.49){G[j>>2]=-11;break p}if(c>2147483647.49){G[j>>2]=-11;e=2147483647;break o}if(!(O(c)<2147483648)){break p}e=~~c;break o}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Rp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=N(0),q=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){c:{d:{f=l<<2;o=+K[f+a>>2]*c+d;if(o<-2147483648.49){G[j>>2]=-11;break d}if(o>2147483647.49){G[j>>2]=-11;e=2147483647;break c}if(!(O(o)<2147483648)){break d}e=~~o;break c}e=-2147483648}G[f+i>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break f}m=~~d;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{m=I[l>>1]&32640;switch(((m|0)==32640?1:!m<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}m=k<<2;p=K[m+a>>2];c=+p;if(c<-2147483648.49){G[j>>2]=-11;G[i+m>>2]=-2147483648;break g}if(c>2147483647.49){G[j>>2]=-11;G[i+m>>2]=2147483647;break g}n=i+m|0;if(N(O(p))>2]=m}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}m=-2147483648}while(1){k:{l:{m:{n:{n=I[l>>1]&32640;switch(((n|0)==32640?1:!n<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-2147483648.49){G[j>>2]=-11;G[(k<<2)+i>>2]=-2147483648;break k}if(d>2147483647.49){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}G[(k<<2)+i>>2]=m;break k}n=k<<2;o=+K[n+a>>2]*c+d;if(o<-2147483648.49){G[j>>2]=-11;G[i+n>>2]=-2147483648;break k}if(o>2147483647.49){G[j>>2]=-11;G[(k<<2)+i>>2]=2147483647;break k}q=(k<<2)+i|0;if(O(o)<2147483648){n=~~o}else{n=-2147483648}G[q>>2]=n}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){o:{p:{f=l<<2;p=K[f+a>>2];c=+p;if(c<-2147483648.49){G[j>>2]=-11;break p}if(c>2147483647.49){G[j>>2]=-11;e=2147483647;break o}if(!(N(O(p))>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function gs(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=Fa-16|0;Fa=p;G[p+12>>2]=j;a:{k=G[a+8>>2];q=(G[a>>2]+M(c,3)|0)-2|0;o=M(q,168);e=k+o|0;if(G[e+32>>2]){break a}m=lb(1e3,8);G[e+32>>2]=m;j=0;G[e+28>>2]=0;l=1e3;while(1){if((j|0)>=(l|0)){l=l+1e3|0;e=ub(m,l<<3);k=G[a+8>>2];G[(o+k|0)+32>>2]=e}e=G[p+12>>2]+7&-8;G[p+12>>2]=e+8;n=k+o|0;m=G[n+32>>2];j=G[n+28>>2];h=L[e>>3];L[m+(j<<3)>>3]=h;b:{if(!(O(h+-9007199254740992)<=1e-15)){break b}e=j-1|0;if(!(O(L[(e<<3)+m>>3]+-9007199254740992)<=1e-15)){break b}G[n+28>>2]=e;j=M(q,168);e=j+G[a+8>>2]|0;e=ub(G[e+32>>2],G[e+28>>2]<<3);k=G[a+8>>2];G[(j+k|0)+32>>2]=e;break a}j=j+1|0;G[n+28>>2]=j;continue}}o=G[(k+o|0)+28>>2];c:{if((o|0)==2){h=L[(M(c,168)+k|0)+8>>3];if(d){l=0;if(g>3]=h)|!(L[(M(c,168)+k|0)+16>>3]>=g))){l=0;e=0;j=G[(M(c,168)+k|0)+24>>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}j=G[j+(c<<2)>>2];d:{if(!j){break d}while(1){if(!(+G[j+4>>2]<=f)){break d}e=e+1|0;j=G[j>>2];if(j){continue}break}}if((e&1)!=(d|0)){break c}if(!b){l=1;break c}if(!d){l=1;break c}G[a+12>>2]=b;l=1;break c}l=!d;break c}e=!d;l=e;if(e){break c}i=L[(M(q,168)+k|0)+8>>3];if(i>g){break c}l=0;h=L[(M(q,168)+k|0)+16>>3];if(!(g>=i)|h>2];if(O(g)<2147483648){n=~~g}else{n=-2147483648}j=G[j+(n<<2)>>2];e:{if(!j){break e}while(1){if(!(+G[j+4>>2]<=f)){break e}e=e+1|0;j=G[j>>2];if(j){continue}break}}if((e&1)!=(d|0)|(o|0)<=0){break c}n=n<<2;m=0;while(1){f:{j=M(c+m|0,168)+k|0;i=L[j+8>>3];if(i>g){break f}h=L[j+16>>3];if(!(g>=i)|h>2]>>2];g:{if(!j){break g}while(1){if(!(+G[j+4>>2]<=f)){break g}e=e+1|0;j=G[j>>2];if(j){continue}break}}if((e&1)!=(d|0)){break f}l=1;b=b+m|0;if(!b){break c}G[a+12>>2]=b;break c}m=m+1|0;if((o|0)!=(m|0)){continue}break}}Fa=p+16|0;return l|0}function ss(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=n|0;o=+o;var p=0,q=0,r=0,s=0,t=0;e=l==0&m==0;s=G[a>>2]+M(c,3)|0;q=s-2|0;a:{if(d){if(e){break a}t=G[a+8>>2];e=t+M(q,168)|0;i=L[e+8>>3];if(i>g){break a}h=L[e+16>>3];if(!(g>=i)|h>2];if(O(g)<2147483648){q=~~g}else{q=-2147483648}e=G[e+(q<<2)>>2];b:{if(!e){break b}while(1){if(!(+G[e+4>>2]<=f)){break b}r=r+1|0;e=G[e>>2];if(e){continue}break}}if((r&1)!=(d|0)){break a}c:{d:{if(j==0&k==0){break d}s=s-1|0;e=M(s,168)+t|0;i=L[e+8>>3];if(i>g){break d}h=L[e+16>>3];if(!(g>=i)|h>2]+(q<<2)>>2];e:{if(!e){break e}while(1){if(!(+G[e+4>>2]<=f)){break e}r=r+1|0;e=G[e>>2];if(e){continue}break}}if((r&1)==(d|0)){break a}if((n|0)>0){break c}break a}if((n|0)<=0){break a}}h=+(n|0);m=(m-k)/h;l=(l-j)/h;e=0;s=q<<2;while(1){q=e;f:{e=e+1|0;h=+(e|0);if(h*l+j==0&h*m+k==0){break f}p=M(c+q|0,168)+t|0;i=L[p+8>>3];if(i>g){break f}h=L[p+16>>3];if(!(g>=i)|h>2]>>2];g:{if(!p){break g}while(1){if(!(+G[p+4>>2]<=f)){break g}r=r+1|0;p=G[p>>2];if(p){continue}break}}if((r&1)!=(d|0)){break f}p=1;b=b+q|0;if(!b){break a}G[a+12>>2]=b;return 1}p=0;if((e|0)!=(n|0)){continue}break}break a}p=1;if(e){break a}d=G[a+8>>2];a=d+M(q,168)|0;i=L[a+8>>3];if(i>g){break a}h=L[a+16>>3];if(!(g>=i)|(!(h>=g)|g>h)){break a}a=G[(d+M(q,168)|0)+24>>2];if(O(g)<2147483648){b=~~g}else{b=-2147483648}a=G[a+(b<<2)>>2];if(!a){break a}e=0;while(1){if(+G[a+4>>2]<=f){e=e+1|0;a=G[a>>2];if(a){continue}}break}if(!(e&1)){break a}p=0;if(j==0&k==0){break a}c=s-1|0;a=d+M(c,168)|0;i=L[a+8>>3];if(i>g){break a}h=L[a+16>>3];if(!(g>=i)|(!(h>=g)|g>h)){break a}a=G[G[(d+M(c,168)|0)+24>>2]+(b<<2)>>2];if(!a){break a}while(1){if(+G[a+4>>2]<=f){p=p+1|0;a=G[a>>2];if(a){continue}}break}p=p&1}return p|0}function Ws(a){a=a|0;var 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;j=G[309722];b=j+M(G[a+12>>2],344)|0;g=G[b+88>>2];c=G[b+56>>2];h=g+(c<<3)|0;b=G[b+52>>2];l=G[a+16>>2];k=M(l,344)+j|0;a:{if(G[k>>2]==-1e3){f=L[k+88>>3];b:{if(!(!b|(c|0)<16)){if(!(f>=L[g>>3])){c=-1;break b}if(!(f<=L[((c<<3)+h|0)-8>>3])){c=-1;break b}c=c>>>1|0;d=c;while(1){d=d>>>(d>>>0>1)|0;b=c<<3;e=b+h|0;if(f>L[e>>3]){if(!(f>=L[(b+g|0)+8>>3])){c=-1;break b}c=c+d|0;continue}if(!(f>3])){break b}if(f<=L[e-8>>3]){c=c-d|0;continue}else{c=-1;break b}}}while(1){if(!c){c=-1;break b}c=c-1|0;b=c<<3;if(!(f>=L[b+g>>3])|!(f<=L[b+h>>3])){continue}break}}G[a>>2]=-1e3;E[a+88|0]=(c|0)>=0;break a}Nd(a);if(G[309737]){break a}d=M(G[a+56>>2],G[309727]);if(c){o=G[k+88>>2];p=(b|0)!=0&(c|0)>15;q=c>>>1|0;r=((c<<3)+h|0)-8|0;s=M(l,344)+j|0;b=-1;while(1){if(!d){break a}d=d-1|0;e=H[d+G[s+84>>2]|0];E[G[a+84>>2]+d|0]=e;if(e){continue}f=L[(d<<3)+o>>3];c:{d:{if((b|0)<0){break d}e=b<<3;if(f>3]){break d}if(!(f>L[e+h>>3])){break c}}b=c;if(p){b=-1;if(!(f>=L[g>>3])){break c}e=q;i=e;if(!(f<=L[r>>3])){break c}while(1){i=i>>>(i>>>0>1)|0;m=e<<3;n=m+h|0;if(f>L[n>>3]){if(!(f>=L[(g+m|0)+8>>3])){break c}e=e+i|0;continue}if(!(f>3])){b=e;break c}if(!(f<=L[n-8>>3])){break c}e=e-i|0;continue}}while(1){if(!b){b=-1;break c}b=b-1|0;e=b<<3;if(!(f>=L[e+g>>3])|!(f<=L[e+h>>3])){continue}break}}E[G[a+88>>2]+d|0]=(b|0)>=0;continue}}if(!d){break a}b=d-1|0;e=d&3;if(e){c=0;while(1){d=d-1|0;E[d+G[a+88>>2]|0]=0;E[G[a+84>>2]+d|0]=0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}if(b>>>0<3){break a}while(1){b=d-1|0;E[b+G[a+88>>2]|0]=0;E[b+G[a+84>>2]|0]=0;b=d-2|0;E[b+G[a+88>>2]|0]=0;E[b+G[a+84>>2]|0]=0;b=d-3|0;E[b+G[a+88>>2]|0]=0;E[b+G[a+84>>2]|0]=0;d=d-4|0;E[d+G[a+88>>2]|0]=0;E[G[a+84>>2]+d|0]=0;if(d){continue}break}}if(G[k>>2]>0){Wa(G[(M(l,344)+j|0)+88>>2])}}function tl(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0;a:{b:{c:{h=a+c|0;g=H[h|0];k=b+c|0;i=H[k|0];if((g|0)!=(i|0)){break c}g=H[h+1|0];i=H[k+1|0];if((g|0)!=(i|0)){break c}g=H[h+2|0];i=H[k+2|0];if((g|0)!=(i|0)){break c}g=H[h+3|0];i=H[k+3|0];if((g|0)!=(i|0)){break c}g=H[h+4|0];i=H[k+4|0];if((g|0)!=(i|0)){break c}g=H[h+5|0];i=H[k+5|0];if((g|0)!=(i|0)){break c}g=H[h+6|0];i=H[k+6|0];if((g|0)!=(i|0)){break c}g=H[h+7|0];i=H[k+7|0];if((g|0)!=(i|0)){break c}g=H[h+8|0];i=H[k+8|0];if((g|0)!=(i|0)){break c}g=H[h+9|0];i=H[k+9|0];if((g|0)!=(i|0)){break c}g=H[h+10|0];i=H[k+10|0];if((g|0)!=(i|0)){break c}g=H[h+11|0];h=H[k+11|0];if((g|0)!=(h|0)){return g>>>0>h>>>0}k=e+8|0;b=b+12|0;a=a+12|0;while(1){g=H[b+c|0];h=H[a+c|0];if((g|0)!=(h|0)){break b}g=I[(b<<1)+d>>1];h=I[(a<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+1|0;g=H[i+c|0];j=b+1|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+2|0;g=H[i+c|0];j=b+2|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+3|0;g=H[i+c|0];j=b+3|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+4|0;g=H[i+c|0];j=b+4|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+5|0;g=H[i+c|0];j=b+5|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+6|0;g=H[i+c|0];j=b+6|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}i=a+7|0;g=H[i+c|0];j=b+7|0;h=H[j+c|0];if((g|0)!=(h|0)){break a}g=I[(j<<1)+d>>1];h=I[(i<<1)+d>>1];if((g|0)!=(h|0)){break b}G[f>>2]=G[f>>2]-1;b=b+8|0;b=b-(b>>>0>>0?0:e)|0;a=a+8|0;a=a-(a>>>0>>0?0:e)|0;g=(k|0)>7;k=k-8|0;if(g){continue}break}return 0}return g>>>0>i>>>0}return g>>>0>>0}return g>>>0>h>>>0}function bq(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<2)+j|0;c:{d:{n=+H[a+l|0]*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;break d}if(n>0x7ffffffffffffc00){G[k>>2]=-11;e=2147483647;break c}if(!(O(n)<2147483648)){break d}e=~~n;break c}e=-2147483648}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){m=H[a+l|0];e:{if((m|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[(l<<2)+j>>2]=g;break e}E[h+l|0]=1;break e}n=+(m>>>0)*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;G[(l<<2)+j>>2]=-2147483648;break e}if(n>0x7ffffffffffffc00){G[k>>2]=-11;G[(l<<2)+j>>2]=2147483647;break e}o=(l<<2)+j|0;if(O(n)<2147483648){m=~~n}else{m=-2147483648}G[o>>2]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){g=b&1;l=0;if((b|0)!=1){k=b&-2;b=0;while(1){e=H[a+l|0];f:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break f}G[(l<<2)+j>>2]=e}e=l|1;m=H[e+a|0];g:{if((m|0)!=(f|0)){G[(e<<2)+j>>2]=m;break g}G[i>>2]=1;E[e+h|0]=1}l=l+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!g){break a}a=H[a+l|0];if((a|0)!=(f|0)){G[(l<<2)+j>>2]=a;return}G[i>>2]=1;E[h+l|0]=1;break a}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=(l<<2)+j|0;b=H[a+l|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}G[m>>2]=b;m=l|1;b=H[m+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[(m<<2)+j>>2]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break a}b=(l<<2)+j|0;a=H[a+l|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}G[b>>2]=g;return}if((b|0)<=0){break a}e=b&3;f=0;l=0;if(b-1>>>0>=3){g=b&-4;b=0;while(1){G[(l<<2)+j>>2]=H[a+l|0];h=l|1;G[(h<<2)+j>>2]=H[a+h|0];h=l|2;G[(h<<2)+j>>2]=H[a+h|0];h=l|3;G[(h<<2)+j>>2]=H[a+h|0];l=l+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){G[(l<<2)+j>>2]=H[a+l|0];l=l+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}}function Xk(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=N(0),p=0,q=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;m=+K[(l<<2)+a>>2]*c+d;c:{if(m<-32768.49){G[j>>2]=-11;e=32768;break c}if(m>32767.49){G[j>>2]=-11;e=32767;break c}e=~~m;if(O(m)<2147483648){break c}e=-2147483648}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+2|0;d:{e:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break e}n=~~d;break d}if((b|0)<=0){break a}while(1){f:{g:{h:{i:{n=I[l>>1]&32640;switch(((n|0)==32640?1:!n<<1)|0){case 0:break g;case 1:break i;default:break h}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break f}E[g+k|0]=1;break f}F[(k<<1)+i>>1]=0;break f}o=K[(k<<2)+a>>2];c=+o;if(c<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break f}if(c>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break f}p=(k<<1)+i|0;if(N(O(o))>1]=n}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=-2147483648}while(1){j:{k:{l:{m:{p=I[l>>1]&32640;switch(((p|0)==32640?1:!p<<1)|0){case 0:break k;case 1:break m;default:break l}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break j}E[g+k|0]=1;break j}if(d<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break j}if(d>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break j}F[(k<<1)+i>>1]=n;break j}m=+K[(k<<2)+a>>2]*c+d;if(m<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break j}if(m>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break j}q=(k<<1)+i|0;if(O(m)<2147483648){p=~~m}else{p=-2147483648}F[q>>1]=p}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;o=K[(l<<2)+a>>2];c=+o;n:{if(c<-32768.49){G[j>>2]=-11;e=32768;break n}if(c>32767.49){G[j>>2]=-11;e=32767;break n}e=~~o;if(N(O(o))>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function zq(a){var b=0,c=0,d=0,e=0,f=0;a:{while(1){b:{c:{d:{switch(G[a+48>>2]){case 0:e=-1;c=a+100|0;e:{f:{g:{if(G[a+28>>2]){break g}b=G[a+32>>2];d=ab(b);G[a+36>>2]=d;f=ab(b<<1);G[a+40>>2]=f;if(!(f?d:0)){Wa(f);Wa(d);break f}G[a+28>>2]=b;G[a+100>>2]=0;G[a+104>>2]=0;G[a+140>>2]=0;G[a+132>>2]=0;G[a+136>>2]=0;if(!Ti(c)){break g}Wa(G[a+40>>2]);Wa(G[a+36>>2]);G[a+28>>2]=0;break f}h:{i:{j:{b=G[a+104>>2];if(b>>>0>1){break j}b=-1;if((xq(a)|0)==-1){break h}b=G[a+104>>2];switch(b|0){case 0:break h;case 1:break i;default:break j}}d=G[c>>2];if(H[d|0]!=31|H[d+1|0]!=139){break i}k:{if(!G[c+36>>2]|(!c|!G[c+32>>2])){break k}b=G[c+28>>2];if(!b|(c|0)!=G[b>>2]|G[b+4>>2]-16180>>>0>31){break k}G[b+52>>2]=0;G[b+44>>2]=0;G[b+48>>2]=0;G[b+32>>2]=0;G[c+8>>2]=0;G[c+20>>2]=0;G[c+24>>2]=0;d=G[b+12>>2];if(d){G[c+48>>2]=d&1}G[b+60>>2]=0;G[b+64>>2]=0;G[b+36>>2]=0;G[b+24>>2]=32768;G[b+16>>2]=0;G[b+4>>2]=16180;G[b+8>>2]=0;G[b+7108>>2]=1;G[b+7112>>2]=-1;c=b+1332|0;G[b+112>>2]=c;G[b+84>>2]=c;G[b+80>>2]=c}G[a+44>>2]=0;G[a+48>>2]=2;b=0;break e}if(!G[a+44>>2]){G[a+64>>2]=1;G[a+104>>2]=0;G[a>>2]=0;b=0;break e}c=G[a+40>>2];G[a+4>>2]=c;bb(c,G[a+100>>2],b);G[a+44>>2]=1;G[a+48>>2]=1;c=G[a+104>>2];b=0;G[a+104>>2]=0;G[a>>2]=c}break e}Vd(a,-4,3221);b=-1}if((b|0)==-1){break b}if(G[a+48>>2]){break c}return 0;case 1:G[a>>2]=0;b=G[a+28>>2]<<1;d=G[a+40>>2];l:{while(1){c=b-e|0;c=ql(G[a+20>>2],d+e|0,c>>>0<1073741824?c:1073741824);if((c|0)>0){e=c+G[a>>2]|0;G[a>>2]=e;if(b>>>0>e>>>0){continue}break l}break}if((c|0)<0){break a}G[a+64>>2]=1}G[a+4>>2]=G[a+40>>2];return 0;case 2:break d;default:break c}}G[a+112>>2]=G[a+40>>2];G[a+116>>2]=G[a+28>>2]<<1;e=-1;if((yq(a)|0)==-1){break b}}e=0;if(G[a>>2]){break b}if(G[a+104>>2]|!G[a+64>>2]){continue}}break}return e}b=a;a=G[48624];Vd(b,-1,I[((a>>>0>149?0:a)<<1)+143920>>1]+142088|0);return-1}function _k(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{c:{if(!e){if(l){break c}l=0;if((b|0)<=0){break b}while(1){d:{e:{f=l<<2;n=+G[f+a>>2]*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;break e}if(n>0x7ffffffffffffc00){G[k>>2]=-11;e=2147483647;break d}if(!(O(n)<2147483648)){break e}e=~~n;break d}e=-2147483648}G[f+j>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break b}if(!l){if((b|0)<=0){break b}l=0;while(1){m=l<<2;o=G[m+a>>2];f:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+m>>2]=g;break f}E[h+l|0]=1;break f}n=+(o|0)*c+d;if(n<-0x7ffffffffffffc00){G[k>>2]=-11;G[j+m>>2]=-2147483648;break f}if(n>0x7ffffffffffffc00){G[k>>2]=-11;G[j+m>>2]=2147483647;break f}o=j+m|0;if(O(n)<2147483648){m=~~n}else{m=-2147483648}G[o>>2]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break b}if((b|0)<=0){break b}if((e|0)!=1){e=b&1;l=0;if((b|0)!=1){g=b&-2;b=0;while(1){k=l<<2;m=G[k+a>>2];g:{if((m|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break g}G[j+k>>2]=m}k=l|1;m=k<<2;o=G[m+a>>2];h:{if((o|0)!=(f|0)){G[j+m>>2]=o;break h}G[i>>2]=1;E[h+k|0]=1}l=l+2|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(!e){break b}b=l<<2;a=G[b+a>>2];if((f|0)!=(a|0)){break a}G[i>>2]=1;E[h+l|0]=1;break b}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=l<<2;b=G[m+a>>2];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[j+m>>2]=b;m=(l|1)<<2;b=G[m+a>>2];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[j+m>>2]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break b}b=l<<2;a=G[b+a>>2];if((f|0)==(a|0)){G[i>>2]=1;a=g}break a}if((b|0)<=0){break b}g=b&3;e=0;l=0;if(b-1>>>0>=3){h=b&-4;b=0;while(1){f=l<<2;G[f+j>>2]=G[a+f>>2];i=f|4;G[i+j>>2]=G[a+i>>2];i=f|8;G[i+j>>2]=G[a+i>>2];f=f|12;G[f+j>>2]=G[a+f>>2];l=l+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}if(!g){break b}while(1){b=l<<2;G[b+j>>2]=G[a+b>>2];l=l+1|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}}return}G[b+j>>2]=a}function qo(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;p=Fa-112|0;Fa=p;if(m){G[m>>2]=0}G[n>>2]=0;q=d+1|0;d=q>>31;G[p+32>>2]=q;G[p+36>>2]=d;G[p+80>>2]=q;G[p+84>>2]=d;q=G[e>>2];d=G[e+4>>2];a:{b:{if(!(q|d)){t=G[e+8>>2];e=G[e+12>>2];break b}q=q+1|0;d=q?d:d+1|0;G[p+64>>2]=q;G[p+68>>2]=d;r=G[e+12>>2];d=r;s=G[e+8>>2];v=s+1|0;d=v?d:d+1|0;G[p+24>>2]=v;G[p+28>>2]=d;G[p+72>>2]=v;G[p+76>>2]=d;c:{if((s|0)==G[f+8>>2]&(r|0)==G[f+12>>2]){d=G[f+4>>2];r=G[f>>2]+1|0;d=r?d:d+1|0;break c}d=G[h>>2];r=d;d=d>>31}s=d;d=r;G[p+16>>2]=d;G[p+20>>2]=s;md(a,b,p- -64|0,p+16|0,g,i,j,k,l,p+12|0,o);r=(d-q|0)+1|0;G[n>>2]=r+G[n>>2];if(!(!m|!G[p+12>>2])){G[m>>2]=1}s=G[e+8>>2];d=G[e+12>>2];if((s|0)==G[f+8>>2]&(d|0)==G[f+12>>2]){break a}G[e>>2]=0;G[e+4>>2]=0;q=e;e=d;d=s+1|0;e=d?e:e+1|0;t=d;G[q+8>>2]=d;G[q+12>>2]=e;l=((i|0)==2?l?r:0:0)+l|0;k=M(c,r)+k|0}G[p+64>>2]=1;G[p+68>>2]=0;d=e;q=t+1|0;d=q?d:d+1|0;r=q;G[p+72>>2]=q;G[p+76>>2]=d;q=G[h>>2];d=q>>31;u=q;G[p+16>>2]=q;G[p+20>>2]=d;q=G[f+12>>2];v=q;s=d;w=G[f+8>>2];x=u;d=G[f+4>>2];u=G[f>>2]+1|0;d=u?d:d+1|0;u=(x|0)==(u|0)&(d|0)==(s|0);s=w+u|0;d=q;q=s;G[p+24>>2]=q;d=q>>>0>>0?d+1|0:d;G[p+28>>2]=d;s=d;d:{if((d|0)<=(e|0)&q>>>0<=t>>>0|(d|0)<(e|0)){d=v;c=w+1|0;d=c?d:d+1|0;t=c;e=d;break d}md(a,b,p- -64|0,p+16|0,g,i,j,k,l,p+12|0,o);r=(q-r|0)+1|0;G[n>>2]=G[n>>2]+M(r,G[h>>2]);if(!(!m|!G[p+12>>2])){G[m>>2]=1}d=G[f+12>>2];e=G[f+8>>2]+1|0;d=e?d:d+1|0;t=e;e=d;if((q|0)==(t|0)&(s|0)==(d|0)){break a}d=M(r,G[h>>2]);l=((i|0)==2?l?d:0:0)+l|0;k=M(c,d)+k|0}if((q|0)==(t|0)&(e|0)==(s|0)){break a}d=G[f>>2];c=G[f+4>>2];G[p+24>>2]=t;G[p+28>>2]=e;G[p+72>>2]=t;G[p+76>>2]=e;e=c;c=d+1|0;e=c?e:e+1|0;G[p+16>>2]=c;G[p+20>>2]=e;md(a,b,p- -64|0,p+16|0,g,i,j,k,l,p+12|0,o);if(!(!m|!G[p+12>>2])){G[m>>2]=1}a=G[p+16>>2];b=G[p+64>>2];G[n>>2]=(G[n>>2]+(a-b|0)|0)+1}Fa=p+112|0}function Op(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0,p=0;l=c==1&d==0;a:{b:{c:{if(!e){if(l){break c}l=0;if((b|0)<=0){break a}while(1){f=l<<1;m=+F[f+a>>1]*c+d;d:{if(m<-32768.49){G[k>>2]=-11;e=32768;break d}if(m>32767.49){G[k>>2]=-11;e=32767;break d}e=~~m;if(O(m)<2147483648){break d}e=-2147483648}F[f+j>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}e:{f:{if(!l){if((b|0)<=0){break a}l=0;if((e|0)!=1){break f}f=f&65535;while(1){h=l<<1;e=I[h+a>>1];g:{if((e|0)!=(f|0)){m=+(e<<16>>16)*c+d;if(!(m<-32768.49)){if(!(m>32767.49)){e=~~m;if(O(m)<2147483648){break g}e=-2147483648;break g}G[k>>2]=-11;e=32767;break g}G[k>>2]=-11;e=32768;break g}G[i>>2]=1;e=g}F[h+j>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)==1){break b}l=0;if((b|0)!=1){k=b&-2;g=f&65535;e=0;while(1){o=l<<1;n=I[o+a>>1];h:{if((n|0)==(g|0)){G[i>>2]=1;E[h+l|0]=1;break h}F[j+o>>1]=n}o=l|1;n=o<<1;p=I[n+a>>1];i:{if((g|0)!=(p|0)){F[j+n>>1]=p;break i}G[i>>2]=1;E[h+o|0]=1}l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!(b&1)){break a}b=a;a=l<<1;b=I[b+a>>1];if((b|0)==(f&65535)){break e}F[a+j>>1]=b;break a}f=f&65535;while(1){e=l<<1;g=I[e+a>>1];j:{if((g|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break j}m=+(g<<16>>16)*c+d;if(m<-32768.49){G[k>>2]=-11;F[e+j>>1]=32768;break j}if(m>32767.49){G[k>>2]=-11;F[e+j>>1]=32767;break j}g=e+j|0;if(O(m)<2147483648){e=~~m}else{e=-2147483648}F[g>>1]=e}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}G[i>>2]=1;E[h+l|0]=1;break a}yd(j,a,b<<1);break a}k=b&1;l=0;if((b|0)!=1){o=b&-2;h=f&65535;e=0;while(1){n=l<<1;b=I[n+a>>1];if((h|0)==(b|0)){G[i>>2]=1;b=g}F[j+n>>1]=b;n=(l|1)<<1;b=I[n+a>>1];if((h|0)==(b|0)){G[i>>2]=1;b=g}F[j+n>>1]=b;l=l+2|0;e=e+2|0;if((o|0)!=(e|0)){continue}break}}if(!k){break a}b=a;a=l<<1;l=I[b+a>>1];if((l|0)==(f&65535)){G[i>>2]=1;l=g}F[a+j>>1]=l}}function Vf(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=Fa-224|0;Fa=g;f=G[e>>2];a:{if((f|0)>0){break a}if(b){G[b>>2]=0}if(c){G[c>>2]=0}if(d){G[d>>2]=0}b:{c:{h=Va(a);d:{if(!h){break d}f=0;while(1){i=a+f|0;if(H[i|0]==32){f=f+1|0;if((h|0)!=(f|0)){continue}break d}break}if((f|0)!=(h|0)){break c}}tb(5,46113);break b}if(h-f>>>0>=71){tb(5,46163);break b}l=Za(g+144|0,i);h=Va(l);if(h){f=0;while(1){i=f+l|0;j=E[i|0];E[i|0]=j-97>>>0<26?j&95:j;f=f+1|0;if((h|0)!=(f|0)){continue}break}}f=0;while(1){i=f;f=f+1|0;k=i+l|0;h=E[k|0];if(h-48>>>0<10){continue}break}e:{f:{if(!i){G[g+220>>2]=1;break f}G[g+32>>2]=g+220;if((Qc(l,27698,g+32|0)|0)!=1){break e}h=H[k|0]}f=80;g:{h:{i:{j:{k:{l:{m:{n:{o:{p:{q:{r:{s:{t:{u:{v:{w:{j=h&254;h=(j|0)==80;switch(H[h+k|0]-65|0){case 20:break h;case 12:break j;case 2:break k;case 18:break l;case 1:break m;case 23:break n;case 11:break o;case 0:break p;case 3:break q;case 4:break r;case 10:break s;case 9:break t;case 22:break u;case 21:break v;case 8:break w;default:break i}}G[g+48>>2]=2;f=21;break g}G[g+48>>2]=4;f=40;break g}G[g+48>>2]=8;break g}G[g+48>>2]=4;f=41;break g}G[g+48>>2]=8;f=81;break g}G[g+48>>2]=4;f=42;break g}G[g+48>>2]=8;f=82;break g}f=k+1|0;i=f+((j|0)==80)|0;a=H[i|0];x:{if(!a){break x}G[g+16>>2]=g+48;if((Qc(((a|0)!=40?h?f:k:i)+1|0,27698,g+16|0)|0)!=1){break x}f=16;if((j|0)==80|G[g+48>>2]<=G[g+220>>2]){break g}}G[g+48>>2]=G[g+220>>2];f=16;break g}G[g+48>>2]=1;f=14;break g}G[g+48>>2]=1;f=1;break g}G[g+48>>2]=1;f=11;break g}G[g+48>>2]=1;f=12;break g}G[g+48>>2]=8;f=83;break g}G[g+48>>2]=16;f=163;break g}G[g>>2]=a;a=g+48|0;Ya(a,81,67815,g);tb(5,a);f=262;G[e>>2]=262;break a}G[g+48>>2]=2;f=20}if(b){G[b>>2]=(j|0)==80?0-f|0:f}if(c){G[c>>2]=G[g+220>>2]}if(d){G[d>>2]=G[g+48>>2]}f=G[e>>2];break a}tb(5,46216)}f=261;G[e>>2]=261}Fa=g+224|0;return f}function Wk(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;m=L[(l<<3)+a>>3]*c+d;c:{if(m<-32768.49){G[j>>2]=-11;e=32768;break c}if(m>32767.49){G[j>>2]=-11;e=32767;break c}e=~~m;if(O(m)<2147483648){break c}e=-2147483648}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+6|0;d:{e:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(O(d)<2147483648)){break e}n=~~d;break d}if((b|0)<=0){break a}while(1){f:{g:{h:{i:{n=I[l>>1]&32752;switch(((n|0)==32752?1:!n<<1)|0){case 0:break g;case 1:break i;default:break h}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break f}E[g+k|0]=1;break f}F[(k<<1)+i>>1]=0;break f}c=L[(k<<3)+a>>3];if(c<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break f}if(c>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break f}o=(k<<1)+i|0;if(O(c)<2147483648){n=~~c}else{n=-2147483648}F[o>>1]=n}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=-2147483648}while(1){j:{k:{l:{m:{o=I[l>>1]&32752;switch(((o|0)==32752?1:!o<<1)|0){case 0:break k;case 1:break m;default:break l}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break j}E[g+k|0]=1;break j}if(d<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break j}if(d>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break j}F[(k<<1)+i>>1]=n;break j}m=L[(k<<3)+a>>3]*c+d;if(m<-32768.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32768;break j}if(m>32767.49){G[j>>2]=-11;F[(k<<1)+i>>1]=32767;break j}p=(k<<1)+i|0;if(O(m)<2147483648){o=~~m}else{o=-2147483648}F[p>>1]=o}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;c=L[(l<<3)+a>>3];n:{if(c<-32768.49){G[j>>2]=-11;e=32768;break n}if(c>32767.49){G[j>>2]=-11;e=32767;break n}e=~~c;if(O(c)<2147483648){break n}e=-2147483648}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Tp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{c:{if(!e){if(l){break c}l=0;if((b|0)<=0){break b}while(1){d:{e:{f=l<<2;n=+G[f+a>>2]*c+d;if(n<-2147483648.49){G[k>>2]=-11;break e}if(n>2147483647.49){G[k>>2]=-11;e=2147483647;break d}if(!(O(n)<2147483648)){break e}e=~~n;break d}e=-2147483648}G[f+j>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break b}if(!l){if((b|0)<=0){break b}l=0;while(1){m=l<<2;o=G[m+a>>2];f:{if((o|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[j+m>>2]=g;break f}E[h+l|0]=1;break f}n=+(o|0)*c+d;if(n<-2147483648.49){G[k>>2]=-11;G[j+m>>2]=-2147483648;break f}if(n>2147483647.49){G[k>>2]=-11;G[j+m>>2]=2147483647;break f}o=j+m|0;if(O(n)<2147483648){m=~~n}else{m=-2147483648}G[o>>2]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break b}if((b|0)<=0){break b}if((e|0)!=1){e=b&1;l=0;if((b|0)!=1){g=b&-2;b=0;while(1){k=l<<2;m=G[k+a>>2];g:{if((m|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break g}G[j+k>>2]=m}k=l|1;m=k<<2;o=G[m+a>>2];h:{if((o|0)!=(f|0)){G[j+m>>2]=o;break h}G[i>>2]=1;E[h+k|0]=1}l=l+2|0;b=b+2|0;if((g|0)!=(b|0)){continue}break}}if(!e){break b}b=l<<2;a=G[b+a>>2];if((f|0)!=(a|0)){break a}G[i>>2]=1;E[h+l|0]=1;break b}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=l<<2;b=G[m+a>>2];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[j+m>>2]=b;m=(l|1)<<2;b=G[m+a>>2];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[j+m>>2]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break b}b=l<<2;a=G[b+a>>2];if((f|0)==(a|0)){G[i>>2]=1;a=g}break a}if((b|0)<=0){break b}g=b&3;e=0;l=0;if(b-1>>>0>=3){h=b&-4;b=0;while(1){f=l<<2;G[f+j>>2]=G[a+f>>2];i=f|4;G[i+j>>2]=G[a+i>>2];i=f|8;G[i+j>>2]=G[a+i>>2];f=f|12;G[f+j>>2]=G[a+f>>2];l=l+4|0;b=b+4|0;if((h|0)!=(b|0)){continue}break}}if(!g){break b}while(1){b=l<<2;G[b+j>>2]=G[a+b>>2];l=l+1|0;e=e+1|0;if((g|0)!=(e|0)){continue}break}}return}G[b+j>>2]=a}function Yk(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<1)+j|0;m=+G[(l<<2)+a>>2]*c+d;c:{if(m<-32768.49){G[k>>2]=-11;e=32768;break c}if(m>32767.49){G[k>>2]=-11;e=32767;break c}e=~~m;if(O(m)<2147483648){break c}e=-2147483648}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){n=G[(l<<2)+a>>2];d:{if((n|0)==(f|0)){G[i>>2]=1;if((e|0)==1){F[(l<<1)+j>>1]=g;break d}E[h+l|0]=1;break d}m=+(n|0)*c+d;if(m<-32768.49){G[k>>2]=-11;F[(l<<1)+j>>1]=32768;break d}if(m>32767.49){G[k>>2]=-11;F[(l<<1)+j>>1]=32767;break d}o=(l<<1)+j|0;if(O(m)<2147483648){n=~~m}else{n=-2147483648}F[o>>1]=n}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}l=0;if((e|0)==1){while(1){e=G[(l<<2)+a>>2];e:{if((f|0)!=(e|0)){if((e|0)>=-32768){if((e|0)<=32767){break e}G[k>>2]=-11;e=32767;break e}G[k>>2]=-11;e=32768;break e}G[i>>2]=1;e=g}F[(l<<1)+j>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break a}}while(1){e=G[(l<<2)+a>>2];f:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break f}if((e|0)<=-32769){G[k>>2]=-11;F[(l<<1)+j>>1]=32768;break f}if((e|0)>=32768){G[k>>2]=-11;F[(l<<1)+j>>1]=32767;break f}F[(l<<1)+j>>1]=e}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}e=b&1;l=0;if((b|0)!=1){g=b&-2;f=0;while(1){b=G[(l<<2)+a>>2];g:{if((b|0)<=-32769){G[k>>2]=-11;b=32768;break g}if((b|0)<32768){break g}G[k>>2]=-11;b=32767}F[(l<<1)+j>>1]=b;h=l|1;b=G[(h<<2)+a>>2];h:{if((b|0)>=-32768){if((b|0)<=32767){break h}G[k>>2]=-11;b=32767;break h}G[k>>2]=-11;b=32768}F[(h<<1)+j>>1]=b;l=l+2|0;f=f+2|0;if((g|0)!=(f|0)){continue}break}}if(!e){break a}a=G[(l<<2)+a>>2];i:{if((a|0)>=-32768){if((a|0)<=32767){break i}G[k>>2]=-11;a=32767;break i}G[k>>2]=-11;a=32768}F[(l<<1)+j>>1]=a}}function Bp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;c:{d:{m=L[(l<<3)+a>>3]*c+d;if(m<-.49){G[j>>2]=-11;break d}if(m>0xfffffffffffff800){G[j>>2]=-11;e=-1;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(d<4294967296&d>=0)){break f}n=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{n=I[l>>1]&32752;switch(((n|0)==32752?1:!n<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}c=L[(k<<3)+a>>3];if(c<-.49){G[j>>2]=-11;G[(k<<2)+i>>2]=0;break g}if(c>0xfffffffffffff800){G[j>>2]=-11;G[(k<<2)+i>>2]=-1;break g}o=(k<<2)+i|0;if(c<4294967296&c>=0){n=~~c>>>0}else{n=0}G[o>>2]=n}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=0}while(1){k:{l:{m:{n:{o=I[l>>1]&32752;switch(((o|0)==32752?1:!o<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-.49){G[j>>2]=-11;G[(k<<2)+i>>2]=0;break k}if(d>0xfffffffffffff800){G[j>>2]=-11;G[(k<<2)+i>>2]=-1;break k}G[(k<<2)+i>>2]=n;break k}m=L[(k<<3)+a>>3]*c+d;if(m<-.49){G[j>>2]=-11;G[(k<<2)+i>>2]=0;break k}if(m>0xfffffffffffff800){G[j>>2]=-11;G[(k<<2)+i>>2]=-1;break k}p=(k<<2)+i|0;if(m<4294967296&m>=0){o=~~m>>>0}else{o=0}G[p>>2]=o}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<2)+i|0;o:{p:{c=L[(l<<3)+a>>3];if(c<-.49){G[j>>2]=-11;break p}if(c>0xfffffffffffff800){G[j>>2]=-11;e=-1;break o}if(!(c<4294967296&c>=0)){break p}e=~~c>>>0;break o}e=0}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Cp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=N(0),q=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){c:{d:{f=l<<2;n=+K[f+a>>2]*c+d;if(n<-.49){G[j>>2]=-11;break d}if(n>0xfffffffffffff800){G[j>>2]=-11;e=-1;break c}if(!(n<4294967296&n>=0)){break d}e=~~n>>>0;break c}e=0}G[f+i>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(d<4294967296&d>=0)){break f}m=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{m=I[l>>1]&32640;switch(((m|0)==32640?1:!m<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break g}E[g+k|0]=1;break g}G[(k<<2)+i>>2]=0;break g}m=k<<2;p=K[m+a>>2];c=+p;if(c<-.49){G[j>>2]=-11;G[i+m>>2]=0;break g}if(c>0xfffffffffffff800){G[j>>2]=-11;G[i+m>>2]=-1;break g}o=i+m|0;if(p=N(0)){m=~~p>>>0}else{m=0}G[o>>2]=m}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}m=0}while(1){k:{l:{m:{n:{o=I[l>>1]&32640;switch(((o|0)==32640?1:!o<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){G[(k<<2)+i>>2]=f;break k}E[g+k|0]=1;break k}if(d<-.49){G[j>>2]=-11;G[(k<<2)+i>>2]=0;break k}if(d>0xfffffffffffff800){G[j>>2]=-11;G[(k<<2)+i>>2]=-1;break k}G[(k<<2)+i>>2]=m;break k}o=k<<2;n=+K[o+a>>2]*c+d;if(n<-.49){G[j>>2]=-11;G[i+o>>2]=0;break k}if(n>0xfffffffffffff800){G[j>>2]=-11;G[(k<<2)+i>>2]=-1;break k}q=(k<<2)+i|0;if(n<4294967296&n>=0){o=~~n>>>0}else{o=0}G[q>>2]=o}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){o:{p:{f=l<<2;p=K[f+a>>2];c=+p;if(c<-.49){G[j>>2]=-11;break p}if(c>0xfffffffffffff800){G[j>>2]=-11;e=-1;break o}if(!(p=N(0))){break p}e=~~p>>>0;break o}e=0}G[f+i>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Wi(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=N(0),m=N(0);a:{if(!e){if(!(c==1&d==0)){if((b|0)<=0){break a}if((b|0)!=1){e=b&-2;while(1){K[(j<<2)+i>>2]=L[(j<<3)+a>>3]*c+d;g=j|1;K[(g<<2)+i>>2]=L[(g<<3)+a>>3]*c+d;j=j+2|0;k=k+2|0;if((e|0)!=(k|0)){continue}break}}if(!(b&1)){break a}K[(j<<2)+i>>2]=L[(j<<3)+a>>3]*c+d;return}if((b|0)<=0){break a}e=b&3;if(b-1>>>0>=3){g=b&-4;b=0;while(1){K[(j<<2)+i>>2]=L[(j<<3)+a>>3];h=j|1;K[(h<<2)+i>>2]=L[(h<<3)+a>>3];h=j|2;K[(h<<2)+i>>2]=L[(h<<3)+a>>3];h=j|3;K[(h<<2)+i>>2]=L[(h<<3)+a>>3];j=j+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){K[(j<<2)+i>>2]=L[(j<<3)+a>>3];j=j+1|0;k=k+1|0;if((e|0)!=(k|0)){continue}break}break a}j=a+6|0;b:{if(!(c==1&d==0)){if((b|0)<=0){break a}m=N(d);if((e|0)!=1){break b}while(1){l=m;c:{d:{e:{e=I[j>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break d;case 1:break e;default:break c}}G[h>>2]=1;l=f;break c}l=N(L[(k<<3)+a>>3]*c+d)}K[(k<<2)+i>>2]=l;j=j+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)==1){while(1){l=N(0);f:{g:{h:{e=I[j>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break g;case 1:break h;default:break f}}G[h>>2]=1;l=f;break f}l=N(L[(k<<3)+a>>3])}K[(k<<2)+i>>2]=l;j=j+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break a}}while(1){i:{j:{k:{l:{e=I[j>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break j;case 1:break l;default:break k}}G[h>>2]=1;E[g+k|0]=1;break i}G[(k<<2)+i>>2]=0;break i}K[(k<<2)+i>>2]=L[(k<<3)+a>>3]}j=j+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}while(1){m:{n:{o:{p:{e=I[j>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break n;case 1:break p;default:break o}}G[h>>2]=1;E[g+k|0]=1;break m}K[(k<<2)+i>>2]=m;break m}K[(k<<2)+i>>2]=L[(k<<3)+a>>3]*c+d}j=j+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}}}function Ip(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=N(0),o=0,p=0,q=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;c:{d:{m=+K[(l<<2)+a>>2]*c+d;if(m<-.49){G[j>>2]=-11;break d}if(m>65535.49){G[j>>2]=-11;e=65535;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(d<4294967296&d>=0)){break f}o=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{o=I[l>>1]&32640;switch(((o|0)==32640?1:!o<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break g}E[g+k|0]=1;break g}F[(k<<1)+i>>1]=0;break g}n=K[(k<<2)+a>>2];c=+n;if(c<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break g}if(c>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break g}p=(k<<1)+i|0;if(n=N(0)){o=~~n>>>0}else{o=0}F[p>>1]=o}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}o=0}while(1){k:{l:{m:{n:{p=I[l>>1]&32640;switch(((p|0)==32640?1:!p<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break k}E[g+k|0]=1;break k}if(d<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break k}if(d>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break k}F[(k<<1)+i>>1]=o;break k}m=+K[(k<<2)+a>>2]*c+d;if(m<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break k}if(m>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break k}q=(k<<1)+i|0;if(m<4294967296&m>=0){p=~~m>>>0}else{p=0}F[q>>1]=p}l=l+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;o:{p:{n=K[(l<<2)+a>>2];c=+n;if(c<-.49){G[j>>2]=-11;break p}if(c>65535.49){G[j>>2]=-11;e=65535;break o}if(!(n=N(0))){break p}e=~~n>>>0;break o}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function bl(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0;a:{if(!e){if(!(c==1&d==0)){if((b|0)<=0){break a}if((b|0)!=1){e=b&-2;while(1){L[(j<<3)+i>>3]=+K[(j<<2)+a>>2]*c+d;g=j|1;L[(g<<3)+i>>3]=+K[(g<<2)+a>>2]*c+d;j=j+2|0;k=k+2|0;if((e|0)!=(k|0)){continue}break}}if(!(b&1)){break a}L[(j<<3)+i>>3]=+K[(j<<2)+a>>2]*c+d;return}if((b|0)<=0){break a}e=b&3;if(b-1>>>0>=3){g=b&-4;b=0;while(1){L[(j<<3)+i>>3]=K[(j<<2)+a>>2];h=j|1;L[(h<<3)+i>>3]=K[(h<<2)+a>>2];h=j|2;L[(h<<3)+i>>3]=K[(h<<2)+a>>2];h=j|3;L[(h<<3)+i>>3]=K[(h<<2)+a>>2];j=j+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){L[(j<<3)+i>>3]=K[(j<<2)+a>>2];j=j+1|0;k=k+1|0;if((e|0)!=(k|0)){continue}break}break a}j=a+2|0;b:{if(!(c==1&d==0)){if((b|0)<=0){break a}if((e|0)!=1){break b}while(1){l=d;c:{d:{e:{e=I[j>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break d;case 1:break e;default:break c}}G[h>>2]=1;l=f;break c}l=+K[(k<<2)+a>>2]*c+d}L[(k<<3)+i>>3]=l;j=j+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)==1){while(1){d=0;f:{g:{h:{e=I[j>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break g;case 1:break h;default:break f}}G[h>>2]=1;d=f;break f}d=+K[(k<<2)+a>>2]}L[(k<<3)+i>>3]=d;j=j+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break a}}while(1){i:{j:{k:{l:{e=I[j>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break j;case 1:break l;default:break k}}G[h>>2]=1;E[g+k|0]=1;break i}e=(k<<3)+i|0;G[e>>2]=0;G[e+4>>2]=0;break i}L[(k<<3)+i>>3]=K[(k<<2)+a>>2]}j=j+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}while(1){m:{n:{o:{p:{e=I[j>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break n;case 1:break p;default:break o}}G[h>>2]=1;E[g+k|0]=1;break m}L[(k<<3)+i>>3]=d;break m}L[(k<<3)+i>>3]=+K[(k<<2)+a>>2]*c+d}j=j+4|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}}}function Np(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<1)+j|0;n=+H[a+l|0]*c+d;c:{if(n<-32768.49){G[k>>2]=-11;e=32768;break c}if(n>32767.49){G[k>>2]=-11;e=32767;break c}e=~~n;if(O(n)<2147483648){break c}e=-2147483648}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){m=H[a+l|0];d:{if((m|0)==(f|0)){G[i>>2]=1;if((e|0)==1){F[(l<<1)+j>>1]=g;break d}E[h+l|0]=1;break d}n=+(m>>>0)*c+d;if(n<-32768.49){G[k>>2]=-11;F[(l<<1)+j>>1]=32768;break d}if(n>32767.49){G[k>>2]=-11;F[(l<<1)+j>>1]=32767;break d}o=(l<<1)+j|0;if(O(n)<2147483648){m=~~n}else{m=-2147483648}F[o>>1]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){g=b&1;l=0;if((b|0)!=1){k=b&-2;b=0;while(1){e=H[a+l|0];e:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break e}F[(l<<1)+j>>1]=e}e=l|1;m=H[e+a|0];f:{if((m|0)!=(f|0)){F[(e<<1)+j>>1]=m;break f}G[i>>2]=1;E[e+h|0]=1}l=l+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!g){break a}a=H[a+l|0];if((a|0)!=(f|0)){F[(l<<1)+j>>1]=a;return}G[i>>2]=1;E[h+l|0]=1;break a}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=(l<<1)+j|0;b=H[a+l|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}F[m>>1]=b;m=l|1;b=H[m+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}F[(m<<1)+j>>1]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break a}b=(l<<1)+j|0;a=H[a+l|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}F[b>>1]=g;return}if((b|0)<=0){break a}e=b&3;f=0;l=0;if(b-1>>>0>=3){g=b&-4;b=0;while(1){F[(l<<1)+j>>1]=H[a+l|0];h=l|1;F[(h<<1)+j>>1]=H[a+h|0];h=l|2;F[(h<<1)+j>>1]=H[a+h|0];h=l|3;F[(h<<1)+j>>1]=H[a+h|0];l=l+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){F[(l<<1)+j>>1]=H[a+l|0];l=l+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}}function Ep(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<2)+j|0;c:{d:{n=+H[a+l|0]*c+d;if(n<-.49){G[k>>2]=-11;break d}if(n>0xfffffffffffff800){G[k>>2]=-11;e=-1;break c}if(!(n<4294967296&n>=0)){break d}e=~~n>>>0;break c}e=0}G[f>>2]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){m=H[a+l|0];e:{if((m|0)==(f|0)){G[i>>2]=1;if((e|0)==1){G[(l<<2)+j>>2]=g;break e}E[h+l|0]=1;break e}n=+(m>>>0)*c+d;if(n<-.49){G[k>>2]=-11;G[(l<<2)+j>>2]=0;break e}if(n>0xfffffffffffff800){G[k>>2]=-11;G[(l<<2)+j>>2]=-1;break e}o=(l<<2)+j|0;if(n<4294967296&n>=0){m=~~n>>>0}else{m=0}G[o>>2]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){g=b&1;l=0;if((b|0)!=1){k=b&-2;b=0;while(1){e=H[a+l|0];f:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break f}G[(l<<2)+j>>2]=e}e=l|1;m=H[e+a|0];g:{if((m|0)!=(f|0)){G[(e<<2)+j>>2]=m;break g}G[i>>2]=1;E[e+h|0]=1}l=l+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!g){break a}a=H[a+l|0];if((a|0)!=(f|0)){G[(l<<2)+j>>2]=a;return}G[i>>2]=1;E[h+l|0]=1;break a}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=(l<<2)+j|0;b=H[a+l|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}G[m>>2]=b;m=l|1;b=H[m+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}G[(m<<2)+j>>2]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break a}b=(l<<2)+j|0;a=H[a+l|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}G[b>>2]=g;return}if((b|0)<=0){break a}e=b&3;f=0;l=0;if(b-1>>>0>=3){g=b&-4;b=0;while(1){G[(l<<2)+j>>2]=H[a+l|0];h=l|1;G[(h<<2)+j>>2]=H[a+h|0];h=l|2;G[(h<<2)+j>>2]=H[a+h|0];h=l|3;G[(h<<2)+j>>2]=H[a+h|0];l=l+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){G[(l<<2)+j>>2]=H[a+l|0];l=l+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}}function Cj(a,b,c,d){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,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;i=Fa-48|0;Fa=i;G[d+8>>2]=0;G[d+12>>2]=0;G[d>>2]=0;G[d+4>>2]=1072693248;G[d+16>>2]=0;G[d+20>>2]=0;G[d+24>>2]=0;G[d+28>>2]=0;G[d+40>>2]=0;G[d+44>>2]=0;G[d+32>>2]=0;G[d+36>>2]=1072693248;G[d+48>>2]=0;G[d+52>>2]=0;G[d+56>>2]=0;G[d+60>>2]=0;G[d+64>>2]=0;G[d+68>>2]=1072693248;G[i+4>>2]=3;p=i+4|0;G[p+4>>2]=2;G[p+8>>2]=3;L[i+32>>3]=c;L[i+24>>3]=b;L[i+16>>3]=a;p=G[i+4>>2];q=L[d+40>>3];k=L[d+16>>3];r=L[d+56>>3];s=L[d+32>>3];l=L[d+8>>3];t=L[d+24>>3];u=L[d>>3];b=L[i+16>>3];a=eb(b);c=ib(b);a:{b:{c:{switch(p-1|0){case 0:g=-c;e=c;f=a;b=a;c=0;a=1;break a;case 1:m=-c;f=a;j=c;c=0;b=1;break b;default:break c}}h=-c;f=1;b=a}}v=f+(g*q+(j*k+0));w=f*r+(g*s+(j*l+0));x=f*0+(g*t+(j*u+0));y=e+(b*q+(h*k+0));z=e*r+(b*s+(h*l+0));n=e*0+(b*t+(h*u+0));k=m+(c*q+(a*k+0));l=m*r+(c*s+(a*l+0));m=m*0+(c*t+(a*u+0));p=G[i+8>>2];a=L[i+24>>3];c=eb(a);e=ib(a);d:{e:{switch(p-1|0){case 1:o=-e;f=1;g=0;a=c;b=e;h=0;e=0;j=0;break d;case 0:g=-e;b=0;h=e;a=c;f=c;e=0;c=1;j=0;break d;default:break e}}g=0;a=1;b=0;h=0;f=c;j=-e}A=a*v+(g*y+(b*k+0));q=a*w+(g*z+(b*l+0));r=a*x+(g*n+(b*m+0));a=j;s=h*v+(f*y+(a*k+0));t=h*w+(f*z+(a*l+0));u=h*x+(f*n+(a*m+0));k=o*v+(e*y+(c*k+0));l=o*w+(e*z+(c*l+0));m=o*x+(e*n+(c*m+0));p=G[i+12>>2];a=L[i+32>>3];c=eb(a);e=ib(a);f:{g:{switch(p-1|0){case 1:o=-e;h=1;n=0;g=c;j=e;f=0;e=0;a=0;break f;case 0:n=-e;j=0;f=e;g=c;h=c;o=0;e=0;c=1;a=0;break f;default:break g}}n=0;g=1;j=0;f=0;h=c;o=0;a=-e}L[d+24>>3]=f*r+(h*u+(a*m+0));L[d>>3]=o*r+(e*u+(c*m+0));L[d+56>>3]=g*q+(n*t+(j*l+0));L[d+32>>3]=f*q+(h*t+(a*l+0));L[d+8>>3]=o*q+(e*t+(c*l+0));L[d+64>>3]=g*A+(n*s+(j*k+0));L[d+48>>3]=g*r+(n*u+(j*m+0));L[d+40>>3]=f*A+(h*s+(a*k+0));L[d+16>>3]=o*A+(e*s+(c*k+0));Fa=i+48|0}function Rm(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{p=h+1;b:{if(O(p)<2147483648){k=~~p;break b}k=-2147483648}k=(k|0)>1?k:1;l=!b;p=j+1;c:{if(O(p)<2147483648){o=~~p;break c}o=-2147483648}n=o-1|0;n=(d|0)>(n|0)?n:d;if(l|((k|0)>(n|0)|(n|0)<=0)){break a}i=(g-i)/(h-j);h=(+(k|0)-h)*i+g;o=c+1|0;if((f|0)==1){f=G[a+48>>2];l=G[a+44>>2];while(1){a=k;k=lb(1,8);g=h+1;d:{if(O(g)<2147483648){d=~~g;break d}d=-2147483648}d=(d|0)>1?d:1;m=(c|0)<(d|0)?o:d;G[k+4>>2]=m;d=(a|0)<(l|0)?l:a;e=(((d|0)<(f|0)?d:f)<<2)+b|0;d=G[e>>2];e:{if(!d){d=0;break e}if((m|0)>2]){break e}while(1){e=d;d=G[d>>2];if(!d){d=0;break e}if((m|0)>G[d+4>>2]){continue}break}}G[k>>2]=d;G[e>>2]=k;k=a+1|0;h=i+h;if((a|0)!=(n|0)){continue}break}break a}if(!e){while(1){f=k;e=G[a+48>>2];k=G[a+44>>2];l=lb(1,8);g=h+1;f:{if(O(g)<2147483648){d=~~g;break f}d=-2147483648}d=(d|0)>1?d:1;m=(c|0)<(d|0)?o:d;G[l+4>>2]=m;d=(f|0)<(k|0)?k:f;k=((d|0)<(e|0)?d:e)<<2;e=k+b|0;d=G[e>>2];g:{if(!d){d=0;break g}if((m|0)>2]){break g}while(1){e=d;d=G[d>>2];if(!d){d=0;break g}if((m|0)>G[d+4>>2]){continue}break}}G[l>>2]=d;G[e>>2]=l;G[k+G[a+56>>2]>>2]=G[a+36>>2];G[k+G[a+60>>2]>>2]=G[a+40>>2];k=f+1|0;h=i+h;if((f|0)!=(n|0)){continue}break a}}while(1){f=G[a+48>>2];l=G[a+44>>2];m=lb(1,8);g=h+1;h:{if(O(g)<2147483648){d=~~g;break h}d=-2147483648}d=(d|0)>1?d:1;e=(c|0)<(d|0)?o:d;G[m+4>>2]=e;d=(k|0)<(l|0)?l:k;l=((d|0)<(f|0)?d:f)<<2;f=l+b|0;d=G[f>>2];i:{if(!d){d=0;break i}if((e|0)>2]){break i}while(1){f=d;d=G[d>>2];if(!d){d=0;break i}if((e|0)>G[d+4>>2]){continue}break}}G[m>>2]=d;G[f>>2]=m;d=l+G[a+56>>2]|0;if((e|0)<=G[d>>2]){f=d;d=G[a+36>>2];G[f>>2]=(d|0)>(e|0)?d:e}d=l+G[a+60>>2]|0;if((e|0)>=G[d>>2]){f=d;d=G[a+40>>2];G[f>>2]=(d|0)<(e|0)?d:e}h=i+h;d=(k|0)!=(n|0);k=k+1|0;if(d){continue}break}}}function Jp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<1)+j|0;c:{d:{n=+H[a+l|0]*c+d;if(n<-.49){G[k>>2]=-11;break d}if(n>65535.49){G[k>>2]=-11;e=65535;break c}if(!(n<4294967296&n>=0)){break d}e=~~n>>>0;break c}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){m=H[a+l|0];e:{if((m|0)==(f|0)){G[i>>2]=1;if((e|0)==1){F[(l<<1)+j>>1]=g;break e}E[h+l|0]=1;break e}n=+(m>>>0)*c+d;if(n<-.49){G[k>>2]=-11;F[(l<<1)+j>>1]=0;break e}if(n>65535.49){G[k>>2]=-11;F[(l<<1)+j>>1]=65535;break e}o=(l<<1)+j|0;if(n<4294967296&n>=0){m=~~n>>>0}else{m=0}F[o>>1]=m}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){g=b&1;l=0;if((b|0)!=1){k=b&-2;b=0;while(1){e=H[a+l|0];f:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break f}F[(l<<1)+j>>1]=e}e=l|1;m=H[e+a|0];g:{if((m|0)!=(f|0)){F[(e<<1)+j>>1]=m;break g}G[i>>2]=1;E[e+h|0]=1}l=l+2|0;b=b+2|0;if((k|0)!=(b|0)){continue}break}}if(!g){break a}a=H[a+l|0];if((a|0)!=(f|0)){F[(l<<1)+j>>1]=a;return}G[i>>2]=1;E[h+l|0]=1;break a}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){m=(l<<1)+j|0;b=H[a+l|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}F[m>>1]=b;m=l|1;b=H[m+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}F[(m<<1)+j>>1]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break a}b=(l<<1)+j|0;a=H[a+l|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}F[b>>1]=g;return}if((b|0)<=0){break a}e=b&3;f=0;l=0;if(b-1>>>0>=3){g=b&-4;b=0;while(1){F[(l<<1)+j>>1]=H[a+l|0];h=l|1;F[(h<<1)+j>>1]=H[a+h|0];h=l|2;F[(h<<1)+j>>1]=H[a+h|0];h=l|3;F[(h<<1)+j>>1]=H[a+h|0];l=l+4|0;b=b+4|0;if((g|0)!=(b|0)){continue}break}}if(!e){break a}while(1){F[(l<<1)+j>>1]=H[a+l|0];l=l+1|0;f=f+1|0;if((e|0)!=(f|0)){continue}break}}}function Hp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;c:{d:{m=L[(l<<3)+a>>3]*c+d;if(m<-.49){G[j>>2]=-11;break d}if(m>65535.49){G[j>>2]=-11;e=65535;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}l=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}if(!(d<4294967296&d>=0)){break f}n=~~d>>>0;break e}if((b|0)<=0){break a}while(1){g:{h:{i:{j:{n=I[l>>1]&32752;switch(((n|0)==32752?1:!n<<1)|0){case 0:break h;case 1:break j;default:break i}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break g}E[g+k|0]=1;break g}F[(k<<1)+i>>1]=0;break g}c=L[(k<<3)+a>>3];if(c<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break g}if(c>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break g}o=(k<<1)+i|0;if(c<4294967296&c>=0){n=~~c>>>0}else{n=0}F[o>>1]=n}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}n=0}while(1){k:{l:{m:{n:{o=I[l>>1]&32752;switch(((o|0)==32752?1:!o<<1)|0){case 0:break l;case 1:break n;default:break m}}G[h>>2]=1;if((e|0)==1){F[(k<<1)+i>>1]=f;break k}E[g+k|0]=1;break k}if(d<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break k}if(d>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break k}F[(k<<1)+i>>1]=n;break k}m=L[(k<<3)+a>>3]*c+d;if(m<-.49){G[j>>2]=-11;F[(k<<1)+i>>1]=0;break k}if(m>65535.49){G[j>>2]=-11;F[(k<<1)+i>>1]=65535;break k}p=(k<<1)+i|0;if(m<4294967296&m>=0){o=~~m>>>0}else{o=0}F[p>>1]=o}l=l+8|0;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=(l<<1)+i|0;o:{p:{c=L[(l<<3)+a>>3];if(c<-.49){G[j>>2]=-11;break p}if(c>65535.49){G[j>>2]=-11;e=65535;break o}if(!(c<4294967296&c>=0)){break p}e=~~c>>>0;break o}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Yn(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0;h=Fa-96|0;Fa=h;a:{b:{c:{d:{e:{if(G[g>>2]<=0){i=67;f:{j=H[a|0];switch(j-39|0){case 0:break b;case 1:break d;default:break f}}g:{switch(j-70|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break c;case 0:case 14:break e;default:break g}}if(j){break c}G[g>>2]=204}i=H[b|0];break a}i=76;break b}i=88;break b}i=70;if(jb(a,46)){break b}if(jb(a,69)){break b}i=jb(a,68)?70:73}E[b|0]=i}h:{i:{switch((i&255)-70|0){case 3:if(G[g>>2]>0){break h}G[48624]=0;G[c>>2]=0;k=c,l=nc(a,h+92|0,10),G[k>>2]=l;if((H[G[h+92>>2]]|32)!=32){G[g>>2]=407}if(G[48624]!=68){break h}b=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);c=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[h+46>>1]=c;F[h+48>>1]=c>>>16;F[h+50>>1]=b;F[h+52>>1]=b>>>16;b=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[h+40>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[h+44>>2]=b;b=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[h+32>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[h+36>>2]=b;b=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[h+24>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[h+28>>2]=b;b=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[h+16>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[h+20>>2]=b;b=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[h+8>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[h+12>>2]=b;b=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[h>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[h+4>>2]=b;tb(5,qb(h,a,25));G[g>>2]=412;G[48624]=0;break h;case 0:me(a,f,g);break h;case 6:if(G[g>>2]>0){break h}G[d>>2]=H[a|0]==84;break h;default:break i}}fd(a,e,g)}Fa=h+96|0}function Ug(a,b,c,d,e,f){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;p=Fa-16|0;Fa=p;if(G[321436]){m=G[24367];hb(88965,23,1,m);$a(m)}if(G[321436]){m=G[24367];hb(88746,39,1,m);$a(m)}a:{if(a==d){L[e>>3]=b;L[f>>3]=c;break a}if(L[23801]!=a|L[23802]!=d){G[934876]=442745336;G[934877]=1078765020;G[934878]=-1571644103;G[934879]=1066524486;G[934882]=-1291874403;G[934883]=1054102949;L[23801]=a;L[23802]=d;d=(d-a)*.01;L[467440]=d;a=(a+-2e3)*.01;g=(d*(d*-.041833)*d+((a*-217e-6*a+(a*-.8533+2004.3109))*d-d*(d*(a*217e-6+.42665))))/3600*.017453292519943295;h=eb(g);L[467458]=h;l=(a*-139e-6*a+(a*1.39656+2306.2181))*d;i=(d*(d*.017998)*d+(l+d*(d*(a*-344e-6+.30188))))/3600*.017453292519943295;j=eb(i);g=ib(g);L[467454]=j*g;i=ib(i);k=-i;L[467456]=g*k;d=(d*(d*.018203)*d+(l+d*(d*(a*66e-6+1.09468))))/3600*.017453292519943295;a=eb(d);g=-g;L[467446]=a*g;d=ib(d);L[467452]=d*g;g=j*h;L[467442]=a*g-d*i;L[467448]=g*d+i*a;h=h*k;L[467444]=a*h-d*j;L[467450]=h*d+j*a;a=.017453292519943295}else{a=L[467439]}d=a*b;b=ib(d);a=a*c;h=eb(a);j=h*0;g=eb(d);l=ib(a);k=l*-0;c=L[467441];a=(j*g+b*k)*c;n=L[467452];d=j*c;i=L[467440];l=d*i+l;q=L[467448];j=(g*k-j*b)*c;g=j*i+h*g;r=L[467450];b=a*i+b*h;i=n*l+(q*g+r*b);s=L[467446];t=L[467442];u=L[467444];k=s*l+(t*g+u*b);h=Db(i,k);o=L[467458];v=L[467454];w=L[467456];g=o*l+(v*g+w*b);k=k*k+i*i;i=Db(g,V(k));b=eb(i);l=ib(h);g=V(g*g+k);k=(o*d+(v*j+a*w))/g;o=eb(h);n=(n*d+(q*j+a*r))/g;a=(s*d+(t*j+a*u))/g;d=k*0+(b*o*n-a*(l*b));g=a;a=ib(i);j=g*(o*-a)-l*a*n;a=h;h=L[467438];a=a*h;if(a<0){while(1){a=a+360;if(a<0){continue}break}}L[e>>3]=a;if(a>360){while(1){a=a+-360;if(a>360){continue}break}L[e>>3]=a}j=(k*b+j)/c;L[f>>3]=R(Q(i*h,90),-90);h=d/(b*(b*c))/15}L[p+8>>3]=h;L[p>>3]=j;Fa=p+16|0}function Vk(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=(l<<1)+j|0;c:{d:{m=+G[(l<<2)+a>>2]*c+d;if(m<-.49){G[k>>2]=-11;break d}if(m>65535.49){G[k>>2]=-11;e=65535;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}F[f>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}l=0;while(1){n=G[(l<<2)+a>>2];e:{if((n|0)==(f|0)){G[i>>2]=1;if((e|0)==1){F[(l<<1)+j>>1]=g;break e}E[h+l|0]=1;break e}m=+(n|0)*c+d;if(m<-.49){G[k>>2]=-11;F[(l<<1)+j>>1]=0;break e}if(m>65535.49){G[k>>2]=-11;F[(l<<1)+j>>1]=65535;break e}o=(l<<1)+j|0;if(m<4294967296&m>=0){n=~~m>>>0}else{n=0}F[o>>1]=n}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}l=0;if((e|0)==1){while(1){e=G[(l<<2)+a>>2];f:{if((f|0)!=(e|0)){if((e|0)>=0){if(e>>>0<=65535){break f}G[k>>2]=-11;e=65535;break f}G[k>>2]=-11;e=0;break f}G[i>>2]=1;e=g}F[(l<<1)+j>>1]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break a}}while(1){e=G[(l<<2)+a>>2];g:{if((e|0)==(f|0)){G[i>>2]=1;E[h+l|0]=1;break g}if((e|0)<0){G[k>>2]=-11;F[(l<<1)+j>>1]=0;break g}if(e>>>0>=65536){G[k>>2]=-11;F[(l<<1)+j>>1]=65535;break g}F[(l<<1)+j>>1]=e}l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}e=b&1;l=0;if((b|0)!=1){g=b&-2;f=0;while(1){b=G[(l<<2)+a>>2];h:{if((b|0)<0){G[k>>2]=-11;b=0;break h}if(b>>>0<65536){break h}G[k>>2]=-11;b=65535}F[(l<<1)+j>>1]=b;h=l|1;b=G[(h<<2)+a>>2];i:{if((b|0)>=0){if(b>>>0<=65535){break i}G[k>>2]=-11;b=65535;break i}G[k>>2]=-11;b=0}F[(h<<1)+j>>1]=b;l=l+2|0;f=f+2|0;if((g|0)!=(f|0)){continue}break}}if(!e){break a}a=G[(l<<2)+a>>2];j:{if((a|0)>=0){if(a>>>0<=65535){break j}G[k>>2]=-11;a=65535;break j}G[k>>2]=-11;a=0}F[(l<<1)+j>>1]=a}}function ng(a,b,c,d,e,f){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;p=Fa-16|0;Fa=p;if(G[321436]){m=G[24367];hb(89024,26,1,m);$a(m)}if(G[321436]){m=G[24367];hb(88786,42,1,m);$a(m)}a:{if(a==d){L[e>>3]=b;L[f>>3]=c;break a}if(L[23798]!=a|L[23799]!=d){G[926706]=442745336;G[926707]=1078765020;G[926708]=-1571644103;G[926709]=1066524486;G[926712]=-1291874403;G[926713]=1054102949;L[23798]=a;L[23799]=d;d=(d-a)*.01;L[463355]=d;a=(a+-1900)*.01;g=(d*(d*-.0418)*d+((a*-37e-5*a+(a*-.8533+2004.685))*d-d*(d*(a*37e-5+.4267))))/3600*.017453292519943295;h=eb(g);L[463374]=h;l=(a*6e-5*a+(a*1.3975+2304.253))*d;i=(d*(d*.018)*d+(l+d*(d*(a*-27e-5+.3023))))/3600*.017453292519943295;j=eb(i);g=ib(g);L[463370]=j*g;i=ib(i);k=-i;L[463372]=g*k;d=(d*(d*.01832)*d+(l+d*(d*(a*39e-5+1.095))))/3600*.017453292519943295;a=eb(d);g=-g;L[463362]=a*g;d=ib(d);L[463368]=d*g;g=j*h;L[463358]=a*g-d*i;L[463364]=g*d+i*a;h=h*k;L[463360]=a*h-d*j;L[463366]=h*d+j*a;a=.017453292519943295}else{a=L[463354]}d=a*b;b=ib(d);a=a*c;h=eb(a);j=h*0;g=eb(d);l=ib(a);k=l*-0;c=L[463356];a=(j*g+b*k)*c;n=L[463368];d=j*c;i=L[463355];l=d*i+l;q=L[463364];j=(g*k-j*b)*c;g=j*i+h*g;r=L[463366];b=a*i+b*h;i=n*l+(q*g+r*b);s=L[463362];t=L[463358];u=L[463360];k=s*l+(t*g+u*b);h=Db(i,k);o=L[463374];v=L[463370];w=L[463372];g=o*l+(v*g+w*b);k=k*k+i*i;i=Db(g,V(k));b=eb(i);l=ib(h);g=V(g*g+k);k=(o*d+(v*j+a*w))/g;o=eb(h);n=(n*d+(q*j+a*r))/g;a=(s*d+(t*j+a*u))/g;d=k*0+(b*o*n-a*(l*b));g=a;a=ib(i);j=g*(o*-a)-l*a*n;a=h;h=L[463353];a=a*h;if(a<0){while(1){a=a+360;if(a<0){continue}break}}L[e>>3]=a;if(a>360){while(1){a=a+-360;if(a>360){continue}break}L[e>>3]=a}j=(k*b+j)/c;L[f>>3]=R(Q(i*h,90),-90);h=d/(b*(b*c))/15}L[p+8>>3]=h;L[p>>3]=j;Fa=p+16|0}function im(a,b,c,d,e){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;m=Fa-80|0;n=b-L[c+3240>>3];o=a-L[c+3232>>3];k=G[c+2424>>2];l=G[c+1616>>2];a:{if((l|0)<0){break a}while(1){q=M(l-f|0,80)+c|0;j=f<<3;g=L[(q+j|0)+1624>>3];r=j+m|0;j=f;b:{if(!f){break b}h=0;i=j&3;if(i){while(1){f=f-1|0;g=n*g+L[(q+(f<<3)|0)+1624>>3];h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(j-1>>>0<3){break b}while(1){h=q+1624|0;i=h+(f<<3)|0;g=n*(n*(n*(n*g+L[i-8>>3])+L[i-16>>3])+L[i-24>>3]);i=f-4|0;g=g+L[h+(i<<3)>>3];h=(f|0)>4;f=i;if(h){continue}break}}L[r>>3]=g;f=j+1|0;if((j|0)!=(l|0)){continue}break}g=L[m>>3];if((l|0)<=0){p=g;break a}j=l-1|0;i=l+1|0;f=l&3;c:{if(!f){p=g;break c}h=0;p=g;while(1){p=o*p+L[(i-l<<3)+m>>3];l=l-1|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}if(j>>>0<3){break a}while(1){f=(i-l<<3)+m|0;p=o*(o*(o*(o*p+L[f>>3])+L[f+8>>3])+L[f+16>>3]);f=l-3|0;p=p+L[(i-f<<3)+m>>3];l=l-4|0;if(f>>>0>1){continue}break}}L[d>>3]=p;f=0;d:{if((k|0)<0){break d}while(1){q=M(k-f|0,80)+c|0;j=f<<3;g=L[(q+j|0)+2432>>3];r=j+m|0;j=f;e:{if(!f){break e}h=0;i=j&3;if(i){while(1){f=f-1|0;g=n*g+L[(q+(f<<3)|0)+2432>>3];h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(j-1>>>0<3){break e}while(1){h=q+2432|0;i=h+(f<<3)|0;g=n*(n*(n*(n*g+L[i-8>>3])+L[i-16>>3])+L[i-24>>3]);i=f-4|0;g=g+L[h+(i<<3)>>3];h=(f|0)>4;f=i;if(h){continue}break}}L[r>>3]=g;f=j+1|0;if((j|0)!=(k|0)){continue}break}g=L[m>>3];if((k|0)<=0){break d}f=k-1|0;j=k+1|0;c=k&3;if(c){h=0;while(1){g=o*g+L[(j-k<<3)+m>>3];k=k-1|0;h=h+1|0;if((c|0)!=(h|0)){continue}break}}if(f>>>0<3){break d}while(1){c=(j-k<<3)+m|0;g=o*(o*(o*(o*g+L[c>>3])+L[c+8>>3])+L[c+16>>3]);c=k-3|0;g=g+L[(j-c<<3)+m>>3];k=k-4|0;if(c>>>0>1){continue}break}}L[e>>3]=g;L[d>>3]=L[d>>3]+a;L[e>>3]=L[e>>3]+b}function Mq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=Fa-4240|0;Fa=c;G[c+4236>>2]=0;a:{if(Xa(a,33749)|!H[3805536]&(E[b+4|0]&1)){break a}b:{c:{if(Ld(G[b+32>>2],c+128|0,c+4236|0)){a=_b(c+128|0);d=Lc(G[b+32>>2]+G[c+4236>>2]|0);pb(G[b+32>>2]);G[b+32>>2]=d;if(H[b+4|0]&96?0:H[3805528]){break c}d=G[b+48>>2];G[c+112>>2]=d?d:G[951383]+1|0;Ya(3805552,4096,48880,c+112|0);G[951383]=a+G[951383];G[b+20>>2]=a+G[b+20>>2];E[3805528]=1;break b}a=G[24367];d:{if(H[3780288]){G[c+20>>2]=3780288;G[c+16>>2]=29439;Tb(a,69475,c+16|0);break d}G[c>>2]=29439;Tb(a,68751,c)}a=G[945062];e:{if(!a){break e}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break e}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;b=G[a+4>>2];G[a+8>>2]=b;if((a|0)!=G[d>>2]){break e}a=G[a+16>>2];G[945064]=b;G[950324]=a;G[945070]=b;G[945057]=G[G[d>>2]>>2];E[3780260]=H[b|0]}E[3801300]=1;break a}a=G[b+48>>2];if(a){G[c+96>>2]=a;Ya(3805552,4096,48880,c+96|0);break b}G[c+80>>2]=G[951383];Ya(3805552,4096,48880,c+80|0)}G[c+4236>>2]=0;if(Ld(G[b+40>>2],c+128|0,c+4236|0)){a=c+128|0;d=_b(a);e=Lc(G[b+40>>2]+G[c+4236>>2]|0);pb(G[b+40>>2]);G[b+40>>2]=e;b=G[950328]+1|0;G[950328]=b;G[c+64>>2]=b;Ya(a,4096,30633,c- -64|0);e=3805552;Gb(3805552,a);G[950328]=(d+G[950328]|0)-1;break a}a=G[24367];f:{if(H[3780288]){G[c+52>>2]=3780288;G[c+48>>2]=29482;Tb(a,69475,c+48|0);break f}G[c+32>>2]=29482;Tb(a,68751,c+32|0)}a=G[945062];g:{if(!a){break g}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break g}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;b=G[a+4>>2];G[a+8>>2]=b;if((a|0)!=G[d>>2]){break g}a=G[a+16>>2];G[945064]=b;G[950324]=a;G[945070]=b;G[945057]=G[G[d>>2]>>2];E[3780260]=H[b|0]}E[3801300]=1}Fa=c+4240|0;return e|0}function Eo(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=j+l|0;m=+F[(l<<1)+a>>1]*c+d;c:{if(m<-128.49){G[k>>2]=-11;e=128;break c}if(m>127.49){G[k>>2]=-11;e=127;break c}e=~~m;if(O(m)<2147483648){break c}e=-2147483648}E[f|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}e=(e|0)==1;g=e?g:1;h=e?j:h;l=0;n=f&65535;while(1){e=I[(l<<1)+a>>1];d:{if((e|0)==(n|0)){G[i>>2]=1;f=g;e=h;break d}m=+(e<<16>>16)*c+d;e:{if(m<-128.49){G[k>>2]=-11;f=128;break e}if(m>127.49){G[k>>2]=-11;f=127;break e}f=~~m;if(O(m)<2147483648){break e}f=-2147483648}e=j}E[e+l|0]=f;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}l=0;if((e|0)==1){f=f&65535;while(1){e=I[(l<<1)+a>>1];f:{if((e|0)!=(f|0)){e=e<<16>>16;if((e|0)>=-128){if((e|0)<=127){break f}G[k>>2]=-11;e=127;break f}G[k>>2]=-11;e=128;break f}G[i>>2]=1;e=g}E[j+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}g=f&65535;while(1){e=I[(l<<1)+a>>1];g:{if((e|0)==(g|0)){e=1;G[i>>2]=1;f=h;break g}e=e<<16>>16;h:{if((e|0)<=-129){G[k>>2]=-11;e=128;break h}if((e|0)<128){break h}G[k>>2]=-11;e=127}f=j}E[f+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}f=b&1;l=0;if((b|0)!=1){g=b&-2;e=0;while(1){b=F[(l<<1)+a>>1];i:{if((b|0)<=-129){G[k>>2]=-11;b=128;break i}if((b|0)<128){break i}G[k>>2]=-11;b=127}E[j+l|0]=b;h=l|1;b=F[(h<<1)+a>>1];j:{if((b|0)>=-128){if((b|0)<=127){break j}G[k>>2]=-11;b=127;break j}G[k>>2]=-11;b=128}E[h+j|0]=b;l=l+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!f){break a}a=F[(l<<1)+a>>1];k:{if((a|0)>=-128){if((a|0)<=127){break k}G[k>>2]=-11;a=127;break k}G[k>>2]=-11;a=128}E[j+l|0]=a}}function jm(a,b,c,d,e){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;m=Fa-80|0;n=b-L[c+3240>>3];o=a-L[c+3232>>3];k=G[c+808>>2];l=G[c>>2];a:{if((l|0)<0){break a}while(1){q=M(l-f|0,80)+c|0;j=f<<3;g=L[(q+j|0)+8>>3];r=j+m|0;j=f;b:{if(!f){break b}h=0;i=j&3;if(i){while(1){f=f-1|0;g=n*g+L[(q+(f<<3)|0)+8>>3];h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(j-1>>>0<3){break b}while(1){h=q+8|0;i=h+(f<<3)|0;g=n*(n*(n*(n*g+L[i-8>>3])+L[i-16>>3])+L[i-24>>3]);i=f-4|0;g=g+L[h+(i<<3)>>3];h=(f|0)>4;f=i;if(h){continue}break}}L[r>>3]=g;f=j+1|0;if((j|0)!=(l|0)){continue}break}g=L[m>>3];if((l|0)<=0){p=g;break a}j=l-1|0;i=l+1|0;f=l&3;c:{if(!f){p=g;break c}h=0;p=g;while(1){p=o*p+L[(i-l<<3)+m>>3];l=l-1|0;h=h+1|0;if((f|0)!=(h|0)){continue}break}}if(j>>>0<3){break a}while(1){f=(i-l<<3)+m|0;p=o*(o*(o*(o*p+L[f>>3])+L[f+8>>3])+L[f+16>>3]);f=l-3|0;p=p+L[(i-f<<3)+m>>3];l=l-4|0;if(f>>>0>1){continue}break}}L[d>>3]=p;f=0;d:{if((k|0)<0){break d}while(1){q=M(k-f|0,80)+c|0;j=f<<3;g=L[(q+j|0)+816>>3];r=j+m|0;j=f;e:{if(!f){break e}h=0;i=j&3;if(i){while(1){f=f-1|0;g=n*g+L[(q+(f<<3)|0)+816>>3];h=h+1|0;if((i|0)!=(h|0)){continue}break}}if(j-1>>>0<3){break e}while(1){h=q+816|0;i=h+(f<<3)|0;g=n*(n*(n*(n*g+L[i-8>>3])+L[i-16>>3])+L[i-24>>3]);i=f-4|0;g=g+L[h+(i<<3)>>3];h=(f|0)>4;f=i;if(h){continue}break}}L[r>>3]=g;f=j+1|0;if((j|0)!=(k|0)){continue}break}g=L[m>>3];if((k|0)<=0){break d}f=k-1|0;j=k+1|0;c=k&3;if(c){h=0;while(1){g=o*g+L[(j-k<<3)+m>>3];k=k-1|0;h=h+1|0;if((c|0)!=(h|0)){continue}break}}if(f>>>0<3){break d}while(1){c=(j-k<<3)+m|0;g=o*(o*(o*(o*g+L[c>>3])+L[c+8>>3])+L[c+16>>3]);c=k-3|0;g=g+L[(j-c<<3)+m>>3];k=k-4|0;if(c>>>0>1){continue}break}}L[e>>3]=g;L[d>>3]=L[d>>3]+a;L[e>>3]=L[e>>3]+b}function Ze(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=Fa-128|0;Fa=j;n=G[a+48>>2];p=G[a+40>>2];k=G[a+16>>2];l=g-+G[a+24>>2];g=+G[a+32>>2];l=l/g+1;L[j>>3]=l;f=(f-+(k|0))/g+1;L[j+64>>3]=f;g=i-h;if(!(O(g)<1e-24)){if(h<0){while(1){h=h+360;if(h<0){continue}break}}if(h>=360){while(1){h=h+-360;if(h>=360){continue}break}}a:{if(O(h+-180)<1e-24){L[j+8>>3]=l;G[j+72>>2]=0;G[j+76>>2]=0;k=2;break a}if(O(h)<1e-24){L[j+8>>3]=l;L[j+72>>3]=p+1|0;k=4;break a}b:{if(h<180){k=1;m=+(n+1|0);L[j+8>>3]=m;if(!(O(h+-90)<1e-24)){break b}L[j+72>>3]=f;break a}G[j+8>>2]=0;G[j+12>>2]=0;if(!(O(h+-270)<1e-24)){break b}L[j+72>>3]=f;k=3;break a}h=Mc(h/180*3.141592653589793);q=f+(m-l)/h;L[j+72>>3]=q;if(q<0){G[j+72>>2]=0;G[j+76>>2]=0;L[j+8>>3]=l-f*h;k=2;break a}s=+(p+1|0);if(q>s){L[j+72>>3]=s;L[j+8>>3]=(s-f)*h+l;k=4;break a}k=+(n|0)>m?3:1}if(i<0){while(1){i=i+360;if(i<0){continue}break}}if(i>=360){while(1){i=i+-360;if(i>=360){continue}break}}q=g<0?g+360:g;r=2;m=0;c:{if(O(i+-180)<1e-24){o=2;break c}if(O(i)<1e-24){m=+(p+1|0);o=4;break c}d:{e:{if(i<180){o=1;g=+(n+1|0);if(!(O(i+-90)<1e-24)){break e}break d}o=3;g=0;if(!(O(i+-270)<1e-24)){break e}m=f;l=0;break c}i=Mc(i/180*3.141592653589793);h=f+(g-l)/i;if(h<0){l=l-f*i;o=2;break c}m=+(p+1|0);if(h>m){l=(m-f)*i+l;o=4;break c}o=+(n|0)>g?3:1;f=h}m=f;l=g}if(!(!(q>180)&(k|0)==(o|0))){g=+(n+1|0);f=+(p+1|0);while(1){i=0;h=g;f:{g:{h:{switch(k-1|0){case 1:h=0;break g;case 2:h=0;i=f;break g;case 0:break g;case 3:break h;default:break f}}i=f}n=r<<3;L[n+(j- -64|0)>>3]=i;L[j+n>>3]=h}r=r+1|0;k=(k|0)>3?1:k+1|0;if((o|0)!=(k|0)){continue}break}}k=r<<3;L[k+j>>3]=l;p=k;k=j- -64|0;L[p+k>>3]=m;Hj(a,b,c,d,e,k,j,r+1|0)}Fa=j+128|0}function fu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=Fa-393248|0;Fa=f;G[f+131108>>2]=17399;G[f+131104>>2]=11208;G[f+16>>2]=42205;G[f+20>>2]=a;a=f+65568|0;Ya(a,65535,8740,f+16|0);G[f+131116>>2]=14072;G[f>>2]=42205;G[f+4>>2]=b;G[f+131112>>2]=a;a=f+32|0;Ya(a,65535,8740,f);G[f+131128>>2]=d;G[f+131124>>2]=c;G[f+131120>>2]=a;a=f+131104|0;b=0;d=0;e=Fa-8224|0;Fa=e;G[e+8220>>2]=0;Tl();G[47589]=1;while(1){c=of(7,a,4029);if((c|0)!=-1){if((c|0)!=105){continue}b=G[321433];continue}break}G[e+8>>2]=b;a:{b:{c:{d:{if(b){e:{f:{c=7-G[47589]|0;switch(c|0){case 0:break d;case 1:break f;default:break e}}d=1;if(Kf(31902,e+8|0,1,0,0)){break a}if(!Kf(G[a+(G[47589]<<2)>>2],0,0,0,0)){break c}break a}d=1;if(Kf(31902,e+8|0,1,0,0)){break a}a=a+(G[47589]<<2)|0;if(!Kf(G[a>>2],a+4|0,c-1|0,0,0)){break c}break a}a=Vj(1);if(a){b=G[29763];hb(66692,11,1,b);$a(b)}b=G[30060];g:{if(!vc(e+4112|0,4095,b)){break g}c=(a|0)!=0;if(!a){while(1){G[e+8220>>2]=0;if(Ld(e+4112|0,e+16|0,e+8220|0)){G[e+12>>2]=G[e+8220>>2]+(e+4112|0);Kf(e+16|0,e+12|0,1,1,c)}if(vc(e+4112|0,4095,b)){continue}break g}}a=G[29763];while(1){G[e+8220>>2]=0;if(Ld(e+4112|0,e+16|0,e+8220|0)){if(!Xc(e+16|0,4991)){break g}G[e+12>>2]=G[e+8220>>2]+(e+4112|0);Kf(e+16|0,e+12|0,1,0,c);hb(66692,11,1,a);$a(a)}if(vc(e+4112|0,4095,b)){continue}break}}b=G[936854];if(!b){break a}a=b;while(1){c=G[a>>2];h:{if(!b){break h}i:{if((a|0)==(b|0)){d=3747416;break i}while(1){d=b;if(!b){break h}b=G[d>>2];if((b|0)!=(a|0)){continue}break}}G[d>>2]=c}pb(G[a+4>>2]);pb(G[a+16>>2]);b=G[a+12>>2];if(b){Hb(b)}pb(a);if(!c){break b}b=G[936854];a=c;continue}}d=1;if(Kf(25125,e+8|0,1,0,0)){break a}}Jl(b)}d=0}Fa=e+8224|0;Fa=f+393248|0;return d|0}function Qt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;e=c;c=b;h=-1;g=-1;a:{b:{if(!a){break b}f=G[a+16>>2];if((f|0)!=31153&(f|0)!=7247){break b}c:{switch(G[a+92>>2]+5|0){case 0:case 5:break c;default:break b}}if(d>>>0>1){break b}d:{if(!d){d=G[a+8>>2];c=c-d|0;e=e-(G[a+12>>2]+(b>>>0>>0)|0)|0;break d}if(!G[a+88>>2]){break d}e=e+G[a+84>>2]|0;b=c+G[a+80>>2]|0;e=b>>>0>>0?e+1|0:e;c=b}G[a+88>>2]=0;e:{if((f|0)==7247){f:{if(G[a+48>>2]!=1){break f}f=e+G[a+12>>2]|0;if(((c+G[a+8>>2]>>>0>>0?f+1|0:f)|0)<0){break f}b=G[a>>2];if((Xg(G[a+20>>2],c-b|0,e-(b>>>0>c>>>0)|0,1)&Ia)==-1){break b}G[a+88>>2]=0;G[a+64>>2]=0;G[a+68>>2]=0;G[a>>2]=0;b=G[a+96>>2];if(b){if(G[a+92>>2]!=-4){Wa(b)}G[a+96>>2]=0}G[a+92>>2]=0;G[a+104>>2]=0;e=e+G[a+12>>2]|0;b=c+G[a+8>>2]|0;e=b>>>0>>0?e+1|0:e;G[a+8>>2]=b;G[a+12>>2]=e;a=e;break a}if((e|0)<0){e=e+G[a+12>>2]|0;b=c+G[a+8>>2]|0;e=b>>>0>>0?e+1|0:e;c=b;if((e|0)<0){break b}b=-1;g:{if(!a|G[a+16>>2]!=7247){break g}h:{switch(G[a+92>>2]+5|0){case 0:case 5:break h;default:break g}}if((Xg(G[a+20>>2],G[a+56>>2],G[a+60>>2],0)&Ia)==-1){break g}G[a>>2]=0;if(G[a+16>>2]==7247){G[a+48>>2]=0;G[a+64>>2]=0;G[a+68>>2]=0}b=0;G[a+88>>2]=0;d=G[a+96>>2];if(d){if(G[a+92>>2]!=-4){Wa(d)}G[a+96>>2]=0}G[a+8>>2]=0;G[a+12>>2]=0;G[a+92>>2]=0;G[a+104>>2]=0}if((b|0)==-1){break b}if(G[a+16>>2]!=7247){break e}}d=G[a>>2];b=!e&c>>>0>>0?c:d;G[a>>2]=d-b;G[a+4>>2]=b+G[a+4>>2];f=G[a+12>>2];d=G[a+8>>2];g=d+b|0;G[a+8>>2]=g;G[a+12>>2]=d>>>0>g>>>0?f+1|0:f;d=c;c=c-b|0;e=e-(b>>>0>d>>>0)|0;break e}if((e|0)<0){break b}}if(c|e){G[a+80>>2]=c;G[a+84>>2]=e;G[a+88>>2]=1}g=e+G[a+12>>2]|0;b=c+G[a+8>>2]|0;g=b>>>0>>0?g+1|0:g;h=b}b=h;a=g}_(a|0);return b|0}function il(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0;f=Fa-368|0;Fa=f;a:{if(G[e>>2]>0){break a}if(b-1e3>>>0<=4294966296){Ua(58025);G[e>>2]=302;break a}if((c|0)<=0){Ua(58072);G[e>>2]=320;break a}h=G[a>>2];i=G[a+4>>2];b:{if((h|0)!=G[i+76>>2]){mb(a,h+1|0,0,e);break b}if((G[i+128>>2]&G[i+132>>2])!=-1){break b}if((Rb(a,e)|0)>0){break a}}if(G[G[a+4>>2]+80>>2]!=2){Ua(57922);G[e>>2]=227;break a}F[f+208>>1]=40;h=0;i=1;c:{while(1){if(h){g=f+208|0;g=Va(g)+g|0;E[g|0]=44;E[g+1|0]=0}j=(h<<2)+d|0;g=G[j>>2];if((g|0)<0){Ua(58102);break c}G[f+16>>2]=g;g=f+128|0;Ya(g,80,27698,f+16|0);if((Va(f+208|0)+Va(g)|0)-70>>>0<=4294967224){Ua(57995);break c}g=Gb(f+208|0,f+128|0);i=M(G[j>>2],i);h=h+1|0;if((h|0)!=(c|0)){continue}break}d:{c=(G[G[a+4>>2]+968>>2]+M(b,160)|0)-72|0;if(G[c>>2]==(i|0)){break d}d=f+288|0;zb(34641,b,d,e);h=d;d=f+128|0;Fc(a,h,d,0,e);Vf(d,0,f+28|0,0,e);if(G[f+28>>2]==(i|0)&G[e>>2]<=0){break d}a=G[c>>2];G[f+4>>2]=i;G[f>>2]=a;a=f+32|0;Ya(a,81,27638,f);Ua(a);break c}c=Va(g)+g|0;E[c|0]=41;E[c+1|0]=0;c=H[3670]|H[3671]<<8|(H[3672]<<16|H[3673]<<24);E[f+63|0]=c;E[f+64|0]=c>>>8;E[f+65|0]=c>>>16;E[f+66|0]=c>>>24;c=H[3667]|H[3668]<<8|(H[3669]<<16|H[3670]<<24);G[f+56>>2]=H[3663]|H[3664]<<8|(H[3665]<<16|H[3666]<<24);G[f+60>>2]=c;c=H[3659]|H[3660]<<8|(H[3661]<<16|H[3662]<<24);G[f+48>>2]=H[3655]|H[3656]<<8|(H[3657]<<16|H[3658]<<24);G[f+52>>2]=c;c=H[3651]|H[3652]<<8|(H[3653]<<16|H[3654]<<24);G[f+40>>2]=H[3647]|H[3648]<<8|(H[3649]<<16|H[3650]<<24);G[f+44>>2]=c;c=H[3643]|H[3644]<<8|(H[3645]<<16|H[3646]<<24);G[f+32>>2]=H[3639]|H[3640]<<8|(H[3641]<<16|H[3642]<<24);G[f+36>>2]=c;c=b;b=f+288|0;zb(34647,c,b,e);lc(a,b,g,f+32|0,e);break a}G[e>>2]=263}Fa=f+368|0}function Tk(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;l=c==1&d==0;a:{b:{if(!e){if(l){break b}l=0;if((b|0)<=0){break a}while(1){f=j+l|0;c:{d:{m=+F[(l<<1)+a>>1]*c+d;if(m<-.49){G[k>>2]=-11;break d}if(m>255.49){G[k>>2]=-11;e=255;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}E[f|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!l){if((b|0)<=0){break a}e=(e|0)==1;g=e?g:1;h=e?j:h;l=0;n=f&65535;while(1){e=I[(l<<1)+a>>1];e:{if((e|0)==(n|0)){G[i>>2]=1;f=g;e=h;break e}f:{g:{m=+(e<<16>>16)*c+d;if(m<-.49){G[k>>2]=-11;break g}if(m>255.49){G[k>>2]=-11;f=255;break f}if(!(m<4294967296&m>=0)){break g}f=~~m>>>0;break f}f=0}e=j}E[e+l|0]=f;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}l=0;if((e|0)==1){f=f&65535;while(1){e=I[(l<<1)+a>>1];h:{if((f|0)!=(e|0)){if(e<<16>>16>=0){if(e>>>0<=255){break h}G[k>>2]=-11;e=255;break h}G[k>>2]=-11;e=0;break h}G[i>>2]=1;e=g}E[j+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}g=f&65535;while(1){e=I[(l<<1)+a>>1];i:{if((g|0)==(e|0)){e=1;G[i>>2]=1;f=h;break i}j:{if(e<<16>>16<0){G[k>>2]=-11;e=0;break j}if(e>>>0<256){break j}G[k>>2]=-11;e=255}f=j}E[f+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}f=b&1;l=0;if((b|0)!=1){g=b&-2;e=0;while(1){b=F[(l<<1)+a>>1];k:{if((b|0)<0){G[k>>2]=-11;b=0;break k}if(b>>>0<256){break k}G[k>>2]=-11;b=255}E[j+l|0]=b;h=l|1;b=F[(h<<1)+a>>1];l:{if((b|0)>=0){if(b>>>0<=255){break l}G[k>>2]=-11;b=255;break l}G[k>>2]=-11;b=0}E[h+j|0]=b;l=l+2|0;e=e+2|0;if((g|0)!=(e|0)){continue}break}}if(!f){break a}a=F[(l<<1)+a>>1];m:{if((a|0)>=0){if(a>>>0<=255){break m}G[k>>2]=-11;a=255;break m}G[k>>2]=-11;a=0}E[j+l|0]=a}}function Us(a){a=a|0;var 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;g=G[309722];m=G[a+20>>2];r=g+M(m,344)|0;h=G[a+12>>2];o=G[a+16>>2];n=M(o,344)+g|0;a:{if(G[n>>2]!=-1e3){f=G[n+56>>2];break a}i=L[n+88>>3];f=0}if(G[r>>2]!=-1e3){d=G[(M(m,344)+g|0)+56>>2]}else{j=L[(M(m,344)+g|0)+88>>3];d=0}b:{if(!(f|d)){c=pi(i,j,G[(M(h,344)+g|0)+88>>2]);G[a>>2]=-1e3;E[a+88|0]=(c|0)!=0;break b}Nd(a);if(G[309737]){break b}b=G[309727];if(!b){break b}e=b-1|0;c=G[a+56>>2];b=M(b,c);p=M(h,344)+g|0;k=M(m,344)+g|0;l=M(o,344)+g|0;if((f|0)<=1){s=(d|0)>1;t=s|(d|0)!=0;while(1){d=e;h=0;if(c){while(1){if(f){u=H[d+G[l+84>>2]|0];i=L[G[l+88>>2]+(d<<3)>>3]}b=b-1|0;if(t){e=s?b:d;q=H[e+G[k+84>>2]|0];j=L[G[k+88>>2]+(e<<3)>>3]}c=c-1|0;E[G[a+84>>2]+b|0]=(q|u)!=0;if(!H[G[a+84>>2]+b|0]){e=pi(i,j,G[p+88>>2]);E[G[a+88>>2]+b|0]=(e|0)!=0}if(c){continue}break}h=G[a+56>>2]}e=d-1|0;c=h;if(d){continue}break}break b}if((d|0)>=2){while(1){d=e;e=d-1|0;if(c){while(1){b=b-1|0;f=b<<3;j=L[f+G[k+88>>2]>>3];i=L[f+G[l+88>>2]>>3];E[G[a+84>>2]+b|0]=(H[G[l+84>>2]+b|0]|H[G[k+84>>2]+b|0])!=0;c=c-1|0;if(!H[G[a+84>>2]+b|0]){f=pi(i,j,G[p+88>>2]);E[G[a+88>>2]+b|0]=(f|0)!=0}if(c){continue}break}c=G[a+56>>2]}else{c=0}if(d){continue}break b}}while(1){f=e;h=0;if(c){while(1){b=b-1|0;e=H[b+G[l+84>>2]|0];h=G[l+88>>2]+(b<<3)|0;if(d){q=H[f+G[k+84>>2]|0];j=L[G[k+88>>2]+(f<<3)>>3]}c=c-1|0;i=L[h>>3];E[G[a+84>>2]+b|0]=(e|q)!=0;if(!H[G[a+84>>2]+b|0]){e=pi(i,j,G[p+88>>2]);E[G[a+88>>2]+b|0]=(e|0)!=0}if(c){continue}break}h=G[a+56>>2]}e=f-1|0;c=h;if(f){continue}break}}if(G[n>>2]>0){Wa(G[(M(o,344)+g|0)+88>>2])}if(G[r>>2]>0){Wa(G[(M(m,344)+g|0)+88>>2])}}function Vs(a){a=a|0;var 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;h=Fa-16|0;Fa=h;e=G[309722];b=e+M(G[a+12>>2],344)|0;d=G[b+88>>2];g=G[b+56>>2];i=d+(g<<3)|0;j=G[a+20>>2];o=M(j,344)+e|0;b=G[o>>2];m=G[a+16>>2];n=M(m,344)+e|0;a:{b:{if(G[n>>2]==-1e3){f=L[n+88>>3];if((b|0)!=-1e3){break b}f=jn(f,L[(M(j,344)+e|0)+88>>3],g,d,i,h+12|0);G[a>>2]=-1e3;L[a+88>>3]=f;break a}if((b|0)!=-1e3){break b}k=L[(M(j,344)+e|0)+88>>3]}Nd(a);if(G[309737]){break a}b=M(G[a+56>>2],G[309727]);if(!g){if(!b){break a}d=b-1|0;g=b&3;if(g){while(1){b=b-1|0;i=G[a+88>>2]+(b<<3)|0;G[i>>2]=0;G[i+4>>2]=0;E[G[a+84>>2]+b|0]=0;c=c+1|0;if((g|0)!=(c|0)){continue}break}}if(d>>>0<3){break a}while(1){d=b-1|0;c=G[a+88>>2]+(d<<3)|0;G[c>>2]=0;G[c+4>>2]=0;E[d+G[a+84>>2]|0]=0;d=b-2|0;c=G[a+88>>2]+(d<<3)|0;G[c>>2]=0;G[c+4>>2]=0;E[d+G[a+84>>2]|0]=0;d=b-3|0;c=G[a+88>>2]+(d<<3)|0;G[c>>2]=0;G[c+4>>2]=0;E[d+G[a+84>>2]|0]=0;b=b-4|0;d=G[a+88>>2]+(b<<3)|0;G[d>>2]=0;G[d+4>>2]=0;E[G[a+84>>2]+b|0]=0;if(b){continue}break}break a}s=G[(M(j,344)+e|0)+88>>2];t=G[(M(m,344)+e|0)+88>>2];G[h+12>>2]=-1;if(!b){break a}u=M(j,344)+e|0;v=M(m,344)+e|0;while(1){b=b-1|0;if(G[n>>2]!=-1e3){p=H[G[v+84>>2]+b|0];f=L[(b<<3)+t>>3]}if(G[o>>2]!=-1e3){c=H[G[u+84>>2]+b|0];k=L[(b<<3)+s>>3]}q=(c|p)&255;E[G[a+84>>2]+b|0]=(q|0)!=0;if(!q){c:{d:{c=G[h+12>>2];e:{if((c|0)<0){break e}c=c<<3;l=L[c+d>>3];if(l>f){break e}r=L[c+i>>3];if(rr)){break d}}l=jn(f,k,g,d,i,h+12|0);break c}l=k-f}L[G[a+88>>2]+(b<<3)>>3]=l;p=0;c=0}if(b){continue}break}}if(G[n>>2]>0){Wa(G[(M(m,344)+e|0)+88>>2])}if(G[o>>2]>0){Wa(G[(M(j,344)+e|0)+88>>2])}Fa=h+16|0}function Tg(a){var b=0,c=0,d=0;c=Fa-4112|0;Fa=c;a:{if(G[947121]<3){break a}L[c>>3]=a;Ya(c+16|0,4096,19682,c);b:{if(G[947121]!=3){break b}G[951360]=0;G[951361]=0;G[951362]=0;G[951363]=0;E[3801344]=0;b=G[G[(G[950332]+(G[950330]<<2)|0)-4>>2]+52>>2];if(!b){break b}pb(b);b=(G[950332]+(G[950330]<<2)|0)-4|0;G[G[b>>2]+52>>2]=0;G[G[b>>2]+56>>2]=0}c:{switch(G[948156]-1|0){case 0:case 2:if(H[3801344]){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(3801344,b+52|0,b+56|0)}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c+16|0,b+52|0,b+56|0);if(G[947121]>=4){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(85395,b+52|0,b+56|0);Za(3801344,c+16|0)}L[475680]=L[475681];L[475681]=a;break a;case 1:case 3:if((G[947121]&-2147483647)!=1){break a}if(H[3801344]){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(3801344,b+52|0,b+56|0)}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c+16|0,b+52|0,b+56|0);if(G[947121]>=4){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(85395,b+52|0,b+56|0);Za(3801344,c+16|0)}L[475680]=L[475681];L[475681]=a;break a;case 10:d:{if(G[947121]!=3){if(!H[3801344]){break d}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(48937,b+52|0,b+56|0);d=3801344}else{d=35975}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(d,b+52|0,b+56|0)}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(c+16|0,b+52|0,b+56|0);if(G[947121]>=4){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(92037,b+52|0,b+56|0);Za(3801344,c+16|0)}L[475680]=L[475681];L[475681]=a;break a;case 11:break c;default:break a}}b=G[947121];if((b|0)==3){b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(85390,b+52|0,b+56|0);break a}if(b&1){break a}b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(85390,b+52|0,b+56|0)}Fa=c+4112|0}function Cg(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0;j=Fa-16|0;Fa=j;G[j+12>>2]=0;G[j+8>>2]=0;a:{if(G[i>>2]>0){break a}l=Rf(a,36364,j+8|0,j+12|0,i);if(G[i>>2]){break a}b:{if(l){break b}c:{k=H[G[a>>2]];switch(k-44|0){case 0:case 15:break a;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:break b;default:break c}}if(!k){break a}}d:{e:{if(G[j+12>>2]){break e}k=G[a>>2];if(H[k|0]==58){break e}l=G[j+8>>2];if(l){if(Va(l)>>>0>=71){Ua(51285);break d}f:{if(!(H[l|0]!=35|E[l+1|0]-48>>>0>9)){Za(b,l+1|0);break f}Za(b,l)}Wa(l);G[j+8>>2]=0;k=G[a>>2]}while(1){b=H[k|0];if((b|0)!=32){if((b|0)!=61){break a}while(1){b=k+1|0;G[a>>2]=b;l=H[k+1|0];k=b;if((l|0)==32){continue}break}l=Rf(a,36370,j+8|0,j+12|0,i);if(G[i>>2]){break a}}else{k=k+1|0;G[a>>2]=k;continue}break}}b=G[a>>2];if(H[b|0]!=58){a=G[j+8>>2];if(!a){break a}if(!G[j+12>>2]){if(Va(a)>>>0>=71){Ua(51259);break d}Za(h,a);Wa(a);break a}m=e,n=vb(a,0),L[m>>3]=n;Wa(G[j+8>>2]);break a}if(l){k=G[j+8>>2];g:{if(!G[j+12>>2]){if(Va(k)>>>0>=71){Ua(51233);break d}Za(f,k);break g}m=c,n=vb(k,0),L[m>>3]=n;k=G[j+8>>2]}Wa(k);G[j+8>>2]=0;b=G[a>>2]}G[a>>2]=b+1;b=Rf(a,36370,j+8|0,j+12|0,i);if(G[i>>2]){break a}if(b){k=G[j+8>>2];h:{if(!G[j+12>>2]){if(Va(k)>>>0>=71){Ua(51207);break d}Za(g,k);break h}m=d,n=vb(k,0),L[m>>3]=n;k=G[j+8>>2]}Wa(k);G[j+8>>2]=0}b=G[a>>2];if(H[b|0]!=58){Wa(G[j+8>>2]);break a}G[a>>2]=b+1;a=Rf(a,36370,j+8|0,j+12|0,i);if(G[i>>2]|!a){break a}k=G[j+8>>2];i:{if(!G[j+12>>2]){if(Va(k)>>>0>=71){Ua(51259);break d}Za(h,k);break i}m=e,n=vb(k,0),L[m>>3]=n;k=G[j+8>>2]}Wa(k);break a}Wa(G[j+8>>2]);G[i>>2]=431}Fa=j+16|0}function tp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=N(0),n=0,o=0,p=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=i+k|0;c:{d:{l=+K[(k<<2)+a>>2]*c+d;if(l<-.49){G[j>>2]=-11;break d}if(l>255.49){G[j>>2]=-11;e=255;break c}if(!(l<4294967296&l>=0)){break d}e=~~l>>>0;break c}e=0}E[f|0]=e;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}k=a+2|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}e=(e|0)==1;p=e?f:1;n=e?i:g;if(!(d<4294967296&d>=0)){break f}o=~~d>>>0;break e}if((b|0)<=0){break a}e=(e|0)==1;o=e?f:1;p=e?i:g;e=0;while(1){g=i;f=0;g:{h:{i:{n=I[k>>1]&32640;switch(((n|0)==32640?1:!n<<1)|0){case 0:break h;case 1:break i;default:break g}}G[h>>2]=1;g=p;f=o;break g}m=K[(e<<2)+a>>2];c=+m;if(c<-.49){G[j>>2]=-11;break g}j:{if(c>255.49){G[j>>2]=-11;f=255;break j}f=~~m>>>0;if(m=N(0)){break j}f=0}}E[e+g|0]=f;k=k+4|0;e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}o=0}e=0;while(1){k:{l:{m:{n:{o:{p:{f=I[k>>1]&32640;switch(((f|0)==32640?1:!f<<1)|0){case 0:break n;case 1:break p;default:break o}}G[h>>2]=1;f=p;g=n;break k}if(d<-.49){G[j>>2]=-11;break m}f=o;g=i;if(!(d>255.49)){break k}G[j>>2]=-11;f=255;break l}l=+K[(e<<2)+a>>2]*c+d;if(l<-.49){G[j>>2]=-11;f=0;break l}if(l>255.49){G[j>>2]=-11;f=255;break l}if(!(l<4294967296&l>=0)){break m}f=~~l>>>0;break l}f=0}g=i}E[g+e|0]=f;k=k+4|0;e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=i+k|0;q:{r:{m=K[(k<<2)+a>>2];c=+m;if(c<-.49){G[j>>2]=-11;break r}if(c>255.49){G[j>>2]=-11;e=255;break q}if(!(m=N(0))){break r}e=~~m>>>0;break q}e=0}E[f|0]=e;k=k+1|0;if((k|0)!=(b|0)){continue}break}}}function Ml(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-16480|0;Fa=e;c=e- -8192|0;Nl(a,c);a=0;a:{if(Be(c,e+16392|0)){break a}b:{if(!b){break b}d=jb(b,114);f=jb(b,119);g=jb(b,120);c=G[e+16404>>2];h=c&16384;c:{if(jb(b,100)){if(h){break c}break a}if(h){break a}}if(!G[e+16412>>2]){if((c&256?0:d)|(c&128?0:f)){break a}if(!g|c&64){break b}break a}b=(d|0)!=0;if(!G[e+16416>>2]){if(b&!(c&32)|(c&16?0:f)){break a}if(!g|c&8){break b}break a}if(b&!(c&4)|(c&2?0:f)){break a}if(!g){break b}if(!(c&1)){break a}}c=Fa-40960|0;Fa=c;a=e- -8192|0;d:{if(!jb(a,47)){i=rb(e,a,8191)+8191|0,j=0,E[i|0]=j;break d}e:{if(Xa(a,42205)){if(Xa(a,45308)){break e}}i=rb(e,42205,8191)+8191|0,j=0,E[i|0]=j;break d}f:{if(H[a|0]!=47){ui(c+32768|0,8192);break f}E[c+32768|0]=0}b=Va(c+32768|0)+Va(a)|0;g=Xb(b+2|0);g:{if(H[c+32768|0]){f=Za(g,c+32768|0);d=Va(f)+f|0;E[d|0]=47;E[d+1|0]=0;Gb(f,a);break g}Za(g,a)}h:{i:{if(b>>>0>=2147483647){break i}a=b+1|0;f=0;b=0;while(1){d=b+g|0;j:{if(H[d|0]!=47){b=b+1|0;break j}E[d|0]=0;b=b+1|0;d=g+b|0;if(H[d|0]==47){break j}G[c+(f<<2)>>2]=d;f=f+1|0}if((a|0)!=(b|0)){continue}break}a=0;if((f|0)<=0){break i}while(1){d=c+(a<<2)|0;b=G[d>>2];k:{if(Xa(b,48504)){if(Xa(b,45311)){break k}G[d>>2]=0;b=a;while(1){if((b|0)<=0){break k}b=b-1|0;d=c+(b<<2)|0;if(!G[d>>2]){continue}break}}G[d>>2]=0}a=a+1|0;if((f|0)!=(a|0)){continue}break}a=0;E[e|0]=0;if((f|0)<=0){break h}b=0;while(1){d=G[c+(b<<2)>>2];if(d){if((Va(d)+a|0)>=8191){break h}h=Va(e)+e|0;E[h|0]=47;E[h+1|0]=0;Gb(e,d);a=(Va(d)+a|0)+1|0}b=b+1|0;if((f|0)!=(b|0)){continue}break}break h}E[e|0]=0}if(!g){break d}Wa(g)}Fa=c+40960|0;a=Lc(e)}Fa=e+16480|0;return a}function Do(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;n=c==1&d==0;a:{b:{if(!e){if(n){break b}if((b|0)<=0){break a}while(1){f=j+l|0;m=+G[(l<<2)+a>>2]*c+d;c:{if(m<-128.49){G[k>>2]=-11;e=128;break c}if(m>127.49){G[k>>2]=-11;e=127;break c}e=~~m;if(O(m)<2147483648){break c}e=-2147483648}E[f|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!n){if((b|0)<=0){break a}e=(e|0)==1;n=e?g:1;h=e?j:h;while(1){e=G[(l<<2)+a>>2];d:{if((e|0)==(f|0)){G[i>>2]=1;g=n;e=h;break d}m=+(e|0)*c+d;e:{if(m<-128.49){G[k>>2]=-11;g=128;break e}if(m>127.49){G[k>>2]=-11;g=127;break e}g=~~m;if(O(m)<2147483648){break e}g=-2147483648}e=j}E[e+l|0]=g;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)==1){while(1){e=G[(l<<2)+a>>2];f:{if((f|0)!=(e|0)){if((e|0)>=-128){if((e|0)<=127){break f}G[k>>2]=-11;e=127;break f}G[k>>2]=-11;e=128;break f}G[i>>2]=1;e=g}E[j+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break a}}while(1){e=G[(l<<2)+a>>2];g:{if((f|0)==(e|0)){e=1;G[i>>2]=1;g=h;break g}h:{if((e|0)<=-129){G[k>>2]=-11;e=128;break h}if((e|0)<128){break h}G[k>>2]=-11;e=127}g=j}E[g+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}e=b&1;if((b|0)!=1){g=b&-2;f=0;while(1){b=G[(l<<2)+a>>2];i:{if((b|0)<=-129){G[k>>2]=-11;b=128;break i}if((b|0)<128){break i}G[k>>2]=-11;b=127}E[j+l|0]=b;h=l|1;b=G[(h<<2)+a>>2];j:{if((b|0)>=-128){if((b|0)<=127){break j}G[k>>2]=-11;b=127;break j}G[k>>2]=-11;b=128}E[h+j|0]=b;l=l+2|0;f=f+2|0;if((g|0)!=(f|0)){continue}break}}if(!e){break a}a=G[(l<<2)+a>>2];k:{if((a|0)>=-128){if((a|0)<=127){break k}G[k>>2]=-11;a=127;break k}G[k>>2]=-11;a=128}E[j+l|0]=a}}function ps(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;s=M(c,3);r=G[a>>2];if(O(o)<2147483648){q=~~o}else{q=-2147483648}z=q;q=r+s|0;if(O(l)<2147483648){s=~~l}else{s=-2147483648}r=q-2|0;a:{if(d){if(!re(a,0,r,d,e,f,g,h,i,m,n)){break a}p=G[a+8>>2];t=q-1|0;r=p+M(t,168)|0;k=L[r+8>>3];if(k>g){break a}j=L[r+16>>3];if(!(g>=k)|j>2];if(O(g)<2147483648){r=~~g}else{r=-2147483648}p=G[p+(r<<2)>>2];b:{if(!p){break b}while(1){if(!(+G[p+4>>2]<=f)){break b}q=q+1|0;p=G[p>>2];if(p){continue}break}}w=1;if((q&1)!=(d|0)|(s|0)<=0|(z|0)<=0){break a}l=(n-m)/o;t=r<<2;q=0;while(1){r=q+z|0;u=1;while(1){c:{x=b+q|0;p=q<<1;if(!re(a,x,p+c|0,d,e,f,g,h,i,+(u-1|0)*l+m,+(u|0)*l+m)){break c}p=G[a+8>>2]+M((p|1)+c|0,168)|0;k=L[p+8>>3];if(k>g){break c}j=L[p+16>>3];if(!(g>=k)|j>2]>>2];d:{if(!p){break d}while(1){if(!(+G[p+4>>2]<=f)){break d}y=y+1|0;p=G[p>>2];if(p){continue}break}}if((y&1)!=(d|0)){break c}v=1;if(!x){break a}G[a+12>>2]=x;return 1}u=u+1|0;q=q+1|0;if((r|0)!=(q|0)){continue}break}p=(s|0)==(w|0);q=r;w=w+1|0;if(!p){continue}break}break a}v=1;if(!re(a,0,r,1,e,f,g,h,i,m,n)){break a}b=G[a+8>>2];c=q-1|0;a=b+M(c,168)|0;i=L[a+8>>3];e:{if(i>g){break e}h=L[a+16>>3];if(!(g>=i)|(!(h>=g)|g>h)){break e}b=G[(b+M(c,168)|0)+24>>2];if(O(g)<2147483648){a=~~g}else{a=-2147483648}p=G[b+(a<<2)>>2];if(!p){break e}q=0;while(1){if(+G[p+4>>2]<=f){q=q+1|0;p=G[p>>2];if(p){continue}}break}v=0;if(q&1){break a}}v=1}return v|0}function vp(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=c==1&d==0;a:{if(!e){if(!l){l=0;if((b|0)<=0){break a}while(1){f=j+l|0;b:{c:{m=+H[a+l|0]*c+d;if(m<-.49){G[k>>2]=-11;break c}if(m>255.49){G[k>>2]=-11;e=255;break b}if(!(m<4294967296&m>=0)){break c}e=~~m>>>0;break b}e=0}E[f|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}yd(j,a,b);break a}d:{if(!l){if((b|0)<=0){break a}l=0;if((e|0)!=1){break d}while(1){h=j+l|0;e=H[a+l|0];e:{if((e|0)!=(f|0)){m=+(e>>>0)*c+d;if(!(m<-.49)){if(!(m>255.49)){e=~~m>>>0;if(m<4294967296&m>=0){break e}e=0;break e}G[k>>2]=-11;e=255;break e}G[k>>2]=-11;e=0;break e}G[i>>2]=1;e=g}E[h|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)!=1){l=0;if((b|0)!=1){n=b&-2;g=0;while(1){e=H[a+l|0];if((f|0)==(e|0)){e=1;G[i>>2]=1;k=h}else{k=j}E[k+l|0]=e;k=l|1;e=H[k+a|0];if((f|0)==(e|0)){e=1;G[i>>2]=1;o=h}else{o=j}E[o+k|0]=e;l=l+2|0;g=g+2|0;if((n|0)!=(g|0)){continue}break}}if(!(b&1)){break a}a=H[a+l|0];if((f|0)==(a|0)){G[i>>2]=1;j=h;a=1}E[j+l|0]=a;break a}h=b&1;l=0;if((b|0)!=1){k=b&-2;e=0;while(1){n=j+l|0;b=H[a+l|0];if((b|0)==(f|0)){G[i>>2]=1;b=g}E[n|0]=b;n=l|1;b=H[n+a|0];if((f|0)==(b|0)){G[i>>2]=1;b=g}E[j+n|0]=b;l=l+2|0;e=e+2|0;if((k|0)!=(e|0)){continue}break}}if(!h){break a}b=j+l|0;a=H[a+l|0];if((a|0)==(f|0)){G[i>>2]=1}else{g=a}E[b|0]=g;break a}while(1){e=H[a+l|0];f:{if((e|0)==(f|0)){g=1;G[i>>2]=1;e=h;break f}g:{h:{m=+(e>>>0)*c+d;if(m<-.49){G[k>>2]=-11;break h}if(m>255.49){G[k>>2]=-11;g=255;break g}if(!(m<4294967296&m>=0)){break h}g=~~m>>>0;break g}g=0}e=j}E[e+l|0]=g;l=l+1|0;if((l|0)!=(b|0)){continue}break}}}function Im(a,b){var 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;c=Fa-688|0;Fa=c;a:{b:{c:{d:{e:{f:{g:{g=lb(1,28);if(g){G[g+16>>2]=2;f=ab(8);G[g+12>>2]=f;if(!f){break g}e=2;d=f;while(1){G[d>>2]=G[a>>2]-1;d=d+4|0;a=a+4|0;e=e-1|0;h=h+1|0;if((h|0)!=2){continue}break}G[g+24>>2]=1;i=ab(4);G[g+20>>2]=i;if(!i){break f}a=0;cb(c+160|0,0,4);d=1;while(1){e=G[f+(a<<2)>>2];if((e|0)>0){break e}e=(c+160|0)+(e<<2)|0;G[e>>2]=G[e>>2]+1;a=a+1|0;if((a|0)!=2){continue}break}G[g+8>>2]=1;while(1){f=j<<2;a=G[b>>2];G[f+i>>2]=a;if((a|0)>=11){break d}b=b+4|0;o=d;if(a){f=G[f+(c+160|0)>>2];k=a&3;e=1;h:{if(a-1>>>0<3){h=1;break h}p=a&-4;d=0;h=1;while(1){l=a-3|0;m=a-2|0;n=a-1|0;e=M(l,M(m,M(n,M(a,e))));h=M(f+l|0,M(f+m|0,M(f+n|0,M(a+f|0,h))));a=a-4|0;d=d+4|0;if((p|0)!=(d|0)){continue}break}}d=0;if(k){while(1){e=M(a,e);h=M(a+f|0,h);a=a-1|0;d=d+1|0;if((k|0)!=(d|0)){continue}break}}a=(h|0)/(e|0)|0}else{a=1}d=M(o,a);G[g+8>>2]=d;j=j+1|0;if((j|0)!=1){continue}break}a=ab(d<<3);G[g>>2]=a;if(!a){break c}a=lb(d,8);G[g+4>>2]=a;if(!a){break b}Fa=c+688|0;return g}G[c+4>>2]=66012;G[c>>2]=66133;_a(G[24367],90100,c);break a}G[c+148>>2]=65848;G[c+144>>2]=66133;_a(G[24367],90100,c+144|0);break a}G[c+84>>2]=65729;G[c+80>>2]=66133;_a(G[24367],90100,c+80|0);break a}G[c+132>>2]=92041;G[c+128>>2]=24180;_a(G[24367],90100,c+128|0);break a}G[c+116>>2]=10;G[c+112>>2]=a;a=c+176|0;db(a,62519,c+112|0);G[c+96>>2]=67642;G[c+100>>2]=a;_a(G[24367],90100,c+96|0);break a}G[c+52>>2]=65884;G[c+48>>2]=66133;_a(G[24367],90100,c+48|0);break a}G[c+68>>2]=65922;G[c+64>>2]=66133;_a(G[24367],90100,c- -64|0)}ca(-1);W()}function up(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0;n=c==1&d==0;a:{b:{if(!e){if(n){break b}if((b|0)<=0){break a}while(1){f=j+l|0;c:{d:{m=+G[(l<<2)+a>>2]*c+d;if(m<-.49){G[k>>2]=-11;break d}if(m>255.49){G[k>>2]=-11;e=255;break c}if(!(m<4294967296&m>=0)){break d}e=~~m>>>0;break c}e=0}E[f|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if(!n){if((b|0)<=0){break a}e=(e|0)==1;n=e?g:1;h=e?j:h;while(1){e=G[(l<<2)+a>>2];e:{if((e|0)==(f|0)){G[i>>2]=1;g=n;e=h;break e}f:{g:{m=+(e|0)*c+d;if(m<-.49){G[k>>2]=-11;break g}if(m>255.49){G[k>>2]=-11;g=255;break f}if(!(m<4294967296&m>=0)){break g}g=~~m>>>0;break f}g=0}e=j}E[e+l|0]=g;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}if((e|0)==1){while(1){e=G[(l<<2)+a>>2];h:{if((f|0)!=(e|0)){if((e|0)>=0){if(e>>>0<=255){break h}G[k>>2]=-11;e=255;break h}G[k>>2]=-11;e=0;break h}G[i>>2]=1;e=g}E[j+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break a}}while(1){e=G[(l<<2)+a>>2];i:{if((f|0)==(e|0)){e=1;G[i>>2]=1;g=h;break i}j:{if((e|0)<0){G[k>>2]=-11;e=0;break j}if(e>>>0<256){break j}G[k>>2]=-11;e=255}g=j}E[g+l|0]=e;l=l+1|0;if((l|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}e=b&1;if((b|0)!=1){g=b&-2;f=0;while(1){b=G[(l<<2)+a>>2];k:{if((b|0)<0){G[k>>2]=-11;b=0;break k}if(b>>>0<256){break k}G[k>>2]=-11;b=255}E[j+l|0]=b;h=l|1;b=G[(h<<2)+a>>2];l:{if((b|0)>=0){if(b>>>0<=255){break l}G[k>>2]=-11;b=255;break l}G[k>>2]=-11;b=0}E[h+j|0]=b;l=l+2|0;f=f+2|0;if((g|0)!=(f|0)){continue}break}}if(!e){break a}a=G[(l<<2)+a>>2];m:{if((a|0)>=0){if(a>>>0<=255){break m}G[k>>2]=-11;a=255;break m}G[k>>2]=-11;a=0}E[j+l|0]=a}}function Mr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;a:{if(G[c+4>>2]==703){g=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=81;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=191;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;g=L[c+24>>3];b:{if(g==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=45;g=.022222222222222223;break b}f=g*3.141592653589793*.25;g=1/f}G[c+1892>>2]=105;G[c+1888>>2]=106;L[c+112>>3]=f;L[c+120>>3]=g}b=g*b;a=g*a;g=O(a);c:{d:{if(g<=1){c=2;if(!(O(b)>3)){break d}break c}c=2;if(g>7|O(b)>1){break c}}e:{f:{h=a<-1?a+8:a;g:{if(h>5){a=h+-6;break g}if(h>3){n=1;a=h+-4;break g}if(h>1){o=1;a=h+-2;break g}h:{if(b>1){b=b+-2;m=1;break h}if(!(b<-1)){p=1;m=0;break h}b=b+2;m=0}a=h}j=a;k=O(j)>O(b);i:{j:{if(k){f=0;l=1;a=1;if(j==0){break i}a=b*15/j;i=Kb(a)/(Mb(a)+-.7071067811865475);l=i*i+1;g=j*j;break j}f=0;l=1;a=1;if(b==0){break i}a=j*15/b;i=Kb(a)/(Mb(a)+-.7071067811865475);l=i*i+1;g=b*b}a=-1;f=g*(-1/V(l+1)+1);g=1-f;if(g<-1){break f}a=g}f=V(f*(2-f)/l);break e}f=0;if(g<-1.000000000001){break c}}k:{if(m){if(k){h=j<0?-f:f;b=i*-h;break k}b=b>0?-f:f;h=i*-b;break k}if(p){if(k){b=a;h=j<0?-f:f;a=i*h;break k}g=b<0?-f:f;h=i*g;b=a;a=g;break k}if(o){if(k){h=a;b=j>0?-f:f;a=i*-b;break k}g=b<0?-f:f;b=i*-g;h=a;a=g;break k}g=-a;if(n){if(k){h=j>0?-f:f;a=i*-h;b=g;break k}a=b<0?-f:f;h=i*-a;b=g;break k}if(h>5){if(k){b=j<0?-f:f;a=i*b;h=g;break k}a=b<0?-f:f;b=i*a;h=g;break k}l:{if(k){h=j<0?-f:f;b=i*h;break l}b=b<0?-f:f;h=i*b}a=g}if(b==0&h==0){b=0}else{b=Ac(h,b)}L[d>>3]=b;q=e,r=Bc(a),L[q>>3]=r;c=0}return c|0}function sp(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0,o=0;a:{b:{if(!e){if(c==1&d==0){break b}if((b|0)<=0){break a}while(1){f=i+k|0;c:{d:{l=L[(k<<3)+a>>3]*c+d;if(l<-.49){G[j>>2]=-11;break d}if(l>255.49){G[j>>2]=-11;e=255;break c}if(!(l<4294967296&l>=0)){break d}e=~~l>>>0;break c}e=0}E[f|0]=e;k=k+1|0;if((k|0)!=(b|0)){continue}break}break a}k=a+6|0;e:{f:{if(!(c==1&d==0)){if((b|0)<=0){break a}e=(e|0)==1;o=e?f:1;m=e?i:g;if(!(d<4294967296&d>=0)){break f}n=~~d>>>0;break e}if((b|0)<=0){break a}e=(e|0)==1;n=e?f:1;o=e?i:g;e=0;while(1){g=i;f=0;g:{h:{i:{m=I[k>>1]&32752;switch(((m|0)==32752?1:!m<<1)|0){case 0:break h;case 1:break i;default:break g}}G[h>>2]=1;g=o;f=n;break g}c=L[(e<<3)+a>>3];if(c<-.49){G[j>>2]=-11;break g}j:{if(c>255.49){G[j>>2]=-11;f=255;break j}f=~~c>>>0;if(c<4294967296&c>=0){break j}f=0}}E[e+g|0]=f;k=k+8|0;e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}n=0}e=0;while(1){k:{l:{m:{n:{o:{p:{f=I[k>>1]&32752;switch(((f|0)==32752?1:!f<<1)|0){case 0:break n;case 1:break p;default:break o}}G[h>>2]=1;f=o;g=m;break k}if(d<-.49){G[j>>2]=-11;break m}f=n;g=i;if(!(d>255.49)){break k}G[j>>2]=-11;f=255;break l}l=L[(e<<3)+a>>3]*c+d;if(l<-.49){G[j>>2]=-11;f=0;break l}if(l>255.49){G[j>>2]=-11;f=255;break l}if(!(l<4294967296&l>=0)){break m}f=~~l>>>0;break l}f=0}g=i}E[g+e|0]=f;k=k+8|0;e=e+1|0;if((e|0)!=(b|0)){continue}break}break a}if((b|0)<=0){break a}while(1){f=i+k|0;q:{r:{c=L[(k<<3)+a>>3];if(c<-.49){G[j>>2]=-11;break r}if(c>255.49){G[j>>2]=-11;e=255;break q}if(!(c<4294967296&c>=0)){break r}e=~~c>>>0;break q}e=0}E[f|0]=e;k=k+1|0;if((k|0)!=(b|0)){continue}break}}}function Xh(a){var 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;j=Fa-16|0;Fa=j;if(H[a+1|0]){d=ab(160);G[j+12>>2]=a;a:{if(!H[a|0]){break a}e=20;while(1){g=vb(a,j+12|0);a=G[j+12>>2];c=H[a|0];b:{if((c|0)!=46){b=a;break b}b=a+1|0;G[j+12>>2]=b;c=H[a+1|0]}if(!c){break a}c=i+1|0;if((c|0)>=(e|0)){e=e+20|0;d=ub(d,e<<3)}L[(i<<3)+d>>3]=g;i=b;while(1){a=i;i=a+1|0;if(H[a|0]==32){continue}break}i=c;if(H[b|0]){continue}break}i=1}b=0;f=Fa-80|0;Fa=f;e=d;g=L[e+8>>3]+.5;c:{if(O(g)<2147483648){d=~~g;break c}d=-2147483648}d:{if((d|0)<=0){G[f>>2]=d;_a(G[24367],74914,f);break d}g=L[e+16>>3]+.5;e:{if(O(g)<2147483648){c=~~g;break e}c=-2147483648}if((c|0)<=0){G[f+16>>2]=c;_a(G[24367],74880,f+16|0);break d}l=L[e+32>>3];m=L[e+40>>3];if(l>=m){L[f+72>>3]=m;L[f+64>>3]=l;xb(G[24367],72443,f- -64|0);break d}n=L[e+56>>3];o=L[e+48>>3];if(n<=o){L[f+56>>3]=n;L[f+48>>3]=o;xb(G[24367],72406,f+48|0);break d}f:{g:{h:{g=L[e>>3]+.5;i:{if(O(g)<2147483648){a=~~g;break i}a=-2147483648}if(a-1>>>0<=2){b=ab(64);G[b+40>>2]=c;G[b+36>>2]=d;L[b+8>>3]=(l+m)*-.5;L[b>>3]=2/(m-l);L[b+24>>3]=(o+n)*-.5;L[b+16>>3]=2/(n-o);g=L[e+24>>3];j:{if(O(g)<2147483648){k=~~g;break j}k=-2147483648}G[b+44>>2]=k;k:{switch(k|0){case 2:h=(d|0)<(c|0)?d:c;h=M(d,c)+((M(h-1|0,h)|0)/-2|0)|0;break g;case 0:break h;case 1:break k;default:break f}}h=M(d,c);break g}G[f+32>>2]=a;_a(G[24367],74966,f+32|0);break d}h=(d+c|0)-1|0}G[b+48>>2]=h}G[b+32>>2]=a;k=h<<3;a=ab(k);G[b+52>>2]=a;if((h|0)>0){bb(a,e- -64|0,k)}p=b,q=ab(d<<3),G[p+56>>2]=q;p=b,q=ab(c<<3),G[p+60>>2]=q}Fa=f+80|0;Wa(e);a=i?b:0}else{a=0}Fa=j+16|0;return a}function ne(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;k=Fa-16|0;Fa=k;d=G[c>>2];a:{if((d|0)>0){break a}if((a|0)==(b|0)){d=101;G[c>>2]=101;break a}b:{if((wo(a,b,c)|0)>0){break b}if((Td(a,0,k+12|0,c)|0)>0){break b}e=G[k+12>>2];c:{if((e|0)<=0){break c}if(!((e|0)<=0|G[c>>2]>0)){d:{h=G[b>>2];d=G[b+4>>2];if((h|0)!=G[d+76>>2]){mb(b,h+1|0,0,c);break d}if((G[d+128>>2]&G[d+132>>2])!=-1){break d}Rb(b,c);i=G[b+4>>2];d=i;h=G[d+128>>2];l=G[d+132>>2];f=M(e,80);e=f+G[d+104>>2]|0;g=G[d+108>>2]+(f>>31)|0;g=f>>>0>e>>>0?g+1|0:g;f=Cu(e,g);j=(e-f|0)+2880|0;f=g-(Ia+(f>>>0>e>>>0)|0)|0;e=j;G[d+128>>2]=e;f=e>>>0<2880?f+1|0:f;G[d+132>>2]=f;d=G[d+96>>2]+(G[d+76>>2]<<3)|0;i=d;j=e-h|0;g=j+G[d+8>>2]|0;d=G[d+12>>2]+(f-((e>>>0>>0)+l|0)|0)|0;G[i+8>>2]=g;G[i+12>>2]=g>>>0>>0?d+1|0:d}}if(G[k+12>>2]<35){break c}rk(b,c)}e=0;d=Fa-2912|0;Fa=d;e:{if(G[c>>2]>0){break e}if((a|0)==(b|0)){G[c>>2]=101;break e}ok(a,0,d+2904|0,d+2896|0,c);ok(b,0,d+2888|0,0,c);g=G[d+2896>>2];f=G[d+2904>>2];h=G[d+2908>>2];i=Bu(g-f|0,G[d+2900>>2]-(h+(f>>>0>g>>>0)|0)|0,2880,0);f:{if((i|0)<=0){break f}if(G[a+4>>2]==G[b+4>>2]){while(1){Jb(a,f,h,0,c);ic(a,2880,0,d,c);Jb(b,G[d+2888>>2],G[d+2892>>2],1,c);Wb(b,2880,0,d,c);h=G[d+2908>>2];f=G[d+2904>>2]+2880|0;h=f>>>0<2880?h+1|0:h;G[d+2904>>2]=f;G[d+2908>>2]=h;g=G[d+2892>>2];j=G[d+2888>>2]+2880|0;g=j>>>0<2880?g+1|0:g;G[d+2888>>2]=j;G[d+2892>>2]=g;e=e+1|0;if((i|0)!=(e|0)){continue}break f}}Jb(a,f,h,0,c);Jb(b,G[d+2888>>2],G[d+2892>>2],1,c);while(1){ic(a,2880,0,d,c);Wb(b,2880,0,d,c);e=e+1|0;if((i|0)!=(e|0)){continue}break}}}Fa=d+2912|0}d=G[c>>2]}Fa=k+16|0;return d}function ap(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{b:{if((b|0)==1){c=H[c|0];b=G[48830];G[48830]=b-4;c=c&15|G[48829]<<4;G[48829]=c;if((b|0)<=4){d=a;a=G[48828];E[d+a|0]=c>>4-b;if((a|0)>>0<4?d+1|0:d;b=a;a=d;break b}c:{d=G[48830];if((d|0)>4){k=d;break c}g=H[c|0]&15|G[48829]<<4;G[48829]=g;e=G[48828];E[e+a|0]=g>>4-d;i=G[48827];if((i|0)>(e|0)){e=e+1|0;G[48828]=e}k=d+4|0;G[48830]=k;f=G[48833];j=f;l=G[48832];h=l+4|0;f=h>>>0<4?f+1|0:f;G[48832]=h;G[48833]=f;h=1;if((b|0)!=2){break c}b=H[c+1|0];G[48830]=d;b=b&15|g<<4;G[48829]=b;if((d|0)<=0){E[a+e|0]=b>>0-d;if((e|0)<(i|0)){G[48828]=e+1}G[48830]=d+8}a=j;b=l+8|0;a=b>>>0<8?a+1|0:a;break b}g=b-h|0;j=(g|0)/2|0;d:{e:{if((k|0)!=8){d=0;f=G[48828];e=G[48829];i=-8;l=-1;if((g|0)<=1){break d}g=8-k|0;while(1){i=c+h|0;e=H[i|0]<<4&240|e<<8|H[i+1|0]&15;E[a+f|0]=e>>g;f=f+1|0;h=h+2|0;d=d+1|0;if((j|0)!=(d|0)){continue}break}G[48829]=e;break e}e=0;G[48829]=0;f=G[48828];i=-8;l=-1;if((g|0)<2){break d}if((g&-2)!=2){g=j&-2;d=0;while(1){i=a+f|0;e=c+h|0;E[i|0]=H[e+1|0]&15|H[e|0]<<4;E[i+1|0]=H[e+3|0]&15|H[e+2|0]<<4;f=f+2|0;h=h+4|0;d=d+2|0;if((g|0)!=(d|0)){continue}break}}e=0;if(!(j&1)){break e}d=c+h|0;E[a+f|0]=H[d+1|0]&15|H[d|0]<<4;f=f+1|0;h=h+2|0}G[48828]=f;d=(j<<3)-8|0;i=d;l=d>>31}g=G[48832];j=g+i|0;d=G[48833]+l|0;d=g>>>0>j>>>0?d+1|0:d;G[48832]=j;G[48833]=d;if((b|0)==(h|0)){break a}b=H[(b+c|0)-1|0];G[48830]=k-4;b=b&15|e<<4;G[48829]=b;if((k|0)<=4){E[a+f|0]=b>>4-k;if(G[48827]>(f|0)){G[48828]=f+1}G[48830]=k+4}b=j+4|0;a=b>>>0<4?d+1|0:d}G[48832]=b;G[48833]=a}}function zo(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;h=(d+1|0)/2|0;a:{if((c|0)<=0){break a}if((d|0)>0){j=c+1>>>1|0;k=M(h,j)-1|0;while(1){i=j-1|0;l=h+M(i,d)<<1;f=h;while(1){l=l-2|0;E[l+e|0]=H[b+k|0];k=k-1|0;m=(f|0)>1;f=f-1|0;if(m){continue}break}f=(j|0)>1;j=i;if(f){continue}break}}if((c|0)<2){break a}if((d|0)>=2){j=c-1|0;i=d-1|0;k=(d&-2)>>>0>>0;while(1){f=M(d,g);l=f+d|0;h=0;while(1){m=e+f|0;b=E[m|0];if(b>>>0<=15){n=e+l|0;E[n|0]=H[b+119004|0];E[n+1|0]=H[b+118988|0];E[(f|1)+e|0]=H[b+119020|0];E[m|0]=H[b+119036|0]}l=l+2|0;f=f+2|0;h=h+2|0;if((i|0)>(h|0)){continue}break}if(k){b=e+f|0;f=H[b|0];E[e+l|0]=f>>>1&1;E[b|0]=f>>>3&1}g=g+2|0;if((j|0)>(g|0)){continue}break}break a}b:{c:{if((d|0)==1){b=c-2|0;f=(b>>>1|0)+1|0;h=f&1;if(b>>>0>=2){break c}break b}g=c&-2;break a}b=f&-2;f=0;while(1){j=e+g|0;i=H[j|0];E[(g|1)+e|0]=i>>>1&1;E[j|0]=i>>>3&1;j=(g|2)+e|0;i=H[j|0];E[(g|3)+e|0]=i>>>1&1;E[j|0]=i>>>3&1;g=g+4|0;f=f+2|0;if((b|0)!=(f|0)){continue}break}}if(!h){break a}b=e+g|0;f=H[b|0];E[(g|1)+e|0]=f>>>1&1;E[b|0]=f>>>3&1;g=g+2|0}d:{if((c|0)<=(g|0)){break d}f=M(d,g);k=0;if((d|0)>=2){b=d-2|0;h=(b>>>1|0)+1|0;j=h&1;if(b>>>0>=2){h=h&-2;while(1){b=e+f|0;i=H[b|0];E[(f|1)+e|0]=i>>>2&1;E[b|0]=i>>>3&1;i=f+2|0;g=i+e|0;b=H[g|0];E[(i|1)+e|0]=b>>>2&1;E[g|0]=b>>>3&1;f=f+4|0;k=k+2|0;if((h|0)!=(k|0)){continue}break}}k=d&-2;if(j){b=e+f|0;h=H[b|0];E[(f|1)+e|0]=h>>>2&1;E[b|0]=h>>>3&1;f=f+2|0}}if((d|0)<=(k|0)){break d}b=e+f|0;E[b|0]=H[b|0]>>>3&1}f=M(c,d);if((f|0)>0){while(1){b=f-1|0;c=b+e|0;if(H[c|0]){o=c,p=wh(a),E[o|0]=p}c=f>>>0>1;f=b;if(c){continue}break}}}function _d(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{f=G[c>>2];if(!f){d=ab(8);if(d){G[d>>2]=0;G[d+4>>2]=0}E[b|0]=0;b:{c:{d:{e:{f:{f=Sb(a,42197);g:{if(!f){f=a;break g}f=jb(f+3|0,47);if(!f){break f}e=a;a=f-a|0;i=rb(b,e,a)+a|0,j=0,E[i|0]=j}if(H[f|0]==47){a=Va(b)+b|0;E[a|0]=47;E[a+1|0]=0}a=pc(f,42205);if(!a){break e}while(1){h:{if(!Xa(a,45311)){if(G[d>>2]){e=G[d+4>>2];if(!e){break h}a=G[e+8>>2];G[a+4>>2]=G[e+4>>2];G[G[e+4>>2]+8>>2]=a;Wa(e);G[d+4>>2]=a;a=G[d>>2]-1|0;G[d>>2]=a;if(a){break h}G[d+4>>2]=0;break h}if(H[f|0]==47){break h}g=G[d+4>>2];e=ab(12);G[e>>2]=a;i:{if(g){a=G[g+4>>2];G[e+8>>2]=g;G[a+8>>2]=e;g=g+4|0;break i}a=e;g=a+8|0}G[g>>2]=e;G[e+4>>2]=a;G[d>>2]=1;G[d+4>>2]=e;break h}if(!d|!Xa(a,48504)){break h}g=G[d+4>>2];e=ab(12);G[e>>2]=a;j:{if(g){a=G[g+4>>2];G[e+8>>2]=g;G[a+8>>2]=e;g=g+4|0;break j}a=e;g=a+8|0}G[g>>2]=e;G[e+4>>2]=a;G[d+4>>2]=e;G[d>>2]=G[d>>2]+1}a=pc(0,42205);if(a){continue}break}break e}Za(b,a);break d}if(G[d>>2]){h=G[d>>2];a=G[d+4>>2];while(1){g=G[a+4>>2];e=G[g>>2];f=G[g+8>>2];G[f+4>>2]=G[g+4>>2];G[G[g+4>>2]+8>>2]=f;Wa(g);h=h-1|0;a=h?a:0;if((Va(b)+Va(e)|0)-1024>>>0<=4294966270){G[d>>2]=h;G[d+4>>2]=a;E[b|0]=0;Ua(59088);G[c>>2]=125;if(!h){break c}a=G[d+4>>2];if(!a){break a}while(1){b=a;a=0;if(!b){continue}a=G[b+8>>2];G[a+4>>2]=G[b+4>>2];G[G[b+4>>2]+8>>2]=a;Wa(b);G[d+4>>2]=a;b=G[d>>2]-1|0;G[d>>2]=b;if(b){continue}break}G[d+4>>2]=0;break c}f=Gb(b,e);f=Va(f)+f|0;E[f|0]=47;E[f+1|0]=0;if(h){continue}break}G[d>>2]=h;G[d+4>>2]=a}i=(Va(b)+b|0)-1|0,j=0,E[i|0]=j}if(!d){break b}}Wa(d)}f=G[c>>2]}return f}while(1)continue}function $h(a,b,c,d,e,f){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;g=L[b>>3];h=L[a>>3]*3.141592653589793/180;i=ib(h);g=g*3.141592653589793/180;j=eb(g);m=i*j;k=eb(h);n=j*k;s=L[d>>3]*36e4;o=L[c>>3];h=ib(g);t=o*36e4;a:{if(t==0){g=0;if(s==0){break a}}l=h*-k*s-m*t;q=j*s;g=t*n-s*(h*i)}i=q*-242404995e-14+(g*6585e-14+(l*1.177742e-8+(h*.9999881946+(m*-271557e-10+(n*-.004859004+0)))));k=q*-1.177742e-8+(g*-2.710544e-8+(l*-24238984e-13+(h*.0048590039+(m*.0111814828+(n*.9999256795+0)))));o=q*6585e-14+(g*-242392702e-14+(l*2.710544e-8+(h*-271771e-10+(m*.9999374849+(n*-.0111814828+0)))));j=-(i*-1.3843e-7+(k*-162557e-11+o*-3.1919e-7));u=j*i;p=V(i*i+(k*k+o*o));r=u+(p*-1.3843e-7+i);w=r*r;x=j*k;r=x+(p*-162557e-11+k);y=j*o;j=y+(p*-3.1919e-7+o);j=V(w+(r*r+j*j));z=j*-659e-6+(q*.99996684+(g*-2716e-8+(l*-.00485852+(h*.002117+(m*-.008541+(n*.43573+0))))));r=i*-659e-6+(k*.001245+o*-.00158);p=u+(j*-1.3843e-7+i);u=r*p;w=j*-.00158+(q*-2717e-8+(g*.99991613+(l*-.01118145+(h*.012254+(m*-.002667+(n*-.23856+0))))));i=y+(j*-3.1919e-7+o);o=r*i;l=j*.001245+(q*.00485852+(g*.01118145+(l*.99990432+(h*-.435614+(m*.238509+(n*-551e-6+0))))));g=x+(j*-162557e-11+k);k=r*g;h=g*g+i*i;m=V(h);b:{if(g==0&i==0){break b}v=Db(i,g);if(!(v<0)){break b}v=v+6.283185307179586}q=z-u;n=w-o;l=l-k;if(m>1e-30){t=(g*n-l*i)/h;s=(q*h-(g*l+i*n)*p)/((p*p+h)*m)}h=L[e>>3];if(h>1e-30){L[f>>3]=(p*q+(g*l+i*n))/(j*(h*21.095));L[e>>3]=L[e>>3]/j}L[a>>3]=v*180/3.141592653589793;A=b,B=Db(p,m)*180/3.141592653589793,L[A>>3]=B;L[c>>3]=t/36e4;L[d>>3]=s/36e4}function dl(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0;a:{b:{if(!e){if(c==1&d==0){break a}if((b|0)<=0){break b}h=b&3;e=0;if(b-1>>>0>=3){j=b&-4;b=0;while(1){g=k<<3;L[g+i>>3]=L[a+g>>3]*c+d;m=g|8;L[m+i>>3]=L[a+m>>3]*c+d;m=g|16;L[m+i>>3]=L[a+m>>3]*c+d;g=g|24;L[g+i>>3]=L[a+g>>3]*c+d;k=k+4|0;b=b+4|0;if((j|0)!=(b|0)){continue}break}}if(!h){break b}while(1){b=k<<3;L[b+i>>3]=L[a+b>>3]*c+d;k=k+1|0;e=e+1|0;if((h|0)!=(e|0)){continue}break}break b}k=a+6|0;c:{if(!(c==1&d==0)){if((b|0)<=0){break b}if((e|0)!=1){break c}while(1){l=d;d:{e:{f:{e=I[k>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break e;case 1:break f;default:break d}}G[h>>2]=1;l=f;break d}l=L[(j<<3)+a>>3]*c+d}L[(j<<3)+i>>3]=l;k=k+8|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}break b}if((b|0)<=0){break b}if((e|0)==1){while(1){d=0;g:{h:{i:{e=I[k>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break h;case 1:break i;default:break g}}G[h>>2]=1;d=f;break g}d=L[(j<<3)+a>>3]}L[(j<<3)+i>>3]=d;k=k+8|0;j=j+1|0;if((j|0)!=(b|0)){continue}break b}}while(1){d=0;j:{k:{l:{e=I[k>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break k;case 1:break l;default:break j}}G[h>>2]=1;E[g+j|0]=1;d=-91191291391491e-49;break j}d=L[(j<<3)+a>>3]}L[(j<<3)+i>>3]=d;k=k+8|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}break b}while(1){l=d;m:{n:{o:{e=I[k>>1]&32752;switch(((e|0)==32752?1:!e<<1)|0){case 0:break n;case 1:break o;default:break m}}G[h>>2]=1;E[g+j|0]=1;l=-91191291391491e-49;break m}l=L[(j<<3)+a>>3]*c+d}L[(j<<3)+i>>3]=l;k=k+8|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}}return}yd(i,a,b<<3)}function xk(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=Fa-96|0;Fa=j;h=G[f>>2];a:{if((h|0)>0){break a}b:{k=G[a>>2];h=G[a+4>>2];c:{d:{if((k|0)!=G[h+76>>2]){mb(a,k+1|0,0,f);break d}if((G[h+128>>2]&G[h+132>>2])!=-1){break d}if((Rb(a,f)|0)>0){break c}}if(!G[G[a+4>>2]+80>>2]){Ua(49395);h=235;G[f>>2]=235;break a}if((e|0)<0){h=306;G[f>>2]=306;break a}if(!(d|e)){break c}_f(a,41261,j+80|0,j,f);g=G[a+4>>2];h=G[g+952>>2];k=G[g+956>>2];if(h>>>0>>0&(k|0)<=(c|0)|(c|0)>(k|0)){Ua(49509);break b}if(!b&(c|0)<=0|(c|0)<0){Ua(49579);break b}c=c+e|0;b=b+d|0;c=b>>>0>>0?c+1|0:c;i=b-1|0;b=c-!b|0;if(i>>>0>h>>>0&(b|0)>=(k|0)|(b|0)>(k|0)){Ua(49456);break b}m=G[j+80>>2];o=G[j+84>>2];i=Au(i,b,m,o);l=G[g+128>>2];c=i+l|0;n=Ia;b=n+G[g+132>>2]|0;p=c;q=c>>>0>>0?b+1|0:b;l=G[g+976>>2];b=l+G[g+984>>2]|0;c=G[g+988>>2]+G[g+980>>2]|0;c=b>>>0>>0?c+1|0:c;g=b;l=b-i|0;n=c-((b>>>0>>0)+n|0)|0;b=Au(m,o,d,e);m=Ia;i=m;Ci(a,p,q,l,n,0-b|0,0-(i+((b|0)!=0)|0)|0,f);g=g+2879|0;c=g>>>0<2879?c+1|0:c;c=Cu(g,c);g=(b-c|0)+2879|0;c=i-(Ia+(b>>>0>>0)|0)|0;c=Bu(g,g>>>0<2879?c+1|0:c,2880,0);if((c|0)>0){oh(a,c,f)}c=G[a+4>>2];i=G[c+976>>2];g=G[c+980>>2]-((b>>>0>i>>>0)+m|0)|0;b=i-b|0;G[c+976>>2]=b;G[c+980>>2]=g;G[j+92>>2]=0;Ad(a,34350,b,b>>31,65398,j+92|0);Ad(a,40853,h-d|0,k-((d>>>0>h>>>0)+e|0)|0,65398,f);c=G[a+4>>2];b=G[c+952>>2];h=G[c+956>>2]-((b>>>0>>0)+e|0)|0;G[c+952>>2]=b-d;G[c+956>>2]=h;b=G[c+944>>2];e=G[c+948>>2]-((d>>>0>b>>>0)+e|0)|0;G[c+944>>2]=b-d;G[c+948>>2]=e;$n(a,f)}h=G[f>>2];break a}h=307;G[f>>2]=307}Fa=j+96|0;return h}function Pj(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0;k=Fa-96|0;Fa=k;G[b>>2]=0;E[c|0]=0;G[d>>2]=0;G[e>>2]=-1;E[f|0]=0;E[g|0]=0;a:{if(G[h>>2]>0){break a}j=a;while(1){i=j;j=i+1|0;l=E[i|0];if((l|0)==32){continue}break}b:{c:{d:{if(l-48>>>0>9){break d}G[48624]=0;m=nc(i,k+12|0,10);G[b>>2]=m;j=G[k+12>>2];while(1){l=H[j|0];if((l|0)!=32){e:{f:{if(!((l|0)!=59?l:0)){G[k+12>>2]=j;if(G[48624]==68){break f}if(m>>>0>99999){break e}break c}G[k+12>>2]=j}G[b>>2]=0;G[48624]=0;if(J[b>>2]<1e5){break d}}G[b>>2]=0;Ua(38530);Ua(a);break b}else{j=j+1|0;continue}}}j=qc(i,36371);if((j|0)>=71){break b}c=qb(c,i,j);g:{if((j|0)<=0){b=j;break g}l=c-1|0;while(1){m=j+l|0;if(H[m|0]!=32){b=j;break g}b=0;E[m|0]=0;m=(j|0)>1;j=j-1|0;if(m){continue}break}}b=b+i|0;i=Me(b,39477)+b|0;b=qc(i,36370);if(b){G[k>>2]=d;if((Qc(i,30633,k)|0)!=1){Ua(39050);Ua(a);break b}b=b+i|0;i=Me(b,39477)+b|0;if(!qc(i,36383)){break c}h:{switch(H[i|0]-65|0){case 1:case 33:G[e>>2]=2;break c;case 0:case 19:case 32:case 51:G[e>>2]=1;break c;case 8:case 40:G[e>>2]=0;break c;default:break h}}Ua(39085);Ua(a);break b}b=Za(k+16|0,c);Yf(b);if((G[b>>2]!=1296650832|G[b+4>>2]!=5853761)&(H[b|0]|H[b+1|0]<<8)!=80){break c}E[c|0]=0}i=jb(i,59);if(i){while(1){c=H[i+1|0];b=i+1|0;i=b;if((c|0)==32){continue}break}i=jb(b,40);if(!i){Ua(38991);Ua(64199);Ua(a);break b}c=i-b|0;if((c|0)>=1025){break b}qb(f,b,c);while(1){c=H[i+1|0];b=i+1|0;i=b;if((c|0)==32){continue}break}c=jb(b,41);if(!c){Ua(38991);Ua(14859);Ua(a);break b}a=c-b|0;if((a|0)>=1025){break b}qb(g,b,a)}break a}G[h>>2]=125}Fa=k+96|0}function jn(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=-1;G[f>>2]=-1;a:{if(a>=b){break a}b:{c:{d:{if((c|0)<16){h=c;while(1){if(!h){h=-1;i=g;break d}h=h-1|0;i=h<<3;k=L[i+e>>3]>=a;g=k?h:g;if(!(L[d+i>>3]<=a)){continue}i=h;if(!k){continue}break}break d}j=L[d>>3];if(!(!(j<=a)|!(L[((c<<3)+e|0)-8>>3]>=a))){g=c>>>1|0;h=g;while(1){h=h>>>(h>>>0>1)|0;i=g<<3;k=i+e|0;if(L[k>>3]>3]<=a)){h=-1;break d}g=g+h|0;continue}if(!(L[d+i>>3]>a)){h=g;i=g;break d}if(L[k-8>>3]>=a){g=g-h|0;continue}else{h=-1;i=g;break d}}}h=-1;g=a(g|0)?g:-1;break c}k=-1;m=(c|0)>(i|0)?i:-1;if((c|0)<16){i=-1;g=c;while(1){if(!g){break b}g=g-1|0;p=g<<3;l=L[p+e>>3]>=b;k=l?g:k;if(!(L[d+p>>3]<=b)|!l){continue}break}i=g;k=g;break b}j=L[d>>3]}if(!(!(b>=j)|!(L[((c<<3)+e|0)-8>>3]>=b))){l=c>>>1|0;g=l;while(1){g=g>>>(g>>>0>1)|0;i=l<<3;k=i+e|0;if(L[k>>3]>3]<=b)){i=-1;break b}l=g+l|0;continue}if(!(L[d+i>>3]>b)){i=l;k=i;break b}if(L[k-8>>3]>=b){l=l-g|0;continue}else{i=-1;k=l;break b}}}i=-1;k=b=0){G[f>>2]=h}f=(c|0)>(k|0)?k:-1;if((f&m)<0|(f|0)==(m|0)&(h&i)<0){break a}if(!((h|0)!=(i|0)|(h|0)<0)){return b-a}c=(f|0)<0?c-1|0:f+(i>>31)|0;if((c|0)<(m|0)){break a}if((c-m|0)+1&1){f=m<<3;j=L[f+e>>3];n=b>3];n=n-(a>j?a:j)+0;h=m+1|0}else{h=m}if((c|0)==(m|0)){break a}while(1){f=h<<3;j=L[f+e>>3];o=b>3];n=n+(o-(a>j?a:j));f=h+1|0;g=f<<3;j=L[g+e>>3];o=b>3];n=n+(o-(a>j?a:j));h=h+2|0;if((c|0)!=(f|0)){continue}break}}return n}function oh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;i=Fa-2896|0;Fa=i;d=G[c>>2];if(!((b|0)<=0|(d|0)>0)){G[i+12>>2]=0;d=G[a+4>>2];h=G[d+128>>2];f=G[d+976>>2]+h|0;e=G[d+980>>2]+G[d+132>>2]|0;e=f>>>0>>0?e+1|0:e;h=G[d+984>>2];f=h+f|0;d=G[d+988>>2]+e|0;d=f>>>0>>0?d+1|0:d;e=f+2879|0;d=e>>>0<2879?d+1|0:d;f=Cu(e,d);d=d-(Ia+(e>>>0>>0)|0)|0;g=e-f|0;e=Au(b,0,2880,0);h=g-e|0;k=Ia;f=d-(k+(e>>>0>g>>>0)|0)|0;a:{b:{if(Jb(a,g,d,0,i+12|0)){break b}while(1){if(ic(a,2880,0,i+16|0,i+12|0)){break b}Jb(a,h,f,0,c);Wb(a,2880,0,i+16|0,c);if(G[c>>2]>0){tb(5,59384);break a}h=h+2880|0;f=h>>>0<2880?f+1|0:f;g=g+2880|0;d=g>>>0<2880?d+1|0:d;if(!Jb(a,g,d,0,i+12|0)){continue}break}}d=0;cb(i+16|0,0,2880);Jb(a,h,f,0,c);if((b|0)>0){while(1){Wb(a,2880,0,i+16|0,c);d=d+1|0;if((d|0)!=(b|0)){continue}break}}b=0;Jb(a,h-1|0,f-!h|0,0,c);Wm(a,h,f,c);d=G[a+4>>2];h=G[d+88>>2];a=G[d+76>>2];if((h|0)<(a|0)){break a}f=G[d+96>>2];j=h-a|0;l=j+1&3;if(l){while(1){a=a+1|0;g=f+(a<<3)|0;d=G[g>>2];m=G[g+4>>2]-((d>>>0>>0)+k|0)|0;G[g>>2]=d-e;G[g+4>>2]=m;b=b+1|0;if((l|0)!=(b|0)){continue}break}}if(j>>>0<3){break a}while(1){d=f+(a<<3)|0;b=G[d+8>>2];j=G[d+12>>2]-((b>>>0>>0)+k|0)|0;g=d+8|0;G[g>>2]=b-e;G[g+4>>2]=j;b=G[d+16>>2];g=G[d+20>>2]-((e>>>0>b>>>0)+k|0)|0;G[d+16>>2]=b-e;G[d+20>>2]=g;g=a+3|0;d=f+(g<<3)|0;b=G[d>>2];j=G[d+4>>2]-((b>>>0>>0)+k|0)|0;G[d>>2]=b-e;G[d+4>>2]=j;a=a+4|0;d=f+(a<<3)|0;b=G[d>>2];j=G[d+4>>2]-((b>>>0>>0)+k|0)|0;G[d>>2]=b-e;G[d+4>>2]=j;if((h|0)!=(g|0)){continue}break}}d=G[c>>2]}Fa=i+2896|0;return d}function Dj(a,b,c,d,e,f){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;g=L[b>>3];h=L[a>>3]*3.141592653589793/180;n=ib(h);g=g*3.141592653589793/180;j=eb(g);k=n*j;o=eb(h);h=j*o;q=L[d>>3]*36e4;i=L[f>>3];s=L[e>>3];l=L[c>>3];g=ib(g);r=l*36e4;a:{if(!(r!=0|q!=0)){l=659e-6;p=-.001245;m=.00158;if(i==0|s==0){break a}}i=i*21.095*s;l=j*q+g*i+659e-6;p=i*h+(j*-n*r-q*(g*o))+-.001245;m=i*k+(h*r-q*(g*n))+.00158}o=0;i=g*-659e-6+(h*.001245+k*-.00158);j=i*g+l;n=i*k+m;i=i*h+p;l=g*-1.3843e-7+(h*-162557e-11+k*-3.1919e-7);g=l*g+(g+1.3843e-7);k=l*k+(k+3.1919e-7);h=l*h+(h+162557e-11);l=j*-6587e-14+(n*242397878e-14+(i*2.710663e-8+(g*-271765e-10+(k*.9999374784+(h*.011182061+0)))));u=j*-2718e-8+(n*.99995883+(i*.01118251+(g*-.008541+(k*-.002667+(h*.238514+0)))));w=l*u;m=j*-1.177656e-8+(n*-2.710663e-8+(i*242395018e-14+(g*-.0048579477+(k*-.0111820611+(h*.9999256782+0)))));v=j*-.00485767+(n*-.01118251+(i*.99994704+(g*.435739+(k*-.238565+(h*-551e-6+0)))));x=m*v;y=n*-2714e-8+(i*.00485767+(g*.002117+(k*.012254+(h*-.435623+0))));z=j*1.00000956;p=m*m+l*l;t=V(p);g=j*242410173e-14+(n*-6582e-14+(i*1.177656e-8+(g*.9999881997+(k*-271474e-10+(h*.0048579479+0)))));j=g*g;b:{if(m==0&l==0){break b}o=Db(l,m);if(!(o<0)){break b}o=o+6.283185307179586}h=z+y;k=x+w;j=j+p;if(t>1e-30){r=(m*u-v*l)/p;q=(h*p-k*g)/(j*t)}if(s>1e-30){m=g*h+k;h=V(j);L[f>>3]=m/(s*h*21.095);L[e>>3]=L[e>>3]/h}L[a>>3]=o*180/3.141592653589793;A=b,B=Db(g,t)*180/3.141592653589793,L[A>>3]=B;L[c>>3]=r/36e4;L[d>>3]=q/36e4}function Yc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;A(+b);g=v(1)|0;a:{i=v(0)|0;e=i<<1;c=g<<1|i>>>31;b:{if(!(e|c)){break b}d=g&2147483647;if((d|0)==2146435072&(i|0)!=0|d>>>0>2146435072){break b}A(+a);k=v(1)|0;f=v(0)|0;h=k>>>20&2047;if((h|0)!=2047){break a}}a=a*b;return a/a}d=k<<1|f>>>31;j=f<<1;if((c|0)==(d|0)&e>>>0>=j>>>0|c>>>0>d>>>0){return(e|0)==(j|0)&(c|0)==(d|0)?a*0:a}j=g>>>20&2047;c:{if(!h){h=0;d=f;c=k<<12|d>>>20;e=d<<12;d=c;if((c|0)>0|(c|0)>=0){while(1){h=h-1|0;c=d<<1|e>>>31;e=e<<1;d=c;if((c|0)>0|(c|0)>=0){continue}break}}e=f;c=1-h|0;d=c&31;if((c&63)>>>0>=32){c=e<>>32-d|k<>>20;f=f<<12;if((c|0)>0|(c|0)>=0){while(1){j=j-1|0;c=c<<1|f>>>31;f=f<<1;if((c|0)>0|(c|0)>=0){continue}break}}c=1-j|0;f=c&31;if((c&63)>>>0>=32){c=i<>>32-f|g<(j|0)){while(1){i=e-c|0;e:{g=d-((c>>>0>e>>>0)+f|0)|0;if((g|0)<0){break e}e=i;d=g;if(e|d){break e}return a*0}d=d<<1|e>>>31;e=e<<1;h=h-1|0;if((j|0)<(h|0)){continue}break}h=j}g=c;c=d-((c>>>0>e>>>0)+f|0)|0;g=e-g|0;f:{if((c|0)<0){break f}e=g;d=c;if(e|c){break f}return a*0}g:{if(d>>>0>1048575){f=e;c=d;break g}while(1){h=h-1|0;g=d>>>0<524288;c=e;d=d<<1|c>>>31;f=c<<1;c=d;e=f;if(g){continue}break}}g=0;k=k&-2147483648;if((h|0)>0){c=c+-1048576|h<<20}else{d=c;c=1-h|0;e=c&31;if((c&63)>>>0>=32){c=0;f=d>>>e|0}else{c=d>>>e|0;f=((1<>>e}}x(0,f|g);x(1,c|k);return+z()}function Vb(a,b,c,d,e,f,g,h,i,j,k){var l=0,m=0,n=0,o=0;l=-1;a:{b:{if((d|e|f|g|h|i|j)<0){break b}l=G[309723];if((l|0)==G[309724]){m=G[309722];c:{if(m){G[309724]=l<<1;l=ub(m,M(l,688));break c}G[309724]=100;l=ab(34400)}if(!l){break a}G[309722]=l;l=G[309723]}G[309723]=l+1;if((l|0)<0){break b}m=G[309722];n=m+M(l,344)|0;G[n+12>>2]=d;G[n+8>>2]=c;G[n+4>>2]=26;G[n>>2]=b;G[n+36>>2]=j;G[n+32>>2]=i;G[n+28>>2]=h;G[n+24>>2]=g;G[n+20>>2]=f;G[n+16>>2]=e;f=(b|0)==1043?0:c;d:{if(!c){break d}e=c;e:{if(!(c&1)){break e}e=c-1|0;f=0;if((b|0)==1043){break e}f=G[M(G[((M(l,344)+m|0)+(e<<2)|0)+12>>2],344)+m>>2]==-1e3}if((c|0)==1){break d}g=f;while(1){f=0;c=0;c=g?G[M(G[((M(l,344)+m|0)+(e<<2)|0)+8>>2],344)+m>>2]==-1e3:c;e=e-2|0;f=c?G[M(G[((M(l,344)+m|0)+(e<<2)|0)+12>>2],344)+m>>2]==-1e3:f;g=f;if(e){continue}break}}f:{if(a){b=M(l,344)+m|0;G[b+56>>2]=1;G[b+60>>2]=1;G[b+52>>2]=a;G[b- -64>>2]=1;break f}b=M(l,344)+m|0;a=M(d,344)+m|0;G[b+52>>2]=G[a+52>>2];G[b+56>>2]=G[a+56>>2];G[b+60>>2]=G[a+60>>2];b=G[a+60>>2];if((b|0)<=0){break f}i=0;e=0;if(b-1>>>0>=3){h=b&-4;j=0;while(1){c=(M(l,344)+m|0)- -64|0;a=e<<2;g=(M(d,344)+m|0)- -64|0;G[c+a>>2]=G[g+a>>2];o=a|4;G[o+c>>2]=G[g+o>>2];o=a|8;G[o+c>>2]=G[g+o>>2];a=a|12;G[a+c>>2]=G[a+g>>2];e=e+4|0;j=j+4|0;if((h|0)!=(j|0)){continue}break}}a=b&3;if(!a){break f}while(1){b=e<<2;G[(b+(M(l,344)+m|0)|0)- -64>>2]=G[(b+(M(d,344)+m|0)|0)- -64>>2];e=e+1|0;i=i+1|0;if((a|0)!=(i|0)){continue}break}}if((k|0)>0){G[(M(l,344)+m|0)+56>>2]=k}if(!f){break b}qn(n)}return l}G[309737]=113;return-1}function Dd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=Fa-112|0;Fa=j;a:{b:{c:{if((Va(b)|0)!=7){break c}if(fb(b,33332,7)){if(fb(b,32708,7)){break c}}d:{while(1){f=a+d|0;if(!H[f|0]){break d}g=a+d|0;f=g+1|0;if(!H[f|0]){break d}f=g+2|0;if(!H[f|0]){break d}f=g+3|0;if(!H[f|0]){break d}f=g+4|0;if(!H[f|0]){break d}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0}e=a;while(1){h=ec(e,35790,f-e|0);i=(h-a|0)%80|0;if((i|0)>=8){e=h+1|0;continue}d=H[h+3|0];if(!((d|0)==61|(d-33&255)>>>0>93)){e=h+1|0;continue}g=h-i|0;if((i|0)>0){i=h+1|0;d=g;while(1){e=H[d|0]==32?e:i;d=d+1|0;if(h>>>0>d>>>0){continue}break}}if(e>>>0>h>>>0){continue}break}e=rb(g+80|0,g,80);rb(cb(g,32,80),b,7);g=0;break b}e:{f:{while(1){f=a+d|0;if(!H[f|0]){g=d;break f}g=1;e=a+d|0;f=e+1|0;if(!H[f|0]){break f}f=e+2|0;if(!H[f|0]){break f}f=e+3|0;if(!H[f|0]){break f}f=e+4|0;if(!H[f|0]){break f}d=d+5|0;if((d|0)!=57600){continue}break}f=a+57600|0;break e}if(!g){break a}}e=a;while(1){h=ec(e,b,f-e|0);if(!h){break a}g:{i=(h-a|0)%80|0;h:{if((i|0)>=8){e=h+1|0;break h}d=H[Va(b)+h|0];if(!((d|0)==61|(d-33&255)>>>0>93)){e=h+1|0;break h}g=h-i|0;if((i|0)>0){i=h+1|0;d=g;while(1){e=H[d|0]==32?e:i;d=d+1|0;if(h>>>0>d>>>0){continue}break}}if(e>>>0<=h>>>0){break g}}if(e>>>0>>0){continue}break a}break}e=g+80|0;i:{j:{b=rb(j,g,80);a=jb(b,39);k:{if(!a){break k}a=jb(a+1|0,39);if(!a){break k}a=a-b|0;if((a|0)>30){break j}}g=g+31|0;break i}g=(a+g|0)+2|0}E[g|0]=47;E[g+1|0]=32}b=Va(c);if((b|0)<=0){break a}a=g+2|0;rb(a,c,a+b>>>0>e>>>0?e-a|0:b)}Fa=j+112|0}function jk(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0;k=Fa-160|0;Fa=k;j=G[i>>2];a:{if(j){break a}j=Fc(a,35480,k+80|0,k,i);G[i>>2]=j;if((j|0)==202){G[i>>2]=340;Ua(62904);j=G[i>>2]}b:{c:{if(j){break c}j=Va(k+80|0);if(!(H[k+80|0]!=39|H[(j+k|0)+79|0]!=39)){j=j-2|0;if((j|0)>0){l=k+80|0;yd(l,l|1,j)}E[j+(k+80|0)|0]=0}l=0;d:{e:{j=Va(k+80|0)-1|0;if((j|0)<=0){break e}while(1){if(H[(k+80|0)+l|0]!=32){break e}l=l+1|0;if((l|0)!=(j|0)){continue}break}break d}if((j|0)==(l|0)|(j|0)<0){break d}while(1){l=(k+80|0)+j|0;if(H[l|0]!=32){break d}E[l|0]=0;l=(j|0)>0;j=j-1|0;if(l){continue}break}}if(Ib(k+80|0,35090)){break b}j=dc(a,1,120080,b,i);G[i>>2]=j;if((j|0)==219){G[i>>2]=0;G[b>>2]=0;j=G[i>>2]}if(j){break c}j=dc(a,1,35460,c,i);G[i>>2]=j;if((j|0)==219){G[i>>2]=0;G[c>>2]=0;j=G[i>>2]}if(j){break c}j=dc(a,1,34443,d,i);G[i>>2]=j;if((j|0)==219){G[i>>2]=0;G[d>>2]=0;j=G[i>>2]}if(j){break c}j=dc(a,1,120096,e,i);G[i>>2]=j;if((j|0)==219){G[i>>2]=0;G[e>>2]=0;j=G[i>>2]}if(j){break c}j=dc(a,1,120128,f,i);G[i>>2]=j;if((j|0)==219){G[i>>2]=0;G[f>>2]=0;j=G[i>>2]}if(j){break c}a=dc(a,1,120112,g,i);G[i>>2]=a;if((a|0)==219){G[i>>2]=0;G[g>>2]=0;a=G[i>>2]}if(a){break c}f:{if(!(!G[d>>2]|(!G[b>>2]|!G[c>>2]))){a=G[f>>2];if(G[e>>2]){if(a){a=0;if(G[g>>2]){break f}}a=3;break f}if(a){a=11;if(G[g>>2]){break f}}a=1;break f}if(!G[e>>2]){break b}if(G[f>>2]){a=12;if(G[g>>2]){break f}}a=2}G[h>>2]=a}j=G[i>>2];if((j|0)!=237){break a}G[i>>2]=340;Ua(62951);j=G[i>>2];break a}j=340;G[i>>2]=340}Fa=k+160|0;return j}function Bq(a,b,c){var d=0,e=0,f=0,g=0;a:{b:{if(!b){if(!a){break b}G[a>>2]=0;return}if(!H[b+5008|0]){if(a){G[a>>2]=-1}G[b+5060>>2]=-1;return}d=G[b>>2];c:{if(G[d+76>>2]<0){e=G[d>>2];break c}e=G[d>>2]}if(e>>>5&1){break a}d:{if(c){break d}if(!G[b+5060>>2]){f=b+4|0;g=b+5012|0;while(1){G[b+5028>>2]=f;G[b+5032>>2]=5e3;c=-2;e:{e=G[b+5044>>2];f:{if(!e|G[e>>2]!=(g|0)){break f}d=G[e+4>>2];g:{while(1){if((d|0)!=2){h:{c=-1;switch(d-1|0){case 0:case 2:break f;case 3:break h;default:break g}}}else{c=G[b+5016>>2];d=4;G[e+4>>2]=4;G[e+12>>2]=c;continue}break}if(G[e+12>>2]!=G[b+5016>>2]){break f}if(!Eq(g)){break f}c=0;i:{if(G[e+12>>2]){break i}if(J[e+52>>2]<=255){c=0;if(G[e+56>>2]>0){break i}}c=0;if(G[e+80>>2]>2]){break i}G[e+4>>2]=1;c=1}d=G[b+5032>>2];if(d>>>0>4999){break e}d=5e3-d|0;if((hb(f,1,d,G[b>>2])|0)==(d|0)){d=G[b>>2];j:{if(G[d+76>>2]<0){d=G[d>>2];break j}d=G[d>>2]}if(!(d>>>5&1)){break e}}break a}c=0}if(a){G[a>>2]=c}G[b+5060>>2]=c;return}if(!c){continue}break}d=G[b>>2]}k:{if(G[d+76>>2]<0){c=G[d>>2];break k}c=G[d>>2]}if(c>>>5&1){break d}$a(d);c=G[b>>2];l:{if(G[c+76>>2]<0){c=G[c>>2];break l}c=G[c>>2]}if(!(c>>>5&1)){break d}break a}if(a){G[a>>2]=0}G[b+5060>>2]=0;a=G[b+5044>>2];if(!(!a|G[a>>2]!=(b+5012|0))){c=G[a+16>>2];if(c){Ja[G[b+5052>>2]](G[b+5056>>2],c)}c=G[a+20>>2];if(c){Ja[G[b+5052>>2]](G[b+5056>>2],c)}a=G[a+24>>2];if(a){Ja[G[b+5052>>2]](G[b+5056>>2],a)}Ja[G[b+5052>>2]](G[b+5056>>2],G[b+5044>>2])}Wa(b)}return}if(a){G[a>>2]=-6}G[b+5060>>2]=-6}function ko(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;g=Fa-272|0;Fa=g;Td(a,g+268|0,g+264|0,e);i=9;if(G[g+268>>2]>=9){k=g+160|1;while(1){Sd(a,i,g+160|0,e);a:{b:{if(H[g+160|0]!=84){break b}j=5;h=rb(g+80|0,k,4);f=G[h>>2];c:{d:{if((f|0)<=1330791769){if((f|0)<=1280725570){if((f|0)<=1279345490){if((f|0)==1162893652){break c}if((f|0)!=1229870403){break d}break c}if((f|0)==1279345491|(f|0)==1280070990){break c}if((f|0)!=1280262978){break d}break c}e:{switch(f-1313426756|0){case 0:case 8:break c;case 1:case 2:case 3:case 4:case 5:case 6:case 7:break d;default:break e}}if((f|0)==1280725571){break c}if((f|0)!=1297239878){break d}break c}if((f|0)<=1414484546){if((f|0)<=1348031554){if((f|0)==1330791770){break c}if((f|0)!=1347635524){break d}break c}if((f|0)==1348031555|(f|0)==1414090325){break c}if((f|0)!=1414284355){break d}break c}f:{switch(f-1480674628|0){case 0:case 8:break c;case 1:case 2:case 3:case 4:case 5:case 6:case 7:break d;default:break f}}if((f|0)==1414484547|(f|0)==1481658947){break c}}j=4;if(G[g+160>>2]!=1296647252){break b}}E[h|0]=0;f=qb(h,g+160|j,8-j|0);G[g+260>>2]=0;ue(f,g+256|0,g+260|0);if(G[g+260>>2]){break b}h=G[g+256>>2];if((h|0)<(b|0)|(c|0)<(h|0)){break b}if(!((b|0)!=(h|0)|(d|0)>0)){ig(a,i,e);G[g+268>>2]=G[g+268>>2]-1;f=i-1|0;break a}h=d+h|0;G[g+256>>2]=h;E[f|0]=0;l=f;f=g+160|0;zb(qb(l,f,j),h,g,e);G[g+160>>2]=538976288;G[g+164>>2]=538976288;rl(a,i,rb(f,g,Va(g)),e)}f=i}i=f+1|0;if((f|0)>2]){continue}break}}Fa=g+272|0}function vl(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=Fa-192|0;Fa=j;if(G[c>>2]<=0){a:{e=G[a>>2];d=G[a+4>>2];if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);d=G[a+4>>2]}e=G[d+128>>2];g=G[d+104>>2];i=e-g|0;f=G[d+108>>2];if(G[d+132>>2]==(f+(e>>>0>>0)|0)&(i|0)==80){if((Bf(a,1,0,c)|0)>0){break a}d=G[a+4>>2];g=G[d+104>>2];f=G[d+108>>2]}h=G[d+120>>2];i=G[d+124>>2];e=0;d=rb(j,b,80);E[d+80|0]=0;i=Bu(g-h|0,f-((h>>>0>g>>>0)+i|0)|0,80,0);f=Va(d);b:{if((f|0)>0){if((f|0)!=1){h=f&-2;b=0;while(1){g=d+e|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}g=(e|1)+d|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}e=e+2|0;b=b+2|0;if((h|0)!=(b|0)){continue}break}}c:{if(!(f&1)){break c}b=d+e|0;if((H[b|0]-127&255)>>>0>160){break c}E[b|0]=32}if((f|0)>79){break b}}cb(d+f|0,32,80-f|0)}b=qc(d,36178);d:{e:{if(!gc(66587,d,8)){h=8;break e}h=8;if(!gc(66546,d,8)){break e}if(!gc(68289,d,8)){break e}if(!gc(35367,d,8)){break e}h=(b|0)==80?8:b;if((h|0)<=0){break d}}e=0;while(1){f=d+e|0;b=E[f|0];E[f|0]=b-97>>>0<26?b&95:b;e=e+1|0;if((h|0)!=(e|0)){continue}break}}ve(d,c);b=0;e=G[a+4>>2];f=G[e+124>>2];g=G[e+120>>2];Jb(a,g,f,0,c);f:{if((i|0)<=0){e=d;break f}h=j+96|0;while(1){e=h;ic(a,80,0,e,c);Jb(a,g,f,0,c);h=d;Wb(a,80,0,d,c);d=g+80|0;f=d>>>0<80?f+1|0:f;g=d;d=e;b=b+1|0;if((i|0)!=(b|0)){continue}break}}Wb(a,80,0,e,c);a=G[a+4>>2];b=G[a+108>>2];c=G[a+104>>2]+80|0;b=c>>>0<80?b+1|0:b;G[a+104>>2]=c;G[a+108>>2]=b;b=G[a+124>>2];c=G[a+120>>2]+80|0;b=c>>>0<80?b+1|0:b;G[a+120>>2]=c;G[a+124>>2]=b}}Fa=j+192|0}function St(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=-1;a:{if(!a|G[a+16>>2]!=7247){break a}b:{switch(G[a+92>>2]+5|0){case 0:case 5:break b;default:break a}}if((c|0)<0){Vd(a,-2,4759);return-1}c:{d=0;d:{if(!c){break d}e:{if(!G[a+88>>2]){break e}G[a+88>>2]=0;d=G[a+84>>2];g=d;e=G[a+80>>2];if(!(d|e)){break e}while(1){f:{d=G[a>>2];if(d){f=d;d=(g|0)<=0&d>>>0>e>>>0|(g|0)<0?e:d;G[a>>2]=f-d;G[a+4>>2]=d+G[a+4>>2];f=G[a+12>>2];j=G[a+8>>2];k=j+d|0;G[a+8>>2]=k;G[a+12>>2]=j>>>0>k>>>0?f+1|0:f;f=e;e=e-d|0;g=g-(d>>>0>f>>>0)|0;break f}if(G[a+104>>2]?0:G[a+64>>2]){break e}if((zq(a)|0)!=-1){break f}d=0;break d}if(e|g){continue}break}}while(1){d=G[a>>2];g:{h:{if(d){d=c>>>0>d>>>0?d:c;bb(b,G[a+4>>2],d);G[a+4>>2]=G[a+4>>2]+d;G[a>>2]=G[a>>2]-d;break h}if(!(G[a+104>>2]|!G[a+64>>2])){G[a+68>>2]=1;d=h;break d}e=G[a+48>>2];if(!(G[a+28>>2]<<1>>>0<=c>>>0?e:0)){if((zq(a)|0)!=-1){break g}d=0;break d}d=0;if((e|0)==1){while(1){e=c-d|0;e=ql(G[a+20>>2],b+d|0,e>>>0<1073741824?e:1073741824);if((e|0)>0){d=d+e|0;if(d>>>0>>0){continue}break h}break}if((e|0)>=0){G[a+64>>2]=1;break h}b=G[48624];Vd(a,-1,I[((b>>>0>149?0:b)<<1)+143920>>1]+142088|0);d=0;break d}G[a+112>>2]=b;G[a+116>>2]=c;d=0;if((yq(a)|0)==-1){break d}d=G[a>>2];G[a>>2]=0}e=G[a+12>>2];f=d+G[a+8>>2]|0;e=f>>>0>>0?e+1|0:e;G[a+8>>2]=f;G[a+12>>2]=e;h=d+h|0;b=b+d|0;c=c-d|0}if(c){continue}break}d=h}if(d){break c}switch(G[a+92>>2]+5|0){case 0:case 5:break c;default:break a}}i=d}return i|0}function Hg(a,b,c){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;if(!G[a+84>>2]){Ua(44027);if(G[a+4>>2]==8){Ua(43975)}G[((b<<2)+a|0)+1416>>2]=0;G[c>>2]=112;return}h=G[a+64>>2];f=G[a+68>>2];m=((b<<2)+a|0)+1256|0;d=G[m>>2];g=Au(d,d>>31,2880,0);d=Ia;e=G[a+36>>2];i=G[a+32>>2];if((d|0)<=(e|0)&i>>>0>=g>>>0|(d|0)<(e|0)){if((g|0)!=(h|0)|(d|0)!=(f|0)){Ja[G[(M(G[a+4>>2],84)+1240576|0)+72>>2]](G[a>>2],g,d)|0}fi(a,2880,G[a+1252>>2]+M(b,2880)|0,c);h=g+2880|0;c=h>>>0<2880?d+1|0:d;G[a+64>>2]=h;G[a+68>>2]=c;if((g|0)==G[a+32>>2]&(d|0)==G[a+36>>2]){G[a+32>>2]=h;G[a+36>>2]=c}G[((b<<2)+a|0)+1416>>2]=0;return}if((h|0)!=(i|0)|(f|0)!=(e|0)){Ja[G[(M(G[a+4>>2],84)+1240576|0)+72>>2]](G[a>>2],i,e)|0}a:{if((b|0)==40){g=G[a+32>>2];d=G[a+36>>2];break a}g=G[a+32>>2];d=G[a+36>>2];i=a+1256|0;while(1){j=Bu(g,d,2880,0);f=G[m>>2];e=0;h=b;while(1){k=G[(e<<2)+i>>2];n=(k|0)<(f|0)&(j|0)<=(k|0);o=e|1;l=G[(o<<2)+i>>2];f=n?k:f;k=(l|0)<(f|0)&(j|0)<=(l|0);f=k?l:f;h=k?o:n?e:h;e=e+2|0;if((e|0)!=40){continue}break}f=Au(f,f>>31,2880,0);j=Ia;e=j;if(f>>>0>g>>>0&(e|0)>=(d|0)|(d|0)<(e|0)){e=0;d=Bu(f-g|0,j-(d+(g>>>0>f>>>0)|0)|0,2880,0);b:{if((d|0)<=0){break b}while(1){if(G[c>>2]){break b}fi(a,2880,196400,c);e=e+1|0;if((d|0)!=(e|0)){continue}break}}G[a+32>>2]=f;G[a+36>>2]=j}fi(a,2880,G[a+1252>>2]+M(h,2880)|0,c);G[((h<<2)+a|0)+1416>>2]=0;d=G[a+36>>2];g=G[a+32>>2]+2880|0;d=g>>>0<2880?d+1|0:d;G[a+32>>2]=g;G[a+36>>2]=d;if((b|0)!=(h|0)){continue}break}}G[a+64>>2]=g;G[a+68>>2]=d}function gl(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=N(0),m=N(0);a:{b:{if(!e){if(c==1&d==0){break a}if((b|0)<=0){break b}g=b&1;if((b|0)!=1){h=b&-2;b=0;while(1){e=k<<2;K[e+i>>2]=+K[a+e>>2]*c+d;e=e|4;K[e+i>>2]=+K[a+e>>2]*c+d;k=k+2|0;b=b+2|0;if((h|0)!=(b|0)){continue}break}}if(!g){break b}b=k<<2;K[b+i>>2]=+K[a+b>>2]*c+d;return}k=a+2|0;c:{if(!(c==1&d==0)){if((b|0)<=0){break b}m=N(d);if((e|0)!=1){break c}while(1){l=m;d:{e:{f:{e=I[k>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break e;case 1:break f;default:break d}}G[h>>2]=1;l=f;break d}l=N(+K[(j<<2)+a>>2]*c+d)}K[(j<<2)+i>>2]=l;k=k+4|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}break b}if((b|0)<=0){break b}if((e|0)==1){while(1){l=N(0);g:{h:{i:{e=I[k>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break h;case 1:break i;default:break g}}G[h>>2]=1;l=f;break g}l=K[(j<<2)+a>>2]}K[(j<<2)+i>>2]=l;k=k+4|0;j=j+1|0;if((j|0)!=(b|0)){continue}break b}}while(1){l=N(0);j:{k:{l:{e=I[k>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break k;case 1:break l;default:break j}}G[h>>2]=1;E[g+j|0]=1;l=N(-9119119840596153e-51);break j}l=K[(j<<2)+a>>2]}K[(j<<2)+i>>2]=l;k=k+4|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}break b}while(1){l=m;m:{n:{o:{e=I[k>>1]&32640;switch(((e|0)==32640?1:!e<<1)|0){case 0:break n;case 1:break o;default:break m}}G[h>>2]=1;E[g+j|0]=1;l=N(-9119119840596153e-51);break m}l=N(+K[(j<<2)+a>>2]*c+d)}K[(j<<2)+i>>2]=l;k=k+4|0;j=j+1|0;if((j|0)!=(b|0)){continue}break}}return}yd(i,a,b<<2)}function au(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-32|0;Fa=e;a:{if(!a){break a}c=ab(160);if(!c){break a}G[c+96>>2]=0;G[c+28>>2]=0;G[c+32>>2]=8192;G[c+72>>2]=-1;G[c+76>>2]=0;G[c+16>>2]=0;G[c+44>>2]=0;b:{c:{d:{d=H[b|0];e:{if(!d){break e}while(1){g=b;b=d<<24>>24;f:{if((d-48&255)>>>0<=9){G[c+72>>2]=b-48;break f}g:{switch(b-43|0){case 71:f=7247;G[c+16>>2]=7247;break f;case 76:f=31153;G[c+16>>2]=31153;break f;case 54:f=1;G[c+16>>2]=1;break f;case 58:h=1;break f;case 77:i=1;break f;case 59:G[c+76>>2]=1;break f;case 61:G[c+76>>2]=2;break f;case 39:G[c+76>>2]=3;break f;case 27:G[c+76>>2]=4;break f;case 0:break e;case 41:break g;default:break f}}j=1;G[c+44>>2]=1}b=g+1|0;d=H[g+1|0];if(d){continue}break}h:{if((f|0)!=7247){if(f){break h}break e}if(j){break e}G[c+44>>2]=1}d=Va(a)+1|0;b=ab(d);G[c+24>>2]=b;if(!b){break e}G[e+16>>2]=a;Ya(b,d,10361,e+16|0);b=0;d=G[c+16>>2];if((d|0)!=7247){b=((d|0)==31153?512:1024)|(i?193:65)}G[e>>2]=438;b=fm(a,(h?557056:32768)|b,e);G[c+20>>2]=b;if((b|0)!=-1){d=G[c+16>>2];if((d|0)==7247){break d}a=c;if((d|0)!=1){break c}Xg(b,0,0,2);G[c+16>>2]=31153;a=c;break c}Wa(G[c+24>>2])}Wa(c);d=0;break a}a=Xg(b,0,0,1);G[c>>2]=0;d=a;a=Ia;b=(d&a)==-1;G[c+56>>2]=b?0:d;G[c+60>>2]=b?0:a;if(G[c+16>>2]!=7247){break b}G[c+64>>2]=0;G[c+68>>2]=0;a=c+48|0}G[a>>2]=0}G[c+88>>2]=0;a=G[c+96>>2];if(a){if(G[c+92>>2]!=-4){Wa(a)}G[c+96>>2]=0}G[c+8>>2]=0;G[c+12>>2]=0;G[c+92>>2]=0;G[c+104>>2]=0;d=c}Fa=e+32|0;return d|0}function nf(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=Fa-16|0;Fa=i;d=G[925771];a=G[925766];if((a|0)>0){cb(d,0,a)}b=-4;a:{if(!vc(d,a,G[925769])){break a}a=G[29763];while(1){if(G[925767]){G[i>>2]=G[925771];kb(85747,i);$a(a)}d=G[925771];if((H[d|0]|32)==124){if(vc(d,G[925766],G[925769])){continue}break a}break}b=(Va(d)+d|0)-1|0;if(H[b|0]==10){E[b|0]=0}b=(Va(d)+d|0)-1|0;if(H[b|0]==13){E[b|0]=0}b=0;Za(G[925758],d);E[d+G[G[925773]+4100>>2]|0]=0;G[G[925773]+4096>>2]=d;g=G[925783];b:{if((g|0)<2){break b}a=1;e=d+1|0;c=g-1|0;h=c&1;if((g|0)!=2){j=c&-2;while(1){c=M(a,4108);E[d+G[(c+G[925773]|0)+4100>>2]|0]=0;f=c+G[925773]|0;G[f+4096>>2]=e+G[f-8>>2];f=c+4108|0;E[d+G[(f+G[925773]|0)+4100>>2]|0]=0;l=f;f=G[925773];G[(l+f|0)+4096>>2]=e+G[(c+f|0)+4100>>2];a=a+2|0;k=k+2|0;if((j|0)!=(k|0)){continue}break}}if(!h){break b}a=M(a,4108);E[d+G[(a+G[925773]|0)+4100>>2]|0]=0;a=a+G[925773]|0;G[a+4096>>2]=e+G[a-8>>2]}if((g|0)<=0){break a}c=G[925773];e=0;while(1){h=M(e,4108);b=G[(h+c|0)+4100>>2];c:{if(e){a=e-1|0;while(1){c=b+d|0;j=H[c|0];if(!b|(j?(j|0)!=32:0)|G[(G[925773]+M(a,4108)|0)+4100>>2]==(b|0)){break c}E[c|0]=0;b=b-1|0;continue}}while(1){a=b+d|0;c=H[a|0];if(!b|(c?(c|0)!=32:0)){break c}E[a|0]=0;b=b-1|0;continue}}c=G[925773];a=h+c|0;b=G[a+4096>>2];if(H[b|0]==32){a=a+4096|0;while(1){G[a>>2]=b+1;c=G[925773];b=h+c|0;a=b+4096|0;b=G[b+4096>>2];if(H[b|0]==32){continue}break}}e=e+1|0;if((g|0)>(e|0)){continue}break}b=0}Fa=i+16|0;return b}function ld(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=Fa-112|0;Fa=n;a:{if(!f&(g|0)<=0|(g|0)<0|G[i>>2]>0){break a}if(!b&(c|0)<=0|(c|0)<0){G[i>>2]=307;break a}if(!d&(e|0)<=0|(e|0)<0){G[i>>2]=308;break a}l=G[a>>2];j=G[a+4>>2];b:{if((l|0)!=G[j+76>>2]){mb(a,l+1|0,0,i);break b}j=G[j+132>>2];if((j|0)>0|(j|0)>=0){break b}Rb(a,i)}k=G[a+4>>2];p=G[k+960>>2];j=e+g|0;l=d+f|0;j=l>>>0>>0?j+1|0:j;q=G[k+964>>2];j=Bu(l-2|0,j-(l>>>0<2)|0,p,q)+b|0;m=c+Ia|0;m=b>>>0>j>>>0?m+1|0:m;o=G[k+956>>2];l=G[k+952>>2];c:{d:{if((o|0)>=(m|0)&l>>>0>=j>>>0|(m|0)<(o|0)){break d}e:{if(G[k+48>>2]){r=G[k+988>>2];if(!G[k+984>>2]&(r|0)<=0|(r|0)<0){break e}}k=j-l|0;j=m-((j>>>0>>0)+o|0)|0;if((Ig(a,l,o,k,j,i)|0)<=0){k=G[a+4>>2];j=k;p=G[j+960>>2];q=G[j+964>>2];break d}L[n>>3]=+(k>>>0)+ +(j|0)*4294967296;a=n+16|0;Ya(a,81,44181,n);Ua(a);break c}G[k+952>>2]=j;G[k+956>>2]=m;r=G[k+980>>2];s=G[k+976>>2];m=Au(j-l|0,m-((j>>>0>>0)+o|0)|0,p,q);l=s+m|0;j=Ia+r|0;G[k+976>>2]=l;G[k+980>>2]=l>>>0>>0?j+1|0:j}f:{if(G[i>>2]>0){break f}e=e+G[k+132>>2]|0;j=d+G[k+128>>2]|0;e=j>>>0>>0?e+1|0:e;c=Au(p,q,b-1|0,c-!b|0);b=c+j|0;j=Ia+e|0;j=b>>>0>>0?j+1|0:j;if(!b&(j|0)<=0|(j|0)<0){G[i>>2]=304;break f}c=G[a>>2];if((c|0)!=G[k+76>>2]){mb(a,c+1|0,0,i);k=G[a+4>>2]}c=b;b=j-!c|0;c=c-1|0;d=Du(c,b,2880,0);e=G[k+72>>2];if(!((e|0)>=0&(d|0)==G[((e<<2)+k|0)+1256>>2])){Hc(a,d,1,i)}if(G[i>>2]>0){break f}d=G[a+4>>2];G[d+56>>2]=c;G[d+60>>2]=b}Wb(a,f,g,h,i)}}Fa=n+112|0}function mb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=Fa-112|0;Fa=h;f=G[d>>2];a:{if((f|0)>0){break a}if((b|0)<=0){f=301;G[d>>2]=301;break a}e=G[a+4>>2];if(G[e+92>>2]<=(b|0)){f=ub(G[e+96>>2],(b<<3)+8008|0);if(!f){f=113;G[d>>2]=113;break a}e=G[a+4>>2];G[e+96>>2]=f;G[e+92>>2]=b+1e3}G[a>>2]=G[e+76>>2];l=b-1|0;b:{c:{d:{while(1){e=G[a+4>>2];f=G[e+76>>2];if((f+1|0)==(b|0)){break d}f=G[e+88>>2]+1|0;f=(b|0)>(f|0)?f:l;i=f<<3;g=i+G[e+96>>2]|0;k=G[g>>2];g=G[g+4>>2];j=G[e+44>>2];if(J[e+40>>2]<=k>>>0&(g|0)>=(j|0)|(g|0)>(j|0)){break b}e:{if((Xf(a,d)|0)<=0){if(G[d>>2]<=0){e=i+G[G[a+4>>2]+96>>2]|0;f:{if((Jb(a,G[e>>2],G[e+4>>2],0,d)|0)>0){break f}e=G[a+4>>2];g=G[e+76>>2];G[e+76>>2]=f;k=G[e+104>>2];j=G[e+108>>2];i=G[e+88>>2];G[a>>2]=f;G[e+88>>2]=(f|0)<(i|0)?i:f;f=G[e+44>>2];G[e+104>>2]=G[e+40>>2];G[e+108>>2]=f;if((Wf(a,c,d)|0)<=0){break f}e=G[a+4>>2];G[e+76>>2]=g;G[a>>2]=g;G[e+104>>2]=k;G[e+108>>2]=j;G[e+88>>2]=i}e=G[d>>2];if((e|0)<=0){break e}}G[h+108>>2]=0;Wf(a,c,h+108|0)}e=G[d>>2]}if((e|0)<=0){continue}break}f=107;if((e|0)==107){break a}G[h>>2]=b;a=h+16|0;Ya(a,81,47827,h);tb(5,a);break c}if(!c|G[d>>2]>0){break c}b=G[a>>2];if(b|!!(G[e+104>>2]|G[e+108>>2])){g:{if((b|0)!=(f|0)){mb(a,b+1|0,0,d);break g}if((G[e+128>>2]&G[e+132>>2])!=-1){break g}if((Rb(a,d)|0)>0){break c}}a=G[a+4>>2];b=G[a+80>>2];G[c>>2]=b;a=G[a+1088>>2]?0:b}else{a=0}G[c>>2]=a}f=G[d>>2];break a}f=107;G[d>>2]=107}Fa=h+112|0;return f|0}function Gs(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;var h=0,i=0,j=0,k=0,l=0,m=0;i=M(c,168);b=i+G[a+8>>2]|0;L[b+8>>3]=G[a+44>>2];h=G[a+48>>2];L[b+16>>3]=h|0;l=lb(h+1|0,4);G[b+24>>2]=l;Pf(a,c,d,e);b=i+G[a+8>>2]|0;f=L[b+16>>3];g=L[b+8>>3];a:{if(O(g)<2147483648){i=~~g;break a}i=-2147483648}if(f>=+(i|0)){m=M(c,168);while(1){b=G[a+48>>2];c=G[a+44>>2];h=G[a+36>>2];k=lb(1,8);G[k+4>>2]=h;b:{if(!l){break b}c=(c|0)>(i|0)?c:i;j=((b|0)>(c|0)?c:b)<<2;b=j+l|0;c=G[b>>2];c:{if(!c){c=0;break c}if((h|0)>2]){break c}while(1){b=c;c=G[b>>2];if(!c){c=0;break c}if((h|0)>G[c+4>>2]){continue}break}}G[k>>2]=c;G[b>>2]=k;if((e|0)==1){break b}b=j+G[a+56>>2]|0;if(d){if((h|0)<=G[b>>2]){G[b>>2]=h}b=j+G[a+60>>2]|0;if((h|0)>2]){break b}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(h|0)?b:h;break b}G[b>>2]=h;G[j+G[a+60>>2]>>2]=G[a+40>>2]}b=G[a+48>>2];c=G[a+44>>2];h=G[a+40>>2];k=lb(1,8);G[k+4>>2]=h;d:{if(!l){break d}c=(c|0)>(i|0)?c:i;j=((b|0)>(c|0)?c:b)<<2;b=j+l|0;c=G[b>>2];e:{if(!c){c=0;break e}if((h|0)>2]){break e}while(1){b=c;c=G[b>>2];if(!c){c=0;break e}if((h|0)>G[c+4>>2]){continue}break}}G[k>>2]=c;G[b>>2]=k;if((e|0)==1){break d}if(d){b=j+G[a+56>>2]|0;if((h|0)<=G[b>>2]){c=b;b=G[a+36>>2];G[c>>2]=(b|0)>(h|0)?b:h}b=j+G[a+60>>2]|0;if((h|0)>2]){break d}c=b;b=G[a+40>>2];G[c>>2]=(b|0)<(h|0)?b:h;break d}G[j+G[a+56>>2]>>2]=G[a+36>>2];G[j+G[a+60>>2]>>2]=G[a+40>>2]}i=i+1|0;if(L[(G[a+8>>2]+m|0)+16>>3]>=+(i|0)){continue}break}}}function kp(a){var b=0,c=0,d=0;c=-2;a:{if(!G[a+36>>2]|(!a|!G[a+32>>2])){break a}b=G[a+28>>2];if(!b|G[b>>2]!=(a|0)){break a}b:{c:{d=G[b+4>>2];switch(d-57|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:break a;case 0:case 12:case 16:case 34:case 46:case 56:break b;default:break c}}if((d|0)==666){break b}if((d|0)!=42){break a}}G[a+44>>2]=2;G[a+8>>2]=0;G[a+20>>2]=0;G[a+24>>2]=0;G[b+20>>2]=0;G[b+16>>2]=G[b+8>>2];c=G[b+24>>2];if((c|0)<0){c=0-c|0;G[b+24>>2]=c}d=c?42:113;c=(c|0)==2;G[b+4>>2]=c?57:d;d:{if(c){c=Oc(0,0,0);break d}c=gf(0,0,0)}G[a+48>>2]=c;c=0;G[b+40>>2]=0;G[b+5820>>2]=0;F[b+5816>>1]=0;G[b+2872>>2]=116504;G[b+2864>>2]=b+2684;G[b+2860>>2]=116484;G[b+2852>>2]=b+2440;G[b+2848>>2]=116464;G[b+2840>>2]=b+148;np(b)}if(!c){a=G[a+28>>2];G[a+60>>2]=G[a+44>>2]<<1;b=G[a+68>>2];d=(G[a+76>>2]<<1)-2|0;F[b+d>>1]=0;cb(b,0,d);G[a+5812>>2]=0;G[a+116>>2]=0;G[a+120>>2]=2;G[a+104>>2]=0;G[a+108>>2]=0;G[a+92>>2]=0;G[a+96>>2]=2;G[a+72>>2]=0;b=M(G[a+132>>2],12);G[a+144>>2]=I[b+118436>>1];G[a+140>>2]=I[b+118432>>1];G[a+128>>2]=I[b+118434>>1];G[a+124>>2]=I[b+118438>>1]}return c}function Jh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=Fa-2016|0;Fa=i;f=ab(5001);E[f|0]=0;e=5e3;while(1){a:{b:{c:{d=H[a|0];if((d|0)!=36){if(!d){break c}E[i+2015|0]=0;E[i+2014|0]=d;h=(Va(i+2014|0)+h|0)+1|0;if((h|0)>=(e|0)){while(1){e=e+5e3|0;f=ub(f,e);if((e|0)<=(h|0)){continue}break}}f=Gb(f,i+2014|0);a=a+1|0;continue}g=H[a+1|0];if((g|0)==123){d=125}else{if((g|0)!=40){break b}d=41}g=H[a+2|0];k=0;E[i+1008|0]=0;j=a+2|0;if(!g){break a}while(1){l=g<<24>>24;if((l|0)==(d|0)){j=j+1|0;break a}if(!(l-48>>>0<10|(l|32)-97>>>0<26|(g|0)==95)){break a}l=i+1008|0;E[l+k|0]=g;k=k+1|0;E[l+k|0]=0;g=H[j+1|0];j=j+1|0;if(g){continue}break}break a}E[f+h|0]=0;a=ub(f,h+1|0);Fa=i+2016|0;return a}k=0;E[i+1008|0]=0;j=a+1|0;if(!g){break a}while(1){d=g<<24>>24;if(!(d-48>>>0<10|(d|32)-97>>>0<26|(g|0)==95)){break a}d=i+1008|0;E[d+k|0]=g;k=k+1|0;E[d+k|0]=0;g=H[j+1|0];j=j+1|0;if(g){continue}break}}g=j-1|0;d:{e:{if(!b){break e}d=Ja[b|0](i+1008|0,c)|0;if(!d){break e}if(!H[d|0]){break d}h=(Va(d)+h|0)+1|0;if((h|0)>=(e|0)){while(1){e=e+5e3|0;f=ub(f,e);if((e|0)<=(h|0)){continue}break}}f=Gb(f,d);break d}d=Fd(i+1008|0);if(d){if(!H[d|0]){break d}h=(Va(d)+h|0)+1|0;if((h|0)>=(e|0)){while(1){e=e+5e3|0;f=ub(f,e);if((e|0)<=(h|0)){continue}break}}f=Gb(f,d);break d}d=(g-a|0)+1|0;a=rb(i,a,d);E[a+d|0]=0;if(!H[a|0]){break d}h=(Va(a)+h|0)+1|0;if((h|0)>=(e|0)){while(1){e=e+5e3|0;f=ub(f,e);if((e|0)<=(h|0)){continue}break}}f=Gb(f,a)}a=g+1|0;continue}}function mu(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=N(e);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;j=Fa-65568|0;Fa=j;h=ab(40);G[h>>2]=0;E[j+16|0]=0;n=We(1285568,1,h,4);o=Z()|0;a:{b:while(1){h=3809712;c:{if(i){break c}G[321387]=0;ta(155,a|0,b|0,c|0,d|0,j+65564|0,j+65560|0,+e,f|0,g|0);i=G[321387];G[321387]=0;h=-1;d:{if(!i){break d}k=G[321388];if(!k){break d}h=Ab(G[i>>2],n,o);if(!h){break a}_(k|0)}i=Z()|0;if((h|0)==1){continue}G[321387]=0;L[j>>3]=K[j+65564>>2];L[j+8>>3]=K[j+65560>>2];$(156,j+16|0,65535,19686,j|0)|0;i=G[321387];G[321387]=0;h=-1;e:{if(!i){break e}k=G[321388];if(!k){break e}h=Ab(G[i>>2],n,o);if(!h){break a}_(k|0)}i=Z()|0;if((h|0)==1){continue}l=j+16|0;h=3809712;m=H[j+16|0];if(!m){break c}while(1){G[321387]=0;i=G[321387];G[321387]=0;h=-1;f:{if(!i){break f}k=G[321388];if(!k){break f}h=Ab(G[i>>2],n,o);if(!h){break a}_(k|0)}i=Z()|0;if((h|0)==1){continue b}h=m<<24>>24;if(!((h|0)==32|h-9>>>0<5)){h=3809712;while(1){E[h|0]=m;h=h+1|0;m=H[l+1|0];l=l+1|0;if(m){continue}break}break c}m=H[l+1|0];h=3809712;l=l+1|0;if(m){continue}break}}E[h|0]=0;l=h-3809712|0;g:{if(!l){break g}while(1){m=-1;h=h-1|0;p=E[h|0];G[321387]=0;i=G[321387];G[321387]=0;h:{if(!i){break h}k=G[321388];if(!k){break h}m=Ab(G[i>>2],n,o);if(!m){break a}_(k|0)}i=Z()|0;if((m|0)==1){continue b}if(!((p|0)==32|p-9>>>0<5)){break g}E[h|0]=0;l=l-1|0;if(l){continue}break}}break}Wa(n);Fa=j+65568|0;return 3809712}Wa(n);Ve(i,k);W()}function Ig(a,b,c,d,e,f){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;m=Fa-16|0;Fa=m;h=G[f>>2];a:{if((h|0)>0){break a}b:{g=G[a>>2];j=G[a+4>>2];c:{d:{if((g|0)!=G[j+76>>2]){mb(a,g+1|0,0,f);break d}if((G[j+128>>2]&G[j+132>>2])!=-1){break d}if((Rb(a,f)|0)>0){break c}}h=G[a+4>>2];if(!G[h+80>>2]){Ua(49227);h=235;G[f>>2]=235;break a}if((e|0)<0){h=306;G[f>>2]=306;break a}if(!(d|e)){break c}p=G[h+952>>2];r=G[h+956>>2];j=r;if(p>>>0>>0&(j|0)<=(c|0)|(c|0)>(j|0)){Ua(49285);break b}if((c|0)<0){Ua(49355);break b}k=G[h+960>>2];s=G[h+964>>2];j=Au(k,s,d,e);i=Ia;q=i;n=G[h+976>>2];o=n+G[h+984>>2]|0;g=G[h+988>>2]+G[h+980>>2]|0;g=o>>>0>>0?g+1|0:g;n=g;l=o+2879|0;g=l>>>0<2879?g+1|0:g;g=Cu(l,g);l=Ia;t=0-(l+(g>>>0>2879)|0)|0;if(2879-g>>>0>>0&(t|0)<=(i|0)|(i|0)>(t|0)){i=q+l|0;h=g+j|0;i=h>>>0>>0?i+1|0:i;Bf(a,Bu(h,i,2880,0),1,f);h=G[a+4>>2]}b=Au(b,c,k,s);i=G[h+128>>2];g=b+i|0;k=Ia;c=k+G[h+132>>2]|0;Ci(a,g,g>>>0>>0?c+1|0:c,o-b|0,n-((b>>>0>o>>>0)+k|0)|0,j,q,f);b=G[a+4>>2];i=q+G[b+980>>2]|0;c=j+G[b+976>>2]|0;i=c>>>0>>0?i+1|0:i;G[b+976>>2]=c;G[b+980>>2]=i;G[m+12>>2]=0;Ad(a,34350,c,i,65398,m+12|0);g=e+r|0;b=d+p|0;g=b>>>0

>>0?g+1|0:g;Ad(a,40853,b,g,65398,f);a=G[a+4>>2];c=e+G[a+956>>2]|0;b=d+G[a+952>>2]|0;c=b>>>0>>0?c+1|0:c;G[a+952>>2]=b;G[a+956>>2]=c;b=e+G[a+948>>2]|0;c=d+G[a+944>>2]|0;b=c>>>0>>0?b+1|0:b;G[a+944>>2]=c;G[a+948>>2]=b}h=G[f>>2];break a}h=307;G[f>>2]=307}Fa=m+16|0;return h}function di(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(!a|!b|(!H[a|0]|!H[b|0])){break a}i=le(a);E[d|0]=0;b:{if(!H[i|0]){break b}a=i;c:{d:{while(1){h=Sb(a,b);if(!h){break b}e:{f:{g:{if((h|0)==(i|0)){break g}a=H[h-1|0];if((a|0)==91){break g}if((a|0)!=44){break f}}e=Va(b)+h|0;while(1){a=e;e=a+1|0;g=E[a|0];if((g|0)==32|g-9>>>0<5){continue}break}if((g|0)!=61){break f}while(1){b=a;a=a+1|0;g=E[b+1|0];e=g;if((e|0)==32|e-9>>>0<5){continue}break}e=g&255;f=e-34|0;if(f>>>0>6|!(1<>>0<=i>>>0){break n}a=h-1|0;if(H[a|0]!=44){break n}h=a;break m}e=(H[e|0]==44)+e|0}yd(h,e,Va(e)+1|0)}Wa(i);if(f|!c){break a}a=Fd(c);if(!a){return 0}f=Va(rb(d,a,1023))}return f} -function Mf(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-272|0;Fa=e;h=c<0;c=Yc(h?-c:c,360);c=h?-c:c;c=c<=-180?c+360:c;g=c<0;c=g?-c:c;a:{if(O(c)<2147483648){h=~~c;break a}h=-2147483648}c=(c-+(h|0))*60;b:{if(O(c)<2147483648){f=~~c;break b}f=-2147483648}c=(c-+(f|0))*60;g=g?45:43;c:{if((d|0)>=6){d=c>59.999999;L[e+16>>3]=d?0:c;G[e>>2]=g;f=d+f|0;d=(f|0)>59;G[e+8>>2]=d?0:f;G[e+4>>2]=d+h;Eb(e+208|0,18799,e);break c}if((d|0)==5){d=c>59.99999;L[e+48>>3]=d?0:c;G[e+32>>2]=g;f=d+f|0;d=(f|0)>59;G[e+40>>2]=d?0:f;G[e+36>>2]=d+h;Eb(e+208|0,18903,e+32|0);break c}if((d|0)>=4){d=c>59.9999;L[e+80>>3]=d?0:c;G[e+64>>2]=g;f=d+f|0;d=(f|0)>59;G[e+72>>2]=d?0:f;G[e+68>>2]=d+h;Eb(e+208|0,18930,e- -64|0);break c}if((d|0)==3){d=c>59.999;L[e+112>>3]=d?0:c;G[e+96>>2]=g;f=d+f|0;d=(f|0)>59;G[e+104>>2]=d?0:f;G[e+100>>2]=d+h;Eb(e+208|0,19117,e+96|0);break c}if((d|0)>=2){d=c>59.99;L[e+144>>3]=d?0:c;G[e+128>>2]=g;f=d+f|0;d=(f|0)>59;G[e+136>>2]=d?0:f;G[e+132>>2]=d+h;Eb(e+208|0,19258,e+128|0);break c}if((d|0)==1){d=c>59.9;L[e+176>>3]=d?0:c;G[e+160>>2]=g;f=d+f|0;d=(f|0)>59;G[e+168>>2]=d?0:f;G[e+164>>2]=d+h;Eb(e+208|0,19277,e+160|0);break c}G[e+192>>2]=g;c=c+.5;d:{if(O(c)<2147483648){g=~~c;break d}g=-2147483648}d=g;d=(d|0)>59;G[e+204>>2]=d?0:g;f=d+f|0;d=(f|0)>59;G[e+200>>2]=d?0:f;G[e+196>>2]=d+h;db(e+208|0,29791,e+192|0)}b=b-1|0;e:{if((Va(e+208|0)|0)<(b|0)){Za(a,e+208|0);break e}i=rb(a,e+208|0,b)+b|0,j=0,E[i|0]=j}Fa=e+272|0}function fs(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;p=Fa-16|0;Fa=p;G[p+12>>2]=h;a:{j=G[a+8>>2];k=(G[a>>2]+M(c,3)|0)-2|0;n=M(k,168);e=j+n|0;if(G[e+32>>2]){break a}o=lb(1e3,8);G[e+32>>2]=o;h=0;G[e+28>>2]=0;l=1e3;while(1){if((h|0)>=(l|0)){l=l+1e3|0;e=ub(o,l<<3);j=G[a+8>>2];G[(n+j|0)+32>>2]=e}e=G[p+12>>2]+7&-8;G[p+12>>2]=e+8;i=j+n|0;o=G[i+32>>2];h=G[i+28>>2];m=L[e>>3];L[o+(h<<3)>>3]=m;b:{if(!(O(m+-9007199254740992)<=1e-15)){break b}e=h-1|0;if(!(O(L[(e<<3)+o>>3]+-9007199254740992)<=1e-15)){break b}G[i+28>>2]=e;h=M(k,168);e=h+G[a+8>>2]|0;e=ub(G[e+32>>2],G[e+28>>2]<<3);j=G[a+8>>2];G[(h+j|0)+32>>2]=e;break a}h=h+1|0;G[i+28>>2]=h;continue}}c:{d:{n=G[(j+n|0)+28>>2];if((n|0)<=0){break d}if(O(g)<2147483648){k=~~g}else{k=-2147483648}e=0;e:{if(!d){l=k<<2;h=0;while(1){i=M(c+h|0,168)+j|0;k=G[l+G[i+24>>2]>>2];if(!k){break e}m=L[i+8>>3];f:{if(O(m)<2147483648){i=~~m;break f}i=-2147483648}if(+(i|0)!=g|+G[k+4>>2]!=f){break e}h=h+1|0;e=e+2|0;if((n|0)>(e|0)){continue}break}break d}h=0;while(1){i=M(c+h|0,168)+j|0;m=L[i+8>>3];if(!(m>g|L[i+16>>3]>2]+(k<<2)>>2];q=!i;if(O(m)<2147483648){l=~~m}else{l=-2147483648}if(!(q|+(l|0)!=g)){o=+G[i+4>>2]==f}if((d|0)==(o|0)){break e}}h=h+1|0;e=e+2|0;if((n|0)>(e|0)){continue}break}break d}e=1;if(!d){break c}b=b+h|0;if(!b){break c}G[a+12>>2]=b;break c}e=0}Fa=p+16|0;return e|0}function Fg(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;l=Fa-160|0;Fa=l;G[d>>2]=0;G[e>>2]=1;f=rb(l+80|0,a,71);h=rb(l,b,71);E[f+70|0]=0;E[h+70|0]=0;b=Va(f)-1|0;a:{if((b|0)<0){break a}while(1){a=b+f|0;if(H[a|0]!=32){break a}E[a|0]=0;b=b-1|0;if((b|0)>=0){continue}break}}b=Va(h)-1|0;b:{if((b|0)<0){break b}while(1){a=b+h|0;if(H[a|0]!=32){break b}E[a|0]=0;b=b-1|0;if((b|0)>=0){continue}break}}c:{if(c){break c}c=Va(f);if(c){b=0;while(1){i=b+f|0;a=E[i|0];E[i|0]=a-97>>>0<26?a&95:a;b=b+1|0;if((c|0)!=(b|0)){continue}break}}c=Va(h);if(!c){break c}b=0;while(1){i=b+h|0;a=E[i|0];E[i|0]=a-97>>>0<26?a&95:a;b=b+1|0;if((c|0)!=(b|0)){continue}break}}d:{e:{g=H[f|0];if((g|0)==H[h|0]){if(!Xa(f,h)){break e}}G[e>>2]=0;b=0;e=0;while(1){c=H[b+h|0];f:{if(!g){if(!(c&255)){break e}if(!m){break d}g=H[e+f|0];a=k+1|0;c=H[h+a|0];i=e;break f}if(c&255){i=j;a=b;break f}if(H[(f+j|0)+1|0]|(g|0)!=42){break d}break e}g:{h:{if((g|0)!=63){n=c&255;if((n|0)!=(g|0)){break h}}j=i+1|0;b=a+1|0;break g}if(!((g|0)!=35|(c<<24>>24)-48>>>0>9)){b=a;while(1){b=b+1|0;if(E[h+b|0]-48>>>0<10){continue}break}j=i+1|0;break g}if((g|0)==42){j=i+1|0;if((H[j+f|0]|32)==32){break e}b=a;if(!n){break d}while(1){i:{e=H[f+j|0];k=c&255;g=(e|0)==(k|0);j=g+j|0;b=b+1|0;c=H[h+b|0];if(!c){break i}if((e|0)!=(k|0)){continue}}break}m=1;e=i;k=a;if(g){break g}break d}if(!m){break d}m=1;b=k+1|0;j=e}g=H[f+j|0];continue}}G[d>>2]=1}Fa=l+160|0}function vo(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;i=Fa-16|0;Fa=i;G[i+12>>2]=0;e=G[c>>2];if((e|0)<=0){e=G[a>>2];f=G[a+4>>2];if((e|0)!=G[f+76>>2]){mb(a,e+1|0,0,c);f=G[a+4>>2];e=G[f+76>>2]}a:{b:{if(!e){G[f+120>>2]=0;G[f+124>>2]=0;G[f+104>>2]=0;G[f+108>>2]=0;d=Fa-160|0;Fa=d;Yi(a,8,0,d,c);Fa=d+160|0;d=G[a+4>>2];e=(G[d+76>>2]<<3)+G[d+96>>2]|0;f=G[e+8>>2];e=Bu(f-2880|0,G[e+12>>2]-(f>>>0<2880)|0,2880,0);if((e|0)>0){if((oh(a,e,c)|0)>0){break a}d=G[a+4>>2]}G[d+128>>2]=-1;G[d+132>>2]=-1;Rb(a,c);break b}d=G[f+96>>2]+(e<<3)|0;e=G[d+8>>2];f=G[d>>2];if((oh(a,Bu(e-f|0,G[d+12>>2]-(G[d+4>>2]+(e>>>0>>0)|0)|0,2880,0),c)|0)>0){break a}l=G[a+4>>2];j=G[l+88>>2];d=G[l+76>>2];c:{if((j|0)<=(d|0)){f=G[l+96>>2];break c}e=d+1|0;f=G[l+96>>2];g=j-d&3;if(g){while(1){h=(e<<3)+f|0;e=e+1|0;k=(e<<3)+f|0;n=G[k+4>>2];G[h>>2]=G[k>>2];G[h+4>>2]=n;m=m+1|0;if((g|0)!=(m|0)){continue}break}}if((d^-1)+j>>>0<3){break c}while(1){d=(e<<3)+f|0;g=G[d+12>>2];h=G[d+8>>2];G[d>>2]=h;G[d+4>>2]=g;g=G[d+20>>2];G[d+8>>2]=G[d+16>>2];G[d+12>>2]=g;h=e+3|0;g=(h<<3)+f|0;k=G[g+4>>2];G[d+16>>2]=G[g>>2];G[d+20>>2]=k;e=e+4|0;d=(e<<3)+f|0;k=G[d+4>>2];G[g>>2]=G[d>>2];G[g+4>>2]=k;if((j|0)!=(h|0)){continue}break}}d=(j<<3)+f|0;G[d+8>>2]=0;G[d+12>>2]=0;G[l+88>>2]=j-1;if((Wf(a,i+12|0,c)|0)<=0){break b}G[c>>2]=0;df();Zn(a,G[G[a+4>>2]+76>>2]-1|0,i+12|0,c)}if(!b){break a}G[b>>2]=G[i+12>>2]}e=G[c>>2]}Fa=i+16|0;return e}function nk(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(G[d>>2]<=0){a:{h=G[a>>2];i=G[a+4>>2];b:{if((h|0)!=G[i+76>>2]){mb(a,h+1|0,0,d);break b}if((G[i+128>>2]&G[i+132>>2])!=-1){break b}if((Rb(a,d)|0)>0){break a}}i=G[a+4>>2];if(!G[i+80>>2]){a=G[i+136>>2];g=(a|0)<(b|0)?a:b;if((g|0)<=0){break a}h=0;a=0;if(g-1>>>0>=3){j=g&-4;b=i+144|0;while(1){e=a<<3;d=e+c|0;f=b+e|0;k=G[f+4>>2];G[d>>2]=G[f>>2];G[d+4>>2]=k;d=e|8;f=d+c|0;d=b+d|0;k=G[d+4>>2];G[f>>2]=G[d>>2];G[f+4>>2]=k;d=e|16;f=d+c|0;d=b+d|0;k=G[d+4>>2];G[f>>2]=G[d>>2];G[f+4>>2]=k;e=e|24;d=e+c|0;e=b+e|0;f=G[e+4>>2];G[d>>2]=G[e>>2];G[d+4>>2]=f;a=a+4|0;l=l+4|0;if((j|0)!=(l|0)){continue}break}}b=g&3;if(!b){break a}while(1){e=a<<3;g=e+c|0;e=e+i|0;j=G[e+148>>2];G[g>>2]=G[e+144>>2];G[g+4>>2]=j;a=a+1|0;h=h+1|0;if((b|0)!=(h|0)){continue}break}break a}if(G[i+1088>>2]){a=G[i+1108>>2];g=(a|0)<(b|0)?a:b;if((g|0)<=0){break a}b=0;a=0;if(g-1>>>0>=3){j=g&-4;e=i+1112|0;h=0;while(1){d=(a<<3)+c|0;f=G[e+(a<<2)>>2];G[d>>2]=f;G[d+4>>2]=f>>31;d=a|1;f=(d<<3)+c|0;d=G[e+(d<<2)>>2];G[f>>2]=d;G[f+4>>2]=d>>31;d=a|2;f=(d<<3)+c|0;d=G[e+(d<<2)>>2];G[f>>2]=d;G[f+4>>2]=d>>31;d=a|3;f=(d<<3)+c|0;d=G[e+(d<<2)>>2];G[f>>2]=d;G[f+4>>2]=d>>31;a=a+4|0;h=h+4|0;if((j|0)!=(h|0)){continue}break}}h=g&3;if(!h){break a}while(1){e=(a<<3)+c|0;g=G[(i+(a<<2)|0)+1112>>2];G[e>>2]=g;G[e+4>>2]=g>>31;a=a+1|0;b=b+1|0;if((h|0)!=(b|0)){continue}break}break a}G[d>>2]=233}}}function lk(a,b,c){var d=0,e=0,f=0;d=Fa-208|0;Fa=d;a:{if(G[c>>2]>0){break a}if(!H[a|0]){G[c>>2]=204;break a}Yn(a,d+207|0,b,d+12|0,d+112|0,d,c);e=403;b:{c:{d:{e:{f:{switch(H[d+207|0]-67|0){case 0:if((me(d+112|0,d,c)|0)>0){break d}e=412;f=L[d>>3];if(f>2147483647|f<-2147483648){break c}e=~~f;if(O(f)<2147483648){break e}e=-2147483648;break e;case 3:e=412;f=L[d>>3];if(f>2147483647|f<-2147483648){break c}e=~~f;if(O(f)<2147483648){break e}e=-2147483648;break e;case 21:break c;case 9:break f;default:break d}}e=G[d+12>>2]}G[b>>2]=e}if(G[c>>2]>0){break b}break a}G[c>>2]=e}G[b>>2]=0;E[d- -64|0]=H[67192];b=H[67188]|H[67189]<<8|(H[67190]<<16|H[67191]<<24);G[d+56>>2]=H[67184]|H[67185]<<8|(H[67186]<<16|H[67187]<<24);G[d+60>>2]=b;b=H[67180]|H[67181]<<8|(H[67182]<<16|H[67183]<<24);G[d+48>>2]=H[67176]|H[67177]<<8|(H[67178]<<16|H[67179]<<24);G[d+52>>2]=b;b=H[67172]|H[67173]<<8|(H[67174]<<16|H[67175]<<24);G[d+40>>2]=H[67168]|H[67169]<<8|(H[67170]<<16|H[67171]<<24);G[d+44>>2]=b;b=H[67164]|H[67165]<<8|(H[67166]<<16|H[67167]<<24);G[d+32>>2]=H[67160]|H[67161]<<8|(H[67162]<<16|H[67163]<<24);G[d+36>>2]=b;b=H[67156]|H[67157]<<8|(H[67158]<<16|H[67159]<<24);G[d+24>>2]=H[67152]|H[67153]<<8|(H[67154]<<16|H[67155]<<24);G[d+28>>2]=b;b=H[67148]|H[67149]<<8|(H[67150]<<16|H[67151]<<24);G[d+16>>2]=H[67144]|H[67145]<<8|(H[67146]<<16|H[67147]<<24);G[d+20>>2]=b;tb(5,qb(d+16|0,a,30))}Fa=d+208|0}function ci(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=Fa-2032|0;Fa=f;E[f+2022|0]=91;E[f+2023|0]=0;E[f+2020|0]=93;E[f+2021|0]=0;e=Za(f+2e3|0,b);h=ug(e,f+2022|0);if(h){E[h|0]=0}a:{b:{c:{while(1){b=a+c|0;if(!H[b|0]){d=c;break c}d=1;g=a+c|0;b=g+1|0;if(!H[b|0]){break c}b=g+2|0;if(!H[b|0]){break c}b=g+3|0;if(!H[b|0]){break c}b=g+4|0;if(!H[b|0]){break c}c=c+5|0;if((c|0)!=57600){continue}break}b=a+57600|0;g=Va(e);break b}g=Va(e);if(d){break b}d=0;break a}c=a;while(1){d=0;c=ec(c,e,b-c|0);if(!c){break a}i=H[c-1|0];d:{j=H[c+g|0];if((j|0)!=61&(j-33&255)>>>0<94){break d}if((a|0)!=(c|0)){if((i|0)!=9&(i|0)!=32){break d}a=c}b=a+g|0;e:{while(1){a=H[b|0];if((a|0)==32|(a|0)==61){b=b+1|0;continue}else{f:{a=cb(f,0,2e3);c=H[b|0];if((c|0)==34){break f}while(1){e=c&255;if((e|0)==9|(e|0)==32|(c<<24>>24<=0|d>>>0>1999)){break e}E[a+d|0]=c;d=d+1|0;c=H[b+1|0];b=b+1|0;continue}}}break}c=H[b+1|0];if(!c){break e}d=b+1|0;b=0;while(1){if((c&255)==34|b>>>0>1999){break e}E[a+b|0]=c;b=b+1|0;c=H[d+1|0];d=d+1|0;if(c){continue}break}}g:{if(!h){c=a;break g}d=1283200;b=h+1|0;c=ug(b,a+2020|0);if(!c){break a}E[c|0]=0;e=_b(b);if((e|0)<=0){break a}E[a+2026|0]=0;E[a+2024|0]=32;E[a+2025|0]=44;b=1;c=pc(a,a+2024|0);if((e|0)!=1){while(1){c=pc(0,a+2024|0);b=b+1|0;if((e|0)!=(b|0)){continue}break}}if(!c){break a}}d=1283200;Za(1283200,c);break a}c=c+1|0;if(c>>>0>>0){continue}break}}Fa=f+2032|0;return d}function Ik(a,b){var 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;h=b-1|0;m=(h|0)/2|0;a:{if((b|0)<2){break a}while(1){b=k+1|0;if((h|0)==(b|0)){b=(k<<3)+a|0;e=G[b>>2];d=(h<<3)+a|0;h=G[d>>2];f=G[b+4>>2];c=G[d+4>>2];if((f|0)<=(c|0)&e>>>0<=h>>>0|(c|0)>(f|0)){break a}G[b>>2]=h;G[b+4>>2]=c;G[d>>2]=e;G[d+4>>2]=f;break a}g=((h+k|0)/2<<3)+a|0;d=g;e=G[d>>2];i=(h<<3)+a|0;c=i;f=G[c>>2];d=G[d+4>>2];c=G[c+4>>2];b:{if((d|0)<=(c|0)&e>>>0<=f>>>0|(c|0)>(d|0)){e=f;d=c;break b}G[g>>2]=f;G[g+4>>2]=c;G[i>>2]=e;G[i+4>>2]=d}f=(k<<3)+a|0;j=G[f>>2];c=G[f+4>>2];if(j>>>0>e>>>0&(c|0)>=(d|0)|(c|0)>(d|0)){G[f>>2]=e;G[f+4>>2]=d;G[i>>2]=j;G[i+4>>2]=c;j=G[f>>2];c=G[f+4>>2]}e=G[g>>2];d=G[g+4>>2];if(e>>>0>j>>>0&(d|0)>=(c|0)|(c|0)<(d|0)){G[g>>2]=j;G[g+4>>2]=c;G[f>>2]=e;G[f+4>>2]=d;e=G[g>>2];d=G[g+4>>2]}c=(b<<3)+a|0;i=G[c+4>>2];G[g>>2]=G[c>>2];G[g+4>>2]=i;G[c>>2]=e;G[c+4>>2]=d;d=h;while(1){i=G[f>>2];c=G[f+4>>2];while(1){b=b+1|0;j=(b<<3)+a|0;e=j;o=G[e>>2];p=G[e+4>>2];e=p;if(o>>>0>>0&(e|0)<=(c|0)|(c|0)>(e|0)){continue}break}while(1){e=d;d=d-1|0;g=(d<<3)+a|0;n=G[g>>2];l=G[g+4>>2];if(i>>>0>>0&(c|0)<=(l|0)|(c|0)<(l|0)){continue}break}if((b|0)<(e|0)){G[j>>2]=n;G[j+4>>2]=l;G[g>>2]=o;G[g+4>>2]=p;continue}break}G[f>>2]=n;G[f+4>>2]=l;G[g>>2]=i;G[g+4>>2]=c;h=(e|0)>(m|0)?e-2|0:h;k=(d|0)>(m|0)?k:b;if((h|0)>(k|0)){continue}break}}a=(m<<3)+a|0;b=G[a>>2];Ia=G[a+4>>2];return b}function wi(a,b,c){var d=0,e=0;d=Fa-192|0;Fa=d;a:{if(G[c>>2]>0){break a}b:{c:{d:{e:{f:{g:{e=H[a|0];switch(e-39|0){case 1:break e;case 0:break f;default:break g}}h:{switch(e-70|0){default:if(e){break d}G[c>>2]=204;break a;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break d;case 0:case 14:break h}}L[b>>3]=(e|0)==84?1:0;break c}e=d+96|0;fd(a,e,c);me(e,b,c);break c}G[c>>2]=406;break b}me(a,b,c)}if(G[c>>2]<=0){break a}}G[b>>2]=0;G[b+4>>2]=0;b=H[67592]|H[67593]<<8|(H[67594]<<16|H[67595]<<24);c=H[67588]|H[67589]<<8|(H[67590]<<16|H[67591]<<24);E[d+39|0]=c;E[d+40|0]=c>>>8;E[d+41|0]=c>>>16;E[d+42|0]=c>>>24;E[d+43|0]=b;E[d+44|0]=b>>>8;E[d+45|0]=b>>>16;E[d+46|0]=b>>>24;b=H[67585]|H[67586]<<8|(H[67587]<<16|H[67588]<<24);G[d+32>>2]=H[67581]|H[67582]<<8|(H[67583]<<16|H[67584]<<24);G[d+36>>2]=b;b=H[67577]|H[67578]<<8|(H[67579]<<16|H[67580]<<24);G[d+24>>2]=H[67573]|H[67574]<<8|(H[67575]<<16|H[67576]<<24);G[d+28>>2]=b;b=H[67569]|H[67570]<<8|(H[67571]<<16|H[67572]<<24);G[d+16>>2]=H[67565]|H[67566]<<8|(H[67567]<<16|H[67568]<<24);G[d+20>>2]=b;b=H[67561]|H[67562]<<8|(H[67563]<<16|H[67564]<<24);G[d+8>>2]=H[67557]|H[67558]<<8|(H[67559]<<16|H[67560]<<24);G[d+12>>2]=b;b=H[67553]|H[67554]<<8|(H[67555]<<16|H[67556]<<24);G[d>>2]=H[67549]|H[67550]<<8|(H[67551]<<16|H[67552]<<24);G[d+4>>2]=b;tb(5,qb(d,a,30))}Fa=d+192|0}function zt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=Fa-16|0;Fa=f;e=ce(a,0,f+12|0);G[f+8>>2]=e;a:{if(e){Ua(54978);Ua(a);break a}b:{if(H[442496]==33){e=442497;Ed(442497);break b}e=442496;d=ac(442496,13287);if(!d){break b}Ua(55035);Ua(442496);Hb(d);E[442496]=0;e=105;break a}k=ac(e,30825);if(!k){Ua(55090);Ua(442496);E[442496]=0;e=105;break a}g=G[f+12>>2];d=Fa+-64|0;Fa=d;c:{if(G[f+8>>2]>0){break c}d:{j=ab(115200);if(!j){break d}i=ab(115200);if(!i){break d}G[d+48>>2]=0;G[d+40>>2]=0;G[d+44>>2]=0;G[d+24>>2]=115200;G[d+20>>2]=i;e:{if(Ti(d+8|0)){break e}f:{while(1){h=zc(j,1,115200,g);if(G[g+76>>2]<0){m=G[g>>2]}else{m=G[g>>2]}if(m>>>5&1){break f}if(h){G[d+12>>2]=h;G[d+8>>2]=j;g:{while(1){h:{switch(Ch(d+8|0)+5|0){case 0:case 5:if(!G[d+12>>2]){break g}if((hb(i,1,115200,k)|0)!=115200){break f}G[d+20>>2]=i;G[d+24>>2]=115200;l=l+115200|0;continue;case 6:break g;default:break h}}break}break f}if(G[g+76>>2]<0){h=G[g>>2]}else{h=G[g>>2]}if(!(h>>>4&1)){continue}}break}i:{h=G[d+28>>2];if(h>>>0<=l>>>0){break i}if((hb(i,1,h-l|0,k)|0)==(G[d+28>>2]-l|0)){break i}break f}Wa(j);Wa(i);if(ye(d+8|0)){break e}break c}ye(d+8|0);Wa(j);Wa(i)}G[f+8>>2]=414;break c}G[f+8>>2]=113}Fa=d- -64|0;Hb(g);Hb(k);if(G[f+8>>2]){Ua(38352);Ua(a);Ua(37853);Ua(442496);E[442496]=0;e=G[f+8>>2];break a}a=Za(a,e);E[442496]=0;e=dk(a,b,c)}Fa=f+16|0;return e|0}function sm(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Fa-32|0;Fa=d;a:{if(!a|!G[a+3312>>2]){break a}b:{c:{d:{if(!b|!H[b|0]){break d}if(!Xa(b,33562)){break d}if(Xa(b,5332)){break c}}c=G[a+3964>>2];b=Za(a+3880|0,a+3848|0);e=L[a+120>>3];L[a+3952>>3]=e;e:{switch(c-1|0){case 1:if(e!=1950){E[b|0]=66;L[d>>3]=e;Eb(a+3881|0,18949,d);c=(Va(b)+a|0)+3879|0;if(H[c|0]==48){E[c|0]=0}c=(Va(b)+a|0)+3879|0;if(H[c|0]==48){E[c|0]=0}c=2;b=(Va(b)+a|0)+3879|0;if(H[b|0]!=48){break b}E[b|0]=0;break b}c=H[41563]|H[41564]<<8;E[b+4|0]=c;E[b+5|0]=c>>>8;c=H[41559]|H[41560]<<8|(H[41561]<<16|H[41562]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;c=2;break b;case 0:break e;default:break b}}if(e!=2e3){E[b|0]=74;L[d+16>>3]=e;Eb(a+3881|0,18949,d+16|0);c=(Va(b)+a|0)+3879|0;if(H[c|0]==48){E[c|0]=0}c=(Va(b)+a|0)+3879|0;if(H[c|0]==48){E[c|0]=0}c=1;b=(Va(b)+a|0)+3879|0;if(H[b|0]!=48){break b}E[b|0]=0;break b}c=H[41649]|H[41650]<<8;E[b+4|0]=c;E[b+5|0]=c>>>8;c=H[41645]|H[41646]<<8|(H[41647]<<16|H[41648]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24;c=1;break b}c=Nf(b);if((c|0)<0){break a}f=G[a+3964>>2];if((f|0)!=(c|0)&f-5>>>0<2){break a}Za(a+3880|0,b);g=a,h=Zh(b),L[g+3952>>3]=h}G[a+3968>>2]=c;if(!G[a+3312>>2]){break a}b=c-3|0;f:{if(b>>>0>6){b=3;c=0;break f}c=b<<2;b=G[c+145364>>2];c=G[c+145336>>2]}G[a+3288>>2]=b;G[a+3292>>2]=c}Fa=d+32|0}function Cr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;a:{b:{if(G[c+4>>2]==109){i=L[c+112>>3];break b}G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=109;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}i=f+f;L[c+112>>3]=i;f=L[c+40>>3];c:{if(f==90){G[c+128>>2]=0;G[c+132>>2]=1072693248;G[c+120>>2]=0;G[c+124>>2]=-1075838976;f=1;break c}l=1;if(!(f>-90)){break a}g=Mb((90-f)*.5);f=g*g;f=oc(g)*f/(1-f);L[c+120>>3]=f;f=.5-f;L[c+128>>3]=f;i=L[c+112>>3]}G[c+1892>>2]=115;G[c+1888>>2]=116;L[c+160>>3]=57.29577951308232/f;L[c+152>>3]=f*1e-4;G[c+144>>2]=-350469331;G[c+148>>2]=1058682594;L[c+136>>3]=f*i}f=0;j=V(a*a+b*b)/i;if(j!=0){d:{if(!(L[c+152>>3]>j)){m=L[c+120>>3];c=0;k=1;e:{while(1){f=k*.5;g=V(1-f*f)/f;i=-(m*g+oc(f)/g);if(j<=i){break e}k=f;n=i;c=c+1|0;if((c|0)!=30){continue}break}return 2}l=2;if((c|0)==30){break a}c=0;while(1){f:{g=(i-j)/(i-n);h=.1;g:{if(g<.1){break g}h=g;if(!(g>.9)){break g}h=.9}h=f-h*(f-k);g=V(1-h*h)/h;o=m*g+oc(h)/g;g=-o;h:{if(g>3]}a=Ac(a,-b)}else{a=0}L[d>>3]=a;L[e>>3]=90-(f+f);l=0}return l|0}function Er(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;m=G[c+4>>2];h=m>>31;a:{if(((h^m)-h|0)!=107){h=1;if(wj(c)){break a}}h=1;m=G[c+272>>2];if((m|0)<=0){break a}j=V(a*a+b*b)/L[c+24>>3];b:{c:{switch(m-1|0){case 0:g=(j-L[c+32>>3])/L[c+40>>3];break b;case 1:h=2;k=L[c+40>>3];i=L[c+48>>3];g=k*k+i*-4*(L[c+32>>3]-j);if(g<0){break a}f=V(g);g=i+i;i=(f-k)/g;f=(-k-f)/g;g=f>i?i:f;f=g<-1e-13?f3.141592653589793)){g=f;break b}if(!(f>3.141592653589893)){break b}break a;default:break c}}n=L[c+32>>3];if(n>j){h=2;if(!(n+-1e-13>j)){break b}break a}g=L[c+112>>3];k=L[c+120>>3];if(!(k.9)){break d}g=.9}g=i-g*(i-p);l=0;f=0;h=m;if(o){while(1){f=f*g+L[((h<<3)+c|0)+32>>3];h=h-1|0;l=l+1|0;if((o|0)!=(l|0)){continue}break}}if(m>>>0>=3){while(1){l=(h<<3)+c|0;f=(((f*g+L[l+32>>3])*g+L[l+24>>3])*g+L[l+16>>3])*g+L[l+8>>3];l=(h|0)>3;h=h-4|0;if(l){continue}break}}e:{if(!(f>>0<99;k=f;q=q+1|0;if(h){continue}break}break b}h=2;if(k+1e-13>3]=a;L[e>>3]=g*-180/3.141592653589793+90;h=0}return h|0}function Lh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{c:{d:{if(!a|!H[a|0]){break d}E[c|0]=0;if(!H[a|0]){break d}f=a;while(1){h=Sb(f,b);if(!h){break d}e:{f:{if((a|0)==(h|0)){break f}f=H[h-1|0];if((f|0)==91){break f}if((f|0)!=44){break e}}d=Va(b)+h|0;while(1){f=d;d=d+1|0;e=E[f|0];if((e|0)==32|e-9>>>0<5){continue}break}if((e|0)!=61){break e}while(1){b=f;f=b+1|0;e=E[b+1|0];d=e;if((d|0)==32|d-9>>>0<5){continue}break}g=e&255;d=g-34|0;if(d>>>0>6|!(1<4095?4095:b;j=rb(c,f,b)+b|0,k=0,E[j|0]=k;l:{m:{if(a>>>0>=h>>>0){break m}a=h-1|0;if(H[a|0]!=44){break m}h=a;break l}d=(H[d|0]==44)+d|0}yd(h,d,Va(d)+1|0);return b}function Bj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-176|0;Fa=e;g=c<0;c=Yc(g?-c:c,360);c=g?-c:c;c=(c<0?c+360:c)/15;a:{if(O(c)<2147483648){g=~~c;break a}g=-2147483648}c=(c-+(g|0))*60;b:{if(O(c)<2147483648){f=~~c;break b}f=-2147483648}c=(c-+(f|0))*60;c:{if((d|0)>=6){d=c>59.999999;L[e+8>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+4>>2]=d?0:f;G[e>>2]=(d+g|0)%24;Eb(e+112|0,18801,e);break c}if((d|0)==5){d=c>59.99999;L[e+24>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+20>>2]=d?0:f;G[e+16>>2]=(d+g|0)%24;Eb(e+112|0,18905,e+16|0);break c}if((d|0)>=4){d=c>59.9999;L[e+40>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+36>>2]=d?0:f;G[e+32>>2]=(d+g|0)%24;Eb(e+112|0,18932,e+32|0);break c}if((d|0)==3){d=c>59.999;L[e+56>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+52>>2]=d?0:f;G[e+48>>2]=(d+g|0)%24;Eb(e+112|0,19119,e+48|0);break c}if((d|0)>=2){d=c>59.99;L[e+72>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+68>>2]=d?0:f;G[e+64>>2]=(d+g|0)%24;Eb(e+112|0,19260,e- -64|0);break c}if((d|0)==1){d=c>59.9;L[e+88>>3]=d?0:c;f=d+f|0;d=(f|0)>59;G[e+84>>2]=d?0:f;G[e+80>>2]=(d+g|0)%24;Eb(e+112|0,19279,e+80|0);break c}c=c+.5;d:{if(O(c)<2147483648){h=~~c;break d}h=-2147483648}d=h;d=(d|0)>59;G[e+104>>2]=d?0:h;f=d+f|0;d=(f|0)>59;G[e+100>>2]=d?0:f;G[e+96>>2]=(d+g|0)%24;db(e+112|0,29793,e+96|0)}b=b-1|0;e:{if((Va(e+112|0)|0)<(b|0)){Za(a,e+112|0);break e}i=rb(a,e+112|0,b)+b|0,j=0,E[i|0]=j}Fa=e+176|0}function Je(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Fa-112|0;Fa=f;h=G[e>>2];a:{if((h|0)>0){break a}m=G[a>>2];k=1;if(G[G[a+4>>2]+20>>2]){k=H[(Va(c)+c|0)-1|0]==35}G[f+24>>2]=0;if(!mb(a,1,f+28|0,f+24|0)){n=(b|0)==-1;h=1;while(1){b:{if(G[e>>2]<=0){c:{d:{i=G[a>>2];g=G[a+4>>2];if((i|0)!=G[g+76>>2]){mb(a,i+1|0,0,e);break d}if((G[g+128>>2]&G[g+132>>2])!=-1){break d}if((Rb(a,e)|0)<=0){break d}i=G[e>>2];break c}i=G[G[a+4>>2]+1088>>2]!=0}g=2;if(i){break b}}g=-1}e:{f:{if(n){break f}i=G[f+28>>2];if((i|0)==(b|0)){break f}if((g|0)!=(i|0)){break e}}ef(a,2,e);if((Fc(a,35480,f+32|0,0,f+24|0)|0)<=0){g:{if(k){break g}j=0;g=Va(f+32|0)+f|0;if(H[g+31|0]!=35){break g}E[g+31|0]=0;j=1}Fg(c,f+32|0,0,f+20|0,f+16|0);l=G[f+16>>2]}h:{if(!(l?G[f+24>>2]:1)){break h}G[f+24>>2]=0;if((Fc(a,35472,f+32|0,0,f+24|0)|0)>0){break h}i:{if(k){break i}j=0;g=Va(f+32|0)+f|0;if(H[g+31|0]!=35){break i}E[g+31|0]=0;j=1}Fg(c,f+32|0,0,f+20|0,f+16|0);l=G[f+16>>2]}if(G[f+24>>2]|!l){break e}if(d){j:{if((Ec(a,33996,f+12|0,0,f+24|0)|0)<=0){g=G[f+12>>2];break j}G[f+12>>2]=1;g=1}if((g|0)!=(d|0)){break e}if(j){G[G[a+4>>2]+20>>2]=0}h=G[e>>2];break a}if(j){G[G[a+4>>2]+20>>2]=0}h=G[e>>2];break a}G[f+24>>2]=0;h=h+1|0;if(!mb(a,h,f+28|0,f+24|0)){continue}break}}mb(a,m+1|0,0,e);h=301;G[e>>2]=301}Fa=f+112|0;return h|0}function Il(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=Fa-16|0;Fa=f;a:{if(a){c=G[936854];if(c){while(1){b=G[c+4>>2];d=Sb(b,a);b:{if(!d){break b}if((Va(d)|0)!=(Va(a)|0)){break b}if((b|0)==(d|0)|H[b+(d+(b^-1)|0)|0]==47){break a}}c=G[c>>2];if(c){continue}break}}c=Ic(24,1);if(!c){c=0;hb(72898,36,1,G[24367]);break a}h=c,i=Lc(a),G[h+4>>2]=i;c:{d:{e:{b=Uf(a,46);if(!b){break e}f:{if(!Xc(b,17583)){break f}if(!Xc(b,17549)){break f}if(Xc(b,18022)){break e}}G[c+8>>2]=1;break d}G[c+8>>2]=2;b=0;d=ab(Va(a)+1|0);while(1){e=H[a+b|0];if(!(!e|(e|0)==91)){E[b+d|0]=e;b=b+1|0;continue}break}E[b+d|0]=0;b=Fd(34915);G[936856]=b;g=Ll(d,13287,0,b);pb(d);if(!g|!H[g|0]){break c}d=Va(g)+1|0;b=jb(a,91);if(b){a=Va(b);b=Za(ab(a+1|0),b);g:{while(1){e=a;if((a|0)<=0){break g}a=e-1|0;if(H[b+a|0]!=93){continue}break}E[b+e|0]=0}a=b}else{a=0}if(a){d=Va(a)+d|0}b=Xb(d);G[c+16>>2]=b;Za(b,g);if(a){Gb(G[c+16>>2],a)}pb(a);pb(g)}a=G[936854];if(!a){G[936854]=c;break a}while(1){b=a;a=G[a>>2];if(a){continue}break}G[b>>2]=c;break a}G[f>>2]=a;a=G[936856];G[f+4>>2]=a?a:21273;_a(G[24367],77151,f);if(c){a=G[936854];h:{if(!a){break h}i:{if((a|0)==(c|0)){b=3747416;break i}while(1){b=a;if(!a){break h}a=G[b>>2];if((c|0)!=(a|0)){continue}break}}G[b>>2]=G[c>>2]}pb(G[c+4>>2]);pb(G[c+16>>2]);a=G[c+12>>2];if(a){Hb(a)}pb(c)}}c=0}Fa=f+16|0;return c}function kk(a,b,c){var d=0,e=0;d=Fa-192|0;Fa=d;a:{if(G[c>>2]>0){break a}b:{c:{d:{e:{f:{g:{e=H[a|0];switch(e-39|0){case 1:break e;case 0:break f;default:break g}}h:{switch(e-70|0){default:if(e){break d}G[c>>2]=204;break a;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break d;case 0:case 14:break h}}K[b>>2]=(e|0)==84?N(1):N(0);break c}e=d+96|0;fd(a,e,c);sk(e,b,c);break c}G[c>>2]=405;break b}sk(a,b,c)}if(G[c>>2]<=0){break a}}G[b>>2]=0;b=H[67140]|H[67141]<<8|(H[67142]<<16|H[67143]<<24);c=H[67136]|H[67137]<<8|(H[67138]<<16|H[67139]<<24);F[d+38>>1]=c;F[d+40>>1]=c>>>16;F[d+42>>1]=b;F[d+44>>1]=b>>>16;b=H[67134]|H[67135]<<8|(H[67136]<<16|H[67137]<<24);G[d+32>>2]=H[67130]|H[67131]<<8|(H[67132]<<16|H[67133]<<24);G[d+36>>2]=b;b=H[67126]|H[67127]<<8|(H[67128]<<16|H[67129]<<24);G[d+24>>2]=H[67122]|H[67123]<<8|(H[67124]<<16|H[67125]<<24);G[d+28>>2]=b;b=H[67118]|H[67119]<<8|(H[67120]<<16|H[67121]<<24);G[d+16>>2]=H[67114]|H[67115]<<8|(H[67116]<<16|H[67117]<<24);G[d+20>>2]=b;b=H[67110]|H[67111]<<8|(H[67112]<<16|H[67113]<<24);G[d+8>>2]=H[67106]|H[67107]<<8|(H[67108]<<16|H[67109]<<24);G[d+12>>2]=b;b=H[67102]|H[67103]<<8|(H[67104]<<16|H[67105]<<24);G[d>>2]=H[67098]|H[67099]<<8|(H[67100]<<16|H[67101]<<24);G[d+4>>2]=b;tb(5,qb(d,a,30))}Fa=d+192|0}function lh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-416|0;Fa=e;G[e+408>>2]=65473;a:{d=G[c>>2];if(d){break a}G[b>>2]=0;d=Sd(a,0,e+144|0,c);G[c>>2]=d;while(1){if(d){if((d|0)==202){G[c>>2]=0;d=0}g=1;if(G[b>>2]<=0){break a}f=1;while(1){if(d){break a}G[e+48>>2]=f;d=e+320|0;Ya(d,75,30030,e+48|0);d=Ec(a,d,e+412|0,e+144|0,c);G[c>>2]=d;b:{if((d|0)==202){d=0;G[c>>2]=0;j=j+1|0;break b}g=g+1|0;if((j|0)<=0){break b}h=f-j|0;G[e+32>>2]=h;d=e+240|0;Ya(d,75,30030,e+32|0);i=e+320|0;pl(a,i,d,c);G[e+16>>2]=f;Ya(i,75,30038,e+16|0);G[e>>2]=h;Ya(d,75,30038,e);d=Di(a,i,e+60|0,e- -64|0,c);G[c>>2]=d;if(!d){kf(a,e+320|0,c);uq(a,e+240|0,G[e+60>>2],e- -64|0,c);nq(a,c);Wa(G[e+60>>2]);d=G[c>>2]}if((d|0)!=202){break b}d=0;G[c>>2]=0}f=f+1|0;if(G[b>>2]>=(g|0)){continue}break}break a}i=e+408|0;d=Fa-176|0;Fa=d;h=e+144|0;E[h|0]=0;f=G[c>>2];if((f|0)<=0){c:{if((kc(a,49138,d+80|0,c)|0)>0){break c}while(1){Fi(d+80|0,d,d+164|0);g=0;d:{while(1){Fg(G[i+(g<<2)>>2],d,0,d+172|0,d+168|0);f=-1;if(G[d+172>>2]){while(1){if((f|0)==-1){break d}f=f+1|0;Fg(G[f<<2>>2],d,0,d+172|0,d+168|0);if(!G[d+172>>2]){continue}break}}g=g+1|0;if((g|0)!=1){continue}break}if((kc(a,49138,d+80|0,c)|0)<=0){continue}break c}break}Gb(h,d+80|0)}f=G[c>>2]}Fa=d+176|0;d=f;G[c>>2]=d;if(d){continue}G[b>>2]=G[b>>2]+1;continue}}Fa=e+416|0;return d}function cm(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if(G[321436]){k=G[24367];hb(88619,25,1,k);$a(k)}a:{if(H[3706504]){g=L[463332];f=L[463330];h=L[463328];e=L[463314];break a}G[926630]=442745336;G[926631]=1078765020;G[926628]=-1571644103;G[926629]=1066524486;G[926632]=-1929575474;G[926633]=-1078909396;G[926636]=-102333635;G[926637]=1071614172;G[926640]=-960750452;G[926641]=-1075068062;G[926644]=2146916876;G[926645]=-1075057251;G[926648]=203628506;G[926649]=-1076047236;G[926652]=-1327103221;G[926653]=-1077404504;G[926656]=875303292;G[926657]=-1075908019;G[926660]=656523441;G[926661]=1072157603;G[926664]=-867076380;G[926665]=1071477737;E[3706504]=1;h=-.48353891463218424;f=.7445846332830311;g=.4601997847838517;e=.017453292519943295}i=e*b;b=eb(i);a=e*a;j=ib(a);e=eb(a);a=ib(i);e=e*b;b=j*b;g=g*a+(h*e+f*b);f=O(g);b:{if(f>=1){n=d,o=fc(g/f),L[n>>3]=o;a=0;break b}f=L[463326];h=L[463322];i=L[463324];j=L[463320];l=L[463316];m=L[463318];n=d,o=fc(g),L[n>>3]=o;a=Db(f*a+(h*e+b*i),j*a+(l*e+b*m))}b=L[463315];a=a*b;if(a<0){while(1){a=a+360;if(a<0){continue}break}}L[c>>3]=a;if(a>360){while(1){a=a+-360;if(a>360){continue}break}L[c>>3]=a}a=b*L[d>>3];L[d>>3]=a;b=90;c:{if(!(O(a)>=90)){break c}G[c>>2]=0;G[c+4>>2]=0;a=L[d>>3];if(!(a>90)){b=-90;if(!(a<-90)){break c}}L[d>>3]=b}}function gh(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;a:{b:{c:{A(+a);b=v(1)|0;v(0)|0;d:{e:{e=b&2147483647;if(e>>>0>=1078159482){A(+a);e=v(1)|0;e=e&2147483647;if((e|0)==2146435072&(v(0)|0)!=0|e>>>0>2146435072){break a}if((b|0)<0){return-1}if(!(a>709.782712893384)){break e}return a*898846567431158e293}if(e>>>0<1071001155){break c}if(e>>>0>1072734897){break e}if((b|0)>0|(b|0)>=0){b=1;c=1.9082149292705877e-10;g=a+-.6931471803691238;break d}b=-1;c=-1.9082149292705877e-10;g=a+.6931471803691238;break d}A(.5);b=v(1)|0;h=v(0)|0;A(+a);e=v(1)|0;v(0)|0;x(0,h|0);x(1,b&2147483647|e&-2147483648);c=a*1.4426950408889634+ +z();f:{if(O(c)<2147483648){b=~~c;break f}b=-2147483648}d=+(b|0);c=d*1.9082149292705877e-10;g=a+d*-.6931471803691238}a=g;a=a-c;c=g-a-c;break b}if(e>>>0<1016070144){break a}b=0}f=a*.5;d=a*f;g=d*(d*(d*(d*(d*-2.0109921818362437e-7+4008217827329362e-21)+-793650757867488e-19)+.0015873015872548146)+-.03333333333333313)+1;f=3-g*f;f=d*((g-f)/(6-a*f));if(!b){return a-(a*f-d)}c=a*(f-c)-c-d;g:{switch(b+1|0){case 0:return(a-c)*.5+-.5;case 2:if(a<-.25){return(c-(a+.5))*-2}a=a-c;return a+a+1;default:break g}}x(0,0);x(1,b+1023<<20);d=+z();if(b>>>0>=57){a=a-c+1;return((b|0)==1024?(a+a)*898846567431158e293:a*d)+-1}x(0,0);x(1,1023-b<<20);f=+z();a=(b>>>0<=19?1-f+(a-c):a-(c+f)+1)*d}return a}function dr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{if(G[c+4>>2]==801){j=L[c+152>>3];k=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=72;E[c+1|0]=80;E[c+2|0]=88;E[c+3|0]=0;E[c+4|0]=33;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;g=L[c+48>>3];b:{if(O(g)<2147483648){h=~~g;break b}h=-2147483648}G[c+272>>2]=(h|0)%2;f=L[c+24>>3];c:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;k=1;f=1;break c}k=57.29577951308232/f;f=f*3.141592653589793/180}L[c+112>>3]=f;G[c+1892>>2]=139;G[c+1888>>2]=140;L[c+120>>3]=k;j=g+-1;L[c+128>>3]=j/g;L[c+144>>3]=(g+1)*.5;i=L[c+40>>3];L[c+168>>3]=i/360;l=180/i;L[c+160>>3]=l;j=j*90/i;L[c+152>>3]=j;g=g*90/i;L[c+136>>3]=g;L[c+184>>3]=f*l;L[c+176>>3]=f*g}f=k*b;i=O(f);d:{e:{if(i<=j){L[d>>3]=k*a;h=2;a=f/L[c+136>>3];if(a<-1|a>1){break d}a=Bc(a);break e}h=2;if(!(i<=90)){break d}m=f<=0;g=L[c+168>>3];f=L[c+40>>3];f:{if(O(f)<2147483648){h=~~f;break f}h=-2147483648}h=(h|0)%2|0;g:{if(G[c+272>>2]?h:m?1-h|0:h){g=S(g*a+0);f=g+g+f;g=L[c+160>>3];f=f*g+-180;break g}g=S(g*a);f=g+g+f+1;g=L[c+160>>3];f=f*g+-180}h=2;i=L[c+144>>3]-i/g;if(i==0){break d}a=(a-f)/i;if(!(O(a)<=g)){break d}L[d>>3]=k*(f+a);a=1-i*i/L[c+48>>3];if(a<-1|a>1){break d}a=Bc(a);L[e>>3]=a;h=0;if(!(b<0)){break d}a=-a}L[e>>3]=a;h=0}return h|0}function br(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(G[c+4>>2]==802){g=L[c+120>>3];break a}E[c|0]=88;E[c+1|0]=80;E[c+2|0]=72;E[c+3|0]=0;E[c+4|0]=34;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;break b}g=57.29577951308232/f;f=f*3.141592653589793/180}G[c+1892>>2]=141;G[c+1888>>2]=142;G[c+160>>2]=-1279502567;G[c+164>>2]=1066787723;G[c+152>>2]=1514773339;G[c+156>>2]=1079410611;G[c+144>>2]=1232524644;G[c+148>>2]=1078420498;G[c+136>>2]=-350469331;G[c+140>>2]=1058682594;G[c+128>>2]=1431655765;G[c+132>>2]=1071994197;g=g/1.4142135623730951;L[c+120>>3]=g;L[c+112>>3]=f/1.4142135623730951}a=g*a;b=g*b;c:{if(!(!(a<=0)|!(b>0))){j=-180;f=a-b;g=-a-b;break c}if(!(!(a<0)|!(b<=0))){j=-90;f=a+b;g=a-b;break c}if(!(!(a>=0)|!(b<0))){f=b-a;g=a+b;break c}j=90;f=-a-b;g=b-a}h=f+90;f=O(h);if(f<=90){d:{e:{if(f<=45){L[d>>3]=g+45+j;k=e,l=Bc(h/67.5),L[k>>3]=l;c=2;if(!(O(g)>45.000000000001)){break e}break d}f=(90-f)/45;i=b<=0?0:180;f:{if(a==0){break f}i=a<0?-90:90;if(b==0){break f}i=g/f+45+j}L[d>>3]=i;if(f>3]){a=90-f*L[c+144>>3]}else{a=Bc(f*f/-3+1)}L[e>>3]=h<0?-a:a;if(!(h<-45)){break e}c=2;if(O(g)>h+90+1e-12){break d}}c=0}return c|0}G[d>>2]=0;G[d+4>>2]=0;G[e>>2]=0;G[e+4>>2]=0;return 2}function hs(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=Fa-16|0;Fa=q;G[q+12>>2]=j;a:{k=G[a+8>>2];s=G[a>>2]+M(c,3)|0;p=s-2|0;l=M(p,168);n=k+l|0;e=G[n+32>>2];if(e){break a}m=lb(1e3,8);G[n+32>>2]=m;j=0;G[n+28>>2]=0;e=1e3;while(1){if((e|0)<=(j|0)){e=e+1e3|0;j=ub(m,e<<3);k=G[a+8>>2];G[(l+k|0)+32>>2]=j}o=G[q+12>>2]+7&-8;G[q+12>>2]=o+8;j=k+l|0;m=G[j+32>>2];n=G[j+28>>2];r=L[o>>3];L[m+(n<<3)>>3]=r;b:{if(!(O(r+-9007199254740992)<=1e-15)){break b}o=n-1|0;if(!(O(L[(o<<3)+m>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=o;j=M(p,168);e=j+G[a+8>>2]|0;e=ub(G[e+32>>2],G[e+28>>2]<<3);k=G[a+8>>2];G[(j+k|0)+32>>2]=e;break a}o=j;j=n+1|0;G[o+28>>2]=j;continue}}j=G[(k+l|0)+28>>2];c:{if((j|0)==3){k=je(a,b,c,d,j,f,g,r,r,L[e>>3],L[e+8>>3],r);break c}k=(j<<3)+e|0;h=L[k-16>>3];i=L[k-24>>3];if(d){k=0;if(!je(a,0,p,d,j,f,g,h,h,i,h,h)){break c}if(je(a,0,s-1|0,d,j,f,g,h,h,L[e>>3],L[e+8>>3],h)|(j|0)<4){break c}k=1;p=j-4>>>1|0;j=0;m=2;while(1){l=m<<3;if(je(a,b+j|0,c+j|0,d,j,f,g,h,h,L[l+e>>3],L[(l|8)+e>>3],h)){break c}m=m+2|0;l=(j|0)==(p|0);j=j+1|0;if(!l){continue}break}k=0;break c}k=1;if(!je(a,0,p,1,j,f,g,h,h,i,h,h)){break c}k=(je(a,0,s-1|0,1,j,f,g,h,h,L[e>>3],L[e+8>>3],h)|0)!=0}Fa=q+16|0;return k|0}function Zs(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;Nd(a);d=G[a+8>>2];a:{if(!G[309737]){if((d|0)<=0){break a}while(1){e=G[309727];c=G[309722]+M(G[((g<<2)+a|0)+12>>2],344)|0;b:{if(G[c>>2]==-1e3){b=G[a+56>>2];b=(M(b,e)+h|0)-b|0;if((b|0)<0){break b}while(1){E[G[a+84>>2]+b|0]=0;c:{d:{switch(G[a+52>>2]-258|0){case 0:E[G[a+88>>2]+b|0]=H[c+88|0];break c;case 1:G[G[a+88>>2]+(b<<2)>>2]=G[c+88>>2];break c;case 2:break d;default:break c}}L[G[a+88>>2]+(b<<3)>>3]=L[c+88>>3]}b=b-G[a+56>>2]|0;if((b|0)>=0){continue}break}break b}if(!e){break b}b=G[c+56>>2];if(!b){break b}d=M(b,e);while(1){e=e-1|0;b=G[c+56>>2];e:{if(!b){break e}i=M(G[a+56>>2],e)+h|0;while(1){b=b-1|0;f=i+b|0;d=d-1|0;E[f+G[a+84>>2]|0]=H[d+G[c+84>>2]|0];f:{switch(G[a+52>>2]-258|0){case 0:E[G[a+88>>2]+f|0]=H[G[c+88>>2]+d|0];if(!b){break e}continue;case 1:G[G[a+88>>2]+(f<<2)>>2]=G[G[c+88>>2]+(d<<2)>>2];if(!b){break e}continue;case 2:L[G[a+88>>2]+(f<<3)>>3]=L[G[c+88>>2]+(d<<3)>>3];break;default:break f}}if(b){continue}break}}if(e){continue}break}}h=G[c+56>>2]+h|0;d=G[a+8>>2];g=g+1|0;if((d|0)>(g|0)){continue}break}}if((d|0)<=0){break a}c=G[309722];b=0;while(1){e=M(G[((b<<2)+a|0)+12>>2],344)+c|0;if(G[e>>2]>0){Wa(G[e+88>>2]);c=G[309722];d=G[a+8>>2]}b=b+1|0;if((d|0)>(b|0)){continue}break}}}function Pq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0;c=Fa-144|0;Fa=c;d=G[935658];e=L[d+32>>3];g=L[d+16>>3];f=L[d+24>>3];g=L[a+32>>3]*e+(L[a+16>>3]*g+L[a+24>>3]*f)-(L[b+32>>3]*e+(L[b+16>>3]*g+f*L[b+24>>3]));a:{if(G[935573]<3){break a}id();G[c+128>>2]=G[a+48>>2];kb(75228,c+128|0);G[c+112>>2]=G[b+48>>2];kb(75213,c+112|0);L[c+96>>3]=L[a+40>>3];gb(72046,c+96|0);L[c+80>>3]=L[b+40>>3];gb(72026,c+80|0);L[c+64>>3]=g;gb(72066,c- -64|0);d=G[29763];$a(d);if(G[935573]<3){break a}f=L[b+40>>3];e=L[a+40>>3];if(f>3];e=L[a+40>>3]}if(e>3];f=L[b+40>>3];b:{if(e>f){break b}d=-1;if(e>2]=1;if(G[935573]>=3){G[c>>2]=G[b+48>>2];kb(87856,c);yb(5931);$a(G[29763])}G[935659]=G[935659]+1;break b}if(g<-e){d=1;G[a+52>>2]=1;if(G[935573]>=3){G[c+16>>2]=G[a+48>>2];kb(87872,c+16|0);yb(11117);$a(G[29763])}G[935659]=G[935659]+1;break b}h=G[b+48>>2];d=G[a+48>>2];if((h|0)<(d|0)){d=1;G[b+52>>2]=1;if(G[935573]>=3){G[c+32>>2]=h;kb(87856,c+32|0);yb(11117);$a(G[29763])}G[935659]=G[935659]+1;break b}if(!G[a+52>>2]){G[a+52>>2]=1;if(G[935573]>=3){G[c+48>>2]=d;kb(87872,c+48|0);$a(G[29763])}G[935659]=G[935659]+1}d=0;if(G[935573]<3){break b}yb(16929);$a(G[29763])}Fa=c+144|0;return d|0}function hr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;i=G[c+4>>2];g=L[c+40>>3];if(g==0){a:{if((i|0)==301){g=L[c+24>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=70;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=45;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;g=L[c+24>>3];b:{if(g==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=57.29577951308232;h=1;break b}f=g*3.141592653589793/180;h=1/f}G[c+1892>>2]=99;G[c+1888>>2]=100;L[c+112>>3]=f;L[c+120>>3]=h}f=eb(b/g);if(f!=0){a=L[c+120>>3]*a/f}else{a=0}L[d>>3]=a;L[e>>3]=L[c+120>>3]*b;return 0}c:{if((i|0)==601){f=L[c+128>>3];break c}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=66;E[c+1|0]=79;E[c+2|0]=78;E[c+3|0]=0;E[c+4|0]=89;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];d:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;f=Mb(g)*57.29577951308232/Kb(L[c+40>>3]);g=L[c+40>>3];f=f+g;break d}L[c+120>>3]=f*3.141592653589793/180;h=Mb(g)/Kb(L[c+40>>3]);g=L[c+40>>3];f=f*(h+g*3.141592653589793/180)}G[c+1892>>2]=135;G[c+1888>>2]=136;L[c+128>>3]=f}h=f-b;b=V(a*a+h*h);b=g<0?-b:b;if(b!=0){j=Ac(a/b,h/b);f=L[c+128>>3]}a=(f-b)/L[c+120>>3];L[e>>3]=a;a=Mb(a);if(a!=0){a=j*(b/L[c+24>>3])/a}else{a=0}L[d>>3]=a;return 0}function ti(a,b,c,d,e){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;l=Fa-16|0;Fa=l;a:{b:{c:{if((c|0)<=36){f=H[a|0];if(f){break c}g=a;break b}G[48624]=28;d=0;e=0;break a}g=a;d:{while(1){f=f<<24>>24;if(!((f|0)==32|f-9>>>0<5)){break d}f=H[g+1|0];g=g+1|0;if(f){continue}break}break b}e:{f=H[g|0];switch(f-43|0){case 0:case 2:break e;default:break b}}m=(f|0)==45?-1:0;g=g+1|0}f:{if(!((c|16)!=16|H[g|0]!=48)){o=1;if((H[g+1|0]&223)==88){g=g+2|0;j=16;break f}g=g+1|0;j=c?c:8;break f}j=c?c:10}p=j>>31;c=0;while(1){g:{f=-48;i=E[g|0];h:{if((i-48&255)>>>0<10){break h}f=-87;if((i-97&255)>>>0<26){break h}f=-55;if((i-65&255)>>>0>25){break g}}i=f+i|0;if((i|0)>=(j|0)){break g}ed(l,j,p,0,0,k,h,0,0);f=1;i:{if(G[l+8>>2]|G[l+12>>2]){break i}q=Au(k,h,j,p);n=Ia;r=i>>31;s=r^-1;if((n|0)==(s|0)&(i^-1)>>>0>>0|n>>>0>s>>>0){break i}h=n+r|0;f=i+q|0;h=f>>>0>>0?h+1|0:h;k=f;o=1;f=c}g=g+1|0;c=f;continue}break}if(b){G[b>>2]=o?g:a}j:{k:{if(c){G[48624]=68;a=d&1;m=a?0:m;k=d;h=e;break k}if((e|0)==(h|0)&d>>>0>k>>>0|e>>>0>h>>>0){break j}a=d&1}if(!(a|m)){G[48624]=68;a=d;d=a-1|0;e=e-!a|0;break a}if((e|0)==(h|0)&d>>>0>=k>>>0|e>>>0>h>>>0){break j}G[48624]=68;break a}a=m;b=a^k;d=b-a|0;c=a>>31;e=(c^h)-((a>>>0>b>>>0)+c|0)|0}Fa=l+16|0;Ia=e;return d}function ar(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(G[c+4>>2]!=802){E[c|0]=88;E[c+1|0]=80;E[c+2|0]=72;E[c+3|0]=0;E[c+4|0]=34;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;break a}g=57.29577951308232/f;f=f*3.141592653589793/180}G[c+1892>>2]=141;G[c+1888>>2]=142;G[c+160>>2]=-1279502567;G[c+164>>2]=1066787723;G[c+152>>2]=1514773339;G[c+156>>2]=1079410611;G[c+144>>2]=1232524644;G[c+148>>2]=1078420498;G[c+136>>2]=-350469331;G[c+140>>2]=1058682594;G[c+128>>2]=1431655765;G[c+132>>2]=1071994197;L[c+120>>3]=g/1.4142135623730951;L[c+112>>3]=f/1.4142135623730951}b:{if(!(O(a)>=180)){break b}a=Yc(a,360);if(a<-180){a=a+360;break b}if(!(a>=180)){break b}a=a+-360}a=a+180;h=d,i=Yc(a,90),L[h>>3]=i;L[e>>3]=a+-180;f=Kb(b);a=O(f);c:{if(a<=L[c+128>>3]){a=f*67.5;f=L[d>>3];break c}f=L[c+152>>3]>b?V((1-a)*3):(90-b)*L[c+160>>3];a=(2-f)*45;f=(L[d>>3]+-45)*f+45;if(!(b<0)){break c}a=-a}a=a+-90;b=f+-45;f=L[e>>3];d:{if(f<-90){L[d>>3]=(a-b)*L[c+112>>3];a=(-b-a)*L[c+112>>3];break d}if(f<0){L[d>>3]=(a+b)*L[c+112>>3];a=(a-b)*L[c+112>>3];break d}g=L[c+112>>3];if(f<90){L[d>>3]=(b-a)*g;a=(a+b)*L[c+112>>3];break d}L[d>>3]=(-b-a)*g;a=(b-a)*L[c+112>>3]}L[e>>3]=a;return 0}function Hm(a,b){var c=0,d=0,e=0,f=0,g=0;a:{b:{c:{d:{e:{c=G[a+4>>2];f:{if((c|0)!=G[a+104>>2]){G[a+4>>2]=c+1;c=H[c|0];break f}c=jc(a)}switch(c-43|0){case 0:case 2:break e;default:break d}}f=(c|0)==45;g=!b;c=G[a+4>>2];g:{if((c|0)!=G[a+104>>2]){G[a+4>>2]=c+1;c=H[c|0];break g}c=jc(a)}b=c-58|0;if(g|b>>>0>4294967285){break c}if(G[a+116>>2]<0){break b}G[a+4>>2]=G[a+4>>2]-1;break b}b=c-58|0}if(b>>>0<4294967286){break b}b=c-48|0;if(b>>>0<10){while(1){d=M(d,10)+c|0;d=d-48|0;e=(d|0)<214748364;b=G[a+4>>2];h:{if((b|0)!=G[a+104>>2]){G[a+4>>2]=b+1;c=H[b|0];break h}c=jc(a)}b=c-48|0;if(e&b>>>0<=9){continue}break}e=d>>31}i:{if(b>>>0>=10){break i}while(1){d=Au(d,e,10,0);c=d+c|0;b=Ia;b=c>>>0>>0?b+1|0:b;d=c-48|0;e=b-(c>>>0<48)|0;b=G[a+4>>2];j:{if((b|0)!=G[a+104>>2]){G[a+4>>2]=b+1;c=H[b|0];break j}c=jc(a)}b=c-48|0;if(b>>>0>9){break i}if(d>>>0<2061584302&(e|0)<=21474836|(e|0)<21474836){continue}break}}if(b>>>0<10){while(1){b=G[a+4>>2];k:{if((b|0)!=G[a+104>>2]){G[a+4>>2]=b+1;b=H[b|0];break k}b=jc(a)}if(b-48>>>0<10){continue}break}}b=G[a+116>>2];if((b|0)>0|(b|0)>=0){G[a+4>>2]=G[a+4>>2]-1}a=d;d=f?0-a|0:a;e=f?0-(((a|0)!=0)+e|0)|0:e;break a}e=-2147483648;if(G[a+116>>2]<0){break a}G[a+4>>2]=G[a+4>>2]-1;Ia=-2147483648;return 0}Ia=e;return d}function dm(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(G[321436]){k=G[24367];hb(89112,26,1,k);$a(k)}a:{if(H[3706216]){g=L[463294];f=L[463292];h=L[463290];e=L[463278];break a}G[926558]=442745336;G[926559]=1078765020;G[926556]=-1571644103;G[926557]=1066524486;G[926560]=52553840;G[926561]=-1075344588;G[926564]=-505530574;G[926565]=1072016415;G[926568]=-673237620;G[926569]=-1078782476;G[926572]=1753527554;G[926573]=-1078674469;G[926576]=-1081034383;G[926577]=1072680502;G[926580]=71334806;G[926581]=1072007784;G[926584]=-910810613;G[926585]=1072129682;G[926588]=489187355;G[926589]=1069297225;E[3706216]=1;h=.6731453021092075;f=.7312711658169645;g=.11008126222478191;e=.017453292519943295}i=e*a;j=ib(i);b=e*b;a=eb(b);e=eb(i);b=ib(b);e=e*a;a=j*a;g=g*b+(h*e+f*a);f=O(g);b:{if(f>=1){m=d,n=fc(g/f),L[m>>3]=n;a=0;break b}f=L[463288];h=L[463284];i=L[463286];j=L[463280];l=L[463282];m=d,n=fc(g),L[m>>3]=n;a=Db(f*b+(h*e+a*i),b*0+(j*e+a*l))}b=L[463279];a=a*b;if(a<0){while(1){a=a+360;if(a<0){continue}break}}L[c>>3]=a;if(a>360){while(1){a=a+-360;if(a>360){continue}break}L[c>>3]=a}a=b*L[d>>3];L[d>>3]=a;b=90;c:{if(!(O(a)>=90)){break c}G[c>>2]=0;G[c+4>>2]=0;a=L[d>>3];if(!(a>90)){b=-90;if(!(a<-90)){break c}}L[d>>3]=b}}function zu(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;a:{b:{c:{d:{e:{f:{g:{h:{i:{j:{e=b;if(e){if(!c){break j}f=d;if(!f){break i}e=P(f)-P(e)|0;if(e>>>0<=31){break h}break b}if((d|0)==1|d>>>0>1){break b}b=(a>>>0)/(c>>>0)|0;Ga=a-M(b,c)|0;Ha=0;Ia=0;return b}f=d;if(!a){break g}if(!f){break f}g=f-1|0;if(g&f){break f}Ga=a;Ha=e&g;a=e>>>Gu(f)|0;Ia=0;return a}f=c-1|0;if(!(f&c)){break e}h=(P(c)+33|0)-P(e)|0;g=0-h|0;break c}h=e+1|0;g=63-e|0;break c}Ga=0;a=(e>>>0)/(f>>>0)|0;Ha=e-M(a,f)|0;Ia=0;return a}e=P(f)-P(e)|0;if(e>>>0<31){break d}break b}Ga=a&f;Ha=0;if((c|0)==1){break a}d=a;c=Gu(c);a=c&31;if((c&63)>>>0>=32){e=0;a=b>>>a|0}else{e=b>>>a|0;a=((1<>>a}Ia=e;return a}h=e+1|0;g=63-e|0}i=a;e=h&63;f=e&31;if((e&63)>>>0>=32){e=0;k=b>>>f|0}else{e=b>>>f|0;k=((1<>>f}f=e;e=g&63;a=e&31;if((e&63)>>>0>=32){e=i<>>32-a|b<>>31;f=j<<1;j=e;f=b>>>31|f;e=i-((f>>>0>g>>>0)+e|0)>>31;l=e;m=c&e;k=f-m|0;f=j-((d&e)+(f>>>0>>0)|0)|0;e=b<<1|a>>>31;a=n|a<<1;b=e|o;j=0;l=l&1;n=l;h=h-1|0;if(h){continue}break}}Ga=k;Ha=f;e=b<<1|a>>>31;a=l|a<<1;Ia=e|j;return a}Ga=a;Ha=b;a=0;b=0}Ia=b;return a}function dk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=Fa-2896|0;Fa=f;a:{b:{c:{d:{if(H[442496]){d=ce(a,0,f+2892|0);if(d){E[442496]=0;break a}d=ck(442496,c);if(d){break d}i=G[f+2892>>2];d=zc(f,1,2880,i);if(d){while(1){h=M(G[c>>2],24);k=h+202496|0;e:{l=h+202512|0;f:{if(G[l>>2]==1){g=h+202504|0;a=g;e=G[a+4>>2];a=G[a>>2];j=116;if(zf(G[k>>2],a,a>>31,0)){break f}G[g>>2]=a;G[g+4>>2]=e}if((hb(f,1,d,G[k>>2])|0)==(d|0)){break e}j=106}d=j;E[442496]=0;break a}a=h+202504|0;g=G[a+4>>2]+(d>>31)|0;e=d+G[a>>2]|0;g=e>>>0>>0?g+1|0:g;G[a>>2]=e;G[a+4>>2]=g;G[l>>2]=2;d=zc(f,1,2880,i);if(d){continue}break}}Hb(i);d=G[c>>2];a=M(d,24)+202496|0;if(!Hb(G[a>>2])){G[a>>2]=0}G[c>>2]=d;d=ce(442496,b,f+2892|0);E[442496]=0;break b}G[c>>2]=-1;while(1){if(!G[M(d,24)+202496>>2]){e=d;break c}e=d+1|0;if(!G[M(e,24)+202496>>2]){break c}e=d+2|0;if(!G[M(e,24)+202496>>2]){break c}e=d+3|0;if(!G[M(e,24)+202496>>2]){break c}e=d+4|0;if(!G[M(e,24)+202496>>2]){break c}d=d+5|0;if((d|0)!=1e4){continue}break}d=103;break a}Ua(37915);Ua(442496);E[442496]=0;break a}G[c>>2]=e;d=ce(a,b,f+2892|0)}b=G[f+2892>>2];c=M(G[c>>2],24);G[c+202512>>2]=0;a=c+202504|0;G[a>>2]=0;G[a+4>>2]=0;G[c+202496>>2]=b}Fa=f+2896|0;return d|0}function Fb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=-1;a:{b:{if((c|0)<0){break b}d=G[309722];c:{d:{e:{f:{b=b?b:a;switch(b-258|0){case 0:break d;case 1:case 29:break e;case 2:case 30:break f;default:break c}}if(G[(M(c,344)+d|0)+52>>2]==260){return c}if((b|0)!=287){break c}}if(G[(M(c,344)+d|0)+52>>2]!=259){break c}return c}if(G[(M(c,344)+d|0)+52>>2]!=258){break c}return c}e=G[309723];if((e|0)==G[309724]){g:{if(d){G[309724]=e<<1;d=ub(d,M(e,688));break g}G[309724]=100;d=ab(34400)}if(!d){break a}G[309722]=d;e=G[309723]}G[309723]=e+1;if((e|0)<0){break b}f=M(e,344)+d|0;G[f+52>>2]=a;G[f+12>>2]=c;G[f+8>>2]=1;G[f+4>>2]=25;G[f>>2]=b;i=M(c,344)+d|0;G[f+56>>2]=G[i+56>>2];G[f+60>>2]=G[i+60>>2];g=G[i+60>>2];h:{if((g|0)<=0){break h}b=0;if(g-1>>>0>=3){n=g&-4;while(1){j=(M(e,344)+d|0)- -64|0;a=b<<2;k=(M(c,344)+d|0)- -64|0;G[j+a>>2]=G[a+k>>2];h=a|4;G[h+j>>2]=G[k+h>>2];h=a|8;G[h+j>>2]=G[k+h>>2];a=a|12;G[a+j>>2]=G[a+k>>2];b=b+4|0;l=l+4|0;if((n|0)!=(l|0)){continue}break}}a=g&3;if(!a){break h}while(1){g=b<<2;G[(g+(M(e,344)+d|0)|0)- -64>>2]=G[(g+(M(c,344)+d|0)|0)- -64>>2];b=b+1|0;m=m+1|0;if((a|0)!=(m|0)){continue}break}}if(G[i>>2]!=-1e3){break b}rn(f)}return e}G[309737]=113;return-1}function ck(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-5712|0;Fa=d;G[d+5704>>2]=0;a:{b:{e=Fd(32716);if(!e){break b}f=105;if(Va(e)>>>0>200){break a}e=Za(d+3376|0,e);c=jb(e,59);c:{if(c){E[c|0]=0;Za(d+3120|0,c+1|0);break c}E[d+3120|0]=0}c=d+4672|0;cf(c,d+5704|0);c=Va(c);if(!((c|0)>1024|H[(d+c|0)+4671|0]==47)){c=d+4672|0;c=Va(c)+c|0;E[c|0]=47;E[c+1|0]=0}c=Va(e);if(fb(e,d+4672|0,c)){Ua(2889);break a}c=rb(d+2080|0,c+(d+4672|0)|0,50);E[c+50|0]=0;h=jb(c,47);if(!h){Ua(21390);break a}E[h+1|0]=0;e=Gb(Za(d+1040|0,e),c);h=Va(e);c=Gb(Za(d,d+3120|0),c);j=Va(c);i=d+3632|0;Dg(d+4672|0,a,i,d+5704|0);if(!fb(e,i,h)){break b}if(!fb(c,d+3632|0,j)){break b}Ua(2840);break a}G[b>>2]=-1;d:{while(1){f=M(g,24)+202496|0;if(!G[f>>2]){e=g;break d}e=g+1|0;f=M(e,24)+202496|0;if(!G[f>>2]){break d}e=g+2|0;f=M(e,24)+202496|0;if(!G[f>>2]){break d}e=g+3|0;f=M(e,24)+202496|0;if(!G[f>>2]){break d}e=g+4|0;f=M(e,24)+202496|0;if(!G[f>>2]){break d}g=g+5|0;if((g|0)!=1e4){continue}break}f=103;break a}G[b>>2]=e;G[d+5708>>2]=6433655;b=ac(a,13287);if(b){Hb(b);f=105;break a}a=ac(a,d+5708|0);if(!a){f=105;break a}G[f>>2]=a;f=0;a=M(e,24);G[a+202512>>2]=0;a=a+202504|0;G[a>>2]=0;G[a+4>>2]=0}Fa=d+5712|0;return f|0}function wd(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(G[f>>2]<=0){h=G[a>>2];g=G[a+4>>2];if((h|0)!=G[g+76>>2]){mb(a,h+1|0,0,f);g=G[a+4>>2]}j=G[g+72>>2];if((j|0)<0){Hc(a,Bu(G[g+56>>2],G[g+60>>2],2880,0),0,f);g=G[a+4>>2];j=G[g+72>>2]}k=G[((j<<2)+g|0)+1256>>2];h=G[g+56>>2]+Au(k,0,-2880,0)|0;i=h+(G[g+1252>>2]+M(j,2880)|0)|0;g=2880-h|0;if((c|0)>=2){m=1;while(1){h=i;l=(b|0)>(g|0);i=l?g:b;n=bb(h,e,i);h=e+i|0;a:{if(l){G[(G[a+4>>2]+(j<<2)|0)+1416>>2]=1;k=k+1|0;Hc(a,k,1,f);l=G[a+4>>2];j=G[l+72>>2];i=b-i|0;g=i+d|0;i=bb(G[l+1252>>2]+M(j,2880)|0,h,i)+g|0;g=2880-g|0;e=b+e|0;break a}e=d+i|0;g=g-e|0;i=e+n|0;e=h}if((g|0)<=0){G[(G[a+4>>2]+(j<<2)|0)+1416>>2]=1;k=((2880-g>>>0)/2880|0)+k|0;Hc(a,k,1,f);h=G[a+4>>2];j=G[h+72>>2];i=G[h+1252>>2]+M(j,2880)|0;h=(0-g>>>0)%2880|0;i=i+h|0;g=2880-h|0}m=m+1|0;if((m|0)!=(c|0)){continue}break}}h=g;g=(b|0)>(g|0);h=g?h:b;bb(i,e,h);if(g){G[(G[a+4>>2]+(j<<2)|0)+1416>>2]=1;Hc(a,k+1|0,1,f);g=G[a+4>>2];j=G[g+72>>2];bb(G[g+1252>>2]+M(j,2880)|0,e+h|0,b-h|0)}a=G[a+4>>2];G[(a+(j<<2)|0)+1416>>2]=1;e=G[a+60>>2];d=M(c-1|0,d);b=M(b,c);h=b;c=d+b|0;b=(d>>31)+(b>>31)|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+G[a+56>>2]|0;b=b+e|0;G[a+56>>2]=c;G[a+60>>2]=c>>>0>>0?b+1|0:b}}function Tt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!(G[a+92>>2]|(!a|G[a+16>>2]!=31153))){if((c|0)<0){Vd(a,-3,4722);return 0}g=b;b=0;a:{b:{if(!c){break b}if(!G[a+28>>2]){if((Aq(a)|0)==-1){break b}}c:{if(!G[a+88>>2]){break c}G[a+88>>2]=0;f=G[a+80>>2];h=G[a+84>>2];if(G[a+104>>2]){if((Jf(a,0)|0)==-1){break b}}if(!(f|h)){break c}while(1){d=G[a+28>>2];d=(h|0)<=0&d>>>0>f>>>0|(h|0)<0?f:d;if(!(b&1)){cb(G[a+36>>2],0,d)}G[a+104>>2]=d;G[a+100>>2]=G[a+36>>2];b=G[a+12>>2];i=G[a+8>>2];j=i+d|0;G[a+8>>2]=j;G[a+12>>2]=i>>>0>j>>>0?b+1|0:b;if((Jf(a,0)|0)==-1){break b}b=1;h=h-(d>>>0>f>>>0)|0;f=f-d|0;if(h|f){continue}break}}if(J[a+28>>2]>c>>>0){b=c;while(1){f=G[a+104>>2];d:{if(f){e=G[a+36>>2];d=G[a+100>>2];break d}e=G[a+36>>2];G[a+100>>2]=e;d=e}d=d+f|0;e=G[a+28>>2]+(e-d|0)|0;e=b>>>0>e>>>0?e:b;bb(d,g,e);G[a+104>>2]=e+G[a+104>>2];d=G[a+12>>2];f=e+G[a+8>>2]|0;d=f>>>0>>0?d+1|0:d;G[a+8>>2]=f;G[a+12>>2]=d;b=b-e|0;if(!b){break a}g=e+g|0;e=0;if((Jf(a,0)|0)!=-1){continue}break}break b}if(G[a+104>>2]){if((Jf(a,0)|0)==-1){break b}}G[a+104>>2]=c;G[a+100>>2]=g;b=G[a+12>>2];g=c+G[a+8>>2]|0;b=g>>>0>>0?b+1|0:b;G[a+8>>2]=g;G[a+12>>2]=b;e=(Jf(a,0)|0)==-1?0:c}c=e}g=c}return g|0}function Hj(a,b,c,d,e,f,g,h){var 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;i=L[g>>3];a:{if((h|0)<=0){j=i;break a}m=h&3;b:{if(h-1>>>0<3){j=i;break b}o=h&-4;j=i;while(1){l=k<<3;n=L[(l|24)+g>>3];q=L[(l|16)+g>>3];r=L[(l|8)+g>>3];s=L[g+l>>3];j=j>s?s:j;j=j>r?r:j;j=j>q?q:j;j=j>n?n:j;i=i>3];j=j>n?n:j;i=i>2];k=b+M(c,168)|0;l=k-168|0;L[k+8>>3]=L[l+8>>3];L[k+16>>3]=L[l+16>>3];k=G[a+48>>2];break c}b=G[a+8>>2];k=b+M(c,168)|0;m=G[a+44>>2];j=j+1;d:{if(O(j)<2147483648){l=~~j;break d}l=-2147483648}L[k+8>>3]=((l|0)<(m|0)?m:l)|0;m=k;k=G[a+48>>2];i=i+1;e:{if(O(i)<2147483648){l=~~i;break e}l=-2147483648}l=l-1|0;L[m+16>>3]=((k|0)<(l|0)?k:l)|0}p=M(c,168);u=p+b|0,v=lb(k+1|0,4),G[u+24>>2]=v;Pf(a,c,d,e);if((h|0)>0){b=h-1|0;k=0;while(1){c=G[(p+G[a+8>>2]|0)+24>>2];l=G[a+48>>2];m=G[a+40>>2];o=k<<3;i=L[o+g>>3];b=b<<3;j=L[b+g>>3];f:{if(i>j){Rm(a,c,m,l,d,e,L[b+f>>3],j,L[f+o>>3],i);break f}Rm(a,c,m,l,d,e,L[f+o>>3],i,L[b+f>>3],j)}b=k;k=k+1|0;if((k|0)!=(h|0)){continue}break}}}function mi(a,b){var c=0,d=0,e=0;c=Fa-112|0;Fa=c;a:{b:{if(G[309728]>0){while(1){if(!gc(G[309730]+M(d,124)|0,a,80)){break b}d=d+1|0;if((d|0)>2]=H[67620]|H[67621]<<8|(H[67622]<<16|H[67623]<<24);G[c+4>>2]=b;b=H[67632]|H[67633]<<8|(H[67634]<<16|H[67635]<<24);G[c+8>>2]=H[67628]|H[67629]<<8|(H[67630]<<16|H[67631]<<24);G[c+12>>2]=b;b=H[67638]|H[67639]<<8|(H[67640]<<16|H[67641]<<24);d=H[67634]|H[67635]<<8|(H[67636]<<16|H[67637]<<24);F[c+14>>1]=d;F[c+16>>1]=d>>>16;F[c+18>>1]=b;F[c+20>>1]=b>>>16;Ua(qb(c,a,80));a=-1;break a}e=G[(G[309730]+M(d,124)|0)+84>>2]-258|0;c:{if(e>>>0>=5){G[309737]=431;e=H[67616]|H[67617]<<8|(H[67618]<<16|H[67619]<<24);G[c+16>>2]=H[67612]|H[67613]<<8|(H[67614]<<16|H[67615]<<24);G[c+20>>2]=e;e=H[67600]|H[67601]<<8|(H[67602]<<16|H[67603]<<24);G[c>>2]=H[67596]|H[67597]<<8|(H[67598]<<16|H[67599]<<24);G[c+4>>2]=e;e=H[67608]|H[67609]<<8|(H[67610]<<16|H[67611]<<24);G[c+8>>2]=H[67604]|H[67605]<<8|(H[67606]<<16|H[67607]<<24);G[c+12>>2]=e;Ua(qb(c,a,80));a=-1;break c}a=G[(e<<2)+141344>>2]}G[b>>2]=d}Fa=c+112|0;return a}function yi(a,b,c){var d=0,e=0,f=0,g=0;d=Fa-96|0;Fa=d;e=G[c>>2];if((e|0)<=0){G[48624]=0;G[b>>2]=0;G[b+4>>2]=0;f=b,g=Fn(a,d+92|0),G[f>>2]=g;G[b+4>>2]=Ia;if((H[G[d+92>>2]]|32)!=32){G[c>>2]=407}if(G[48624]==68){F[d+56>>1]=H[66897]|H[66898]<<8;b=H[66893]|H[66894]<<8|(H[66895]<<16|H[66896]<<24);G[d+48>>2]=H[66889]|H[66890]<<8|(H[66891]<<16|H[66892]<<24);G[d+52>>2]=b;b=H[66885]|H[66886]<<8|(H[66887]<<16|H[66888]<<24);G[d+40>>2]=H[66881]|H[66882]<<8|(H[66883]<<16|H[66884]<<24);G[d+44>>2]=b;b=H[66877]|H[66878]<<8|(H[66879]<<16|H[66880]<<24);G[d+32>>2]=H[66873]|H[66874]<<8|(H[66875]<<16|H[66876]<<24);G[d+36>>2]=b;b=H[66869]|H[66870]<<8|(H[66871]<<16|H[66872]<<24);G[d+24>>2]=H[66865]|H[66866]<<8|(H[66867]<<16|H[66868]<<24);G[d+28>>2]=b;b=H[66861]|H[66862]<<8|(H[66863]<<16|H[66864]<<24);G[d+16>>2]=H[66857]|H[66858]<<8|(H[66859]<<16|H[66860]<<24);G[d+20>>2]=b;b=H[66853]|H[66854]<<8|(H[66855]<<16|H[66856]<<24);G[d+8>>2]=H[66849]|H[66850]<<8|(H[66851]<<16|H[66852]<<24);G[d+12>>2]=b;b=H[66845]|H[66846]<<8|(H[66847]<<16|H[66848]<<24);G[d>>2]=H[66841]|H[66842]<<8|(H[66843]<<16|H[66844]<<24);G[d+4>>2]=b;tb(5,qb(d,a,23));G[c>>2]=412;G[48624]=0}e=G[c>>2]}Fa=d+96|0;return e}function as(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=G[c+4>>2];k=h>>31;a:{if(((k^h)-k|0)==105){g=L[c+120>>3];f=L[c+112>>3];break a}G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=73;E[c+2|0]=78;E[c+3|0]=0;G[c+4>>2]=(h|0)<0?-105:105;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}G[c+1892>>2]=89;G[c+1888>>2]=90;f=1/f;L[c+112>>3]=f;g=L[c+40>>3];i=g*g;g=L[c+48>>3];g=i+g*g;L[c+120>>3]=g;L[c+136>>3]=g+-1;L[c+128>>3]=g+1}i=f*a;b=f*b;a=i*i+b*b;b:{c:{if(g==0){if(a!=0){b=Ac(i,-b)}else{b=0}L[d>>3]=b;if(a<.5){l=e,m=Yg(V(a)),L[l>>3]=m;break c}h=2;if(!(a<=1)){break b}l=e,m=Bc(V(1-a)),L[l>>3]=m;break c}f=i*L[c+40>>3]+b*L[c+48>>3];d:{if(a<1e-10){L[e>>3]=V(a/(f+1))*-57.29577951308232+90;a=a*.5;break d}h=2;g=f-g;a=a-f-f+L[c+136>>3];f=L[c+128>>3];a=g*g-a*f;if(a<0){break b}j=V(a);a=(j-g)/f;g=(-g-j)/f;f=a>g?a:g;e:{if(!(f>1)){break e}j=f+-1;f=1;if(j<1e-13){break e}f=a-1e-13?-1:f:f;if(a>1|a<-1){break b}l=e,m=Bc(a),L[l>>3]=m;a=1-a}f=i-L[c+40>>3]*a;a=L[c+48>>3]*a-b;if(!(a!=0|f!=0)){G[d>>2]=0;G[d+4>>2]=0;break c}l=d,m=Ac(f,a),L[l>>3]=m}h=0}return h|0}function of(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=Fa-16|0;Fa=g;f=-1;d=G[47589];if(!(G[321431]?0:d)){G[47589]=1;G[321432]=0;G[321431]=0;d=1}a:{if((a|0)<=(d|0)){break a}e=G[(d<<2)+b>>2];if(!e){break a}if(H[e|0]!=45){if(H[c|0]!=45){break a}G[321433]=e;f=1;G[47589]=d+1;break a}h=H[e+1|0];if(!h){break a}if(!(H[e+2|0]|(h|0)!=45)){G[47589]=d+1;break a}f=g+12|0;d=G[321432];if(!d){G[321432]=1;d=1}h=om(f,d+e|0);if((h|0)<0){G[g+12>>2]=65533;h=1}e=G[47589];d=G[(e<<2)+b>>2];f=G[321432];j=f+h|0;G[321432]=j;if(!H[d+j|0]){G[47589]=e+1;G[321432]=0}b:{switch(H[c|0]-43|0){case 0:case 2:c=c+1|0;break;default:break b}}j=d+f|0;d=0;G[g+8>>2]=0;while(1){c:{i=om(g+8|0,c+d|0);d=((i|0)>1?i:1)+d|0;e=G[g+12>>2];f=G[g+8>>2];if(!i){break c}if((e|0)!=(f|0)){continue}}break}if(!((e|0)==(f|0)&(e|0)!=58)){G[321434]=e;f=63;if(!G[47590]|H[c|0]==58){break a}nm(G[b>>2],67246,j,h);break a}d=c+d|0;if(H[d|0]!=58){break a}G[321433]=0;e=G[47589];i=G[321432];d:{if(!(i|H[d+1|0]!=58)){d=e;break d}d=e+1|0;G[47589]=d;G[321433]=i+G[(e<<2)+b>>2];G[321432]=0}if((a|0)>=(d|0)){break a}G[321434]=f;f=58;if(H[c|0]==58){break a}f=63;if(!G[47590]){break a}nm(G[b>>2],67021,j,h)}Fa=g+16|0;return f}function ue(a,b,c){var d=0,e=0,f=0,g=0;d=Fa-96|0;Fa=d;e=G[c>>2];if((e|0)<=0){G[48624]=0;G[b>>2]=0;f=b,g=nc(a,d+92|0,10),G[f>>2]=g;if((H[G[d+92>>2]]|32)!=32){G[c>>2]=407}if(G[48624]==68){b=H[67017]|H[67018]<<8|(H[67019]<<16|H[67020]<<24);e=H[67013]|H[67014]<<8|(H[67015]<<16|H[67016]<<24);F[d+46>>1]=e;F[d+48>>1]=e>>>16;F[d+50>>1]=b;F[d+52>>1]=b>>>16;b=H[67011]|H[67012]<<8|(H[67013]<<16|H[67014]<<24);G[d+40>>2]=H[67007]|H[67008]<<8|(H[67009]<<16|H[67010]<<24);G[d+44>>2]=b;b=H[67003]|H[67004]<<8|(H[67005]<<16|H[67006]<<24);G[d+32>>2]=H[66999]|H[67e3]<<8|(H[67001]<<16|H[67002]<<24);G[d+36>>2]=b;b=H[66995]|H[66996]<<8|(H[66997]<<16|H[66998]<<24);G[d+24>>2]=H[66991]|H[66992]<<8|(H[66993]<<16|H[66994]<<24);G[d+28>>2]=b;b=H[66987]|H[66988]<<8|(H[66989]<<16|H[66990]<<24);G[d+16>>2]=H[66983]|H[66984]<<8|(H[66985]<<16|H[66986]<<24);G[d+20>>2]=b;b=H[66979]|H[66980]<<8|(H[66981]<<16|H[66982]<<24);G[d+8>>2]=H[66975]|H[66976]<<8|(H[66977]<<16|H[66978]<<24);G[d+12>>2]=b;b=H[66971]|H[66972]<<8|(H[66973]<<16|H[66974]<<24);G[d>>2]=H[66967]|H[66968]<<8|(H[66969]<<16|H[66970]<<24);G[d+4>>2]=b;tb(5,qb(d,a,25));G[c>>2]=412;G[48624]=0}e=G[c>>2]}Fa=d+96|0;return e}function ag(a,b,c,d,e,f,g){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;m=Fa-80|0;Fa=m;k=G[g>>2];if((k|0)<=0){Qd(a,m+76|0,g);nk(a,9,m,g);i=G[m+76>>2];if((i|0)<=0){c=1}else{r=i&1;a:{if((i|0)==1){k=0;l=1;break a}s=i&-2;k=0;l=1;while(1){i=G[(k<<2)+c>>2]-1|0;n=Au(l,o,i,i>>31);i=h;n=n+h|0;h=j+Ia|0;h=i>>>0>n>>>0?h+1|0:h;i=n;j=(k<<3)+m|0;l=Au(G[j>>2],G[j+4>>2],l,o);o=Ia;n=k|1;j=G[(n<<2)+c>>2]-1|0;p=Au(l,o,j,j>>31);i=i+p|0;j=Ia+h|0;j=i>>>0

>>0?j+1|0:j;h=i;k=k+2|0;i=(n<<3)+m|0;l=Au(G[i>>2],G[i+4>>2],l,o);o=Ia;q=q+2|0;if((s|0)!=(q|0)){continue}break}}if(r){c=G[(k<<2)+c>>2]-1|0;i=Au(l,o,c,c>>31)+h|0;c=j+Ia|0;c=h>>>0>i>>>0?c+1|0:c}else{c=j;i=h}h=c;c=i+1|0;h=c?h:h+1|0}b:{c:{switch(b-11|0){case 0:Sk(a,c,h,d,e,f,g);break b;case 1:Yo(a,c,h,d,e,f,g);break b;case 9:Vo(a,c,h,d,e,f,g);break b;case 10:Rk(a,c,h,d,e,f,g);break b;case 19:Po(a,c,h,d,e,f,g);break b;case 20:Fk(a,c,h,d,e,f,g);break b;case 29:To(a,c,h,d,e,f,g);break b;case 30:Mo(a,c,h,d,e,f,g);break b;case 69:Ro(a,c,h,d,e,f,g);break b;case 70:Gk(a,c,h,d,e,f,g);break b;case 31:Ho(a,c,h,d,e,f,g);break b;case 71:_o(a,c,h,d,e,f,g);break b;default:break c}}G[g>>2]=410}k=G[g>>2]}Fa=m+80|0;return k}function ah(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a:{if(!a){break a}b:{switch(H[a|0]-68|0){case 0:case 1:case 32:case 33:break a;default:break b}}b=Va(a);while(1){h=b;b=b-1|0;if(H[b+a|0]==32){continue}break}i=1;if((h|0)<=0){return 0}while(1){g=a+e|0;c=H[g|0];d=c;if((d|0)!=10){c:{if(!(f|(d|0)!=32)){f=0;break c}d:{e:{if((c-58&255)>>>0<=245){b=0;f:{switch(d-43|0){case 0:case 2:g:{switch(H[g+1|0]-43|0){case 0:case 2:break a;default:break g}}if(!e){break d}h:{c=H[g-1|0];switch(c-58|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 34:case 35:case 36:case 37:case 38:case 39:case 40:case 41:break a;case 0:case 10:case 11:case 42:case 43:break d;default:break h}}if((c|0)==32){break d}break a;case 3:case 15:case 25:case 26:case 57:case 58:break f;default:break a}}if((c-47&255)>>>0>10){break e}}f=f+1|0;break d}j=((d|0)==58)+j|0}if((d|0)!=46&d-100>>>0>=2){break c}i=2}e=e+1|0;if((h|0)!=(e|0)){continue}}break}b=0;if((f|0)<=0){break a}b=j?3:i}return b}function oj(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=Fa-16|0;Fa=i;G[321386]=0;while(1){c=a;a=a+1|0;if(H[c|0]==32){continue}break}d=i+12|0;e=vb(c,d);f=G[d>>2];if(jb(c,46)){G[321386]=46}b=E[f|0];g=b&255;a:{if(!g){break a}b:{c:{d:{switch(g-32|0){case 1:case 3:case 4:case 5:case 6:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:break a;case 2:case 7:break b;case 0:case 26:break c;default:break d}}switch(g-100|0){case 14:break b;case 0:case 4:case 9:break c;default:break a}}e:{if((f-c|0)>4){break e}a=E[f+1|0];if(a-48>>>0>=10&((a|0)!=32|E[f+2|0]-48>>>0>9)){break e}G[321386]=b;a=f+1|0;G[d>>2]=a;c=H[c|0]==45;e=c?-e:e;h=vb(a,d);f:{if((b|0)==109){j=h;break f}b=G[d>>2];a=H[b|0];g:{if(!((a|0)==32|(a|0)==109)&(a|0)!=58|(b-f|0)>3){break g}a=E[b+1|0];if(a-48>>>0>=10&((a|0)!=32|E[b+2|0]-48>>>0>9)){break g}a=b+1|0;G[d>>2]=a;j=vb(a,d)}k=e;e=h}h=k+e/60+j/3600;e=c?-h:h;break a}h:{switch(g-34|0){case 1:case 2:case 3:case 4:break a;case 0:case 5:break b;default:break h}}if((g|0)!=100){break a}}if(H[f+1|0]){break a}G[321386]=b;G[d>>2]=f+1}Fa=i+16|0;return e}function Rd(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0,m=0;if(G[f>>2]<=0){h=G[a>>2];g=G[a+4>>2];if((h|0)!=G[g+76>>2]){mb(a,h+1|0,0,f);g=G[a+4>>2]}h=G[g+72>>2];if((h|0)<0){Hc(a,Bu(G[g+56>>2],G[g+60>>2],2880,0),0,f);g=G[a+4>>2];h=G[g+72>>2]}j=G[((h<<2)+g|0)+1256>>2];i=G[g+56>>2]+Au(j,0,-2880,0)|0;h=i+(G[g+1252>>2]+M(h,2880)|0)|0;g=2880-i|0;if((c|0)>=2){k=1;while(1){l=(b|0)>(g|0);i=l?g:b;m=bb(e,h,i);e=m+i|0;a:{if(l){j=j+1|0;Hc(a,j,0,f);h=e;e=G[a+4>>2];e=G[e+1252>>2]+M(G[e+72>>2],2880)|0;g=b-i|0;bb(h,e,g);g=d+g|0;h=g+e|0;e=b+m|0;g=2880-g|0;break a}i=d+i|0;g=g-i|0;h=h+i|0}if(g-2881>>>0<=4294964415){b:{if((g|0)<=0){j=((2880-g>>>0)/2880|0)+j|0;h=(0-g>>>0)%2880|0;break b}j=j-((g-1>>>0)/2880|0)|0;h=2880-((g>>>0)%2880|0)|0}Hc(a,j,0,f);g=2880-h|0;i=G[a+4>>2];h=h+(G[i+1252>>2]+M(G[i+72>>2],2880)|0)|0}k=k+1|0;if((k|0)!=(c|0)){continue}break}}i=e;e=g;g=(b|0)>(g|0);e=g?e:b;h=bb(i,h,e);if(g){Hc(a,j+1|0,0,f);g=G[a+4>>2];bb(e+h|0,G[g+1252>>2]+M(G[g+72>>2],2880)|0,b-e|0)}a=G[a+4>>2];e=G[a+60>>2];d=M(c-1|0,d);b=M(b,c);g=b;c=d+g|0;b=(d>>31)+(g>>31)|0;b=c>>>0>>0?b+1|0:b;d=c;c=c+G[a+56>>2]|0;b=b+e|0;G[a+56>>2]=c;G[a+60>>2]=c>>>0>>0?b+1|0:b}}function qs(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=l|0;var m=0,n=0,o=0,p=0,q=0;o=G[a+8>>2];n=(G[a>>2]+M(c,3)|0)-2|0;h=L[(o+M(n,168)|0)+8>>3];a:{if(d){if(g>3];if(!(g>=h)|i>2];if(O(g)<2147483648){n=~~g}else{n=-2147483648}m=G[m+(n<<2)>>2];b:{if(!m){break b}while(1){if(!(+G[m+4>>2]<=f)){break b}e=e+1|0;m=G[m>>2];if(m){continue}break}}if((e&1)!=(d|0)|(l|0)<=0){break a}q=n<<2;n=0;while(1){c:{m=M(c+n|0,168)+o|0;h=L[m+8>>3];if(h>g){break c}i=L[m+16>>3];if(!(g>=h)|i>2]+q>>2];d:{if(!m){break d}while(1){if(!(+G[m+4>>2]<=f)){break d}e=e+1|0;m=G[m>>2];if(m){continue}break}}if((e&1)!=(d|0)){break c}p=1;b=b+n|0;if(!b){break a}G[a+12>>2]=b;return 1}n=n+1|0;if((n|0)!=(l|0)){continue}break}break a}e:{if(g>3];if(!(g>=h)|(!(i>=g)|g>i)){break e}b=G[(M(n,168)+o|0)+24>>2];if(O(g)<2147483648){a=~~g}else{a=-2147483648}m=G[b+(a<<2)>>2];if(!m){break e}e=0;while(1){if(+G[m+4>>2]<=f){e=e+1|0;m=G[m>>2];if(m){continue}}break}if(e&1){break a}}p=1}return p|0} -function wb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;i=Fa-96|0;Fa=i;d=G[c>>2];a:{if((d|0)>0){break a}e=G[a>>2];d=G[a+4>>2];if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);d=G[a+4>>2]}b:{e=G[d+128>>2];f=G[d+104>>2];if((e-f|0)!=80|G[d+132>>2]!=(G[d+108>>2]+(e>>>0>>0)|0)){break b}if((Bf(a,1,0,c)|0)<=0){break b}d=G[c>>2];break a}d=0;e=rb(i,b,80);E[e+80|0]=0;f=Va(e);c:{if(f){if((f|0)!=1){h=f&-2;b=0;while(1){g=d+e|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}g=e+(d|1)|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}d=d+2|0;b=b+2|0;if((h|0)!=(b|0)){continue}break}}d:{if(!(f&1)){break d}b=d+e|0;if((H[b|0]-127&255)>>>0>160){break d}E[b|0]=32}if(f>>>0>79){break c}}cb(e+f|0,32,80-f|0)}d=qc(e,36178);e:{f:{if(!gc(66587,e,8)){b=8;break f}b=8;if(!gc(66546,e,8)){break f}if(!gc(68289,e,8)){break f}if(!gc(35367,e,8)){break f}b=(d|0)==80?8:d;if(!b){break e}}d=0;while(1){h=d+e|0;f=E[h|0];E[h|0]=f-97>>>0<26?f&95:f;d=d+1|0;if((d|0)!=(b|0)){continue}break}}ve(e,c);b=G[a+4>>2];Jb(a,G[b+104>>2],G[b+108>>2],1,c);Wb(a,80,0,e,c);d=G[c>>2];if((d|0)>0){break a}b=G[a+4>>2];a=G[b+108>>2];c=G[b+104>>2]+80|0;a=c>>>0<80?a+1|0:a;G[b+104>>2]=c;G[b+108>>2]=a}Fa=i+96|0;return d}function ip(a,b){var 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;f=G[a+124>>2];d=f;c=f>>>2|0;f=G[a+120>>2];j=f>>>0>2]?d:c;d=G[a+108>>2];c=(d-G[a+44>>2]|0)+262|0;n=c>>>0>d>>>0?0:c;c=G[a+144>>2];i=G[a+116>>2];o=c>>>0>>0?c:i;k=G[a+56>>2];h=d+k|0;p=h+258|0;d=f+h|0;l=H[d|0];m=H[d-1|0];q=G[a+52>>2];r=G[a+64>>2];while(1){a:{e=b+k|0;d=f+e|0;b:{if(H[d|0]!=(l|0)|H[d-1|0]!=(m|0)|H[e|0]!=H[h|0]){break b}d=2;if(H[e+1|0]!=H[h+1|0]){break b}c:{d:{e:{f:{g:{h:{i:{while(1){c=d+h|0;if(H[c+1|0]!=H[e+3|0]){break d}if(H[c+2|0]!=H[e+4|0]){break e}if(H[c+3|0]!=H[e+5|0]){break f}if(H[c+4|0]!=H[e+6|0]){break g}if(H[c+5|0]!=H[e+7|0]){break h}if(H[c+6|0]!=H[e+8|0]){break i}if(H[c+7|0]==H[e+9|0]){c=d+8|0;g=c+h|0;if(H[g|0]!=H[e+10|0]){break c}e=e+8|0;s=d>>>0<250;d=c;if(s){continue}break c}break}g=c+7|0;break c}g=c+6|0;break c}g=c+5|0;break c}g=c+4|0;break c}g=c+3|0;break c}g=c+2|0;break c}g=c+1|0}c=g-p|0;d=c+258|0;if((d|0)<=(f|0)){break b}G[a+112>>2]=b;if((d|0)>=(o|0)){f=d;break a}l=H[d+h|0];m=H[(c+h|0)+257|0];f=d}b=I[((b&q)<<1)+r>>1];if(n>>>0>=b>>>0){break a}j=j-1|0;if(j){continue}}break}return f>>>0>>0?f:i}function Wn(a,b,c){var d=0,e=0;d=Fa-208|0;Fa=d;a:{if(G[c>>2]>0){break a}if(!H[a|0]){G[c>>2]=204;break a}Yn(a,d+207|0,d+12|0,b,d+112|0,d,c);b:{c:{e=H[d+207|0];d:{if(!((e|0)!=88&(e|0)!=67)){G[c>>2]=404;break d}if(G[c>>2]<=0){break c}}G[b>>2]=0;b=H[67441]|H[67442]<<8|(H[67443]<<16|H[67444]<<24);G[d+56>>2]=H[67437]|H[67438]<<8|(H[67439]<<16|H[67440]<<24);G[d+60>>2]=b;b=H[67433]|H[67434]<<8|(H[67435]<<16|H[67436]<<24);G[d+48>>2]=H[67429]|H[67430]<<8|(H[67431]<<16|H[67432]<<24);G[d+52>>2]=b;b=H[67425]|H[67426]<<8|(H[67427]<<16|H[67428]<<24);G[d+40>>2]=H[67421]|H[67422]<<8|(H[67423]<<16|H[67424]<<24);G[d+44>>2]=b;b=H[67417]|H[67418]<<8|(H[67419]<<16|H[67420]<<24);G[d+32>>2]=H[67413]|H[67414]<<8|(H[67415]<<16|H[67416]<<24);G[d+36>>2]=b;b=H[67409]|H[67410]<<8|(H[67411]<<16|H[67412]<<24);G[d+24>>2]=H[67405]|H[67406]<<8|(H[67407]<<16|H[67408]<<24);G[d+28>>2]=b;b=H[67401]|H[67402]<<8|(H[67403]<<16|H[67404]<<24);G[d+16>>2]=H[67397]|H[67398]<<8|(H[67399]<<16|H[67400]<<24);G[d+20>>2]=b;tb(5,qb(d+16|0,a,30));break b}e:{f:{switch(e-70|0){case 3:a=G[d+12>>2]!=0;break e;case 0:break f;default:break b}}a=L[d>>3]!=0}G[b>>2]=a}}Fa=d+208|0}function gr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=G[c+4>>2];g=L[c+40>>3];a:{if(g==0){b:{if((h|0)==301){f=L[c+112>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=70;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=45;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];c:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break c}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=99;G[c+1888>>2]=100;L[c+112>>3]=f;L[c+120>>3]=g}i=d,j=f*a*Mb(b),L[i>>3]=j;a=L[c+112>>3]*b;break a}d:{if((h|0)==601){f=L[c+128>>3];break d}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=66;E[c+1|0]=79;E[c+2|0]=78;E[c+3|0]=0;E[c+4|0]=89;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];e:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;f=Mb(g)*57.29577951308232/Kb(L[c+40>>3])+L[c+40>>3];break e}L[c+120>>3]=f*3.141592653589793/180;f=f*(Mb(g)/Kb(L[c+40>>3])+L[c+40>>3]*3.141592653589793/180)}G[c+1892>>2]=135;G[c+1888>>2]=136;L[c+128>>3]=f}f=f-b*L[c+120>>3];a=L[c+24>>3]*a*Mb(b)/f;i=d,j=f*Kb(a),L[i>>3]=j;a=L[c+128>>3]-f*Mb(a)}L[e>>3]=a;return 0}function cr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;if(G[c+4>>2]!=801){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=72;E[c+1|0]=80;E[c+2|0]=88;E[c+3|0]=0;E[c+4|0]=33;E[c+5|0]=3;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;h=L[c+48>>3];a:{if(O(h)<2147483648){i=~~h;break a}i=-2147483648}G[c+272>>2]=(i|0)%2;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;break b}g=57.29577951308232/f;f=f*3.141592653589793/180}L[c+112>>3]=f;G[c+1892>>2]=139;G[c+1888>>2]=140;L[c+120>>3]=g;j=h+-1;L[c+128>>3]=j/h;L[c+144>>3]=(h+1)*.5;g=L[c+40>>3];L[c+168>>3]=g/360;k=180/g;L[c+160>>3]=k;L[c+152>>3]=j*90/g;h=h*90/g;L[c+136>>3]=h;L[c+184>>3]=f*k;L[c+176>>3]=f*h}f=Kb(b);h=O(f);c:{d:{if(h<=L[c+128>>3]){L[d>>3]=L[c+112>>3]*a;a=f*L[c+176>>3];break d}g=L[c+168>>3];i=d;k=L[c+112>>3];j=a;f=L[c+40>>3];e:{if(O(f)<2147483648){d=~~f;break e}d=-2147483648}d=(d|0)%2|0;f:{if(b<=0?G[c+272>>2]?d:1-d|0:d){g=S(g*a+0);a=g+g+f;break f}g=S(g*a);a=g+g+f+1}a=a*L[c+160>>3]+-180;f=V((1-h)*L[c+48>>3]);L[i>>3]=k*((j-a)*f+a);a=L[c+184>>3]*(L[c+144>>3]-f);L[e>>3]=a;if(!(b<0)){break c}a=-a}L[e>>3]=a}return 0}function js(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=Fa-16|0;Fa=q;G[q+12>>2]=j;a:{m=G[a+8>>2];r=(G[a>>2]+M(c,3)|0)-2|0;s=M(r,168);n=m+s|0;k=G[n+32>>2];if(k){break a}l=lb(1e3,8);G[n+32>>2]=l;j=0;G[n+28>>2]=0;k=1e3;while(1){if((j|0)>=(k|0)){k=k+1e3|0;j=ub(l,k<<3);m=G[a+8>>2];G[(s+m|0)+32>>2]=j}o=G[q+12>>2]+7&-8;G[q+12>>2]=o+8;j=m+s|0;l=G[j+32>>2];n=G[j+28>>2];p=L[o>>3];L[l+(n<<3)>>3]=p;b:{if(!(O(p+-9007199254740992)<=1e-15)){break b}o=n-1|0;if(!(O(L[(o<<3)+l>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=o;j=M(r,168);k=j+G[a+8>>2]|0;k=ub(G[k+32>>2],G[k+28>>2]<<3);m=G[a+8>>2];G[(j+m|0)+32>>2]=k;break a}o=j;j=n+1|0;G[o+28>>2]=j;continue}}j=G[(m+s|0)+28>>2];c:{if((j|0)==2){l=re(a,b,c,d,e,f,g,h,i,L[k>>3],L[k+8>>3]);break c}p=L[((j<<3)+k|0)-8>>3];t=L[k>>3];if(d){l=0;if(!re(a,0,r,d,e,f,g,h,i,t,p)){break c}m=(j|0)>0?j:0;j=0;while(1){if((j|0)==(m|0)){l=0;break c}l=1;o=b+j|0;n=c+j|0;p=L[(j<<3)+k>>3];j=j+1|0;if(!re(a,o,n,d,e,f,g,h,i,p,L[(j<<3)+k>>3])){continue}break}break c}l=!re(a,0,r,1,e,f,g,h,i,t,p)}Fa=q+16|0;return l|0}function ic(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=G[e>>2];if((f|0)<=0){f=G[a>>2];if((f|0)!=G[G[a+4>>2]+76>>2]){mb(a,f+1|0,0,e)}f=G[a+4>>2];a:{if((c|0)>=0&b>>>0>=8640|(c|0)>0){g=G[f+60>>2];k=g;f=G[f+56>>2];m=Bu(f,g,2880,0);c=c+g|0;g=b+f|0;c=g>>>0>>0?c+1|0:c;j=c;c=Bu(g-1|0,c-!g|0,2880,0);while(1){l=G[a+4>>2];i=l+(h<<2)|0;b:{if(!G[i+1416>>2]){break b}i=G[i+1256>>2];if((i|0)<(m|0)|(c|0)<(i|0)){break b}Hg(l,h,e)}h=h+1|0;if((h|0)!=40){continue}break}c=G[a+4>>2];if(G[c+64>>2]!=(f|0)|G[c+68>>2]!=(k|0)){Ja[G[(M(G[c+4>>2],84)+1240576|0)+72>>2]](G[c>>2],f,k)|0;c=G[a+4>>2]}Lj(c,b,d,e);a=G[a+4>>2];G[a+64>>2]=g;G[a+68>>2]=j;break a}g=G[f+72>>2];if((g|0)<0){Hc(a,Bu(G[f+56>>2],G[f+60>>2],2880,0),0,e);f=G[a+4>>2];g=G[f+72>>2]}h=b;if(!b){break a}b=G[f+56>>2]+Au(G[((g<<2)+f|0)+1256>>2],0,-2880,0)|0;g=b;f=2880-b|0;while(1){b=G[a+4>>2];c=(G[b+1252>>2]+M(G[b+72>>2],2880)|0)+g|0;b=(f|0)>(h|0)?h:f;j=bb(d,c,b);c=G[a+4>>2];d=c;f=b+G[c+56>>2]|0;c=G[c+60>>2]+(b>>31)|0;c=b>>>0>f>>>0?c+1|0:c;G[d+56>>2]=f;G[d+60>>2]=c;h=h-b|0;if(!h){break a}g=0;Hc(a,Bu(f,c,2880,0),0,e);d=b+j|0;f=2880;continue}}f=G[e>>2]}return f}function Zf(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;i=Fa-336|0;Fa=i;G[i+156>>2]=0;g=G[f>>2];if((g|0)<=0){g=i+80|0;zb(34647,b,g,f);E[i+160|0]=0;if((kc(a,g,i+240|0,i+156|0)|0)<=0){mc(i+240|0,i+160|0,0,i+156|0)}E[i|0]=0;fd(i+160|0,i,i+156|0);g=Fa-144|0;Fa=g;a:{if(G[f>>2]>0){break a}b:{c:{if(b){h=G[a>>2];if((h|0)!=G[G[a+4>>2]+76>>2]){mb(a,h+1|0,0,f)}d:{if((b|0)>0){h=G[a+4>>2];if(G[h+936>>2]>=(b|0)){break d}}a=302;break b}a=b-1|0;h=G[h+968>>2];if(!H[i|0]){break c}k=h+M(a,160)|0}G[d>>2]=0;h=jb(i,40);if(h){a=1;while(1){h=h+1|0;G[g+140>>2]=h;j=nc(h,g+140|0,10);h=G[d>>2];if((h|0)<(c|0)){G[(h<<2)+e>>2]=j}if((j|0)<0){Ua(58200);Ua(i);a=263;break b}G[d>>2]=h+1;l=G[g+140>>2];h=jb(l,44);G[g+140>>2]=h;a=M(a,j);if(h){continue}break}if(!jb(l,41)){G[g+16>>2]=i;Ya(g+48|0,81,9451,g+16|0);a=263;break b}if(!b|G[k+80>>2]<=0){break a}b=G[k+88>>2];if((b|0)==(a|0)){break a}G[g+36>>2]=a;G[g+32>>2]=b;a=g+48|0;Ya(a,81,27638,g+32|0);Ua(a);Ua(i);a=263;break b}G[g>>2]=i;Ya(g+48|0,81,9451,g);a=263;break b}G[d>>2]=1;if((c|0)<=0){break a}G[e>>2]=G[(h+M(a,160)|0)+88>>2];break a}G[f>>2]=a}Fa=g+144|0;g=G[f>>2]}Fa=i+336|0;return g}function Ji(a,b,c,d,e,f){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;h=(d|0)>(e|0)?d:e;q=oc(+N(h|0))/.6931471805599453+.5;a:{if(O(q)<2147483648){g=~~q;break a}g=-2147483648}b:{c:{d:{l=M((e+1|0)/2|0,(d+1|0)/2|0);i=ab(l);if(i){if((f|0)<=0){break c}j=f-1|0;m=g+((h|0)>1<>g&15;e:{if(f){if((f|0)!=15){break b}r=i,s=wh(a),E[r|0]=s;k=1;f=n;g=e;h=d;o=1;p=1;while(1){f=f>>1;p=(p<<1)-((h|0)<=(f|0))|0;o=(o<<1)-((f|0)>=(g|0))|0;zo(a,i,p,o,i);g=g-((f|0)<(g|0)?f:0)|0;h=h-((f|0)<(h|0)?f:0)|0;k=k+1|0;if((m|0)!=(k|0)){continue}break}break e}Hi(a,l,i)}yo(i,d,e,b,c,j);f=(j|0)>0;j=j-1|0;if(f){continue}break}break c}Ua(3057);return 414}while(1){f=G[48836];g=G[48835];if((g|0)<=3){h=G[48834];n=H[h+a|0];G[48834]=h+1;f=n|f<<8;G[48836]=f;g=g+8|0}g=g-4|0;G[48835]=g;f:{g:{f=f>>g&15;if(f){if((f|0)==15){break g}else{break b}}Hi(a,l,i);break f}r=i,s=wh(a),E[r|0]=s}yo(i,d,e,b,c,j);f=(j|0)>0;j=j-1|0;if(f){continue}break}}Wa(i);return 0}Ua(25234);return 414}function Ii(a,b,c,d,e,f){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;h=(d|0)>(e|0)?d:e;q=oc(+N(h|0))/.6931471805599453+.5;a:{if(O(q)<2147483648){g=~~q;break a}g=-2147483648}b:{c:{d:{l=M((e+1|0)/2|0,(d+1|0)/2|0);i=ab(l);if(i){if((f|0)<=0){break c}j=f-1|0;m=g+((h|0)>1<>g&15;e:{if(f){if((f|0)!=15){break b}r=i,s=wh(a),E[r|0]=s;k=1;f=n;g=e;h=d;o=1;p=1;while(1){f=f>>1;p=(p<<1)-((h|0)<=(f|0))|0;o=(o<<1)-((f|0)>=(g|0))|0;zo(a,i,p,o,i);g=g-((f|0)<(g|0)?f:0)|0;h=h-((f|0)<(h|0)?f:0)|0;k=k+1|0;if((m|0)!=(k|0)){continue}break}break e}Hi(a,l,i)}xo(i,d,e,b,c,j);f=(j|0)>0;j=j-1|0;if(f){continue}break}break c}Ua(3185);return 414}while(1){f=G[48836];g=G[48835];if((g|0)<=3){h=G[48834];n=H[h+a|0];G[48834]=h+1;f=n|f<<8;G[48836]=f;g=g+8|0}g=g-4|0;G[48835]=g;f:{g:{f=f>>g&15;if(f){if((f|0)==15){break g}else{break b}}Hi(a,l,i);break f}r=i,s=wh(a),E[r|0]=s}xo(i,d,e,b,c,j);f=(j|0)>0;j=j-1|0;if(f){continue}break}}Wa(i);return 0}Ua(25264);return 414}function ns(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=Fa-16|0;Fa=o;G[o+12>>2]=j;a:{k=G[a+8>>2];r=G[a>>2]+M(c,3)|0;p=r-2|0;n=M(p,168);l=k+n|0;b=G[l+32>>2];if(b){break a}b=lb(1e3,8);G[l+32>>2]=b;j=0;G[l+28>>2]=0;l=1e3;while(1){if((j|0)>=(l|0)){l=l+1e3|0;b=ub(b,l<<3);k=G[a+8>>2];G[(n+k|0)+32>>2]=b}m=G[o+12>>2]+7&-8;G[o+12>>2]=m+8;j=k+n|0;b=G[j+32>>2];q=G[j+28>>2];f=L[m>>3];L[b+(q<<3)>>3]=f;b:{if(!(O(f+-9007199254740992)<=1e-15)){break b}m=q-1|0;if(!(O(L[(m<<3)+b>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=m;j=M(p,168);b=j+G[a+8>>2]|0;b=ub(G[b+32>>2],G[b+28>>2]<<3);k=G[a+8>>2];G[(j+k|0)+32>>2]=b;break a}m=j;j=q+1|0;G[m+28>>2]=j;continue}}j=G[(k+n|0)+28>>2];k=j-1|0;f=L[(k<<3)+b>>3];c:{if((k|0)==2){uf(a,j,c,d,e,f,f,h,i,L[b>>3],L[b+8>>3],f);break c}k=(j<<3)+b|0;uf(a,j,p,d,e,f,f,h,i,L[k-24>>3],L[k-16>>3],f);uf(a,j,r-1|0,d,e,f,f,h,i,L[b>>3],L[b+8>>3],f);if((j|0)<4){break c}n=j-4>>>1|0;j=0;k=2;while(1){l=k<<3;uf(a,j,c+j|0,d,e,f,f,h,i,L[l+b>>3],L[(l|8)+b>>3],f);k=k+2|0;l=(j|0)!=(n|0);j=j+1|0;if(l){continue}break}}Fa=o+16|0}function ms(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;o=Fa-16|0;Fa=o;G[o+12>>2]=j;a:{k=G[a+8>>2];r=G[a>>2]+M(c,3)|0;p=r-2|0;n=M(p,168);l=k+n|0;b=G[l+32>>2];if(b){break a}b=lb(1e3,8);G[l+32>>2]=b;j=0;G[l+28>>2]=0;l=1e3;while(1){if((j|0)>=(l|0)){l=l+1e3|0;b=ub(b,l<<3);k=G[a+8>>2];G[(n+k|0)+32>>2]=b}m=G[o+12>>2]+7&-8;G[o+12>>2]=m+8;j=k+n|0;b=G[j+32>>2];q=G[j+28>>2];f=L[m>>3];L[b+(q<<3)>>3]=f;b:{if(!(O(f+-9007199254740992)<=1e-15)){break b}m=q-1|0;if(!(O(L[(m<<3)+b>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=m;j=M(p,168);b=j+G[a+8>>2]|0;b=ub(G[b+32>>2],G[b+28>>2]<<3);k=G[a+8>>2];G[(j+k|0)+32>>2]=b;break a}m=j;j=q+1|0;G[m+28>>2]=j;continue}}j=G[(k+n|0)+28>>2];k=j-1|0;f=L[(k<<3)+b>>3];c:{if((k|0)==2){tf(a,j,c,d,e,f,f,h,i,L[b>>3],L[b+8>>3],f);break c}k=(j<<3)+b|0;tf(a,j,p,d,e,f,f,h,i,L[k-24>>3],L[k-16>>3],f);tf(a,j,r-1|0,d,e,f,f,h,i,L[b>>3],L[b+8>>3],f);if((j|0)<4){break c}n=j-4>>>1|0;j=0;k=2;while(1){l=k<<3;tf(a,j,c+j|0,d,e,f,f,h,i,L[l+b>>3],L[(l|8)+b>>3],f);k=k+2|0;l=(j|0)!=(n|0);j=j+1|0;if(l){continue}break}}Fa=o+16|0}function fr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;a:{if(G[c+4>>2]==602){g=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=67;E[c+2|0]=79;E[c+3|0]=0;E[c+4|0]=90;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;h=1;g=1;f=114.59155902616465;break b}h=f*3.141592653589793/180;g=1/h;f=f+f}G[c+1892>>2]=137;G[c+1888>>2]=138;L[c+112>>3]=h;L[c+128>>3]=f;L[c+120>>3]=g}f=O(g*b);if(f<1e-12){L[d>>3]=g*a;G[e>>2]=0;G[e+4>>2]=0;return 0}if(O(f+-90)<1e-12){G[d>>2]=0;G[d+4>>2]=0;L[e>>3]=b<0?-90:90;return 0}g=b>0?90:-90;f=b-L[c+112>>3]*g;n=a*a;k=f*f+n;l=-999;h=0;while(1){if(l<-100){f=(h+g)*.5}else{f=.1;i=k/(k-l);c:{if(i<.1){break c}f=i;if(!(f>.9)){break c}f=.9}f=g-f*(g-h)}L[e>>3]=f;j=L[c+112>>3];i=Xe(f);j=b-j*f;f=j*(j-L[c+128>>3]/i)+n;if(!(O(f)<1e-12|O(g-h)<1e-12)){m=f>0;l=m?l:f;k=m?f:k;f=L[e>>3];g=m?f:g;h=m?h:f;o=o+1|0;if((o|0)!=64){continue}}break}b=L[c+24>>3]-j*i;a=i*a;if(!(b!=0|a!=0)){G[d>>2]=0;G[d+4>>2]=0;return 0}p=d,q=Ac(a,b)/Kb(L[e>>3]),L[p>>3]=q;return 0}function de(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=G[d>>2];if((e|0)<=0){e=G[a>>2];g=G[a+4>>2];a:{b:{if((e|0)!=G[g+76>>2]){mb(a,e+1|0,0,d);break b}if((G[g+128>>2]&G[g+132>>2])!=-1){break b}if((Rb(a,d)|0)>0){break a}}h=G[a+4>>2];if(!G[h+80>>2]){a=G[h+136>>2];i=(a|0)<(b|0)?a:b;if((i|0)<=0){break a}b=0;if(i-1>>>0>=3){e=i&-4;g=h+144|0;while(1){G[(f<<2)+c>>2]=G[g+(f<<3)>>2];a=f|1;G[(a<<2)+c>>2]=G[g+(a<<3)>>2];a=f|2;G[(a<<2)+c>>2]=G[g+(a<<3)>>2];a=f|3;G[(a<<2)+c>>2]=G[g+(a<<3)>>2];f=f+4|0;j=j+4|0;if((e|0)!=(j|0)){continue}break}}e=i&3;if(!e){break a}while(1){G[(f<<2)+c>>2]=G[(h+(f<<3)|0)+144>>2];f=f+1|0;b=b+1|0;if((e|0)!=(b|0)){continue}break}break a}if(G[h+1088>>2]){a=G[h+1108>>2];e=(a|0)<(b|0)?a:b;if((e|0)<=0){break a}if(e-1>>>0>=3){b=e&-4;k=h+1112|0;while(1){g=f<<2;G[g+c>>2]=G[g+k>>2];a=g|4;G[a+c>>2]=G[a+k>>2];a=g|8;G[a+c>>2]=G[a+k>>2];a=g|12;G[a+c>>2]=G[a+k>>2];f=f+4|0;i=i+4|0;if((b|0)!=(i|0)){continue}break}}b=e&3;if(!b){break a}while(1){a=f<<2;G[a+c>>2]=G[(a+h|0)+1112>>2];f=f+1|0;j=j+1|0;if((b|0)!=(j|0)){continue}break}break a}G[d>>2]=233}e=G[d>>2]}return e|0}function bb(a,b,c){var d=0,e=0,f=0;if(c>>>0>=512){Da(a|0,b|0,c|0);return a}e=a+c|0;a:{if(!((a^b)&3)){b:{if(!(a&3)){c=a;break b}if(!c){c=a;break b}c=a;while(1){E[c|0]=H[b|0];b=b+1|0;c=c+1|0;if(!(c&3)){break b}if(c>>>0>>0){continue}break}}d=e&-4;c:{if(d>>>0<64){break c}f=d+-64|0;if(f>>>0>>0){break c}while(1){G[c>>2]=G[b>>2];G[c+4>>2]=G[b+4>>2];G[c+8>>2]=G[b+8>>2];G[c+12>>2]=G[b+12>>2];G[c+16>>2]=G[b+16>>2];G[c+20>>2]=G[b+20>>2];G[c+24>>2]=G[b+24>>2];G[c+28>>2]=G[b+28>>2];G[c+32>>2]=G[b+32>>2];G[c+36>>2]=G[b+36>>2];G[c+40>>2]=G[b+40>>2];G[c+44>>2]=G[b+44>>2];G[c+48>>2]=G[b+48>>2];G[c+52>>2]=G[b+52>>2];G[c+56>>2]=G[b+56>>2];G[c+60>>2]=G[b+60>>2];b=b- -64|0;c=c- -64|0;if(f>>>0>=c>>>0){continue}break}}if(c>>>0>=d>>>0){break a}while(1){G[c>>2]=G[b>>2];b=b+4|0;c=c+4|0;if(d>>>0>c>>>0){continue}break}break a}if(e>>>0<4){c=a;break a}d=e-4|0;if(d>>>0>>0){c=a;break a}c=a;while(1){E[c|0]=H[b|0];E[c+1|0]=H[b+1|0];E[c+2|0]=H[b+2|0];E[c+3|0]=H[b+3|0];b=b+4|0;c=c+4|0;if(d>>>0>=c>>>0){continue}break}}if(c>>>0>>0){while(1){E[c|0]=H[b|0];b=b+1|0;c=c+1|0;if((e|0)!=(c|0)){continue}break}}return a}function Em(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=Fa-80|0;Fa=d;j=L[a>>3];k=L[b>>3];g=k*3.141592653589793/180;c=eb(g);f=j*3.141592653589793/180;h=ib(f);f=eb(f);g=ib(g);f=f*c;c=h*c;h=g*-.198076386122+(f*-.87343710801+c*-.444829589425);i=g*-.867666135858+(f*-.054875539726+c*.494109453312);e=Db(h,i);e=e<0?e+6.283185307179586:e;e=(e>6.283185307179586?e+-6.283185307179586:e)*180/3.141592653589793;L[a>>3]=e;c=Db(g*.455983795705+(f*-.483834985808+c*.74698225181),V(i*i+h*h))*180/3.141592653589793;L[b>>3]=c;if(G[321348]){L[d+72>>3]=k;L[d+64>>3]=j;l=G[24367];xb(l,72182,d- -64|0);a=ab(32);m=c<0;c=m?-c:c;a:{if(O(c)<2147483648){b=~~c;break a}b=-2147483648}G[d+36>>2]=b;G[d+32>>2]=m?45:43;c=(c-+(b|0))*60;b:{if(O(c)<2147483648){b=~~c;break b}b=-2147483648}G[d+40>>2]=b;L[d+48>>3]=(c-+(b|0))*60;c=e/15;c:{if(O(c)<2147483648){b=~~c;break c}b=-2147483648}G[d+16>>2]=b;c=(c-+(b|0))*60;d:{if(O(c)<2147483648){b=~~c;break d}b=-2147483648}G[d+20>>2]=b;L[d+24>>3]=(c-+(b|0))*60;Eb(a,19241,d+16|0);if(H[a+6|0]==32){E[a+6|0]=48}if(H[a+20|0]==32){E[a+20|0]=48}G[d>>2]=a;_a(l,69349,d);Wa(a)}Fa=d+80|0}function Dm(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=Fa-80|0;Fa=d;k=L[a>>3];c=L[b>>3];h=c*3.141592653589793/180;f=eb(h);g=k*3.141592653589793/180;i=ib(g);g=eb(g);h=ib(h);g=g*f;f=i*f;i=h*.74698225181+(g*.494109453312+f*-.444829589425);j=h*-.483834985808+(g*-.054875539726+f*-.87343710801);e=Db(i,j);e=e<0?e+6.283185307179586:e;e=(e>6.283185307179586?e+-6.283185307179586:e)*180/3.141592653589793;L[a>>3]=e;f=Db(h*.455983795705+(g*-.867666135858+f*-.198076386122),V(j*j+i*i))*180/3.141592653589793;L[b>>3]=f;if(G[321348]){a=ab(32);b=c<0;G[d+48>>2]=b?45:43;c=b?-c:c;a:{if(O(c)<2147483648){b=~~c;break a}b=-2147483648}G[d+52>>2]=b;c=(c-+(b|0))*60;b:{if(O(c)<2147483648){b=~~c;break b}b=-2147483648}G[d+56>>2]=b;L[d- -64>>3]=(c-+(b|0))*60;c=k/15;c:{if(O(c)<2147483648){b=~~c;break c}b=-2147483648}G[d+32>>2]=b;c=(c-+(b|0))*60;d:{if(O(c)<2147483648){b=~~c;break d}b=-2147483648}G[d+36>>2]=b;L[d+40>>3]=(c-+(b|0))*60;Eb(a,19241,d+32|0);if(H[a+6|0]==32){E[a+6|0]=48}if(H[a+20|0]==32){E[a+20|0]=48}G[d+16>>2]=a;b=G[24367];_a(b,69322,d+16|0);L[d+8>>3]=f;L[d>>3]=e;xb(b,72116,d);Wa(a)}Fa=d+80|0}function qg(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c=Fa+-64|0;Fa=c;a:{if(L[a+144>>3]<1.5?1:L[a+136>>3]<1.5){b=L[a+48>>3];L[a+3200>>3]=b;L[a+3216>>3]=b+180;L[a+3208>>3]=b+90;break a}if(G[a+3964>>2]==6){break a}L[a+32>>3]=O(L[a+32>>3]);L[a+40>>3]=O(L[a+40>>3]);d=L[a+16>>3];h=L[a+24>>3];cc(a,d,h,c+48|0,c+40|0);i=a+40|0;j=a+32|0;b=L[c+48>>3];b:{if(G[a+3304>>2]){e=L[c+40>>3];f=a+3912|0;pf(a,b+L[a+40>>3],e,f,c+24|0,c+8|0,c+60|0);g=j;break b}e=L[c+40>>3];f=a+3912|0;pf(a,b+L[a+32>>3],e,f,c+24|0,c+8|0,c+60|0);g=i}pf(a,b,e+L[g>>3],f,c+32|0,c+16|0,c+60|0);b=Db(L[c+16>>3]-h,L[c+32>>3]-d)*180/3.141592653589793;e=b<-90?b+360:b;L[a+3208>>3]=e;k=L[c+24>>3];l=L[c+8>>3];b=e+(e<-90?270:-90);L[a+3200>>3]=b;d=Db(l-h,k-d)*180/3.141592653589793;d=d<-90?d+360:d;L[a+3216>>3]=d;g=G[a+3304>>2];c:{if(g){b=b+90;L[a+48>>3]=b;if(!(b<0)){break c}b=b+360}L[a+48>>3]=b}f=b<0;b=f?b+360:b;if(b>=360|f){L[a+48>>3]=b>=360?b+-360:b}f=a;b=e-d;a=b>80&b<100;b=d-e;a=a|(b<280&b>260|b<-80&b>-100);G[f+3256>>2]=a;if(g){if(!a){break a}L[i>>3]=-L[i>>3];break a}if(a){break a}L[j>>3]=-L[j>>3]}Fa=c- -64|0}function re(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;var l=0,m=0,n=0,o=0;a:{b:{if(j==0){if(k==0){return!d|0}m=G[a+8>>2];if(d){e=m+M(c,168)|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){e=~~g}else{e=-2147483648}e=G[l+(e<<2)>>2];l=0;c:{if(!e){break c}l=0;if(!(L[n+8>>3]<=g)){break c}l=0;if(!(L[(m+M(c,168)|0)+16>>3]>=g)){break c}l=0;if(!(+G[e+4>>2]<=f)){break c}l=+G[G[e>>2]+4>>2]>=f}if((l|0)!=(d|0)){break a}o=1;if(!b){break a}if(d){break b}break a}m=G[a+8>>2];if(d){e=m+M(c,168)|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){e=~~g}else{e=-2147483648}e=G[l+(e<<2)>>2];l=0;d:{if(!e){break d}l=0;if(!(L[n+8>>3]<=g)){break d}l=0;if(!(L[(m+M(c,168)|0)+16>>3]>=g)){break d}g=+G[e+4>>2];c=G[e>>2];m=G[c>>2];if(m){l=0;if(!(f>=g)){break d}l=0;if(!(+G[G[m>>2]+4>>2]>=f)){break d}l=1;if(!(+G[c+4>>2]<=f)){break d}l=!(+G[m+4>>2]>=f);break d}l=0;if(!(f>=g)){break d}l=+G[c+4>>2]>=f}if((l|0)!=(d|0)){break a}o=1;if(!b|!d){break a}}G[a+12>>2]=b}return o|0}function En(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;f=Fa-176|0;Fa=f;if(!((b|0)<=0|G[e>>2]>0)){while(1){G[f+172>>2]=0;e=k;k=e+1|0;g=f+96|0;h=f+172|0;zb(34813,k,g,h);i=f+8|0;Cb(a,82,g,i,0,h);l=G[f+172>>2];G[f+172>>2]=0;j=L[f+8>>3];zb(32948,k,g,h);Cb(a,82,g,i,0,h);g=0;if(!G[f+172>>2]){m=L[f+8>>3];g=e<<3;n=(m-L[g+c>>3])/L[d+g>>3]+.5;L[f+8>>3]=n;Jd(a,f+96|0,n,-14,f+172|0);g=!l&m==1&j==1}G[f+172>>2]=0;h=f+96|0;i=f+172|0;zb(33351,k,h,i);Cb(a,82,h,f+8|0,0,i);a:{if(G[f+172>>2]){i=(e<<3)+d|0;e=0;while(1){G[f+172>>2]=0;e=e+1|0;g=f+16|0;h=f+172|0;zb(35841,e,g,h);l=Va(g)+g|0;E[l|0]=95;E[l+1|0]=0;l=g;g=f+96|0;zb(l,k,g,h);Cb(a,82,g,f+8|0,0,h);if(!G[f+172>>2]){j=L[f+8>>3]*L[i>>3];L[f+8>>3]=j;Jd(a,f+96|0,j,-14,f+172|0)}if((b|0)!=(e|0)){continue}break}break a}j=L[f+8>>3];h=e<<3;i=h+d|0;m=j*L[i>>3];L[f+8>>3]=m;Jd(a,f+96|0,m,-14,f+172|0);if(!g|j!=1){break a}G[f+8>>2]=0;G[f+12>>2]=1072693248;e=f+96|0;g=f+172|0;zb(32948,k,e,g);Jd(a,e,L[f+8>>3],-14,g);zb(34813,k,e,g);j=L[c+h>>3]+L[i>>3]*.5;L[f+8>>3]=j;Jd(a,e,j,-14,g)}if((b|0)!=(k|0)){continue}break}}Fa=f+176|0}function gn(a,b){var c=0,d=0,e=0,f=0,g=0;c=Fa-112|0;Fa=c;G[c+108>>2]=0;e=G[309712];a:{b:{if(Vc(e,a,c+32|0,0,c+108|0)){b=G[c+108>>2];if((b|0)!=202){break b}G[c>>2]=a;a=c+32|0;Ya(a,71,10075,c);Ua(a);b=G[c+108>>2];break b}f=c+32|0;d=G[c+108>>2];if((d|0)<=0){c:{d=67;d:{e:{f:{g:{g=H[f|0];switch(g-39|0){case 0:break d;case 1:break f;default:break g}}h:{switch(g-70|0){default:if(g){break e}G[c+108>>2]=204;d=204;break c;case 0:case 14:break h;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:break e}}d=76;break d}d=88;break d}d=70;if(jb(f,46)){break d}if(jb(f,69)){break d}d=jb(f,68)?70:73}E[c+31|0]=d;d=G[c+108>>2]}}if(d){b=G[c+108>>2];break b}d=-1;i:{j:{switch(E[c+31|0]-67|0){case 0:d=a;a=c+32|0;Fc(e,d,a,0,c+108|0);Za(b,a);d=261;break i;case 9:po(e,a,c+16|0,0,c+108|0);E[b|0]=G[c+16>>2];d=258;break i;case 6:Ec(e,a,c+16|0,0,c+108|0);G[b>>2]=G[c+16>>2];d=259;break i;case 3:break j;default:break i}}Kc(e,a,c+16|0,c+108|0);L[b>>3]=L[c+16>>3];d=260}b=G[c+108>>2];if(!b){break a}}G[309737]=b;d=-1}Fa=c+112|0;return d}function Fq(a,b){var c=0,d=0,e=0,f=0,g=0;g=b>>>24|0;d=G[a+604>>2];a:{if((d|0)<=7){c=G[a+600>>2];break a}f=G[a+76>>2];c=G[a+600>>2];while(1){E[G[a+44>>2]+f|0]=c>>>24;f=G[a+76>>2]+1|0;G[a+76>>2]=f;c=G[a+600>>2]<<8;G[a+600>>2]=c;e=G[a+604>>2];d=e-8|0;G[a+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[a+604>>2]=e;c=g<<24-d|c;G[a+600>>2]=c;if((d|0)>=0){f=G[a+76>>2];while(1){E[G[a+44>>2]+f|0]=c>>>24;f=G[a+76>>2]+1|0;G[a+76>>2]=f;c=G[a+600>>2]<<8;G[a+600>>2]=c;d=G[a+604>>2];e=d-8|0;G[a+604>>2]=e;if((d|0)>15){continue}break}}d=e+8|0;G[a+604>>2]=d;c=(b>>>16&255)<<24-e|c;G[a+600>>2]=c;if((e|0)>=0){f=G[a+76>>2];while(1){E[G[a+44>>2]+f|0]=c>>>24;f=G[a+76>>2]+1|0;G[a+76>>2]=f;c=G[a+600>>2]<<8;G[a+600>>2]=c;e=G[a+604>>2];d=e-8|0;G[a+604>>2]=d;if((e|0)>15){continue}break}}e=d+8|0;G[a+604>>2]=e;c=(b>>>8&255)<<24-d|c;G[a+600>>2]=c;if((d|0)>=0){f=G[a+76>>2];while(1){E[G[a+44>>2]+f|0]=c>>>24;f=G[a+76>>2]+1|0;G[a+76>>2]=f;c=G[a+600>>2]<<8;G[a+600>>2]=c;d=G[a+604>>2];e=d-8|0;G[a+604>>2]=e;if((d|0)>15){continue}break}}G[a+604>>2]=e+8;G[a+600>>2]=(b&255)<<24-e|c}function Kl(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0;i=Fa-4192|0;Fa=i;G[i+32>>2]=1;G[i+36>>2]=1;a:{b:{j=1;c:{if(e==0){break c}j=e;if(!(e<0)){break c}j=1/O(e)}k=ei(a,c,d,j,f,g,0,i- -64|0,i+48|0,i+88|0,h);c=G[h>>2];d:{if(!(c?0:k)){a=i+96|0;uc(c,a);G[i>>2]=a;_a(G[24367],69532,i);break d}e=+((G[i+52>>2]-G[i+68>>2]|0)+1|0)/j;e:{if(O(e)<2147483648){d=~~e;break e}d=-2147483648}G[i+44>>2]=d;e=+((G[i+48>>2]-G[i+64>>2]|0)+1|0)/j;f:{if(O(e)<2147483648){c=~~e;break f}c=-2147483648}G[i+40>>2]=c;f=G[i+88>>2];l=Eu(f- -64|0,29);if(l>>>0>=17|!(71249>>>l&1)){break b}pd(b,f,2,i+40|0,h);Td(a,i+92|0,0,h);g=4;if(G[i+92>>2]>=4){while(1){f=i+96|0;Sd(a,g,f,h);if((mk(f)|0)>=21){wb(b,i+96|0,h)}f=G[i+92>>2]>(g|0);g=g+1|0;if(f){continue}break}}if(G[h>>2]>0){hb(14082,59,1,G[24367]);break d}c=M(c,d);ag(b,G[(l<<2)+156884>>2],i+32|0,c,c>>31,k,h);d=G[i+64>>2];L[i+16>>3]=N(d|0);c=G[i+68>>2];L[i+24>>3]=N(c|0);f=a;g=b;b=G[i+48>>2];a=G[i+52>>2];Sm(f,g,(b+d|0)/2|0,(a+c|0)/2|0,(b-d|0)+1|0,(a-c|0)+1|0,j,i+16|0);Wa(k)}a=G[h>>2];break a}hb(70173,43,1,G[24367]);a=-1}Fa=i+4192|0;return a}function gi(a){var b=0,c=0,d=0,e=0;c=Fa-16|0;Fa=c;b=a;a:{b:while(1){c:{d=1;d:{e:{f:{g:{h:{i:{b=G[b>>2];e=H[b|0];switch(e|0){case 0:break a;case 41:break c;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:break d;case 39:break e;case 34:break f;case 40:break h;default:break i}}if((e|0)==91){break g}if((e|0)!=123){break d}G[c+12>>2]=b+1;b=c+12|0;if(!ii(b)){continue}break a}G[c+12>>2]=b+1;b=c+12|0;if(!gi(b)){continue}break a}G[c+12>>2]=b+1;b=c+12|0;if(!hi(b)){continue}break a}b=b+1|0;G[c+12>>2]=b;while(1){d=H[b|0];if(!d){d=1;break a}if((d|0)==34){G[c+12>>2]=b+1;b=c+12|0;continue b}else{b=b+1|0;continue}}}b=b+1|0;G[c+12>>2]=b;while(1){d=H[b|0];if(!d){d=1;break a}if((d|0)==39){G[c+12>>2]=b+1;b=c+12|0;continue b}else{b=b+1|0;continue}}}G[c+12>>2]=b+1;b=c+12|0;continue}break}G[a>>2]=b+1;d=0}Fa=c+16|0;return d}function Ti(a){var b=0,c=0,d=0,e=0,f=0;b=-6;a:{if(H[41336]!=49){break a}if(!a){return-2}G[a+24>>2]=0;d=G[a+32>>2];if(!d){G[a+40>>2]=0;G[a+32>>2]=9;d=9}if(!G[a+36>>2]){G[a+36>>2]=10}e=Ja[d|0](G[a+40>>2],1,7120)|0;if(!e){return-4}G[a+28>>2]=e;G[e+56>>2]=0;G[e>>2]=a;G[e+4>>2]=16180;d=-2;b:{if(!a|!G[a+32>>2]){break b}c=G[a+36>>2];if(!c){break b}b=G[a+28>>2];if(!b|G[b>>2]!=(a|0)|G[b+4>>2]-16180>>>0>31){break b}f=G[b+56>>2];c:{if(!(G[b+40>>2]!=15?f:0)){G[b+40>>2]=15;G[b+12>>2]=6;break c}Ja[c|0](G[a+40>>2],f);G[b+56>>2]=0;c=G[a+32>>2];G[b+40>>2]=15;G[b+12>>2]=6;if(!c){break b}}if(!G[a+36>>2]){break b}b=G[a+28>>2];if(!b|G[b>>2]!=(a|0)|G[b+4>>2]-16180>>>0>31){break b}d=0;G[b+52>>2]=0;G[b+44>>2]=0;G[b+48>>2]=0;G[b+32>>2]=0;G[a+8>>2]=0;G[a+20>>2]=0;G[a+24>>2]=0;c=G[b+12>>2];if(c){G[a+48>>2]=c&1}G[b+60>>2]=0;G[b+64>>2]=0;G[b+36>>2]=0;G[b+24>>2]=32768;G[b+16>>2]=0;G[b+4>>2]=16180;G[b+8>>2]=0;G[b+7108>>2]=1;G[b+7112>>2]=-1;c=b+1332|0;G[b+112>>2]=c;G[b+84>>2]=c;G[b+80>>2]=c}b=0;if(!d){break a}Ja[G[a+36>>2]](G[a+40>>2],e);G[a+28>>2]=0;b=d}return b}function jj(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;if(G[321436]){i=G[24367];hb(88593,25,1,i);$a(i)}if(!H[3706156]){G[926542]=442745336;G[926543]=1078765020;G[926540]=-1571644103;G[926541]=1066524486;E[3706156]=1}a:{if(!(G[47593]!=(f|0)|L[23797]!=e)){e=L[463272];g=L[463273];h=L[463270];break a}if(G[321436]){i=G[24367];hb(89165,24,1,i);$a(i)}L[23797]=e;G[47593]=f;b:{if(f){e=(e+-1950)*.01;g=e*e;e=e*g*.00182+(g*-.0033+(e*-46.85+84404.84));break b}e=(e+-2e3)*.01;g=e*e;e=e*g*.001813+(g*-59e-5+(e*-46.815+84381.448))}h=L[463270];g=e/3600*h;e=eb(g);L[463272]=e;g=ib(g);L[463273]=g}j=h*b;b=eb(j);a=h*a;h=eb(a);a=b*-ib(a);k=a*g;j=ib(j);l=e*j;a=Db(-(g*j+e*a),h*b);b=L[463271];e=a*b;if(e<0){while(1){e=e+360;if(e<0){continue}break}}L[c>>3]=e;if(e>360){while(1){e=e+-360;if(e>360){continue}break}L[c>>3]=e}a=l-k;e=O(a);if(e>1){L[d>>3]=a*90/e;G[c>>2]=0;G[c+4>>2]=0;return}a=b*fc(a);L[d>>3]=a;c:{if(!(O(a)>=90)){break c}G[c>>2]=0;G[c+4>>2]=0;a=L[d>>3];if(a>90){G[d>>2]=0;G[d+4>>2]=1079410688;return}if(!(a<-90)){break c}G[d>>2]=0;G[d+4>>2]=-1068072960}}function sl(a){var b=0,c=0,d=0,e=0,f=0,g=0;c=G[a+52>>2];d=G[a+56>>2];a:{if((d|0)<=0){break a}e=c&255;b=G[a+608>>2];if((d|0)!=1){g=d&-2;while(1){b=G[((b>>>24^e)<<2)+191040>>2]^b<<8;G[a+608>>2]=b;b=G[((b>>>24^e)<<2)+191040>>2]^b<<8;G[a+608>>2]=b;f=f+2|0;if((g|0)!=(f|0)){continue}break}}if(!(d&1)){break a}G[a+608>>2]=G[((b>>>24^e)<<2)+191040>>2]^b<<8}E[(a+c|0)+88|0]=1;b:{c:{d:{e:{f:{b=G[a+56>>2];switch(b-1|0){case 2:break d;case 1:break e;case 0:break f;default:break c}}E[G[a+36>>2]+G[a+68>>2]|0]=c;a=a+68|0;break b}E[G[a+36>>2]+G[a+68>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;a=a+68|0;break b}E[G[a+36>>2]+G[a+68>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;a=a+68|0;break b}E[(a+b|0)+84|0]=1;E[G[a+36>>2]+G[a+68>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;b=G[a+68>>2]+1|0;G[a+68>>2]=b;E[b+G[a+36>>2]|0]=c;c=G[a+68>>2]+1|0;G[a+68>>2]=c;E[c+G[a+36>>2]|0]=H[a+56|0]-4;a=a+68|0}G[a>>2]=G[a>>2]+1}function af(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;A(+a);c=v(1)|0;d=v(0)|0;a:{b:{e=c>>>20&2047;if(e-969>>>0<63){j=e;break b}if(e>>>0<=968){return a+1}if(e>>>0<1033){break b}b=0;if(!d&(c|0)==-1048576){break a}if((e|0)==2047){return a+1}if((c|0)<0){c=Fa-16|0;L[c+8>>3]=12882297539194267e-247;return L[c+8>>3]*12882297539194267e-247}c=Fa-16|0;L[c+8>>3]=3105036184601418e216;return L[c+8>>3]*3105036184601418e216}b=L[12706];f=L[12705]*a+b;b=f-b;b=b*L[12708]+(b*L[12707]+a);a=b*b;g=a*a*(b*L[12712]+L[12711]);a=a*(b*L[12710]+L[12709]);A(+f);v(1)|0;h=v(0)|0;d=h<<4&2032;b=g+(a+(L[d+101752>>3]+b));e=d+101760|0;d=h<<13;c=0;i=G[e>>2]+c|0;d=d+G[e+4>>2]|0;d=c>>>0>i>>>0?d+1|0:d;e=i;if(!j){c:{if(!(h&-2147483648)){x(0,e|0);x(1,d-1058013184|0);a=+z();a=(a*b+a)*5486124068793689e288;break c}c=Fa-16|0;x(0,e|0);x(1,d+1071644672|0);g=+z();f=g*b;a=f+g;if(a<1){G[c+8>>2]=0;G[c+12>>2]=1048576;L[c+8>>3]=L[c+8>>3]*22250738585072014e-324;b=a+1;a=b+(f+(g-a)+(a+(1-b)))+-1;a=a==0?0:a}a=a*22250738585072014e-324}return a}x(0,e|0);x(1,d|0);a=+z();b=a*b+a}return b}function ac(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;f=Fa-16|0;Fa=f;a:{b:{if(!jb(30829,E[b|0])){G[48624]=28;break b}d=2;if(!jb(b,43)){d=H[b|0]!=114}d=jb(b,120)?d|128:d;d=jb(b,101)?d|524288:d;e=d;g=d|64;d=H[b|0];e=(d|0)==114?e:g;e=(d|0)==119?e|512:e;G[f>>2]=438;G[f+4>>2]=0;a=ja(-100,a|0,((d|0)==97?e|1024:e)|32768,f|0)|0;if(a>>>0>=4294963201){G[48624]=0-a;a=-1}if((a|0)<0){break a}d=Fa-32|0;Fa=d;c:{d:{e:{if(!jb(30829,E[b|0])){G[48624]=28;break e}c=ab(1176);if(c){break d}}b=0;break c}cb(c,0,144);if(!jb(b,43)){G[c>>2]=H[b|0]==114?8:4}f:{if(H[b|0]!=97){b=G[c>>2];break f}b=ia(a|0,3,0)|0;if(!(b&1024)){b=b|1024;G[d+16>>2]=b;G[d+20>>2]=b>>31;ia(a|0,4,d+16|0)|0}b=G[c>>2]|128;G[c>>2]=b}G[c+80>>2]=-1;G[c+48>>2]=1024;G[c+60>>2]=a;G[c+44>>2]=c+152;g:{if(b&8){break g}G[d>>2]=d+24;G[d+4>>2]=0;if(oa(a|0,21523,d|0)|0){break g}G[c+80>>2]=10}G[c+40>>2]=5;G[c+36>>2]=6;G[c+32>>2]=7;G[c+12>>2]=8;if(!H[195005]){G[c+76>>2]=-1}G[c+56>>2]=G[48750];b=G[48750];if(b){G[b+52>>2]=c}G[48750]=c;b=c}Fa=d+32|0;c=b;if(c){break a}da(a|0)|0}c=0}Fa=f+16|0;return c|0}function Bg(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=R(a,0);a:{if(d<15){a=1;d=af(-d);while(1){b=g;g=b+1|0;c=Au(G[309618],G[309619],1284865837,1481765933)+1|0;e=Ia;e=c?e:e+1|0;G[309618]=c;G[309619]=e;a=a*(+(e>>>1|0)*4.656612873077393e-10);if(d>3]=j}d=oc(a);while(1){b=Au(G[309618],G[309619],1284865837,1481765933)+1|0;c=Ia;c=b?c:c+1|0;G[309618]=b;G[309619]=c;a=+(c>>>1|0)*4.656612873077393e-10;a=(L[154813]-oc((1-a)/a))/L[154812];f=S(a+.5);b:{if(O(f)<2147483648){b=~~f;break b}b=-2147483648}c:{if((b|0)<0){b=3;break c}c=Au(G[309618],G[309619],1284865837,1481765933)+1|0;e=Ia;e=c?e:e+1|0;G[309618]=c;G[309619]=e;f=L[154813]-L[154812]*a;a=af(f)+1;c=b;f=f+oc(+(e>>>1|0)*4.656612873077393e-10/(a*a));h=+(b|0)*d+L[154814];d:{if(b>>>0>=255){a=+(b+1|0);a=1/(a*12)+((a+-.5)*oc(a)-a+.9189385332046727);break d}a=L[(b<<3)+125008>>3]}b=f<=h-a;g=b?c:g}if((b|0)!=1){continue}break}b=g}return b}function Pr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;if(G[c+4>>2]!=701){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=84;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=189;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=45;g=.022222222222222223;break a}f=f*3.141592653589793*.25;g=1/f}G[c+1892>>2]=101;G[c+1888>>2]=102;L[c+112>>3]=f;L[c+120>>3]=g}f=Mb(b);j=Mb(a);h=Kb(a);g=Kb(b);a=-g;h=f*h;l=-h;j=f*j;k=-j;i=g1){i=2;if(a>1.000000000001){break e}b=b<0?-1:1}a=O(f);if(a>1){i=2;if(a>1.000000000001){break e}f=f<0?-1:1}L[d>>3]=(m+b)*L[c+112>>3];L[e>>3]=(r+f)*L[c+112>>3];i=0}return i|0}function Jg(a,b,c){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;g=Fa-112|0;Fa=g;d=G[c>>2];a:{if((d|0)>0){break a}d=G[a>>2];if((d|0)!=G[G[a+4>>2]+76>>2]){mb(a,d+1|0,0,c)}E[b|0]=0;d=G[a+4>>2];l=G[d+96>>2]+(G[d+76>>2]<<3)|0;j=G[l>>2];e=G[d+124>>2];h=G[d+120>>2];i=G[d+104>>2];f=G[d+128>>2];m=f-2880|0;k=G[d+108>>2];f=G[d+132>>2]-(f>>>0<2880)|0;d=f;d=i>>>0>m>>>0&(k|0)>=(d|0)|(d|0)<(k|0);i=d?i:m;d=d?k:f;f=h>>>0<=i>>>0&(d|0)>=(e|0)|(d|0)>(e|0);d=G[l+4>>2];if(!(f&((d|0)<=(e|0)&h>>>0>=j>>>0|(d|0)<(e|0)))){n=g,o=Bu(h-j|0,e-((h>>>0>>0)+d|0)|0,80,0)+1|0,G[n>>2]=o;a=g+16|0;Ya(a,81,42404,g);Ua(a);d=203;G[c>>2]=203;break a}Jb(a,h,e,0,c);E[b+80|0]=0;if((ic(a,80,0,b,c)|0)<=0){d=G[a+4>>2];a=G[d+124>>2];e=G[d+120>>2]+80|0;a=e>>>0<80?a+1|0:a;G[d+120>>2]=e;G[d+124>>2]=a;a=79;b:{while(1){if(H[a+b|0]!=32){d=a;break b}d=a-1|0;if(H[d+b|0]!=32){break b}d=a-2|0;if(H[d+b|0]!=32){break b}d=a-3|0;if(H[d+b|0]!=32){break b}d=a-4|0;if(H[d+b|0]!=32){break b}a=a-5|0;if(d){continue}break}d=-1}E[(b+d|0)+1|0]=0}d=G[c>>2]}Fa=g+112|0;return d}function Db(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;A(+a);c=v(1)|0;c=c&2147483647;d=!(v(0)|0)&(c|0)==2146435072|c>>>0<2146435072;A(+b);c=v(1)|0;c=c&2147483647;if(!(d&(!(v(0)|0)&(c|0)==2146435072|c>>>0<2146435072))){return a+b}A(+b);d=v(1)|0;h=v(0)|0;e=d;if(!(h|d-1072693248)){return Pd(a)}A(+a);c=v(1)|0;d=v(0)|0;i=e>>>30&2;f=i|c>>>31;a:{c=c&2147483647;b:{if(!(d|c)){c:{switch(f-2|0){case 0:return 3.141592653589793;case 1:break c;default:break b}}return-3.141592653589793}d=e&2147483647;if(!(d|h)){break a}d:{if((d|0)==2146435072){if((c|0)!=2146435072){break d}return L[(f<<3)+120384>>3]}if(!((c|0)!=2146435072&d+67108864>>>0>=c>>>0)){break a}e:{if(i){g=0;if(d>>>0>c+67108864>>>0){break e}}g=Pd(O(a/b))}a=g;f:{switch(f|0){case 1:return-a;case 2:return 3.141592653589793-(a+-12246467991473532e-32);case 0:break b;default:break f}}return a+-12246467991473532e-32+-3.141592653589793}a=L[(f<<3)+120416>>3]}return a}A(1.5707963267948966);c=v(1)|0;e=v(0)|0;A(+a);d=v(1)|0;v(0)|0;x(0,e|0);x(1,c&2147483647|d&-2147483648);return+z()}function Vt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=Fa-16|0;Fa=g;e=g+12|0;if(e){G[e>>2]=0}a:{b:{c:{if(!a){break c}G[a+5060>>2]=0;if(!b){break c}if((c|0)>=0){break b}}if(e){G[e>>2]=-2}if(!a){break a}G[a+5060>>2]=-2;break a}if(!H[a+5008|0]){if(e){G[e>>2]=-1}G[a+5060>>2]=-1;break a}d:{d=G[a>>2];e:{if(G[d+76>>2]<0){d=G[d>>2];break e}d=G[d>>2]}if(d>>>5&1){break d}if(!c){if(e){G[e>>2]=0}G[a+5060>>2]=0;break a}G[a+5012>>2]=b;G[a+5016>>2]=c;h=a+4|0;i=a+5012|0;b=-1;while(1){G[a+5028>>2]=h;G[a+5032>>2]=5e3;d=-2;f:{f=G[a+5044>>2];g:{h:{if(!f|G[f>>2]!=(i|0)){break h}f=G[f+4>>2];if((f|0)!=2){d=0;if(!(1<>>0>4){break h}break g}if(Eq(i)){break f}}b=d}if(e){G[e>>2]=b}G[a+5060>>2]=b;break a}i:{d=G[a+5032>>2];if(d>>>0>4999){break i}d=5e3-d|0;if((hb(h,1,d,G[a>>2])|0)==(d|0)){d=G[a>>2];j:{if(G[d+76>>2]<0){d=G[d>>2];break j}d=G[d>>2]}if(!(d>>>5&1)){break i}}break d}if(G[a+5016>>2]){continue}break}if(e){G[e>>2]=0}G[a+5060>>2]=0;break a}if(e){G[e>>2]=-6}G[a+5060>>2]=-6}Fa=g+16|0;return(G[g+12>>2]?-1:c)|0} -function Xm(a,b){var c=0,d=0,e=0,f=0;e=Fa-16|0;Fa=e;G[e+12>>2]=999;G[e+8>>2]=0;a:{if(!a){G[b>>2]=115;break a}if(G[G[a+4>>2]+16>>2]!=555){G[b>>2]=114;break a}b:{if(G[b>>2]>0){Xf(a,e+12|0);break b}Xf(a,b)}sh(a,1,b);c=G[a+4>>2];if(!(!(Ja[G[(M(G[c+4>>2],84)+1240576|0)+56>>2]](G[c>>2])|0)|G[b>>2]>0)){G[b>>2]=110;Ua(49731);Ua(G[G[a+4>>2]+12>>2])}c=G[a+4>>2];if(G[(M(G[c+4>>2],84)+1240576|0)+60>>2]){d=G[c+12>>2];c=ab(Va(d)+1|0);if(!c){G[b>>2]=113;break a}dh(d,0,c,0,0,0,0,0,0,0,e+8|0);c:{if(!(Ja[G[(M(G[G[a+4>>2]+4>>2],84)+1240576|0)+60>>2]](c)|0)){break c}Ua(49685);Ua(G[G[a+4>>2]+12>>2]);if(G[b>>2]){break c}G[b>>2]=110}Wa(c);c=G[a+4>>2]}d:{while(1){e:{d=f<<2;b=d+1243184|0;if(G[b>>2]==(c|0)){break e}d=d+1243184|0;b=d+4|0;if(G[b>>2]==(c|0)){break e}b=d+8|0;if(G[b>>2]==(c|0)){break e}b=d+12|0;if(G[b>>2]==(c|0)){break e}b=d+16|0;if(G[b>>2]==(c|0)){break e}f=f+5|0;if((f|0)!=1e4){continue}break d}break}G[b>>2]=0;c=G[a+4>>2]}Wa(G[c+1252>>2]);Wa(G[G[a+4>>2]+96>>2]);Wa(G[G[a+4>>2]+12>>2]);Wa(G[a+4>>2]);Wa(a)}Fa=e+16|0}function Go(a,b,c,d,e,f,g,h,i,j){var k=0,l=0,m=0,n=0;k=Fa-256|0;Fa=k;E[k+143|0]=84;E[k+142|0]=70;l=G[j>>2];a:{if((l|0)>0){break a}b:{if((yc(a,b,c,d,e,f,g,h,1,k+184|0,k+176|0,k+144|0,k+240|0,k+252|0,k+248|0,k+216|0,k+208|0,k+236|0,k+224|0,k+200|0,k+244|0,k+192|0,k+16|0,j)|0)>0){break b}if(G[k+252>>2]==14){e=0;f=0;if(!(g|h)){break b}c=0;d=0;while(1){b=G[k+220>>2];l=G[k+216>>2];m=Au(G[k+200>>2],G[k+204>>2],c,d);l=l+m|0;b=Ia+b|0;b=l>>>0>>0?b+1|0:b;n=l;l=G[k+236>>2];m=Au(G[k+208>>2],G[k+212>>2],l,l>>31);l=n+m|0;b=Ia+b|0;Jb(a,l,l>>>0>>0?b+1|0:b,1,j);Wb(a,1,0,H[e+i|0]?k+143|0:k+142|0,j);l=G[j>>2];if((l|0)>0){a=e+1|0;f=a?f:f+1|0;L[k>>3]=+(a>>>0)+ +(f|0)*4294967296;a=k+48|0;Ya(a,81,46260,k);Ua(a);break b}h=h-!g|0;g=g-1|0;if(!(h|g)){break a}b=e+1|0;f=b?f:f+1|0;e=b;b=G[k+212>>2];l=G[k+208>>2]+1|0;b=l?b:b+1|0;G[k+208>>2]=l;G[k+212>>2]=b;if(G[k+224>>2]!=(l|0)|G[k+228>>2]!=(b|0)){continue}G[k+208>>2]=0;G[k+212>>2]=0;b=d;c=c+1|0;b=c?b:b+1|0;d=b;continue}}l=310;G[j>>2]=310;break a}l=G[j>>2]}Fa=k+256|0;return l}function sr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(G[c+4>>2]!=303){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=79;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=47;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}G[c+1892>>2]=123;G[c+1888>>2]=124;G[c+144>>2]=1841940611;G[c+148>>2]=1071931184;L[c+136>>3]=90/f;f=f*1.4142135623730951;L[c+112>>3]=f;L[c+128>>3]=1/f;L[c+120>>3]=f/90}a:{if(O(b)==90){G[d>>2]=0;G[d+4>>2]=0;a=O(L[c+112>>3]);f=b<0?-a:a;break a}f=0;if(b==0){L[d>>3]=L[c+120>>3]*a;break a}f=3.141592653589793;h=-3.141592653589793;i=Kb(b)*3.141592653589793;b=i;while(1){b:{g=b-i+ib(b);c:{if(g<0){h=b;if(!(g>-1e-13)){break c}break b}f=b;if(g<1e-13){break b}}b=(h+f)*.5;g=b-i+ib(b);d:{if(!(g<0)){f=b;if(!(g<1e-13)){break d}break b}h=b;if(g>-1e-13){break b}}b=(h+f)*.5;j=j+2|0;if((j|0)!=100){continue}}break}f=L[c+120>>3];b=b*.5;k=d,l=eb(b)*(f*a),L[k>>3]=l;f=L[c+112>>3]*ib(b)}L[e>>3]=f;return 0}function os(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;q=Fa-16|0;Fa=q;G[q+12>>2]=j;a:{l=G[a+8>>2];r=(G[a>>2]+M(c,3)|0)-2|0;o=M(r,168);n=l+o|0;k=G[n+32>>2];if(k){break a}k=lb(1e3,8);G[n+32>>2]=k;j=0;G[n+28>>2]=0;n=1e3;while(1){if((j|0)>=(n|0)){n=n+1e3|0;j=ub(k,n<<3);l=G[a+8>>2];G[(o+l|0)+32>>2]=j}m=G[q+12>>2]+7&-8;G[q+12>>2]=m+8;j=l+o|0;k=G[j+32>>2];s=G[j+28>>2];p=L[m>>3];L[k+(s<<3)>>3]=p;b:{if(!(O(p+-9007199254740992)<=1e-15)){break b}m=s-1|0;if(!(O(L[(m<<3)+k>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=m;j=M(r,168);k=j+G[a+8>>2]|0;k=ub(G[k+32>>2],G[k+28>>2]<<3);l=G[a+8>>2];G[(j+l|0)+32>>2]=k;break a}m=j;j=s+1|0;G[m+28>>2]=j;continue}}p=L[k>>3];l=G[(l+o|0)+28>>2];c:{if((l|0)==2){vf(a,b,c,d,e,f,g,h,i,p,L[k+8>>3]);break c}j=0;o=l-1|0;vf(a,0,r,d,e,f,g,h,i,p,L[(o<<3)+k>>3]);if((l|0)<2){break c}while(1){m=b+j|0;l=c+j|0;p=L[(j<<3)+k>>3];j=j+1|0;vf(a,m,l,d,e,f,g,h,i,p,L[(j<<3)+k>>3]);if((j|0)!=(o|0)){continue}break}}Fa=q+16|0}function Nl(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;g=Fa+-8192|0;Fa=g;a:{i=Ic(8192,1);if(!i){break a}while(1){b:{c:{d:{c=H[a|0];if((c|0)!=36){if(!c){break d}E[i+e|0]=c;e=e+1|0;E[e+i|0]=0;a=a+1|0;continue}c=H[a+1|0];e:{f:{if((c|0)!=40){j=125;if((c|0)!=123){c=a+1|0;f=0;break e}c=a+2|0;break f}j=41;c=a+2|0}f=1}E[g|0]=0;d=E[c|0];if((d|0)==32|d-9>>>0<5){break b}h=0;if(f){break c}while(1){j=d&255;f=j-34|0;if(!(f>>>0>13|!(1<>>0<5)){continue}break}break b}rb(b,i,8192);pb(i);break a}while(1){g:{h:{f=d&255;switch(f-34|0){case 1:case 2:case 3:case 4:break g;case 0:case 5:break b;default:break h}}if(!f){break b}}if((d|0)==(j|0)){c=c+1|0;break b}if((f|0)==47){break b}E[g+h|0]=d;h=h+1|0;E[h+g|0]=0;d=E[c+1|0];c=c+1|0;if(!((d|0)==32|d-9>>>0<5)){continue}break}}c=c-1|0;d=Fd(g);i:{if(d){e=Va(d)+e|0;if((e|0)>8192){break i}Gb(i,d);break i}d=(c-a|0)+1|0;e=d+e|0;if((e|0)>8192){break i}qb(i,a,d)}a=c+1|0;continue}}Fa=g- -8192|0}function ff(a){var b=0,c=0,d=0,e=0;b=-2;a:{if(!a|!G[a+32>>2]){break a}e=G[a+36>>2];if(!e){break a}c=G[a+28>>2];if(!c|G[c>>2]!=(a|0)){break a}b:{c:{d=G[c+4>>2];switch(d-57|0){case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:case 11:case 13:case 14:case 15:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:case 32:case 33:case 35:case 36:case 37:case 38:case 39:case 40:case 41:case 42:case 43:case 44:case 45:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:break a;case 0:case 12:case 16:case 34:case 46:case 56:break b;default:break c}}if((d|0)==666){break b}if((d|0)!=42){break a}}b=G[c+8>>2];if(b){Ja[e|0](G[a+40>>2],b);c=G[a+28>>2]}b=G[c+68>>2];if(b){Ja[G[a+36>>2]](G[a+40>>2],b);c=G[a+28>>2]}b=G[c+64>>2];if(b){Ja[G[a+36>>2]](G[a+40>>2],b);c=G[a+28>>2]}b=G[c+56>>2];if(b){Ja[G[a+36>>2]](G[a+40>>2],b);c=G[a+28>>2]}Ja[G[a+36>>2]](G[a+40>>2],c);G[a+28>>2]=0;b=(d|0)==113?-3:0}return b}function Tn(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(!G[d>>2]){E[c|0]=0;a:{b:{if(!(!ad(a)&H[a|0]!=47)){if(ad(b)|H[b|0]==47){break b}}G[d>>2]=125;Ua(58787);break a}g=Va(a);i=Va(b);if((g|0)<=0|(i|0)<=0){break a}while(1){h=e;c:{if((e|0)>=(i|0)){break c}while(1){if(H[b+h|0]!=47){break c}h=h+1|0;if((i|0)!=(h|0)){continue}break}h=i}d:{if((e|0)>=(g|0)){break d}while(1){if(H[a+e|0]!=47){break d}e=e+1|0;if((g|0)!=(e|0)){continue}break}e=g}f=h;while(1){e:{j=f;f=f+1|0;if(H[b+j|0]==47){break e}if((i|0)>(j|0)){continue}}break}l=e;while(1){k=l;if(H[k+a|0]!=47){l=k+1|0;if((g|0)>(k|0)){continue}}break}f:{if((j|0)==(k|0)){if(!fb(b+h|0,a+e|0,j-e|0)){break f}}if((e|0)<(g|0)){while(1){if(H[a+e|0]==47){if(Va(c)-1022>>>0<=4294966270){G[d>>2]=125;Ua(58845);break a}f=Va(c)+c|0;E[f|0]=46;E[f+1|0]=46;E[f+2|0]=47;E[f+3|0]=0}e=e+1|0;if((g|0)!=(e|0)){continue}break}}a=b+h|0;if(Va(c)+Va(a)>>>0>=1025){G[d>>2]=125;Ua(58845);break a}Gb(c,a);break a}if((f|0)>=(g|0)){break a}e=f;if((i|0)>(e|0)){continue}break}}}}function Ui(a,b,c,d){var e=0,f=0,g=0,h=0;g=Fa-32|0;Fa=g;e=d&2147483647;h=e;f=e-1006698496|0;e=e-1140785152|0;a:{if((f|0)==(e|0)&0|e>>>0>f>>>0){e=d<<4|c>>>28;f=c<<4|b>>>28;c=e;b=b&268435455;if((b|0)==134217728&(a|0)!=0|b>>>0>134217728){e=c+1073741824|0;a=f+1|0;e=a?e:e+1|0;f=a;break a}e=c+1073741824|0;if(a|(b|0)!=134217728){break a}b=f&1;a=b+f|0;e=a>>>0>>0?e+1|0:e;f=a;break a}if(!(!c&(h|0)==2147418112?!(a|b):h>>>0<2147418112)){e=c;c=d<<4|e>>>28;f=e<<4|b>>>28;e=c&524287|2146959360;break a}f=0;e=2146435072;if(h>>>0>1140785151){break a}e=0;h=h>>>16|0;if(h>>>0<15249){break a}e=d&65535|65536;od(g+16|0,a,b,c,e,h-15233|0);eg(g,a,b,c,e,15361-h|0);e=G[g+4>>2];h=e;a=G[g+8>>2];c=G[g+12>>2]<<4|a>>>28;f=a<<4|e>>>28;e=c;a=h&268435455;b=G[g>>2]|(G[g+16>>2]|G[g+24>>2]|(G[g+20>>2]|G[g+28>>2]))!=0;if((a|0)==134217728&(b|0)!=0|a>>>0>134217728){a=f+1|0;e=a?e:e+1|0;f=a;break a}if(b|(a|0)!=134217728){break a}a=f+(f&1)|0;e=a>>>0>>0?e+1|0:e;f=a}Fa=g+32|0;x(0,f|0);x(1,d&-2147483648|e);return+z()}function qm(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if(d){g=G[a+3316>>2];if(g-10>>>0<=4294967286){g=G[a+3320>>2];G[a+3316>>2]=g}L[a+760>>3]=b;L[a+32>>3]=b;b=c!=0?c:b;L[a+768>>3]=b;L[a+40>>3]=b;a:{b:{if((g|0)<=0){break b}k=g&-8;i=g&7;e=a+832|0;l=g-1>>>0<7;f=d;while(1){h=0;if(!l){while(1){L[e>>3]=L[f>>3];L[e+8>>3]=L[f+8>>3];L[e+16>>3]=L[f+16>>3];L[e+24>>3]=L[f+24>>3];L[e+32>>3]=L[f+32>>3];L[e+40>>3]=L[f+40>>3];L[e+48>>3]=L[f+48>>3];L[e+56>>3]=L[f+56>>3];f=f- -64|0;e=e- -64|0;h=h+8|0;if((k|0)!=(h|0)){continue}break}}h=0;if(i){while(1){L[e>>3]=L[f>>3];f=f+8|0;e=e+8|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}}j=j+1|0;if((j|0)!=(g|0)){continue}break}if((g|0)<2){break b}b=L[a+760>>3];L[a+56>>3]=L[d>>3]*b;L[a- -64>>3]=b*L[d+8>>3];d=(g<<3)+d|0;b=L[a+768>>3];L[a+72>>3]=L[d>>3]*b;b=b*L[d+8>>3];break a}b=L[d>>3];d=a- -64|0;G[d>>2]=0;G[d+4>>2]=0;G[a+72>>2]=0;G[a+76>>2]=0;L[a+56>>3]=b*L[a+760>>3];b=1}L[a+80>>3]=b;sg(2,a+56|0,a+88|0);G[a+3300>>2]=1;Aj(a+4036|0);G[a+3312>>2]=1;qg(a)}}function ls(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0;o=Fa-16|0;Fa=o;G[o+12>>2]=j;a:{k=G[a+8>>2];p=(G[a>>2]+M(c,3)|0)-2|0;n=M(p,168);m=k+n|0;b=G[m+32>>2];if(b){break a}b=lb(1e3,8);G[m+32>>2]=b;j=0;G[m+28>>2]=0;m=1e3;while(1){if((j|0)>=(m|0)){m=m+1e3|0;b=ub(b,m<<3);k=G[a+8>>2];G[(n+k|0)+32>>2]=b}l=G[o+12>>2]+7&-8;G[o+12>>2]=l+8;j=k+n|0;b=G[j+32>>2];q=G[j+28>>2];f=L[l>>3];L[b+(q<<3)>>3]=f;b:{if(!(O(f+-9007199254740992)<=1e-15)){break b}l=q-1|0;if(!(O(L[(l<<3)+b>>3]+-9007199254740992)<=1e-15)){break b}G[j+28>>2]=l;j=M(p,168);b=j+G[a+8>>2]|0;b=ub(G[b+32>>2],G[b+28>>2]<<3);k=G[a+8>>2];G[(j+k|0)+32>>2]=b;break a}l=j;j=q+1|0;G[l+28>>2]=j;continue}}f=L[b>>3];k=G[(k+n|0)+28>>2];c:{if((k|0)==2){Ze(a,0,c,d,e,h,i,f,L[b+8>>3]);break c}j=0;n=k-1|0;Ze(a,0,p,d,e,h,i,f,L[(n<<3)+b>>3]);if((k|0)<2){break c}while(1){l=c+j|0;f=L[(j<<3)+b>>3];j=j+1|0;Ze(a,0,l,d,e,h,i,f,L[(j<<3)+b>>3]);if((j|0)!=(n|0)){continue}break}}Fa=o+16|0}function Br(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;a:{if(G[c+4>>2]!=109){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=109;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}g=f+f;L[c+112>>3]=g;f=L[c+40>>3];b:{if(f==90){G[c+128>>2]=0;G[c+132>>2]=1072693248;G[c+120>>2]=0;G[c+124>>2]=-1075838976;f=1;break b}h=1;if(!(f>-90)){break a}f=Mb((90-f)*.5);g=f*f;f=oc(f)*g/(1-g);L[c+120>>3]=f;f=.5-f;L[c+128>>3]=f;g=L[c+112>>3]}G[c+1892>>2]=115;G[c+1888>>2]=116;L[c+160>>3]=57.29577951308232/f;L[c+152>>3]=f*1e-4;G[c+144>>2]=-350469331;G[c+148>>2]=1058682594;L[c+136>>3]=f*g}f=0;c:{if(b==90){break c}h=2;if(!(b>-90)){break a}b=90-b;f=b*.017453292519943295*.5;if(f>3]){f=f*L[c+136>>3];break c}b=Mb(b*.5);f=oc(b);b=V(1-b*b)/b;f=(L[c+120>>3]*b+f/b)*-L[c+112>>3]}i=d,j=f*Kb(a),L[i>>3]=j;i=e,j=Mb(a)*-f,L[i>>3]=j;h=0}return h|0}function Hi(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=G[48835];if((b|0)==1){d=G[48836];if((f|0)<=3){b=a;a=G[48834];b=H[b+a|0];G[48834]=a+1;d=b|d<<8;G[48836]=d;f=f+8|0}a=f-4|0;G[48835]=a;E[c|0]=d>>a&15;return}a:{b:{c:{if((f|0)==8){G[48834]=G[48834]-1;G[48835]=0;break c}if(!f){break c}i=(b|0)/2|0;d=G[48834];e=G[48836];if((b|0)<=1){i=0;break a}k=f+4|0;while(1){e=H[a+d|0]|e<<8;E[c+g|0]=e>>k&15;E[(g|1)+c|0]=e>>f&15;g=g+2|0;d=d+1|0;h=h+1|0;if((i|0)!=(h|0)){continue}break}break b}i=(b|0)/2|0;f=0;d=G[48834];e=G[48836];if((b|0)<2){i=0;break a}l=i&1;if((b&-2)!=2){m=i&-2;while(1){j=a+d|0;k=H[j|0];E[c+g|0]=k>>>4;E[(g|1)+c|0]=k&15;j=H[j+1|0];E[(g|2)+c|0]=j>>>4;E[(g|3)+c|0]=j&15;e=j|(e<<16|k<<8);g=g+4|0;d=d+2|0;h=h+2|0;if((m|0)!=(h|0)){continue}break}}if(!l){break b}h=H[a+d|0];E[c+g|0]=h>>>4;E[(g|1)+c|0]=h&15;e=h|e<<8;d=d+1|0}G[48834]=d;G[48836]=e}if(i<<1!=(b|0)){if((f|0)<=3){a=H[a+d|0];G[48834]=d+1;e=a|e<<8;G[48836]=e;f=f+8|0}a=f-4|0;G[48835]=a;E[(b+c|0)-1|0]=e>>a&15}}function oe(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=Fa-208|0;Fa=e;G[e+8>>2]=1;G[e+12>>2]=0;i=M(b,c);a:{if(!i){break a}G[e+16>>2]=c;G[e+20>>2]=c;j=0-c|0;b=c;f=b;h=2;while(1){g=b;b=(c+f|0)+b|0;G[(e+16|0)+(h<<2)>>2]=b;h=h+1|0;f=g;if(b>>>0>>0){continue}break}g=(a+i|0)+j|0;b:{if(g>>>0<=a>>>0){b=1;break b}h=1;b=1;while(1){c:{if((h&3)==3){Kk(a,c,d,b,e+16|0);Pi(e+8|0,2);b=b+2|0;break c}f=b-1|0;d:{if(J[(e+16|0)+(f<<2)>>2]>=g-a>>>0){Oi(a,c,d,e+8|0,b,0,e+16|0);break d}Kk(a,c,d,b,e+16|0)}if((b|0)==1){Ni(e+8|0,1);b=0;break c}Ni(e+8|0,f);b=1}h=G[e+8>>2]|1;G[e+8>>2]=h;a=a+c|0;if(g>>>0>a>>>0){continue}break}}Oi(a,c,d,e+8|0,b,0,e+16|0);if(!(G[e+12>>2]?1:(b|0)!=1|G[e+8>>2]!=1)){break a}while(1){e:{if((b|0)<=1){f=e+8|0;g=ep(f);Pi(f,g);b=b+g|0;break e}f=e+8|0;Ni(f,2);G[e+8>>2]=G[e+8>>2]^7;Pi(f,1);i=a+j|0;h=e+16|0;g=b-2|0;Oi(i-G[h+(g<<2)>>2]|0,c,d,f,b-1|0,1,h);Ni(f,1);G[e+8>>2]=G[e+8>>2]|1;Oi(i,c,d,f,g,1,h);b=g}a=a+j|0;if(G[e+12>>2]|((b|0)!=1|G[e+8>>2]!=1)){continue}break}}Fa=e+208|0}function rg(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;a=a-L[c+616>>3];f=a*a;k=a*f;b=b-L[c+624>>3];g=b*b;h=f+g;l=b*g;m=G[c+3272>>2];i=a*L[c+296>>3]*b+(L[c+288>>3]*g+(L[c+280>>3]*f+(L[c+272>>3]*b+(L[c+264>>3]*a+L[c+256>>3]))));n=G[c+3268>>2];a:{if((n|0)<7){break a}i=L[c+312>>3]*l+(L[c+304>>3]*k+i);if(n>>>0<9){break a}i=b*L[c+352>>3]*h+(a*L[c+344>>3]*h+(L[c+336>>3]*h+(a*L[c+328>>3]*g+(f*L[c+320>>3]*b+i))))}j=a*L[c+456>>3]*b+(L[c+448>>3]*g+(L[c+440>>3]*f+(L[c+432>>3]*b+(L[c+424>>3]*a+L[c+416>>3]))));b:{if((m|0)<7){break b}j=L[c+472>>3]*l+(L[c+464>>3]*k+j);if(m>>>0<9){break b}j=b*L[c+512>>3]*h+(a*L[c+504>>3]*h+(L[c+496>>3]*h+(g*L[c+488>>3]*a+(f*L[c+480>>3]*b+j))))}a=L[c+696>>3]*3.141592653589793/180;b=eb(a);k=L[c+688>>3]*3.141592653589793/180;i=i*3.141592653589793/180/b;b=j*3.141592653589793/180;g=Mc(a);f=1-b*g;h=Db(i,f);a=k+h;L[d>>3]=(a<0?a+6.28318530717959:a)*180/3.141592653589793;o=e,p=Pd(eb(h)/(f/(b+g)))*180/3.141592653589793,L[o>>3]=p;return 0}function Nk(a,b,c){var d=0,e=0,f=0,g=0,h=0;d=-6;a:{if(H[41336]!=49){break a}d=-2;if(!a){break a}G[a+24>>2]=0;e=G[a+32>>2];if(!e){G[a+40>>2]=0;G[a+32>>2]=9;e=9}if(!G[a+36>>2]){G[a+36>>2]=10}if(c>>>0>4){break a}f=(b|0)==-1?6:b;if(f>>>0>9){break a}d=-4;b=Ja[e|0](G[a+40>>2],1,5828)|0;if(!b){break a}G[a+28>>2]=b;G[b+28>>2]=0;G[b+24>>2]=2;G[b+4>>2]=42;G[b>>2]=a;G[b+80>>2]=15;G[b+76>>2]=32768;G[b+48>>2]=15;G[b+84>>2]=32767;G[b+44>>2]=32768;G[b+88>>2]=5;G[b+52>>2]=32767;g=b,h=Ja[G[a+32>>2]](G[a+40>>2],32768,2)|0,G[g+56>>2]=h;g=b,h=Ja[G[a+32>>2]](G[a+40>>2],G[b+44>>2],2)|0,G[g+64>>2]=h;d=Ja[G[a+32>>2]](G[a+40>>2],G[b+76>>2],2)|0;G[b+5824>>2]=0;G[b+68>>2]=d;G[b+5788>>2]=16384;d=Ja[G[a+32>>2]](G[a+40>>2],16384,4)|0;G[b+8>>2]=d;e=G[b+5788>>2];G[b+12>>2]=e<<2;b:{if(!(!G[b+68>>2]|(!G[b+56>>2]|!G[b+64>>2]))){if(d){break b}}G[b+4>>2]=666;G[a+24>>2]=G[26250];ff(a);return-4}G[b+136>>2]=c;G[b+132>>2]=f;E[b+36|0]=8;G[b+5784>>2]=d+M(e,3);G[b+5796>>2]=d+(e&-2);d=kp(a)}return d}function Qr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]==701){f=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=84;E[c+1|0]=83;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=189;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=45;f=.022222222222222223;break b}g=f*3.141592653589793*.25;f=1/g}G[c+1892>>2]=101;G[c+1888>>2]=102;L[c+112>>3]=g;L[c+120>>3]=f}b=f*b;a=f*a;f=O(a);c:{d:{if(f<=1){c=2;if(!(O(b)>3)){break d}break c}c=2;if(f>7|O(b)>1){break c}}f=a<-1?a+8:a;e:{if(f>5){a=f+-6;g=-1/V(b*b+(a*a+1));f=-g;a=a*f;b=b*f;break e}if(f>3){f=f+-4;a=-1/V(b*b+(f*f+1));g=f*a;b=b*-a;break e}if(f>1){a=f+-2;g=1/V(b*b+(a*a+1));a=a*-g;b=b*g;break e}if(b>1){a=b+-2;b=1/V(a*a+(f*f+1));g=f*b;a=a*-b;break e}if(b<-1){g=f;a=b+2;b=-1/V(a*a+(f*f+1));f=-b;g=g*f;a=a*f;break e}a=1/V(b*b+(f*f+1));b=b*a;g=f*a}if(a==0&g==0){a=0}else{a=Ac(g,a)}L[d>>3]=a;h=e,i=Bc(b),L[h>>3]=i;c=0}return c|0}function hp(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=Fa+-64|0;Fa=f;a:{if(G[e>>2]>0){break a}g=G[c>>2];h=ab(115200);if(!h){G[e>>2]=113;break a}G[f+48>>2]=0;G[f+40>>2]=0;G[f+44>>2]=0;i=G[b>>2];G[f+24>>2]=g;G[f+20>>2]=i;b:{if(Ti(f+8|0)){break b}k=(g|0)==-1;c:{d:{e:{while(1){g=zc(h,1,115200,a);if(G[a+76>>2]<0){i=G[a>>2]}else{i=G[a>>2]}if(i>>>5&1){break c}if(!g){break d}G[f+12>>2]=g;G[f+8>>2]=h;f:while(1){i=k&!l;while(1){g:{h:{switch(Ch(f+8|0)+5|0){case 6:break g;case 0:case 5:break h;default:break e}}if(!G[f+12>>2]){break g}g=G[b>>2];if(i){G[f+20>>2]=g-1;g=G[c>>2];G[f+24>>2]=(g|0)==-1?0:g;l=1;continue f}g=Ja[17](g,G[c>>2]+28800|0)|0;G[b>>2]=g;if(g){G[f+24>>2]=28800;j=G[c>>2];G[f+20>>2]=g+j;G[c>>2]=j+28800;continue}else{ye(f+8|0);Wa(h);break b}}break}break}if(G[a+76>>2]<0){g=G[a>>2]}else{g=G[a>>2]}if(!(g>>>4&1)){continue}break}break d}ye(f+8|0);Wa(h);break b}G[d>>2]=G[f+28>>2];Wa(h);if(ye(f+8|0)){break b}break a}ye(f+8|0);Wa(h)}G[e>>2]=414}Fa=f- -64|0}function Ln(a,b,c,d,e,f){var g=0;g=Fa-16|0;Fa=g;a:{if(G[f>>2]>0){break a}E[443536]=0;qb(443536,a,127);G[110917]=c;G[110916]=b;G[110918]=d;G[110919]=17;G[110920]=0;G[110922]=0;G[110923]=0;G[110921]=0;b=0;b:{c:{while(1){d:{a=zc(b+443696|0,1,32768-b|0,G[110916]);b=G[110921];if(a+1>>>0<2){break d}b=a+b|0;G[110921]=b;if(b>>>0<32768){continue}break c}break}if(b){break c}Ua(443536);Ua(22164);b=G[110921];c=1;a=G[110920];break b}G[110920]=1;G[110923]=G[110923]+b;c=H[443696];a=1}E[g+14|0]=c;e:{if(a>>>0>>0){G[110920]=a+1;a=H[a+443696|0];break e}G[110921]=0;b=0;f:{while(1){g:{a=zc(b+443696|0,1,32768-b|0,G[110916]);b=G[110921];if(a+1>>>0<2){break g}b=a+b|0;G[110921]=b;if(b>>>0<32768){continue}break f}break}if(b){break f}Ua(443536);Ua(22164);a=1;break e}G[110920]=1;G[110923]=G[110923]+b;a=H[443696]}E[g+15|0]=a;if((H[g+14|0]|H[g+15|0]<<8)!=40223){Ua(443536);Ua(86619);break a}G[47518]=18;if(Nn(G[110916],G[119132])){G[f>>2]=414}if(e){G[e>>2]=G[110922]}}Fa=g+16|0}function Pm(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;var j=0,k=0,l=0,m=0,n=0,o=0;k=G[a+16>>2];l=M(c,168);j=l+G[a+8>>2]|0;f=+G[a+32>>2];g=(i-+G[a+24>>2])/f+1+.5;a:{if(O(g)<2147483648){b=~~g;break a}b=-2147483648}g=+(b|0);L[j+16>>3]=g;L[j+8>>3]=g;n=j,o=lb(G[a+48>>2]+1|0,4),G[n+24>>2]=o;Pf(a,c,d,e);j=G[(l+G[a+8>>2]|0)+24>>2];f=(h-+(k|0))/f+1+.5;b:{if(O(f)<2147483648){c=~~f;break b}c=-2147483648}k=G[a+48>>2];l=G[a+44>>2];m=lb(1,8);G[m+4>>2]=c;c:{if(!j){break c}b=(b|0)<(l|0)?l:b;k=(b|0)<(k|0)?b:k;b=j+(k<<2)|0;j=G[b>>2];d:{if(!j){j=0;break d}if((c|0)>2]){break d}while(1){b=j;j=G[b>>2];if(!j){j=0;break d}if((c|0)>G[j+4>>2]){continue}break}}G[m>>2]=j;G[b>>2]=m;if((e|0)==1){break c}if(d){b=k<<2;d=b+G[a+56>>2]|0;if((c|0)<=G[d>>2]){e=d;d=G[a+36>>2];G[e>>2]=(c|0)<(d|0)?d:c}b=b+G[a+60>>2]|0;if((c|0)>2]){break c}a=G[a+40>>2];G[b>>2]=(a|0)<(c|0)?a:c;return}b=k<<2;G[b+G[a+56>>2]>>2]=G[a+36>>2];G[b+G[a+60>>2]>>2]=G[a+40>>2]}}function Nd(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=1;h=G[a+52>>2];if(h-261>>>0<=1){c=G[309727];b=ab(c<<2);G[a+88>>2]=b;if(b){d=b;f=G[a+56>>2];b=ab(M(c,f+2|0));G[d>>2]=b;if(b){b=0;a:{if((c|0)<2){break a}b=c-1|0;i=b&3;b:{if(c-2>>>0<3){b=0;break b}g=b&-4;b=0;while(1){d=G[a+88>>2];c=e<<2;G[d+c>>2]=(G[d+(b<<2)>>2]+f|0)+1;b=G[a+88>>2];d=c+4|0;G[b+d>>2]=(G[b+c>>2]+f|0)+1;b=G[a+88>>2];c=c+8|0;G[b+c>>2]=(G[b+d>>2]+f|0)+1;d=G[a+88>>2];b=e+3|0;G[d+(b<<2)>>2]=(G[c+d>>2]+f|0)+1;e=e+4|0;j=j+4|0;if((g|0)!=(j|0)){continue}break}}if(!i){break a}c=b;while(1){g=G[a+88>>2];b=e;G[g+(b<<2)>>2]=(G[g+(c<<2)>>2]+f|0)+1;e=b+1|0;c=b;k=k+1|0;if((k|0)!=(i|0)){continue}break}}if((h|0)==261){G[a+84>>2]=(G[G[a+88>>2]+(b<<2)>>2]+f|0)+1;return}G[a+84>>2]=0;return}G[309737]=113;Wa(G[a+88>>2]);return}G[309737]=113;return}b=M(G[309727],G[a+56>>2]);c=h-258|0;if(c>>>0<=2){e=G[(c<<2)+137092>>2]}c=lb(e+1|0,b);G[a+88>>2]=c;if(!c){G[309737]=113;return}G[a+84>>2]=c+M(b,e)}function Lq(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=Fa-32|0;Fa=e;a:{b:{c=G[a>>2];if(c){a=G[b>>2];if(a){break b}}a=G[24367];c:{if(H[3780288]){G[e+20>>2]=3780288;G[e+16>>2]=4045;Tb(a,69475,e+16|0);break c}G[e>>2]=4045;Tb(a,68751,e)}b=0;a=G[945062];d:{if(!a){break d}d=a+(G[945063]<<2)|0;a=G[d>>2];if(!a){break d}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;c=G[a+4>>2];G[a+8>>2]=c;if((a|0)!=G[d>>2]){break d}a=G[a+16>>2];G[945064]=c;G[950324]=a;G[945070]=c;G[945057]=G[G[d>>2]>>2];E[3780260]=H[c|0]}E[3801300]=1;break a}d=G[a+24>>2];if(!G[c+24>>2]){b=(d|0)!=0;break a}b=-1;if(!d){break a}d=G[c+4>>2];if(G[G[950220]+8>>2]){if(!(!(d&7)|!(H[a+4|0]&7))){b=1;c=G[c>>2];a=G[a>>2];if((c|0)<(a|0)){break a}b=(a|0)<(c|0)?-1:0;break a}c=G[c>>2];a=G[a>>2];if((c|0)<(a|0)){break a}b=(a|0)<(c|0);break a}f=G[a+4>>2]&1;d=d&1;if((f|0)==(d|0)){c=G[c>>2];a=G[a>>2];if((c|0)<(a|0)){break a}b=(a|0)<(c|0);break a}b=d?1:0-f|0}Fa=e+32|0;return b|0}function aj(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;f=Fa-32768|0;Fa=f;a:{e=jb(b,62);i=jb(b,60);if(i?e:0){break a}b:{c:{if(!c){break c}d:{switch(H[a|0]-46|0){case 1:break c;case 0:break d;default:break b}}if(H[a+1|0]!=47){break b}}d=Ml(a,b);break a}d=rb(f+24576|0,c,8191);E[d+8191|0]=0;c=Ih(d);if(c){h=E[c|0];E[c|0]=0;c=c+1|0}else{c=0}g=(e|0)!=0;while(1){e=c;e:{f:{g:{if(jb(d,36)){c=f- -8192|0;Nl(d,c);if(jb(c,36)){break g}d=aj(a,b,f- -8192|0);if(d){break a}break g}if(g){break g}if(!Xa(48504,d)){E[d|0]=0}d=rb(f+16384|0,d,8191);E[f+24575|0]=0;c=Va(d);if(!(!H[d|0]|H[(c+d|0)-1|0]==47)){if((c|0)>8190){d=0;break a}g=Va(d)+d|0;E[g|0]=47;E[g+1|0]=0;c=c+1|0}if(c+Va(a)>>>0>8191){d=0;break a}d=Ml(Gb(d,a),b);if(d){break a}g=0;if((h|0)==59){break f}break e}if((h|0)!=59){break e}if(!g){break f}b=rb(f,b,8191);E[f+8191|0]=0}g=0;if(!i){break e}d=0;break a}if(!e){d=0;break a}c=0;d=e;e=Ih(d);if(!e){continue}h=E[e|0];E[e|0]=0;c=e+1|0;continue}}Fa=f+32768|0;return d}function bp(a,b,c,d,e,f){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;m=8<=2){q=c-1|0;r=1<>>1|0)+1|0;t=(d&-2)<(d|0);while(1){l=h+s|0;g=M(b,i);k=g+b|0;while(1){p=g<<2;j=(k<<2)+a|0;E[e+h|0]=(G[(p|4)+a>>2]<<2&o|(G[j>>2]<<1&n|G[j+4>>2]&r)|G[a+p>>2]<<3&m)>>f;k=k+2|0;g=g+2|0;j=h;h=h+1|0;if((l|0)!=(h|0)){continue}break}b:{if(t){E[e+l|0]=(G[(g<<2)+a>>2]<<3&m|G[(k<<2)+a>>2]<<1&n)>>f;h=j+2|0;break b}h=l}i=i+2|0;if((q|0)>(i|0)){continue}break}break a}if((d|0)!=1){i=c&-2;break a}l=c-2>>>1|0;h=l+1|0;while(1){j=M(b,i);E[e+g|0]=(G[(j<<2)+a>>2]<<3&m|G[(b+j<<2)+a>>2]<<1&n)>>f;i=i+2|0;j=(g|0)!=(l|0);g=g+1|0;if(j){continue}break}}c:{if((c|0)<=(i|0)){break c}g=M(b,i);k=0;if((d|0)>=2){c=d-1|0;while(1){b=g<<2;E[e+h|0]=(G[b+a>>2]<<3&m|G[(b|4)+a>>2]<<2&o)>>f;g=g+2|0;h=h+1|0;k=k+2|0;if((c|0)>(k|0)){continue}break}b=d&-2}else{b=0}if((b|0)>=(d|0)){break c}E[e+h|0]=(G[(g<<2)+a>>2]<<3&m)>>f}}function Ci(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;n=Fa-1e5|0;Fa=n;i=G[h>>2];if((i|0)<=0){i=c+e|0;j=b+d|0;i=j>>>0>>0?i+1|0:i;p=j;s=i;a:{if(d|e){q=!!f&(g|0)>=0|(g|0)>0;i=q;m=i?p:b;i=i?s:c;j=g>>31;r=j;r=j;while(1){j=m;m=i;k=d>>>0<1e5&(e|0)<=0|(e|0)<0?d:1e5;i=k>>31;l=q?k:0;m=m-((j>>>0>>0)+(q?i:0)|0)|0;l=j-l|0;Jb(a,l,m,0,h);j=i;ic(a,k,i,n,h);i=g+m|0;o=f+l|0;i=o>>>0>>0?i+1|0:i;Jb(a,o,i,1,h);if((Wb(a,k,j,n,h)|0)>0){Ua(50392);break a}o=k&r;l=o+l|0;i=(j&r)+m|0;i=l>>>0>>0?i+1|0:i;m=l;e=e-((d>>>0>>0)+j|0)|0;d=d-k|0;if(e|d){continue}break}}b:{if(G[G[a+4>>2]+80>>2]==1){cb(n,32,1e5);break b}cb(n,0,1e5)}d=g+s|0;e=f+p|0;d=e>>>0

>>0?d+1|0:d;i=b;b=(g|0)<0;Jb(a,b?e:i,b?d:c,0,h);if(!(f|g)){break a}b=g>>31;i=b;e=i^f;b=e-i|0;c=(g^i)-((i>>>0>e>>>0)+i|0)|0;while(1){e=b>>>0<1e5&(c|0)<=0|(c|0)<0?b:1e5;i=e;k=i>>31;Wb(a,i,k,n,h);c=c-((b>>>0>>0)+k|0)|0;b=b-i|0;if(c|b){continue}break}}i=G[h>>2]}Fa=n+1e5|0;return i}function oc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;A(+a);c=v(1)|0;e=v(0)|0;d=c-1072562176|0;if((d|0)==198911|d>>>0<198911){if(!e&(c|0)==1072693248){return 0}a=a+-1;b=a*134217728;b=a+b-b;h=L[11600];j=b*b*h;k=a+j;f=a*a;g=a*f;return k+(g*(g*(g*(g*L[11610]+(f*L[11609]+(a*L[11608]+L[11607])))+(f*L[11606]+(a*L[11605]+L[11604])))+(f*L[11603]+(a*L[11602]+L[11601])))+((a-b)*h*(a+b)+(j+(a-k))))}d=c>>>16|0;a:{if(d-32752>>>0<=4294934559){if(!(c&2147483647|e)){e=Fa-16|0;L[e+8>>3]=-1;return L[e+8>>3]/0}if(!e&(c|0)==2146435072){break a}if(!(!(d&32768)&(d&32752)!=32752)){a=a-a;return a/a}A(+(a*4503599627370496));c=v(1)|0;e=v(0)|0;c=c-54525952|0}d=c-1072037888|0;f=+(d>>20);i=(d>>>13&127)<<4;g=f*L[11593]+L[i+92896>>3];a=L[i+92888>>3];x(0,e-0|0);x(1,c-((d&-1048576)+(e>>>0>>0)|0)|0);a=a*(+z()-L[i+94936>>3]-L[i+94944>>3]);h=g+a;b=a*a;a=h+(a*b*(b*(a*L[11599]+L[11598])+(a*L[11597]+L[11596]))+(b*L[11595]+(f*L[11594]+(a+(g-h)))))}return a}function Le(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;h=Fa-32|0;Fa=h;G[h+24>>2]=0;G[h+28>>2]=0;G[h+8>>2]=0;G[h+12>>2]=0;G[h>>2]=0;G[h+4>>2]=0;i=G[g>>2];a:{if((i|0)>0){break a}j=G[a>>2];i=G[a+4>>2];b:{c:{if((j|0)!=G[i+76>>2]){mb(a,j+1|0,0,g);break c}if((G[i+128>>2]&G[i+132>>2])!=-1){break c}if((Rb(a,g)|0)>0){break b}}j=b-1|0;b=G[a+4>>2];k=G[b+968>>2];i=M(j,160)+k|0;if(G[i+80>>2]>=0){i=317;G[g>>2]=317;break a}l=G[i+76>>2];m=G[b+132>>2];n=G[i+72>>2];o=G[b+128>>2];d=Au(G[b+960>>2],G[b+964>>2],c-1|0,d-!c|0);c=o+d|0;b=Ia+m|0;b=c>>>0>>0?b+1|0:b;d=c;c=n+c|0;b=b+l|0;b=c>>>0>>0?b+1|0:b;d:{if(!(H[i+140|0]!=80&H[(k+M(j,160)|0)+141|0]!=80)){if((Uc(a,c,b,2,4,h+24|0,g)|0)>0){break b}if(e){G[e>>2]=G[h+24>>2];G[e+4>>2]=0}if(!f){break b}b=0;a=G[h+28>>2];break d}if((Tc(a,c,b,2,8,h,g)|0)>0){break b}if(e){a=G[h+4>>2];G[e>>2]=G[h>>2];G[e+4>>2]=a}if(!f){break b}b=G[h+12>>2];a=G[h+8>>2]}G[f>>2]=a;G[f+4>>2]=b}i=G[g>>2]}Fa=h+32|0;return i}function dt(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;c=Fa-16|0;Fa=c;G[c+12>>2]=0;a=M(a,48);j=a+757232|0;g=a+757236|0;d=G[g>>2];k=G[a+757264>>2];h=a+757272|0;e=G[h>>2];i=c+8|0;a=Fa+-64|0;Fa=a;b=G[c+12>>2];a:{if((b|0)>0){break a}b=ab(115200);if(!b){b=113;G[c+12>>2]=113;break a}G[a+48>>2]=0;G[a+40>>2]=0;G[a+44>>2]=0;b:{if(Nk(a+8|0,1,0)){break b}G[a+20>>2]=b;G[a+12>>2]=k;G[a+8>>2]=d;while(1){c:{G[a+24>>2]=115200;d=Mk(a+8|0,4);if(d){if((d|0)==1){break c}ff(a+8|0);Wa(b);break b}if((hb(b,1,115200,e)|0)!=115200){ff(a+8|0);Wa(b);break b}else{G[a+20>>2]=b;f=f+115200|0;continue}}break}d:{d=G[a+28>>2];if(f>>>0>=d>>>0){break d}e=hb(b,1,d-f|0,e);d=G[a+28>>2];if((e|0)==(d-f|0)){break d}ff(a+8|0);Wa(b);break b}Wa(b);if(i){G[i>>2]=d}if(ff(a+8|0)){break b}b=G[c+12>>2];break a}b=413;G[c+12>>2]=413}Fa=a- -64|0;if(b){Ua(52912);G[c+12>>2]=106}Wa(G[g>>2]);G[j>>2]=0;G[g>>2]=0;a=G[h>>2];if((a|0)!=G[29763]){Hb(a)}Fa=c+16|0;return G[c+12>>2]}function Pd(a){var b=0,c=0,d=0,e=0,f=0,g=0;A(+a);e=v(1)|0;v(0)|0;d=e&2147483647;if(d>>>0>=1141899264){A(1.5707963267948966);e=v(1)|0;d=v(0)|0;A(+a);b=v(1)|0;v(0)|0;x(0,d|0);x(1,e&2147483647|b&-2147483648);g=+z();A(+a);b=v(1)|0;e=v(0)|0;b=b&2147483647;return(b|0)==2146435072&(e|0)!=0|b>>>0>2146435072?a:g}a:{b:{if(d>>>0<=1071382527){b=-1;if(d>>>0>=1044381696){break b}break a}a=O(a);if(d>>>0<=1072889855){if(d>>>0<=1072037887){a=(a+a+-1)/(a+2);b=0;break b}a=(a+-1)/(a+1);b=1;break b}if(d>>>0<=1073971199){a=(a+-1.5)/(a*1.5+1);b=2;break b}a=-1/a;b=3}f=a*a;c=f*f;g=c*(c*(c*(c*(c*-.036531572744216916+-.058335701337905735)+-.0769187620504483)+-.11111110405462356)+-.19999999999876483);f=f*(c*(c*(c*(c*(c*.016285820115365782+.049768779946159324)+.06661073137387531)+.09090887133436507)+.14285714272503466)+.3333333333333293);if(d>>>0<=1071382527){return a-a*(g+f)}b=b<<3;a=L[b+120320>>3]-(a*(g+f)-L[b+120352>>3]-a);a=(e|0)<0?-a:a}return a}function np(a){var b=0,c=0,d=0;c=a+148|0;while(1){d=b<<2;F[d+c>>1]=0;F[(d|4)+c>>1]=0;b=b+2|0;if((b|0)!=286){continue}break}F[a+2684>>1]=0;F[a+2440>>1]=0;F[a+2756>>1]=0;F[a+2752>>1]=0;F[a+2748>>1]=0;F[a+2744>>1]=0;F[a+2740>>1]=0;F[a+2736>>1]=0;F[a+2732>>1]=0;F[a+2728>>1]=0;F[a+2724>>1]=0;F[a+2720>>1]=0;F[a+2716>>1]=0;F[a+2712>>1]=0;F[a+2708>>1]=0;F[a+2704>>1]=0;F[a+2700>>1]=0;F[a+2696>>1]=0;F[a+2692>>1]=0;F[a+2688>>1]=0;F[a+2556>>1]=0;F[a+2552>>1]=0;F[a+2548>>1]=0;F[a+2544>>1]=0;F[a+2540>>1]=0;F[a+2536>>1]=0;F[a+2532>>1]=0;F[a+2528>>1]=0;F[a+2524>>1]=0;F[a+2520>>1]=0;F[a+2516>>1]=0;F[a+2512>>1]=0;F[a+2508>>1]=0;F[a+2504>>1]=0;F[a+2500>>1]=0;F[a+2496>>1]=0;F[a+2492>>1]=0;F[a+2488>>1]=0;F[a+2484>>1]=0;F[a+2480>>1]=0;F[a+2476>>1]=0;F[a+2472>>1]=0;F[a+2468>>1]=0;F[a+2464>>1]=0;F[a+2460>>1]=0;F[a+2456>>1]=0;F[a+2452>>1]=0;F[a+2448>>1]=0;F[a+2444>>1]=0;G[a+5804>>2]=0;G[a+5808>>2]=0;F[a+1172>>1]=1;G[a+5800>>2]=0;G[a+5792>>2]=0}function Rt(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;if(!a){return-2}if(G[a+16>>2]==7247){b=-2;if(!(!a|G[a+16>>2]!=7247)){if(G[a+28>>2]){ye(a+100|0);Wa(G[a+40>>2]);Wa(G[a+36>>2])}b=G[a+92>>2];Vd(a,0,0);Wa(G[a+24>>2]);c=fj(G[a+20>>2]);Wa(a);b=c?-1:(b|0)==-5?-5:0}return b|0}b=-2;if(!(!a|G[a+16>>2]!=31153)){a:{if(!G[a+88>>2]){b=0;break a}b=0;G[a+88>>2]=0;c=G[a+80>>2];d=G[a+84>>2];b:{if(G[a+104>>2]){if((Jf(a,0)|0)==-1){break b}}if(!(c|d)){break a}while(1){b=G[a+28>>2];b=(d|0)<=0&b>>>0>c>>>0|(d|0)<0?c:b;if(!e){cb(G[a+36>>2],0,b)}G[a+104>>2]=b;G[a+100>>2]=G[a+36>>2];e=G[a+12>>2];f=G[a+8>>2];g=f+b|0;G[a+8>>2]=g;G[a+12>>2]=f>>>0>g>>>0?e+1|0:e;if((Jf(a,0)|0)==-1){break b}e=1;d=d-(b>>>0>c>>>0)|0;c=c-b|0;if(d|c){continue}break}b=0;break a}b=G[a+92>>2]}if((Jf(a,4)|0)==-1){b=G[a+92>>2]}if(G[a+28>>2]){if(!G[a+44>>2]){ff(a+100|0);Wa(G[a+40>>2])}Wa(G[a+36>>2])}Vd(a,0,0);Wa(G[a+24>>2]);c=fj(G[a+20>>2]);Wa(a);b=(c|0)==-1?-1:b}return b|0}function oi(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{e=xf(a);if((e|0)>=0){d=G[309723];if((d|0)==G[309724]){c=G[309722];b:{if(c){G[309724]=d<<1;d=ub(c,M(d,688));break b}G[309724]=100;d=ab(34400)}if(!d){break a}G[309722]=d;d=G[309723]}G[309723]=d+1;c:{if((d|0)<0){break c}i=G[309722];c=i+M(d,344)|0;G[c+12>>2]=e;G[c+8>>2]=2;G[c+4>>2]=22;G[c>>2]=123;G[c+16>>2]=b;j=G[309730];b=j+M(a,124)|0;G[c+52>>2]=G[b+84>>2];G[c+56>>2]=G[b+88>>2];e=c;c=G[b+92>>2];G[e+60>>2]=c;if((c|0)<=0){break c}b=0;if(c-1>>>0>=3){m=c&-4;e=(M(d,344)+i|0)- -64|0;g=(M(a,124)+j|0)+96|0;while(1){f=b<<2;G[f+e>>2]=G[g+f>>2];h=f|4;G[h+e>>2]=G[g+h>>2];h=f|8;G[h+e>>2]=G[g+h>>2];f=f|12;G[f+e>>2]=G[g+f>>2];b=b+4|0;k=k+4|0;if((m|0)!=(k|0)){continue}break}}c=c&3;if(!c){break c}e=M(d,344)+i|0;a=M(a,124)+j|0;while(1){g=b<<2;G[(g+e|0)- -64>>2]=G[(a+g|0)+96>>2];b=b+1|0;l=l+1|0;if((c|0)!=(l|0)){continue}break}}}else{d=-1}return d}G[309737]=113;return-1}function je(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;var m=0,n=0,o=0,p=0;a:{b:{if(j==k){if(j==0){return!d|0}n=G[a+8>>2];if(d){e=n+M(c,168)|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){e=~~g}else{e=-2147483648}e=G[m+(e<<2)>>2];m=0;c:{if(!e){break c}m=0;if(!(L[o+8>>3]<=g)){break c}m=0;if(!(L[(n+M(c,168)|0)+16>>3]>=g)){break c}m=0;if(!(+G[e+4>>2]<=f)){break c}m=+G[G[e>>2]+4>>2]>=f}if((m|0)!=(d|0)){break a}p=1;if(!b){break a}if(d){break b}break a}n=G[a+8>>2];if(d){e=n+M(c,168)|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){e=~~g}else{e=-2147483648}e=G[m+(e<<2)>>2];m=0;d:{if(!e){break d}m=0;if(!(L[o+8>>3]<=g)){break d}m=0;if(!(L[(n+M(c,168)|0)+16>>3]>=g)){break d}m=0;if(!(+G[e+4>>2]<=f)){break d}m=+G[G[e>>2]+4>>2]>=f}if((m|0)!=(d|0)){break a}p=1;if(!b|!d){break a}}G[a+12>>2]=b}return p|0}function Rb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Fa-288|0;Fa=d;G[d+280>>2]=0;c=G[b>>2];if((c|0)<=0){e=G[a>>2];c=G[a+4>>2];a:{if((e|0)!=G[c+76>>2]){mb(a,e+1|0,0,b);break a}if(G[c+84>>2]!=1){break a}b:{if((G[c+128>>2]&G[c+132>>2])==-1){break b}c:{if(!G[c+80>>2]){break c}ef(a,2,b);g=_f(a,40853,d+272|0,d+96|0,d+280|0);c=G[a+4>>2];h=G[c+952>>2];e=G[c+956>>2];if((g|0)>0){G[d+272>>2]=h;G[d+276>>2]=e;break c}g=G[d+276>>2];f=G[d+272>>2];if((g|0)>=(e|0)&f>>>0>=h>>>0|(e|0)<(g|0)|((f|0)!=G[c+944>>2]|(g|0)!=G[c+948>>2])){break c}L[d>>3]=+(h>>>0)+ +(e|0)*4294967296;c=d+16|0;Ya(c,71,19648,d);f=c;c=d+176|0;Ob(40853,f,d+96|0,c,b);Hd(a,c,b);c=G[a+4>>2]}f=!G[c+984>>2];c=G[c+988>>2];if(f&(c|0)<=0|(c|0)<0){break b}ef(a,2,b);_f(a,33303,d+264|0,d+96|0,b);c=G[a+4>>2];e=G[c+984>>2];c=G[c+988>>2];if((e|0)==G[d+264>>2]&(c|0)==G[d+268>>2]){break b}Ad(a,33303,e,c,d+96|0,b)}if((rk(a,b)|0)>0){break a}Wf(a,d+284|0,b)}c=G[b>>2]}Fa=d+288|0;return c}function ee(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0;a:{if(!(!f&(g|0)<=0|(g|0)<0|G[i>>2]>0)){if(!b&(c|0)<=0|(c|0)<0){break a}if(!d&(e|0)<=0|(e|0)<0){G[i>>2]=308;return}j=G[a>>2];k=G[a+4>>2];if((j|0)!=G[k+76>>2]){mb(a,j+1|0,0,i);k=G[a+4>>2]}m=G[k+956>>2];n=G[k+960>>2];p=G[k+952>>2];j=e+g|0;l=d+f|0;j=l>>>0>>0?j+1|0:j;o=G[k+964>>2];l=Bu(l-2|0,j-(l>>>0<2)|0,n,o)+b|0;j=c+Ia|0;j=b>>>0>l>>>0?j+1|0:j;if(p>>>0>>0&(j|0)>=(m|0)|(j|0)>(m|0)){Ua(63178);break a}b:{if(G[i>>2]>0){break b}j=G[k+132>>2];l=G[k+128>>2];c=Au(n,o,b-1|0,c-!b|0)+d|0;b=e+Ia|0;b=c>>>0>>0?b+1|0:b;d=c;c=l+c|0;b=b+j|0;b=c>>>0>>0?b+1|0:b;if(!c&(b|0)<=0|(b|0)<0){G[i>>2]=304;break b}d=G[a>>2];if((d|0)!=G[k+76>>2]){mb(a,d+1|0,0,i);k=G[a+4>>2]}b=b-!c|0;c=c-1|0;d=Du(c,b,2880,0);e=G[k+72>>2];if(!((e|0)>=0&(d|0)==G[((e<<2)+k|0)+1256>>2])){Hc(a,d,0,i)}if(G[i>>2]>0){break b}d=G[a+4>>2];G[d+56>>2]=c;G[d+60>>2]=b}ic(a,f,g,h,i)}return}G[i>>2]=307}function Ce(a){var b=0;if(a){a:{if(!G[a+3312>>2]){break a}b=G[a+9392>>2];if(b){Ce(b);G[a+9392>>2]=0}b=G[321376];if(b){Wa(b);G[321376]=0}b=G[321377];if(b){Wa(b);G[321377]=0}b=G[321378];if(b){Wa(b);G[321378]=0}b=G[321379];if(b){Wa(b);G[321379]=0}b=G[321380];if(b){Wa(b);G[321380]=0}b=G[321381];if(b){Wa(b);G[321381]=0}b=G[321382];if(b){Wa(b);G[321382]=0}b=G[321383];if(b){Wa(b);G[321383]=0}b=G[321384];if(b){Wa(b);G[321384]=0}b=G[321385];if(b){Wa(b);G[321385]=0}b:{if(!a|!G[a+3312>>2]){break b}b=G[a+9288>>2];if(b){Wa(b)}b=G[a+9292>>2];if(b){Wa(b)}b=G[a+9296>>2];if(b){Wa(b)}b=G[a+9300>>2];if(b){Wa(b)}b=G[a+9304>>2];if(b){Wa(b)}b=G[a+9308>>2];if(b){Wa(b)}b=G[a+9312>>2];if(b){Wa(b)}b=G[a+9316>>2];if(b){Wa(b)}b=G[a+9320>>2];if(b){Wa(b)}b=G[a+9324>>2];if(!b){break b}Wa(b)}b=G[a+9400>>2];if(b){Wa(b)}b=G[a+4060>>2];if(b){Wa(b)}b=G[a+4056>>2];if(b){Wa(b)}b=G[a+3168>>2];if(b){tg(b)}b=G[a+3172>>2];if(!b){break a}tg(b)}Wa(a)}}function zj(a,b,c){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;f=G[b+4>>2];a:{if(G[b>>2]!=137){j=1;if(Aj(b)){break a}}if((f|0)<=0){return 0}o=f&-2;p=f&1;d=f-1|0;i=G[b+24>>2];while(1){g=(l<<3)+c|0;G[g>>2]=0;G[g+4>>2]=0;k=0;j=0;h=0;if(d){while(1){m=(e<<3)+i|0;n=j<<3;k=L[m>>3]*L[n+a>>3]+k;L[g>>3]=k;k=L[m+8>>3]*L[(n|8)+a>>3]+k;L[g>>3]=k;e=e+2|0;j=j+2|0;h=h+2|0;if((o|0)!=(h|0)){continue}break}}if(p){L[g>>3]=L[(e<<3)+i>>3]*L[(j<<3)+a>>3]+k;e=e+1|0}l=l+1|0;if((f|0)!=(l|0)){continue}break}if((f|0)<=0){return 0}a=G[b+8>>2];j=0;e=0;if(d>>>0>=3){g=f&-4;h=0;while(1){b=e<<3;d=b+c|0;L[d>>3]=L[a+b>>3]+L[d>>3];d=b|8;i=d+c|0;L[i>>3]=L[a+d>>3]+L[i>>3];d=b|16;i=d+c|0;L[i>>3]=L[a+d>>3]+L[i>>3];b=b|24;d=b+c|0;L[d>>3]=L[a+b>>3]+L[d>>3];e=e+4|0;h=h+4|0;if((g|0)!=(h|0)){continue}break}}f=f&3;if(!f){break a}b=0;while(1){h=e<<3;g=h+c|0;L[g>>3]=L[a+h>>3]+L[g>>3];e=e+1|0;b=b+1|0;if((f|0)!=(b|0)){continue}break}}return j}function ij(a,b,c,d,e,f){var g=0,h=0,i=0,j=0,k=0,l=0;if(G[321436]){h=G[24367];hb(89086,25,1,h);$a(h)}if(!H[3706192]){G[926552]=442745336;G[926553]=1078765020;G[926550]=-1571644103;G[926551]=1066524486;E[3706192]=1}if(G[321436]){h=G[24367];hb(89165,24,1,h);$a(h)}a:{if(f){e=(e+-1950)*.01;g=e*e;g=e*g*.00182+(g*-.0033+(e*-46.85+84404.84));break a}e=(e+-2e3)*.01;g=e*e;g=e*g*.001813+(g*-59e-5+(e*-46.815+84381.448))}e=L[463275];g=g/3600*e;j=eb(g);b=e*b;k=ib(b);l=j*k;e=e*a;i=ib(e);a=eb(b);b=ib(g);g=a*-i;i=b*g;a=Db(-(j*g-b*k),a*eb(e));b=L[463276];e=a*b;if(e<0){while(1){e=e+360;if(e<0){continue}break}}L[c>>3]=e;if(e>360){while(1){e=e+-360;if(e>360){continue}break}L[c>>3]=e}a=l+i;e=O(a);if(e>1){L[d>>3]=a*90/e;G[c>>2]=0;G[c+4>>2]=0;return}a=b*fc(a);L[d>>3]=a;b:{if(!(O(a)>=90)){break b}G[c>>2]=0;G[c+4>>2]=0;a=L[d>>3];if(a>90){G[d>>2]=0;G[d+4>>2]=1079410688;return}if(!(a<-90)){break b}G[d>>2]=0;G[d+4>>2]=-1068072960}}function Jf(a,b){var c=0,d=0,e=0,f=0,g=0;a:{b:{if(!G[a+28>>2]){c=-1;if((Aq(a)|0)==-1){break b}}if(G[a+44>>2]){c=0;d=G[a+104>>2];if(!d){break b}e=G[a+100>>2];while(1){b=lg(G[a+20>>2],e,d>>>0<1073741824?d:1073741824);if((b|0)<0){break a}d=G[a+104>>2]-b|0;G[a+104>>2]=d;e=b+G[a+100>>2]|0;G[a+100>>2]=e;if(d){continue}break}break b}f=a+100|0;c=G[a+116>>2];g=(b|0)!=4;while(1){c:{if(!b|!((d|0)==1|g)?c:0){break c}e=G[a+112>>2];d=G[a+4>>2];if(e>>>0>d>>>0){while(1){c=e-d|0;c=lg(G[a+20>>2],d,(c|0)<1073741824?c:1073741824);if((c|0)<0){break a}d=c+G[a+4>>2]|0;G[a+4>>2]=d;e=G[a+112>>2];if(d>>>0>>0){continue}break}c=G[a+116>>2]}if(c){break c}c=G[a+28>>2];G[a+116>>2]=c;e=G[a+40>>2];G[a+112>>2]=e;G[a+4>>2]=e}d=Mk(f,b);if((d|0)==-2){Vd(a,-2,4605);return-1}e=c;c=G[a+116>>2];if((e|0)!=(c|0)){continue}break}c=0;if((b|0)!=4){break b}kp(f)}return c}b=a;a=G[48624];Vd(b,-1,I[((a>>>0>149?0:a)<<1)+143920>>1]+142088|0);return-1}function ot(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;e=Fa-16|0;Fa=e;a:{b:{c:{d:{if(!Xa(a,2749)){break d}if(!Xa(a,2675)){break d}if(Xa(a,2712)){break c}}f=G[29763];break b}G[e+12>>2]=6433655;c=ac(a,13287);if(c){Hb(c);a=105;break a}f=ac(a,e+12|0);if(f){break b}a=105;break a}G[b>>2]=-1;a=0;e:{f:{g:{while(1){d=M(a,48)+757232|0;if(!G[d>>2]){c=a;break g}c=a+1|0;d=M(c,48)+757232|0;if(!G[d>>2]){break g}c=a+2|0;d=M(c,48)+757232|0;if(!G[d>>2]){break g}c=a+3|0;d=M(c,48)+757232|0;if(!G[d>>2]){break g}c=a+4|0;d=M(c,48)+757232|0;if(!G[d>>2]){break g}a=a+5|0;if((a|0)!=1e4){continue}break}a=103;break f}G[b>>2]=c;a=M(c,48);c=a+757236|0;G[d>>2]=c;d=a+757244|0;G[a+757240>>2]=d;g=c;c=ab(2880);G[g>>2]=c;if(c){break e}Ua(57797);a=104}Ua(52859);break a}G[d>>2]=2880;c=a+757256|0;G[c>>2]=0;G[c+4>>2]=0;G[a+757248>>2]=2880;c=a+757264|0;G[c>>2]=0;G[c+4>>2]=0;G[a+757252>>2]=17;G[M(G[b>>2],48)+757272>>2]=f;a=0}Fa=e+16|0;return a|0}function qk(a,b,c,d,e,f){var g=0,h=0,i=0,j=0;i=Fa-16|0;Fa=i;a:{if(G[f>>2]>0){break a}h=G[a>>2];g=G[a+4>>2];b:{c:{if((h|0)!=G[g+76>>2]){mb(a,h+1|0,0,f);break c}if((G[g+128>>2]&G[g+132>>2])!=-1){break c}if((Rb(a,f)|0)>0){break b}}d:{if((b|0)>0){g=G[a+4>>2];if(G[g+936>>2]>=(b|0)){break d}}G[f>>2]=302;break a}if(G[f>>2]>0){break a}b=b-1|0;h=G[g+968>>2];e:{f:{j=G[a>>2];if(!(G[g+104>>2]|G[g+108>>2]?1:j)){break f}g:{h:{if(G[g+76>>2]!=(j|0)){mb(a,j+1|0,0,f);break h}if((G[g+128>>2]&G[g+132>>2])!=-1){break h}if((Rb(a,f)|0)>0){break g}}a=G[a+4>>2];g=G[a+1088>>2]?0:G[a+80>>2]}if(G[f>>2]>0){break a}if((g|0)!=1){break f}Gd((h+M(b,160)|0)+140|0,c,i+8|0,i+12|0,f);a=G[i+8>>2];G[e>>2]=a;G[e+4>>2]=a>>31;a=1;b=0;if(d){break e}break b}if(c){G[c>>2]=G[(h+M(b,160)|0)+80>>2]}if(e){a=G[(h+M(b,160)|0)+152>>2];G[e>>2]=a;G[e+4>>2]=a>>31}if(!d){break b}b=h+M(b,160)|0;a=G[b+88>>2];b=G[b+92>>2]}G[d>>2]=a;G[d+4>>2]=b}}Fa=i+16|0}function tr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;a:{if(G[c+4>>2]==303){g=L[c+24>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=79;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=47;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;g=L[c+24>>3];if(g==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=57.29577951308232}G[c+1892>>2]=123;G[c+1888>>2]=124;G[c+144>>2]=1841940611;G[c+148>>2]=1071931184;L[c+136>>3]=90/g;f=g*1.4142135623730951;L[c+112>>3]=f;L[c+128>>3]=1/f;L[c+120>>3]=f/90}i=d;g=b/g;f=2-g*g;b:{c:{if(f<=1e-12){d=2;if(f<-1e-12){break b}f=0;h=0;if(!(O(a)>1e-12)){break c}break b}f=V(f);h=L[c+136>>3]*a/f}L[i>>3]=h;a=L[c+128>>3]*b;b=O(a);d:{if(b>1){d=2;if(b>1.000000000001){break b}a=g*f/3.141592653589793+(a<0?-1:1);break d}a=fc(a)*L[c+144>>3]+g*f/3.141592653589793}b=O(a);if(b>1){d=2;if(b>1.000000000001){break b}a=a<0?-1:1}j=e,k=Bc(a),L[j>>3]=k;d=0}return d|0}function yl(a,b,c,d){var e=0,f=0;f=Fa-16|0;Fa=f;G[f+12>>2]=0;e=G[a+68>>2];a:{if(!e){break a}$a(e);e=G[a+68>>2];if((e|0)==G[24367]|(e|0)==G[29763]){break a}Hb(e)}e=G[a+64>>2];b:{if(!e){break b}$a(e);e=G[a+64>>2];if((e|0)==G[29763]|(e|0)==G[24367]){break b}Hb(e)}pb(a);pb(G[c+104>>2]);pb(G[c+108>>2]);pb(G[c+84>>2]);pb(G[c+88>>2]);pb(G[c+112>>2]);pb(G[c+52>>2]);pb(G[c+56>>2]);a=G[c+68>>2];if((a|0)!=G[b+68>>2]){pb(a)}a=G[c+60>>2];if((a|0)!=G[b+60>>2]){pb(a)}Ce(G[c+120>>2]);Hh(G[c+116>>2]);c:{if(!G[c+56>>2]){break c}a=G[c+124>>2];if(!a){break c}_e(a,f+12|0)}pb(c);pb(G[b+104>>2]);pb(G[b+108>>2]);pb(G[b+84>>2]);pb(G[b+88>>2]);pb(G[b+112>>2]);pb(G[b+52>>2]);pb(G[b+56>>2]);pb(G[b+60>>2]);pb(G[b+68>>2]);Ce(G[b+120>>2]);Hh(G[b+116>>2]);d:{if(!G[b+56>>2]){break d}a=G[b+124>>2];if(!a){break d}_e(a,f+12|0)}pb(b);pb(G[d+8>>2]);pb(G[d+12>>2]);pb(G[d+16>>2]);pb(G[d+20>>2]);pb(G[d>>2]);pb(d);Fa=f+16|0}function Sh(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((a|0)<=0){return 0}l=L[b>>3];h=!(g?l>=f:f>=l);i=(a<<3)-8|0;o=i+c|0;j=L[b+i>>3];a:{if(g?j>=f:f>=j){if(!h){L[d>>3]=l;L[e>>3]=L[c>>3];k=1;i=1;break a}p=L[c>>3];m=L[o>>3];L[d>>3]=f;L[e>>3]=m+(p-m)*(f-j)/(l-j);i=1;break a}i=0;if(h){break a}p=L[c>>3];m=L[o>>3];L[d>>3]=f;L[e>>3]=m+(p-m)*(f-j)/(l-j);L[d+8>>3]=L[b>>3];L[e+8>>3]=L[c>>3];k=1;i=2}o=1;if((a|0)!=1){while(1){h=o<<3;q=h+b|0;j=L[q>>3];n=(g?j>=f:f>=j)^1;b:{c:{if(k){if(!n){L[(i<<3)+d>>3]=j;j=L[c+h>>3];h=i;n=1;k=1;break c}k=h-8|0;l=L[k+b>>3];p=L[c+h>>3];m=L[c+k>>3];L[(i<<3)+d>>3]=f;j=m+(p-m)*(f-l)/(j-l);h=i;n=1;k=0;break c}k=0;if(n){break b}k=h-8|0;l=L[k+b>>3];n=c+h|0;p=L[n>>3];m=L[c+k>>3];h=i<<3;L[h+d>>3]=f;L[e+h>>3]=m+(p-m)*(f-l)/(j-l);h=i+1|0;L[(h<<3)+d>>3]=L[q>>3];j=L[n>>3];n=2;k=1}L[(h<<3)+e>>3]=j;i=i+n|0}o=o+1|0;if((o|0)!=(a|0)){continue}break}}return i}function Yd(){var a=0,b=0,c=0,d=0,e=0,f=0;c=Fa-48|0;Fa=c;if(G[309728]>0){a=G[309729];a:{if(a){Wa(a);break a}G[c+36>>2]=955;G[c+32>>2]=30721;kb(74522,c+32|0)}b=G[309730];d=G[309728];if((d|0)>0){a=0;while(1){f=M(a,124);e=f+b|0;if(G[e+116>>2]){b:{if(G[e+84>>2]!=262){break b}b=G[G[e+120>>2]>>2];if(b){Wa(b);break b}G[c+20>>2]=959;G[c+16>>2]=30721;kb(74700,c+16|0)}Wa(G[(G[309730]+f|0)+116>>2]);d=G[309728];b=G[309730]}a=a+1|0;if((d|0)>(a|0)){continue}break}}c:{if(b){Wa(b);break c}G[c+4>>2]=962;G[c>>2]=30721;kb(74483,c)}G[309728]=0}a=G[309723];if((a|0)>0){while(1){d:{e:{f:{b=G[309722];a=a-1|0;d=b+M(a,344)|0;switch(G[d>>2]-1032|0){case 1:break e;case 0:break f;default:break d}}b=G[(b+M(G[d+12>>2],344)|0)+88>>2];if(!b){break d}Wa(b);break d}qi(G[(b+M(G[d+12>>2],344)|0)+88>>2])}if(a){continue}break}G[309723]=0}a=G[309722];if(a){Wa(a)}G[309736]=-1;G[309722]=0;G[309731]=0;Fa=c+48|0}function tn(a){var 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;A(+a);b=v(1)|0;d=v(0)|0;a:{b:{c:{d:{if((b|0)>0|(b|0)>=0){e=b;if(b>>>0>1048575){break d}}if(!(b&2147483647|d)){return-1/(a*a)}if((b|0)>0|(b|0)>=0){break c}return(a-a)/0}if(e>>>0>2146435071){break a}b=1072693248;k=-1023;if((e|0)!=1072693248){b=e;break b}if(d){break b}return 0}A(+(a*0x40000000000000));b=v(1)|0;d=v(0)|0;k=-1077}b=b+614242|0;l=+((b>>>20|0)+k|0);f=l*.30102999566361177;x(0,d|0);x(1,(b&1048575)+1072079006|0);c=+z()+-1;g=c*(c*.5);h=c/(c+2);i=h*h;a=i*i;A(+(c-g));b=v(1)|0;v(0)|0;x(0,0);x(1,b|0);j=+z();m=j*.4342944818781689;n=f+m;a=h*(g+(a*(a*(a*.15313837699209373+.22222198432149784)+.3999999999940942)+i*(a*(a*(a*.14798198605116586+.1818357216161805)+.2857142874366239)+.6666666666666735)))+(c-j-g);a=n+(m+(f-n)+(a*.4342944818781689+(l*3694239077158931e-28+(a+j)*25082946711645275e-27)))}return a}function Nj(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=Fa-272|0;Fa=e;a:{d=G[c>>2];if((d|0)>0){break a}f=ab(1024);if(!f){Ua(42562);d=113;G[c>>2]=113;break a}E[f|0]=0;b:{k=ac(a,13287);if(k){j=1024;a=1;break b}G[e>>2]=a;a=e+16|0;Ya(a,256,42992,e);Ua(a);Wa(f);d=104;G[c>>2]=104;break a}while(1){c:{if(vc(e+16|0,256,k)){d=Va(e+16|0);if(!(!a|(d|0)<2|H[e+16|0]!=47)){a=1;if(H[e+17|0]==47){continue}}l=1;a=0;d:{if((d|0)<=0){break d}e:{g=d-1|0;h=g+(e+16|0)|0;switch(H[h|0]-10|0){case 0:case 3:break e;default:break d}}l=0;E[h|0]=0;a=1;if((d|0)<2){d=0;break d}h=d-2|0;d=g;f:{g=h+(e+16|0)|0;switch(H[g|0]-10|0){case 0:case 3:break f;default:break d}}E[g|0]=0;d=h}d=d+i|0;if((d+3|0)<(j|0)){break c}j=j+256|0;f=ub(f,j);if(f){break c}Ua(42562);G[c>>2]=113;f=0}Hb(k);G[b>>2]=f;d=G[c>>2];break a}Za(f+i|0,e+16|0);if(!l){i=d+f|0;E[i|0]=32;E[i+1|0]=0;d=d+1|0}i=d;continue}}Fa=e+272|0;return d}function wu(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;a:{if((b|0)>0){c=Fa-16|0;Fa=c;E[c+15|0]=0;bi(a,b);e=qj(a,c+15|0);Fa=c+16|0;break a}bi(a,256e3);e=rd(a)}b:{if(!e){b=G[968816];if(b){a=G[968817];break b}b=10;G[968816]=10;a=ab(655440);G[968817]=a;if(a){break b}return-4}sm(e,e?G[e+3312>>2]?e+3848|0:0:0);c:{b=G[968816];if(b){a=G[968817];break c}b=10;G[968816]=10;a=ab(655440);G[968817]=a;if(a){break c}return-4}d=G[47759];while(1){if((b|0)>(d|0)){b=1;c=d;d:{if((d|0)<=1){break d}while(1){c=b;if(!G[M(b,65544)+a>>2]){break d}b=b+1|0;if((d|0)!=(b|0)){continue}break}c=d}a=M(c,65544)+a|0;E[a+8|0]=0;G[a+4>>2]=0;G[a>>2]=e;if((d|0)==(c|0)){G[47759]=d+1}else{d=c}return d|0}b=b+10|0;G[968816]=b;a=ub(a,M(b,65544));G[968817]=a;if(a){continue}break}return-3}c=G[47759];while(1){if((b|0)>(c|0)){return-1}b=b+10|0;G[968816]=b;a=ub(a,M(b,65544));G[968817]=a;if(a){continue}break}return-3}function ii(a){var b=0,c=0,d=0;d=Fa-16|0;Fa=d;b=a;a:while(1){b:{c:{d:{e:{f:{g:{h:{i:{j:{b=G[b>>2];c=H[b|0];if(c>>>0<=90){k:{switch(c-34|0){case 6:break j;case 1:case 2:case 3:case 4:break e;case 5:break g;case 0:break h;default:break k}}if(c){break e}c=1;break b}switch(c-123|0){case 2:break d;case 1:break e;case 0:break i;default:break f}}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!gi(b)){continue}break b}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!ii(b)){continue}break b}b=b+1|0;G[d+12>>2]=b;while(1){c=H[b|0];if(!c){c=1;break b}if((c|0)==34){G[d+12>>2]=b+1;b=d+12|0;continue a}else{b=b+1|0;continue}}}b=b+1|0;G[d+12>>2]=b;while(1){c=H[b|0];if(!c){c=1;break b}if((c|0)==39){G[d+12>>2]=b+1;b=d+12|0;continue a}else{b=b+1|0;continue}}}if((c|0)==91){break c}}G[d+12>>2]=b+1;b=d+12|0;continue}G[a>>2]=b+1;c=0;break b}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!hi(b)){continue}}break}Fa=d+16|0;return c}function hi(a){var b=0,c=0,d=0;d=Fa-16|0;Fa=d;b=a;a:while(1){b:{c:{d:{e:{f:{g:{h:{i:{j:{b=G[b>>2];c=H[b|0];if(c>>>0<=90){k:{switch(c-34|0){case 6:break j;case 1:case 2:case 3:case 4:break e;case 5:break g;case 0:break h;default:break k}}if(c){break e}c=1;break b}switch(c-91|0){case 2:break d;case 1:break e;case 0:break i;default:break f}}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!gi(b)){continue}break b}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!hi(b)){continue}break b}b=b+1|0;G[d+12>>2]=b;while(1){c=H[b|0];if(!c){c=1;break b}if((c|0)==34){G[d+12>>2]=b+1;b=d+12|0;continue a}else{b=b+1|0;continue}}}b=b+1|0;G[d+12>>2]=b;while(1){c=H[b|0];if(!c){c=1;break b}if((c|0)==39){G[d+12>>2]=b+1;b=d+12|0;continue a}else{b=b+1|0;continue}}}if((c|0)==123){break c}}G[d+12>>2]=b+1;b=d+12|0;continue}G[a>>2]=b+1;c=0;break b}c=1;G[d+12>>2]=b+1;b=d+12|0;if(!ii(b)){continue}}break}Fa=d+16|0;return c}function go(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;e=Fa-112|0;Fa=e;f=G[b>>2];a:{if((f|0)>0){break a}g=Va(a);if(g>>>0<9){break a}c=8;while(1){d=c+1|0;h=a+c|0;c=E[h|0];if((c-127&255)>>>0<=160){G[e+4>>2]=c;G[e>>2]=d;Ya(e+16|0,81,33087,e);c=63637;b:{c:{d:{e:{f:{g:{h:{i:{j:{d=H[h|0];switch(d|0){case 11:break h;case 10:break i;case 9:break j;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:case 22:case 23:case 24:case 25:case 26:break b;case 0:break c;case 27:break e;case 13:break f;case 12:break g;default:break d}}c=63651;break c}c=63618;break c}c=63221;break c}c=63599;break c}c=53753;break c}c=63583;break c}if((d|0)!=127){break b}c=63567}d=e+16|0;qb(d,c,80-Va(d)|0)}d=e+16|0;tb(5,d);a=rb(d,a,80);E[a+80|0]=0;tb(5,a);f=207;G[b>>2]=207;break a}c=d;if((d|0)!=(g|0)){continue}break}}Fa=e+112|0;return f}function xf(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a:{c=G[309723];if((c|0)==G[309724]){b=G[309722];b:{if(b){G[309724]=c<<1;c=ub(b,M(c,688));break b}G[309724]=100;c=ab(34400)}if(!c){break a}G[309722]=c;c=G[309723]}G[309723]=c+1;c:{if((c|0)<0){break c}i=G[309722];b=i+M(c,344)|0;G[b+4>>2]=0;G[b+8>>2]=0;G[b>>2]=0-a;j=G[309730];d=j+M(a,124)|0;G[b+52>>2]=G[d+84>>2];G[b+56>>2]=G[d+88>>2];d=G[d+92>>2];G[b+60>>2]=d;if((d|0)<=0){break c}b=0;if(d-1>>>0>=3){m=d&-4;g=(M(c,344)+i|0)- -64|0;f=(M(a,124)+j|0)+96|0;while(1){e=b<<2;G[e+g>>2]=G[f+e>>2];h=e|4;G[h+g>>2]=G[f+h>>2];h=e|8;G[h+g>>2]=G[f+h>>2];e=e|12;G[e+g>>2]=G[f+e>>2];b=b+4|0;k=k+4|0;if((m|0)!=(k|0)){continue}break}}d=d&3;if(!d){break c}g=M(c,344)+i|0;a=M(a,124)+j|0;while(1){f=b<<2;G[(f+g|0)- -64>>2]=G[(a+f|0)+96>>2];b=b+1|0;l=l+1|0;if((d|0)!=(l|0)){continue}break}}return c}G[309737]=113;return-1}function ks(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;m=Fa-16|0;Fa=m;G[m+12>>2]=h;a:{i=G[a+8>>2];p=(G[a>>2]+M(c,3)|0)-2|0;k=M(p,168);j=i+k|0;b=G[j+32>>2];if(b){break a}b=lb(1e3,8);G[j+32>>2]=b;h=0;G[j+28>>2]=0;j=1e3;while(1){if((h|0)>=(j|0)){j=j+1e3|0;b=ub(b,j<<3);i=G[a+8>>2];G[(k+i|0)+32>>2]=b}l=G[m+12>>2]+7&-8;G[m+12>>2]=l+8;h=i+k|0;b=G[h+32>>2];o=G[h+28>>2];n=L[l>>3];L[b+(o<<3)>>3]=n;b:{if(!(O(n+-9007199254740992)<=1e-15)){break b}l=o-1|0;if(!(O(L[(l<<3)+b>>3]+-9007199254740992)<=1e-15)){break b}G[h+28>>2]=l;h=M(p,168);b=h+G[a+8>>2]|0;b=ub(G[b+32>>2],G[b+28>>2]<<3);i=G[a+8>>2];G[(h+i|0)+32>>2]=b;break a}l=h;h=o+1|0;G[l+28>>2]=h;continue}}k=G[(i+k|0)+28>>2];if((k|0)>0){h=0;i=0;while(1){j=h<<3;Pm(a,h,c+i|0,d,e,n,n,L[j+b>>3],L[(j|8)+b>>3]);i=i+1|0;h=h+2|0;if((k|0)>(h|0)){continue}break}}Fa=m+16|0}function Cn(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=Fa-8032|0;Fa=g;Cb(a,41,40853,g+8024|0,0,e);G[g+8>>2]=1589294263;G[g+12>>2]=-1196933592;G[c>>2]=157828351;G[c+4>>2]=1201345881;G[d>>2]=157828351;G[d+4>>2]=-946137767;h=G[g+8024>>2];if(h){m=1;while(1){k=(h|0)<100?h:100;bg(a,82,b,m,m>>31,1,0,k,k>>31,g+8|0,g+16|0,g+8028|0,e);a:{if((h|0)<=0){break a}l=(k|0)>1?k:1;o=l&1;h=0;j=L[g+8>>3];if((k|0)>=2){p=l&2147483646;l=0;while(1){n=h<<3;f=L[n+(g+16|0)>>3];if(f!=j){i=L[c>>3];L[c>>3]=f>i?i:f;i=L[d>>3];L[d>>3]=f>3];if(f!=j){i=L[c>>3];L[c>>3]=f>i?i:f;i=L[d>>3];L[d>>3]=f>3];if(f==j){break a}j=L[c>>3];L[c>>3]=f>j?j:f;j=L[d>>3];L[d>>3]=f>2]-k|0;G[g+8024>>2]=h;m=k+m|0;if(h){continue}break}}Fa=g+8032|0;return G[e>>2]}function xq(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;c=-1;a:{b:{c:{switch(G[a+92>>2]+5|0){case 0:case 5:break c;default:break b}}c=0;if(G[a+64>>2]){break b}d=G[a+104>>2];if(d){h=d-1|0;c=G[a+100>>2];b=G[a+36>>2];f=d&7;if(f){while(1){E[b|0]=H[c|0];d=d-1|0;b=b+1|0;c=c+1|0;g=g+1|0;if((g|0)!=(f|0)){continue}break}}if(h>>>0>=7){while(1){E[b|0]=H[c|0];E[b+1|0]=H[c+1|0];E[b+2|0]=H[c+2|0];E[b+3|0]=H[c+3|0];E[b+4|0]=H[c+4|0];E[b+5|0]=H[c+5|0];E[b+6|0]=H[c+6|0];E[b+7|0]=H[c+7|0];b=b+8|0;c=c+8|0;d=d-8|0;if(d){continue}break}}b=G[a+104>>2]}c=G[a+28>>2]-b|0;d=G[a+36>>2]+b|0;d:{while(1){b=c-e|0;b=ql(G[a+20>>2],d+e|0,b>>>0<1073741824?b:1073741824);if((b|0)>0){e=b+e|0;if(c>>>0>e>>>0){continue}break d}break}if((b|0)<0){break a}G[a+64>>2]=1}G[a+100>>2]=G[a+36>>2];G[a+104>>2]=G[a+104>>2]+e;c=0}return c}b=a;a=G[48624];Vd(b,-1,I[((a>>>0>149?0:a)<<1)+143920>>1]+142088|0);return-1}function Qb(a,b){var c=0,d=0,e=0,f=0,g=0;f=Fa-16|0;Fa=f;G[f+12>>2]=999;G[f+8>>2]=0;a:{if(!a){G[b>>2]=115;a=115;break a}if(G[G[a+4>>2]+16>>2]!=555){G[b>>2]=114;a=114;break a}b:{if(G[b>>2]>0){Xf(a,f+12|0);break b}Xf(a,b)}c=G[a+4>>2];d=G[c+8>>2]-1|0;G[c+8>>2]=d;c:{if(!d){sh(a,1,b);d=G[a+4>>2];if(!(!(Ja[G[(M(G[d+4>>2],84)+1240576|0)+56>>2]](G[d>>2])|0)|G[b>>2]>0)){G[b>>2]=110;Ua(50509);Ua(G[G[a+4>>2]+12>>2])}d=G[a+4>>2];d:{while(1){e:{e=g<<2;c=e+1243184|0;if(G[c>>2]==(d|0)){break e}e=e+1243184|0;c=e+4|0;if(G[c>>2]==(d|0)){break e}c=e+8|0;if(G[c>>2]==(d|0)){break e}c=e+12|0;if(G[c>>2]==(d|0)){break e}c=e+16|0;if(G[c>>2]==(d|0)){break e}g=g+5|0;if((g|0)!=1e4){continue}break d}break}G[c>>2]=0;d=G[a+4>>2]}Wa(G[d+1252>>2]);Wa(G[G[a+4>>2]+96>>2]);Wa(G[G[a+4>>2]+12>>2]);Wa(G[a+4>>2]);break c}sh(a,0,G[b>>2]>0?f+8|0:b)}Wa(a);a=G[b>>2]}Fa=f+16|0;return a}function Bl(a,b){var c=0,d=0,e=0,f=0,g=0;d=Fa+-64|0;Fa=d;G[d+60>>2]=0;a:{if(Va(3780288)>>>0<=1){if((a|0)==3780288){break a}rb(a,3780288,b-1|0);break a}if(!(H[3780288]!=48|H[3780289]!=98)){g=ti(3780290,d+60|0,2,-1,0);if(H[G[d+60>>2]]){c=G[24367];b:{if(H[3780288]){G[d+52>>2]=3780288;G[d+48>>2]=19850;Tb(c,69475,d+48|0);break b}G[d+32>>2]=19850;Tb(c,68751,d+32|0)}c=G[945062];c:{if(!c){break c}f=c+(G[945063]<<2)|0;c=G[f>>2];if(!c){break c}G[c+16>>2]=0;E[G[c+4>>2]]=0;E[G[c+4>>2]+1|0]=0;G[c+44>>2]=0;G[c+28>>2]=1;e=G[c+4>>2];G[c+8>>2]=e;if((c|0)!=G[f>>2]){break c}c=G[c+16>>2];G[945064]=e;G[950324]=c;G[945070]=e;G[945057]=G[G[f>>2]>>2];E[3780260]=H[e|0]}E[3801300]=1}G[d+16>>2]=g;Ya(a,b,3726,d+16|0);if(!(Va(a)>>>0<2|H[a|0]!=48)&(H[a+1|0]|32)==120){break a}G[d>>2]=g;Ya(a,b,3724,d);break a}if((a|0)==3780288){break a}rb(a,3780288,b-1|0)}Fa=d- -64|0}function El(a){var b=0,c=0,d=0;a:{b:{if(G[949192]==1970171489&G[949193]==7566700){break b}b=1;if(G[949192]==7892834){break b}if(!nb(3796768,22631,7)){b=2;break b}b=3;if(G[949192]==1768713317&G[949193]==6648688){break b}b=5;if(!nb(3796768,21330,5)){b=4;break b}if(!nb(3796768,31649,6)){break b}b=6;if(G[949192]==6646128){break b}if(!nb(3796768,23665,6)){b=7;break b}if(!nb(3796768,4710,6)){b=8;break b}b=9;if(G[949192]==2037149552&G[949193]==7237479){break b}if(!nb(3796768,26853,6)){b=10;break b}if(!nb(3796768,31648,7)){b=11;break b}if(!nb(3796768,31641,7)){b=12;break b}if(nb(3796768,31634,7)){break a}b=13}c=G[(b<<2)+188928>>2];if((c|0)==(a|0)){break a}if((a|0)<(c|0)){return b+1|0}d=-1;c:{switch(G[(b<<2)+188800>>2]-101|0){case 10:return(a&-2147483647)==1?-1:b+1|0;default:return b+1|0;case 20:break a;case 0:break c}}d=a&1?b+1|0:-1}return d}function Zj(a,b,c,d,e){var f=0,g=0,h=0,i=0;f=Fa-176|0;Fa=f;if(!((c|0)<=0|G[e>>2]>0)){while(1){G[f+172>>2]=0;e=h+1|0;g=f+96|0;i=f+172|0;zb(35417,e,g,i);Cb(b,16,g,f+16|0,0,i);if(G[f+172>>2]){G[f+172>>2]=0;h=(h<<2)+d|0;g=f+96|0;i=f+172|0;zb(35402,G[h>>2],g,i);Cb(a,16,g,f+16|0,0,i);if(!G[f+172>>2]){g=f+96|0;i=f+172|0;zb(35417,e,g,i);xd(b,16,g,f+16|0,21257,i)}G[f+172>>2]=0;i=G[h>>2];h=f+96|0;g=f+172|0;zb(33357,i,h,g);Cb(a,16,h,f+16|0,0,g);if(!G[f+172>>2]){h=f+96|0;g=f+172|0;zb(33363,e,h,g);xd(b,16,h,f+16|0,5624,g)}G[f+172>>2]=0;G[f+8>>2]=0;G[f+12>>2]=1072693248;h=f+96|0;g=f+172|0;zb(32948,e,h,g);i=f+8|0;xd(b,82,h,i,16901,g);G[f+172>>2]=0;G[f+8>>2]=0;G[f+12>>2]=1072693248;zb(34813,e,h,g);xd(b,82,h,i,20205,g);G[f+8>>2]=0;G[f+12>>2]=1072693248;G[f+172>>2]=0;zb(33351,e,h,g);xd(b,82,h,i,19744,g)}h=e;if((h|0)!=(c|0)){continue}break}}Fa=f+176|0}function Zg(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;a=(L[c+224>>3]-(L[c+176>>3]+a+-1+.5)*L[c+192>>3])/1e3;g=a*a;b=((L[c+184>>3]+b+-1+.5)*L[c+200>>3]-L[c+248>>3])/1e3;h=b*b;f=g+h;i=b*h;j=a*g;k=L[c+160>>3];l=(f*(a*L[c+352>>3])*f+(a*L[c+344>>3]*f+(L[c+336>>3]*i+(a*L[c+328>>3]*h+(g*L[c+320>>3]*b+(L[c+312>>3]*j+(L[c+304>>3]*f+(L[c+296>>3]*h+(a*L[c+288>>3]*b+(L[c+280>>3]*g+(L[c+272>>3]+(L[c+256>>3]*a+L[c+264>>3]*b))))))))))))/206264.8062470964/eb(k);b=(f*(b*L[c+512>>3])*f+(b*L[c+504>>3]*f+(L[c+496>>3]*j+(b*L[c+488>>3]*g+(h*L[c+480>>3]*a+(L[c+472>>3]*i+(L[c+464>>3]*f+(L[c+456>>3]*g+(a*L[c+448>>3]*b+(L[c+440>>3]*h+(L[c+432>>3]+(L[c+416>>3]*b+a*L[c+424>>3]))))))))))))/206264.8062470964;f=Mc(k);g=1-b*f;h=Db(l,g);a=h+L[c+152>>3];L[d>>3]=(a<0?a+6.28318530717959:a)/.01745329252;m=e,n=Pd(eb(h)*((f+b)/g))/.01745329252,L[m>>3]=n;return 0}function kj(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=Fa-96|0;Fa=g;a:{b:{b=Va(a);if(b>>>0<6){break b}h=(a+b|0)-6|0;if(nb(h,32850,6)){break b}i=100;while(1){e=0;f=Fa-16|0;Fa=f;if(!H[195208]){b=za()|0;E[195208]=1;E[195209]=b}b=f+8|0;j=+fa();c=j/1e3;c:{if(O(c)<0x8000000000000000){k=O(c)>=1?~~(c>0?Q(S(c*2.3283064365386963e-10),4294967295):T((c-+(~~c>>>0>>>0))*2.3283064365386963e-10))>>>0:0;d=~~c>>>0;break c}k=-2147483648;d=0}G[b>>2]=d;c=(j-(+(Au(d,k,1e3,0)>>>0)+ +(Ia|0)*4294967296))*1e3*1e3;d:{if(O(c)<2147483648){d=~~c;break d}d=-2147483648}G[b+4>>2]=d;b=h+(b>>>4|0)^M(G[f+12>>2],65537);while(1){E[e+h|0]=(b&15|b<<1&32)+65;b=b>>>5|0;e=e+1|0;if((e|0)!=6){continue}break}Fa=f+16|0;if(Be(a,g+8|0)){if(G[48624]==44){break a}E[a|0]=0;break a}i=i-1|0;if(i){continue}break}E[a|0]=0;G[48624]=20;break a}G[48624]=28;E[a|0]=0}Fa=g+96|0;return a}function Dg(a,b,c,d){var e=0,f=0,g=0,h=0;g=Fa-1040|0;Fa=g;e=G[d>>2];if(!e){a:{if(Va(a)>>>0>=1025){E[c|0]=0;Ua(59218);e=125;break a}b:{f=Za(g,a);if(gc(f,38938,4)){if(gc(f,38936,6)){break b}}Ua(59256);Ua(66489);Ua(34688);e=125;break a}c:{if(H[b|0]!=47){a=Uf(f,47);d:{if(a){E[a+1|0]=0;break d}E[f|0]=0}if(Va(f)+Va(b)>>>0<1025){break c}E[c|0]=0;Ua(59212);e=125;break a}E[c|0]=47;E[c+1|0]=0;if(H[b|0]==47){e=0;while(1){if(Va(c)-1024>>>0<=4294966270){E[c|0]=0;Ua(59174);e=125;break a}a=Va(c)+c|0;E[a|0]=47;E[a+1|0]=0;e=e+1|0;if(H[e+b|0]==47){continue}break}}h=Va(c);a=f;e=Sb(a,c);if(e){while(1){a=e+h|0;e=Sb(a,c);if(e){continue}break}}E[(c+h|0)-1|0]=0;e=Sb(a,c);e:{if(!e){a=Uf(a,47);if(a){E[a|0]=0;break e}E[f|0]=0;break e}E[e|0]=0}if(Va(f)+Va(b)>>>0<1025){break c}E[c|0]=0;Ua(59212);e=125;break a}e=_d(Gb(f,b),c,d)}G[d>>2]=e}Fa=g+1040|0;return e}function _n(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=Fa-2896|0;Fa=e;a:{if(G[b>>2]>0){break a}c=G[a+4>>2];if(G[a>>2]!=G[c+76>>2]){break a}d=G[c+976>>2];j=G[c+980>>2];if(!(d|j)){break a}l=G[c+984>>2];f=G[c+988>>2];g=G[c+128>>2];m=G[c+132>>2];c=G[c+80>>2];G[e+12>>2]=0;h=1;k=((c|0)==1)<<5;c=j+m|0;d=g+d|0;c=d>>>0>>0?c+1|0:c;g=d+l|0;f=c+f|0;f=g>>>0>>0?f+1|0:f;c=f;d=g+2879|0;c=d>>>0<2879?c+1|0:c;d=Cu(d,c);c=2879-d|0;d=0-(Ia+(d>>>0>2879)|0)|0;b:{c:{if(!c){f=f-!g|0;g=g-1|0;c=e+12|0;Jb(a,g,f,0,c);ic(a,1,0,e+16|0,c);if(G[e+12>>2]){break c}break b}h=e+12|0;Jb(a,g,f,0,h);ic(a,c,d,e+16|0,h);if(G[e+12>>2]){h=c;break c}while(1){if(H[(e+16|0)+i|0]==(k|0)){i=i+1|0;if((c|0)!=(i|0)){continue}break b}break}h=c;if((c|0)==(i|0)){break b}}c=e+16|0;cb(c,k,h);Jb(a,g,f,1,b);Wb(a,h,0,c,b);if(G[b>>2]<=0){break a}tb(5,46324)}}Fa=e+2896|0}function Cc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;if((a|b)<0){return 0}c=1;e=G[309722];d=G[(e+M(a,344)|0)+56>>2];a:{if((d|0)==1){break a}f=G[(M(b,344)+e|0)+56>>2];if((f|0)==1){break a}if(G[(M(a,344)+e|0)+52>>2]!=G[(M(b,344)+e|0)+52>>2]){return 0}if((d|0)!=(f|0)){return 0}c=0;d=G[(M(a,344)+e|0)+60>>2];if((d|0)!=G[(M(b,344)+e|0)+60>>2]){break a}c=1;if((d|0)<=0){break a}j=d&3;b:{if(d-1>>>0<3){d=0;break b}m=d&-4;d=0;while(1){f=d<<2;g=f|4;h=c;c=(M(a,344)+e|0)- -64|0;i=(M(b,344)+e|0)- -64|0;h=G[c+g>>2]==G[g+i>>2]?G[f+c>>2]==G[f+i>>2]?h:0:0;g=f|8;g=G[g+c>>2]==G[g+i>>2]?h:0;h=c;c=f|12;c=G[h+c>>2]==G[c+i>>2]?g:0;d=d+4|0;k=k+4|0;if((m|0)!=(k|0)){continue}break}}if(!j){break a}while(1){h=c;c=d<<2;c=G[(c+(M(a,344)+e|0)|0)- -64>>2]==G[(c+(M(b,344)+e|0)|0)- -64>>2]?h:0;d=d+1|0;l=l+1|0;if((l|0)!=(j|0)){continue}break}}return c}function pj(a){var b=0,c=0,d=0,e=0,f=0;b=a+3848|0;c=G[a+3260>>2];a:{if(H[a+3848|0]){if(c){break a}c=0}d=H[34145]|H[34146]<<8|(H[34147]<<16|H[34148]<<24);E[b+3|0]=d;E[b+4|0]=d>>>8;E[b+5|0]=d>>>16;E[b+6|0]=d>>>24;d=H[34142]|H[34143]<<8|(H[34144]<<16|H[34145]<<24);E[b|0]=d;E[b+1|0]=d>>>8;E[b+2|0]=d>>>16;E[b+3|0]=d>>>24}if((c|0)==-1){c=H[34785]|H[34786]<<8;E[b+4|0]=c;E[b+5|0]=c>>>8;c=H[34781]|H[34782]<<8|(H[34783]<<16|H[34784]<<24);E[b|0]=c;E[b+1|0]=c>>>8;E[b+2|0]=c>>>16;E[b+3|0]=c>>>24}c=Nf(b);G[a+3964>>2]=c;b:{c:{switch(c-1|0){case 1:E[a+3880|0]=70;E[a+3881|0]=75;E[a+3882|0]=52;E[a+3883|0]=0;break b;case 0:E[a+3880|0]=70;E[a+3881|0]=75;E[a+3882|0]=53;E[a+3883|0]=0;break b;default:break c}}Za(a+3880|0,b)}e=a,f=Nf(a+3880|0),G[e+3968>>2]=f;L[a+3952>>3]=L[a+120>>3];e=a,f=Nf(Za(a+3912|0,b)),G[e+3960>>2]=f;L[a+3944>>3]=L[a+120>>3]} -function Of(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;g=2e3;d=Fa-80|0;Fa=d;G[d+48>>2]=b;e=d- -64|0;db(e,41064,d+48|0);a:{b:{if(Pc(a,e)){F[d+60>>1]=H[29843]|H[29844]<<8;G[d+56>>2]=H[29839]|H[29840]<<8|(H[29841]<<16|H[29842]<<24);break b}G[d+32>>2]=b;e=d- -64|0;db(e,41343,d+32|0);if(Pc(a,e)){G[d+56>>2]=627012389;G[d+60>>2]=6566448;break b}G[d+16>>2]=b;e=d- -64|0;db(e,41359,d+16|0);if(Pc(a,e)){G[d+56>>2]=627012389;G[d+60>>2]=6566704;break b}e=0;if(!Pc(a,d- -64|0)){break a}G[d+56>>2]=627012389;G[d+60>>2]=6566704}E[1285300]=1;e=1;h=c;c:{d:{while(1){G[d+4>>2]=e;G[d>>2]=b;f=d- -64|0;db(f,d+56|0,d);f=Ye(a,f);if(!f){break d}i=Va(f);if((i|0)<(g|0)){g=g-i|0;h=Za(h,f)+i|0;f=500;e=e+1|0;if((e|0)!=500){continue}break c}break}if((g|0)>=2){j=rb(h,f,g-1|0)+g|0,k=0,E[j|0]=k;break d}E[c|0]=H[f|0]}f=e}E[1285300]=0;e=f>>>0>1}Fa=d+80|0;return e}function Uc(a,b,c,d,e,f,g){var h=0,i=0,j=0;a:{if((e|0)==4){e=d<<2;if((d|0)<=2159){b:{if(G[g>>2]>0){break b}if((c|0)<0){G[g>>2]=304;break b}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break b}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}ic(a,e,e>>31,f,g);break a}h=G[a+4>>2];i=G[h+56>>2];j=G[h+60>>2];G[h+56>>2]=b;G[h+60>>2]=c;ic(a,e,e>>31,f,g);a=G[a+4>>2];G[a+56>>2]=i;G[a+60>>2]=j;break a}c:{if(G[g>>2]>0){break c}if((c|0)<0){G[g>>2]=304;break c}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break c}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}Rd(a,4,d,e-4|0,f,g)}ke(f,d);return G[g>>2]}function Tc(a,b,c,d,e,f,g){var h=0,i=0,j=0;a:{if((e|0)==8){e=d<<3;if((d|0)<=1079){b:{if(G[g>>2]>0){break b}if((c|0)<0){G[g>>2]=304;break b}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break b}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}ic(a,e,e>>31,f,g);break a}h=G[a+4>>2];i=G[h+56>>2];j=G[h+60>>2];G[h+56>>2]=b;G[h+60>>2]=c;ic(a,e,e>>31,f,g);a=G[a+4>>2];G[a+56>>2]=i;G[a+60>>2]=j;break a}c:{if(G[g>>2]>0){break c}if((c|0)<0){G[g>>2]=304;break c}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break c}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}Rd(a,8,d,e-8|0,f,g)}Ge(f,d);return G[g>>2]}function pd(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;k=Fa-160|0;Fa=k;f=G[e>>2];if((f|0)<=0){h=G[a>>2];f=G[a+4>>2];if((h|0)!=G[f+76>>2]){mb(a,h+1|0,0,e);f=G[a+4>>2];h=G[f+76>>2]}h=G[f+96>>2]+(h<<3)|0;if(G[f+104>>2]!=G[h>>2]|G[f+108>>2]!=G[h+4>>2]){Ke(a,e)}a:{if((c|0)<=0){break a}f=c-1|0;j=f>>>0<19?f:19;l=j+1|0;m=l&3;h=0;f=0;if(j>>>0>=3){l=l&60;j=0;while(1){g=(f<<3)+k|0;i=G[(f<<2)+d>>2];G[g>>2]=i;G[g+4>>2]=i>>31;g=f|1;i=(g<<3)+k|0;g=G[(g<<2)+d>>2];G[i>>2]=g;G[i+4>>2]=g>>31;g=f|2;i=(g<<3)+k|0;g=G[(g<<2)+d>>2];G[i>>2]=g;G[i+4>>2]=g>>31;g=f|3;i=(g<<3)+k|0;g=G[(g<<2)+d>>2];G[i>>2]=g;G[i+4>>2]=g>>31;f=f+4|0;j=j+4|0;if((l|0)!=(j|0)){continue}break}}if(!m){break a}while(1){j=(f<<3)+k|0;l=G[(f<<2)+d>>2];G[j>>2]=l;G[j+4>>2]=l>>31;f=f+1|0;h=h+1|0;if((m|0)!=(h|0)){continue}break}}Yi(a,b,c,k,e);f=G[e>>2]}Fa=k+160|0;return f}function gm(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0,m=0;j=Fa-1600|0;Fa=j;a:{b:{i=Sh(4,a,b,1289136,1289936,c,1);if((i|0)<=0){break b}i=Sh(i,1289136,1289936,1290736,1291536,d,0);if((i|0)<=0){break b}k=Sh(i,1291536,1290736,1289936,1289136,e,1);if((k|0)<=0){break b}i=0;k=Sh(k,1289936,1289136,j,j+800|0,f,0);if((k|0)<=2){break b}c=0;while(1){a=j+800|0;b=i<<3;i=i+1|0;m=((i|0)==(k|0)?0:i)<<3;c=c+(L[a+b>>3]*L[m+j>>3]-L[b+j>>3]*L[a+m>>3]);if((i|0)!=(k|0)){continue}break}c=O(c)*.5*g;break a}l=L[a>>3];a=0;h=L[b>>3];b=h>=e;c:{d:{if(b){a=!(e>h)|!((h-e)/(e-e)*(d-c)+c>l)?a:1;if(f>h){break d}}if(!(e>h)|!(f<=h)){break c}}if(!((h-e)/(f-e)*(d-d)+d>l)){break c}a=a+1|0}e:{f:{if(f<=h){a=!(f>h)|!((h-f)/(f-f)*(c-d)+d>l)?a:a+1|0;if(e>h){break f}}if(!(f>h)|!b){break e}}if(!((h-f)/(e-f)*(c-c)+c>l)){break e}a=a+1|0}c=a&1?g:0}Fa=j+1600|0;return c}function ds(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;h=Fa-16|0;Fa=h;f=G[c+4>>2];g=f>>31;if(((f^g)-g|0)!=103){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=84;E[c+1|0]=65;E[c+2|0]=78;E[c+3|0]=0;G[c+4>>2]=(f|0)<0?-103:103;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}G[c+1892>>2]=85;G[c+1888>>2]=86;f=99;a:{while(1){i=(f<<3)+c|0;if(L[i+280>>3]!=0|L[i+1080>>3]!=0){break a}g=f-1|0;if(L[((g<<3)+c|0)+280>>3]!=0){f=g;break a}if(L[i+1072>>3]!=0){f=g;break a}f=f-2|0;if(g){continue}break}f=-1}G[c+276>>2]=(f|0)>0?f:0}f=2;j=Kb(b);if(!(j<=0)){k=L[c+24>>3]*Mb(b)/j;b=Kb(a)*k;L[h>>3]=b;l=h,m=Mb(a)*-k,L[l+8>>3]=m;g=G[c+1880>>2];if(g){b=$g(g,h)}L[d>>3]=b;d=G[c+1884>>2];b:{if(d){a=$g(d,h);break b}a=L[h+8>>3]}L[e>>3]=a;f=G[c+4>>2]>0?(j<0)<<1:0}Fa=h+16|0;return f|0}function Pe(a,b,c,d,e,f,g){var h=0,i=0,j=0;a:{if((e|0)==2){e=d<<1;if((d|0)<=4319){b:{if(G[g>>2]>0){break b}if((c|0)<0){G[g>>2]=304;break b}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break b}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}ic(a,e,e>>31,f,g);break a}h=G[a+4>>2];i=G[h+56>>2];j=G[h+60>>2];G[h+56>>2]=b;G[h+60>>2]=c;ic(a,e,e>>31,f,g);a=G[a+4>>2];G[a+56>>2]=i;G[a+60>>2]=j;break a}c:{if(G[g>>2]>0){break c}if((c|0)<0){G[g>>2]=304;break c}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break c}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}Rd(a,2,d,e-2|0,f,g)}Af(f,d)}function ro(a,b,c,d,e,f,g,h,i,j,k,l){var m=0,n=0,o=0;m=Fa+-64|0;Fa=m;G[k>>2]=0;d=d+1|0;G[m+8>>2]=d;G[m+40>>2]=d;n=G[e>>2];a:{b:{if(!n){d=G[e+4>>2];break b}G[m+32>>2]=n+1;d=G[e+4>>2];o=d+1|0;G[m+4>>2]=o;G[m+36>>2]=o;if((d|0)==G[f+4>>2]){d=G[f>>2]+1|0}else{d=G[g>>2]}G[m>>2]=d;uh(a,b,m+32|0,m,h,i,j,l);n=d-n|0;G[k>>2]=n+G[k>>2];d=G[e+4>>2];if((d|0)==G[f+4>>2]){break a}G[e>>2]=0;d=d+1|0;G[e+4>>2]=d;i=M(c,n)+i|0}G[m+32>>2]=1;n=d+1|0;G[m+36>>2]=n;e=G[g>>2];G[m>>2]=e;o=G[f+4>>2];e=o+((e|0)==(G[f>>2]+1|0))|0;G[m+4>>2]=e;c:{if((d|0)>=(e|0)){d=o+1|0;break c}uh(a,b,m+32|0,m,h,i,j,l);n=(e-n|0)+1|0;G[k>>2]=G[k>>2]+M(n,G[g>>2]);d=G[f+4>>2]+1|0;if((e|0)==(d|0)){break a}i=M(G[g>>2],M(c,n))+i|0}if((d|0)==(e|0)){break a}c=G[f>>2];G[m+4>>2]=d;G[m+36>>2]=d;c=c+1|0;G[m>>2]=c;uh(a,b,m+32|0,m,h,i,j,l);G[k>>2]=c+G[k>>2]}Fa=m- -64|0}function hn(a,b,c,d,e,f,g){var h=0,i=0;h=Fa+-64|0;Fa=h;i=G[g>>2];a:{if(i){break a}b:{if(fh(a,b,h+40|0,h+32|0,h+36|0,h,g)){break b}a=G[h+40>>2];c:{b=G[h+32>>2];d:{if((b|0)<0){if((a|0)!=14|(b|0)!=-1){break d}a=H[(G[309722]+M(G[309725],344)|0)+88|0];G[e>>2]=d;if((d|0)<=0){break b}cb(f,a,d);break b}if((a|0)!=14){break d}if((b|0)==1){break c}}Yd();Ua(43091);i=432;G[g>>2]=432;break a}G[h+52>>2]=d;G[h+48>>2]=0;G[h+44>>2]=f;e:{if(($f(G[309728],G[309729],((c|0)>1?c:1)-1|0,0,34,h+40|0,g)|0)==-1){G[g>>2]=0;break e}if(G[g>>2]){break b}}b=0;G[e>>2]=0;c=G[h+52>>2];if((c|0)<=0){break b}i=0;if((c|0)!=1){d=c&-2;a=0;while(1){if(H[f+i|0]==1){b=b+1|0;G[e>>2]=b}if(H[(i|1)+f|0]==1){b=b+1|0;G[e>>2]=b}i=i+2|0;a=a+2|0;if((d|0)!=(a|0)){continue}break}}if(!(c&1)|H[f+i|0]!=1){break b}G[e>>2]=b+1}Yd();i=G[g>>2]}Fa=h- -64|0;return i}function bu(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=Fa-65712|0;Fa=b;a:{b:{c:{a=(H[a|0]?a:0)?a:42205;f=em(a);if(f){c=Ph(f);if(c){break c}break b}G[b>>2]=a;a=G[29763];_a(a,69677,b);$a(a);break a}j=b+152|0;k=b+160|0;d=G[29763];while(1){c=c+19|0;d:{if(!Xa(c,48504)){break d}if(!Xa(c,45311)){break d}e=H[(Va(a)+a|0)-1|0];G[b+84>>2]=c;G[b+80>>2]=a;g=b+176|0;Ya(g,65536,(e|0)==47?8740:8778,b+80|0);if((Be(g,b+88|0)|0)>=0){g=wl(ol(k));l=wl(ol(j));e=36147;h=(G[b+100>>2]&61440)-4096|0;if(h>>>0<=40959){e=G[(h>>>10|0)+189500>>2]}e:{if(!Xa(e,10935)){G[b+16>>2]=c;_a(d,87573,b+16|0);break e}G[b+48>>2]=l;G[b+32>>2]=c;G[b+36>>2]=e;G[b+40>>2]=G[b+128>>2];G[b+44>>2]=g;_a(d,69586,b+32|0)}$a(d);i=i+1|0;break d}G[b+64>>2]=c;_a(d,87655,b- -64|0);$a(d)}c=Ph(f);if(c){continue}break}}_l(f)}Fa=b+65712|0;return i|0}function Jk(a,b){var c=0,d=N(0),e=N(0),f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=N(0);f=b-1|0;j=(f|0)/2|0;a:{if((b|0)<2){break a}while(1){b=h+1|0;if((f|0)==(b|0)){b=(h<<2)+a|0;d=K[b>>2];c=(f<<2)+a|0;e=K[c>>2];if(!(d>e)){break a}K[b>>2]=e;K[c>>2]=d;break a}c=((f+h|0)/2<<2)+a|0;d=K[c>>2];g=(f<<2)+a|0;e=K[g>>2];b:{if(!(d>e)){d=e;break b}K[c>>2]=e;K[g>>2]=d}i=(h<<2)+a|0;e=K[i>>2];if(e>d){K[i>>2]=d;K[g>>2]=e;e=K[i>>2]}d=K[c>>2];if(e>2]=e;K[i>>2]=d;d=K[c>>2]}g=c;c=(b<<2)+a|0;K[g>>2]=K[c>>2];K[c>>2]=d;c=f;while(1){d=K[i>>2];while(1){b=b+1|0;l=(b<<2)+a|0;m=K[l>>2];if(d>m){continue}break}while(1){g=c;c=c-1|0;k=(c<<2)+a|0;e=K[k>>2];if(e>d){continue}break}if((b|0)<(g|0)){K[l>>2]=e;K[k>>2]=m;continue}break}K[i>>2]=e;K[k>>2]=d;f=(g|0)>(j|0)?g-2|0:f;h=(c|0)>(j|0)?h:b;if((f|0)>(h|0)){continue}break}}return K[(j<<2)+a>>2]}function Km(a){var b=0,c=0,d=0,e=0,f=0,g=0;a:{if(!a){break a}c=H[a|0];if(!c){break a}d=1;b:{c:{while(1){b=c&255;if((b|0)!=32){d:{switch(b-43|0){case 0:break c;case 2:break d;default:break b}}}else{c=H[a+1|0];a=a+1|0;continue}break}a=a+1|0;d=-1;break b}a=a+1|0}b=ec(a,49008,Va(a));if(b){E[b|0]=32}c=Va(a);while(1){b=c;c=b-1|0;if(H[c+a|0]==32){continue}break}e:{c=ec(a,40241,Va(a));if(!c){c=ec(a,68332,b);if(!c){break e}}E[c|0]=0;a=_b(a);E[c|0]=58;f=+(a|0);b=c+1|0;a=Va(b);f:{g:{c=ec(b,40241,a);if(!c){c=ec(b,68332,a);if(!c){break g}}E[c|0]=0;a=_b(b);E[c|0]=58;e=+(a|0);g=sb(c+1|0);break f}if(ec(b,48504,a)){e=sb(b)}if(!H[b|0]){break f}e=+(_b(b)|0)}return d*(e/60+f+g/3600)}if((ah(a)|0)==2){b=jb(a,68);if(b){E[b|0]=101}b=jb(a,100);if(b){E[b|0]=101}b=jb(a,69);if(b){E[b|0]=101}return d*sb(a)}d=d*+(_b(a)|0)}return d}function $r(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;h=G[c+4>>2];i=h>>31;if(((h^i)-i|0)!=105){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=73;E[c+2|0]=78;E[c+3|0]=0;G[c+4>>2]=(h|0)<0?-105:105;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}G[c+1892>>2]=89;G[c+1888>>2]=90;L[c+112>>3]=1/f;f=L[c+40>>3];g=f*f;f=L[c+48>>3];f=g+f*f;L[c+120>>3]=f;L[c+136>>3]=f+-1;L[c+128>>3]=f+1}f=(90-O(b))*3.141592653589793/180;a:{if(f<1e-5){g=f*f*.5;if(b>0){break a}g=2-g;break a}g=1-Kb(b);f=Mb(b)}j=Mb(a);a=Kb(a);L[d>>3]=L[c+24>>3]*(f*a+g*L[c+40>>3]);L[e>>3]=(f*j-g*L[c+48>>3])*-L[c+24>>3];b:{c:{if(G[c+4>>2]<=0){break c}if(L[c+120>>3]==0){d=2;if(!(b<0)){break c}break b}d=2;if(-De(L[c+40>>3]*a-j*L[c+48>>3])>b){break b}}d=0}return d|0}function Ke(a,b){var c=0,d=0,e=0,f=0,g=0;e=Fa-16|0;Fa=e;G[e+12>>2]=0;c=G[b>>2];a:{if((c|0)>0){break a}d=G[a>>2];c=G[a+4>>2];if((d|0)!=G[c+76>>2]){mb(a,d+1|0,0,b);c=G[a+4>>2];d=G[c+76>>2]}d=G[c+96>>2]+(d<<3)|0;b:{if(G[c+104>>2]==G[d>>2]&G[c+108>>2]==G[d+4>>2]){break b}while(1){mb(a,G[a>>2]+2|0,0,e+12|0);if(!G[e+12>>2]){continue}break}c=G[a+4>>2];d=G[c+92>>2];if((d|0)==G[c+88>>2]){d=ub(G[c+96>>2],(d<<3)+8008|0);if(!d){c=113;G[b>>2]=113;break a}c=G[a+4>>2];G[c+96>>2]=d;G[c+92>>2]=G[c+92>>2]+1e3}if((Xf(a,b)|0)>0){break b}c=G[a+4>>2];c=(G[c+88>>2]<<3)+G[c+96>>2]|0;d=G[c+12>>2];f=G[c+8>>2];Jb(a,f,d,1,b);c=G[a+4>>2];g=G[c+88>>2]+1|0;G[c+76>>2]=g;G[c+88>>2]=g;G[a>>2]=g;G[c+128>>2]=-1;G[c+132>>2]=-1;G[c+104>>2]=f;G[c+108>>2]=d;G[c+120>>2]=f;G[c+124>>2]=d;G[c+1084>>2]=G[c+1028>>2]}c=G[b>>2]}Fa=e+16|0;return c}function yr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;a:{b:{if(G[c+4>>2]==202){f=L[c+136>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=202;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];c:{if(f==0){G[c+112>>2]=0;G[c+116>>2]=1072693248;G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;f=L[c+40>>3];g=1;if(f<=0|f>1){break a}L[c+128>>3]=57.29577951308232/f;f=f/57.29577951308232;break c}L[c+120>>3]=57.29577951308232/f;L[c+112>>3]=f*3.141592653589793/180;h=L[c+40>>3];g=1;if(h<=0|h>1){break a}L[c+128>>3]=f/h;f=h/f}G[c+1892>>2]=119;G[c+1888>>2]=120;L[c+136>>3]=f}b=f*b;f=O(b);if(f>1){g=2;if(f>1.0000000000001){break a}b=b<0?-1:1}L[d>>3]=L[c+120>>3]*a;i=e,j=Bc(b),L[i>>3]=j;g=0}return g|0}function Si(a,b,c,d){var e=0,f=0;e=G[a+5820>>2];a:{if((e|0)>=14){e=I[a+5816>>1]|d<>1]=e;f=G[a+20>>2];G[a+20>>2]=f+1;E[f+G[a+8>>2]|0]=e;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=H[a+5817|0];e=d&65535;d=G[a+5820>>2];f=e>>>16-d|0;F[a+5816>>1]=f;d=d-13|0;break a}f=I[a+5816>>1]|d<>1]=f;d=e+3|0}b:{if((d|0)>=9){d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=f;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=H[a+5817|0];break b}if((d|0)<=0){break b}d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=f}G[a+5820>>2]=0;F[a+5816>>1]=0;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=c;d=G[a+20>>2];G[a+20>>2]=d+1;E[d+G[a+8>>2]|0]=c>>>8;d=G[a+20>>2];G[a+20>>2]=d+1;e=d+G[a+8>>2]|0;d=c^-1;E[e|0]=d;e=G[a+20>>2];G[a+20>>2]=e+1;E[e+G[a+8>>2]|0]=d>>>8;bb(G[a+8>>2]+G[a+20>>2]|0,b,c);G[a+20>>2]=G[a+20>>2]+c}function Mi(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=b-1|0;j=(f|0)/2|0;a:{if((b|0)<2){break a}while(1){b=h+1|0;if((f|0)==(b|0)){b=(h<<3)+a|0;d=L[b>>3];c=(f<<3)+a|0;e=L[c>>3];if(!(d>e)){break a}L[b>>3]=e;L[c>>3]=d;break a}c=((f+h|0)/2<<3)+a|0;d=L[c>>3];g=(f<<3)+a|0;e=L[g>>3];b:{if(!(d>e)){d=e;break b}L[c>>3]=e;L[g>>3]=d}i=(h<<3)+a|0;e=L[i>>3];if(e>d){L[i>>3]=d;L[g>>3]=e;e=L[i>>3]}d=L[c>>3];if(e>3]=e;L[i>>3]=d;d=L[c>>3]}g=c;c=(b<<3)+a|0;L[g>>3]=L[c>>3];L[c>>3]=d;c=f;while(1){d=L[i>>3];while(1){b=b+1|0;l=(b<<3)+a|0;m=L[l>>3];if(d>m){continue}break}while(1){g=c;c=c-1|0;k=(c<<3)+a|0;e=L[k>>3];if(e>d){continue}break}if((b|0)<(g|0)){L[l>>3]=e;L[k>>3]=m;continue}break}L[i>>3]=e;L[k>>3]=d;f=(g|0)>(j|0)?g-2|0:f;h=(c|0)>(j|0)?h:b;if((f|0)>(h|0)){continue}break}}return L[(j<<3)+a>>3]}function Vl(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=Fa-48|0;Fa=f;c=L[467827];e=c*b;b=eb(e);a=c*a;d=ib(a);g=L[467846];c=eb(a);h=L[467845];i=L[467847];a=ib(e);c=c*b;d=d*b;b=a*L[467850]+(L[467848]*c+d*L[467849]);e=a*L[467844]+(L[467842]*c+L[467843]*d);c=i*a+(h*c+d*g);a=V(b*b+(e*e+c*c));if(!(!(a>3]=a;gb(73024,f+32|0);$a(G[29763])}if(!(a<=0)){c=c/a;e=e/a;b=b/a}d=e*0;a=c-d;c=b*0+c*-0;d=d-b;b=V(a*a+(c*c+d*d));if(!(!(b>3]=b;gb(73024,f+16|0);$a(G[29763])}if(!(b<=0)){d=d/b;c=c/b;a=a/b}b=d*0;g=b-c;h=a-b;i=a*-0+c*0;b=V(g*g+(h*h+i*i));if(!(!(b>3]=b;gb(73024,f);$a(G[29763])}a:{if(b<=0){b=0;break a}g=g/b;i=i/b;h=h/b}d=a*0+(c*0+d);a=Mc(Sc(e));c=L[467827];L[467839]=d*-a/c;L[467838]=a*(g*0+(h+i*0)<0?-b:b)/c;Fa=f+48|0}function uq(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=Fa-368|0;Fa=g;G[g+12>>2]=-1;a:{if(G[e>>2]>0){break a}k=Va(c);f=jb(c,39);if(f){while(1){i=i+1|0;f=jb(f+1|0,39);if(f){continue}break}}j=rb(g+96|0,b,80);E[j+80|0]=0;while(1){f=j;j=f+1|0;if(H[f|0]==32){continue}break}b:{c:{l=Va(f);if((l|0)>8){break c}if((ve(f,g+12|0)|0)>0){break c}f=68-i|0;break b}f=75-(i+l|0)|0}if((k|0)>0){l=68-i|0;i=1;j=0;while(1){if((f|0)>=71){Ua(50861);G[e>>2]=207;break a}h=rb(g+16|0,c+j|0,f);E[h+f|0]=0;kl(h,g+288|0,e);d:{if((f|0)>=(k|0)){break d}f=f-1|0;h=g+288|0;m=Va(h)+h|0;h=m-2|0;if(H[h|0]!=39){E[h|0]=38;break d}E[m-1|0]=0;E[m-3|0]=38}e:{if(!(i&1)){Ob(35367,g+288|0,d,g+192|0,e);F[g+200>>1]=8224;break e}Ob(b,g+288|0,d,g+192|0,e)}vl(a,g+192|0,e);j=f+j|0;k=k-f|0;i=0;f=l;if((k|0)>0){continue}break}}}Fa=g+368|0}function $d(a,b,c,d,e,f,g){var h=0,i=0,j=0;if((e|0)==1){if((d|0)<=8639){a:{if(G[g>>2]>0){break a}if((c|0)<0){G[g>>2]=304;break a}h=G[a>>2];e=G[a+4>>2];if((h|0)!=G[e+76>>2]){mb(a,h+1|0,0,g);e=G[a+4>>2]}h=Du(b,c,2880,0);i=G[e+72>>2];if(!((i|0)>=0&(h|0)==G[((i<<2)+e|0)+1256>>2])){Hc(a,h,0,g)}if(G[g>>2]>0){break a}e=G[a+4>>2];G[e+56>>2]=b;G[e+60>>2]=c}ic(a,d,d>>31,f,g);return}e=G[a+4>>2];h=G[e+56>>2];i=G[e+60>>2];G[e+56>>2]=b;G[e+60>>2]=c;ic(a,d,0,f,g);a=G[a+4>>2];G[a+56>>2]=h;G[a+60>>2]=i;return}b:{if(G[g>>2]>0){break b}if((c|0)<0){G[g>>2]=304;break b}i=G[a>>2];h=G[a+4>>2];if((i|0)!=G[h+76>>2]){mb(a,i+1|0,0,g);h=G[a+4>>2]}i=Du(b,c,2880,0);j=G[h+72>>2];if(!((j|0)>=0&(i|0)==G[((j<<2)+h|0)+1256>>2])){Hc(a,i,0,g)}if(G[g>>2]>0){break b}h=G[a+4>>2];G[h+56>>2]=b;G[h+60>>2]=c}Rd(a,1,d,e-1|0,f,g)}function am(a,b,c){var d=0,e=0,f=0;d=G[934940];if(d){Wa(d)}d=le(a);e=H[d|0];if(e){a=d;while(1){e=e<<24>>24;if(e-65>>>0<26){E[a|0]=e-65>>>0<26?e|32:e}e=H[a+1|0];a=a+1|0;if(e){continue}break}}G[934940]=d;a=0;e=0;a:{b:{if(!Xa(d,29574)){break b}if(!Xa(d,13163)){break b}if(!Xa(d,10364)){a=1;break b}c:{if(!Xa(d,29578)){break c}if(!Xa(d,13168)){break c}d:{if(!Xa(d,29577)){break d}if(!Xa(d,13167)){break d}e:{if(!Xa(d,8506)){break e}if(!Xa(d,10375)){break e}a=5;if(!Xa(d,8440)){break b}if(!Xa(d,10374)){break b}if(!Xa(d,30711)){e=1;a=0;break b}e=1;if(!Xa(d,3779)){a=1;break b}if(!Xa(d,30636)){a=1;break b}if(!Xa(d,30716)){a=2;break b}if(!Xa(d,30715)){a=3;break b}if(!Xa(d,30642)){a=4;break b}f=-1;if(Xa(d,30641)){break a}break b}a=4;break b}a=3;break b}a=2}G[c>>2]=a;if(b){G[b>>2]=e}f=0}return f}function rm(a){var b=0,c=0,d=0,e=0,f=0;c=G[a+3316>>2];d=(c|0)<2?c:2;if((d|0)<=0){d=G[a+3320>>2];G[a+3316>>2]=d}b=M(d,d)<<3;c=G[a+4056>>2];a:{if(!c){c=ab(b);G[a+4056>>2]=c;if(!c){break a}}e=G[a+4060>>2];if(!e){e=ab(b);G[a+4060>>2]=e;if(!e){break a}}G[a+4036>>2]=137;b:{c:{d:{switch(d-2|0){case 2:b=cb(c,0,128);L[b>>3]=L[a+56>>3];L[b+8>>3]=L[a- -64>>3];L[b+32>>3]=L[a+72>>3];f=L[a+80>>3];G[b+80>>2]=0;G[b+84>>2]=1072693248;L[b+40>>3]=f;b=15;f=1;break c;case 1:b=cb(c,0,72);L[b>>3]=L[a+56>>3];L[b+8>>3]=L[a- -64>>3];L[b+24>>3]=L[a+72>>3];L[b+32>>3]=L[a+80>>3];b=8;f=1;break c;case 0:break d;default:break b}}L[c>>3]=L[a+56>>3];L[c+8>>3]=L[a- -64>>3];L[c+16>>3]=L[a+72>>3];b=3;f=L[a+80>>3]}L[(b<<3)+c>>3]=f}sg(d,c,e);G[a+4052>>2]=a+760;G[a+4044>>2]=a+616;G[a+4048>>2]=a+832;G[a+4036>>2]=137}}function _q(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;f=Fa-32|0;Fa=f;d=G[a+28>>2];G[f+16>>2]=d;g=G[a+20>>2];G[f+28>>2]=c;G[f+24>>2]=b;b=g-d|0;G[f+20>>2]=b;g=b+c|0;i=2;a:{b:{b=f+16|0;d=ga(G[a+60>>2],b|0,2,f+12|0)|0;if(d){G[48624]=d;d=-1}else{d=0}c:{d:{if(d){d=b;break d}while(1){e=G[f+12>>2];if((e|0)==(g|0)){break c}if((e|0)<0){d=b;break b}h=G[b+4>>2];j=h>>>0>>0;d=(j<<3)+b|0;h=e-(j?h:0)|0;G[d>>2]=h+G[d>>2];b=(j?12:4)+b|0;G[b>>2]=G[b>>2]-h;g=g-e|0;b=d;i=i-j|0;e=ga(G[a+60>>2],b|0,i|0,f+12|0)|0;if(e){G[48624]=e;e=-1}else{e=0}if(!e){continue}break}}if((g|0)!=-1){break b}}b=G[a+44>>2];G[a+28>>2]=b;G[a+20>>2]=b;G[a+16>>2]=b+G[a+48>>2];a=c;break a}G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;G[a>>2]=G[a>>2]|32;a=0;if((i|0)==2){break a}a=c-G[d+4>>2]|0}Fa=f+32|0;return a|0}function jc(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=G[a+112>>2];d=G[a+116>>2];e=!!(b|d);c=b;a:{i=e;f=G[a+4>>2];e=G[a+44>>2];b=f-e|0;h=b;g=b+G[a+120>>2]|0;b=G[a+124>>2]+(b>>31)|0;b=g>>>0>>0?b+1|0:b;if(!(i&(c>>>0<=g>>>0&(b|0)>=(d|0)|(b|0)>(d|0)))){h=Ag(a);if((h|0)>=0){break a}f=G[a+4>>2];e=G[a+44>>2]}G[a+112>>2]=-1;G[a+116>>2]=-1;G[a+104>>2]=f;c=e-f|0;d=c+g|0;b=(c>>31)+b|0;G[a+120>>2]=d;G[a+124>>2]=d>>>0>>0?b+1|0:b;return-1}d=g+1|0;b=d?b:b+1|0;f=G[a+4>>2];e=G[a+8>>2];c=G[a+112>>2];g=G[a+116>>2];b:{if(!(c|g)){break b}i=c-d|0;c=g-(b+(d>>>0>c>>>0)|0)|0;j=e-f|0;g=j>>31;if((c|0)>=(g|0)&i>>>0>=j>>>0|(c|0)>(g|0)){break b}e=f+i|0}G[a+104>>2]=e;c=G[a+44>>2];e=c-f|0;d=e+d|0;b=(e>>31)+b|0;G[a+120>>2]=d;G[a+124>>2]=d>>>0>>0?b+1|0:b;if(c>>>0>=f>>>0){E[f-1|0]=h}return h}function Fi(a,b,c){var d=0,e=0,f=0;E[b|0]=0;G[c>>2]=0;a:{b:{c:{d:{e:{if(H[a|0]==72){if(!fb(a,66642,9)){break e}}while(1){d=H[a+e|0];if(!d|(d|0)==32|(d|0)==61){break c}E[b+e|0]=d;d=e|1;f=H[d+a|0];if(!f|(f|0)==32|(f|0)==61){break b}E[b+d|0]=f;d=74;e=e+2|0;if((e|0)!=74){continue}break}break d}f=jb(a,61);if(!f){a=Va(b)+b|0;b=H[34943]|H[34944]<<8|(H[34945]<<16|H[34946]<<24);d=H[34939]|H[34940]<<8|(H[34941]<<16|H[34942]<<24);E[a|0]=d;E[a+1|0]=d>>>8;E[a+2|0]=d>>>16;E[a+3|0]=d>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24;d=8;E[a+8|0]=H[34947];break a}d=a+9|0;while(1){e=d;d=d+1|0;if(H[e|0]==32){continue}break}a=f-e|0;f=a&a>>31;e=qb(b,e,a);while(1){d=a;if((a|0)<=0){d=f;break d}a=d-1|0;if(H[e+a|0]==32){continue}break}}E[b+d|0]=0;break a}d=e}E[b+d|0]=0}G[c>>2]=d}function zr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{if(G[c+4>>2]==201){g=L[c+40>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=89;E[c+2|0]=80;E[c+3|0]=0;E[c+4|0]=201;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];c:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=L[c+48>>3];L[c+112>>3]=f;h=1;if(f==0){break a}L[c+120>>3]=1/f;g=L[c+40>>3];f=(f+g)*57.29577951308232;L[c+128>>3]=f;if(f!=0){break c}break a}i=L[c+48>>3];g=f*i*3.141592653589793/180;L[c+112>>3]=g;h=1;if(g==0){break a}L[c+120>>3]=1/g;g=L[c+40>>3];f=f*(i+g);L[c+128>>3]=f;if(f==0){break a}}G[c+1892>>2]=117;G[c+1888>>2]=118;L[c+136>>3]=1/f}h=2;f=g+Mb(b);if(f==0){break a}L[d>>3]=L[c+112>>3]*a;j=e,k=L[c+128>>3]*Kb(b)/f,L[j>>3]=k;h=0}return h|0}function An(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;A(+a);f=v(1)|0;v(0)|0;h=f;i=(f&2147483640)>>>0<1072010280;if(!i){f=(f|0)>0|(f|0)>=0;a=.7853981633974483-(f?a:-a)+(3061616997868383e-32-(f?b:-b));h=h>>>31|0;b=0}e=a*a;d=a*e;j=d*.3333333333333341;g=d;d=e*e;e=j+(e*(g*(d*(d*(d*(d*(d*-18558637485527546e-21+7817944429395571e-20)+.0005880412408202641)+.0035920791075913124)+.021869488294859542)+.13333333333320124+e*(d*(d*(d*(d*(d*2590730518636337e-20+7140724913826082e-20)+.0002464631348184699)+.0014562094543252903)+.0088632398235993)+.05396825397622605))+b)+b);b=a+e;if(!i){g=b*b;d=b;b=+(1-(c<<1)|0);a=a+(e-g/(d+b));a=b-(a+a);return h?-a:a}if(c){g=-1/b;A(+g);c=v(1)|0;v(0)|0;x(0,0);x(1,c|0);d=+z();A(+b);c=v(1)|0;v(0)|0;x(0,0);x(1,c|0);b=+z();b=g*(d*(e-(b-a))+(d*b+1))+d}return b}function Fm(a,b,c,d){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;f=Fa-80|0;Fa=f;i=L[d>>3];g=L[c>>3];e=(a+-1850)/100;h=(e*59e-6+1.3972)*e+2303.5548;a=(b-a)/100;b=a*48481368110953e-19;j=e*-365e-6;Cj(b*-((a*.017996+(e*-269e-6+.30242))*a+h),b*((a*-.041802+(j+-.42647))*a+((j+-.85294)*e+2005.1125)),b*-((a*.018324+(e*387e-6+1.09478))*a+h),f);a=i*3.141592653589793/180;b=eb(a);e=g*3.141592653589793/180;h=ib(e);i=L[f+8>>3];g=eb(e);j=L[f>>3];k=L[f+16>>3];a=ib(a);l=L[f+64>>3];m=L[f+48>>3];n=L[f+56>>3];e=h*b;b=g*b;h=a*L[f+40>>3]+(L[f+32>>3]*e+(L[f+24>>3]*b+0));i=k*a+(i*e+(j*b+0));g=Db(h,i);g=g<0?g+6.283185307179586:g;L[c>>3]=(g>6.283185307179586?g+-6.283185307179586:g)*180/3.141592653589793;o=d,p=Db(l*a+(n*e+(m*b+0)),V(i*i+h*h))*180/3.141592653589793,L[o>>3]=p;Fa=f+80|0} -function ai(a,b,c,d){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;f=Fa-80|0;Fa=f;i=L[d>>3];g=L[c>>3];e=(a+-2e3)/100;h=(e*-139e-6+1.39656)*e+2306.2181;a=(b-a)/100;b=a*48481368110953e-19;j=e*-217e-6;Cj(b*-((a*.017998+(e*-344e-6+.30188))*a+h),b*((a*-.041833+(j+-.42665))*a+((j+-.8533)*e+2004.3109)),b*-((a*.018203+(e*66e-6+1.09468))*a+h),f);a=i*3.141592653589793/180;b=eb(a);e=g*3.141592653589793/180;h=ib(e);i=L[f+8>>3];g=eb(e);j=L[f>>3];k=L[f+16>>3];a=ib(a);l=L[f+64>>3];m=L[f+48>>3];n=L[f+56>>3];e=h*b;b=g*b;h=a*L[f+40>>3]+(e*L[f+32>>3]+(b*L[f+24>>3]+0));i=a*k+(e*i+(b*j+0));g=Db(h,i);g=g<0?g+6.283185307179586:g;L[c>>3]=(g>6.283185307179586?g+-6.283185307179586:g)*180/3.141592653589793;o=d,p=Db(a*l+(e*n+(b*m+0)),V(i*i+h*h))*180/3.141592653589793,L[o>>3]=p;Fa=f+80|0}function mo(a,b,c,d,e,f){var g=0;a:{g=G[f>>2];b:{if((g|0)>0){break b}if((yk(a,2,32941,40247,f)|0)==208){G[f>>2]=222;return 222}if(G[f>>2]==209){G[f>>2]=211;return 211}if((yk(a,3,33788,40973,f)|0)==208){G[f>>2]=223;return 223}if(G[f>>2]==209){G[f>>2]=212;return 212}if((th(a,4,41261,b,f)|0)==208){break a}g=0;if(G[f>>2]==209){break b}if((th(a,5,40853,c,f)|0)==208){break a}if(G[f>>2]==209){break b}if((th(a,6,33303,d,f)|0)==208){G[f>>2]=228;return 228}if(G[f>>2]==209){G[f>>2]=214;return 214}if((yk(a,7,33311,41541,f)|0)==208){G[f>>2]=229;return 229}if(G[f>>2]==209){G[f>>2]=215;return 215}if((no(a,8,33837,e,f)|0)==208){G[f>>2]=230;return 230}g=G[f>>2];if(!((g|0)!=209&G[e>>2]<1e3)){return(g|0)==216}if((g|0)<=0){break b}Ua(48379);g=G[f>>2]}return g}G[f>>2]=224;return 224}function Ar(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{if(G[c+4>>2]==201){g=L[c+120>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=89;E[c+2|0]=80;E[c+3|0]=0;E[c+4|0]=201;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];c:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=L[c+48>>3];L[c+112>>3]=f;h=1;if(f==0){break a}g=1/f;L[c+120>>3]=g;f=(f+L[c+40>>3])*57.29577951308232;L[c+128>>3]=f;if(f!=0){break c}break a}i=L[c+48>>3];g=f*i*3.141592653589793/180;L[c+112>>3]=g;h=1;if(g==0){break a}g=1/g;L[c+120>>3]=g;f=f*(i+L[c+40>>3]);L[c+128>>3]=f;if(f==0){break a}}G[c+1892>>2]=117;G[c+1888>>2]=118;L[c+136>>3]=1/f}L[d>>3]=g*a;a=L[c+136>>3]*b;j=e,k=Ac(a,1)+Bc(a*L[c+40>>3]/V(a*a+1)),L[j>>3]=k;h=0}return h|0}function xr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;a:{b:{if(G[c+4>>2]==202){g=L[c+112>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=202;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];c:{if(f==0){G[c+112>>2]=0;G[c+116>>2]=1072693248;G[c+24>>2]=442745336;G[c+28>>2]=1078765020;G[c+120>>2]=0;G[c+124>>2]=1072693248;i=1;f=L[c+40>>3];if(f<=0){break a}g=1;if(f>1){break a}L[c+128>>3]=57.29577951308232/f;f=f/57.29577951308232;break c}L[c+120>>3]=57.29577951308232/f;g=f*3.141592653589793/180;L[c+112>>3]=g;i=1;h=L[c+40>>3];if(h<=0|h>1){break a}L[c+128>>3]=f/h;f=h/f}G[c+1892>>2]=119;G[c+1888>>2]=120;L[c+136>>3]=f}L[d>>3]=g*a;j=e,k=L[c+128>>3]*Kb(b),L[j>>3]=k;i=0}return i|0}function rr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;a:{if(G[c+4>>2]==401){f=L[c+120>>3];i=L[c+128>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=84;E[c+3|0]=0;E[c+4|0]=145;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}G[c+1892>>2]=125;G[c+1888>>2]=126;g=f+f;L[c+136>>3]=1/g;g=f*g;L[c+112>>3]=g;f=1/(g+g);L[c+120>>3]=f;i=f*.25;L[c+128>>3]=i}g=0;f=1-a*a*i-b*b*f;b:{c:{if(!(f<0)){g=f;break c}h=2;if(f<-1e-13){break b}}g=V(g);b=g*b/L[c+24>>3];f=O(b);if(f>1){h=2;if(f>1.0000000000001){break b}b=b<0?-1:1}f=(g+g)*g+-1;a=g*a*L[c+136>>3];if(f==0&a==0){a=0}else{a=Ac(a,f);a=a+a}L[d>>3]=a;j=e,k=Bc(b),L[j>>3]=k;h=0}return h|0}function es(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=Fa-16|0;Fa=h;f=G[c+4>>2];g=f>>31;a:{if(((f^g)-g|0)==103){f=G[c+276>>2];break a}G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=84;E[c+1|0]=65;E[c+2|0]=78;E[c+3|0]=0;G[c+4>>2]=(f|0)<0?-103:103;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}G[c+1892>>2]=85;G[c+1888>>2]=86;f=99;b:{while(1){i=(f<<3)+c|0;if(L[i+280>>3]!=0|L[i+1080>>3]!=0){break b}g=f-1|0;if(L[((g<<3)+c|0)+280>>3]!=0){f=g;break b}if(L[i+1072>>3]!=0){f=g;break b}f=f-2|0;if(g){continue}break}f=-1}f=(f|0)>0?f:0;G[c+276>>2]=f}if(f){vm(c,a,b,h+8|0,h);b=L[h>>3];a=L[h+8>>3]}j=V(a*a+b*b);if(j!=0){a=Ac(a,-b)}else{a=0}L[d>>3]=a;k=e,l=Ac(L[c+24>>3],j),L[k>>3]=l;Fa=h+16|0;return 0}function Ld(a,b,c){var d=0,e=0,f=0,g=0,h=0;E[3743024]=0;E[b|0]=0;a:{if(!a){break a}e=G[c>>2];d=H[e+a|0];if(!d){break a}b:{while(1){g=d<<24>>24;if(!(!((g|0)==32|g-9>>>0<5)&E[g+3743040|0]<=0)){g=0;if(!d){break b}e=e+1|0;d=H[e+a|0];continue}break}g=d;c:{d:{e:{switch(d-34|0){case 5:g=39;case 0:E[3743024]=d;h=e+1|0;d=H[h+a|0];if(!d){break c}while(1){if(!(H[a+e|0]==92|d<<24>>24!=(g|0))){break c}E[b+f|0]=d;f=f+1|0;e=h;h=e+1|0;d=H[h+a|0];if(d){continue}break};break c;default:f=g;if(!f){break d}break;case 1:case 2:case 3:case 4:break e}}f:{while(1){f=d<<24>>24;if((f|0)==32|f-9>>>0<5|H[f+3743040|0]){break f}E[b+h|0]=d;h=h+1|0;e=e+1|0;d=H[e+a|0];if(d){continue}break}d=0}f=h}h=e;E[3743024]=d}a=H[a+h|0];E[b+f|0]=0;e=((a|0)!=0)+h|0;g=1}f=g;G[c>>2]=e}return f}function cn(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-48|0;Fa=d;f=362;a:{if(!a|!b){break a}if(!G[b>>2]){f=0;break a}f=0;G[d+44>>2]=0;if((c|0)>998){break a}while(1){c=c+1|0;i=92041;f=0;h=0;while(1){e=G[b+4>>2];G[d+20>>2]=d+39;G[d+16>>2]=d+40;g=e;e=M(f,176);j=Qc((g+e|0)+4|0,30740,d+16|0);g=G[b+4>>2];b:{if((j|0)==1){e=e+g|0;if(G[e>>2]!=2|G[d+40>>2]!=(c|0)){break b}h=G[e+80>>2];break b}G[d+4>>2]=d+39;G[d>>2]=d+40;if((Qc((e+g|0)+4|0,30750,d)|0)!=1){break b}e=e+G[b+4>>2]|0;if(G[e>>2]!=2|G[d+40>>2]!=(c|0)){break b}i=G[e+80>>2]}c:{if(!(!h|!H[i|0])){e=0;break c}e=1;g=(G[b>>2]-1|0)>(f|0);f=f+1|0;if(g){continue}}break}f=G[d+44>>2];if(!(f|!h)){Bi(a,c,i,h,d+44|0);f=G[d+44>>2]}if(!(!f&(e^-1))){break a}if((c|0)!=999){continue}break}f=0}Fa=d+48|0;return f}function or(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;g=G[c+4>>2];h=g>>31;a:{if(((h^g)-h|0)!=501){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=79;E[c+2|0]=80;E[c+3|0]=0;G[c+4>>2]=(g|0)<0?-501:501;f=L[c+40>>3];L[c+16>>3]=f;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}f=Kb(f);L[c+112>>3]=f;g=1;if(f==0){break a}L[c+120>>3]=1/f;f=L[c+24>>3]*Mb(L[c+48>>3]);L[c+136>>3]=f;if(f==0){break a}L[c+144>>3]=1/f;f=Xe(L[c+40>>3]);G[c+1892>>2]=127;G[c+1888>>2]=128;f=1/f;L[c+152>>3]=f;L[c+128>>3]=f*L[c+136>>3]}g=2;b=b-L[c+40>>3];f=Mb(b);if(f==0){break a}i=L[c+112>>3];b=L[c+128>>3]-L[c+136>>3]*Kb(b)/f;a=i*a;j=d,k=Kb(a)*b,L[j>>3]=k;j=e,k=L[c+128>>3]-b*Mb(a),L[j>>3]=k;if(G[c+4>>2]>0&b*L[c+112>>3]<0){break a}g=0}return g|0}function ph(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;j=Fa-16|0;Fa=j;a:{if(G[i>>2]>0){break a}l=G[a>>2];k=G[a+4>>2];b:{c:{if((l|0)!=G[k+76>>2]){mb(a,l+1|0,0,i);break c}if((G[k+128>>2]&G[k+132>>2])!=-1){break c}if((Rb(a,i)|0)>0){break b}}l=b-1|0;b=G[a+4>>2];m=G[b+968>>2];k=M(l,160)+m|0;if(G[k+80>>2]>=0){G[i>>2]=317}n=G[k+76>>2];o=G[b+132>>2];p=G[k+72>>2];q=G[b+128>>2];d=Au(G[b+960>>2],G[b+964>>2],c-1|0,d-!c|0);c=q+d|0;b=Ia+o|0;b=c>>>0>>0?b+1|0:b;d=c;c=p+c|0;b=b+n|0;Jb(a,c,c>>>0>>0?b+1|0:b,1,i);if(!(H[k+140|0]!=80&H[(m+M(l,160)|0)+141|0]!=80)){b=f|h;if((b|0)==1|b>>>0>1){tb(5,23719);G[i>>2]=412;break a}G[j+4>>2]=g;G[j>>2]=e;$c(a,2,4,j,i);break b}G[j+8>>2]=g;G[j+12>>2]=h;G[j>>2]=e;G[j+4>>2]=f;_c(a,2,8,j,i)}}Fa=j+16|0}function fn(a,b,c,d,e){var f=0,g=0,h=0,i=0;f=Fa-144|0;Fa=f;a:{b:{c:{if((c|0)<=7){if((c|0)==-64|(c|0)==-32){break c}break b}h=c-8|0;if(!(h>>>0>24|!(1<>2]=0;if(Cb(a,82,34377,f+128|0,0,f+140|0)){G[f+128>>2]=0;G[f+132>>2]=0}G[f+140>>2]=0;d:{e:{if(Cb(a,82,35661,f+48|0,0,f+140|0)){G[f+48>>2]=0;G[f+52>>2]=1072693248;break e}g=L[f+48>>3];if(g!=1){break d}}i=L[f+128>>3];if(i!=0){g=1;if(i!=32768){break d}}G[d+84>>2]=259;G[e+80>>2]=41;c=0;break a}G[d+84>>2]=260;G[e+80>>2]=82;c=0;if(!G[309801]){break a}L[f+32>>3]=L[f+128>>3];G[f+16>>2]=b;L[f+24>>3]=g;gb(71006,f+16|0);break a}if((c|0)!=64){break b}}G[d+84>>2]=260;G[e+80>>2]=82;c=0;break a}G[f>>2]=c;a=f+48|0;Ya(a,80,78197,f);Ua(a);c=432;G[309737]=432}Fa=f+144|0;return c}function ec(a,b,c){var d=0,e=0,f=0,g=0,h=0;a:{if(!a|!b){break a}d=Va(b);if(!d){return a}if(!c){break a}e=(a+c|0)-d|0;if(e+1>>>0<=a>>>0){break a}f=d-1|0;h=H[f+b|0];g=H[b|0];b:{switch(f|0){case 0:while(1){if((g|0)!=H[a|0]){b=a>>>0>>0;a=a+1|0;if(b){continue}break a}break};return a;case 1:while(1){if(!((g|0)==H[a|0]&H[a+f|0]==(h|0))){b=a>>>0>>0;a=a+1|0;if(b){continue}break a}break};return a;default:break b}}if((d|0)>=2){while(1){c=a;c:{if((g|0)!=H[a|0]){break c}a=1;if(H[c+f|0]!=(h|0)){break c}while(1){if(H[a+c|0]!=H[a+b|0]){break c}a=a+1|0;if((d|0)!=(a|0)){continue}break}return c}a=c+1|0;if(c>>>0>>0){continue}break a}}while(1){if(!((g|0)!=H[a|0]|H[a+f|0]!=(h|0))){return a}b=a>>>0>>0;a=a+1|0;if(b){continue}break}}return 0}function dn(a){var b=0,c=0,d=0,e=0;d=Fa-1e4|0;Fa=d;a:{if(!a){b=362;break a}b=365;if(G[309830]>9){break a}b=ac(a,13287);c=G[309830];G[(c<<2)+1239344>>2]=b;b:{if(b){break b}b=Fd(33802);c:{if(!b){break c}b=rb(d,b,9999);E[b+9999|0]=0;b=pc(b,40241);if(!b){break c}while(1){c=ab((Va(a)+Va(b)|0)+2|0);if(!c){b=360;break a}b=Za(c,b);c=Va(b)+b|0;E[c|0]=47;E[c+1|0]=0;c=Gb(b,a);b=ac(c,13287);G[(G[309830]<<2)+1239344>>2]=b;Wa(c);if(b){break c}b=pc(0,40241);if(b){continue}break}}c=G[309830];if(G[(c<<2)+1239344>>2]){break b}b=366;if(!H[1239392]|H[a|0]==47){break a}c=ab((Va(a)+Va(1239392)|0)+1|0);if(!c){b=360;break a}e=Gb(Za(c,1239392),a);a=ac(e,13287);c=G[309830];G[(c<<2)+1239344>>2]=a;Wa(e);if(!a){break a}}b=0;G[309830]=c+1}Fa=d+1e4|0;return b}function Oo(a,b,c,d){a:{switch(b-9|0){case 0:b=G[c>>2];G[c>>2]=b+4;G[a>>2]=G[b>>2];return;case 6:b=G[c>>2];G[c>>2]=b+4;b=F[b>>1];G[a>>2]=b;G[a+4>>2]=b>>31;return;case 7:b=G[c>>2];G[c>>2]=b+4;G[a>>2]=I[b>>1];G[a+4>>2]=0;return;case 8:b=G[c>>2];G[c>>2]=b+4;b=E[b|0];G[a>>2]=b;G[a+4>>2]=b>>31;return;case 9:b=G[c>>2];G[c>>2]=b+4;G[a>>2]=H[b|0];G[a+4>>2]=0;return;case 16:b=G[c>>2]+7&-8;G[c>>2]=b+8;L[a>>3]=L[b>>3];return;case 17:Ja[d|0](a,c);default:return;case 1:case 4:case 14:b=G[c>>2];G[c>>2]=b+4;b=G[b>>2];G[a>>2]=b;G[a+4>>2]=b>>31;return;case 2:case 5:case 11:case 15:b=G[c>>2];G[c>>2]=b+4;G[a>>2]=G[b>>2];G[a+4>>2]=0;return;case 3:case 10:case 12:case 13:break a}}b=G[c>>2]+7&-8;G[c>>2]=b+8;c=G[b+4>>2];G[a>>2]=G[b>>2];G[a+4>>2]=c}function pn(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;if(!H[1238788]){h=1238472,i=Wc(0)-1|0,G[h>>2]=i;G[309619]=0;E[1238788]=1}G[309727]=b;G[309726]=a;if(G[309723]>0){c=a-G[309732]|0;while(1){f=M(e,344);a=f+G[309722]|0;b=G[a>>2];a:{if((b|0)>0|(b|0)==-1e3){break a}g=M(b,-124);b=g+G[309730]|0;d=M(G[b+88>>2],c);G[a+84>>2]=d+G[b+116>>2];b:{switch(G[a+52>>2]-258|0){case 4:G[a+88>>2]=G[b+120>>2]+(c<<2);G[(G[309722]+f|0)+84>>2]=0;break a;case 3:G[a+88>>2]=G[b+120>>2]+(c<<2);G[(G[309722]+f|0)+84>>2]=G[(G[309730]+g|0)+116>>2]+c;break a;case 0:G[a+88>>2]=G[b+120>>2]+d;break a;case 1:G[a+88>>2]=G[b+120>>2]+(d<<2);break a;case 2:break b;default:break a}}G[a+88>>2]=G[b+120>>2]+(d<<3)}e=e+1|0;if((e|0)>2];h=g>>31;a:{b:{if(((h^g)-h|0)==501){f=L[c+128>>3];break b}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=79;E[c+2|0]=80;E[c+3|0]=0;G[c+4>>2]=(g|0)<0?-501:501;f=L[c+40>>3];L[c+16>>3]=f;if(L[c+24>>3]==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020}f=Kb(f);L[c+112>>3]=f;g=1;if(f==0){break a}L[c+120>>3]=1/f;f=L[c+24>>3]*Mb(L[c+48>>3]);L[c+136>>3]=f;if(f==0){break a}L[c+144>>3]=1/f;f=Xe(L[c+40>>3]);G[c+1892>>2]=127;G[c+1888>>2]=128;f=1/f;L[c+152>>3]=f;f=f*L[c+136>>3];L[c+128>>3]=f}f=f-b;b=V(a*a+f*f);b=L[c+40>>3]<0?-b:b;if(b!=0){a=Ac(a/b,f/b)}else{a=0}L[d>>3]=a*L[c+120>>3];i=e,j=L[c+40>>3]+De(L[c+152>>3]-b*L[c+144>>3]),L[i>>3]=j;g=0}return g|0}function yd(a,b,c){var d=0,e=0;a:{if((a|0)==(b|0)){break a}e=a+c|0;if(b-e>>>0<=0-(c<<1)>>>0){bb(a,b,c);return}d=(a^b)&3;b:{c:{if(a>>>0>>0){if(d){break b}if(!(a&3)){break c}while(1){if(!c){break a}E[a|0]=H[b|0];b=b+1|0;c=c-1|0;a=a+1|0;if(a&3){continue}break}break c}d:{if(d){break d}if(e&3){while(1){if(!c){break a}c=c-1|0;d=c+a|0;E[d|0]=H[b+c|0];if(d&3){continue}break}}if(c>>>0<=3){break d}while(1){c=c-4|0;G[c+a>>2]=G[b+c>>2];if(c>>>0>3){continue}break}}if(!c){break a}while(1){c=c-1|0;E[c+a|0]=H[b+c|0];if(c){continue}break}break a}if(c>>>0<=3){break b}while(1){G[a>>2]=G[b>>2];b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}while(1){E[a|0]=H[b|0];a=a+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}}function Om(a,b,c,d,e,f){var g=0;g=Fa-80|0;Fa=g;a:{if((f|0)>=16384){tc(g+32|0,b,c,d,e,0,0,0,2147352576);d=G[g+40>>2];e=G[g+44>>2];b=G[g+32>>2];c=G[g+36>>2];if(f>>>0<32767){f=f-16383|0;break a}tc(g+16|0,b,c,d,e,0,0,0,2147352576);f=((f|0)<49149?f:49149)-32766|0;d=G[g+24>>2];e=G[g+28>>2];b=G[g+16>>2];c=G[g+20>>2];break a}if((f|0)>-16383){break a}tc(g- -64|0,b,c,d,e,0,0,0,7471104);d=G[g+72>>2];e=G[g+76>>2];b=G[g+64>>2];c=G[g+68>>2];if(f>>>0>4294934644){f=f+16269|0;break a}tc(g+48|0,b,c,d,e,0,0,0,7471104);f=((f|0)>-48920?f:-48920)+32538|0;d=G[g+56>>2];e=G[g+60>>2];b=G[g+48>>2];c=G[g+52>>2]}tc(g,b,c,d,e,0,0,0,f+16383<<16);b=G[g+12>>2];G[a+8>>2]=G[g+8>>2];G[a+12>>2]=b;b=G[g+4>>2];G[a>>2]=G[g>>2];G[a+4>>2]=b;Fa=g+80|0}function cg(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;n=Fa-816|0;Fa=n;k=G[i>>2];if(!(!(d|e)|(k|0)>0)){Qd(a,n+12|0,i);o=G[n+12>>2];a:{if((o|0)<=0){break a}k=0;if(o-1>>>0>=3){p=o&-4;while(1){l=n+16|0;j=l+(k<<3)|0;m=G[(k<<2)+c>>2];G[j>>2]=m;G[j+4>>2]=m>>31;j=k|1;m=(j<<3)+l|0;j=G[(j<<2)+c>>2];G[m>>2]=j;G[m+4>>2]=j>>31;j=k|2;m=(j<<3)+l|0;j=G[(j<<2)+c>>2];G[m>>2]=j;G[m+4>>2]=j>>31;j=l;l=k|3;j=j+(l<<3)|0;l=G[(l<<2)+c>>2];G[j>>2]=l;G[j+4>>2]=l>>31;k=k+4|0;q=q+4|0;if((p|0)!=(q|0)){continue}break}}o=o&3;if(!o){break a}while(1){l=(n+16|0)+(k<<3)|0;p=G[(k<<2)+c>>2];G[l>>2]=p;G[l+4>>2]=p>>31;k=k+1|0;r=r+1|0;if((o|0)!=(r|0)){continue}break}}Bo(a,b,n+16|0,d,e,f,g,h,i);k=G[i>>2]}Fa=n+816|0;return k}function cb(a,b,c){var d=0,e=0,f=0;a:{if(!c){break a}E[a|0]=b;e=a+c|0;E[e-1|0]=b;if(c>>>0<3){break a}E[a+2|0]=b;E[a+1|0]=b;E[e-3|0]=b;E[e-2|0]=b;if(c>>>0<7){break a}E[a+3|0]=b;E[e-4|0]=b;if(c>>>0<9){break a}e=0-a&3;f=e+a|0;d=M(b&255,16843009);G[f>>2]=d;b=c-e&-4;c=b+f|0;G[c-4>>2]=d;if(b>>>0<9){break a}G[f+8>>2]=d;G[f+4>>2]=d;G[c-8>>2]=d;G[c-12>>2]=d;if(b>>>0<25){break a}G[f+24>>2]=d;G[f+20>>2]=d;G[f+16>>2]=d;G[f+12>>2]=d;G[c-16>>2]=d;G[c-20>>2]=d;G[c-24>>2]=d;G[c-28>>2]=d;c=b;b=f&4|24;c=c-b|0;if(c>>>0<32){break a}d=Au(d,0,1,1);e=Ia;b=b+f|0;while(1){G[b+24>>2]=d;G[b+28>>2]=e;G[b+16>>2]=d;G[b+20>>2]=e;G[b+8>>2]=d;G[b+12>>2]=e;G[b>>2]=d;G[b+4>>2]=e;b=b+32|0;c=c-32|0;if(c>>>0>31){continue}break}}return a}function bf(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;i=Fa-1040|0;Fa=i;f=G[d>>2];if((f|0)<=0){while(1){a:{g=H[a+e|0];b:{if((g|0)!=47){if(!g){break a}e=e+1|0;break b}e=e+1|0;if(H[e+a|0]==47){continue}}E[h+i|0]=g;h=h+1|0;continue}break}E[h+i|0]=0;if(!f){a=H[i|0];f=(a|0)!=0;g=b-1|0;c:{d:{e:{if((b|0)<2){e=c;break e}if(!a){e=c;break e}h=i;e=c;while(1){b=a&255;f:{if(!(H[b+120112|0]?a<<24>>24>=32:0)){if((g|0)<=(j+2|0)){break d}E[e|0]=37;E[e+2|0]=H[(b&15)+35292|0];E[e+1|0]=H[(b>>>4|0)+35292|0];a=3;break f}E[e|0]=a;a=1}e=a+e|0;j=a+j|0;a=H[h+1|0];f=(a|0)!=0;if(!a){break e}h=h+1|0;if((g|0)>(j|0)){continue}break}}if(!f|(g|0)!=(j|0)){break c}}Ua(59124);G[d>>2]=125;e=c}E[e|0]=0;f=G[d>>2]}G[d>>2]=f}Fa=i+1040|0;return f}function lo(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;i=Fa-256|0;Fa=i;G[c>>2]=0;h=G[d>>2];a:{if((h|0)>0){break a}e=G[a>>2];f=G[a+4>>2];if((e|0)!=G[f+76>>2]){mb(a,e+1|0,0,d);h=G[d>>2];f=G[a+4>>2];e=G[f+76>>2]}g=G[f+104>>2];e=G[f+96>>2]+(e<<3)|0;j=G[e>>2];f=Bu(g-j|0,G[f+108>>2]-(G[e+4>>2]+(g>>>0>>0)|0)|0,80,0);if((h|0)>0){break a}e=lb(M(f,80)+81|0,1);G[b>>2]=e;b:{c:{d:{if(e){if((f|0)<=0){break c}break d}G[d>>2]=113;Ua(8075);break b}h=1;while(1){g=i+80|0;Sd(a,h,g,d);bb(Va(g)+g|0,68217,81);E[i|0]=0;qb(i,g,8);e=Za(e,g);G[c>>2]=G[c>>2]+1;e=e+80|0;g=(f|0)==(h|0);h=h+1|0;if(!g){continue}break}}a=bb(e,68136,81);G[c>>2]=G[c>>2]+1;E[a+80|0]=0;k=b,l=ub(G[b>>2],M(G[c>>2],80)|1),G[k>>2]=l}}Fa=i+256|0}function Hd(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;i=Fa-96|0;Fa=i;d=G[a>>2];if((d|0)!=G[G[a+4>>2]+76>>2]){mb(a,d+1|0,0,c)}d=0;e=rb(i,b,80);E[e+80|0]=0;f=Va(e);a:{if(f){if((f|0)!=1){h=f&-2;b=0;while(1){g=d+e|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}g=(d|1)+e|0;if((H[g|0]-127&255)>>>0<=160){E[g|0]=32}d=d+2|0;b=b+2|0;if((h|0)!=(b|0)){continue}break}}b:{if(!(f&1)){break b}b=d+e|0;if((H[b|0]-127&255)>>>0>160){break b}E[b|0]=32}if(f>>>0>79){break a}}cb(e+f|0,32,80-f|0)}b=qc(e,36178);f=(b|0)==80?8:b;if(f){d=0;while(1){h=d+e|0;b=E[h|0];E[h|0]=b-97>>>0<26?b&95:b;d=d+1|0;if((f|0)!=(d|0)){continue}break}}ve(e,c);b=G[a+4>>2];d=G[b+120>>2];Jb(a,d-80|0,G[b+124>>2]-(d>>>0<80)|0,0,c);Wb(a,80,0,e,c);Fa=i+96|0}function zl(){var a=0,b=0,c=0,d=0,e=0;G[950222]=0;G[947120]=0;G[950221]=0;G[950328]=0;G[950217]=0;E[3801300]=0;G[951380]=0;G[951381]=0;G[948156]=0;G[951365]=0;E[3805528]=0;E[3796768]=0;E[3792672]=0;pb(G[950326]);G[950326]=0;pb(G[950327]);G[950327]=0;Ce(G[947122]);G[947122]=0;pb(G[948160]);G[948160]=0;b=G[950332];if(b){c=G[950330];if((c|0)>0){while(1){a=d<<2;e=G[a+b>>2];if(e){pb(G[e+24>>2]);pb(G[G[G[950332]+a>>2]+32>>2]);pb(G[G[G[950332]+a>>2]+40>>2]);pb(G[G[G[950332]+a>>2]+52>>2]);pb(G[G[950332]+a>>2]);c=G[950330];b=G[950332]}d=d+1|0;if((c|0)>(d|0)){continue}break}}pb(b);G[950332]=0}G[948164]=0;G[948165]=0;G[948166]=0;G[948167]=0;G[948162]=0;G[948163]=0;G[950330]=0;G[950331]=0}function Di(a,b,c,d,e){var f=0,g=0,h=0;g=Fa-176|0;Fa=g;f=G[e>>2];a:{if((f|0)>0){break a}G[c>>2]=0;E[g|0]=0;if(d){E[d|0]=0;f=G[e>>2];if((f|0)>0){break a}}if((kc(a,b,g+80|0,e)|0)<=0){mc(g+80|0,g,d,e)}f=G[e>>2];if((f|0)>0){break a}if(d){b=71-Va(d)|0}else{b=0}if(!H[g|0]){a=ab(1);G[c>>2]=a;E[a|0]=0;break a}f=ab(Va(g)+1|0);G[c>>2]=f;fd(g,f,e);f=Va(G[c>>2]);b:{if(!f){break b}while(1){if(H[(G[c>>2]+f|0)-1|0]!=38){break b}Ei(a,g,g+80|0,e);if(!H[g|0]){E[g+80|0]=0;break b}E[(G[c>>2]+f|0)-1|0]=0;h=G[c>>2];f=Va(g)+f|0;h=ub(h,f);G[c>>2]=h;Gb(h,g);f=f-1|0;if(!(!H[g+80|0]|(b|0)<=0)){h=Va(d)+d|0;E[h|0]=32;E[h+1|0]=0;b=71-Va(qb(d,g+80|0,b))|0}if(f){continue}break}}f=G[e>>2]}Fa=g+176|0;return f}function Aj(a){var 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;e=G[a+4>>2];g=M(e,e)<<3;d=ab(g);G[a+20>>2]=d;a:{b=1;b:{if(!d){break b}j=ab(g);G[a+24>>2]=j;if(!j){break a}if((e|0)>0){l=e&3;h=G[a+12>>2];m=G[a+16>>2];n=e-1>>>0<3;g=0;while(1){i=(k<<3)+m|0;b=g;c=0;if(l){while(1){f=b<<3;L[f+d>>3]=L[i>>3]*L[h+f>>3];b=b+1|0;c=c+1|0;if((l|0)!=(c|0)){continue}break}}g=e+g|0;if(!n){while(1){c=b<<3;L[c+d>>3]=L[i>>3]*L[c+h>>3];f=c+8|0;L[f+d>>3]=L[i>>3]*L[h+f>>3];f=c+16|0;L[f+d>>3]=L[i>>3]*L[h+f>>3];c=c+24|0;L[c+d>>3]=L[i>>3]*L[c+h>>3];b=b+4|0;if((b|0)!=(g|0)){continue}break}}k=k+1|0;if((k|0)!=(e|0)){continue}break}}b=2;if(sg(e,d,j)){break b}G[a>>2]=137;b=0}return b}Wa(d);return 1}function at(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;g=M(a,48);i=g+757232|0;e=g+757256|0;f=G[e>>2];h=c+f|0;j=c>>31;d=j+G[e+4>>2]|0;d=c>>>0>h>>>0?d+1|0:d;k=g+757240|0;l=G[G[k>>2]>>2];if(l>>>0>>0){f=G[g+757252>>2];if(!f){Ua(60039);return 106}m=G[G[i>>2]>>2];d=M(Bu(h-1|0,d-!h|0,2880,0),2880)+2880|0;a=l+G[M(a,48)+757248>>2]|0;a=a>>>0>>0?d:a;d=Ja[f|0](m,a)|0;if(!d){Ua(59999);return 113}G[G[i>>2]>>2]=d;G[G[k>>2]>>2]=a;f=G[e>>2]}bb(f+G[G[i>>2]>>2]|0,b,c);a=j+G[e+4>>2]|0;b=c+G[e>>2]|0;a=b>>>0>>0?a+1|0:a;c=b;G[e>>2]=c;G[e+4>>2]=a;e=g+757264|0;b=G[e+4>>2];d=G[e>>2];f=c;c=c>>>0>>0&(a|0)<=(b|0)|(a|0)<(b|0);G[e>>2]=c?d:f;G[e+4>>2]=c?b:a;return 0}function Yj(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;g=Fa-16|0;Fa=g;e=G[c>>2];a:{if((e|0)>0){break a}Dc(a,g+12|0,c);if(G[g+12>>2]){Ua(8217);e=233;G[c>>2]=233;break a}e=Fa-16|0;Fa=e;d=G[c>>2];b:{if((d|0)>0){break b}d=G[a>>2];if((d|0)!=G[G[a+4>>2]+76>>2]){mb(a,d+1|0,0,c);d=G[c>>2];if((d|0)>0){break b}}d=G[a+4>>2];f=G[d+104>>2];h=G[d+96>>2]+(G[d+76>>2]<<3)|0;i=G[h>>2];d=M((Bu(f-i|0,G[d+108>>2]-(G[h+4>>2]+(f>>>0>>0)|0)|0,80,0)|0)/36|0,2880);f=lb(d+2881|0,1);G[b>>2]=f;c:{if(!f){G[c>>2]=113;Ua(8075);break c}ok(a,e+8|0,0,0,c);Jb(a,G[e+8>>2],G[e+12>>2],0,c);f=a;a=d+2880|0;ic(f,a,a>>31,G[b>>2],c);E[a+G[b>>2]|0]=0}d=G[c>>2]}Fa=e+16|0;if((d|0)>0){Ua(51004)}e=G[c>>2]}Fa=g+16|0;return e}function Qi(a,b,c,d,e,f,g){var h=0,i=0;h=Fa+-64|0;Fa=h;i=G[g>>2];a:{if((i|0)>0){break a}G[h+48>>2]=0;G[h+40>>2]=0;G[h+44>>2]=0;b:{if(Ti(h+8|0)){break b}G[h+12>>2]=b;G[h+8>>2]=a;G[h+20>>2]=G[c>>2];G[h+24>>2]=G[d>>2];c:{d:{e:{if(e){while(1){f:{switch(Ch(h+8|0)+5|0){case 6:break e;case 0:case 5:break f;default:break d}}a=Ja[e|0](G[c>>2],G[d>>2]+28800|0)|0;G[c>>2]=a;if(a){G[h+24>>2]=28800;b=a;a=G[d>>2];G[h+20>>2]=b+a;G[d>>2]=a+28800;continue}else{ye(h+8|0);break b}}}switch(Ch(h+8|0)+5|0){case 0:case 5:break c;case 6:break e;default:break d}}if(f){G[f>>2]=G[h+28>>2]}if(ye(h+8|0)){break b}i=G[g>>2];break a}ye(h+8|0);break b}ye(h+8|0)}i=414;G[g>>2]=414}Fa=h- -64|0;return i}function Nf(a){var b=0,c=0,d=0;b=1;c=H[a|0];a:{if((c|32)==106){break a}if(!Xa(a,41646)){break a}if(!Xa(a,41677)){break a}if(!Xa(a,33747)){break a}if(!Xa(a,6487)){break a}if(!fb(a,40253,3)){break a}if(!fb(a,40249,3)){break a}b=2;if((c|32)==98){break a}if(!Xa(a,41560)){break a}if(!Xa(a,41670)){break a}if(!fb(a,40370,3)){break a}if(!fb(a,40333,3)){break a}b=11;b:{switch(c-65|0){case 6:case 38:return 3;case 4:case 36:return 4;case 0:case 32:return 5;case 13:case 45:return 7;case 11:case 43:return 6;case 8:case 40:break a;default:break b}}if(!Ej(a,16895,5)){return 10}b=9;if((c|32)==112){break a}if(!ah(a)){return-1}b=1;d=sb(a);if(d>1980){break a}b=d>1900?2:-1}return b}function Pf(a,b,c,d){var e=0,f=0,g=0,h=0;a:{if((d|0)==1){break a}d=G[a+44>>2];if(c){e=+G[a+48>>2];b=G[a+8>>2]+M(b,168)|0;f=L[b+16>>3];h=e>3];e=e>g?e:g;b:{if(O(e)<2147483648){d=~~e;break b}d=-2147483648}if(!(h>=+(d|0))){break a}b=G[a+52>>2];while(1){G[b+(d<<2)>>2]=1;d=d+1|0;e=+G[a+48>>2];if(+(d|0)<=(e>2]+M(b,168)|0;f=L[b+8>>3]+-1;if(f>=+(d|0)){c=G[a+52>>2];while(1){G[c+(d<<2)>>2]=1;d=d+1|0;if(f>=+(d|0)){continue}break}}f=L[b+16>>3]+1;c:{if(O(f)<2147483648){d=~~f;break c}d=-2147483648}if((d|0)>G[a+48>>2]){break a}b=G[a+52>>2];while(1){G[b+(d<<2)>>2]=1;c=G[a+48>>2]>(d|0);d=d+1|0;if(c){continue}break}}}function xj(a){var b=0,c=0,d=0,e=0,f=0;E[a|0]=83;E[a+1|0]=90;E[a+2|0]=80;E[a+3|0]=0;G[a+16>>2]=0;G[a+20>>2]=1079410688;G[a+8>>2]=0;G[a+12>>2]=0;G[a+4>>2]=G[a+4>>2]<0?-102:102;b=L[a+24>>3];if(b==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020;b=57.29577951308232}L[a+112>>3]=1/b;b=L[a+40>>3]*Kb(L[a+56>>3])+1;L[a+136>>3]=b;if(b!=0){b=L[a+40>>3];e=a,f=Mb(L[a+56>>3])*-b*Kb(L[a+48>>3]),L[e+120>>3]=f;b=L[a+40>>3]*Mb(L[a+56>>3])*Mb(L[a+48>>3]);L[a+128>>3]=b;c=b;b=L[a+24>>3];L[a+152>>3]=c*b;L[a+144>>3]=b*L[a+120>>3];c=b;b=L[a+136>>3];L[a+160>>3]=c*b;c=b+-1;L[a+168>>3]=b*c+-1;d=-90;if(O(c)<1){d=Bc(1-b)}G[a+1892>>2]=111;G[a+1888>>2]=112;L[a+176>>3]=d;a=0}else{a=1}return a}function wr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if(G[c+4>>2]==302){f=L[c+136>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=46;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=.005555555555555556;g=180;h=1;i=1;break b}g=f*3.141592653589793;f=1/g;h=g/180;i=1/h}G[c+1892>>2]=121;G[c+1888>>2]=122;L[c+112>>3]=h;L[c+136>>3]=f;L[c+128>>3]=g;L[c+120>>3]=i}j=2;f=f*b;c:{if(f>1|f<-1){break c}b=0;g=f*-4*f+1;d:{if(g==0){if(a==0){break d}break c}b=L[c+120>>3]*a/g}L[d>>3]=b;k=e,l=Bc(f)*3,L[k>>3]=l;j=0}return j|0}function vc(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=b-1|0;a:{if((b|0)>=2){b=a;b:{while(1){c:{d:{e:{d=G[c+4>>2];e=G[c+8>>2];if((d|0)==(e|0)){break e}g=Vi(d,10,e-d|0);f:{if(g){d=G[c+4>>2];e=(g-d|0)+1|0;break f}d=G[c+4>>2];e=G[c+8>>2]-d|0}h=d;d=e>>>0>>0?e:f;bb(b,h,d);e=d+G[c+4>>2]|0;G[c+4>>2]=e;b=b+d|0;if(g){break c}f=f-d|0;if(!f){break c}if((e|0)==G[c+8>>2]){break e}G[c+4>>2]=e+1;d=H[e|0];break d}d=Ag(c);if((d|0)>=0){break d}d=0;if((a|0)==(b|0)){break b}if(H[c|0]&16){break c}break b}E[b|0]=d;b=b+1|0;if((d&255)==10){break c}f=f-1|0;if(f){continue}}break}if(!a){d=0;break b}E[b|0]=0;d=a}break a}b=G[c+72>>2];G[c+72>>2]=b-1|b;if(f){break a}E[a|0]=0;return a}return d}function nn(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=Va(a);d=Va(c);h=(d|0)<(e|0)?e:d;g=ab(h+1|0);a:{b:{if((d|0)>(e|0)){f=d-e|0;if(f){cb(g,48,f)}if(!e){d=f;a=g;break b}bb(g+f|0,a,e);a=g;break b}if((d|0)>=(e|0)){break a}f=e-d|0;if(f){cb(g,48,f)}if(d){bb(g+f|0,c,d);c=e}else{c=f}d=c;c=g}E[d+g|0]=0}d=0;e=0;if(h){f=1;while(1){h=h-1|0;j=H[h+a|0];c:{if((j&223)==88){break c}i=H[c+h|0];if((i|0)==120|(i|0)==88){break c}d=((j|0)==49?f:0)+d|0;e=((i|0)==49?f:0)+e|0;f=f<<1}if(h){continue}break}}d:{switch(b-280|0){case 1:Wa(g);return(d|0)<(e|0);case 2:Wa(g);return(d|0)<=(e|0);case 0:Wa(g);return(d|0)>(e|0);case 3:k=(d|0)>=(e|0);break;default:break d}}Wa(g);return k}function Dq(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0;i=G[d>>2];if((i|0)<=0){e=Fa-464|0;Fa=e;f=G[d>>2];a:{if((f|0)>0){break a}b:{if((kc(a,b,e+368|0,d)|0)>0){break b}Hd(a,c,d);b=G[a+4>>2];g=G[b+96>>2]+(G[b+76>>2]<<3)|0;h=G[g>>2];j=G[g+4>>2];g=G[b+120>>2];k=G[b+124>>2];mc(e+368|0,e+272|0,e+176|0,d);f=G[d>>2];if((f|0)>0){break a}rh();fd(e+272|0,e+80|0,d);f=G[d>>2];if((f|0)==204){qh();f=0;G[d>>2]=0;break a}b=Va(e+80|0);if(!b){break a}h=Bu(g-h|0,k-(j+(g>>>0>>0)|0)|0,80,0)+1|0;while(1){if(H[(b+e|0)+79|0]!=38){break b}Ei(a,e+80|0,e,d);if(!H[e+80|0]){break b}ig(a,h,d);b=Va(e+80|0);if(b){continue}break}}f=G[d>>2]}Fa=e+464|0;if((f|0)==202){G[d>>2]=i;wb(a,c,d)}}}function us(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=+n;o=+o;var p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if(j>k){while(1){j=j+-360;if(k>2]+M(c,3)|0;vf(a,0,q-2|0,d,e,f,g,h,i,m,n);Ze(a,1,q-1|0,d,e,h,i,j,k);if(O(l)<2147483648){q=~~l}else{q=-2147483648}p=(q|0)<=0;if(O(o)<2147483648){s=~~o}else{s=-2147483648}if(!(p|(s|0)<=0)){o=(n-m)/o;n=(k-j)/l;v=c+1|0;while(1){l=+(r|0)*n+j;r=r+1|0;k=+(r|0)*n+j;p=0;while(1){u=t<<1;w=+(p|0)*o+m;p=p+1|0;vf(a,b+t|0,u+c|0,d,e,f,g,h,i,w,+(p|0)*o+m);Ze(a,1,v+u|0,d,e,h,i,l,k);t=t+1|0;if((p|0)!=(s|0)){continue}break}if((q|0)!=(r|0)){continue}break}}}function su(a,b,c){a=a|0;b=+b;c=+c;var d=0,e=0,f=0,g=0;e=Fa-65584|0;Fa=e;a:{if((a|0)<=0|G[968816]<=(a|0)){break a}d=G[968817];if(!d){break a}a=d+M(a,65544)|0;d=G[a>>2];if(!d){break a}Bd(d,b,c,e+40|0,e+32|0,e+28|0);L[e>>3]=L[e+40>>3];L[e+8>>3]=L[e+32>>3];Ya(e+48|0,65535,18893,e);g=a+8|0;a=g;d=H[e+48|0];b:{if(!d){break b}f=e+48|0;while(1){a=d<<24>>24;if(!((a|0)==32|a-9>>>0<5)){a=g;while(1){E[a|0]=d;a=a+1|0;d=H[f+1|0];f=f+1|0;if(d){continue}break}break b}d=H[f+1|0];f=f+1|0;if(d){continue}break}a=g}E[a|0]=0;d=a-g|0;if(!d){break a}while(1){a=a-1|0;f=E[a|0];if(!((f|0)==32|f-9>>>0<5)){break a}E[a|0]=0;d=d-1|0;if(d){continue}break}}Fa=e+65584|0;return g|0}function gj(a,b,c,d,e){var f=0,g=0;f=Fa-416|0;Fa=f;g=G[e>>2];a:{if((g|0)>0){break a}b:{if((Vc(a,b,f+336|0,f+176|0,e)|0)>0){break b}g=f+256|0;kl(c,g,e);c=b;b=f+80|0;Ob(c,g,d?H[d|0]==38?f+176|0:d:f+176|0,b,e);Hd(a,b,e);b=G[a+4>>2];c=G[b+120>>2];d=G[b+96>>2]+(G[b+76>>2]<<3)|0;g=G[d>>2];c=Bu(c-g|0,G[b+124>>2]-(G[d+4>>2]+(c>>>0>>0)|0)|0,80,0);g=G[e>>2];if((g|0)>0){break a}rh();fd(f+336|0,f+256|0,e);g=G[e>>2];if((g|0)==204){qh();g=0;G[e>>2]=0;break a}b=Va(f+256|0);if(!b){break a}c=c+1|0;while(1){if(H[(b+f|0)+255|0]!=38){break b}Ei(a,f+256|0,f,e);if(!H[f+256|0]){break b}ig(a,c,e);b=Va(f+256|0);if(b){continue}break}}g=G[e>>2]}Fa=f+416|0;return g}function Ai(a,b){var c=0,d=0,e=0;E[b|0]=0;a:{while(1){c=a+d|0;e=H[c|0];if((e|0)!=32){b:{if(!e){break b}if(jb(c,37)){break b}E[b|0]=37;Za(b+1|0,c+1|0);c:{switch(H[c|0]-65|0){case 0:case 32:a=Va(b)+b|0;E[a|0]=115;E[a+1|0]=0;return;case 8:case 40:a=Va(b)+b|0;E[a|0]=100;E[a+1|0]=0;return;case 14:case 46:a=Va(b)+b|0;E[a|0]=111;E[a+1|0]=0;return;case 25:case 57:a=Va(b)+b|0;E[a|0]=88;E[a+1|0]=0;return;case 5:case 37:a=Va(b)+b|0;E[a|0]=102;E[a+1|0]=0;return;case 6:case 38:a=Va(b)+b|0;E[a|0]=71;E[a+1|0]=0;return;case 3:case 4:case 35:case 36:break a;default:break c}}E[b|0]=0}}else{d=d+1|0;continue}break}return}a=Va(b)+b|0;E[a|0]=69;E[a+1|0]=0}function pt(a,b){a=a|0;b=b|0;var c=0,d=0;G[b>>2]=-1;a=0;a:{b:{c:{while(1){d=M(a,48)+757232|0;if(!G[d>>2]){c=a;break c}c=a+1|0;d=M(c,48)+757232|0;if(!G[d>>2]){break c}c=a+2|0;d=M(c,48)+757232|0;if(!G[d>>2]){break c}c=a+3|0;d=M(c,48)+757232|0;if(!G[d>>2]){break c}c=a+4|0;d=M(c,48)+757232|0;if(!G[d>>2]){break c}a=a+5|0;if((a|0)!=1e4){continue}break}a=103;break b}G[b>>2]=c;a=M(c,48);b=a+757236|0;G[d>>2]=b;c=a+757244|0;G[a+757240>>2]=c;d=b;b=ab(2880);G[d>>2]=b;if(b){break a}Ua(57797);a=104}Ua(60080);return a|0}G[c>>2]=2880;b=a+757256|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757248>>2]=2880;b=a+757264|0;G[b>>2]=0;G[b+4>>2]=0;G[a+757252>>2]=17;return 0}function Al(a){var b=0,c=0,d=0,e=0;a:{b:{c=G[945062];c:{if(!c){c=ab(4);G[945062]=c;if(!c){break b}G[c>>2]=0;G[950329]=1;G[945063]=0;break c}e=G[945063];b=G[950329];if(e>>>0>>0){break c}d=b+8|0;c=ub(c,d<<2);G[945062]=c;if(!c){break a}b=(b<<2)+c|0;G[b>>2]=0;G[b+4>>2]=0;G[b+24>>2]=0;G[b+28>>2]=0;G[b+16>>2]=0;G[b+20>>2]=0;G[b+8>>2]=0;G[b+12>>2]=0;G[950329]=d}b=(e<<2)+c|0;d=G[b>>2];if((d|0)!=(a|0)){if(d){d=G[945064];E[d|0]=H[3780260];G[G[b>>2]+8>>2]=d;G[G[b>>2]+16>>2]=G[950324]}c=(e<<2)+c|0;G[c>>2]=a;G[950324]=G[a+16>>2];a=G[a+8>>2];G[945070]=a;G[945064]=a;G[945057]=G[G[c>>2]>>2];E[3780260]=H[a|0]}return}qd(64041);W()}qd(64041);W()}function ru(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;a:{if((a|0)<=0|G[968816]<=(a|0)){break a}d=G[968817];if(!d){break a}e=M(a,65544)+d|0;if(!G[e>>2]){break a}f=M(a,65544)+d|0;E[f+8|0]=0;c=Xc(ul(a,0),13234)?b:8039;if(!(!c|!H[c|0])){b=G[e>>2];d=M(a,65544)+d|0;b:{if(!Xc(c,8039)){if(b){wq(b,1)}a=1;break b}if(b){wq(b,0)}a=G[e>>2];if(!(!a|!G[a+3312>>2])){G[a+3288>>2]=3}a=0}G[d+4>>2]=a}c=f+8|0;c:{d:{switch(G[f+4>>2]){case 1:rb(c,8039,65535);break c;case 0:break d;default:break c}}rb(c,16935,65535)}b=H[c|0];if(!b){break a}a=c;while(1){b=b<<24>>24;if(b-65>>>0<26){E[a|0]=b-65>>>0<26?b|32:b}b=H[a+1|0];a=a+1|0;if(b){continue}break}}return c|0}function Wm(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(G[(M(G[G[a+4>>2]+4>>2],84)+1240576|0)+52>>2]){sh(a,0,d);e=G[a+4>>2];G[e+64>>2]=b;G[e+68>>2]=c;G[e+32>>2]=b;G[e+36>>2]=c;G[e+56>>2]=b;G[e+60>>2]=c;G[e+40>>2]=b;G[e+44>>2]=c;i=G[a+4>>2];e=i;k=G[e+32>>2];e=G[e+36>>2];while(1){h=j<<2;f=(h+i|0)+1256|0;g=G[f>>2];g=Au(g,g>>31,2880,0);l=Ia;if((l|0)>=(e|0)&g>>>0>=k>>>0|(e|0)<(l|0)){G[f>>2]=-1}h=((h|4)+i|0)+1256|0;f=G[h>>2];f=Au(f,f>>31,2880,0);g=Ia;if((g|0)>=(e|0)&f>>>0>=k>>>0|(e|0)<(g|0)){G[h>>2]=-1}j=j+2|0;if((j|0)!=40){continue}break}a=G[a+4>>2];m=d,n=Ja[G[(M(G[a+4>>2],84)+1240576|0)+52>>2]](G[a>>2],b,c)|0,G[m>>2]=n}}function Ql(a){var b=0,c=0,d=0;if(!(!a|!H[a|0])){c=Xb(Va(a)+1|0);b=c;d=H[a|0];a:{if(!d){break a}while(1){b=d<<24>>24;if(!((b|0)==32|b-9>>>0<5)){b=c;while(1){E[b|0]=d;b=b+1|0;d=H[a+1|0];a=a+1|0;if(d){continue}break}break a}d=H[a+1|0];a=a+1|0;if(d){continue}break}b=c}E[b|0]=0;a=b-c|0;b:{if(!a){break b}while(1){b=b-1|0;d=E[b|0];if(!((d|0)==32|d-9>>>0<5)){break b}E[b|0]=0;a=a-1|0;if(a){continue}break}}b=H[c|0];if(b){a=c;while(1){b=b<<24>>24;if(b-65>>>0<26){E[a|0]=b-65>>>0<26?b|32:b}b=H[a+1|0];a=a+1|0;if(b){continue}break}}b=1;c:{if(!Xa(c,19834)){break c}if(!Xa(c,7232)){break c}if(!Xa(c,15732)){break c}b=!Xa(c,41541)}pb(c)}return b}function er(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(G[c+4>>2]!=602){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=67;E[c+2|0]=79;E[c+3|0]=0;E[c+4|0]=90;E[c+5|0]=2;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;h=1;f=114.59155902616465;break a}g=f*3.141592653589793/180;h=1/g;f=f+f}G[c+1892>>2]=137;G[c+1888>>2]=138;L[c+112>>3]=g;L[c+128>>3]=f;L[c+120>>3]=h}f=0;h=Mb(b);g=Kb(b);b:{if(g==0){L[d>>3]=L[c+112>>3]*a;break b}f=h/g;a=g*a;i=d,j=f*L[c+24>>3]*Kb(a),L[i>>3]=j;f=L[c+24>>3]*(f*(1-Mb(a))+b*3.141592653589793/180)}L[e>>3]=f;return 0}function Gr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|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;h=G[c+4>>2];l=h>>31;a:{if(((h^l)-l|0)!=102){h=1;if(xj(c)){break a}}g=L[c+112>>3];i=g*a;f=L[c+136>>3];a=(i-L[c+120>>3])/f;j=g*b;k=(j-L[c+128>>3])/f;b=i*a+j*k;m=a;f=i*i+j*j;b:{if(f<1e-10){L[e>>3]=V(f/(b+1))*-57.29577951308232+90;a=f*.5;break b}h=2;a=a*a+k*k;g=b-a;b=a+(f-b-b)+-1;f=a+1;a=g*g-b*f;if(a<0){break a}a=V(a);b=(a-g)/f;g=(-g-a)/f;a=b>g?b:g;c:{if(!(a>1)){break c}f=a+-1;a=1;if(f<1e-13){break c}a=b-1e-13?-1:a:a;if(a>1|a<-1){break a}n=e,o=Bc(a),L[n>>3]=o;a=1-a}n=d,o=Ac(i-m*a,-(j-k*a)),L[n>>3]=o;h=0}return h|0}function wh(a){var b=0,c=0,d=0,e=0;c=G[48836];b=G[48835];if((b|0)<=2){d=G[48834];e=H[d+a|0];G[48834]=d+1;c=e|c<<8;G[48836]=c;b=b+8|0}d=b-3|0;G[48835]=d;e=c>>d&7;if(e>>>0<=3){return 1<>>b&1|e<<1;if(d>>>0<=12){e=d-8|0;if(e>>>0<5){break b}}if(b){b=b-1|0}else{b=G[48834];c=H[b+a|0];G[48836]=c;G[48834]=b+1;b=7}G[48835]=b;d=c>>>b&1|d<<1;e=d-26|0;if(e>>>0<5){break a}if(b){a=b-1|0}else{b=a;a=G[48834];c=H[b+a|0];G[48836]=c;G[48834]=a+1;a=7}G[48835]=a;return(c>>>a&1|d<<1)==62?0:14}return G[(e<<2)+118948>>2]}return G[(e<<2)+118968>>2]}function Lk(a,b,c,d,e){var f=0,g=0,h=0,i=0;f=Fa-208|0;Fa=f;G[f+204>>2]=c;c=f+160|0;cb(c,0,40);G[f+200>>2]=G[f+204>>2];a:{if((fp(0,b,f+200|0,f+80|0,c,d,e)|0)<0){e=-1;break a}i=G[a+76>>2]>=0;g=G[a>>2];if(G[a+72>>2]<=0){G[a>>2]=g&-33}b:{c:{d:{if(!G[a+48>>2]){G[a+48>>2]=80;G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;h=G[a+44>>2];G[a+44>>2]=f;break d}if(G[a+16>>2]){break c}}c=-1;if(el(a)){break b}}c=fp(a,b,f+200|0,f+80|0,f+160|0,d,e)}if(h){Ja[G[a+36>>2]](a,0,0)|0;G[a+48>>2]=0;G[a+44>>2]=h;G[a+28>>2]=0;b=G[a+20>>2];G[a+16>>2]=0;G[a+20>>2]=0;c=b?c:-1}b=a;a=G[a>>2];G[b>>2]=a|g&32;e=a&32?-1:c;if(!i){break a}}Fa=f+208|0;return e}function tj(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;G[a+8>>2]=0;G[a+12>>2]=0;E[a|0]=67;E[a+1|0]=79;E[a+2|0]=79;E[a+3|0]=0;E[a+4|0]=248;E[a+5|0]=1;E[a+6|0]=0;E[a+7|0]=0;c=L[a+40>>3];L[a+16>>3]=c;if(L[a+24>>3]==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020}b=L[a+48>>3];d=c-b;e=Xe((90-d)*.5);f=Mb(d);c=c+b;a:{if(c==d){b=Kb(d);break a}b=Xe((90-c)*.5);b=oc(Mb(c)/f)/oc(b/e)}L[a+112>>3]=b;g=1;b:{if(b==0){break b}L[a+120>>3]=1/b;c=f/b*L[a+24>>3]/$b(e,b);L[a+136>>3]=c;if(c==0){break b}b=Xe((90-L[a+40>>3])*.5);G[a+1892>>2]=133;G[a+1888>>2]=134;L[a+144>>3]=1/L[a+136>>3];h=a,i=c*$b(b,L[a+112>>3]),L[h+128>>3]=i;g=0}return g}function kf(a,b,c){var d=0,e=0,f=0,g=0;d=Fa-352|0;Fa=d;e=G[c>>2];a:{if((e|0)>0){break a}b:{if((Vc(a,b,d+272|0,d+192|0,c)|0)>0){G[d>>2]=b;a=d+16|0;Ya(a,81,49178,d);Ua(a);break b}b=G[a+4>>2];e=G[b+120>>2];f=G[b+96>>2]+(G[b+76>>2]<<3)|0;g=G[f>>2];f=Bu(e-g|0,G[b+124>>2]-(G[f+4>>2]+(e>>>0>>0)|0)|0,80,0);ig(a,f,c);e=G[c>>2];if((e|0)>0){break a}rh();fd(d+272|0,d+112|0,c);e=G[c>>2];if((e|0)==204){qh();e=0;G[c>>2]=0;break a}b=Va(d+112|0);if(!b){break a}while(1){if(H[(b+d|0)+111|0]!=38){break b}Ei(a,d+112|0,d+16|0,c);if(!H[d+112|0]){break b}ig(a,f,c);b=Va(d+112|0);if(b){continue}break}}e=G[c>>2]}Fa=d+352|0;return e}function hg(a,b,c,d){var e=0,f=0;e=Fa-48|0;Fa=e;a:{if(G[d>>2]>0){break a}E[c|0]=0;b:{c:{if((b|0)<0){f=+a;L[e+24>>3]=f;G[e+16>>2]=0-b;if((Ya(c,71,35121,e+16|0)|0)<0){Ua(17756);G[d>>2]=402;break b}if(jb(c,46)){break c}if(!jb(c,69)){break c}L[e>>3]=f;if((Ya(c,71,35739,e)|0)>=0){break b}Ua(17756);G[d>>2]=402;break a}G[e+32>>2]=b;L[e+40>>3]=a;if((Ya(c,71,35744,e+32|0)|0)>=0){break c}Ua(17756);G[d>>2]=402;break b}if(G[d>>2]>0){break b}b=jb(c,44);if(b){E[b|0]=46}if(jb(c,78)){Ua(35152);G[d>>2]=402;break b}if(jb(c,46)){break b}if(jb(c,69)){break b}if(Va(c)>>>0>69){break b}b=Va(c)+c|0;E[b|0]=46;E[b+1|0]=0}}Fa=e+48|0}function yj(a){var b=0,c=0,d=0,e=0;E[a|0]=65;E[a+1|0]=90;E[a+2|0]=80;E[a+3|0]=0;G[a+16>>2]=0;G[a+20>>2]=1079410688;G[a+8>>2]=0;G[a+12>>2]=0;G[a+4>>2]=G[a+4>>2]<0?-101:101;b=L[a+24>>3];if(b==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020;b=57.29577951308232}b=b*(L[a+40>>3]+1);L[a+112>>3]=b;d=1;a:{if(b==0){break a}b=Mb(L[a+48>>3]);L[a+136>>3]=b;if(b==0){break a}L[a+128>>3]=1/b;b=Kb(L[a+48>>3]);L[a+144>>3]=b;c=L[a+136>>3];L[a+120>>3]=b/c;e=-90;b=L[a+40>>3];if(O(b)>1){e=Bc(-1/b);c=L[a+136>>3];b=L[a+40>>3]}G[a+1892>>2]=109;G[a+1888>>2]=110;b=b*c;L[a+160>>3]=b;L[a+152>>3]=e;L[a+168>>3]=O(b)<1?1:0;d=0}return d}function Yr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;if(G[c+4>>2]!=108){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=90;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=108;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=114.59155902616465;g=.008726646259971648;break a}f=f+f;g=1/f}G[c+1892>>2]=93;G[c+1888>>2]=94;L[c+112>>3]=f;L[c+120>>3]=g}f=V(a*a+b*b);if(f!=0){a=Ac(a,-b)}else{a=0}L[d>>3]=a;a=f*L[c+120>>3];b:{c:{if(O(a)>1){d=2;a=-90;if(O(f-L[c+112>>3])<1e-12){break c}break b}a=Bc(a);a=90-(a+a)}L[e>>3]=a;d=0}return d|0}function If(a,b,c,d){var e=0;e=Fa-48|0;Fa=e;a:{if(G[d>>2]>0){break a}E[c|0]=0;b:{c:{if((b|0)<0){L[e+24>>3]=a;G[e+16>>2]=0-b;if((Ya(c,71,35121,e+16|0)|0)<0){Ua(17798);G[d>>2]=402;break b}if(jb(c,46)){break c}if(!jb(c,69)){break c}L[e>>3]=a;if((Ya(c,71,35739,e)|0)>=0){break b}Ua(17798);G[d>>2]=402;break a}L[e+40>>3]=a;G[e+32>>2]=b;if((Ya(c,71,35744,e+32|0)|0)>=0){break c}Ua(17798);G[d>>2]=402;break b}if(G[d>>2]>0){break b}b=jb(c,44);if(b){E[b|0]=46}if(jb(c,78)){Ua(35245);G[d>>2]=402;break b}if(jb(c,46)){break b}if(jb(c,69)){break b}if(Va(c)>>>0>69){break b}b=Va(c)+c|0;E[b|0]=46;E[b+1|0]=0}}Fa=e+48|0}function vj(a){var b=0,c=0,d=0,e=0;G[a+8>>2]=0;G[a+12>>2]=0;E[a|0]=67;E[a+1|0]=79;E[a+2|0]=69;E[a+3|0]=0;E[a+4|0]=246;E[a+5|0]=1;E[a+6|0]=0;E[a+7|0]=0;b=L[a+40>>3];L[a+16>>3]=b;if(L[a+24>>3]==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020}c=L[a+48>>3];d=b-c;c=b+c;b=(Kb(d)+Kb(c))*.5;L[a+112>>3]=b;if(b!=0){L[a+120>>3]=1/b;L[a+136>>3]=L[a+24>>3]/b;c=Kb(d)*Kb(c)+1;L[a+144>>3]=c;b=L[a+112>>3];d=b+b;L[a+152>>3]=d;b=L[a+136>>3];L[a+160>>3]=c*(b*b);e=L[a+24>>3];L[a+168>>3]=1/(b*(e+e));L[a+176>>3]=b*V(c+d);e=Kb(L[a+40>>3]);G[a+1892>>2]=129;G[a+1888>>2]=130;L[a+128>>3]=b*V(c-d*e);a=0}else{a=1}return a}function ce(a,b,c){var d=0,e=0,f=0;d=Fa-1120|0;Fa=d;a:{if((b|0)==1){G[d+1116>>2]=6433650;break a}E[d+1118|0]=H[30819];F[d+1116>>1]=H[30817]|H[30818]<<8}b:{c:{if(H[a|0]!=126){break c}b=a+1|0;d:{e=H[a+1|0];if((e|0)!=47){a=0;while(1){if(!e|(e|0)==47){break d}E[a+d|0]=e;a=a+1|0;e=H[b+1|0];b=b+1|0;continue}}e=Fd(35450);if(e){f=104;if(Va(e)+Va(b)>>>0>1023){break b}a=Gb(Za(d+80|0,e),b);break c}f=104;if(Va(a)>>>0>1023){break b}a=Za(d+80|0,a);break c}E[a+d|0]=0;G[48624]=44;a=G[5];f=104;if(Va(a)+Va(b)>>>0>1023){break b}a=Gb(Za(d+80|0,a),b)}a=ac(a,d+1116|0);G[c>>2]=a;f=a?0:104}e=f;Fa=d+1120|0;return e}function ik(a,b,c){var d=0,e=0,f=0;f=Fa-160|0;Fa=f;d=G[c>>2];if(!d){e=Vc(a,35480,f+80|0,f,c);G[c>>2]=e;d=340;if((e|0)!=202){d=Va(f+80|0);if(!(H[f+80|0]!=39|H[(d+f|0)+79|0]!=39)){d=d-2|0;if((d|0)>0){e=f+80|0;yd(e,e|1,d)}E[d+(f+80|0)|0]=0}e=0;a:{b:{d=Va(f+80|0)-1|0;if((d|0)<=0){break b}while(1){if(H[(f+80|0)+e|0]!=32){break b}e=e+1|0;if((e|0)!=(d|0)){continue}break}break a}if((d|0)==(e|0)|(d|0)<0){break a}while(1){e=(f+80|0)+d|0;if(H[e|0]!=32){break a}E[e|0]=0;e=(d|0)>0;d=d-1|0;if(e){continue}break}}if(Ib(f+80|0,35090)){G[c>>2]=340;Ua(56591)}d=Ec(a,40853,b,f,c)}G[c>>2]=d}Fa=f+160|0;return d}function xc(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;a:{if((b|0)<0){break a}f=G[309722];c=f+M(a,344)|0;d=M(b,344)+f|0;G[c+56>>2]=G[d+56>>2];G[c+60>>2]=G[d+60>>2];e=G[d+60>>2];if((e|0)<=0){break a}d=0;if(e-1>>>0>=3){l=e&-4;while(1){h=(M(a,344)+f|0)- -64|0;c=d<<2;i=(M(b,344)+f|0)- -64|0;G[h+c>>2]=G[c+i>>2];g=c|4;G[g+h>>2]=G[i+g>>2];g=c|8;G[g+h>>2]=G[i+g>>2];c=c|12;G[c+h>>2]=G[c+i>>2];d=d+4|0;j=j+4|0;if((l|0)!=(j|0)){continue}break}}c=e&3;if(!c){break a}while(1){e=d<<2;G[(e+(M(a,344)+f|0)|0)- -64>>2]=G[(e+(M(b,344)+f|0)|0)- -64>>2];d=d+1|0;k=k+1|0;if((c|0)!=(k|0)){continue}break}}} -function $s(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;a=Fa-1248|0;Fa=a;G[a+12>>2]=0;b=G[g+28>>2];c=b-11|0;if(!(!(1<>>0<=31:0)&(b|0)!=82)){G[g>>2]=G[f+88>>2]}b=G[g+8>>2];if((b|0)>0){f=0;while(1){c=G[g+4>>2];d=G[((f<<2)+g|0)+12>>2];b=(a+16|0)+M(f,244)|0;G[b+84>>2]=0;G[b+80>>2]=82;G[b+4>>2]=d;G[b>>2]=c;b=G[g+8>>2];f=f+1|0;if((b|0)>(f|0)){continue}break}}if(L[g+152>>3]==-91191291391491e-49){c=G[g+4>>2];d=G[g+148>>2];b=(a+16|0)+M(b,244)|0;G[b+84>>2]=0;G[b+80>>2]=82;G[b+4>>2]=d;G[b>>2]=c;b=G[g+8>>2]+1|0}$f(b,a+16|0,0,0,20,g,a+12|0);Fa=a+1248|0;return G[a+12>>2]}function uu(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=Fa-80|0;Fa=b;a:{if((a|0)<=0|G[968816]<=(a|0)){break a}c=G[968817];if(!c){break a}d=c+M(a,65544)|0;a=G[d>>2];b:{if(!a){c=0;a=0;break b}e=L[a+48>>3];e=G[a+3256>>2]?-e:e;c=G[a+3304>>2];f=L[a+(c?768:760)>>3];g=L[a+(c?760:768)>>3];c=a+3848|0;h=a+3528|0;i=a+3512|0;j=L[a+624>>3];k=L[a+696>>3];l=L[a+616>>3];m=L[a+688>>3];a=a+3544|0}G[b+68>>2]=c;G[b- -64>>2]=a;G[b+60>>2]=h;G[b+56>>2]=i;L[b+48>>3]=e;L[b+40>>3]=g;L[b+32>>3]=f;L[b+24>>3]=j;L[b+16>>3]=l;L[b+8>>3]=k;L[b>>3]=m;d=d+8|0;Ya(d,65535,1566,b)}Fa=b+80|0;return d|0}function Sf(a,b,c,d,e,f,g,h){var i=0,j=0,k=0,l=0;i=1;j=d&2147483647;l=j;k=(j|0)==2147418112;a:{if(k&!c?a|b:k&(c|0)!=0|j>>>0>2147418112){break a}j=h&2147483647;k=(j|0)==2147418112;if(k&!g?e|f:k&(g|0)!=0|j>>>0>2147418112){break a}if(!(a|e|(c|g)|(b|f|(j|l)))){return 0}i=d&h;if((i|0)>0|(i|0)>=0){i=-1;if((c|0)==(g|0)&(d|0)==(h|0)?(b|0)==(f|0)&a>>>0>>0|b>>>0>>0:c>>>0>>0&(d|0)<=(h|0)|(d|0)<(h|0)){break a}return(a^e|c^g|(b^f|d^h))!=0}i=-1;if((c|0)==(g|0)&(d|0)==(h|0)?(b|0)==(f|0)&a>>>0>e>>>0|b>>>0>f>>>0:c>>>0>g>>>0&(d|0)>=(h|0)|(d|0)>(h|0)){break a}i=(a^e|c^g|(b^f|d^h))!=0}return i}function Sj(a,b){var c=0,d=0,e=0,f=0;f=G[48624];a:{b:{c:{if(!a){c=G[309704];break c}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;G[a+8>>2]=G[a+4>>2];c=G[309704];if(c){d=G[(G[309705]<<2)+c>>2]}else{d=0}if((d|0)!=(a|0)){break c}e=(G[309705]<<2)+c|0;d=G[e>>2];G[309738]=G[d+16>>2];d=G[d+8>>2];G[309706]=d;G[309710]=d;G[309700]=G[G[e>>2]>>2];E[1238828]=H[d|0];G[a+40>>2]=1;G[a>>2]=b;break b}G[a+40>>2]=1;G[a>>2]=b;if(c){break b}c=0;break a}c=G[(G[309705]<<2)+c>>2]}if((c|0)!=(a|0)){G[a+32>>2]=1;G[a+36>>2]=0}if(b){b=(Vj(gk(b))|0)>0}else{b=0}G[a+24>>2]=b;G[48624]=f}function $i(a,b){var c=0,d=0,e=0,f=0;f=G[48624];a:{b:{c:{if(!a){c=G[945062];break c}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;G[a+8>>2]=G[a+4>>2];c=G[945062];if(c){d=G[(G[945063]<<2)+c>>2]}else{d=0}if((d|0)!=(a|0)){break c}e=(G[945063]<<2)+c|0;d=G[e>>2];G[950324]=G[d+16>>2];d=G[d+8>>2];G[945064]=d;G[945070]=d;G[945057]=G[G[e>>2]>>2];E[3780260]=H[d|0];G[a+40>>2]=1;G[a>>2]=b;break b}G[a+40>>2]=1;G[a>>2]=b;if(c){break b}c=0;break a}c=G[(G[945063]<<2)+c>>2]}if((c|0)!=(a|0)){G[a+32>>2]=1;G[a+36>>2]=0}if(b){b=(Vj(gk(b))|0)>0}else{b=0}G[a+24>>2]=b;G[48624]=f}function zs(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;j=Fa-16|0;Fa=j;G[j+12>>2]=h;h=0;l=lb(1e3,8);m=lb(1e3,8);n=1e3;while(1){b=h+1|0;if((b|0)>=(n|0)){n=n+1e3|0;i=n<<3;l=ub(l,i);m=ub(m,i)}k=h<<3;o=k+l|0;i=G[j+12>>2]+7&-8;f=L[i>>3];L[o>>3]=f;G[j+12>>2]=i+16;k=m+k|0;g=L[i+8>>3];L[k>>3]=g;if(!(O(f+-9007199254740992)<=1e-15&O(g+-9007199254740992)<=1e-15)){p=f-+G[a+16>>2];f=+G[a+32>>2];L[o>>3]=p/f+1;L[k>>3]=(g-+G[a+24>>2])/f+1;h=b;continue}break}i=a;b=h<<3;a=ub(l,b);b=ub(m,b);Hj(i,0,c,d,e,a,b,h);if(a){Wa(a)}if(b){Wa(b)}Fa=j+16|0}function Fr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;j=G[c+4>>2];g=j>>31;a:{if(((g^j)-g|0)!=102){g=1;if(xj(c)){break a}}f=Mb(a);h=Kb(a);k=Mb(b);g=2;a=1-Kb(b);i=L[c+136>>3]-a;if(i==0){break a}L[d>>3]=(k*L[c+160>>3]*h-a*L[c+144>>3])/i;L[e>>3]=-(k*L[c+160>>3]*f+a*L[c+152>>3])/i;b:{if(G[c+4>>2]<=0){break b}if(L[c+176>>3]>b){break a}if(!(O(L[c+40>>3])>1)){break b}a=L[c+120>>3]*h-f*L[c+128>>3];f=1/V(a*a+L[c+168>>3]);if(!(O(f)<=1)){break b}i=b;b=Ac(a,L[c+136>>3]+-1);f=Bc(f);a=b-f;h=a>90?a+-360:a;a=b+f+180;a=a>90?a+-360:a;if(i<(a>2]==2){e=116;f=d+202504|0;d=f;i=G[d+4>>2];d=G[d>>2];if(zf(G[g>>2],d,d>>31,0)){break a}G[f>>2]=d;G[f+4>>2]=i}d=zc(b,1,c,G[g>>2]);if((d|0)==1){e=107;b:{c:{a=H[b|0];switch(a|0){case 0:case 10:break a;case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:break b;default:break c}}if((a|0)==32){break a}}return 108}e=108;if((c|0)!=(d|0)){break a}a=M(a,24)+202504|0;d=a;b=c+G[d>>2]|0;a=G[d+4>>2]+(c>>31)|0;G[d>>2]=b;G[d+4>>2]=b>>>0>>0?a+1|0:a;G[h>>2]=1;e=0}return e|0}function _g(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(c!=2e3){ai(2e3,c,a,b)}c=(c+-2e3)*.01;f=(((c*.001813+-59e-5)*c+-46.815)*c+84381.448)*48481368110953e-19;c=eb(f);f=ib(f);e=L[b>>3];g=L[a>>3]*3.141592653589793/180;j=ib(g);h=e*3.141592653589793/180;e=eb(h);k=eb(g);g=c*0;i=g+0;h=ib(h);l=f*0;j=j*e;e=k*e;k=(f+i)*h+((l+(c+0))*j+((l+i)*e+0));i=h*0+(j*0+(e+0));d=Db(k,i);d=d<0?d+6.283185307179586:d;L[a>>3]=(d>6.283185307179586?d+-6.283185307179586:d)*180/3.141592653589793;d=c;c=0-l;m=b,n=Db(h*(d+c)+((g+(0-f))*j+((g+c)*e+0)),V(i*i+k*k))*180/3.141592653589793,L[m>>3]=n}function Ll(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;g=Fa-16384|0;Fa=g;a:{if(!a|!H[a|0]){break a}b:{if(fb(a,42036,6)){if(fb(a,42025,7)){break b}}e=Lc(a);break a}if(!c){e=aj(a,b,d);break a}e=rb(g- -8192|0,c,8191);E[e+8191|0]=0;c=Ih(e);if(c){E[c|0]=0;f=c+1|0}while(1){c=f;c:{if(H[e|0]==36){e=Fd(e+1|0);if(!e){break c}e=Ll(a,b,e,d);if(!e){break c}break a}h=Sb(a,e);f=rb(g,a,8191);E[g+8191|0]=0;i=h;h=Va(f);if(!(H[i+h|0]?0:i)){if(Va(e)+h>>>0>8191){e=0;break a}Gb(f,e)}e=aj(f,b,d);if(e){break a}}if(!c){e=0;break a}f=0;e=c;c=Ih(e);if(!c){continue}E[c|0]=0;f=c+1|0;continue}}Fa=g+16384|0;return e}function _h(a,b,c){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;f=(c+-2e3)*.01;h=(((f*.001813+-59e-5)*f+-46.815)*f+84381.448)*48481368110953e-19;f=ib(h);h=eb(h);i=L[b>>3]*3.141592653589793/180;k=ib(i);e=L[a>>3];g=h*0;d=f*0;j=eb(i);e=e*3.141592653589793/180;i=j*ib(e);j=j*eb(e);l=j*0+0;e=k*(g+(0-f))+((d+(h+0))*i+l);m=0-d;n=g+0;g=k*(g+m)+((d+n)*i+(j+0));d=Db(e,g);d=d<0?d+6.283185307179586:d;L[a>>3]=(d>6.283185307179586?d+-6.283185307179586:d)*180/3.141592653589793;o=b,p=Db(k*(h+m)+((f+n)*i+l),V(g*g+e*e))*180/3.141592653589793,L[o>>3]=p;if(c!=2e3){ai(c,2e3,a,b)}}function fd(a,b,c){var d=0,e=0,f=0,g=0,h=0;a:{d=G[c>>2];if((d|0)<=0){d=H[a|0];b:{if((d|0)!=39){if(!d){E[b|0]=0;d=204;break b}Za(b,a);return G[c>>2]}g=Va(a);c:{if(g>>>0>=2){d=0;f=1;while(1){d:{h=H[a+f|0];e:{if((h|0)!=39){e=f;break e}e=f+1|0;if(H[e+a|0]!=39){break d}}E[b+d|0]=h;d=d+1|0;f=e+1|0;if(g>>>0>f>>>0){continue}}break}E[b+d|0]=0;if((f|0)==(g|0)){break c}if((d|0)<=0){break a}while(1){a=d-1|0;e=a+b|0;if(H[e|0]!=32){break a}E[e|0]=0;e=d>>>0>1;d=a;if(e){continue}break}break a}E[b|0]=0;if((g|0)!=1){break a}}tb(5,39759);tb(5,a);d=205}G[c>>2]=d}return d}return G[c>>2]}function fc(a){var b=0,c=0,d=0,e=0,f=0,g=0;A(+a);f=v(1)|0;e=v(0)|0;c=f&2147483647;if(c>>>0>=1072693248){if(!(c-1072693248|e)){return a*1.5707963267948966+752316384526264e-51}return 0/(a-a)}a:{if(c>>>0<=1071644671){if(c+-1048576>>>0<1044381696){break a}return a*hh(a*a)+a}b=(1-O(a))*.5;a=V(b);g=hh(b);b:{if(c>>>0>=1072640819){a=a*g+a;a=1.5707963267948966-(a+a+-6123233995736766e-32);break b}A(+a);e=v(1)|0;v(0)|0;x(0,0);x(1,e|0);d=b;b=+z();d=(d-b*b)/(a+b);a=.7853981633974483-(b+b)-((a+a)*g-(6123233995736766e-32-(d+d)))+.7853981633974483}a=(f|0)<0?-a:a}return a}function to(a,b,c){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;f=b;k=b<<2;g=ab(k);if(g){a:{if(!b&(c|0)<=0|(c|0)<0){break a}l=b&1;h=M(f,3);i=f<<1;d=a;e=g;if((b|0)!=1|c){m=b&-2;n=c;b=0;c=0;while(1){E[e|0]=H[d|0];E[e+f|0]=H[d+1|0];E[e+i|0]=H[d+2|0];E[e+h|0]=H[d+3|0];E[e+1|0]=H[d+4|0];j=e+1|0;E[j+f|0]=H[d+5|0];E[i+j|0]=H[d+6|0];E[h+j|0]=H[d+7|0];e=e+2|0;d=d+8|0;b=b+2|0;c=b>>>0<2?c+1|0:c;if((m|0)!=(b|0)|(c|0)!=(n|0)){continue}break}}if(!(l|o)){break a}E[e|0]=H[d|0];E[e+f|0]=H[d+1|0];E[e+i|0]=H[d+2|0];E[e+h|0]=H[d+3|0]}bb(a,g,k);Wa(g);return}Ua(73667)}function Is(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;var m=0,n=0;a:{b:{if(j==0&k==0){break b}m=G[a+8>>2];h=L[(m+M(c,168)|0)+8>>3];if(g>3]=h)|!(L[(M(c,168)+m|0)+16>>3]>=g)){break b}e=0;m=G[(M(c,168)+m|0)+24>>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}c=G[m+(c<<2)>>2];c:{if(!c){break c}while(1){if(!(+G[c+4>>2]<=f)){break c}e=e+1|0;c=G[c>>2];if(c){continue}break}}if((e&1)!=(d|0)){break a}if(!b){return 1}if(!d){return 1}G[a+12>>2]=b;return 1}n=!d}return n|0}function uj(a){var b=0,c=0,d=0;G[a+8>>2]=0;G[a+12>>2]=0;E[a|0]=67;E[a+1|0]=79;E[a+2|0]=68;E[a+3|0]=0;E[a+4|0]=247;E[a+5|0]=1;E[a+6|0]=0;E[a+7|0]=0;c=L[a+40>>3];L[a+16>>3]=c;b=L[a+24>>3];if(b==0){G[a+24>>2]=442745336;G[a+28>>2]=1078765020;b=57.29577951308232}d=L[a+48>>3];b=b*Kb(c);if(d==0){b=b*3.141592653589793/180}else{b=b*Kb(L[a+48>>3])/L[a+48>>3]}L[a+112>>3]=b;if(b!=0){L[a+120>>3]=1/b;b=L[a+24>>3];c=Mb(L[a+48>>3]);d=Mb(L[a+40>>3]);G[a+1892>>2]=131;G[a+1888>>2]=132;b=d*(b*c)/L[a+112>>3];L[a+128>>3]=b;L[a+136>>3]=b+L[a+40>>3];a=0}else{a=1}return a}function vr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(G[c+4>>2]!=302){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=80;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=46;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;h=.005555555555555556;f=180;g=1;i=1;break a}f=f*3.141592653589793;h=1/f;g=f/180;i=1/g}G[c+1892>>2]=121;G[c+1888>>2]=122;L[c+112>>3]=g;L[c+136>>3]=h;L[c+128>>3]=f;L[c+120>>3]=i}b=Kb(b/3);L[d>>3]=L[c+112>>3]*a*(b*(b*-4)+1);L[e>>3]=b*L[c+128>>3];return 0}function om(a,b){var c=0,d=0,e=0;c=Fa-16|0;Fa=c;Fa=c+16|0;d=0;a:{if(!b){break a}a=a?a:c+12|0;c=H[b|0];d=c<<24>>24;if((d|0)>=0){G[a>>2]=c;d=(d|0)!=0;break a}c=E[b|0];if(!G[G[48787]>>2]){G[a>>2]=c&57343;d=1;break a}b:{c=(c&255)-194|0;if(c>>>0>50){break b}d=H[b+1|0];e=d>>>3|0;c=G[(c<<2)+97264>>2];if((e-16|(c>>26)+e)>>>0>7){break b}c=d-128|c<<6;if((c|0)>=0){G[a>>2]=c;d=2;break a}d=H[b+2|0]-128|0;if(d>>>0>63){break b}c=d|c<<6;if((c|0)>=0){G[a>>2]=c;d=3;break a}b=H[b+3|0]-128|0;if(b>>>0>63){break b}G[a>>2]=b|c<<6;d=4;break a}G[48624]=25;d=-1}return d}function rs(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=n|0;o=+o;var p=0,q=0,r=0,s=0;p=G[a>>2]+M(c,3)|0;e=p-2|0;a:{if(d){if(!je(a,0,e,d,e,f,g,g,g,l,m,g)){break a}if(je(a,0,p-1|0,d,e,f,g,g,g,j,k,g)){break a}h=+(n|0);i=(m-k)/h;h=(l-j)/h;n=(n|0)>0?n:0;e=0;while(1){if((e|0)==(n|0)){return 0}q=1;r=b+e|0;s=c+e|0;p=e;e=e+1|0;l=+(e|0);if(!je(a,r,s,d,p,f,g,g,g,l*h+j,l*i+k,g)){continue}break}break a}q=1;if(!je(a,0,e,1,e,f,g,g,g,l,m,g)){break a}q=(je(a,0,p-1|0,1,e,f,g,g,g,j,k,g)|0)!=0}return q|0}function rb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=a;a:{b:{c:{d:{if((e^b)&3){break d}d=(c|0)!=0;e:{if(!(b&3)|!c){break e}while(1){d=H[b|0];E[e|0]=d;if(!d){break a}e=e+1|0;c=c-1|0;d=(c|0)!=0;b=b+1|0;if(!(b&3)){break e}if(c){continue}break}}if(!d){break b}if(!H[b|0]){break a}if(c>>>0<4){break d}while(1){d=G[b>>2];if((d^-1)&d-16843009&-2139062144){break c}G[e>>2]=d;e=e+4|0;b=b+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break b}}while(1){d=H[b|0];E[e|0]=d;if(!d){break a}e=e+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}c=0}cb(e,0,c);return a|0}function bs(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(G[c+4>>2]!=104){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=84;E[c+2|0]=71;E[c+3|0]=0;E[c+4|0]=104;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=114.59155902616465;g=.008726646259971648;break a}f=f+f;g=1/f}G[c+1892>>2]=87;G[c+1888>>2]=88;L[c+112>>3]=f;L[c+120>>3]=g}f=Kb(b)+1;if(f!=0){b=L[c+112>>3]*Mb(b)/f;h=d,i=Kb(a)*b,L[h>>3]=i;h=e,i=Mb(a)*-b,L[h>>3]=i;c=0}else{c=2}return c|0}function Oi(a,b,c,d,e,f,g){var h=0,i=0,j=0,k=0,l=0;i=Fa-240|0;Fa=i;h=G[d>>2];G[i+232>>2]=h;d=G[d+4>>2];G[i>>2]=a;G[i+236>>2]=d;k=1;a:{b:{c:{if(!(d|(h|0)!=1)){d=a;break c}l=0-b|0;h=a;while(1){j=(e<<2)+g|0;d=h-G[j>>2]|0;if((Ja[c|0](d,a)|0)<=0){d=h;break c}d:{if(!((e|0)<2|f)){f=G[j-8>>2];j=h+l|0;if((Ja[c|0](j,d)|0)>=0){break d}if((Ja[c|0](j-f|0,d)|0)>=0){break d}}G[(k<<2)+i>>2]=d;h=i+232|0;f=ep(h);Pi(h,f);k=k+1|0;e=e+f|0;f=0;h=d;if(G[i+236>>2]|G[i+232>>2]!=1){continue}break b}break}d=h;break b}if(f){break a}}dp(b,i,k);Kk(d,b,c,e,g)}Fa=i+240|0}function qr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if(G[c+4>>2]!=401){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=73;E[c+2|0]=84;E[c+3|0]=0;E[c+4|0]=145;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=57.29577951308232}G[c+1892>>2]=125;G[c+1888>>2]=126;g=f+f;L[c+136>>3]=1/g;f=f*g;L[c+112>>3]=f;f=1/(f+f);L[c+120>>3]=f;L[c+128>>3]=f*.25}f=Mb(b);g=a*.5;a=V(L[c+112>>3]/(f*Mb(g)+1));h=d,i=Kb(g)*(f*(a+a)),L[h>>3]=i;h=e,i=a*Kb(b),L[h>>3]=i;return 0}function Md(a,b,c){var d=0,e=0;a=Ye(a,b);if(!a){return 0}a=a+(H[a|0]==35)|0;a:{if((Va(a)|0)>=82){rb(1285216,a,81);E[1285297]=0;break a}Za(1285216,a)}b:{if((ah(1285216)|0)!=2){break b}a=jb(1285216,68);if(a){E[a|0]=101}a=jb(1285216,100);if(a){E[a|0]=101}a=jb(1285216,69);if(!a){break b}E[a|0]=101}d=sb(1285216);e=d+.001;a=2147483647;c:{if(e>2147483647){break c}d:{if(d>=0){if(!(O(e)<2147483648)){break d}a=~~e;break c}d=d+-.001;a=-2147483648;if(d<-2147483648){break c}if(!(O(d)<2147483648)){break d}a=~~d;break c}a=-2147483648}G[c>>2]=a;return 1}function ej(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;a=Fa-96|0;Fa=a;yb(36671);G[a+92>>2]=20397;G[a+88>>2]=16234;G[a+84>>2]=17989;G[a+80>>2]=2807;G[a+76>>2]=3696;G[a+72>>2]=3870;G[a+68>>2]=5251;G[a+64>>2]=13594;kb(68979,a- -64|0);if(G[935653]>0){while(1){b=G[935658]+M(c,56)|0;d=L[b+8>>3];e=L[b>>3];f=G[b+52>>2];g=G[b+48>>2];h=L[b+40>>3];i=L[b+32>>3];j=L[b+24>>3];L[a+16>>3]=L[b+16>>3];L[a+24>>3]=j;L[a+32>>3]=i;L[a+40>>3]=h;G[a+48>>2]=g;G[a+52>>2]=f;L[a>>3]=e;L[a+8>>3]=d;gb(73773,a);c=c+1|0;if((c|0)>16;b=a&65535;if(!((b|0)!=65535|(a|0)>393215)){a=G[(d<<2)+189004>>2];return a?a+8|0:35897}c=92041;a:{b:{c:{d:{switch(d-1|0){case 0:a=189028;if(b>>>0<=1){break c}break a;case 1:a=189040;if(b>>>0<=49){break c}break a;case 3:if(!b){break b}break a;case 4:break d;default:break a}}a=189360;if(b>>>0>3){break a}}e:{if(!b){c=a;break e}while(1){e=H[a|0];c=a+1|0;a=c;if(e){continue}a=c;b=b-1|0;if(b){continue}break}}if((d|0)==1){break a}}if(!H[c|0]){break a}}return c}function Ei(a,b,c,d){var e=0;e=Fa-176|0;Fa=e;if(G[d>>2]<=0){G[e+172>>2]=0;E[b|0]=0;a:{if((Jg(a,e+80|0,e+172|0)|0)>0){break a}if(!nb(e+80|0,67945,10)){F[e+88>>1]=H[67997]|H[67998]<<8;a=H[67993]|H[67994]<<8|(H[67995]<<16|H[67996]<<24);G[e+80>>2]=H[67989]|H[67990]<<8|(H[67991]<<16|H[67992]<<24);G[e+84>>2]=a;a=e+172|0;mc(e+80|0,e,c,a);fd(e,b,a);if(!G[e+172>>2]){break a}E[b|0]=0;break a}c=G[a>>2];b=G[a+4>>2];if((c|0)!=G[b+76>>2]){mb(a,c+1|0,0,d);b=G[a+4>>2]}a=G[b+120>>2];c=G[b+124>>2]-(a>>>0<80)|0;G[b+120>>2]=a-80;G[b+124>>2]=c}}Fa=e+176|0}function Rf(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0;g=Fa-80|0;Fa=g;a:{if(G[e>>2]){break a}f=G[a>>2];b:{if(H[f|0]!=32){h=f;break b}while(1){h=f+1|0;G[a>>2]=h;i=H[f+1|0];f=h;if((i|0)==32){continue}break}}b=qc(h,b);if(!b){break a}f=lb(b+1|0,1);G[c>>2]=f;if(!f){Ua(48441);G[e>>2]=113;break a}e=G[a>>2];qb(f,e,b);G[a>>2]=b+e;c:{if(!d){break c}G[d>>2]=1;a=G[c>>2];if(jb(a,68)){a=rb(g,a,72);E[a+72|0]=0;c=jb(a,68);G[g+76>>2]=c;if(c){E[c|0]=69}}vb(a,g+76|0);if((H[G[g+76>>2]]|32)!=32){G[d>>2]=0}if(G[48624]!=68){break c}G[d>>2]=0}j=b}Fa=g+80|0;return j}function yq(a){var b=0,c=0,d=0,e=0;d=a+100|0;e=G[a+116>>2];a:{while(1){b:{c:{if(G[a+104>>2]){break c}b=-1;if((xq(a)|0)==-1){break a}if(G[a+104>>2]){break c}Vd(a,-5,22164);b=G[a+116>>2];break b}d:{e:{f:{g:{c=Ch(d);switch(c+4|0){case 1:break e;case 0:break f;case 2:case 6:break g;default:break d}}Vd(a,-2,4566);return-1}Vd(a,-4,3221);return-1}b=a;a=G[a+124>>2];Vd(b,-3,a?a:10829);return-1}b=G[a+116>>2];if(!b){break b}if((c|0)!=1){continue}}break}b=e-b|0;G[a>>2]=b;G[a+4>>2]=G[a+112>>2]-b;b=0;if((c|0)!=1){break a}G[a+48>>2]=0;b=0}return b}function Ut(a){a=a|0;var b=0,c=0,d=0,e=0;c=Fa-16|0;Fa=c;a:{if(!a){break a}e=G[a>>2];b:{if(H[a+5008|0]){Bq(c+12|0,a,0);if(!G[c+12>>2]){break b}Bq(0,a,1);break b}G[c+12>>2]=0;G[a+5060>>2]=0;c:{if(!H[a+5064|0]){break c}b=G[a+5044>>2];if(!b|G[b>>2]!=(a+5012|0)){break c}d=G[b+3148>>2];if(d){Ja[G[a+5052>>2]](G[a+5056>>2],d)}d=G[b+3152>>2];if(d){Ja[G[a+5052>>2]](G[a+5056>>2],d)}b=G[b+3156>>2];if(b){Ja[G[a+5052>>2]](G[a+5056>>2],b)}Ja[G[a+5052>>2]](G[a+5056>>2],G[a+5044>>2])}Wa(a)}if(G[30060]==(e|0)|G[29763]==(e|0)){break a}Hb(e)}Fa=c+16|0}function lc(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0;f=Fa-176|0;Fa=f;if(G[e>>2]<=0){a:{if(!c){E[f+98|0]=H[65204];F[f+96>>1]=H[65202]|H[65203]<<8;break a}E[f+96|0]=39;h=1;b:{c:{d:{g=Va(c);j=g>>>0<68?g:68;if(j){while(1){g=H[c+i|0];E[(f+96|0)+h|0]=g;e:{if((g|0)!=39){g=h;break e}g=h+1|0;E[g+(f+96|0)|0]=39}h=g+1|0;i=i+1|0;if(g>>>0<68&j>>>0>i>>>0){continue}break}if(g>>>0>7){break d}c=h}else{c=1}h=9;cb(c+(f+96|0)|0,32,9-c|0);break c}c=69;if((h|0)==70){break b}}E[(f+96|0)+h|0]=39;c=h+1|0}E[c+(f+96|0)|0]=0}Ob(b,f+96|0,d,f,e);wb(a,f,e)}Fa=f+176|0}function Hr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;j=G[c+4>>2];h=j>>31;a:{if(((h^j)-h|0)!=101){h=1;if(yj(c)){break a}}i=Mb(a);h=2;f=Mb(b);g=i*L[c+120>>3];k=f*g+(L[c+40>>3]+Kb(b));if(k==0){break a}f=f*L[c+112>>3]/k;l=d,m=Kb(a)*f,L[l>>3]=m;L[e>>3]=i*-f*L[c+128>>3];b:{if(G[c+4>>2]<=0){break b}if(L[c+152>>3]>b){break a}if(!(L[c+168>>3]>0)){break b}a=L[c+40>>3]/V(g*g+1);if(!(O(a)<=1)){break b}f=b;b=De(-g);g=Bc(a);a=b-g;i=a>90?a+-360:a;a=b+g+180;a=a>90?a+-360:a;if(f<(a>2]==301){f=L[c+24>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=70;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=45;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=57.29577951308232;h=1;break b}g=f*3.141592653589793/180;h=1/g}G[c+1892>>2]=99;G[c+1888>>2]=100;L[c+112>>3]=g;L[c+120>>3]=h}f=eb(b/f);if(f!=0){a=L[c+120>>3]*a/f}else{a=0}L[d>>3]=a;L[e>>3]=L[c+120>>3]*b;return 0}function Jn(a,b){var c=0,d=0,e=0,f=0;d=lb(511,1);if(!d){Ua(21335);return d}if(!fb(a,65400,4)){c=rb(d,b,255);b=Va(c);f=b&b>>31;while(1){a:{e=b;if((b|0)<=0){e=f;break a}b=e-1|0;if(H[c+b|0]!=47){continue}}break}E[c+e|0]=0;qb(c,a+4|0,255);return d}b:{if(jb(a,47)){break b}if(jb(a,36)){break b}c=rb(d,b,255);b=Va(c);f=b&b>>31;while(1){c:{e=b;if((b|0)<=0){e=f;break c}b=e-1|0;if(H[c+b|0]!=47){continue}}break}E[c+e|0]=0;qb(c,a,255);return d}if(!fb(a,34134,3)){a=rb(d,b,255);a=Va(a)+a|0;E[a-1|0]=120;a=a-3|0;E[a|0]=112;E[a+1|0]=105}return d}function Ao(a,b,c,d,e,f,g,h){var i=0;i=G[h>>2];if((i|0)<=0){a:{b:{switch(b-11|0){case 0:Sk(a,c,d,e,f,g,h);break a;case 1:Yo(a,c,d,e,f,g,h);break a;case 9:Vo(a,c,d,e,f,g,h);break a;case 10:Rk(a,c,d,e,f,g,h);break a;case 19:Po(a,c,d,e,f,g,h);break a;case 20:Fk(a,c,d,e,f,g,h);break a;case 29:To(a,c,d,e,f,g,h);break a;case 30:Mo(a,c,d,e,f,g,h);break a;case 69:Ro(a,c,d,e,f,g,h);break a;case 70:Gk(a,c,d,e,f,g,h);break a;case 31:Ho(a,c,d,e,f,g,h);break a;case 71:_o(a,c,d,e,f,g,h);break a;default:break b}}G[h>>2]=410}i=G[h>>2]}return i}function kh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0;g=Fa-1040|0;Fa=g;e=G[c>>2];if(!e){h=Za(g,a);f=h;while(1){a:{e=a;a=H[a|0];if((a|0)!=37){if(!a){break a}E[f|0]=a;a=e+1|0;f=f+1|0;continue}a=e+1|0;d=H[e+1|0];if(!d){continue}a=d-48|0;b:{if((a&255)>>>0<10){break b}if((d-65&255)>>>0<=5){a=d-55|0;break b}a=d-87|0}i=a<<4;E[f|0]=i;a=e+2|0;d=H[e+2|0];if(!d){continue}a=d-48|0;c:{if((a&255)>>>0<10){break c}if((d-65&255)>>>0<=5){a=d-55|0;break c}a=d-87|0}E[f|0]=a+i;a=e+3|0;f=f+1|0;continue}break}E[f|0]=0;Za(b,h);e=G[c>>2]}Fa=g+1040|0;return e}function Xr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]==108){f=L[c+112>>3];break a}G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=90;E[c+1|0]=69;E[c+2|0]=65;E[c+3|0]=0;E[c+4|0]=108;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=114.59155902616465;g=.008726646259971648;break b}f=f+f;g=1/f}G[c+1892>>2]=93;G[c+1888>>2]=94;L[c+112>>3]=f;L[c+120>>3]=g}b=f*Kb((90-b)*.5);h=d,i=b*Kb(a),L[h>>3]=i;h=e,i=Mb(a)*-b,L[h>>3]=i;return 0}function mt(a,b,c){a=a|0;b=b|0;c=c|0;b=H[c|0];E[1237232]=0;if(b){qb(1237232,c,1024);b=H[42189]|H[42190]<<8|(H[42191]<<16|H[42192]<<24);c=H[42185]|H[42186]<<8|(H[42187]<<16|H[42188]<<24);E[a+5|0]=c;E[a+6|0]=c>>>8;E[a+7|0]=c>>>16;E[a+8|0]=c>>>24;E[a+9|0]=b;E[a+10|0]=b>>>8;E[a+11|0]=b>>>16;E[a+12|0]=b>>>24;b=H[42184]|H[42185]<<8|(H[42186]<<16|H[42187]<<24);c=H[42180]|H[42181]<<8|(H[42182]<<16|H[42183]<<24);E[a|0]=c;E[a+1|0]=c>>>8;E[a+2|0]=c>>>16;E[a+3|0]=c>>>24;E[a+4|0]=b;E[a+5|0]=b>>>8;E[a+6|0]=b>>>16;E[a+7|0]=b>>>24}return 0}function Sc(a){var b=0,c=0,d=0,e=0,f=0,g=0;A(+a);b=v(1)|0;f=v(0)|0;e=b&2147483647;if(e>>>0>=1072693248){if(!(e-1072693248|f)){return(b|0)>0|(b|0)>=0?0:3.141592653589793}return 0/(a-a)}a:{if(e>>>0<=1071644671){d=1.5707963267948966;if(e>>>0<1012924417){break a}return 6123233995736766e-32-a*hh(a*a)-a+1.5707963267948966}if((b|0)<0){a=(a+1)*.5;c=V(a);a=1.5707963267948966-(c+(c*hh(a)+-6123233995736766e-32));return a+a}a=(1-a)*.5;c=V(a);g=c*hh(a);A(+c);b=v(1)|0;v(0)|0;x(0,0);x(1,b|0);d=a;a=+z();a=g+(d-a*a)/(c+a)+a;d=a+a}return d}function uf(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;var m=0,n=0;b=Fa+-64|0;Fa=b;if(!(j==0&k==0)){f=+G[a+32>>2];k=k/f;i=(i-+G[a+24>>2])/f+1;h=(h-+G[a+16>>2])/f+1;if(l>=360){while(1){l=l+-360;if(l>=360){continue}break}}l=l/180*3.141592653589793;g=ib(l);k=k*.5;l=eb(l);m=k*l;n=i-m;j=j/f*.5;f=g*j;L[b>>3]=n-f;g=k*g;j=j*l;k=h-j;L[b+32>>3]=g+k;L[b+40>>3]=k-g;i=i+m;L[b+8>>3]=i-f;h=h+j;L[b+48>>3]=h-g;L[b+16>>3]=f+i;L[b+56>>3]=g+h;L[b+24>>3]=f+n;Hj(a,0,c,d,e,b+32|0,b,4)}Fa=b- -64|0}function td(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=Fa-16|0;Fa=f;A(+b);g=v(1)|0;d=v(0)|0;c=g&2147483647;e=c+-1048576|0;a:{if((e|0)==2145386495|e>>>0<2145386495){h=d<<28;e=c>>>4|0;c=(c&15)<<28|d>>>4;d=e+1006632960|0;break a}if((c|0)==2146435072|c>>>0>2146435072){h=d<<28;c=(g&15)<<28|d>>>4;d=g>>>4|2147418112;break a}if(!(c|d)){c=0;d=0;break a}e=c;c=c?P(c):P(d)+32|0;od(f,d,e,0,0,c+49|0);i=G[f>>2];h=G[f+4>>2];e=15372-c<<16;c=G[f+8>>2];d=e|G[f+12>>2]^65536}G[a>>2]=i;G[a+4>>2]=h;G[a+8>>2]=c;G[a+12>>2]=g&-2147483648|d;Fa=f+16|0}function mf(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;d=Fa-32|0;Fa=d;f=1;c=L[467827];b=c*b;a=c*a;c=V(b*b+(a*a+1));if(!(!(c>3]=c;gb(73024,d+16|0);$a(G[29763])}if(!(c<=0)){b=b/c;f=1/c;a=a/c}c=L[467860]*b+(L[467858]*f+a*L[467859]);e=L[467854]*b+(L[467852]*f+a*L[467853]);a=L[467857]*b+(L[467855]*f+a*L[467856]);b=V(c*c+(e*e+a*a));if(!(!(b>3]=b;gb(73024,d);$a(G[29763])}if(!(b<=0)){c=c/b;e=e/b;a=a/b}b=Db(a,e);a=L[467827];L[467840]=b/a;g=3742728,h=fc(c)/a,L[g>>3]=h;Fa=d+32|0}function hj(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;if(G[321436]){e=G[24367];hb(88897,31,1,e);$a(e)}if(!H[3739720]){G[934934]=-1124855371;G[934935]=1064784320;G[934932]=-1571644103;G[934933]=1066524486;E[3739720]=1}G[c>>2]=0;G[c+4>>2]=0;G[d>>2]=0;G[d+4>>2]=0;if(L[23803]!=1949.9997905544149){L[23803]=1949.9997905544149;L[467468]=.016729604687785764;L[467469]=L[467466]*102.57769849393962}if(!(O(b)>89.999)){f=L[467468]*L[467467];g=L[467466];a=L[467469]-g*a;b=g*b;h=c,i=f*eb(a)/eb(b),L[h>>3]=i;a=ib(a);h=d,i=ib(b)*(f*a),L[h>>3]=i}}function Yh(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=G[b+4>>2];a:{if(G[b>>2]!=137){d=1;if(Aj(b)){break a}}if((e|0)>0){h=cb(c,0,e<<3);l=e&-2;m=e&1;i=G[b+20>>2];n=G[b+8>>2];while(1){b=g<<3;j=L[b+a>>3]-L[b+n>>3];b=0;d=g;c=0;if((e|0)!=1){while(1){f=b<<3;k=f+h|0;L[k>>3]=L[(d<<3)+i>>3]*j+L[k>>3];f=(f|8)+h|0;d=e+d|0;L[f>>3]=L[(d<<3)+i>>3]*j+L[f>>3];b=b+2|0;d=e+d|0;c=c+2|0;if((l|0)!=(c|0)){continue}break}}if(m){b=(b<<3)+h|0;L[b>>3]=L[(d<<3)+i>>3]*j+L[b>>3]}g=g+1|0;if((g|0)!=(e|0)){continue}break}}d=0}return d}function cs(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;if(G[c+4>>2]!=104){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=84;E[c+2|0]=71;E[c+3|0]=0;E[c+4|0]=104;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=114.59155902616465;g=.008726646259971648;break a}f=f+f;g=1/f}G[c+1892>>2]=87;G[c+1888>>2]=88;L[c+112>>3]=f;L[c+120>>3]=g}f=V(a*a+b*b);if(f!=0){a=Ac(a,-b)}else{a=0}L[d>>3]=a;a=De(f*L[c+120>>3]);L[e>>3]=90-(a+a);return 0}function Ne(a,b){var c=0,d=0,e=0;E[b|0]=0;while(1){d=a+c|0;e=H[d|0];if((e|0)!=32){a:{if(!e){break a}E[b|0]=37;Za(b+1|0,d+1|0);b:{c:{d:{e:{c=H[d|0];switch(c-65|0){case 8:break d;case 0:break e;default:break b}}a=Va(b)+b|0;E[a|0]=115;E[a+1|0]=0;break c}a=Va(b)+b|0;E[a|0]=46;E[a+1|0]=48;E[a+2|0]=102;E[a+3|0]=0}c=H[d|0]}if((c&255)==70){a=Va(b)+b|0;E[a|0]=102;E[a+1|0]=0;c=H[d|0]}if((c&255)==69){a=Va(b)+b|0;E[a|0]=69;E[a+1|0]=0;c=H[d|0]}if((c&255)!=68){break a}a=Va(b)+b|0;E[a|0]=69;E[a+1|0]=0}}else{c=c+1|0;continue}break}}function Qm(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;var l=0,m=0;l=G[a+8>>2];h=L[(l+M(c,168)|0)+8>>3];a:{if(g>3]=h)|!(L[(M(c,168)+l|0)+16>>3]>=g))){e=0;l=G[(M(c,168)+l|0)+24>>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}c=G[l+(c<<2)>>2];b:{if(!c){break b}while(1){if(!(+G[c+4>>2]<=f)){break b}e=e+1|0;c=G[c>>2];if(c){continue}break}}if((e&1)!=(d|0)){break a}if(!b){return 1}if(!d){return 1}G[a+12>>2]=b;return 1}m=!d}return m|0}function Wj(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;f=G[a+8>>2];a:{if(!f){a=G[a>>2];if((a|0)>0|(a|0)==-1e3){break a}return G[(G[309729]+M(a,-244)|0)+4>>2]}if((f|0)<=0){return 0}h=G[309729];i=G[309722];while(1){g=M(G[((d<<2)+a|0)+12>>2],344)+i|0;b=G[g>>2];b:{if((b|0)>0){b=Wj(g);if((b|0)<=0){c=c-b|0;break b}if(!c){c=1;e=b;break b}c=((b|0)!=(e|0))+c|0;break b}if((b|0)==-1e3){break b}b=G[(M(b,-244)+h|0)+4>>2];if(!c){c=1;e=b;break b}c=((b|0)!=(e|0))+c|0}d=d+1|0;if((f|0)!=(d|0)){continue}break}d=(c|0)==1?e:0-c|0}return d}function Tr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if(G[c+4>>2]!=204){G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=69;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=204;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break a}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=97;G[c+1888>>2]=98;L[c+112>>3]=f;L[c+120>>3]=g}h=2;if(!(b<=-90|b>=90)){L[d>>3]=L[c+112>>3]*a;i=e,j=L[c+24>>3]*oc(Xe((b+90)*.5)),L[i>>3]=j;h=0}return h|0}function Js(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;var k=0,l=0,m=0,n=0;if(j==0){return!d|0}l=G[a+8>>2];a:{if(d){e=M(c,168)+l|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){e=~~g}else{e=-2147483648}e=G[k+(e<<2)>>2];k=0;b:{if(!e){break b}k=0;if(!(L[m+8>>3]<=g)){break b}k=0;if(!(L[(M(c,168)+l|0)+16>>3]>=g)){break b}k=0;if(!(+G[e+4>>2]<=f)){break b}k=+G[G[e>>2]+4>>2]>=f}if((k|0)!=(d|0)){break a}n=1;if(!b|!d){break a}G[a+12>>2]=b}return n|0}function Cl(a){var b=0,c=0,d=0;b=a;a=Va(a);c=Ic(a+4096|0,1);Yb(b,c);a=H[(a+c|0)-1|0];if(!((a|0)==10|(a|0)==59)){a=Va(c)+c|0;E[a|0]=10;E[a+1|0]=0}a:{b:{c:{d:{b=Va(c);d=ab(b+2|0);if(d){if(b){break d}a=b+d|0;E[a|0]=0;E[a+1|0]=0;break c}qd(63716);W()}a=bb(d,c,b)+b|0;E[a|0]=0;E[a+1|0]=0;if(b>>>0>4294967293){break b}}a=ab(48);if(a){break a}qd(63911);W()}qd(63757);W()}G[a+20>>2]=0;G[a+8>>2]=d;G[a+4>>2]=d;G[a+12>>2]=b;G[a+40>>2]=0;G[a+44>>2]=0;G[a+24>>2]=0;G[a+28>>2]=1;G[a+16>>2]=b;G[a>>2]=0;Al(a);G[a+20>>2]=1;pb(c)}function Hn(a,b,c){var d=0,e=0,f=0;G[c>>2]=-1;a:{while(1){d=M(f,48)+757232|0;if(!G[d>>2]){e=f;break a}e=f+1|0;d=M(e,48)+757232|0;if(!G[d>>2]){break a}e=f+2|0;d=M(e,48)+757232|0;if(!G[d>>2]){break a}e=f+3|0;d=M(e,48)+757232|0;if(!G[d>>2]){break a}e=f+4|0;d=M(e,48)+757232|0;if(!G[d>>2]){break a}f=f+5|0;if((f|0)!=1e4){continue}break}return 103}G[c>>2]=e;G[d>>2]=a;c=M(e,48);G[c+757248>>2]=0;G[c+757240>>2]=b;b=G[b>>2];a=c+757256|0;G[a>>2]=0;G[a+4>>2]=0;a=c+757264|0;G[a>>2]=b;G[a+4>>2]=0;G[c+757252>>2]=0;return 0}function gp(a,b,c,d,e,f){var g=0;g=Fa+-64|0;Fa=g;a:{if(G[f>>2]>0){break a}G[g+48>>2]=0;G[g+40>>2]=0;G[g+44>>2]=0;b:{if(Nk(g+8|0,1,0)){break b}G[g+12>>2]=b;G[g+8>>2]=a;G[g+20>>2]=G[c>>2];G[g+24>>2]=G[d>>2];c:{while(1){d:{a=Mk(g+8|0,4);if(a){if((a|0)==1){break d}break c}a=Ja[17](G[c>>2],G[d>>2]+28800|0)|0;G[c>>2]=a;if(a){G[g+24>>2]=28800;b=a;a=G[d>>2];G[g+20>>2]=b+a;G[d>>2]=a+28800;continue}else{ff(g+8|0);break b}}break}if(e){G[e>>2]=G[g+28>>2]}if(ff(g+8|0)){break b}break a}ff(g+8|0)}G[f>>2]=413}Fa=g- -64|0}function Zr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]==106){f=L[c+112>>3];break a}G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=82;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=106;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break b}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=91;G[c+1888>>2]=92;L[c+112>>3]=f;L[c+120>>3]=g}b=(90-b)*f;h=d,i=b*Kb(a),L[h>>3]=i;h=e,i=Mb(a)*-b,L[h>>3]=i;return 0}function Sd(a,b,c,d){var e=0,f=0,g=0;e=G[d>>2];if((e|0)<=0){a:{if(!b){b=G[a>>2];e=G[a+4>>2];if((b|0)!=G[e+76>>2]){mb(a,b+1|0,0,d);e=G[a+4>>2];b=G[e+76>>2]}b=G[e+96>>2]+(b<<3)|0;a=G[b+4>>2];G[e+120>>2]=G[b>>2];G[e+124>>2]=a;if(!c){break a}E[c|0]=0;break a}if((b|0)<=0){break a}f=G[a>>2];e=G[a+4>>2];if((f|0)!=G[e+76>>2]){mb(a,f+1|0,0,d);e=G[a+4>>2];f=G[e+76>>2]}g=M(b,80)-80|0;b=G[e+96>>2]+(f<<3)|0;f=g+G[b>>2]|0;b=G[b+4>>2]+(g>>31)|0;G[e+120>>2]=f;G[e+124>>2]=f>>>0>>0?b+1|0:b;Jg(a,c,d)}e=G[d>>2]}return e}function eg(a,b,c,d,e,f){var g=0,h=0,i=0,j=0;a:{if(f&64){c=f+-64|0;b=c&31;if((c&63)>>>0>=32){c=0;b=e>>>b|0}else{c=e>>>b|0;b=((1<>>b}d=0;e=0;break a}if(!f){break a}i=d;h=64-f|0;g=h&31;if((h&63)>>>0>=32){h=i<>>32-g|e<>>0>=32){g=0;b=c>>>b|0}else{g=c>>>b|0;b=((1<>>b}b=j|b;c=g|h;g=d;d=f&31;if((f&63)>>>0>=32){h=0;d=e>>>d|0}else{h=e>>>d|0;d=((1<>>d}e=h}G[a>>2]=b;G[a+4>>2]=c;G[a+8>>2]=d;G[a+12>>2]=e}function Tl(){var a=0,b=0,c=0,d=0,e=0;a:{a=Gg(19818,61);if((a|0)!=19818){a=a-19818|0;if(H[a+19818|0]){break a}}b:{c:{a=Gg(19818,61);if((a|0)!=19818){e=a-19818|0;if(!H[e+19818|0]){break c}}G[48624]=28;break b}b=G[50361];d:{if(!b){break d}d=G[b>>2];if(!d){break d}a=b;while(1){c=a;e:{f:{if(fb(19818,d,e)){break f}a=G[c>>2];if(H[a+e|0]!=61){break f}bj(a,0);break e}if((b|0)!=(c|0)){G[b>>2]=G[c>>2]}b=b+4|0}a=c+4|0;d=G[c+4>>2];if(d){continue}break}if((a|0)==(b|0)){break d}G[b>>2]=0}}return}Ul(19818,a,0)}function Hs(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=h|0;var i=0,j=0;h=G[a+8>>2];i=L[(h+M(c,168)|0)+8>>3];a:{if(g>3]=i)|!(L[(M(c,168)+h|0)+16>>3]>=g))){e=0;h=G[(M(c,168)+h|0)+24>>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}c=G[h+(c<<2)>>2];b:{if(!c){break b}while(1){if(!(+G[c+4>>2]<=f)){break b}e=e+1|0;c=G[c>>2];if(c){continue}break}}if((e&1)!=(d|0)){break a}if(!b){return 1}if(!d){return 1}G[a+12>>2]=b;return 1}j=!d}return j|0}function _r(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;if(G[c+4>>2]!=106){G[c+16>>2]=0;G[c+20>>2]=1079410688;G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=65;E[c+1|0]=82;E[c+2|0]=67;E[c+3|0]=0;E[c+4|0]=106;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;f=L[c+24>>3];a:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break a}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=91;G[c+1888>>2]=92;L[c+112>>3]=f;L[c+120>>3]=g}f=V(a*a+b*b);if(f!=0){a=Ac(a,-b)}else{a=0}L[d>>3]=a;L[e>>3]=90-f*L[c+120>>3];return 0}function dj(a){var b=0,c=0,d=0,e=0;b=G[935824];if((b|0)>=1024){hb(72855,42,1,G[24367]);return}G[935824]=b+1;e=Xb(256);G[(G[935824]<<2)+3743308>>2]=e;b=0;while(1){c=b+3743040|0;E[b+e|0]=H[c|0];E[c|0]=0;d=b|1;c=d+3743040|0;E[e+d|0]=H[c|0];E[c|0]=0;d=b|2;c=d+3743040|0;E[e+d|0]=H[c|0];E[c|0]=0;d=b|3;c=d+3743040|0;E[e+d|0]=H[c|0];E[c|0]=0;b=b+4|0;if((b|0)!=256){continue}break}a:{if(!a){break a}b=H[a|0];if(!b){break a}while(1){E[(b<<24>>24)+3743040|0]=1;b=H[a+1|0];a=a+1|0;if(b){continue}break}}}function _i(a){var b=0,c=0;b=Fa-32|0;Fa=b;a=a?a:92041;c=G[24367];a:{if(H[3780288]){G[b+20>>2]=3780288;G[b+16>>2]=a;Tb(c,69475,b+16|0);break a}G[b>>2]=a;Tb(c,68751,b)}a=G[945062];b:{if(!a){break b}c=a+(G[945063]<<2)|0;a=G[c>>2];if(!a){break b}G[a+16>>2]=0;E[G[a+4>>2]]=0;E[G[a+4>>2]+1|0]=0;G[a+44>>2]=0;G[a+28>>2]=1;G[a+8>>2]=G[a+4>>2];if((a|0)!=G[c>>2]){break b}a=G[c>>2];G[950324]=G[a+16>>2];a=G[a+8>>2];G[945070]=a;G[945064]=a;G[945057]=G[G[c>>2]>>2];E[3780260]=H[a|0]}E[3801300]=1;Fa=b+32|0}function $a(a){var b=0,c=0,d=0;if(!a){if(G[47480]){b=$a(G[47480])}if(G[47442]){b=$a(G[47442])|b}a=G[48750];if(a){while(1){if(G[a+20>>2]!=G[a+28>>2]){b=$a(a)|b}a=G[a+56>>2];if(a){continue}break}}return b}d=G[a+76>>2]>=0;a:{b:{if(G[a+20>>2]==G[a+28>>2]){break b}Ja[G[a+36>>2]](a,0,0)|0;if(G[a+20>>2]){break b}b=-1;break a}b=G[a+8>>2];c=G[a+4>>2];if((b|0)!=(c|0)){b=c-b|0;Ja[G[a+40>>2]](a,b,b>>31,1)|0}b=0;G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;G[a+4>>2]=0;G[a+8>>2]=0;if(!d){break a}}return b}function Rr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]==301){f=L[c+112>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=83;E[c+1|0]=70;E[c+2|0]=76;E[c+3|0]=0;E[c+4|0]=45;E[c+5|0]=1;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break b}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=99;G[c+1888>>2]=100;L[c+112>>3]=f;L[c+120>>3]=g}h=d,i=f*a*Mb(b),L[h>>3]=i;L[e>>3]=L[c+112>>3]*b;return 0}function cp(a,b,c){var d=0,e=0;d=G[48828];e=G[48827];if((d|0)<(e|0)){E[a+d|0]=c>>>24;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=c>>>16;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=c>>>8;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=c;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=(c&16777215)<<8|b>>>24;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=(c&65535)<<16|b>>>16;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=(c&255)<<24|b>>>8;d=d+1|0;G[48828]=d}if((d|0)<(e|0)){E[a+d|0]=b;G[48828]=d+1}}function Ur(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;a:{if(G[c+4>>2]==204){f=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=77;E[c+1|0]=69;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=204;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;break b}g=f*3.141592653589793/180;f=1/g}G[c+1892>>2]=97;G[c+1888>>2]=98;L[c+112>>3]=g;L[c+120>>3]=f}L[d>>3]=f*a;a=De(af(b/L[c+24>>3]));L[e>>3]=a+a+-90;return 0}function Jl(a){var b=0,c=0,d=0,e=0;a:{if(!a){break a}c=G[936854];if(!c){break a}b=c;while(1){b:{d=G[b+4>>2];e=Sb(d,a);c:{if(!e){break c}if((Va(e)|0)!=(Va(a)|0)){break c}if((d|0)==(e|0)|H[((d^-1)+e|0)+d|0]==47){break b}}b=G[b>>2];if(b){continue}break a}break}if(G[936855]==(b|0)){G[936855]=0}d:{e:{if((b|0)==(c|0)){a=3747416;break e}while(1){a=c;if(!a){break d}c=G[a>>2];if((c|0)!=(b|0)){continue}break}}G[a>>2]=G[b>>2];d=G[b+4>>2]}pb(d);pb(G[b+16>>2]);a=G[b+12>>2];if(a){Hb(a)}pb(b)}}function Uj(){var a=0,b=0,c=0,d=0;b=Fa-32|0;Fa=b;a:{b:{c=G[309704];c:{if(!c){a=ab(4);G[309704]=a;if(!a){break b}G[a>>2]=0;G[309739]=1;G[309705]=0;break c}a=G[309739];if(J[309705]>>0){break c}d=a+8|0;c=ub(c,d<<2);G[309704]=c;if(!c){break a}a=c+(a<<2)|0;G[a>>2]=0;G[a+4>>2]=0;G[a+24>>2]=0;G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;G[a+8>>2]=0;G[a+12>>2]=0;G[309739]=d}Fa=b+32|0;return}G[b>>2]=64090;_a(G[24367],70017,b);ca(2);W()}G[b+16>>2]=64090;_a(G[24367],70017,b+16|0);ca(2);W()}function od(a,b,c,d,e,f){var g=0,h=0,i=0;a:{if(f&64){d=b;e=f+-64|0;b=e&31;if((e&63)>>>0>=32){e=d<>>32-b|c<>>0>=32){h=g<>>32-d|e<>>0>=32){e=0;b=c>>>d|0}else{e=c>>>d|0;b=((1<>>d}d=i|b;e=e|h;b=f&31;if((f&63)>>>0>=32){h=g<>>32-b|c<>2]=b;G[a+4>>2]=c;G[a+8>>2]=d;G[a+12>>2]=e}function Wq(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=Fa-32|0;Fa=e;G[e+16>>2]=b;d=G[a+48>>2];G[e+20>>2]=c-((d|0)!=0);f=G[a+44>>2];G[e+28>>2]=d;G[e+24>>2]=f;a:{b:{d=ha(G[a+60>>2],e+16|0,2,e+12|0)|0;if(d){G[48624]=d;d=-1}else{d=0}if(d){b=32}else{d=G[e+12>>2];if((d|0)>0){break b}b=d?32:16}G[a>>2]=b|G[a>>2];break a}g=d;f=G[e+20>>2];if(f>>>0>=d>>>0){break a}d=G[a+44>>2];G[a+4>>2]=d;G[a+8>>2]=d+(g-f|0);if(G[a+48>>2]){G[a+4>>2]=d+1;E[(b+c|0)-1|0]=H[d|0]}g=c}Fa=e+32|0;return g|0}function $l(a,b){var c=0,d=0,e=0,f=0;f=Fa-16|0;Fa=f;e=G[934941];if(e){Wa(e)}d=le(5330);c=H[d|0];if(c){e=d;while(1){c=c<<24>>24;if(c-65>>>0<26){E[e|0]=c-65>>>0<26?c|32:c}c=H[e+1|0];e=e+1|0;if(c){continue}break}}c=0;G[934941]=d;e=nc(d,f+12|0,10);d=G[f+12>>2];a:{if(H[d|0]?0:d){break a}d=G[934941];b:{if(!Xa(d,31900)){break b}if(!Xa(d,5330)){c=1;break b}if(!Xa(d,17538)){c=2;break b}e=-1;if(Xa(d,16674)){break a}c=3}e=G[(a<<4|c<<2)+156736>>2]+((a|0)==1&(b|0)!=0)|0}Fa=f+16|0;return e}function Me(a,b){var c=0,d=0,e=0;c=Fa-32|0;G[c+24>>2]=0;G[c+28>>2]=0;G[c+16>>2]=0;G[c+20>>2]=0;G[c+8>>2]=0;G[c+12>>2]=0;G[c>>2]=0;G[c+4>>2]=0;d=H[b|0];if(!d){return 0}if(!H[b+1|0]){b=a;while(1){c=b;b=c+1|0;if(H[c|0]==(d|0)){continue}break}return c-a|0}while(1){e=c+(d>>>3&28)|0;G[e>>2]=G[e>>2]|1<>>3&28)>>2]>>>d&1)){break a}d=H[b+1|0];b=b+1|0;if(d){continue}break}}return b-a|0}function oq(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0;f=Fa-256|0;Fa=f;a:{if(G[e>>2]>0){break a}F[f+176>>1]=40;g=f+96|0;If(L[c>>3],-15,g,e);b:{if((Va(f+176|0)+Va(g)|0)-69>>>0<=4294967224){break b}h=f+96|0;g=Gb(f+176|0,h);i=Va(g)+g|0;j=H[67812]|H[67813]<<8;E[i|0]=j;E[i+1|0]=j>>>8;E[i+2|0]=H[67814];If(L[c+8>>3],-15,h,e);if((Va(g)+Va(h)|0)-70>>>0<=4294967224){break b}c=Gb(g,f+96|0);g=Va(c)+c|0;E[g|0]=41;E[g+1|0]=0;Ob(b,c,d,f,e);wb(a,f,e);break a}Ua(56359);G[e>>2]=402}Fa=f+256|0}function Sp(a,b){if(!a){return 0}a:{b:{if(a){if(b>>>0<=127){break b}c:{if(!G[G[48787]>>2]){if((b&-128)==57216){break b}break c}if(b>>>0<=2047){E[a+1|0]=b&63|128;E[a|0]=b>>>6|192;a=2;break a}if(!((b&-8192)!=57344&b>>>0>=55296)){E[a+2|0]=b&63|128;E[a|0]=b>>>12|224;E[a+1|0]=b>>>6&63|128;a=3;break a}if(b-65536>>>0<=1048575){E[a+3|0]=b&63|128;E[a|0]=b>>>18|240;E[a+2|0]=b>>>6&63|128;E[a+1|0]=b>>>12&63|128;a=4;break a}}G[48624]=25;a=-1}else{a=1}break a}E[a|0]=b;a=1}return a}function pq(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0;f=Fa-256|0;Fa=f;a:{if(G[e>>2]>0){break a}F[f+176>>1]=40;g=f+96|0;hg(K[c>>2],-7,g,e);b:{if((Va(f+176|0)+Va(g)|0)-69>>>0<=4294967224){break b}h=f+96|0;g=Gb(f+176|0,h);i=Va(g)+g|0;j=H[67812]|H[67813]<<8;E[i|0]=j;E[i+1|0]=j>>>8;E[i+2|0]=H[67814];hg(K[c+4>>2],-7,h,e);if((Va(g)+Va(h)|0)-70>>>0<=4294967224){break b}c=Gb(g,f+96|0);g=Va(c)+c|0;E[g|0]=41;E[g+1|0]=0;Ob(b,c,d,f,e);wb(a,f,e);break a}Ua(62641);G[e>>2]=402}Fa=f+256|0}function ok(a,b,c,d,e){var f=0,g=0;if(G[e>>2]<=0){a:{g=G[a>>2];f=G[a+4>>2];b:{if((g|0)!=G[f+76>>2]){if((mb(a,g+1|0,0,e)|0)<=0){break b}break a}if((G[f+128>>2]&G[f+132>>2])!=-1){break b}if((Rb(a,e)|0)>0){break a}}if(b){f=G[a+4>>2];f=G[f+96>>2]+(G[f+76>>2]<<3)|0;g=G[f+4>>2];G[b>>2]=G[f>>2];G[b+4>>2]=g}if(c){b=G[a+4>>2];f=G[b+132>>2];G[c>>2]=G[b+128>>2];G[c+4>>2]=f}if(!d){break a}a=G[a+4>>2];a=(G[a+76>>2]<<3)+G[a+96>>2]|0;b=G[a+12>>2];G[d>>2]=G[a+8>>2];G[d+4>>2]=b}}}function Wr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;a:{if(G[c+4>>2]==203){f=L[c+120>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=203;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;g=1;f=1;break b}g=f*3.141592653589793/180;f=1/g}G[c+1892>>2]=95;G[c+1888>>2]=96;L[c+112>>3]=g;L[c+120>>3]=f}L[d>>3]=f*a;L[e>>3]=L[c+120>>3]*b;return 0}function Vr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;a:{if(G[c+4>>2]==203){f=L[c+112>>3];break a}G[c+8>>2]=0;G[c+12>>2]=0;E[c|0]=67;E[c+1|0]=65;E[c+2|0]=82;E[c+3|0]=0;E[c+4|0]=203;E[c+5|0]=0;E[c+6|0]=0;E[c+7|0]=0;G[c+16>>2]=0;G[c+20>>2]=0;f=L[c+24>>3];b:{if(f==0){G[c+24>>2]=442745336;G[c+28>>2]=1078765020;f=1;g=1;break b}f=f*3.141592653589793/180;g=1/f}G[c+1892>>2]=95;G[c+1888>>2]=96;L[c+112>>3]=f;L[c+120>>3]=g}L[d>>3]=f*a;L[e>>3]=L[c+112>>3]*b;return 0}function Vi(a,b,c){var d=0,e=0;d=(c|0)!=0;a:{b:{c:{if(!(a&3)|!c){break c}e=b&255;while(1){if((e|0)==H[a|0]){break b}c=c-1|0;d=(c|0)!=0;a=a+1|0;if(!(a&3)){break c}if(c){continue}break}}if(!d){break a}}d:{if(!(H[a|0]==(b&255)|c>>>0<4)){d=M(b&255,16843009);while(1){e=d^G[a>>2];if((e^-1)&e-16843009&-2139062144){break d}a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}b=b&255;while(1){if((b|0)==H[a|0]){return a}a=a+1|0;c=c-1|0;if(c){continue}break}}return 0}function ed(a,b,c,d,e,f,g,h,i){var j=0,k=0,l=0,m=0;h=Au(b,c,h,i);i=Ia;j=h;h=Au(d,e,f,g);e=j+h|0;d=Ia+i|0;i=e;h=i>>>0>>0?d+1|0:d;j=i;k=g;e=0;l=c;d=0;i=Au(g,e,c,d);g=j+i|0;c=Ia+h|0;j=g;g=g>>>0>>0?c+1|0:c;h=f;i=b;f=Au(h,0,i,0);b=Ia;c=0;d=Au(h,c,l,d);b=b+d|0;c=Ia+c|0;c=b>>>0>>0?c+1|0:c;h=c;c=c+j|0;d=g;d=c>>>0>>0?d+1|0:d;h=c;c=d;d=Au(i,m,k,e)+b|0;e=Ia;e=b>>>0>d>>>0?e+1|0:e;g=a;i=e;h=i+h|0;G[g+8>>2]=h;G[g+12>>2]=h>>>0>>0?c+1|0:c;G[g>>2]=f;G[g+4>>2]=d}function As(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;var j=0,k=0,l=0;j=G[a+8>>2];a:{if(d){e=0;k=j+M(c,168)|0;if(L[k+8>>3]>g|L[k+16>>3]>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}c=G[l+(c<<2)>>2];b:{if(!c){break b}h=L[j+8>>3];c:{if(O(h)<2147483648){j=~~h;break c}j=-2147483648}if(+(j|0)!=g){break b}k=+G[c+4>>2]==f}if((d|0)!=(k|0)){break a}e=1;if(!b|!d){break a}G[a+12>>2]=b}return e|0}function yk(a,b,c,d,e){var f=0,g=0;f=Fa-384|0;Fa=f;g=G[e>>2];a:{if((g|0)>0){break a}E[f+224|0]=0;E[f+304|0]=0;b:{c:{if((Cf(a,b,f+304|0,f+224|0,f+144|0,e)|0)>0){break c}if(Xa(f+304|0,c)){G[e>>2]=208}if(!Xa(d,f+224|0)){break c}G[e>>2]=209;break b}g=G[e>>2];if((g|0)<=0){break a}}G[f+32>>2]=b;a=f+48|0;Ya(a,81,44742,f+32|0);Ua(a);G[f+20>>2]=d;G[f+16>>2]=c;Ya(a,81,4384,f+16|0);Ua(a);G[f+4>>2]=f+224;G[f>>2]=f+304;Ya(a,81,9122,f);Ua(a);g=G[e>>2]}Fa=f+384|0;return g}function Td(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;e=G[d>>2];if((e|0)<=0){e=G[a>>2];if((e|0)!=G[G[a+4>>2]+76>>2]){mb(a,e+1|0,0,d)}f=G[a+4>>2];if(b){g=b;e=G[f+104>>2];b=G[f+96>>2]+(G[f+76>>2]<<3)|0;a=G[b>>2];h=g,i=Bu(e-a|0,G[f+108>>2]-(G[b+4>>2]+(a>>>0>e>>>0)|0)|0,80,0),G[h>>2]=i}a=G[f+128>>2];e=G[f+132>>2];a:{b:{if((a&e)==-1){a=-1;if(c){break b}break a}if(!c){break a}b=G[f+104>>2];a=Bu(a-b|0,e-(G[f+108>>2]+(a>>>0>>0)|0)|0,80,0)-1|0}G[c>>2]=a}e=G[d>>2]}return e}function Ul(a,b,c){var d=0,e=0,f=0;a:{b:{d=G[50361];c:{if(!d){d=0;break c}e=G[d>>2];if(e){break b}}b=0;break a}f=b+1|0;b=0;while(1){if(!fb(a,e,f)){b=G[d>>2];G[d>>2]=a;bj(b,c);return}b=b+1|0;e=G[d+4>>2];d=d+4|0;if(e){continue}break}d=G[50361]}f=b<<2;e=f+8|0;d:{e:{if(G[935755]==(d|0)){d=ub(d,e);if(d){break e}break d}d=ab(e);if(!d){break d}if(b){bb(d,G[50361],f)}Wa(G[935755])}b=(b<<2)+d|0;G[b>>2]=a;G[b+4>>2]=0;G[50361]=d;G[935755]=d;if(c){bj(0,c)}return}Wa(c)}function th(a,b,c,d,e){var f=0,g=0;f=Fa-384|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f+224|0]=0;E[f+304|0]=0;a:{if((Cf(a,b,f+304|0,f+224|0,f+144|0,e)|0)>0){break a}g=208;b:{if(Xa(f+304|0,c)){break b}yi(f+224|0,d,e);g=209;if(G[e>>2]>0){break b}a=G[d+4>>2];if((a|0)>0|(a|0)>=0){break a}}G[e>>2]=g;G[f+32>>2]=b;a=f+48|0;Ya(a,81,44864,f+32|0);Ua(a);G[f+16>>2]=c;Ya(a,81,29582,f+16|0);Ua(a);G[f+4>>2]=f+224;G[f>>2]=f+304;Ya(a,81,9122,f);Ua(a)}g=G[e>>2]}Fa=f+384|0;return g} -function mn(a,b,c){var d=0,e=0,f=0,g=0;e=Va(b);d=Va(c);f=ab(((d|0)<(e|0)?e:d)+1|0);a:{b:{if((d|0)>(e|0)){g=d-e|0;if(g){cb(f,48,g)}if(!e){d=g;b=f;break b}bb(f+g|0,b,e);b=f;break b}if((d|0)>=(e|0)){break a}g=e-d|0;if(g){cb(f,48,g)}if(d){bb(f+g|0,c,d);c=e}else{c=g}d=c;c=f}E[d+f|0]=0}d=H[b|0];if(d){while(1){e=H[c|0];d=d&255;E[a|0]=(d|0)==120?120:(e|0)==120?120:(d|0)==49?(e|0)==49?49:48:48;a=a+1|0;c=c+1|0;d=H[b+1|0];b=b+1|0;if(d){continue}break}}Wa(f);E[a|0]=0}function qi(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0;d=ab(40);if(G[a>>2]>0){f=10;while(1){b=G[a+4>>2]+M(g,168)|0;a:{if(G[b+4>>2]!=11){break a}c=G[b+52>>2];if(H[b|0]){Wa(c);break a}b=0;if((e|0)>0){while(1){b:{h=G[(b<<2)+d>>2];b=b+1|0;if((e|0)<=(b|0)){break b}if((c|0)!=(h|0)){continue}}break}if((c|0)==(h|0)){break a}}Wa(c);if((f|0)==(e|0)){d=ub(d,f<<3);f=f<<1}G[(e<<2)+d>>2]=c;e=e+1|0}g=g+1|0;if((g|0)>2]){continue}break}}c=G[a+4>>2];if(c){Wa(c)}Wa(a);Wa(d)}function ln(a,b,c){var d=0,e=0,f=0,g=0;e=Va(b);d=Va(c);f=ab(((d|0)<(e|0)?e:d)+1|0);a:{b:{if((d|0)>(e|0)){g=d-e|0;if(g){cb(f,48,g)}if(!e){d=g;b=f;break b}bb(f+g|0,b,e);b=f;break b}if((d|0)>=(e|0)){break a}g=e-d|0;if(g){cb(f,48,g)}if(d){bb(f+g|0,c,d);c=e}else{c=g}d=c;c=f}E[d+f|0]=0}d=H[b|0];if(d){while(1){e=H[c|0];d=d&255;E[a|0]=(d|0)==49?49:(e|0)==49?49:(d|0)==48?48:(e|0)==48?48:120;a=a+1|0;c=c+1|0;d=H[b+1|0];b=b+1|0;if(d){continue}break}}Wa(f);E[a|0]=0}function Xl(){var a=0;a=Fa-96|0;Fa=a;yb(20356);yb(13586);L[a+80>>3]=L[467787];L[a+88>>3]=L[467788];gb(71518,a+80|0);yb(4674);L[a+64>>3]=L[467794];L[a+72>>3]=L[467795];gb(71456,a- -64|0);L[a+48>>3]=L[467801];L[a+56>>3]=L[467802];gb(71456,a+48|0);L[a+32>>3]=L[467808];L[a+40>>3]=L[467809];gb(71456,a+32|0);L[a+16>>3]=L[467787];L[a+24>>3]=L[467788];gb(71456,a+16|0);L[a>>3]=L[467815];L[a+8>>3]=L[467816];gb(71518,a);yb(49020);yb(40576);yb(4674);Fa=a+96|0}function Dr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;f=G[c+4>>2];g=f>>31;a:{if(((g^f)-g|0)!=107){f=1;if(wj(c)){break a}}b=(90-b)*3.141592653589793/180;h=((((((((((b*0+L[c+104>>3])*b+L[c+96>>3])*b+L[c+88>>3])*b+L[c+80>>3])*b+L[c+72>>3])*b+L[c- -64>>3])*b+L[c+56>>3])*b+L[c+48>>3])*b+L[c+40>>3])*b+L[c+32>>3])*L[c+24>>3];i=d,j=h*Kb(a),L[i>>3]=j;i=e,j=Mb(a)*-h,L[i>>3]=j;if(G[c+4>>2]>0){f=2;if(b>L[c+112>>3]){break a}}f=0}return f|0}function kl(a,b,c){var d=0,e=0,f=0;if(G[c>>2]<=0){a:{if(!a){E[b+2|0]=H[65204];a=H[65202]|H[65203]<<8;E[b|0]=a;E[b+1|0]=a>>>8;break a}E[b|0]=39;c=1;b:{c:{d:{d=Va(a);f=d>>>0<68?d:68;if(f){while(1){d=a+e|0;E[b+c|0]=H[d|0];e:{if(H[d|0]!=39){d=c;break e}d=c+1|0;E[d+b|0]=39}c=d+1|0;e=e+1|0;if(d>>>0<68&f>>>0>e>>>0){continue}break}if(d>>>0>7){break d}a=c}else{a=1}c=9;cb(a+b|0,32,9-a|0);break c}a=69;if((c|0)==70){break b}}E[b+c|0]=39;a=c+1|0}E[a+b|0]=0}}}function Ds(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;var l=0,m=0;l=G[a+8>>2];a:{if(d){e=M(c,168)+l|0;if(L[e+8>>3]>g|L[e+16>>3]>2];if(O(g)<2147483648){c=~~g}else{c=-2147483648}c=G[l+(c<<2)>>2];b:{if(!c){break b}e=1;g=+G[c+4>>2];if(g==f){break b}e=0;c=G[c>>2];if(!c|!(f>=g)){break b}e=+G[c+4>>2]>=f}if((d|0)!=(e|0)){break a}m=1;if(!b|!d){break a}G[a+12>>2]=b}return m|0}function Zi(a,b){var c=0,d=0;a:{b:{if(!b){break b}b=E[b|0];if(!b){break b}c=b-33|0;if((b|0)==124|(1<>>0<=29:0)){break a}}if((a|0)<=0){return 0}d=G[950332];c:{while(1){b=a;a=b-1|0;c=G[(a<<2)+d>>2];d:{if(!c){break d}c=G[c+24>>2];if(!c){break d}if(!Xa(c,64753)){break d}if(Xa(c,64244)){break c}}if(b>>>0>1){continue}break}return 0}a=E[(Va(c)+c|0)-1|0];b=a-33|0;if((1<>>0<=29:0)|(a|0)==124){break a}return 1}return 0}function Um(a,b,c,d){var e=0,f=0;e=Fa-32|0;Fa=e;G[e+8>>2]=0;G[e+12>>2]=0;G[e>>2]=0;G[e+4>>2]=0;G[e+28>>2]=G[a>>2]+1;G[d>>2]=0;Qd(a,e+24|0,d);G[d>>2]=0;f=G[e+24>>2];de(a,(f|0)<4?f:4,e,d);G[d>>2]=0;a:{if(G[e+28>>2]!=1|(G[e>>2]?G[e+24>>2]:0)){break a}b:{if(b){b=le(b);f=pc(b,68332);if(f){while(1){Je(a,-1,f,0,d);if(!G[d>>2]){break b}G[d>>2]=0;f=pc(0,68332);if(f){continue}break}}Wa(b)}mb(a,2,e+20|0,d);break a}Wa(b)}Dc(a,c,d);Fa=e+32|0;return a}function Kn(a,b){var c=0,d=0,e=0,f=0;e=lb(161,1);a:{if(e){while(1){d=H[(b+c|0)+a|0];E[c+e|0]=(d-1&255)>>>0<31?32:d;f=c|1;d=H[(f+b|0)+a|0];E[e+f|0]=(d-1&255)>>>0<31?32:d;c=c+2|0;if((c|0)!=160){continue}break}break a}Ua(23559)}b:{a=lb(80,1);if(!a){Ua(23507);break b}b=!H[e|0];c=0;while(1){d=b+e|0;E[a+c|0]=H[d|0];E[a+(c|1)|0]=H[d+2|0];E[a+(c|2)|0]=H[d+4|0];f=c|3;if((f|0)==79){break b}E[a+f|0]=H[d+6|0];c=c+4|0;b=b+8|0;continue}}Wa(e);return a}function Af(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;a:{if((b|0)<=0){break a}if(b-1>>>0>=3){i=b&-4;while(1){d=f<<1;e=d+a|0;c=I[e>>1];F[e>>1]=c<<8|c>>>8;e=(d|2)+a|0;c=I[e>>1];F[e>>1]=c<<8|c>>>8;e=(d|4)+a|0;c=I[e>>1];F[e>>1]=c<<8|c>>>8;c=(d|6)+a|0;d=I[c>>1];F[c>>1]=d<<8|d>>>8;f=f+4|0;g=g+4|0;if((i|0)!=(g|0)){continue}break}}d=b&3;if(!d){break a}while(1){c=(f<<1)+a|0;b=I[c>>1];F[c>>1]=b<<8|b>>>8;f=f+1|0;h=h+1|0;if((d|0)!=(h|0)){continue}break}}}function no(a,b,c,d,e){var f=0,g=0;f=Fa-384|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f+224|0]=0;E[f+304|0]=0;a:{if((Cf(a,b,f+304|0,f+224|0,f+144|0,e)|0)>0){break a}g=208;b:{if(Xa(f+304|0,c)){break b}ue(f+224|0,d,e);g=209;if(G[e>>2]>0){break b}if(G[d>>2]>=0){break a}}G[e>>2]=g;G[f+32>>2]=b;a=f+48|0;Ya(a,81,44803,f+32|0);Ua(a);G[f+16>>2]=c;Ya(a,81,29582,f+16|0);Ua(a);G[f+4>>2]=f+224;G[f>>2]=f+304;Ya(a,81,9122,f);Ua(a)}g=G[e>>2]}Fa=f+384|0;return g}function Gg(a,b){var c=0,d=0;a:{d=b&255;if(d){if(a&3){while(1){c=H[a|0];if(!c|(c|0)==(b&255)){break a}a=a+1|0;if(a&3){continue}break}}c=G[a>>2];b:{if((c^-1)&c-16843009&-2139062144){break b}d=M(d,16843009);while(1){c=c^d;if((c^-1)&c-16843009&-2139062144){break b}c=G[a+4>>2];a=a+4|0;if(!(c-16843009&(c^-1)&-2139062144)){continue}break}}while(1){c=a;d=H[c|0];if(d){a=c+1|0;if((d|0)!=(b&255)){continue}}break}return c}return Va(a)+a|0}return a}function zm(a,b,c){var d=0,e=0,f=0,g=0;d=Fa-144|0;Fa=d;e=b<0;b=Yc(e?-b:b,360);b=e?-b:b;b=b<=-180?b+360:b;e=c+4|0;a:{if((c|0)>0){G[d+20>>2]=c;G[d+16>>2]=e;c=d+136|0;db(c,18611,d+16|0);L[d>>3]=b;Eb(d- -64|0,c,d);break a}G[d+48>>2]=e;db(d+136|0,29735,d+48|0);if(O(b)<2147483648){c=~~b}else{c=-2147483648}G[d+32>>2]=c;db(d- -64|0,d+136|0,d+32|0)}b:{if((Va(d- -64|0)|0)<31){Za(a,d- -64|0);break b}f=rb(a,d- -64|0,31),g=0,E[f+31|0]=g}Fa=d+144|0}function Zn(a,b,c,d){var e=0,f=0,g=0,h=0,i=0;f=G[d>>2];if((f|0)<=0){f=G[G[a+4>>2]+96>>2]+(b<<3)|0;a:{if((Jb(a,G[f>>2],G[f+4>>2],0,d)|0)>0){break a}e=G[a+4>>2];h=G[e+76>>2];G[e+76>>2]=b;i=G[e+104>>2];f=G[e+108>>2];g=G[e+88>>2];G[a>>2]=b;G[e+88>>2]=(b|0)<(g|0)?g:b;b=G[e+44>>2];G[e+104>>2]=G[e+40>>2];G[e+108>>2]=b;if((Wf(a,c,d)|0)<=0){break a}b=G[a+4>>2];G[b+76>>2]=h;G[a>>2]=h;G[b+104>>2]=i;G[b+108>>2]=f;G[b+88>>2]=g}f=G[d>>2]}return f}function og(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=Fa-96|0;Fa=e;c=Za(e+6|0,c);d=Va(c);if((d|0)<=7){while(1){f=Va(c)+c|0;E[f|0]=32;E[f+1|0]=0;d=d+1|0;if((d|0)!=8){continue}break}}d=Va(c)+c|0;E[d|0]=61;E[d+1|0]=0;d=1;a=Sb(a,c);a:{if(!a){break a}c=jb(a,61);if(!c){break a}while(1){d=H[c+1|0];a=c+1|0;c=a;if((d|0)==32){continue}break}d=1;c=qc(a,68332);if((c|0)>79){break a}d=0;a=rb(e+16|0,a,c);E[a+c|0]=0;g=b,h=sb(a),L[g>>3]=h}Fa=e+96|0;return d}function Vh(a,b,c){var d=0,e=0,f=0,g=0,h=0;e=Fa-96|0;Fa=e;c=Za(e+6|0,c);d=Va(c);if((d|0)<=7){while(1){f=Va(c)+c|0;E[f|0]=32;E[f+1|0]=0;d=d+1|0;if((d|0)!=8){continue}break}}d=Va(c)+c|0;E[d|0]=61;E[d+1|0]=0;d=1;a=Sb(a,c);a:{if(!a){break a}c=jb(a,61);if(!c){break a}while(1){d=H[c+1|0];a=c+1|0;c=a;if((d|0)==32){continue}break}d=1;c=qc(a,68332);if((c|0)>79){break a}d=0;a=rb(e+16|0,a,c);E[a+c|0]=0;g=b,h=_b(a),G[g>>2]=h}Fa=e+96|0;return d}function ke(a,b){var c=0,d=0,e=0,f=0,g=0,h=0;a:{if((b|0)<=0){break a}if((b|0)!=1){h=b&-2;while(1){d=e<<2;c=d+a|0;f=H[c+3|0];E[c+3|0]=H[c|0];E[c|0]=f;f=H[c+1|0];E[c+1|0]=H[c+2|0];E[c+2|0]=f;c=(d|4)+a|0;d=H[c+3|0];E[c+3|0]=H[c|0];E[c|0]=d;d=H[c+1|0];E[c+1|0]=H[c+2|0];E[c+2|0]=d;e=e+2|0;g=g+2|0;if((h|0)!=(g|0)){continue}break}}if(!(b&1)){break a}a=(e<<2)+a|0;b=H[a+3|0];E[a+3|0]=H[a|0];E[a|0]=b;b=H[a+1|0];E[a+1|0]=H[a+2|0];E[a+2|0]=b}}function ad(a){var b=0,c=0;c=jb(a,58);a:{b:{if(!c){break b}b=jb(a,59);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,47);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,63);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,64);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,38);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,61);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,43);if(b>>>0<=c>>>0?b:0){break b}b=jb(a,36);if(b>>>0<=c>>>0?b:0){break b}a=jb(a,44);b=1;if(!a|a>>>0>c>>>0){break a}}b=0}return b}function mg(a){var b=0,c=0,d=0,e=0;b=Va(a);while(1){e=b;b=b-1|0;if(H[a+e|0]==32){continue}break}b=0;while(1){a:{switch(H[a+b|0]-32|0){case 0:case 11:b=b+1|0;continue;default:break a}}break}while(1){c=b;b=b+1|0;d=E[a+c|0];if(d-48>>>0<10){continue}break}b=c+((d|0)==46)|0;while(1){c=b;b=b+1|0;d=E[a+c|0];if(d-48>>>0<10){continue}break}b=(d&255|32)==101?b:c;while(1){c=b;b=b+1|0;if(E[a+c|0]-48>>>0<10){continue}break}return(c|0)==(e|0)}function Ir(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=G[c+4>>2];i=f>>31;a:{if(((i^f)-i|0)!=101){f=1;if(yj(c)){break a}}g=L[c+136>>3]*b;h=V(a*a+g*g);b:{if(h==0){G[d>>2]=0;G[d+4>>2]=0;a=90;break b}j=d,k=Ac(a,-g),L[j>>3]=k;g=L[c+40>>3];a=h/(b*L[c+144>>3]+L[c+112>>3]);b=Ac(1,a);a=g*a/V(a*a+1);f=2;if(O(a)>1){break a}g=Bc(a);a=b-g;h=a>90?a+-360:a;a=b+g+180;a=a>90?a+-360:a;a=a>3]=a;f=0}return f|0}function $e(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){var p=0,q=0;q=G[310142];if((q|0)<0){Ua(65667);Ua(43041);return 122}if(q>>>0<=30){if(!a){return 121}p=M(q,84)+1240576|0;rb(p,a,20);G[p+80>>2]=o;G[p+76>>2]=n;G[p+72>>2]=m;G[p+68>>2]=l;G[p+64>>2]=k;G[p+60>>2]=j;G[p+56>>2]=i;G[p+52>>2]=h;G[p+48>>2]=g;G[p+44>>2]=f;G[p+40>>2]=0;G[p+36>>2]=e;G[p+32>>2]=d;G[p+28>>2]=c;G[p+24>>2]=b;G[p+20>>2]=0;E[p+19|0]=0;G[310142]=q+1;a=0}else{a=122}return a}function sh(a,b,c){var d=0,e=0,f=0;a:{if(!b){b=0;while(1){d=G[a+4>>2];e=d+(b<<2)|0;if(!(G[e+1256>>2]<0|!G[e+1416>>2])){Hg(d,b,c)}b=b+1|0;if((b|0)!=40){continue}break}break a}d=G[a+4>>2];b=0;while(1){e=b<<2;f=e+d|0;if(!(G[f+1256>>2]<0|!G[f+1416>>2])){Hg(d,b,c);d=G[a+4>>2]}G[(d+e|0)+1256>>2]=-1;b=b+1|0;if((b|0)!=40){continue}break}}if(G[c>>2]!=112){a=G[a+4>>2];b=G[(M(G[a+4>>2],84)+1240576|0)+68>>2];if(b){Ja[b|0](G[a>>2])|0}}}function ni(a,b){var c=0,d=0,e=0,f=0;d=Va(a);c=Va(b);e=ab(((c|0)<(d|0)?d:c)+1|0);a:{b:{if((c|0)>(d|0)){f=c-d|0;if(f){cb(e,48,f)}if(!d){c=f;a=e;break b}bb(e+f|0,a,d);a=e;break b}if((c|0)>=(d|0)){break a}f=d-c|0;if(f){cb(e,48,f)}if(c){bb(e+f|0,b,c);b=d}else{b=f}c=b;b=e}E[c+e|0]=0}while(1){c=H[a|0];if(!c){Wa(e);return 1}d=H[b|0];if(!((c|0)==48&(d|0)==49)){a=a+1|0;b=b+1|0;if((c|0)!=49|(d|0)!=48){continue}}break}Wa(e);return 0}function Zm(a,b,c,d,e){var f=0,g=0,h=0,i=0;h=-1;f=d&2147483647;i=f;g=(f|0)==2147418112;a:{if(g&!c?a|b:g&(c|0)!=0|f>>>0>2147418112){break a}f=e&2147483647;g=(f|0)==2147418112;if(g?0:g&0|f>>>0>2147418112){break a}if(!(a|c|(f|i|b))){return 0}f=d&e;if((f|0)>0|(f|0)>=0){if(!c&(d|0)==(e|0)?0:(d|0)<(e|0)){break a}return(a|c|(d^e|b))!=0}if(!c&(d|0)==(e|0)?a|b:(c|0)!=0&(d|0)>=(e|0)|(d|0)>(e|0)){break a}h=(a|c|(d^e|b))!=0}return h}function Aq(a){var b=0,c=0;b=G[a+32>>2];c=ab(b<<1);G[a+36>>2]=c;a:{if(!c){break a}if(G[a+44>>2]){G[a+28>>2]=b;return 0}b=ab(b);G[a+40>>2]=b;if(!b){Wa(c);break a}G[a+140>>2]=0;G[a+132>>2]=0;G[a+136>>2]=0;if(Nk(a+100|0,G[a+72>>2],G[a+76>>2])){Wa(G[a+40>>2]);Wa(G[a+36>>2]);break a}G[a+100>>2]=0;b=G[a+32>>2];G[a+28>>2]=b;if(!G[a+44>>2]){G[a+116>>2]=b;b=G[a+40>>2];G[a+112>>2]=b;G[a+4>>2]=b}return 0}Vd(a,-4,3221);return-1} -function Za(a,b){var c=0,d=0;d=a;a:{b:{if((d^b)&3){c=H[b|0];break b}if(b&3){while(1){c=H[b|0];E[d|0]=c;if(!c){break a}d=d+1|0;b=b+1|0;if(b&3){continue}break}}c=G[b>>2];if((c^-1)&c-16843009&-2139062144){break b}while(1){G[d>>2]=c;c=G[b+4>>2];d=d+4|0;b=b+4|0;if(!(c-16843009&(c^-1)&-2139062144)){continue}break}}E[d|0]=c;if(!(c&255)){break a}while(1){c=H[b+1|0];E[d+1|0]=c;d=d+1|0;b=b+1|0;if(c){continue}break}}return a}function ts(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=l|0;var m=0,n=0,o=0,p=0,q=0;m=(G[a>>2]+M(c,3)|0)-2|0;a:{if(d){if(!re(a,0,m,d,e,f,g,h,i,j,k)){break a}k=(k-j)/+(l|0);m=(l|0)>0?l:0;l=0;while(1){if((l|0)==(m|0)){return 0}n=1;o=b+l|0;p=c+l|0;q=+(l|0)*k+j;l=l+1|0;if(!re(a,o,p,d,e,f,g,h,i,q,+(l|0)*k+j)){continue}break}break a}n=!re(a,0,m,1,e,f,g,h,i,j,k)}return n|0}function nr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;a:{if(G[c+4>>2]!=502){f=1;if(vj(c)){break a}}g=L[c+128>>3]-b;b=V(a*a+g*g);b=L[c+40>>3]<0?-b:b;if(b!=0){a=Ac(a/b,g/b)}else{a=0}L[d>>3]=a*L[c+120>>3];a=-90;b:{if(O(b-L[c+176>>3])<1e-12){break b}b=(L[c+160>>3]-b*b)*L[c+168>>3];if(O(b)>1){a=90;if(O(b+-1)<1e-12){break b}f=2;a=-90;if(O(b+1)<1e-12){break b}break a}a=Bc(b)}L[e>>3]=a;f=0}return f|0}function eb(a){var b=0,c=0,d=0;b=Fa-16|0;Fa=b;A(+a);d=v(1)|0;v(0)|0;d=d&2147483647;a:{if(d>>>0<=1072243195){c=1;if(d>>>0<1044816030){break a}c=jh(a,0);break a}c=a-a;if(d>>>0>=2146435072){break a}b:{switch($j(a,b)&3){case 0:c=jh(L[b>>3],L[b+8>>3]);break a;case 1:c=-ih(L[b>>3],L[b+8>>3],1);break a;case 2:c=-jh(L[b>>3],L[b+8>>3]);break a;default:break b}}c=ih(L[b>>3],L[b+8>>3],1)}a=c;Fa=b+16|0;return a}function Ub(a,b){var c=0,d=0;c=G[b+76>>2];if(!((c|0)>=0&(!c|G[48769]!=(c&-1073741825)))){a:{d=a&255;if((d|0)==G[b+80>>2]){break a}c=G[b+20>>2];if((c|0)==G[b+16>>2]){break a}G[b+20>>2]=c+1;E[c|0]=a;return}vh(b,d);return}c=G[b+76>>2];G[b+76>>2]=c?c:1073741823;b:{c:{d=a&255;if((d|0)==G[b+80>>2]){break c}c=G[b+20>>2];if((c|0)==G[b+16>>2]){break c}G[b+20>>2]=c+1;E[c|0]=a;break b}vh(b,d)}G[b+76>>2]=0}function uo(){var a=0,b=0,c=0,d=0,e=0,f=0;a=0;a:{if(G[49098]){break a}a=lb(1e4,4);G[49098]=a;if(!a){return 113}b=1;while(1){f=(c<<2)+a|0;b=b*16807;d=b/2147483647;b:{if(O(d)<2147483648){e=~~d;break b}e=-2147483648}b=+(e|0)*-2147483647+b;K[f>>2]=b/2147483647;c=c+1|0;if((c|0)!=1e4){continue}break}if(O(b)<2147483648){c=~~b}else{c=-2147483648}a=0;if((c|0)==1043618065){break a}Ua(25400);a=1}return a}function Cd(a,b,c){var d=0,e=0;a:{e=G[309723];if((e|0)==G[309724]){d=G[309722];b:{if(d){G[309724]=e<<1;d=ub(d,M(e,688));break b}G[309724]=100;d=ab(34400)}if(!d){break a}G[309722]=d;e=G[309723]}G[309723]=e+1;if((e|0)>=0){d=G[309722]+M(e,344)|0;G[d+52>>2]=a;G[d+8>>2]=0;G[d>>2]=-1e3;G[d+4>>2]=0;bb(d+88|0,b,c);G[d- -64>>2]=1;G[d+56>>2]=1;G[d+60>>2]=1;G[d+84>>2]=0}return e}G[309737]=113;return-1}function ib(a){var b=0,c=0;b=Fa-16|0;Fa=b;A(+a);c=v(1)|0;v(0)|0;c=c&2147483647;a:{if(c>>>0<=1072243195){if(c>>>0<1045430272){break a}a=ih(a,0,0);break a}if(c>>>0>=2146435072){a=a-a;break a}b:{switch($j(a,b)&3){case 0:a=ih(L[b>>3],L[b+8>>3],1);break a;case 1:a=jh(L[b>>3],L[b+8>>3]);break a;case 2:a=-ih(L[b>>3],L[b+8>>3],1);break a;default:break b}}a=-jh(L[b>>3],L[b+8>>3])}Fa=b+16|0;return a}function jo(a,b,c){var d=0,e=0,f=0;f=Fa-16|0;Fa=f;e=G[a>>2];d=G[a+4>>2];a:{b:{if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);break b}if((G[d+128>>2]&G[d+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}d=G[a+4>>2];c:{if(!G[d+80>>2]){vd(a,2,f+12|0,0,0,c);a=112320/(G[f+12>>2]/10|0)|0;break c}e=G[d+960>>2];a=G[d+964>>2];c=e>>>0>1&(a|0)>=0|(a|0)>0;a=Du(112320,0,c?e:1,c?a:0);a=a?a:1}G[b>>2]=a}Fa=f+16|0}function mh(a,b,c,d,e,f){var g=0;g=G[f>>2];if((g|0)<=0){if(c){Eg(a,c,f)}a:{if(!d|G[f>>2]>0){break a}c=G[a>>2];g=G[a+4>>2];b:{if((c|0)!=G[g+76>>2]){mb(a,c+1|0,0,f);break b}if((G[g+128>>2]&G[g+132>>2])!=-1){break b}if((Rb(a,f)|0)>0){break a}}c=G[a+4>>2];if(!G[c+80>>2]){G[d>>2]=G[c+136>>2];break a}if(G[c+1088>>2]){G[d>>2]=G[c+1108>>2];break a}G[f>>2]=233}if(e){de(a,b,e,f)}g=G[f>>2]}return g}function bk(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=M(a,24);g=d+202496|0;h=d+202512|0;a:{if(G[h>>2]==1){f=d+202504|0;d=f;i=G[d+4>>2];d=G[d>>2];e=116;if(zf(G[g>>2],d,d>>31,0)){break a}G[f>>2]=d;G[f+4>>2]=i}e=106;if((hb(b,1,c,G[g>>2])|0)!=(c|0)){break a}a=M(a,24)+202504|0;d=a;b=c+G[d>>2]|0;a=G[d+4>>2]+(c>>31)|0;G[d>>2]=b;G[d+4>>2]=b>>>0>>0?a+1|0:a;G[h>>2]=2;e=0}return e|0}function Qk(a,b,c){var d=0,e=0,f=0;d=G[c+16>>2];a:{if(!d){if(el(c)){break a}d=G[c+16>>2]}f=G[c+20>>2];if(d-f>>>0>>0){return Ja[G[c+36>>2]](c,a,b)|0}b:{if(G[c+80>>2]<0){d=0;break b}e=b;while(1){d=e;if(!d){d=0;break b}e=d-1|0;if(H[e+a|0]!=10){continue}break}e=Ja[G[c+36>>2]](c,a,d)|0;if(e>>>0>>0){break a}a=a+d|0;b=b-d|0;f=G[c+20>>2]}bb(f,a,b);G[c+20>>2]=G[c+20>>2]+b;e=b+d|0}return e}function Lb(){var a=0,b=0,c=0;a=G[950330];b=G[950331];if((a|0)>=(b|0)){a:{if(!b){G[950331]=1024;a=Xb(4096);break a}a=b+1024|0;G[950331]=a;a=lf(G[950332],a<<2)}G[950332]=a;c=G[950331];if((b|0)<(c|0)){cb(a+(b<<2)|0,0,c-b<<2)}a=G[950330]}b:{if(a){b=a-1|0;a=G[G[950332]+(b<<2)>>2];if(!G[a+24>>2]){break b}}a=Ic(1,60);b=G[950330];G[G[950332]+(b<<2)>>2]=a;G[950330]=b+1}G[a+20>>2]=0;G[a>>2]=b}function Ej(a,b,c){var d=0,e=0,f=0;if(!c){return 0}d=H[a|0];a:{if(!d){break a}while(1){b:{e=H[b|0];if(!e){break b}c=c-1|0;if(!c){break b}c:{if((d|0)==(e|0)){break c}e=d-65>>>0<26?d|32:d;d=H[b|0];if((e|0)==((d-65>>>0<26?d|32:d)|0)){break c}f=H[a|0];break a}b=b+1|0;d=H[a+1|0];a=a+1|0;if(d){continue}break a}break}f=d}a=f&255;c=a-65>>>0<26?a|32:a;a=H[b|0];return c-(a-65>>>0<26?a|32:a)|0}function zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0;g=M(b,c);e=G[d+72>>2];G[d+72>>2]=e-1|e;e=G[d+4>>2];f=G[d+8>>2];if((e|0)==(f|0)){e=g}else{h=e;e=f-e|0;e=e>>>0>>0?e:g;bb(a,h,e);G[d+4>>2]=e+G[d+4>>2];a=a+e|0;e=g-e|0}if(e){while(1){a:{if(!si(d)){f=Ja[G[d+32>>2]](d,a,e)|0;if(f){break a}}return(g-e>>>0)/(b>>>0)|0}a=a+f|0;e=e-f|0;if(e){continue}break}}return(b?c:0)|0}function ki(a,b){var c=0,d=0,e=0,f=0;a:{if((a|0)%25|0){c=G[309730];break a}b:{if(a){c=a+25|0;e=1238916,f=ub(G[309729],M(c,244)),G[e>>2]=f;c=ub(G[309730],M(c,124));d=G[309729];break b}d=ab(6100);G[309729]=d;c=ab(3100)}G[309730]=c;if(c?d:0){break a}if(d){Wa(d);c=G[309730]}if(c){Wa(c)}G[309729]=0;G[309730]=0;G[b>>2]=113;return 113}a=M(a,124)+c|0;G[a+116>>2]=0;G[a+120>>2]=0;return 0}function Vd(a,b,c){var d=0,e=0,f=0;d=Fa-16|0;Fa=d;e=G[a+96>>2];if(e){if(G[a+92>>2]!=-4){Wa(e)}G[a+96>>2]=0}a:{switch(b+5|0){default:G[a>>2]=0;break;case 0:case 5:break a}}G[a+92>>2]=b;b:{if(!c|(b|0)==-4){break b}b=G[a+24>>2];e=ab((Va(b)+Va(c)|0)+3|0);G[a+96>>2]=e;if(!e){G[a+92>>2]=-4;break b}a=Va(b);f=Va(c);G[d+8>>2]=c;G[d+4>>2]=67697;G[d>>2]=b;Ya(e,(a+f|0)+3|0,8738,d)}Fa=d+16|0}function Ms(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;pn(c,d);a=G[309737];if(!a){a:{b=G[309722];a=G[309725];e=b+M(a,344)|0;b:{if(G[e>>2]!=-1e3){if((d|0)<=0){break a}a=b+M(a,344)|0;b=a;e=G[a+88>>2];a=0;while(1){if(!(H[G[b+84>>2]+a|0]|!H[a+e|0])){c=a+c|0;break b}a=a+1|0;if((d|0)!=(a|0)){continue}break}break a}if(!H[e+88|0]){break a}}G[g>>2]=c;return-1}a=0}return a|0}function rf(a,b,c,d,e){var f=0,g=0;f=Fa-16|0;Fa=f;c=E[c|0];a:{b:{if((c|0)<=63){a=Ye(a,b);c=0;if(!a){break a}if((Va(a)|0)<(d|0)){Za(e,a);break b}if((d|0)>=2){rb(e,a,d-1|0);break b}E[e|0]=H[a|0];break b}g=Za(f,b);b=g+Va(b)|0;E[b|0]=c;E[b+1|0]=0;a=Ye(a,g);c=0;if(!a){break a}if((Va(a)|0)<(d|0)){Za(e,a);break b}if((d|0)>=2){rb(e,a,d-1|0);break b}E[e|0]=H[a|0]}c=1}Fa=f+16|0;return c}function yg(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=G[309722];c=d+M(a,344)|0;e=G[c+8>>2];if((e|0)>0){while(1){i=b;g=G[c+52>>2];h=(f<<2)+c|0;b=G[h+12>>2];if((g|0)!=G[(M(b,344)+d|0)+52>>2]){b=Fb(g,0,b);G[h+12>>2]=b;if((b|0)<0){return-1}e=G[c+8>>2];d=G[309722]}b=i+G[(M(b,344)+d|0)+56>>2]|0;f=f+1|0;if((e|0)>(f|0)){continue}break}}G[c+56>>2]=b;G[c- -64>>2]=b;G[c+60>>2]=1;return a}function xs(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=n|0;o=+o;var p=0,q=0;b=G[a>>2]+M(c,3)|0;uf(a,0,b-2|0,d,e,m,m,h,i,l,m,o);uf(a,b,b-1|0,d,e,m,m,h,i,j,k,o);if((n|0)>0){f=m-k;m=+(n|0);f=f/m;g=(l-j)/m;b=0;while(1){p=b;q=b+c|0;l=m;b=b+1|0;m=+(b|0);uf(a,p,q,d,e,l,l,h,i,m*g+j,m*f+k,o);if((b|0)!=(n|0)){continue}break}}}function ws(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=+l;m=+m;n=n|0;o=+o;var p=0,q=0;b=G[a>>2]+M(c,3)|0;tf(a,0,b-2|0,d,e,m,m,h,i,l,m,o);tf(a,b,b-1|0,d,e,m,m,h,i,j,k,o);if((n|0)>0){f=m-k;m=+(n|0);f=f/m;g=(l-j)/m;b=0;while(1){p=b;q=b+c|0;l=m;b=b+1|0;m=+(b|0);tf(a,p,q,d,e,l,l,h,i,m*g+j,m*f+k,o);if((b|0)!=(n|0)){continue}break}}}function vb(a,b){var c=0,d=0,e=0,f=0,g=0,h=0,i=0;d=Fa-16|0;Fa=d;c=Fa-160|0;Fa=c;G[c+60>>2]=a;G[c+20>>2]=a;G[c+24>>2]=-1;e=c+16|0;te(e,0,0);Jm(c,e,1,1);f=G[c+8>>2];g=G[c+12>>2];h=G[c>>2];e=G[c+4>>2];if(b){G[b>>2]=((G[c+20>>2]+G[c+136>>2]|0)-G[c+60>>2]|0)+a}G[d+8>>2]=f;G[d+12>>2]=g;G[d>>2]=h;G[d+4>>2]=e;Fa=c+160|0;i=Ui(G[d>>2],G[d+4>>2],G[d+8>>2],G[d+12>>2]);Fa=d+16|0;return i}function df(){var a=0,b=0,c=0,d=0,e=0;a=G[50359];a:{if((a|0)<=0){break a}if(a-1>>>0>=3){e=a&-4;while(1){b=c<<2;E[G[b+199296>>2]]=0;E[G[(b|4)+199296>>2]]=0;E[G[(b|8)+199296>>2]]=0;E[G[(b|12)+199296>>2]]=0;c=c+4|0;d=d+4|0;if((e|0)!=(d|0)){continue}break}}b=a&3;if(!b){break a}a=0;while(1){E[G[(c<<2)+199296>>2]]=0;c=c+1|0;a=a+1|0;if((b|0)!=(a|0)){continue}break}}G[50359]=0}function vi(a,b,c,d){var e=0,f=0;a:{if((d|0)!=1){break a}e=G[a+8>>2];if(!e){break a}f=b;e=e-G[a+4>>2]|0;b=b-e|0;c=c-((e>>31)+(e>>>0>f>>>0)|0)|0}b:{if(G[a+20>>2]!=G[a+28>>2]){Ja[G[a+36>>2]](a,0,0)|0;if(!G[a+20>>2]){break b}}G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;Ja[G[a+40>>2]](a,b,c,d)|0;if((Ia|0)<0){break b}G[a+4>>2]=0;G[a+8>>2]=0;G[a>>2]=G[a>>2]&-17;return 0}return-1}function zg(a){var b=0,c=0,d=0;a:{b=G[309723];if((b|0)==G[309724]){c=G[309722];b:{if(c){G[309724]=b<<1;b=ub(c,M(b,688));break b}G[309724]=100;b=ab(34400)}if(!b){break a}G[309722]=b;b=G[309723]}G[309723]=b+1;if((b|0)>=0){c=G[309722];d=G[(c+M(a,344)|0)+52>>2];c=c+M(b,344)|0;G[c+12>>2]=a;G[c+8>>2]=1;G[c+52>>2]=d;G[c+4>>2]=21;G[c>>2]=123}return b}G[309737]=113;return-1}function wl(a){var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=Fa-32|0;Fa=b;c=Gq(G[a+24>>2]+131072|0);d=Gq(G[a+16>>2]+131086|0);e=G[a+8>>2];f=G[a+12>>2];g=G[a+4>>2];h=G[a>>2];G[b+24>>2]=G[a+20>>2]+1900;i=b,j=Fu(h,g),G[i+16>>2]=j;G[b+20>>2]=Ia;G[b+4>>2]=d;G[b>>2]=c;i=b,j=Fu(e,f),G[i+8>>2]=j;G[b+12>>2]=Ia;if((Ya(3809680,26,75077,b)|0)>=26){W()}Fa=b+32|0;return 3809680}function Vn(a){var b=0,c=0;b=Va(a);if(!(H[a|0]!=39|H[(a+b|0)-1|0]!=39)){b=b-2|0;if((b|0)>0){yd(a,a+1|0,b)}E[a+b|0]=0}a:{b:{b=Va(a)-1|0;if((b|0)<=0){break b}while(1){if(H[a+c|0]!=32){break b}c=c+1|0;if((c|0)!=(b|0)){continue}break}break a}if((b|0)==(c|0)|(b|0)<0){break a}while(1){c=a+b|0;if(H[c|0]!=32){break a}E[c|0]=0;c=(b|0)>0;b=b-1|0;if(c){continue}break}}}function ze(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-96|0;Fa=d;a:{if(G[c>>2]>0){break a}e=Va(b);if((e|0)<=0){break a}g=H[66554];h=H[66546]|H[66547]<<8|(H[66548]<<16|H[66549]<<24);i=H[66550]|H[66551]<<8|(H[66552]<<16|H[66553]<<24);while(1){E[d+8|0]=g;G[d>>2]=h;G[d+4>>2]=i;wb(a,qb(d,b+f|0,72),c);f=f+72|0;j=e>>>0>72;e=e-72|0;if(j){continue}break}}Fa=d+96|0}function id(){var a=0;a=G[47463];if(!((a|0)>=0&(!a|G[48769]!=(a&-1073741825)))){a:{if(G[47464]==10){break a}a=G[47449];if((a|0)==G[47448]){break a}G[47449]=a+1;E[a|0]=10;return}vh(189776,10);return}a=G[47463];G[47463]=a?a:1073741823;b:{c:{if(G[47464]==10){break c}a=G[47449];if((a|0)==G[47448]){break c}G[47449]=a+1;E[a|0]=10;break b}vh(189776,10)}G[47463]=0}function Pg(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=Fa-96|0;Fa=d;a:{if(G[c>>2]>0){break a}e=Va(b);if((e|0)<=0){break a}g=H[66595];h=H[66587]|H[66588]<<8|(H[66589]<<16|H[66590]<<24);i=H[66591]|H[66592]<<8|(H[66593]<<16|H[66594]<<24);while(1){E[d+8|0]=g;G[d>>2]=h;G[d+4>>2]=i;wb(a,qb(d,b+f|0,72),c);f=f+72|0;j=e>>>0>72;e=e-72|0;if(j){continue}break}}Fa=d+96|0}function Hh(a){var b=0;if(!(!a|G[952412]==(a|0))){Hl(a);a:{if(!a){break a}if(G[a+12>>2]>=2){hb(73270,18,1,G[24367])}b=G[a+136>>2];if(!b){break a}Ja[b|0](a)|0}pb(G[a+64>>2]);pb(G[a>>2]);pb(G[a+44>>2]);pb(G[a+48>>2]);pb(G[a+52>>2]);pb(G[a+56>>2]);pb(G[a+60>>2]);pb(G[a+32>>2]);pb(G[a+36>>2]);pb(G[a+16>>2]);pb(G[a+28>>2]);pb(G[a+176>>2]);pb(G[a+160>>2]);pb(a)}}function bt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;g=M(a,48);a=g+757256|0;h=G[a>>2];f=c+h|0;i=c>>31;d=i+G[a+4>>2]|0;d=c>>>0>f>>>0?d+1|0:d;e=g+757264|0;f=f>>>0<=J[e>>2];e=G[e+4>>2];if(f&(e|0)>=(d|0)|(d|0)<(e|0)){bb(b,h+G[G[g+757232>>2]>>2]|0,c);b=i+G[a+4>>2]|0;d=c+G[a>>2]|0;b=d>>>0>>0?b+1|0:b;G[a>>2]=d;G[a+4>>2]=b;a=0}else{a=107}return a|0}function nt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=M(a,48);d=G[e+757252>>2];if(d){f=e+757232|0;d=Ja[d|0](G[G[f>>2]>>2],b)|0;if(!d){Ua(60128);return 113}g=M(a,48)+757240|0;a=G[G[g>>2]>>2];if(b>>>0>a>>>0&(c|0)>=0|(c|0)>0){cb(a+d|0,0,b-a|0)}G[G[f>>2]>>2]=d;G[G[g>>2]>>2]=b}a=e+757264|0;G[a>>2]=b;G[a+4>>2]=c;a=e+757256|0;G[a>>2]=b;G[a+4>>2]=c;return 0}function jr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]!=504){f=1;if(tj(c)){break a}}g=L[c+128>>3]-b;b=V(a*a+g*g);b=L[c+40>>3]<0?-b:b;b:{if(b==0){L[d>>3]=L[c+120>>3]*0;f=2;a=-90;if(L[c+112>>3]<0){break b}break a}h=d,i=Ac(a/b,g/b)*L[c+120>>3],L[h>>3]=i;a=De($b(b*L[c+144>>3],L[c+120>>3]));a=90-(a+a)}L[e>>3]=a;f=0}return f|0}function qc(a,b){var c=0,d=0,e=0;d=Fa-32|0;Fa=d;c=E[b|0];a:{if(!(H[b+1|0]?c:0)){b=Gg(a,c);break a}cb(d,0,32);c=H[b|0];if(c){while(1){e=(c>>>3&28)+d|0;G[e>>2]=G[e>>2]|1<>>3&28)+d>>2]>>>c&1){break a}c=H[b+1|0];b=b+1|0;if(c){continue}break}}Fa=d+32|0;return b-a|0}function Yb(a,b){var c=0,d=0,e=0;c=b;d=H[a|0];a:{if(!d){break a}while(1){e=d<<24>>24;if(!((e|0)==32|e-9>>>0<5)){while(1){E[c|0]=d;c=c+1|0;d=H[a+1|0];a=a+1|0;if(d){continue}break}break a}d=H[a+1|0];a=a+1|0;if(d){continue}break}}E[c|0]=0;a=c-b|0;if(a){while(1){c=c-1|0;b=E[c|0];if(!((b|0)==32|b-9>>>0<5)){return}E[c|0]=0;a=a-1|0;if(a){continue}break}}}function Zh(a){var b=0,c=0,d=0;d=H[a|0];b=d-66|0;b=(b<<5|(b&248)>>>3)&255;a:{b:{if(!(b>>>0>5|!(1<>>0>1){break a}}c=sb(a)}return c}function Ht(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=G[a+84>>2];f=G[e+4>>2];g=G[a+28>>2];d=G[a+20>>2]-g|0;d=d>>>0>f>>>0?f:d;if(d){bb(G[e>>2],g,d);G[e>>2]=d+G[e>>2];f=G[e+4>>2]-d|0;G[e+4>>2]=f}d=G[e>>2];f=c>>>0>f>>>0?f:c;if(f){bb(d,b,f);d=f+G[e>>2]|0;G[e>>2]=d;G[e+4>>2]=G[e+4>>2]-f}E[d|0]=0;b=G[a+44>>2];G[a+28>>2]=b;G[a+20>>2]=b;return c|0}function Cf(a,b,c,d,e,f){var g=0,h=0;g=Fa-208|0;Fa=g;E[c|0]=0;E[d|0]=0;if(e){E[e|0]=0}h=G[f>>2];if((h|0)<=0){a:{if((Sd(a,b,g+112|0,f)|0)>0){break a}a=g+112|0;Fi(a,c,g+12|0);if((mc(a,d,e,f)|0)>0){break a}if((go(c,f)|0)<=0){break a}G[g+4>>2]=c;G[g>>2]=b;a=g+16|0;Ya(a,81,10301,g);Ua(a);if((b|0)%36|0){break a}Ua(47502)}h=G[f>>2]}Fa=g+208|0;return h}function wn(a){var b=0,c=0,d=0,e=0,f=0;A(.5);d=v(1)|0;f=v(0)|0;A(+a);c=v(1)|0;v(0)|0;x(0,f|0);x(1,d&2147483647|c&-2147483648);e=+z();A(+a);c=v(1)|0;x(0,v(0)|0);c=c&2147483647;x(1,c|0);b=+z();d=c;a:{if(c>>>0<=1082535489){b=gh(b);if(d>>>0<=1072693247){if(d>>>0<1045430272){break a}return e*(b+b-b*b/(b+1))}return e*(b+b/(b+1))}a=xn(b,e+e)}return a}function Ge(a,b){var c=0,d=0,e=0,f=0;if((b|0)>0){f=b<<3;b=0;while(1){c=a+b|0;d=H[c|0];e=c;c=(b|7)+a|0;E[e|0]=H[c|0];E[c|0]=d;c=(b|1)+a|0;d=H[c|0];e=c;c=(b|6)+a|0;E[e|0]=H[c|0];E[c|0]=d;c=(b|2)+a|0;d=H[c|0];e=c;c=(b|5)+a|0;E[e|0]=H[c|0];E[c|0]=d;c=(b|3)+a|0;d=H[c|0];e=c;c=(b|4)+a|0;E[e|0]=H[c|0];E[c|0]=d;b=b+8|0;if((f|0)>(b|0)){continue}break}}}function Jb(a,b,c,d,e){var f=0,g=0,h=0;f=G[e>>2];a:{if((f|0)>0){break a}if((c|0)<0){G[e>>2]=304;return 304}g=G[a>>2];f=G[a+4>>2];if((g|0)!=G[f+76>>2]){mb(a,g+1|0,0,e);f=G[a+4>>2]}g=Du(b,c,2880,0);h=G[f+72>>2];if(!((h|0)>=0&(g|0)==G[((h<<2)+f|0)+1256>>2])){Hc(a,g,d,e)}f=G[e>>2];if((f|0)>0){break a}a=G[a+4>>2];G[a+56>>2]=b;G[a+60>>2]=c}return f}function Kk(a,b,c,d,e){var f=0,g=0,h=0,i=0,j=0,k=0,l=0;h=Fa-240|0;Fa=h;G[h>>2]=a;i=1;a:{if((d|0)<2){break a}k=0-b|0;f=a;while(1){f=f+k|0;j=d-2|0;g=f-G[(j<<2)+e>>2]|0;if((Ja[c|0](a,g)|0)>=0){if((Ja[c|0](a,f)|0)>=0){break a}}l=g;g=(Ja[c|0](g,f)|0)>=0;f=g?l:f;G[(i<<2)+h>>2]=f;i=i+1|0;d=g?d-1|0:j;if((d|0)>1){continue}break}}dp(b,h,i);Fa=h+240|0}function Dc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=G[c>>2];if((d|0)<=0){d=G[a>>2];e=G[a+4>>2];a:{if(d|!!(G[e+104>>2]|G[e+108>>2])){b:{if(G[e+76>>2]!=(d|0)){mb(a,d+1|0,0,c);break b}if((G[e+128>>2]&G[e+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}d=G[a+4>>2];a=G[d+80>>2];G[b>>2]=a;a=G[d+1088>>2]?0:a}else{a=0}G[b>>2]=a}d=G[c>>2]}return d|0}function Eg(a,b,c){var d=0,e=0;d=G[c>>2];if((d|0)<=0){d=G[a>>2];e=G[a+4>>2];a:{b:{if((d|0)!=G[e+76>>2]){mb(a,d+1|0,0,c);break b}if((G[e+128>>2]&G[e+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}ef(a,1,c);d=G[a+4>>2];if(!G[d+80>>2]){Cb(a,31,32941,b,0,c);break a}if(G[d+1088>>2]){Cb(a,31,32893,b,0,c);break a}G[c>>2]=233}d=G[c>>2]}return d}function vs(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=l|0;var m=0;if(j>k){while(1){j=j+-360;if(k>2]+M(c,3)|0)-2|0,d,e,h,i,j,k);if((l|0)>0){f=(k-j)/+(l|0);while(1){m=b+c|0;g=+(b|0)*f+j;b=b+1|0;Ze(a,0,m,d,e,h,i,g,+(b|0)*f+j);if((b|0)!=(l|0)){continue}break}}}function Qf(a,b){a:{if((b|0)>=1024){a=a*898846567431158e293;if(b>>>0<2047){b=b-1023|0;break a}a=a*898846567431158e293;b=((b|0)<3069?b:3069)-2046|0;break a}if((b|0)>-1023){break a}a=a*2004168360008973e-307;if(b>>>0>4294965304){b=b+969|0;break a}a=a*2004168360008973e-307;b=((b|0)>-2960?b:-2960)+1938|0}x(0,0);x(1,b+1023<<20);return a*+z()}function Mn(a){var b=0,c=0,d=0,e=0;a:{d=G[110919];if(!d){if((hb(673152,1,a,G[119132])|0)==(a|0)){break a}Ua(443536);Ua(59704);return}b=G[G[110917]>>2];b:{c=G[110922];e=c+a|0;if(e>>>0<=J[G[110918]>>2]){break b}b=Ja[d|0](b,e)|0;G[G[110917]>>2]=b;c=G[110922];G[G[110918]>>2]=c+a;if(b){break b}Ua(443536);Ua(59658);return}bb(b+c|0,673152,a)}}function kn(a,b,c,d,e){var f=0,g=0;f=Fa-80|0;Fa=f;if(!d){d=Va(c)}a:{if((e|0)<0){if(!G[309737]){G[309737]=431}a=bb(f,136017,80);E[a+79|0]=0;Ua(a);a=-1;break a}b:{if(!((d|0)>=(e|0)?e:0)){cb(a,0,b);break b}if((b+e|0)>(d|0)){g=(c+e|0)-1|0;c=(d-e|0)+1|0;cb(bb(a,g,c)+c|0,0,b-c|0);break b}bb(a,(c+e|0)-1|0,b)}E[a+b|0]=0;a=0}Fa=f+80|0;return a}function eu(a){a=a|0;var b=0,c=0,d=0;b=Fa-131104|0;Fa=b;G[b+16>>2]=42205;G[b+20>>2]=a;d=b+65568|0;Ya(d,65535,8740,b+16|0);G[b+4>>2]=a;G[b>>2]=42205;c=b+32|0;Ya(c,65535,4424,b);Pl(d,c);a=28780;c=ac(c,13287);a:{if(!c){break a}d=zc(3809712,1,65535,c);Hb(c);E[d+3809712|0]=0;if((d|0)<0){break a}Vg(b+32|0);a=3809712}Fa=b+131104|0;return a|0}function Tb(a,b,c){var d=0;d=Fa-4112|0;Fa=d;G[d+12>>2]=c;if(G[47758]==-1){c=Fd(33977);if(c){c=_b(c)}else{c=2}G[47758]=c}G[d>>2]=b;b=d+16|0;Ya(b,4095,10196,d);oo(3747440,4095,b,G[d+12>>2]);b=G[945052];a=b?b:a;c=G[47758];if(!(!a|!c)){fe(3747440,a);$a(a);c=G[47758]}if((c|0)>=2){a=G[945053];if(a){Ja[a|0]();c=G[47758]}sc(c);W()}Fa=d+4112|0}function cd(a){var b=0;a:{b=G[a+5820>>2];b:{if((b|0)==16){b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5816|0];b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5817|0];F[a+5816>>1]=0;b=0;break b}if((b|0)<8){break a}b=G[a+20>>2];G[a+20>>2]=b+1;E[b+G[a+8>>2]|0]=H[a+5816|0];F[a+5816>>1]=H[a+5817|0];b=G[a+5820>>2]-8|0}G[a+5820>>2]=b}}function Xc(a,b){var c=0,d=0,e=0;c=H[a|0];a:{if(!c){break a}while(1){d=H[b|0];if(!d){e=c;break a}b:{if((c|0)==(d|0)){break b}d=c-65>>>0<26?c|32:c;c=H[b|0];if((d|0)==((c-65>>>0<26?c|32:c)|0)){break b}e=H[a|0];break a}b=b+1|0;c=H[a+1|0];a=a+1|0;if(c){continue}break}}a=e&255;e=a-65>>>0<26?a|32:a;a=H[b|0];return e-(a-65>>>0<26?a|32:a)|0}function ob(a,b,c){var d=0,e=0;a=Ye(a,b);if(!a){return 0}a=a+(H[a|0]==35)|0;a:{if((Va(a)|0)>=82){rb(1285216,a,81);E[1285297]=0;break a}Za(1285216,a)}b:{if((ah(1285216)|0)!=2){break b}a=jb(1285216,68);if(a){E[a|0]=101}a=jb(1285216,100);if(a){E[a|0]=101}a=jb(1285216,69);if(!a){break b}E[a|0]=101}d=c,e=sb(1285216),L[d>>3]=e;return 1}function Ib(a,b){var c=0,d=0,e=0;c=E[b|0];d=(c-97>>>0<26?c&95:c)<<24>>24;c=E[a|0];c=(c-97>>>0<26?c&95:c)<<24;e=c>>24;if((d|0)<=(e|0)){while(1){if((d|0)<(e|0)){return 1}if(!c){return 0}c=E[a+1|0];d=E[b+1|0];b=b+1|0;a=a+1|0;d=(d-97>>>0<26?d&95:d)<<24>>24;c=(c-97>>>0<26?c&95:c)<<24;e=c>>24;if((d|0)<=(e|0)){continue}break}}return-1}function Nh(a,b,c){var d=0,e=0;while(1){d=a;a=d+1|0;if(H[d|0]==32){continue}break}G[b>>2]=d;a=H[d|0];if(a){while(1){a=a&255;if(a){if(!((a|0)==32|(a|0)==58)){a=H[d+1|0];d=d+1|0;continue}E[d|0]=0;a=d+1|0}else{a=d}while(1){d=a;a=d+1|0;if(H[d|0]==32){continue}break}e=e+1|0;G[(e<<2)+b>>2]=d;a=H[d|0];if(a){continue}break}}G[c>>2]=e}function bj(a,b){var c=0,d=0,e=0,f=0,g=0;c=G[936853];if(c){g=G[936852];while(1){e=(d<<2)+g|0;f=G[e>>2];if((f|0)==(a|0)){G[e>>2]=b;Wa(a);return}if(!(!b|f)){G[e>>2]=b;b=0}d=d+1|0;if((c|0)!=(d|0)){continue}break}}a:{if(!b){break a}a=ub(G[936852],(c<<2)+4|0);if(!a){break a}G[936852]=a;c=G[936853];G[936853]=c+1;G[a+(c<<2)>>2]=b}}function dp(a,b,c){var d=0,e=0,f=0,g=0,h=0;f=Fa-256|0;Fa=f;a:{if((c|0)<2){break a}h=(c<<2)+b|0;G[h>>2]=f;if(!a){break a}while(1){e=a>>>0<256?a:256;bb(G[h>>2],G[b>>2],e);d=0;while(1){g=(d<<2)+b|0;d=d+1|0;bb(G[g>>2],G[(d<<2)+b>>2],e);G[g>>2]=G[g>>2]+e;if((c|0)!=(d|0)){continue}break}a=a-e|0;if(a){continue}break}}Fa=f+256|0}function nh(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if((Le(a,b,c,d,h+8|0,h,g)|0)>0){break a}b:{if(!e){break b}a=G[h+12>>2];b=G[h+8>>2];if((a|0)>=0&b>>>0>=2147483648|(a|0)>0){G[g>>2]=412;break b}G[e>>2]=b}if(!f){break a}a=G[h+4>>2];b=G[h>>2];if((a|0)>=0&b>>>0>=2147483648|(a|0)>0){G[g>>2]=412;break a}G[f>>2]=b}Fa=h+16|0}function ui(a,b){var c=0,d=0,e=0,f=0;c=Fa;f=c;e=4096;d=c-(a?16:4096)|0;Fa=d;c=d;a:{b:{if(!a){break b}c=a;e=b;if(b){break b}G[48624]=28;a=0;break a}a=0;b=wa(c|0,e|0)|0;if(b>>>0>=4294963201){G[48624]=0-b;b=-1}if((b|0)<0){break a}if(!(H[c|0]==47?b:0)){G[48624]=44;break a}a=c;if((d|0)!=(c|0)){break a}a=le(d)}Fa=f;return a}function _b(a){var b=0,c=0,d=0,e=0;while(1){b=a;a=b+1|0;c=E[b|0];if((c|0)==32|c-9>>>0<5){continue}break}a:{b:{c:{c=E[b|0];switch(c-43|0){case 0:break b;case 2:break c;default:break a}}e=1}c=E[a|0];b=a}if(c-48>>>0<10){while(1){d=(M(d,10)-E[b|0]|0)+48|0;a=E[b+1|0];b=b+1|0;if(a-48>>>0<10){continue}break}}return e?d:0-d|0}function ys(a,b,c,d,e,f,g,h,i,j,k,l){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;l=l|0;var m=0,n=0,o=0,p=0;vf(a,0,(G[a>>2]+M(c,3)|0)-2|0,d,e,f,g,h,i,j,k);if((l|0)>0){k=(k-j)/+(l|0);while(1){n=b+m|0;o=c+m|0;p=+(m|0)*k+j;m=m+1|0;vf(a,n,o,d,e,f,g,h,i,p,+(m|0)*k+j);if((l|0)!=(m|0)){continue}break}}}function db(a,b,c){var d=0,e=0,f=0,g=0;f=Fa-16|0;Fa=f;G[f+12>>2]=c;d=Fa-160|0;Fa=d;g=d+8|0;bb(g,92528,144);G[d+52>>2]=a;G[d+28>>2]=a;e=-2-a|0;e=e>>>0>2147483647?2147483647:e;G[d+56>>2]=e;a=a+e|0;G[d+36>>2]=a;G[d+24>>2]=a;a=Ak(g,b,c);if(e){b=G[d+28>>2];E[b-((b|0)==G[d+24>>2])|0]=0}Fa=d+160|0;Fa=f+16|0;return a}function Mg(a){var b=0,c=0,d=0;c=G[a+28>>2];cd(c);b=G[c+20>>2];d=G[a+16>>2];b=b>>>0>>0?b:d;a:{if(!b){break a}bb(G[a+12>>2],G[c+16>>2],b);G[a+12>>2]=b+G[a+12>>2];G[c+16>>2]=b+G[c+16>>2];G[a+20>>2]=b+G[a+20>>2];G[a+16>>2]=G[a+16>>2]-b;a=G[c+20>>2];G[c+20>>2]=a-b;if((a|0)!=(b|0)){break a}G[c+16>>2]=G[c+8>>2]}}function Hq(a,b){a:{if(!a){break a}cb(G[a+104>>2],0,G[a+80>>2]<<3);cb(G[a+108>>2],0,G[a+80>>2]<<3);cb(G[a+84>>2],0,G[a+80>>2]<<2);cb(G[a+88>>2],0,G[a+80>>2]<<2);if(G[a>>2]|!b){break a}cb(G[b+8>>2],0,G[a+80>>2]<<3);cb(G[b+12>>2],0,G[a+80>>2]<<3);cb(G[b+16>>2],0,G[a+80>>2]<<3);cb(G[b+20>>2],0,G[a+80>>2]<<3)}}function Qd(a,b,c){var d=0,e=0;if(G[c>>2]<=0){a:{e=G[a>>2];d=G[a+4>>2];b:{if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);break b}if((G[d+128>>2]&G[d+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}a=G[a+4>>2];if(!G[a+80>>2]){G[b>>2]=G[a+136>>2];break a}if(G[a+1088>>2]){G[b>>2]=G[a+1108>>2];break a}G[c>>2]=233}}}function $m(a){var b=0;b=1;a:{if(!fb(a,16398,3)){break a}if(!fb(a,5791,8)){break a}if(!fb(a,13349,4)){break a}if(!fb(a,13361,3)){break a}if(!fb(a,13358,6)){break a}E[a+4|0]=H[15940];b=H[15936]|H[15937]<<8|(H[15938]<<16|H[15939]<<24);E[a|0]=b;E[a+1|0]=b>>>8;E[a+2|0]=b>>>16;E[a+3|0]=b>>>24;b=!a}return b}function Tf(a){var b=0;b=G[a+76>>2];a:{if(!((b|0)>=0&(!b|G[48769]!=(b&-1073741825)))){b=G[a+4>>2];if((b|0)!=G[a+8>>2]){G[a+4>>2]=b+1;b=H[b|0];break a}b=Ag(a);break a}b=G[a+76>>2];G[a+76>>2]=b?b:1073741823;b=G[a+4>>2];b:{if((b|0)!=G[a+8>>2]){G[a+4>>2]=b+1;b=H[b|0];break b}b=Ag(a)}G[a+76>>2]=0}return b}function ir(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;a:{if(G[c+4>>2]!=504){f=1;if(tj(c)){break a}}g=L[c+112>>3];b:{if(b==-90){f=2;b=0;if(g<0){break b}break a}b=L[c+136>>3]*$b(Xe((90-b)*.5),L[c+112>>3])}a=g*a;h=d,i=b*Kb(a),L[h>>3]=i;h=e,i=L[c+128>>3]-b*Mb(a),L[h>>3]=i;f=0}return f|0}function Eb(a,b,c){var d=0,e=0,f=0,g=0;f=Fa-16|0;Fa=f;G[f+12>>2]=c;d=Fa-160|0;Fa=d;g=d+8|0;bb(g,92528,144);G[d+52>>2]=a;G[d+28>>2]=a;e=-2-a|0;e=e>>>0>2147483647?2147483647:e;G[d+56>>2]=e;a=a+e|0;G[d+36>>2]=a;G[d+24>>2]=a;zk(g,b,c);if(e){a=G[d+28>>2];E[a-((a|0)==G[d+24>>2])|0]=0}Fa=d+160|0;Fa=f+16|0}function Bb(a,b,c){var d=0,e=0,f=0,g=0,h=0,i=0,j=0;if(!(!a|!H[a|0])){h=Va(a);f=h+1|0;e=G[b>>2];if(!(!e|!H[e|0])){g=Va(e)}d=G[c>>2];if((d|0)<=(g+f|0)){i=c;f=d;j=d^-1;c=(g+h|0)+2|0;d=d+1024|0;d=(f+(j+((c|0)>(d|0)?c:d)&-1024)|0)+1024|0;G[i>>2]=d}a:{if(!g){c=Ic(d,1);break a}c=lf(e,d)}G[b>>2]=c;Gb(c,a)}}function Kh(a,b,c,d,e){var f=0,g=0,h=0,i=0;f=Fa-256|0;Fa=f;h=G[e>>2];a:{if((h|0)>0){break a}if((Vc(a,b,f+176|0,f+96|0,e)|0)<=0){g=f+176|0;if(G[e>>2]<=0){i=c?84:70;E[g|0]=i;E[g+1|0]=i>>>8}Ob(b,g,d?H[d|0]==38?f+96|0:d:f+96|0,f,e);Hd(a,f,e)}if(G[e>>2]!=202){break a}G[e>>2]=h;Rg(a,b,c,d,e)}Fa=f+256|0}function nb(a,b,c){var d=0,e=0;a:{b:{if(c>>>0>=4){if((a|b)&3){break b}while(1){if(G[a>>2]!=G[b>>2]){break b}b=b+4|0;a=a+4|0;c=c-4|0;if(c>>>0>3){continue}break}}if(!c){break a}}while(1){d=H[a|0];e=H[b|0];if((d|0)==(e|0)){b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break a}break}return d-e|0}return 0}function Zd(a,b){var c=0,d=0,e=0,f=0;d=Fa-16|0;Fa=d;a:{if(!b){b=0;break a}c=b>>31;e=(c^b)-c|0;c=P(e);od(d,e,0,0,0,c+81|0);e=0+G[d+8>>2]|0;c=(G[d+12>>2]^65536)+(16414-c<<16)|0;c=e>>>0>>0?c+1|0:c;f=b&-2147483648|c;c=G[d+4>>2];b=G[d>>2]}G[a>>2]=b;G[a+4>>2]=c;G[a+8>>2]=e;G[a+12>>2]=f;Fa=d+16|0}function Oj(a,b){var c=0,d=0;c=Fa-2080|0;Fa=c;a:{if(!bf(a,1025,c+1040|0,b)){if(H[c+1040|0]!=47){cf(c,b);if((Va(c)+Va(c+1040|0)|0)-1024>>>0<=4294966270){Ua(59420);G[b>>2]=104;a=104;break a}d=Va(c)+c|0;E[d|0]=47;E[d+1|0]=0;d=c+1040|0;_d(Gb(c,d),d,b)}Za(a,c+1040|0)}a=G[b>>2]}Fa=c+2080|0;return a}function en(a){var b=0;b=G[a+76>>2];if(!((b|0)>=0&(!b|G[48769]!=(b&-1073741825)))){b=G[a+4>>2];if((b|0)!=G[a+8>>2]){G[a+4>>2]=b+1;return H[b|0]}return Ag(a)}b=G[a+76>>2];G[a+76>>2]=b?b:1073741823;b=G[a+4>>2];a:{if((b|0)!=G[a+8>>2]){G[a+4>>2]=b+1;b=H[b|0];break a}b=Ag(a)}G[a+76>>2]=0;return b}function un(a){var b=0,c=0;A(+a);c=v(1)|0;x(0,v(0)|0);b=c&2147483647;x(1,b|0);a=+z();a:{if(b>>>0>=1071748075){if(b>>>0>=1077149697){a=-0/a+1;break a}a=1-2/(gh(a+a)+2);break a}if(b>>>0>=1070618799){a=gh(a+a);a=a/(a+2);break a}if(b>>>0<1048576){break a}a=gh(a*-2);a=-a/(a+2)}return(c|0)<0?-a:a}function Kd(a,b,c,d,e,f){var g=0,h=0,i=0;g=Fa-256|0;Fa=g;i=G[f>>2];a:{if((i|0)>0){h=i;break a}if((Vc(a,b,g+176|0,g+96|0,f)|0)<=0){h=g+176|0;If(c,d,h,f);Ob(b,h,e?H[e|0]==38?g+96|0:e:g+96|0,g,f);Hd(a,g,f)}h=G[f>>2];if((h|0)!=202){break a}G[f>>2]=i;ll(a,b,c,d,e,f);h=G[f>>2]}Fa=g+256|0;return h}function Gc(a,b,c,d,e,f){var g=0,h=0,i=0;g=Fa-256|0;Fa=g;i=G[f>>2];a:{if((i|0)>0){h=i;break a}if((Vc(a,b,g+176|0,g+96|0,f)|0)<=0){h=g+176|0;jl(c,d,h,f);Ob(b,h,e?H[e|0]==38?g+96|0:e:g+96|0,g,f);Hd(a,g,f)}h=G[f>>2];if((h|0)!=202){break a}G[f>>2]=i;hd(a,b,c,d,e,f);h=G[f>>2]}Fa=g+256|0;return h}function zb(a,b,c,d){var e=0,f=0;e=Fa-32|0;Fa=e;E[c|0]=0;a:{b:{f=Va(a);if(!f|(b|0)<0){break b}G[e>>2]=b;Ya(e+16|0,16,30633,e);a=Za(c,a);while(1){f=f-1|0;b=a+f|0;if(H[b|0]==32){E[b|0]=0;if(f){continue}}break}if(Va(e+16|0)+Va(a)>>>0>=9){break b}Gb(a,e+16|0);break a}G[d>>2]=206}Fa=e+32|0}function Fd(a){var b=0,c=0,d=0,e=0;b=Gg(a,61);if((b|0)==(a|0)){return 0}d=b-a|0;a:{if(H[d+a|0]){break a}b=G[50361];if(!b){break a}c=G[b>>2];if(!c){break a}while(1){b:{if(!fb(a,c,d)){c=G[b>>2]+d|0;if(H[c|0]==61){break b}}c=G[b+4>>2];b=b+4|0;if(c){continue}break a}break}e=c+1|0}return e}function Sn(a){var b=0,c=0,d=0,e=0;b=G[a+40>>2];b=Ja[b|0](a,0,0,H[a|0]&128?G[a+20>>2]==G[a+28>>2]?1:2:1)|0;c=Ia;a:{if((c|0)<0){break a}e=b;d=G[a+8>>2];if(d){a=a+4|0}else{d=G[a+28>>2];if(!d){break a}a=a+20|0}b=G[a>>2]-d|0;a=e+b|0;c=(b>>31)+c|0;c=a>>>0>>0?c+1|0:c;b=a}Ia=c;return b}function mr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:{if(G[c+4>>2]!=502){f=1;if(vj(c)){break a}}a=L[c+112>>3]*a;if(b==-90){b=L[c+176>>3]}else{b=L[c+136>>3]*V(L[c+144>>3]-L[c+152>>3]*Kb(b))}g=d,h=b*Kb(a),L[g>>3]=h;g=e,h=L[c+128>>3]-b*Mb(a),L[g>>3]=h;f=0}return f|0}function ho(a){var b=0,c=0,d=0,e=0,f=0,g=0;c=G[50359];f=c&(c>>31^-1);d=c;a:{while(1){if((e|0)==(f|0)){break a}b=G[49824];g=Za(a,b);E[b|0]=0;b=d-1|0;G[50359]=b;if((d|0)!=1){yd(199296,199300,(c-e<<2)-4|0)}e=e+1|0;d=b;b=E[g|0];if((b|0)==27){continue}break}return b}E[a|0]=0;return 0}function Ft(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;e=M(a,24);f=e+202496|0;a=b;d=a>>31;g=d;d=pa(gk(G[f>>2])|0,a|0,d|0)|0;if(d>>>0>=4294963201){G[48624]=0-d}if(!zf(G[f>>2],a,g,0)){a=e+202504|0;G[a>>2]=b;G[a+4>>2]=c}G[e+202512>>2]=0;a=e+202504|0;G[a>>2]=b;G[a+4>>2]=c;return 0}function Rn(){var a=0;while(1){G[M(a,24)+202496>>2]=0;G[M(a|1,24)+202496>>2]=0;G[M(a|2,24)+202496>>2]=0;G[M(a|3,24)+202496>>2]=0;G[M(a|4,24)+202496>>2]=0;G[M(a|5,24)+202496>>2]=0;G[M(a|6,24)+202496>>2]=0;G[M(a|7,24)+202496>>2]=0;a=a+8|0;if((a|0)!=1e4){continue}break}return 0}function ye(a){var b=0,c=0,d=0;c=-2;a:{if(!a|!G[a+32>>2]){break a}d=G[a+36>>2];if(!d){break a}b=G[a+28>>2];if(!b|G[b>>2]!=(a|0)|G[b+4>>2]-16180>>>0>31){break a}c=G[b+56>>2];if(c){Ja[d|0](G[a+40>>2],c);d=G[a+36>>2];b=G[a+28>>2]}Ja[d|0](G[a+40>>2],b);c=0;G[a+28>>2]=0}return c}function oo(a,b,c,d){var e=0,f=0;e=Fa-160|0;Fa=e;f=-1;G[e+148>>2]=b?b-1|0:0;a=b?a:e+158|0;G[e+144>>2]=a;e=cb(e,0,144);G[e+76>>2]=-1;G[e+36>>2]=3;G[e+80>>2]=-1;G[e+44>>2]=e+159;G[e+84>>2]=e+144;a:{if((b|0)<0){G[48624]=61;break a}E[a|0]=0;f=Lk(e,c,d,1,2)}Fa=e+160|0;return f}function We(a,b,c,d){var e=0,f=0,g=0;f=G[321389]+1|0;G[321389]=f;G[a>>2]=f;if(d){while(1){g=(e<<3)+c|0;if(!G[g>>2]){G[g>>2]=f;a=(e<<3)+c|0;G[a+4>>2]=b;G[a+8>>2]=0;_(d|0);return c}e=e+1|0;if((e|0)!=(d|0)){continue}break}}e=a;a=d<<1;b=We(e,b,ub(c,d<<4|8),a);_(a|0);return b}function bh(a){var b=0,c=0,d=0;A(+a);b=v(1)|0;v(0)|0;d=b>>>20&2047;if(d>>>0<=1074){if(d>>>0<=1021){return a*0}a=(b|0)>0|(b|0)>=0?a:-a;c=a+4503599627370496+-4503599627370496-a;a:{if(c>.5){a=a+c+-1;break a}a=a+c;if(!(c<=-.5)){break a}a=a+1}a=(b|0)>0|(b|0)>=0?a:-a}return a}function Ph(a){var b=0,c=0;c=G[a+12>>2];a:{if((c|0)>=G[a+16>>2]){c=0;b=ra(G[a+8>>2],a+24|0,2048)|0;if((b|0)<=0){a=0;if(!b|(b|0)==-44){break a}G[48624]=0-b;return 0}G[a+16>>2]=b}b=a+c|0;G[a+12>>2]=I[b+40>>1]+c;c=G[b+36>>2];G[a>>2]=G[b+32>>2];G[a+4>>2]=c;a=b+24|0}return a}function In(){var a=0,b=0,c=0;while(1){b=M(c,48);a=b+757232|0;G[a>>2]=0;G[a+4>>2]=0;a=b+757280|0;G[a>>2]=0;G[a+4>>2]=0;a=b+757328|0;G[a>>2]=0;G[a+4>>2]=0;a=b+757376|0;G[a>>2]=0;G[a+4>>2]=0;b=b+757424|0;G[b>>2]=0;G[b+4>>2]=0;c=c+5|0;if((c|0)!=1e4){continue}break}return 0}function wg(a,b){var c=0,d=0,e=0,f=0;c=Fa-16|0;Fa=c;a:{if(!b){b=0;break a}d=b;b=P(b);od(c,d,0,0,0,b+81|0);e=16414-b<<16;b=0;d=b+G[c+8>>2]|0;e=e+(G[c+12>>2]^65536)|0;e=b>>>0>d>>>0?e+1|0:e;f=d;d=G[c>>2];b=G[c+4>>2]}G[a>>2]=d;G[a+4>>2]=b;G[a+8>>2]=f;G[a+12>>2]=e;Fa=c+16|0}function ih(a,b,c){var d=0,e=0,f=0;d=a*a;f=d*(d*d)*(d*1.58969099521155e-10+-2.5050760253406863e-8)+(d*(d*27557313707070068e-22+-.0001984126982985795)+.00833333333332249);e=d*a;if(!c){return e*(d*f+-.16666666666666632)+a}return a-(d*(b*.5-f*e)-b+e*.16666666666666632)}function gc(a,b,c){var d=0,e=0,f=0;a:{if(!c){break a}while(1){d=E[a|0];e=(d-97>>>0<26?d&95:d)<<24;f=e>>24;d=E[b|0];d=(d-97>>>0<26?d&95:d)<<24>>24;if((f|0)<(d|0)){return-1}if((d|0)<(f|0)){return 1}if(!e){break a}b=b+1|0;a=a+1|0;c=c-1|0;if(c){continue}break}}return 0}function Lg(a,b,c){var d=0,e=0,f=0;a:{if(!b){d=a;break a}while(1){d=Du(a,b,10,0);f=Ia;e=Au(d,f,10,0);c=c-1|0;E[c|0]=a-e|48;e=b>>>0>9;a=d;b=f;if(e){continue}break}}if(d){while(1){c=c-1|0;a=(d>>>0)/10|0;E[c|0]=d-M(a,10)|48;b=d>>>0>9;d=a;if(b){continue}break}}return c}function Kq(){var a=0,b=0;a=Fa-16|0;Fa=a;a:{if(ya(a+12|0,a+8|0)|0){break a}b=ab((G[a+12>>2]<<2)+4|0);G[50361]=b;if(!b){break a}b=ab(G[a+8>>2]);if(b){G[G[50361]+(G[a+12>>2]<<2)>>2]=0;if(!(xa(G[50361],b|0)|0)){break a}}G[50361]=0}Fa=a+16|0;G[48787]=195036;G[48769]=42}function Dt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;d=116;c=G[M(a,24)+202496>>2];a=fk(c);a:{if(a&-2147483648){break a}if(zf(c,0,0,2)){break a}e=fk(c);if(e&-2147483648){break a}f=c;c=a>>31;if(zf(f,a,c,0)){break a}c=b;b=e;a=b>>31;G[c>>2]=b;G[c+4>>2]=a;d=0}return d|0}function vh(a,b){var c=0,d=0,e=0;d=Fa-16|0;Fa=d;E[d+15|0]=b;c=G[a+16>>2];a:{if(!c){if(el(a)){break a}c=G[a+16>>2]}e=c;c=G[a+20>>2];if(!((e|0)==(c|0)|G[a+80>>2]==(b&255))){G[a+20>>2]=c+1;E[c|0]=b;break a}if((Ja[G[a+36>>2]](a,d+15|0,1)|0)!=1){break a}}Fa=d+16|0}function zi(a,b,c){var d=0,e=0;if(G[c>>2]<=0){a:{e=G[a>>2];d=G[a+4>>2];b:{if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);break b}if((G[d+128>>2]&G[d+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}a=G[a+4>>2];if(!G[a+80>>2]){G[c>>2]=235;return}G[b>>2]=G[a+952>>2]}}}function pk(a,b,c){var d=0,e=0;if(G[c>>2]<=0){a:{e=G[a>>2];d=G[a+4>>2];b:{if((e|0)!=G[d+76>>2]){mb(a,e+1|0,0,c);break b}if((G[d+128>>2]&G[d+132>>2])!=-1){break b}if((Rb(a,c)|0)>0){break a}}a=G[a+4>>2];if(!G[a+80>>2]){G[c>>2]=235;return}G[b>>2]=G[a+936>>2]}}}function Tj(a){var b=0,c=0,d=0;b=Fa-32|0;Fa=b;a:{c=ab(48);if(c){G[c+12>>2]=16384;d=ab(16386);G[c+4>>2]=d;if(!d){break a}G[c+20>>2]=1;Sj(c,a);Fa=b+32|0;return c}G[b>>2]=63997;_a(G[24367],70017,b);ca(2);W()}G[b+16>>2]=63997;_a(G[24367],70017,b+16|0);ca(2);W()}function Cm(a,b,c){var d=0,e=0;d=Fa-32|0;Fa=d;G[d+8>>2]=0;G[d+12>>2]=0;G[d>>2]=0;G[d+4>>2]=0;G[d+24>>2]=0;G[d+28>>2]=0;G[d+16>>2]=0;G[d+20>>2]=0;Dj(a,b,d+8|0,d,d+24|0,d+16|0);e=c+-2e3;L[a>>3]=L[d+8>>3]*e+L[a>>3];L[b>>3]=L[d>>3]*e+L[b>>3];_g(a,b,c);Fa=d+32|0}function lq(a,b,c,d){var e=0,f=0;e=Fa-16|0;Fa=e;f=G[d>>2];a:{if((f|0)>0){break a}b:{if((Dc(a,e+12|0,d)|0)>0){break b}if(G[e+12>>2]){f=233;G[d>>2]=233;break a}if(Nb(a,d)){break b}a=G[G[a+4>>2]+968>>2];G[a+272>>2]=b;G[a+276>>2]=c}f=G[d>>2]}Fa=e+16|0;return f}function hh(a){return(a*(a*(a*(a*(a*3479331075960212e-20+.0007915349942898145)+-.04005553450067941)+.20121253213486293)+-.3255658186224009)+.16666666666666666)*a/(a*(a*(a*(a*.07703815055590194+-.6882839716054533)+2.0209457602335057)+-2.403394911734414)+1)}function mq(a,b){var c=0;c=Fa-16|0;Fa=c;a:{if(G[b>>2]>0){break a}b:{if((Dc(a,c+12|0,b)|0)>0){break b}if(G[c+12>>2]){G[b>>2]=233;break a}b=Nb(a,b);a=G[a+4>>2];if(b){L[a+1192>>3]=0;L[a+1184>>3]=1;break b}a=G[a+968>>2];L[a+264>>3]=0;L[a+256>>3]=1}}Fa=c+16|0}function Sl(a,b,c,d,e){var f=0,g=0,h=0;f=Fa-256|0;Fa=f;g=G[e>>2];a:{if((g|0)>0){break a}if((Vc(a,b,f+176|0,f+96|0,e)|0)<=0){h=f+176|0;ml(c,h,e);Ob(b,h,d?H[d|0]==38?f+96|0:d:f+96|0,f,e);Hd(a,f,e)}if(G[e>>2]!=202){break a}G[e>>2]=g;be(a,b,c,d,e)}Fa=f+256|0}function si(a){var b=0,c=0;b=G[a+72>>2];G[a+72>>2]=b-1|b;if(G[a+20>>2]!=G[a+28>>2]){Ja[G[a+36>>2]](a,0,0)|0}G[a+28>>2]=0;G[a+16>>2]=0;G[a+20>>2]=0;b=G[a>>2];if(b&4){G[a>>2]=b|32;return-1}c=G[a+44>>2]+G[a+48>>2]|0;G[a+8>>2]=c;G[a+4>>2]=c;return b<<27>>31}function Va(a){var b=0,c=0,d=0;b=a;a:{if(b&3){while(1){if(!H[b|0]){break a}b=b+1|0;if(b&3){continue}break}}while(1){c=b;b=b+4|0;d=G[c>>2];if(!((d^-1)&d-16843009&-2139062144)){continue}break}while(1){b=c;c=b+1|0;if(H[b|0]){continue}break}}return b-a|0}function te(a,b,c){var d=0,e=0,f=0,g=0;G[a+112>>2]=b;G[a+116>>2]=c;e=G[a+4>>2];d=G[a+44>>2]-e|0;G[a+120>>2]=d;G[a+124>>2]=d>>31;d=G[a+8>>2];a:{if(!(b|c)){break a}f=d-e|0;g=f>>31;if((c|0)>=(g|0)&b>>>0>=f>>>0|(c|0)>(g|0)){break a}d=b+e|0}G[a+104>>2]=d}function lr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0;a:{if(G[c+4>>2]!=503){f=1;if(uj(c)){break a}}g=L[c+128>>3]-b;b=V(a*a+g*g);b=L[c+40>>3]<0?-b:b;if(b!=0){a=Ac(a/b,g/b)}else{a=0}L[d>>3]=a*L[c+120>>3];L[e>>3]=L[c+136>>3]-b;f=0}return f|0}function Lp(a,b){var c=0,d=0,e=0;A(+a);d=v(1)|0;e=v(0)|0;c=d>>>20&2047;if((c|0)!=2047){if(!c){if(a==0){c=0}else{a=Lp(a*0x10000000000000000,b);c=G[b>>2]+-64|0}G[b>>2]=c;return a}G[b>>2]=c-1022;x(0,e|0);x(1,d&-2146435073|1071644672);a=+z()}return a}function Mc(a){var b=0,c=0;c=Fa-16|0;Fa=c;A(+a);b=v(1)|0;v(0)|0;b=b&2147483647;a:{if(b>>>0<=1072243195){if(b>>>0<1044381696){break a}a=An(a,0,0);break a}if(b>>>0>=2146435072){a=a-a;break a}b=$j(a,c);a=An(L[c>>3],L[c+8>>3],b&1)}Fa=c+16|0;return a}function Nb(a,b){var c=0,d=0;a:{if(G[b>>2]<=0){d=G[a>>2];c=G[a+4>>2];if((d|0)!=G[c+76>>2]){mb(a,d+1|0,0,b);break a}if((G[c+128>>2]&G[c+132>>2])!=-1){break a}if((Rb(a,b)|0)<=0){break a}a=G[b>>2]}else{a=0}return a}return G[G[a+4>>2]+1088>>2]!=0}function vn(a){var b=0,c=0;A(+a);b=v(1)|0;x(0,v(0)|0);b=b&2147483647;x(1,b|0);a=+z();a:{if(b>>>0<=1072049729){c=1;if(b>>>0<1045430272){break a}a=gh(a);c=a+1;return a*a/(c+c)+1}if(b>>>0<=1082535489){a=af(a);return(a+1/a)*.5}c=xn(a,1)}return c}function jh(a,b){var c=0,d=0,e=0,f=0;c=a*a;d=c*.5;e=1-d;f=1-e-d;d=c*c;return e+(f+(c*(c*(c*(c*2480158728947673e-20+-.001388888888887411)+.0416666666666666)+d*d*(c*(c*-11359647557788195e-27+2.087572321298175e-9)+-2.7557314351390663e-7))-a*b))}function pg(a,b,c,d){var e=0;e=Fa+-64|0;Fa=e;Am(a,b,e+32|0);Am(c,d,e);a=L[e+48>>3]-L[e+16>>3];b=a*a;a=L[e+40>>3]-L[e+8>>3];c=a*a;a=L[e+32>>3]-L[e>>3];a=Q((b+(c+(a*a+0)))*.25,1);a=Db(V(a),V(1-a));Fa=e- -64|0;return(a+a)*180/3.141592653589793}function nj(a){var b=0,c=0;b=Fa-16|0;Fa=b;c=nc(a,b+12|0,0);a:{b:{if((G[b+12>>2]-a|0)>=(Va(a)|0)){if((c|0)<0){break b}Fa=b+16|0;return c}G[b>>2]=a;_a(G[321435],85055,b);break a}hb(82684,66,1,G[321435])}$a(G[321435]);Hb(G[321435]);sc(1);W()}function ef(a,b,c){var d=0,e=0;d=G[a>>2];e=G[a+4>>2];if((d|0)!=G[e+76>>2]){mb(a,d+1|0,0,c);e=G[a+4>>2];d=G[e+76>>2]}a=M(b,80)-80|0;c=a;d=G[e+96>>2]+(d<<3)|0;b=a+G[d>>2]|0;a=G[d+4>>2]+(a>>31)|0;G[e+120>>2]=b;G[e+124>>2]=b>>>0>>0?a+1|0:a}function cu(a,b){a=a|0;b=b|0;var c=0;c=Fa-65552|0;Fa=c;G[c>>2]=42205;G[c+4>>2]=a;a=c+16|0;Ya(a,65535,8740,c);E[3809712]=0;a=ac(a,13287);if(a){b=b-1|0;b=zc(3809712,1,b>>>0<65534?b:65534,a);Hb(a);E[b+3809712|0]=0}Fa=c+65552|0;return 3809712}function ak(a,b){var c=0,d=0;a:{if((a|0)==-1){break a}d=G[b+76>>2]>=0;b:{c=G[b+4>>2];c:{if(!c){si(b);c=G[b+4>>2];if(!c){break c}}if(G[b+44>>2]-8>>>0>>0){break b}}if(!d){break a}return}c=c-1|0;G[b+4>>2]=c;E[c|0]=a;G[b>>2]=G[b>>2]&-17}}function on(a){var b=0,c=0,d=0;a:{if(G[309737]){break a}d=G[309722];b=d+M(a,344)|0;if(G[b>>2]<=0){break a}c=G[b+8>>2];while(1){if(c){c=c-1|0;on(G[((c<<2)+b|0)+12>>2]);if(!G[309737]){continue}break a}break}Ja[G[(M(a,344)+d|0)+4>>2]](b)}}function kq(a,b){var c=0,d=0,e=0,f=0;c=b>>>20&2047;a:{if(c>>>0<1023){break a}e=2;if(c>>>0>1075){break a}e=0;c=1075-c|0;d=c&31;if((c&63)>>>0>=32){c=1<>>32-d;d=f}if(a&d-1|b&c-!d){break a}e=a&d|b&c?1:2}return e}function fm(a,b,c){var d=0,e=0;d=Fa-16|0;Fa=d;a:{if(!(b&64)){e=0;if((b&4259840)!=4259840){break a}}G[d+12>>2]=c+4;e=G[c>>2]}G[d>>2]=e;G[d+4>>2]=0;a=ja(-100,a|0,b|32768,d|0)|0;if(a>>>0>=4294963201){G[48624]=0-a;a=-1}Fa=d+16|0;return a}function fb(a,b,c){var d=0,e=0,f=0;if(!c){return 0}d=H[a|0];a:{if(!d){break a}while(1){b:{e=H[b|0];if(!e){break b}c=c-1|0;if(!c|(d|0)!=(e|0)){break b}b=b+1|0;d=H[a+1|0];a=a+1|0;if(d){continue}break a}break}f=d}return(f&255)-H[b|0]|0}function Sg(a,b){var c=0,d=0;while(1){a:{b:{c:{c=Sb(b,16007);if(!c){c=Sb(b,34391);if(!c){break c}}d=c+4|0;break b}c=Sb(b,16008);if(!c){c=Sb(b,34392);if(!c){break a}}d=c+3|0}E[c|0]=0;fe(b,a);hb(65587,5,1,a);b=d;continue}break}fe(b,a)}function ml(a,b,c){var d=0,e=0;d=Fa-16|0;Fa=d;a:{if(G[c>>2]>0){break a}E[b|0]=0;L[d+8>>3]=a;G[d>>2]=0;if((Ya(b,71,19659,d)|0)<0){Ua(17928);G[c>>2]=402}e=jb(b,44);if(e){E[e|0]=46}if(!jb(b,78)){break a}Ua(35198);G[c>>2]=402}Fa=d+16|0}function Wo(a){var b=0,c=0,d=0;if(E[G[a>>2]]-48>>>0>=10){return 0}while(1){d=G[a>>2];c=-1;if(b>>>0<=214748364){c=E[d|0]-48|0;b=M(b,10);c=(c|0)>(2147483647-b|0)?-1:c+b|0}G[a>>2]=d+1;b=c;if(E[d+1|0]-48>>>0<10){continue}break}return b}function Vm(){var a=0,b=0,c=0;a=G[48624];a=I[((a>>>0>149?0:a)<<1)+143920>>1]+142088|0;b=G[47424];c=G[47440];if(H[4321]){hb(4321,Va(4321),1,189624);Ub(58,189624);Ub(32,189624)}hb(a,Va(a),1,189624);Ub(10,189624);G[47440]=c;G[47424]=b}function wf(a,b){var c=0,d=0;c=Fa-160|0;Fa=c;a:{if(!b){break a}d=c+128|0;uc(b,d);G[c+16>>2]=b;G[c+20>>2]=d;_a(a,69652,c+16|0);if(!ho(c+32|0)){break a}while(1){b=c+32|0;G[c>>2]=b;_a(a,70017,c);if(ho(b)){continue}break}}Fa=c+160|0}function ym(a,b,c){var d=0;d=Fa-112|0;Fa=d;a:{if((c|0)>0){G[d+80>>2]=c;c=d+104|0;db(c,18660,d+80|0);L[d+64>>3]=b;Eb(a,c,d- -64|0);break a}if(O(b)<2147483648){c=~~b}else{c=-2147483648}G[d+96>>2]=c;db(a,30633,d+96|0)}Fa=d+112|0}function Fc(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f|0]=0;a:{if(d){E[d|0]=0;if(G[e>>2]>0){break a}}if((kc(a,b,f+80|0,e)|0)>0){break a}mc(f+80|0,f,d,e)}E[c|0]=0;fd(f,c,e);g=G[e>>2]}Fa=f+176|0;return g}function Bu(a,b,c,d){var e=0,f=0,g=0,h=0;f=b^d;g=f>>31;e=b>>31;a=a^e;h=a-e|0;e=(b^e)-((a>>>0>>0)+e|0)|0;a=d>>31;b=c^a;f=f>>31;a=Du(h,e,b-a|0,(a^d)-((a>>>0>b>>>0)+a|0)|0)^f;b=a-f|0;Ia=(g^Ia)-((a>>>0>>0)+g|0)|0;return b}function Hb(a){a=a|0;var b=0,c=0,d=0,e=0;d=$a(a);e=Ja[G[a+12>>2]](a)|0;if(!(E[a|0]&1)){b=G[a+52>>2];if(b){G[b+56>>2]=G[a+56>>2]}c=G[a+56>>2];if(c){G[c+52>>2]=b}if(G[48750]==(a|0)){G[48750]=c}Wa(G[a+96>>2]);Wa(a)}return d|e}function Dl(){var a=0,b=0;if(H[3780288]){if(!G[950330]){Lb()}a=Xb(Va(3780288)+1|0);Yb(3780288,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}a=G[(G[950332]+(G[950330]<<2)|0)-4>>2];G[a+8>>2]=G[a+8>>2]+1}function Mj(a,b,c){var d=0;d=G[c>>2];if((d|0)<=0){if(!a){G[c>>2]=115;return 115}if(G[G[a+4>>2]+16>>2]!=555){G[c>>2]=114;return 114}d=b;b=lb(1,8);G[d>>2]=b;a=G[a+4>>2];G[b+4>>2]=a;G[a+8>>2]=G[a+8>>2]+1;d=G[c>>2]}return d}function kr(a,b,c,d,e){a=+a;b=+b;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;a:{if(G[c+4>>2]!=503){f=1;if(uj(c)){break a}}b=L[c+136>>3]-b;a=L[c+112>>3]*a;g=d,h=b*Kb(a),L[g>>3]=h;g=e,h=L[c+128>>3]-b*Mb(a),L[g>>3]=h;f=0}return f|0}function po(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f|0]=0;a:{if(d){E[d|0]=0;if(G[e>>2]>0){break a}}if((kc(a,b,f+80|0,e)|0)>0){break a}mc(f+80|0,f,d,e)}Wn(f,c,e);g=G[e>>2]}Fa=f+176|0;return g}function _f(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f|0]=0;a:{if(d){E[d|0]=0;if(G[e>>2]>0){break a}}if((kc(a,b,f+80|0,e)|0)>0){break a}mc(f+80|0,f,d,e)}Ie(f,c,e);g=G[e>>2]}Fa=f+176|0;return g}function Ec(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;g=G[e>>2];if((g|0)<=0){E[f|0]=0;a:{if(d){E[d|0]=0;if(G[e>>2]>0){break a}}if((kc(a,b,f+80|0,e)|0)>0){break a}mc(f+80|0,f,d,e)}lk(f,c,e);g=G[e>>2]}Fa=f+176|0;return g}function Au(a,b,c,d){var e=0,f=0,g=0,h=0,i=0,j=0;e=c>>>16|0;f=a>>>16|0;j=M(e,f);g=c&65535;h=a&65535;i=M(g,h);f=(i>>>16|0)+M(f,g)|0;e=(f&65535)+M(e,h)|0;Ia=(M(b,c)+j|0)+M(a,d)+(f>>>16)+(e>>>16)|0;return i&65535|e<<16}function hc(a){var b=0;b=Fa-32|0;Fa=b;if(G[321438]){G[b+16>>2]=a;_a(G[321467],70017,b+16|0);$a(G[321467]);G[321440]=G[321440]+1;Fa=b+32|0;return}G[b>>2]=a;_a(G[321435],80471,b);$a(G[321435]);Hb(G[321435]);sc(1);W()}function hd(a,b,c,d,e,f){var g=0;g=Fa-192|0;Fa=g;if(G[f>>2]<=0){G[g>>2]=c;G[g+4>>2]=d;E[g+112|0]=0;if((db(g+112|0,26741,g)|0)<0){Ua(17884);G[f>>2]=401}c=b;b=g+16|0;Ob(c,g+112|0,e,b,f);wb(a,b,f)}Fa=g+192|0}function Ol(a){var b=0,c=0,d=0,e=0;b=Fa-96|0;Fa=b;a=Jh(a,0,0);a:{if((Be(a,b+8|0)|0)<0){break a}d=ac(a,13287);if(!d){break a}c=G[b+48>>2];e=ab(c+1|0);c=zc(e,1,c,d);Hb(d);E[c+e|0]=0}Wa(a);Fa=b+96|0;return e}function nd(a,b,c,d,e){var f=0;f=Fa-256|0;Fa=f;if(!(e&73728|(c|0)<=(d|0))){d=c-d|0;c=d>>>0<256;cb(f,b&255,c?d:256);if(!c){while(1){gd(a,f,256);d=d-256|0;if(d>>>0>255){continue}break}}gd(a,f,d)}Fa=f+256|0}function zp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){G[j+8>>2]=f;Nc(a,30,b,c,d,e,1,j+8|0,g,0,h,i);break a}if(!(d|e)|G[i>>2]>0){break a}qe(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function pc(a,b){a=a|0;b=b|0;var c=0;a:{if(!a){a=G[48793];if(!a){break a}}c=Me(a,b)+a|0;if(!H[c|0]){G[48793]=0;return 0}a=qc(c,b)+c|0;if(H[a|0]){G[48793]=a+1;E[a|0]=0;return c|0}G[48793]=0}return c|0}function Wp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){G[j+8>>2]=f;Nc(a,31,b,c,d,e,1,j+8|0,g,0,h,i);break a}if(!(d|e)|G[i>>2]>0){break a}Ud(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function hl(a,b,c,d,e,f,g,h,i,j){var k=0;k=Fa-16|0;Fa=k;a:{if(Nb(a,j)){K[k+8>>2]=g;Nc(a,42,c,d,e,f,1,k+8|0,h,0,i,j);break a}ae(a,2,(b|0)>1?b:1,0,c,d,e,f,1,1,g,h,k+15|0,i,j)}Fa=k+16|0;return G[j>>2]}function wq(a,b){var c=0;if(!G[a+3312>>2]){return}c=G[a+3292>>2];G[a+3292>>2]=b;if(!(c|(b|0)!=1)){if(G[a+3288>>2]!=3){return}G[a+3288>>2]=6;return}if(!((c|0)!=1|b)&G[a+3288>>2]==5){G[a+3288>>2]=3}}function ct(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;a=M(a,48);d=a+757264|0;e=b>>>0<=J[d>>2];d=G[d+4>>2];if(e&(d|0)>=(c|0)|(c|0)<(d|0)){a=a+757256|0;G[a>>2]=b;G[a+4>>2]=c;a=0}else{a=107}return a|0}function Ad(a,b,c,d,e,f){var g=0,h=0;g=Fa-256|0;Fa=g;if(G[f>>2]<=0){if((Vc(a,b,g+176|0,g+96|0,f)|0)<=0){h=c;c=g+176|0;jl(h,d,c,f);Ob(b,c,e?H[e|0]==38?g+96|0:e:g+96|0,g,f);Hd(a,g,f)}}Fa=g+256|0}function wm(a,b,c,d){a:{if(!a){break a}b:{switch(b+2|0){case 0:E[a|0]=c;return;case 1:F[a>>1]=c;return;case 2:case 3:G[a>>2]=c;return;case 5:break b;default:break a}}G[a>>2]=c;G[a+4>>2]=d}}function el(a){var b=0;b=G[a+72>>2];G[a+72>>2]=b-1|b;b=G[a>>2];if(b&8){G[a>>2]=b|32;return-1}G[a+4>>2]=0;G[a+8>>2]=0;b=G[a+44>>2];G[a+28>>2]=b;G[a+20>>2]=b;G[a+16>>2]=b+G[a+48>>2];return 0}function Fj(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;Zc(j,b,c,d,e,f,g,h,i^-2147483648);d=G[j>>2];c=G[j+4>>2];b=G[j+12>>2];G[a+8>>2]=G[j+8>>2];G[a+12>>2]=b;G[a>>2]=d;G[a+4>>2]=c;Fa=j+16|0}function Ac(a,b){var c=0;a:{b:{if(a==0){if(b>=0){break a}c=180;if(!(b<0)){break b}break a}if(b!=0){break b}c=90;if(a>0){break a}c=-90;if(a<0){break a}}c=Db(a,b)*57.29577951308232}return c}function qh(){var a=0,b=0,c=0,d=0;a=G[50359];if((a|0)>0){while(1){a:{b=a-1|0;d=G[(b<<2)+199296>>2];c=H[d|0];E[d|0]=0;if((c|0)==27){break a}c=a>>>0>1;a=b;if(c){continue}}break}G[50359]=b}}function kt(a){a=a|0;var b=0,c=0,d=0;a=M(a,48);b=a+757236|0;c=a+757264|0;if((hb(G[b>>2],1,G[c>>2],G[29763])|0)!=G[c>>2]){Ua(60171);d=106}Wa(G[b>>2]);G[a+757232>>2]=0;G[b>>2]=0;return d|0}function vk(a){var b=0;b=1;a:{switch(a-11|0){case 9:case 10:return 2;case 19:case 20:case 29:case 30:case 31:return 4;case 71:return 8;default:b=0;break;case 0:case 3:break a}}return b} -function ur(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=G[a+84>>2];d=c+256|0;f=Vi(e,0,d);d=f?f-e|0:d;c=c>>>0>d>>>0?d:c;bb(b,e,c);b=e+d|0;G[a+84>>2]=b;G[a+8>>2]=b;G[a+4>>2]=c+e;return c|0}function Xa(a,b){var c=0,d=0;c=H[a|0];d=H[b|0];a:{if(!c|(c|0)!=(d|0)){break a}while(1){d=H[b+1|0];c=H[a+1|0];if(!c){break a}b=b+1|0;a=a+1|0;if((c|0)==(d|0)){continue}break}}return c-d|0}function Ab(a,b,c){var d=0,e=0;a:{if(!c){break a}while(1){e=G[(d<<3)+b>>2];if(!e){break a}if((a|0)==(e|0)){return G[((d<<3)+b|0)+4>>2]}d=d+1|0;if((d|0)!=(c|0)){continue}break}}return 0}function Xd(a){var b=0,c=0,d=0;c=G[925777];if((c|0)>0){d=G[925781];while(1){if(!Xa(a,G[(b<<2)+d>>2])){return G[G[925782]+(b<<2)>>2]}b=b+1|0;if((c|0)!=(b|0)){continue}break}}return 0}function _p(a,b,c,d,e,f,g,h,i,j){var k=0;k=Fa-16|0;Fa=k;a:{if(Nb(a,j)){G[k>>2]=f;G[k+4>>2]=g;Nc(a,81,b,c,d,e,1,k,h,0,i,j);break a}Se(a,2,1,0,b,c,d,e,1,1,f,g,h,k+15|0,i,j)}Fa=k+16|0}function Ek(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){K[j+12>>2]=h;bd(a,42,c,d,e,f,1,g,j+12|0,i);break a}Dk(a,2,(b|0)>1?b:1,0,c,d,e,f,g,h,i)}Fa=j+16|0;return G[i>>2]}function Ap(a,b,c,d,e,f,g,h,i,j){var k=0;k=Fa-16|0;Fa=k;a:{if(Nb(a,j)){G[k>>2]=f;G[k+4>>2]=g;Nc(a,80,b,c,d,e,1,k,h,0,i,j);break a}hf(a,2,1,0,b,c,d,e,1,1,f,g,h,k+15|0,i,j)}Fa=k+16|0}function cf(a,b){var c=0,d=0;c=Fa-1040|0;Fa=c;d=G[b>>2];a:{if(d){break a}if(!ui(c,1025)){E[a|0]=0;Ua(61910);d=125;G[b>>2]=125;break a}bf(c,1025,a,b);d=G[b>>2]}Fa=c+1040|0;return d}function Yg(a){var b=0;a:{b:{if(a>=1){if(!(a+-1<1e-10)){break b}break a}b=90;if(a==0){break a}if(!(a<=-1)){break b}b=180;if(a+1>-1e-10){break a}}b=Sc(a)*57.29577951308232}return b}function Bc(a){var b=0;a:{b:{if(a<=-1){b=-90;if(!(a+1>-1e-10)){break b}break a}if(a==0){break a}if(!(a>=1)){break b}b=90;if(a+-1<1e-10){break a}}b=fc(a)*57.29577951308232}return b}function gg(a){var b=0,c=0;b=G[47404];c=a+3&-4;a=b+c|0;a:{if(a>>>0<=b>>>0?c:0){break a}if(a>>>0>Ka()<<16>>>0){if(!(Ea(a|0)|0)){break a}}G[47404]=a;return b}G[48624]=48;return-1}function Am(a,b,c){var d=0,e=0,f=0;b=b*3.141592653589793/180;e=c,f=ib(b)*1,L[e+16>>3]=f;a=a*3.141592653589793/180;d=ib(a);b=eb(b);L[c+8>>3]=b*(d*1);e=c,f=b*(eb(a)*1),L[e>>3]=f}function vd(a,b,c,d,e,f){var g=0;g=Fa-16|0;Fa=g;qk(a,b,c,g+8|0,g,f);a=G[f>>2];a:{if((a|0)>0){break a}if(d){G[d>>2]=G[g+8>>2]}if(!e){break a}G[e>>2]=G[g>>2]}Fa=g+16|0;return a}function pl(a,b,c,d){var e=0,f=0;e=Fa-256|0;Fa=e;f=G[d>>2];if((f|0)<=0){if((Vc(a,b,e+96|0,e+176|0,d)|0)<=0){Ob(c,e+96|0,e+176|0,e,d);Hd(a,e,d)}f=G[d>>2]}Fa=e+256|0;return f}function Pp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){F[j+12>>1]=f;Nc(a,21,b,c,d,e,1,j+12|0,g,0,h,i);break a}jf(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function Mb(a){var b=0,c=0;c=Yc(a,360);b=1;a:{if(c==0){break a}c=O(c);if(c==90){return 0}b=-1;if(c==180){break a}b=0;if(c==270){break a}b=eb(a*.017453292519943295)}return b}function Kp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){F[j+12>>1]=f;Nc(a,20,b,c,d,e,1,j+12|0,g,0,h,i);break a}Gf(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function wp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){E[j+14|0]=f;Nc(a,11,b,c,d,e,1,j+14|0,g,0,h,i);break a}Re(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function Fo(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){E[j+14|0]=f;Nc(a,12,b,c,d,e,1,j+14|0,g,0,h,i);break a}Ef(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function cq(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){G[j+8>>2]=f;Nc(a,41,b,c,d,e,1,j+8|0,g,0,h,i);break a}Ud(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function Fp(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){G[j+8>>2]=f;Nc(a,40,b,c,d,e,1,j+8|0,g,0,h,i);break a}qe(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function Kb(a){var b=0,c=0;c=Yc(a+-90,360);b=1;a:{if(c==0){break a}if(c==90){return 0}b=-1;if(c==180){break a}b=0;if(c==270){break a}b=ib(a*.017453292519943295)}return b}function Jd(a,b,c,d,e){var f=0,g=0;f=Fa-256|0;Fa=f;if(G[e>>2]<=0){if((Vc(a,b,f+176|0,f+96|0,e)|0)<=0){g=d;d=f+176|0;If(c,g,d,e);Ob(b,d,f+96|0,f,e);Hd(a,f,e)}}Fa=f+256|0}function lb(a,b){a=a|0;b=b|0;var c=0,d=0;a:{if(!a){break a}c=Au(a,0,b,0);d=Ia;if((a|b)>>>0<65536){break a}c=d?-1:c}a=ab(c);if(!(!a|!(H[a-4|0]&3))){cb(a,0,c)}return a|0}function Xe(a){var b=0,c=0;b=Yc(a,360);a:{if(b==0|O(b)==180){break a}c=1;if(b==45|b==225){break a}c=-1;if(b==-135|b==-315){break a}c=Mc(a*.017453292519943295)}return c}function Hl(a){var b=0;if(!a){return 0}a:{if(G[a+12>>2]>=2){hb(72565,20,1,G[24367]);b=1;if(G[a+12>>2]>1){break a}}b=G[a+128>>2];if(!b){return 1}b=Ja[b|0](a)|0}return b}function qb(a,b,c){var d=0,e=0;d=Va(a)+a|0;a:{if(!c){break a}while(1){e=H[b|0];if(!e){break a}E[d|0]=e;d=d+1|0;b=b+1|0;c=c-1|0;if(c){continue}break}}E[d|0]=0;return a}function Zb(a,b,c,d){var e=0,f=0;e=Fa-16|0;Fa=e;c=E[c|0];a:{if((c|0)<=63){a=ob(a,b,d);break a}f=Za(e,b);b=f+Va(b)|0;E[b|0]=c;E[b+1|0]=0;a=ob(a,f,d)}Fa=e+16|0;return a}function Lj(a,b,c,d){b=Ja[G[(M(G[a+4>>2],84)+1240576|0)+76>>2]](G[a>>2],c,b)|0;if((b|0)!=107){if((b|0)<=0){return}Ua(38146);Ua(G[a+12>>2]);a=108}else{a=107}G[d>>2]=a}function Kc(a,b,c,d){var e=0,f=0;e=Fa-176|0;Fa=e;f=G[d>>2];if((f|0)<=0){E[e|0]=0;if((kc(a,b,e+80|0,d)|0)<=0){mc(e+80|0,e,0,d)}wi(e,c,d);f=G[d>>2]}Fa=e+176|0;return f}function jl(a,b,c,d){var e=0;e=Fa-16|0;Fa=e;a:{if(G[d>>2]>0){break a}E[c|0]=0;G[e>>2]=a;G[e+4>>2]=b;if((db(c,26741,e)|0)>=0){break a}Ua(17884);G[d>>2]=401}Fa=e+16|0}function gq(a,b,c,d,e,f,g,h,i){var j=0;j=Fa-16|0;Fa=j;a:{if(Nb(a,i)){L[j>>3]=f;Nc(a,82,b,c,d,e,1,j,g,0,h,i);break a}Id(a,2,1,0,b,c,d,e,1,1,f,g,j+15|0,h,i)}Fa=j+16|0}function Lm(a,b,c){var d=0,e=0;d=b;b=ab(2e3);a:{if(!Of(a,d,b)){break a}a=ci(b,5618);if(!a){break a}b:{if((Va(a)|0)<16){Za(c,a);break b}rb(c,a,15)}e=1}Wa(b);return e}function yb(a){a:{if((fe(a,189776)|0)<0){break a}b:{if(G[47464]==10){break b}a=G[47449];if((a|0)==G[47448]){break b}G[47449]=a+1;E[a|0]=10;break a}vh(189776,10)}}function ep(a){var b=0;b=G[a>>2]-1|0;b=E[(M(0-b&b,124511785)>>>27|0)+118560|0];if(!b){a=G[a+4>>2];a=E[(M(0-a&a,124511785)>>>27|0)+118560|0];b=a?a+32|0:0}return b}function Vc(a,b,c,d,e){var f=0,g=0;f=Fa-96|0;Fa=f;E[c|0]=0;if(d){E[d|0]=0}g=G[e>>2];if((g|0)<=0){if((kc(a,b,f,e)|0)<=0){mc(f,c,d,e)}g=G[e>>2]}Fa=f+96|0;return g}function Pb(a){var b=0,c=0,d=0;c=G[925783];if((c|0)>0){d=G[925773];while(1){if(!Xa(M(b,4108)+d|0,a)){return b}b=b+1|0;if((c|0)!=(b|0)){continue}break}}return-1}function Po(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,30,b,c,d,e,0,f,h+12|0,g);break a}if(G[g>>2]>0){break a}Qe(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Fk(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,31,b,c,d,e,0,f,h+12|0,g);break a}if(G[g>>2]>0){break a}xe(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Xg(a,b,c,d){var e=0;e=Fa-16|0;Fa=e;a=qa(a|0,b|0,c|0,d&255,e+8|0)|0;if(a){G[48624]=a;a=-1}else{a=0}Fa=e+16|0;Ia=a?-1:G[e+12>>2];return a?-1:G[e+8>>2]}function ql(a,b,c){var d=0;d=Fa-16|0;Fa=d;G[d+12>>2]=c;G[d+8>>2]=b;a=ha(a|0,d+8|0,1,d+4|0)|0;if(a){G[48624]=a;a=-1}else{a=0}Fa=d+16|0;return a?-1:G[d+4>>2]}function lg(a,b,c){var d=0;d=Fa-16|0;Fa=d;G[d+12>>2]=c;G[d+8>>2]=b;a=ga(a|0,d+8|0,1,d+4|0)|0;if(a){G[48624]=a;a=-1}else{a=0}Fa=d+16|0;return a?-1:G[d+4>>2]}function Te(a){var b=0;if(!(!a|!H[a|0])){if(!G[950330]){Lb()}b=a;a=Xb(Va(a)+1|0);Yb(b,a);b=G[(G[950332]+(G[950330]<<2)|0)-4>>2];Bb(a,b+24|0,b+12|0);pb(a)}}function Fh(a,b,c,d,e,f){var g=0,h=0;g=Fa-176|0;Fa=g;h=G[f>>2];if((h|0)<=0){h=c;c=g+96|0;jl(h,d,c,f);Ob(b,c,e,g,f);vl(a,g,f);h=G[f>>2]}Fa=g+176|0;return h}function Kj(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;d=Fa-16|0;Fa=d;Rc(d+12|0,a,b,f);b=0;if(!G[f>>2]){b=Um(G[d+12>>2],c,e,f)}Fa=d+16|0;return b|0}function Et(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;d=M(a,24);a=b;if(zf(G[d+202496>>2],a,a>>31,0)){a=116}else{a=d+202504|0;G[a>>2]=b;G[a+4>>2]=c;a=0}return a|0}function Zo(a,b,c,d,e,f,g,h){var i=0;i=Fa-16|0;Fa=i;a:{if(Nb(a,h)){L[i+8>>3]=g;bd(a,82,b,c,d,e,1,f,i+8|0,h);break a}Hk(a,2,1,0,b,c,d,e,f,g,h)}Fa=i+16|0}function Ue(a){var b=0;b=0;a:{if(!G[925765]){break a}b=1;if(G[925783]<=(a|0)){break a}a=G[925773]+M(a,4108)|0;b=!Xa(G[a+4096>>2],a+3072|0)}return b}function vu(a){a=a|0;var b=0,c=0;if((a|0)<0|G[47759]<=(a|0)){a=b}else{b=M(a,65544);c=G[b+G[968817]>>2];if(c){Ce(c);G[b+G[968817]>>2]=0}}return a|0}function cj(){var a=0;a=G[935824];if((a|0)<=0){hb(72586,38,1,G[24367]);return}a=G[(a<<2)+3743308>>2];bb(3743040,a,256);pb(a);G[935824]=G[935824]-1}function Cu(a,b){var c=0;c=b>>31;a=a^c;zu(a-c|0,(b^c)-((a>>>0>>0)+c|0)|0,2880,0);Ia=Ha;a=c^Ga;b=a-c|0;Ia=(c^Ia)-((a>>>0>>0)+c|0)|0;return b}function Ag(a){var b=0,c=0;b=Fa-16|0;Fa=b;c=-1;a:{if(si(a)){break a}if((Ja[G[a+32>>2]](a,b+15|0,1)|0)!=1){break a}c=H[b+15|0]}Fa=b+16|0;return c}function sq(){var a=0,b=0,c=0;if(L[24400]==0){b=195200,c=+fa(),L[b>>3]=c}a=(+fa()-L[24400])*1e3;if(O(a)<2147483648){return~~a}return-2147483648}function nm(a,b,c,d){a:{if((fe(a,189624)|0)<0){break a}if(!hb(b,Va(b),1,189624)){break a}if((hb(c,1,d,189624)|0)!=(d|0)){break a}Ub(10,189624)}}function hb(a,b,c,d){var e=0;e=M(b,c);a:{if(G[d+76>>2]<0){a=Qk(a,e,d);break a}a=Qk(a,e,d)}if((e|0)==(a|0)){return b?c:0}return(a>>>0)/(b>>>0)|0}function ie(a,b,c,d){a=Ye(a,b);if(!a){return 0}if((Va(a)|0)<(c|0)){Za(d,a);return 1}if((c|0)>=2){rb(d,a,c-1|0);return 1}E[d|0]=H[a|0];return 1}function Yf(a){var b=0,c=0,d=0,e=0;d=Va(a);if(d){while(1){e=a+b|0;c=E[e|0];E[e|0]=c-97>>>0<26?c&95:c;b=b+1|0;if((d|0)!=(b|0)){continue}break}}}function Rl(a){var b=0;b=H[a|0];if(b){while(1){b=b<<24>>24;if(b-65>>>0<26){E[a|0]=b-65>>>0<26?b|32:b}b=H[a+1|0];a=a+1|0;if(b){continue}break}}}function Vj(a){var b=0,c=0;b=Fa-32|0;Fa=b;a=na(a|0,b+8|0)|0;a:{if(!a){a=59;c=1;if(H[b+8|0]==2){break a}}G[48624]=a;c=0}a=c;Fa=b+32|0;return a}function Uf(a,b){var c=0,d=0;c=Va(a)+1|0;d=b&255;while(1){a:{b=0;if(!c){break a}c=c-1|0;b=c+a|0;if((d|0)!=H[b|0]){continue}}break}return b}function Cq(a,b){var c=0,d=0,e=0,f=0;c=256;while(1){e=c+d>>1;f=G[(e<<2)+b>>2]>(a|0);c=f?e:c;d=f?d:e;if((c-d|0)!=1){continue}break}return d}function zd(a){var b=0,c=0;b=Fa-16|0;Fa=b;G[b+4>>2]=41606;G[b>>2]=a;c=G[24367];_a(c,91416,b);if((a|0)==1007){hb(90359,1056,1,c)}ca(3);W()}function Yo(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,12,b,c,d,e,0,f,h+15|0,g);break a}Bh(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Vo(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,20,b,c,d,e,0,f,h+14|0,g);break a}Ah(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function To(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,40,b,c,d,e,0,f,h+12|0,g);break a}Qe(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Sk(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,11,b,c,d,e,0,f,h+15|0,g);break a}pe(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Rk(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,21,b,c,d,e,0,f,h+14|0,g);break a}Ng(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Mo(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,41,b,c,d,e,0,f,h+12|0,g);break a}xe(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Ho(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,42,b,c,d,e,0,f,h+12|0,g);break a}Kg(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function _o(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;a:{if(Nb(a,g)){bd(a,82,b,c,d,e,0,f,h+8|0,g);break a}Ff(a,2,1,0,b,c,d,e,f,g)}Fa=h+16|0}function Kt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=b;b=G[b>>2]+7&-8;G[c>>2]=b+16;d=a,e=Ui(G[b>>2],G[b+4>>2],G[b+8>>2],G[b+12>>2]),L[d>>3]=e}function Pi(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=G[a+4>>2];c=a;break a}b=b-32|0;c=a+4|0}c=G[c>>2];G[a+4>>2]=d>>>b;G[a>>2]=d<<32-b|c>>>b}function Ni(a,b){var c=0,d=0;a:{if(b>>>0<=31){d=G[a>>2];c=a+4|0;break a}b=b-32|0;c=a}c=G[c>>2];G[a>>2]=d<>2]=c<>>32-b}function an(a){var b=0;b=G[310142];while(1){if((b|0)<=0){return}b=b-1|0;if(Xa(M(b,84)+1240576|0,42101)){continue}break}G[a>>2]=b}function ll(a,b,c,d,e,f){var g=0,h=0;g=Fa-176|0;Fa=g;if(G[f>>2]<=0){h=d;d=g+96|0;If(c,h,d,f);Ob(b,d,e,g,f);wb(a,g,f)}Fa=g+176|0}function fi(a,b,c,d){if(!(Ja[G[(M(G[a+4>>2],84)+1240576|0)+80>>2]](G[a>>2],c,b)|0)){return}Ua(38001);Ua(G[a+12>>2]);G[d>>2]=106}function Qg(a,b,c,d,e,f){var g=0,h=0;g=Fa-176|0;Fa=g;if(G[f>>2]<=0){h=d;d=g+96|0;hg(c,h,d,f);Ob(b,d,e,g,f);wb(a,g,f)}Fa=g+176|0}function De(a){var b=0;b=-45;a:{if(a==-1){break a}b=0;if(a==0){break a}b=45;if(a==1){break a}b=Pd(a)*57.29577951308232}return b}function lf(a,b){a:{b:{if(!a){a=ab(b);if(a){break b}break a}a=ub(a,b);if(a){break b}break a}return a}lg(1,88508,38);sc(1);W()}function kd(a,b,c){var d=0,e=0,f=0;d=Fa-32|0;Fa=d;a=ci(a,b);if(a){e=c,f=sb(Za(d,a)),L[e>>3]=f;a=1}else{a=0}Fa=d+32|0;return a}function vq(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;if(G[e>>2]<=0){g=c;c=f+96|0;kl(g,c,e);Ob(b,c,d,f,e);vl(a,f,e)}Fa=f+176|0}function Hf(a,b,c,d,e,f,g,h,i,j,k,l){var m=0;m=Fa-16|0;Fa=m;Id(a,b,c,d,e,f,g,h,1,1,i,j,m+15|0,k,l);Fa=m+16|0;return G[l>>2]}function Ae(a){var b=0;b=Fa-16|0;Fa=b;G[b>>2]=a;_a(G[321435],83707,b);$a(G[321435]);$a(G[321435]);Hb(G[321435]);sc(1);W()}function Rg(a,b,c,d,e){var f=0;f=Fa-176|0;Fa=f;if(G[e>>2]<=0){F[f+96>>1]=c?84:70;Ob(b,f+96|0,d,f,e);wb(a,f,e)}Fa=f+176|0}function be(a,b,c,d,e){var f=0,g=0;f=Fa-176|0;Fa=f;if(G[e>>2]<=0){g=f+96|0;ml(c,g,e);Ob(b,g,d,f,e);wb(a,f,e)}Fa=f+176|0}function Cs(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;Ze(a,0,c,d,e,h,i,j,k)}function Bs(a,b,c,d,e,f,g,h,i,j,k){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;j=+j;k=+k;Ze(a,1,c,d,e,h,i,j,k)}function Ya(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=Fa-16|0;Fa=e;G[e+12>>2]=d;a=oo(a,b,c,d);Fa=e+16|0;return a|0}function Tm(a,b,c,d,e,f,g,h,i){G[a>>2]=b;G[a+4>>2]=c;G[a+8>>2]=d;G[a+12>>2]=e&65535|(i>>>16&32768|e>>>16&32767)<<16}function Wc(a){var b=0,c=0;c=+fa()/1e3;a:{if(O(c)<2147483648){b=~~c;break a}b=-2147483648}if(a){G[a>>2]=b}return b}function Df(a,b,c,d,e,f,g,h){var i=0;i=Fa-16|0;Fa=i;xh(a,b,c,d,1,0,1,0,1,e,f,i+14|0,g,h);Fa=i+16|0;return G[h>>2]} -function Zk(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;Ud(a,b,c,d,1,0,1,0,1,1,0,e,h+15|0,f,g);Fa=h+16|0;return G[g>>2]}function Up(a,b,c,d,e,f,g){var h=0;h=Fa-16|0;Fa=h;if(G[g>>2]<=0){Ud(a,b,c,d,1,0,1,0,1,1,0,e,h+15|0,f,g)}Fa=h+16|0}function em(a){var b=0;a=fm(a,589824,0);if((a|0)>=0){b=lb(1,2072);if(!b){da(a|0)|0;return 0}G[b+8>>2]=a}return b}function Fs(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;if(!d){return 0}if(b){G[a+12>>2]=b}return 1}function wc(a){var b=0;b=Fa-80|0;Fa=b;if(!G[309737]){G[309737]=431}a=rb(b,a,80);E[a+79|0]=0;Ua(a);Fa=b+80|0}function st(a,b,c){a=a|0;b=b|0;c=c|0;if((a|0)==1){a=(zc(b,1,c,G[30060])|0)==(c|0)?0:107}else{a=1}return a|0}function rt(a,b,c){a=a|0;b=b|0;c=c|0;if((a|0)==2){a=(hb(b,1,c,G[29763])|0)==(c|0)?0:106}else{a=1}return a|0}function lj(a){var b=0;b=Fa-16|0;Fa=b;G[b>>2]=a;_a(G[321435],80471,b);$a(G[321435]);Hb(G[321435]);sc(1);W()}function Nq(a){a=a|0;var b=0;a:{if(!a){break a}a=G[a+160>>2];if(!a){break a}b=(Xa(a,64156)|0)!=0}return b|0}function Gl(a,b,c,d,e){var f=0;f=G[e>>2];if((f|0)<=0){if((gj(a,b,c,d,e)|0)==202){G[e>>2]=f;lc(a,b,c,d,e)}}}function ft(a,b){a=a|0;b=b|0;var c=0;a=M(a,48)+757264|0;c=G[a+4>>2];G[b>>2]=G[a>>2];G[b+4>>2]=c;return 0}function ek(a){var b=0;a=fk(a);b=Ia;if((b|0)>=0&a>>>0>=2147483648|(b|0)>0){G[48624]=61;return-1}return a}function Ed(a){var b=0;b=la(-100,a|0,0)|0;if((b|0)==-31){b=va(a|0)|0}if(b>>>0>=4294963201){G[48624]=0-b}}function lm(a){if(G[a+76>>2]>=0){vi(a,0,0,0);G[a>>2]=G[a>>2]&-33;return}vi(a,0,0,0);G[a>>2]=G[a>>2]&-33}function sf(a,b,c){a=ci(a,b);if(!a){return 0}if((Va(a)|0)<2e3){Za(c,a);return 1}rb(c,a,1999);return 1}function Lc(a){var b=0;if(!a){return 0}b=ab(Va(a)+1|0);if(b){return Za(b,a)}lg(1,88508,38);sc(1);W()}function gk(a){if(G[a+76>>2]<0){a=G[a+60>>2]}else{a=G[a+60>>2]}if((a|0)<0){G[48624]=8;a=-1}return a}function _c(a,b,c,d,e){Ge(d,b);if((c|0)==8){c=a;a=b<<3;Wb(c,a,a>>31,d,e);return}wd(a,8,b,c-8|0,d,e)}function Oe(a,b,c,d,e){Af(d,b);if((c|0)==2){c=a;a=b<<1;Wb(c,a,a>>31,d,e);return}wd(a,2,b,c-2|0,d,e)}function Eh(a,b,c,d,e,f,g,h,i,j,k,l,m,n){if(!(!(g|h)|G[n>>2]>0)){Ud(a,b,c,d,e,f,g,h,1,i,j,k,l,m,n)}}function Dh(a,b,c,d,e,f,g,h,i,j,k,l,m,n){if(!(!(g|h)|G[n>>2]>0)){qe(a,b,c,d,e,f,g,h,1,i,j,k,l,m,n)}}function $c(a,b,c,d,e){ke(d,b);if((c|0)==4){c=a;a=b<<2;Wb(c,a,a>>31,d,e);return}wd(a,4,b,c-4|0,d,e)}function Be(a,b){a=a|0;b=b|0;a=sa(a|0,b|0)|0;if(a>>>0>=4294963201){G[48624]=0-a;a=-1}return a|0}function xn(a,b){return b*2247116418577895e292*af(a+-1416.0996898839683)*2247116418577895e292}function Vg(a){a=a|0;a=la(-100,a|0,0)|0;if(a>>>0>=4294963201){G[48624]=0-a;a=-1}return a|0} -function Ro(a,b,c,d,e,f,g){if(Nb(a,g)){Ua(28105);G[g>>2]=413;return}zh(a,2,1,0,b,c,d,e,f,g)}function On(a){a=a|0;a=M(a,24)+202496|0;if(Hb(G[a>>2])){a=110}else{G[a>>2]=0;a=0}return a|0}function It(a,b){a=a|0;b=b|0;var c=0;c=G[b>>2];if(!(!a|(c|0)>0)){Wa(a);c=G[b>>2]}return c|0}function Gk(a,b,c,d,e,f,g){if(Nb(a,g)){Ua(28161);G[g>>2]=413;return}yh(a,2,1,0,b,c,d,e,f,g)}function xi(a,b,c){var d=0;d=G[c>>2];if((d|0)<=0){mb(a,G[a>>2]+2|0,b,c);d=G[c>>2]}return d}function rq(a){tq();Ba(a|0,195256);G[48824]=G[(G[48822]?195192:195188)>>2];return 195256}function it(a){a=a|0;a=M(a,48)+757232|0;Wa(G[G[a>>2]>>2]);G[a>>2]=0;G[a+4>>2]=0;return 0}function le(a){a=a|0;var b=0,c=0;b=Va(a)+1|0;c=ab(b);if(!c){return 0}return bb(c,a,b)|0}function bm(a,b){var c=0;c=$b(10,+(b|0));if(a<0){return T(a*c+-.5)/c}return S(a*c+.5)/c}function Eu(a,b){var c=0,d=0;c=b&31;d=(-1>>>c&a)<>>a}function dc(a,b,c,d,e){var f=0;f=Fa-80|0;Fa=f;fo(a,b,c,f,d,e);Fa=f+80|0;return G[e>>2]}function ol(a){tq();Aa(a|0,195212);G[48813]=33340;G[48811]=0;G[48812]=0;return 195212}function tg(a){if(a){Wa(G[a+4>>2]);Wa(G[a>>2]);Wa(G[a+20>>2]);Wa(G[a+12>>2]);Wa(a)}}function rd(a){var b=0;b=Fa-16|0;Fa=b;E[b+15|0]=0;a=qj(a,b+15|0);Fa=b+16|0;return a}function fj(a){a=da(a|0)|0;a=(a|0)==27?0:a;if(a){G[48624]=a;a=-1}else{a=0}return a}function Mt(a,b){a=a|0;b=b|0;var c=0,d=0;c=L[a>>3];d=L[b>>3];return(cd)|0}function we(a,b,c,d,e){if((c|0)==1){Wb(a,b,b>>31,d,e);return}wd(a,1,b,c-1|0,d,e)}function Rc(a,b,c,d){var e=0;e=Fa-32|0;Fa=e;ch(a,b,c,d);Fa=e+32|0;return G[d>>2]}function qd(a){var b=0;b=Fa-16|0;Fa=b;G[b>>2]=a;_a(G[24367],70017,b);sc(2);W()}function bi(a,b){if((b|0)<=0){G[321300]=0;b=(Pc(a,35790)-a|0)+80|0}G[321300]=b}function $q(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=Xg(G[a+60>>2],b,c,d);return a|0}function kb(a,b){var c=0;c=Fa-16|0;Fa=c;G[c+12>>2]=b;Ak(189776,a,b);Fa=c+16|0}function gb(a,b){var c=0;c=Fa-16|0;Fa=c;G[c+12>>2]=b;zk(189776,a,b);Fa=c+16|0}function zf(a,b,c,d){if(G[a+76>>2]<0){return vi(a,b,c,d)}return vi(a,b,c,d)}function xb(a,b,c){var d=0;d=Fa-16|0;Fa=d;G[d+12>>2]=c;zk(a,b,c);Fa=d+16|0}function _a(a,b,c){var d=0;d=Fa-16|0;Fa=d;G[d+12>>2]=c;Ak(a,b,c);Fa=d+16|0}function eo(a,b,c,d){var e=0;e=Fa-16|0;Fa=e;co(a,b,c,e+8|0,e,d);Fa=e+16|0}function Ym(a,b,c){Za(b,M(G[G[a+4>>2]+4>>2],84)+1240576|0);return G[c>>2]}function Jo(a,b,c,d,e,f,g,h,i,j){if(G[j>>2]<=0){xe(a,b,c,d,e,f,g,h,i,j)}}function fe(a,b){var c=0;c=a;a=Va(a);return(hb(c,1,a,b)|0)!=(a|0)?-1:0}function et(a){a=a|0;a=M(a,48)+757232|0;G[a>>2]=0;G[a+4>>2]=0;return 0}function vt(a,b){a=a|0;b=b|0;G[b>>2]=2147483647;G[b+4>>2]=0;return 0}function Zq(a,b){a=a|0;b=b|0;if(!G[321387]){G[321388]=b;G[321387]=a}}function Ks(a){a=a|0;var b=0;b=G[47542];if(a){G[47542]=a}return b|0}function Ic(a,b){a=lb(a,b);if(!a){lg(1,88508,38);sc(1);W()}return a}function fk(a){if(G[a+76>>2]<0){a=Sn(a);return a}a=Sn(a);return a}function Xb(a){a=ab(a);if(!a){lg(1,88508,38);sc(1);W()}return a}function Gt(a,b){a=a|0;b=b|0;a=G[a>>2]+1|0;G[b>>2]=a;return a|0}function Bt(a){a=a|0;return($a(G[M(a,24)+202496>>2])?106:0)|0}function rl(a,b,c,d){if(G[d>>2]<=0){ef(a,b+1|0,d);Hd(a,c,d)}}function Xq(a,b){a=a|0;b=b|0;return(K[a>>2]<=K[b>>2]?-1:1)|0}function Ve(a,b){if(!G[321387]){G[321388]=b;G[321387]=a}ua()}function io(a,b,c){Za(b,G[G[a+4>>2]+12>>2]);return G[c>>2]}function Jt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Ia=0;return 0}function Gh(){yl(G[952413],G[952414],G[952415],G[952416])}function op(a,b,c){a=a|0;b=b|0;c=c|0;return ab(M(b,c))|0}function xt(a,b,c){a=a|0;b=b|0;c=c|0;G[c>>2]=1;return 0}function ut(a){a=a|0;if((a|0)==2){$a(G[29763])}return 0}function jt(a,b,c){a=a|0;b=b|0;c=c|0;return Gn(a,0,c)|0}function jb(a,b){a=Gg(a,b);return H[a|0]==(b&255)?a:0}function Gu(a){if(a){return 31-P(a-1^a)|0}return 32} -function Fn(a,b){a=ti(a,b,10,0,-2147483648);return a}function Ih(a){a=qc(a,36372)+a|0;return H[a|0]?a:0}function nc(a,b,c){return ti(a,b,c,-2147483648,0)}function Bd(a,b,c,d,e,f){pf(a,b,c,a+3912|0,d,e,f)}function wt(a,b){a=a|0;b=b|0;G[b>>2]=2;return 0}function Zt(a){a=a|0;a=Fa-a&-16;Fa=a;return a|0}function qt(a){a=a|0;return(a|0)==32|a-9>>>0<5}function gd(a,b,c){if(!(H[a|0]&32)){Qk(b,c,a)}}function Qh(){var a=0;a=G[925769];if(a){Hb(a)}}function tt(a,b,c){a=a|0;b=b|0;c=c|0;return 1}function Uq(a){a=a|0;return da(G[a+60>>2])|0}function Du(a,b,c,d){a=zu(a,b,c,d);return a}function Yt(a,b){a=a|0;b=b|0;if(b){Wa(b)}}function He(a,b,c){return zf(a,b,b>>31,c)}function Gb(a,b){Za(Va(a)+a|0,b);return a}function Pn(a){a=a|0;G[a>>2]=10;return 0}function Qn(a){a=a|0;G[a>>2]=0;return 0}function Ak(a,b,c){return Lk(a,b,c,0,0)}function tq(){Ca(195180,195184,195188)}function ug(a,b){return ec(a,b,Va(a))}function kg(a){a=a|0;return(a|0)!=0|0}function sc(a){Ve(1285568,a?a:1);W()}function _e(a,b){a=a|0;b=b|0;Qb(a,b)}function Ct(a){a=a|0;Ed(a);return 0}function _l(a){fj(G[a+8>>2]);Wa(a)}function Pt(a,b){a=a|0;b=b|0;Wa(b)}function pu(a){a=a|0;return+oj(a)}function zk(a,b,c){Lk(a,b,c,1,0)}function nu(){return G[321386]}function Fu(a,b){Ia=a;return b}function sb(a){return vb(a,0)}function Gi(a){a=a|0;return 0}function jd(a){Za(1285424,a)}function yu(){return 194496}function pb(a){if(a){Wa(a)}}function _t(a){a=a|0;Fa=a}function $t(){return Fa|0}function Ua(a){tb(5,a)}function $p(){return 0}function rh(){tb(6,0)} -// EMSCRIPTEN_END_FUNCS -e=H;p(Sa);var Ja=c([null,Lt,Kt,Ht,ur,$q,_q,Wq,Uq,op,Pt,jp,Ot,Nt,Mt,Gi,Jt,ub,Nn,$s,_s,Zs,Ys,Xs,sn,rn,qn,Ws,Vs,Us,Ss,Rs,Qs,Ts,Ps,Os,Ns,Ms,bk,At,Et,Bt,Dt,Ct,On,Ft,ck,dk,yt,Pn,Qn,Gi,$p,Rn,at,bt,ct,ft,it,nt,pt,Pn,Qn,Gi,$p,In,et,lt,mt,kt,ht,gt,Gn,jt,zt,ot,dt,xt,wt,Gi,vt,ut,tt,st,rt,es,ds,cs,bs,as,$r,_r,Zr,Yr,Xr,Wr,Vr,Ur,Tr,Sr,Rr,Qr,Pr,Or,Nr,Mr,Lr,Kr,Jr,Ir,Hr,Gr,Fr,Er,Dr,Cr,Br,Ar,zr,yr,xr,wr,vr,tr,sr,rr,qr,pr,or,nr,mr,lr,kr,jr,ir,hr,gr,fr,er,dr,cr,br,ar,Xq,Pq,kg,kg,kg,kg,Nq,kg,kg,Mq,Lq,Gh,Yq,Ya,qt,le,pc,rb,Vq,ac,zc,Hb,Vg,Tq,Sq,Qq,Oq,Rq,xu,Be,lb,op,Yt]);function Ka(){return D.byteLength/65536|0}function Pa(Qa){Qa=Qa|0;var La=Ka()|0;var Ma=La+Qa|0;if(La=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":2147483648/65536})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="astroem.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmTable=Module["asm"]["wb"];addOnInit(Module["asm"]["J"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={194112:()=>{return self.Regions.NSHAPE()},194144:($0,$1,$2)=>{self.Regions.FINIT($0,$1,$2)},194176:($0,$1,$2)=>{return self.Regions.FILTER($0,$1,$2)},194216:($0,$1,$2)=>{if(typeof self.Regions!=="object"){self.Regions={}}self.Regions.NSHAPE=function(){return $0};self.Regions.FINIT=new Function("g","x","y",UTF8ToString($1));self.Regions.FILTER=new Function("g","x","y","return ("+UTF8ToString($2)+")")}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":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)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode:e=>{var code=e.code;return ERRNO_CODES[code]},mount:mount=>{return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode:(parent,name,mode,dev)=>{if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode:path=>{var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return stat.mode},realPath:node=>{var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},flagsForNode:flags=>{flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(28)}},node_ops:{getattr:node=>{var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:(node,attr)=>{var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},lookup:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod:(parent,name,mode,dev)=>{var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return node},rename:(oldNode,newDir,newName)=>{var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}oldNode.name=newName},unlink:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},rmdir:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readdir:node=>{var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},symlink:(parent,newName,oldPath)=>{var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readlink:node=>{var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=nodePath.relative(nodePath.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}},stream_ops:{open:stream=>{var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},close:stream=>{try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},read:(stream,buffer,offset,length,position)=>{if(length===0)return 0;try{return fs.readSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},write:(stream,buffer,offset,length,position)=>{try{return fs.writeSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},llseek:(stream,offset,whence)=>{var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap:(stream,length,position,prot,flags)=>{if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(mmapFlags&2){return 0}var bytesWritten=NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get function(){return this.shared.position},set:function(val){this.shared.position=val}}}}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"NODEFS":NODEFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){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.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function ___syscall_ftruncate64(fd,length_low,length_high){try{var length=convertI32PairToI53Checked(length_low,length_high);if(isNaN(length))return-61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(52);return-1}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();if(ENVIRONMENT_IS_NODE){requireNodeFS();NODEFS.staticInit()}ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};var ASSERTIONS=false;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}function intArrayToString(array){var ret=[];for(var i=0;i255){if(ASSERTIONS){assert(false,"Character code "+chr+" ("+String.fromCharCode(chr)+") at offset "+i+" not in 0x00-0xFF.")}chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}var decodeBase64=typeof atob=="function"?atob:function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();Module["print"]=function(text){console.log(text)};Module["rootdir"]="/";Module["vfile"]=function(filename,buf,canOwn){let size;if(buf){try{FS.unlink(Module["rootdir"]+filename)}catch(e){}FS.createDataFile(Module["rootdir"],filename,buf,true,true,canOwn);if(buf.length!==undefined){size=buf.length}else if(buf.byteLength!==undefined){size=buf.byteLength}else if(buf.size!==undefined){size=buf.size}else{size=-1}return{path:filename,size:size}}return FS.readFile(Module["rootdir"]+filename,{encoding:"binary"})};Module["vread"]=function(filename,mode){mode=mode||"utf8";return FS.readFile(Module["rootdir"]+filename,{encoding:mode})};Module["vsize"]=function(filename){let buf={size:-1};try{buf=FS.stat(Module["rootdir"]+filename)}catch(e){}return buf.size};Module["vunlink"]=function(filename){try{FS.unlink(Module["rootdir"]+filename)}catch(e){}};Module["vmount"]=function(root,mntpnt){let got=1;try{FS.mkdir(mntpnt);FS.mount(NODEFS,{root:root},mntpnt)}catch(e){got=0;FS.rmdir(mntpnt)}return got};Module["arrfile"]=function(filename,arr){Module["vunlink"](filename);FS.createDataFile(Module["rootdir"],filename,arr,true,true,false);return{path:filename,size:arr.byteLength}};Module["gzcompress"]=function(data){let ret;const gzFile=ccall("gzopen","number",["string","string"],["output.gz","wb"]);const buffer=_malloc(data.length);HEAPU8.set(data,buffer);ccall("gzwrite","number",["number","number","number"],[gzFile,buffer,data.length]);ccall("gzclose","number",["number"],[gzFile]);_free(buffer);ret=new Uint8Array(FS.root.contents["output.gz"].contents);FS.unlink("output.gz");return ret};Module["gzdecompress"]=function(data,filename,canOwn){let i,ret,curr,len,gzFile;let total=0;const BUFSIZE=1024*1024;const buffer=_malloc(BUFSIZE);const chunks=[];FS.createDataFile(Module["rootdir"],"input.gz",data,true,true,false);gzFile=ccall("gzopen","number",["string","string"],["input.gz","rb"]);while(true){len=ccall("gzread","number",["number","number","number"],[gzFile,buffer,BUFSIZE]);if(len<=0){break}chunks.push(new Uint8Array(len));chunks[chunks.length-1].set(HEAPU8.subarray(buffer,buffer+len));total+=len}ccall("gzclose","number",["number"],[gzFile]);FS.unlink("input.gz");_free(buffer);ret=new Uint8Array(total);curr=0;for(i=0;i0?bin:1/Math.abs(bin);hdu.x1=getValue(hptr+24,"i32");hdu.y1=getValue(hptr+28,"i32");hdu.x2=getValue(hptr+40,"i32");hdu.y2=getValue(hptr+44,"i32");hdu.naxis1=Math.floor((hdu.x2-hdu.x1+1)/xbin);hdu.naxis2=Math.floor((hdu.y2-hdu.y1+1)/xbin);hdu.bitpix=getValue(hptr+56,"i32");if(opts.filter){hdu.filter=opts.filter}if(slice){hdu.slice=slice}status=getValue(hptr+60,"i32");_free(hptr);Module["errchk"](status);if(!bufptr||doerr){Module["error"]("can't convert image to array (image too large?)")}datalen=hdu.naxis1*hdu.naxis2;switch(hdu.bitpix){case 8:hdu.image=new Uint8Array(HEAPU8.subarray(bufptr,bufptr+datalen));break;case 16:hdu.image=new Int16Array(HEAP16.subarray(bufptr/2,bufptr/2+datalen));break;case-16:hdu.image=new Uint16Array(HEAPU16.subarray(bufptr/2,bufptr/2+datalen));break;case 32:hdu.image=new Int32Array(HEAP32.subarray(bufptr/4,bufptr/4+datalen));break;case-32:hdu.image=new Float32Array(HEAPF32.subarray(bufptr/4,bufptr/4+datalen));break;case-64:hdu.image=new Float64Array(HEAPF64.subarray(bufptr/8,bufptr/8+datalen));break;default:Module["error"](`${hdu.bitpix}-bit FITS data is not supported`);break}hptr=_malloc(20);setValue(hptr+12,0,"i32");ccall("getHeaderToString",null,["number","number","number","number"],[ofptr,hptr,hptr+8,hptr+12]);hdu.ncard=getValue(hptr+8,"i32");bufptr2=getValue(hptr,"*");buf=new Uint8Array(HEAPU8.subarray(bufptr2,bufptr2+hdu.ncard*80));buflen=buf.byteLength;hdu.cardstr="";for(i=0;i{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;function logExceptionOnExit(e){if(e instanceof ExitStatus)return;let toLog=e;err("exiting due to exception: "+toLog)}var fs;var nodePath;var requireNodeFS;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}requireNodeFS=()=>{if(!nodePath){fs=require("fs");nodePath=require("path")}};read_=function shell_read(filename,binary){requireNodeFS();filename=nodePath["normalize"](filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror)=>{requireNodeFS();filename=nodePath["normalize"](filename);fs.readFile(filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",function(reason){throw reason});quit_=(status,toThrow)=>{if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}logExceptionOnExit(toThrow);process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=title=>document.title=title}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=value=>{tempRet0=value};var getTempRet0=()=>tempRet0;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}function getCFunc(ident){var func=Module["_"+ident];return func}function ccall(ident,returnType,argTypes,args,opts){var toC={"string":function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){var len=(str.length<<2)+1;ret=stackAlloc(len);stringToUTF8(str,ret,len)}return ret},"array":function(arr){var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeArrayToMemory(array,buffer){HEAP8.set(array,buffer)}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function keepRuntimeAlive(){return noExitRuntime}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){{if(Module["onAbort"]){Module["onAbort"](what)}}what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="astroemw.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["I"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["wb"];addOnInit(Module["asm"]["J"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={194112:()=>{return self.Regions.NSHAPE()},194144:($0,$1,$2)=>{self.Regions.FINIT($0,$1,$2)},194176:($0,$1,$2)=>{return self.Regions.FILTER($0,$1,$2)},194216:($0,$1,$2)=>{if(typeof self.Regions!=="object"){self.Regions={}}self.Regions.NSHAPE=function(){return $0};self.Regions.FINIT=new Function("g","x","y",UTF8ToString($1));self.Regions.FILTER=new Function("g","x","y","return ("+UTF8ToString($2)+")")}};function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func=="number"){if(callback.arg===undefined){getWasmTableEntry(func)()}else{getWasmTableEntry(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function getValue(ptr,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return Number(HEAPF64[ptr>>3]);default:abort("invalid type for getValue: "+type)}return null}var wasmTableMirror=[];function getWasmTableEntry(funcPtr){var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func}function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":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)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:(l,r)=>{return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");return function(){return crypto_module["randomBytes"](1)[0]}}catch(e){}}return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){abort()}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{NODEFS.isWindows=!!process.platform.match(/^win/);var flags=process["binding"]("constants");if(flags["fs"]){flags=flags["fs"]}NODEFS.flagsForNodeMap={1024:flags["O_APPEND"],64:flags["O_CREAT"],128:flags["O_EXCL"],256:flags["O_NOCTTY"],0:flags["O_RDONLY"],2:flags["O_RDWR"],4096:flags["O_SYNC"],512:flags["O_TRUNC"],1:flags["O_WRONLY"],131072:flags["O_NOFOLLOW"]}},convertNodeCode:e=>{var code=e.code;return ERRNO_CODES[code]},mount:mount=>{return NODEFS.createNode(null,"/",NODEFS.getMode(mount.opts.root),0)},createNode:(parent,name,mode,dev)=>{if(!FS.isDir(mode)&&!FS.isFile(mode)&&!FS.isLink(mode)){throw new FS.ErrnoError(28)}var node=FS.createNode(parent,name,mode);node.node_ops=NODEFS.node_ops;node.stream_ops=NODEFS.stream_ops;return node},getMode:path=>{var stat;try{stat=fs.lstatSync(path);if(NODEFS.isWindows){stat.mode=stat.mode|(stat.mode&292)>>2}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return stat.mode},realPath:node=>{var parts=[];while(node.parent!==node){parts.push(node.name);node=node.parent}parts.push(node.mount.opts.root);parts.reverse();return PATH.join.apply(null,parts)},flagsForNode:flags=>{flags&=~2097152;flags&=~2048;flags&=~32768;flags&=~524288;flags&=~65536;var newFlags=0;for(var k in NODEFS.flagsForNodeMap){if(flags&k){newFlags|=NODEFS.flagsForNodeMap[k];flags^=k}}if(!flags){return newFlags}else{throw new FS.ErrnoError(28)}},node_ops:{getattr:node=>{var path=NODEFS.realPath(node);var stat;try{stat=fs.lstatSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}if(NODEFS.isWindows&&!stat.blksize){stat.blksize=4096}if(NODEFS.isWindows&&!stat.blocks){stat.blocks=(stat.size+stat.blksize-1)/stat.blksize|0}return{dev:stat.dev,ino:stat.ino,mode:stat.mode,nlink:stat.nlink,uid:stat.uid,gid:stat.gid,rdev:stat.rdev,size:stat.size,atime:stat.atime,mtime:stat.mtime,ctime:stat.ctime,blksize:stat.blksize,blocks:stat.blocks}},setattr:(node,attr)=>{var path=NODEFS.realPath(node);try{if(attr.mode!==undefined){fs.chmodSync(path,attr.mode);node.mode=attr.mode}if(attr.timestamp!==undefined){var date=new Date(attr.timestamp);fs.utimesSync(path,date,date)}if(attr.size!==undefined){fs.truncateSync(path,attr.size)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},lookup:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);var mode=NODEFS.getMode(path);return NODEFS.createNode(parent,name,mode)},mknod:(parent,name,mode,dev)=>{var node=NODEFS.createNode(parent,name,mode,dev);var path=NODEFS.realPath(node);try{if(FS.isDir(node.mode)){fs.mkdirSync(path,node.mode)}else{fs.writeFileSync(path,"",{mode:node.mode})}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}return node},rename:(oldNode,newDir,newName)=>{var oldPath=NODEFS.realPath(oldNode);var newPath=PATH.join2(NODEFS.realPath(newDir),newName);try{fs.renameSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}oldNode.name=newName},unlink:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.unlinkSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},rmdir:(parent,name)=>{var path=PATH.join2(NODEFS.realPath(parent),name);try{fs.rmdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readdir:node=>{var path=NODEFS.realPath(node);try{return fs.readdirSync(path)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},symlink:(parent,newName,oldPath)=>{var newPath=PATH.join2(NODEFS.realPath(parent),newName);try{fs.symlinkSync(oldPath,newPath)}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},readlink:node=>{var path=NODEFS.realPath(node);try{path=fs.readlinkSync(path);path=nodePath.relative(nodePath.resolve(node.mount.opts.root),path);return path}catch(e){if(!e.code)throw e;if(e.code==="UNKNOWN")throw new FS.ErrnoError(28);throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}},stream_ops:{open:stream=>{var path=NODEFS.realPath(stream.node);try{if(FS.isFile(stream.node.mode)){stream.nfd=fs.openSync(path,NODEFS.flagsForNode(stream.flags))}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},close:stream=>{try{if(FS.isFile(stream.node.mode)&&stream.nfd){fs.closeSync(stream.nfd)}}catch(e){if(!e.code)throw e;throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},read:(stream,buffer,offset,length,position)=>{if(length===0)return 0;try{return fs.readSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},write:(stream,buffer,offset,length,position)=>{try{return fs.writeSync(stream.nfd,Buffer.from(buffer.buffer),offset,length,position)}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}},llseek:(stream,offset,whence)=>{var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){try{var stat=fs.fstatSync(stream.nfd);position+=stat.size}catch(e){throw new FS.ErrnoError(NODEFS.convertNodeCode(e))}}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap:(stream,length,position,prot,flags)=>{if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr=mmapAlloc(length);NODEFS.stream_ops.read(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(mmapFlags&2){return 0}var bytesWritten=NODEFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:(path,opts={})=>{path=PATH_FS.resolve(FS.cwd(),path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(p=>!!p),false);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:node=>{var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:(parentid,name)=>{var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode:node=>{var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:node=>{var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:(parent,name)=>{var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:(parent,name,mode,rdev)=>{var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:node=>{FS.hashRemoveNode(node)},isRoot:node=>{return node===node.parent},isMountpoint:node=>{return!!node.mounted},isFile:mode=>{return(mode&61440)===32768},isDir:mode=>{return(mode&61440)===16384},isLink:mode=>{return(mode&61440)===40960},isChrdev:mode=>{return(mode&61440)===8192},isBlkdev:mode=>{return(mode&61440)===24576},isFIFO:mode=>{return(mode&61440)===4096},isSocket:mode=>{return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:str=>{var flags=FS.flagModes[str];if(typeof flags=="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:flag=>{var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:(node,perms)=>{if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup:dir=>{var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:(dir,name)=>{try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:(dir,name,isdir)=>{var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:(node,flags)=>{if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:(fd_start=0,fd_end=FS.MAX_OPEN_FDS)=>{for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:fd=>FS.streams[fd],createStream:(stream,fd_start,fd_end)=>{if(!FS.FSStream){FS.FSStream=function(){this.shared={}};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}},flags:{get:function(){return this.shared.flags},set:function(val){this.shared.flags=val}},position:{get function(){return this.shared.position},set:function(val){this.shared.position=val}}}}stream=Object.assign(new FS.FSStream,stream);var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:fd=>{FS.streams[fd]=null},chrdev_stream_ops:{open:stream=>{var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:()=>{throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice:(dev,ops)=>{FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts:mount=>{var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:(populate,callback)=>{if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:(type,opts,mountpoint)=>{var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:mountpoint=>{var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:(parent,name)=>{return parent.node_ops.lookup(parent,name)},mknod:(path,mode,dev)=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:(path,mode)=>{mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:(path,mode)=>{mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:(path,mode)=>{var dirs=path.split("/");var d="";for(var i=0;i{if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:(oldpath,newpath)=>{if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:(old_path,new_path)=>{var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir:path=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:path=>{var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink:path=>{var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:(path,dontFollow)=>{var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:path=>{return FS.stat(path,true)},chmod:(path,mode,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:(path,mode)=>{FS.chmod(path,mode,true)},fchmod:(fd,mode)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:(path,uid,gid,dontFollow)=>{var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:(path,uid,gid)=>{FS.chown(path,uid,gid,true)},fchown:(fd,uid,gid)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:(path,len)=>{if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:(fd,len)=>{var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:(path,atime,mtime)=>{var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:(path,flags,mode)=>{if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close:stream=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:stream=>{return stream.fd===null},llseek:(stream,offset,whence)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:(stream,buffer,offset,length,position)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:(stream,buffer,offset,length,position,canOwn)=>{if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate:(stream,offset,length)=>{if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:(stream,length,position,prot,flags)=>{if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync:(stream,buffer,offset,length,mmapFlags)=>{if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:stream=>0,ioctl:(stream,cmd,arg)=>{if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:(path,opts={})=>{opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:(path,data,opts={})=>{opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir:path=>{var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:()=>{FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:()=>{FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:()=>{FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:()=>{var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:(parent,name)=>{var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:()=>{if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:()=>{if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""})},staticInit:()=>{FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS,"NODEFS":NODEFS}},init:(input,output,error)=>{FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:()=>{FS.init.initialized=false;for(var i=0;i{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:(path,dontResolveLastLink)=>{var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:(path,dontResolveLastLink)=>{try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:(parent,path,canRead,canWrite)=>{parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:(parent,name,properties,canRead,canWrite)=>{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:(parent,name,data,canRead,canWrite,canOwn)=>{var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i{var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:stream=>{stream.seekable=false},close:stream=>{if(output&&output.buffer&&output.buffer.length){output(10)}},read:(stream,buffer,offset,length,pos)=>{var bytesRead=0;for(var i=0;i{for(var i=0;i{if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){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.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:(parent,name,url,canRead,canWrite)=>{function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node},createPreloadedFile:(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}if(Browser.handledByPreloadPlugin(byteArray,fullname,finish,()=>{if(onerror)onerror();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,byteArray=>processData(byteArray),onerror)}else{processData(url)}},indexedDB:()=>{return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:()=>{return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=()=>{out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=()=>{var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=()=>{ok++;if(ok+fail==total)finish()};putRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:(paths,onload,onerror)=>{onload=onload||(()=>{});onerror=onerror||(()=>{});var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=()=>{var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(path=>{var getRequest=files.get(path);getRequest.onsuccess=()=>{if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=()=>{fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt:function(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream}};function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.createStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 5:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 6:case 7:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function convertI32PairToI53Checked(lo,hi){return hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN}function ___syscall_ftruncate64(fd,length_low,length_high){try{var length=convertI32PairToI53Checked(length_low,length_high);if(isNaN(length))return-61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>>0,(tempDouble=id,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos>>2]=tempI64[0],HEAP32[dirp+pos+4>>2]=tempI64[1];tempI64=[(idx+1)*struct_size>>>0,(tempDouble=(idx+1)*struct_size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[dirp+pos+8>>2]=tempI64[0],HEAP32[dirp+pos+12>>2]=tempI64[1];HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18>>0]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:case 21505:{if(!stream.tty)return-59;return 0}case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:{if(!stream.tty)return-59;return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.get();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.get();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;return 0}case 21524:{if(!stream.tty)return-59;return 0}default:abort("bad ioctl syscall "+op)}}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_rmdir(path){try{path=SYSCALLS.getStr(path);FS.rmdir(path);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return-e.errno}}function __emscripten_date_now(){return Date.now()}var nowIsMonotonic=true;function __emscripten_get_now_is_monotonic(){return nowIsMonotonic}function __emscripten_throw_longjmp(){throw Infinity}function __gmtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getUTCSeconds();HEAP32[tmPtr+4>>2]=date.getUTCMinutes();HEAP32[tmPtr+8>>2]=date.getUTCHours();HEAP32[tmPtr+12>>2]=date.getUTCDate();HEAP32[tmPtr+16>>2]=date.getUTCMonth();HEAP32[tmPtr+20>>2]=date.getUTCFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getUTCDay();var start=Date.UTC(date.getUTCFullYear(),0,1,0,0,0,0);var yday=(date.getTime()-start)/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday}function __localtime_js(time,tmPtr){var date=new Date(HEAP32[time>>2]*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var start=new Date(date.getFullYear(),0,1);var yday=(date.getTime()-start.getTime())/(1e3*60*60*24)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function _tzset_impl(timezone,daylight,tzname){var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset>2]=winterNamePtr;HEAPU32[tzname+4>>2]=summerNamePtr}else{HEAPU32[tzname>>2]=summerNamePtr;HEAPU32[tzname+4>>2]=winterNamePtr}}function __tzset_js(timezone,daylight,tzname){if(__tzset_js.called)return;__tzset_js.called=true;_tzset_impl(timezone,daylight,tzname)}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){buf+=ch!=105&buf;readAsmConstArgsArray.push(ch==105?HEAP32[buf]:HEAPF64[buf++>>1]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}var _emscripten_get_now;if(ENVIRONMENT_IS_NODE){_emscripten_get_now=()=>{var t=process["hrtime"]();return t[0]*1e3+t[1]/1e6}}else _emscripten_get_now=()=>performance.now();function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function getHeapMax(){return 2147483648}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}let alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}function _environ_sizes_get(penviron_count,penviron_buf_size){var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAPU32[penviron_buf_size>>2]=bufSize;return 0}function _exit(status){exit(status)}function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doReadv(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){try{var offset=convertI32PairToI53Checked(offset_low,offset_high);if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function doWritev(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret}function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamFromFD(fd);var num=doWritev(stream,iov,iovcnt);HEAPU32[pnum>>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e instanceof FS.ErrnoError))throw e;return e.errno}}function _getTempRet0(){return getTempRet0()}function _setTempRet0(val){setTempRet0(val)}function __isLeapYear(year){return year%4===0&&(year%100!==0||year%400===0)}function __arraySum(array,index){var sum=0;for(var i=0;i<=index;sum+=array[i++]){}return sum}var __MONTH_DAYS_LEAP=[31,29,31,30,31,30,31,31,30,31,30,31];var __MONTH_DAYS_REGULAR=[31,28,31,30,31,30,31,31,30,31,30,31];function __addDays(date,days){var newDate=new Date(date.getTime());while(days>0){var leap=__isLeapYear(newDate.getFullYear());var currentMonth=newDate.getMonth();var daysInCurrentMonth=(leap?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR)[currentMonth];if(days>daysInCurrentMonth-newDate.getDate()){days-=daysInCurrentMonth-newDate.getDate()+1;newDate.setDate(1);if(currentMonth<11){newDate.setMonth(currentMonth+1)}else{newDate.setMonth(0);newDate.setFullYear(newDate.getFullYear()+1)}}else{newDate.setDate(newDate.getDate()+days);return newDate}}return newDate}function _strftime(s,maxsize,format,tm){var tm_zone=HEAP32[tm+40>>2];var date={tm_sec:HEAP32[tm>>2],tm_min:HEAP32[tm+4>>2],tm_hour:HEAP32[tm+8>>2],tm_mday:HEAP32[tm+12>>2],tm_mon:HEAP32[tm+16>>2],tm_year:HEAP32[tm+20>>2],tm_wday:HEAP32[tm+24>>2],tm_yday:HEAP32[tm+28>>2],tm_isdst:HEAP32[tm+32>>2],tm_gmtoff:HEAP32[tm+36>>2],tm_zone:tm_zone?UTF8ToString(tm_zone):""};var pattern=UTF8ToString(format);var EXPANSION_RULES_1={"%c":"%a %b %d %H:%M:%S %Y","%D":"%m/%d/%y","%F":"%Y-%m-%d","%h":"%b","%r":"%I:%M:%S %p","%R":"%H:%M","%T":"%H:%M:%S","%x":"%m/%d/%y","%X":"%H:%M:%S","%Ec":"%c","%EC":"%C","%Ex":"%m/%d/%y","%EX":"%H:%M:%S","%Ey":"%y","%EY":"%Y","%Od":"%d","%Oe":"%e","%OH":"%H","%OI":"%I","%Om":"%m","%OM":"%M","%OS":"%S","%Ou":"%u","%OU":"%U","%OV":"%V","%Ow":"%w","%OW":"%W","%Oy":"%y"};for(var rule in EXPANSION_RULES_1){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_1[rule])}var WEEKDAYS=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];var MONTHS=["January","February","March","April","May","June","July","August","September","October","November","December"];function leadingSomething(value,digits,character){var str=typeof value=="number"?value.toString():value||"";while(str.length0?1:0}var compare;if((compare=sgn(date1.getFullYear()-date2.getFullYear()))===0){if((compare=sgn(date1.getMonth()-date2.getMonth()))===0){compare=sgn(date1.getDate()-date2.getDate())}}return compare}function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){case 0:return new Date(janFourth.getFullYear()-1,11,29);case 1:return janFourth;case 2:return new Date(janFourth.getFullYear(),0,3);case 3:return new Date(janFourth.getFullYear(),0,2);case 4:return new Date(janFourth.getFullYear(),0,1);case 5:return new Date(janFourth.getFullYear()-1,11,31);case 6:return new Date(janFourth.getFullYear()-1,11,30)}}function getWeekBasedYear(date){var thisDate=__addDays(new Date(date.tm_year+1900,0,1),date.tm_yday);var janFourthThisYear=new Date(thisDate.getFullYear(),0,4);var janFourthNextYear=new Date(thisDate.getFullYear()+1,0,4);var firstWeekStartThisYear=getFirstWeekStartDate(janFourthThisYear);var firstWeekStartNextYear=getFirstWeekStartDate(janFourthNextYear);if(compareByDay(firstWeekStartThisYear,thisDate)<=0){if(compareByDay(firstWeekStartNextYear,thisDate)<=0){return thisDate.getFullYear()+1}else{return thisDate.getFullYear()}}else{return thisDate.getFullYear()-1}}var EXPANSION_RULES_2={"%a":function(date){return WEEKDAYS[date.tm_wday].substring(0,3)},"%A":function(date){return WEEKDAYS[date.tm_wday]},"%b":function(date){return MONTHS[date.tm_mon].substring(0,3)},"%B":function(date){return MONTHS[date.tm_mon]},"%C":function(date){var year=date.tm_year+1900;return leadingNulls(year/100|0,2)},"%d":function(date){return leadingNulls(date.tm_mday,2)},"%e":function(date){return leadingSomething(date.tm_mday,2," ")},"%g":function(date){return getWeekBasedYear(date).toString().substring(2)},"%G":function(date){return getWeekBasedYear(date)},"%H":function(date){return leadingNulls(date.tm_hour,2)},"%I":function(date){var twelveHour=date.tm_hour;if(twelveHour==0)twelveHour=12;else if(twelveHour>12)twelveHour-=12;return leadingNulls(twelveHour,2)},"%j":function(date){return leadingNulls(date.tm_mday+__arraySum(__isLeapYear(date.tm_year+1900)?__MONTH_DAYS_LEAP:__MONTH_DAYS_REGULAR,date.tm_mon-1),3)},"%m":function(date){return leadingNulls(date.tm_mon+1,2)},"%M":function(date){return leadingNulls(date.tm_min,2)},"%n":function(){return"\n"},"%p":function(date){if(date.tm_hour>=0&&date.tm_hour<12){return"AM"}else{return"PM"}},"%S":function(date){return leadingNulls(date.tm_sec,2)},"%t":function(){return"\t"},"%u":function(date){return date.tm_wday||7},"%U":function(date){var days=date.tm_yday+7-date.tm_wday;return leadingNulls(Math.floor(days/7),2)},"%V":function(date){var val=Math.floor((date.tm_yday+7-(date.tm_wday+6)%7)/7);if((date.tm_wday+371-date.tm_yday-2)%7<=2){val++}if(!val){val=52;var dec31=(date.tm_wday+7-date.tm_yday-1)%7;if(dec31==4||dec31==5&&__isLeapYear(date.tm_year%400-1)){val++}}else if(val==53){var jan1=(date.tm_wday+371-date.tm_yday)%7;if(jan1!=4&&(jan1!=3||!__isLeapYear(date.tm_year)))val=1}return leadingNulls(val,2)},"%w":function(date){return date.tm_wday},"%W":function(date){var days=date.tm_yday+7-(date.tm_wday+6)%7;return leadingNulls(Math.floor(days/7),2)},"%y":function(date){return(date.tm_year+1900).toString().substring(2)},"%Y":function(date){return date.tm_year+1900},"%z":function(date){var off=date.tm_gmtoff;var ahead=off>=0;off=Math.abs(off)/60;off=off/60*100+off%60;return(ahead?"+":"-")+String("0000"+off).slice(-4)},"%Z":function(date){return date.tm_zone},"%%":function(){return"%"}};pattern=pattern.replace(/%%/g,"\0\0");for(var rule in EXPANSION_RULES_2){if(pattern.includes(rule)){pattern=pattern.replace(new RegExp(rule,"g"),EXPANSION_RULES_2[rule](date))}}pattern=pattern.replace(/\0\0/g,"%");var bytes=intArrayFromString(pattern,false);if(bytes.length>maxsize){return 0}writeArrayToMemory(bytes,s);return bytes.length-1}function _system(command){if(ENVIRONMENT_IS_NODE){if(!command)return 1;var cmdstr=UTF8ToString(command);if(!cmdstr.length)return 0;var cp=require("child_process");var ret=cp.spawnSync(cmdstr,[],{shell:true,stdio:"inherit"});var _W_EXITCODE=(ret,sig)=>ret<<8|sig;if(ret.status===null){var signalToNumber=sig=>{switch(sig){case"SIGHUP":return 1;case"SIGINT":return 2;case"SIGQUIT":return 3;case"SIGFPE":return 8;case"SIGKILL":return 9;case"SIGALRM":return 14;case"SIGTERM":return 15}return 2};return _W_EXITCODE(0,signalToNumber(ret.signal))}return _W_EXITCODE(ret.status,0)}if(!command)return 0;setErrNo(52);return-1}var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();if(ENVIRONMENT_IS_NODE){requireNodeFS();NODEFS.staticInit()}ERRNO_CODES={"EPERM":63,"ENOENT":44,"ESRCH":71,"EINTR":27,"EIO":29,"ENXIO":60,"E2BIG":1,"ENOEXEC":45,"EBADF":8,"ECHILD":12,"EAGAIN":6,"EWOULDBLOCK":6,"ENOMEM":48,"EACCES":2,"EFAULT":21,"ENOTBLK":105,"EBUSY":10,"EEXIST":20,"EXDEV":75,"ENODEV":43,"ENOTDIR":54,"EISDIR":31,"EINVAL":28,"ENFILE":41,"EMFILE":33,"ENOTTY":59,"ETXTBSY":74,"EFBIG":22,"ENOSPC":51,"ESPIPE":70,"EROFS":69,"EMLINK":34,"EPIPE":64,"EDOM":18,"ERANGE":68,"ENOMSG":49,"EIDRM":24,"ECHRNG":106,"EL2NSYNC":156,"EL3HLT":107,"EL3RST":108,"ELNRNG":109,"EUNATCH":110,"ENOCSI":111,"EL2HLT":112,"EDEADLK":16,"ENOLCK":46,"EBADE":113,"EBADR":114,"EXFULL":115,"ENOANO":104,"EBADRQC":103,"EBADSLT":102,"EDEADLOCK":16,"EBFONT":101,"ENOSTR":100,"ENODATA":116,"ETIME":117,"ENOSR":118,"ENONET":119,"ENOPKG":120,"EREMOTE":121,"ENOLINK":47,"EADV":122,"ESRMNT":123,"ECOMM":124,"EPROTO":65,"EMULTIHOP":36,"EDOTDOT":125,"EBADMSG":9,"ENOTUNIQ":126,"EBADFD":127,"EREMCHG":128,"ELIBACC":129,"ELIBBAD":130,"ELIBSCN":131,"ELIBMAX":132,"ELIBEXEC":133,"ENOSYS":52,"ENOTEMPTY":55,"ENAMETOOLONG":37,"ELOOP":32,"EOPNOTSUPP":138,"EPFNOSUPPORT":139,"ECONNRESET":15,"ENOBUFS":42,"EAFNOSUPPORT":5,"EPROTOTYPE":67,"ENOTSOCK":57,"ENOPROTOOPT":50,"ESHUTDOWN":140,"ECONNREFUSED":14,"EADDRINUSE":3,"ECONNABORTED":13,"ENETUNREACH":40,"ENETDOWN":38,"ETIMEDOUT":73,"EHOSTDOWN":142,"EHOSTUNREACH":23,"EINPROGRESS":26,"EALREADY":7,"EDESTADDRREQ":17,"EMSGSIZE":35,"EPROTONOSUPPORT":66,"ESOCKTNOSUPPORT":137,"EADDRNOTAVAIL":4,"ENETRESET":39,"EISCONN":30,"ENOTCONN":53,"ETOOMANYREFS":141,"EUSERS":136,"EDQUOT":19,"ESTALE":72,"ENOTSUP":138,"ENOMEDIUM":148,"EILSEQ":25,"EOVERFLOW":61,"ECANCELED":11,"ENOTRECOVERABLE":56,"EOWNERDEAD":62,"ESTRPIPE":135};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"l":___syscall_fcntl64,"s":___syscall_ftruncate64,"z":___syscall_getcwd,"u":___syscall_getdents64,"r":___syscall_ioctl,"m":___syscall_openat,"y":___syscall_rmdir,"v":___syscall_stat64,"o":___syscall_unlinkat,"i":__emscripten_date_now,"C":__emscripten_get_now_is_monotonic,"x":__emscripten_throw_longjmp,"D":__gmtime_js,"E":__localtime_js,"F":__tzset_js,"h":_emscripten_asm_const_int,"G":_emscripten_memcpy_big,"H":_emscripten_resize_heap,"A":_environ_get,"B":_environ_sizes_get,"f":_exit,"g":_fd_close,"q":_fd_fdstat_get,"k":_fd_read,"t":_fd_seek,"j":_fd_write,"a":_getTempRet0,"d":invoke_ii,"e":invoke_iii,"c":invoke_iiiii,"w":invoke_viiiiiidii,"b":_setTempRet0,"p":_strftime,"n":_system};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["J"]).apply(null,arguments)};var _initwcs=Module["_initwcs"]=function(){return(_initwcs=Module["_initwcs"]=Module["asm"]["K"]).apply(null,arguments)};var _freewcs=Module["_freewcs"]=function(){return(_freewcs=Module["_freewcs"]=Module["asm"]["L"]).apply(null,arguments)};var _wcsinfo=Module["_wcsinfo"]=function(){return(_wcsinfo=Module["_wcsinfo"]=Module["asm"]["M"]).apply(null,arguments)};var _pix2wcsstr=Module["_pix2wcsstr"]=function(){return(_pix2wcsstr=Module["_pix2wcsstr"]=Module["asm"]["N"]).apply(null,arguments)};var _wcs2pixstr=Module["_wcs2pixstr"]=function(){return(_wcs2pixstr=Module["_wcs2pixstr"]=Module["asm"]["O"]).apply(null,arguments)};var _wcssys=Module["_wcssys"]=function(){return(_wcssys=Module["_wcssys"]=Module["asm"]["P"]).apply(null,arguments)};var _wcsunits=Module["_wcsunits"]=function(){return(_wcsunits=Module["_wcsunits"]=Module["asm"]["Q"]).apply(null,arguments)};var _reg2wcsstr=Module["_reg2wcsstr"]=function(){return(_reg2wcsstr=Module["_reg2wcsstr"]=Module["asm"]["R"]).apply(null,arguments)};var _saostrtod=Module["_saostrtod"]=function(){return(_saostrtod=Module["_saostrtod"]=Module["asm"]["S"]).apply(null,arguments)};var _saodtostr=Module["_saodtostr"]=function(){return(_saodtostr=Module["_saodtostr"]=Module["asm"]["T"]).apply(null,arguments)};var _saodtype=Module["_saodtype"]=function(){return(_saodtype=Module["_saodtype"]=Module["asm"]["U"]).apply(null,arguments)};var _zscale=Module["_zscale"]=function(){return(_zscale=Module["_zscale"]=Module["asm"]["V"]).apply(null,arguments)};var _tanhdr=Module["_tanhdr"]=function(){return(_tanhdr=Module["_tanhdr"]=Module["asm"]["W"]).apply(null,arguments)};var _reproject=Module["_reproject"]=function(){return(_reproject=Module["_reproject"]=Module["asm"]["X"]).apply(null,arguments)};var _madd=Module["_madd"]=function(){return(_madd=Module["_madd"]=Module["asm"]["Y"]).apply(null,arguments)};var _imgtbl=Module["_imgtbl"]=function(){return(_imgtbl=Module["_imgtbl"]=Module["asm"]["Z"]).apply(null,arguments)};var _makehdr=Module["_makehdr"]=function(){return(_makehdr=Module["_makehdr"]=Module["asm"]["_"]).apply(null,arguments)};var _shrinkhdr=Module["_shrinkhdr"]=function(){return(_shrinkhdr=Module["_shrinkhdr"]=Module["asm"]["$"]).apply(null,arguments)};var _imsection=Module["_imsection"]=function(){return(_imsection=Module["_imsection"]=Module["asm"]["aa"]).apply(null,arguments)};var _listhdu=Module["_listhdu"]=function(){return(_listhdu=Module["_listhdu"]=Module["asm"]["ba"]).apply(null,arguments)};var _regcnts=Module["_regcnts"]=function(){return(_regcnts=Module["_regcnts"]=Module["asm"]["ca"]).apply(null,arguments)};var _vcat=Module["_vcat"]=function(){return(_vcat=Module["_vcat"]=Module["asm"]["da"]).apply(null,arguments)};var _vls=Module["_vls"]=function(){return(_vls=Module["_vls"]=Module["asm"]["ea"]).apply(null,arguments)};var _openFITSFile=Module["_openFITSFile"]=function(){return(_openFITSFile=Module["_openFITSFile"]=Module["asm"]["fa"]).apply(null,arguments)};var _openFITSMem=Module["_openFITSMem"]=function(){return(_openFITSMem=Module["_openFITSMem"]=Module["asm"]["ga"]).apply(null,arguments)};var _getHeaderToString=Module["_getHeaderToString"]=function(){return(_getHeaderToString=Module["_getHeaderToString"]=Module["asm"]["ha"]).apply(null,arguments)};var _getImageToArray=Module["_getImageToArray"]=function(){return(_getImageToArray=Module["_getImageToArray"]=Module["asm"]["ia"]).apply(null,arguments)};var _filterTableToImage=Module["_filterTableToImage"]=function(){return(_filterTableToImage=Module["_filterTableToImage"]=Module["asm"]["ja"]).apply(null,arguments)};var _closeFITSFile=Module["_closeFITSFile"]=function(){return(_closeFITSFile=Module["_closeFITSFile"]=Module["asm"]["ka"]).apply(null,arguments)};var _maxFITSMemory=Module["_maxFITSMemory"]=function(){return(_maxFITSMemory=Module["_maxFITSMemory"]=Module["asm"]["la"]).apply(null,arguments)};var _ffgerr=Module["_ffgerr"]=function(){return(_ffgerr=Module["_ffgerr"]=Module["asm"]["ma"]).apply(null,arguments)};var _ffmahd=Module["_ffmahd"]=function(){return(_ffmahd=Module["_ffmahd"]=Module["asm"]["na"]).apply(null,arguments)};var _ffghdt=Module["_ffghdt"]=function(){return(_ffghdt=Module["_ffghdt"]=Module["asm"]["oa"]).apply(null,arguments)};var _ffghdn=Module["_ffghdn"]=function(){return(_ffghdn=Module["_ffghdn"]=Module["asm"]["pa"]).apply(null,arguments)};var _ffgisz=Module["_ffgisz"]=function(){return(_ffgisz=Module["_ffgisz"]=Module["asm"]["qa"]).apply(null,arguments)};var _ffmnhd=Module["_ffmnhd"]=function(){return(_ffmnhd=Module["_ffmnhd"]=Module["asm"]["ra"]).apply(null,arguments)};var _ffgky=Module["_ffgky"]=function(){return(_ffgky=Module["_ffgky"]=Module["asm"]["sa"]).apply(null,arguments)};var _fffree=Module["_fffree"]=function(){return(_fffree=Module["_fffree"]=Module["asm"]["ta"]).apply(null,arguments)};var _imannulusi=Module["_imannulusi"]=function(){return(_imannulusi=Module["_imannulusi"]=Module["asm"]["ua"]).apply(null,arguments)};var _imcirclei=Module["_imcirclei"]=function(){return(_imcirclei=Module["_imcirclei"]=Module["asm"]["va"]).apply(null,arguments)};var _imannulus=Module["_imannulus"]=function(){return(_imannulus=Module["_imannulus"]=Module["asm"]["wa"]).apply(null,arguments)};var _imcircle=Module["_imcircle"]=function(){return(_imcircle=Module["_imcircle"]=Module["asm"]["xa"]).apply(null,arguments)};var _imboxi=Module["_imboxi"]=function(){return(_imboxi=Module["_imboxi"]=Module["asm"]["ya"]).apply(null,arguments)};var _imbox=Module["_imbox"]=function(){return(_imbox=Module["_imbox"]=Module["asm"]["za"]).apply(null,arguments)};var _impolygon=Module["_impolygon"]=function(){return(_impolygon=Module["_impolygon"]=Module["asm"]["Aa"]).apply(null,arguments)};var _imellipsei=Module["_imellipsei"]=function(){return(_imellipsei=Module["_imellipsei"]=Module["asm"]["Ba"]).apply(null,arguments)};var _imellipse=Module["_imellipse"]=function(){return(_imellipse=Module["_imellipse"]=Module["asm"]["Ca"]).apply(null,arguments)};var _imfieldi=Module["_imfieldi"]=function(){return(_imfieldi=Module["_imfieldi"]=Module["asm"]["Da"]).apply(null,arguments)};var _imfield=Module["_imfield"]=function(){return(_imfield=Module["_imfield"]=Module["asm"]["Ea"]).apply(null,arguments)};var _imlinei=Module["_imlinei"]=function(){return(_imlinei=Module["_imlinei"]=Module["asm"]["Fa"]).apply(null,arguments)};var _imline=Module["_imline"]=function(){return(_imline=Module["_imline"]=Module["asm"]["Ga"]).apply(null,arguments)};var _impiei=Module["_impiei"]=function(){return(_impiei=Module["_impiei"]=Module["asm"]["Ha"]).apply(null,arguments)};var _impie=Module["_impie"]=function(){return(_impie=Module["_impie"]=Module["asm"]["Ia"]).apply(null,arguments)};var _imqtpiei=Module["_imqtpiei"]=function(){return(_imqtpiei=Module["_imqtpiei"]=Module["asm"]["Ja"]).apply(null,arguments)};var _imqtpie=Module["_imqtpie"]=function(){return(_imqtpie=Module["_imqtpie"]=Module["asm"]["Ka"]).apply(null,arguments)};var _impointi=Module["_impointi"]=function(){return(_impointi=Module["_impointi"]=Module["asm"]["La"]).apply(null,arguments)};var _impoint=Module["_impoint"]=function(){return(_impoint=Module["_impoint"]=Module["asm"]["Ma"]).apply(null,arguments)};var _impolygoni=Module["_impolygoni"]=function(){return(_impolygoni=Module["_impolygoni"]=Module["asm"]["Na"]).apply(null,arguments)};var _imnannulusi=Module["_imnannulusi"]=function(){return(_imnannulusi=Module["_imnannulusi"]=Module["asm"]["Oa"]).apply(null,arguments)};var _imnboxi=Module["_imnboxi"]=function(){return(_imnboxi=Module["_imnboxi"]=Module["asm"]["Pa"]).apply(null,arguments)};var _imnellipsei=Module["_imnellipsei"]=function(){return(_imnellipsei=Module["_imnellipsei"]=Module["asm"]["Qa"]).apply(null,arguments)};var _imnpiei=Module["_imnpiei"]=function(){return(_imnpiei=Module["_imnpiei"]=Module["asm"]["Ra"]).apply(null,arguments)};var _impandai=Module["_impandai"]=function(){return(_impandai=Module["_impandai"]=Module["asm"]["Sa"]).apply(null,arguments)};var _imnannulus=Module["_imnannulus"]=function(){return(_imnannulus=Module["_imnannulus"]=Module["asm"]["Ta"]).apply(null,arguments)};var _imnbox=Module["_imnbox"]=function(){return(_imnbox=Module["_imnbox"]=Module["asm"]["Ua"]).apply(null,arguments)};var _imnellipse=Module["_imnellipse"]=function(){return(_imnellipse=Module["_imnellipse"]=Module["asm"]["Va"]).apply(null,arguments)};var _imnpie=Module["_imnpie"]=function(){return(_imnpie=Module["_imnpie"]=Module["asm"]["Wa"]).apply(null,arguments)};var _impanda=Module["_impanda"]=function(){return(_impanda=Module["_impanda"]=Module["asm"]["Xa"]).apply(null,arguments)};var _imvannulusi=Module["_imvannulusi"]=function(){return(_imvannulusi=Module["_imvannulusi"]=Module["asm"]["Ya"]).apply(null,arguments)};var _imvboxi=Module["_imvboxi"]=function(){return(_imvboxi=Module["_imvboxi"]=Module["asm"]["Za"]).apply(null,arguments)};var _imvellipsei=Module["_imvellipsei"]=function(){return(_imvellipsei=Module["_imvellipsei"]=Module["asm"]["_a"]).apply(null,arguments)};var _imvpiei=Module["_imvpiei"]=function(){return(_imvpiei=Module["_imvpiei"]=Module["asm"]["$a"]).apply(null,arguments)};var _imvpointi=Module["_imvpointi"]=function(){return(_imvpointi=Module["_imvpointi"]=Module["asm"]["ab"]).apply(null,arguments)};var _imvannulus=Module["_imvannulus"]=function(){return(_imvannulus=Module["_imvannulus"]=Module["asm"]["bb"]).apply(null,arguments)};var _imvbox=Module["_imvbox"]=function(){return(_imvbox=Module["_imvbox"]=Module["asm"]["cb"]).apply(null,arguments)};var _imvellipse=Module["_imvellipse"]=function(){return(_imvellipse=Module["_imvellipse"]=Module["asm"]["db"]).apply(null,arguments)};var _imvpie=Module["_imvpie"]=function(){return(_imvpie=Module["_imvpie"]=Module["asm"]["eb"]).apply(null,arguments)};var _imvpoint=Module["_imvpoint"]=function(){return(_imvpoint=Module["_imvpoint"]=Module["asm"]["fb"]).apply(null,arguments)};var _gzclose=Module["_gzclose"]=function(){return(_gzclose=Module["_gzclose"]=Module["asm"]["gb"]).apply(null,arguments)};var _gzopen=Module["_gzopen"]=function(){return(_gzopen=Module["_gzopen"]=Module["asm"]["hb"]).apply(null,arguments)};var _gzseek=Module["_gzseek"]=function(){return(_gzseek=Module["_gzseek"]=Module["asm"]["ib"]).apply(null,arguments)};var _gzread=Module["_gzread"]=function(){return(_gzread=Module["_gzread"]=Module["asm"]["jb"]).apply(null,arguments)};var _gzwrite=Module["_gzwrite"]=function(){return(_gzwrite=Module["_gzwrite"]=Module["asm"]["kb"]).apply(null,arguments)};var _BZ2_bzopen=Module["_BZ2_bzopen"]=function(){return(_BZ2_bzopen=Module["_BZ2_bzopen"]=Module["asm"]["lb"]).apply(null,arguments)};var _BZ2_bzread=Module["_BZ2_bzread"]=function(){return(_BZ2_bzread=Module["_BZ2_bzread"]=Module["asm"]["mb"]).apply(null,arguments)};var _BZ2_bzwrite=Module["_BZ2_bzwrite"]=function(){return(_BZ2_bzwrite=Module["_BZ2_bzwrite"]=Module["asm"]["nb"]).apply(null,arguments)};var _BZ2_bzclose=Module["_BZ2_bzclose"]=function(){return(_BZ2_bzclose=Module["_BZ2_bzclose"]=Module["asm"]["ob"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["pb"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["qb"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["rb"]).apply(null,arguments)};var _setThrew=Module["_setThrew"]=function(){return(_setThrew=Module["_setThrew"]=Module["asm"]["sb"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["tb"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["ub"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["vb"]).apply(null,arguments)};function invoke_viiiiiidii(index,a1,a2,a3,a4,a5,a6,a7,a8,a9){var sp=stackSave();try{getWasmTableEntry(index)(a1,a2,a3,a4,a5,a6,a7,a8,a9)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iiiii(index,a1,a2,a3,a4){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2,a3,a4)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_ii(index,a1){var sp=stackSave();try{return getWasmTableEntry(index)(a1)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}function invoke_iii(index,a1,a2){var sp=stackSave();try{return getWasmTableEntry(index)(a1,a2)}catch(e){stackRestore(sp);if(e!==e+0)throw e;_setThrew(1,0)}}Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["writeArrayToMemory"]=writeArrayToMemory;Module["writeAsciiToMemory"]=writeAsciiToMemory;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){EXITSTATUS=status;procExit(status)}function procExit(code){EXITSTATUS=code;if(!keepRuntimeAlive()){if(Module["onExit"])Module["onExit"](code);ABORT=true}quit_(code,new ExitStatus(code))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();Module["print"]=function(text){console.log(text)};Module["rootdir"]="/";Module["vfile"]=function(filename,buf,canOwn){let size;if(buf){try{FS.unlink(Module["rootdir"]+filename)}catch(e){}FS.createDataFile(Module["rootdir"],filename,buf,true,true,canOwn);if(buf.length!==undefined){size=buf.length}else if(buf.byteLength!==undefined){size=buf.byteLength}else if(buf.size!==undefined){size=buf.size}else{size=-1}return{path:filename,size:size}}return FS.readFile(Module["rootdir"]+filename,{encoding:"binary"})};Module["vread"]=function(filename,mode){mode=mode||"utf8";return FS.readFile(Module["rootdir"]+filename,{encoding:mode})};Module["vsize"]=function(filename){let buf={size:-1};try{buf=FS.stat(Module["rootdir"]+filename)}catch(e){}return buf.size};Module["vunlink"]=function(filename){try{FS.unlink(Module["rootdir"]+filename)}catch(e){}};Module["vmount"]=function(root,mntpnt){let got=1;try{FS.mkdir(mntpnt);FS.mount(NODEFS,{root:root},mntpnt)}catch(e){got=0;FS.rmdir(mntpnt)}return got};Module["arrfile"]=function(filename,arr){Module["vunlink"](filename);FS.createDataFile(Module["rootdir"],filename,arr,true,true,false);return{path:filename,size:arr.byteLength}};Module["gzcompress"]=function(data){let ret;const gzFile=ccall("gzopen","number",["string","string"],["output.gz","wb"]);const buffer=_malloc(data.length);HEAPU8.set(data,buffer);ccall("gzwrite","number",["number","number","number"],[gzFile,buffer,data.length]);ccall("gzclose","number",["number"],[gzFile]);_free(buffer);ret=new Uint8Array(FS.root.contents["output.gz"].contents);FS.unlink("output.gz");return ret};Module["gzdecompress"]=function(data,filename,canOwn){let i,ret,curr,len,gzFile;let total=0;const BUFSIZE=1024*1024;const buffer=_malloc(BUFSIZE);const chunks=[];FS.createDataFile(Module["rootdir"],"input.gz",data,true,true,false);gzFile=ccall("gzopen","number",["string","string"],["input.gz","rb"]);while(true){len=ccall("gzread","number",["number","number","number"],[gzFile,buffer,BUFSIZE]);if(len<=0){break}chunks.push(new Uint8Array(len));chunks[chunks.length-1].set(HEAPU8.subarray(buffer,buffer+len));total+=len}ccall("gzclose","number",["number"],[gzFile]);FS.unlink("input.gz");_free(buffer);ret=new Uint8Array(total);curr=0;for(i=0;i0?bin:1/Math.abs(bin);hdu.x1=getValue(hptr+24,"i32");hdu.y1=getValue(hptr+28,"i32");hdu.x2=getValue(hptr+40,"i32");hdu.y2=getValue(hptr+44,"i32");hdu.naxis1=Math.floor((hdu.x2-hdu.x1+1)/xbin);hdu.naxis2=Math.floor((hdu.y2-hdu.y1+1)/xbin);hdu.bitpix=getValue(hptr+56,"i32");if(opts.filter){hdu.filter=opts.filter}if(slice){hdu.slice=slice}status=getValue(hptr+60,"i32");_free(hptr);Module["errchk"](status);if(!bufptr||doerr){Module["error"]("can't convert image to array (image too large?)")}datalen=hdu.naxis1*hdu.naxis2;switch(hdu.bitpix){case 8:hdu.image=new Uint8Array(HEAPU8.subarray(bufptr,bufptr+datalen));break;case 16:hdu.image=new Int16Array(HEAP16.subarray(bufptr/2,bufptr/2+datalen));break;case-16:hdu.image=new Uint16Array(HEAPU16.subarray(bufptr/2,bufptr/2+datalen));break;case 32:hdu.image=new Int32Array(HEAP32.subarray(bufptr/4,bufptr/4+datalen));break;case-32:hdu.image=new Float32Array(HEAPF32.subarray(bufptr/4,bufptr/4+datalen));break;case-64:hdu.image=new Float64Array(HEAPF64.subarray(bufptr/8,bufptr/8+datalen));break;default:Module["error"](`${hdu.bitpix}-bit FITS data is not supported`);break}hptr=_malloc(20);setValue(hptr+12,0,"i32");ccall("getHeaderToString",null,["number","number","number","number"],[ofptr,hptr,hptr+8,hptr+12]);hdu.ncard=getValue(hptr+8,"i32");bufptr2=getValue(hptr,"*");buf=new Uint8Array(HEAPU8.subarray(bufptr2,bufptr2+hdu.ncard*80));buflen=buf.byteLength;hdu.cardstr=""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�RTAIk!V}L-r9f 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

^eVSc9pKcEPeo+G1i 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

t@hJ-v<)K#wl%1J*Gi^nl+R)yG2B-R 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¬o29Tmeb=s$4^TdB#ePw;7S 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%0A#PGtto#oWJ=x! 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

5Xa(%K3c$5ZA;5uo74nm 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%0AoRDLp> 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


yB>f6*jj!E5T*qbyhQ+LOL^ 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�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⋘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 diff --git a/web/static/js9_old/css/dhtmlwindow.css b/web/static/js9_old/css/dhtmlwindow.css deleted file mode 100644 index bdb0db7..0000000 --- a/web/static/js9_old/css/dhtmlwindow.css +++ /dev/null @@ -1,130 +0,0 @@ -.dhtmlwindow{ -position: absolute; -border: 2px solid black; -visibility: hidden; -background-color: white; -} - -.drag-handle{ /*CSS for Drag Handle*/ -padding: 1px; -text-indent: 3px; -font: bold 14px Arial; -background-color: #CA0000; -color: white; -cursor: move; -overflow: hidden; -width: auto; -filter:progid:DXImageTransform.Microsoft.alpha(opacity=100); --moz-opacity: 1; -opacity: 1; -} - -.drag-handle .drag-controls{ /*CSS for controls (min, close etc) within Drag Handle*/ -position: absolute; -right: 1px; -top: 2px; -cursor: hand; -cursor: pointer; -} - -* html .drag-handle{ /*IE6 and below CSS hack. Width must be set to 100% in order for opaque title bar to render*/ -width: 100%; -} - - -.drag-contentarea{ /*CSS for Content Display Area div*/ -border-top: 1px solid brown; -background-color: white; -color: black; -height: 150px; -padding: 2px; -overflow: auto; -} - -.drag-statusarea{ /*CSS for Status Bar div (includes resizearea)*/ -border-top: 1px solid gray; -background-color: #F8F8F8; -height: 13px; /*height of resize image*/ -} - - -.drag-resizearea{ /*CSS for Resize Area itself*/ -float: right; -width: 13px; /*width of resize image*/ -height: 13px; /*height of resize image*/ -cursor: nw-resize; -font-size: 0; -} - -.osxA { - text-decoration: none; -} - -.osxSpan { - line-height: 8px; - vertical-align: 0%; -} - -.osxButtons { - padding-left: 8px; - padding-right: 8px; - padding-top: 4px; - line-height: 0px; -} - -.osxButtons:hover a { - visibility: visible; -} - -.osxClose { - background: #ff5c5c; - font-family: HelveticaNeue, 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; - font-size: 8pt; - width: 11px; - height: 11px; - border: 1px solid #e33e41; - border-radius: 50%; - display: inline-block; -} - -.osxClose:active { - background: #c14645; - border: 1px solid #b03537; -} - -.osxClose:active .osxClosebutton { - color: #4e0002; -} - -.osxClosebutton { - color: #820005; - visibility: hidden; - cursor: default; -} - -.osxMinimize { - background: #ffbd4c; - font-family: HelveticaNeue, 'Helvetica Neue', 'Lucida Grande', Arial, sans-serif; - font-size: 8pt; - margin-left: 8px; - width: 11px; - height: 11px; - border: 1px solid #e09e3e; - border-radius: 50%; - display: inline-block; -} - -.osxMinimize:active { - background: #c08e38; - border: 1px solid #af7c33; -} - -.osxMinimize:active .osxMinimizebutton { - color: #5a2607; -} - -.osxMinimizebutton { - color: #9a5518; - visibility: hidden; - cursor: default; -} diff --git a/web/static/js9_old/css/jquery.contextMenu-v2.8.0.css b/web/static/js9_old/css/jquery.contextMenu-v2.8.0.css deleted file mode 100644 index fa4abd8..0000000 --- a/web/static/js9_old/css/jquery.contextMenu-v2.8.0.css +++ /dev/null @@ -1,309 +0,0 @@ -@charset "UTF-8"; -/*! - * jQuery contextMenu - Plugin for simple contextMenu handling - * - * Version: v2.8.0 - * - * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF) - * Web: http://swisnl.github.io/jQuery-contextMenu/ - * - * Copyright (c) 2011-2019 SWIS BV and contributors - * - * Licensed under - * MIT License http://www.opensource.org/licenses/mit-license - * - * Date: 2019-01-16T15:45:48.418Z - */ -@-webkit-keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} -@-o-keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - -o-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - -o-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} -@keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - -o-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - -o-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} - -@font-face { - font-family: "context-menu-icons"; - font-style: normal; - font-weight: normal; - - src: url("font/context-menu-icons.eot?2lkho"); - src: url("font/context-menu-icons.eot?2lkho#iefix") format("embedded-opentype"), url("font/context-menu-icons.woff2?2lkho") format("woff2"), url("font/context-menu-icons.woff?2lkho") format("woff"), url("font/context-menu-icons.ttf?2lkho") format("truetype"); -} - -.context-menu-icon-add:before { - content: "\EA01"; -} - -.context-menu-icon-copy:before { - content: "\EA02"; -} - -.context-menu-icon-cut:before { - content: "\EA03"; -} - -.context-menu-icon-delete:before { - content: "\EA04"; -} - -.context-menu-icon-edit:before { - content: "\EA05"; -} - -.context-menu-icon-loading:before { - content: "\EA06"; -} - -.context-menu-icon-paste:before { - content: "\EA07"; -} - -.context-menu-icon-quit:before { - content: "\EA08"; -} - -.context-menu-icon::before { - position: absolute; - top: 50%; - left: 0; - width: 2em; - font-family: "context-menu-icons"; - font-size: 1em; - font-style: normal; - font-weight: normal; - line-height: 1; - color: #2980b9; - text-align: center; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.context-menu-icon.context-menu-hover:before { - color: #fff; -} - -.context-menu-icon.context-menu-disabled::before { - color: #bbb; -} - -.context-menu-icon.context-menu-icon-loading:before { - -webkit-animation: cm-spin 2s infinite; - -o-animation: cm-spin 2s infinite; - animation: cm-spin 2s infinite; -} - -.context-menu-icon.context-menu-icon--fa { - display: list-item; - font-family: inherit; - line-height: inherit; -} -.context-menu-icon.context-menu-icon--fa::before { - position: absolute; - top: 50%; - left: 0; - width: 2em; - font-family: FontAwesome; - font-size: 1em; - font-style: normal; - font-weight: normal; - line-height: 1; - color: #2980b9; - text-align: center; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.context-menu-icon.context-menu-icon--fa.context-menu-hover:before { - color: #fff; -} -.context-menu-icon.context-menu-icon--fa.context-menu-disabled::before { - color: #bbb; -} - -.context-menu-icon.context-menu-icon--fa5 { - display: list-item; - font-family: inherit; - line-height: inherit; -} -.context-menu-icon.context-menu-icon--fa5 i, .context-menu-icon.context-menu-icon--fa5 svg { - position: absolute; - top: .3em; - left: .5em; - color: #2980b9; -} -.context-menu-icon.context-menu-icon--fa5.context-menu-hover > i, .context-menu-icon.context-menu-icon--fa5.context-menu-hover > svg { - color: #fff; -} -.context-menu-icon.context-menu-icon--fa5.context-menu-disabled i, .context-menu-icon.context-menu-icon--fa5.context-menu-disabled svg { - color: #bbb; -} - -.context-menu-list { - position: absolute; - display: inline-block; - min-width: 13em; - max-width: 26em; - padding: .25em 0; - margin: .3em; - font-family: inherit; - font-size: inherit; - list-style-type: none; - background: #fff; - border: 1px solid #bebebe; - border-radius: .2em; - -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5); - box-shadow: 0 2px 5px rgba(0, 0, 0, .5); -} - -.context-menu-item { - position: relative; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: .2em 2em; - color: #2f2f2f; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fff; -} - -.context-menu-separator { - padding: 0; - margin: .35em 0; - border-bottom: 1px solid #e6e6e6; -} - -.context-menu-item > label > input, -.context-menu-item > label > textarea { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.context-menu-item.context-menu-hover { - color: #fff; - cursor: pointer; - background-color: #2980b9; -} - -.context-menu-item.context-menu-disabled { - color: #bbb; - cursor: default; - background-color: #fff; -} - -.context-menu-input.context-menu-hover { - color: #2f2f2f; - cursor: default; -} - -.context-menu-submenu:after { - position: absolute; - top: 50%; - right: .5em; - z-index: 1; - width: 0; - height: 0; - content: ''; - border-color: transparent transparent transparent #2f2f2f; - border-style: solid; - border-width: .25em 0 .25em .25em; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); -} - -/** - * Inputs - */ -.context-menu-item.context-menu-input { - padding: .3em .6em; -} - -/* vertically align inside labels */ -.context-menu-input > label > * { - vertical-align: top; -} - -/* position checkboxes and radios as icons */ -.context-menu-input > label > input[type="checkbox"], -.context-menu-input > label > input[type="radio"] { - position: relative; - top: .12em; - margin-right: .4em; -} - -.context-menu-input > label { - margin: 0; -} - -.context-menu-input > label, -.context-menu-input > label > input[type="text"], -.context-menu-input > label > textarea, -.context-menu-input > label > select { - display: block; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.context-menu-input > label > textarea { - height: 7em; -} - -.context-menu-item > .context-menu-list { - top: .3em; - /* re-positioned by js */ - right: -.3em; - display: none; -} - -.context-menu-item.context-menu-visible > .context-menu-list { - display: block; -} - -.context-menu-accesskey { - text-decoration: underline; -} diff --git a/web/static/js9_old/css/jquery.contextMenu.css b/web/static/js9_old/css/jquery.contextMenu.css deleted file mode 100644 index fa4abd8..0000000 --- a/web/static/js9_old/css/jquery.contextMenu.css +++ /dev/null @@ -1,309 +0,0 @@ -@charset "UTF-8"; -/*! - * jQuery contextMenu - Plugin for simple contextMenu handling - * - * Version: v2.8.0 - * - * Authors: Björn Brala (SWIS.nl), Rodney Rehm, Addy Osmani (patches for FF) - * Web: http://swisnl.github.io/jQuery-contextMenu/ - * - * Copyright (c) 2011-2019 SWIS BV and contributors - * - * Licensed under - * MIT License http://www.opensource.org/licenses/mit-license - * - * Date: 2019-01-16T15:45:48.418Z - */ -@-webkit-keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} -@-o-keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - -o-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - -o-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} -@keyframes cm-spin { - 0% { - -webkit-transform: translateY(-50%) rotate(0deg); - -o-transform: translateY(-50%) rotate(0deg); - transform: translateY(-50%) rotate(0deg); - } - 100% { - -webkit-transform: translateY(-50%) rotate(359deg); - -o-transform: translateY(-50%) rotate(359deg); - transform: translateY(-50%) rotate(359deg); - } -} - -@font-face { - font-family: "context-menu-icons"; - font-style: normal; - font-weight: normal; - - src: url("font/context-menu-icons.eot?2lkho"); - src: url("font/context-menu-icons.eot?2lkho#iefix") format("embedded-opentype"), url("font/context-menu-icons.woff2?2lkho") format("woff2"), url("font/context-menu-icons.woff?2lkho") format("woff"), url("font/context-menu-icons.ttf?2lkho") format("truetype"); -} - -.context-menu-icon-add:before { - content: "\EA01"; -} - -.context-menu-icon-copy:before { - content: "\EA02"; -} - -.context-menu-icon-cut:before { - content: "\EA03"; -} - -.context-menu-icon-delete:before { - content: "\EA04"; -} - -.context-menu-icon-edit:before { - content: "\EA05"; -} - -.context-menu-icon-loading:before { - content: "\EA06"; -} - -.context-menu-icon-paste:before { - content: "\EA07"; -} - -.context-menu-icon-quit:before { - content: "\EA08"; -} - -.context-menu-icon::before { - position: absolute; - top: 50%; - left: 0; - width: 2em; - font-family: "context-menu-icons"; - font-size: 1em; - font-style: normal; - font-weight: normal; - line-height: 1; - color: #2980b9; - text-align: center; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -.context-menu-icon.context-menu-hover:before { - color: #fff; -} - -.context-menu-icon.context-menu-disabled::before { - color: #bbb; -} - -.context-menu-icon.context-menu-icon-loading:before { - -webkit-animation: cm-spin 2s infinite; - -o-animation: cm-spin 2s infinite; - animation: cm-spin 2s infinite; -} - -.context-menu-icon.context-menu-icon--fa { - display: list-item; - font-family: inherit; - line-height: inherit; -} -.context-menu-icon.context-menu-icon--fa::before { - position: absolute; - top: 50%; - left: 0; - width: 2em; - font-family: FontAwesome; - font-size: 1em; - font-style: normal; - font-weight: normal; - line-height: 1; - color: #2980b9; - text-align: center; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); - - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} -.context-menu-icon.context-menu-icon--fa.context-menu-hover:before { - color: #fff; -} -.context-menu-icon.context-menu-icon--fa.context-menu-disabled::before { - color: #bbb; -} - -.context-menu-icon.context-menu-icon--fa5 { - display: list-item; - font-family: inherit; - line-height: inherit; -} -.context-menu-icon.context-menu-icon--fa5 i, .context-menu-icon.context-menu-icon--fa5 svg { - position: absolute; - top: .3em; - left: .5em; - color: #2980b9; -} -.context-menu-icon.context-menu-icon--fa5.context-menu-hover > i, .context-menu-icon.context-menu-icon--fa5.context-menu-hover > svg { - color: #fff; -} -.context-menu-icon.context-menu-icon--fa5.context-menu-disabled i, .context-menu-icon.context-menu-icon--fa5.context-menu-disabled svg { - color: #bbb; -} - -.context-menu-list { - position: absolute; - display: inline-block; - min-width: 13em; - max-width: 26em; - padding: .25em 0; - margin: .3em; - font-family: inherit; - font-size: inherit; - list-style-type: none; - background: #fff; - border: 1px solid #bebebe; - border-radius: .2em; - -webkit-box-shadow: 0 2px 5px rgba(0, 0, 0, .5); - box-shadow: 0 2px 5px rgba(0, 0, 0, .5); -} - -.context-menu-item { - position: relative; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding: .2em 2em; - color: #2f2f2f; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fff; -} - -.context-menu-separator { - padding: 0; - margin: .35em 0; - border-bottom: 1px solid #e6e6e6; -} - -.context-menu-item > label > input, -.context-menu-item > label > textarea { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.context-menu-item.context-menu-hover { - color: #fff; - cursor: pointer; - background-color: #2980b9; -} - -.context-menu-item.context-menu-disabled { - color: #bbb; - cursor: default; - background-color: #fff; -} - -.context-menu-input.context-menu-hover { - color: #2f2f2f; - cursor: default; -} - -.context-menu-submenu:after { - position: absolute; - top: 50%; - right: .5em; - z-index: 1; - width: 0; - height: 0; - content: ''; - border-color: transparent transparent transparent #2f2f2f; - border-style: solid; - border-width: .25em 0 .25em .25em; - -webkit-transform: translateY(-50%); - -ms-transform: translateY(-50%); - -o-transform: translateY(-50%); - transform: translateY(-50%); -} - -/** - * Inputs - */ -.context-menu-item.context-menu-input { - padding: .3em .6em; -} - -/* vertically align inside labels */ -.context-menu-input > label > * { - vertical-align: top; -} - -/* position checkboxes and radios as icons */ -.context-menu-input > label > input[type="checkbox"], -.context-menu-input > label > input[type="radio"] { - position: relative; - top: .12em; - margin-right: .4em; -} - -.context-menu-input > label { - margin: 0; -} - -.context-menu-input > label, -.context-menu-input > label > input[type="text"], -.context-menu-input > label > textarea, -.context-menu-input > label > select { - display: block; - width: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.context-menu-input > label > textarea { - height: 7em; -} - -.context-menu-item > .context-menu-list { - top: .3em; - /* re-positioned by js */ - right: -.3em; - display: none; -} - -.context-menu-item.context-menu-visible > .context-menu-list { - display: block; -} - -.context-menu-accesskey { - text-decoration: underline; -} diff --git a/web/static/js9_old/css/spectrum.css b/web/static/js9_old/css/spectrum.css deleted file mode 100644 index a8ad9e4..0000000 --- a/web/static/js9_old/css/spectrum.css +++ /dev/null @@ -1,507 +0,0 @@ -/*** -Spectrum Colorpicker v1.8.0 -https://github.com/bgrins/spectrum -Author: Brian Grinstead -License: MIT -***/ - -.sp-container { - position:absolute; - top:0; - left:0; - display:inline-block; - *display: inline; - *zoom: 1; - /* https://github.com/bgrins/spectrum/issues/40 */ - z-index: 9999994; - overflow: hidden; -} -.sp-container.sp-flat { - position: relative; -} - -/* Fix for * { box-sizing: border-box; } */ -.sp-container, -.sp-container * { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} - -/* http://ansciath.tumblr.com/post/7347495869/css-aspect-ratio */ -.sp-top { - position:relative; - width: 100%; - display:inline-block; -} -.sp-top-inner { - position:absolute; - top:0; - left:0; - bottom:0; - right:0; -} -.sp-color { - position: absolute; - top:0; - left:0; - bottom:0; - right:20%; -} -.sp-hue { - position: absolute; - top:0; - right:0; - bottom:0; - left:84%; - height: 100%; -} - -.sp-clear-enabled .sp-hue { - top:33px; - height: 77.5%; -} - -.sp-fill { - padding-top: 80%; -} -.sp-sat, .sp-val { - position: absolute; - top:0; - left:0; - right:0; - bottom:0; -} - -.sp-alpha-enabled .sp-top { - margin-bottom: 18px; -} -.sp-alpha-enabled .sp-alpha { - display: block; -} -.sp-alpha-handle { - position:absolute; - top:-4px; - bottom: -4px; - width: 6px; - left: 50%; - cursor: pointer; - border: 1px solid black; - background: white; - opacity: .8; -} -.sp-alpha { - display: none; - position: absolute; - bottom: -14px; - right: 0; - left: 0; - height: 8px; -} -.sp-alpha-inner { - border: solid 1px #333; -} - -.sp-clear { - display: none; -} - -.sp-clear.sp-clear-display { - background-position: center; -} - -.sp-clear-enabled .sp-clear { - display: block; - position:absolute; - top:0px; - right:0; - bottom:0; - left:84%; - height: 28px; -} - -/* Don't allow text selection */ -.sp-container, .sp-replacer, .sp-preview, .sp-dragger, .sp-slider, .sp-alpha, .sp-clear, .sp-alpha-handle, .sp-container.sp-dragging .sp-input, .sp-container button { - -webkit-user-select:none; - -moz-user-select: -moz-none; - -o-user-select:none; - user-select: none; -} - -.sp-container.sp-input-disabled .sp-input-container { - display: none; -} -.sp-container.sp-buttons-disabled .sp-button-container { - display: none; -} -.sp-container.sp-palette-buttons-disabled .sp-palette-button-container { - display: none; -} -.sp-palette-only .sp-picker-container { - display: none; -} -.sp-palette-disabled .sp-palette-container { - display: none; -} - -.sp-initial-disabled .sp-initial { - display: none; -} - - -/* Gradients for hue, saturation and value instead of images. Not pretty... but it works */ -.sp-sat { - background-image: -webkit-gradient(linear, 0 0, 100% 0, from(#FFF), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(left, #FFF, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(left, #fff, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to right, #fff, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr=#FFFFFFFF, endColorstr=#00CC9A81)"; - filter : progid:DXImageTransform.Microsoft.gradient(GradientType = 1, startColorstr='#FFFFFFFF', endColorstr='#00CC9A81'); -} -.sp-val { - background-image: -webkit-gradient(linear, 0 100%, 0 0, from(#000000), to(rgba(204, 154, 129, 0))); - background-image: -webkit-linear-gradient(bottom, #000000, rgba(204, 154, 129, 0)); - background-image: -moz-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -o-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: -ms-linear-gradient(bottom, #000, rgba(204, 154, 129, 0)); - background-image: linear-gradient(to top, #000, rgba(204, 154, 129, 0)); - -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr=#00CC9A81, endColorstr=#FF000000)"; - filter : progid:DXImageTransform.Microsoft.gradient(startColorstr='#00CC9A81', endColorstr='#FF000000'); -} - -.sp-hue { - background: -moz-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -ms-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -o-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: -webkit-gradient(linear, left top, left bottom, from(#ff0000), color-stop(0.17, #ffff00), color-stop(0.33, #00ff00), color-stop(0.5, #00ffff), color-stop(0.67, #0000ff), color-stop(0.83, #ff00ff), to(#ff0000)); - background: -webkit-linear-gradient(top, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); - background: linear-gradient(to bottom, #ff0000 0%, #ffff00 17%, #00ff00 33%, #00ffff 50%, #0000ff 67%, #ff00ff 83%, #ff0000 100%); -} - -/* IE filters do not support multiple color stops. - Generate 6 divs, line them up, and do two color gradients for each. - Yes, really. - */ -.sp-1 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0000', endColorstr='#ffff00'); -} -.sp-2 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffff00', endColorstr='#00ff00'); -} -.sp-3 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ff00', endColorstr='#00ffff'); -} -.sp-4 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ffff', endColorstr='#0000ff'); -} -.sp-5 { - height:16%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0000ff', endColorstr='#ff00ff'); -} -.sp-6 { - height:17%; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff00ff', endColorstr='#ff0000'); -} - -.sp-hidden { - display: none !important; -} - -/* Clearfix hack */ -.sp-cf:before, .sp-cf:after { content: ""; display: table; } -.sp-cf:after { clear: both; } -.sp-cf { *zoom: 1; } - -/* Mobile devices, make hue slider bigger so it is easier to slide */ -@media (max-device-width: 480px) { - .sp-color { right: 40%; } - .sp-hue { left: 63%; } - .sp-fill { padding-top: 60%; } -} -.sp-dragger { - border-radius: 5px; - height: 5px; - width: 5px; - border: 1px solid #fff; - background: #000; - cursor: pointer; - position:absolute; - top:0; - left: 0; -} -.sp-slider { - position: absolute; - top:0; - cursor:pointer; - height: 3px; - left: -1px; - right: -1px; - border: 1px solid #000; - background: white; - opacity: .8; -} - -/* -Theme authors: -Here are the basic themeable display options (colors, fonts, global widths). -See http://bgrins.github.io/spectrum/themes/ for instructions. -*/ - -.sp-container { - border-radius: 0; - background-color: #ECECEC; - border: solid 1px #f0c49B; - padding: 0; -} -.sp-container, .sp-container button, .sp-container input, .sp-color, .sp-hue, .sp-clear { - font: normal 12px "Lucida Grande", "Lucida Sans Unicode", "Lucida Sans", Geneva, Verdana, sans-serif; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -.sp-top { - margin-bottom: 3px; -} -.sp-color, .sp-hue, .sp-clear { - border: solid 1px #666; -} - -/* Input */ -.sp-input-container { - float:right; - width: 100px; - margin-bottom: 4px; -} -.sp-initial-disabled .sp-input-container { - width: 100%; -} -.sp-input { - font-size: 12px !important; - border: 1px inset; - padding: 4px 5px; - margin: 0; - width: 100%; - background:transparent; - border-radius: 3px; - color: #222; -} -.sp-input:focus { - border: 1px solid orange; -} -.sp-input.sp-validation-error { - border: 1px solid red; - background: #fdd; -} -.sp-picker-container , .sp-palette-container { - float:left; - position: relative; - padding: 10px; - padding-bottom: 300px; - margin-bottom: -290px; -} -.sp-picker-container { - width: 172px; - border-left: solid 1px #fff; -} - -/* Palettes */ -.sp-palette-container { - border-right: solid 1px #ccc; -} - -.sp-palette-only .sp-palette-container { - border: 0; -} - -.sp-palette .sp-thumb-el { - display: block; - position:relative; - float:left; - width: 24px; - height: 15px; - margin: 3px; - cursor: pointer; - border:solid 2px transparent; -} -.sp-palette .sp-thumb-el:hover, .sp-palette .sp-thumb-el.sp-thumb-active { - border-color: orange; -} -.sp-thumb-el { - position:relative; -} - -/* Initial */ -.sp-initial { - float: left; - border: solid 1px #333; -} -.sp-initial span { - width: 30px; - height: 25px; - border:none; - display:block; - float:left; - margin:0; -} - -.sp-initial .sp-clear-display { - background-position: center; -} - -/* Buttons */ -.sp-palette-button-container, -.sp-button-container { - float: right; -} - -/* Replacer (the little preview div that shows up instead of the ) */ -.sp-replacer { - margin:0; - overflow:hidden; - cursor:pointer; - padding: 4px; - display:inline-block; - *zoom: 1; - *display: inline; - border: solid 1px #91765d; - background: #eee; - color: #333; - vertical-align: middle; -} -.sp-replacer:hover, .sp-replacer.sp-active { - border-color: #F0C49B; - color: #111; -} -.sp-replacer.sp-disabled { - cursor:default; - border-color: silver; - color: silver; -} -.sp-dd { - padding: 2px 0; - height: 16px; - line-height: 16px; - float:left; - font-size:10px; -} -.sp-preview { - position:relative; - width:25px; - height: 20px; - border: solid 1px #222; - margin-right: 5px; - float:left; - z-index: 0; -} - -.sp-palette { - *width: 220px; - max-width: 220px; -} -.sp-palette .sp-thumb-el { - width:16px; - height: 16px; - margin:2px 1px; - border: solid 1px #d0d0d0; -} - -.sp-container { - padding-bottom:0; -} - - -/* Buttons: http://hellohappy.org/css3-buttons/ */ -.sp-container button { - background-color: #eeeeee; - background-image: -webkit-linear-gradient(top, #eeeeee, #cccccc); - background-image: -moz-linear-gradient(top, #eeeeee, #cccccc); - background-image: -ms-linear-gradient(top, #eeeeee, #cccccc); - background-image: -o-linear-gradient(top, #eeeeee, #cccccc); - background-image: linear-gradient(to bottom, #eeeeee, #cccccc); - border: 1px solid #ccc; - border-bottom: 1px solid #bbb; - border-radius: 3px; - color: #333; - font-size: 14px; - line-height: 1; - padding: 5px 4px; - text-align: center; - text-shadow: 0 1px 0 #eee; - vertical-align: middle; -} -.sp-container button:hover { - background-color: #dddddd; - background-image: -webkit-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -moz-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -ms-linear-gradient(top, #dddddd, #bbbbbb); - background-image: -o-linear-gradient(top, #dddddd, #bbbbbb); - background-image: linear-gradient(to bottom, #dddddd, #bbbbbb); - border: 1px solid #bbb; - border-bottom: 1px solid #999; - cursor: pointer; - text-shadow: 0 1px 0 #ddd; -} -.sp-container button:active { - border: 1px solid #aaa; - border-bottom: 1px solid #888; - -webkit-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -moz-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -ms-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - -o-box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; - box-shadow: inset 0 0 5px 2px #aaaaaa, 0 1px 0 0 #eeeeee; -} -.sp-cancel { - font-size: 11px; - color: #d93f3f !important; - margin:0; - padding:2px; - margin-right: 5px; - vertical-align: middle; - text-decoration:none; - -} -.sp-cancel:hover { - color: #d93f3f !important; - text-decoration: underline; -} - - -.sp-palette span:hover, .sp-palette span.sp-thumb-active { - border-color: #000; -} - -.sp-preview, .sp-alpha, .sp-thumb-el { - position:relative; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==); -} -.sp-preview-inner, .sp-alpha-inner, .sp-thumb-inner { - display:block; - position:absolute; - top:0;left:0;bottom:0;right:0; -} - -.sp-palette .sp-thumb-inner { - background-position: 50% 50%; - background-repeat: no-repeat; -} - -.sp-palette .sp-thumb-light.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAIVJREFUeNpiYBhsgJFMffxAXABlN5JruT4Q3wfi/0DsT64h8UD8HmpIPCWG/KemIfOJCUB+Aoacx6EGBZyHBqI+WsDCwuQ9mhxeg2A210Ntfo8klk9sOMijaURm7yc1UP2RNCMbKE9ODK1HM6iegYLkfx8pligC9lCD7KmRof0ZhjQACDAAceovrtpVBRkAAAAASUVORK5CYII=); -} - -.sp-palette .sp-thumb-dark.sp-thumb-active .sp-thumb-inner { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAadEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My41LjEwMPRyoQAAAMdJREFUOE+tkgsNwzAMRMugEAahEAahEAZhEAqlEAZhEAohEAYh81X2dIm8fKpEspLGvudPOsUYpxE2BIJCroJmEW9qJ+MKaBFhEMNabSy9oIcIPwrB+afvAUFoK4H0tMaQ3XtlrggDhOVVMuT4E5MMG0FBbCEYzjYT7OxLEvIHQLY2zWwQ3D+9luyOQTfKDiFD3iUIfPk8VqrKjgAiSfGFPecrg6HN6m/iBcwiDAo7WiBeawa+Kwh7tZoSCGLMqwlSAzVDhoK+6vH4G0P5wdkAAAAASUVORK5CYII=); -} - -.sp-clear-display { - background-repeat:no-repeat; - background-position: center; - background-image: url(data:image/gif;base64,R0lGODlhFAAUAPcAAAAAAJmZmZ2dnZ6enqKioqOjo6SkpKWlpaampqenp6ioqKmpqaqqqqurq/Hx8fLy8vT09PX19ff39/j4+Pn5+fr6+vv7+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAP8ALAAAAAAUABQAAAihAP9FoPCvoMGDBy08+EdhQAIJCCMybCDAAYUEARBAlFiQQoMABQhKUJBxY0SPICEYHBnggEmDKAuoPMjS5cGYMxHW3IiT478JJA8M/CjTZ0GgLRekNGpwAsYABHIypcAgQMsITDtWJYBR6NSqMico9cqR6tKfY7GeBCuVwlipDNmefAtTrkSzB1RaIAoXodsABiZAEFB06gIBWC1mLVgBa0AAOw==); -} diff --git a/web/static/js9_old/css/tabcontent.css b/web/static/js9_old/css/tabcontent.css deleted file mode 100644 index 7c4306d..0000000 --- a/web/static/js9_old/css/tabcontent.css +++ /dev/null @@ -1,176 +0,0 @@ -/* ######### CSS for Shade Tabs. Remove if not using ######### */ - -.shadetabs{ -padding: 3px 0; -margin-left: 0; -margin-top: 1px; -margin-bottom: 0; -font: bold 12px Verdana; -list-style-type: none; -text-align: left; /*set to left, center, or right to align the menu as desired*/ -} - -.shadetabs li{ -display: inline; -margin: 0; -} - -.shadetabs li a{ -text-decoration: none; -position: relative; -z-index: 1; -padding: 3px 7px; -margin-right: 3px; -border: 1px solid #778; -color: #2d2b2b; -background: white url(images/shade.gif) top left repeat-x; -} - -.shadetabs li a:visited{ -color: #2d2b2b; -} - -.shadetabs li a:hover{ -text-decoration: underline; -color: #2d2b2b; -} - -.shadetabs li a.selected{ /*selected main tab style */ -position: relative; -top: 1px; -} - -.shadetabs li a.selected{ /*selected main tab style */ -background-image: url(images/shadeactive.gif); -border-bottom-color: white; -} - -.shadetabs li a.selected:hover{ /*selected main tab style */ -text-decoration: none; -} - -.tabcontent{ -display:none; -} - -@media print { -.tabcontent { -display:block !important; -} -} - -/* ######### CSS for Inverted Modern Bricks II Tabs. Remove if not using ######### */ - -.modernbricksmenu2{ -padding: 0; -width: 362px; -border-top: 5px solid #D25A0B; /*Brown color theme*/ -background: transparent; -voice-family: "\"}\""; -voice-family: inherit; -} - -.modernbricksmenu2 ul{ -margin:0; -margin-left: 10px; /*margin between first menu item and left browser edge*/ -padding: 0; -list-style: none; -} - -.modernbricksmenu2 li{ -display: inline; -margin: 0 2px 0 0; -padding: 0; -text-transform:uppercase; -} - -.modernbricksmenu2 a{ -float: left; -display: block; -font: bold 11px Arial; -color: white; -text-decoration: none; -margin: 0 1px 0 0; /*Margin between each menu item*/ -padding: 5px 10px; -background-color: black; /*Brown color theme*/ -border-top: 1px solid white; -} - -.modernbricksmenu2 a:hover{ -background-color: #D25A0B; /*Brown color theme*/ -color: white; -} - -.modernbricksmenu2 a.selected{ /*currently selected tab*/ -background-color: #D25A0B; /*Brown color theme*/ -color: white; -border-color: #D25A0B; /*Brown color theme*/ -} - -.tabcontent{ -display:none; -} - -@media print { -.tabcontent { -display:block !important; -} -} - -/* ######### CSS for Indented CSS Tabs. Remove if not using ######### */ - - -.indentmenu{ -font: bold 13px Arial; -width: 100%; /*leave this value as is in most cases*/ -} - -.indentmenu ul{ -margin: 0; -padding: 0; -float: left; -/* width: 80%; width of menu*/ -border-top: 1px solid navy; /*navy border*/ -background: black url(images/indentbg.gif) center center repeat-x; -} - -.indentmenu ul li{ -display: inline; -} - -.indentmenu ul li a{ -float: left; -color: white; /*text color*/ -padding: 5px 11px; -text-decoration: none; -border-right: 1px solid navy; /*navy divider between menu items*/ -} - -.indentmenu ul li a:visited{ -color: white; -} - -.indentmenu ul li a.selected{ -color: white !important; -padding-top: 6px; /*shift text down 1px*/ -padding-bottom: 4px; -background: black url(images/indentbg2.gif) center center repeat-x; -} - - -.tabcontentstyle{ /*style of tab content oontainer*/ -border: 1px solid gray; -width: 450px; -margin-bottom: 1em; -padding: 10px; -} - -.tabcontent{ -display:none; -} - -@media print { -.tabcontent { -display:block !important; -} -} diff --git a/web/static/js9_old/favicon.ico b/web/static/js9_old/favicon.ico deleted file mode 100644 index 8636d9b26b6a3a84cbd73ebf4b7e1c859f0001fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZ`(ZERCz6n+UNB!)yZqQ*ad{4mq4lBqLf;DSH!pT>X&jg!E_4BL!sg)JhBmMvi- z&P5ldK+J@OjYe5nzgPQtyLMZ*b}(8AwylZ85AtnF2 z_uR~l(52oi7kj;cDa0sZxpchz2GeYFTANrEqmj-STH&lw1zpx2IA#4AzO$W>LYGVU zkmu;=-DGsE` zh}x@tkX~Hl6P+DtnlkN97`6Mv7MDiaJ30nCCS$bx`d#|wRGe(yXl4wsGk6Qi!YNu7=IN`5lSP5+GK{zV>MZ@tYo~pK zjW99zK{B0;RArVURW^MM*JC}c`VGgxkJN#-m22RrfKDp@K zy~0K-UAj-%3s>rC{ji0;A?J?1TORB!$0)A1U0a|HSj!)WegcQNj%OEryF?-R!i4^l z1kKPR2Gw~K}`^>|KXpOAYnmk90ic-rO$ zjLpK=4z*N`{d*@Efw!<0GM^ojw`r}<1FaZetE&?ugNmiuY5UQ9|K$0VgpKol)%nZr zZ`9)vEpS}?g!Bx1vd^y$n!#lNw%cz!^9bYXt1!7|b3 zb6OhjxXraZW2)f;`j3)cro(?T=2zxK{>cLN;WM}v1Nl&qe_Y_EE4ZcL`>8~5SB9IZ sgluMWkuN}YeQ}NMgnf*VnGJ-v)}yQ=MD;(C|BgPgukakfe*hu>0IS0IrvLx| diff --git a/web/static/js9_old/font/context-menu-icons.eot b/web/static/js9_old/font/context-menu-icons.eot deleted file mode 100644 index 9bedb88428917382857af90d0225a26d4bcbda5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3396 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 diff --git a/web/static/js9_old/font/context-menu-icons.woff b/web/static/js9_old/font/context-menu-icons.woff deleted file mode 100644 index a9a7618a1866811ddf595b4bd3e8cba12a7988e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2072 zcmY*Zc{J4PAO4QfjA0B3k!@tAl%-)VMUlPn^J6BYLi)~3nbB9(_cKazQxdJ5`SARhsOr94iT&xAw(Ko~+C3jv30g?BSq zTppy6Ag;EdYXj1sXW8@(9|&=k4Il)vt1K!Hnv38krU|44Q(31W?RRMQ0RWIm zD{|zhhp;)22RQ(FoFN=fdFMC4%cFy*KyZRa0Bh)=*wwg~KEVlHLQ${MKxzzd^?-S< z*-oNO1|Qx97uUuFVX%R*i88>hqM@2rOQMm5tH%c|8zO3eIb)mzlJB6UAZ z+#%1d75FEqWl#DPzExPG`4)Lk1x%AUs=`SA!Kh7Y&|^UNjrVpxtL3bk-xy777(Jyk zN-SFUtA5y`SWc%`hi|dpG8iZH8FzB$3&llZSSYYPF7B%EYCCLS2q##r+o|Fds@&5J zf1wvukL=SP%HNH_;{7Q~b`1}{?Fc%8s=dN~8%bP>3T*u$r@Z>YWSQuRmkm2kH%E-x zC>=pXNvyfJd%VpfCRKl$)UuNlsS65on-2Fz<8H%)tZOd$AnTNo@*}qf5F_f;GV7;1Pqg8%mr8_6r9V0jwI@?lKC=T2 z3CR907{uT!Q1a~$8#E@3;+t+9Rk)gbrDajvfCs(ec(Cg6tp!RGb8X~s4B-v4a!)(c ze&$wzkUU-2DmSQlE}0OPkL$;X3CBmTs_BZ!@LhOn3LVNRu`MbpH>4QmBQmTbw5%{qD~C@F^#lJD9k zvAW`8$;9@Ej3vD`%Vlm>YVGuMD|c#z<@od+t|-Tp&7FQOJ~?;e7znU zJ^Pdy0LKfM9Er)>Il;Ll$w;Wj?0@b@s-(w^^qY7~?$sqi)B$_LnV3%+6PR~{))?BxpyrAJ#W892c!*Py<$@%T_ zp_l7F08@2kdVlRY;TT)ys*dpR=3J%(zqNfb`yP3i!C=>Y{4tQ#z;wK@qI5jF1q3v{ zf-xOCpEZ8gO14NjZ*z3_r>e4^&^0NzhIk}GXXCeKq!%6HEND0NINKuacZB<2)4OMM zjnl+`P|-<_5daF0WBt`A3&65NuS>(tRbvJ?_d4@XQwx-u^5hpE3B-U?Rx1a32_ z`8e}D;{$@P5EtyBOjG)M$PYh%i z_SrU_-P2U2e0Kg}RI=_tOZR0YJS0CI<7TKeW}PXDxEiCV&Df7|FBQg3=e89L3J%;2 zL}ijDZRz`hNC$}TeAclRPfd-k*uh)$+A>Xy>}_WTTheIzD~~>Vvf|VjtnY96>F3?` zIzra_RD7K-J8!xpHf~knmZdWD-@F6ftEh#R@uG68(PPGFY)CUc3*{n}E=vK0ElV(L zRxHd|9#DKO-~6wCBf8*lg%0USskD}01~^jyBv6`Zv{2<@k)wRm(8R1>0~ zD->rc?^aRCy&|t)B*>~&`SpqDMG@RD$C_1vOVe&VqZbnnezv-)$#_)FwtumQd7rm* zF~RL3uWB$lqUw69&E60L>-^m5$|q5tX6>yxVrw7FjQnyQ!?IA?10P{gn8 zOpCTIu20PFo*x|3H~Zgc?&6u8_Lr8wY`zpzpSzpjQm}V@Sg)y?aq!j0OHy7QtIHk} zgGI}VPRJ*&UmMUR{kQWNW<6j_bzhLO$^6-vr~& Sg~Owq^GIFkCv-aWX@3E>jDU9l diff --git a/web/static/js9_old/font/context-menu-icons.woff2 b/web/static/js9_old/font/context-menu-icons.woff2 deleted file mode 100644 index b914efeddde2b5bc405469e7c9aa01b658be3f34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1592 zcmV-82FLk#Pew8T0RR9100uY!3jhEB01R{h00rp)0RR9100000000000000000000 z0000SR0dW6gG368EQu-sHUcCAAPW)z1Rw>44hLBqm3+YP?2E93`*_@8$$aJLI z5p93~VE;b3pW5aZWh;BtIbY#Ono7Wzm`J9`swb{s%U+C|ES8DR(H##8{%7h(z z@@U<`(yw@1H2nNOmvRc0@+*K_GYRYUNr^kYS+^NF)>Yp5W#w#!vy4u^VEsS*f@Du^ z-Dp@yvhw?nR}&S+2dE!Z*ZhJ+MimBNAPm7k7=eK>1_NON1_Fj8i$*?Y9Lzy{1&U)Z zd7V~-QcbT@%3|KlFdS{$-Ez5at8sFN5()QNHAdTUL#Ka=M*+!N6qQW806`{BgJDML zIslBK$c0Mg#I(5~w~b)c=Pvd3VHAbc3fVLZ<4C1zR7+cc2r0dk*=LJqfS11>f zl!6yk7AWv}b_=h^Tu1q$i|mqH@wYH(teRjMm1sB0Gkb5kEZ*jS2$Rx#ZaB}gliC(m zsii-rS1rPuH8>D)SID4=Y8 zE7(d(fma!Fs+LtKfPSs4?o`yQJ=$nii5H>@yaGrRC~73Rj+*i}A!C$RK@g|LFm}Pd zDCv9bY3T%I9m`Mv zt5K+{geh-VwNg@LVc7YZEW}04Pyp1#iAB`?Fs8zw;{lI~WC3NG!Y!jDcz<$6imA8` zbitjU2T%q%VIJ$@*h1(Dtq!eXRHwz@t^zP8dvV7uO33KSXxdpq)au7$y-UR2VPCCB z&Im!!G*3dKwiDa7>F%Z7LDwRd5w)TFWcMR<73o?5dB~i0=D%YP>HhS04w6H5S$FgI zUxZqY@{5ly(dGx26`3ZRWX468J}{qA9#WBAo#~V5Tb*4IQl20DAi5;py?OHA;xdkC zukSy~AoK-)zuUSiheUFIuP#zM=4nG>{mWH-{`=5$2gUnqjk?@FHUvL9Z(Ie8`*)qq zh;R=ZIk9p@P7b;ATWbHPDf`~<%<=SjQ(Xj=f;k&x$UHEgl1=j;# z4ryr&lbYrh745iS>bz5@=6Xz%9L*#1nlpwD&A4|CsqG4@-8W2j%gig_=64ON}5h^q4bTBM9Ud z$uLR-0HA9XW$xQGWi&g0$dC(!zMwECXtRd76qjjPx6{aWg&dmR8N>d+$VJ+;w*W|g z)SL_b^JLr4gZYV-o66j`5_SNVewi5Qq~QPS|I#=43~2a7#W(mF1(1a(9yquBEYW!T z#JT^!vfZ1$MC0X7Sy7&M)pw zxo3#n3iBQ~S{U`7Ci7lNR)5gaY}T|gpAYR^#okSNi!Ha4m}$uMh~lj7-`Ak_$;(1h zdJf@A#xY6dC$VTZS^=-wq?n}1GZq|V zSVnR~rO(s(Rxp8j4JAAqLuDCPR>r!kzr?Ca400E963JcQ&SnbyDSC(0002rH}T~F diff --git a/web/static/js9_old/help/archives.html b/web/static/js9_old/help/archives.html deleted file mode 100644 index 5a244d9..0000000 --- a/web/static/js9_old/help/archives.html +++ /dev/null @@ -1,88 +0,0 @@ - - - - - -Accessing Data Archives with JS9 - - - - - - - diff --git a/web/static/js9_old/help/changelog.html b/web/static/js9_old/help/changelog.html deleted file mode 100644 index 1a97fac..0000000 --- a/web/static/js9_old/help/changelog.html +++ /dev/null @@ -1,934 +0,0 @@ - - - - - -JS9 ChangeLog - - - -
-

JS9 ChangeLog

- -

Public Release 3.8 (June 21, 2022)

-
    -
  • fix bug preventing flip, rotate, rot90 from working in Load() opts -
  • update emscripten to v3.1.13 -
  • update socket.io to v4.5.1 -
  • update astroem/cfitsio library to v4.1.0 -
- -

Public Release 3.7 (May 16, 2022)

-
    -
  • add color change option to shape layers plugin -
  • ?renamedisplay=[old:]new will rename a display when loading the web page -
  • add experimental support for getting remote FITS URLs via CGI-based proxy -
  • add cgi proxy support to 'load remote ...' dialog box -
  • drag/drop url will try cgi proxy if proxy server is not available -
  • js9.js: private sockopts to JS9.socketioOpts to support user configuration -
  • js9Helper: helperOpts to socketioOpts, use Object.assign to merge obj prefs -
  • make cubecol's id more akin to a filename (i.e., without parens) -
  • remove gz:: and bz:: from saved virtual filename -
  • evcube: generated cube file cannot be a gzip'ed file (re: cfitsio) -
  • when saving a section, use the real section instead of recalculating it -
  • fix bug changing position of a selected region after pan/zoom/flip -
  • fix regions bug where stack order (send to back) was reset after pan/zoom -
  • fix bug changing position of a selected region after pan/zoom/flip -
  • fix bugs in handling text children of grouped regions -
  • fix bug when saving one slice of a cube, naxis was not always set to 2 -
  • astroem: rearrange a few source files -
  • add Quit() public access routine (Desktop app only) -
  • es6: use for( key of Object.keys(opts) ){ ... where possible -
  • es6: change a few functions to arrow functions -
  • update astroem/post.js to es6 to match emscripten v3.1.x -
  • update emscripten to v3.1.10 -
  • update socket.io to v4.5.0 -
  • update fabric.js to v5.2.1 -
- -

Patch Release 3.6.2 (January 3, 2022)

-
    -
  • add experimental support for converting event tables to 3D cubes -
  • add Counts in Each Cube Slice analysis task for files with NAXIS == 3 -
  • optimize psList search for js9 helper -
  • add UI to change val/pos display color -
  • region editor: fix annulus edit (width, dashes not always processed) -
  • improve smoke tests -
  • update emscripten to v3.0.0 -
  • update socket.io to v4.4.0 -
  • update fabric.js to v4.6.0 -
  • update open to v8.4.0 -
- -

Patch Release 3.6.1 (August 16, 2021)

-
    -
  • fix various problems with placement of panner rectangle -
  • edit annuli: don't multiply by scale factor when generating circles -
  • update astroem/cfitsio library to v4.0.0 -
- -

Public Release 3.6 (July 30, 2021)

-
    -
  • globalOpts.arrowIncrement: parameterize increment used by arrow keys -
  • selectShapes: if selecting a single shape, don't make a group selection -
  • add support for fabricOpts in js9prefs.js -
  • fix display of rotated non-square image in a non-square display -
  • fix bug that allowed arrow keys to move locked regions -
  • fix regression when adding/removing polygon points -
  • improve support for proxying js9 helper through a web server -
  • change the size of annulus region annuli graphically (meta-click to edit) -
  • change annulus defaults from 2 rings (0->15,15->30) to 1 ring (15->30) -
  • globalOpts.editRegions controls GUI region editing (def: true) -
  • fix magnifier jitter when moving a region with the arrow keys -
  • changeShapes: fix v3.4 regression that sometimes changed annuli incorrectly -
  • rearrange npm modules by uninstalling and installing socket.io -
  • clean up emscripten init in preparation for worker-based experiments -
  • update open to v8.2.1 -
  • update fabric.js to v4.5.1 -
  • update socket.io to v4.1.2 -
  • update emscripten to v2.0.26 -
- -

Public Release 3.5 (June 1, 2021)

-
    -
  • remove the long-deprecated fits2png code -
  • fix bug in js9helper sometimes preventing fits2fits size check -
  • add support for displaying the actual png/jpeg image ("overlay" param) -
  • add overlay parameter to preferences plugin -
  • add reset to image filter plugin (overlays can't reset via contrast/bias) -
  • optimize static colormap cell lookup using binary search -
  • fix bug in JS9.eventToCharStr assigning 46 to delete instead of a dot -
  • js9prefs.js: add support for a config object to allow merging obj prefs -
  • update emscripten to v2.0.23 -
- -

Public Release 3.4 (May 5, 2021)

-
    -
  • maintain selection when switching between images, panning/zooming images -
  • ensure infobox displays correctly formatted val string -
  • add support for bitpix == 64 FITS data -
  • reg2wcsstr should not perform size calculation, use "cdelt" instead -
  • changing a region now shows immediately in the magnifier -
  • push unchangeable regions to back of fabric stack -
  • add 'locked' as opposite alias to 'changeable' for locking regions -
  • add support for 'locked' in region editor -
  • add support for binning tables on alt columns -
  • make mouseTouchZoom global instead of tied to a display -
  • turn off clickToFocus by default, way too many clicks (e.g. using menus) -
  • GetImage: don't throw if named image not available (return null instead) -
  • changing a region now shows immediately in the magnifier -
  • region editor now permits parent to change child's text -
  • changeShapes syncs child text color to main color (via regSyncTextColor) -
  • getShapes: now returns shapes in order in which they were loaded -
  • loadproxy: add support for ms-dos gzip files -
  • handle Infinity when getting scale min,max -
  • js9helper: change html error message to avoid 'Invalid character' error -
  • parameterize direction of mouse wheel zoom -
  • add skip factor to wheel zoom to avoid pileup -
  • globalOpts.mousetouchLimit limits zoom-out to size of image (def: true) -
  • don't display regions when GUI zooming an image with many (>500) regions -
  • don't display regions when GUI panning an image with many (>500) regions -
  • redesign region multi-selection dialog box to support groups -
  • add JS9.GroupRegions() and JS9.UngroupRegions() public routines -
  • add JS9.GroupShapes() and JS9.UngroupShapes() public routines -
  • add JS9.ListGroups() public routine -
  • add JS9.UnselectRegions() and JS9.UnselectShapes() public routines -
  • extend shape (region) selections to support boolean expressions (&&,||,!) -
  • add "onarrowkey" event for plugins, enable its use with pixel table plugin -
  • prefs: only save schema props (e.g. not all globalOpts when saving globals) -
  • fix regression in js9helper limiting size of file transfer -
  • remove support for fabric.js v1, it's ancient and incompatible with groups -
  • add deepscan.io checks when pushing to repository -
  • update eslint to 7.21.0 and make it happy -
  • update socket.io 3.1.2, then 4.0.1, remove 2.4.1 (now supported by v3+) -
  • update npm dependencies: uuid, rimraf, open, ps-node, table-parser -
  • update emscripten to v2.0.18 -
- -

Patch Release 3.3.1 (December 15, 2020)

-
    -
  • fix old bug appending "//" to helperProtocol, even if present (breaks socket.io when saving prefs) -
  • add regMenuCreate property to prefs plugin, remove useless regConfigSize -
- -

Public Release 3.3 (December 14, 2020)

-
    -
  • listRegions: add format='regions' to parallel saveRegions output -
  • regions config: change color, width, pattern as colorpicker, menus change -
  • regions: fix regression when panning a grouped polygon or line -
  • js9Helper: fix regression in uploading FITS files -
  • fix bug to re-establish focus on js9 display after clipboard copy -
  • js9worker: worker socketio connection can now be restarted automatically -
  • update emscripten to v2.0.10 -
  • add support for socket.io v3.0.3, while maintaining support for v2 -
  • update fabric.js to v4.2.0 -
- -

Public Release 3.2 (November 6, 2020, a day of hope)

-
    -
  • add js9 shell scripting and desktop hostfs smoke tests -
  • add checks on filename and id to guard against xss attack -
  • add js9msg script to send messages using wget or curl (node not required) -
  • js9 script will now use faster js9msg script, if appropriate -
  • make JS9's returned data consistent between js9Msg.js, js9Helper.js httpd -
  • allow --with-cfitsio (without a dir arg) if lib is in a system dir -
  • desktop: add dialog box for exported script -
  • desktop: in script, look for webpage in current dir, then in install dir -
  • desktop: pass resize info if specified width or height is <= 0 -
  • desktop: save cmdline opts on close (use same width, height next time) -
  • fix problems passing very large FITS headers (> approx. 1Mb) to initwcs() -
  • fix regression in desktop when using default web page -
  • fix regression in mouseup cb: updateShapes mode is "update", not "mouseup" -
  • various changes to generate Linux desktop app as well as macOS app -
  • js9Electron.js: add support for js9Electron.json file -
  • add support for editing cmd line opts in preferences plugin -
  • refactor desktop app to support editing cmd line opts -
  • modify js/FileSaver.js so that Jupyter notebooks put saveAs() on window -
  • update FileSaver.js to 2.0.4 -
  • update emscripten to 2.0.5 -
- -

Public Release 3.1 (September 8, 2020)

-
    -
  • regions menu: list, remove act on selected or all regions -
  • edit menu: edit, copy act on selected or all regions -
  • add GUI inputs to configure style (color, strokewidth, stroke pattern) -
  • add selection criteria input to multi-selection dialog -
  • add SelectShapes() and SelectRegions() public routines -
  • console plugin can now execute public routines -
  • add ability to turn off auto-create of regions from the Regions menu -
  • 'a' key creates a region using the last one selected from Regions menu -
  • set globalOpts.regionsToClipboard to false (breaks copy selected support) -
  • display (screen) coords can be specified prefixing 'd' to x, y -
  • display coords can be preserved by specifying preservedcoords property -
  • view menu option to show display coords in val/pos string in image sys -
  • add JS9.DisplayNextImage() public access routine -
  • add 'sticky' property to regions (no change on pan, zoom, rotate, flip) -
  • refactor dataminmax, mkColorData to avoid Chrome multi-sec delays in for loops -
  • add support for rotating to North Is Up in current wcssys in SetRotate("northisup") -
  • add north is up rotation to Zoom menu and zoomcontrols dialog -
  • rotate/flip panner image as displayed image rotates/flips -
  • N/E marker now tracks current wcssys, not file's wcssys -
  • JS9.SetFlip(), JS9.SetRot90() use transform instead of changing image data -
  • add JS9.SetRotation(), JS9.GetRotation() to rotate image by arbitrary angle -
  • add JS9.ChangeRegionTags() public routine to add/remove region tags -
  • reorganize github site (new build directory, src in src, demos in demos) -
  • make install does not load demos, use make install-demos explicitly -
  • remove deprecated fitsy code from top level -
  • add JS9.ListRegions(), JS9.EditRegions() public routines -
  • regions menu: options to save regions using different wcs, also save csv -
  • separate: add ability to use a CSS Grid instead of light windows -
  • sync: add GUI for plugin and change menu GUI to match -
  • desktop: add searchbar to analysis light windows (ctl-f or cmd-f) -
  • inline voyager images (remove dax versions from js9inline.js) -
  • JS9Titlebar plugin adds image id to title (uses globalOpts.updateTitlebar) -
  • add onregionsmove callback to Magnifier plugin (if intensivePlugins) -
  • add CopyShapes() to copy shape layers to another image (cf CopyRegions) -
  • add CopyParams() routine to copy params from one image to another -
  • add ColorControls plugin to color menu -
  • rgb mode is now associated with each display separately (not global) -
  • move rgb info when moving images between displays -
  • resort preloaded files into their original order -
  • update node minimist package to avoid prototype pollution bug -
  • don't use centered scaling for line and box regions -
  • add length/angle options to line configuration dialog box -
  • add statusbar plugin -
  • globalOpts.menuPosition to set menu position (def: below the menu button) -
  • add sum/avg option to binning plugin -
  • add support for fractional binning -
  • add GetOpacity(), SetOpacity() -
  • add support for opacity floor: an opacity assigned if pixval <= floorval -
  • extend opacity in menu to include floor opacity support -
  • sync images: sync all images to facilitate blinking -
  • sync images: add syncwcs option to force sync using image coords -
  • desktop: options can now be passed via --switches (e.g., --scale log) -
  • Load: add ra,dec, px,py, wcs properties to support panning -
  • Load: regions property can load a region file or add a region -
  • syncImages: add rot90, flip, and sync blended images -
  • CloseDisplay now takes an optional regexp of images to close -
  • add source, destination in/out/over/atop methods to blend plugin -
  • static colormaps: specify color/opacity and pixel range -
  • expand MaskImage to support "overlay" as well as "mask" of image data -
  • add MaskImage() routine to allow one image to mask another -
  • remove experimental LoadAuxFile() (too fragile, subsumed elsewhere) -
  • fix region parser to check for exclude regions -
  • fix bug when sortable GUI changed the image stack with multiple displays -
  • fix annulus radii text box in regions config -
  • update uuid and rimraf modules for js9Helper -
  • update jquery to v3.5.0 -
  • update emscripten to v1.40.1 -
  • update fabric.js to v3.6.3 and enable strokeUniform -
  • update cfitsio to v3.48 (via astroem repository) -
  • update ResizeSensor to v1.2.2 -
- -

Public Release 3.0 (January 6, 2020)

-
    -
  • improve menu placement for Jupyter support -
  • replace image filter menu with plugin that supports parameter adjustments -
  • just redisplay already-loaded slices -
  • added PanZoom controls to Zoom menu, containing "pan to" support -
  • wcs menu: don't show wcs options if image has no wcs -
  • add Google's new turbo colormap -
  • add analysis plot configuration dialog box to set data range and scale -
  • improve panner to show display area (not image area) -
  • infobox: fix bug displaying image coords instead of phys if sys was image -
  • webworker init: avoid CORS problems when webworker is on a remote location -
  • add array-based x,y flip and +/- 90 degree rotation to the Zoom menu -
  • add JS9.SetRot90() and JS9.SetFlip() public access routines -
  • improve LTM/LTV support, various bug fixes -
  • avoid weakness in wcslib causing the wrong header length to be used -
  • fix error handling when called from external message -
  • update emscripten to v1.39.3 (required several changes to montage) -
  • upgrade code to use ES6 -
- -

Public Release 2.5 (August 30, 2019)

-
    -
  • re-displaying an image now calls the onload callback -
  • JS9.BlendDisplay('reset') unsets blended images -
  • JS9.DisplayExtension('all') loads all image extensions -
  • JS9.ReprojectData('all') uses the current image to reproject others -
  • JS9.Load('foo.fits', {allext: true}) loads foo.fits, then all extensions -
  • add 'Display all images' button to Extensions plugin -
  • add support for loading all images in a multi-extension FITS file at once -
  • fix typo that made incorrect sections of non-rectangular images at zoom < 1 -
  • fix bug when zooming image with a selected region -
  • fix bug when loading multiple annuli at once -
  • fix regression in DisplaySection: new ext was not added to FITS filename -
- -

Public Release 2.4 (July 15, 2019)

-
    -
  • fix double tap to close capability on iPhones -
  • fix internal regcnts tasks using annuli on iOS devices and re-enable them -
  • wcs grid: fix high limit display coordinates -
  • analysis menu: only display 3d analysis menu options for 3d images -
  • refactor LoadWindow so load waits for the lightwin to be fully created -
  • desktop app: support merging analysis tasks and loading foreign web pages -
  • add JS9.GetAnalysis() to return analysis task definitions -
  • add missing routine in internal CountsInRegions() and RadialProfile() -
  • add support for "All" selection of regions to include text children -
  • GetRegions: return text child region id -
  • desktop app: enabling node mounts local file system for direct FITS access -
  • desktop app: add security checks -
  • fix overly-aggressive .gitignore and add missing files -
  • fix typo that broke createMosaic("all") -
  • fix bugs in imexam plugins using a rotated line to define the image section -
  • fix spinner when using open local file dialog -
  • update emscripten to v1.38.37 -
  • update contextMenu to v2.8.0 -
- -

Public Release 2.3 (May 1, 2019)

-
    -
  • support for Mac app, a bit of Windows app: see github/ericmandel/js9app -
  • Electron desktop app: use internal colorpicker if Electron version >= 5 -
  • add logo support -
  • add AlignPanZoom() public routine -
  • add --cmds [cmds] and --cmdfile [file] switches to js9Electron.js -
  • add --node switch to js9Electron.js, allowing nodeIntegration -
  • add JS9.globalOpts.onpreload property -
  • fix wcs alignment of blended images during pan and zoom operations -
  • fix mosaic code, which needed area mosaic file after all -
  • redesign Menubar to use more submenus, especially File menu -
  • fix bug in the supermenu sometimes not displaying the File sub-menus -
  • work around invalidation of emscripten heap pointers when memory increases -
  • add ability to change child text options via the parent shape -
  • add ability to push selected region to bottom of overlapping stack ('d') -
  • add ability to select all regions ('S' and Regions menu option) -
  • add SaveDir public routine (desktop app only) to set the save directory -
  • SavePNG,SaveJPEG: add option to save image RGB pixels instead of display -
  • SavePNG,SaveJPEG: add option to skip saving the layers (e.g. regions) -
  • shape layers (incl. regions) can now be exported in SVG format -
  • closing a light window that displays images now supports: close, move, ask -
  • add support for unconstrained panning -
  • dynamically select a JS9 display (supports one plugin for many displays) -
  • SaveColormap: allow multiple colormaps to be save at once -
  • add ability to change color, width, dash lines, tags of selected regions -
  • fix bug in "north is up" rotation: take CDELT values into account -
  • add direction vector to panner -
  • display regions in lightwin instead of on display or in infobox -
  • add region copyToClipboard capability (so 'p' always pastes last region) -
  • add ability to specify display opts in a FITS header (IMOPTS param) -
  • add ability to specify colormaps in a FITS header (IMCMAP param) -
  • add ability to create image cutouts of selected region(s) -
  • add ability to rename a JS9 display via JS9.RenameDisplay() api call -
  • ensure saved order of images after session load -
  • add --title and --renameid options to desktop app to rename display ids -
  • parameterize initial blending params -
  • Preload() loads .cmap files as colormaps -
  • colormaps: specify m colorwheel slices, from which n colormaps are assigned -
  • add ability to specify {display: id} param to external api calls -
  • add ability to unremove previously removed regions -
  • add ability to select regions based on the file from which they were loaded -
  • calling LoadRegions() twice removes previous regions loaded from the file -
  • add globalOpts.quietReturn to silence 'OK' messages -
  • Desktop (Electron.js) version: add --savedir option to skip save dialog -
  • JS9.Load(): globalOpts.reloadRefresh property to control reloading an image -
  • add 'revert' option to wcs reproject submenu -
  • wcs menu: each wcs system has own current units (based on initial defaults) -
  • fix region parser to see 'linear' as wcs, not a 'line' region -
  • cmaps: allow color choice via text input in fallback colorpicker -
  • fix memory leaks in reproject code -
  • LoadColormap: support file containing array of colormaps -
  • Infobox: for long filenames, click to see right hand side -
  • addColormaps now replaces a cmap with same name -
  • add 3D plot capabilities for data cubes in Analysis menu -
  • many improvements to user-defined menus -
  • turn on wasm in js9 Electron.js Desktop app -
  • menu: allow load/save of cmaps without a loaded image -
  • when blending, only sync zoom/pan reprojected images that are wcs aligned -
  • reproject: use float32 instead of float64 if datatype allows (less memory) -
  • reproject: correctly align images when wcs ref image is panned or zoomed -
  • reproject: fix memory leaks, always go back to original image -
  • js9 helper: increase ping timeout to avoid Chrome disconnects -
  • improve header generation and FITS card handling -
  • allow DisplaySection() to display the new section in a different display -
  • add colormaps plugin to create (complementary) colormaps -
  • fine-tune positioning: arrow keys display small crosshair cursor -
  • fine-tune positioning: arrow keys change magnifier display center -
  • regions menu: listonchange can act on "selected" (default) or "all" regions -
  • preferences plugin: image parameter for "all" or "selected" listonchange -
  • Meta (or Ctrl) now used for keyboard shortcuts displaying a light window -
  • edit, region menus: add option to display region configuration window -
  • add 'M-e' keyboard shortcut to display region configuration window -
  • add 'M-o' keyboard shortcut to open a local file -
  • add 'p' keyboard shortcut to paste regions at current mouse position -
  • (joining 'P' keyboard shortcut to paste regions at their own position) -
  • add 's' keyboard shortcut to select region that contains the mouse -
  • fix bug when saving/copying regions inside a rotated group -
  • Meta key during mouse move no longer updates internal image position -
  • update emscripten to v1.38.28 -
  • update fabric.js to v2.7.0 -
- -

Public Release 2.2 (October 9, 2018)

-
    -
  • add sync plugin: synchronize operations between two or more images -
  • add JS9.SyncImages() and JS9.UnsyncImages() public access routines -
  • SetParam(): setting a core param calls the core function -
  • add support for disabling colormap, pan, regions, scale, wcs, or zoom for a given image -
  • add Scale Clipping Limits plugin (with pixel distribution plot) -
  • add support for setting up a proxy from Apache to the Node.js helper -
  • add Separate/Gather Images plugin -
  • desktop app: add support for printing entire window -
  • desktop app: add support for saving entire window to a pdf file -
  • add support for loading all slices of a data cube separately into JS9 -
  • add support for user-defined menus in the Menubar -
  • add support for averaging pixels when binning (def: summing) -
  • add support for Mac-style menubars -
  • add Edit menu to Menubar (copy/paste regions, positions, values) -
  • add JS9.DisplayCoordGrid() and associated client-side task to Analysis menu -
  • add JS9.CountsInRegions() and associated client-side task to Analysis menu -
  • add JS9.RadialProfile(), and associated client-side task to Analysis menu -
  • reproject will try to bin large images to avoid memory limits -
  • add support for wcs-based cross-hair tracking of images -
  • add support for displaying mosaic images -
  • add CreateMosaic() public routine -
  • remove .fz suffix in various places where it breaks things -
  • fix bug where binning an image was not updating the CD matrix -
  • update emscripten to v1.38.5 -
  • update socket.io to v2.1.1 -
- -

Public Release 2.1 (May 10, 2018)

-
    -
  • allow JS9.SetPan() to accept a single object with x and y properties -
  • allow JS9.WCSToPix() to accept a single object with ra and dec properties -
  • allow JS9.PixToWCS() to accept a single object with x and y properties -
  • add support for Toolbar plugin -
  • add JS9.SetParam() and JS9.GetParam() public routines -
  • add JS9.SetToolbar() and JS9.GetToolbar() public routines -
  • add JS9.SeparateDisplay() public routine to separate images in a display -
  • add JS9.GatherDisplay() public routine to gather images into a display -
  • add JS9.LoadColormap() public routine -
  • add JS9.LightWindow() public routine -
  • JS9.GetImageData() now returns display size, bin factor -
  • JS9.RunAnalysis() return types now include "regions" and "catalog" -
  • include comments and history in display of FITS header -
  • iOS 11.2.2,5 disable wasm: github.com/kripken/emscripten/issues/6042 -
  • add refresh property to JS9.Load() to re-retrieve data -
  • add support for refreshing a file/url in JS9.RefreshImage() -
  • add support for displaying full image to JS9.DisplaySection() -
  • add 'f' (full) and 'r' (refresh) keyboard actions -
  • change 'r' (raise region layer) to '^' in keyboard actions -
  • add refresh and section commands to Console plugin (and js9 script) -
  • binning plugin: add button to load full image -
  • sessions: save/re-run dataLayer routines (e.g. reproject, rotate) -
  • sessions: save/restore blend mode -
  • sessions: save/restore wcsim from reprojection -
  • sessions: save/restore display parameters -
  • SaveSession saves either current image or all images -
  • ensure correct extension for Save{Session,PNG,JPEG} -
  • image blending: update GUI when changes are made via API -
  • image blending: support sizing of static div -
  • fix imexam routines needing integer section limits -
  • update emscripten to v1.37.28 -
  • update fabric.js to v1.7.22 -
  • update contextMenu to v2.6.3 -
- -

Minor Patch Release 2.0.2 (December 15, 2017)

-
    -
  • add zscale, zmax to SetScale() -
  • improve display-based routines (separate, gather, resize, center, select) -
  • improve alignment of differently sized images -
  • allow zoom during image blending -
  • add menu support for closing all images -
  • add support for selecting a target display in a supermenu -
  • add support for dispersing images from one display into new displays -
  • add support for gathering images from multiple displays into one -
  • add support for new image inheriting params from current image -
  • fix allinone (dont use wasm) -
  • fix bug loading wasm file in LoadWindow('new') -
- -

Minor Patch Release 2.0.1 (September 29, 2017)

-
    -
  • move helper log file outside www directory -
  • improve fetchURL() error messages -
  • fix bug in load catalog menu option -
  • allow json opts in Load* family of routines -
  • fix bug in JS9.Preload by saving a copy of opts -
- -

Public Release 2.0 (September 27, 2017)

-
    -
  • add support for emscripten-based WebAssembly -
  • add support for HPX projection -
  • add wcs selection menu to regions config dialog -
  • aesthetic improvements to regions config dialog -
  • fix race condition in Electron startup if not codesigned -
  • fix binning when manually specifying parent file -
  • fix wcs system display in infobox -
  • fix bug in js9Helper.js where localhost was not upgrading to use ws -
  • update emscripten to v1.37.20 -
  • update fabric.js to v1.7.19 -
  • update socket.io to v2.0.3 -
  • update jquery to v3.2.1 -
  • update jquery-ui to v1.12.1 -
- -

Public Release 1.12 (July 25, 2017)

-
    -
  • refactor astroem to use astroem repository of emscripten library byte-code -
  • add DisplaySection() public routine -
  • add ability to extract a section from images (as well as tables) -
  • add fits2fits configuration params for large files support -
  • add large file support in which large files can be handled externally -
  • allow infoBox to be configured via JS9.globalOpts.infoBox and preferences -
  • add wcs center and wcs fov display to infoBox -
  • add js9.app Mac desktops to run js9 script (drag/drop images onto it, etc.) -
  • add support for specifying URLs on js9 command line (uses proxy load) -
  • JS9.Preload() will now call JS9.ProxyLoad(), if required -
  • proxy load now turned on by default (needed for Desktop use) -
  • add support for drag/drop URLs onto JS9 display (uses proxy load) -
  • add support for uploading FITS files to a remove server -
  • add support for displaying bzip2 files -
  • add support for drag drop of region, catalogs, sessions (by file extension) -
  • add text, fonts, stroke options to region configuration dialog box -
  • add support for specifying a text region as a child of a region -
  • add js9-to-ds9 region conversion to js9 script (-r) -
  • add support for importing ds9 regions, including properties in comments -
  • sort overlapping regions so smallest is on top -
  • fix memory leaks in mef support -
  • add Divs plugin to show/hide in-page JS9 plugin divs -
  • allow shape size controls to match shape color at border, corner, or both -
  • use file extensions when opening local files (fits, regions, catalogs, etc) -
  • add keyboard action to move selected region in back of other shapes (not a default) -
  • JS9.RegisterPlugins() will instantiate plugins if scripts load asynchronously -
  • add JS9.InstantiatePlugins() public routine -
  • deprecate auto load of js9Prefs.son (load js9prefs.js explicitly instead) -
  • update emscripten to v1.37.9 -
  • update socket.io to v1.7.3 (big change in module directory structure) -
- -

Public Release 1.11 (January 9, 2017)

-
    -
  • add support for displaying HEALPix files -
  • add initial support for memory management of internal FITS files -
  • add menu support for clearing FITS files from internal memory -
  • add support for running JS9 on the Desktop using Electron.js -
  • integrate Desktop Electron support into into js9 script -
  • add ability to load local catalogs and save catalogs to disk -
  • add JS9.LoadCatalog() and JS9.SaveCatalog() public routines -
  • add Shape Layer plugin to turn on/off layers and set the active layer -
  • remove list of shape layers from View menu in favor of Shape Layer plugin -
  • add JS9.ActiveShapeLayer() public routine -
  • improve onimagedisplay processing for mef, cube, imarith plugins -
  • fix bug in cube plugin blink support -
  • update fabric.js to v1.6.6 -
  • update socket.io to v1.5.1 -
  • update closure-compiler to v20160911 -
- -

Public Release 1.10 (October 11, 2016)

-
    -
  • add support for full-display mode -
  • add support for keyboard actions and shortcuts -
  • add JS9.SetRGBMode(), JS9.GetRGBMode() public routines -
  • unclutter the position/value display -
  • dont update value/position if "special key" is pressed -
  • buttons and menu/titlebars are now beautiful and Mac-like -
  • buttons can be beautiful and flat (change via class specification) -
  • add support for copying regions to another image (JS9.CopyRegions()) -
  • add initial support for plotly plotting library -
  • improvements to energyplot, evfilter, binning plugins -
  • add support for alternate WCS (including JS9.GetWCS, JS9.SetWCS routines) -
  • add JS9.LookupImage() public routine -
  • generalize and extend plugin callback capability -
  • extend range of FITS files that can be WCS-projected using Montage -
  • add support in the File menu for saving and loading sessions -
  • add JS9.LoadSession() and JS9.SaveSession() public routines -
  • update imexam,fitsy, archive plugins -
  • update fabric.js to v1.6.3 -
  • update cfitsio to v3.39 -
  • update socket.io to v1.4.5 -
- -

Public Release 1.9 (June 8, 2016)

-
    -
  • add standard RGB image processing functions to the Analysis menu -
  • add support for gesture-based zoom (scroll wheel and pinch) -
  • add MouseTouch plugin to change mouse/touch actions -
  • image id now contains extension name or number for FITS extensions -
  • add support for histogram equalization scaling -
  • add support in js9 script for starting up a browser/web page -
  • add support for displaying slices of a FITS data cube -
  • add support for image arithmetic (between 2 images or image & constant) -
  • add support moving images between JS9 displays -
  • add support for displaying HDUs in multi-extension FITS files -
  • add 'magma', 'inferno', 'plasma', 'viridis' colormaps from matplotlib -
  • deprecate the use of funtools when building JS9; please use cfitsio -
- -

Public Release 1.8 (March 21, 2016)

-
    -
  • add image blending plugin to support blending operations between images -
  • add ability to blend images using W3C composite/blending modes -
  • add colorbar plugin to display colormap vs intensity information -
  • add blink plugin to blink images -
  • add line region (with support for multiple line segments) -
  • add raw data layers to allow manipulation of underlying raw data -
  • add JS9.FilterRGBImage() to support RGB image processing routines -
  • add JS9.GaussBlurData public routine to perform Gaussian blur on data layer -
  • add JS9.RawDataLayer() public routine for raw data layer manipulation -
  • add JS9.ShiftData() public routine to shift raw data in x and y -
  • add JS9.GetDisplayData(), returning data for all images in a given display -
  • add JS9.SaveJPEG() public routine to save image and overlays as JPEG -
  • add JS9.AddColormap() public routine to add a colormap to JS9 -
  • add JS9.SaveColormap(), JS9.OpenColormapMenu() public routines -
  • JS9.SavePNG() public routine now saves image and graphical overlays -
  • add support for reprojecting images using Montage/mProjectPP -
  • add JS9.Reproject() public access routine -
  • change menu option Color->alpha (0 to 255) to Color->opacity (0.0 to 1.0) -
  • fix bug when interactively changing panner for non-square images -
  • fix bug in lut colormap, which truncated the first color -
  • refactor emscripten astroem package into sub-packages -
  • update emscripten to v1.35.0 -
- -

Public Release 1.7 (January 12, 2016)

-
    -
  • add Jupyter/IPython support for iframes -
  • add keyboard focus support for Jupyter/IPython -
  • add timeouts to avoid back-end connect() hangs -
  • add support for using rgb file as the display over a data file -
  • default helper is "none" (for Jupyter, where js9Prefs.json is not loaded) -
  • add lower right handle to change width and height of display -
  • add View menu option to change width and height of display -
  • add JS9.ResizeDisplay() to change the size of a JS9 display element -
  • add JS9.DisplayPlugin() public routine for custom menus -
  • add JS9.GetFITSHeader() (as a string) public routine for custom menus -
  • add resize handle to display (lower right corner) -
  • add View menu option to change the display width and height -
  • add support for handling group events in shape layers (i.e. catalogs) -
  • add support for handling mouse events in shape layers (i.e. catalogs) -
  • add support for tooltips to shape layers (i.e. catalogs) -
  • add return values to saveFITS() and savePNG() -
  • add spinner while waiting -
  • fix OpenFileMenu() and OpenRegionMenu() when using multiple displays -
  • fix text region printing -
  • fix bug in panner box when panner image does not fill panner width -
  • fix region configure to "delete" only itself (not all regions) -
  • fix one pixel bug in WCS region conversion -
  • update fabric.js to v1.5.0 -
  • update socket.io to v1.3.7 -
  • updated jquery to v1.11.3 -
- -

Public Release 1.6 (November 7, 2015)

-
    -
  • add support for extracting image/table sections from "parent" files -
  • add JS9.LoadProxy() public routine to load FITS URLs via proxy server -
  • add support for loading Dropbox (and other CORS enabled) shared links -
  • add support for loading links by proxy through the back-end server -
  • add SetValPos and DisplayMessage public routines -
  • add options to create new JS9 windows from the file menu -
  • add experimental support for JS9 in an iframe, using postMessage -
  • remove starting "_" from SUPERMENU id (not legal syntax) -
  • fix various iOS foibles (scrolling, double-click to close) -
  • fix memory leak in cfitsio RefreshImage() support -
  • fix bug in lut colormap limit check -
  • fix bug in JS9.RefreshImage() blob handler -
  • fix overflow bug in cfitsio bscale/bzero support -
  • fix bug in zscale by properly exposing emscripten methods -
  • update emscripten to 1.34.1 -
  • update wcs library to 3.9.0 -
- -

Public Release 1.5 (July 9, 2015)

-
    -
  • add support for specifying regions using Funtools/DS9 syntax -
  • add support for loading Funtools/DS9 region files -
  • add support for running the Node.js helper using https protocol -
- -

Public Release 1.4 (May 3, 2015)

-
    -
  • add Preferences plugin to set image and region user prefs -
  • add ability to save image to FITS and PNG files (limited Safari support) -
  • add ability to save regions to a text file -
  • fix bugs in Binning plugin (mainly for cfitsio, but some general bug fixes) -
- -

Public Release 1.3 (March 30, 2015)

-
    -
  • add cfitsio library support to JS9 (emscripten compile to javascript) -
  • add data-width and data-height attributes to change the size of JS9 divs -
  • extend tpos and js9helper to use cfitsio (or funtools) -
  • update tpos js9Protocol to 1.1 to include header comments in the header -
  • default WCS is now determined in the browser, not by the back-end server -
  • ensure that section info is maintained during JS9.RefreshImage() -
  • prevent preload from happening more than once -
  • fix broken File->Open menu option -
  • update emscripten to v1.27, add new optimizations to astroem -
- -

Public Release 1.2 (January 4, 2015)

-
    -
  • concurrent release of pyjs9 1.0 on github -
  • update socket.io to the Engine.IO-driven v1.x (specifically v1.2.1) -
  • add ability to reconnect to node.js server automatically if latter restarts -
  • add support for specifying a temp work dir for back-end analysis -
  • add http support to js9Helper.js so messages can be sent via GET, POST -
  • JS9.Load: accepts FITS files as blobs and base64-encoded strings -
  • JS9.RefreshImage: accepts blobs (FITS files), js arrays and typed arrays -
  • JS9.GetImageData(): returned data can be array or base64-encoded string -
  • fix bug in arguments to public api routines sent via external message -
  • fix bug in File List: clicking on same file multiple times now redisplays -
- -

Public Release 1.1 (November 15, 2014)

-
    -
  • NB: api change: added errcode to argument list of RunAnalysis() callback -
  • new api: AddDivs() to add JS9 displays and/or plugins to the web page -
  • new api: Send() sends msgs programmatically (useful for 3rd party helpers) -
  • add support for super-menus that can control multiple JS9 displays -
  • add support for onload callback when displaying FITS files -
  • allow xcen, ycen (in image coords), zoom to be passed in obj to JS9.Load() -
  • re-factor js9Helper.js: each analysis task is its own top-level msg -
  • allow user-defined msgs to be added to analysis tasks more easily -
  • ensure correct region size during RefreshImage() and table binning -
  • add contour plugin to default plugins in js9plugins.js -
  • add checks for NaN values to imexam plugins -
  • fix imexam plugins bug when regions are rotated and resized -
  • fix bug in encircled energy preventing calculation for non-integer radii -
  • properly handle FITS TFORM cards without a repeat value (XMM data) -
  • resize regions properly when tables are binned by a block factor -
  • ensure that datamin and datmamax are updated when a binary table is binned -
  • dont send image notify events to back-end during contrast/bias changes -
- -

Public Release 1.0 (September 30, 2014)

-
    -
  • NB: change to the Public API: id is no longer first argument. See API doc. -
  • infobox plugin upgraded to a tabular display -
  • node.js server sends unique pageid back to JS9 -
  • JS9 menus now cover light windows (higher zindex) -
  • improved accuracy of polygon points for contours -
  • moving a polygon point now calls listRegion -
  • added missing commas in WCS display of polygon points -
  • corrected WCS for drag/drop of sections of FITS binary tables -
  • fixed incorrect region size when binning FITS binary tables -
  • fixed memory leak in astroem reg2wcs routine -
  • plugin divs can now set height and width using CSS -
  • added defensive code to remove bash functions from CGI and node calls -
  • updated fabric.js to 1.4.11 -
- -

Release 1-epsilon (July 28, 2014)

-
    -
  • JS9.Load() can now load FITS files directly (rather than converting to PNG) -
  • added support for FITS binary tables, including binning and filtering -
  • added support for gzip'ed FITS files -
  • added support for "physical" coordinates (i.e., tied to original data file) -
  • changed 2D graphics subsystem from Kinetic.js to fabric.js -
  • added generalized shape layer support for regions, catalogs, contours, etc. -
  • region context menu is now a light-weight web page with many new features -
  • added text and point regions -
  • position of a pixel is now in the center of the pixel -
  • accelerator key changed from shift key to meta key (command on Mac, control elsewhere) -
  • reduced number of js9 files to load in a web page -
  • redesigned and flattened returned region object -
  • redesigned public API -
  • changed Public routines JS9.Pix2WCS and JS9.WCS2Pix to be 1-indexed -
  • added ability to group and move regions -
  • box rotation is now around the center of the region -
  • all image coordinate are now 1-indexed throughout -
  • fixed bug where adding a polygon pt didn't show until region was selected -
  • changed polygon points to an array of objects {x, y} instead of just x, y -
  • fixed various layout bugs in plugins -
  • updated emscripten to latest version -
  • updated flot to latest version -
  • updated jquery to 1.11.1 -
- -

Beta Release 13 (April 6, 2014)

-
    -
  • added support for handling NaN values -
- -

Beta Release 12 (March 10, 2014)

-
    -
  • added support for browser-based analysis via plugins (JS9.RegisterPlugin) -
  • converted Menubar, Info, Panner, Magnifier to plugins -
  • initial version of imexam plugin available (in plugins directory) -
  • initial version of archive/catalog server plugin available -
  • added support for zscale (IRAF min/max algorithm for scaling) -
  • added support for user scale limits -
  • regions can now be moved off the image -
  • shift key disables mouse plugin callbacks -
  • zooming a small image will use all of the available display canvas -
  • added support for sub-pixel zooming -
  • added ability to process all keys in keypress callback -
  • added arrow key support for moving regions -
  • added fractional pixel positions for zoomed images -
  • fixed bug which reset pan when changing colormaps on a zoomed image -
  • added strict mode -
  • update emscripten to 1.8.2 -
- -

Beta Release 11 (December 18, 2013)

-
    -
  • initial port to iPad -
  • removed notifyHelper message when mouse enters image window -
  • fixed tpos crash when converting really large images -
  • updated jquery.contextMenu.js -
- -

Beta Release 10 (December 9, 2013)

-
    -
  • added support for RGB composite display -
  • added support for reading in auxiliary files via auxFiles preference -
  • added support for overlaying FITS image masks -
  • added support so that drag and drop files can be found by local analysis -
  • added analOpts.dataPath to specify where to look for drag and drop files -
  • box regions need to rotate around upper left point to ensure consistency -
  • changed name of fitshelper to js9helper -
  • changed JS9.submitAnalysis() to JS9.SubmitAnalysis() -
  • changed analOpts.datadir to analOpts.dataDir -
  • removed wcs event processing from node and CGI helper (use browser wcs) -
  • js9helper not run as a server from js9Helper.js any more (scales better) -
  • added ability to turn off redraw when creating a large number of regions -
  • fixed bug in panner display for non-square images -
  • added work-around for Google Chrome v31 bug (regions not drawn) -
- -

Beta Release 9 (October 23, 2013)

-
    -
  • added support for client-based WCS using emscripten 1.5.6 -
  • added drag and drop of FITS images (binary tables are coming) -
  • added support for region callbacks (executed when a region changes) -
  • added JS9.Regions() public routine to retrieve and modify selected regions -
  • added Close Image button to File menu -
  • reduced size of panner when created by View menu -
  • updated Kinetic.js to v4.7.2 -
  • minor bug fixes (e.g., annuli strokeWidth not resizing properly) -
- -

Beta Release 8 (September 23, 2013)

-
    -
  • fixed security in node.js support by requiring use of wrapper scripts -
  • added support for CGI-based back-end helpers -
  • implemented automatic discovery of analysis definitions -
  • added timer-based management of WCS update requests -
  • updated socket.io to 0.9.16 -
  • changed routine name from JS9.preloadImages() back to JS9.Preload()! -
- -

Beta Release 7 (August 19, 2013)

-
    -
  • fits2png: added support for "%cookie" in odir specification -
  • js9.js and js9Helper.js both now use js9Prefs.json for setting preferences -
  • fixed bug in display/manipulation of panner when image is zoomed -
  • added "none" as an analysis return type to support hidden analysis -
  • changed routine name JS9.Preload() to JS9.preloadImages() -
  • added clipping to region manipulation -
  • fixed region strokewidth problem when zooming image -
  • fixed magnifier and panner where multiple instances of js9 are present -
  • numerous changes to pass new JSLint rules -
  • updated jquery to 1.10.2 -
  • updated jquery.flot to 0.8.2 -
  • removed references to of jquery-ui in demo files (its not used) -
- -

Beta Release 6 (July 22, 2013)

-
    -
  • added support for panner window, including ability to zoom the panner -
  • added support for magnifier window, including ability to change magnification -
  • implemented zoom menu (zoomIn, zoomOut, zoom1, zoom2, zoom4, zoom8) -
  • added support for all FITS data types (silrd) in js9.js and tpos.c -
  • png file now contains FITS header in json format -
  • NB: the format of the PNG representation file has changed substantially! -
  • raw arrays now implemented as a typed array, using DataView to unpack it -
  • updated Kinetic.js to v4.5.4 (multiple changes required to code) -
- -

Beta Release 5 (May 20, 2013)

-
    -
  • added support for dynamic creation of js9 instances (new or light window) -
  • added support for pre-loading images into a js9 on page load -
  • added support for running analysis web page buttons, forms, etc. -
  • added support for printing the image -
  • added new demo pages -
  • changed js9msg script name to js9 -
  • loading javascript files is "generic" (no version numbers in filenames) -
  • updated Kinetic.js to v4.5.1 -
- -

Beta Release 4 (April 26, 2013)

-
    -
  • added support for polygon regions -
  • added support for fixing (i.e. freezing) regions in place -
  • added support for container regions (constrain position of other regions) -
  • added support for shift key accelerator -
  • fixed multiple bugs in region listOnChange support -
  • updated Kinetic.js to v4.4.3 -
- -

Beta Release 3 (April 2, 2013)

-
    -
  • updated Kinetic.js to v4.4.0 to fix new chrome v26.0.1410.43 (whoah!) -
- -

Beta Release 2 (April 1, 2013)

-
    -
  • added support for executing analysis from console window -
  • added support for messaging to js9 via Node-based js9Msg.js -
  • added ability to specify params to region creation -
  • added server mode and input from stdin to js9Msg.js -
- -

Beta Release 1 (February 27, 2013)

-
    -
  • initial beta release with support for displaying FITS images, scaling, -colormaps, external analysis, regions, wcs -
- -
- - - diff --git a/web/static/js9_old/help/desktop.html b/web/static/js9_old/help/desktop.html deleted file mode 100644 index 8874b83..0000000 --- a/web/static/js9_old/help/desktop.html +++ /dev/null @@ -1,585 +0,0 @@ - - - - - -JS9 on the Desktop - - - -
-

JS9 on the Desktop

- -

-JS9 can be used as a desktop replacement for -SAOimage DS9: you can load images into -the app's configurable web page (or your own custom web page) and use -the full power of JS9, including external messaging. - -

-Advantages of using JS9 on the desktop include: -

    -
  • built using today's web-based technology -
  • fully configurable user interface using standard web pages -
  • support for adding your own browser-based analysis plugins -
  • complete programming interface via a rich public API -
  • external messaging with full access to the public API (Python and shell) -
  • flexibility of having multiple images associated with separate displays -
  • support for image blending -
  • support for image reprojection -
- -

-Advantages of using DS9 include: -

    -
  • the de facto standard astronomical image display for nearly three decades -
  • full access to virtual memory (no memory limits when loading huge files) -
  • support for nearly all WCS systems via the AST library -
  • support for 3D rendering -
  • advanced access to external catalogs and archives -
  • XPA-based messaging integrated with CIAO, ftools, and Python -
  • support for VO/SAMP -
- -

Installing a Pre-built Desktop App

- -Pre-built desktop apps for Linux (for Ubuntu 20.04 and compatible -systems) and Mac (for Catalina 10.15.x) are available on the -main JS9 web site: - -
    -
  • js9app: offers a basic user interface -
  • Voyager: coming soon ... offers an advanced user interface patterned after the Mac -
- -

-For Linux, download and unzip the zip file to create a directory -called <app>-linux-x64 containing a number of files, including a -js9app executable. Put this directory in your Linux PATH (or -use a link to the executable) and run the program. For Mac, download -the zip file and unzip it into your /Applications or ~/Applications -directory to create a Mac application, which you can start by -double-clicking or by using the open command: -

-  # open Mac app, load FITS file and region file, set colormap and scale
-  open /Applications/js9.app --args ~/data/casa.fits --regions ~/data/casa.reg --colormap viridis --scale log
-
- -

-Once the app is started, you can drag and drop a FITS file to display -it (or use the File->open menu option, etc). -The File->export messaging script menu option will bring up a dialog -box to create a script called js9msg that you can use to control the app -externally (see External Communication with JS9 -for details.) - -

Installing Electron.js for a Fully Configurable Desktop App

- -

-The pre-build apps described above are built using -Electron.js, a widely-used -framework for creating native applications with web technologies like -JavaScript, HTML, and CSS. You can easily configure your own JS9 app -(giving you complete control over the display web page, server-side -analysis, etc.) by installing Electron.js. - -

-Install Electron.js by visiting the Electron.js release page: - -https://github.com/electron/electron/releases to download the -latest available stable (not beta) release for your platform. On a -Mac, the Electron.app should be installed in the /Applications or -~/Applications folder. On Linux, the electron program should be placed -in your PATH. Electron.js also is available for Windows, -so desktop JS9 should also run on that OS, although we have not done -any work in this direction. If you get desktop JS9 running under -Windows, please let us know! - -

-Once the Electron.js is installed, you can build JS9 as usual, taking -care to configure use of the Node.js helper. Note that there is no need -to actually install Node.js: desktop JS9 has its helper integrated into -Electron.js already. - -

-If you are not planning to utilize server-side analysis tasks or large -file support, you can even skip the standard build: edit the supplied -js9prefs.js file (for the browser) and a js9Prefs.json file (for the -JS9 helper) to add your preferred JS9 properties, and use the supplied -js9 script to start the desktop. - -

-Note for macOS users: if you plan to use Electron.app with JS9 on a Mac, -consider codesign'ing the Electron.js app: -

-  sudo codesign --force --deep --sign - /Applications/Electron.app/Contents/MacOS/Electron
-
-to avoid repeated requests to allow incoming connections. - -

Running JS9 on the Desktop

- -

-The js9 script is normally made accessible by adding the JS9 install -directory (when fully building JS9) or the source directory (for quick -install) to your user PATH. - -

-Run the js9 script with the -a switch to start the desktop app, display -the default JS9 web page, and load one or more FITS files: -

-  # the -a switch tells the script to bring up the desktop js9 app
-  js9 -a ~/data/casa.fits
-
-  # opts can be passed via json format
-  js9 -a fits/casa.fits '{"scale":"log","scalemin":3,"colormap":"cool"}'
-
-  # opts can be passed via switch format
-  js9 -a fits/casa.fits --scale log --scalemin 3 --colormap cool
-
-  # opts can be passed via mixed format
-  js9 -a fits/casa.fits --colormap cool '{"scale":"log","scalemin":3}'
-
-  # multiple files can have different opts
-  js9 -a fits/casa.fits.gz --colormap heat --scale log fits/casa.fits --colormap cool --ra 350.8667 --dec 58.812
-
-  # load a colormap file, then use the newly loaded colormap for the image
-  # also load a regions file
-  js9 -a cmaps/purple.cmap fits/casa.fits --colormap purplish --regions casa/casa.reg
-
-In the desktop app, all relative paths are relative to current working -directory, as would be expected with files passed to any desktop -program. For consistency, this behavior extends to the case of files -specified in web pages: relative files are still relative to the -current directory, not the web page (as would be the case with browsers). -It is controlled globally by the JS9.globalOpts.currentPath -property and locally by the fixpath property. For example, if -the desktop app loads a webpage, then the default call to JS9.Load(): -
-<a href='javascript:JS9.Load("fits/casa.fits", {scale:"log", colormap: "cool"});'>CAS-A</a>
-
-specifies that the FITS file is relative to the current working directory, -while use of fixpath:false: -
-<a href='javascript:JS9.Load("fits/casa.fits", {scale:"log", colormap: "cool", fixpath:false});'>CAS-A</a>
-
-specifies that the FITS file is relative to the web page. -

-You also can use the ${JS9_INSTALLDIR} and ${JS9_PAGEDIR} "macros" -to specify that the path of the FITS file is relative to the JS9 install -directory or the web page directory, respectively. For example: -

-<a href='javascript:JS9.Load("${JS9_PAGEDIR}/fits/casa.fits", {scale:"log", colormap: "cool"});'>CAS-A</a>
-
-specifies that the FITS file is relative to the web page (just -like fixpath), while: -
-<a href='javascript:JS9.Load("${JS9_INSTALLDIR}/fits/casa.fits", {scale:"log", colormap: "cool"});'>CAS-A</a>
-
-specifies that the FITS file is relative to the JS9 install directory. -

-Note that path specification using fixpath, ${JS9_INSTALLDIR}, or ${JS9_PAGEDIR} applies to the "Load" routines: -

    -
  • JS9.Load() -
  • JS9.LoadCatalog() -
  • JS9.LoadColormap() -
  • JS9.LoadRegions() -
  • JS9.LoadSession() -
- -

-The same js9 script (without the -a switch) can now be used to interact -with the JS9 page (or any other JS9-enabled web page): -

-  # without -a, the script sends commands to the JS9 display
-  js9 SetColormap cool
-  js9 AddRegions 'ICRS;ellipse(23:23:18.76, +58:47:27.252, 31.8", 15.9", 40)'
-
-See: External Messaging for more details. - -

-You can also load remote images, as the script will call LoadProxy as -needed: -

-  js9 -a http://hea-www.cfa.harvard.edu/~eric/coma.fits.gz
-
- -

-A number of desktop-specific switches are available in the js9 script. Perhaps -the most important is the --webpage switch, which allows you to -specify a custom web page to display, so that you can tailor the desktop app -to your specific needs: -

-  js9 -a --webpage ~/myjs9/myjs9.html ~/data/casa.fits
-
-When configuring your own web page, one simple possibility is to create a -separate directory, parallel to the JS9 source (or install) directory, -in which you can maintain your custom web page(s) and your customized -js9prefs.js file. You might also create a myjs9 script that runs the -js9 script. For example, this myjs9.html file might be stored in a myjs9 -directory parallel to the js9 directory: -
-  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
-     "http://www.w3.org/TR/html4/loose.dtd">
-  <html>
-  <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1" > 
-    <meta name="viewport" content="width=device-width, initial-scale=1">
-    <link type="image/x-icon" rel="shortcut icon" href="../js9/favicon.ico">
-    <link type="text/css" rel="stylesheet" href="../js9/js9support.css">
-    <link type="text/css" rel="stylesheet" href="../js9/js9.css">
-    <script type="text/javascript" src="js9prefs.js"></script>
-    <script type="text/javascript" src="../js9/js9support.min.js"></script>
-    <script type="text/javascript" src="../js9/js9.min.js"></script>
-    <script type="text/javascript" src="../js9/js9plugins.js"></script>
-    <title>my JS9 app</title>
-  </head>
-  <body>
-      <div class="JS9Menubar" data-width="100%"></div>
-      <p style="margin-top: -14px;">
-      <table cellspacing="0" style="width:100%;">
-      <tr valign="top">
-      <td align="left">
-      <div class="JS9" data-width="768px" data-height="768px"></div>
-      <div style="margin-top: 2px;">
-      <div class="JS9Colorbar" data-width="768px" id="JS9Colorbar" data-showTicks="false" data-height="10px"></div>
-      </div>
-      </td>
-      <td align="right">
-      <table cellspacing="0">
-      <tr valign="top">
-      <td>
-      <div class="JS9Magnifier" data-width="250px" data-height="250px"></div>
-      </td>
-      </tr>   
-      <tr valign="top">
-      <td>
-      <div class="JS9Panner" data-width="250px" data-height="250px"></div>
-      </td>
-      </tr>   
-      <tr valign="top">
-      <td>
-      <div class="JS9Info" data-height="250px" style="margin-top: 2px;"></div>
-      </td>
-      </tr>   
-      </table>    
-      </td>
-      </tr>
-      </table>
-  </body>
-  </html>
-
-Note that the JavaScript and CSS files are loaded from the js9 -source (or install) directory, but the js9prefs.js is loaded from the -myjs9 directory. This separation allows you to configure site-wide js9 -parameters without changing the any of the files in the source -directory, and allows you to update the source directory very easily -by executing "git pull". - -

-A script such as the following can then be used to use this web page -in the JS9 desktop: -

-  #!/bin/bash
-
-  WEBPAGE="$HOME/myjs9/myjs9.html";
-
-  WIDTH=1130;
-  HEIGHT=860;
-
-  if [ x${JS9_WEBPAGE} != x ]; then
-    WEBPAGE=${JS9_WEBPAGE}
-  fi
-
-  if [ x${JS9_WEBPAGE_WIDTH} != x ]; then
-    WIDTH=${JS9_WEBPAGE_WIDTH}
-  fi
-
-  if [ x${JS9_WEBPAGE_HEIGHT} != x ]; then
-    HEIGHT=${JS9_WEBPAGE_HEIGHT}
-  fi
-
-  exec $HOME/js9/js9 -a --width $WIDTH --height $HEIGHT --webpage $WEBPAGE $*
-
-As shown above, the --width and --height switches are available -to set the width and height of the Electron.js window which will contain the -web page. - -

-Another important switch is --title (and its generalized -cousin, --renameid). This switch will rename the main JS9 -display id in the web page (whose default is "JS9") to the specified -id. It is useful in cases where you want to start up multiple desktops -using the same web page, and communicate with each one separately. In -such cases, the --title switch will change the id of the JS9 -display element and its auxiliary elements (e.g. menubar, colorbar, -etc) to the specified title: -

-  js9 -a --title foo1 ~/data/casa.fits
-
-You will then be able to communicate with this web page using the specified id: -
-  js9 --id foo1 GetColormap
-  {"colormap":"heat","contrast":1,"bias":0.5}
-
-The --renameid switch allows you to specify multiple JS9 -displays to rename, in cases where more than one JS9 display is part of a -web page: -
-  js9 -a --renameid "JS9:foo1,myJS9:foo2" ~/data/casa.fits
-
-will rename the default "JS9" element to "foo1" and the "myJS9" -element to "foo2". - -

-The --savedir switch will set the directory into which files -are saved, avoiding the display of an interactive dialog box when -saving images: -

-  js9 -a --savedir /Users/eric/Desktop ~/data/casa.fits
-  ...
-  js9 --id foo1 SavePNG casa.png
-
-will save the casa.png file on the desktop without a dialog box. This is -especially useful in automatic scripting. - -

-You can use the --cmds [cmds] and/or --cmdfile [file] switches -to pass Javascript commands that will be executed when JS9 is ready -and all files have been loaded. The former takes a string of commands -as an argument: -

-  # load a file and set the colormap and scale
-  js9 -a --cmds 'JS9.SetColormap("cool");JS9.SetScale("log")' ~/data/casa.fits
-
-The latter takes a file containing commands, allowing you to perform -more sophisticated processing. For example, the following script -will load the Chandra image of the Kes 75 supernova remnant, display -three energy cuts as separate images, assign red, green, and blue -colormaps to the three energy cuts, and then blend them into a single display: -
-  # run the script in the command file 
-  js9 -a --cmdfile eband.js
-
-  // where eband.js contains the following Javascript:
-  JS9.Load("kes75/kes75_evt2.fits.gz", {onload: function(im){
-      var i;
-      // colormaps
-      var c = ["red", "green", "blue"];
-      // energy filters
-      var f = ["energy=500:1500", "energy=1500:2500", "energy=2500:8000"];
-      // set final configuration after each image is loaded
-      var mkdo = function(i){
-  	return function(xim){
-  	    JS9.SetScale("log",   {display: xim});
-  	    if( c[i] ){ JS9.SetColormap(c[i], {display: xim}); }
-  	};
-      };
-      // turn blending off on the main image
-      JS9.BlendImage(false);
-      // process each of the event filters to make a separate image
-      for(i=0; i<f.length; i++){
-  	// display filtered image in a separate displayed
-  	JS9.DisplaySection({filter:f[i], separate:true,
-  			    ondisplaysection: mkdo(i)}, {display: im});
-      }
-      //  blend the filtered images
-      JS9.BlendDisplay(true);
-  }});
-
-

-The --merge switch allows you to utilize another user's setup, -including their JS9 web page and analysis routines. Say, for example, -a colleague has used Dropbox to share her JS9-enabled zhjs9 directory, -containing the following files and sub-directories: -

-  zhjs9.html js9prefs.js js9addons.js
-
-  analysis-plugins:
-  zhtools.json
-
-  analysis-wrappers:
-  zhjs9
-
-  params:
-  adapt.html	imexam.html	mexhat.html
-  atrous.html	imsmo.html	refinepos.html
-
-where zhjs9.html has a header in which the paths to JS9's files are matched to -your colleague's setup, but not your own: -
-  <head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1" > 
-  <meta name="viewport" content="width=device-width, initial-scale=1">
-  <link type="image/x-icon" rel="shortcut icon" href="../../js9/favicon.ico">
-  <link type="text/css" rel="stylesheet" href="../../js9/js9support.css">
-  <link type="text/css" rel="stylesheet" href="../../js9/js9.css">
-  <link rel="apple-touch-icon" href="../../js9/images/js9-apple-touch-icon.png">
-  <script type="text/javascript" src="js9prefs.js"></script>
-  <script type="text/javascript" src="../../js9/js9support.min.js"></script>
-  <script type="text/javascript" src="../../js9/js9.js"></script>
-  <script type="text/javascript" src="../../js9/js9plugins.js"></script>
-  <script type="text/javascript" src="js9addons.js"></script>
-  </head>
-
-Also note the presence of analysis tool definitions and scripts in the -analysis-plugins, analysis-wrappers, and params sub-directories. Normally, -in order to use the zhjs9 web page and associated analysis tools, you -would need to edit the former and change the JS9 paths, and move the -contents of the three analysis tools sub-directories into the appropriate -sub-directories in the main JS9 install directory. - -

-Instead, you can simply merge this directory into your desktop app, e.g. -

-  js9 -a --merge ~/Dropbox/zhjs9/zhjs9.html
-
-This will generate and load a temporary webpage using correct paths to -the JS9 install directory and load the analysis tools into the JS9 -helper. You can also merge the analysis tools without loading the web -page by specifying only the directory: -
-  js9 -a --merge ~/Dropbox/zhjs9
-
-In addition, if a bin directory is present, it will be added to the PATH -used when processing analysis commands. - -

-A merged web page can, of course, include its own javascript and css -files, as shown in the example above. It can also -include JS9.Load() commands, for example, to load files from a -subdirectory. In this case, you should set the fixpath property -to false so that the paths of the data files are not changed -into paths relative to the current working directory (which is the -default behavior for desktop JS9.Load() calls): -

-<a href='javascript:JS9.Load("fits/casa.fits", {scale:"log", colormap: "cool", fixpath:false});'>CAS-A</a>
-
- -

-Finally, the --hostfs switch (NB: was --node prior to v3.1) -allows you to access the host file system in a local (only, not remote) -web page environment. By default, this feature is turned off because -it requires turning off the Electron's - -Context Isolation security feature, providing a greater attack -surface for hackers. But since this host access is permitted only for -local web pages, an attacker would have to be on your system ... so -you're probably in big trouble anyway. - -

-That said, there are two good reasons for turning on host file system access: -

    -
  • to enable direct access to data files in the local file system -
  • to run scripts that require access to system resources -
- -

-When access to the host file system is enabled, the JS9 app will -(subject to the boolean value of the JS9.globalOpts.localAccess -property) mount the local file system inside the web page and access -FITS files directly, instead of fetching and storing them in browser -memory. This can speed up the load/display time considerably, while -minimizing the use of a browser memory. The list of file extensions -which are accessed directly in this way is specified by the -JS9.globalOpts.localTemplates property, which defaults -to .fits and .fts. Note that bzip'ed (.bz2) and gzip'ed -(.gz) files are not accessed directly: the former are not supported by -the CFITSIO FITS access library, while the latter are supported by -uncompressing the file in memory, which is done more efficiently by -JS9 itself. Also, symbolic links currently are not accessed directly. -We expect to remove this restriction in the near future. - -

-You can also run scripts that access local system resources. For -example, the following script will load the Chandra image of the Kes -75 supernova remnant, display three energy cuts as separate images, -find the total number of counts in each image, and write the results -to a log file, using the Node.js 'fs' module. -

-  # enable host file system support and run the script in the command file 
-  js9 -a --hostfs true --cmdfile ecnts.js
-
-  // where ecnts.js contains the following Javascript:
-  var fs;
-  try{
-      fs = require("fs");
-  }
-  catch(e){
-      JS9.error("Node.js 'fs' module is unavailable. Did you enable hostfs?");
-  }
-  JS9.Load("kes75/kes75_evt2.fits.gz", {onload: function(im){
-      let i;
-      let s = "";
-      let got = 0;
-      // energy filters
-      const f = ["energy=500:1500", "energy=1500:2500", "energy=2500:8000"];
-      // get counts in regions as each image is displayed
-      const getcnts = function(i){
-    	return function(xim){
-  	    s += xim.countsInRegions();
-  	    got++;
-  	    if( got === 3 ){
-                // write the results to a log file
-  		fs.writeFile("countsInRegions.log", s, function(err) {
-		    if( err ) { JS9.error(err); }
-  		}); 
-  	    }
-    	};
-      };
-      // process each of the event filters to make a separate image
-      for(i=0; i<f.length; i++){
-    	// display filtered image in a separate displayed
-    	JS9.DisplaySection({filter:f[i], separate:true,
-    			    ondisplaysection: getcnts(i)}, {display: im});
-      }
-  }});
-
- -

-For a list of all js9 script switches, use the --help switch: -

-  js9 --help
-
- -

-The JS9 File menu contains two options only available for Desktop use: -

    -
  • print window ... print the entire Electron.js window -
  • save window to pdf save the entire Electron.js windows to a PDF file -called js9.pdf in the current directory -
-The print command always brings up a dialog box. The save command will save the -window as a PDF in the current directory, without bringing up a dialog box. - -

Security Notes

- -

-It is important to note that Electron.js is not a web -browser, and web pages you load are not sandboxed. Our JS9 desktop -application code takes additional precautions to enhance security: -

    -
  • http protocol is disabled for remote pages -
  • Javascript eval is disabled in web pages -
  • the ability to click a link to navigate to a new web page is disabled -
  • the ability to click a link to display to a new web page in a different tab or window is enabled, but the new web page is displayed in your default browser -
  • context isolation is turned on, unless host file system support is explicitly enabled (--hostfs) -
- -

-Even with these safeguards in place, it is important that you load -only local or trusted remote web pages into the JS9 desktop app. -See: -Electron.js security for more information. - -

-You should update your copy of Electron.js periodically to ensure that you -have the latest security fixes in place. - -

Last updated: October 30, 2020
-
- - - diff --git a/web/static/js9_old/help/extmsg.html b/web/static/js9_old/help/extmsg.html deleted file mode 100644 index e5af3b9..0000000 --- a/web/static/js9_old/help/extmsg.html +++ /dev/null @@ -1,363 +0,0 @@ - - - - - -External Communication with JS9 - - - -
-

External Communication with JS9

- -

-External communication with a JS9 display is supported by the js9 -script, which is supplied with the JS9 source code. Alternatively, -if you have installed a pre-built JS9 app (js9app or Voyager), -you can export a messaging script using the -File->export messaging script menu option. The script will be called -js9msg for js9app and vger for Voyager. -Note that it is not strictly necessary to install Node.js or -Electron.js to send external messages: the js9 script utilizes wget -or curl under the hood. - -

-To display the js9 script options, type: -

-  sh> js9 --help
-
- -

-The js9 script supports two types of syntax: -

    -
  • console: a lightweight set of commands from the JS9 Console plugin -
  • public api: all of the routines available in the -JS9 Public API -
- -

-The console syntax offers a restricted set of commands suitable for quick -interactive use. Results are returned as simple strings: -

-  sh> js9 cmap heat        # change colormap to heat
-  OK
-  sh> js9 cmap             # return the current colormap
-  heat
-
-The console commands include: -
-  analysis	list/run analysis for current image (run)
-  colormap	set/get colormap for current image (cmap)
-  colormaps	get list of available colormaps (cmaps)
-  global	set/get a JS9.globalOpts parameter
-  grid		set/get coordinate grid for current image
-  help		get list of available commands
-  helper	set/get helper connection
-  image		get name of current image or display specified image
-  images	get list of currently loaded images
-  load		load image(s)
-  pan		set/get pan location for current image
-  pix2wcs	get image pixel value for specified wcs position
-  print		print image window
-  refresh	refresh image using specified file (def: use last file)
-  regcnts	counts in regions for current image
-  regions	add or list region(s) (reg, region)
-  resize	set/get display size for current image
-  scale		set/get scaling for current image
-  scales	get list of available scales
-  section	display section of current image
-  status	get status for specified (or current) image
-  url		display a url
-  wcssys	set/get wcs system for current image
-  wcsu		set/get wcs units used for current image
-  wcssystems	get list of available wcs systems
-  wcsunits	get list of available wcs units
-  wcs2pix	get wcs position for specified image pixel
-  zoom		set/get zoom for current image
-
- -

-The JS9 Public API syntax offers the full -power of the public API. It passes and returns JSON-formatted strings -with a richer set of options than is available via the console syntax: -

-  # add a red circle region
-  sh> js9 AddRegions circle '{"color":"red", "tags": "foo"}'
-  # change color of all regions to violet and change the tags too
-  sh> js9 ChangeRegions all '{"color":"violet","tags":"goo"}'
-  # change color of selected regions to violet and change the tags too
-  sh> js9 ChangeRegions selected '{"color":"violet","tags":"goo"}'
-  # change color of red regions to violet
-  sh> js9 ChangeRegions red '{"color":"violet"}'
-  # change color of regions with "source" tag to violet
-  sh> js9 ChangeRegions source '{"color":"violet"}'
-  # get colormap
-  sh> js9 GetColormap
-  {"colormap":"grey","contrast":"3","bias":"0.8"}
-  # set colormap
-  sh> js9 SetColormap viridis 1 0.5
-  # get scale parameters
-  sh> js9 GetScale 
-  {"scale":"log","scalemin":0,"scalemax":51}
-  # set scale in a different display
-  sh> js9 SetScale linear '{"display":"myJS9"}'
-
-Passed arguments are the same as the public API arguments, -except that objects are passed as JSON strings. Returned objects -are also in JSON format. Note in the last example above that the -display object argument of the public API calls is supported. -See JS9 Public API for more information. - -

-An example of the use of the public API is given in the shell script -below, where we load the Chandra image of the Kes 75 supernova -remnant, display three energy cuts as separate images, assign red, -green, and blue colormaps to the three energy cuts, and then blend -them into a single display: -

-  #!/bin/bash
-  # Chandra event file of the Kes75 SNR
-  file="kes75/kes75_evt2.fits.gz"
-
-  # some Chandra energy filters
-  filter[1]="energy=500:1500"
-  filter[2]="energy=1500:2500"
-  filter[3]="energy=2500:8000"
-
-  # RGB colormaps
-  cmap[1]="red"
-  cmap[2]="green"
-  cmap[3]="blue"
-
-  # load event file
-  echo "loading event file: $file"
-  js9load $file
-  # turn blending off (since default is on)
-  js9 BlendImage false
-
-  # process each of the event filters
-  for i in {1..3}; do
-    echo "filter: ${filter[$i]}"
-    # generate section using event filter into a separately displayed image
-    js9 DisplaySection '{"filter":"'${filter[$i]}'","separate":true}'
-    # this actually takes a bit of time
-    sleep 4
-    j=`expr $i + 1`
-    # the new file with have a <n> string appended to the original id
-    id="kes75_evt2.fits.gz[EVENTS]<$j>"
-    # set image scale and assign one of the RGB colormaps
-    js9 SetScale "log"            '{"display":"'$id'"}'
-    js9 SetColormap "${cmap[$i]}" '{"display":"'$id'"}'
-  done
-
-  # blend all the images
-  js9 BlendDisplay true
-  echo "all done!"
-
-Note the use of the js9load script to load an image. This -auxiliary script uses the Load and GetLoadStatus API -calls to load an image and wait for completion before returning. -The default wait time is 10 seconds, but is configurable on -the command line. - -

-The rules governing whether a js9 script can talk to a JS9 instance -are determined by the globalOpts.remoteMsgs property supplied to the -back-end helper at start-up. The options are: -

    -
  • < 0: no external communication is allowed -
  • ≥ 0: localhost can send to localhost -
  • ≥ 1: and same host can send to same host -
  • ≥ 2: and localhost can send to any host -
  • ≥ 3: and any host can send to any host -
-The default is 1: a message from a given host can be sent to instances started -on that same host. - -

-If a JS9 instance is connected to a helper on a remote host, you can -use the --host or --helper switch to specify the remote -host to contact. For example, if the helper is running on -js9.cfa.harvard.edu, you can send a command to your instance of JS9 -this way: -

-  sh> js9 --host https://js9.si.edu:443 region circle
-  OK
-
-(Note that the main JS9 web site uses a reverse proxy to communicate -with an internal-facing JS9 helper. You send a message to the main web -server port 443, and it is relayed to the helper listening internally -on port 2718.) -

-If more than one instance of JS9 appears on a single web page, the ---id switch can differentiate between instances. The value of -the id switch is the div id for that JS9 instance. For example, if -two instances of JS9 having div ids of "JS9" and "myJS9" are defined -on the same page, then js9 can communicate with the latter in this way: -

-  sh> js9 --id myJS9 region circle
-  OK
-  sh> js9 --id myJS9 region 
-  ICRS; circle(23:23:26.929, +58:48:50.381, 14.76")
-
-or, from the readline loop: -
-  sh> js9 --id myJS9
-  JS9> region circle(23:23:26.929, +58:48:50.381, 14.76")
-  OK
-  JS9> region
-  ICRS; circle(23:23:26.929, +58:48:50.381, 14.76")
-
-

-Putting the last two techniques together, you can talk to one of many JS9 -instances on a page connected to a remote helper this way: -

-  sh> js9 --host https://js9.si.edu:443 --id myJS9 cmap heat
-  OK
-
- -

-NB: The following options are available with the canonical js9 script, -but not with the script that is exported from a pre-built JS9 app using -the File->export messaging script menu option. These options -require you to have installed the Node.js or Electron.js, since they call -js9Msg.js under the hood. - -

-If the -p or --pipe switch is supplied, the script will read -commands from stdin. You can send multiple commands to the script's -standard input (comments and blank lines are ignored): -

-  sh> cat test.cmds
-  # colormap
-  cmap heat
-  # scale
-  scale log
-  # regions using image coords
-  region circle {"x":588, "y":590, "radius":30, "tags":"source"}
-  region circle {"x":390, "y":430, "radius":50, "tags":"background"}
-  sh> cat test.cmds | js9 -
-
-

-DS9/Funtools region syntax can also be used for regions: -

-  sh> cat test2.cmds
-  cmap heat
-  scale log
-  wcssys fk5
-  region box(23:23:35.236,+58:50:00.95,39.352",20.1679",24.0163)
-  region ellipse(23:23:33.323,+58:47:41.50,29.6394",11.0139",25.7599)
-  region polygon(23:23:19.379,+58:49:30.02,23:23:17.270,+58:49:40.93,23:23:14.834,+58:49:38.59,23:23:17.974,+58:49:13.64) {"tags": "background"}
-  sh> cat test2.cmds | js9 -
-
- -

-The -p or --pipe switch also allows you to specify a -string on the JS9 command line that will prefix all lines read from -stdin. This allows you to send a regions file to JS9: -

-  sh> cat ds9.reg
-  # Region file format: DS9 version 4.1
-  global color=green dashlist=8 3 width=1 font="helvetica 10 normal roman" select=1 highlite=1 dash=0 fixed=0 edit=1 move=1 delete=1 include=1 source=1
-  fk5
-  box(23:23:35.236,+58:50:00.95,39.352",20.1679",24.0163)
-  ellipse(23:23:33.323,+58:47:41.50,29.6394",11.0139",25.7599)
-  polygon(23:23:19.379,+58:49:30.02,23:23:17.270,+58:49:40.93,23:23:14.834,+58:49:38.59,23:23:17.974,+58:49:13.64) # background
-  sh> cat ds9.reg | js9 - region
-
-Without the - ("dash") argument, standard input will not be read and -the "region" command will be executed to return current regions. - -

-Ordinarily, the js9 script talks to a displayed JS9 web page. It also can be -used to start the JS9 Desktop app and load an image into the app's web page. -The JS9 Desktop app simply requires that you install Electron.js, which is -available here: -

-  https://www.electronjs.org/
-
-Once this is done, use the -a switch to specify the app startup and -the -w or --webpage switch to specify a web page (default is a -nice, basic JS9 web page). -
-  sh> js9 -a ~/data/casa.fits
-
-will start the JS9 Desktop app with a basic JS9 web page and load the -Cas-A FITS files into the page, while: -
-  sh> js9 -a --webpage ~/js9/js9basics.html ~/data/casa.fits
-
-will display the same image in one of the JS9 demo pages. -For more details, see: Desktop JS9. - -

-The js9 script also can be used to start up a new browser, display a -JS9 web page, and then load an image into that page. To do this, use -the -b or --browser switch to specify the browser (chrome, -safari, or firefox) and the -w or --webpage switch to specify a -web page (default is a basic JS9 web page). For example: -

-  sh> js9 -b chrome ~/data/casa.fits
-
-will start a Chrome browser with a basic JS9 web page and load the -Cas-A FITS files into the page, while: -
-  sh> js9 -b firefox -w ~/js9/js9basics.html ~/data/casa.fits
-
-will use Firefox to display the same image in one of the JS9 demo pages. - -

-Instead of supplying the browser name each time on the command line, you -can set the environment variable JS9_BROWSER and just use the --b switch with no argument. (Note that you still must supply the -b -switch, which tells the script to start a browser.) Similarly, the default -web page can be configured using the JS9_WEBPAGE environment variable: -

-  sh> export JS9_BROWSER=chrome
-  sh> export JS9_WEBPAGE=$HOME/js9/js9basics.html
-  sh> js9 -b ~/data/casa.fits
-
- -

-Care must be taken that no JS9 web page is already being displayed when the --b or --browser switch is utilized, or else the specified image -will be loaded into the existing web page (and no new browser will be started). -Also, it is important to note that the Google Chrome browser must be -started by the js9 script or it must be started by you using the ---allow-file-access-from-files switch. Without this switch, -Chrome will not permit a local HTML file to read other files. Finally, -Mac OSX Safari occasionally experiences delayed data transfers when -the js9 messaging script is located in a different Space (desktop) -from the browser window, so keep these in the same Space. - -

-If you do not have access to the js9 script, you can still send -messages to a JS9 web page using wget or curl. This is possible -because the JS9 helper also listens for HTTP connections. The syntax -for HTTP-based commands is analogous to the scripting syntax, if -somewhat more primitive: you pass a JSON-formatted string to the -helper in a GET or POST request, as show below. -

-  export MYHOST="https://js9.si.edu:443"
-  export ID="JS9"
-  export WARGS="-q -O-"
-  # GET request, using public api:
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "GetColormap"}'
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "SetColormap", "args": ["red"]}'
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "RunAnalysis", "args": ["counts"]}'
-  # GET request, using command line api:
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "zoom"}'
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "zoom", "args": [2]}'
-  wget $WARGS $MYHOST'/msg?{"id": "'$ID'", "cmd": "analysis", "args": ["counts"]}'
-  # POST request, using public api:
-  wget $WARGS --post-data='{"id": "'$ID'", "cmd": "GetColormap"}' $MYHOST/msg
-  wget $WARGS --post-data='{"id": "'$ID'", "cmd": "SetColormap", "args": ["red"]}' $MYHOST/msg
-  wget $WARGS --post-data='{"id": "'$ID'", "cmd": "RunAnalysis", "args": ["counts"]}' $MYHOST/msg
-
- -
Last updated: September 2, 2021
-
- - - diff --git a/web/static/js9_old/help/helper.html b/web/static/js9_old/help/helper.html deleted file mode 100644 index 08e1a1b..0000000 --- a/web/static/js9_old/help/helper.html +++ /dev/null @@ -1,319 +0,0 @@ - - - - - -Adding a JS9 Server-side Helper - - - -
-

Adding a JS9 Server-side Helper

- -

Do You Need a Server-side Helper? Which One?

- -

-JS9 supports server-side analysis on FITS data, allowing you to -execute virtually any command-line analysis program from JS9, run that -analysis command on the server, and view results on your web page. It -also can support external communication with JS9 (via the shell and -Python) and handle the display of large files. - -

-The server-side analysis capability is useful for archive centers and -individual users who want to integrate their own data analysis -programs into JS9. You configure a JS9 server-side helper by adding -additional switches to the configure command described in -Installing JS9. - -

-JS9 supports two mechanisms for server-side analysis: you can run a -separate Node.js-based server to process requests -using socket.io, or use CGI calls to your own web server. The -Node.js server-side helper is the recommended method: it is faster and -more flexible than the CGI helper: in addition to analysis tasks, -Node-js-based helper also supports: -

- -

Add Switches to Configure the Server-side Helper

-

-JS9 is built using the standard GNU ./configure; make; make -install method. To configure server-side analysis, you -add switches to the configure command line. The most important switches are: -

---with-helper=[type]    type of helper: nodejs (for Node.js) , get (for CGI)
---prefix=[path]         location to install the non-web programs and scripts
---with-cfitsio=[path]   cfitsio location for building js9helper, e.g., /usr/local
-
-Other less-used switches are: -
---with-cgidir=[path]     cgi install directory e.g., /var/www/public_html/cgi-bin
---with-cgiurl=[url]      cgi url relative to the web root, e.g.. ./cgi-bin/js9
---with-cgixpath=[dirs]   directories to add to cgi path
-
- -

-Both the Node.js and CGI helpers make use of a C program called -js9helper to handle certain types of JS9 requests. To support -extraction of FITS representation files from large FITS files, -js9helper must be linked against the cfitsio library (version 3.39 or -later is preferred). Cfitsio is the de facto standard FITS library -and is available from NASA/HEASARC at the Goddard Space Flight Center: -

-    https://heasarc.gsfc.nasa.gov/fitsio/fitsio.html
-
-To tell configure where cfitsio libraries are located, use the ---with-cfitsio=[dir] switch, e.g., --with-cfitsio=/usr/local will find -the cfitsio libraries in /usr/local/lib and include files in -/usr/local/include. If cfitsio is not used in the build, the js9helper will -still support server-side analysis, but will not support representation files. - -

-Note that the non-web files, programs, and scripts (e.g., js9helper) -will be installed in accordance with the standard GNU ---prefix=[dir] switch. The default is /usr/local. - -

-Example configure commands are shown below for a typical Linux Apache setup -(using CGI) and for a personal Mac setup (using Node.js): -

-  linux-cgi)
-  ./configure 	--prefix=/soft/saord					\
-		--with-helper=get					\
-		--with-webdir=/var/www/htdocs/js9			\
-		--with-cgidir=/var/www/cgi-bin/js9			\
-		--with-cgiurl=./cgi-bin/js9				\
-		--with-cgixpath=/soft/saord/bin				\
-		--with-cfitsio=/soft/saord				\
-  		CC=gcc $*
-
-  mac-nodejs)
-  ./configure 	--prefix=$HOME						\
-		--with-helper=nodejs					\
-		--with-webdir=/Users/me/Sites/js9			\
-		--with-cfitsio=/Users/me/soft				\
-		CC=gcc $*
-
-
-In these examples, the JS9 web files (JavaScript, CSS etc.) will be -installed in a js9 sub-directory of htdocs in the /var/www directory -or in the Mac user's personal Sites directory. JS9 CGI files will be -installed in a subdirectory of the cgi-bin directory. C programs and -shell scripts will be installed in sub-directories of the user's home -directory or the system-wide /soft/saord directory. - -

Build the JS9 System

-

Once the configure arguments are set up, you run configure, etc. -as described in the basic install instructions at: -Installing JS9. -

-Some additional notes on getting the server-side helpers working are -added below. - -

Adding Analysis Tasks

-

-When configuring server-side analysis, you add server-side analysis tasks -to JS9 (or change the default analysis tasks) by adding or modifying -json files in the analysis-plugins directory (and optionally, -by adding wrapper files to the analysis-wrappers directory.) -See Server-based Tasks for a description of -how to configure server-side analysis tasks for your site. - -

Notes on Installing the Node.js-based Server-side Helper

-

-The Node.js server-side helper is noticeably faster than CGI. It also -offers more power and flexibility, e.g., the node server supports -external control of the browser from the command line via the -js9 script and it's underlying js9Msg facility -(see External Messaging with JS9 for more -information). However, use of the Node.js helper requires that you -open another internet port to the outside world or configure your web -server to proxy all server-side helper communication to a -non-public-facing Node.js server. - - -Node is available at: -

-    https://nodejs.org/
-
-Please install the most up-to-date version of Node.js available. Once -installed, you must start the server-side JS9 helper from the JS9 web -install directory, i.e. the location where you installed (among other -things) js9.js and the node_modules directory: -
-    # in the bash shell:
-    node js9Helper.js 1>~/logs/js9node.log 2>&1 &
-    # or, in the tcsh shell:
-    node js9Helper.js >& ~/logs/js9node.log &
-
-Unlike CGI, Node can be run as any user: it does not have to be run as -the http daemon user. It certainly should not be run as root! We run -it as a non-privileged user with sufficient permissions to run -analysis programs. In any case, it should be run with its Unix PATH -set to include the directory containing the JS9 helper program, as -well as any analysis programs that will be executed by the JS9 -server-side helper when requested by the client. The PATH also should -include the directories housing standard Unix tools such as awk, sed, -grep, and echo. - -

-Communication between the JS9 helper and the browser (or desktop) -utilizes the socket.io protocol and library -(see socket.io for -more information). - -

-For security reasons, the log file should be created outside the web -server directory structure. - -

-Clients will automatically connect to the Node.js-based JS9 helper -when an image is loaded into JS9. The server-side helper listens on a -port specified in the js9Prefs.json file by -the globalOpts.helperPort value. The default is 2718, but you -can change this to any open port. - -

-For example, some institutions do not allow non-standard ports to be -open on public-facing hosts. In such a case, the Node.js-based helper -can change its port to a standard port allowed by that institution -(e.g., 8080 or 8000). This can be done by simply changing -the helperPort property in js9prefs.js (for the client) and -js9Prefs.json (for the helper). - -

Installing in a Secure Environment

- -

-If you are running in a secure environment (i.e. your web pages use -https protocol instead of http), then node server also -must be run securely. This is because modern browsers block "active -mixed content". To run the Node.js helper using https protocol -instead of http, create a js9Secure.json file containing path names to -your private key, certificate, and certificate authority files: -

-  {
-      "key":  "/path/to/private.key",
-      "cert": "/path/to/server.certificate",
-      "ca":   "/path/to//certifcate.authority"
-  }
-
-This file will reside in the directory in which the Node.js helper is started. -

-It is imperative that you keep your private key file secure! If -this key is accessed by unauthorized parties, they can masquerade as -your site. The standard recommendation is to change files permission so -that only the Node.js user can read it: -

-   chmod 400 private.key
-
-and keep that user's password safe! - -

Setting up a Web Proxy for the Node.js-based Helper

- -Instead of opening the JS9 helper port on a public-facing server, you can -set up your web server as a reverse proxy to pass requests to a helper -running on a non-public host. Reverse proxy is a standard web server -technique, and is used on the main JS9 web site. - -

-Documentation concerning setting up a proxy for the helper's -underlying socket.io -library can be found in the - -behind a reverse proxy page. Additional information can be found in these -(slightly out of date) - -socket.io issue and -stackoverflow pages. - -

-A variation of the following httpd.conf (or ssl.conf for https) -configuration should work on Apache web servers: - -

-  # js9 client connects to main server => rewrites to js9 helper on 2718
-  # NB: helper does not use ssl (ssl-based proxy doesn't work, afaik)
-  RewriteEngine    on
-
-  # new style:
-  # https://socket.io/docs/v4/reverse-proxy/
-  RewriteCond      %{HTTP:Upgrade}    websocket                 [NC]
-  RewriteCond      %{HTTP:Connection} upgrade                   [NC]
-  RewriteRule      ^/?(.*)            ws://localhost:2718/$1    [P]
-
-  # old style:
-  # https://stackoverflow.com/questions/36472920/apache-proxy-configuration-for-socket-io-project-not-in-root
-  # RewriteCond    %{REQUEST_URI}     ^/socket.io               [NC]
-  # RewriteCond    %{QUERY_STRING}    transport=websocket       [NC]
-  # RewriteRule    ^/?(.*)            ws://localhost:2718/$1    [P]
-
-  ProxyPass        /socket.io         http://localhost:2718/socket.io
-  ProxyPassReverse /socket.io         http://localhost:2718/socket.io
-
-  # required to handle js9msg requests to the helper's httpd support:
-  RewriteCond      %{REQUEST_URI}     ^/msg                     [NC]
-  RewriteRule      ^/?(.*)            http://localhost:2718/$1  [P]
-
-The optional ProxyPass of msg allows you to send commands using wget -or curl to the helper. - -

-When configuring a proxy, set the "helperPort" in js9prefs.js to 80 or -443 (or whatever port your web server listens on) so that the browser -connects to the helper via the public-facing web server. Continue to -set the "helperPort" in js9Prefs.json to 2718 (or whatever port you -choose), so that the helper listens on its own port. This is a special -situation where the ports will be different for the client and the helper. - -

Notes on the CGI-based Server-side helper

- -

-If you want to utilize a CGI-based -helper, you must specify the --with-cgidir -and --with-cgiurl switches on the configure command -line. Optionally, you also can specify the ---with-cgixpath switch if you want to add directories to the CGI path: - -

    -
  • The --with-cgidir switch specifies the directory into which to -install the js9Helper.cgi wrapper script. That script is generated by -the build. All CGI requests are processed through this js9Helper.cgi wrapper. - -
  • The --with-cgiurl switch specifies the URL of the -js9Helper.cgi script relative to your web document root. The -value of this switch is combined with the CGI wrapper filename and the -result stored in the js9Prefs.json file, telling JS9 how to call the -CGI helper script. - -
  • The --with-cgxpath switch specifies a semi-colon delimited -list of directories to add to the CGI path. You can use this switch to -make accessible the executables that will be used in your CGI -processing. Of course, setting up the CGI path also can be done in -many ways, e.g., inside your analysis wrapper scripts or even in the -web server itself. -
- -

-After the build is complete, the globalOpts.helperType variable -in the js9Prefs.json file should have a value of "get" and JS9 -will send messages via the specified CGI command, utilizing the -js9Helper.cgi script. - -

-Of course, you must now ensure that your web server can run the -js9Helper.cgi script successfully to execute JS9 CGI commands. Normal -web debugging techniques come into play here: check the CGI section of -your web server's configuration file and review the web access and -error logs. If you continue to have problems, please let us know and -we will try to help. - -

Last updated: July 13, 2021
-
- - - diff --git a/web/static/js9_old/help/install.html b/web/static/js9_old/help/install.html deleted file mode 100644 index 8e2d783..0000000 --- a/web/static/js9_old/help/install.html +++ /dev/null @@ -1,389 +0,0 @@ - - - - - -Installing JS9 - - - -
-

Installing JS9

- -

Summary for the Impatient

-
    -
  • retrieve and unpack the source code tar file or clone the js9 repository -
  • run a simple web server in the js9 dir: python3 -u -m http.server 8000 -
  • load localhost:8080/js9.html -
  • JS9 is now ready for drag-and-drop image files -
  • run "./mkjs9 -q" to set up the js9 command-line script in its simplest form -
  • to install JS9 into a web server tree, run configure with this switch: -
    -  # location to install the JS9 web files:
    -  ./configure --with-webdir=[path_to_web_install]
    -
    -
  • to add large file support, build the helper with these switches: -
    -  # where to find cfitsio and install binaries, what sort of helper to build:
    -  ./configure  --with-cfitsio=[path_to_cfitsio] --prefix=[path_to_prog_install] --with-helper=nodejs
    -
    -
  • edit the js9prefs.js to set up your site-specific JS9 parameters -
  • build, install, clean up: make; make install; make clean -
- -

Retrieve and Unpack the Source Code Tar File

-

-The current release of the JS9 source tar file is available at: -

-    https://js9.si.edu
-
-The source tar file will unpack into a js9-[version] directory with -the usual tar command, e.g: -
-    tar xfz js9-[version].tar.gz
-
-The most up to date version of JS9 is available on GitHub: -
-    git clone https://github.com/ericmandel/js9
-
-The GitHub version will contain the latest bug fixes and improvements. -Once you have cloned JS9, you can retrieve the latest update: -
-    git pull
-
-Note that the main JS9 web site runs the latest software from GitHub. - -

Run JS9 using a simple web server or maybe using the file:// URI

-After the source code is retrieved, you can start using JS9 immediately -by running a Python3 web server in the js9 directory, e.g.: -
-  # web pages are loaded relative to the directory in which the server is run
-  # use any port number of your choice, above 1024
-  python3 -u -m http.server 8000
-
-You then can load web pages using localhost:8000 as the domain, e.g.: -
-  # basic js9 web page
-  http://localhost:8000/js9.html
-  # demo web page with imexam plugins
-  http://localhost:8000/demos/js9imexam.html
-
-You can drag any FITS image file onto the JS9 display and view -it, change contrast/bias, colormaps, scale, create regions, etc. - -

-You also should be able to load any of the JS9 web pages into your -browser using the file:// URI and no web server. For example, if you -unpacked the tar file into /Users/me on a Mac, then you should be able -to point your browser to: -

-    file:///Users/me/js9-[version]/js9.html
-
-to see the basic JS9 page without starting a web server. -

-Unfortunately, browser developers are making use of the file://URI -increasingly difficult. By default, it does not work in Google Chrome, -since default Chrome doesn't permit a local HTML file to read other -local files. Instead, you must start Chrome with the ---allow-file-access-from-files switch: -

-    # Linux:
-    chrome --allow-file-access-from-files
-    # Mac:
-    open /Applications/Google\ Chrome.app --args --allow-file-access-from-files
-
-

-Firefox now also restricts use of the file:// URI, as documented -here. For Firefox, the work-around is turn off -the privacy.file_unique_origin preference in about:config. -

-If you want to use the file:// URL, please glance at -Known Issues to check the latest -reports about using the file:// URI. It seems that browser developers -are slowly adding more and more restrictions ... - -

-If you just want to run JS9 in this simple way, you are done. However, -you might want to edit the js9prefs.js file to set up default values -for colormaps, scaling, etc. See: -JS9 Site Preferences for a -description of the available parameters. - -

Do You Want to Run JS9 as a Desktop Program from the Command Line?

-JS9 can be used as a desktop replacement for SAOimage DS9: you can -load images into the app's (Chrome) web page (or your own custom web -page) instead of a browser, and use the full power of JS9, including -external messaging. - -

-Running JS9 on the desktop simply requires that you install -Electron.js, an app building -platform that combines Node.js and the Chrome libraries. To install -Electron, go to the - -Electron GitHub release page, choose the latest available -stable release, and download the zip file for your platform. On a -Mac, Electron.app should be installed in the /Applications or -~/Applications directory. On Linux, the electron program should be placed -in your PATH. Note that Electron requires a relatively recent version -of Linux: Ubuntu 12.04, Fedora 21, Debian 8, CentOS 7 (not CentOS 6). - -

-Once the Electron app is installed, generate the JS9 quick-start files: -

-  ./mkjs9 -q
-  Editing js9Prefs.json for Node.js helper ...
-  Editing js9prefs.js for Node.js helper ...
-  Generating js9 script for JS9 messaging and desktop use ...
-
-  If you plan to use Electron.app with JS9, consider codesign'ing it:
-
-  sudo codesign --force --deep --sign - /Applications/Electron.app/Contents/MacOS/Electron/
-
-  This will avoid repeated requests to allow incoming connections.
-
-The mkjs9 script will create a js9prefs.js file (for the browser) and -a js9Prefs.json file (for the JS9 helper), which you can edit to add -preferred JS9 properties, as well as a js9 script to start the JS9 -app. On a Mac, you probably will want to codesign the Electron.app -application to avoid repeated requests about incoming connections (see -example above). - -

-Run the js9 script to start the app and load data files: -

-  # the -a switch tells the script to bring up the desktop js9 app
-  js9 -a ~/data/casa.fits &
-
-and then use the same script to interact with the JS9 page (or any -other JS9-enabled web page): -
-  # without -a, the script sends commands to the JS9 display
-  js9 cmap cool
-  js9 regions circle
-
- -

-For more details, see: Desktop JS9. - -

Do You Want to Install JS9 in a Web Server?

-If you want to run JS9 in a "real" web server, build and install -the JS9 tools and files using the standard GNU procedure: -
-  ./configure --with-webdir=[path] ... other switches ...
-  make
-  make install
-
-At a minimum, you should run configure with the --with-webdir=[path] -switch, which specifies the directory into which the JS9 web files -(JavaScript, CSS, etc.) will be installed. We recommend that this -directory only contain the installed JS9 files, i.e. that you install -JS9 into its own self-contained directory. This will make upgrading to -new versions much easier. - -

-Furthermore, we recommend that you not split up the JS9 files or -install them outside the JS9 install directory. Not only is this -difficult to update, but it actually will break JS9: at runtime, it is -assumed that js9.css is located in the JS9 install directory, and its -actual location is used to determine the JS9 install location relative -to the main web page. If you must move the js9.css file, you will also -need to add the installDir property to the globalOpts -object within js9prefs.js, specifying the relative path from the web -page to the JS9 install directory. Failure to do this correctly will -cause a host of problems, starting with JS9 not loading astroem.js and -js9worker.js. Please contact us if you have problems (the first -indication of which probably will be JavaScript error messages when -failing to load astroem.js and js9worker.js.) - -

-As described in Creating a JS9 Web Page, -a few JavaScript and CSS files must be loaded into a JS9-enabled web page. -Ordinarily this is done in the page's header, which typically will -look something like this: -

-  <head>
-  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-  <meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1" >
-  <meta name="viewport" content="width=device-width, initial-scale=1" >
-  <link type="image/x-icon" rel="shortcut icon" href="./favicon.ico">
-  <link type="text/css" rel="stylesheet" href="js9support.css">
-  <link type="text/css" rel="stylesheet" href="js9.css">
-  <script type="text/javascript" src="js9prefs.js"></script>
-  <script type="text/javascript" src="js9support.min.js"></script>
-  <script type="text/javascript" src="js9.min.js"></script>
-  <script type="text/javascript" src="js9plugins.js"></script>
-  </head>
-
-Also during startup, JS9 will asynchronously load -the js9worker.js file in order to create a worker process and -will load either the astroem.js file or the astroemw.js -and astroemw.wasm files, depending on whether -WebAssembly is supported on your browser. - -

-Although none of these files are large, it always is worthwhile making -downloaded files smaller to shorten the web page load time. One -straight-forward way to do this, if you have control of the Apache web -server, is to use the Apache rewrite capability to serve gzip'ed files -in place of requested (uncompressed) files, if the former exist. Using -this technique, your header can remain as shown above, but the Apache -server will send gzip'ed versions when available. To do this, you can -add code such as the following to the Apache httpd.conf: -

-  <IfModule mod_headers.c>
-    # turn on rewrite
-    RewriteEngine on
-
-    # Serve gzip compressed CSS files if they exist
-    # and the client accepts gzip.
-    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
-    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
-    RewriteRule "^(.*)\.css" "$1\.css\.gz" [QSA]
-
-    # Serve gzip compressed JS files if they exist
-    # and the client accepts gzip.
-    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
-    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
-    RewriteRule "^(.*)\.js" "$1\.js\.gz" [QSA]
-
-    # Serve gzip compressed wasm files if they exist
-    # and the client accepts gzip.
-    RewriteCond "%{HTTP:Accept-encoding}" "gzip"
-    RewriteCond "%{REQUEST_FILENAME}\.gz" -s
-    RewriteRule "^(.*)\.wasm" "$1\.wasm\.gz" [QSA]
-
-    # Serve correct content types, and prevent mod_deflate double gzip.
-    RewriteRule "\.css\.gz$" "-" [T=text/css,E=no-gzip:1]
-    RewriteRule "\.js\.gz$" "-" [T=text/javascript,E=no-gzip:1]
-    RewriteRule "\.wasm\.gz$" "-" [T=application/octet-stream,E=no-gzip:1]
-
-    <FilesMatch "(\.js\.gz|\.css\.gz|\.wasm\.gz)$">
-    # Serve correct encoding type.
-    Header append Content-Encoding gzip
-    # Force proxies to cache gzipped &
-    # non-gzipped css/js files separately.
-    Header append Vary Accept-Encoding
-    </FilesMatch>
-  </IfModule>
-
- -

-Note that the JS9 Makefile contains a rule called install-gzip which -will install gzip'ed copies of several JS9 files along side the uncompressed -versions: -

-  ./configure ...
-  make
-  make install
-  make install-gzip
-
- -

Do You Want to Configure Server-side Analysis or External Messaging?

-

-JS9 supports server-side ("back-end") analysis on FITS data using a -server-side helper. This capability allows you to execute virtually -any command-line analysis program from JS9. The analysis command is -run on the back-end server and results viewed on your web page. You can -utilize your own web server as the JS9 back-end helper using CGI -calls, or you can run a separate Node.js-based server to process JS9 -back-end requests. The server-side analysis capability is especially -useful for archive centers, but also can be attractive to individual -users who want to integrate their own data analysis programs into JS9. -

-In addition, JS9 supports -command-line messaging -between the shell and JS9, -pyjs9 Python messaging -between the Python and JS9, -and also has large-file support via the use of -representation files. -These capabilities requires the configuration of a -Node.js-based server-side helper. -

-You configure a JS9 helper by adding additional switches to -the configure command, e.g.: -

-  # where to find cfitsio and install binaries, what sort of helper to build:
-  ./configure  --with-cfitsio=[path_to_cfitsio] --prefix=$HOME --with-helper=nod
-  make
-  make install
-
-See: -Installing a Server-side Helper -for details. - -

Build the JS9 System

-Once you have decided on the configuration of your JS9 system, run -configure to generate various build files: -
-  ./configure [your JS9 switches]
-
-

-and then build the JS9 system using the make command: -

-   make
-
-Minor note: the cloned js9 script will be modified by the build to -include knowledge of the source and install directories. This change -allows you to run using the installed code instead of the source code. -But since this modification will prevent subsequent "git pull" -calls from completing, it will be reset by install or clean. - -

Finalize Your Site Preferences

-

-The js9prefs.js file and js9Prefs.json file contain various default -settings for JS9, e.g. default colormap and scale for image display. -Feel free to edit this file to set up your own site-specific -parameters. See -JS9 Site Preferences for a -description of the available parameters. - -

Install the JS9 System

-

When the build is completed, you can install the JS9 into your web tree: -

-    make install
-
-

-The first time you install JS9, your preference files will also be -installed. After that, the install command will not install these -files in order to avoid overwriting custom files. You can explicitly -re-install preference files using: -

-    make install-prefs
-
-or simply copy them into the install directory. -

-In addition, the install procedure will rename an existing node_modules -directory to onode_modules before installing the node_modules directory. -This action prevents the accumulation of unneeded and possibly conflicting -modules after multiple installs. If you need one or more modules from the -original modules directory, please copy them from onode_modules or -re-install them. - -

-Clean up the build directory using the command: -

-    make clean
-
-

Optionally Install the JS9 Test Data Files

-

-If you want to display our test data files in the JS9 demo pages, -you must retrieve the JS9 data file tar file from the JS9 web site: -

-    https://js9.si.edu
-
-and untar it into the JS9 web install directory. This will create -sub-directories containing the image data. These data files also are -available on GitHub: -
-    https://github.com/ericmandel/js9data
-
- - -
Last updated: July 19, 2021
-
- - - diff --git a/web/static/js9_old/help/knownissues.html b/web/static/js9_old/help/knownissues.html deleted file mode 100644 index a3256e4..0000000 --- a/web/static/js9_old/help/knownissues.html +++ /dev/null @@ -1,214 +0,0 @@ - - - - - -JS9 Known Issues - - - -
-

JS9 Known Issues

- -Unresolved Issues: - -
    - -
  1. All platforms (Always : unresolved) -

    -One of the simplest ways to use JS9 locally is by means of the file:// -URI scheme, e.g., point your browser to file:///home/me/js9/js9.html. -

    -This does not work in Google Chrome because Chrome does not permit a -local HTML file to read other local files. You can read a relatively -emotional argument about this restriction at: -

    -    https://code.google.com/p/chromium/issues/detail?id=37586
    -
    -

    -The workaround is to start Chrome with the ---allow-file-access-from-files switch. On Linux: -

    -    chrome --allow-file-access-from-files
    -
    -On a Mac: -
    -    open /Applications/Google\ Chrome.app --args --allow-file-access-from-files
    -
    -It also does not work on Firefox starting with version 68. See: -
    -https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors/CORSRequestNotHttp
    -
    -for details. The workaround (as discussed in that security page) is to -turn off the privacy.file_unique_origin preference in -about:config. -

    -It also doesn't work with Safari for some versions of JS9, i.e., it -seems to work with v3.3 and v3.4 but not v3.3.1. No idea why, but if -you have enabled the Develop menu in Safari, you can -choose Disable Local File Restrictions. (For Develop menu: -choose Safari -> Preferences, click Advanced, then select "Show -Develop menu in menu bar"). -

    -You can bypass the whole file:// CORS problem by using a Python web -server instead. For example, if you start the server in the js9 directory: -

    -  python3 -u -m http.server 8000
    -
    -you then can load the js9.html page at: -
    -  http://localhost:8000/js9.html
    -
    - -
  2. Desktop app (February 11, 2021 : unresolved) -

    -When the js9 script is run with the -b (start a browser) switch on a Mac: -

    -    js9 -b --webpage js9.html
    -
    -we would like to use Safari as the target browser. But executing this command -under the hood: -
    -    open -a Safari --webpage js9.html
    -
    -causes both Safari and your default browser to start up. We therefore use -Chrome instead. If you really want to use Safari, you can run: -
    -    js9 -b safari --webpage js9.html
    -
    -or set the JS9_BROWSER environment variable to "safari". In either case, -try to ensure that Safari is actually running before running js9 with -b, -as this seems to work properly. -

    - -

  3. Desktop app (July 9, 2019 : unresolved) -

    -The Electron.js-based -JS9 desktop app has some limitations when a second instance is started up. -The most obvious concerns the Preferences plugin, which uses -localStorage to save parameters between sessions. -Unfortunately, -Electron.js apps do not properly return localStorage values for -the second (and subsequent) instance. We therefore have disabled the ability -to load and store preferences via localStorage in all but the first -running instance of the JS9 app. - -

  4. Chrome (January 20, 2019 : unresolved) -

    -Chrome's memory restrictions remain more stringent than those of -Firefox or Safari. On a Macbook Pro, it is possible to reproject a -4096x4096 32-bit image in Firefox and Safari, whereas Chrome gets the -"snap" error for 32-bit images larger than approximately 3800x3800. -We will continue to try to reduce memory usage, while hoping for less -restrictive limits (or even full support for unlimited memory via mmap()). - -

  5. Linux platforms using Firefox (February 20, 2018 : unresolved) -

    -One of the simplest ways to use JS9 locally is by means of the file:// -URL scheme, e.g., point your browser to file:///home/me/js9/js9basics.html. -

    -On Linux, although this works in Firefox for files in the web page's -domain, it does not work for files outside the domain: -

    -    JS9.Load("foo.fits")         # works
    -    JS9.Load("fits/foo.fits")    # works
    -    JS9.Load("../foo.fits")      # does not work
    -
    -Firefox does appear to load files outside the web domain properly on a Mac. -

    - -

  6. Webkit (Safari and Chrome) (December 3, 2015 : unresolved) -

    -Webkit browsers such as Safari and Chrome implement resizeable divs in -an unintuitive way, which required several hacks in order to allow us -to resize the JS9 display on the fly. The resizeable (enclosing) div -must be larger than the JS9 display canvas, or else the resize handle -cannot be seen. As a result, the resize handle juts out from the -JS9 display in an unappealing way. Also, the resize operation can only -increase the size of the display, not decrease it. To work around this, -you can first decrease the display size using the View menu, which -sets a new minimum size for GUI-based resize. Finally, the cursor is -not changed to a resize cursor. I couldn't figure out how to work -around this in a fool-proof way. We hope Webkit will implement more -intuitive behavior in the near future. - -

  7. Safari Mobile platforms (April 9, 2015 : unresolved) -

    -A maximum image size is enforced by Apple on Safari mobile devices. -(See https://discussions.apple.com/thread/4975106 for a discussion.) -Images should be restricted to a size of less than -approximately 1900x1900, depending on the size of the FITS header. So -an image file of size 1024x1024 should be fine, while a file of size -2048x2048 certainly will be too large. - -

- -

-Resolved Issues: - -

    - -
  1. Safari (October 4, 2016 : resolved) -

    -On Mac OSX, if the Terminal running the js9 messaging script is -located in a different Space (i.e. desktop) from the Safari browser -with which it is communicating, the transfer of results from the -browser to the script can be delayed up to several seconds. It does -not happen all the time and it does not happen if the two applications -share the same Space. The data transfer also will resume immediately -if you switch to the Space containing the browser. The obvious -work-around is to make sure that the Terminal and browser share the -same Space. -

    -The problems appears to have gone away with MacOS 10.14 (Mojave). - -

  2. All platforms, especially Chrome (June 21, 2014 : resolved) -

    -Available memory can be a problem when loading very large gzip'ed FITS -files, especially in 32-bit Chrome. JS9 currently reads the entire -FITS file or gzip'ed file and inflates parts as needed. It can process -files up to approx. 200Mb in size before Chrome runs out of heap -space. Note that Chrome often will load an ungzip'ed FITS file in -cases where the gzip'ed file fails (though there still are upper -limits on the total space available). We hope that the 64-bit version -of Chrome (in early Canary release as of 7/1/2014) will alleviate -these problems. Otherwise, we will take a more drastic approach to -memory management within JS9 (at the expense of speed). -

    -The 64-bit Chrome can make use of 2Gb of memory. - -

  3. All platforms (June 13, 2014 : resolved) -

    -When resizing a box region in one direction only (i.e., width or -height), the width of the region's border will be different in each -direction. This is due to the underlying graphics algorithm used to -resize the region, which changes the scale factor in each direction -individually and ties the border width to that scale factor. We will -fix this in a future release. -

    -Fixed in Fabric.js v4.x - -

  4. All platforms (May 20, 2013: resolved) -

    -If the "load image" command is part of a group of commands passed to -the js9 script, a race condition can occur when subsequent commands -are executed before the image is fully loaded. To avoid this problem, -images should be loaded in a separate js9 command and the load status -checked for completion before proceeding to manipulate the image. See -the js9load script for details (or just use the script itself -to load images). (Technical details: images are loaded asynchronously, -so that other parts of the web page are available during the load -process. A synchronous load could freeze the web page while -loading. To avoid this situation, external processes should use the -"status load" command to check for a completed load before sending -further processing commands). - -

- -
Last updated: June 1, 2021
-
- - - diff --git a/web/static/js9_old/help/localtasks.html b/web/static/js9_old/help/localtasks.html deleted file mode 100644 index 2a5f3e7..0000000 --- a/web/static/js9_old/help/localtasks.html +++ /dev/null @@ -1,342 +0,0 @@ - - - - - -Local (Browser-Based) Analysis Tasks and Plugins - - - -
-

Adding Local (Browser-Based) Analysis Tasks and Plugins to JS9

- -

-JS9 supports the ability to perform local analysis, i.e. tasks -executed in your browser (not on the back-end server). This is -accomplished by offering access to the image data and region -information via a -JS9 Public API. Obviously, all of JS9 -JavaScript code is available to you within a web page, but the public -API is designed to stable and well-documented. - -

-

Adding Simple Analysis Tasks to Your Web Page

-

-For simple analysis (i.e., no mouse or keyboard event processing), it -often is sufficient to define GUI elements directly on the web page, -adding Javascript code to interact with these elements and call the -public JS9 functions as needed. In particular, -the JS9.GetImage() function will return a handle for the -currently displayed image and the the various JS9.Region -functions allow you to manipulate regions. These routines are -described in the JS9 Public API. - -

-The js9onchange.html demo web page illustrates these simple -capabilities. It shows how to run a task every time a region -changes, i.e. when it is moved, resized, or deleted. This is -accomplished by setting the JS9.Regions.opts.onchange -parameter to a function (if you are setting via JavaScript) or a -string routine name (if you are setting via json in the prefs file): -

-    // via JavaScript    
-    JS9.Regions.opts.onchange = myRegionChanged;
-
-or: -
-    // from within js9prefs.js
-    { ... "Regions.opts":  {"onchange": "myRegionChanged"} ... }
-
-The calling sequence of the xeqonchange function is: -
-    function myRegionChanged(im, xreg)
-
-where im is the image handle of the currently displayed image, and -xreg is an object containing information about the changed region: -
-  function myRegionChanged(im, xreg){
-    var obj, v;
-    obj = JS9.GetImageData(true, {display: im});
-    # get data value at the center of the region
-    v = obj.data[Math.floor(xreg.y-0.5) * obj.width + Math.floor(xreg.x-0.5)];
-    console.log("cen: %s,%s val: %s", xreg.x.toFixed(2), xreg.y.toFixed(2), v);
-  };
-
-Note that you can turn off region change processing for -individual regions or for all regions by means of the xeqonchange -menu option in a given region's context menu or the global Regions menu, -respectively. - -

-The js9onchange.html demo web page also shows how -server-side JS9 analysis tasks can be executed directly from the -web page using HTML elements (buttons, forms, etc.) instead of the -Analysis menu. See Server-side -Analysis Tasks for more information. - -

-

Adding Plugins to Your Web Page

-

-For anything other than the simplest analysis, you can write a JS9 -Plugin module. A plugin is a Javascript module that contains -a constructor function to create a plugin GUI, and, optionally, -one or more event callbacks to process desired events. When -the file is loaded, the plugin should call RegisterPlugin() to -make itself known to JS9. Plugin modules should be stored in the -js9/plugins directory (or in a sub-directory therein) and should be -loaded into JS9-enabled web pages after js9.js itself is loaded. - -

-To create instances of the plugin GUI, the constructor function gets -called for each plugin div defined on the web page. -The this context is seeded with a few JS9 properties, including: -

    -
  • this.div: the DOM element representing the div for this plugin -
  • this.divjq: the jquery object representing the div for this plugin -
  • this.id: the id of the div (or the plugin name as a default) -
  • this.winType: "div" (in-page div element) or "light" (from view menu) -
  • this.winHandle: handle returned from light window create routine -
  • this.display: the display object associated with this plugin -
  • this.plugin: plugin class object (contains user opts in opts sub-object) -
  • this.status: "active" or "inactive" or undefined -
-The most important of these properties is the div property -specifying the DOM element of the containing div. You add your GUI -(HTML elements) to this.div and use the events to control -the action. The type property tells you whether the instance is -being created for an in-page div element or from the View menu, in -case configuration is different for these cases. -The plugintest.js module -provides a fairly complete example and should be studied in -conjunction with this help page. - -

-A JS9 plugin is registered at the end of the module using -the JS9.RegisterPlugin() public routine: -

-  JS9.RegisterPlugin(xclass, xname, func, opts)
-
-where: -
    -
  • xclass: class of the plugin -
  • xname: name of plugin -
  • func: the constructor function -
  • opts: an object containing plugin options -
-The xclass and xname values together make up -the class of the div element. Thus, if the plugin xclass -is "JS9" and the plugin xname is "Menubar", then the div which -will hold the menubar has a class of "JS9Menubar". Note that these -strings must adhere to CSS grammar rules, e.g., start with a letter, -followed by letters, numbers, dashes and underscores, no spaces allowed. -

-This class/name separation has been made so that multiple plugins can -be written as part of one class and processed together as part of that -class, e.g., displayed together in the View and Help menus. -

-The optional opts object contains the following optional elements: -

    -
  • divArgs: [arg1, arg2, ...] arguments passed to div-based constructor -
  • menuItem: menuname in specified menu (default is View menu) -
  • menu: add plugin to this menu (only View or Analysis right now!) -
  • winDims: [width, height] -
  • winTitle: string -
  • toolbarHTML: string -
  • toolbarSeparate: boolean -
  • help: path html file for help, relative to js9/plugins directory -
- -

-The opts object allows you to specify callback functions that -get triggered by various JS9 events. The calling sequence of these -functions depends on the callback type. The defined callback -types and their standard callbacks are: -

    -
  • image: function(im) -
      -
    • onimageload: an image is loaded -
    • onimageclose: an image is closed -
    • onimagedisplay: an image is (re)displayed -
    • onimagerefresh: an image is refreshed (i.e., new data is supplied) -
    • onplugindisplay: a plugin window is re-displayed -
    • onrawdata: low-level support for when the raw data array is produced -
    -
  • mouse: function(im, ipos, evt) -
      -
    • onmouseup: mouse up events -
    • onmousedown: mouse down events -
    • onmousemove: mouse move events -
    • onmouseover: mouse over events -
    • onmouseout: mouse out events -
    • onclick: click events (down/up with only tiny movement) -
    -
  • keypress: function(im, ipos, evt) -
      -
    • onkeydown: keydown events -
    • onkeypress: keypress events (keydown + keyup) -
    -
  • shape: function(im, xreg) -
      -
    • on[layer]change: a shapes changes in a layer (e.g., "onregionschange" for region changes) -
    -
-

-You can globally toggle execution of all plugin callbacks by setting -the value of the JS9.globalOpts.xeqPlugins property to true or false. -

-In addition to these standard callbacks, JS9 also supports an extended set of -image callbacks that get triggered when internal JS9 routines are called. -These callbacks are only active if the JS9.globalOpts.extendedPlugins -property is set to true (which is the default). -

    -
  • onsetpan: called when pan value is set by im.setPan() -
  • onsetzoom called when zoom value is set by im.setZoom() -
  • onsetwcssys called when wcs system is set by im.setWCSSys() -
  • onsetunits called when wcs units is set by im.setWCSUnits() -
  • onsetcolormap called when colormap is set by im.setColormap() -
  • onsetscale called when scale is set by im.setScale() -
  • onrawdatalayer called when a raw data layer is created or modified by im.rawDataLayer() -
  • onfilterrgbimage called when an RGB image is filtered by im.filterRGBImage() -
  • onchangecontrastbias called when the "change contrast/bias" -mouse/touch gesture changes the contrast/bias -
-

-Finally, JS9 supports the onregionsmove callback if the -JS9.globalOpts.intensivePlugins property is set to true (the -default is false). Executing this callback requires that the region -parameters be updated continually as the mouse moves. Such an update -is a relatively intensive operation, so the intensivePlugins property -should only be enabled if you need it. -

-Please let us know if you require a callback to be associated with -another JS9 function. - -

-Each callback function gets executed when the specified event takes -place. The im object is the JS9 image handle, which can be passed to -the display parameter of public API calls to specify the JS9 display -(necessary when there is more than one display on the page); -

-  function onimdisplay(im){
-    arr = JS9.GetRegions({display: im});
-  }
-
-The ipos object contains the one-indexed image position of the mouse: -
-  function onmousemove(im, ipos){
-    var obj, v;
-    obj = JS9.GetImageData(true, {display: im});
-    # get data value at the mouse position
-    v = obj.data[Math.floor(ipos.y-0.5) * obj.width + Math.floor(ipos.x-0.5)];
-    console.log("ipos=%s,%s val=%s", ipos.x.toFixed(2), ipos.y.toFixed(2), v);
-  };
-
-The evt object is the jQuery event that triggered the callback. - -

-The on[layer]change callback gets passed the same xreg -object as is used for the JS9.GetRegions() routine and -the JS9.Regions.opts.onchange parameter: -

-  function myRegionChanged(im, xreg){
-    var obj, v;
-    obj = JS9.GetImageData(true, {display: im});
-    # get data value at the center of the region
-    v = obj.data[Math.floor(xreg.y-0.5) * obj.width + Math.floor(xreg.x-0.5)];
-    console.log("cen: %s,%s val: %s", xreg.x.toFixed(2), xreg.y.toFixed(2), v);
-  };
-
- -

-Holding down the Shift key (where available) will turn off execution of all -mouse event callbacks. This allows you to move the mouse to a specific -location, and then move away without triggering a callback. The -xeqonchange menu option in the Regions menu and each region's -context menu can be used to turn off execution of the region onchange callback. -The former does this globally, the latter only for the specific region. - -

-The divArgs is an array specifying arguments to pass to the constructor -function, when a div element is found in the web page. For example, the Panner -and Magnifier plugins pass a width and height to the constructor in this way. - -

-The menuItem is a string which specifies the name that will be -used in the View menu when a plugin div is not found on the web -page. If no menuItem is specified, the plugin will not appear -in the View menu. - -

-Furthermore, the menu property can be used to change the menu -in which the above-mentioned menuItem plugin will be -placed. For example, an Imexam plugin situates -its plugins in the Analysis menu instead of the View menu. NB: At the -moment, only the View and Analysis menus are supported -for placement. - -

-The winDims is an array specifying the width and height of the -light window that will get created for this plugin via the View -menu. If the winDims dimensions is specified as [0, 0], the plugin is -virtual and is active all the time. This is useful in cases -where you simply want to define callback routines for one or more JS9 -actions. See the example below. - -

-The winTitle is a string specifying the title of the light window. -The default is no title. - -

-You can add HTML (e.g., command buttons) to the light window titlebar -by putting an HTML string into the toolbarHTML property. The -panner and magnifier use this technique to add zoom buttons. You also -can add HTML onto a web page plugin div, but in this case, where the -HTML is placed depends on the value of the toolbarSeparate -property. If the value of toolbarSeparate is true, then a -titlebar is created above the plugin and the HTML is added to it. -Otherwise, the HTML is placed in top of the plugin itself. - -

-The help property specifies the pathname of an html file that will -be placed in the Help menu. This pathname should be relative to -the plugins directory. - -

-Within a callback, you can use the JS9 Public API to manipulate data, as -detailed in the JS9 Public API. - -

-A final example: if you want changes of contrast/bias in one JS9 display -to trigger similar changes in all other displays, you can do this: -

-JS9.RegisterPlugin("MyPlugins", "allconstrastbias",
-		   function(){return;},
-		   {onchangecontrastbias: function(im){
-		       var i, tim, obj;
-		       JS9.globalOpts.xeqPlugins = false;
-		       obj = JS9.GetColormap({display: im});
-		       for(i=0; i<JS9.displays.length; i++){
-			   tim = JS9.displays[i].image;
-			   if( tim && (tim !== im) ){
-			       JS9.SetColormap(obj.contrast, obj.bias,
-					      {display: tim});
-			   }
-		       }
-		       JS9.globalOpts.xeqPlugins = true;
-		   },
-		   winDims: [0, 0]});
-
-Here, a virtual plugin is created with no user interface. It thus is -active all of the time. The plugin defines a single action that gets -triggered when the contrast/bias is changed. This action changes the -contrast/bias of all other displays. Note that the -JS9.globalOpts.xeqPlugins property is set to false temporarily -to avoid recursion. - -

-

Last updated: July 10, 2018
-
- - - diff --git a/web/static/js9_old/help/memory.html b/web/static/js9_old/help/memory.html deleted file mode 100644 index 513fc8d..0000000 --- a/web/static/js9_old/help/memory.html +++ /dev/null @@ -1,207 +0,0 @@ - - - - - -Dealing with Memory Limitations - - - -
-

Dealing with Memory Limitations

- -

-Desktop application developers count on a semi-infinite amount of -memory for applications. This is a luxury not afforded to browser -application developers. Browsers have two memory-related issues that -must kept in mind when developing applications: -

    -
  • browsers often impose per-tab memory limitations -
  • browser memory is managed automatically by garbage collection -(GC) algorithms -
- -

Per-tab memory limits

- -Browser limitations on per-tab memory are not well documented. The -64-bit Chrome browsers are known to have a 4Gb per-tab memory limit. -iOS devices have more stringent limitations: -empirical evidence indicates that the iPhone 6 is limited to 645Mb, the -iPhone 6s to 1Gb, and the iPhone 7 to 2Gb. - -

-To better deal with memory limits, JS9 offers a number of global -parameters in the JS9.globalOpts object. New values for these -parameters can be added to the JS9 preference file. (See -Configuring JS9 Site Preferences -for more information about preferences.) - -The JS9.globalOpts.maxMemory parameter specifies the largest -array size (in bytes) that can be allocated in the heap to hold a FITS -image. The default is currently set to 750000000 (i.e., 750Mb). It is -automatically set to lower values for Chrome (500000000 or 500Mb) and -mobile (300000000). - -

-Similarly, the JS9.globalOpts.image object allows you to set -the max size image section that will be created from a FITS image. -The general default values are {x: 0, y: 0}, where 0 values specify -unlimited section size. For Chrome, the limits are set to {x: 6144, -y: 6144} while for mobile devices, they are set to {x: 4096, y: -4096}. Obviously, these are just empirical guesses on our part! - -

-When a FITS files is displayed by JS9, the file itself is maintained in memory, -which is useful in many cases: -

    -
  • displaying multi-extension FITS files (use the Extensions plugin -to switch between extensions) -
  • displaying data cubes (use the Data Cube plugin to display a different -slice of the image) -
  • binning and filtering X-ray binary tables (use the Binning/Filtering -plugin for binning and filtering) -
  • performing wcs reprojections, including image rotation -
-If none of the above apply to your use of JS9, you can save memory by -removing the virtual FITS file. This can be done manually by choosing -the File -> free image memory option. - -

-Alternatively, the JS9.globalOpts.clearImageMemory parameter -can be used to specify when JS9 should automatically remove the FITS -virtual file after displaying each image. Options include: -

    -
  • never: no automatic removal of the virtual FITS file (default) -
  • always: always remove the virtual FITS file -
  • auto: remove the virtual file if the displayed image is a 2D image (not a table or cube) and there are no other HDU extensions -
  • noExt: remove the virtual file if there are no other HDU extensions -
  • noCube: remove the file is the displayed image is not a cube -
  • size,[x]: remove the file is its size is greater than [x] Mb -
- -

Garbage collection

- -

-In the early days of desktop programming, memory was allocated and -freed explicitly. This allowed fine-grained control over the amount of -memory being used at any one time, but often led to memory leaks if -the developer forgot to free previously allocated memory. - -

-Modern languages, including Javascript, use automatic techniques such as -garbage collection (GC) to manage memory. In principle, memory gets -freed when it is "no longer needed". But since the concept of "no -longer needed" cannot be decided unambiguously, approximate algorithms -are used. - -

-Problems then arise because these garbage collection algorithms are only -run periodically and they do not always identify all of the memory -objects that can be freed. Developers often supply "hints" to the -garbage collector by setting object to null or deleting large -properties of an object. - -

-Because JS9 deals with large chunks of data, garbage collection delays -and misses can lead to larger than expected memory utilization. In May -2017, we found that continuously loading and closing an image was not -freeing memory properly. The problem was traced to two different -factors. First, especially in Chrome, the garbage -collector was not properly sensing that the fileReader result memory -was available for clearing. To remedy the situation, we had to delete -the fileReader result object explicitly: -

-  fileReader = new FileReader();
-  fileReader.onload(function(){
-    ... do work on the fileReader.result array ...
-    // give the garbage collector a hint that we're done with the array
-    delete fileReader.result;
-  });
-  // start reading the file as a an array
-  fileReader.readAsArrayBuffer(fits);
-
-See -http://stackoverflow.com/questions/32102361/filereader-memory-leak for discussion of a similar problem. - -

-Second, we found that if a continuous Javascript loop was too tight, -the GC might not be run. This was especially true of Firefox. In the -example below, each LoadFITS() call is making an xhr() call to check -status of a FITS file, and loading the file using JS9.Load() if necessary. -Since JS9.Load() runs asynchronously, there never was enough -idle time to start the GC, and memory was not released properly. This -situation actually could be seen using the Performance tab in the -Firefox Developer Tools: the GC was run at the start of the loop, but -never run again: -

-  var timeout = 1000;
-  setInterval(function() {
-    LoadFITS("foo1");
-    LoadFITS("foo2");
-  }, timeout);
-
-

-As a remedy, we used a longer timeout and also skipped processing for -a few several cycles over time, to try to ensure that the browser had enough -idle time to start the GC. -

-  var nloop = 0;
-  var modcycle = 1;
-  var loopcycle = 10;
-  var timeout = 3000;
-  setInterval(function() {
-    nloop++;
-    nmod = nloop % loopcycle;
-    // skip modcycle loops to give the GC time to be run
-    if( nmod > modcycle ) {
-      LoadFITS("foo1");
-      LoadFITS("foo2");
-    }
-    // timeout should be long enough to give the GC time to be run
-  }, timeout);
-
-

-Another possible remedy is to reload the page periodically in order to -reset browser memory: -

-  var nloop = 0;
-  var modcycle = 1;
-  var loopcycle = 10;
-  var timeout = 3000;
-  var maxloop = 1800 * 1000 / timeout;
-  setInterval(function() {
-    nloop++;
-    nmod = nloop % loopcycle;
-    // reload page, approx every half hour
-    if( nloop > maxloop ){
-        window.location.href = window.location.href;
-    }
-    // skip modcycle loops to give the GC time to be run
-    if( nmod > modcycle ) {
-      LoadFITS("foo1");
-      LoadFITS("foo2");
-    }
-    // timeout should be long enough to give the GC time to be run
-  }, timeout);
-
-

-If you find that JS9 is taking much more memory than you expect, -especially in situations where images are being loaded in a loop -please let us know and we will try to help diagnose the problem. Note -that Chrome and Firefox Memory both have Memory and Performance -utilities in their Developer Tools that are very useful in -understanding memory allocation issues. - -

-Alternatively, in situations where loading images in a loop is -utilizing more memory than expected, you might consider embedding JS9 -inside an iframe in your web page, and reloading the JS9 page -periodically. This should prevent garbage collection-related memory -problems, because memory is reset each time the page is loaded. - -

Last updated: May 29, 2017
-
- - - diff --git a/web/static/js9_old/help/preferences.html b/web/static/js9_old/help/preferences.html deleted file mode 100644 index 785ac4c..0000000 --- a/web/static/js9_old/help/preferences.html +++ /dev/null @@ -1,171 +0,0 @@ - - - - - -Site Preferences - - - -
-

Configuring JS9 Site Preferences

- -

-JS9 supports a site configuration file that is read after the -JavaScript variables are loaded but before JavaScript code is compiled -and executed. This file allow you to tailor JS9 to meet the needs of -your site without having to modify the js9.js file directly. - -

-To support site configuration, load the JS9 json preference file -file (referred to here as js9prefs-local.js, but it can be named -anything, of course) into your web page before loading other JS9 javascript: -

-  <script type="text/javascript" src="js9prefs-local.js"></script>
-  <script type="text/javascript" src="js9support.min.js"></script>
-  <script type="text/javascript" src="js9.min.js"></script>
-  ...
-
-

-The following example shows the current js9prefs.js file: -

-var JS9Prefs = {
-    "globalOpts": {
-        "helperType":       "nodejs",
-        "helperPort":       2718,
-        "helperCGI":        "./cgi-bin/js9/js9Helper.cgi",
-        "debug":            0,
-        "loadProxy":        true,
-        "workDir":          "./tmp",
-        "workDirQuota":     100,
-        "dataPath":         "$HOME/Desktop:$HOME/data",
-        "analysisPlugins":  "./analysis-plugins",
-        "analysisWrappers": "./analysis-wrappers"
-    },
-    "imageOpts": {
-	"colormap":         "grey",
-	"scale":            "linear"
-    }
-}
-
- -

-This preference file can be used to override the default parameter -settings for JS9. A look through the beginning of JS9 code will show -a number of Javascript objects containing these default -parameters. They all have names ending in Opts, -i.e. JS9.imageOpts, JS9.analysisOpts, etc. A description of some of -these objects is given below: - -

    -
  1. JS9.globalOpts: this JavaScript object contains global -information, including parameters concerned with the back-end services -used by JS9. Many of the most useful JS9 configuration parameters are -contained in this object, including mouse/touch/keyboard actions, -click to focus, catalog properties, image/table default -dimensions/binning, and a host of other properties. - -

    -

  2. JS9.imageOpts: This JavaScript object contains initial -values for parameters associated with individual images, such -as: contrast, bias, whether to invert the -colormap, colormap, scale, WCS system , WCS -units, whether to display value/position, and whether to -list regions when they change (listonchange). - -

  3. JS9.Regions.opts: This JavaScript object contains -default values for individual regions, including the initial size of -various regions, initial inner and outer radii for annuli, initial -angle, etc. You can set or override properties for this object by -adding them to the regionOpts object in the js9prefs.js file. - -

  4. JS9.menuButtonOptsArr: this JavaScript array of objects allows -you to change and re-arrange which menu options are provided. If you -prefix the name of a menu option with '#', that option is disabled. - -

  5. Module: a global JavaScript object with attributes that -Emscripten-generated code calls at various points in its execution. -You can set or override properties for this object by adding them to -the emscriptenOpts object in the js9prefs.js file. One -important case occurs when you have installed the astroemw.wasm binary -file in a location other than the JS9 install directory. You would -then use Emscripten's wasmBinaryFile property to specify a path -to this file, relative to the JS9 install directory. For example, if -the JS9 install directory and the resources directory are at the same -level in the directory hierarchy: -

    -var JS9Prefs = {
    -  "emscriptenOpts": {
    -     "wasmBinaryFile": "../resources/js/astroemw.wasm"
    -  },
    -  # other preferences ...
    -}
    -
    -See Emscripten's -Module Object -documentation for more information, and please let us know if you have problems. - -
-In addition to the above-mentioned objects, the preference file can be -used to set some internal variables. The JS9.DEBUG parameter is an -example, as shown in the default preference file. Ordinarily, users -need not be concerned with these variables. - -

-When a property (e.g. scale) is added to one of the top-level objects -in the JS9Prefs object (e.g. imageOpts), it generally replaces the -existing value on the specified JS9 option. In the previous example, -both the default colormap and default scale will be replaced by the -values specified in the prefs file. Arrays and objects are also -completely replaced. This, in this example, after specifying a new -keyboardActions object, the entire keyboardActions object in JS9.globalOpts -will be replaced by a new object containing two actions only: -

-var JS9Prefs = {
-    "globalOpts": {
-        "keyboardActions": {
-            z: "zoom in",
-            x: "zoom out",
-      },
-    }
-}
-
-In this case, however, you probably wanted to merge the new keyboard -actions into the existing actions object. To perform object merging -instead of replacing, add the special config object: -
-var JS9Prefs = {
-    "config": {
-        "objects": "merge"
-    },
-    "globalOpts": {
-        "keyboardActions": {
-            z: "zoom in",
-            x: "zoom out",
-        },
-    }
-}
-
-This will result in a deep (recursive) copy being performed to merge -the two new keyboardActions properties with the existing properties. - -

-Finally, note that the JS9 Node.js helper utilizes -the js9Prefs.json file for configuration. Please ensure that -the following shared properties defined in these two files are consistent -with one another: -

    -
  • helperType -
  • helperPort -
  • helperCGI -
  • loadProxy -
  • workDir -
  • dataPath -
- -
Last updated: February 15, 2022
-
- - - diff --git a/web/static/js9_old/help/publicapi.html b/web/static/js9_old/help/publicapi.html deleted file mode 100644 index 6333c1c..0000000 --- a/web/static/js9_old/help/publicapi.html +++ /dev/null @@ -1,6418 +0,0 @@ - - - -The JS9 Public API - - - - - -
-

The JS9 Public API

- -

-The JS9 Public API provides a JavaScript programming interface for -interacting with JS9. Obviously, all of JS9 JavaScript code is -available to you within a web page, but the public API is designed to -stable and well-documented for users and web designers. It also will -provide the basis for planned language bindings (Python, perhaps C/Fortran.) -

-In general, the public API routines act on the current image being -displayed in the default JS9 display (i.e., the HTML div element that -defines the JS9 display.) Since most web pages will have only a single -JS9 display, this behavior is usually what you want. It parallels -DS9's behavior in which XPA commands act on the currently displayed -image. For example, to change the colormap of the current image, use: -

-    JS9.SetColormap("cool");
-
- -

-However, for cases where multiple JS9 displays are defined on a -single page, you can specify the specific display to process by -adding an display object argument to the calling sequence with -a single display property: -

-    {display: [display_id]}
-
-where [display_id] is the id of the target JS9 display (i.e. the id of -the HTML div element.) For example, if two JS9 displays with ids "JS9" -and "myJS9", respectively, are present on a single web page, you can -set the colormap of the second one this way: -
-    JS9.SetColormap("cool", {display: "myJS9"})
-
-Note that this display object contains only the display -property and always is specified as the final argument in a call. -

-For image-based API routines (not display-based routines with names ending in -Display, e.g., -JS9.ResizeDisplay or -JS9.BlendDisplay), the -display property can specify an image handle or image id instead of a -JS9 display id. When the image handle in question points to the currently -displayed image, this alternate usage is nothing more than a trivial -optimization. Thus, to call a routine such as -JS9.WCSToPix() -or -JS9.PixtoWCS(): -

-    var im = JS9.GetImage({display: "myJS9"});
-    for(i=0; i<1000; i++){
-      x = ...
-      y = ... 
-      wcs = JS9.PixtoWCS(x, y, {display: im});
-      console.log("%s %s -> %s %s", x, y, wcs.ra, wcs.dec);
-    }
-
-However, the image handle does not need to point to the currently -displayed image. When it does not, the public routine will act on the -image associated with the image handle, not the current image. In -particular, you can use -JS9.LookupImage() -to get the image -handle of any image, and then act on that image. For example, if two -images, foo1.fits and foo2.fits, are loaded into a JS9 display, and -foo1.fits is currently being displayed, you can close foo2.fits this way: -
-    var im = JS9.LookupImage("foo2.fits");
-    if( im ){
-        JS9.CloseImage({display: im});
-    }
-
-

-The optional display object argument generally is not -mentioned in the routines below, but it is always available. - -

-Choose from the following sections: -

- -


-

Loading Images

- -
Load an image into JS9
-

-JS9.Load(url, opts) -

-where: -

    -
  • url: url, in-memory FITS, FITS blob, data object -
  • opts: optional object or JSON string containing image parameters -
-

-Load a FITS file (or a PNG/JPEG file) into JS9. You also can pass -an in-memory buffer containing a FITS file, a blob containing a FITS -file, or a string containing a base64-encoded FITS file. Finally, you -can pass a generic data object containing the following properties: -

    -
  • naxis: number of axes in the image -
  • axis: array of image dimensions for each axis or ... -
  • naxis[n] image dimensions of each axis (naxis1, naxis2, ...) -
  • bitpix: FITS bitpix value -
  • head: object containing header keywords as properties -
  • image: typed data array containing image data (native format) -
  • dmin: data min (optional) -
  • dmax: data max (optional) -
  • refresh: refresh data when reloading image? -
  • allext: load all image extensions? -
  • file: set the file property in cases where the url is a script -
  • id: set the id property -
  • proxy: use experimental CGI proxy to load a remote URL -
-An image URL can only be loaded from the same origin as the JS9 JavaScript code, -which is called the - -Same Origin Policy. This means that this routine cannot load an -image file (i.e., FITS, PNG, or JPG) from an arbitrary URL. You can, -however, load remove URLs using the -JS9.LoadProxy() routine, which -retrieves the image into a temp directory before loading it locally. -

-For FITS files, we are experimenting with a second way to retrieve -remote URLs: using a CGI script that adds the required CORS header to -the retrieved FITS data on the fly. The CGI script is controlled by -the JS9.globalOpts.cgiProxy global property and has the -default value https://js9.si.edu/cgi-bin/FITS-proxy.cgi. If -you pass proxy: true in opts, this CGI script will be used -to retrieve the FITS file and return it with the required CORS header. -

-The JS9.RefreshImage() -and JS9.Load() routines differ in that -the former always updates the data into an existing image, while the -latter generally adds a completely new image to the display. - -

-However, in the case where an image already is loaded, -JS9.Load() does not reload the image -into a new display: this would initiate another (often time-consuming) -download, resulting in two identical images. Instead, behavior is -dependent on the value of the refresh property passed in opts -(or, if that is not set, by the JS9.globalOpts.reloadRefresh -property), as follows: -

    -
  • if refresh is true, the existing image is refreshed -
  • if refresh is false, the existing image is redisplayed -
-The global default is to redisplay instead of refreshing. Site authors can -change this property in js9prefs.js, while users can change this via -the Global tab of the Preferences plugin. -

-To override default image parameters, pass the image opts argument: -

-    JS9.Load("data/fits/casa.fits", {scale:"linear", colormap:"sls"});
-
-You can also pass a regions property to add regions or load a region file: -
-    # but oh my, its dicey mixing quotes and wcs arcsec/arcmin delims
-    JS9.Load("data/fits/casa.fits", {regions:'ICRS; box(23:23:40.340, +58:47:04.059, 29.5", 29.5", 0)'});
-    # much easier to pass a filename, if possible
-    JS9.Load("data/fits/casa.fits", {regions:"casa/casa.reg"});
-
-or a pan position: -
-    # pan to physical coords (usually file coords)
-    JS9.Load("data/fits/casa.fits", {px: 4009, py: 3926});
-    # pan to ra, dec using file's wcs
-    JS9.Load("data/fits/casa.fits", {ra: 350.866689, dec: 58.811671});
-    # pan to ra, dec using specified wcs
-    JS9.Load("data/fits/casa.fits", {wcs: "23:23:27.942 +58:48:42.02 ICRS"});
-
-

-If an onload callback function is specified in opts, it will be called -after the image is loaded. By default, the image handle is passed as -the first argument to the callback: -

-    JS9.Load("data/fits/3c273.fits", {scale: "linear", onload: func});
-#    function func(im){
-#        JS9.SetColormap("rainbow", {display: im});
-#        JS9.SetScale("log", {display: im});
-#    }
-
-

-You can specify the name of a routine as a string (instead of the function -itself): -

-    JS9.Load("data/fits/3c273.fits", {scale: "linear", onload: "myfunc"});'
-
-Assuming the function "myfunc" is defined in the window context, it will be -called with the image handle as the first argument. -

-Note that you can supply arguments along with a string-name function: -

-    JS9.Load("data/fits/3c273.fits", {scale: "linear", onload: "docmap('viridis')"});'
-
-As a convenience, you can also pass a JS9 public routine name: -
-    JS9.Load("data/fits/3c273.fits", {scale: "linear", onload: "SetColormap('viridis')"});'
-
-

-The string-name capability is especially valuable when calling Load() -from the shell or Python using External Messaging: -

-    js9 Load ~/data/coma.fits '{"onload":"SetColormap(viridis,4.5,0.35)"}'
-
-Note that you don't need to quote the string arguments ('viridis' in -the example above), but also note that all arguments are passed as -strings and must be converted to the correct data type in your own -bespoke functions (as is done in JS9 public routines). -

-If your url is a function returning a FITS file (e.g. CGI or PHP -script accessing an archive), the filename will end up being the name -of the script, which probably is not what you want. In this case, you -can set the file property explicitly: -

-    JS9.Load("mycgi?FITSFILE=acisf00361N003_evt2.fits", {file:"acisf00361N003_evt2.fits"})
-
-Similarly, you can set the id property explicitly (without setting the file) to tailor the id for special needs. -

-To load an image into a specified display, pass the display object as the last argument: -

-    JS9.Load("data/fits/3c273.fits", {scale: "linear"}, {display: "myJS9"});
-
-

-See Displaying Your Data for further discussion of -how to use this routine. - -

Load an image into a light window or a new (separate) window
-

-JS9.LoadWindow(url, opts, type, html, winopts) -

-where: -

    -
  • url: url to load -
  • opts: optional object or JSON string containing image parameters and/or the display id -
  • type: "light" or "new" -
  • html: html for the new page (default is to display a menubar above the image and a colorbar below) -
  • winopts: for "light", optional dhtml window options -
-returns: -
    -
  • id: the id of the JS9 display div -
-This routine will load an image into a light-weight window or an entirely new -window. The url and opts arguments are identical to the standard -JS9.Load() call, -except that opts can contain: -
    -
  • id: string specifying the id of the JS9 display being created. -If no id is specified, a unique id is generated. -
  • clone: the id of a display to clone: -the menubar, colorbar, statusbar will be created if and only if they are -present in the cloned display (for light window creation only.) -
-

-The type argument determines whether to create a light-weight -window ("light", which is the default) or a new, separate window ("new".) -

-By default, the created window will contain a Menubar above a JS9 -Display area and a Colorbar below: -

-    <div class='JS9Menubar' id='[id]Menubar'></div>
-    <div class='JS9' id='[id]'></div>
-    <div style="margin-top: 2px;">
-    <div class='JS9Colorbar' id='[id]Colorbar'></div>
-    <div>
-
-You can use the html argument to supply different web page elements -for the window. Furthermore, if you create a light window, a default -set of DynamicDrive dhtmlwindow parameters will be used to make the -window the correct size for the default html: -
-    "width=512px,height=542px,center=1,resize=1,scrolling=1"
-
-You can supply your own parameters for the new dhtmlwindow using the -winOpts argument. See: - -DynamicDrive for more information about their light-weight window. -

-To create a new light window without loading an image, use: -

-    JS9.LoadWindow(null, null, "light");
-
-

-See js9create.html for examples of how to use this routine. - -

Load an image URL into JS9 using a proxy server
-

-JS9.LoadProxy(url, opts) -

-where: -

    -
  • url: remote URL link to load -
  • opts: optional object or JSON string containing image parameters -
-

-Load a FITS, PNG, or JPEG file specified by an arbitrary URL into JS9 using the -JS9 back-end helper as a proxy server. -

-For security reasons, JavaScript contained in one web page can -access data in another web page only if both web pages have the -same origin (i.e., basically coming from the same host.) This -policy is called the - -Same Origin Policy. This means that JS9 cannot load a image files -(i.e., FITS, PNG, or JPG) from an arbitrary URL without using special -techniques. -

-One such technique is - -Cross-Origin Resource Sharing, by which the second server grants -permission to access its image data. Dropbox is CORS-enabled, so that -image files can be loaded directly into JS9. But obviously this requires -that explicit permission be granted by the other server. -

-A second technique is to use a proxy server: the URL is not -loaded directly into JS9, but instead is copied back to the -server from which JS9 itself was loaded. The file is then retrieved by -JS9 from this server so that the "same origin" rules are not violated. -

-The JS9 Node.js back-end helper can be configured to support -proxy server mode by setting the JS9.globalOpts.loadProxy -property. In addition, the back-end server must be configured to -support temporary working directories for each loaded page by setting -the JS9.globalOpts.workDir property. If the back-end server is -thus configured as a proxy server, JS9 will support the JS9.LoadProxy() -call and allow you to load FITS, PNG, and JPG files from arbitrary URLs. -JS9 also will display a open link via proxy menu option in the -File menu. -

-The JS9.LoadProxy() call takes a URL as its first -argument. This URL will be retrieved using curl or wget and stored on -the back-end server in a directory specifically tied to the web -page. (The directory and its contents will be deleted when the page is -unloaded.) JS9 then will load the file from this directory. Note that -since the file resides on the back-end server, all back-end analysis -defined on that server is available. -

-To override default image parameters, pass the image opts argument: -

-    JS9.LoadProxy("http://hea-www.cfa.harvard.edu/~eric/coma.fits", {scale:"linear", colormap:"sls"});'
-
-

-By default, the retrieved file is given a filename based on the base of -the URL. When a gzip'ed file is retrieved, the filename is taken from -the original ungzip'ed file, with a .gz extension added. As an -alternative, you can specify the name of the output file using the ofile -property. -

-    JS9.LoadProxy("http://nxsa.esac.esa.int/nxsa-sl/servlet/data-action-aio?obsno=0801931101&name=OEXPMP&level=MT_PPS&extension=FTZ",
-                  {ofile: "MP_P0801931101EPX000OEXPMP8000.FIT.gz"})
-
- -

-If an onload callback function is specified in opts, it will be called -after the image is loaded: -

-    JS9.LoadProxy("http://hea-www.cfa.harvard.edu/~eric/coma.fits", {scale: "linear", onload: func});'
-
-The image handle is passed as the first argument to the callback. -

-To load an image into a specified display, pass the display object as the last argument: -

-    JS9.LoadProxy("http://hea-www.cfa.harvard.edu/~eric/coma.fits", {scale: "linear"}, {display: "myJS9"});'
-
-

-Note again that not all back-end servers support the proxy functionality. -The main -JS9 web site does support proxy service, and -can be used to view images from arbitrary URLs. - -

Load one or more images when the web page is ready
-

-JS9.Preload(url1, opts1, url2, opts2, ... url2, optsn) -

-where: -

    -
  • url: url to load -
  • opts: optional object or JSON string containing image parameters -
-This routine will pre-load images into a JS9 display. It can be added -to the web page body element using the onload() JavaScript call or -called in a JavaScript init routine tied to onload. See index.html and -js9preload.html for examples. -

-It is worth emphasizing that JS9.Preload() should not be called -until the web page is fully loaded, since JS9 itself is not fully -initialized until then. It is for this reason that JS9.Preload() -generally is called using an onload routine tied to the web page body. - -

-You can load URLs outside the current web page domain if you are running a -JS9 helper which has enabled the server side Proxy Load capability. -See Server-side Analysis Tasks for more information. - -

Get Processing Status
-

-status = JS9.GetStatus(type, id) -

-where: -

    -
  • type: the type of status -
  • id: the id or image handle of the image -
-returns: -
    -
  • status: status of processing -
-This routine returns the status of one of the following specified -asynchronous processing types: "Load", "CreateMosaic", -"DisplaySection", "LoadCatalog", "LoadRegions", "ReprojectData", -"RotateData", "RunAnalysis". -

-A status of "complete" means that the image is fully processed. Other -statuses include: -

    -
  • processing: the image is being processed -
  • loading: the image is in process of loading ("Load" only, for backward compatibility) -
  • error: processing did not complete, due to an error -
  • other: another image is loaded into this display -
  • none: no image is loaded into this display -
-Thus, to check for image load, one can do this in Python: -
-    tfits = "foo.fits"
-    hdul = fits.open(tfits)
-    ...
-    j = JS9()
-    j.Load(hdul, tfits)
-    while j.GetStatus("load", tfits).strip() != "complete":
-        time.sleep(0.1)
-    j.SetZoom(2)
-
- -
Get Load Status
-

-status = JS9.GetLoadStatus(id) -

-where: -

    -
  • id: the id or image handle of the file that was loaded into JS9 -
-returns: -
    -
  • status: status of the load -
-This routine returns the status of the load of this image. -Provided for backward compatibility, it simply calls the more general -JS9.GetStatus() routine with -"Load" as the first argument. -

-A status of "complete" means that the image is fully loaded. Other -statuses include: -

    -
  • loading: the image is in process of loading -
  • error: image did not load due to an error -
  • other: another image is loaded into this display -
  • none: no image is loaded into this display -
-Thus, to check for image load, one can do this in Python: -
-    tfits = "foo.fits"
-    hdul = fits.open(tfits)
-    ...
-    j = JS9()
-    j.Load(hdul, tfits)
-    while j.GetLoadStatus(tfits) != "complete":
-        time.sleep(0.1)
-    j.SetZoom(2)
-
- -


-

Working with Images

- -
Get image handle for the current image
-

-im = JS9.GetImage() -

-returns: -

    -
  • im: image handle -
-

-The routine returns the image handle associated with the current image. -

-The returned image handle can be passed in the display object. This -is marginally more efficient than the default behavior, which is to -determine the current image for each call. - -

Lookup an image by id
-

-im = JS9.LookupImage(id) -

-where: -

    -
  • id: image id -
-

-returns: -

    -
  • im: image handle -
-

-The JS9.LookupImage() routine takes a string id as input and -returns the image handle of the image having that id (or null.) The id -is the same as is found in the File menu list of displayed images. -This routine is similar to the standard -JS9.GetImage() -routine, but returns an image by name, regardless of whether it is -currently being displayed. - -

-You can use this routine, for example, so close an image that is not -currently being displayed. If two images, foo1.fits and foo2.fits, are -loaded into a JS9 display, and foo1.fits is currently being displayed, -you can close foo2.fits this way: -

-    var im = JS9.LookupImage("foo2.fits");
-    if( im ){
-        JS9.CloseImage({display: im});
-    }
-
- -
Get image data and auxiliary info for the specified image
-

-imdata = JS9.GetImageData(dflag) -

-where: -

    -
  • dflag: specifies whether the data should also be returned -
-

-returns: -

    -
  • imdata: image data object -
-

-The image data object contains the following information: -

    -
  • id: the id of the file that was loaded into JS9 -
  • file: the file or URL that was loaded into JS9 -
  • fits: the FITS file associated with this image -
  • source: "fits" if a FITS file was loaded, "img" if PNG or JPEG -
  • imtab: "image" for FITS images and PNG/JPEG files, "table" for FITS binary tables -
  • width: x dimension of image -
  • height: y dimension of image -
  • fwidth: x dimension of image or fully binned table in original file -
  • fheight: y dimension of image or fully binned table in original file -
  • dwidth: width of JS9 display (div element) -
  • dheight: height of JS9 display (div element) -
  • bitpix: FITS bits/pixel of each image element (8 for unsigned char, 16, 32 for signed integer, -32 or -64 for float) -
  • bin: current binning factor -
  • header: JavaScript object containing FITS header values -
  • hdus: JavaScript array containing objects that describe the FITS HDU structure (FITS files only) -
  • data: buffer containing raw data values -
-This call can return raw data for subsequent use in local analysis -tasks. The format of the returned data depends on the exact value -of dflag. If dflag is the boolean value true, an HTML5 -typed array is returned. In JavaScript, typed arrays are more -efficient than ordinary JavaScript arrays, and, in this case, the -returned data is actually just reference to the real JS9 image data -(so be careful about changing values.) -

-If dflag is the string "array", a JavaScript array is returned. -This is not a reference to the real data and will utilize -additional memory, but the values can be manipulated safely. -

-If dflag is the string "base64", a base64-encoded string is -returned. Early on, this seems to be the fastest method of -transferring data via socket.io an external process such as -Python. Currently, the "array" method should generally be used (this -is now the default for the pyjs9 interface to Python.) - -

-The file the path of the FITS file associated with -this image. - -

-The header object contains FITS header keywords. Note that all -HISTORY and COMMENT keywords have two underscores and a numeric value -appended, in order to make them unique within the object. - -

-If you are calling JS9.GetImageData() from an external process (via -the msg protocol), you almost certainly want to set dflag to "array". -Doing so will serialize the data as an array instead of as an object, saving -a considerable amount of transfer data. -

-Given a FITS-standard 1-indexed image pixel x,y, you can find the data value -at that location using: -

-    val = obj.data[Math.floor(y-0.5) * obj.width + Math.floor(x-0.5)];
-
-Note the need to integerize the x and y values: JavaScript arrays are -objects and so floating point array indices do not get truncated -automatically as in C. They will return null values. - -
Get image data for all images loaded into the specified display
-

-imarr = JS9.GetDisplayData() -

-returns: -

    -
  • imdataArr: array of image data objects -
-

-The JS9.GetDisplayData() routine returns an array of image data -objects, one for each images loaded into the specified display. -That is, it returns the same type of information as -JS9.GetImageData(), -but does so for each image associated -with the display, not just the current image. - -

Display an image
-

-JS9.DisplayImage(step) -

-where: -

    -
  • step: starting step to take when displaying the image -
-The display steps are: "colors" (remake color data when cmap has changed), -"scaled" (rescale data values), "primary" (convert scaled data values -to color values), and "display" (write color values to the web page.) -

-The default step is "primary", which displays the image without recalculating -color data, scaled data, etc. This generally is what you want, unless you have -explicitly changed parameter(s) used in a prior step. - -

Re-read the image data and redisplay
-

-JS9.RefreshImage(input, opts) -

-where: -

    -
  • input: object, javascript array, typed array, FITS blob, or string -
  • opts: optional options or function to call when refresh is complete -
-The RefreshImage routine re-reads image data and updates the -the current image. It can be used, for example, in laboratory settings -where data is being gathered in real-time and the JS9 display needs to -be refreshed periodically. The first input argument can be one -of the following: -
    -
  • a text string specifying a new URL to retrieve -
  • a javascript array containing raw image data -
  • a typed array containing raw image data -
  • a blob containing a FITS image file -
  • an object containing a required image property and any of the -following optional properties: -
      -
    • naxis: number of axes in the image -
    • axis: array of image dimensions for each axis or ... -
    • naxis[n]: image dimensions of each axis (naxis1, naxis2, ...) -
    • bitpix: FITS bitpix value -
    • head: object containing header keywords as properties -
    • dmin: data min (optional) -
    • dmax: data max (optional) -
    -
-A text string passed to the input argument is assumed to be a -URL (or local file pathname) to retrieve and utilize when refreshing -the data in the current image. This option is used, for example, where -an external program rewrites the image file, and the new data are then -used to refresh the display. Note that the specified file becomes the -current image file and will be used for subsequent server-based -analysis request as well as refreshImage() calls with a null input -argument (see next paragraph.) -

-If the input argument is null, the current image file is -reloaded, assuming its file path (or URL) is known. For security -reasons, browsers do not expose the path of files loaded via Drag -and Drop or Open Local File. On a local web page, you can -safely use the File -> set this image file's path menu option -to enter the image path here for subsequent reloading (or analysis.) -

-When passing an object as input, the required image -property containing the image data can be a javascript array or a -typed data array. It also can contain a base64-encoded string -containing an array. This latter can be useful when calling -JS9.RefreshImage() via HTTP. -

-Ordinarily, when refreshing an image, there is no need to specify the -optional axis, bitpix, or header properties. But note that you actually -can change these values on the fly, and JS9 will process the new data -correctly. Also, if you do not pass dmin or dmax, they -will be calculated by JS9. -

-Note that you can pass a blob containing a complete FITS image to this -routine. The blob will be passed to the underlying FITS-handler before -being displayed. Thus, processing time is slightly greater than if you just -pass the image data directly. -

-The second optional argument can be an object containing the following: -

    -
  • onrefresh: function to perform when refresh is complete -
-For backwards compatibility, the onrefresh function can be specified directly -by this argument. In both cases, the image handle is passed to the function: -
-    # preferred method
-    JS9.RefreshImage(blob, {onrefresh: xrefresh});
-    # for backwards compatibility
-    JS9.RefreshImage(blob, xrefresh);
-    # both call this function
-    function xrefresh(im){ ... };
-
-

-Advanced use: it is possible to load several images into an instance -of JS9 and then refresh any of them regardless of which image is -currently displayed. To do this, you pass the display property in a -trailing object, with the id of the image to refresh. For example, if -foo1.fits and foo2.fits are loaded and foo2.fits is currently displayed: -

-    # refresh foo2.fits using foo2.fits as the new image
-    JS9.RefreshImage();
-    # refresh foo2.fits using foo3.fits as the new image
-    JS9.RefreshImage("foo3.fits");
-
-    # refresh foo1.fits (even though its not currently displayed)
-    # it will be currently displayed once this operation is complete
-    JS9.RefreshImage({display:"foo1.fits"});
-    # refresh foo1.fits using foo4.fits as the new image
-    JS9.RefreshImage("foo4.fits", {display:"foo1.fits"});
-
-    # warning: this refreshes foo2.fits using foo1.fits as the new image,
-    # rather than refreshing foo1.fits!!
-    JS9.RefreshImage("foo1.fits");
-
-

-The main difference between JS9.RefreshImage() and -JS9.Load() -is that the former updates the data in the currently displayed image, -while the latter adds a completely new image to the display. - -

Extract and display a section of a FITS file
-

-JS9.DisplaySection(opts) -

-where: -

    -
  • opts: object containing section options or "full" -
-This routine allows you to extract and display a section of FITS file. -If the first argument is the text string "full", the full image is -displayed (assuming there is sufficient memory available.) Otherwise -the opts object contains properties specifying how to generate and -display the section: -
    -
  • xcen: x center of the section in file (physical) coords -
  • ycen: y center of the section in file (physical) coords -
  • xdim: x dimension of section to extract before binning -
  • ydim: y dimension of section to extract before binning -
  • bin: floating bin factor or bin directive string -
  • binMode: "a" to average binned pixels, "s" to sum binned pixels -
  • filter: for tables, row/event filter to apply when extracting section -
  • columns: alternate columns for binning a table (def: "X Y") -
  • cubecol: table to cube conversion column (col[:min:max][:bitpix]) -
  • separate: display as a separate image (default is to refresh the current image) -
  • refresh: display as a refreshed image in a different display (default is to refresh the current image) -
  • ondisplaysection: function to perform after section is displayed -
-

-Numeric bin values are floating point numbers. A negative bin value means -1 / abs(bin), i.e. bin value of -4 means to bin at 0.25. The string-valued -bin directives are: -

    -
  • x[n]|X[n]|*[n]: multiply the current bin by n (e.g., "x2") -
  • /[n]: divide the current bin by n (e.g., "/2") -
  • in|In: multiply the current bin by 2 -
  • out|Out: divide the current bin by 2 -
  • [n]a: bin by n, averaging the binned pixels -
  • [n]s: bin by n, summing the binned pixels -
-Note that the JS9.globalOpts.binMode property specifies the -default action for whether the binned pixels are summed together (if -the global binMode is "s") or averaged (if the global binMode is -"a".) This behavior can be overridden by the binMode option or by -last two bin directives listed above. - -

-All properties are optional: if a property is not specified, -the routine will use - -the center of the file, with dimensions and binning -specified by JS9.globalOpts.table and JS9.globalOpts.image objects. - -the image's current settings. This allows you to set up the section once, -and then repeatedly change a property such as the center or filter, -without having to specify the other properties. - -

-For example, if an image has dimensions 4096 x 4096, then specifying: -

    -
  • center: 1024, 1024 -
  • dimensions: 1024, 1024 -
  • bin: 2 -
-will bin the upper left 1024 x 1024 section of the image by 2 to -produce a 512 x 512 image. Subsequent calls to change the center -values will pan the image using the same bin factor and dimension. - -

-Note that setting xcen,ycen to 0,0 will specify the file center. - -

-By default, the new section replaces the data in the currently displayed -image. You can display the section as a separate image in the current display -by supplying an opts object with the separate property -set to true. For example: -

-  JS9.DisplaySection({ ... separate: true});
-
-will display the new section separately from the original file, -allowing blinking, image blending, etc. between the two "files". - -

-You also can display the section as a separate image in a different display by -supplying a string value to the opts.separate property. The string value -takes two forms: -

    -
  • [display]: display the image in the specified JS9 display, using the same image id -
  • [display]:[id]: display the image in the specified JS9 display, using the specified image id -
-For example: -
-  # separate into a new display, same image id
-  JS9.DisplaySection({ ... separate: "myJS9"});
-  # separate into a new display, and with a new image id
-  JS9.DisplaySection({ ... separate: "myJS9:newsection.fits"});
-
-Both of these commands will display the new section "myJS9" display. -The first will retain the original image id, while the second will -use "newsection.fits" as the image id. - -Alternatively, you can display the section by refreshing the image in a -different display by supplying a string value to the opts.refresh -property. Again, the string value takes two forms: -
    -
  • [display]: refresh the image in the specified JS9 display, -using the same image id -
  • [display]:[id]: refresh the image in the specified JS9 -display, using the specified image id -
-For example: -
-  # refresh image in a new display, same image id
-  JS9.DisplaySection({ ... refresh: "myJS9"});
-  # refresh the new display, and change to a new image id
-  JS9.DisplaySection({ ... refresh: "myJS9:newsection.fits"});
-
-If no image is currently loaded in the specified display, the first call -to this routine using the refresh property will create a new -image in that display. Subsequent calls will refresh that image. - -

-Table filtering allows you to select rows from an FITS binary table -(e.g., an X-ray event list) by checking each row against an expression -involving the columns in the table. When a table is filtered, only -valid rows satisfying these expressions are used to make the image. - -

-A filter expression consists of an arithmetic or logical operation -involving one or more column values from a table. Columns can be -compared to other columns or to numeric constants. Standard JavaScript -math functions can be applied to columns. JavaScript (or C) semantics -are used when constructing expressions, with the usual precedence and -associativity rules holding sway: -

-  Operator                                Associativity
-  --------                                -------------
-  ()                                      left to right
-  !  (bitwise not) - (unary minus)        right to left
-  *  /                                    left to right
-  +  -                                    left to right
-  < <= > >=                               left to right
-  == !=                                   left to right
-  &  (bitwise and)                        left to right
-  ^  (bitwise exclusive or)               left to right
-  |  (bitwise inclusive or)               left to right
-  && (logical and)                        left to right
-  || (logical or)                         left to right
-  =                                       right to left
-
-For example, if energy and pha are columns in a table, then the -following are valid expressions: -
-  pha > 1
-  energy == pha
-  pha > 1 && energy ≤ 2
-  max(pha,energy) ≥ 2.5
-
- -

-NB: JS9 uses cfitsio by default (you can, but should not, use the -deprecated fitsy.js), and therefore follows cfitsio filtering -conventions, which are documented -here. - -

-By default, tables are binned into an image using the "X" and "Y" columns. You -can specify different binning columns using the opts.columns property: -

-  JS9.DisplaySection({ ... columns: "DX DY"});
-
- -

-Tables can be converted into 3D cubes by specifying the opts.cubecol -property. The cubecol value should be a string containing the column name and, -optionally, the min and max values and/or the bin size: -

-  # each image in the cube has an width of 100 energy units
-  JS9.DisplaySection({ ... cubecol: "energy:100"});
-  # image cube 3rd dimension is 60 ... each image having a bin width of 100
-  JS9.DisplaySection({ ... cubecol: "energy:1000:7000:100"});
-
-By default, when opts.cubecol is specified, the opts.separate -property is set to true, i.e. a separate image is displayed, leaving the -original intact. -

-Obviously, cube generation will require a considerable amount of -memory since the resulting file is maintained in -the Emscripten -heap. Because browser memory generally is limited, JS9 enforces a -memory limit on the size of the cube, specified by JS9.globalOpts.maxMemory -(and currently set to 2Gb). To avoid exceeding this limit, you usually try -adjusting the xdim, ydim, and/or bitpix values as well as the binsize of the -specified cube column: -

-  # each image utilizes approx 2Mb, so that 400 slices should fit ...
-  JS9.DisplaySection({xdim:1024, ydim:1024, bitpix:16, cubecol:"energy:1000:7000:20"});
-
- -

-Once a cube has been created, you can use the Cube plugin to blink each -image slice. You can also run external analysis on individual slices. - -

Display an extension from a multi-extension FITS file
-

-JS9.DisplayExtension(extid, opts) -

-where: -

    -
  • extid: HDU extension number or the HDU's EXTNAME string or "all" -
  • opts: object containing options -
-This routine allows you to display images and binary tables from -a multi-extension FITS file. The first argument is the 0-indexed HDU -number or the EXTNAME name value of the HDU extension to display. If "all" -is specified, then all 2D image extensions are loaded in order and displayed -as separate images. -

-The optional opts object can contain: -

    -
  • separate: boolean determining whether images are loaded separately -
-If separate is true, the new extension is displayed as a separate image. -Otherwise, the new extension replaces the current display. -

-See the FITS -Primer for more information about HDUs and multi-extension FITS. - -

Display a slice of a FITS data cube
-

-JS9.DisplaySlice(slice, opts) -

-where: -

    -
  • slice: slice description, slice number, or "all" -
  • opts: object containing options -
-This routine allows you to display a 2D slice of a 3D or 4D FITS data -cube, i.e., a FITS image containing 3 or 4 axes. - -

-The slice parameter can either be the numeric value of the -slice in the third (or fourth) image dimension (starting -with 1) or it can be a slice description string: a combination -of asterisks (or commas) and a numeric value defines the slice -axis. Thus, for example, in a 1024 x 1024 x 16 cube, you can display -the sixth slice along the third axis in one of two ways: -

-  JS9.DisplaySlice(6);
-
-or: -
-  # sixth slice along third axis
-  JS9.DisplaySlice("*:*:6");
-  # comma separators also can be used
-  JS9.DisplaySlice("*,*,6");
-
-If the image was organized as 16 x 1024 x 1024, you would use the -string description: -
-  JS9.DisplaySlice("6:*:*");
-
-

-By default, the new slice replaces the data in the currently displayed -image. You can display the slice as a separate image in the current display -by supplying an opts object with the separate property -set to true. For example: -

-  JS9.DisplaySlice("6:*:*", {separate: true});
-
-will display the sixth slice of the first image dimension separately -from the original file, allowing blinking, image blending, etc. between -the two "files". Note that the new id and filename are adjusted to be -the original file's values with the cfitsio image section [6:6:*:*] -appended. -

-If the first argument is "all", then all slices will be loaded into JS9 separately. - -

Blend the image in an image stack using W3C composite/blend modes
-

-JS9.BlendImage(blendMode, opacity) -

-Calling sequences: -

-    JS9.BlendImage()                   # return current blend params
-    JS9.BlendImage(true||false)        # turn on/off blending
-    JS9.BlendImage(mode, opacity)      # set blend mode and/or opacity
-
-

-where: -

    -
  • mode: one of the W3C bend modes -
  • opacity: the opacity of the blended image (percent from 0 to 1) -
-Image processing programs such as Adobe Photoshop and Gimp allow you to blend -a stack of images together by mixing the RGB colors. The W3C has defined a -number of composite and blending modes which have been implemented by Firefox, Chrome, and Safari (what about Edge?): -
    -
  • normal -
  • multiply -
  • screen -
  • overlay -
  • darken -
  • lighten -
  • color-dodge -
  • color-burn -
  • hard-light -
  • soft-light -
  • difference -
  • exclusion -
  • hue -
  • saturation -
  • color -
  • luminosity -
-In addition, the following Porter-Duff compositing modes are available -(though its unclear how useful they are in JS9 image processing): -
    -
  • clear -
  • copy -
  • source-over -
  • destination-over -
  • source-in -
  • destination-in -
  • source-out -
  • destination-out -
  • source-atop -
  • destination-atop -
  • xor -
  • lighter -
-Blending and compositing modes are described in detail in this W3C candidate recommendation -and in this Mozilla document. - -

-JS9 allows you to use these modes to blend images together. If you load two -images of the same object into JS9, you can use the -JS9.ReprojectData() -routine to align them by WCS. You then can blend one image into the other by -specifying a blend mode and an optional opacity. For example, if chandra.fits -and spitzer.fits are two aligned images of the same object, and chandra.fits is -currently being displayed, you can blend spitzer into chandra using -the "screen" blend and opacity 0.9 mode this way: -

-    JS9.BlendImage("screen", 0.9);
-
-After the spitzer image is blended, both images will be displayed as -part of the chandra.fits display. However, changing the colormap, -scale, contrast, or bias will only affect the current chandra image, -not the blended spitzer part. In this way, you can continue to -manipulate the current image and the image blending will update automatically. - -

-Also note that the spitzer image is still available separately for -display and manipulation. You can switch to displaying spitzer and -change colormap, scale, bias, contrast, etc. But since the images are -now blended, changes to spitzer will be reflected in the spitzer part -of the blended chandra display. Thus, if you change the colormap on -the display of spitzer, and change back to chandra, the blended -chandra image will utilize the new colormap. - -

-This linkage is maintained during zoom and pan operations. If you -display the blended chandra image and then zoom or pan it, both images -will be updated correctly to maintain alignment. But note that this -means when you go back to the spitzer display, its zoom and/or pan -values will have been updated. In this way, the spitzer image always -is correctly linked to the blended version. - -The JS9.BlendImage() call accepts a variable number of -arguments to perform a variety of functions: -

    -
  • JS9.BlendImage() returns an object containing the following properties: -
      -
    • active: boolean specifying whether this image is to be blended -
    • mode: string specifying the blend mode -
    • opacity: opacity value (0 to 1) -
    -
  • JS9.BlendImage() returns a blend object for the current image -
  • JS9.BlendImage(true||false) turns on/off blending of -
  • JS9.BlendImage(blend, opacity) set or modify the blend mode and/or opacity -
-Other actions will be added as we gain experience with blending operations - -
Set the global image blend more for the specified display
-

-mode = JS9.BlendDisplay(true|false) -

-returns: -

    -
  • mode: current blend mode -
-This routine will turn on/off the global image blend mode for the specified -display. If no argument is specified, it returns the current blend mode. -

-If the first argument is "reset", the blend mode for all images in -this display will be set to false, along with the display's blend -mode. This is useful if you have loaded/blended a number of images, and -want to load/blend another set of images. -

-If the first argument is "list", an array is returned containing the image -id's of all images that have blend mode turned on for this display. This is -useful for changing the blend modes of all active images at once. - -

Synchronize operations between two or more images
-

-JS9.SyncImages(ops, images, opts) -

-Calling sequences: -

-    JS9.SyncImages([ops], [images], [opts])  # set up synchronization
-    JS9.SyncImages(true||false)              # turn on/off synchronization
-
-

-where: -

    -
  • ops: operation or array of operations on which to sync -
  • images: image or array of images to sync with this image -
  • opts: options for sync'ing -
-Synchronize two or more images, so that when an operation is performed -on one image, it also is performed on the other(s). For example, when -the colormap or scale is changed on an image, it also is changed on -the sync'ed images. Or, when a region is created, moved, resized, or -removed on an image, the same happens on the sync'ed images. - -

-When the JS9.SyncImages() call is invoked, the current image is -configured to synchronize the specified images. In addition, if -the reciprocate property is set in the opts object (see below), -the other images are also configured to synchronize one another (as -well as the current image.) Once configuration is complete, a sync -command is executed immediately. If the current image already -displays one or more regions, these will be created in the target images. - -

-The operations that can be specified for sync'ing are: "alignment", -"colormap", "contrastbias" (i.e., both "contrast" and "bias"), "flip", -"pan", "regions", "rot90", "rotate", "scale", "wcs" (i.e., both -"wcssys" and "wcsunits"), and "zoom". If no array is specified, the -default array in JS9.globalOpts.syncOps is used. - -

-Regions calls the -JS9.CopyRegions() routine. -Alignment calls -JS9.AlignPanZoom() in order to -keep the pixel size and displayed center position constant between the -sync'ed images. It assumes no rotation between the two images. - -

-Images to synchronize can be specified singly or as an array of image -handles or image ids. If no array is specified, all currently -displayed images are sync'ed. - -

-The optional opts object can contain: -

    -
  • reverse: boolean to reverse this image and target images (def: false) -
  • reciprocate: boolean determining whether images sync one another -
  • syncwcs: use WCS header params to sync (e.g., pan), where available - -
-If the opts object is not specified, the default values of -reciprocate and syncwcs are the values of the -JS9.globalOpts.syncReciprocate and JS9.globalOpts.syncWCS, -respectively. - -

-Examples: -

-    # the current image will sync all operations for all images
-    # this will happen reciprocally, so that changing any image syncs the others
-    JS9.SyncImages()
-
-    # the current image will sync the specified ops for foo1.fits, foo2.fits:
-    JS9.SyncImages(["scale", "colormap"], ["foo1.fits", "foo2.fits"])
-
-    # the current image will sync two images with default ops,
-    # but the two images themselves will not sync images reciprocally
-    JS9.SyncImages(null, ["foo1.fits", "foo2.fits"], {reciprocate: false});
-
- -

-Note that if the pan operation syncs two images having differently -sized fields of view, the smaller image will stop panning when it -reaches its edge, rather than displaying a blank field. - -

-You can turn on/off syncing for a given image by specifying a single boolean -argument: -

-    # turn off sync'ing temporarily
-    JS9.SyncImages(false);
-
-This is different from unsync'ing in that you can turn sync'ing back on without -having to re-sync the images. - -
Unsynchronize two or more previously synchronized images
-

-JS9.UnsyncImages(ops, images, opts) -

-Calling sequence: -

-    JS9.UnsyncImages([ops], [images], [opts])  # clear synchronization
-
-

-where: -

    -
  • ops: array of operations to unsync -
  • images: array of images to unsync with this image -
  • opts: options for unsync'ing -
-Unsynchronize previously sync'ed images. - -

-The operations that can be specified for unsync'ing are: -"alignment", "colormap", "contrastbias" (i.e., both "contrast" and "bias"), -"flip", "pan", "regions", "rot90", "rotate", "scale", "wcs" (i.e., both "wcssys" and -"wcsunits"), and "zoom". -If no array is specified, the default array in JS9.globalOpts.syncOps is -used. Thus, you can turn off sync'ing for specified operations, while leaving -others to be sync'ed. - -

-Images to be unsync'ed can be specified as an array of image handles or -image ids. If no array is specified, all currently displayed images -are unsync'ed. - -

-The optional opts object can contain: -

    -
  • reciprocate: boolean determining whether images sync one another -
  • reverse: boolean to reverse this image and target images (def: false) -
-If the opts object is not specified, the default is to reciprocate based -on the value of the JS9.globalOpts.syncReciprocate property. - -

-Examples: -

-    # this image will no longer sync on scale for foo1.fits and foo2.fits,
-    # and they also will stop sync'ing
-    JS9.UnsyncImages(["scale"], ["foo1.fits", "foo2.fits"])
-
-    # this image will still sync foo1.fits and foo2.fits, but
-    # foo1.fits and foo2.fits will no longer sync this image:
-    JS9.UnsyncImages(null, ["foo1.fits", "foo2.fits"], {reverse: true, reciprocal: false})
-
- -
Mask an image using values in another image
-

-JS9.MaskImage(image, opts) -

-Calling sequences: -

-    JS9.MaskImage()                   # return current mask params
-    JS9.MaskImage(true||false)        # turn on/off masking
-    JS9.MaskImage(image, opts)        # set mask and optionally, its params
-    JS9.MaskImage(opts)               # set mask params
-
-

-where: -

    -
  • image: image handle or image id to use as a mask -
  • opts: optional mask properties -
-and where the mask properties are: -
    -
  • mode: "mask", "opacity", or "overlay" -
  • value: mask value that triggers masking (def: 0) for "mask" mode -
  • invert: whether to invert the mask (def: false) for "mask" mode -
  • sync: true or false for "overlay" mode -
  • opacity: opacity to use when masking (def: 0, range 0 to 1) -for "mask" and "overlay" mode -
-

-The pixel values in one image can be used to mask the pixels in -another image if the two images have the same image dimensions. -The type of masking depends on the mode: "overlay" (default) or "mask". -

-For "mask" mode, if the value of a pixel in the mask is less than or -equal to the value property, the opacity of the displayed pixel -is set to the opacity property. You can also invert the mask -using the invert property. In effect, this mode displays only -the image pixels "covered" by a mask. -

-For "opacity" mode, each image pixel is assigned an opacity equal to the -value of the mask pixel (whose values are assumed to range from 0 to 1.) -

-For "overlay" mode, if the mask pixel has a non-zero alpha, its color -is blended with the image pixel using source-atop -composition. Otherwise, the image pixel color alone is used in the -display. This is one way you can display a mask overlay on top of an -image. A static colormap is usually used in conjunction with an -overlay mask, since pixel values not explicitly assigned a color are -transparent. Note that, when blending a mask and image pixel, the -global mask opacity and the individual pixel opacity are multiplied to -get the final pixel opacity. If "sync" is not explicitly false, this -mode will call JS9.SyncImages() -to keep the mask and image file in sync. The maskOpts property sync -contains the array of operations to sync. -

-To set up a mask initially, call the routine with an already-loaded -mask image as the first parameter, and an optional opts object as the -second parameter: -

-    # default is "overlay"
-    JS9.ImageMask("casa_mask.fits");
-    JS9.ImageMask("casa_mask.fits", {mode: "overlay"});
-
-    # "mask" mode: set lower threshold for masking and masked opacity
-    JS9.ImageMask("casa_mask.fits", {mode: "mask", value: 5, opacity: 0.2});
-
-You can change the mask parameters at any time: -
-    JS9.ImageMask({value: 2, opacity: 0});
-
-or temporarily turn off and on the mask: -
-    JS9.ImageMask(false);
-    ...
-    JS9.ImageMask(true);
-
- -
Clear the image from the display and mark resources for release
-

-JS9.CloseImage(opts) -

-where: -

    -
  • opts: optional object or JSON string containing image parameters -
-

-

-Each loaded image claims a non-trivial amount of memory from a finite -amount of browser heap space. For example, the default 32-bit version -of Google Chrome has a memory limit of approximately 500Mb. If you are -finished viewing an image, closing it tells the browser that the -image's memory can be freed. In principle, this is can help reduce -overall memory usage as successive images are loaded and -discarded. Note, however, that closing an image only provides a hint -to the browser, since this sort of garbage collection is not directly -accessible to JavaScript programming and happens when it happens. -

-The optional first argument is an opts object (or a JSON-formatted -string) containing: -

    -
  • clear: if explicitly set to false, the image will not be cleared -
-The clear option is useful if you are repeatedly loading the same image -and want to avoid the image blink associated with the clear. - -
Get the image colormap
-

-cmap = JS9.GetColormap() -

-returns: -

    -
  • cmap: object containing colormap information -
-The returned cmap object will contain the following properties: -
    -
  • colormap: colormap name -
  • contrast: contrast value (range: 0 to 10) -
  • bias: bias value (range 0 to 1) -
- -
Set the image colormap
-

-JS9.SetColormap(colormap, [contrast, bias]) -Calling sequences: -

-    JS9.SetColormap(colormap)
-    JS9.SetColormap(colormap, contrast, bias)
-    JS9.SetColormap(colormap, staticOpts)
-    JS9.SetColormap(contrast, bias)
-    JS9.SetColormap(staticOpts)
-
-

-where: -

    -
  • colormap: colormap name -
  • contrast: contrast value (range: 0 to 10) -
  • bias: bias value (range 0 to 1) -
  • staticOpts: static colormap opts -
-Set the current colormap, contrast/bias, or both. This call takes one -(colormap), two (contrast, bias) or three (colormap, contrast, bias) -arguments. It also takes the following single arguments: -
    -
  • rgb: toggle RGB mode -
  • invert: toggle inversion of the colormap -
  • overlay: toggle image overlay mode (PNG and JPEG files only) -
  • reset: reset contrast, bias, and invert values -
  • staticOpts: opts for a static colormap -
-The staticOpts argument is an array of parameters to change in a static -colormap. Each parameter can take one of two forms: -
    -
  • [color, min, max] -
  • [color, opacity|alpha] -
  • [color, true|false] -
-The color parameter must match one of the colors specified when the -static colormap was created. The min and max properties replace -the originally specified min and max values. Specifying a number between 0 -and 1 (inclusive) will change the opacity, while specifying a number greater -than 1 will change the alpha (i.e., opacity * 255.) Specifying true or -false will set or unset the active flag for that color, i.e. -it will turn on or off use of that color. When turned off, the pixels in that -range will be transparent. For example: -
-  SetColormap([["red", 0.5], ["green", true], ["blue", false]]);
-
-sets the opacity of red pixels to 0.5, turns on the green pixels, and turns -off the blue pixels in the currently active static colormap. -

-Finally, note that PNG and JPEG images have a "private" colormap -associated with them, which is an approximation of the original colors -used in these images. You can set this colormap by specifying -"private": -

-  SetColormap("private");
-
-This private colormap is static: you cannot change contrast and -bias. It also cannot be modified using staticOpts because there is -no color string value associated with each entry in the colormap. - -
Save colormap(s)
-

-JS9.SaveColormap(fname, cmapArray) -

-Calling sequences: -

-    JS9.SaveColormap()                 # save current colormap to "js9.cmap"
-    JS9.SaveColormap(fname)            # save current colormap to fname
-    JS9.SaveColormap(cmapArray)        # save array of colormaps to "js9.cmap"
-    JS9.SaveColormap(fname, cmapArray) # save array of colormaps to fname
-
-

-where: -

    -
  • fname: output file name -
  • cmapArray: optional array of colormap names to save -
-As shown by the calling sequences above, you can use this routine to -save either the current colormap or a list of colormaps taken from the -specified array. You also can choose to save to a particular filename -or the default "js9.cmap": -
-  # save the current colormap in js9.cmap
-  JS9.SaveColormap()
-  # save the current colormap in foo.cmap
-  JS9.SaveColormap("foo.cmap")
-  # save the foo1 and foo2 colormaps in js9.cmap
-  JS9.SaveColormap(["foo1", "foo2"])
-  # save the user-defined foo1 and foo2 colormaps in foo.cmap
-  JS9.SaveColormap("foo.cmap", ["foo1", "foo2"])
-
-

-The colormaps are saved in JSON format. Multiple saved colormaps will -be stored in a JSON array, while a single saved colormap will be saved -at the top level. -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. -

- -
Add a colormap to JS9
-

-JS9.AddColormap(name, aa|rr,gg,bb|ss|obj|json, opts) -

-where: -

    -
  • name: colormap name -
  • aa: an array containing RGB color triplets -
  • rr,gg,bb: 3 arrays of vertices specifying color changes -
  • ss: an array static color assignments -
  • obj: object containing one of the three colormap definition formats -
  • json: JSON string containing one of the colormap definition formats -
  • opts: optional object to set toplevel property to false -
-You can add new colormaps to JS9 using one of three formats. The first -is an array of RGB triplets (i.e., an array of 3-D arrays), where each -triplet defines a color. The elements of the colormap are divided -evenly between these 3-D triplets. For example, the i8 -colormap is defined as: -
-    JS9.AddColormap("i8", [[0,0,0], [0,1,0], [0,0,1], [0,1,1], [1,0,0], [1,1,0], [1,0,1], [1,1,1]]));
-
-Here, the colormap is divided into 8 sections having the following -colors: black, green, blue, cyan (green + blue), red, yellow (red + -green), purple (red + blue), and white. A colormap such as sls -also utilizes an array of RGB triplets, but it has 200 entries, -leading to much more gradual transitions between colors. -

-The second colormap format consists three arrays of vertices defining -the change in intensity of red, green, and blue, respectively. For -each of these three color triplets, the first coordinate of each -vertex is the x-distance along the colormap axis (scaled from 0 to 1) -and the second coordinate is the y-intensity of the color. Colors are -interpolated between the vertices. For example, consider the following: -

-    JS9.AddColormap("red", [[0,0],[1,1]], [[0,0], [0,0]], [[0,0],[0,0]]);
-    JS9.AddColormap("blue", [[0,0],[0,0]], [[0,0], [0,0]], [[0,0],[1,1]]);
-    JS9.AddColormap("purple", [[0,0],[1,1]], [[0,0], [0,0]], [[0,0],[1,1]]);
-
-In the red (blue) colormap, the red (blue) array contains two -vertices, whose color ranges from no intensity (0) to full intensity -(1) over the whole range of the colormap (0 to 1.) The same holds true -for the purple colormap, except that both red and blue change from zero -to full intensity. -

-The third colormap format consists of an array of color and pixel range -specifications: color, min, max. This defines a static colormap in which -colors are assigned based on whether an image pixel is within a range. -For example: -

-  JS9.AddColormap("mask",
-                  [["#ff000080", 1, 31],
-		   ["cyan", 32, 32],
-		   ["rgba(0,255,0,0.5)", 37, 99],
-		   ["blue", 100, Infinity]]);
-
-Image pixel values between 1 and 31 (inclusive) are assigned a -red color (#ff0000) with an opacity of approximately 0.5. The image -pixel value 32 is assigned the color cyan. Image pixel values between -37 and 99 are assigned the color green with opacity 0.5. All image -pixel values greater than or equal to 100 are blue. (You can also specify -the string "Infinity".) If an image pixel value is not within any -range, it is assigned the color specified -by JS9.imageOpts.nocolor. By default, this is black with an -opacity of 0, so nothing is displayed at all (you'll probably see the -default grey background of the JS9 display element.) Static colormaps -are mostly used as image masks. See -JS9.MaskImage() for more information. - -

-Note the different ways in which colors can be specified: more information -about accepted color formats is available on the -TinyColor -website. - - -

-For a more complicated example, consider the a colormap, which is -defined as: -

-    JS9.AddColormap("a",
-      [[0,0], [0.25,0], [0.5,1], [1,1]],
-      [[0,0], [0.25,1], [0.5,0], [0.77,0], [1,1]],
-      [[0,0], [0.125,0], [0.5, 1], [0.64,0.5], [0.77, 0], [1,0]]);
-
-Here we see that red is absent for the first quarter of the colormap, -then gradually increases to full intensity by the half mark, after -which it stays at full intensity to the end. Green ramps up to full -intensity in the first quarter, then drops to zero by the half and -stays that way until a bit more than three-quarters along, after which -it gradually increases again. Blue starts off at no intensity for an -eighth, then gradually increases to full intensity by the half-way -mark, decreasing gradually to zero by the three-quarter mark. The -result is that you see, for example, green at the beginning and yellow -(red + green) at the end, with some purple (red + blue) in the middle -of the colormap. -

-As a convenience, you also can pass an object or JSON string containing the -colormap definition: -

-    # RGB color triplets for the I8 colormap in a "colors" property
-    {"name":"i8","colors":[[0,0,0],[0,1,0],[0,0,1],[0,1,1],[1,0,0],[1,1,0],[1,0,1],[1,1,1]]}
-
-    # all 3 vertex arrays for the purple colormap in one "vertices" property
-    {"name":"purple","vertices":[[[0,0],[1,1]],[[0,0],[0,0]],[[0,0],[1,1]]]}
-
-

-The colormap will be added to the toplevel of the Colormap -menu, unless you pass a final opts argument that sets -the toplevel property to false: -

-  JS9.AddColormap("cyan", [[0,0],[0,0]], [[0,0],[1,1]], [[0,0],[1,1]], {toplevel:false});
-
-Finally, note that JS9.AddColormap() adds its new colormap to -all JS9 displays on the given page. - -
Load a colormap file into JS9
-

-JS9.LoadColormap(filename, opts) -

-where: -

    -
  • filename: input file name or URL -
  • opts: optional object to set toplevel property to false -
-Load the specified colormap file into the web page. The filename, -which must be specified, can be a local file (with absolute path or a -path relative to the displayed web page) or a URL. It should contain a -JSON representation of a colormap (or an array of colormaps), either -in RGB color format or in vertex format (see -JS9.AddColormap() -above): -
-    # RGB color format
-    {
-      "name": "purplish",
-      "colors": [
-	[0.196, 0.196, 0.196],
-	[0.475, 0, 0.608],
-	[0, 0, 0.785],
-	[0.373, 0.655, 0.925],
-	[0, 0.596, 0],
-	[0, 0.965, 0],
-	[1, 1, 0],
-	[1, 0.694, 0],
-	[1, 0, 0]
-      ]
-    }
-
-    # vertex format
-    {
-      "name": "aips0",
-      "vertices": [
-	[
-	    [0.203, 0],
-	    [0.236, 0.245],
-	    [0.282, 0.5],
-	    [0.342, 0.706],
-	    [0.411, 0.882],
-	    [0.497, 1]
-	],
-	[
-	    [0.394, 0],
-	    [0.411, 0.196],
-	    [0.464, 0.48],
-	    [0.526, 0.696],
-	    [0.593, 0.882],
-	    [0.673, 1],
-	    [0.94, 1],
-	    [0.94, 0]
-	],
-	[
-	    [0.091, 0],
-	    [0.091, 0.373],
-	    [0.262, 1],
-	    [0.94, 1],
-	    [0.94, 0]
-	]
-      ]
-    }
-
- -

-The colormap will be added to the toplevel of the Colormap -menu, unless you pass a final opts argument that sets -the toplevel property to false: -

-  JS9.LoadColormap("secondary.cmap", {toplevel:false});
-
-As with -JS9.AddColormap(), -the new colormap will be available in all displays. - -
Get RGB Mode for this display
-

-JS9.GetRGBMode() -

-returns: -

    -
  • obj: object containing RGB mode information -
-The returned object will contain the following properties: -
    -
  • active: boolean specifying whether RGB mode is active -
  • rid: image id of "red" image -
  • gid: image id of "green" image -
  • bid: image id of "blue" image -
- -
Set RGB Mode for this display
-

-JS9.SetRGBMode(mode, [imobj]) -

-where: -

    -
  • mode: boolean true to activate RGB mode, false to disable -
  • imobj: optional object specifying three images to set to the -"red", "green", and "blue" colormaps -
-In RGB mode, three images assigned the "red", "green", and "blue" -colormaps are displayed as a single image. The RGB color of each -displayed pixel is a combination of the "red", "green", and "blue" -pixel value taken from the appropriate image. Note that all three -images are not required: you can display an RGB image using two of -the three colors simply by not assigning the third colormap. - -

-The JS9.SetRGBMode() call turns on or off RGB mode. The -boolean mode argument specifies whether to activate or -de-activate RGB mode. The optional imobj object specifies -(already-loaded) images to assign to the three colormaps: -

    -
  • rid: image id (or handle) to set to the "red" colormap -
  • gid: image id (or handle) to set to the "green" colormap -
  • bid: image id (or handle) to set to the "blue" colormap -
-If imobj is not specified, it is assumed that images have been -assigned the "red", "green", and "blue" colormaps by another means. -(Once again, it is not necessary to assign all three colormaps.) -

-If no arguments are specified, the current RGB mode is toggled; - -

Get the image scale
-

-scale = JS9.GetScale() -

-returns: -

    -
  • scale: object containing scale information -
-The returned scale object will contain the following properties: -
    -
  • scale: scale name -
  • scalemin: min value for scaling -
  • scalemax: max value for scaling -
- -
Get the image opacity
-

-opacity = JS9.GetOpacity() -

-returns: -

    -
  • opacity: object containing opacity information -
-The returned opacity object will contain the following properties: -
    -
  • opacity: opacity value assigned to image pixels -
  • flooropacity: opacity assigned when the image pixel value is less than or equal to the floor value (if defined) -
  • floorvalue: floor value to test image pixel values against (if defined) -
- -
Set the image opacity
-

-JS9.SetOpacity(opacity, floorvalue, flooropacity) -

-calling sequences: -

-    JS9.SetOpacity(opacity)      # set def opacity for all image pixels
-    JS9.SetOpacity(floorvalue, flooropacity) # pixels <= floorvalue get flooropacity
-    JS9.SetOpacity(opacity, floorvalue, flooropacity)  # set def and floor opacity
-    JS9.SetOpacity("reset")      # reset def opacity to 1
-    JS9.SetOpacity("resetfloor") # remove opacity floor
-    JS9.SetOpacity("resetall")   # reset def opacity to 1, remove floor opacity
-
-

-where: -

    -
  • opacity: opacity value for image pixels -
  • floorvalue: floor value to test image pixel values against -
  • flooropacity: floor opacity value to set if image pixel value is less than or equal to the floor opacity value -
-Set the current opacity, floor opacity, or both. This call takes one -(opacity), two (floorvalue, flooropacity) or three (opacity, floorvalue, flooropacity) arguments. -

-The floor value & opacity option allows you to set the opacity -for pixels whose image value is less then or equal to a specified -floor value. It takes two arguments: the floor pixel value to check, -and the floor opacity to apply. For example, when both arguments are 0, -pixels whose image values are less than or equal to 0 -will be transparent. Specifying 5 and 0.5, respectively, means that -pixels whose image values less than or equal to 5 will have an opacity -of 0.5. A useful case is to make the pixels transparent at a -given value, allowing features of one image to be blended into -another, without blending extraneous pixels. -

-The various reset options allow you to reset the default value, -floor values, or both. - -

Set the image scale
-

-JS9.SetScale(scale, smin, smax) -

-where: -

    -
  • scale: scale name, "zscale", "zmax", or "dataminmax" -
  • smin: scale min value -
  • smax: scale max value -
-Set the current scale, min/max, or both. This call takes one -(scale), two (smin, max) or three (scale, smin, smax) arguments. (If "zscale" -or "zmax" is specified, any supplied smin and smax values are ignored.) - -
Get the image zoom factor
-

-zoom = JS9.GetZoom() -

-returns: -

    -
  • zoom: floating point zoom factor -
-Get the zoom factor. - -
Set the image zoom factor
-

-JS9.SetZoom(zoom) -

-where: -

    -
  • zoom: floating or integer zoom factor or zoom directive string -
-The zoom directives are: -
    -
  • x[n]|X[n]|*[n]: multiply the current zoom by n (e.g., "x2") -
  • /[n]: divide the current zoom by n (e.g., "/2") -
  • in|In: multiply the current zoom by 2 -
  • out|Out: divide the current zoom by 2 -
  • toFit|ToFit: zoom to fit image in display -
- -
Get the image pan position
-

-ipos = JS9.GetPan() -

-returns: -

    -
  • ipos: object containing image information for pan -
-The returned ipos object will contain the following properties: -
    -
  • x: calculated (from section) x image coordinate of center -
  • y: calculated (from section) y image coordinate of center -
  • ox: original (input) x image coordinate of center -
  • oy: original (input) y image coordinate of center -
  • x0: x start of image section -
  • y0: y start of image section -
  • x1: x end of image section -
  • y1: y end of image section -
  • ix: x offset of center from center of display -
  • iy: y offset of center from center of display -
-Note that the x and y values are the center of the image section, which might -be different from the input x and y values passed -JS9.SetPan(). The latter are returned as ox -and oy. The image section parameters are also returned. Finally, the -ix and iy values will be non-zero in cases of unconstrained, -off-centered panning. - -
Set the image pan position
-

-JS9.SetPan(x, y) -

-where: -

    -
  • x: x image coordinate (or an object containing a position) -
  • y: y image coordinate -
-

-Set the current pan position using image coordinates. Note that you can use -JS9.WCSToPix() -and -JS9.PixToWCS() -to convert between image and WCS coordinates. -

-An object can also be supplied with a position specified in image, -physical, or WCS coordinates: -
    -
  • x: image x position -
  • y: image y position -
  • px: physical x position -
  • py: physical y position -
  • ra: RA in degrees -
  • dec: Dec in degrees -
  • wcs: sexagesimal WCS string with optional WCS system -
-For example: -
-    JS9.SetPan({wcs: "23:23:28.895 +58:49:43.50 ICRS"});
-
-will set the pan position to the specified RA and Dec using the ICRS -system. Note that the WCS string above is returned by the Edit -menu's "copy wcs pos" option (i.e., the "/" keystroke.) - -

-Finally, if you pass the string "mouse" as the sole argument, the -image is panned to the current mouse position. This is especially useful -in conjunction with keyboard shortcuts (where currently the "m" key uses this -routine to pan to the current mouse position.) - -

-By default, panning is unconstrained: you can pan the image so that -some (or even all) of the display does not contain image data (e.g., -if you pan an image to point 0,0, the image origin will be the -center of the display and only the upper right quadrant will contain -data.) If you want to avoid blank areas in the display, set the -JS9.globalOpts.panWithinDisplay property to true. Site authors -can change this property in js9prefs.js, while users can change -this via the Global tab of the Preferences plugin. - -

Align pan and zoom of the current image to a target image
-

-JS9.AlignPanZoom(im, opts) -

-where: -

    -
  • im: target image containing the WCS used to perform the alignment -
  • opts: optional object -
-

-This routine changes the pan and zoom of the current image to match a -target image. By default, it is assumed that both have WCS info -available. The image is panned to the RA, Dec at the center of the -target image's display. The zoom is also matched. The pixel size (as -specified by the FITS CDELT1 parameter) will be taken into account -when zooming, but not the image rotation or flip. This routine is -faster than -JS9.ReprojectData() -for aligning reasonably similar images. - -

-For specialized needs, you can set the syncwcs property to false in -the opts object so that WCS will not be used in the alignment. Instead, -the image will be panned to the target's current center (in image coordinates) -and the image zoom will be set to the target's zoom. Obviously, this assumes -identical image dimensions and pixel sizes. It can be useful when working with -lab data and simulations. - -

-No attempt is make to keep the images aligned after the call. This -allows you to make adjustments to the current and/or target images and -then re-align as needed. - -

Flip an image around the x or y axis
-

-JS9.SetFlip(flip) -

-where: -

    -
  • flip: "x", "y" -
-Flip an image around the specified axis. Flipping is relative to the -current state of the display, so flipping by x twice will return you -to the original orientation. -

-Since this operation is applied to the entire display canvas instead -of the image, image parameters such as the WCS are not affected. - -

Get flip state of an image
-

-flip = JS9.GetFlip() -

-returns: -

    -
  • flip: the current flip state -
-Possible returned flip states are: "x", "y", "xy", or "none". -The state is normalized, so that, for example, two "x" flips are -replaced by "none". - -
Rotate an image by a specified number of degrees
-

-JS9.SetRotate(rot) -

-where: -

    -
  • rot: rotation in degrees -
-Set the rotation of an image to the specified number of degrees. The -rotation is performed in terms of an absolute angle: if you rotate by -20 degrees and then do it again, there is no change. Also, setting the -rotation to 0 sets the angle to 0. -

-In the rotation argument is the string "north" or "northisup", the -rotation angle is calculated so that north is up in the current -coordinate system. -

-Since this operation is applied to the entire display canvas instead -of the image, image parameters such as the WCS are not affected. - -

Get rotate state of an image
-

-rot = JS9.GetRotate() -

-returns: -

    -
  • rot: current rotation value for this image -
-Return the current rotation. - -
Rotate an image by +/- 90 degrees
-

-JS9.SetRot90(rot90) -

-where: -

    -
  • rot90: a multiple of 90 degrees (+/-90) -
-Rotate an image by a multiple of 90 degrees. Rot90 rotations are -relative to the current state of the display, so four rotations will -return you to the original orientation. -

-Since this operation is applied to the entire display canvas instead -of the image, image parameters such as the WCS are not affected. - -

Get rotate state of an image
-

-rot = JS9.GetRot90() -

-returns: -

    -
  • rot: current rotation value for this image -
-The returned rotation value will be a multiple of 90, depending on how -many rotations have been executed and in which direction. - -
Get an image parameter value
-

-val = JS9.GetParam(param) -

-where: -

    -
  • param: name of the parameter or "all" -
-

-returns: -

    -
  • val: value of the parameter -
- -

-Return the value of an image parameter. The available parameters are listed -below in the -JS9.SetParam() -section. -

-In the value of param is "all", the entire param object is returned. - -
Set an image parameter value
-

-ovalue = JS9.SetParam(param, value) -

-where: -

    -
  • param: name of the parameter or "all" -
  • val: new value of the parameter or param object to merge -
-

-returns: -

    -
  • ovalue: the previous value of the parameter or the new param object -
-A number of miscellaneous image parameters are copied from the -JS9.imageOpts object to each image when it is first loaded. You can -use the JS9.SetParam() routine to modify these values -subsequently. The available parameters and their current default -values are listed below: -
    -
  • exp: 1000, default exp value for scaling -
  • disable: which core services to disable for this image -
  • listonchange: false, list regions after a region change? -
  • opacity: 1.0, image display opacity, between 0 and 1 -
  • overlay: whether PNG/JPEG display the image instead of using cmaps -
  • nancolor: "#000000", 6-digit #hex color for NaN values -
  • valpos: true, display value/position? -
  • wcsalign: true, align image using WCS after reproj? -
  • xeqonchange: true, xeq an onchange callback after a region change? -
  • zscalecontrast: 0.25, default zscale value from ds9 -
  • zscalesamples: 600, default zscale value from ds9 -
  • zscaleline: 120, default zscale value from ds9 -
-

-In addition, you can set the internal values associated with core functionality -("colormap", "pan", "regions", "scale", "wcs", or "zoom") and the -corresponding core function will be called. The core parameters that can be -set in this way are: -

    -
  • colormap: calls JS9.SetColormap() -
  • contrast: calls JS9.SetColormap() -
  • bias: calls JS9.SetColormap() -
  • flip: calls JS9.SetFlip() -
  • rot90: calls JS9.SetRot90() -
  • rot: calls JS9.SetRotate() -
  • scale: calls JS9.SetScale() -
  • scalemin: calls JS9.SetScale() -
  • scalemax: calls JS9.SetScale() -
  • scaleclipping: calls JS9.SetScale() -
  • wcssys: calls JS9.SetWCSSys() -
  • wcsunits: calls JS9.SetWCSUnits() -
  • zoom: calls JS9.SetZoom() -
-

-The routine returns the previous value of the parameter, which can -be useful when temporarily turning off a function. For example: -

-    oval = JS9.SetParam("xeqonchange", false);
-    .... processing ...
-    JS9.SetParam("xeqonchange", oval);
-
-will temporarily disable execution of the previously defined regions -onload callback, resetting it to the old value after processing -is complete. -

-If param is "all" and the second argument is an object, this object is -merged into the current param object. This allows you to save the params from -one image and restore them to another. If the object contains internal -core parameters (see above), the corresponding core function will be called. -

-If param is "disable", the specified value (or array of values) is -added to the disable array for this image, thereby disabling -core functionality. The resulting disable array is -returned. Thus, for example: -

-    JS9.SetParam("disable", ["zoom", "pan"]);
-
-will disable zoom and pan functionality for this image. Note that -disabling regions means that you cannot create new regions, -but you can still change and even remove existing regions. -

-If param is "enable", the specified value (or array of values) is -removed to the disable array for this image, thereby enabling core -functionality. The resulting disable array is returned. - -

Copy image parameter(s) to one or more images
-

-JS9.CopyParams(param, image, opts) -

-where: -

    -
  • param: name of the parameter or array or parameters to copy -
  • image: target image or array of image to copy to -
  • opts: optional object -
-

-Copy parameters from the current image to one or more images. Any -image parameter can be copied, but the most common ones are: -"alignment", "colormap", "contrastbias" (i.e., both "contrast" and -"bias"), "flip", "pan", "rot90", "rotate", "scale", "wcs" (i.e., both -"wcssys" and "wcsunits"), and "zoom". Note that copying a parameter -results in -JS9.SetParam() being called, -triggering the corresponding core function if necessary. Thus, for -example, copying the colormap will change the colormap of the target -image. See JS9.SetParam() for more -details about setting parameters. - -

-Regions calls the -JS9.CopyRegions() routine. -Alignment calls -JS9.AlignPanZoom() in order to -keep the pixel size and displayed center position constant between the -sync'ed images. It assumes no rotation between the two images. -Finally, you can also copy "shapes", which calls the -JS9.CopyShapes() routine. -In the latter case, you will need to pass the shape layer name in the -layer property of the opts argument. - -

-The target image(s) to copy to can be specified singly or as an array -of image handles or image ids. If no images are specified, all images -are used as targets. - -

Get the display coordinates from an event
-

-dpos = JS9.EventToDisplayPos(evt) -

-where: -

    -
  • evt: a JavaScript or jQuery event -
-returns: -
    -
  • dpos: display position object containing 0-indexed x and y display -coordinate values -
-If you define your own event callbacks, you can use this routine to convert -the event position to a display position, which can then be used to get the -image position (see below.) - -
Get the image coordinates from the display coordinates
-

-ipos = JS9.DisplayToImagePos(dpos) -

-where: -

    -
  • dpos: display position object containing 0-indexed x and y display -coordinate values -
-returns: -
    -
  • ipos: image position object containing 1-indexed x and y image -coordinate values -
-Note that image coordinates are one-indexed, as per FITS conventions, while -display coordinate are 0-indexed. - -
Get the display coordinates from the image coordinates
-

-dpos = JS9.ImageToDisplayPos(ipos) -

-where: -

    -
  • ipos: image position object containing 1-indexed x and y image -coordinate values -
-returns: -
    -
  • dpos: display position object containing 0-indexed x and y display -coordinate values -
-Get display (screen) coordinates from image coordinates. Note that -image coordinates are one-indexed, as per FITS conventions, while -display coordinate are 0-indexed. - -
Get the image coordinates from the logical coordinates
-

-ipos = JS9.LogicalToImagePos(lpos, lcs) -

-where: -

    -
  • lpos: logical position object containing 1-indexed x and y logical -coordinate values -
-returns: -
    -
  • ipos: image position object containing 1-indexed x and y image -coordinate values -
-Logical coordinate systems include: "physical" (defined by LTM/LTV keywords in a -FITS header), "detector" (DTM/DTV keywords), and "amplifier" (ATM/ATV keywords.) -Physical coordinates are the most common. In the world of X-ray astronomy, they -refer to the "zoom 1" coordinates of the data file. - -

-This routine will convert from logical to image coordinates. By default, the -current logical coordinate system is used. You can specify a different logical -coordinate system (assuming the appropriate keywords have been defined.) - -

Get the logical coordinates from the image coordinates
-

-lpos = JS9.ImageToLogicalPos(ipos, lcs) -

-where: -

    -
  • ipos: image position object containing 1-indexed x and y image -coordinate values -
-returns: -
    -
  • lpos: logical position object containing 1-indexed x and y logical -coordinate values -
-Logical coordinate systems include: "physical" (defined by LTM/LTV keywords in a -FITS header), "detector" (DTM/DTV keywords), and "amplifier" (ATM/ATV keywords.) -Physical coordinates are the most common. In the world of X-ray astronomy, they -refer to the "zoom 1" coordinates of the data file. -

-This routine will convert from image to logical coordinates. By default, the -current logical coordinate system is used. You can specify a different logical -coordinate system (assuming the appropriate keywords have been defined.) - -

Get value/position information
-

-valpos = JS9.GetValPos(ipos, display) -

-where: -

    -
  • ipos: image position object containing 1-indexed x and y image coord values -
  • display: boolean value specifying whether the info box display should be updated (default is true) -
-returns: -
    -
  • valpos: value/position object -
-This routine determines the data value at a given image position -and returns an object containing the following information: -
    -
  • ix: image x coordinate -
  • iy: image y coordinate -
  • isys: image system (i.e., "image") -
  • px: physical x coordinate -
  • py: physical y coordinate -
  • psys: currently selected pixel-based system (i.e., "image" -or "physical") for the above px, py values -
  • ra: ra in degrees (if WCS is available) -
  • dec: dec in degrees (if WCS is available) -
  • wcssys: wcs system (if WCS is available) -
  • val: floating point pixel value -
  • val3: pixel value as a string truncated to 3 decimal digits -
  • vstr: string containing value and position info -
  • id: id of the image -
  • file: filename of the image -
  • object: object name of the image from the FITS header -
- -
Set the value/position display mode
-

-JS9.SetValPos(mode) -

-where: -

    -
  • mode: true (show valpos display) or false (hide valpos display) -
-Set the display mode of the value/position display for the specified image. - -
Get the image inherit mode
-

-inherit = JS9.GetImageInherit() -

-returns: -

    -
  • inherit: true if new image inherits params from current image -
-The JS9.GetImageInherit() routine returns a boolean specifying whether -a new image grabs the image params (e.g., colormap, scale, zoom, etc.) -from the currently displayed image. If false, these params are taken -from the default JS9.imageOpts object. - -
Set the image inherit mode
-

-JS9.SetImageInherit(mode) -

-where: -

    -
  • mode: true (inherit params from currently displayed image) or false -
-The JS9.SetImageInherit() routine specifies whether -a new image grabs the image params (e.g., colormap, scale, zoom, etc.) -from the currently displayed image. If false, these params are taken -from the default JS9.imageOpts object. - -
Get information about the current WCS
-

-wcsobj = JS9.GetWCS() -

-returns: -

    -
  • wcsobj: object containing WCS info -
-

-Get information about the current WCS, including: -

    -
  • version: the WCS version ("default" or the letter "A"-"Z" for an alternate WCS) -
  • wcsname: the value of the WCSNAME header parameter associated -with this WCS, if present -
  • crot: crot value (i.e., the CROT1 value) from WCS library -
  • crpix[1,2]: crpix values from WCS library -
  • crval[1,2]: crval values from WCS library -
  • crdelt[1,2]: crdelt values from WCS library -
  • crtype[1,2]: crtype values (e.g., "RA" and "Dec") from WCS library -
  • ptype: ptype value (e.g., "TAN") from WCS library -
  • radecsys: radecsys value (e.g., "ICRS") from the WCS library -
- -
Set the current WCS
-

-JS9.SetWCS(which) -

-where: -

    -
  • which: WCS name or id -
-Set the current WCS, in cases where alternate WCS's are available. The -alternate WCS convention is described in the standard paper by Greisen -and Callebretta Representations of world coordinates in FITS -(A&A 395, 1061–1075 (2002).) If a FITS file contains alternate WCS -info, you can switch to an alternate using this routine or using -the File->alternate wcs menu option. -

-The which argument can be one of the following: -

    -
  • default: the default WCS from the original file -
  • [version]: the version letter of the alternate WCS, i.e., A-Z -
  • [wcsname]: the value of the WCSNAME header parameter associated -with this WCS, if present -
-If no argument is supplied, the default WCS is set up. - -
Get the current WCS units
-

-unitsstr = JS9.GetWCSUnits() -

-returns: -

    -
  • unitstr: "pixels", "degrees" or "sexagesimal" -
-Get the current WCS units. - -
Set the current WCS units
-

-JS9.SetWCSUnits(unitsstr) -

-where: -

    -
  • unitstr: "pixels", "degrees" or "sexagesimal" -
-Set the current WCS units. - -
Get the current World Coordinate System
-

-sysstr = JS9.GetWCSSys() -

-returns: -

    -
  • sysstr: current World Coordinate System ("FK4", "FK5", "ICRS", -"galactic", "ecliptic", "image", or "physical"); -
-Get current WCS system. - -
Set the current World Coordinate System
-

-JS9.SetWCSSys(sysstr) -

-where: -

    -
  • sysstr: World Coordinate System ("FK4", "FK5", "ICRS", -"galactic", "ecliptic", "image", or "physical") -
-Set current WCS system. The WCS systems are available only if WCS -information is contained in the FITS header. Also note that "physical" -coordinates are the coordinates tied to the original file. They are -mainly used in X-ray astronomy where individually detected photon -events are binned into an image, possibly using a blocking factor. -For optical images, image and physical coordinate usually are identical. - -
Convert image pixel position to WCS position
-

-wcsobj = JS9.PixToWCS(x, y) -

-where: -

    -
  • x: x image coordinate (or object containing x and y properties) -
  • y: y image coordinate -
-returns: -
    -
  • wcsobj: world coordinate system object -
-

-The returned WCS object contains the following properties: -

    -
  • ra: right ascension in floating point degrees -
  • dec: declination in floating point degrees -
  • sys: current world coordinate system being used -
  • str: string of WCS in current system ("[ra] [dec] [sys]") -
-You can either supply the x and y image coordinates as two numeric -arguments, or supply a single object containing numeric x and y properties. - -
Convert WCS position to image pixel position
-

-pixobj = JS9.WCSToPix(ra, dec) -

-where: -

    -
  • ra: right ascension in floating point degrees (or object containing ra and dec properties) -
  • dec: declination in floating point degrees -
-returns: -
    -
  • pixobj: pixel object -
-The returned pixel object contains the following properties: -
    -
  • x: x image coordinate -
  • y: y image coordinate -
  • str: string of pixel values ("[x]" "[y]") -
-You can either supply the RA and Dec as two numeric arguments, or supply a -single object containing numeric ra and dec properties. - -
Display a text message
-

-JS9.DisplayMessage(which, text) -

-where: -

    -
  • which: "info" or "regions" -
  • text: text to display -
-The text string is displayed in the "info" area (usually occupied by the -valpos display) or the "region" area (where regions are displayed.) The -empty string will clear the previous message. - -
Display a WCS-based coordinate grid
-

-JS9.DisplayCoordGrid(mode, opts) -

-where: -

    -
  • mode: true (display) or false (hide) -
  • opts: optional object or JSON string containing grid parameters -
-A coordinate grid displays lines of constant RA and constant Dec, with -the points of intersection labeled by their RA and Dec values. The -labels are in sexagesimal notation if the WCS units are sexagesimal, -otherwise they are in degrees. When using sexagesimal notation, labels -will be shortened if possible, e.g., if the RA hours are the same in -two successive labels but the minutes are different, only the minutes -are shown in the second label. - -

-If no arguments are supplied, the routine returns true if the -coordinate grid is currently being displayed, false otherwise. A -boolean first argument specifies whether to display the coordinate -grid or not. - -

-The optional second argument is an opts object (or a JSON-formatted -string) containing properties to override the default JS9.Grid.opts -properties. These properties include: -

    -
  • strokeWidth: grid stroke width -
  • lineColor: color of RA and Dec grid lines -
  • raLines: approx. number of RA grid lines -
  • raAngle: rotation for RA label -
  • raSkip: number of RA lines to skip -
  • decLines: approx. number of Dec grid lines -
  • decAngle: rotation for Dec label -
  • decSkip: number of Dec lines to skip -
  • labelColor: color of text labels -
  • labelFontFamily: label font -
  • labelFontSize: label font size -
  • labelFontStyle: label font style -
  • labelFontWeight: label font weight -
  • labelRAOffx: x offset of RA labels -
  • labelRAOffy: y offset of RA labels -
  • labelDecOffx: x offset of Dec labels -
  • labelDecOffy: y offset of Dec labels -
  • degPrec: precision for degree labels -
  • sexaPrec: precision for sexagesimal labels -
  • reduceDims: reduce lines of smaller image dim? -
  • stride: fineness of grid lines -
  • margin: edge margin for displaying a line -
  • labelMargin: edge margin for displaying RA, Dec label -
  • cover: grid lines cover: display or image -
-The strokeWidth property determines the width of the grid -lines. It also serves as a reminder that you can pass other standard -shape properties in the opts object. - -

-JS9's label placement algorithm puts labels close to the intersection -of RA and Dec lines. A number of properties can be useful in cases -where this simple algorithm is not sufficient: the raAngle -and decAngle properties allow you to rotate the labels with -respect to the grid lines. The four label[RA,Dec]Off[x,y] properties -allow you to move the label with respect to the grid lines. -The raSkip and decSkip properties allow you to skip -labelling the first available lines within the display. It can be -useful, for example, on a rotated image, when the labels are placed in -a corner. - -

-The degPrec and sexaPrec properties specify the precision for -degree values and sexagesimal values, respectively. Higher precision will -use more digits and take more space along each line. - -

-A number of properties are (more or less) internal but might be of -use: the reduceDims property will reduce the raLines -and decLines properties by the ratio of image dimensions if one -dimension is smaller than the other. This can prevent crowding in the -smaller dimension. The stride property specifies the length of -each line segment that together make up a grid line. A smaller stride -might make the grid lines smoother in some cases, at the price of more -processing time. The cover property determines whether the -grid is drawn over the entire image or just the displayed part of the -image. At the moment, drawing lines over the displayed part of the -image seems to be sufficient. - -

-Note that you can specify global site-wide values for all these parameters -(overriding the JS9.Grid.opts defaults) by supplying them in a grid -object within the globalOpts object in the js9prefs.js file. - -

-Example: display a coordinate grid, specifying the line color: -

-    JS9.DisplayCoordGrid(true, {lineColor: "pink"});
-
- -
Get background-subtracted counts in regions
-

-JS9.CountsInRegions(sregion, bregion, opts) -

-where: -

    -
  • sregion: any source region, or "$sregions" for displayed source regions -
  • bregion: any background region, or "$bregions" for displayed background regions -
  • opts: optional object or JSON string containing region parameters -
-The regcnts -program (and its predecessor, funcnts) counts photons in specified -source regions and optionally, in specified background regions. -Displayed results include the bkgd-subtracted counts in each region, -as well as the error on the counts, the area in each region, and the -surface brightness (cnts/area**2) calculated for each region. Regcnts -for desktop use is available on -GitHub. - -

-The regcnts program has been compiled into JS9 using -Emscripten. -Using this routine, it can be run on the FITS file stored in memory -for the currently displayed image. The first two arguments specify -the source region(s) and background region(s), -respectively. You can pass a standard region specifier as the source -or background region: -

-    JS9.CountsInRegions('ICRS; circle(23:23:18.76, +58:47:27.25, 31.8")');
-
-If the string "$sregions" ("$bregions") is -specified, the source (background) regions are taken from the -currently displayed image. You also can specify a region selector -using a regions selection string. -For example: -
-    # all regions
-    JS9.CountsInRegions('all');
-    # selected regions
-    JS9.CountsInRegions('selected');
-    # regions tagged with the "foo" tag
-    JS9.CountsInRegions('foo');
-
-Note that if you pass a region selector and no regions are returned, -the routine will throw an error. Also note that, in this context, text -and cross regions not valid regions (and are ignored). - -

-In keeping with how desktop regcnts works, if no argument or null or a -null string is specified as the source region, the entire field is -used as the source region. If no argument or null or a null string is -explicitly specified as a background region, no regions are used for -the background. In particular, if you pass only the source region -argument, or pass only the source region and opts arguments, no -background region is used. To recap: -

-    # use entire field, no background
-    JS9.CountsInRegions([opts])
-    JS9.CountsInRegions("field"||null||""[, opts])
-
-    # use displayed source and displayed background
-    JS9.CountsInRegions("$sregions", "$bregions"[, opts])
-
-    # use displayed source, no background
-    JS9.CountsInRegions("$sregions"[, opts])
-
-    # use displayed source and specified background
-    JS9.CountsInRegions("$sregions", bregions[, opts])
-
-    # use specified source, no background
-    JS9.CountsInRegions(sregions[, opts])
-
-    # use specified source and specified background
-    JS9.CountsInRegions(sregions, bregions[, opts])
-
-    # use specified source and displayed background
-    JS9.CountsInRegions(sregions, "$bregions"[, opts])
-
-   # use entire field and specified background
-    JS9.CountsInRegions("field"||null||"", bregions[, opts])
-
-    # use entire field and displayed background
-    JS9.CountsInRegions("field"||null||"", "$bregions"[, opts])
-
- -The third argument allows you to specify options to regcnts: -
    -
  • cmdswitches: command line switches passed to regcnts -
  • dim: size of reduced image (def: max of JS9.globalOpts.image.[xdim,ydim]) -
  • reduce: reduce image size? (def: true) -
  • lightwin: if true, results are displayed in a light window -
-The command line switches that can be specified in cmdswitches are -detailed in the -regcnts help -page. Aside from switches which control important aspects of the -analysis, the "-j" switch (which returns the output in JSON format) -might be useful in the browser environment. Some examples: -
-    # display results in a light window
-    JS9.CountsInRegions({lightwin: true})
-
-    # return JSON using maximum precision in output
-    JS9.CountsInRegions({cmdswitches: "-j -G"})
-
-Results are also returned as a text string. - -

-The regcnts code is memory (and cpu) intensive. In the desktop -environment, this is not typically a problem, but the -memory-constrained browser environment can present a challenge for -large images and binary tables. To avoid running out of memory (and -for large images, to speed up processing considerably), the -JS9.CountsInRegions() routine will bin the image to reduce its size, -unless the reduce option is explicitly set to false. The binned -image size can be specified by the dim option, defaulting to -the global value of the image dimension options. When a file is binned -in this manner, the returned resolution value (e.g., arcsec/pixel) -will reflect the applied binning. Note that the number of photons -found inside a binned and unbinned region differ slightly, due to the -difference in the pixel boundaries in the two cases. - -

-The Counts in Regions option of the Analysis -> Client-side -Analysis menu runs regcnts on the source and background regions of -the currently displayed image. The results are displayed in a light window. - -

-Finally, note that the main JS9 web -site also offers regcnts as a server-based analysis program in the -Analysis menu. The displayed source and background regions are passed -to the server for processing. Because this version runs the desktop -program, it runs on the original file and does no binning to reduce -the image size (which, by the way, could lengthen the processing -time.) But the server-side task also can be useful for -large file support, which involves -displaying a small representation file associated with a much larger -parent file stored on the server. In this case, you often want to run -the analysis on the larger (original) file. - -

Generate a radial profile plot
-

-JS9.RadialProfile(sregion, bregion, opts) -

-where: -

    -
  • sregion: annulus region, or "$sregions" to use displayed annulus -
  • bregion: any background region, or "$bregions" for displayed background regions -
  • opts: optional object or JSON string containing region and plot parameters -
-The JS9.RadialProfile() routine -uses JS9.CountsInRegions() -to produce a radial profile plot. The source region argument should be -an annulus region (or, when using "$sregions", the displayed source -region should be an annulus.) The background region can be any -region(s) (except text or cross regions), the same as for the counts -routine. - -

-The third argument allows you to specify options to the counts routine, -as well as the following options for the radial profile plot: -

    -
  • color: color of the plot line (default: "green") -
  • errorbars: show error bars? (default: true) -
  • errorcolor: color of the error bars (default: "red") -
-Note that "-j" (JSON format) and "-r" (output radii) are always added to -the cmdswitches property (and should not be overridden.) This means you can -retrieve the JSON output without generating the plot simply by calling -JS9.CountsInRegions() directly: -
-    JS9.CountsInRegions(sregions, bregions, {cmdswitches: "-j -r"})
-
-The return value is the id of the light window containing the plot. - -
Create or modify a raw data layer
-

-JS9.RawDataLayer(opts, func) -

-where: -

    -
  • opts: layer name or opts object -
  • func: function used to create or modify raw data -
-Each image has raw data associated with it, i.e., the underlying -astronomical image pixels that are scaled and displayed using the -chosen scale and colormap. You can manipulate the raw data by creating -a new raw data layer using JS9.RawDataLayer(), -setting -the image pixel values, and then making this layer the current -one. The original raw data (with id "raw0") will be maintained in -separate layer, so you can switch between layers (also using this -routine.) - -

-To create a new raw data layer (or edit an existing layer), call the -JS9.RawDataLayer() with two arguments: layer opts (or layer -name) and a function. The layer opts object can have the following properties: -

    -
  • rawid: id of new raw data layer (default: "alt") -
  • oraw: id of raw data layer to pass to func or "current" (default: "raw0", i.e., the original data) -
  • from: descriptive string describing origin of this raw data (def: "func") -
-Alternative, you can pass the id of the raw data layer as a string and -use the defaults for the other properties (which usually is sufficient.) - -

-The pixel modifying function should have the following calling sequence: -

-    func(oraw, nraw, opts)
-
-where: -
    -
  • oraw: the raw data object specified by the from property above (def: original raw data "raw0"); -
  • nraw: the raw data layer you are modifying -
  • opts: the original opts object along with any params you add to it -
-The function should return true is you want to switch to the new layer -and display it, or false to discard the new layer (in case of an error.) - -

-Note that the nraw object will contain the raw data for this -layer, if it already exists. Otherwise, it will contain a copy of -the from data. - -

-For example, the following routine creates a new "clip" layer and -clips the original raw data at the specified nmax level: -

-    im.rawData({rawid: "clip", nmax: n}, function (oraw, nraw, opts){
-        var i, len;
-        opts = opts || {};
-        if( opts.nmax === undefined ){ opts.nmax = 0; }
-        len = nraw.width * nraw.height;
-        for(i=0; i<len; i++){
-            if( oraw.data[i] < opts.nmax ){
-                nraw.data[i] = 0;
-            } else {
-                nraw.data[i] = oraw.data[i];
-            }
-        }
-        return true;
-    });
-
-When clipping, the nraw pixel values are taken from the oraw values, so -that you can clip to a value of 100, then clip to a value of 50, and -get the right result. This is different from the following example "add" -layer, which adds a constant value to the existing data: -
-    im.rawData({rawid: "add", val: n}, function (oraw, nraw, opts){
-        var i, len;
-        opts = opts || {};
-        if( opts.val === undefined ){
-            opts.val = 1;
-        }
-        len = nraw.width * nraw.height;
-        for(i=0; i<len; i++){
-            nraw.data[i] += opts.val;
-        }
-        return true;
-    });
-
-Here, the operation is performed on the existing "add" layer each time, so -that the addition is cumulative. - -

-The oraw and nraw objects contain a subset of the properties returned by -JS9.GetImageData(): -

    -
  • width: x dimension of image -
  • height: y dimension of image -
  • bitpix: FITS bits/pixel of each image element (8 for unsigned char, 16, 32 for signed integer, -32 or -64 for float) -
  • header: JavaScript object containing FITS header values -
  • data: buffer containing raw data values -
- -

-To switch to a layer, call JS9.RawDataLayer() -with a single argument, the layer name: -

-    JS9.RawDataLayer("raw0")   # switch to original data
-    JS9.RawDataLayer("clip")   # switch to clipped data
-    JS9.RawDataLayer("add")    # switch to add data
-
-To get the currently displayed layer, call the routine with no arguments: -
-    JS9.RawDataLayer()         # returns "clip"
-
- -
Gaussian blur of raw data
-

-JS9.GaussBlurData(sigma, opts) -

-where: -

    -
  • sigma: sigma of Gaussian function -
  • opts: options object -
-This routine creates a new raw data layer called "gaussBlur" in which -the image pixel values are blurred using a Gaussian function with the -specified sigma. The routine uses the fast Gaussian blur algorithm -(approximating a full Gaussian blur with three passes of a box blur) -described -here. -

-See JS9.RawDataLayer() for more -information about raw data layers. - -

Perform image arithmetic on raw data
-

-JS9.ImarithData(op, arg1, opts) -

-where: -

    -
  • op: image operation: "add", "sub", "mul", "div", "min", "max", and "reset" -
  • arg1: image handle, image id or numeric value -
  • opts: options object -
-The JS9.ImarithData() routine performs basic arithmetic -(addition, subtraction, multiplication, division, minimum, maximum, average) -between the currently displayed image and either another image or a -constant value. The first op argument is a string, as detailed -above. The second arg1 argument can be a numeric value or an -image id. In the former case, the constant value is applied to each -pixel in the image. In the latter case, the operation is performed -between the corresponding pixels in the two images. For example: -
-    JS9.ImarithData("max", "foo.fits");
-
-will make a new data layer of the currently displayed image, where -each pixel is the larger value from that image and the foo.fits image -(which can be in any display.) - -

-This routine creates a new raw data layer called "imarith" containing -the results of the operation. Successive calls to this routine are -cumulative, so that you can build up a more complex operation from -simple ones. For example: -

-    # foo.fits is displayed in the "myJS9" display
-    var myim = JS9.GetImage({display: "myJS9"});
-    JS9.ImarithData("max", myim);
-    JS9.ImarithData("add", 2.718);
-
-will make a new data layer where each pixel is the larger value from -the two images, after which an approximation of the irrational number -e is added to each pixel. - -

-The special reset operation deletes the "imarith" raw data -layer, allowing you to start afresh. - -

-The bitpix value of the new "imarith" layer is chosen as follows: -

    -
  • for operations between two images, bitpix the "larger" of the two -images (where float is "larger" than int.) -
  • for operations between an image and a constant, bitpix of -32 -(single float) is chosen unless the image itself has bitpix of -64, in -which case the double float bitpix is chosen. -
-You can override the choice of bitpix by passing a bitpix property -in the optional opts object. - -

-Finally, note that the two images must have the same dimensions. We -might be able to remove this restriction in the future, although -it is unclear how one lines up images of different dimensions. -

-See JS9.RawDataLayer() for more -information about raw data layers. - -

Shift raw data
-

-JS9.ShiftData(x, y, opts) -

-where: -

    -
  • x: number of pixels to shift in the x (width) direction -
  • y: number of pixels to shift in the y (height) direction -
  • opts: options object -
-This routine creates a new raw data layer called "shift" in which -the pixels are shifted from the original image array by the specified -amount in x and/or y. The results of successive shifts are -cumulative. The routine is used by the Harvard-Smithsonian Center for -Astrophysics MicroObservatory project interactively to align images -that are only slightly offset from one another. -

-See JS9.RawDataLayer() for more -information about raw data layers. - -

Reproject an image using a specified WCS
-

-JS9.ReprojectData(wcsim, opts) -

-where: -

    -
  • wcsim: image containing the WCS used to perform the reprojection -
  • opts: options object for raw data layer -
-JS9.ReprojectData() creates a new raw data layer (with default id -of "reproject") in which the pixels are reprojected using the WCS from -another image. The -mProjectPP -program from the -Montage software suite -is used to perform the reprojection. Please read the documentation on -mProjectPP from the Montage web site, which includes this explanation: -

-

-    mProjectPP performs a plane-to-plane transform on the input image, and
-    is an adaptation of the Mopex algorithm and developed in collaboration
-    with the Spitzer Space Telescope. It provides a speed increase of
-    approximately a factor of 30 over the general-purpose mProject. However,
-    mProjectPP is only suitable for projections which can be approximated
-    by tangent-plane projections (TAN, SIN, ZEA, STG, ARC), and is therefore
-    not suited for images covering large portions of the sky. Also note that
-    it does not directly support changes in coordinate system (i.e., equatorial
-    to galactic coordinates), though these changes can be facilitated by the
-    use of an alternate header.
-
-These Montage programs have been compiled into JS9 using -Emscripten. - -

-The wcsim argument is an image id, image filename, or image -object pointing to the WCS image. This is the image whose WCS will be used -for the reprojection. Alternatively, if the wcsim argument is set to -"all", the WCS from the currently displayed image will be used to reproject -all other images in the display. - -

-The opts object can contain the following reproject-specific properties: -

    -
  • rawid: the id of the raw data layer to create (default: "reproject") -
  • cmdswitches: a string containing mProjectPP command line switches -
-The cmdswitches will be prepended to the mProjectPP command line. For example: -
- {cmdswitches: "-d 1 -z .75"}
-
-will set the mProjectPP debugging and the drizzle factor, resulting in a -command line that looks like this: -
-  mProjectPP -d 1 -z .75 -s statusfile in.fits out.fits template.hdr
-
-See the -mProjectPP -documentation for more information about command switches. - -

-Reprojection is an intensive process which can take a considerable -amount of memory and processing time. It also (at least currently) -requires that the full reprojected image be displayed (so that the -reprojected image can be properly aligned with the WCS image used in -making the reprojection.) We therefore restrict the WCS image size to -be less than or equal to JS9.globalOpts.image.xdim by -JS9.globalOpts.image.ydim. If the WCS image exceeds this size, an -error is thrown. -

-See JS9.RawDataLayer() for more -information about raw data layers. - -

Rotate an image around the WCS CRPIX point
-

-JS9.RotateData(angle, opts) -

-where: -

    -
  • angle: rotation angle in degrees -
  • opts: options object -
-The JS9.RotateData() routine uses -JS9.ReprojectData() -to rotate image data by the specified angle (in degrees.) If the string -"northup" or "northisup" is specified, the rotation angle is set to 0. -By default, the rotation is performed about the WCS CRPIX1, CRPIX2 point. -To rotate about the center of the currently displayed image, pass -the opts.center property with a value of "current" or (globally) -set the JS9.globalOpts.rotationCenter property to "current". -

-Note that this rotation is not accumulative (as is the case with the -JS9.SetRotate() and -JS9.SetRot90() routines), so -calling JS9.RotateData() with an angle of 30 degrees followed by -45 degrees will result in a 45 degree rotation, not a 75 degree -rotation. - -

-The optional opts object is passed directly to the JS9.ReprojectData() -routine. See JS9.ReprojectData() above for more information. - -

Apply a filter to the RGB image
-

-JS9.FilterRGBImage(filter, args) -

-where: -

    -
  • filter: name of image filter to apply to the RGB data -
  • args: filter-specific arguments, where applicable -
-In JS9, you can change the raw data (and hence the displayed image) using -routines such as -JS9.GaussBlurData() -or the more general -JS9.RawDataLayer(). -You also can apply image processing -techniques directly to the displayed RGB image without changing the -underlying raw data, using this routine. The web has an overwhelming -amount of information about image processing. A good technical -article concerning the use of image filters with Javascript and the -HTML5 canvas is available at: - -http://www.html5rocks.com/en/tutorials/canvas/imagefilters/ - - -

-The JS9.FilterRGBImage() routine supports a number of image -processing routines, which are listed below. To call one of them -using JS9.FilterRGBImage(), supply the filter name, followed by any -filter-specific arguments, e.g.: -

-    JS9.FilterRGBImage("luminance", {display: "myJS9"});
-    JS9.FilterRGBImage("duotone", "g", {display: "myJS9"});
-    JS9.FilterRGBImage("convolve", [-1,-1,-1,-1,8,-1,-1,-1,-1]);
-
-You can, of course, use the default arguments where applicable. - -

-Note that the standard JS9 colormaps, scale, contrast and bias -selections are applied to the raw data to regenerate the RGB -image. Thus, if you use any of the image processing techniques listed -below and then change colormap, contrast, bias, or scale, you will -undo the applied image processing. This is a good way to reset the -displayed image. The same thing can be accomplished programmatically by -specifying "reset" as the filter name: -

-    JS9.FilterRGBImage("reset", {display: "myJS9"});
-
- -

-The following simple image processing filters are available: -

    -
  • luminance():convert to greyscale using the CIE luminance: -0.2126*r + 0.7152*g + 0.0722*b -
  • greyscale():convert to greyscale using the standard greyscale: -0.3*r + 0.59*g + 0.11*b -
  • greyscaleAvg():convert to greyscale using averaging: -(r+g+b) / 3 -
  • brighten(val): add constant value to each pixel to change the brightness: -[r + val, g + val, b + val] -
  • noise(v1, v2): add random noise: -pixel += Math.floor((Math.random()*(v2-v1)) - v2), -defaults are v1=-30, v2=30 -
  • duotone("r"|"g"|"b"): remove a color by setting it to -the avg of the two others: r=(g+b)/2, default color is "r" -
  • invert(): the RGB channels of the image are inverted: -[255-r, 255-g, 255-b, a] -
  • pixelate(size):make image look coarser by creating a square tiling -effect of the specified size, default size is 2 -
  • sepia(): image takes on shades of brown, like an antique photograph -
  • contrast(val): change the difference in brightness between the min -and max intensity of a pixel, default val is 2 -
  • threshold(thresh, low, high):create a two-color image in which pixels -less bright than thresh are assigned the low value (default 0 for black), -otherwise the high value (default: 255 for white) -
  • gamma(gcorr): apply the nonlinear gamma operation, used to code and -decode luminance values in video or still image systems: -out = pow(in, gcorr), default gcorr is 0.2 -
  • posterize(): convert a smooth gradation of tone to regions -of fewer tones, with abrupt changes between them -
  • scatter(): scatters the colors of a pixel in its neighborhood, akin -to viewing through brittle cracked glass -
  • solarize(): which image is wholly or partially reversed in -tone. Dark areas appear light or light areas appear dark. -
- -

-The following image convolutions are available: -

    -
  • convolve(weights, [opaque]) convolve the image using the weights array -as a square convolution matrix. If opaque is true (default), the image will -have an opaque alpha channel, otherwise the alpha is convolved as well. -
  • sobel(): use the Sobel operator to create an image that emphasizes the edges -
  • medianFilter(): noise reduction technique that replaces each pixel with -the median of neighboring pixels -
  • gaussBlur5(): image pixel values are blurred using a 5x5 Gaussian -
  • edgeDetect(): detect edges using the kernel -[ -1, -1, -1, -1, 8, -1, -1, -1, -1 ] -
  • sharpen(val): sharpen the image using the kernel -[ 0, -3, 0, -3, val, -3, 0, -3, 0 ] -
  • blur(): blur the image using the kernel -[ 1, 2, 1, 2, 1, 2, 1, 2, 1 ] -
  • emboss(val): produce embossing effect using the kernel -[-18, -9, 9, -9, 100 - val, 9, 0, 9, 18 ] -
  • lighten(val): apply the kernel -[ 0, 0, 0, 0, val, 0, 0, 0, 0 ], -default val of 12/9 lightens the image -
  • darken(val): apply the kernel -[ 0, 0, 0, 0, val, 0, 0, 0, 0], -default val of 6/9 darkens the image -
- -

-With no arguments, the routine returns an array of available filters: -

-    JS9.FilterRGBImage()
-    ["convolve", "luminance", ..., "blur", "emboss", "lighten", "darken"]
-
- -
Save an image session to a file
-

-JS9.SaveSession(session, opts) -

-where: -

    -
  • session: optional name of the file to create when saving this session -
  • opts: optional object or JSON string containing session parameters -
-

-This routine saves session information related to the currently -displayed image or all images in the specified display. The first -argument can be a filename or an options object. If a filename is -specified, the second argument can be the options object. -

-The opts options object supports a mode property -whose value can be "display" (save all images in the specified -display) or "image" (save the currently displayed image. If this -property is not specified, the default is to save all images in the display. -

-If no filename is specified, the default filename depends on the save mode. -If mode is "display", the default filename takes the form js9-[date].ses, -e.g., "js9-2018-01-09.ses". If mode is "image", the default filename is [im.id].ses, e.g., "casa.fits.ses". -

-Saved information (filename, scaling, colormap, contrast/bias, zoom, -regions, catalogs, etc) is stored in a JSON-formatted text file. You can -subsequently load this file into JS9 to restore the image session. -Don't forget that the file is saved by the browser in whatever location -you have set up for downloads. -

-The session file is a text file and can be edited, subject to the usual -rules of JSON formatting. For example, you can change the colormap, -scaling, etc. after the fact. -

-The session file contains a file property near the top that -specifies the location of the image. A local file usually will contain -an absolute path or a path relative to the web page being displayed. -However, if the image was originally opened using drag-and-drop, no -pathname information is available, in accordance with standard web -security protocols. In this case, you must edit the session file to -supply the path (either absolute or relative to the web page) before -re-loading the session. - -

Load a previously saved image session from a file
-

-JS9.LoadSession(session) -

-where: -

    -
  • session: name of the session file to load -
-

-Restore an image session by loading a JSON-formatted session file. The -image itself is retrieved and loaded, and all of the saved parameters -and graphics (scale, colormap, regions, catalogs etc) are applied to -the display. -

-The pathname of the session file should either be absolute or should be -relative to the web page. -

-The session file contains a file property near the top that -specifies the location of the image. For browser-based JS9, a local -file usually will contain an absolute path or a path relative to the -web page being displayed. - -

-On the desktop, session files and the associated data files often are -moved around or used with different web pages, breaking the connection -between the web page and the image path. To deal with this problem, -the JS9.desktoplOpts.sessionPath variable is provided: -

    -
  • if set to true, the image path is relative to the location -of the session file (this is the default) -
  • if set to false, the image path is relative to the web page -value (as with browser-based JS9) -
-This means that if you store your session file relative to the -contained image, you can move both files to any location on your disk. - -

-If the image was originally opened using drag-and-drop, no pathname -information is available, in accordance with standard web security -protocols. In this case, you may have to edit the session file to -supply the path (either absolute or relative) before re-loading the -session. - -

-Note that the raw data file itself is not saved (only its pathname), -so you must have access to that file in order to restore a session. However, -the data file need not be in the same location as it was originally: you -can adjust the path of the data file by editing the file property -as needed. - -


- -

Working with Regions

- -

-Spatial regions of interest are a crucial part of astronomical data -analysis, especially X-ray analysis. Programs having spatial region -support can select parts of a FITS image or binary table using simple -geometric shapes, so that only pixels found within these shapes are -processed. See -regions -for a general discussion of spatial region filtering in astronomy, and -regcnts -for an example program using spatial regions. - -

-JS9's support for spatial regions allows you to create and delete -regions, load them from an external file, change characteristics such as -size and color, use them as selection criteria in local analysis or -pass them to remote analysis, and export them a file. - -

-The regions layer in JS9 is a special case of the more generalized -Shape layers, but it is automatically created by -JS9 to support the options in the Regions menu, as well as -local and server-side data analysis using regions. As such, the -region routines are just a thin layer on top of the Shape routines, -calling the equivalent Shape routine with "region" as the first argument. - -

Selecting Regions
- -One of the most important aspects of using regions is the ability to assign -different characteristics to regions and then make selections based on -these characteristics. The -JS9.ChangeRegions(), -JS9.GetRegions(), -JS9.ListRegions(), -JS9.RemoveRegions(), -and -JS9.SelectRegions() -JS9.GroupRegions() -calls all take a region selection specification as the first argument, -which can be any of the following (in order of precedence): -
    -
  • selected: the selected region (or all regions in selected group) -
  • all: all regions, but not including child text regions (default) -
  • All: all regions, including child text regions -
  • [id]: a integer region id (or an array of ids), as -returned by JS9.AddRegions() -
  • [color]: all regions having the specified color (e.g., "red") -
  • [shape]: all regions having the specified shape (e.g., "circle") -
  • child: a child region (i.e. text child of another region) -
  • parent: a region that has a child (i.e. has a text child) -
  • [wcs]: regions whose initial wcs matches the specified wcs -
  • [tag]: all regions containing the specified tag (e.g., "source") -
  • /[regexp]/: all regions whose tags match the regexp (e.g. "/foo[1-4]/") -
  • dcoords: a region that preserves display coordinates -
  • nodcoords: a region that does not preserve display coordinates -
-Of these, all, selected, [color], [shape], and -[tag] are probably the most often used. Selections make it -possible to act on multiple regions at the same time. For example: -
-    # all currently selected regions
-    JS9.ListRegions("selected");
-
-    # all circles
-    JS9.ChangeRegions("circle", {"color": "red"});
-
-    # all red regions
-    JS9.GetRegions("red");
-  
-    # all regions with the tag 'foo1'
-    JS9.ChangeRegions("foo1", {"color": "red"});
-  
-    # all regions with a tag matching the regular expression foo.*
-    JS9.ListRegions("/foo.*/");
-
-    # region with id 7
-    JS9.SelectRegions(7, {"color": "red"});
-
-In addition, you can combine selections using the boolean operators, -with the usual precedence and associativity rules holding sway: -
-  Operator                                Associativity
-  --------                                -------------
-  !  (bitwise not)                        right to left
-  && (logical and)                        left to right
-  || (logical or)                         left to right
-
-For example: -
-    # circles or ellipses
-    JS9.ChangeRegions("circle || ellipse", {"color": "red"});
-
-    # circles or red regions
-    JS9.ListRegions("circle || red");
-
-    # circles having tag 'foo1'
-    JS9.ChangeRegions("circle && foo1", {"color": "red"});
-
-    # circles not having tag 'foo2'
-    JS9.SelectRegions("circle && !foo2");
-
-    # all regions except red ones
-    JS9.ChangeRegions("!red", {"color": "cyan"});
-
-    # not selected regions
-    JS9.ChangeRegions("!selected", {"color": "cyan"});
-
-    # circles having tag 'foo1' and ellipses having tag 'foo2'
-    JS9.GetRegions("(circle && foo1) || (ellipse && foo2)");
-
-When a region selection is made using the -JS9.ChangeRegions() or -JS9.SelectRegions() calls, the -selection is saved so that you can use it as part of subsequent selection -calls. You can specify use of the saved selection either in the opts object -or directly in the selection string: -
-    # select circle regions and save selection filter
-    JS9.SelectRegions("circle")
-
-    # select saved regions, along with ellipses that have a "foo1" tag
-    JS9.SelectRegions("ellipse && foo1", {"saved": true})
-
-    # select saved regions, along with ellipses that have a "foo1" tag
-    JS9.SelectRegions("ellipse && foo1", {"saved": "or"})
-
-    # select saved regions, along with ellipses that have a "foo1" tag
-    JS9.SelectRegions("saved || (ellipse && foo1)")
-
-    # select saved regions if they are ellipses that have a "foo1" tag
-    JS9.SelectRegions("ellipse && foo1", {"saved": "and"})
-
-    # select saved regions if they are ellipses that have a "foo1" tag
-    JS9.SelectRegions("saved && ellipse && foo1")
-
-    # retrieve currently saved regions
-    JS9.ListRegions('saved')
-
-Calling JS9.SelectRegions("reset") -will clear the saved selection. - -
Add one or more regions to the regions layer
-

-id = JS9.AddRegions(rarr, opts) -

-where: -

    -
  • rarr: a shape string, region object or an array of region objects -
  • opts: global values to apply to each created region -
-returns: -
    -
  • id: id of last region created -
-The rarr argument can be a region shape ("annulus", "box", -"circle", "cross", "ellipse", "point", "polygon", "text"), a single region -object, or an array of region objects. Region objects contain one or -more properties, of which the most important are: -
    -
  • shape: "annulus", "box", "circle", "cross", "ellipse", "point", "polygon", "text" [REQUIRED] -
  • x: image x position -
  • y: image y position -
  • px: physical x position -
  • py: physical y position -
  • ra: RA in degrees -
  • dec: Dec in degrees -
  • wcs: sexagesimal WCS string with optional WCS system -
  • lcs: object containing logical x, y and sys (e.g., "physical") -
  • deltax: increment from current image x position -
  • deltay: increment from current image y position -
  • tags: comma-separated list of tag strings or array of tag strings -
  • radii: array of radii for annulus region -
  • width: width for box or cross region -
  • height: height for box or cross region -
  • radius: radius value for circle region -
  • r1: x radius for ellipse region (misnomer noted) -
  • r2: y radius for ellipse region (misnomer noted) -
  • pts: array of objects containing x and y positions for polygons -
  • points: array of objects containing x and y offsets from the center for polygons -
  • angle: angle in degrees for box, ellipse, cross regions -
  • color: region color (string name or #rrggbb syntax) -
  • strokeWidth: line (stroke) width of the region -
  • strokeDashArray: array specifying dash pattern, e.g, [3,1] -
  • text: text associated with text region or for a child region of this region -
  • data: this property can be an object, string, number, -etc. and will be carried along with the region, and returned as a -property by the JS9.GetRegions() call. -
-Other available properties include: -
    -
  • changeable: if false, region cannot be moved, resized, rotated -
  • locked: 'opposite alias' of changeable -
  • movable: if false, region cannot be moved -
  • resizable: if false, region cannot be resized or rotated -
  • rotatable: if false, region cannot be rotated -
  • removable: if false, region cannot be removed -
  • selectable: if false, region can't be selected (no GUI-based changes) -
  • lockMovementX: if true, region cannot be moved in the x direction -
  • lockMovementY: if true, region cannot be moved in the y direction -
  • lockScalingX: if true, region cannot be resized in the x direction -
  • lockScalingY: if true, region cannot be resized in the y direction -
  • lockRotation: if true, region cannot be rotated -
  • fontFamily: font parameter for text region -
  • fontSize: font parameter for text region -
  • fontStyle: font parameter for text region -
  • fontWeight: font parameter for text region -
  • sticky: if true, region doesn't change during pan, zoom, rotate, flip -
  • preservedcoords: if true, the region is sticky, and display coordinates are preserved during save and copy operations (see below for more info) -
-Here are some examples of ways to create regions: -
-    # example 1: circular region in the center of the field
-    JS9.AddRegions("circle");
-
-    # example 2: red circular region in the center of the field
-    JS9.AddRegions("circle", {color: "red"});
-
-    # example 3: red circular region with dashed lines
-    JS9.AddRegions("circle", {color: "red", strokeDashArray: [3,1]});
-
-    # example 4: regions using an object in first arg
-    JS9.AddRegions({shape: "circle", color: "red", strokeDashArray: [3,1]})
-
-    # example 5: multiple regions using an array specification in first arg
-    JS9.AddRegions([{shape: "circle", color: "red", strokeDashArray: [3,1]},
-                    {shape: "box", color: "green", strokeDashArray: [6,1]}])
-
-    # example 6: js9 region syntax: properties in the second arg object
-    JS9.AddRegions('ellipse(23:23:22.179, +58:48:10.542, 40", 20", 60)', {text: "ellipse test", color: "violet", tags: "json tag, another tag", textOpts: {color: "yellow", fontSize: 16, fontStyle: "italic", fontWeight: "bold"}});
-
-    # example 7: js9 region syntax: JSON properties in the first arg string
-    JS9.AddRegions('ellipse(23:23:22.179, +58:48:10.542, 40", 20", 60) {"color": "violet", "text": "ellipse test", "textOpts": {"color": "yellow", "fontSize": 16, "fontStyle": "italic", "fontWeight": "bold"}} # json tag, another tag');
-
-    # example 8: ds9 region syntax: comment properties in the first arg string
-    JS9.AddRegions('box(23:23:35.486, +58:50:03.146, 40", 20", 30) # width=4 text={box test} dash=1 color=red rotate=0 tag="test tag"')
-
-    # example 9: create a region at the specified RA and Dec using ICRS
-    # Note that the WCS string is returned by the Edit menu's "copy wcs pos"
-    # option (i.e., the "/" keystroke.)
-    JS9.AddRegions("circle", {wcs: "23:23:28.895 +58:49:43.50 ICRS"});
-
-    # example 10: create a region by supplying display (screen) coordinates
-    image
-    text(d250, d100, "Using Display Coordinates")
-
-    # example 11: create a region by supplying display (screen) coordinates
-    # preserve the display coordinate when saving, copying
-    # and don't move the region when panning, zooming
-    image
-    text(d250, d100, "Using and Preserving Display Coordinates:") {"preservedcoords": true}
-
-
-In sum, you can specify a region using: -
    -
  • a shape in the first string arg, optional properties in the second object arg -
  • properties (including the shape) in the first object arg -
  • array of objects in the first arg -
  • full region syntax in the first string arg, optional properties in the second arg -
-Note the difference between examples 6 and 7: the former passes -properties in an object (second argument), so the key names -need not be quoted. The latter passes properties in a JSON -string as part of the first string argument: here the key names must be -quoted using double quotes, as per the JSON specification. - -

-Examples 6 and 7 also show the text property, which allows you -to associate a text string with a non-text region. JS9 will create a -separate text region as a child of the original region. You can -move this child text region around relative to the original region, -change its angle, etc. The child will then maintain its new position -relative to the original region as the latter is moved, resized, -etc. You also can double-click on the text child to bring up its -configuration dialog box and change its color, font, size, text string, -etc. - -

-Examples 10 and 11 show several features of regions that might be -useful for marking images with text and shapes that are tied to the -display rather than the image. When using the image coordinate system, -you can prefix the image positions with 'd' or 'D' to indicate that -they should be interpreted as display (also called "screen") -coordinates instead of image coordinates. The origin of the display is -in the upper left corner (image coordinates are in the lower left). By -default, a region specified with display coordinates is no different -from other regions: the region will change its screen position during -zoom and pan operations to stay aligned on the image, and its position -will be saved using the current coordinate system. That is, by default, -display coordinate are only used in the initial placement of the region. - -

-To preserve the region's display position during zoom and pan operations -and while saving regions, set the preservedcoords property -to true in the opts object. In this case, the region -is no longer a canonical astronomical region of interest, but is more -like a mark on the screen. By default, it will not be listed by the -Regions list menu option, nor will it be saved by default (although -you can set the save dcoords regions to true in the regions -save dialog box, or set savedcoords to true in the opts -property of the -JS9.SaveRegions() routine.) -It also will not be passed to back-end server analysis routines that -specify $regions, $sregions, $bregions in their command line. -However, it will be copied from one image to another when using the -JS9.CopyRegions() routine. -These behaviors are parameterized in the JS9.globalOpts object: -

    -
  • regListDCoords: list preserved display coords? (def: false) -
  • regSaveDCoords: save preserved display coords? (def: false) -
  • regExpandDCoords: pass preserved display coords? to analysis (def: false) -
  • regCopyDCoords: copy preserved display coords? (def: true) -
- -
Get information about one or more regions
-

-rarr = JS9.GetRegions(regions, opts) -

-where: -

    -
  • regions: which regions to retrieve -
  • opts: optional object -
-returns: -
    -
  • rarr: array of region objects (or text if opts.format is "text") -
-

-Get information about one or more regions. -The first argument is the regions selection. -If not specified, it defaults to "selected" if there are selected regions, -otherwise "all". - -

-Each returned region object contains the following properties: -

    -
  • id: numeric region id (assigned by JS9 automatically) -
  • mode: "add", "remove", "select", "update" -
  • shape: region shape ("annulus", "box", "circle", "cross", "ellipse", -"point", "polygon", "text") -
  • tags: comma delimited list of region tags (e.g., "source", "include") -
  • color: region color -
  • x,y: image coordinates of region -
  • radii: array of radii for annulus region -
  • width: width for box or cross region -
  • height: height for box or cross region -
  • radius: radius value for circle region -
  • r1: x radius for ellipse region (misnomer noted) -
  • r2: y radius for ellipse region (misnomer noted) -
  • pts: array of objects containing x and y positions, for polygons -
  • points: array of objects containing x and y offsets from the specified center, for polygons -
  • angle: angle in degrees for box, ellipse, cross regions -
  • ra: RA of center in degrees -
  • dec: Dec of center in degrees -
  • wcsstr: region string in WCS coordinates -
  • wcssys: WCS system (e.g., "FK5") -
  • imstr: region string in image or physical coordinates -
  • imsys: image system ("image" or "physical") -
  • lcs: object containing logical x, y and sys (e.g., "physical") -
  • parent: the id of the parent region, if this is a text child region -
  • child: the id of the child text region, if any -
  • data: data property passed in options object when this shape was created. -
-The x, y, radii, pts, radius, width, height, r1, r2 values are all -returned in the image coordinate system. The lcs object will contain x -and y in logical (i.e., physical) coordinates. Moreover, if the -imsys value is not "image" (i.e., the JS9 coordinate system is not -explicitly set to "image"), then the lcs object also will contain -radii, pts, radius, width, height, r1, r2 in the logical coordinate system. -

-The image position x, y can be used to access the image data returned by the -JS9.GetImageData() routine: -

-    obj = JS9.GetImageData();
-    xreg = JS9.GetRegions("selected")[0];
-    val = obj.data[Math.floor(xreg.y-0.5) * obj.width + Math.floor(xreg.x-0.5)];
-
-

-Note the need to integerize the x and y values: JavaScript arrays are -objects and so floating point array indices do not get truncated -automatically as in C. They will return null values. -

-In opts format property is set to "text", the regions are -returned as a string in standard regions format, using semi-colon -delimiters: -

-    JS9.GetRegions("all", {format: "text"})
-    ICRS; box(23:23:40.3, +58:47:04.05, 29.5\", 29.5\", 0.0) # background,include; ellipse(23:23:28.06, +58:48:40.5, 14.7\", 15.7\") # source,include
-
-By default, the region's json object and comments are passed based on
-the value of the globalOpts.regIncludeJSON
-and globalOpts.regIncludeComments properties, respectively.
-You can override this value by setting the includejson
-and includecomments properties in opts.
-
-

-You can pass wcssys and wcsunits in opts to return the wcs information in the desired format: -

- JS9.GetRegions("all", {format: "text"}) - ICRS; circle(23:23:35.300,+58:50:03.600,14") - - JS9.GetRegions("all", {format: "text", wcsunits: "degrees"}) - ICRS; circle(350.897083,58.834333,0.003889) - - JS9.GetRegions("all", {format: "text", wcssys: "FK4", wcsunits: "degrees"}) - FK4; circle(350.330969,58.559785,0.003889) - - JS9.GetRegions("all", {format: "text", wcsunits: "pixels"}) - physical; circle(3893.94,4091.92,28.46) -
- -

-If opts format property is set to "regions", the regions are -returned as a new-line separated list, similar to the output of -JS9.SaveRegions(). -By default, this will include the wcs keyword: -

-    JS9.GetRegions("all", {format: "regions"})
-    ICRS
-    circle(23:23:27.909,+58:48:42.880,14")
-    box(23:23:35.486,+58:50:03.146,40.001278,14",20.000000)
-
-

-If opts format property is set to "csv", the regions are -returned as a comma-separated value list, using new-line delimiters. -By default, this will not include the wcs keyword: -

-    JS9.GetRegions("all", {format: "csv"})
-    circle,23:23:27.909,+58:48:42.880,14"
-    box,23:23:35.486,+58:50:03.146,40.001278,14",20.000000
-
-

- -

List one or more regions
-

-rstr = JS9.ListRegions(regions, opts) -

-where: -

    -
  • regions: which regions to list -
  • opts: optional object -
-returns: -
    -
  • rstr: region string -
-

-List (and return) the specified regions. By default, a light window is -displayed listing all regions (i.e., as if the list option of the -Regions menu had been selected.) You can also list "selected" regions -or use any of the standard regions specifications (see introduction to the -Regions routines above.) -

-The opts object supports the following properties: -

    -
  • mode: display/return mode (1,2,3) -
  • wcssys: wcs system to use (ICRS, FK5, galactic, physical, etc.) -
  • wcsunits: units for wcs output (sexagesimal, degrees, pixels) -
  • includejson: include JSON object -
  • includecomments: include comments -
  • layer: which layer to display (default is "regions" layer) -
-The mode property accepts the following values: -
    -
  • 1: no display, return full region string including json and comments -
  • 2: display and return shortened region string (no json or comments) -
  • 3: display and return full region string (including json and comments) -
- -
List groups
-

-gstr = JS9.ListGroups(group, opts) -

-where: -

    -
  • group: which group to list or "all" -
  • opts: optional options object -
-returns: -
    -
  • gstr: group string -
-

-List the specified region/shape group(s) in the specified layer (default is -"regions"). The first argument is the groupid of the group to list, -or "all" to list all groups. - -

-The optional opts object can contain the following properties: -

    -
  • includeregions: display regions as well as the group name (default: true) -
  • layer: layer to list (default is "regions") -
-By default, the display will includes the name of the group and the -regions in the group. To skip the display of regions, supply -an opts object with the includeregions property set to false. - -For example: -
-    JS9.ListGroups("all", {"includeregions": false})
-    grp1
-    grp2
-    grp3
-
-    JS9.ListGroups("grp1")
-    grp1:
-    circle(3980.00,4120.00,20.00) # source,include,foo1
-    ellipse(4090.00,4120.00,25.00,15.00,0.0000) # source,include,foo1
-
-

-See JS9.GroupRegions() -for more information about region groups. - -

Edit one or more selected regions
-

-JS9.EditRegions() -

-Edit one or more selected regions using an Edit dialog box. If a -single region has been selected by clicking that region, all of its -properties can be edited via the displayed dialog box. If a group of -regions has been selected using Meta-mousemove to highlight one or -more regions, then properties such as color, stroke width, dash -pattern, and tags can be edited for all of the selected regions using -the displayed dialog box. In the latter case, use shift-click to add -additional regions to the edit group. - -

Change one or more regions
-

-JS9.ChangeRegions(regions, opts) -

-where: -

    -
  • regions: which regions to change -
  • opts: object containing options to change in each region -
-Change one or more regions. -The first argument is the regions selection. -If not specified, it defaults to "selected" if there are selected regions, -otherwise "all". - -

-The opts object can contain the parameters -described in the -JS9.AddRegions() -section. However, you cannot (yet) -change the shape itself (e.g., from "box" to "circle".) See js9onchange.html -for examples of how to use this routine. -

-By default, if you change the color of a region, the color of the text -associated with that region also will be changed: -

-    # color of text associated with this region also will be changed to red
-    JS9.ChangeRegions("circle", {"color": "red"});
-
-You can turn off synchronization of text colors either by setting the -JS9.globalOpts.regSyncTextColor site property to false or -by setting the synctextcolor option to false in the opts object: -
-    # color of text associated with this region will not be changed to red
-    JS9.ChangeRegions("circle", {"color":"red", "synctextcolor":false});
-
-Note that you also can change the JS9.globalOpts.regSyncTextColor -property via the Global tab of the Preferences plugin. -

-If you pass the empty string to color, strokeWidth, -or strokeDashArray, the specified property will be reset as follows: -

    -
  • color: reset based on source/bkgd include/exclude tags -
  • strokeWidth: reset to initial JS9.Fabric.opts.strokeWidth value -
  • strokeDashArray: reset to a solid line -
-For example: -
-    # change circles to be red with a dash pattern
-    JS9.ChangeRegions("circle", {color:"red", strokeDashArray:[3,1]});
-
-    # reset color and dash pattern
-    JS9.ChangeRegions("circle", {color:"", strokeDashArray:""});
-
- -

- -

Copy one or more regions to another image
-

-JS9.CopyRegions(to, regions) -

-where: -

    -
  • to: image id to which to copy regions -
  • regions: which regions to copy -
-Copy regions to a different image. If to is "all", then the regions are -copied to all images. -

-The first argument is the regions selection. -If not specified, it defaults to "selected" if there are selected regions, -otherwise "all". - -

Remove one or more regions from the region layer
-

-JS9.RemoveRegions(regions) -

-where: -

    -
  • regions: which regions to remove -
-The selected regions are removed. -The first argument is the regions selection. -If not specified, it defaults to "selected" if there are selected regions, -otherwise "all". - -

-If JS9.globalOpts.resetEmptyShapeId is set to true (default -is false), the region id counter will be reset to 0 whenever all the -regions are removed. - -

Unremove one or more previously removed regions
-

-JS9.UnremoveRegions() -

-If you accidentally remove one or more regions, you can use restore -them using this call. JS9 maintains a stack of removed regions (of -size JS9.globalOpts.unremoveReg, current default is 100.) Each -time one or more regions is removed, they are stored as a single entry -on this stack. The UnremoveRegions call pops the last entry off -the stack and calls AddRegions. - -

Save regions from the current image to a file
-

-JS9.SaveRegions(filename, which, layer) -

-where: -

    -
  • filename: output file name -
  • which: which regions to save (default is "all") -
  • layer: which layer to save (default is "regions") -
-Save the current regions for the displayed image as a JS9 regions text -file. If filename is not specified, the file will be saved as -"js9.reg". If the string "dialogbox" is passed in the filename and no -other arguments are specified, the Save Regions dialogbox is displayed -instead of actually saving regions to a file. - -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. - -

-If the which argument is not specified, it defaults to "all". You -can specify "selected" to return information about the selected regions, or -a tag value to save regions having that tag. - -

-If the layer argument is not specified, it defaults to -"regions", i.e., the usual regions layer. You can specify a different -layer, e.g., if you want to save a catalog layer as a region file -(since JS9.SaveCatalog() -will save the data in table format instead of as regions.) - -

-The layer argument can also be an object or a JSON-formatted string -containing these properties: -

    -
  • layer: the name of the layer -
  • format: output format: reg, csv, or svg -
  • type: backward compatible alias for format (deprecated) -
  • wcssys: wcs system to use (ICRS, FK5, galactic, physical, etc.) -
  • wcsunits: units for wcs output (sexagesimal, degrees, pixels) -
  • includejson: for reg files, include JSON object in output -
  • includecomments: for reg files, include comments in output -
  • includewcs: for csv files, include wcs keyword(s) in output -
-If the format is svg, an SVG/XML file will be saved -instead of the standard astronomical regions file. This SVG file can -be imported into programs such as Photoshop for further processing. - -

-If the format is csv, a text file will be saved with -the regions output as comma separated values: -

-    JS9.SaveRegions("foo", "all", {"format":"csv", "wcsunits":"degrees"})
-
-    circle,350.866288,58.811911,0.004099
-    box,350.897858,58.834207,0.011111,0.005556,20.000000
-
-Note that the region's wcs keyword is not passed by default in order -to make processing easier. You can force its inclusion by setting -the includewcs property to true. - -

-If the output format is set to svg (or csv), the default filename -will be "js9.svg" ("js9.csv") instead of "js9.reg". Similarly, if a -filename is specified that ends in ".svg" (or ".csv"), the format will be -set to svg (csv). - -

Change region tags for the specified image(s)
-

-JS9.ChangeRegionTags(which, addreg, removereg) -

-where: -

    -
  • which: which regions to process (default is "all") -
  • addreg: array or comma-delimited string listing regions to add -
  • removereg: array or comma-delimited string listing regions to remove -
-While region tags can be changed wholesale using the -JS9.ChangeRegions() routine, -this routine allows you to add and/or remove specific tags. The first -argument specifies which regions to change. The second argument is a -list of tags to add, while the third argument is a list of tags to -remove. In each case, the tags argument can be an array of tag strings -or a single string containing a comma-separated list of tags: -
-    JS9.ChangeRegionTags("selected", ["foo1", "foo2"], ["goo1", "goo2"]);
-    JS9.ChangeRegionTags("selected", "foo1,foo2", "goo1,goo2");
-
-Each of the above routines adds two "foo" tags and removes two "goo" -tags from the selected region(s). - -
Gather Regions into a Temporary Selection
-

-JS9.SelectRegions(regions) -

-where: -

    -
  • regions: which regions to select -
-JS9 has a rich mouse-based interface for selecting regions: a single -region is selected by clicking on it. A number of regions can be -gathered into a temporary selection by pressing the left mouse button and -dragging the mouse over the desired regions. To add to an -already-existing selection, shift-click the mouse on a region. - -

-A regions selection can be moved, resized, or retrieved as a -single unit. The selection is destroyed when the mouse is clicked -outside the selection, or when -JS9.UnselectRegions() -is called. - -

-This routine allows you to create a selection programmatically by -specifying which regions make up the selection. The first argument is -the regions selection. If not -specified, it defaults to "all" (since it doesn't make sense to -default to the already-selected regions, does it?). The result of the -call will be a selection of regions which can be moved as one unit. - -

-For example: -

-    # select all circles
-    JS9.SelectRegions("circle");
-
-    # select all circles not having tag 'foo2'
-    JS9.SelectRegions("circle && !foo2");
-
- -

-Regions in a selection are processed individually, -i.e. a regions selection will match -the regions inside a group. Thus for example, if you create a -selection containing circles, changing the color using the "circle" -specification will also affect the circles within the selection. You -can, of course, process only the regions inside a selection using -the selected specification. - -

-To create more long-lived groups (i.e., which are not destroyed -when you click the mouse outside the region), see -JS9.GroupRegions(). - -

Remove Regions From a Selection
-

-JS9.UnselectRegions(regions) -

-where: -

    -
  • regions: which regions to unselect -
-JS9 has a rich mouse-based interface for selecting regions: a single -region is selected by clicking on it. A number of regions can be -gathered into a group selection by pressing the left mouse button and -dragging the mouse over the desired regions. To add to an -already-existing selection, shift-click the mouse on a region. - -

-This routine allows you to remove one or more regions from a region -selection programmatically by specifying which regions to remove. -The first argument is the regions selection. -If not specified, or specified as "all" or "selected", the selection is undone. -Otherwise, the result of the call will be a new selection, not containing -the unselected regions, which can be moved as one unit. - -

-For example: -

-    # select all circles and ellipses
-    JS9.SelectRegions("circle || ellipse");
-
-    # unselect circles not having tag 'foo2'
-    JS9.UnselectRegions("circle && !foo2");
-
- -
Gather Regions into a Long-lived Group
-

-JS9.GroupRegions(regions, opts) -

-where: -

    -
  • regions: which regions to group -
  • opts: optional object containing grouping options -
-returns: -
    -
  • groupid: the group id associated with the newly created group -
- -

-A region group can be moved and resized as a single unit. To -first order, it is a long-lived form of a region selection. -The latter gets dissolved when you click the mouse outside the -selection, but a region group is dissolved only by -calling JS9.UngroupRegions(). - -

-This routine allows you to create a group by specifying the regions -which will compose it. The first argument is -the regions selection. If not -specified, it defaults to either "selected" or "all", depending on -whether a region selection currently exits. - -

-The optional opts argument contains the following properties: -

    -
  • groupid: the group id to use, if possible (default: "group_[n]") -
  • select: if false, the group is not selected upon creation -
-

-By default, the groupid will be the string "group_" followed by -an integer chosen so that the groupid is unique. You can supply your -own groupid, but if it already is associated with an existing group, -an integer value will be appended to make it unique. Also, by default -the newly created group will be "selected". You can pass -the select property with a value of false in order to -avoid selecting the group (e.g., if you are creating a number of -groups and don't want to see each of them selected in turn.) - -

-The returned groupid string can be used to select and process all the -regions in that group. Thus, for example, you can use the groupid to -change the color of all grouped regions: -

-    # make a group from all circles having the tag foo1
-    gid = JS9.GroupRegions("circle && foo1");
-
-    # change color of all regions in the group
-    JS9.ChangeRegions(gid, {"color":"red"});
-
-Furthermore, when creating a regions file via -JS9.SaveRegions(), the groupid will -be stored in each grouped region's JSON object, and will be used to -reconstitute the group when the file is reloaded. - -

-Note however, that unlike the temporary region selections, -regions in a group are not available individually, -i.e., a regions selection using a -non-groupid does not match regions inside a group. Thus, for -example, if you have created a group of circles, changing the color -using a "circle" specification does not affect circles within the group: -

-    # make a group from all circles having the tag foo1
-    gid = JS9.GroupRegions("circle && foo1");
-
-    # change color of circle regions, but NOT including those in any group
-    JS9.ChangeRegions("circle", {"color":"cyan"});
-
-    # change color of all regions in the group
-    JS9.ChangeRegions(gid, {"color":"red"});
-
- -

-Furthermore, a given region can only be part of one group at a -time. In the case where a region already is part of an existing group, -the globalOpts.regGroupConflict property determines how that region -is processed. The default is skip, meaning that the region is -silently skipped over when creating the new group. The alternative -is error, which will throw an error. - -

-To create a more temporary selection, see -JS9.SelectRegions(). - -

Dissolve a Group of Regions
-

-JS9.UngroupRegions(groupid, opts) -

-where: -

    -
  • groupid: group id of the group to dissolve -
  • opts: optional object containing ungrouping options -
- -

-This routine allows you to dissolve an existing group, so that the -regions contained therein once again become separate. -The first argument is the groupid, previously returned by the -JS9.GroupRegions() call. - -

-The optional opts argument contains the following properties: -

    -
  • select: newly separate regions in the group are "selected"? -
-By default, the ungrouped regions unobtrusively take their place among -other regions on the display. You can make them be selected by -passing the select: true property in opts. Doing this, for -example, would allow you to remove them easily with the Delete key. -

-For example: -

-    # group all circles and ellipses
-    gid = JS9.GroupRegions("circle || ellipse");
-
-    # ungroup so the regions are again separate
-    JS9.UngroupRegions(gid)
-
-    # change color of circle regions, including the newly ungrouped ones
-    JS9.ChangeRegions("circle", {"color":"cyan"});
-
- -
Toggle two region tags for the specified image(s)
-

-JS9.ToggleRegionTags(which, t1, t2) -

-where: -

    -
  • which: which regions to process (default is "all") -
  • t1: tag #1 to toggle -
  • t2: tag #2 to toggle -
-While region tags can be changed wholesale using the -JS9.ChangeRegions() routine, -this routine allows you to toggle between two tags, e.g., a source -region and background region, or between include and -exclude. For example: -
-    JS9.ToggleRegionTags("selected", "source", "background");
-
-will change a background region into a source region -or vice-versa, depending on the state of the region, while: -
-    JS9.ToggleRegionTags("selected", "include", "exclude");
-
-will toggle between include and exclude. - -
Load regions from a file into the current image
-

-JS9.LoadRegions(filename, opts) -

-where: -

    -
  • filename: input file name or URL -
  • opts: global region options for all regions -
-Load the specified regions file into the displayed image. The filename, -which must be specified, can be a local file (with absolute path or a -path relative to the displayed web page) or a URL. -

-The opts property specifies global options that are applied to -all regions in the file. They will be over-ridden by individual region -properties attached to a given region. For example, if a region file -named "foo.reg" contains the following regions: -

-    # Region file format: JS9 version 1.0
-    image
-    circle(512.0, 512.0, 40) {"color": "red"}
-    box(512.0, 512.0, 40, 40)
-    annulus(512.0, 512.0, 0.0, 3.0, 12.0, 18.0, 27.0)
-
-then a command such as: -
-    JS9.LoadRegions("foo.reg", {color: "blue"});
-
-will create a red circle, a blue box, and a blue annulus. -

-The opts object also can include an onload property containing a -function to be called when the load is complete. The image handle is passed -as an argument to this function. - -

-If the same region file is loaded more than once, behavior is -determined by the JS9.globalOpts.reloadRefreshReg property. -If set to true (the default), all previous regions loaded from -the file are removed (regardless of their current position, size, -etc.) If set to false, the new regions are added to the -previous ones. Site authors can change this property in js9prefs.js, -while users can change this via the Global tab of the -Preferences plugin. - -


- -

Working with Shape Layers

- -

-JS9 supports individual layers for drawing 2D graphics. The ubiquitous -Regions layer is a special case of a shape -layer, created automatically by JS9. The Catalog plugin creates a -separate layer for each catalog. You can define your own shape layer -using the NewShapeLayer() call and then add geometric shapes to it. - -

-One of the most important aspects of using shapes is the ability to assign -different characteristics to shapes and then make selections based on -these characteristics. The -JS9.ChangeShapes(), -JS9.GetShapes(), -JS9.RemoveShapes(), -and -JS9.SelectShapes() -calls all take a -regions selection -as the second argument, which functions identically to the way in which -Regions selections are made. - -

Create a new shape layer
-

-lid = JS9.NewShapeLayer(layer, opts) -

-where: -

    -
  • layer: name of the layer to create -
  • opts: default options for this layer -
-returns: -
    -
  • lid: layer id -
-This routine creates a new named shape layer. You can then, add, change, -and remove shapes in this layer using the routines below. The catalogs -displayed by the Catalog plugin are examples of separate shape layers. -

-The opts parameter allows you to specify default options for -the new layer. Although this argument is optional, you generally will -want to set default values for various properties utilized by your -new shape layer. See JS9.Regions.opts in js9.js for example of the default -options for the regions layer. This is a good set of options to pass if -you want region-like behavior in your new layer. -

-The JS9.Catalogs.opts object is also supplied as a possible baseline -object for new shape layers. It differs from the JS9.Regions.opts in a -few important ways: -

    -
  • it makes the new layer non-interactive: individual shapes cannot be -moved, rotated, resized, or deleted, nor do they respond to events -
  • it sets the updateWCS property to false, so the relatively expensive operation of updating the WCS string is not performed when an object is modified -
  • it does not sort overlapping shapes so that the smallest is on top when a shape is moved -
  • it does not define regions-specific processing (e.g., double-click to edit a region parameters) -
-

-Starting with the JS9.Catalogs.opts object as a default, you can make -the new layer interactive in a few different ways. The first way is to -set the movable property in the opts object to true. -This will permit individual shapes to be moved, rotated, resized and -deleted. Shapes also will be movable and resizable as a group. -

-The second way is to supply one or more event callbacks as properties -to the opts object: -

    -
  • onmousedown: function(im, xreg, evt); -
  • onmouseup: function(im, xreg, evt); -
  • onmousemove: function(im, xreg, evt); -
  • onmouseover: function(im, xreg, evt); -
  • onmouseout: function(im, xreg, evt); -
-When the associated mouse event occurs on a shape, these functions -will be called with the following arguments: -
    -
  • im: the image handle for the currently displayed image -
  • xreg: the shape object, as described in JS9.GetShapes() -
  • evt: the original event object -
-For example, to define mouseover and mousedown callbacks: -
-    opts.onmouseover = function(im, xreg, evt){
-        console.log("mouseover: %s %s", im.id, xreg.data.tag);
-    };
-    opts.onmousedown = function(im, xreg, evt){
-        console.log("mousedown: %s %s", im.id, xreg.data.tag);
-
-Note that the shapes are still not movable unless you also set -the movable property. -

-In addition to firing callbacks on events for individual shapes, you -can set the ongroupcreate property in the opts object to a -function that will fire when two or more objects are selected into a -group (which is done using the Command key on a Mac, -or Control key everywhere else): -

    -
  • ongroupcreate: function(im, xreg, id); -
-The function will be called with the following arguments: -
    -
  • id: group id -
  • im: the image handle for the currently displayed image -
  • xreg: an array of shape objects within the group -
-Note that an array of xreg objects is passed in this case instead of -the single "current" object passed in the other event callbacks. -For example: -
-    opts.ongroupcreate = function(id, im, xreg){
-        var i, nshape, xcen, ycen;
-        var xtot=0, ytot=0;
-        nshape = xreg.length;
-        console.log("group: %s", id);
-        for(i=0; i<nshape; i++){
-          xtot += xreg[i].x; ytot += xreg[i].y;
-        }
-        xcen = xtot / nshape; ycen = ytot / nshape;
-        console.log("average pos for %s objects: %s,%s", nshape, xcen, ycen);
-    }
-
-

-The final way to make a shape layer interactive is to specify -a tooltip to display when hovering over objects in this shape -layer. This is done by assigning a tooltip format string to -the tooltip property of the opts object. This string can -contain HTML directives, and it also can contain references to -properties in the im, xreg, and evt objects. When the mouse hovers -over an object, a tooltip string is generated by macro-expanding the -values for these properties. The generated tooltip string is displayed -as the inner HTML of the tooltip. When the mouse leaves the object, -the tooltip is hidden. -

-For example, consider the following tooltip string: -

-    opts.tooltip = "<b>id: $im.id</b><br>pos: $xreg.x $xreg.y<br><i>$xreg.data.tag</i>";
-
-Note how properties of the im and xreg objects are -specified with a "$" prefix. When the mouse hovers over an object, the -generated tooltip will display current image id in bold, followed by -that object's x,y pixel position, followed by a user tag -property passed in the data object when the shape was added. -As a convenience, $data can be used as a shorthand for $xreg.data. - -
Show or hide the specified shape layer
-

-JS9.ShowShapeLayer(layer, mode) -

-where: -

    -
  • layer: name of layer -
  • mode: true (show layer) or false (hide layer) -
-Shape layers can be hidden from display. This could be useful, for -example, if you have several catalogs loaded into a display and -want to view one at a time. -

-If mode is true, a previously hidden shape layer will be displayed. If -mode is false, a displayed shape layer will be hidden. If the -mode argument is not supplied, the current mode is returned. - -

Toggle display of the active shape layers
-

-JS9.ToggleShapeLayers() -

-While JS9.ShowShapeLayer() allows you to -display or hide a single shape layer, this routine will toggle display -of all active layers in the current image. An active layer is one that -has not been turned off using the Shape Layers plugin or -JS9.ShowShapeLayer(). - -

-The routine remembers which layers were active at the moment when -layers are hidden and restores only those layers in the next toggle. -Thus, if you have two layers, "regions" and "catalog1", and the -"catalog1" layer has previously been turned off, calling this routine -repeatedly will turn on and off the "regions" layer only. - -

Make the specified shape layer the active layer
-

-JS9.ActiveShapeLayer(layer) -

-where: -

    -
  • layer: name of layer -
-returns: -
    -
  • active: the active shape layer (if no args are specified) -
- -For a given image, one shape layer at a time is active, -responding to mouse and touch events. Ordinarily, a shape layer -becomes the active layer when it is first created and shapes are -added to it. Thus, the first time you create a region, the regions -layer becomes active. If you then load a catalog into a catalog layer, -that layer becomes active. - -

-If no arguments are supplied, the JS9.ActiveShapeLayer() -routine returns the currently active layer. Specify the name of a -layer as the first argument to make it active. Note that the specified -layer must be visible. - -

-This routine forms the basis for the Shape Layer plugin, which -provides a graphical way to make a layer active (by moving it to the -top of the layer stack.) - -

Add one or more shapes to the specified layer
-

-JS9.AddShapes(layer, sarr, opts) -

-where: -

    -
  • layer: name of layer -
  • sarr: a shape string, shape object, or an array of shape objects -
  • opts: global values to apply to each created shape -
-returns: -
    -
  • id: id of last shape created -
-The sarr argument can be a shape ("annulus", "box", -"circle", "cross", "ellipse", "point", "polygon", "text"), a single shape -object, or an array of shape objects. Shape objects contain one or -more properties, of which the most important are: -
    -
  • shape: "annulus", "box", "circle", "cross", "ellipse", "point", "polygon", "text" [REQUIRED] -
  • x: image x position -
  • y: image y position -
  • deltax: increment from current image x position -
  • deltay: increment from current image y position -
  • tags: comma-separated list of tag strings or array of tag strings -
  • radii: array of radii for annulus shape -
  • width: width for box or cross shape -
  • height: height for box or cross shape -
  • radius: radius value for circle shape -
  • r1: x radius for ellipse shape (misnomer noted) -
  • r2: y radius for ellipse shape (misnomer noted) -
  • pts: array of objects containing x and y positions, for polygons -
  • points: array of objects containing x and y offsets from the specified center, for polygons -
  • angle: angle in degrees for box, ellipse, cross shapes -
  • color: shape color (string name or #rrggbb syntax) -
  • text: text associated with text shape -
  • data: this property can be an object, string, number, -etc. and will be carried along with the shape, and returned as a -property by the -JS9.GetShapes() call. -
-Other available properties include: -
    -
  • changeable: if false, region cannot be moved, resized, rotated -
  • locked: 'opposite alias' of changeable -
  • movable: if false, region cannot be moved -
  • resizable: if false, region cannot be resized or rotated -
  • rotatable: if false, region cannot be rotated -
  • removable: if false, region cannot be removed -
  • zoomable: if false, region is not resized when image is zoomed -
  • selectable: if false, region can't be selected (no GUI-based changes) -
  • lockMovementX: if true, region cannot be moved in the x direction -
  • lockMovementY: if true, region cannot be moved in the y direction -
  • lockScalingX: if true, region cannot be resized in the x direction -
  • lockScalingY: if true, region cannot be resized in the y direction -
  • lockRotation: if true, region cannot be rotated -
  • fontFamily: font parameter for text region -
  • fontSize: font parameter for text region -
  • fontStyle: font parameter for text region -
  • fontWeight: font parameter for text region -
- -
Remove one or more shapes from the specified shape layer
-

-JS9.RemoveShapes(layer, shapes) -

-where: -

    -
  • layer: name of layer -
  • shapes: which shapes to remove -
-The selected shapes are removed from the specified layer. -The second argument is the regions -selection. If not specified, it defaults to "all". - -

-If JS9.globalOpts.resetEmptyShapeId is set to true (default -is false), the shape id counter will be reset to 0 whenever all the -shapes are removed. - -

Get information about one or more shapes in the specified shape layer
-

-JS9.GetShapes(layer, shapes) -

-where: -

    -
  • layer: name of layer -
  • shapes: which shapes to retrieve -
-returns: -
    -
  • sarr: array of shape objects -
-

-Each returned shape object contains the following properties: -

    -
  • id: numeric region id (assigned by JS9 automatically) -
  • mode: "add", "remove", or "change" -
  • shape: region shape ("annulus", "box", "circle", "cross", "ellipse", -"point", "polygon", "text") -
  • tags: comma delimited list of region tags (e.g., "source", "include") -
  • color: region color -
  • x,y: image coordinates of region -
  • size: object containing width and height for box, cross region -
  • radius: radius value for circle region -
  • radii: array of radii for annulus region -
  • eradius: object containing x and y radii for ellipses -
  • pts: array of objects containing x and y positions, for polygons -
  • angle: angle in degrees for box, ellipse, cross -
  • data: data property passed in options object when this shape was created. -
- -
Change one or more shapes in the specified layer
-

-JS9.ChangeShapes(layer, shapes, opts) -

-where: -

    -
  • layer: name of layer -
  • shapes: which shapes to change -
  • opts: object containing options to change in each shape -
-Change one or more shapes in the specified layer. The opts object can -contain the parameters described in the -JS9.AddShapes() -section. However, you cannot (yet) -change the shape itself (e.g., from "box" to "circle".) - -

-The second argument is the regions -selection. If not specified, it defaults to "all". - -

Copy a shape layer to another image
-

-JS9.CopyShapes(to, layer) -

-where: -

    -
  • to: image id to which to copy shapes -
  • layer: shape layer to copy -
-Copy the shapes in a shape layer to a different image. If to is -"all", then the shapes are copied to all images. -

-All shapes in the shape layer are copied to the new image. - -

Group Shapes into a Selection
-

-JS9.SelectShapes(layer, shapes) -

-where: -

    -
  • layer: shape layer -
  • shapes: which shapes to select -
-JS9 has a rich mouse-based interface for selecting shapes: a single -shape is selected by clicking on it. A number of shapes can be -gathered into a group selection by pressing the left mouse button and -dragging the mouse over the desired shapes. To add to an -already-existing selection, shift-click the mouse on a shape. - -

-A selected group of regions can be moved, resized, or retrieved as a -single unit. The selected group is destroyed when the mouse is clicked -outside the selection, or when -JS9.UnselectShapes() -is called. - -

-This routine allows you to create a group selection programmatically by -specifying which shapes make up the selection. The first argument is the -shape layer. The second argument is the regions -selection. If not specified, it defaults to "all" (since it -doesn't make sense to default to the already-selected shapes, does it?). -The result of the call will be a selected group which can be moved as one unit. - -

Remove Shapes From a Selection
-

-JS9.UnselectShapes(layer, shapes) -

-where: -

    -
  • layer: shape layer -
  • shapes: which shapes to unselect -
-JS9 has a rich mouse-based interface for selecting shapes: a single -shape is selected by clicking on it. A number of shapes can be -gathered into a selection by pressing the left mouse button and -dragging the mouse over the desired shapes. To add to an -already-existing selection, shift-click the mouse on a shape. - -

-This routine allows you to remove one or more shapes from a group -selection programmatically by specifying which shapes to remove. The -first argument is the shape layer. The second argument is -the regions selection. If not -specified, or specified as "all" or "selected", the selection is -undone. The result of the call will be a new selected group, not -containing the unselected shapes, which can be moved as one unit. - -

Gather Shapes into a Long-lived Group
-

-JS9.GroupShapes(layer, shapes, opts) -

-where: -

    -
  • layer: shape layer -
  • shapes: which shapes to group -
  • opts: optional object containing grouping options -
-returns: -
    -
  • groupid: the group id associated with the newly created group -
- -

-A shape group can be moved and resized as a single unit. To -first order, it is a long-lived form of a region selection. -The latter gets dissolved when you click the mouse outside the -selection, but a shape group is dissolved only by -calling JS9.UngroupShapes(). - -

-This routine allows you to create a group by specifying the shapes -which will compose it. The first argument is the shape layer. The -second argument is the regions selection. -If not specified, it defaults to either "selected" or "all", -depending on whether a shape selection currently exits. - -

-The optional opts argument contains the following properties: -

    -
  • groupid: the group id to use, if possible (default: "group_[n]") -
  • select: if false, the group is not selected upon creation -
-

-By default, the groupid will be the string "group_" followed by -an integer chosen so that the groupid is unique. You can supply your -own groupid, but if it already is associated with an existing group, -an integer value will be appended to make it unique. Also, by default -the newly created group will be "selected". You can pass -the select property with a value of false in order to -avoid selecting the group (e.g., if you are creating a number of -groups and don't want to see each of them selected in turn.) - -

-The returned groupid string can be used to select and process all the -shapes in that group. Thus, for example, you can use the groupid to -change the color of all grouped shapes: -

-    # make a group from all circles having the tag foo1
-    gid = JS9.GroupShapes("myregions", "circle && foo1");
-
-    # change color of all shapes in the group
-    JS9.ChangeShapes("myregions", gid, {"color":"red"});
-
- -

-Note however, that unlike the temporary shape selections, -shapes in a group are not available individually, -i.e., a shapes selection using a -non-groupid does not match shapes inside a group. Thus, for -example, if you have created a group of circles, changing the color -using a "circle" specification does not affect circles within the group: -

-    # make a group from all circles having the tag foo1
-    gid = JS9.GroupShapes("myregions", "circle && foo1");
-
-    # change color of circle shapes, but NOT including those in any group
-    JS9.ChangeShapes("myregions", "circle", {"color":"cyan"});
-
-    # change color of all shapes in the group
-    JS9.ChangeShapes("myregions", gid, {"color":"red"});
-
- -

-Furthermore, a given shape can only be part of one group at a -time. In the case where a shape already is part of an existing group, -the globalOpts.regGroupConflict property determines how that shape -is processed. The default is skip, meaning that the shape is -silently skipped over when creating the new group. The alternative -is error, which will throw an error. - -

-To create a more temporary selection, see -JS9.SelectShapes(). - -

Dissolve a Group of Shapes
-

-JS9.UngroupShapes(layer, groupid, opts) -

-where: -

    -
  • layer: shape layer -
  • groupid: group id of the group to dissolve -
  • opts: optional object containing ungrouping options -
- -

-This routine allows you to dissolve an existing group, so that the -shapes contained therein once again become separate. The first -argument is the shape layer. The second argument is -the groupid, previously returned by the -JS9.GroupShapes() call. - -

-The optional opts argument contains the following properties: -

    -
  • select: newly separate shapes in the group are "selected"? -
-By default, the ungrouped shapes unobtrusively take their place among -other shapes on the display. You can make them be selected by -passing the select: true property in opts. Doing this, for -example, would allow you to remove them easily with the Delete key. - -

-For example: -

-    # group all circles and ellipses
-    gid = JS9.GroupShapes("myregions", "circle || ellipse");
-
-    # ungroup so the shapes are again separate
-    JS9.UngroupShapes("myregions", gid)
-
-    # change color of circle shapes, including the newly ungrouped ones
-    JS9.ChangeShapes("myregions", "circle", {"color":"cyan"});
-
- -
Load an astronomical catalog
-

-JS9.LoadCatalog(layer, table, opts) -

-where: -

    -
  • layer: name of shape layer into which to load the catalog -
  • table: string or blob containing the catalog table, or file name -
  • opts: catalog options -
-Astronomical catalogs are a special type of JS9 shape layer, in which -the shapes have been generated from a tab-delimited text file of -columns, including two columns that contain RA and Dec values. An -astronomical catalog can have a pre-amble of comments, which, by -default, have a '#' character in the first column. - -

-Two examples of catalog files are shown below: -

-  ra        	dec        	magj	magh	magk
-  -----------	------------	------	----	----
-  23:22:56.003	58:44:45.429	15.612	15.103	14.9
-  23:22:56.230	58:45:32.011	13.723	13.174	12.981
-  23:22:56.319	58:45:08.954	14.212	13.119	12.723
-  ...
-
-  #
-  #   VizieR Astronomical Server vizier.u-strasbg.fr
-  # ...
-  #Coosys	J2000:	eq_FK5 J2000
-  # ...
-  #Title: 2MASS All-Sky Catalog of Point Sources (Cutri+ 2003)
-  # ...
-  #Column	_RAJ2000	(A12)		[ucd=pos.eq.ra]
-  #Column	_DEJ2000	(A12)		[ucd=pos.eq.dec]
-  #Column	RAJ2000	(F10.6)		[ucd=pos.eq.ra;meta.main]
-  #Column	DEJ2000	(F10.6)		[ucd=pos.eq.dec;meta.main]
-  #Column	2MASS	(a17)		[ucd=meta.id;meta.main]
-  # ...
-  #Column	Aflg	(I1)		[ucd=meta.code]
-  _RAJ2000	_DEJ2000	RAJ2000	DEJ2000	2MASS	Jmag	e_Jmag	Hmag	  e_Hmag	Kmag	e_Kmag	Qflg	Rflg	Bflg	Cflg	Xflg	Aflg
-  ------------	------------	----------	----------	-----------------	------	------	------	------	------	------	---	---	---	---	-	-
-  23 22 56.002	+58 44 45.43	350.733342	+58.745953	23225600+5844454 	15.612	 0.064	15.103	 0.078	14.900	 0.121	AAB	222	111	ccc	0	0
-  23 22 59.647	+58 44 56.84	350.748531	+58.749123	23225964+5844568 	15.580	 0.063	14.922	 0.072	14.506	 0.079	AAA	222	111	c00	0	0
-  23 22 56.981	+58 44 44.61	350.737422	+58.745724	23225698+5844446 	14.920	 0.049	14.292	 0.049	14.002	 0.055	AAA	222	111	ccc	0	0
-  ...
-
-Notice that both files have a tab-delimited header, followed by a -tab-delimited line of dashes, followed by tab-delimited data rows. This file -format is sometimes called "tsv" or "tab-separated values". A very useful -astronomical package for manipulating tables is -Starbase, -written by John Roll. - -

-The JS9.LoadCatalog() routine will read a file in this format, -processing the data rows by converting the RA and Dec values into -image position values that will be displayed as shapes in a new -catalog layer. - -

-The first argument to the JS9.LoadCatalog() routine is the name -of the shape layer that will contain the objects in the catalog. Specifying -the name of an existing layer is valid: previous shapes in that layer will -be removed. - -

-The second argument is either a blob or a string containing the table -data described above. Blobs are the result of loading a local file -into the browser (e.g., the load catalog menu option), while -strings result from a remote XHR call (e.g., the Archives and -Catalogs plugin.) Alternatively, the second string argument can -be a file name or URL to load. File names are distinguished from -strings containing a table in that the latter must contain at least one -tab. - -

-The third argument is an optional object used to specify parameters, including: -

    -
  • xcol: name of the RA column in the table (default is a heuristic, see below) -
  • ycol: name of the Dec column in the table (default is a heuristic, see below) -
  • wcssys: WCS system (FK4, FK5, ICRS, galactic, ecliptic) (default is from globalOpts) -
  • shape: shape of catalog object (default is from globalOpts) -
  • color: color of catalog shapes (default is from globalOpts) -
  • width: width of box catalog shapes (default is from globalOpts) -
  • height: height of box catalog shapes (default is from globalOpts) -
  • radius: radius of circle catalog shapes (default is from globalOpts) -
  • r1: r1 of ellipse catalog shapes (default is from globalOpts) -
  • r2: r2 of ellipse catalog shapes (default is from globalOpts) -
  • save: save the catalog properties for each generated shape (default is from globalOpts) -
  • tooltip: format of tooltip string to display for each object (default is from globalOpts) -
  • skip: comment character in table file (default is from globalOpts) -
-Most of these properties have default values that are stored in -the JS9.globalOpts.catalogs object: manipulate that object as -needed. The values listed above also can be changed by users via -the Catalog tab in the Preferences plugin. - -

-The opts object also can include an onload property containing a -function to be called when the load is complete. The image handle is passed -as an argument to this function. - -

-Note the second (Vizier) example table above does not actually have a columns -called "RA" and "Dec". Instead, it has "_RAJ2000", "_DEJ2000", "RAJ2000", -and "DEJ2000" columns. In order to pick RA and Dec column, a heuristic is used -based on the values contained in the JS9.globalOpts.catalogs.ras and -JS9.globalOpts.catalogs.decs arrays: -

    -
  • the opts.xcol, if defined, specifies the RA column (similarly for opts.ycol and the Dec column) -
  • otherwise try to match exactly the catalog header against all the array elements in JS9.globalOpts.catalogs.ras to get the RA column (same for catalogs.decs) -
  • if no exact match, try a case-insensitive match of the catalog columns against a regular expression that begins with the first array element in JS9.globalOpts.catalogs.ras (e.g., "RA*") -
  • if no approximate match, try a case-insensitive match of the catalog columns against a regular expression containing the first array element in JS9.globalOpts.catalogs.ras (e.g., "*RA*") -
-The default global JS9.globalOpts.catalogs.ras contains: -
-  ras:  ["RA", "_RAJ2000", "RAJ2000"]
-  decs: ["Dec", "_DEJ2000", "DEJ2000"]
-
-These defaults make it easy to process simple catalogs and Vizier -catalogs. - -

-Once the RA and Dec columns are specified, the RA and Dec values from -each row are converted into image positions, and JS9 shapes are -generated to be displayed in the new catalog layer. The WCS system -used to convert RA and Dec into image coordinates can be specified -using the opts.wcssys or JS9.globalOpts.catalogs.wcssys -properties. - -

-The RA and Dec of the catalog object are always saved in the data -object of each generated shape, for use in the tooltip string. In -addition, if opts.save (or the default: JS9.globalOpts.catalogs.save) -property is not false, all of the catalog object properties will also be -save in the data object for use in the tooltip string, e.g.: -

-  opts.tooltip = "$xreg.data.ra $xreg.data.dec $xreg.data.Qflg $xreg.data.Rflg"
-
-in the above VizieR example. Caveat: any "." (dot) in any catalog property -name will be converted to "_" (underscore) automatically. For a more detailed -discussion of tooltips, please see -JS9.NewShapeLayer(). - -

-When catalog layer has been created, you can use the Shape Layers -plugin to toggle its visibility and also to change its position in the layer -stack. - -

Save an astronomical catalog to a file
-

-JS9.SaveCatalog(filename, which) -

-where: -

    -
  • filename: output file name -
  • which: layer containing catalog objects to save -
-Save the specified catalog-containing layer as a text file. If filename is not -specified, the file will be saved as [layer].cat. - -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. - -

-If the which argument is not specified, the catalog associated -with the current active layer will be saved. In either case, the -layer to save must actually be a catalog created from a tab-delimited -file (or URL) of catalog objects (not, for example, the regions layer.) - -


- -

Mouse/Touch Gestures

- -

-JS9 supports the following configurable mouse and touch actions: -

    -
  • mouse movement with no buttons pressed -
  • mouse movement with one button pressed -
  • mouse movement with two buttons pressed -
  • touch with one finger -
  • touch with two fingers -
  • touch with three fingers -
-The initial actions are defined by the JS9.globalOpts.mouseActions -and JS9.globalOpts.touchActions arrays. In addition, the -JS9.globalOpts.mousetouchZoom property specifies whether a mouse wheel -or touch/pinch will zoom the image. The default actions are: -
    -
  • mouseActions: ["display value/position", "change contrast/bias", "pan the image"] -
  • touchActions: ["display value/position", "change contrast/bias", "pan the image"] -
  • mousetouchZoom: false -
-where the array elements map to an increasing numbers of -buttons/fingers. You can change the default actions of the elements -in either array in your js9prefs.js file. For example, to make pan -and zoom the default one-touch and pinch actions respectively: -
    -
  • touchActions: ["pan the image", "display value/position", "change contrast/bias"] -
  • mousetouchZoom: true -
-As usual, the defaults in js9prefs.js are used by all JS9 displays in -a web page. - -

-Users can change the action assignments using the MouseTouch -plugin, which displays the current mapping between mouse/touch gesture -and its action. Simply drag and drop an action to a different gesture -in order to change the mapping. You also can toggle the scroll/pinch -to zoom capability by clicking its button. - -

-Web page developers can extend the available mouse and touch actions -beyond the defaults contained in -the Mouse Touch plugin. To -add a new action, first write a function with the following calling sequence: -

-    gestureFunc(im, ipos, evt)
-
-where: -
    -
  • im: image handle -
  • ipos: image position object containing 1-indexed x and y image -coordinate values -
  • evt: a JavaScript or jQuery event -
-Add this new function to the JS9.MouseTouchActions array, using a -descriptive name as its array index, e.g.: -
-    JS9.MouseTouch.Actions["all contrast/bias"] = function(im, ipos, evt){
-      var i, myim;
-      for(i=0; i<JS9.displays.length; i++){
-        myim = JS9.displays[i].image;
-        if( myim ){
-          JS9.MouseTouch.Actions["change contrast/bias"](myim, ipos, evt);
-        }
-      }
-    };
-
-At this point, the Mouse Touch Plugin will display the new -function in its list of available actions. Users can move it into one -of the defined gestures to activate it. - -

-Of course, you can add the new action to the JS9.globalOpts.mouseActions -and/or JS9.globalOpts.touchActions arrays to make it active immediately: -

-    JS9.globalOpts.mouseActions[1] = "all contrast/bias";
-    JS9.globalOpts.touchActions[1] = "all contrast/bias";
-
-Here, we have replaced the one-button mouse move and two-button touch -move actions (whose defaults are to "change contrast/bias") with our -new action. - -


- -

Server-side Analysis

- -
Get server-side analysis task definitions
-

-JS9.GetAnalysis() -

-The JS9.GetAnalysis() routine returns an array of analysis task -definitions, each containing the following information: -

    -
  • name: a short identifier string (typically one word) -
  • title: a longer string that will be displayed in the Analysis menu -
  • files: a rule that will be matched against to determine -whether this task is available for the current image -
  • purl: a URL pointing to a web page containing a user parameter form -
  • action: the command to execute on the server side -
  • rtype: a return type, which can be text, plot, fits, regions, catalog, alert, or none -
  • hidden: if true, the analysis task is not shown in the Analysis menu -
-Not every property listed above will be present in every task definition -(e.g., purl is only present when there is a parameter form.) -Also note that hidden tasks are not returned by this call. - -
Run a server-side analysis task
-

-JS9.RunAnalysis(name, parr, func) -

-where: -

    -
  • name: name of analysis tool -
  • parr: optional array of macro-expansion options for command line -
  • func: optional routine to call when analysis is completed on server -
-The JS9.RunAnalysis() routine is used to execute a server-side -analysis task and return the results for further processing within the -web page. -The optional parr array of parameters is passed to the JS9 -analysis macro expander so that values can be added to the command -line. The array is in jQuery name/value serialized object format, -which is described here: -
-    http://api.jquery.com/serializeArray/
-
-

-The func() routine is a callback function to process the returned -results from the analysis task. The calling sequence is: -

-    func(stdout, stderr, errcode, aobj)
-
-where: -
    -
  • stdout: a string containing the standard output from the task -
  • stderr: a string containing the standard error from the task -
  • errcode: error code value from the task or 0 -
  • aobj: the analysis object from the js9Analysis.json file, - containing, among other things, the important rtype: - "text" or "plot" -
-Typically, you would check stderr string first and issue an error -message if there is an error. Otherwise, the stdout string can be -processed based on the return type (rtype) property of the output -(e.g., "text" or "plot".) For plotting, you can use flot -functionality already loaded into JS9, or you can use your own chosen -plotting package. -

-If no func callback is specified, the default processing will -display "text" in a new light window. If the return type is "plot", -the results are assumed to be in flot format and will be plotted. -

-Instead of passing a callback function each time, you can set the global -property JS9.globalOpts.analysisFunc to a function having the -same signature: -

-    func(stdout, stderr, errcode, aobj)
-
-The specified function will be called for each execution -of JS9.RunAnalysis -

-In addition, you can change the target of the analysis results display -from a light window to your own div element by setting the global -property JS9.globalOpts.analysisDiv to the id of your new -target div. The div must have CSS height and width properties if you -are going to plot results. - -

Run a server-side analysis task, utilizing -parameters in a form
-

-JS9.SubmitAnalysis(el, name, func) -

-where: -

    -
  • el: form element (unused at present) -
  • name: name of analysis tool -
  • func: optional routine to call when analysis is completed on server -
-The JS9.SubmitAnalysis() routine is used to run an analysis -task with input parameters from a form. Typically used as -the Run button action in a form, it automatically serializes -the form values and passes them to the JS9 analysis macro expander so -that these values can be integrated into the analysis command line. -See js9analysis.html for a simple example. -

-The func callback and global options are the same as -for -JS9.RunAnalysis() -above. - -


- -

Working with Displays

- -
Display the Next (or Previous) Image
-

-JS9DisplayNextImage(n) -

-where: -

    -
  • n: number of images beyond (or prior to) the one currently displayed -
-The JS9.DisplayNextImage() routine displays the nth image in -the display's image list beyond the currently displayed image. The -default value for n is 1. You can supply a negative number to -display an image prior to the current one in the display's image list. - -
Create a Mosaic Image
-

-JS9.CreateMosaic(which, opts) -

-where: -

    -
  • which: which images to use in the mosaic -
  • opts: mosaic options -
- -The JS9.CreateMosaic() creates a mosaic image from the -specified (previously-loaded) FITS images using the -mProjectPP -and -mAdd -programs from the -Montage software suite. -These Montage programs have been compiled into JS9 using -Emscripten. - -

-Because the browser environment is memory-limited, there are some -restrictions on generating mosaics in JS9. The FITS files must be -well-behaved, i.e., they must have WCS projections which can be -approximated by tangent-plane projections (TAN, SIN, ZEA, STG, ARC.) -This precludes creating mosaics from images covering large portions of -the sky. For large sky areas, please use Montage itself on your desktop -to create a mosaic. A simplified js9mosaic script is included in -the JS9 distribution or, for more control, use the Montage programs -directly. Of course, in either case, you must install Montage. - -

-The which parameter determine which images are used in the mosaic: -

    -
  • "current" or null: the current image in this display -
  • "all": all images in this display -
  • im: the image id or image handle of an image from any display -
  • [im1, im2, ...]: an array of image ids or handles from any display -
-In general, use "current" (or null) if you have loaded a multi-extension -FITS mosaic (e.g., a CFHT FITS file) into JS9. Use "all" if you have loaded -several FITS files into JS9 and want to create a mosaic. - -

-In order to keep the size of the resulting mosaic within memory -limits, JS9 reduces the size of each image before adding them all -together The options parameter determines how the reduction is -performed: -

    -
  • dim: size of mosaic (def: max of JS9.globalOpts.image.[xdim,ydim]) -
  • reduce: image size reduction technique: "js9" (def) or "shrink" -
  • verbose: if true, processing output is sent to the javascript console -
-The "dim" parameter is a target size: the larger of the resulting -mosaic dimensions will be approximately this value, depending on how -Montage processes the images. The "reduce" technique either runs -internal JS9 image sectioning code (to produce smaller internal -images, each of which are reprojected and added together) or runs the -Montage mShrinkHdr code (which reprojects the full images into smaller -files.) The former seems to be faster than the latter in most -cases. The "verbose" parameter will display output on the JavaScript -console to let you know that the CreateMosaic() call is running properly. - -

-The resulting mosaic will be loaded into the specified JS9 display as -a separate image. Because the mosaic is separate from the original -image(s), you can view each of the latter individually (or view each -image extension of a single image using the Extensions plugin.) -Internal analysis can be performed on the mosaic (e.g., ImExam functions) -but, of course, no external analysis tasks will be available. - -

Lookup a JS9 display
-

-dobj = JS9.LookupDisplay(dname, mustExist) -

-where: -

    -
  • dname: name of JS9 display to look up -
  • mustExist: whether to throw error if a dname display does not exist -
-returns: -
    -
  • dobj: the JS9 display object -
-The JS9.LookupDisplay() routine returns the display object associated -with the specified dname parameter. If no dname is specified, -the first available display is returned. -

-If dname is specified but does not exist, an error is thrown unless -the mustExist parameter is explicitly set to false (i.e., the default -is that the id must exist.) - -

Resize the JS9 Display
-

-JS9.ResizeDisplay(dname, width, height, opts) -

-where: -

    -
  • dname: optional name of JS9 display to resize -
  • width: new width of the display in HTML pixels (or "full" or "reset") -
  • height: new height of the display in HTML pixels -
  • opts: optional object containing resize parameters -
-You can resize the JS9 display by supplying new width and -height parameters. The div on the web page will be resized and the -image will be re-centered in the new display. If the display size has -been increased, more of the image will be displayed as needed (up to -the new size of the display.) For example, if the original display was -512x512 and you increase it to 1024x1024, a 1024x1024 image will now -be displayed in its entirety. - -

-If the first argument is full, the display is resized to match -the browser window.innerWidth and window.innerHeight variables, which -are the width and height (in pixels) of the browser window -viewport. You can then scroll the window so that the image fills the -entire browser window. Alternatively, if the first argument -is reset, the display is resized to match its original size. - -

-The opts object can contain the following properties: -

    -
  • resizeMenubar: change the width of the menubar as well -
-The default for resizeMenubar is true, so you only need -to pass this property if you do not want to perform the resize. -

-If no arguments are passed to this routine, it returns an object -containing the current display width and height. Otherwise, the -display object is returned. -

-You can supply a display name as the first argument, or the display object: -

-    JS9.ResizeDisplay("myJS9", 350, 400);
-
-or: -
-    JS9.ResizeDisplay(350, 400, {display: "myJS9"});
-
- -
Move an image to a new JS9 display
-

-JS9.MoveToDisplay(dname) -

-where: -

    -
  • dname: name of JS9 display to which the image will be moved -
-The JS9.MoveToDisplay() routine moves the current image to the -specified display: -
-    JS9.MoveToDisplay("myJS9", {display: "JS9"});
-
-will move the current image displayed in the "JS9" display window to -the "myJS9" window. -

-Note that the new JS9 display must already exist. New displays can be -created with the -JS9.LoadWindow() -public access routine or -the File:new JS9 light window menu option. - -

Gather other images to this JS9 Display
-

-JS9.GatherDisplay(dname, opts) -

-where: -

    -
  • dname: name of JS9 display to which the images will be gathered -
  • opts: optional object -
-

-This routine move all images in other displays to this display. -You can supply a display name or the display object: -

-    JS9.GatherDisplay("myJS9");
-
-or: -
-    JS9.GatherDisplay({display: "myJS9"});
-
-You can supply an opts object containing the properties: -
    -
  • images: array of image handles (or indexes into JS9.images array) to gather -
- -
Separate images in this JS9 Display into new displays
-

-JS9.SeparateDisplay(dname, opts) -

-where: -

    -
  • dname: name of JS9 display from which the images will be separated -
  • opts: optional object for layout properties -
-This routine moves each image in the specified display to a new display. -You can supply a display name or the display object: -
-    JS9.SeparateDisplay("myJS9");
-
-or: -
-    JS9.SeparateDisplay({display: "myJS9"});
-
-You also can supply an opts object containing the properties: -
    -
  • images: array of image handles (or indexes into JS9.images array) to separate -
  • layout: can be "horizontal", "vertical", "auto" (default: "auto") -
  • leftMargin: margin in pixels between horizontally separated images -
  • topMargin: margin in pixels between vertically separated images -
  • idbase: base string for ids of separated displays -
-By default, the new displays are all placed in light windows, whose -positions can be adjusted on the screen as needed. The "horizontal" -layout will generate a single row of images. The "vertical" layout -will generate a single column of images. The "auto" option will -layout the images in one or more rows. Each row will contain one or -more images such that at least one-half of the right-most image is -visible in the browser without the need for horizontal scrolling. -

-Note that you can supply the opts object without supplying the display -parameter, e.g: -

-    JS9.SeparateDisplay({layout: "horizontal"});
-
-will separate images from the default "JS9" display in a horizontal layout. -

-By default, the ids of the successive JS9 displays will consist of -the original display id, followed by the string "_sep", followed by an -increasing integer (not necessarily starting at 1.) If you pass -the idbase property in the opts object, the id of each successive -display will be the specified base id followed by an increasing integer -that does start from 1. In the latter case, it is your responsibility to -ensure that the new ids to not conflict with existing ids. - -

-Instead of light windows to hold the new displays, you can also use the -CSS Grid Layout to automatically position the new displays in -ordinary div elements. To do this, the layout is set to "auto" and the initial -display (along with its menubar, colorbar, statusbar) is wrapped in two divs: -

    -
  • an outer div of class JS9GridContainer -
  • an inner div of class JS9GridItem -
-If a browser supports CSS Grid Layout (most do as of 2017), a grid layout -will be used. Otherwise, light windows will be used. For example: -
-    <div class="JS9GridContainer">
-    <div class="JS9GridItem">
-        <div class="JS9Menubar" id="JS9Menubar"></div>
-        <div class="JS9" id="JS9"></div>
-        <div class="JS9Statusbar"></div>
-    </div>
-    </div>
-
-The outer JS9GridContainer div is associated with the CSS -Grid container (i.e. its display property is set to grid.) -The inner JS9GridItem div delineates the contents of the "item" that -will added to the container when the displays are separated. - -

-You can tailor the layout by adding Grid Layout CSS directives to -JS9GridContainer. In particular, style elements such as -grid-template-columns and grid-gap are applied to this div: -

-      div.JS9GridContainer {
-	  grid-template-columns: repeat(3, 1fr);
-	  grid-gap: 10px;
-      }
-
-See CSS Grid Layout for more information about CSS Grids. - -
Scroll the JS9 display to the center of the viewport
-

-JS9.CenterDisplay(dname) -

-where: -

    -
  • dname: name of JS9 display to center -
-

-This routine scrolls this display to the center of the viewport. -You can supply a display name or the display object: -

-    JS9.CenterDisplay("myJS9");
-
-or: -
-    JS9.CenterDisplay({display: "myJS9"});
-
- -
Rename the id of a JS9 display
-

-JS9.RenameDisplay(oid, nid) -

-Calling sequences: -

-    JS9.RenameDisplay(nid)        # change default id (usually "JS9") to nid
-    JS9.RenameDisplay(oid, nid)   # change oid to nid
-
-

-where: -

    -
  • oid: old name of JS9 display -
  • nid: new name of JS9 display -
-

-This routine is used by the Desktop version of JS9 to implement the ---title (and --renameid) switch(es), which change the id -of the JS9 display(s) to the specified id(s). Once an id has been -renamed, external communication (via the js9 script or pyjs9) should -target the new id instead of the original id. -

-If also can be used in the query part of a URL when loading a web page -in order to rename a display, e.g.: -

-  https://js9.si.edu?renamedisplay=myJS9
-
-will rename the default display. In cases where multiple displays are defined -on a page: -
-  https://js9.si.edu/js9/tests/js9debug.html?renamedisplay=myJS9:yourJS9
-
-will rename the myJS9 display (but not the JS9 display). -

-The original id is still available internally, so Javascript public -API calls (but not external scripts) on the web page itself can target -either the original or the new id using the {display: "id"} syntax. - -

Close all images in a display
-

-JS9.CloseDisplay(dname, regexp) -

-where: -

    -
  • dname: name of JS9 display whose images will be closed -
  • regexp: optional regular expression to specify which images to close -
-

-By default, his routine closes all images in the specified display. -You can supply a display name as the first argument or the display object: -

-    JS9.CloseDisplay("myJS9");
-
-or: -
-    JS9.CloseDisplay({display: "myJS9"});
-
-If a regular expression is specified as second argument, only images matching -that regular expression will be closed. For example: -
-  JS9.CloseDisplay("JS9", ".*mask.fits.gz");
-
-will close all mask files. As a convenience, you can omit the display argument -and specify the template as the first argument: -
-  JS9.CloseDisplay(".*mask.fits.gz");
-
- -
Close all images in a display and remove the display
-

-JS9.RemoveDisplay(dname) -

-where: -

    -
  • dname: name of JS9 display to remove -
-This routine will close all images in the specified display and then -remove the display. It is available for displays contained in -light windows and for displays contained in JS9 Grid Containers. When -removing the display inside a light window, the light window is -immediately closed without a confirmation dialog box (unlike a light -window being closed via its close button.) For a display inside -a JS9 Grid Container, the display is removed from the DOM, so that it -no longer is part of the grid layout. Note, however, that you cannot -remove all displays from a grid container: at least one display must be -left in the container. - -


- -

Miscellaneous

- -
Print an image
-

-JS9.Print(opts) -

-where: -

    -
  • opts: options for print -
-

-Print the currently displayed image. A new window is displayed -containing the image, along with regions and other graphical layers -(the 2D graphics having been converted to a re-scalable format.) The -standard Print dialog box also is displayed and can be used to print -this new window. Dismiss both windows when you are finished. - -

-By default, if a colorbar is active on the page, it will be placed -beneath the image. You can pass the colorbar: false option -in the opts object to avoid printing the active colorbar. - -

Print the desktop window (desktop app only)
-

-JS9.WindowPrint(opts) -

-where: -

    -
  • opts: options for print -
-

-The JS9 desktop application that utilizes -Electron.js has the ability to -print the whole application window. When executed, the system print -dialog box is displayed (unless the silent the option is passed in -opts) and the window will be printed according to your print configuration. -

-The first argument allows you to specify the following options: -

    -
  • silent: don't ask user for print settings (def: false) -
  • printBackground: prints the background color and image of the web page (def: true) -
  • deviceName: set the printer device name to use (def: "") -
- -
Save the desktop window to a PDF file (desktop app only)
-

-JS9.WindowToPDF(filename, opts) -

-where: -

    -
  • filename: PDF file name -
  • opts: options for save -
-

-The JS9 desktop application that utilizes -Electron.js has the ability to -save the whole application window to a PDF file. The first argument specifies -the name of the PDF file. -

-The second argument allows you to specify the following options: -

    -
  • marginsType: the type of margins to use: 0 for default margin, 1 for no margin, and 2 for minimum margin -
  • pageSize: page size of the generated PDF: A3, A4, A5, Legal, Letter, Tabloid (NB: might not work with all printers) -
  • printBackground: prints the background color and image of the web page (def: true) -
  • printSelectionOnly: whether to print selection only (NB: This seems to crash the application!) -
  • landscape: true for landscape, false for portrait -
- -
Set the save directory for downloads (desktop app only)
-

-JS9.SaveDir(dirname) -

-where: -

    -
  • dirname: directory name for downloads -
-The JS9 desktop application that utilizes -Electron.js has the ability to -specify a directory into which files will be saved (e.g., by routines such -JS9.SavePNG()) -without using a dialog box. This is especially useful in scripts. - -

-The savedir directory can be specified on the desktop command line using the ---savedir switch: -

-    js9 -a --savedir $HOME/tmp ~/data/casa.fits
-
-But you can use this routine to set or change the save directory at any time: -
-    js9 SaveDir "$HOME/tmp"
-
-Future downloads for this desktop session will then be saved (without -use of a dialog box) to the specified directory. - -

-It's worth remembering that relative paths are taken relative to the -directory in which the JS9 app was started, not the current directory in which -you are running the js9 SaveDir command. To avoid confusion, it is recommended -that you supply a full path. - -

Quit the JS9 app (desktop app only)
-

-JS9.Quit() -

-For the Desktop app only, this command will quit the app. - -

Save image as a FITS file
-

-JS9.SaveFITS(filename, opts) -

-where: -

    -
  • filename: output file name -
  • opts: optional opts or "display" -
-Save the currently displayed image as a FITS file. If filename is not -specified, the file will be saved as "js9.fits". -

-If a second argument is supplied, it can be the string "display" or an -object containing the property "source". If "display" or opts.source -is "display" is passed, the currently displayed image section is -saved. Otherwise, the full image (or extracted image section, if -appropriate) is saved. -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. - -

Save image as a PNG file
-

-JS9.SavePNG(filename, opts) -

-where: -

    -
  • filename: output file name -
  • opts: optional save parameters -
-Save the currently displayed image as a PNG file. If filename is not -specified, the file will be saved as "js9.png". The image is saved -along with the graphical overlays (regions, etc..) - -

-The opts object can specify the following properties: -

    -
  • layers: save graphical layers (e.g., regions) (default is true) -
  • source: "image" or "display" (default is "display") -
-By default, SavePNG() will save all of the 2D graphics in the -shape layers (regions, catalogs, etc.) as well as the image. Set -the layers property to false to save only the image. - -

-Also by default, SavePNG() will save the RGB pixels from the -display. This means, for example, that a blended set of images will -save the blended pixels. If you want to save the RGB pixels from one -of the images in a blended image, you can specify the source -property to the image. For example, in the js9blend.html demo, -you can save the RGB pixels of the Chandra image by specifying use of -the "image" source and specifying the image's id in the display -parameter: -

-    JS9.SavePNG("chandra.png", {source:"image"}, {display:"chandra.fits"});
-
- -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. - -

Save image as a JPEG file
-

-JS9.SaveJPEG(filename, opts) -

-where: -

    -
  • filename: output file name -
  • opts: optional save parameters or a number between 0 and 1 indicating image quality -
-Save the currently displayed image as a JPEG file. If filename is not -specified, the file will be saved as "js9.jpeg". The image is saved -along with the graphical overlays (regions, etc..) - -

-The opts object can specify the following properties: -

    -
  • layers: save graphical layers (e.g., regions) (default is true) -
  • source: "image" or "display" (default is "display") -
  • quality: JPEG encoder quality -
-By default, SaveJPEG() will save all of the 2D graphics in the -shape layers (regions, catalogs, etc.) as well as the image. Set -the layers property to false to save only the image. - -

-Also by default, SaveJPEG() will save the RGB pixels from the -display. This means, for example, that a blended set of images will -save the blended pixels. If you want to save the RGB pixels from one -of the images in a blended image, you can specify the source -property to the image. For example, in the js9blend.html demo, -you can save the RGB pixels of the Chandra image by specifying use of -the "image" source and specifying the image's id in the display -parameter: -

-    JS9.SaveJPEG("chandra.png", {source:"image"}, {display:"chandra.fits"});
-
- -

-If encoder quality parameter is not specified, a suitable default is -used. On FireFox (at least), this default values is 0.95 (I think.) - -

-Don't forget that the file is saved by the browser, in whatever location -you have set up for downloads. - -

Upload currently displayed FITS file to proxy server
-

-JS9.UploadFITSFile() -

-Upload the currently displayed FITS file to the proxy server, so that -back-end analysis can be performed. This routine requires that a Node.js-based -JS9 helper is running and that the helper has enabled the loadProxy -property and set up a workDir directory in which to store the FITS file. - -

Get FITS header as a string
-

-JS9.GetFITSHeader(nlflag) -

-where: -

    -
  • nlflag: true if newlines should added to each card -
-Return the FITS header as a string. By default, the returned string contains -the 80-character FITS cards all concatenated together. If nlflag -is true, each card will have a new-line appended. -

-Note that the -JS9.GetImageData() -routine also returns the -FITS header, but as an object whose properties contain the header -values. For example, obj.SIMPLE will usually have a value of true, -obj.BITPIX will have contain the bits/pixel, etc. This object is more -useful for programming tasks, but does not contain the FITS comments -associated with each header card. - -

Display help in a light window
-

-JS9.DisplayHelp(name) -

-where: -

    -
  • name: name of a help file or url of a web site to display -
-The help file names are the property names in JS9.helpOpts (e.g., "user" for -the user page, "install" for the install page, etc.) Alternatively, you can -specify an arbitrary URL to display (just because.) - -
Display plugin in a light window
-

-JS9.DisplayPlugin(name) -

-where: -

    -
  • name: name of the plugin -
-Toggle the light-window display of the named plugin, as is done by -the View and Analysis menus. That is, if the plugin is -not visible, make it visible. If the plugin is visible, hide it. -

-You can supply the full class and plugin name or just the name, using -exact case or lower case, e.g.: -

    -
  • JS9Panner or panner -
  • JS9Magnifier or magnifier -
  • JS9Info or info -
  • JS9Console or console -
  • DataSourcesArchivesCatalogs or archivescatalogs -
  • FitsBinning or binning -
  • ImExamEncEnergy or encenergy -
  • ImExamPxTabl or pxtabl -
  • ImExamRadialProj or radialproj -
  • ImExamHistogram or histogram -
  • ImExamRegionStats or regionstats -
  • ImExamXProj or xproj -
  • ImExamYProj or yproj -
  • ImExam3dPlot or 3dplot -
  • ImExamContours or contours -
-

-As with plugins in the View and Analysis menus, this routine does -nothing if the plugin is explicitly defined on the web page. -

-This routine is useful if you are building a web interface that -supports the JS9 menu functions. - -

Display content in a light window
-

-JS9.LightWindow(id, type, content, title, opts) -

-where: -

    -
  • id: unique id for light window div(default: "lightWindow" + uniqueID) -
  • type: content type: "inline", "div", "ajax", "iframe" (default: "inline") -
  • content: content of the light window (default: none) -
  • title: title (default: "JS9 light window") -
  • opts: configuration string (default: "width=830px,height=400px,center=1,resize=1,scrolling=1") -
-Display arbitrary content inside a light window. There are any number -of light window routines available on the Net. JS9 uses light window -routines developed by Dynamic Drive (http://www.dynamicdrive.com). -Their extensive documentation can be found -here. - -

-The content shown inside the window depends on the content parameter: -

    -
  • iframe: the URL of the page to display (ie: "http://www.google.com") -
  • inline: the HTML to display (back-slashing any special JavaScript characters, such as apostrophes) -
  • ajax: the relative path to the external page to display, relative to the current page (ie: "../external.htm") -
  • div: define a DIV element on the page with a unique ID attribute (probably hidden using style="display:none") and the use the DIV's id as the content value -
-JS9 typically uses the inline option. Note that web sites often -do not allow themselves to be embedded in an iframe, so this is an -unreliable option. - -

-The opts parameter specifies options for the light window, such -as its size. This parameter consists of a string with comma-separated -keywords, e.g.: -

-    "width=830px,height=400px,center=1,resize=1,scrolling=1"
-
-The opts keywords, defined in the Dynamic Drive documentation, are: -width, height, left, top, center, resize, and scrolling. The -JS9.lightOpts.dhtml object defines oft-used lightwin configurations, -and the JS9.lightOpts.dhtml.textWin property is used as the -default for this call. You can utilize these properties in your own call -to JS9.LightWindow() or make up your own configuration string. - -

-As an extension to the Dynamic Drive light window support, JS9 adds the ability -to double-click the title bar in order to close the window. - -

Use the file dialog box to load a FITS file
-

-JS9.OpenFileMenu() -

-Calling this routine brings up the browser's file dialog box. When a -FITS file is selected, if will be loaded into the JS9 display. -

-This routine is useful if you are building a web interface that -supports the JS9 menu functions. - -

Use the file dialog box to load a region file
-

-JS9.OpenRegionsMenu() -

-Calling this routine brings up the browser file menu. When a region file is -selected, if will be loaded into the JS9 display. -

-This routine is useful if you are building a web interface that -supports the JS9 menu functions. - -

Use the file dialog box to load a colormap file
-

-JS9.OpenColormapMenu() -

-Calling this routine brings up the browser file menu. When a -JSON-format colormap file is selected, it will be loaded into the JS9 -display. The colormap file can take one of two forms (without the comments): -

-    # RGB color triplets for the I8 colormap in a "colors" property
-    {"name":"i8","colors":[[0,0,0],[0,1,0],[0,0,1],[0,1,1],[1,0,0],[1,1,0],[1,0,1],[1,1,1]]}
-
-    # all 3 vertex arrays for the purple colormap in one "vertices" property
-    {"name":"purple","vertices":[[[0,0],[1,1]],[[0,0],[0,0]],[[0,0],[1,1]]]}
-
-This routine is useful if you are building a web interface that -supports the JS9 menu functions. See -JS9.AddColormap() for more -information about colormap formats. - -
Get toolbar values from the Toolbar plugin
-

-val = JS9.GetToolbar(type) -

-where: -

    -
  • type: type of information to retrieve -
-returns: -
    -
  • val: array of tool objects (or an argument-dependent return) -
-The JS9.GetToolbar() routine returns global information about the Toolbar -plugin. If the first argument is "showTooltips", the returned value specifies -whether tooltips are currently displayed. Otherwise an array of tool objects is -returned, one for each of the defined tools in the toolbar. - -
Set toolbar values for the Toolbar plugin
-

-JS9.SetToolbar(arg1, arg2) -

-where: -

    -
  • arg1: a type-dependent id or value to set -
  • arg2: a type-dependent value to set -
-The JS9.SetToolbar() routine sets global information about the Toolbar -plugin. The following values can be specified as the first argument: -
    -
  • init: the text "init" triggers a re-initialization of all -display Toolbar plugins, which is useful if you have changed -the JS9.globalOpts.toolBar array to specify a new set of -top-level tools. -
  • showTooltips: the text "showTooltips" uses the value of the -boolean arg2 to specify whether tooltips are displayed as the mouse hovers -over a tool. -
  • [text]: other text is assumed to be a JSON-formatted text -containing either a new tool to add to the toolbar, or an array of tools. -
  • [object]: an object is assumed to be new tool to add to the toolbar -
  • [array]: an array is assumed to be an array of new tools to add to the toolbar -
-New tools can be added to the toolbar at any time using this routine. The -text properties associated with a tool object are: -
    -
  • name: name of the tool -
  • tip: a tooltip to display when the mouse hovers over the tool -
  • image: url (relative to the install directory) containing a PNG -image file to display as the tool icon -
  • cmd: name of the JS9 public routine to execute when the tool is -clicked -
  • args: array of arguments to pass to the JS9 public routine -
-Only the name and cmd properties are required. If no image is -specified, a button labeled by the name value will be used. - -

-Examples of tool objects: -

-  {
-    "name": "linear",
-    "tip": "linear scale",
-    "image": "images/toolbar/dax_images/lin.png",
-    "cmd": "SetScale",
-    "args": ["linear"]
-  },
-  {
-    "name": "histeq",
-    "tip": "histogram equalization",
-    "cmd": "SetScale",
-    "args": ["histeq"]
-  },
-  {
-    "name": "annulus",
-    "tip": "annulus region",
-    "image": "images/toolbar/dax_images/annulus.png",
-    "cmd": "AddRegions",
-    "args": ["annulus"]
-  },
-  {
-    "name": "remove",
-    "tip": "remove selected region",
-    "image": "images/toolbar/dax_images/erase.png",
-    "cmd": "RemoveRegions",
-    "args": ["selected"]
-  },
-  {
-    "name": "zoom1",
-    "tip": "zoom 1",
-    "image": "images/toolbar/dax_images/mag_one.png",
-    "cmd": "SetZoom",
-    "args": [1]
-  },
-  {
-    "name": "magnifier",
-    "tip": "toggle magnifier display",
-    "image": "images/toolbar/dax_images/mag.png",
-    "cmd": "DisplayPlugin",
-    "args": ["JS9Magnifier"]
-  }
-
-Each time a tool is added to the list of available tools, the active -Toolbar plugins will be re-initialized to display that tool. By default, -the new tool not be added to the top-level list: you must also edit -the JS9.globalOpts.toolBar array to add the name of the -tool. If this is done after you add the tool, remember to re-initialize -active toolbars by calling: -
-    JS9.SetToolbar("init");
-
- -
Get location of JS9 installation directory
-

-rpath = JS9.InstallDir(file) -

-where: -

    -
  • file: file or directory to convert -
-returns: -
    -
  • rpath: path of the file relative to the JS9 install directory -
-Sometimes a plugin needs to load an auxiliary file inside the plugins -sub-directory. The web page loading the plugin has an arbitrary -location relative to the JS9 install directory, so this routine -returns a relative path to the js9 install directory. - -
Send a message to a back-end server
-

-JS9.Send(msg, obj, cb) -

-where: -

    -
  • msg: name of the msg, as defined in the back-end server -
  • obj: object containing msg parameters -
  • cb: callback to call when back-end server returns its results -
-JS9 sends various internal messages to the back-end server using either -socket.io protocol (in the Node.js implementation) or CGI. For -example, when a remote analysis call is made, JS9 sends a message to the -back-end server detailing the task to call, parameters to pass, etc. Results -are then returned to JS9 for display. JS9 also sends messages to the -back-end server when a new image is displayed. -

-Communication with the back-end is usually done behind the scenes and -need not concern users or application programmers. However, if you -write your own socket.io-based server, you might want to add -project-specific messages to your implementation. For example, a -Perl-based or Python-based server might add its own special messages -that execute Perl or Python commands within the server in response to -JS9 messages. In this case, you can use -JS9.Send() -to send a message to these message handlers. -

-The msg name is the name of the message, as defined by the -server. By convention, an object is usually passed to the -message handler. JS9 will add a dataPath property to this -object to indicate the current list of directories in which to -search for data. All other properties are specific to the message being handled. -You can pass a null instead of an object and -JS9.Send() -will generate -a temporary object to hold the dataPath. -

-The cb function will be called if the message sends an -acknowledgment. The arguments passed to this function call by the server -are specific to the message being handled. -

-For example, you can send a message to the back-end server to retrieve the -list of available analysis tasks and then display this list using the call: -

-    JS9.Send("getAnalysis", null, function(s){alert(s)});
-
-The "getAnalysis" message passes no parameters to the server. The -server returns a list of available analysis tasks in JSON format. - -
Add a JS9 display div and/or associated plugins
-

-JS9.AddDivs(id1, id2, ...) -

-where: -

    -
  • id1, id2, ...: optional name(s) of new JS9 display div(s) -
-You can add new JS9 displays and/or plugins dynamically. To do this, you -create the new divs, add them to the web page, and then call this routine to -incorporate them into JS9. -

-The routine will accept a list of JS9 display divs to initialize. If -all you are doing is adding one or more plugins to an existing display, -leave the argument list empty. -

-For example, to add a new JS9 display and menubar at the end of a web -page and load an image into that display: -

-    var html = "<div class='JS9Menubar' id='myJS9Menubar'></div><div class='JS9' id='myJS9'></div>";
-    // jquery append to end of page
-    $(html).appendTo($("body"));
-    // create the new JS9 display, with associated plugins
-    JS9.AddDivs("myJS9");
-    // just a standard load to that display
-    JS9.Load("foo.fits", {scale: "log"}, {display: "myJS9"});
-
-You can use JS9.LoadWindow() to -load images into a light-weight or completely new window. To do this -with your own routine, you should call JS9.AddDivs() after the window -has been created. You can use the jQuery -arrive -wrapper that implements support for the - MutationObserver: -
-    // once the window exists containing the div id, we can finish the set up
-    $("#window").arrive("#"+id, {onceOnly: true}, function(){
-        finishUp();
-    });
-    // (make-believe) create light win routine, where id is the window div id
-    myCreateLightWindow(id, html, title, opts);
-
- -
Instantiate plugins on this web page
-

-JS9.InstantiatePlugins() -

-Normally, JS9 will instantiate all of its plugins automatically once the page -is loaded and ready: internally, jQuery $(document).ready() calls JS9.init(). -However, module loaders such as Require.js -can load scripts asynchronously and cause jQuery $(document).ready() to fire -before all JS9 scripts are available. The -JS9.RegisterPlugin() -routine should deal properly with this situation. But just in case ... -the JS9.InstantiatePlugins() will perform the plugin instantiation -explicitly. -

-In you find you need to call this routine in order make your in-page -plugins display properly, please let us know the circumstances. - -


- -

Prototype Routines (not ready for prime time)

- -

-NB: The routines in this section are prototypes and therefore are -subject to change. Feel free to contact us to discuss your needs so -that we can gain a better understanding of what is required in these cases. - -


- -

API Change History

- -

-The JS9 Public API is meant to be stable and well-documented. If we are -forced to make an incompatible change to the API, it will be documented here. - -

-

20220408: Change the calling sequence to global ongroupcreate callback
-The global JS9.Regions.opts.ongroupcreate callback has the calling sequence: -
-
  • ongroupcreate: ongroupcreate(id, im, xreg); - -where: -
      -
    • id: group id -
    • im: the image handle for the currently displayed image -
    • xreg: an array of shape objects within the group -
    -
  • -The old calling sequence did not pass the group id, but instead passed -the event which triggered the group creation in the last argument ... -which doesn't make sense for an API call. - -

    -

    20200815: ChangeRegions, CopyRegions, GetRegions, RemoveRegions, SelectRegions, : default region changed
    -If the regions argument is not specified, it now defaults to -"selected" if there are selected regions, otherwise "all". Previously it only -default to "all". You can revert to the previous behavior by changing the -JS9.globalOpts.regWhichDefault from "auto" to "all". (Note: unless you are -writing a GUI, you almost certainly should be specifying the regions explicitly -for these calls). - -

    -

    20200720: ChangeRegions: dx, dy properties renamed to deltax, deltay
    - -The dx, dy properties of -JS9.ChangeRegions allowed you to specify a delta to add to the current -image position. For consistency, these properties were renamed to -deltax, deltay respectively. - -
    20200623: SetFlip and SetRot90 no longer manipulate the image data
    -The original implementation of JS9.SetFlip -and JS9.SetRot90 manipulated the -underlying image data, changing the WCS as needed. This behavior was -inconsistent with other routines: e.g. image processing routines -only change the displayed data, while explicit raw data routines such as -JS9.ReprojectData change the underlying -image in accordance with the rules for manipulating raw data. We therefore -re-implemented these routines (and added JS9.SetRotate) -so that they change the orientation of the canvas, rather than the -underlying image data. This implies that the WCS headers are no longer -changed by flipping and rotating. - -
    20200207: remove DisplaySection +N and -N binning options
    - -

    -The DisplaySection() routine originally supported "+N" and "-N" -binning options to change the current bin by "N". With the addition of -support for fractional binning, these two constructs conflict with the -use of negative bin values to indicate 1/abs(N) binning. - - -

    20200114: Remove experimental LoadAuxFile routine
    - -

    -Regions can be loaded using JS9.LoadRegions. -Masks are now supported by loading a mask image and calling -JS9.MaskImage. - -

    20180322: DisplaySection now uses current values for unspecified properties
    - -

    -Prior to JS9 version 2.1, -JS9.DisplaySection() always used -the center of the file, along with dimensions and binning specified by -the JS9.globalOpts.table and JS9.globalOpts.image objects, if these -properties were not explicitly specified. This was just wrong: it -meant that you could not set up a section and then repeated change the -filter or position without re-specifying the current section -parameters. We therefore changed the default behavior so that unspecified -properties take on the current values. To use the original defaults, -simply specify 0 for xcen and ycen, and use the globalOpts values -for dimensions and binning. - -

    20151218: OpenFileMenu and OpenRegionsMenu don't require a display argument
    - -

    -The routines -JS9.OpenFileMenu() -and -JS9.OpenRegionsMenu() -required a display argument, instead of utilizing the standard -optional display object. This mistake has been corrected, with the -result that both routines now target the default display, as expected, -if no display is passed. - -

    20141117: The Set routines now return "OK" instead of true on success
    - -

    -The public Set routines -(JS9.SetZoom(), -JS9.SetColormap(), etc) -were returning a boolean true when successful. This has been changed -to "OK", to make it clear that the return value is a status value, -not a boolean data value. - -

    20141028: callback function to RunAnalysis and SubmitAnalysis
    - -

    -Due to an oversight, the signature of the callback function supplied to -JS9.RunAnalysis() -(and its derivative function, -JS9.SubmitAnalysis()) -was missing the errcode argument. -To correct this mistake, the signature was changed from: -

    -    func(stdout, stderr, aobj)
    -
    -to: -
    -    func(stdout, stderr, errcode, aobj)
    -
    -See js9onchange.html for an example of using this callback function. - -


    - -

    Last updated: June 10, 2021
    -
    - - - diff --git a/web/static/js9_old/help/python.html b/web/static/js9_old/help/python.html deleted file mode 100644 index 4a1e40e..0000000 --- a/web/static/js9_old/help/python.html +++ /dev/null @@ -1,170 +0,0 @@ - - - - - -JS9 with Python and Jupyter - - - -
    -

    JS9 with Python and Jupyter

    - -

    Connecting Python to JS9

    -

    -The pyjs9.py module connects Python and JS9. It is -available on GitHub:   -https://github.com/ericmandel/pyjs9. - -

    -The JS9 class constructor connects to a single JS9 instance in a -web page. Once the connection is made, the returned JS9 object -supports the JS9 Public API and a shorter command-line syntax. You -also can send/retrieve numpy arrays and astropy (or pyfits) hdulists -to/from JS9. - -

    -pyjs9 communicates with the JS9 back-end server (which communicates with -the browser itself). By default, pyjs9 utilizes the - -requests module to communicate with the back-end server. -However, if you install the - -socketIO_client, -pyjs9 will use the faster, -persistent socket.io protocol. - -

    -Install pyjs9 from the GitHub repository using pip, as usual: -

    -    > pip install git+https://github.com/ericmandel/pyjs9.git#egg=pyjs9
    -
    -or from a local copy: -
    -    > pip install /path/to/local/copy
    -
    - -

    -Mandatory dependencies for pyjs9 are: -

      -
    • six -
    • requests -
    - -

    -Optional dependencies for pyjs9 are: -

      -
    • numpy            # support for GetNumpy and SetNumpy methods -
    • astropy           # support for GetFITS and SetFITS methods -
    • socketIO-client  # fast, persistent socket.io protocol, instead of html -
    - -

    -To run pyjs9: -

    -    > # ensure JS9 node-server is running ...
    -    > # visit your local JS9 web page in your browser ...
    -    > python
    -    ... (startup messages) ...
    -    >>> import pyjs9
    -    >>>
    -    >>> j = pyjs9.JS9()        # default: connect to 'http://localhost'
    -    >>>
    -    >>> j.GetColormap()
    -    {'bias': 0.5, 'colormap': 'grey', 'contrast': 1}
    -    >>> j.SetColormap('red')
    -    >>> j.cmap()
    -    'red 1 0.5'
    -    >>>
    -    >>> hdul = j.GetFITS()
    -    >>> hdul.info()
    -    Filename: (No file associated with this HDUList)
    -    No.    Name         Type      Cards   Dimensions   Format
    -    0    PRIMARY     PrimaryHDU       6   (1024, 1024)   int32   
    -    >>>
    -    >>> narr = j.GetNumpy()
    -    >>> narr.shape
    -    (1024, 1024)
    -
    - -

    -If you have internet connectivity, visit the JS9 web page at -https://js9.si.edu with your browser and: -

    -    > python
    -    ... (startup messages) ...
    -    >>> import pyjs9
    -    >>>
    -    >>> j = pyjs9.JS9('js9.si.edu')        # connect to JS9 web site
    -    >>>
    -    >>> j.GetColormap()
    -    {'bias': 0.5, 'colormap': 'grey', 'contrast': 1}
    -    >>>
    -    >>> # etc ...
    -
    - -

    -

    Adding JS9 to Jupyter (aka IPython)

    -

    -We are working on integrating JS9 into Jupyter properly. For now, you -can utilize Jupyter's %%html construct to load JS9 into a -cell for display. You simply add JS9 divs to cell and load the JS9 -CSS and Javascript code. - -

    -To simplify matters, the JS9 CSS files are combined together into a -file called js9-allinone.css and the JS9 Javascript files are -combined into a file called js9-allinone.js. These can be loaded -in a cell after the JS9 divs are defined: -

    -    %%html
    -    <div class="JS9Menubar"></div>
    -    <div class="JS9"></div>
    -    <link type="text/css" rel="stylesheet" href="//js9.si.edu/jupyter/js9-allinone.css">
    -    <script type="text/javascript" src="//js9.si.edu/jupyter/js9-allinone.js"></script>
    -
    -In this example, the JS9 display and menubar will be loaded into the -Jupyter page. You can then drag and drop FITS images onto the display -or use the File:open local file... option to load FITS data. Once -an image is loaded, you can pan, zoom, scale, change colormaps, etc, -and also utilize JS9 plugins (panner, magnifier, browser analysis, -etc.) as usual. - -NB: Obviously, the JS9 install files and directories (other than -all-in-one .css and .js files) are not available in this mode, leading -to the following limitations: -
      -
    • no js9prefs.js for site-wide configuration -
    • no back-end helper will be run -
    • no server-side analysis (including proxy load) -
    • no help files will be available (and no Help menu option) -
    - -

    -Note that you also can use Jupyter's %%html syntax to define an -HTML iframe that will display an existing JS9 web page: -

    -    %%html
    -    <iframe src="https://js9.si.edu" width=1000 height=750></iframe>
    -
    -or perhaps better still: -
    -    %%html
    -    <iframe src="https://js9.si.edu/js9/js9.html" width=100% height=900></iframe>
    -
    -Since you are now accessing an existing web site, all JS9 functions -should work as expected ... except for the use of locally stored -preferences (i.e. the Preferences plugin) in Firefox. Currently, -Firefox throws a security exception when an iframe tries to access -local storage, so this function does not work. - -

    -We will continue to improve the Jupyter/JS9 connection. Please send us your -comments and suggestions. - -

    Last updated: June 8, 2016
    -
    - - - diff --git a/web/static/js9_old/help/regions.html b/web/static/js9_old/help/regions.html deleted file mode 100644 index df0695b..0000000 --- a/web/static/js9_old/help/regions.html +++ /dev/null @@ -1,198 +0,0 @@ - - - - - -JS9/DS9/Funtools Spatial Regions - - - -
    - -

    JS9/DS9/Funtools Spatial Regions

    - -

    -In many X-ray astronomical analysis software suites (e.g., fitsio, ciao, -funtools), spatial regions allow one to select sections of an image or -rows of a table by means of simple geometric shapes. When an image is -filtered, only pixels found within these shapes are processed. When a -table is filtered, only rows found within these shapes are processed. - -

    -In these systems, spatial region filtering is accomplished by means -of region specifications. Typically, region specifications use -bracket notation appended to the filename of the data being processed: -

    -  funcnts "foo.fits[circle(512,512,100)]"
    -
    - -

    -JS9 implements a subset of the widely-used DS9/Funtools regions syntax, -as described below. - -

    Region Expressions

    - -Spatial region specifications consist of one or more lines containing: -
    -  # comment until end of line
    -  # each region expression contains shapes and optional local json objects
    -  [region_expression1] {local json object}  # tags
    -  [region_expression2] # tags
    -
    - -

    -A single region expression consists of: -

    -  # shape name and parens are required
    -  # arguments are separated by commas. spaces are optional, as is the + sign
    -  [+-]shape(val, val, ...)
    -
    -where regions shapes can be: - -
    -  shape:        arguments:
    -  -----         ----------------------------------------
    -  annulus       (xcenter, ycenter, inner_radius, outer_radius)
    -  box           (xcenter, ycenter, xwidth, yheight[, angle])
    -  circle        (xcenter, ycenter, radius)
    -  ellipse       (xcenter, ycenter, xwidth, yheight[, angle])
    -  text          (x1, x2, text)
    -  point         (x1, y1)
    -  polygon       (x1, y1, x2, y2, ..., xn yn)
    -
    -Note that other keyword keywords (e.g., the DS9 "global" keyword and -DS9/Funtools region shapes not yet implemented in JS9) are silently ignored. - -

    -All arguments to regions are real values; integer values are -automatically converted to real where necessary. All angles are in -degrees and run from the positive image x-axis to the positive image -y-axis. - -

    Region Exclusion

    -

    -Shapes also can be globally excluded from a region descriptor by using -a minus sign before a region: - -

    -  operator      arguments:
    -  --------      -----------
    -  -             Globally exclude the region expression following '-' sign
    -                from ALL regions specified in this file
    -
    - -

    Local Properties of Regions

    -DS9/Funtools regions utilize a key=value syntax within an in-line comment to -specify secondary properties such as color. It also uses single tokens -in the in-line comments to specify tags such as "source" and "background". -

    -JS9 retains the use of comments to specify tags, but utilizes a JSON -object to specify secondary properties. This optional object follows -the region specification: -

    -    point(4300.00, 4250.00) {"color": "red"} # background,include
    -    point(350.897859, 58.835164) {"ptshape": "circle", "ptsize": 5}
    -
    -See the JS9.Regions.opts object in the JS9 source code for a list of properties -that can be passed in this JSON object. - -

    Coordinate Systems

    - -For each region, it is important to specify the coordinate system -used to interpret the region, i.e., to set the context in which position and -size values are interpreted. For this purpose, the following keywords -are recognized: - -
    -  name                  description
    -  ----                  ------------------------------------------
    -  physical              pixel coords of original file using LTM/LTV
    -  image                 pixel coords of current file
    -  FK4                   sky coordinate system
    -  FK5                   sky coordinate system
    -  galactic              sky coordinate system
    -  ecliptic              sky coordinate system
    -  ICRS                  currently same as J2000
    -
    -If no coordinate system is specified, physical is assumed. The -coordinate system specifier should appear at the beginning of the -region description, separated by semi-colon, or on a separate line. -Note that multiple coordinate systems can be in the same -specifier. Each one pertains to the region following until the next -coordinate system is defined: -
    -  # Region file format: JS9 version 1.0
    -  ICRS
    -  point(23:23:27.815, +58:48:42.017)
    -  box(23:23:27.815, +58:48:42.017, 29.51", 29.51", 0.000)
    -  physical
    -  ellipse(4300.00, 4250.00, 30.00, 20.00, 0.00)
    -  box(4300.00, 4250.00, 60.00, 60.00, 0.00)
    -  ICRS
    -  circle(350.897859, 58.835164, 0.76')
    -  ellipse(350.897859, 58.835164, 14.76", 9.84", 0.000)
    -
    - -

    -

    Specifying Positions, Sizes, and Angles

    - -The arguments to region shapes can be floats or integers describing -positions and sizes. They can be specified as pure numbers or using -explicit formatting directives: - -
    -  position arguments    description
    -  ------------------    ------------------------------
    -  [num]                 context-dependent (see below)
    -  [num]d                degrees
    -  [num]r                radians
    -  [num]p                physical pixels
    -  [num]i                image pixels
    -  [num]:[num]:[num]     hms for 'odd' position arguments
    -  [num]:[num]:[num]     dms for 'even' position arguments
    -  [num]h[num]m[num]s    explicit hms
    -  [num]d[num]m[num]s    explicit dms
    -
    -  size arguments        description
    -  --------------        -----------
    -  [num]                 context-dependent (see below)
    -  [num]"                arc seconds
    -  [num]'                arc minutes
    -  [num]d                degrees
    -  [num]r                radians
    -
    -When a "pure number" (i.e. one without a format directive such as 'd' -for 'degrees') is specified, its interpretation depends on the context -defined by the 'coordsys' keyword. In general, the rule is: - -

    -All pure numbers have implied units corresponding to the current -coordinate system. - - -

    -If no such system is explicitly specified, the default system is -implicitly assumed to be PHYSICAL. In practice this all means that for -IMAGE and PHYSICAL systems, pure numbers are pixels. Otherwise, for -all systems, pure numbers are degrees. - -

    -

    Examples

    - -
    -    # js9 region format, properties contained in json
    -    ellipse(23:23:22.179, +58:48:10.542, 40", 20", 60) {"text": "json ellipse test", "textOpts": {"color": "yellow", "fontSize": 16, "fontStyle": "italic", "fontWeight": "bold"}, "color": "violet"} # json test tag, another tag
    -
    -    # ds9 format, properties contained in comment string
    -    box(23:23:35.486, +58:50:03.146, 40", 20", 30) # width=4 text={ds9 box test} dash=1 color=red fixed=1 rotate=0 tag="ds9 test tag"
    -
    -    # hybrid js9/ds9 format
    -    circle(23:23:29.526, +58:49:09.56, 14.756997") {"strokeWidth": 1, "strokeDashArray": [3,1], "transparentCorners": true} # text="hybrid circle test" tag="ds9 test tag" tag="json test tag"
    -
    - -
    Last updated: February 2, 2017
    -
    - - - diff --git a/web/static/js9_old/help/repfile.html b/web/static/js9_old/help/repfile.html deleted file mode 100644 index 128266b..0000000 --- a/web/static/js9_old/help/repfile.html +++ /dev/null @@ -1,221 +0,0 @@ - - - - - -Dealing with Large Files - - - -
    -

    Dealing with Large Files

    - -

    -Large astronomical FITS -data files present a challenge for browser-based image display, in two ways: -

      -
    • downloading large files can take a long time, even on the fastest connections -
    • unlike desktop programs which enjoy quasi-unlimited memory via the -mmap() -system call, browsers enforce hard (usually per-tab) memory limits. -
    -The nightmare scenario is to run out of browser memory after taking a -long time to download the file! - -

    -One possibility for dealing with large files is to download a small -representation file for display and quick-look analysis, while -supporting detailed analysis and image extraction on the original -parent file. In JS9, you can: -

      -
    • install the -Server-side Helper -and set the JS9.globalOpts.fits2fits, -JS9.globalOpts.image, and JS9.globalOpts.table, -parameters to control how/when small FITS representation files are -automatically generated. -
    • load a small FITS file (presumably created off-line) and -manually associate a large parent file with it by passing -the parentFile property on the opts object. -
    -These schemes are described below. - -

    Automatic Generation of a FITS Representation File

    - -

    -Consider a 12000 x 12000 Hubble Deep Field image. Even using gzip -compression, this 300Mb file could take several minutes to download -and would require more than 500Mb of memory to display. But you can -bin this file by a factor of 24 into a gzip'ed 512 x 512 FITS image -with file size of approximately 500Kb. This FITS -representation file would download quickly and give a good -overview of the entire data set. You can perform quick-look analysis -on this file using JS9 plugins. But if you also could re-extract a -section from the original file at a higher resolution, you would, in -essence, be panning around the original image without the transmission -and memory overhead associated with processing the whole file. - -

    -JS9 supports FITS representation file generation and display, -as well as extraction of binned image sections from the original parent -file, using the fits2fits scheme. To utilize it at your site, -first configure a Node.js-based -Server-side Helper using the -standard GNU configure/make setup: -

    -  # where to find cfitsio and install binaries, what sort of helper to build
    -  ./configure  --with-cfitsio=/usr/local --prefix=$HOME --with-helper=nodejs
    -  make
    -  make install
    -
    - -

    -Once the js9Helper is running, configure fits2fits by -setting the following global parameters in your js9prefs.js file: -

      -
    • globalOpts.workDir: where to store temporary representation files -
    • globalOpts.workDirQuota: optional user quota on work directory -
    • globalOpts.fits2fits: when/how to generate FITS representation files -
    • globalOpts.image: image section parameters -
    • globalOpts.table: table section parameters -
    -The server-side helper must support temporary user work directories in -which to store the FITS representation files. This is accomplished by -setting the globalOpts.workDir property in js9prefs.js to a -top-level directory which will contain the individual work -sub-directories for each JS9 connection. The workDir path should -either be an absolute path, or one that is relative to the JS9 helper -directory. - -

    -Optionally, you probably will want to set the -globalOpts.workDirQuota property (current default value of -50Mb) to limit the amount of space that can be utilized by each -user. Note that the workDirQuota is not a hard quota: the -js9helper only checks whether the quota has been exceeded before -extracting the next section. This means that users can always extract -one section that will bring the total size above the quota. Thus, if -the quota is 10Mb and the work directory is empty, imsection will -extract a 50Mb file. But it will not extract any more files until -already-loaded files have been closed in order to bring the total -under the quota. - -The globalOpts.fits2fits property controls whether a FITS -representation file is automatically generated. It accepts the following values: -

      -
    • always: always generate a FITS representation file -
    • true: boolean value is same as "always" -
    • never: never generate a FITS representation file -
    • false: boolean value is same as "never" -
    • size>N: generate a representation file is this file's size is greater than N Mb -
    -Of course, this property is only checked if JS9 is connected to a server-side -helper which has a working directory configured, as described above. - -

    -The current default for fits2fits is "size>100", which means that -representation files will be generated if the original FITS file has a size -greater than 100 Mb. - -The globalOpts.image and globalOpts.table objects specify the -image dimensions and bin factor used to generate the FITS representation file: -

      -
    • xdim: x image dimension -
    • ydim: y image dimension -
    • bin: bin factor -
    -Binning is applied after the image section is extracted or the table -is binned into an image. Thus, dimensions of 4096 x 4096 and bin 4 will -produce a 1024 x 1024 image. - -

    -When fit2fits is set up in this way, JS9 will ask the helper to -check the file size when loading a FITS URL. If the check returns -false, the original FITS file will be loaded internally into JS9. If -true, the JS9 helper will extract a representation image (i.e, an -image section) from the parent file, store it in the temporary work -directory, and then tell JS9 to display the representation file. - -

    -The smaller in-memory representation file will be used when performing -browser-based analysis such as WCS reprojection, 3D plots, and -imexam. But the representation file knows its parent, and will send -the parent filename to run server-side analysis tasks. Thus JS9 -performs quick-look analysis on the smaller file and more detailed -server-side analysis on the original parent file. - -

    -In this context, perhaps the most important server-side task is -the Bin/Filter/Section plugin available in the View -menu. This plugin allows you to extract sections from FITS binary -tables and images, with options to choose the image center, image -dimensions, and bin factor. For tables, the plugin also allows you to -filter rows of the table by means of arithmetic and boolean operations -on the table columns. - -

    -The Bin/Filter/Section plugin works with both FITS -representation files and with in-memory FITS files. If the displayed -FITS file is a representation file (i.e., it has a parent file, a JS9 -helper is connected, etc.), the plugin will ask the JS9 helper to -extract the new image section from the parent. Otherwise, it extracts -the section from the in-memory FITS file. This behavior is meant to be -transparent to the user. See the -Bin/Filter/Section plugin for -more information. - -

    -NB: Unfortunately, the fits2fits scheme is not available with -FITS files that are drag/dropped onto JS9 or files that are opened -through the file menu dialog box. Both of these methods call for the -browser to load the whole file directly and pass it to JS9 for display. -There is some discussion within the browser development community of -supporting on-the-fly processing, but nothing definite is planned. - -

    Manual Specification of a FITS Parent File

    - -

    -Assuming the JS9 helper is set up, but fits2fits is set to -"never", you can load a small FITS file using JS9.Load() and manually -specify a parentFile property in the options object: -

    -    JS9.Load("js9/fits/f814w_bin24.fits.gz", {colormap:"cool", parentFile: "fits/f814w.fits.gz"})
    -
    -One important note: the pathname of the URL to load is (as usual) -relative to the web page, while the pathname of the parentFile must be -relative to the JS9 install directory (i.e., where the JS9 helper was -started). In the above example, the web page is one level up from the -JS9 install directory. Once the parentFile has been specified, the -in-memory file should act as a representation file. - -

    -Of course, the two files need to be tied to one another spatially. For -server-side data analysis, having agreement between WCS parameters is -sufficient. In order to use the Bin/Filter/Section plugin, -however, the representation file also must be connected to the parent -file using IRAF LTM/LTV keywords, so that the physical coordinates of -the representation file point to the file coordinates of the parent. -The js9helper program will generate a FITS image section with -the correct keywords. The syntax is: -

    -    js9helper -i parentFile imsection repFile section filter
    -
    -where section can be: -
      -
    • x1:x2,y1:y2[,bin] # specify lo and hi values of the image section -
    • xdim@xcen,ydim@ycen[,bin] # specify center and image dimensions -
    • xdim@0,ydim@0[,bin] # image dimensions taken around center -
    -and filter specifies a column filter for binary tables. For example: -
    -    js9helper -i f814w.fits.gz imsection f814_bin24.fits "12000@0,12000@0,24"
    -
    -was used to generate the binned representation image in the JS9 Large -demo. - -
    Last updated: May 8, 2021
    -
    - - - diff --git a/web/static/js9_old/help/securityissues.html b/web/static/js9_old/help/securityissues.html deleted file mode 100644 index b1af153..0000000 --- a/web/static/js9_old/help/securityissues.html +++ /dev/null @@ -1,56 +0,0 @@ - - - - - -JS9 Security Issues - - - -
    -

    JS9 Security Issues

    - -Unresolved Issues: -

    -None -

    - -Resolved Issues: - -

      - -
    1. All platforms (October 28, 2020 : resolved) -

      -A carefully crafted FITS filename could be used by an attacker to execute -arbitrary Javascript. If, for example, the following FITS file is loaded into -JS9: -

      -    JS9.Load("<svg onmouseover=alert(1)>.fits")
      -
      -then moving the mouse over the Statusbar plugin (where the image id is -displayed) will result in the alert being triggered. Similarly, -setting the id explicitly: -
      -    JS9.Load("foo.fits", {"id": "<svg onmouseover=alert(1)>.fits"})
      -
      -will trigger the alert. This vulnerability is present in any plugin -displaying the image id or filename (e.g., the Blend and Blink plugins). -

      -As of v3.2 (and the GitHub repository as of 10/28/2020), a check is -performed to sense dangerous strings in filenames and ids, and throw an error. -Patched versions of js9.js and js9.min.js for v3.1 are available: -

      -

      -Thanks to Marwan Ali albahar (Umm Alqura University) for reporting this issue. - -

    - -
    Last updated: October 28, 2020
    -
    - - - diff --git a/web/static/js9_old/help/serverside.html b/web/static/js9_old/help/serverside.html deleted file mode 100644 index b821d62..0000000 --- a/web/static/js9_old/help/serverside.html +++ /dev/null @@ -1,409 +0,0 @@ - - - - - -Server-side Analysis Tasks - - - -
    -

    Adding Server-side Analysis Tasks to JS9

    - -

    -A JS9 web site can define analysis tools that will be loaded into the -user's JS9 Analysis menu. These analysis tasks are then -executed by the back-end (CGI or node.js) server using the original -FITS data, with results sent back to the browser for display. - -

    To learn how to install the back-end helper, see: -Installing a Server-side Helper. - -

    -Analysis tools are defined within files contained in the -analysis-plugins directory. If a file in this directory -ends with a ".json" extension, it is assumed to be an analysis -definition file. The following sample analysis definition files will -be found in the analysis-plugins directory by default: -

      -
    • js9Analysis-fits.json: generic FITS tasks (e.g., display header) -
    • js9Analysis-funtools.json: funtools-based analysis tasks -
    - -

    -The analysis definition files are loaded by the Node.js-based helper on -startup and passed to each newly loaded image. In you change the -definition of a tool in one of these files, or add a new definition -file, you either need to restart the Node helper, or send it a SIGUSR2 -signal: -

    -  kill -USR2 `ps guwax | egrep js9Helper | egrep -v egrep | awk '{print $2}'`
    -
    -Re-initialization is not required for CGI-based support, since the analysis -tool definitions are sent to each image in raw form. - -

    -Analysis definition files are in JSON format -(http://www.json.org/) and consist of an array of JavaScript objects, -one for each analysis tool. The properties which define an analysis -tool are: -

      -
    • name: a short identifier string (typically one word) -
    • title: a longer string that will be displayed in the Analysis menu -
    • files: a rule that will be matched against to determine -whether this task is available for the current image -
    • purl: a URL pointing to a web page containing a user parameter form -
    • action: the command to execute on the server side -
    • rtype: a return type, which can be text, plot, fits, regions, catalog, alert, or none -
    • hidden: if true, the analysis task is not shown in the Analysis menu -
    -See the sample json files in the analysis-plugins directory for the -JSON syntax of this file. - -

    -The files property is a rule that determines whether an analysis task -is available for a particular file. The following rules are defined: -

      -
    • fits: true if the displayed image has an associated FITS file -
    • table: true if the displayed image is a binary table -
    • image: true if the displayed image is an image -
    • fitsHeader(pname,pvalue): true if the FITS header of the displayed image has the named parameter with the specified value -
    • imVar(name,value): true if a property of the displayed image has the specified value -
    • js9Var(name,value): true if the JS9 variable has the specified value -
    • winVar(name,value): true if a variable in the window context has the specified value -
    -Examples: -
      -
    • fitsHeader(INSTRUME,HRC): true if the FITS instrument parameter is "HRC" -
    • imVar(params.wcssys,FK5): true if the wcs system for the current image is FK5 -
    • js9Var(globalOpts.projectName,Chandra_EPO): true if the web page has set the JS9.globalOpts.projectName property to "Chandra_EPO" -
    • winVar(MyProject.name,foo): true if MyProject has a property "name" with the value "foo" -
    -Note that all checks are case-insensitive. - -

    -The action string contains the command to execute. For security -reasons, this action is never executed directly. Instead, the first -argument of the command must be a wrapper script contained in -the analysis-wrappers directory. The js9Xeq wrapper -script contained therein is the default script for running JS9 -analysis. The second argument in the action string is a command id, -which is executed within the command-processing case statement of -the js9Xeq. This wrapper script checks for valid commands and -arguments, and then executes the specified command in a way that -protects against malicious attack. You can modify this script to meet -your needs by adding case statements for each of the new tasks you -want to run. - -

    -Alternatively, you can run your analysis tasks through your own -wrapper script, by placing it in the analysis-wrappers -directory. Using your own wrapper script allows you to perform your -own special setup (e.g., setting environment variables, cd to work -directory) before executing a task. Obviously you can -use js9Xeq as an example and modify it to suit your needs. - -

    -In either case, note that execution of a wrapper script is -accomplished by pre-pending the path of the analysis wrapper directory -to the wrapper script name and executing that full pathname directly. -This prevents a would-be attacker from executing anything except the -wrapper itself. Of course, you still have to be careful to avoid -insecure shell coding in your wrapper script. -See The World -Wide Web Security FAQ for advice on writing CGI scripts. - -Note that JS9 scripts generally use bash or sh. Please make sure your -bash and sh programs are properly patched to protect against the bash -bug (CVE-2014-6271). - -

    -The action command line can contain macros (strings prefixed -with the $ character) that will be expanded by the browser before -the action is sent to the server for processing. Typically, these macros are -used to specify filenames, regions, and (possibly) user parameters. The -following intrinsic macros are defined: -

      -
    • $id: id of the JS9 display -
    • $image: name of the image file being displayed -
    • $filename: pathname of the parent file, if available, or the original FITS file -
    • $filename(this): pathname of the original FITS file, even if a parent is available -
    • $fits: pathname of the original FITS file -
    • $parent: pathname of the parent file, if available -
    • $regions: all currently defined regions -
    • $sregions: all source regions -
    • $bregions: all background regions -
    • $imcenter:center of displayed image in image coords (x,y) -
    • $wcscenter:center of displayed image in WCS coords (ra,dec) -
    -Note that $filename macro will return the pathname of the -parent by default, so that analysis can be done on the parent file. Use -$filename(this) or $fits to return the pathname of the -displayed FITS file, regardless of the presence of a parent. This is -useful if you want to run analysis on the representation file instead -of the parent. -

    -The three regions macros return region info in the current wcs -system. To specify an alternate wcs system, append "physical", -"image", or "wcs" in parentheses, e.g., $regions(physical). -

    -For example, to run the funcnts program, specifying the original FITS -file as well as source and background regions, use: -

    -    funcnts $filename $sregions $bregions
    -
    - -

    -Many analysis tasks do not require the user to select additional parameter -options and can can be executed immediately. Other command require -user-selected options. These latter options should be put into a web -form, whose location is specified by the purl option. See -the params/histplot.html file for an example. - -

    -Parameter options in a parameter form should have unique ids. These -ids can then be added as macros to the action command line by -prefixing them with a $. For example, the histplot command is: -

    -    js9Xeq histplot '$filename[$regions]' '$norm $bwidth' $column $bins
    -
    -Here, the norm, bwidth, column, and bins -parameters are taken from the web form for histplot. The $filename -and $regions macros are intrinsic to JS9. - -

    -The input element of the analysis form should run -the JS9.SubmitAnalysis() command, which will serialize the form, -pass it to the macro expander, and then send the resulting command string -to the server for execution. See histplot.html for sample syntax. - -

    -The rtype property determine how JS9 handles return values: -

      -
    • alert: call JavaScript alert() function on the returned string -
    • catalog: the returned URL to a catalog file is loaded on the current image -
    • fits: the returned URL to a FITS file is loaded (2nd argument can be a parent file) -
    • none: check for an error return, but otherwise do nothing -
    • plot: the returned plot data is plotted -
    • regions: the returned URL to a regions file is loaded on the current image -
    • text: the returned text is displayed in a lightweight window -
    -The text and plot returns are the most commonly used types. -

    -NB: when text is returned, be aware that file pathnames are often output -by programs. For security reasons, you should remove or modify these -pathnames before returning the text. For example, JS9 funtools -analysis routines use a sed command like this: -

    -  sed 's#'${JS9_DIR:-none}'#${JS9_DIR}#g;'
    -
    -to change pathnames containing the JS9 working directory so that they display -the string "${JS9_DIR}" instead. - -

    -Sample scripts such as funcnts2flot and funhist2plot -generate a JSON string that contains a valid flot object. For -example, the radial profile plot contains x, y, and error values: -

    -{
    -  "label" : "surf_bri(...) vs. avg_radius(...)", 
    -  "points" : {"errorbars" : "y", "yerr" : {"show" : "true", "color" : "red"}},
    -  "data": [[x1, y1, e1], [x2, y2, e2], ... [xn, xn, en]]
    -}
    -
    -while the histogram plot contains only x and y values: -
    -{
    -  "label" : "counts vs. ...bin", 
    -  "data": [[x1, y1], [x2, y2], ... [xn, xn]]
    -}
    -
    -If your analysis task generates one of these two plot formats, JS9 -will display the plot data. By default, the plot is generated using -the jQuery flot library (see http://www.flotcharts.org/), which -is supplied with JS9. - -

    -You also can use the plotly library for plotting. To do this, -set the JS9.globalOpts.plotLibrary property to "plotly" and -load the library in the web page header. (Due to its relatively large -size, plotly is not packaged in the JS9 support file.) - -

    -Plotting is still somewhat experimental and rudimentary. For example, -flot (but not plotly) simply uses the x -and y keys to toggle between linear and log scaling. We will -be adding features and improvements with time. Please work with us to -improve plotting support. - -

    -Finally, the hidden value determines whether or not a task is -displayed in the Analysis menu. If hidden value is true, the -analysis task is not shown. However, it still is available to the -JS9.RunAnalysis() routine. - -

    -

    Adding Analysis Tasks Directly to Your Web Page

    -

    -By default, server-side JS9 analysis tasks are executed using -the Analysis menu, but they also can be executed directly from -the web page by means of HTML elements (buttons, forms, etc.) To do -this, a web page author simply creates the desired interface and calls -either JS9.RunAnalysis() (for buttons, menus, etc.) -or JS9.SubmitAnalysis() (for forms). These are described -below. See the js9analysis.html page for an example. - -

    -The JS9.RunAnalysis() routine is used to execute an analysis task and -return the results for further processing within the web page. The -JS9.SubmitAnalysis() routine works similarly, but it is used -with a form: it automatically serializes the form values and passes -them to the analysis macro expander so that these values can be put -into the analysis command line. The calling sequences for these -routines are similar: -

    -    JS9.RunAnalysis(aname, [options], returnFunc);
    -    JS9.SubmitAnalysis(this, aname, returnFunc);
    -
    -where: -
      -
    • aname: the name value of the task (as defined in the js9Analysis.json file) -
    • options: an optional array of parameters to pass to the analysis -macro expander. The array is in jQuery name/value serialized object -format, which is described here: -
      -    http://api.jquery.com/serializeArray/
      -
      -
    • returnFunc: a function to process the returned data when the task is -completed -
    • this: the 'this' value of the form element -
    -

    -The returnFunc() routine is a callback function to process the returned -data from the analysis task. The calling sequence is: -

    -    returnFunc(stdout, stderr, errcode, aobj)
    -
    -where: -
      -
    • stdout: a string containing the standard output from the task -
    • stderr: a string containing the standard error from the task -
    • errcode: error code value from the task or 0 -
    • aobj: the analysis object from the js9Analysis.json file, containing - the rtype (e.g., "text" or "plot") property -
    -Typically, you would check the errcode and/or stderr string first and -issue an error message if there is an error. Otherwise, the stdout -string can be processed based on the return type (rtype) of output -(e.g., "text" or "plot"). For plotting, you can use the flot -functionality that is loaded into JS9, or you can use your own chosen -plotting package. See js9analysis.html for a simple example. - -

    -

    Temporary Work Directories for Users

    -

    -By default, server-side analysis is initiated in the directory in which -Node.js or the CGI script is run. For tasks not creating temp files, -this usually is sufficient. For other cases, it can be desirable to -isolate users in their own temporary work directories. To do this -automatically (i.e. without the task itself having to change -directories), set the following property in the globalOpts object of -the js9Prefs.json file: -

      -
    • workDir: set to the relative path of a directory which -will hold temporary working directories for each loaded web page (default: ./tmp) -
    -The workDir directory should be relative to the directory in -which the JS9 helper is run. This will ensure that you have access -permission to temporary retrieve files via the web server (e.g., -loading a remote file via the LoadProxy() command into a -temporary directory, so that JS9 can subsequently load it via the web -server). This restriction can be relaxed when using the file:// URI, -although some browsers on some operating systems (e.g., Firefox on -Linux) prevent you from loading files outside the web page domain even -with the file:// URI. - -

    -You also can set the following globalOpts configuration parameters in -js9Prefs.json: -

      -
    • workDirQuota: the disk quota on working directory (default: 100Mb) -
    • rmWorkDir: remove workdir when web page disconnects? (default: true) -
    -When workDir is configured, user sub-directories will be created -in the workDir directory to contain temporary files. Analysis -tasks will be started in the work sub-directory. -

    -For Node.js-base helpers, the work directory is removed when the web -page is unloaded. This can be changed by setting rmWorkDir to -false in the preference file. For CGI-based helpers, you must remove -the work directory manually (e.g., using a cron job that checks for -time-last-accessed of work directories). - -

    -Note that the workDirQuota is not a hard quota: JS9 tasks such -as load proxy enforce their own checks using this value. For -example, load proxy only checks whether the quota has been exceeded -before loading the next file. This means that users can load one file -that will bring the total size above the quota. Thus, if the -quota is 10Mb and the work directory is empty, the load proxy will -load a 50Mb file. But it will not more load files until already-loaded -files have been closed in JS9 (and thereby deleted in the temp -directory) so as to bring the total under the quota. - -

    -

    The Proxy Load Service

    -

    -NB: use this service with care. It allows users to consume disk resources! -

    -For security reasons, JavaScript contained in one web page can -access data in another web page only if both web pages have the -same origin (i.e., basically coming from the same host). This -policy is called the - -Same Origin Policy. This means that JS9 cannot load a FITS file from -an arbitrary URL without using special techniques. -

    -One such technique is to use a proxy server: the URL is not loaded -directly into JS9, but instead is copied back to the server from which -JS9 itself was loaded. The file is then retrieved by JS9 so that the -"same origin" rules are not violated. -

    -A CGI or Node.js back-end server can be set up as a proxy server by -setting the following globalOpts properties in the js9Prefs.json file -(before starting the server): -

      -
    • loadProxy: set to true to enable proxy load (default: true) -
    • workDir: see above -
    • workDirQuota: see above -
    • rmWorkDir: see above -
    -

    -When the back-end server supports the proxy service, you will see a -menu option in the File menu called open link via proxy ... -

    -Enter a FITS URL into the proxy dialog box and press the Load -button. The data file will be retrieved by the server and stored in a -directory specifically tied to the web page. (The directory and its -contents will be deleted when the page is unloaded.) JS9 then will -load the file from this directory. Note that since the file resides on -the back-end server, all back-end analysis defined on that server is -available. -

    -This technique can also be used FITS links from other sources. For -example, if you have a FITS file on Google Drive, Dropbox or even a -static web page, you can generate/copy the link and paste it into the -proxy dialog box for display. (Dropbox files also can utilize -the open link via CORS ... option, which downloads the data -directly to JS9, bypassing the proxy server.) -

    -Note that individual proxy FITS files are deleted from the working -directory when they are closed in JS9 using the File:close -image menu option. - -

    Last updated: June 1, 2021
    -
    - - - diff --git a/web/static/js9_old/help/user.html b/web/static/js9_old/help/user.html deleted file mode 100644 index 4b3d47e..0000000 --- a/web/static/js9_old/help/user.html +++ /dev/null @@ -1,885 +0,0 @@ - - - - - -The JS9 Help Facility - - - -
    -
    -

    JS9: astronomical image display everywhere

    -Eric Mandel, Alexey Vikhlinin -
    -Center for Astrophysics | Harvard & Smithsonian -
    -Cambridge, MA 02138 -
    - -

    -

    Introduction to JS9

    -

    - -JS9 is the latest in the SAOimage line of astronomical image display -programs developed at -the Center for Astrophysics | -Harvard & Smithsonian (CfA.) Our previous effort, -SAOimage DS9, has been -the de facto standard desktop image display for more than 30 -years. Now, with JS9, you can view and manipulate astronomical image -data in your browser as well as on the desktop. -

    -Please choose from the following topics: -

    - -

    - -

    Getting Started with JS9

    -

    -JS9 provides astronomical image display capabilities both on the -desktop and in your browser. JS9 takes its name as well as its core -functionality from the de facto standard -DS9 image display -program for desktop use. JS9, on the other hand, can be run either on -the desktop or in a browser. It also can be used without any -installation at all by dragging/dropping a FITS file onto the -JS9 website. In all -three cases, the JS9 display consists of one or more HTML components -that are added to a web page. At a minimum, the JS9 display will -contain an image display canvas. It usually also will display a -menubar containing several pull-down menus and a -colorbar. Traditionally, the menubar is placed on top of the image -canvas and the colorbar below, but web page designers (as well as -individual users) have complete control over component placement. JS9 -also can display an info box, a command-line window, a pan window, a -zoom window, as well as other plugins. All of these plugin windows can -be brought up dynamically from the View menu. - -

    -Astronomical image data usually is offered on a JS9 web page as one or more -clickable URLs. When you click on a data URL, it is displayed on the JS9 image -canvas. Multiple images can be loaded into a single JS9 display. The File -menu allows you to switch between these images. - -

    -Once an image is loaded, you can move the mouse (or a single finger on -a touch screen) to display position and pixel value information. -Pressing the left mouse button and moving the mouse (or using two -fingers on a touch screen) will change the contrast/bias of the -displayed image, bringing image features into relief. - -

    -These mouse/touch actions are configurable, both by web page -developers and by users. See -the Mouse Touch plugin for -more information. - -

    -Menu options allow you to change the scaling algorithm and/or color -map, add geometric regions of interest, change world coordinate system -(WCS) parameters, and run site-specific astronomical analysis tasks on -the original FITS data. - -

    - -

    JS9 Menus

    -

    -The following menus are in the default JS9 menu bar. Of course, web -designers have control over which menus are displayed (or even whether -the menu bar itself is displayed.) Thus, not all of the menus listed below -will be found on all JS9-enabled web pages. - -

    -Some menu options have keystroke accelerators and these are shown on -the right-hand side of the menu option. Thus, for example, to open a -local file, you can select the File:open...:local file menu -option, or press the Meta-o key combination when the mouse is -inside the JS9 display. - -

    -Note that the default menubar has a style in which all of the -major menus are shown at the top-level of the menubar. This is -the classic style. JS9 also supports a mac style -menubar, in which the File, Edit and View menus -are placed on the left side of the menubar and the Help menu on the -right. The other main menus are displayed as submenus within -the View menu. - -

    -The default top-level JS9 menus are: -

      -
    • File: The File menu displays the currently loaded images, -either directly in the menu, or, if there "too many" images (as -defined by the JS9.globalOpts.imagesFileSubmenu variable), using -an images submenu. The displayed image is marked with a -starburst. To display a different image, simply choose it from the -menu. The File menu also contains the following submenus and options: -

        - -
      • open local... bring up a file browser dialog box to choose a FITS,PNG, or JPEG file for display - -
      • open remote ... bring up a dialog box to load a remote URL either using a JS9 proxy server (if configured), the cgi proxy on js9.si.edu, or directly using a CORS-enabled server (if available) - -
      • display ...: components and sections: -
          -
        • FITS header display FITS header of the current image -
        • FITS HDUs display a list of HDUs in a multi-extension FITS file -
        • refreshed image an advanced option that will call the -internal redisplay routine for the displayed image (useful, for -example, if you are reprocessing the image on disk and want to view -the new data) -
        • full image an advanced option that tries to -load and display the entire image (might cause the page to crash if -the image is too large) -
        • selected cutouts selected region(s) are used to define the center and size of new image section(s); note that image sections are always rectangles and region angles are ignored -
        • display pageid, a unique ID for this page that can be used to communicate externally with a JS9 instance when multiple JS9 instances are running (js9 --pageid [pageid]) -
        - -
      • move ... move the current image to an existing displays or -a new display. (The new display will either be a in a light window or -a CSS grid, depending on how the web page is constructed.) - -
      • separate ... separate/gather two or more images -
          -
        • separate these images move each image in this display to a -new display. (The new display will either be a in a light window or a -CSS grid, depending on how the web page is constructed.) -
        • gather all images here move all images from other displays to this display -
        - -
      • save ...the currently displayed image data. You can save -the currently loaded image (or the currently loaded image section, if -an image section was extracted) in standard FITS image format. Or you -can save only the currently displayed image section in any of the -following formats: -
          -
        • FITS (standard astronomical image file, without 2D graphics) -
        • JPEG (also includes 2D graphics, such as regions) -
        • PNG (also includes 2D graphics, such as regions) -
        - -
      • close ... one or more images (or internal image memory) -
          -
        • this image to clear the current image and release browser resources -
        • all images to clear all images and release browser resources -
        • free image's memory free up memory used to store the FITS file internally (which is needed for WCS reprojections, viewing FITS extensions and data cubes) -
        • proxy file to clear a server proxy file and release browser resources -
        - -
      • catalog ... load or save catalogs -
          -
        • load ... load a tab-delimited catalog file into the display -
        • save active save the currently active catalog (Shape Layers plugin has more general support) -
        - -
      • mosaic ... create a mosaic image using: -
          -
        • images in the current file -
        • images in this display -
        - -
      • session ... load or save sessions -
          -
        • load ... load a previously saved local session file into the display -
        • save ... save information about the current image or all images loaded into this display: filename, scaling, colormap, contrast/bias, zoom, regions, catalogs, etc. are stored in a json file -
        - -
      • window ... create a new JS9 display window: -
          -
        • light window create a light window containing a JS9 instance -
        • separate window create a separate window containing a JS9 instance -
        - -
      • remove this display close images and remove this display. This -option is available for displays contained in light windows and for displays -contained in JS9 Grid Containers (although the latter requires that at least -one display to remain in a container.) The display is removed immediately -and without a confirmation dialog box (unlike a light window being closed -via its close button.) - -
      • print ... print the current image display window (including 2D graphics) -
      - -
    • Edit: allows you to copy and paste regions, positions, -and pixel values to/from the clipboard: -

        -
      • edit if a single region is selected, display its edit window; -if multiple regions or no regions are selected, display the multi-region window; -
      • copy copy selected region(s) (or all regions, of none are -selected) to the system clipboard, so that you can transfer to other -JS9 displays or to programs outside of JS9 -
      • paste to current pos paste previously copied region(s) to -the current mouse (or arrow key) position in a JS9 display. Usually -you would use the keyboard shortcut (currently 'p') for this -sort of pasting, but you also can use the meta key to freeze the mouse -position and then use this menu option -
      • paste to original pos paste previously copied region(s) to -their original region position(s), usually in another JS9 display. -
      • undo remove restore the last removed region (or set of removed regions, if more than one was removed in a single operation) -
      • copy wcs pos copy the current WCS position to the system clipboard -
      • copy value/pos copy the current pixel value and WCS position to the system clipboard -
      - -
    • View: displays a list of available plugin, including the following core options: -

        -
      • Archive and Catalogs: allows you to display image data retrieved from various archives and overlay catalog information. -
      • Bin/Filter/Section: supports binning and column filtering on FITS binary tables. -
      • Blending: combine selected images using a specified blend -mode and optional opacity. -
      • Colormaps: create compatible colormaps from a specified color -
      • Console: will bring up a movable, light-weight -console window into which JS9 commands can be entered. -
      • Contours: generate contour maps -
      • Data Cube: display slices of a 3D FITS -data cube. -
      • Extensions: display images from a FITS multi-extension file. -
      • Imarith: simple image arithmetic between images -
      • InfoBox: allows you to display value and position -information in a separate light-weight window. -
      • Keyboard Actions: view the current mapping between keys and actions -
      • Magnifier: will bring up a movable, -light-weight window showing a blocked image of the data in an area -surrounding the mouse as it moves. The default magnification of four -can be changed using command buttons on the magnifier window. -
      • Mouse/Touch: allows you to change the -actions performed when you move the mouse over an image with zero, -one, or two buttons pressed. It also configures touch actions using -one, two, or three fingers. -
      • Panner: will bring up a movable, -light-weight panner window that displays the full image along with a -viewport rectangle showing the currently displayed image section in -the primary image window. The viewport can be moved around in order to pan -to different locations in the primary image. The panner also has -command button options to zoom the viewport itself. (This makes -the viewport rectangle larger at the expense of displaying only a -section of the full image. It is useful for panning in a very large -image.) -
      • Pixel Table: displays an array of pixel values around the current mouse position. -
      • Preferences: set preferences for this session (and/or save for future sessions) -
      • Separate/Gather: separate images in this display or gather images into this display -
      • Shape Layers: displays the layers defined for the current -image and allows you to turn on and off the display of any layer. -
      • Show/Hide Plugins: displays the currently active plugins and allows -you to hide plugins defined statically on the web page. -
      - -

      -The View menu also contains the following Display -Options submenus: -

        -
      • show ... options on the display: -
          -
        • value/position ... a submenu of options for displaying -the current value/position, including: -
            -
          • update value/position: specifies whether the image position -and pixel value is displayed as the mouse (or finger) moves over -the image. By default, this information is displayed in the upper left -of the image. The display can be moved anywhere inside the JS9 window by -clicking on it with the mouse and moving. You also can redirect the -display to a movable, light-weight window by choosing the -InfoBox menu option. -
          • value/pos color: allows you to change the color of the -value/pos display. You can enter color names (e.g., red, lightgreen, steelblue, -cyan) or values in #RRGGBB format (e.g., #00FF00 is the default bright green). -
          • also show display coords: specifies whether display coordinates -are shown in the value/position display when the WCS sys is set to "image". -
          -
        • active shape layers: toggles display of shape layers -
        • crosshair for this image: displays a -crosshair at the mouse position when the Shift key is held down -(without the Shift key on iOS devices.) It is turned off by default. -
        • match wcs crosshairs: displays a crosshair in -other JS9 displays, matching the WCS position of the mouse in this display -(assuming the other image has its own crosshair enabled.) -
        • toolbar tooltips: specifies whether tooltips -are displayed as the mouse hovers over an icon in the Toolbar -plugin. (For mobile devices, a single tap will display the tooltip, -requiring a second tap to execute the toolbar action.) -
        • new image inherits current params: specifies whether -a new image grabs the image params (e.g., colormap, scale, zoom, etc.) -from the currently displayed image. If false, these params are taken -from the default JS9.imageOpts object. -
        -
      • resize ... options to resize the display: -
          -
        • change width/height specify a new width and height for the -JS9 display. -
        • set to image size: set display to current image size -
        • set size to full window: set display to browser window size -
        • reset to original size: set display to its original size -
        -
      - -
    • Zoom: The zoomIn and zoomOut menu options -zoom the primary image in or out by a factor of -two. The zoomToFit options calculates a zoom factor that fits -the entire image into the JS9 display. You also can set the zoom -factor to a pre-specified value using menu options or you can specify -a floating point zoom factor in the other zoom text -box. The pan to center option pans to the center of the image, -while the reset pan/zoom sets the zoom to 1 and centers the -display. - -

      -The align pan/zoom ... submenu allows you to change the pan and -zoom of the current image to match a target image, assuming both have -WCS info available. Pixel size (i.e. as specified by the FITS CDELT1 -parameter) will be taken into account when zooming, but not image -rotation or flip (from the WCS params.) This is quicker than -the wcs reproject algorithm for aligning images that are -similar. - -

      -The Zoom menu also supports image flip around the x or y axes, -image rotation by +/- 90 degrees or by an arbitrary -angle. There also is an option to rotate the image so that north is up -in the current coordinate system. Flipping and rotation are performed -on the displayed pixels (so no change is made to the WCS). The -rotation is much faster than the more general WCS-based -rotation/reprojection in the WCS menu. Note that arbitrary -rotation is performed in terms of an absolute angle: if you rotate by -20 degrees and then do it again, there is no change. Also, setting the -rotation to 0 sets the angle to 0. Flipping and rot90, however, are -relative to the current state of the display. This differs from DS9, -where the actions are linked to the x and y axes. Thus, flipping by x -twice will return you to the original orientation, whereas flipping a -second time does nothing in DS9. - -

    • Scale: Each scale option specifies a different scaling -algorithm to use when converting image pixel values to RGB -values. (The procedure for doing this conversion is detailed in the -DS9 documentation titled "How It Works".) The log scale, for example, is -especially useful with X-ray data. Histogram equalization (histeq) -tries to maximize contrast across the range of data values and is -useful in a wide variety of cases. The current scale is marked with a -starburst. - -

      -You also can change the low and high values used to clip the image -data before scaling by changing the low and/or high -values in the text boxes of the Data Limits section. These values are -set initially with the data's min and max values or the z1,z2 values -calculated by the IRAF zscale algorithm (depending on the value -of the web site's JS9.imageOpts.scaleclipping parameter. The -default usually is "dataminmax".) Finally, you can use the -Scale Controls plugin to set the clipping values -to data min/max, zscale z1/z2 or zscale z1/max, or set the clipping -values using the pixel distribution plot. - -

    • Colormap: Each colormap option specifies a different -distribution of RGB values to use when converting image pixel values to RGB. -(The procedure for doing this conversion is detailed in the -DS9 documentation titled "How It Works".) Choose the colormap you like best, -or try different ones to see how data features can be brought to the fore -by color and contrast/bias. - -

      -The image filters menu option displays the JS9Filters -plugin, which offers a number of well-known image processing functions -that act directly on the displayed RGB image data (not the underlying -raw astronomical data, as with the Gaussian blur in the Analysis -menu.) Thus, when you can run one of these routines on an image, its -effect will be undone if you redraw the image by changing the -contrast/bias, colormap, etc. Also, since these functions act on the -current RGB image, their effect is cumulative. See the -JS9.FilterRGBImage() section in -the JS9 Public API for more information -about the individual functions. Note that not all functions in the -public API call are implemented here: some of them seemed pretty -useless for our data (they can be added easily.) - -

      -You can enter a floating point value into the contrast and -bias text boxes to set the contrast/bias. Note that the -contrast value ranges from 0 to 10 and the bias ranges from 0 to 1 -(following DS9 conventions.) - -

      -The reset contrast/bias option restores the original -contrast/bias value (which is especially useful if you changed the -contrast/bias or scale and now can't see any features at all!) - -

      -The opacity option allows you to set the overall opacity for all -pixels in the image. Values range from 0 (transparent) to 1 (opaque.) More -opacity options can be found in Color Controls (see below.) - -

      -The load option brings up a File menu from which you -can choose a user-defined colormap to load. - -

      -The save option saves the active colormap definition -for the currently displayed image to a file (useful for editing to -make a new colormap.) - -

      -The invert option inverts the colormap (e.g., in the gray map, -this will change white to black and vice versa.) - -

      -If you have three images of the same size, scale, and pointing -direction (e.g., three energy cuts of a Chandra data set), you can -display each one separately and assign to them one of the red, -green, or blue colormaps. If you then select the rgb mode -menu option, they will be displayed as one RGB composite image. The -current image (as shown in the File menu) determines which of -the three independent colormaps is changed by the contrast/bias -manipulation. To remove an image from the RGB composite, give it a -different colormap. Re-join (or add a new image) by assigning one of -the RGB colormaps. Simply turn off RGB mode to display the images -separately. - -

    • Regions: Astronomical regions format is described -here. -Choose the appropriate menu option to create a -region of type annulus, box, circle, ellipse, -line, point, polygon, text. -(see below for details on how to use regions.) One or more regions can -be created and manipulated on a single image. - -

      -By default, a region is created in the center of the image when it is -selected in the Regions menu. You can turn off auto-creation by -deselecting the menu adds region @ center option. With -auto-creation turned off, the 'a' key will add the last selected -region at the current mouse position. - -

      -The list menu option will display all regions. - -

      -The load ... menu option will load a file of regions and -display them on the current image. Regions can be specified using the -a dialect of the widely-used DS9/Funtools regions format, as described -here. - -

      -The save ... display a dialog box allowing you to save selected -or all regions in one of these formats: -

        -
      • regions text file in astronomical regions format -
      • csv comma-separated values -
      • SVG text file in SVG/XML format (useful for importing into -programs such as Photoshop for further processing) -
      -NB: The file will be saved in the folder where your other browser -downloads are stored. - -

      -The copy to ... menu option will copy regions from the -current image to a specified image (or to all images.) If one or more -regions are actively selected in the current image, they alone will be -copied. Otherwise, all regions will be copied. - -

      -The remove menu option will delete all regions. - -

      -The selected regions ... submenu contains options that apply to -the selected region(s), including the ability to edit, list, save, -remove, or copy the selected region(s). The submenu also allows you -to change the following properties of selected regions by entering text values: -

        -
      • color: the color of the region, using either a name -("wheat") or #rrggbb syntax ("#f5deb3".) -
      • width: the numeric width of a region -
      • dash: two comma or space-delimited numeric values specifying the -numeric width of a filled segment, followed by the width of a blank segment -
      • tags: replacement tags for this region -
      -

      -The selected regions submenu also supports the ability to toggle the -"source"/"background" or "include"/"exclude" tags (which is heavily -used in X-ray astronomy.) - -

      -The onchange submenu contains the following options: -

        -
      • list on change: all regions are listed whenever one changes -
      • xeq on change: toggle whether region onchange callbacks are called -
      - -
    • WCS: Use this menu option to select a world coordinate -system when displaying pixel positions and regions (assuming -the data file supports WCS.) Available systems are: FK4, FK5, -ICRS, galactic, or ecliptic. The native -option chooses the system stored in the data file. The image -and physical systems will display only image coordinates (not -WCS coordinates.) Physical coordinates are tied to the original -(block 1) file coordinates while image coordinates are tied to -the current image data being displayed. Server-side X-ray analysis -routines operating on the original file generally want physical coords -rather than image coords. Browser-based plugin routines generally use -image coordinates to operate on the in-memory image data. - -

      -You also can choose the units in which WCS information is displayed: -degrees, radians, or sexagesimal. Image and -physical coordinates are displayed in units of pixels. - -

      -The alternate wcs menu option allows you to choose an alternate -world coordinate system, if one or more are defined in the current -FITS file. The submenu lists the WCS version (i.e. the letter "A" - -"Z", or "default") and, if present, the WCSNAME header parameter -associated with this WCS. - -

      -The reproject menu option allows you to reproject the -image using the WCS associated with another displayed image. The -reprojected data is placed in a new raw data layer called -"reproject". You can switch between layers using the View->raw data -layers option. If the display wcs-aligned option is set, -the reprojected image will be aligned with the wcs reference image. If -you change the pan/zoom of the latter, the former will be re-aligned. -(The converse is not true: changing the reprojected image does not -change the wcs reference image.) You can also reproject other images -in this display using the WCS info from the currently displayed image. - -

    • Analysis: -JS9 supports both client-side analysis (i.e., -analysis in the browser) and server-side analysis (where requests are -made to a back-end server, and returned results are displayed in the -browser.) - -

      -Client-side analysis tasks can be written using the JS9 -Plugin capability, and -the Analysis menu lists the currently loaded Analysis -Plugins. For example, JS9 supplies the -Imexam plugin, which offers the following tasks: -

        -
      • 3dPlot -
      • Encircled Energy -
      • Histogram -
      • Radial Proj -
      • Region Stats -
      • X Proj -
      • Y Proj -
      - -

      -JS9 supplies a few other client-side analysis tasks: -

        -
      • Coordinate Grid: display a WCS-based coordinate grid. The -coordinate grid parameters can be changed using the Preferences -plugin in the View menu. -
      • Counts in Regions: Run the -regcnts -program (compiled into the browser using - -Emscripten) on the specified -source and background regions and return a text display. This is the -same task as the server-side task, but running on the internal FITS file. -(Currently disabled for iOS.) -
      • Radial Profile: Run the -regcnts -program (compiled into the browser using - -Emscripten) on the specified -source and background regions and return a plot display. The source -regions consist of circles. This is the same task as the server-side -task, but running on the internal FITS file. -(Currently disabled for iOS.) -
      • 3D Counts in Regions: Run the -regcnts -program (compiled into the browser using - -Emscripten) on the specified -source and background regions for each slice in a 3D data cube and return a -text display. -(Currently disabled for iOS.) -
      • 3D Plot using Regions : Run the -regcnts -program (compiled into the browser using - -Emscripten) on the specified source and background regions for -each slice in a 3D data cube and plot the background-subtracted results. -(Currently disabled for iOS.) -
      • Gaussian Blur: enter a sigma (radius) to create a new raw -data layer called "gaussBlur", in which the image pixel values are -blurred using a Gaussian function with the specified sigma. The -routine uses the fast Gaussian blur algorithm (approximating a full -Gaussian blur with three passes of a box blur) described -here. -
      - -

      -In addition, each JS9 site can define server-side analysis -tasks to be run from the Analysis menu. Server-side tasks are of two types: -

        -
      • immediate tasks: These tasks are executed directly and -immediately from the Analysis menu. No parameter setup is needed. -
      • parameter tasks: These tasks bring up a lightweight -parameter window allowing various parameters to be set before -executing the task. Parameter tasks are identified by the presence of -an ellipsis (...) after the task name. -
      -

      -For example, the JS9 web page at -https://js9.si.edu -offers the following tasks: -

        -
      • FITS Header(s): Display all FITS headers for this FITS file. -
      • Counts in Regions: Run the -regcnts -program on the specified -source and background regions and return a text display (immediate task.) -
      • Radial Profile: Run the -regcnts -program on the specified -source and background regions and return a plot display. The source regions -consist of circles or annuli (immediate task.) -
      • Energy Plot: Create a histogram of the pi column (or energy -column for Chandra data) of a binary table and return a plot display -(immediate task.) The column must exist in the data file (e.g., -Chandra ACIS data but not Chandra HRC data.) -
      • Light Curve:Create a histogram of the time column of a binary table -and return a plot display (immediate task.) The time column -must exist in the data file. -
      • Histogram Plot: Create a histogram of the user-specified -column of a binary table and return a plot display (parameter -task.) Parameters include: histogram column name, number of bins, use -bin width instead of bin size, and an option to normalize by bin -width. A help file is appended to the parameter display. -
      • Event Filter: filter the events of a binary table and return -an image representation of the filtered events. Note that when a FITS file -is loaded directly into JS9, you can use the Binning/Filtering plugin -to filter events instead. -
      -

      -If you drag and drop a FITS file onto a JS9 web page connected to a -remove server (such as -https://js9.si.edu), -the FITS file will, of course, not be accessible on the server (it's only -stored in the browser.) As a result, no server-side analysis tasks will -be available. But if the remote server supports proxy loading -of FITS data, the Analysis menu will display an option to upload FITS to -make tasks available. Select this option and your FITS file will -be sent to the server so that server-side analysis can be performed. - -

      -The server-side params submenu contains the following options: -

        -
      • set data analysis path ...: specify a colon-separated list -of directories for JS9 to search when looking for FITS data files that -have been dropped onto the display. This is used by JS9 when -performing server-side data analysis on local drag-and-drop FITS -files. It is necessary to specify data paths explicitly since web -pages are not allowed to determine the pathname of such files -automatically (for obvious security reasons.) -
      • set this image file's path: for local servers only, set the -path (absolute or relative to the displayed web page) of an image file -loaded via Drag and Drop or Open Local File. For -security reasons, browsers do not expose the path of files loaded in -these two ways. However, for a local web page, you can safely specify -the image path in order to refresh the image or run server-based -analysis. -
      - -
    • Help: Show this and other JS9 help pages. The Help menu -also contains help for Plugins, including the Imexam plugins -listed above. -

    - -

    - -

    JS9 Mouse Interaction

    -

    -In keeping with the needs of mobile devices, JS9 utilizes a single -mouse button for user interaction. Keyboard input also is minimized. -Moving the mouse (or a single finger on a tablet) over the image will -display the position/value of individual pixels. Pressing and moving -the mouse (or two fingers) will change the contrast and bias of the -image. A double-click (or double-tap) inside a region will bring up -the configuration menu for that region. - -

    - -

    JS9 Regions

    -

    -Regions are geometric shapes that can be used to mark part of an image -for analysis. JS9 allows you to create the following region -types: annulus, box, circle, ellipse, line, point, polygon. -A text region also can be created to annotate an image. When one -of these options is selected, the region is created in the center of -the image. It then can be dragged to the desired location. Arrow keys -also will move the region one screen pixel in the specified direction. -A selected region can be deleted by pressing the Delete key (where -available. On a tablet, use the delete option in the configuration menu.) - -

    -Click inside a region to select it and display the resize/rotate -controls around its perimeter. Grabbing a handle allows the size of -the region to be adjusted or rotated. In the case of the box and -ellipse regions, the width and height are controlled separately. Click -outside the region to de-select (or click another region to select -that one.) - -

    -For a line region, the end-points serve as both resize controls (arrow -icon) and stretch points (hand icon.) You might have to move the mouse -around a bit to switch from one to another. The control action is to -resize the region in both directions (i.e., the same as other regions.) -The stretch action allows you to move this end-point while the other one -remains fixed. - -

    -A double-click inside a region brings up a configuration menu. You can -change various values associated with a region by entering new values -in the appropriate text boxes and the clicking Apply. - -

    -The configuration menu has the following standard options: -

      -
    • id: the id of this region, which can be used programmatically to select it for processing (read-only) -
    • type: the type of region (read-only) -
    • image center: new image pixel values can be entered to change the region position -
    • WCS center: new WCS position values can be entered to change the region position (where WCS is available) -
    • Text: create a child text region with the specified text -
    • Color: change the color of the region (color name or #RRGGBB syntax) -
    • Tags: the default tags (source, background, include, exclude) -are used in X-ray astronomy but you can enter any string to tag this region and then select programmatically using tags -
    • WCS Region: the WCS representation of this region, where applicable (read-only) -
    • Image Region: the image representation of this region, where applicable (read-only) -
    • Misc Properties:use JSON format to specify shape properties not listed above (e.g., {"transparentCorners": true}, see Fabric.js for more info on shape properties.) -
    • Options: -
        -
      • Changeable: enable/disable move and resize capability -
      • List On Change: list this region when it's moved or resized -
      • Remove: remove this region. On an iPad, this currently is -the only way to delete a region. -
      -
    -

    -In addition, regions of different type support specific configuration -parameters in this menu. -
    -The annulus region supports: -

      -
    • Radii: change the radii of the region (in pixels) -
    -The box region supports: -
      -
    • Width: change the width of the region (in pixels) -
    • Height: change the height of the region (in pixels) -
    • Angle: change the angle of the region (in degrees, counter-clockwise) -
    -The circle region supports: -
      -
    • Radius: change the radius of the region (in pixels) -
    -The ellipse region supports: -
      -
    • Radii: change the r1 and r2 radii of the region (in pixels) -
    • Angle: change the angle of the region (in degrees, counter-clockwise) -
    -The polygon and line regions support: -
      -
    • Points: change the image points of the region (in pixels) -
    • Angle: change the angle of the region (in degrees, counter-clockwise) -
    -The text region supports: -
      -
    • Text: change the text of the region -
    • Angle: change the angle of the region (in degrees, counter-clockwise) -
    -A discussion of how JS9 implements DS9/Funtools regions syntax can be found -here. - -

    - -

    Meta Key Accelerator

    -

    -The meta key is the Command key on a Mac and the Control -key everywhere else. - -

    -Pressing the meta key disables the value/position display. -It also disables execution of plugin callbacks on -all mouse events. See Local Tasks for -more information about plugins and browser-based analysis. - -

    -When a keyboard is available, pressing the meta key while -clicking in the primary image window will pan the image so that the -mouse location is in the center of the display (this panning is -disabled inside a region.) - -

    -Within a polygon or a line, if you press meta and click the -mouse on the polygon or line border, a new point will be added at that -point. If you press the meta key and click on an existing -point, it will be deleted. - -

    -Within an annulus, if you press meta and click the mouse, the -annuli of the annulus region are replaced by an equivalent set of circles -which can be resized (or deleted) individually, but not moved. -Press meta and click the mouse again to finalize the region with the -new annuli. Press shift-meta and click the mouse to cancel -the edit and restore the original annuli. - -

    - -

    Drag and Drop Images

    -

    -You can drag and drop FITS images and binary tables, PNG images, and -JPEG images onto JS9 to display the image data. All browser-based -functions (scaling, colormap, pan, zoom, regions, WCS) should work as -expected. You can execute server-side analysis tasks on the FITS files -if the back-end server is running on your local host machine. In this -case, you probably will need to set your DataPath variable in the -Analysis menu to help JS9 locate the original data file. - -

    - -

    Resizing the JS9 Display

    -

    -The JS9 Display can be resized using the the View:resize:change -width/height menu option (or the JS9.ResizeDisplay() JavaScript -routine.) The View menu's resize parameter can be two values (width -and height) or a single value representing both. In addition, if an -image containing wcs info is being displayed, you can append a single -quote to specify a size in arc minutes (e.g., 5') or a double quote to -specify a size in arc seconds (e.g., 300".) -

    -The View:resize:set to image size option will set the display size to -the size of the current image. The View:resize:set size to full -window option will resize the JS9 display to the size of the -browser window's window.innerWidth and window.innerHeight properties, -and will scroll the display to the center of the window. (Note that -the rest of the web page is still available via scrolling, including -the menubar.) The View:resize:reset to original size option will set -the display size back to the original size. Display resize can be -turned off by setting the JS9.globalOpts.resize variable -to false in the js9prefs.js file. -

    -Also by default, the JS9 Display can be resized using a grab handle in -the lower right-hand corner of the display. This feature can be -turned off setting the JS9.globalOpts.resizeHandle variable -to false in the js9prefs.js file. -

    -See Known Issues -for a discussion of limitations imposed on resize by Webkit -browsers such as Chrome and Safari. - -

    Last updated: June 8, 2021
    -
    - - - diff --git a/web/static/js9_old/help/webpage.html b/web/static/js9_old/help/webpage.html deleted file mode 100644 index b6aa1ce..0000000 --- a/web/static/js9_old/help/webpage.html +++ /dev/null @@ -1,473 +0,0 @@ - - - - - -Creating a JS9 Web Page - - - -
    -

    Creating a JS9 Web Page

    - -

    Intro to JS9-enabled Web Pages

    -

    -A JS9-enabled web page contains JS9 header directives to load JS9 -Javascript and CSS files, and at least one HTML "div" element of class -JS9 in the body to provide a JS9 display. Other div elements can be -supplied to define additional displays, menubars, statusbars, and -various other plugins. - -

    -When a JS9-enabled web page is loaded, a routine is called to -initialize the JS9-class divs and their underlying support -routines. You can arrange to load one or more images automatically -when JS9 is fully initialized. You can even specify an image to load -as part of the web page query parameters. - -

    Adding JS9 to Your Web Page

    -

    -The sample js9basics.html file shows how to add JS9 to a web page by -assigning JS9 CSS classes to div elements. The js9multi.html web -page goes further by showing how multiple instances of JS9 can be -added using unique IDs. - -

    -To start, a few JavaScript and CSS files must be loaded into the web -page. Ordinarily this is done in the page's header, which typically -will look something like this: -

    -  <head>
    -  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    -  <meta http-equiv="X-UA-Compatible" content="IE=Edge;chrome=1" > 
    -  <meta name="viewport" content="width=device-width, initial-scale=1" >
    -  <link type="image/x-icon" rel="shortcut icon" href="./favicon.ico">
    -  <link type="text/css" rel="stylesheet" href="js9support.css">
    -  <link type="text/css" rel="stylesheet" href="js9.css">
    -  <script type="text/javascript" src="js9prefs.js"></script>
    -  <script type="text/javascript" src="js9support.min.js"></script>
    -  <script type="text/javascript" src="js9.min.js"></script>
    -  <script type="text/javascript" src="js9plugins.js"></script>
    -  </head>
    -
    -The js9prefs.js file is optional. It contains a JS9Prefs object that -holds various default settings for JS9, e.g. default colormap and -scale for image display. Feel free to edit this file to set up your -own site-specific parameters. See -JS9 Site Preferences for a -description of the available parameters. - -

    -Order is important: The js9prefs.js file must be loaded first. The -js9support.min.js must be loaded before you load js9.min.js. You must -load the plugin files after you load js9.min.js. You can simply copy -the order of files as specified in the JS9 demo files. - -

    -You can, of course, arrange to have your web server gzip the javascript -files, using browser-based capabilities to ungzip them automatically. The -JS9 web site serves pre-compressed content, as described in the - -Apache Module mod_deflate page. - -

    -The text file js9support.txt is a list of the files contained -in js9support.css, js9support.js, js9support.min,js, and js9plugins.js. - -

    -The js9support.min.js file contains a number of required third-party -software modules, including jQuery, fabric.js (2D graphics), flot (for -plotting), dhtmlwindow (for light windows), etc. It is separated from -js9.min.js to optimize file caching. Although JS9 will not run -properly without these third-party modules, you are free to load them -manually, i.e., without loading js9support.min.js itself. A manual -load is useful in cases where you want a different version of one of -the third-party modules (e.g., js9support.min.js loads jQuery 1.12.2, -but you need to utilize jQuery 1.11.3). In such a case, we still -recommend creating a single file to hold third-party modules, in order -to minimize load latency. - -

    -JS9 will run without the js9plugins.js file, but with much -restricted functionality. In particular, core plugins such as -blending, blinking, colorbar, data cube, magnifier, panner, etc. are -loaded from this file, as are analysis plugins such as encircled -energy, radial projection, region statistics, and 3D plot. Note that -the regions and mouse/touch core plugins are always loaded from within -js9.min.js itself, since they are essential to almost all JS9 -functionality. - -

    -All of these Javascript plugin files are contained in the plugins -subdirectory, so you can load them individually, e.g.: -

    -  <script type="text/javascript" src="js9prefs.js"></script>
    -  <script type="text/javascript" src="js9support.min.js"></script>
    -  <script type="text/javascript" src="js9.min.js"></script>
    -  <script type="text/javascript" src="plugins/core/menubar.js"></script>
    -  <script type="text/javascript" src="plugins/core/info.js"></script>
    -
    -will load only the menubar and info display plugins. - -

    -During startup, JS9 will asynchronously load the js9worker.js -file in order to create a worker process. It also will load either -the astroem.js file or the astroemw.js -and astroemw.wasm files, depending on whether -WebAssembly is supported on your browser. -Therefore, if you install JS9 manually (i.e., not using the standard configure, -make, make install sequence), please ensure these files are installed as well. - -

    -The main JS9 display as well as JS9 plugins are placed on a web page -by assigning JS9 classes to ordinary div elements. Important JS9 classes -include: -

      -
    • JS9: this class will display the main JS9 image window -
    • JS9Menubar: this class will display the JS9 menubar -
    • JS9Statusbar: this class will display a nice JS9 statusbar -
    -Thus, for example, to place a menubar on top of a JS9 display, use: -
    -  <div class="JS9Menubar">
    -  <div class="JS9">
    -  <div class="JS9Statusbar">
    -
    -

    -Among the many JS9 plugins that you can add to your webpage are: -

      -
    • Archives & Catalogs: access to external archives and catalogs -
    • Bin/Filter/Section: support for extracting sections from images -
    • Blending: blend images using standard composite techniques -
    • Blinking: blink two or more images -
    • Colormaps: create colormaps -
    • Console: display a console window for executing commands -
    • Contours: create contour maps -
    • Data Cube: process 3D FITS data cubes -
    • Extensions: view FITS extensions -
    • Info: display position, value, and other information as mouse moves -
    • Keyboard Actions: configure keyboard actions -
    • Magnifier: display a magnifier window centered on the mouse position -
    • Mouse/Touch: configure mouse/touch actions -
    • Panner: display a panner window of the whole image -
    • Pixel Table: display a pixel value table centered on the mouse position -
    • Preferences: configure JS9 preferences -
    -

    -Any of these can be added to a web page by specifying a div element with the -appropriate class: -

    -    <div class="JS9Menubar"></div>
    -    <div class="JS9Toolbar"></div>
    -    <div class="JS9"></div>
    -    <div style="margin-top: 2px;">
    -    <div class="JS9Colorbar"></div>
    -
    - -

    -NB: all of these plugins can also be displayed at any time as light -windows, using the appropriate View menu options. Light windows -can moved around on the page and dismissed when no longer needed. Also -note that if a plugin is declared statically in a page, it will not be -made available in the View menu. - -

    -Placement of JS9 div elements should follow standard web page rules -and constraints. This means that div elements can be placed in any -order to create different graphical views. For example, the -js9basics.html page places the menubar above the image display, in -keeping with the traditional layout of DS9. The entire JS9 construct -is placed in a data cell of a table, next to a data cell containing -data URLs. - -

    -The JS9 display has a default width and height of 512x512. You can -change this by adding data-width and data-height -attributes to the div. For example, to create a display of size 256x256, use: -

    -  <div class="JS9" data-width="256px" data-height="256px">
    -
    -The data-width and data-height attributes can be applied -to the other JS9 divs (which can be especially useful for the menubar). -Thus, for example, if you shorten the width of the Js9 display, you might -also want to shorten the width of the menubar: -
    -  <div class="JS9Menubar" data-width="256px" data-height="48px">
    -
    - -

    -Multiple instances of JS9 (including the main JS9 display element -and secondary plugins elements) can be added to a single web page. This -is done by specifying multiple sets of JS9 elements. Each main JS9 display -element should have a unique HTML id associated with it: -

    -   <div class="JS9" id="JS9"></div>
    -   <div class="JS9" id="myJS9"></div>
    -
    - -

    -To connect a JS9 plugin element to a given JS9 display element, you -can either use an HTML id that obeys certain rules, or you can -use an HTML data attribute data-js9id, as described below. - -

    -To connect a JS9 display to one or more JS9 plugins using an -HTML id attribute, the plugin ids should be specified as follows: -

      -
    • start with a unique ID name, e.g. "myJS9" that matches the main JS9 id -
    • follow with an optional dash or underscore -
    • finish with the type of JS9 plugin, e.g. "Menubar", "Panner", "Magnifier" "Info", "3dPlot", "RegionStats", etc. -
    -For example: -
    -    <div class="JS9Menubar" id="myJS9Menubar"></div>
    -    <div class="JS9" id="myJS9"></div>
    -    <div class="JS9Colorbar" id="myJS9Colorbar"></div>
    -    <div class="ImExamRegionStats" id="myJS9RegionStats"></div>
    -
    -Note that the type of plugin is the simple name of the plugin, without the class prefix, e.g., "RegionStats" instead of "ImExamRegionStats". (Esoteric note: for -non-JS9 class plugins, you can prefix the class to avoid name collisions.) - -

    -To connect a JS9 display to one or more JS9 plugins using a -HTML data attribute js9id, specify the id of the main -JS9 display element as its value: -

    -    <div class="JS9Menubar" data-js9id="myJS9"></div>
    -    <div class="JS9" id="myJS9"></div>
    -    <div style="margin-top: 2px;">
    -    <div class="JS9Colorbar" data-js9id="myJS9"></div>
    -
    -These two connection methods are equivalent. However, the js9id -data attribute method also allows you to specify the single-character -token * as a target value for many plugins. In this case, the -display associated with the plugin is dynamically selected by clicking -the mouse in a JS9 display window. In this way, a single plugin can serve -several displays. - -

    -The plugins that support dynamic selection are: -

      -
    • Blend -
    • Blink -
    • Colorbar -
    • Info -
    • Magnifier -
    • Menubar -
    • Panner -
    • Separate -
    • EncEnergy -
    • RadialProj -
    • Histogram -
    • RegionStats -
    • XProj -
    • YProj -
    • 3dPlot -
    - -

    -Note that ids are not required at all if there is only one JS9 instance on -the web page: -

    -    <div class="JS9Menubar"></div>
    -    <div class="JS9Toolbar"></div>
    -    <div class="JS9"></div>
    -    <div style="margin-top: 2px;">
    -    <div class="JS9Colorbar"></div>
    -
    -However, if your site needs to communicate with clients using -the js9 script for external communication, you can -differentiate between clients loading the same JS9-enabled web page by -supplying a unique ID when the JS9 page is served. - -

    A full example of how to define multiple instances of JS9 with ids -is found, for example, in the js9multi.html file. Two DS9 instances -are defined, having IDs of "JS9" (the default) and "myJS9". When -"myJS9" is the display ID, "myJS9Menubar" specifies the associated -menubar and "myJS9Console" specifies the associated console. - -

    -The js9.css file contains CSS directives for various parts of -JS9. These can be modified (or overwritten) as needed, subject to -ordinary CSS rules. In general, we recommend overwriting CSS rules by -loading a site-specific CSS file after the js9.css file. This makes -updating much easier. - -

    -One CSS directive worth noting is the JS9Button class, which -defines the look and feel of the buttons found on the Menubar, inside -plugins, etc. The JS9Button class currently is set to -the JS9ClassicButton class, which mimics Mac OSX buttons in -shape and color. An alternative is the JS9FlatButton class -displays a flat blue button that highlights when the mouse hovers and -darkens when clicked. A lightblue background is often used with -this class of button. JS9 also defines a JS9BorderButton which -has a blue colored border and a white background. The JS9 Menubar -supports two data properties to make it easier to change the button -and background: -

      -
    • buttonClass: the class of button to use ("JS9ClassicButton", "JS9FlatButton", "JS9BorderButton" ... or your own class) -
    • backgroundColor: color of background (default: "lightblue") -
    -The JS9 Size Demo displays different button styles. - -

    -Normally, JS9 will initialize itself automatically once the page is -loaded and ready: internally, jQuery $(document).ready() calls -JS9.init(). If you need to delay JS9 initialization (e.g., you -are using a platform that fires $(document).ready() before the -platform is really ready), you can set data-js9init to "false" -on any JS9 div. In this case, you must call the init routine manually: -

    -  JS9.init();
    -
    -Until you do this, no JS9 div elements will be visible. - -

    -When JS9 is fully loaded and ready (including connection to the JS9 -helper, if necessary), it fires the JS9:ready event. You can -use this event to perform your own initialization: -

    -  $(document).on("JS9:ready", function(){
    -      myinit();
    -  });
    -
    - -

    -

    JS9 Query Parameters

    -You can supply a url query parameter to a JS9-enabled web page -in order to load a FITS image: -
    -https://js9.si.edu/?url=https://hea-www.cfa.harvard.edu/~eric/coma.fits.gz
    -
    -Here, a remote FITS file is loaded using the -JS9.LoadProxy() routine, -(regardless of whether the remote server supports CORS.) -

    -You can append query parameters to set various image options for the -loaded image (these options are contained in the JS9.imageOpts object): -

    -https://js9.si.edu/js9/js9.html?url=https://hea-www.cfa.harvard.edu/~eric/coma.fits.gz&flip=y&rotate=90
    -
    -Here, the same remote FITS file is loaded and then flipped along the y axis and -rotated by 90 degrees. -

    -Finally, you can rename the JS9 display using the display query -parameter: -

    -https://js9.si.edu/js9/js9.html?display=other
    -
    -Here, the display name of the standard JS9 web site is renamed to -"other". This feature can be useful in cases where you are loading the -same web page multiple times and want a different JS9 id for each so that -they can be controlled separately. - -

    -

    Menubar Styles

    The default menubar has a style in which all -of the major menus are shown at the top-level of the menubar. This is -the classic style. JS9 also supports a mac style -menubar, in which the File, Edit and View menus -are placed on the left side of the menubar and the Help menu on -the right. The other main menus are displayed as sub-menus within -the View menu. The mac style can be specified in two -ways: you can set the JS9globalOpts.menubarStyle property to "mac" in -your js9prefs.js file to set the default menubar style for all menus -in the page. Alternatively you can supply a data-style="mac" -attribute to the Menubar div element: -
    -  <div class="JS9Menubar" data-style="mac">
    -
    -This will set the menubar style for this element only. - -

    -

    Supermenus: One Menubar to Rule Them All

    By default, each -menubar controls one JS9 display. You can, however, create a menubar -that controls multiple displays, so that a given menu selection is -applied to each display (or to a specifically selected image). This is -done by creating a menubar div with two special characteristics: -
      -
    • the id of the menubar starts with SUPERMENU_ (it can end with anything, or nothing) -
    • an HTML5 data attribute called data-displays lists the JS9 displays to control or "*" for all displays -
    -For example, to control two JS9 displays: -
    -  <div class="JS9Menubar" id="SUPERMENU_" data-displays="JS9,myJS9"></div>
    -
    -As shown, the data-displays attribute is a comma-separated list -of JS9 display ids to control with this super-menu. -

    -A super-menu acts like an ordinary menu, except that it will control -all of the JS9 displays in the list. Thus, you can change multiple -colormaps at once, run analysis on all displays, etc. -

    -You also can click on an individual display to make it the selected -display for the supermenu. The selected display will be -highlighted, and the supermenu will target its actions at this display -alone, rather than at all of the displays. Click again in a selected -display (or clicking in another display) to unselect it. In this way, -a single supermenu can be used to control several displays -individually (akin to how the top-level Apple menu functions with -regard to applications). -

    -A supermenu displays an additional Super menu button on the -left side of the menubar. This button contains a list of all displays -controlled by the supermenu, with the selected display starred. You -can choose a new selected display from this menu, or choose "all -displays" to unselect. -

    -Of course, you also can define a menubar for each display in order to -control them individually. Since the actions of an ordinary menu and a -super-menu can be mixed for a given JS9 display, the displays will not -always be perfectly synchronized. In such a case, the super-menu's -selected values will be tied to the first display in the -data-displays list. For example, if the first display listed -is at zoom 2 and the second is at zoom 4, the Zoom menu will show -a current zoom value of 2. - -

    -

    Adding Server-side Analysis Tasks to Your Web Page

    -

    -Server-side JS9 analysis tasks can be executed using -the Analysis menu, but they also can be executed directly from -the web page using HTML elements (buttons, forms, etc.) To do this, a -web page author simply creates the web interface and calls -either JS9.RunAnalysis() (for buttons, menus, etc.) -or JS9.SubmitAnalysis() (for forms). These are described -in the Local Tasks web page. - -

    -

    Adding Local Analysis Tasks to Your Web Page

    -

    -JS9 also supports the ability to perform local analysis, i.e., -analysis tasks defined and executed right on your web page, rather -than being executed by a back-end server. This is accomplished by -offering access to the image data and region information via -a public JS9 API. See the -Local Tasks for more information. - -

    -

    Adding JS9 Display Windows Dynamically

    -

    -JS9 display windows can be created dynamically using the JS9 Public API call -JS9.LoadWindow(). You can create a light window to hold a new -JS9 display on the same page or you can create an entirely separate -pop-up window. See the -JS9 Public API for more information. - -

    -

    Adding Data Files to a Web Page

    -

    -Data file links are added to a web page by supplying URLs that call -the JS9.Load() routine. -You also can load images automatically when the web page loads using the -JS9.Preload() routine. -See: -Adding Data Files To a Web Page for more -information. - -

    Last updated: June 6, 2022
    -
    - - - diff --git a/web/static/js9_old/help/yourdata.html b/web/static/js9_old/help/yourdata.html deleted file mode 100644 index 9f49100..0000000 --- a/web/static/js9_old/help/yourdata.html +++ /dev/null @@ -1,113 +0,0 @@ - - - - - -Displaying Your Data - - - -
    -

    Displaying Your Data With JS9

    - -

    Loading a FITS File From Your Web Page

    -

    -Once you have your web page set up, you can make your FITS data files -available on your JS9 web page by creating URLs that call -the JS9.Load() routine: -

    -    href='javascript:JS9.Load(filename, opts);'
    -
    -where opts can be: -
      -
    • filename is the path relative to the current web page location -
    • imageOpts: an object containing params to be merged with the -default JS9.imageOpts object -
    -

    -For example: -

    -    href='javascript:JS9.Load("fits/casa.fits");'
    -
    -Clicking on this URL will load the casa.fits file (here, stored in the -fits directory directly beneath the web page location). If the JS9 -server-side helper is running, it will be alerted about this new file -so that it can run analysis, etc. - -

    -As of version 1.3, the cfitsio library is used to process FITS files -in JS9. (Technical note: we used emscripten to compile cfitsio to -JavaScript, and then added thin C and JavaScript layers to provide an -interface to J9.) Thus, you can utilize the cfitsio extended file -name syntax to tailor the image data being displayed. For example: -

    -    href='javascript:JS9.Load("fits/snr.fits[events][pi==pha]");'
    -
    -will display display all photons in the EVENTS binary table having the -same pi and pha values. Cfitsio also supports display of arbitrary -image extensions, gzip'ed files, tile compressed files, image -sections, etc. See the - -cfitsio documentation for more information. - -

    -Note to users who are upgrading to version 1.3: to use cfitsio, simply -remove the load of fitsy.js (or fitsy.min.js) from your web page. - -

    -To override default image parameters, specify imgOpts parameters as the second argument: -

    -    href='javascript:JS9.Load("fits/m13.fits", {scale:"linear", colormap:"sls"});'
    -
    -

    -To load an image into a specified display, pass the display id in an object as -the last argument in the call. This can be the second or third argument, -depending whether the image object also is passed: -

    -    # the display object can be passed as the second argument ...
    -    href='javascript:JS9.Load("fits/casa.fits", {display: "myJS9"});'
    -    # but when image opts is also passed, it's the third argument  
    -    href='javascript:JS9.Load("fits/3c273.fits", {scale: "linear"}, {display: "myJS9"});'
    -
    - -

    -Web browsers do not support allocation of unlimited memory, regardless -of the amount available on the given host. It seems that 1Gb is a -limit often encountered; trying to allocate more memory can result in -browser hangs (e.g., the Mac spinning wheel being displayed -indefinitely.) To minimize these problems, JS9 enforces an image size limit -using the JS9.globalOpts.maxFITSMemory property. Its default value is -450000000, which supports images of size 10600 x 10600 x 4-bytes. -You can change this value in the js9Prefs.json file, or, once JS9 is -initialized, reset it via the JS9.fits.maxFITSMemory(bytes) routine. - -

    -Memory usage and availability is a fast-moving part of browser -technology and we will revise the JS9 limit as warranted. Keep in -mind that, in all cases, using a huge amount of memory to display data -will result in poor responsiveness. - -

    Pre-Loading a File From Your Web Page

    -

    -You can pre-load one or more data files into JS9 when the web page -itself is loaded by adding the JS9.Preload() routine to -the onload event in your web page body element: -

    -<body onload="JS9.Preload('fits/casa.fits', 
    -		          'fits/snr.fits[events][pi==pha]', {colormap:'heat'},
    -		          'fits/3c58.fits',
    -		          'fits/m13.fits', {scale:'linear', colormap:'sls'},
    -		          'fits/3c273.fits',
    -		          'fits/ngc1316.fits', {scale:'linear'},
    -		          'fits/ngkper.fits', {colormap:'grey'});">
    -
    -Note that this routine takes a list of images, each of which -optionally can have an associated imgOpts argument. The display -opts can be passed as the final argument and will apply to all images. - -
    Last updated: June 1, 2016
    -
    - - - diff --git a/web/static/js9_old/images/4arrow.png b/web/static/js9_old/images/4arrow.png deleted file mode 100644 index 36b875ad531cf0a6b9f9792b856ccd9d83f6797b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmZ{hdrVVz6vuy{2JB>DG9zD$ZZ!W#F@#rn@{BM0tJw91q`Q>!_>N-3%?H=iE&WUH%C0}q$ zZE^J23b>FZAFu-F#MT*z%jOW}t$#|JrvL|(#7mDvwWE8RCV>T@%-+9%1t5X>VQSCZ zG7eaN1vdc)EZ^)afZJHuv#n(spl*uh*FK#BD4<<)yCFKu8{H3gFmzYeCY^eW6v(kx{lpDF^m}Z z7#euVv@F*C$6hu_tHEkBkfgz8D~FBETK?2Z+F)8w+aK7$1za!Z?NVE)wT#E!9^mI6 zxP#O0^^+E?9S+4rMHrhh&5LkYjE)GCd-r?X{9O?i?~Q(4$khkDsuv9&++y3&t~oh$ z{O!tf^?lEAQT^gOrf(h@94|^|yJgo)`jt+Dw`WGWgBuo1yG|S(Fa3Px0DeD&>FhA@ zbL)nI(z8#-gFlm%zaBUyl@=R~X;js%pt^mupt?yI>K7*tY?M(cQ@fs>tjH=kzhGXs z$>&*+L-^eB61Ot(rs9rX@AcKQ6~(r~z<13xKL(g*%Lhjf^k%cKd4(`c8>DSwg}m7_ z=F4_-Z6xDzlA<-(@7#mGlUdVz#+|aq1IiYO)-s=W|JdEfhX=Pu3oLK!zxrm8|Kz;W zjs7p5R{hX2Z5cT;yy!Hvlhc`8&zHhy*g{9{qtleMno{MeVL?1DL9)0(EG{W0gcKp7 zxWo=FMDD#Pw_jc;(CO2(=_Y#t!Q%2+gh<1bUI&|t47f} zrA94LYP6~>rhqMCi&#QtJRx8n5eXE6ASRdrn#baam>D!}pg5fT{Cu|7UIY`0*!o<} z{_~0=F!r_^%QK9+LlhOER~dEc9Gaq}Ak9O>MSPV58m|?aB{W6tQEN3BG$I84mk#Pd z;`x8cTiP@_0~8aeVH6ZTD-;r~PEDH(YP8f7$B?55X-|s%4@n{i6(UG3Ur6$Tc-&z! zMF5iZD|`~P1!^P|65-(=m<@H1OkI&oltrU-ZMGU-pOc~2sX6JifkW_lT#j0qXVR+l tIc!zV3wu>s4oj=kuvg}xHx8fR@sAzXo54r#V diff --git a/web/static/js9_old/images/checkmark.svg b/web/static/js9_old/images/checkmark.svg deleted file mode 100644 index bece135..0000000 --- a/web/static/js9_old/images/checkmark.svg +++ /dev/null @@ -1 +0,0 @@ -checkmark \ No newline at end of file diff --git a/web/static/js9_old/images/close.gif b/web/static/js9_old/images/close.gif deleted file mode 100644 index af01282c7dfc1b684acabe48d47f923c26d792ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmZ?wbhEHb6kyempty \ No newline at end of file diff --git a/web/static/js9_old/images/gears.png b/web/static/js9_old/images/gears.png deleted file mode 100644 index 39c48795d973de9ba4c964bb7f0d375d08386719..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 860 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VV{wqX6T`Z5GB1G~&H|6fVg?3o zVGw3ym^DWNs30;kB%&n3*T*V3KUXg?B|j-uuOhbqsG5Pnrosxy%uOvxRH(?!$t$+1 zuvG%9umZ9{!um=IU?nBlwn`Dc0SeCfMX3s=dM0`XN_Jcd3JNwwDQQ+gE^bimK%T8q zMoCG5mA-y?dAVM>v0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`tKo-FP#GNIXX$YJ0ilN>DdQcxEqi?8Zpbs}2sMQ7}YUN*) znF_QSWWJrD4Ok_L7}OpceURlyj)C|TEDH3h9hZ$hJlO2Gd=9Bc0t0!Dr;B5Vh2Y)E zd$rvYMUL0stBYgz+L+)lC5SCGXvP#H?b)q=nEx?Et}&8Y<7S*{II)$-j7!qR<6iB) z@0QEwz1y32^4XQ=me1!E&-*;*`O|4$j#>e!D-7=n-#K~X*bTl@D_gTPL{yI%ojNYA z<6s{H$Pc#z9BTX+-*yfL?c_bRv~v)ujCiz9XtsyGVJb5yf)in z%dT@izeHmG%z0L*AtvuSUo~}`t?vVwn$_9UBKp@EMW25mT=S6kjav85Mc*W^hBVAqB$-6e5*Ll}{F4AUm>`!*b_iyEDn!a$pITZY) z-lSSq_hMP`_BGe6A8X{cXBwdY}A+rONSh_JVjxxk;q$+6SfA^8LV00930EC2ui01N;)000Eh@X1N5y*NL&yXD{%ZlF_| zXsWKP)4Xsj&vXqlFP=9{@BhG{Z^0lMeTw2@$!t2G(4~T@m{z6Es`i>#R1*rY7EBJC z6JoM@9Y(v~a5o}8hu7zbyk4Kk_xF5&f(L(k1b_#Gdxv=h34{cPkqDELl8ua$l#!gB zo}Zrupacb?q@ty$sjIA|2C1*51O~LVwFS1hx&{Ngw7t9o!o9=A#=`=_$pgvF%+Jiu q%>vZa(bd@5+5!RF+TGmU0psN5;pOP*>f-?I0qy|o?ep~W5db?MN{!(F diff --git a/web/static/js9_old/images/indentbg2.gif b/web/static/js9_old/images/indentbg2.gif deleted file mode 100644 index 5c81d84206bbac2f92113424fc6feeed8b1f4656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 300 zcmV+{0n`3RNk%w1VGIB`0D}MkA1p8Sh_JVjxxk;q$+6SfA^8LV00930EC2ui01N;)000Ep5Xebq0Qbs}x&L4&a)MV1 zXi%yv>b`I+$HQ9>H+t^^j`zNxaA+9%ibx#NP%I3bOlCo9m=>(nt9HxnY6)8~0el^g z3+A+XZ9Wj(Y4>4HuiNi*#6i#B>-`9UfPsXChKGg;2#Shn5{&ylgt*;hhijSZjV2)cl$dy||4x=HLv8 z%e-^TW|UPOkT!RU@?v-+rK=j3$Z<_fDlKXG<$Qzkst1plzhBhXt~mX&-ht7TF-kii rJ5V8eZD{sdhMH diff --git a/web/static/js9_old/images/indentbg_grey.png b/web/static/js9_old/images/indentbg_grey.png deleted file mode 100644 index a8723f17d774f45cd758cf2df2e36112d339499d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmV-`0e}99P)1Zzoj1^QV`^d4#lPg&sfg596JXGM58>^+7DirwA;-PV? zeP!Z`sC%kz4VVy(wnUqD;n^3w?|WBW14GdoFd+9X-gHTo==Ff?T?rwPjxI47t8_F` z2|*fYvt=KjtV{ao*p{Pdo!!Z;7k#tG9rb#5iSg`qJ$>IxJQy5*Hns7|pCOaUP$fV{ ea*4=Qs`Uq=1dGivg&_?Blobxk>oQg`3+vTr2 zj6ZaZ^(g0$>|K`EPE2gkflAfk)^$sI4m`MS$I!l-;|0wd3@0;}b(@}ld1Myb!AN*`wku7Q(3bQr`3m z%8xdbUOHdA<6x^IxA^1juUDRIEWh+)aa&iNyk(odI=}C@O7rXJ!IoXe&khU>4xDP+ z*KvT5fz1`iTl$PWeTPnzv*!t!>1e4f-{0B3_h@5z&0Z(M&1?tT+|bsPx8DYY9mIZS z4_jJXdgL5&WRS_&mHpb+Utb#|lo-z4lWP~hx(b%z7c(8i*8i`3pS5GH(Sde zUh(FuC2_g!w=>9;eJd0%a34&MUbbb$emUWFWo!!-+2pb zd6NI~|E+nOnu5tsY$PsrdoKO4jd(*z$W3eQ_N=Ue##48oe2zTg3w`;z=KhHIkVhX1 zjf-DX{S~p>HxYju`Q=Lv`{N6o1m(s!Y4T(HIEvfEzL5mlh;dO2H}U+BqR5V>$h5Gx z$%8YOe@$%JB-lnyB*&zQVq3}L_)CMc6JGu8xA~HYv@^t>NkZ+Ud+xU7k-`)Uc~N5f zb#4yiDj{lhrsNx9my@Lqa&=Mc%HMP2=UyV^PmDp)_JbLPg*QMBOg>#LT&dWD#tFC$PPXpNoN?vSqImo2TAtdGmd zq^_vch}AGVe?Z1IIDT`YM9JwO*O$-!j*yaAnJixZr`<;Cc9J#EJa&v!uC60jtKN80 z#7S%?L>?Ryl_JTzVIv#M%D*7T*BBrBYI%3pW1^VI_~24PK3}fw{C3P?A0v6iz0x8h zDUp*evxsf<+Ya{8VnV)ryy)Opw+XP@wv}u!<=nUS)^neWw~^bo&hE`$T0%%>NPKt{ zZ~5-EB)hEO5cy+qf8THaYO#IJOOA{UE+?ckE_L3jwJo<_cyrO$z4J4l+x+dL+uj%@ zw?2uNNfUrzU)WoBC~0mV`G%0odj=fja{KRpz;8SqnUsuQ{d)hU!JURn`wcL#4p%%V zcWkheqUSB-@@vc9rwk~`ijGZAT5^M0V7tu@!wVmj7R`>515J=Aa%L`HB%EU+*V!9% zA<)0;8abAj_`qZ0AMgu1`8-AzSwK$8UM8bII>?^iNZWlT@@0%LR0js*iEE3ZU;ORM z_}G4OWj!H_nuzDA_&HmzKNM@Q7gZr;_h!J zzi0FIFG`ihDY6q&U;b{3R1KfH33`JamA@Px7qaw$koefg_xyrA=8fyvo#9S9gVer+%06xs+jRVuXVu3nw;@ByV>S#K@N-|-7^KpP$8 zD^^*oV-H%(+3rp?TWc^B7b{AxP;!Ji$R)O=N~zNv8>rSBdo@j#{$^HHyR!rf%IVj) zDwNfI&8((-U~i?>u+!LoM5$@*tyJu^Wst=V(w?tZwG4HX9_jCGw-~!k=8E#pp`EJY zLL(UEAU~+9N?G->q28lrli6f4n|t;chYqtky{6xZ-a5M}Z(#Z2h5GZ^k8T?3-dkI#(<(0#ax9-!Y4y#$ zeHY%#$b9Wa*^|`^_B>GBRiU=99hs*XH=`xy3eHYfQuS{82eR0FPI$^t^K6IVm6O_wDxk{TjEtcOJAP*!ANi4@k6b}c;HyRTB*|3v_AdQdl?^< zkDit_RGnD8eRzjfqhj;n-mD63adpE1^TW%mcF-l!3R$oO@^JUUa$O$kV}R2 zrh&o!L6c_x!0=&31Aef*CQHA$Ql-{lg9~q0b|2q=wENJ}bNxnR|G8oOIAd+8J~q%( zTh>a6-?NitHJb81BPee)U@u0KxlgZZGxhHWg&pK)R<3(W-8tCT)@Q~e7L(~n@8A(u zU0Po9hm(6p6vfKcp(FYlE9LB=zW#$HM~8N)^!a9djX$?4i)#8BS+=vkuhC>KJ2-fP zRkuJkny8(JM5>#B>+S(_gWlAusUJM7)+uXtmj3S4LkIart<;y9yDM2uSEsUSV2?^y zTv&RYiY%o0r<(jKYn4i`f;1N!J6TO(<8M^Zp#gV}Yxfsxiq&n+8g0$VoyA6&Y3L!< z7{d+~G)9+Sq-q$vg)QcdE0^ucX~W5rhI7}UhmP(4R=sgGgmSw&sCJI);pL&8qyM)a z{@hrp&u2gTk}c4(hpE*5rHAT=0ymV_Jo{>`rep)Rq!+FLdT1w?%L{e2(E*xT(W2U- zx{oL3sp_1Yf*y`&^cuEmA(K}%GqIxl)9Kzyownri-+HKiVPg$jGMo8Q?demx+Ld{+ zyn4gxiof;nW~n~Q?}f^enasmEjORPk7;$~+ioh+J9nixh2RWkAS3SpY3WSXB0>*6? z!)(e+VBW0O78;zKyr#_9US5{U_z4&nIU{vp{GXi6$f{VirVOmMlcogsiOPxDs9zF_-e7A7pr~XXxdPILYOn@sR69&&&I4isfQt++1r1lF0fnKh; zjIWCueb+Cu^cN^#fu^Y9)hVu97+>!t>$26Qg;eV_wKXN|D?yA4eVSRgQBz%8qlUU2 z`go;q)@9s+ zZLOLrQ+`>|hWGE8vW4++nfg{mk-88X^sRo~WV#!-O~BdPh4IX)DbYi7?v?~5E}9!U zPe6Agb!AqqPhx^T`?8c0V&{|fRi&j{r!j7>vE8bI&JaR z3Bg(ArC|y6a^}%0R;#V}`7f3Eu|l2UnO&`{l`N`LdL`Fs3U@$woGNqs1k1@S*3>@t zT6NiHfsdB{qcS%RXfy@vXY1L5()xoCh5uJ&kU3D5p&F9o{JD|5?F_Bm|La5R|MJY@ zf7|~rr@)#wXlm)tY$uFEZex&wyW4FxyQ74-*z6g^!{PV?J~)F$y;|gv@D;yyD%Y-j z1*t{_GmDZ6gsd z>GdfIB2nn;guI?8Nd0LrLBQjS;;rP7l-PTEh;0jrLUNNC!xi%QT-g;;5yM$buE|n` z{Fxic*pqW4bCY%u+h!8uaM-hBlEpk8KQ-+NIh2_AJ|WK}aZ)Pmis+3a`IAR+yJsKM;CwGZ9`YIvaALC!& z3OLcL&LaPnCOrT*kxddDE9Xe~{A4Tnvmj~(ocGV~A;rIP8Y$z}AaT`QvOiYH6Gv|( zNS6F;WM^bje2O@6`KXNyuRH}8cM~l0LD5Y1?6-vcwrH+^#}g#?)70H(Y+=gFZ`>0r zjaFgdUr-RDbr%|V{j|%D?PVlL1$@3ZA%iB~UdVu7h4Z+X5tYh6L&lKQL?Np^Ix8-2 z4u>1^k4?&tM7Q zWWVcNIxklAE&ZGoBjWJ|$Vf-Ws0;rF`@X%KJ&1q~1v31^!(-p}?S3^*9J7zu?Btbr zA&)2I&ZlV#USIVb`GKGGXcXr%x$;=z+)6^O7q1W{$0Z6yF$KW>?vfO-keih7d|2fA z@0~9^L*7^du!2?Ose3N9_!-Gtk>OE^sY0PN;X}M|bADuG6z}2p%DT?qq?OTC&yuAt zf_;{@n_&o*mcK=AUOCRby*M>0D&$4V;0NEYHe5l35a2-F0Z;Flkn&;EFXY!SgiH@D zC5RBcY?ph>UVI-9|FYx_b?4WAW>em;dY+Jr*$)Oy-AP`Z-MZdwC4F?m9~aw;R=tNu zop>bQzoxL```cfc@c0X)1HrrP?HD`RHh;rQuaKYn_ilgbo;i`xp)cY2u}82`5ho#X z=1ev(jgZIQA~Q?DgM*=eC@v9_RzuEwI4fdy3ST5m_}5>AwebbIQ`Cp3|~ zDXJq+>OF|Bc0>J~tW8{~& z=C4AcJ~m3)DR)G%;FJwzpX7QxLu_|J9TY46`Y9)o_FwSn4#^D@iMZVFD5tL^y+cO7 z|A9(d_bI$AM>)Wb0tS^d$0*S)t+p8Zw%DFJvng4V+kCPN1opc^bKoyi)N-v0V-&{^?9vJ-HDrfE1?e3~% zk(@t88e0aM-7JMN<3X5K;?@5Lev=a`iM{9Lr)RxSnKZ*jc0p=+!h~mmp=sgcD8tCX z(py;c_>+Klb4ijoC1Fmgv*s4$AgdBVmDE$@kKDO4>mf@+HwgLh-BA>Y7sYGtki+o; zzBFbFv1L(Xb2+R)SsjF2M!TlF_XAC>~_c`{ACGohw@UtIqpQalkNBxPLMu?ze=eQqfXU+=PvyR zK53o8;r-_~hJ%gu)z$UQN31`NLRztEFyz@bvQMv4C{&8-iXtWcuI;)^zf=%UNa2~L z-EGwxx!z5+rIT_AS`&5$7`@n&O`R!)kSd#Z;x%X!cqx-B?hsR-i=zcj_R=3inkibvmuO z(quWVWp`UGjmqNAexr2<3z)U7g{Nqi6Yn6_LQS=yS)wP5qr!$1O&4 zpHXg_g3_0MPaAweC9gPxNsgTeZ5ju7pKF1}GXjX?ZNmG|Ak(-(oTJ?_xnd zcYV=eT85k9Ag8O%1D3vBDvj=>#b~l@Hbr2I{YQ#er109Jh884&)F>XF@C&tdz|ep8r1cDz=r?s8Jygr;i$>`4Z76|gQ3dI=V*h;? zA71j!q1n+3LK6-SA6pO^vmxh{v3F0EPR+7fy`mS!ZLCJEhbX9(Y~u;%3lCj;D((EK z{-nh}E)pEbpHV$nt5Tvsrqk(*4q>-<%9SdWw!C3a$BDl2=dY$ea_RJUySDcPHl4Y& zc*TXD?jyVF%d{%CuochWs;J+0w8vz%S}fRM--e41FTSksh<#yO-=*V$4c~sBmOg?_ zTP>#Uj=hzz^yJUVn%##{2gDnuf#KeZ4==qiviEJNkLQ+eACKDpn(KpSjQGynccQ(m zoIdYFNK;zZdbrE9x7IN7@WbbHhVy64D`%Q7tmVJ{*b^5{cDA?Fl%Psj*hU=7iLH(W z3$(0CsW|*T_q!kOTmDr*&JWhBHNIW{GG6_KlRa{Dhf)bC&=nW8|4mZRtGIUmsq%?m zW_WD<{sYfXHR}Ubd?yk#KAvbs4Y5O)p^eik`e2F3NrhhBc;tAGrQbN1%S-)o&@i0C zPnK@5^q*YLUvg+jZd^KmiY>S_&an$cn*II#R9>Xb4tV?+PXngR}ZLQ={RaK^vO*@eFl&g;?Za9Gq;uP?X?RO3K-$DkX|BC~9 z^_WJ>HussWUDYUlXCM}Yk&tUA>Dj$dGUM)EsF*L+w4+9=!P>;?*piy+f`jx?Uk5oe zF1*!H-=ig!sE3;6CO@MAx^krQM8C;Urq*eoZ_a{?YqJs>8hK*C(4RJ8ne+{t=6m6t%eF#^CLBQu#6`Zd&*Th9oyD#>_4ni z?Y3GQRr+pAUkQW()$vvZ0)addc(ec?H7K&1nprJd=d`oO`cG&wv>wH5(P`q?O8mPN z8a@504vbTmnR@i7bq<`s6MB|K46zlhWpY+mq^TJ=r~*N~HRvSh*c}6=N_c|8Dl~4k zQ_u11UWL-Qd)#9j-4ESX?-?}I7O|bT30w<25BX|m6~6z+^RSgIt%qR{;h2J84;VU1&pjWy62C&LPg1 zt;B6#VYyna4biDWnEBgI55>>@ohMAUEEn=95>gJ+H|75kYtYlg6wi4BU zI8b%%Du%PEqT+SN4G)AcjPL{eD^jPa&WLB;sY0dO=|CG5T8*Z3E;H@#w65Ueck0K6uU6fS$QPG_!j6jFhs1g zcQt*qnO*;hqC#1<5-57}a-0v&dej53UoTf_v~Z03|8k!fU-w~Ld|#{5Y2)!NO5lvk zMkWg7YFS-*MTt&Z|Itg3Q0hS&=RYh&IeT$Y!^VlIf^WuCE=*wlhS%3_RH@eaE`z$@ zzZ;s8+UhkP*v_)N#~4(t!=$qT(=#O4b#hh{6-_dtgxjiHPERF#aCXXG&JC+g4grtAl4D zf9gJ3#t)uY%y_#@nk9PbqZa(`cJaEWWs%ce^{AM8MbBTgj{edKrnKPG=hMS|-3ysn zu0cunto}k#4mi8 z@wcjvnMq+Yr?@b#(iFyJ3q66dYU?t8#%0ob)wOIr(j^2Y>EXE=_2!S)55fF<(9fn^yYysEwMJW9UQrrN1;sTRIAt(iSdd?$ty=Bl%0y(M2b4j) z>9!FWswy7`i>I%|YMD*}bQ7a_z`Rnas#JWQtL>!EVtJ=)QI}jsOI4-i&jxQQQUC2%P8O`*T&-p+p9REpb@d8{d9#uYXZ+zFVa_(Z!k(p;CB#7v z6_u$q`h0I@$}5$cvUSXa?2?kXOky#@Tn|mDYKWi{9*O>bp+;N&DdYJmtWfbb&p@@N zavq)nkM*qTAMc_l&tUGWRl&QIgeFz874I<zwZseHx!7$2XYnUMmCSe%xSzdCN7NGwSR3-R|2;y$hJy^5#MGBnX+ zEND=O88tZk3Z??7lASkmn)LU($e^e(LRCPS1bRNqdxEGMau^5 zAab$v(Yc{9Qi)V7$mGg-lLV==e$WP_ae2HNFvxzrBG@CQp;U~!Dd2zWMX=Lev*~|mgD6HEYooFkeg>-0Dz&&4XUcWqH zTC$kCk>|;kL@goTCC(LW;!Wp@VuX&HYiG>7rv@b#dk4xgb_Y4Qc$x&KljOwx2W?7( zl)fYL-b!vs62+T&UL2`!6CrQT;s%Eo+(tvI9Zd;4x%k?w1Zmo`g3AQO5c11&zA|n$ zZxUDP+eXMc{!;EHo;Ozfy^Fq^k zV9+$KI9`C>GqT5DC5a;7Aq?G1#_Z(d5E;In%1H~QU0oZg3`pZ-@FsHRC53E-2<{{k z(FNS&AD4#hh6?7!oTo4xuiMf1^%(o73fbNnQF(pJ=;*8uo1f5pE z`Drdku#q>B%UkHP;1aP{L9%TmcUsO*rMxMxEa&||Y?WlnC@Bm|dg|Ic-g9IicdR&8hE_HOHxQ2g zvM?zXjHVx3{A3&+PvZUdFAx?q+;E^XHCdPqHi~4C;nh8Jf>vS&oV@k6r&{}Sc zP~wkPJ(AQ3AnSU6DjGAmLh;N*?I`&mI6Wmj@FQX?A->Rx_&GpA8YhEk+A9ncO1N17 zE%V+?#sJzz)c*5Q(|lRF&?Gx~Gw{BUH=&zZ#KT6|U>Wq&m&;A#dOeSNta%nl#+3zD zlQBIG9T3Mep_FJGX+Sn~{^u_uqh&lOsJkGj?=QSB#Lp3@Mxw2r0Tm`W0esFiV$UKI zY@|P6t^kJApCd{OPC&KEW_vIUz_^0BQFvTOm(L4G$F`=5eS65LgBXPV5;641T@Z-l zJ9OsBPF|WhKY{lff%|}RH%A95$rym6oV6&93db~VTB7foOE?BVw!y$dS~$|!^xuhH zL&0~3ih*nZR~&o)pTsssZs&T%%;Q6OoC{=#jSKPM1CJ`w1d9^ z30zU42vc)P;%*~@p~76AALRK7rvL+KqtJ)HFz|gcmQ9)VnLBh5VC|$7T|9d5gg73K z6YIMvh|F5qvZ!W)oB#)_Qs`E00^n~NPt{nZ5HcCga%@Czqd zR-jgsLtO6Q&{F_Ld4joOQK;-NoR(9o#ukT5;X>U7kvLJHpu1}DoX6SB^WbwMQAVPI zi^B^~g#1W!1vQJwb_#0JFdsCzNM5E}AwOt9!UFw3NPT#D!LxA5G>fgSX~ zfY%r`BRpxkNGOz~i+NBU4^FyI5oPT}fIGjSh1hcdr~rKp@@tg$`s+9wGOoibBP1|) z9vm6wP;kV}8_oa4@$~)#&RFc9*RTi;+R=V77yw$I{uv4SxKNj*8$fH$bCo zx~U7!O(FgWeJz_x|5l3a-A7_(t;LG;3=1(l6d(~mQ@GT!k5c;B=|KfhikhQmXHpzI zIcYNvjd&d=HoR{meSQ%;K{cBkq2P2fy4Ig3hPI316R(Vu1g8fb=x$9IBPD@S4qwj8 zfO1aerl!T+fA>E;NyX`_7~yc zjhf>Z91sxbKO;CIE=iJ}nw&5_8K)2LE@i;#Jn9CTBfdFb@Y>>Kxx?TU1v5r|cqb}Y zAeE*jeoySXNCc*3r-a@2X0@riw{P=1%Vgm`K2cGEZ9hQyMp9m$lJ(9>(ry1~2nz?RJd(vBK#^LoM_)5lqje_&KmrFfh|9$=GH*2PpskgCSse8lUJ9P(;$v3^#>jBzKzs-OAz9D2$SRC8T3@Qfhcg>2vAve1_A6D}2kCe#YS+CxQ{sgv< z{2>d7I44c$!Lli%zn(p5RK6#hmLj3*3>N`sltVYQ2CjB9ph|;30G+l{f0i-PH-{QG zH^=VO37L$CTjDkhlw{HXz<#P~bHT2&AZZrPY*M@X`~LMSlOqB{Lj4ow(IDAFm^Aw` zWdZt`x9882aA6cAQviDmLgzC^K4O@4@Ewqd=g{e3JiO#+R57!TL_RK8dwNfW{QxJ!cD=+GxD$5lkXfIo>Z3Vi|xE5V9fk~T&@W|+^g zgpGW_xVpd6ZaRIU{yFq`LhuNF-QkU8Cr@>CVS-QMBYsCtt_%r@lcq}q(0!)|@dkro zkq}3PNVr>JwYidrIL%E=_c%B3DeMU`crg?9QmoN!-{HqFufU3tn~7+L6q^R>(d3DO zF2cHf5txuRPr^y%@Z@}OAMR;AMIZ98$4>&%dvQ5ju}r!!!8735w$si-ZqRX%39En? z4D%6@+k9Za#)yVt5`ROElEX0buj4?PKY5;E5Sx+9%iMh;;}Uu4X)-=175<5v7Wg4$ z0#;$Y(%@d?TpvD;L8eJ#f&=|x1xvD8PNV;rO+ANmDG>S@hH0l!0fu{SdNb2{3AvWU zOfr&DyB%p!7!!aKd^f*4-TdCYb7y)5&g4ncBtkv_XM#S`u=@cH{=r6y;Rty6wHHq! zlkrpHgS`DY&#tc-ys_m!7PCLhFng&1pZduIPYe<==)pWVN)OFK{FX2tdnq0>Y}dP$ z|5_Rr;2V~hB1)Hu0CXZ0A|f5ht8*#c3>iltmP@Ay!-E5&Qq$Me_5Mob);?y#=yBlR zRCJIR7-l(j==eQ;BB-*FeP~KkA)jU=>lo%k1bVb)fbRlEM>_N`N@j-yhQ^7dGO>^+ z37e1M-7Fd`SNPp8Brn>7IqCt0hEEuQD{w*0}q==cwJYgOMBB(6TJ=sYE z!>pyTBNoPL&(Q5bJ;x8Rd*8j>vf;&f;WK7LCvg`f+~eHcR2%tnlK-@D{tNoUBX{XJ zJlhzegM8xm&#rzGFdmF+!aJ3w8{@GJB%zmKR?!`Lj*-O-^9Zs7YS`$@FwHlHc5i)X zPJr*k1y~~!R?AKvSXy}O60mW%fi`er{}w&y#fXHqB4O9sTQpyo!pBn>=UHc3m~u*)&*+tot?w_HBOn)K& z!1uWD0H=6QR5!r%Q+N9T<6L8~wr+&V*Gx({vVmb}k-#=e?w)JjoPYRt!ZHl9j!fe9 z=lQZvpX7!3_#~w8(_|8U#<=dv(93qF2Nm8jn57JEJWnW=$wbk?elruLtI9jhLH}Lo z!8>f|O@`TkU3|tc?~>7M;yFr=F-$TbY$QQrI{2>zsd0Y(p@~w!p(Y$o z2o(ez5Op!VJE8@2FV+#WSGZbz_ZA7%xg1@ zZm*UBaw-xSAE<#y?<>`fOH{hQ5>2Dz{EBQK@iM>k6e23IB%$Lrz5+exf zqhlngTb(Wgzx&7I<-ice^8^Sk(^JAik~F{Jz0WEBR7E>HnF*&sJE~Azc)SdHytx-6 zl*K4k+|MuvuuD7np34MZq|QrjhaVkW5Rsm`1q-FmD03!Uf4S}~-a{M#LRtP?PNa`- z!iqL%AjH}@k?~mj?dbQ7VJ^(0kU-?r-V77AW%v%ceRlsxz6>+(Hnv*CFf)+~;C=*# zkyDpPGm&feN61h&^5FA>@SQUPc_UZ~mQ6*jAL<_znVj&*=K6DTk~p4$y$b#Hp5^b3 zqc{kHDZ>u>LBhReM$Giau?$A`6+Lh>WhqXwq&&~Xp@nA<5F(cUby2L8vPd*1>F2*9 zom{{1f}23<7xr99-|644LdFq)IYVgjM}{xJ;Sc8|B^q+lb5BpqW&+&itAC>lBP4r| zE{NFSV>oFnVk18!CkkmqCz>t5Gl)-ZzqUp z$`r!HV(7*g%nfE&;6xDZIj}ZDK8*K|L4uK6WW!V;Mx$85RDXd29t~^$ibUzTgvGHE z)SP@;;M@@!Q!_~I7o4Um{+VfWb%s)MyF2x5K<}?G7a`r~L&&jE#Y2vUusD}S)t>}Q zIFgWU@Sp|MO3{cNneeaIDRIYWpoXX}R3J)4j?3lGrO|gTz2#%SzeE)E2n~^-#MH3D zy}>fTK$1Jx8Y#_8$!l`E=tK?8{1GmNa?>)o6F9>Cr=o_(Ns;;E3_psWG#4Dp zuz4czCRg7@rDG@Z8Is`<9DeWTXDJLCP>?+dGsP18Cyj{;t00)6@U@e7BT~djK@l*H zG*s7C^j@N3`7Imw7O^)%>B;SRbJJo&!`Ff{0D^$&%(CF%kdRQH$JVF*N?}AI-3p6b zfv-pFmW6x!`uGONJ-F(V2BUG;d&^QLOW{yd9)&M_kpRO!M(oj9)TvojC5W?^sE3sB!dBAoM5O+Gj%zi1;|o)X@WrMFrIV{ zyJgT=_(~kcB`|=1A`O#A$QxesWP%LNbiN2yPXt>byLZ-GWUPe_l3e2_3sGB6i<^BI zHUTgu+sDRkliwbm3*WtkX1k|dUPhXi#ziquPP2BdC{~7DfW{76DI9tZnFU&+o=aCH55n?xHR-3we{(h9I4>;GDjam7IF<`@GMwJ_%I|3Xft#W8vsJ=kYCZFk|;6xC+an(fJ*y#ff7M9a&c%Q zoreUtF(d(gFQS5mM^LKSjXDQSB+~-l1{#H+m5saxtev?n>ME#|O#`W}eh`!_6URIW zI|AhXyalZQV-UuoyoFF>mN+t6i}Ud?zd&&n%mUsQB+dDn*o)|IF3zO&^#BxnFfjvT zgsAZVCqybrl}=O9x)dI1gP(WSWR(*kiCJ`@;bwa5e7^s(k-uts=VQ45;=!5chgz13 zBCs9R_iSDuSCEnjrqai*z3V?44IV)f-&x|tGdak(oe9EI0kr6ziQ`swvLZ~vl|@7; zoh4D!s}T3lA|#5ih?7*b*l~Md0xft3a3vw&G)1~*E-LLD9w$98pF)KFvvWSDLICOh zQ_Kz8On>W7bux{^m2$kFf{mc=b$OHo!HoxB91O8n!x$6eEKwG)mPS5JRfUYK2uPys z60Rr-m-v7Ph+Yko?gg2g#qjSEQd3fHI58h1U(&`3SCAeVsRdGFR#yiU|va+i$O#0I1Zp|{XGZ_J27@`2L}fr6`4Mo!30zi$A~;I z4UbOaNV$PB1F_#B#i)MMN}X)xBJd28w0QZYP#Pt2W&Rq#|8DstUOLJMZX8+kgL0}^ zW2D|EEwtNN9Y^94AQPi8LH7dWJ^=a|XpZqE(X+n1iPu+Az2^#3=U$*y5E$UA3*#jq zU&JG@h@}xx=>ot8V`eA+Kq)h6l$?#9y}(Q9gl;F#h03@>fAnJHRLRM*NGW*c!LC?kR{aC_51KJo)tMv23Pu{_Ca%1;oLa`lqi!CB`l1VNCROoX#Pa5 zr^bj=)3HT-L~-T!v{-Qti~?_d?DU+QWV=^-YFe<4z=9!0+#krDH$hLfh6bWFNc$R6 z?`BHSP~_}C-ybPUp}iQ|nsN4Gc$_p}jL|tY<$QP&sz}p0Vu`=7mpm46Z@{|{wQ_2? z+rpw=Jipk7KVBY}hP>^x@Uf8boyoDV`e+)_3yUC|&ZdzlaRDL`y2NfD+B}@fzxk6=WU0&`)CqGp>H*~{Y2OA$Fc+D;DZ=1EKqi+XIRaSKkiXlrq0Wk) zH2mf9?X<(OnXUpcGI6epTkTkG5m=5cgbXn|K?g32hTYTlu{3 z0bqgT?_TH*I^i5~+Vpff_1r@IV7vFF220S?<)r!PXk+;CSn(!jxB7X!^aC$NkO2Xd zhOeUE;bCu)2r4&;%a_Flesm2$+Ay3lMlL=PfW~*KI2xG|`Be~)cyuyX6u01a2RVX< zeI_rMD-A}kg~IsKm76BvLyLuhoM!BOA0k!<*)8@>Z8g2#am68xs;kyEn-&X>e7525axLXSd7lBPyI`stGk zLmxPf9ovo*FNCb*yDWjnv+eK3(_U+K|uN8akn;R)rE$--#A&?g%%A(^uo5G+wO`>EvR z)WDFKM7}&NLITEe1=CwU2$7<2C`n6`Nt0rOe500ZG*QX4In2(aMo!|c8aLlJH)w`$ zV0d`6SS*WMw<0cGB#sRW^7ow)zwlrCFCex?`ZMG_*CHn&wqK6cZ2sVZd7|K;;J}Em zz~G<|;l1yDTGse2+=eS6#k0h9|M z`rB{5`Rz7VrCG^Y8a~pCCGY$&cw}E~8LKE#6z0=EMMa8|@|Gk07j6Jsq(p=C2kiQ- zZ~9uQ*n+}B6|0r&JoMUzO3b_R%0$jSa1!vZEhC?b{o_4BE)3Q&QUuC4n!yTPS5uw_r znhP~Mn;I+B7{c5HMA!;Tr)H~ms#qwM2oN1%m?)Yd|!zPO_KgvEeSx$X*;ZX;e&?X{Zg zC`Mj7Rinjx0%MKp!tyh)JO{>+I<8jeFfYI=wFfM6qr1hpL#5xSouKJ7Td?aqt+$S? z#-L~`MzZv5K?}lC$6i=`C`vWvi!!v+Fu+u_8zZGgi?LFz%hpa%m*AGMcGVWT`VNc1 z+=;{d6ZLw9vInc~rqQ*%SD`A#qf>NR)iKQO88NY|$T*t~SG_1SPny=I6;$>Ammc`Uyi%OS?mz7Nbg&AGEtkImHL#`Mu&Hxtr zLhU(_sfmWDUzI5IdDlx zXQv9;V$BwXB)L1B?WD$Fx1h6o^))}ZO7Y1tB)VlJl;+npaRJCvZ~ z1f5EEu-|OVz$kEklL|<9>a;~Q`eN{|lIEc&x9ci8>p%yvK&R1ngH!-@M4bVSXerC^ z3D>yEDWsZiu!KUg9@k=XQ!u8;?%uC2+yN_JPKyPni!h?wIIs_kZl*)gWkyU}PI2-S zvp?!G13tPLEk`g90;R7rTQH*Rf&1}5og9d*R#|?`P|Ox9+Q6Yw7=LnBfiXwyX!v9; zP=w+;B_Y!^i3&Eps58@H?C}NYCzCOYq6ce|1D#Z9n+*f?m{=^{zK=Lch!5f&E#3nv z#XVLtMH9~fCd4$uG}&lv!n2Ta$}vxKHRi=@{(@+MvSovG8fEnfi}f&@fjRC1RLk@< zK(_5D(nFyp>y6J&e}F_;(hS zZtWhk*$6!W&)rn$Y3XP_b1Yw+I7rnc!!*&@zfYxV zwi+lvb6+V1L3OzL1g=-K?o#3-C|&7H$N}?Q0bovb3b+B&;yZvUwxXkOGXcxej_KJ7 zEP;O>W2rDua`r>*GAWvx-6pD6N7!tbReb@P&T1OP|4~ZW=ciLPL+~)R+g<{?g2*aR zAjjlUsb(8206zhf_S#0e0e7RhM~_j}X-;}#UL8~1z#Od5Z%288rMvIQFW#i}p=wPf zuy==w@|)Tdik!6_f@d{mo7~N1`zSgiQt@1zAzmQ@MAl1q-n*&d2T6$iKn( zMuncrIW}&fVraDX?82NLjO{p}uCi|PMw3e~7MMnL%8A}VinyPGM$>DxuPBo_x? za32sRAz{i`>^TDxj)CQJmFh61p_{p@50Dt#s5ymhOs^To$*I*X)F*i8i*_J7D4;(6 zMu~bWxUMb-Hz?Vy#ujCT6^Izk3W#8(TBSb-dCR1#*s0kDsw+llEdx!o!F*U>hy*-w zHdPF8l+xR5Jyx=(ABZr<0$^tD)~FhKK$9G&VcQC#7VQ84%mUx7#oY?5DuZ=X;-(3R ztokUW>O|1S(0amb)Hu0Ud>CF7+%xvWC~wC?g+KteP}s>(K{2bXZtFOD>~Kp3q%%|N zs$(m2fvVZut2cR=yL)jBK{nN^A`D#Hh`A`lVPXU#- zcXl?`lvOr%Kp`_BT>U3&)c}KWVwmh*riq6B{R(wSL!10iz`>^a@?u;Mp;qggPgsrC zW7?t?q|KXYjl4~@1Gg^Fn-{9^RVIYXVmVsJLf6za=3TIemg8(ydoM0K=$Bjla2M>c z{cT5%by=wu*ss#65PH!1H@SitbZwT-U8MuJGfh+BxGhI_l&Dxmo7LE8@-Xb&Z?=NK zt|qfZZgscdrU9tHgi5x!0QD&xFQJUrLtH%I@gVV8PGz$8wl~+5<8F){rU~ZW9*`UC z$Tm(fnGF30anY-ymBzqO>~;m>BM5v6#_+SLteJ7uLvLS`$;E6eG)*yBdP*SGEWH60 z$2<`B)hekk(W~k#fS6%q%*{^8o`y?ldn>4e&{L&!KKrwVMuw22-B!b9JViy%U~sB} zywBax*V|{TFl8A%%>5^vfswnu5LYmuBMfCKL|o&p(I5iI2V<>+gVthqW+~{I9XIkC6ck5`31f^^l?<|vc3I~#22?^eA^02fw?rJwv;W3`> zR(<)}idR3)KYrF?$Tm$fmbP>p`rTajA zg-(;9a?y-4ZT$WOkoM1V77-OT?$3ici1Yh*Ay18gzyk&q`v zCTnnch+1FKu=_~gMw8dypiPzs8Af#)VO5;bbYeO)xop^cIGUMIeWu4~>=|qiWPCbd zNltX^t}WBD^iq`!XWoO0acKD-nD-RubF@Cx>frVcR#&lO_mM7BKW;nuk5$Zubo8Ll z_ClJ?&x`M=9~i24Wh7WMsCOit@hCinyPt72h~ea+*19s79#)NQP~~RJ5QsQWg?1O< zPMHkd3|#hsyIjiZTH3qmohlZnL9QwA@9h|^=sMnO9Y%2Eyz5wQ^#r>M8Rp3$`0xb7 zX&laZ_Chb13&EwY_Z>UXRE>L9R4lzyfSOgd+}Vc5$s`!H z{w=_o$|yMAH}VmVdn~N(85lWj>Fc95YNFv(E;^oPu-ruFau1&E%L0;tuw;0@w{zdl zN(?+B@kK5+zLcMx94>%KEvarga2(f`U{k=a&=mdmGO)pk7}s_QUy)JOdG_o8F5bbe z%5X7*g~o`zBWY;w!pr3XJ8!y-sr%^Oow&|MRYX@nZ(yuO+kEi&IKeWEs((bwWEgBs zb{;9296$fVCM#8sq1G8pa7TZy(b#7_J`=O*NQbsk!-J5;VzHWfj_t3ha`I)mgX~u| z?mm2?7ljAhs3JEi|3kD)h5=))Bs7Z&adAzr7^W0Q$Nk0A!&d9?>17}sr^gJ9&onY7 zxn+{6r}JQIMTHYC`f$DZnj)p9w5Ij&Nu%8ALJ6O5n)o+GGbJ+`D^CQaCV42 zvrice!#gH3ZVwk9IHXEPOP@)HL7~>#2grfb$M@~3DuxIm&v`Nr zoB^Xl{w-L?4>s49Qo%wLr&o`28tMW$mP5F`aXE)d$?7Y2?mgOVwDyB~$lOiCXU|wN zO!xh@uF*Jn=F9+WQy;F`864?d=jP75a0(ncRi5N*dk5uJz{p%2muD(ChLeZe8cM-< zteT;l_>VZlVRpe1WaGDfummcs+_b;5m%d}sXXPHT$W7Dx&OggAFAN*3bvZdr{gA9A zNPy|$Ymk5*i_y?KWN6&>&RSLH#ZPfK>s+4+FPnRg?yfJ_0iaqVM?6k7)_Ix)JMAri z7n19uXkh{>RNb`ys1<@*PJKq-861Upb-4F5j(R-(73@NM?`h1AMW3*k&zv1J4-B6< zJ#0F&h?(3lU@)H8Q-^yboK{|k$kk0>)I=NmcJj3Xra40wh6@Rb3U>@FWZa4e0o*Y7 z2*dnqxNkTE$Ds!Mz|LuXr^|6lrE8#bdv2Kl4%FRrJc0>BL}Bdd*jK}<h}SEzjm=0H_?*f8<{!{iM2A_g-EaHaNe-(VxWQpHFQ^$|ux&xKE*h~~jIUuLE= z@$Wg0`yyVZyENlYtWKKUZP&W$3)`LH0dC%czmx0cYY|nq^jdq*g9P)=4VWw!wYZ02 zCp?b@2NmP@j11t)u>Mo$OJ}$;Uz{`a;i?AJ1%t8g%%M2Ow}m=GPsp0ZdZd`fr*I|c zjXGT)^{5-M!hN`MMU9K>EB1CHpEnLxPGH=h+1v0Q9;CnlI`nwwy ztGpN{wcFfx`eR(@svYbfs=%cbubt_msSa|~66&RqxLl+iXL!LD1@b~K5C|?ouPfcT z`1I|fHB=@>3MZJK;chp=`c*K zyWv#RB9Cllsw;P0*C1t#wPU3_0)>gIdisrXeru{PVqTch!AI*M%mD5 zrv3`{izX;jjg~X5>z2zFy-?IeV+^mpp@AKrJj|b+wsLJr--sEjO*QlnSAMiyy7b*0 zr!0m%tZu~xc}UIv3c+anp?4oUsnZAzEQTD@G=p*Q)af&4=x1CH zmxZ{-ICM&Wdcvter`y_0GXm6>5Jx(r!%a9XT#qY3kbUkOq^<$RILok!{*_~3VD}kg zrU86{$We!g9K@N~(~yD!=SRV6!)BBcW}J&gT(adS+j&V$wB|1bh)H_&qa zKkZ#>lvLG~KKFgAs;j$cnuk0@6eQ|^BH}v;DiIMeqR~;&sNe$y4WdMCl6BmG{rcWLTRn6xJV0qr z@*@BPkSZF#ZAAmJFv0EKU%yRxwPzDvCanMXli&3cv~E*|JgQ2~#xPVWr*Mk^n;lTb zUaV9&i2cT4I2Wu+cYUwg^OFOeV4T9*jeTu9deK#j5|&h6r#K^D0O}Vee(xeI21IF? zuZFJ@hf6{J;S}%|t;A{nvUAgqU&+G6k*^fshmqAE+>F&YjLupF*P)|gcW)@-!#@hz z_EG0Wz_Tys4gm9kUjV3b7|#F?JY-XPL-}dXrW_tsfPMJ;x*K}+L+|ZEoCE5HU&$fWtwM&C%^F4)A$B1RH3i=gDqT2hpfv!l zFzdZe8W?e*TkSz=ha@;egYW_*N{0Vr7{%7VX1V3l`sE3*y_5f@pf7S^YfyzM8w2^)xA{i#Ar>Eytg8B%G0EB@^Ry=gzz#5F& zvn^|s-wIQ4K9=g$y|?)j)Gfq@2Jq%9O760DA;Hf>#Xz7C6gYP`*aO zYPO|;dpCC103x$Zqz~SkAwEV(4FVtN-C_kf80o(*M~NQ)&AqJ=yRuIGanpg-UxLTZR&0x%pjZoZGSAeeds z#Fo$c>1`kosGj1Bqi?nX6$^=jP2?*S1X$1u!UhRUCJ4f#+4U(Uemn%X(+0Aw*zqz_ zVxnrk?9H06H9Qa!1JW)yI9hb0Od&=O0+A3xhXEgdT(LWd!q`IU`ZMs5prL4S$?&#! z5$AB6V|v}7snFJghslw*Vh<>^?E;od6cx@D+FkYKS{yhT4@me2r z_aG{30%?$YiCiLYo*pn?MD%3A zx26tOcJB;#DLa#S4Z#tJq2tvMnE8LbWu)^q`u&Cg{d%HI_w;s`iA)#@<9Z+Icz5qR zJ2%?d&KJ;C{)>HdlI_c1y_`u~{KXz3IO&<}iyGgTjG(;9QR)IdFSSzqt54xcl!A3-|a897k{{!$V%zJYqU)z z@^(JcmfiYu4D`kO;NC#}|M6!pqRl4SR`#WCxi_H^M1$oE1uNH?*?jQV#KM0B7#e>b z{oSGMg>*Ut<;Uk!mY&-U?Ss(s^@R#Eo9;BqZyyO;Pxth({1spP;osicoX>Q0g6799 zQ#EGULpL@giy-;a=Em1Q{xyod!PtLH|A*r-fByY1e)7(qlIO0?XpX=8wcbyDgQF^_ zJ@_;%M*!ON-+%h!k z*MEO^W46Dj0lTs3U-C%6n<L zRoVsi36%{a@CN_WSJ`0MCHwZ6q{f7?bspYVGu@dAx+~(rA*S6jB&IDvugJkm8_&WT6^89z4si%d61qCD zx?ux=js!0~jK`T8M^9U9w%lo`QSro?wh1p@X>vb(DSpKGquL7494b*jjWF$-NB5_T zoJR2P3P(^Lpw6}l!+%(c1F#mU|F6$Za;*i3% zkOGUNb1niAOluwus#n&z5V~pM%vRtMUiM2pMpC1Wzs&=boX z0IO}B%ceC2CT1^lCzVuFEFoxP+H7>ab?X%|g$|&~g$OXY+fXZM7*Z6~RX*0e$}}8j z*{E2`M~m*M|>{x()A4Dk1Ntu=u~Zb-x9TYrc2^e9xqH2 zGz_b;8_Q5}h_hH+R3pbH;)2Qn>38*ty}bf|zVYZ&7XP_7Zb%;MeNWJ7y5c$9f*B^cRce|psIn-Jfmsi%d{}D@<=#x#m86TOKaHE_ zEbcy;zyO-czU_PWGOUxL4bP%Uaw8k2Ne^M+p+Iha@eom$n65wR8I;})sC^j9?ana@ zKs!yWn3waRHLH_Y8ck5ORhzF02UX%vUnN2o!z6YZicBnS1?c=tmZ!06d^oIA%OAM^ zm`J)R>ul0fu5B9QC8?3AvNXk-B1lcp+R^bQbSf5Za50`+SP+Nj#0`GZnOX9l0}3FJ zfphO#QG;3vnkrtM_S^-M+62+D^G7qG9pA&2qeFVI>O4_}mCAAUaLE{~00J*Niqs`0 ztHQ`-8(XRq0+3uWg)Y$yJ%AH%SsU_B{jmajX~uPz@DBV82Om!2r@O z<2@CUmMW>=%-_khX28bij2si?3yMMg*-#%cNu_#&4S&^N5rKddg$d~WTk<^D3v3Rj ziTAsjWUWaW8@B@2Wt*gz*En;Mf{G@>a!h^1H;AL8s*L`k2&?F>U3~rQ+4GjPL4Bd$ zyx2Ni!&{^jVU%Ezij6-9lx-8tmrZwp_b6s@ecj7{>HKoY=bJL6#*64kADSr-pPO?j z9NYincZT2Rj_RZYFkaX2~# z8^HszzMW~JTD7iVIbMCK)^!j$(KuF6ydkCxGrCZ0j#eC4P2;8+E7xY)pPF+TQ!$fD zQBlrs@Nku_Y1&gIWg8o>vpY7rM*Tx`=FPo+MXJkk{lIbaPn^#xl-Yi|uWAA-x@SX^ z>lX{Q=e12|G3ZWGmGl|)zKeW#9jx(1rYr1%^121%E1<^1g?KV~-n9!Ky5X7&6hTp` ze|%rz1aQ6I7tHWX%6BR6$ zDq$V;5iNH9!~zOvsRH3$NBd0$j9Spg-uzfSzgUo8fZ*9#=fZVDMQR06Ruu)C9FBCd zn*(EDB?Yk9b7i@S!9S&7U=zm*!d8SYf}o3?ED;mWgAY5UoI)|&)v}7)H&sbdWLXeE zs|fgf625d20;@raDvV%}7+c3gK@?s`gKtsPVlh<_*|bh4+;aw2Qn*(L`g=^0l^FCu zjp+yT`B)!>b&r@ZGDHavaLypc@Y#fG5i`Nh{PY|1!r zOt^yrmkLw;^GS68O%{Xmt1$D99~3q``_P>6Bb5|Fy&s@=I-E((n6nlvt?%*zG}}*c zM#^`L;73grh*87=DPC*li};F6!;-nvhQU-32*DA&0uz*A$TCaG!_S;`>*FmZre{Nr zWY^fYLehQ|@y6(UpDzX_*JxV0VA7Zx83RbVD!s)<3kv>J1*VP|bJ2I7ZMFQ8NB!w@ zeGh~2-eR0yJP|*{fn!;ZL-%nL!Iar|tnBhiLB5Yzul~!Hwz|8f z53hoS$cWff@nbebQlZY+ex%y5mp#-_3}*(f_QSS@CG#hqHdGQ*k_3Aae#~mk}<*_*vW^d?4-nCG4JyuAe>%>dwTNE=%J3Y@`4O9EWL&Og;0;TbH*Lf|76f z;bS;``Fz6bRyW>?;Sb&Vuw(tc=oT$qH);6XUhDuk6SOTInpybI2X zA+yt@cbF1m(~DMr{&NDQiR8xQrMj8baCx${HP^4xC?>!+GVy69UBb1%kMx?xo zE_Y(PM$GUc#K$IFh%gb669NZBPpDh`if=@k1ilft!|9}>T7x305`r6S)w)nKO~rmv zfvml>cIC~d>xlCNgieZbZ$R;pVp@IFBg!Q~J(|d0b?m5!yBS$h&_13`M3~Qi!oDyXrm7-Przo@ef2pqQ?Exbg?5TiNhY~ za8v#e>=U`xy8CC(zHfE9=$U6r@-|i(V>jVVxZ(KEO~3|@SVK_Rs5wtQ`P9nWCMm1eQ+8mKid8OMi@;reokTlvQh*oIV_FrP znma~CzQ*g+s#K7J6TB$+_HX{mkT^j*Hh( z#3&p7Eg~XHS<*2=9=eA>fFeq*s=0_EhMI=ge%%OoVS&}0`+!r(;GAVhQ2ujzbx3V; zH&unNSK;2~PZC57F-+1>1c29=g5xj^Ry8jKZ4ci+=hnq3$1BinDD70c@cE`}2ZB+1 z8YONzHsy({3TMlr$)I_+Jy?b4KFmHBmXLkIs_mfU`DMp6@?FPB%8xrxtta!~0m`c5 zqADcjXEv>ZkA!K62(ooS9ny?Dzf~l22$3rq9f%u=EMyJeb&RhpX93HQAk8%=uNrj{Cr2_J*3S?{5cNP(+ zy4MIwJ0`#;OcD{D#dUGH=QYg`;1dw0>1<(uJm?hu(g^Mrb<|vv7@LEX2~Sroz)TQE zjvB!r8&zfZtWQwtF;tar@^X&<*y-d&nW&Bg_%H~KIgC54!?2Z$F_v6daNwws8)+)# zw`}RH41ZA-eficqMP#f)WpN@AkACM>3ickPkr%rNHBM$S*I5dfS>LV&=7IPC}>%x4p+lzRc1()d&%KDXYon9R$E}UMM{?R*n-4 zbpp4E%Y^&5O>SpKvC)fZzT~;{?!_dCSe(uDx#2BU2pAC6;mC=hBj1(~KSF=2LdYWq zk6_-Yvdalr9Kdj51!l0THk5eC{hIa-5>lFk5EIS;W?(uY8kUfhY48gecNxRi09!fN zqHPP1qW{d<;);@SjN`;c@>ASc6)dX#zK;}~aIoNB5hI?ZXyWuPu%>1qeGIgtYl^tD zW>_4Mq^8bxVE}QwiaC4q`eMH0IMbPN*5B3!FHg9=)09v|%57CyyW1(?b#MV@2r9-H z_B1Gz#lL|76o}758UL$0$YLtJOlC@rQh6{Xrod<$S;+$^??Q1Gj>U1a_V zBbX1oREX8CDZ=%G?W7}h$JtKc%BDA;zCe$!*hIKv90E8UfrEInN3UcAH)CrRVpaJ1 z!T8Q*3S_Ru?A6#kfEw1~^q@N(h?2N8eBAU_z`P&>&;)}ro`fN|vjt!qmtcj~5#qj3 z(j*y(JHFj4uB!szp^E?L;qgH^PmT-K5d1&rHBGF1v|PqbN`Hs<%-gM_ zq|<|AX6P(eEZ4FXWmTR(@KLYraSRF zB{CnnIn&(!DNY?8r#?T~}?hxGF-5n0@1PB`3o#5_%fb;U*d;j~tH&s2| zy=U#cdv$fqOiizeQdX2gMIuCkfPg@ikrr3|SNHv=Ai(`Q#{gRM{#B4}s!~57>ZgfM z|8)?ZrFGmOAds>DQy?L-bMgNHbZpeM0on@k{ANxL%qHeerWVXz4$lA35D@4i;O#cu}Zr+Xn6E7x5 zH_HDG^8dvVw{SCawQ&a6I60F2C$5R9lRH3&g5p1k{`dIraRO{C|Nl&mZvR8;A3>J? zTw!5jW@Y)`*#BGw|6}D>a<#Gem-#>Oh1mrE3;F-p{wI$h%YTypUxWE?rvGLAM^zX} zkmY};O&CdjkX8o*LKH$q{JXjrP+vzq_$?Ok!y>x`=ZxWwl znlKU)D#Ss>6pHE?Sx8Vo^RaNCE?r5Os_dzv)OtCijmLZ~_}OzC#LY9_+sR|2t68A5 zz3IE-GVML{ns+RC?45s~o2fbWG`~&w61yaNVRhmE+;_E2=*-oK_u?CTlT{nsI{=pF z25o0-Bft0JzsN6(zFXbZdEU!`)`U4~Wx6<93DvY&cLuDB~8T52dbEUnNpb89}dveYF${YepMj_?)n$s=5u>o9Kv`Mt2q z2L7uk5efykjgZ%a9s>8+P+Qd$6#`gPHJ-26KAjEWh1zdaRgJao8BKkq^RbN3uLOXPnP%wpVv1c2zJlyZU^PIGr}vz)}OfjWudwr@nAoVZwX*s$kYscmwh9oWal zisjH0~~N7op!5T-_YL?Cxa5D~}xy2>X9y;_JkoHK;fWpe0ONw#pN39`H<= z!w|)wW!dgo({%ZE_}}97;Q5n1TR#H9hRIERE>r1QjdSe#QXM&|`GLJ3YTK{z zcb!BUsmil%6CyYeH5a!4)j96%TUh?V-m;uO+eVHegqcneXav?JNO0QZ6slMxdX$;c zB?DG6C~xY}B3{6=7^;nG28YjT4eoyP-d^>tx%?IJFNEo-_EKb&F)?!LRRAGo#HKSCLNdv@j z4|Cm+IHgrv5d#CW6($2Kkj3Z*BJ9USCYzbV7gH6Z7KvXaL2@~0b8P4tClv=f6<9Bh z2o=FF9{sm%lokDb_ElTmUQJug7CHNXDCf~}8-jFbQC+>9y1vdiL=r5)hg`6|Q%mc- z>E{_8N4yN%H-1{1nn#IkqeWt?j~Aw%C&_$SF&!Ibj2Yjl>V&5IH^-)>Q0_I#vXqN% zJ>bRGp8FG{WY<0i`z2$EdK$EMfaS=}lm(GDa17z^^ym5^LX;}h{r1AFIS zR!F+#;wd&>P@fJpTGr{U-eqE{ZH`*nWzafN;d4xNi~8rqs-|xP{j}p2=O4#O|8Zs_ z?}VwbzEx(u?*85pUzYm1CXOASh4^>praTeHToPfA+Q-T1r{S;jHxk3~d+7x;w2${{ z(0)deI44Vxnq)}Ufev0>vft%_*-1*g9hizJO&fVxzo&Y zV{L=So6lD8B0}z8N&~>d&^s>PL03EzvNSbHJ>Wire!or!QI3?9TvL$=yC#-H79jMS zpmEc!wLSmr330O-{>mhg0}5r(!xfaJlFSU!Pg1f;qikKX zu&PN20oo2$-m>JG&*gzevYc9b$X*#)mTjEE-}&qOgEW>(jj1mZ+`J&RZr;B2?bjRg zoP|_t5cTldz)yMpz`PHqPrv3c6pDtQry*hKg40Xm$ zlBg>2DB!_jiKpHSqqdDi1F6C^f{bMQC{bpCasmZeZ27(diy?=7(}~(LzOC$>djb+H zCb%n7?1i8Ge{>n;3!D~!E2~lTh;8-d4MM$?e|c2dV+ zy!aV;3N*eh@5n8E?qOg@{vYez85W=Juh?{6HfF{Cd`@*`)b+sfk>K>ChkVp{B3qtx z)WZ1PlSMH&;s8$DSwUeiD)y`K6rtQe8yf;s;(L_(${B>;sf)qGQ}-iPuM*V_wWn;U z3gwv2xsdsb(VuJ!Er@sZhbxe23uZ;l_W&gbd8gT3@cQ=3r=jpFVKt48+yV?ylJLqN z*2LeQlVh_ph~js1;}52Blxu3uOuij77>F_r=u7&1((rc{aCUx>QQmLJe(GuFNya9Z zwdNCNg3{$6@^4cU3?m(a(TSr%&FV_o?C%_eGMu(JH)yoSOwA9&X$J-3B+KiCsbS0Q zCV|~0{FBig_1;RT?u1HP@qa(?SZ%ir^zB>m?|_whozi1Q($@zEfma}^d0MoWU%(?D zefUqL2$B6M9tTK$8$w~md5g(v`k-nzgxXi+)dMjzHpLkW>DErZyIo1_LVm|ui2X-2pq`bdvhnmY6((7914CfT(a@`Sdl~*|#)S9yj^kkpXGk ztZcuJ(h?d~)$6i0SI*9+YSYn_BkKbZN{*rF5U)f(XX>h&AS*?hjhO{HMZ8Zyv{61{ zHce97TALDkapv9x1(v_IX1oqCK?KXoA8f0CN?l6(Qp(h50{RIa)&?4EMQNud$WNxM zob_953Jv-mCfllxti|I=O7q(8g-kKS79pvSEJ}MEtk6CS^0M@;nu)My;lezmR$rYX zSzHdf312@;hvA5l`*IbjlVo}{n8!El!GOh@+*8L0S48n!rPrAK1W|KFY3BQU(cw^u z4jGB>6LwFXEwXySx?If4E^o?0nri=68As(#RnQ0f;xBlSmqMZUWj)PN>)j*GGrG-t znPMfF8&R*sC>n3LpC^KgzbOR3~y6Xh%-?$S}6&d5KT^QeVjoQP~AifMuDeEUn@kh zzpeMg)Oz#le@<9T+QSVwh?pxv8ZK*cIa1BOJXeOQv(}PkH4ZtB3fxuAi*0s~jHu7w zB#)#u&tt!|cSqec=0;pZK;x~$@p^Wk9eqW*Rk}wJ>nq4=TAIh&Mx6RU&PZJL|P&F`f`gmjDr*v+{7orf+h31~}r~i2F#!P!lciRS> zfziEc^5uMc-u^~7)*lWi=~o*DFNnoJ0#1IkIdcxFfvWestLU3nb=Iy^5&iB zSCVGwgLrMI=3i9cPToosNmBks5zyc;bowH24i~s?kRsO~kta8G4;YqStQ%G9{Qd6@v}s66xPSqoX`(=r5YQrp#?*D zflQ)*AQBI7LVQ%4ZPBNih7-}k_|opZQFi-5tt-Z4`M8SbB*Ko1MDCl6*HqJm*3iYY z+uozX2>}6t=C3j+WqsBQdbz?K15l1g5rn;%X6ZqvIn9lPo_N4&FkakdU;Y@s?(UTNBK)JsPQi+(d^c?POn zo4p7VD#9CD3i9&MagoqO70*-p`yFm+3qdVIK;LaJ?dnpJurMY!L+hW(M7KV)oo;mA zn~ao}WkrQL;O`)f5^*KbVk>o9f}(Bv_;!t0*#=bqQJTlj1zjSw#BQ!Yn*!j%*^RQ! z5c$&&4bq?u6nLlRP%n$vtNwMF5+Lp+@gF*W=6m3Vk^fS4CWL^$$gv1>%Jx$o(H7|O z%-~mHe>(Xc6z^}&SZaCzjKHO*wni!#^=0uJOpZYkHi~iei^kMFtPOv5$*u`N5Y40iL7`O zOnYJZm*^A2SbH|1@;f~HXfGUiLK=6`l`X%O03T*I`zAa?k`AOw_XLJH2&sEoLe)?{ z49J$qOS1JVk2$HCs{EqpE5m$X=m(jQt3Oby?zJ? z5kLLhR_14{GZ*+Nb8VoJxK#=_rsu44VwP?5%$J?~D=~{KFcwWLVEY>{({3mX3DkG6SwN zL!!h_ss=K&7>l+P{TZ>u3q&^F>L^@wl;%V0>K5lRp7*dt7eenHOU)pXlq?hQnx;)g zQ4!->n>($T+tOdxoqKR`)s7)cnk5MBp#v*s0sM6~kVRx$a&&2}MgR*kg~$H-Dq7_& z>flj0i0^C7VI<1K=KF|y9AlB|F-1i)7T(6J_<==$tVY6x;w9a*Jlb;uQ*YZ1dB-oZ`ScP;cK;j*@^CE+%a3y-Nr2sD(i4WHAi*5WvH`V76!E-au;jT8Tn_1@Lu;Cb-X)Qepab=)W$r5UJ*d(; z0eWZrVa(^QpdU9dN2FfQY={G>FAki9@3RV=U~(UN#HEQpbymZfZ5Z3qklDM=o_#$6 z-Mo5Z?OFzo$}j6GCJR^itD=g@#R6 zxb)`o`^3q-qIwfuh9@blcWibWSRg)3&rKr|GoLDg1@)ky5MlFrA4PjKQ(Sr-w=EnS z-lU6Z$|wS&fRE%KR`4usNir7csi_W1jx1sq-s=Rf zHJWS3?9C1kS7tn#R_hble%Q=er`n4(owZo##Mut|kZGwQdvez<9Wd{JiEEsT?1D6h(P(T=|WKlw0J znY+96jyX1iG%0M`Du!b+%g4Fn#@EF)cg@7l7A~GcIB_CQ=^p^R#pp-wbO}B?2F131 zCuZPx)wv(rVCJtVZZbC--oI-X$*nkC0~7fDO*YLcZCBRv4q;*XZJW$E<}ZYKKR@W$ za;xttp#m$rQ15NKJ=Ozd$|&|1mx2O(G;#TToV>R13bGb>P@2)(NW~yZMKOg`s3+-^#k%Nmm1^^vY+yq7I?FLm&$eLS+GmC1_V2HUwp&g= zoPN6P>8$6*xH##Fw#?~OeJPSTM>TbcSZ1j0mPK=|-Ylx+I#Kk(7O^-i7Q;2QX&SEO zZ1OkXWd~iZ?(9c!t~l!ZHcqW28N;)!tiilk6<>DZpI_yjy!tn375FCex2-vj>lJ3m z)B0e|7K|a=xut8M%wD&+V213;~#B=>2d(+#hph|l& zQx9nTy!=W&BCH|M>qJzW*fxLOWDbg~`j-^68tvM#i7KC0 z@K{4t&^x4Azh<3y4gVHwNbz&;8fAa$n)H*u5KLRRf`Em7a(f>Y(sLO8vOjy);2=EI z*JP7OBA#crsQR^f!CFS&;F2uq!U7^t@Kli9xzm8-jg*@L6p*nBzcCG*JTO%Mkkhk9`0O^GNV%@`@2{wP>`3>0r8^OJlwvtO{K$ zz52X_9{g&L174TzJVRx1t<;57i6hV|TDb93{b>>ap^y)V^eC%NZSY�K6FR^k0h= zBsH$n>`qw&#FN0O6UAtUymXXHh2}GC3Tnc~h^JRq?=w1X-n@)1Tyk_-BFcE5zA{oQ z3JJ@@+dS`a9)-_KNqK4)UXq7Df8R72PkMWJkHh3h8=TkTp1d4hzo?JyFr?&1$ zdWd-Ji=>&fCxx?CF)_|A84a1| zOtY-5Tb(b)ZPY*a;4d(cH!RIgRX6;Ilc>Qjnpn3U7{Nd@fKCrjz6?`E(Tv-(hBixS8oR*oN&V}2UX)SzS*6@p`2H3XD zCid6TQ;qX_vxNO6MW=Td+Ns|G9I{UuE7Gee59{`}I}9tS!-Q^P@*)%|h+Z!;;gaxk zwRNoY0|Rf@#~Dl-+p%Rxblc|7HogF=8LEUnd3DqxAk6z7`AtWrp*vy&GzXKx{34Kx zO(lPIAMY>Jirb&bdja{CQynhp-8??j?U>e=xUu>yfrQRsD`a#<_SxPOZ^8x2{l_y-m4>m!yvv$qGs z;C<1Hg^>8bcFygBt$AHoX4&F)cS^DMwc|1Aw~AhI&SqqSiGy}>aGZ2Q31W)*v_E!s z?ifel25c~9cGz4UqPjCK5Ui^8x1Z?4sJnHCKYW8XXNugBsw93sGTS;y5@L3KooAN6 zD7(_%c7E_g;;ppDbYVe-1j;qZD656m0=C6jV29GJ!Y-tnV^IY4BdZ=oY+-o=0-}LT zEg!QsEl6AL8@)>vkwXhHyKZtlb-0S`SdNBI$VV6ZhNW`7tYn6?Q+0jq)BJ(PpF<5! zjtGjc-VBRI+5v?6ee_}Mf3d#H?3?nGs7|$mR+O5p@RO|OJE`s@CZtTSzq~is8zb&d zezU}T4G_8-b$mH)*Jz-rLsI*dQETL+)q5KrH>{)w?Ca-ltNEi&hT5+2znAnz?lnN;vznlNBl5J>sG4}5!@ss5!N&rCl{u`N}~yq2CU zdVw45c9z&f&7F%`otq>E?47vQ5z%uf0H~+rCbE_XX(Wv)RMP`&{c!A@i41hz2={ef zR2}!5jh>WGrX~HF^K`0m*(w>dwDRpmws{BPC;||p{&qBi3o|3crCW!HoL{{obpyv4 zTXUpD92frH-Dx`5Ow%w;&`Sn=X#gDC^KJF@*A1i@<-mu3ux1TemF_t%6bmSy$v(gG2LoL6fVQt_Q|C zBDdZL);7~FWddYiP0(Z}{N?hy`!xN9MYt(fW)MDVZeHR6Zk7}nsK_O=SHgbXd~NRZ z9VXIqsO!K8J$?9ICWK=FX!sC5M(whP(f%lxepCa;q}XFY7E!S3Nw66Jn~S4io=QmE z8?{-vANi$-{N^`P%BE~BCIHIiZ#|(QHBJWJILVJIVz--z9`l!_WtK~wQ9x>&HL1TcZm{k@)oDMa zFL(p-Hv?bvJaE~Z7mcA>7K4f#1(T5x0m&V!altu*+o$ulV7~YYXR5_rmsjMq?T8QH zLATg19*Vczfu15Gb|UsfeZW0j*@Zh=nE{y*8SmvG!QpUsE>6dn&ij|cg$g|xxb$W9 zz;Q=<#zykRGRYEWr^3BABamE)XGgcx5Dtx=6Tvm7ab!2G{I0<^! zyO=20yM0&lw3KKShHmcHgwE18r_Sb)@uOqnm8tqhAuEQY-NT z=Rw2Ly{xJNP)QkEVJ4HiuFdm}wb(11idljx;d}v6=3({y8L{JR{LRPthb)e;PzOT? zg(SQmi&z>4*oVo3ytnBzRvbdEkEKTdO(Z5L^t0G;kuazkZRWI-Is5so|IHXM^I-1-#pVy8` zbttUP{Z}F;Q9RI++OSpA=@PE~`fwMx)*2WP#?Z3EB`(2>;KqRMNZ7+LSOHiLtlFg7CYZAa5FvT)0UcI)`^c>Y0Yxgp{F8c;RE zKiSyMOF~KpZ`E3!zn7-7Nui>qQgO}9x0rwEJw+OF@66+IUm(it9msE2=d{r=cQp7a z!ED7Z;iS?4VWe-k7pouV^u6sk0{I+ICjs-7>tV23UgFJQ%={WRxBAR8*5#ANfgGF~ zuSIW5rt~B=wVZmX9*>6t;sb(no-{i8d*GI4vwOyyRZVAc&F>GFpbfB^Xc{I@x@$%s zn>Q(?@C0pk6f)M+L^TNPpd_#|9=o$92%=7;dt_bpvkcgcn{djfJijge?u>mnnLfWU zFf3|wDW0mEFgsBGa=`7_kez&zfp~K0SlE#bCTN@p;5aJa=6>F(rG|~O*?lTl(*PHbKYxu;`{tGP&U51(Xx8BMPf-k0fiv7`jGeJb2a zNG^heuV{`!%y)jW@1{BFfhp7@xc4mwzTO?;VpwitDd|jAS;m3&3Rb?9Ok~gb8X4)| z8scx*f$tWl8c%=5);!)4?GT+h2I!Fl3-V>}P^P-{Bi$A!snd)aMNBJYL+EY3Cme@j zD-d+|Nm(p*ZGBop9}mc1L%pL$PER*3$?5lN1vRW_|Du69Cfi7`j8vVunA)z2PTXAm zu`grwsV1I}v!OH!vm;G8i9;qhuCZbhfDuRqD&Rfw@%3Abc`Av$j0a8fIg%b>G_S&0 z`(Ks@7@5o1OF{e(JOR!)~$pWUrmC2eh8Rnh?fEf=_;Of%dS4&o&&F_e~K? zSCMW%JE(q6!H3x>Juu-O9Yx!wpV+;{fLAuVQ7v`=@OfYL5Q^7-Gt+ZId zE2hz+xy#D3dD`+;W$Lc@s~W@s6=PE&D@6*wEAU8-ouoS`u@f3YkKopaw>7us>9fyD zyC`Onn_SEA@pMV8hM*?&H3^eMp=SE;N^VckB|>( zSH9hT%Sq7Q`6iQn^?8XFKZc1-(ju zjwn_ng%hLSQ2JuY&yOr^J8_*0BL|!Nz(k6H4fLQ+37Gj@23*W~pkwui|3_b2I{!id zOZ6ju$3O4RU|4JCki9Ve+)8+Lx0^56#)=Y zZuVU%C!CKuM6)I5)4AQ<_54-4#jGo!9ri__0rvU=opuB0vmBCD|fJc1GdWq*TR2vT{61N&3xI ze+N<|^423sd{s_}xfy~k*&d9(n4zn$Dt4`2Bo5UUuB8Jhao3vhRVSh^CgU`_g#m~w zDJN?Xug7kmrhLjHFtltPF1i_}(j+0rj4RxQszaQzm$8PI_@Nc+za0HHS;?tm(?!gQ z3Q@>Ap1VNEw?LH6D4-ejv9pZ?b@@0GUg+mH@cEplFCkIAH-jv{)tI&biQGkNgK0W@zcUv--&DO(?=tS*D5dK3T*-*g{FPBc(6u=TVxZuMQ$G}e z2nnCOaeB7AVRH7@ak4uKLmyzFV@b04oc>VJ^}UWssoi|NwQ1>JUfq75-WLAZU-Ghn zS~#rsE{c5*0T`MAl2oUEU>&{j+PEuLZ*t);8uqVtQR(bjEBNk4YPNO;Fp-IVqdF>* zvkuuEX&r6g@aegb1Pu1+KiF~mok1vIVErdL4H98@` zWt)=-N{4&_s9WPo2Mh-1&8bWL`HoOZHl`=<7HpMGY@GrlV;*mtl1g+o(fAaHrW59GcMwc7Y!54%?;>&L*eGa7ipnL^O5W86p+#>GXsdc$-^k)nNhbj z_RdEPAl;)959Mha54~}9kb_2BoK)=iFKR7QW!@V`u6AqKtb-5u;u}$o4(SHsm5l!HZGrV{h7wPJ17>UV`iTn2QjpPqdyrrn{tS8n+Q~~yiA**g5Z?|o04m&dM zISAo(%BQc#FfU3pCm%e@6&gZv>DL6_Y&=3@OZ!CeO?srS>htzE+@ay|wWfNT@Cg^EHgVC<8nl*he-FUR%OCTffgmH$`N^UT0XG@ZW<_HZ6y!a z3ac=~dTlv`oD@J?(n-6yVCtHTKD?Md|FrVu%f^eaXQu{}PSp8@G4b;^;km0JZwE1* zEIAtOu&>Np@yFe;enuLv-({k<45Pd4^|L=XyBFinz_g=H7EBK`=|1j{;+-tUf9ArG zFyS(|KlnpLocxXZ^)3u4!Y*fKt8p~?v@9xRm*k`i1aWk3Hng#i9ffANvKf?yK1TD@ zrxURGX5 ztda>MK;1dlr}|P1owZFS+&64NBuEa3n;^2ytEF}G5PF}8uB7&0tJ7$6+9r8YpYZAS zo>K8}_s&-^-MbjnPRZZIOKl6ZekzzwfNA;BFLuz$_kr(}MGUEKCcV(j(Xnoz^89(O z3=OR2U9mp9>zp6Ti*!Rd&-#67;WQ^Xw|-HK@7^NTL^wcOPtQN>HLSJ-NEapUs8=j> zb4_0u6wlLyzw`87bUGwoanYH(zU-e+{N^{PvwBE>Hf+YKS$A%Y@wc2iA&h}zG=A%} z2Y13O$XrZyaX?FwY>Zn=eKj}kd^{J!*tQIL_V|%Fdvk{^p4jT!DgC~E0vIP?b~n32F3u>!5i>`<2WT7a;h22wUhBq>ZdTsK+CN#+!iylq*V!MC-U4^#>&2k zM9FXYInBE-M$iece0;mVhiGN~>DVESqTYta87vpj9je-#9^#szU5|8J*65!GMxZZF z&+M(neTgoo6`^t$_MY0YZ+{B%J9VNe8JTC%J3(1TegDjt4`_W=@+SFSoDiZ*2j#50 z2L-y@g{_qCw^ee;H|9}4_^X;@y`Ok~Siyo^{4ViO+NVU$IbOE$wh^F%*U?&BKjO)q zP%yJS6VFA~q^=mKpa6ZbbB+$Az3o|KX!Pd`kS3b`vo22LI1pAif~2++Qe{n@>sMOo zjc@R+`XD;o=4tDVVucWyFlXr0#qwIl zz1C^~U$aY<_DOQ8hJo#>rOjH940Lw20@JNy(ZujDl`q_Ef7r@VR0^#?J!$Mh{Pps! zr#jp>qd#*)f!?1wplM&Z%dID%f*vE5j#nYMZmH?LWdR0mZ_I%*XL)JVTfa{~p{jZ1$n)H{G>Snd-z9u_TF zXy-;%@O?c>39|#>TJe5V{}W8>CTJIaLif_S0I933*WGhR{@d+OL#^0j~W(9?a=5U_YHddd?n^RVxKwMY7R zndZ~CL*D(NaKY&sS(7JIq_J+#y*&uHQa#4NUu64{R4?#ttXF>?R)v_@l$R+%nPy#K z3ic@iCu1#P;;n0JvK1fiT(60q_1N#TG{yc430da%hzXh(eeqp^wJ2JuGi&e~3kLMP zGq?3Zez_~_eTje71wViCwnl{I+5C7vdc^Vt_y|(&@+JUWa{O;QS%rA)CWbU*AvGK! zDruq+S~+XVexj$(GMuT7(6T|}p}oSEeJV;1ASvbisTDEPo&_5yHe9@a`?dRsnOHwt zY1DJcM&7<|iSx=1JtNoLY+lYm_EV%Mql7RgioHVGCf|UJ*hgR`j7S2YyDrq;o6Jh# z+oNB2xJwZhkyvz}zmp2We3&7a+heq!TW-D_z~Qjx#K#I4wszawzo7nsF3f5cp2zQA z?K@#L|6S(iJ7HQZ%d8!~&M!q=$#*$E)TkDS?*|F?S5gsy0THv<7Lfv!NvE9SeDz+% zTT(B4o#WN27AMgo)(02R>iLU$$v8OJuB@6nzg7qSNxKK8tAxfhS9YO?uNWqy@*BgL zeCuh)<}&}3)Ha82Xx*9MxtKx7Qi@=k$b``iC=s& zUhDtd-~4{_>_Qbhs%MOCmj6{)e**2{XG#)yDMfEYSIBKhI7(sKaewN>3kzD4ZPFme zc=+}u7SXB*-+5H97^?5^P9hNQl7-cLsS;nYXAP~ zj+?AJxrBO$VU1x%c79QuQP?pQ$Ko?%0QmDMw40|5#S-r~AVlRdp+jQ*i>^;$?_v{N zX@EIZJb0i;@|JZ8wKyx#U7r5VsWn~Dzl)~g9pfv+6eH103u#lKfeDU37_6DuWa@}E zXk>*uoqSAo{cI7DXI;f;dHGLkp7;1ry{4hTjj}5j8Ck9s#_*FpbzMd8fb;hCIr+mu zZ^}e5Z289*hQ%ln1mIEnnO-{H+xj@Df}<{PCKAs7E12?`lKMqn|F z9@{VQG@^KqLGUw*>x5&oq6~PpL17YN!-UTe%bGYA>myx%xSVbs?HG@155UcmsO`)# zkaO)mrXj~e_?>N)Ol?GtXPnMe#ycS)kbuB^Zgt+hDQ!*=^(VHtwG}E*NqVLV@^`DX_`iv{=*{h;b?>ywPok}Z zU=b@>XAJ)s({vD7>TBMU_J!&Nn^e|t6kW z7vVQbB_AwzKVLm~JnthIIcLTmTY|FQcz9x44son_9~1Ogx27JRwm)6!Ar&MrlXOrh zTdSU{t_g?<|C&_VGh@co8$NJ){9H&UvC!RN!=9DnM}Sv1+RQ>1=0cB4@5xkmlm{wMgXC@6aoSLcW=g;&pFuyaZp!EiwEqvLqmY0?}0RYtp>vAU;L z=!x5Ha6^Ax$NnVAKM&y~PSlf4Hg?KegT`z;qss{__vlz>f1W+<;WGwf?u`t@lE^4v= z#0y7`oK?3{SiE8Cd&i;z>#R_hiIr%%;EzAonDg zrSE3<-g4(dh+MdFG@?Lq; zsTgG=k<}I70PgwtWc1UtWG=iEUSw|TdhhD4LrdM#)E;YBb2m|Gx@!XZc9z7{4Z<67 z?;H!wN=6EBDviXS28KBKmVjHw6FE&7?+)L5{kVNhjaR-vP@t z6-xs>rkqxi&a7fmR!wY!m*K}>>1l26#*YZ%R$ou~d$fUuNTXy-fyOCCdVc_I`j;Go z8#%vZXXXn;CVdN!k+dL=or~Zd$(^FGX7r}pLz`|NP=>wBA**i*us}#H=kL>`s}00c5^M9R_0^)SZVMKQ{Ob;5 zdBr9nBV-RN#y?-zmzBjlz?Y)6tQgtmpBg%$_jeQ%uO`9Qv==M~Ws1E&qVfQ2KVN1Z z57h4ZaQWqb-CkOR58P{#nDcOODo%IfWT`Z*mhCGb{QKAMYBXXQh<}oJe?u@D#rdV` zdqng;#YV%%a9``#+h1!Ykc>QSU4^6QJ0I_+!Q~7~`GVi)#vk%oeyL&-x&d%dXl=aS zi8Wp>@hReUmm7J|>+mo)?`L!IJHXfHo(i<_)W`fMCKu+Av0-bz)u;);r(1Y+xj6=t ze*LQs7v;ggq+FH*T16`S+iw>f*yDXgzzZJkOTbKxxPeo40h#_d3Qa{hoYj!1l%0sazN?OIk*cL zwUK;2oOK>wdZ`&=(~RXl3~a$(7s_)*~&bVAETAw;)PQbkv+zla2c#v3ZI5 z)#UZtB=!y-IqlFBPf1#{0JD)HxiJ`&`uJbYRhYe>WzcKCyU)z`7f@00>>`)5d^Pnr zpP9M?hR(G4E6H*aaV!eN7yON)%lHVMhi|IpxAf8)cmzLAwjJ{a*bR=orIC8V_42Q2 zB}nFz4pmoRMkWEG(JR|BwvW6j{28>i&AAcQz;*>rfrkC&`dGADRITgbGT)>Gx2Lyx ziLW<#+xhKy*Lmy8lgF@#LjyfS1Upg(OJcQwyUgJmEI+=H8fZuUB)gtzQ^b3Z?Tdiv zJ8ugXNDHE?6oS(7xQ;NCE)r80mALB4$xQcb$hBQDj|XP0QFF7GtiqM{#mfxhE+zE z&Z$rxylwrtO>00)>dHYoP5#m;r#EYd&|6Ib|Fj%|V7q@QR~50&nLdOnzh-H3%f-#< z&m1$gax*vwdS+}eAdg~@;|n=uF@WHD>5Jbf1KoHzt@&9(UwLNjq}F)p2+2SXi5u1*uaz* zU0W2SdH1$9C)(LflWc9xSSKYg zo?>p&@+d-vFrk)G`}>ENL-+ps*h&Yl>rlotAgPG_^Py7f68JkGCc*BKGSyT1RBx1# zf~s(wT;SK_Rh;2vadE!8g9`crI^TZCk5kjiEfX)jaTz6+kx*rQlb5rv6s@Afl&}&J zDFgS0UK!gR?`md(0eezNju0gd~)W7}t?)>`xS>SDA)c^oM07*naR2a2B@Lp5T zjT;vF>32Jf1V>H@eP6hW{Lj#%wF8>u+mob8O>|RGU+q=|aJ8CrE(n2;AC-b{@f@PLNIKP^#(( zVt#(JDq*ih^({J*B2$doceUy2sffVu>S0}TnB&tgq>oF<<~oMtDTrMsYEX=h&=eOO>2lq|XD>=bDA` zOm&EZ`vBK(zfdapa)!FCoHI>?c$uM0inMfWTJ|Q#zt7HsciQYjVkJ#)A`pTqUA?#eCnJ+^CM%gtDxmMcH$Cgy*+Ggfzj}j!{4UPU1kq~cFh>}qVZt`7zJRSg; z-xJs>}+WOIH1#%fEH0cyJRSrd1kX()}FAzJ2lW+ua@)J=(7Qo4; zrkC3YcKIHXx(=DV+H#ZLU?`$u{GmaK1&)@cOnztp)MX|pin44SglMjPoM`F2lh$wU{6IO@=g`3Ke6P;QU5HUDJ5`#*QHb2`FL;Mb$osp8N|b{Pp|s8~#olvrD<2@IV; zbR2T|X{q(RP`&M&xyjPu~v>42=$+bOzTE)MEuzT3$iIpp=9UEG6*+8<6gPI%l_w2mrRNVX&3d z_P1?2((Uc4z637A@4k-7v=ksp6a4kzP`H61oZ2p2c}Yb49~$_9$?R&Jes0IPe=;lC zUuh&|xcg)_VHk`~eQIizO-$cvMX8&KhE;*e>uq$oEb)t%>VA?)rQy4ME3~{_A#FODqu^)$xK(tu_ z*nL_R^xZ$#)n_C4TNXlODnoB zNS--?n5(r-!|mI3BdwV5F)Nrnuiuek&*Ky)_lQ>sBjY(s`002385;P3XS9Zq&7f>@ z<_^0eYpo4s@;M|;GI=@S-rn`@^04d)Tb$7zvijkz+SdysjXAkoz5mloxBcAnbo|-P zw4+|T3({nA)Br$(R;s$cGo}okhV8=A8 z+L34PSBZWw3>30m9yj2C_z*vYpMhHq;dn>oCi<*H3pD zJ7tPeP-W8zw1=#!Q!<{%;Wbj|h14U}OFo^XLGmZ(nXP}C&vP_{CCOr=l>$~b=Dm1aT4GiW;921*b$22ks`Ly zIS{S|9bpWxbAiCNg|@B!aOMYDs7?o3C4p&IVnR+LUVkvELw65#J ze|j;!hgQT(EaKv)i2CPY6#ACg&o5;4)dyxTylM92t1Jpx8vRQ?{F0fD%fIH$AA-F) zgHt(^iL+LDy@q+irwf0H3Yk_7<>KJqqjdx4T+KX<4i}1YvqGKi&2xx3ZXt`e#zVZ{ zIWHp_m_`60m%~Zibi!sLx|P@OYg-$T_ZzZpQFT8n2k6fenx>dJXEEVNoa<|2ogK%d zIT{KL{J@iPP>YEHsHl{V#cEnX!SI2!60E9sD1>w^^Jo>abO<|_G~2;R(`?_=3LBZW z)v^<6tSEhnC9-;6J88!_Hv(-b014|HUK~tyV--WMPq0vTpKkbMQz9IH#=hQh^+kkF zM0|LAF_zJV0CfQ#lFSKYDea0hIo`SYin~2xbOcSFz0M#bRXkmcj^ajz2ndPdML+6W`oKkxIoLZ? z7ELVY(Gi}TYxejnX74NuT|zBMJnR6(k}rk6F2}ZO7+tQqrTz7Lc}_h3iEluSK8wVG=U$2fN-^1m*Dukz^-`DK-HO0KB>HGL|6u?jXF z>zj(CbLtGQV4*7~RJXAyfT%ETqz&hu!_f$hP2Em>^iqsiwN{w26t6n=mQ7gYRZwe< zyI*hRg_8?xBP7F!t3*wRyqEWG{N(-Dnp&wgbzH@WuynQA@BU?WdkD?Yx37nTA4ffh zG%9&wmDbUI{pamnjU&~{56@zBU{3MfKefNJPiFhyUHuY+lI=#^+%sNb)lo1n+S36+ z4+98As@~BgPF@7a2ime~*5o!|&8<(fCs0wY)=e^C!Nrp}`hll|kup5N*lTUIxPUH@ zi}YRJd?bLhsHscfcT7c@_=kT@nff+7|C&B!h8jZ;RlyVRy^)@$j3H_RJ^32kifwx? zi4AkRk{_Eq)j6O|&OkMaI&^6IT5JLM>Le~fL$Nu)^+`x?N`@L0wD=^}8BBB%K@c&_ z^YrkmfzzKL8a>49wyVs}gR^VdVX$UM3sU3;al#?tUq}<(C6D6Qe;w;}XNA8{SLCn% zw;!=oafA6FR`PZRhk&c7m>euY2-ySb*|do@c;Z zvf7jBwJdSdR?lcA$2qA>M-}OAkF-`dm}cw~{HyJ|YfUwxCZPIo-}xf6QU4Y7(`&inU} z3(^Q0#bB=CU+nPNCGeF%Ly&HZ@^zbn3o9{6q(#SiMNMnf84kztE0QxCyxZPp$SY^b z+kKkMl;yMDceo9PD;%CW!?GFv_RlC~L%A9jpsZz7Sj*730>c@ttpd^zE7q|N^i-wP zM(^E6_zrJk(snY$H~FbVOIj9q3tZNxsR)>F+~xo3`RA98=nVV~Omd^840H|$j`xm8 z&&+)l?EL)Gi%_DGfZOZJst*Al9paoQv z1x=tebCXA|+Fv`?3+%#yNXQ7riaXiOe~S5(g-^cX>O`V0fv-UO{m|uW+*K#o)q?rY z3-BT_3k_}MRD!PQygnx|F;>xAxGHX-4V+6juC0P?bFZ--jP5)oX+O)wihN-Db{m>f zPDj{`Ch2XiEa!U9sH2;)QVAFFtfThhT_&hhlgABvmc4sQqedZW(e-d@pESDc4x065 z`&4C7_Q_w#*3>cp-}~vdsXou1*gD+#-9IevN;x3Hh`d%)C=rG8BRqScq1A?(4@wkP zy-1IvOFFMl9|wHhB~p4MFXg@+K5*d9IQd<{2n?KO9^EN?V7xfylq6J+1V8P&|`oZctUL!@R+&pG1bye^fDfZXIHG3@En#smn2U z>*@BS2x-w!DB$-+ga}2_*$0z+@#QuU%8w@azG%K@qaX_gekk|nE#h++SQW7 zj`=QxKa>WEgt8#-H>T|_->NF7!ot+|n0F1aucD@|W#forD+k!iRk?N#Tz)W&Y7F9w zWOIotzKpK6RJ(bt*?T~5E1~yI=_@aRBbE3%(NIX>JC-GcK~BaGe2*r<-nd6S*e8t& zk^>!4Bz@DwIfKrS%=oE@x))?r+BXZ|v;F$q?rx}6Y`&eIg5IO+O3e<4Le~{aqzD%& zVa9%5+QI*CdxSN!mj<8d{&#^{R@h+b*vWM5%a=1beXs4Vt1s|0L~Uof{&vq(?XPQs z%(hZNq}tccD3t^htF(N)D)Z@(q671>6Vx7Ir)-^K|K2*t9!4x3!00=gPN3+kW9iSRKO15-x|1v=fc&qyY-$kV~}r+Zk51Sj4V`p+|ndH#zB z5(*W&GnhN;Hm#nDmLxje{80P5&--Hg-`+2QUlIW9hRv3>*^-NV?SBjaCz;{DOfXk2R-`~a5 zS%>_TM8X}~qu1X{mE~8M%ArkRGyxWuU(dv8HsZ~EWXo%_x7xx{v+e6cuCYETuh1CT zG>!ty)?*Ja8$YCd(bUK?8g)gQ*#37``#btjkCR5VKj;6_9O}yR{9oQ@19^NNj$g%G zyC<|1PXE0>w0|;*aar1!j?{6oK6jC4q3w8IsNX;N8&T`zUml=C_r*7Us{gCwr|(ck zP}rEQi~wb{Mgo!Ta%n7fCTHcs;H|Bm9C1!Xzo4*ZWTg@z6<19neVH+wlQof zy29&lckN_;UCtJJZ{!^N(WpPTy{&kJ2Jqr)I%g)GfQ~-c`}F@WFERTw+&CO*4siMv z#Hd-_{tg9MYCrt9zkcy)s0x{L2a^K9&OF!b^&l}M_x8|+4 zw_s4h%bozg$|~%X!>sig4Tat3R#B3r7Sg6#=Rfj@%_1)0f%xTDb3SZu=^{q~UWL*S zn8FwN;;92@k+I)5mF_YvS=8iKYBBB^%kX(@N{vm++`{5TiwURuzuG=eoMEOlts@4r=sAmpHQcB09S^^NL)pBx`}}Y7?lPMkVQ!$v1k=x@ zJU+MZALjEoI-q1{1&bPhGAc758m-@g+I21OyT;SGKk|}=jC;B72v0>CYQ>eZxf0I( zn}6zC8_lFc-11Yi(L*%cx1HB=MLDr`jHLF}W6bXPRoi_%`6dkzu@o>kZY838p50M= zsa=Tc$~07&^l7(_HmE2)$s+7C3MTa$QPeK#+t;o;;RMT0)3!o5P6WSvho{2=->ENo zP#xgU&p&UMFIi$UNU)CI-6hxa;o<^@g2KM9b(H}}qmF4ENkxsvf_ETG7Bk`+Y&4#q zL(<=|hi|E#|G7S1PBB=dx_;C9vz!&-WZM&=e zH>Aff6zDDD`Z?0&cN6f`wHp}}8d}!bw-8sPgU`kg^}Vzzyy-lH^t7yv`0F&F0@M5< z#;wiGOsEibcx~xYoAKOpwm+hdLJ4XH-PH@IXKPX_ni~iwa!G2nozi!e4NTo=`N_qs z;@SY7lkn0k_5kkg=AZYN2X<}QiIan71m5~g|Du0$bf5Boyz;MR^D!_*A{mZuzB00V zK)7_offdhEQOSar1%|sn`22n&&A$B=7NQ*GZ5I@LEz)<*Q51Fg3f?nP$I_hSm)~NY zFw9YkfZajOt@(&Oo2{y0ihXnOS#}SLL=I(+Rsr}W0rVCzcsfkJ4#$6V=1e{^i^Ve+NY^Of@sFiEx%tW`V7@7jTyk_vMw*_$d>zRz6RPY`KkR@$gJZQ{Q zkXLUPYe|B_Jr+TpWp4~VWVrIqyNkQOq0kqRlF*M%WX23~-7pfWzyiI*8_99G zaO&B^-m&wC{s~oJ2}X}x3`?jp;O-Jxykk3`ipZlX(9;6^UeHqspAur!#-<{!ujW0f z;9>h&b~!<#5>Q!t>o$7hMcsB)*qA1>Ojc{eqopo^FB!=<1dPnbM$Hf+h;{_N&WY2@ z8EFwR{U3`K*o*;xW4K}a9%lF6f?=(uLJ-|cAKMzx&f?9jSZ3L8%&mljV|zC9o)lTA zU|iR>tzbZNxl4yUZKo&K*-JVMs#Q74SV^bu z6edo;XUQ+E-amx~OLYyXP=szvn>|~YPeg9sN-AmTn%yMy&C+k!%I&AI)A%@4gZ)|b z(?Ey7p;+sqxyS1S(zJDlB-O)I2-2_>pjx5&z4=7Qf_-LB3j8s#O)L}aXERnD zNaVZ*n~{95WwHuxdiF*em$`ySdGjnjemyORwv9$>A-0m{WYO+F9K(t^t&)o&>c%-m z|FN3puh|b-WONu|Y7~Q2(KVyd^t9mx4}jP>TU%dm7Y`X?IRWRiHrCg5b4CSxX?JAE znmTweR+7cMfS0{EzcSi@CH6Oc*V@3e$6c=u6&lcS3TJ@QD{4#k_TvTtqB$p-Qdeq7 zSn~mo6Y-@>^45bU(+sK3fa12Jq+rX-&#=cg?PFgloQ*1V0mE%34OP))TA#IxQZ7ig zk7=#8>G?O>E!DrU3)yUMGnVyraxZ4VJ;_2K^DSX~uuRhHlXNA?# zs2-~Tm{!2~0Rl$HkFjrNPqAbBF0xUXk1`*iU1=}1bBv3XyOCFawg(pfPYmc%l=rQBhdNalE~oz8wV&!pkc=- zLX8X~NYD`5)R2XI*W~!Q(r-k~IUt!Gsnd!XP2$-7WG-?gTgAhTc6K7wr(Xm5WRqbB zbS1!Vg_PS^J=xwa8*le+8)y$#r`v^D+wH4^9&*?H&53pUUg}%}F%FQK>?J(gzEwEZ z{<&g`ZAOIE`Uh!X4y6;Q+BehQmu>B5h2?qngPiepOy9*eChK0>s{*$Y>Gl%n05G5~ z$Z2};=uAmiWTy>TWP?+`VSg-{U=L#56%B!r%CAfL>5$??aho=4sUv0iW9}wG(lpxX zD>LolVIv6Bo}Z)ezpHxi{sGmY?dtR4M5XtVJQg7cK{1z6<_noi4 z8x`~-dnrT>$WksVzX^>9iYI9%KO@- z*%O>NIUqwLEBCiZq^t~)PunSJ`!r9G=y_27&2~%147;*s6gU}WkFd5ngY~-ty+#0S zE7~6~-NSOqZAPC}Ha`1h`|tWQ$t%GQ9K@csMEi62j6$2^m!M0_t$&j~eKT+kV$Kh- z;@(tRYDc7{+KUY__Vl17cI?34W2BP%K?Vi!xcsZ7m)dn3#@f@YmJ-QfZ46Fo(gFp$ z@M;Bq1uwSyyjE=0>h1kVXXnf1GV)mct1=7iQcK=qzLD zK-wYkzJk?uM$xsdU$x@%qaa6nsjC_gthKdjo^vhUR(F_vcj=eyDMTK{N7Bs9yMyZH zPKA$3qHQ+O<{uJ55Dx=efYvD zRN9^C0|(hn>q}g`oOF8Tu(S=X(9JCc79YFbiQzA9_>LX92KPT+U<#g?T6wSOtee3D zR#l=;nk!2?G?NNeFK-3Bx-MByejWOLgJSRKqJ9KE)rlsOeg@n?okxxFJfPRUS|<+p zA2-rSt|KzH*h>*=K$R*EyA>Hc+j3K1wo3+#w!0B|T4)!I(So9?U*Bb{RG1J=N)JtJ zv3FraN35P?zpePWeRJr4EhG6YM%ql;iZ0_66@J6<@J^y_2`lI=X3^RTa1vK+{SbLO zk%|{M=5Cv23u|DPa0TgMGKN_D?0s*n0V(>tn}R$ zKfK?I8!iL%6N#$aWch$o0i|^K6&I=sew9W0=@bn#*1kE<+tt}4>}n$4b#yCM8|qLX0L88x zf%Dlg+WLxZ{V;N#YTp@}XxS-qXahos!PP^HK59YIp<`%6DRrsV7HRjyBK_u;)+w8N zh|Pn;+k!3U+s{i7w~4qnnFt`#Hg;!H>k{UlmxKQ+%Fn@heeJkD>|nQJ2mbZwUlrk) zchCf9$@Vkt$h8w}7+kwAqk%L6ejq7jrpgLMItn1{uxEhSJE^hNKX*kg&A~Q9`jvqM+a5dS7yzSEJB8S+ThW+f8 zk^|h$MGTL=`)N3^N6e5L{E7{AudWI7nGClt1NzG{D(v|FPrHZYZ{kH-4)tW@b6%W) zs0YNz34X%vz^TA7k3kua*{_h@i4P~_K?f=V615>k!S(^pNl8(03=HdY-^5wN-V?hklwdTXWC8L$D6s(!lz z_lVedL{t*oQ1yAcY30>6qj-O20PM2f+F+BC)9kQOFkVPvPIu*dJ=blPCY7eRejiN4 zr;Z(G|0;dmmJsH7Q}wYnw|oR8iM2d>yhNOC^(vL7o22yPshkfR@e#E!Ca>v%`1po){Bu!g4NvcLU8YUzZ+nI%L z*fSUgm!gUuhCDCPCS3dKd>QSZ2hh`rWq;|m{&sK0iFR?`0d`34LIMW7=O(c#jy3{` zku_ahOb1liaF7*OkF$3x2HQW&`?+xQlM%PF8FFS-)Y~ol?`K2%^>g?7oz4B|#=mX@ zUug^Y>SZp5NiuP6SZ?=5*?x2YG%tb4XgA8x<6EU3Rp^oL5J~L|1D*&pvZovFUZUO* zEVOF^C6+dO(h-BHK-4M=mv=`d2^t)#Kp4$4TkqsNbT*LpIk zbr15dN5J=omLd85?9Zcy+hvOu+dbQgtd7N=(&W_aA#Sg2-&Ikk=PzRyMtpJDS);om zj#h=WST3Nz&4Sh{ubpWRuK%1}w7Jk0jGhx{Szlc6tL@|bsZk53v$!2hE{`W#6DL|xzy zrwdn};Pc@|tKfS&eHZY3+3NTS6RaPhzUE=bTGJBm^zq^ZyOShirc;q~F^t`Si|f=p zv^ZocT~Bw&ljUO_DD>RC%@^ADm!4`Dl@7LVq*dFfjQ?-%OyH}k?mYg71VSJL2#^>8 z09T5w|ibR~?5bQ&Y?An!yX*S;zR#!e6PH zn91)g(EEtAF@Ipu%#!qn&lCYTI-Ds&m}e`j%vrM5oEFmOz$o(`{vVA}P>BY$$-{=Z z`k*@6lMV>*snD;sk+R+S=IAlDW@oL=y&?ib+q7SM8tUI=Q89S0%k*Kcym>Cqn{TCr%HG=i6-iinIC3sve1jbzkXOe&Gw?4bc+&5eLEc7PeosbEkb>*1;2o4t321>^+8vE(OlVSJ*-l3@X{pL_l@4~rFPz+vsl|ZMVBznt%FutcCWw5 zI7)Wj3DV$!6`{i4N$1eAE6@H~cAH(k@>082fsZCg1B}din~bwg>%C3k#!EHX8luoC zAnj~^(ywD`;U!GTy^J-jOuuyuCbao8d8_TE`gEJR1_{gEvR*x3*dJF=uz#jVqxhs8 z3_gnm6rZ2-wB6UY(gp1WTPHi;e!&2I%qip$zx>a~FB0xy4_1$tl`#HXQ5We7UGI2I zJ!?;*o_42^@^}2EOhezVt+kAhCav9tMk#=Sz*_L_5Q#H&pj;evlWjYmBMVZFU3&<0 zBrL98m)2Zt-z~b?F>5PDTf#tbOi`r+bVV;q7n7@eIJLwpd;g~TsonocqIX<`0@0UcSp%<^nkgb!(?yD8Y*!6{T0{OZCzN^B2v#_1$GEOC)9V4K^+B}$je1Sjm%gXqVKuOl1nt9{X5`AOed?61t`MYkZKhG)~X3FS`Xa%x+ zaj7jZ*|!w_bG(U~pVRXtyRh#TtIz_UEo;kXg*cF}|D^a{TfP0$Dqr$-A%uYTk1g*& zv9(8%v}1e!*}gNV$cl7L;yam9axcaBV$=cp5?KdKkbT$}r%Z9!-kZ(Dcr~F%?E-vi zU>aDNBZT$uQWUEq1(zk^{oYXnK{=2($c`HYn78JM#L0lf>FGpuuEHo^Xam7yUF87N zMYbJltLEB6tG;aKuRBo=4PBi53A80l6a$SEp+;oRtlpK@H|@>PO!6er6aZzH6v@w3 z7Q95V$w_2rjf#44^HlrZ>Wj6w2dEG5G5u5=qmdZ!w}$u7EKlgO&W4DeDG}nBrC%2O z&D(NqPSM%+T7vHf6w@cD=$uf{Z#cWC&#gn0#<8yiv+h z;EU8=Oz#TOSNj1U01t84)1^(jS`A#Js8$5>?5M;vW8Jw#H0w_!#hE(b5r>Td?0^i} z9}t4cLoN?3KiK|SdYhtooo9FN7+_}#>k<10CJV6UZRE~GZswm;`>b~(<7nE1&6ybo z0lMsymQ`GB?^k?5m=uF*5CEkonuI&mhNk9`wp7Ps{zxZ5&f9X8yN9SYpvMzODNcH$ z?Abjw%7w7m3e`twYCdO6fwEx?&*|3nZ0wBuM{-Z1z* zm!UjF@+97}{mb=tD1!*dz|qxGR9$x3Y3`AyE_}ZB{B{U*qRnLs!r}L8XPm(nAk4YT zF(&OD2;Rp4ZMnATPxffAf6jYDl9=WI3p!^9z;=>u_JhGod9M#*^-InyimZ_F&od2>qn3eXP&FCfmhB8Bmvj_UB-#D8* zSl!p=7M*3!uD{b7TgC`sU`yZVc1)i?{MV6D;yF*sdfa}Wv(6pqi57it>EXGPyQT~< z`z`_gl_H^mD}X*StW9#I?wh+K+UZL4ThK`oH$8CNarVBpC<4s3H-RfT`4Fb__PiCA zlkt+%q(%!}0*&gd`%-tb((;!U&UOly)3vo@HjB87WfIvh7)8zK5$ zD(Qq%h^!Hiv5<N!6!ZI|ACD z08`;)TVO}OTfzd?^o6;v*q21|ydioY;lo}uL$v*y3IhA!*s(U__~YHn zdt04&S+R14&ws3Zai0PBtV-;ouMs1XuT{E9j4oT&fer)!grW*5&QJSq5{dJhkfKVc z#+Ax&KucrICwmmk4V2bZU1Hxa`if}zaqf@_6edJ=AxdXthpB_fS|XsoS`I8z`%7u1 z6fB~|0iOsD6uxEW`S!eAAeZT=`lj8-hLC+Sq)sqebuF@B)MAJHnxaK}cU6D;VEbHG zo)c9jNIoHk^fdbk8C%rGU5>;fo{dKUi~&yEIT~wd|A%TbZDzr__Co0$a`7A|$^7OMl>2KMMj^x?nJn4Md?xiHYfFA@S74q|dYPjU&lNEstKJCB^(PC8{ z2?w$A#(m~jWuD>~UVp*~^0lowU|K%_deO^boIagiZ=Z4`4qGoy2>}BQ&?BPsSiZVp ziv51=w`}Hzv+dsMEEk}3P>7aisYL56Z6@$sy|C4JeYVK+==Bh`uZ`Q^@C-qe2!#f( z9qAToy@0l&Q5J-%z?wpl zThxw$Jt}O77C9I`d@L9PK1jA;_GgH^>a80Wm5#Ohi@p#@enegdcJ%`UlR+Q>`hb)N zY7mm=cR8i@fs2iqJl3bDPzcP^GLbmXOrLIJ28mo$qHP_W!u#LuvOU(Ppo>m9#U7Ai z>ooy?COm*vZ8C|5$sb2vUa9tl>=KbUFT2Abz}qBu^o*n&Y~hT|(rs7U9feoO5NeoX zgo(w@Br=%{T(rTXMaZDv)#A#Rx_nCi4=Gx0B~*sUf&>#7)d7V9X)WH7r^@!&^V+4# z>Ia7^4n%%&ixbu*(YGzlh(vMn!B(YWQggCf!GXy^v|hO)BEEvLZ1YEdU;OnOLm<|p4a3X z!TZA72`AtK66bA61@9NB4E&Jb9X%PHaA65#>`=g`J}28(WAV+sS|raDg>Nnq$%EP% z`Yn;f;A8haPr&o9eJgDGz*mDAL5dTy6KC+*f~y+NuqW5vV-r?Qw_nMkkIBl`yEws6 zTP)Ck03i>K?spthY{N7EH&|TKXeO6bl18$qYPS7AQX`_ukye1U)fsn6;65~R^wJ&U zs&dL3X4rDk_naQXkbwoUL?u19^#p5f9-=a9^en!{)x8w@3PvO-C;WcoHDiXn2k|jH zhNJz^d{rb*nj~9Dc{nG5xr~>9i@t)7MdAxj z4#7L=^c9n<{hz_v)<#yGk;dY{ES3G~1ETTNd>lkGLOq`~8Pv#Cg_n1EftAMyL z2}*L95E#v_T@@s$rH{Q>KF+pi_vo*-z(j6r3RL{$b1Ngbi2bd8ZEYB2PwTu`$TZr? z2P;J!eD0Q8-Y3M^3~BdGh1S!1L6{z+IEq6dfNIt_M> zRX3dOX!!}Nrr9GQERR-~Ng^cz^w^0*LO_;WcFYRJ{M6Azgv3Y!+au|47NM$e!Pd{) z?TQ6?hA?EU+L117UD()D*!vvUAle@*0g_!1&uYd$tj)6)VN67gkS2^6aVH4Nf;jU1 z9mlyrN^$4SGGd9PJ?byzfcXKeL=s~O#-|-;Y9~8Y_Dt6*-p)-0m&%&;I#&ePAMT)K zw`g)T_ToX1JhiP-o_O_u5SNO?`K3tXGbPC(IeVNquoAD_SkL3ZNUV2bKJz3GnXZs* z{~Ho>&abMnUg~69gU)>?PZ!p_Q&@O*?$d6930uN>N(|~U(ek$!e#Sn#NwymTE*LR1 zuh8;|bcQ;hxQWiSM6~E%27f5V?6(eE$!<_j5>ME|VE4XG8sUdGj+Hg1wr0JKp8!nc zD~)MZ(=2VP>e}O?KE@~;Jpfd(-mR7xlwU%o=!e(c9^~ZYs^brpgKXQ*vy?#qEM`Ae zg0Xg@UtyEw)kB@rxVMI++(eS=lQOcKA_ySRD`#3wDn8vFExF$X4eOFxul{e;A=*Pj zB+t8g1KX$IplA9KnILiciKKa5eBfQfhuc-?fRv#34<@#!jznOEdw77hm$btI zE*LQn9Pt|I^Rc)VNH)$X+&EW|*skFp5>3SPM10!VJjxzgJHuWOX>z7WGeoBBSXeD? zQrpUQO4Y84yShcyHmJEn?lc=!jZ zpb!}JNI(PVGX)o~$^dPw==y5~^zenw7Uv*hdf(T`_W1i9_UnNky6xVx&lU}=@N=T~ z;o!rWT?Q45hByDi$CNmiKN_)Hp{2p{Ul*4D+~#36LiFZYqBpVSW)gTWnFK)27pA{g zO!F-x{>vRz1c?(p?o0HN-HCpj;>PW^St@2tefL@AkPG`YBNO2a(7Uvd)2$?ow~cs85gC>U!{DPEC}`r9 zh1Dg7Vvt=}h5lyEO%CJXJ%nuBPi$*B>eEKi`AyBoX*c0;ini!{7O*tD>d>0H5%z)> z=0sVH;&%|dSU(d>arx$m&i{Uy!ml!y$i+TL#;{))79Yi-_! zo9wEB3++w?B|T991TF7vY!Z};w+>> zdBzC_06p)$Rb6ermAKn8vmii^AUn2|(MwAfhN72}z+JE0f@!%xQl1y|&V}>m+o?LK z4sq5-ZQrj9U9RhTd#K<+otBYfgM>*5T?cIoEl)a-mC8GOSX_V1U1Q_2o^X<)t_n}o zHtwT7wr5o4VEJ;Fb?LTi?8l`O?QtoSrb&VWzz0epU4#;EazBsVN&Tv78Yuf8V3fQ2 zC!$MZ5!uq5YaiAPP)60NLU6JUdL6vOb%XAWlUQ@H0Kc?;qzluB2}AS*!yhR8N~BT# zi*}MzqUTMhJ_i>EQC{CxFAfBb+A1sV{cuSS!2kS=8TL+7qny;c+HJjS6mP$q{fi>> z0`vgYFm1~KJjxU%Jsb$)Ru;;jxo}MILT$G1uYoU28$ZBqmV-U}8~v~pdgF3s$WUrDk?0rccI3p{T=n{iF99R^DNex(6J=Y#9 zJHzgm)AlJMxnNv_32wW604-P>>|H1Fc8o7^|k&eB#~ zDJcLz!yvXNG09-gVqv;VWs7q{pQR3Z0-8D!p9VFdNOEd;fL`g%%{SUL>nGT1kx5ud z(k6DHX!zB=5c;BYq#mSVS!%Y38Fqj#dH%lr0%!v<>gI+Vdr^Q-JzjC;3J87i9wqv^ zn-ukc8({nZ_=5%H-*NuJGH4^F>6_I9-P@cr$fEUS_`Dtc3&Oz^q?eQth(71n)Y&7G zC)*XG>;3#=$$PlcVXN77UJMOR2H!mIJp1kmV{CCly?|a4Z4FkqsPjMv2OvS#&k-`` zW>#9iv;_|Pc}6m_TqjbLHWuyh&gSv<^VQ$6GuNIXlU?mXBE2wePE=9Gz(S&BiQHM! zoYrco8N%1CRXeBh5LRAZBh9CPk~T-@1_DJE&q<4`a&-jKAZM)!>DE?ap@%Q?;O(|@ zcg%g}FJ1FUUGuAI>@m5eUMnP*;brxQ5$NgRVFP?uxwbpFc?bNG5k1+ZNUgao#X)JP~L42C40qb&(`1HMCgB>)#K( z*x^6SDbgESg!INSvWJeDV$XBw#I1^eP$YGfg!eyH8HLoDja*DlvaMB?Qx>Mof07U)OJpvB`{nY|`KhNy+M?yLxTH$Fv2E>Uv^YbPC+G#6f-q1%LIHY7Ji~MY~D1inE+x6`x zi%wULw3qvA{Q6Jk3Mr{utfBFEdu;uAHcy(B496NhTTl8JsYJ1TG4IjsF7~dbMnBM%&LyK4*8z!V)V)fPUYc!Q07vQ;TDV z1%UP_$H8@bYj}~bxaU&CkoE&?m{}u^V6*7Vg?~`w%3o0dT zF$QG0X^K6h_t-#v{XSoNf5GyME`eR=%U5=wkkwmr=Cn$0u)jH+jBK?29Wj7U<2=L5 zHEQe!Kk*5>AurG7i}cy4!RvJZqz~8=tzs&oKR4raIY7Mt9-ztn#TDn-*A-<9vj}zx zau&t0#x&*uL zM?$G22aAt?UGCEw^DXN_ivUb7o-n^9B<+PIshz97n?QNRn1cN=%ql*8S1uN z{JL}%y)Q^wTqPxwuqbx=k(yZAbs&j0cpxoT8)|5SQXp00srDlQIx%#L6hnvb*wh^_ zu>oidm-AG-j^GblMoC;b(e=am*6#Omu+xp~y}~{tk?t}rHhg&Fjo*I7MBLzgBsY*Y z2qP9NeB=)lM)Eh>sX3+vzS><12s4E#fyC) zUhHLg+TC*QxjG+>h!;W0%;AxmjyQ}TK2Tl~z(SZTZ1Utq7umPui2O=rrNcIfFuraI zH2&3?iRj;hXCWVbEyrguDoHWEErQ9 z6W-dyIE^45pIia|zboL>mRcep@6fnpN4yES6No(XvlrM6vVL8px(M4sO0>T4yzpG? zI)BqVd^tPYJ`g>B?nx(EHz6d)#A?2nvm-ej(SXmuu~oWlQ`_lr3Qu^4=*M5nz-fuJ zz4Nra61OLvfmYsND)$aI_fY*KB7ChTOS1HtAOz0(>vP>97n~WDXd5UO>CPzl2iXoiS(YzrQyuq{vPHlzL$}t% z?kS((U45)?kA?P);ji0hS;4+8$rZby-`!#@0RN1!Mn1nlPT@<0tKiYO5_EaFw1jF@BqM@97It zW0d6hNI+KC$e+^z9bls!KtJ`;(9WxpI$uDr+s`mBcVME}Tw(ljnNCzR9_#9bSa6XN zv=c3@$#M0QFLLq5YX;^AXLfJ4+a!&8q~vP?e%v&-g)l$;3_9f_Cv$w~BSV(ia4kd* z*TAd-=Nxz&a`OpKj3+Vb@rx~&m~x?z&9&mamS23a-6kY7P?9%4=0_?$AKo8-{gD9t z*2V(-A^LHmNS=qp_&z6tr?H|n2{~77Qzq;VbUBHVe!jP;8{bN@nMB)wQdG_eq8w23ixv~V`;zJ@% z5Kpr-ZAp(x?scz8=-r@DJ!#e^6VO= zQ!}vfZ_+~8qx_^SVYS!9K%SL8z>dk#L2-R)jKEIGqwGk88JJ=!ALAe zF04ASeXLJ!bwfE^!sPhbV+SJq@HbnMG&ord#WWp5fOlX6ph!VZdF8Y>8%2MsB z-w}`XBQdbVvg|HI1Hdy2M=}Ge=Czrk0)9sUJ+*dZS-uyP$%nz`7sIECqBG}e5%kq0 zJ-KnCtyAVPS^&i9$1J(G=-Q>4*oOLnHcQ9Yq<1fJ$6;cSwyEwkdvZsP4abZ&DX{Y` zivNog1i&9Dyqe$t?`pTyY9cqvYA4&x~yGFjSKg-XzONHtCi>x7iRI$8keCP{A@sUkn8?cVo402S=2u;*99TN8Y6)Wti za(PV&_$TSJr%Q^RC7^g*m~CjuWp?`r+101L<4B*u>Dz3mJiYJ%fc8t4&Q5#)75hhY zb$!cd%jmwuRkW@?IPd^{1DHEmp!aptZonEoWrk?}=S9LiRXoY=${cNTvkPr-Pep<5 zzDn4-SQuU7;s!2wyRLbXFn5X&M5?`B+n@ko&302>uAL!y{4B*lg^nkAiOok9%Lly; zzPpHQUi$Qw-i-8S|Qr>L-VKLHaL>A8@oe8e_vXdmm}>lM3TV4)%`pYEat0HoO1bPN~_fXza3QhD*G@)Ir#B?K|CkK)wBWFHg@L-!$ zT58WOUv7UWE0u}PcDrYjXxaKp?5cs&Y+Ud4_T#K_yQLyq4%00mpD15y`+fmLXm{*z zFcd4Q%d+!zv!*4--cWEXd}zr7EOr!#Q4WiDy9x#S&yiU(amQ$$Jbbvc1ZHp)Q$bpQ3v?+&@sRI^%KZFBtY;0h~Yk?9iVXY zCR@06tv$GYqy4#D%w9%+`-<$u^0m7+iV5zfodL6A4*-GuIJ%(?kdi7pM zEx<(Dd^qwPH8g&_!E=j1m@Hh$QZGO#kO*|e#xncM`VIESa`6JYCD#!qJTbMKi|a_a z&3X^HHW(SeBKcpg!Hn?|?_!Jdcaa=ZL{~p|;uH36%Et}i7ubm}J*I7D2aF~GI)9=da$V18jVSHTDQHk-R zO`h8YG_foI&j&F16Qu*-GpDZB?$A!~e%S_lNjt&YVvd(dDF#zFNcjd!u8juMg9d=i zHMBbl9unWJfT??a=W!49g~SD*#AkM0-Dnqm0s0=<6yM=k)|C}1mvVT{5 z9Bg+F*l2}1AnyB;sK9^{i_!x=t-|`0g%-4MFZ~aI*XjfC7YV?dgw;)-3^Am$1=yzx zz{d<6XruHyKw`)&G5H?YX_u4G=(mgd;oHUik6Zd!1HPYZPX;**Er5zlTLtu`S^&k` z5mx8}`S7T81lh`42G*3VkV{$&eRNOzgj*Ej`Cp5|FEC1m$;CP490gd~CPT3|C2t=j ztnXs~1f{rzSS4UyrgAe?UUdk#-DB-ML-j#J{aHDEj1>tpQ6$XZtSslhfHKdEbVJ1j zybg<2WkoJ>pXcND+X?t#Gw!gf0EAx${sNT9Wxyh-k#=~4bOW5ow^@r~rGjFSmTcZE zoBLX)?xzgSb1GL}w@bJj{!34B{-$u52!v|$4?)Y8EmCEQNR=vK^(i`8=6D%~)oUS) z7JWWU*NwW)5zs@vL?+ruYVC)v!?C`5_%Z+L1pF8P-~os%T!%Bp(O!c*YLHxPeBvUn&S+EWW}6T`>Or&fnN0&_dh;BLJ&a_kj6k%Qc@a3L`9J9(LFZ0QxPyoN$Exy8@-L5pdbyxMr?FS zOQ-&)KF|02{JsxkCy0Gwzz_C z!no9z4-Xy^zqqK#`F^-F=Q&70>5P(+p8O?aD$X~rhZB_0CXCwJ@gC)7igT(L<%a_1 z{J1B&PTc0xgnvkQ%?AntKI1CRJb$816wDh47yL5uhAA`V^YtC#Gci-q0A~g%Rs z7l^YWWPb3kL*zj>^}0Wmf0y`fsubJOZB7z=Up}p?-P~5e{|vx5osV{&Sbp(^Z-Yb) z@tr`b@(S9EXM!Ix%xK@j(#}}jLc|Z>SN2t0ApyMWusEwl6hqf$J72D4&MHClG132g zG|e})mt({Byyrj4&_3XmSQA4>Dp(j?jyO* zZ%tf0S|VcM{EmYn=JI)WZS|2$5hEWg&edGwJDx3bewo18h@N@4@@Zc!^=k<9iw158d0*@mMCQ77Cq#ps3i1{b+_uT$J(lUD3DX#CZCX78TEN z9$rvw^(niu{ABn=@Scj z(R97zytIwB3(OtiYDqq^6hmFH0*Cue!DHlRqlBG3%%X73Po!PEl2h3R1AEm)dRC42 zg3_LL9Ul2V*l{gz^~~jc+cpughr&c_)HgvdkjsVyRejVo4=>*uzO`}{`&^XxhUZ04 z^Jw{ug>>UZb`{;`VaM2u5GKL%PF<}P*oukGEjb(8NFmzCncdA{{1*B1C3+<#v<&&e!xdD9> z0Rvwf!f+rNK%3OaRr3t(@HbM#SpXlD@L(`QA4#hqH^_{}IGB8cRDqNAe#jX?I$arR zD+R0@nz-!JrQoY&?2csCX5_=v#UF^ADMX$#I8&yPBq?yC&aX9B_mi6hD{P!Uca7rS zJv$0E4aKSpBp=U}KVZEe{*m#l!qwO_*Uvsu+J8x55X`ImI>sXJ+(_skXVcZT7_HAr zc~mu#+gDFMgJ$VoXKQOSVeV7+x4*x(^olIEfAO3MefNW{e)>hjs!Oo@d%4t$x3-0R z*;W-yvlK6*t?rN&guJtiN)~5`;V2l;+v9I&rcKX^JSY1QG5Lhz`bRp=vu+fmFD^ElG;1^) zpu7$#)?ePg8e(_fJ=jn9S+ZK%Q)5NES_wDeV%^K=mx|XfK8mz@;K~&mr=Mr6No3Ds zFZcC&QR<-bp?o42C=S*hID20xvp&N3-ng=?!rBcvE}G7ppD%yD+xeo?*=oMMByQx| z0I!=;!Bd;$oQHREP?|ZnzQ*UrYd&V136ZF)D5dHrf5fSrR2f4RKl7O{ktYch zvz+L6OW>Ll=lU%P+8+sgJ_k4ZmJs%U$ko`09A*ddPlg;F~F=G4fDCT>@D1@F3VV zd^79y+t;wiB^|~It_d@@WzI#If2Odq62jg&e+MEctJ;?~De+9oeCI{&*)h6tsG9bU z`dl$XF&1i~caqnty`|Hsj?2Qn_cUeG6W7TsmQ`-JcT#eQzCZVhpKgSXikm&fTbTqS zhXpxCL%0|dok&%y%1wTM))r+#s}k5(6+&=+tE z#~E};x3CWO_nqy#@O97Smn zI%$6uC;miM?f{yfZe1|P-dU&nSXV)}vm^y(Vw7rF3G0NFj`TSmJ2K!zM(Qg>E9XXa zhsP^&aiOEIDp2K-#k!e5RcYnASD)8I*Wr2R0gaJ6%`TBMq}i z0}Hq(?~D!$PJNd0Yz3Wy{=gZY6{=wSyy%0*2kQ?sicb_@TG&yP-8ue7ceBt8weXis0mx#@pN#zA+m@x52SN&j-rdh6x3mlmTI zbC!i|*pH3TTd#PcmS1JEHVJ-reeO#vkbNsQ{&Ffx+{G?sy{dcQumGnjkQ`_k)*n$L z%-^G(`A%YMpZCC^#2`G5;*ravqqnk^%?1f2*|X?baC?ZO(=NjO2j9G` zs*CC^HJ`+#l-fJha@{hp>)_ypZl0Nj$21QoV!z8?lg_Brv5 z%y%$RzqJ+qXYaD)`{Gv98YKMGFZ1G4LuR`^+jr=MDW`kJmM?N^IAs`__>6~3l)Ihp z)k*8j#L4!$k1zQ=-8$I}dKcYm+v{YMRcZG1`FLmsl^5SV1}*^yqY|X|r|Cwn?<&Pf znu#{NCjsx~DyFTSlG^y3OtNb%+FvWn9sJNX;?(2hMb&(TQPGSJrC_M!Ic&d-De@}KxvfjdT{Ja(6FW9f#rh9-t58?$Tm%kMVr_qX;%Ql}=T zQi?Z>NrSdNUBta*GrDPX-^ll|;^S1rk`u6L$IZZSWXH91^AOC8({=J|O0R6FYtGGq zgwIFiuw{B~dXA6IH9@n#lvP-XyLgSSar;^9rTzHyEh(j8$?wf>V9~VRj<&LHW|7PL zqLIRKCm^38Px0!6TtLtQQ6`D1$Gk_~64Q}8G1^89wH4Dv2A zW2~qCWJzs2eX34n?ZO)UxE{)MQ+`Haj^jqq;NI{a>-x@DaM0zQjkRmLxs1_n>_KZr z-(KwI%@*wrq}XD64G&Kar81xTjqlytu<*{BeELZa*&q_=Gb<3?G)g{0eq?giG_u}g z>%poj#t4T5D_&5f8Mkg=2{heTSXJCnZi`-!`xM|SDZL>4)$J=|oItl}NYgk=J2TUT zvKPGV8h{XL)kj2=9`t~!Gv1!Tdv{-_ZGY#waNpN9o^vC!Y&+`41wTNsG~lHHu{?!z zt~S~RaED&@Q`@>7P4MV&1X82@QF(b{YfiJ#xv7@VpIKA^54!>W7osB0IdL!@RFJ=I zpq2+Aw#T^{u1e3WSJCG7G$u_dA27yAg8A`G+5?0@;jHsR12+JGf$QggqDPw7Hvj;l zOnYs8cYW0-l9oPeFZuWP+_!eKbhUSOw|9bY z{`_8Z3nveEnX6ZS4)j0&e$Ug|+x~w?g1G%_S%d`&{5&IYhhI?Of4-Y=tMt#KlIr%} z){gr3?ZMU%H^LaQLgIHtq<`J;U#I?e$p5(2;D2wuBPcHPpSS+Usej!nE%0**|FNXs z^7?g@ATU`Nr<=cD3Gd0Dht$~kGywqe zfJgTgw7rQ|#>j)&l}>(qTTj3P->N)}I-^;nnV22c3ZwXy=rw7r;d zgg3@y+a8-1#*a#>aHxSs-;LbJEsd~Pts6KlH8Pslf4n!kx|O(=kxRiD3?TlCC$s~P zI+spDBcP)Tg?LLA8dN+U4p;y)9%5#gf}yrmem6ds;oO z>JPtif1zY5{LI@UJ(cS$P&h|bW;|HYFo2~m>4YOA`jzSy{u zA-dvCTs|w70_6K+-tpGXjO9zYN(H?1JAJz5?w*fi0jYqsZhJikp~|nHzFncu$j`i) z8y!F0rS90{a_K?5+YUbd&OyM=N?>M2iEX%=(_cvAr|8O3C}yAJc-jtHXBG=f-8Jet zXrZ@@`_?}w2yuK8C?@QQ&ZtIR_Y)MOTZX-08QeY+XPRv3d3?q>?pn{<1p6bJ@ulqj zSI;|kK`Sax$()3bTy38)y_JeT(bvdbS-boEueOJ9aS4LhC#QHy>Avb0;iRIek&8o4 zxg|BFQ9Y&}DI8e6WEuD%HaTpoY5ON5J`nb3cxKzja23-lbILf?>FyM4y!QtuNc zC+U|g8R9$f1%mzNMO%e7T5%^S1MdK9PR}cENIo?Nt=Ky(j2V1Gbh#B~4pDbE*~57k zEZ@z19snglH|M`b)c)lr1onc9g(pU(6Q=a}YldM;B`370Wm%E}bQ%3cU z^FA?7M-`?Gu-*QaJZ5T`+tCw?rL+Fqsi9M@sI%&JGkZyYOyTx==Mh!n>U1XXGM2&X zvBt)*2VG}zZSzW_h%IyJ9560J+~06V14#@YN?P;9P$^r4IDdMTqV$xG6tNXAGz8pF zW{+R3O`lNpMV(zQTNL`YTC^Q5FAX-Fr})B5Pn`Ho9U=i_ICRs%R2-Hm z;G2DRo|JRKJ#`l)Ss!XVE24`(s2M1`F6%9$qd!y824`NWRXaS^P)~E=geo|XPJ(o`n$+e4k<7Nc9e)V|wDMUCXEd7&=RC)) zwYoJ6^j?QroNVQ5udnd(^Rl&yE>J6$!O zxdpGaBALs6(=>pth$9V7)KKN!*2iW z&dPHUzY=ud0;0q;Vlec1G7qM(Rlzpyf>@zyQ!P>U8eT{$`^TN0Wz)K^C5zHZKn6<3 zeXJ7)nOZLMxc#<8@p(BUEn1aT#pIFqw^xQrPvb~mEwGyl-7=1kQngQEj*5KaXZvtM zb@f_Y>+rMC1od}8405Pn|x%5Z!jM;(+m$=|r4f7xnS zAqPGL?z`zyfAc-afxgqBty;M4Tr-c0~HlY3)S6} z3vaw)PIv>yS9}BBe&qA;jk@x8z7jwz!ygloRFIifw&}R({c6SLDg~6!(p-Nif$835 zZfX@u%hx@i!!IYr#SR0HJd(>X3vjxCZOPXh6j3$Bfh>O0`U>iu)ieUVr5YZnvy-)r zIc@v&$rh!rkE5jF8SFX^ZRu}D(q7XV?8jF=iafbQ10SN~KHZ7>N<8Shg{bzxq z>vuGi+jK-2N`0{qQn1BPCPrZHFGU}WcHoR*4qSCG=6^Y=BeU-9ODEUNtm~7;E-Qy6Eir7ebk*LSp;Xhj=_kUTozvuUg}KG?JJ~S^qr|v!96(8fGvn( zxBQ+~8>qLGVEp!Hag^aX=Z`a}!sF6EHW!v7Ld6uyi$?m*NswSZ9xHFf!j-B|cSiy{ zsjWLzZ+uSHSpGbDX!s*<<=Wrw21N-GF+E>O3JMNC)F1hBW4$Zrsfqt8pU+{a`0Oi2 z+s?Q1w~JsL79=$~7#khqIt1iO3o{kY*L+;Rh75S(53w*7lVSlu>7M}hUbZ6{doEG+ zlhGT?aS8BZ`A5>joN)QDY6C;PMsD&zXG;mkiFE5_)z$~l!Ne6Db+Gc^QJkOViBZeq zcFmgGp3?n@X%-zXd9~a`3h52TTv!;pz#0{5SN(LTV}+h=YYn)PJaJ=DQLhmU0^agq=yS>A*%bjEtNV- zSMWEdmO|}U`|4R8k7K@aJLCatIi1umpK)$z{oui17+;^IFV&e$@o|lbn^-Hbm ztCh-bU)Om?nzKE1*&Zy|b%gH8n2-jZjea(je?Kl1R1R2}p5RT#~o zh1*!hwK4L&Z2V=$83NMj6SCSQc7;R=)X?u3Eaw^v}8t%1$TiAyfErdiSS8LgiGaPGd$Z87 zSLkmj#ypf)J@QLO{_2S=M&4$vstZ(-7huT3m%6ii?_iW3+0l1l`H=_g?Br;^18^TJ zL-r}u)3oZtqHk~GyrQzNQ~@=N_$L|s%HHsBIA-zNy3Es-yc&ueTy^1a&A zbrEs#&M)~YN*qQ;M)@#UcSa5Zp}VxSl$V{Y5Jt^n!{K*`pWANR@6gCO|Cci_DIzW! z8DM49dURAJ245*F4bWp&j*3fB*!f}~QmNpJAk3J&@XbKjGn{uLR$8Ui>V$IY4juX= zWXyv*3h1`ffowN9NpNeiEC8mGIWu-8Hl1WGkf8YZ_$tgk5VJI5Vqjztkb^^nqI0M( z9|76KVxU*_si)v|YqgrDPG7nL%I-AE%Fkc=OAp<*PF!>_z?xh9Qw8)q7mIEL<3!XP zz;p!GQCWBO&RgvY&^;AJ&K_XhKY^uYL`^ga(} z8JZTPA*5r}FtwW!<>o6LT<1J>@10yw<2fdwk8syz!M8(`Ny|$p9^H}{job&1w6wJP zt#_@6W|kkR9^O06s>~*-s*u$Ww>lW?!OJ34)XCA_pe3u%lVn9j{ClHPc|M<94Mx7$ zFy4+SHe`}^e|he9T|mu3_Mg;Foj0b-iDBp_@GUYxH$V?Ug1XlB7z_+CAR2o5#h2h_ zjvQJU2=*8+_9B&H()a7IS@v)l7}M58iCW7mS2@QsOEcl{9icetL268gZh(^Op)r%I z71o_Aj}f&?;3bqL;|1w{L5Pu2>S9M#WMrh+%T!GmPAQ@k_rm>DFN6kM(B~?ZJ{0ir z>8C8>Xe?T(UY-}a>0%Al<$s%$>8ECri4<|UpQ+n99EptS7RNmd!yaqsEwm6v!TBv6x%W6Gv6t0U%==0@%Blwen{ftp&tc0_l#_?{rfz-IBJUYJr`R0< zgn+FMea6{IvfBd#Yg2l|&_4a?&1we{gTcJo3eR;evf#KX4GnXal9XI|jJoz9A}02l zvL{Hoy){DMRsJ^I^fD;C1NVyC$7)dStp=BIu+A?(YOmwswk;n4r#@n}Ky zx6boYb5dW1MRbeFMU#!e`y&qVY1Cd%#~rdqgaHo@ksYfID7q@2_@$$6&u4Jz)7;hh!j z?d)Fa!8e#@ptMmor<&(EeZsQq&rUY7lR4822jT2U@lgqGbB#wFN!Z0v7ONSUSkfKU zmi*dWo%yD%g8KbYT)#$ae?{*Hj+pH6$A~v3LHF2wzNf!eQye%m;`=7j${U!#8@Na9 zGapo$cTHN-ZZ^>s4M|NF_4t#Qc$UGqc)QJDDI%dt6*QAXPmKCNiPGU$VhOeHj$+Ic zeOiB|_VHA%-;#qj)hAsxkMA7Ei3lwiW2n<=oE80^w0{IUUM;+;I)&buu_u-QUPnBW zJ@15-M{zi?8CKc#XssWZ>E}LWwD*3lw)EKufmShzL(-t5Fy+=EK3V2dIk_N!w1Nb+ z-nj8ndUxrnU$>|t_vi5=NA3_hVz%zBxv8V?*Hl_IyFEvqim}iSF6mc4WN$o*T^#mJ z4Um^D8}Th?m(=Y^B47Uz%}b+#9QFtrsVcH%xc)NzCHJZOz*&Z+va-J0`K%}pY{=5I z(x*j0G6F`ZrXM^JF(wjcXs*68%4xtds{*{CtDN=(?+~lUKsBj$5Rh%{EnoMN7-jN~ zFFK>H43>Cf*^6LaZ_ZBkBsPt?`>JO*mlCjia}-qi6ZcBU!{^v7$s4%&{g>ItvO}pD zJ6c(scz1SgOyMIVzj^eQvTTc-n%p!KW%x`viRc7H%W(ei^U7!Pt9C^0Jrl|<7u%6M z)`5gORmH8;>|8b~^_hB7oGD?`pxLZ7B!|`%f}C@B7sfqhrU-PCyA#@buBJiEu8Eo z?U3sgnmn>Ks^kUsJ4916<8OwLlkOz;1}J<#*oPwgLss_^!L8y2NGH>)G$*Us&iVKY z6$>Bg+BZ^~7Yd3ZZ{9!6`w)(~Qlg&N_ShhNe@ViX1q~J=!YkAgL-yaioOAE*3dDjfD}Vet`#7MUkgPR_K(g zG3;nef3MH3g3nTS{_Z`8FtwO5FPv@|riRA1uCdWa;JY$=y2OMo-ZAOKx>93aadr@# zFYPlSHwR|fr5}OxhFCRkC=`j_`qS!f(|_)8P8=}(tp?rzJ>?65--{(Q$A-G>w_{7z z;xC~2YLnvu5G4XI4u_eAaF&=n^n)4@d1b?c{T}q&Z(Zt2lh6t~&*q?rf~W7Um*I1z z68*Ookr2~myM51t&AE!N1*tbuXMKD2YZsEJQaesH%aS|9BSiRwEtA9}j)0N6w+>8o z-xw;UQ2jzBqJ1bN?92EvrXNK zZF6mi*0Scy)5J+QrhU6lC#q7r$p>eH+3Tc{nIp4jwbw<%wsg^$k1)6e2yq)Z54zM$ z{lHGRU@aM@Z=F+f!_Mg8G8z4<9wWMX%AkA0m#;+#rgvH2TiVxI3Z71834X&)HQBg7 z{YJ>*<4e08L-EAfTsbv4yXD=u=+VG$)1N9nF&NnmycTaAl4*K9Wq<1A&<=btY-rIY zxhLb^4q?*b3k`!jcC3vV5t(<@utq`g=RogyiU$ymQTQ#i))(_=k*jZwf!g5wR)i;M}#M1k%ACsDup#V5zBPJ~LSq&N{=5aJ-xsMlHU5P>H*pT8$ z-DcP2R>mn&XN>C@oq=N~+dH35%@Ux|bT{eI)Ns%K6}{PSg{H4{->V8=mbIZeK<}nL zR8-xVa#Ans^V+CaK%Df2TOHTVi@$pJd>5N9v{l1Bm*7P?Wdu_Oi1$tNoX*;}OXROu zrZi2|gDaPg<~SrqN`7%%a!jf*>|jvj&|7r0oTS>^$cUiOqScZuHxO_#s}>#i5Wrge z1nvy@(t8Y~0RS;qH}4bk6_nCw$P)Bsj^EP;c+Gdc6LNolFo~)ydma+i9@!~l7#T0{ zy@R0OP!D(a&zp0d)&r{Is`fg87iN|-Ob@;co@#7nsuyp*u!6GO=pZ_B;tA0VpSZ%4 z)WA(O-<>2;IgxmvGM#Mz*3_xXSn)yk2z60Sd6uMc?~VPiYu|uux)UlwSEWyn+Mi|6 z{&MTAzqNXX$XK;6Mb111yJk0xIb)xTfk2<1b98<}qm+;ffSV|0r?3yvJI4{>Z)!s^ zqL#~&STnFb!|J6dCCqj*JQz26wUePojAt@~Nu+pVIn}Arz6I&w;nA<}{v_1pz%nB9 zqjF!sp7GBJ3ryiP{qfbe2NIcg8rKfyW(y=w-5t3!cp&s0e38hQ(PR;F7yc02k^ht?pRp}@VQ$W&%Z`ag!{ zzVhf^xA|56U&?);toA)oB#Kp_`i7T-9@^upQ7Tl_RAhrW%rS%(E;|&vd`HGAb6BPP z4X(C!K6z|q%L;&u$)RR`(A%QhA2RYSN~umm5V=5%+M4f&xkJtD;gZ@#Q*TvQwlGm)d4lS+p6=7YzD}e{=bv&v*AuGP<#xL5Y z`>K`-et%4LjnO@v7vI`WM1pk#n(FTcL$6UPRv%81+7t9ahGEdnM~ekr-L0xR)FUe{ zvqVT=h2DFsOXHWVON}4Bx;5#!eP@^^g}!6w-l*O?0>7*03i{D+pwL3ugs7_e3@UB7 zp{lA{&d!?X7s0ljareyL;(0z}l)Bisw`Eajsh1MHjL=U>yimJ#x+MIbZ37^-es6e9 z>Yqq<*+MZpEml^Ry9*#TC_{(bTE>;`c|%Ybg!5>nV0k8D;M`pmkJw+UKfY$#V8Wbw<6(DJt=XL+J982`cr}69)GY;G zMtG1^wKZ34=*PdqEZksWIpf(fudG%h{G=y^SRmNwas(CD0gqj+yHW6Qb*X&g6#{IE zaU@1n*0G^6%PGRPQB_E!ilSnOgpzx+-GsovA;c~F7vG)0<9S6zMTH>vyL#0|(GjIa z{vr=fqa0?Dbc>Frx1UOHC-Z)_OS+PajG=)D_m{{R4NKyZJ}Uw9v`XZAn>QQ7K(Yaf?-LLoW-2lV9Z3n4aO>Ty;3EkJ3C$tZCm{2^yB zl%)LGD5o*hUY`XW+0kMKqn;eScVdBiP%|PJ%)&~2TUUw5SYWuAo-(B043@YUg6nTH zle1$G7(&z%uW1q@=(<#%$t53AK`9WHmr2$iHHgLfT5h!!iM~Nv?IU0?)kI!{t1J*y zHuW|G^0R64{$^@F@o7HnnW%xhV%ZPDEBe56-8^rP5$np#B=U^FF?JYJZLC3qC#cRB z#?gfdVS&`u)dx*e81?@6GBUy|(B-XeVpP?^K*QA3uu^y8T{kgOWBh$?#)@%t-as&c1&AIyjFID zdNPb>(ib{L_5mlj#hl>BgBw+$cwU<#7wK9#o=*y$OcApu!Z*tsmx(boVluwyHBom+ z<-;(9DBD>r`i%3A;~NG(p{5jYIU${LzZeR&ykaZ^Ph~-J)KW*Cc{EGljRxfwp%Itw z+|7am9|oUUiIiz|+?w(Cu%;|}Mq!gZ=6D=@pb&%P~W?Ku*q?E?Z0 z^uRVU+&UjFLg0**t=v(T^hp6clEqO}QMnVF>U8xQmWfw1oq$nOQk%z>0^w8RSv{V9 z?APhSXk1mTrl8Rs5sdRny+dPWDkJ{6Nr=!fwX!gs9GhODYg1O*{!CJBq;il zKqEVgd$s*^j2+a3bHr=Wy}P|Q*vY}xLMI_hlh@eTXvc-uWCL;P5sDc0_OY$4512$9 zw2PMLIV}C@2l{DG*DbZIxd!CyczEV5iM6G$vlZ)sxW|ec_HY<bJ@3SRGP>zmjo~SQb9>c&i0zI=Ww~_`tsXB zsjHr2sh7y>*uEe-ex_&$WG93G^SI_vDy0y3?L`PM-H2U3oHosLd2wF%17;J8)veov zkvXNNOmk?HSNpB;%q&Z&_@17T^I)_Kbc&MRT`#nLWOTgsh;47<&U#$B*RU~}ULjDa zt}Autwe;RJv_dE!hPX^f3piGeVTF9X6%EM?N`T{mb4{Ch$WgedOG6|wb`?1)Pq{pQ zsQkxTi0=c=cN1L$pxiRa-c~8UKCZ|EPrrXu z@Pwt-cN7;(C|?~}p#&+kSlM5ZJBKuz0pQPNeY5dugscv|bFa&_ujR_XcFzybNh{pH zY7&w(WzZ??;9&AHCETzyyP;tW?u#Sfc1sv_oW~Gw2%d(s47u5VVTR{f%av387+IEl z=O$N$l}}~WyIwA+!;;nThKH4%BA7{U^a>wOVrKNUsg!3=ebKDVGy#9pYF@ zqdUz~{^8i+V>C_Eyo~L?<7hSs6NjaxmW>h)1V$Z(J9gEwxrfpz2SCcAz=i<5=#Rvx zP$HBw3^*iqH%@hkY>wZ~h_wS#OiO&PEk$8z2yW_rY>Zm(mHl*MNSH>j_gQ1>49$2T6 z*GMoG0MB2bI+bJp!#o8y&Kz%m#-W|Rqyi_xw-$WUlzK0#Un9nVpuSd)c%lr2PKMPO zu+&pGBO&y7PGzWvNaXU;h>fPltdH05+vfHb%K0lyXuc{;h`9{R+N)(@{?)D$KzzOP z<>5b!e0oAWg-iW&<~)bjZ-d_kz@t<{s!WbWDd$r#j^H)jreQXiy%!K5ZU-}MQKcy) za|R}g8TX65Uwe)??9whP!ev=pLSr^yGWaWC7$FJ`b<-yjN6-9;+?+a#pBODT`AaZw zehcPTt>6(D*zl-bmppb<(2?bgv*_32vxd~TB@TgL5RLt@ZfEy}I!Q*Urn0XlDZuLZNXxdJ6;zz2?I8W zottzRGmAAM;Q2PxU|pBT9-t?_^${KnJs8d^?;g}8rB)3kEWY`bs5>Y%g?wy?TS0*q z;bCpqMo7L{BMKPNz}iW^nwi76kn;zx|KOPaY|esNXDFElkCPI92NrR*6W3c(ZagG- zqi|c|s+4eQ*D8KT5X}oByqTOWV5rp=JdO=>s*Wa*;}=d~1#Jel^C7k7AU`~zluCqO zPxp)0{bTXw&q{OIj5u&#bUojr5EjJWlv!%J6`litW2qS`c1Td>MMhItOn*xMW28oQ z_fV@YTE=2?HE>hcZ=f37k_F!H!a8HN`(c4BtV3B4^-pZe@d&Jq0m2z^yevLYb&=(7 z;UpLhpxbCE^%3Cv9dDatrr#hiHx+{AwD&vIict(MWsrf!a;o}oqjrO3F28VZDJ3*` z2tHuh9=WA6Ml~7MU`^`Gm`rHsEd2U@_|MD!Q^Oir@=qS+Xa8Ga_9T1GIHx`)0Q`|5 z{X9rCZTSJXV+EogV@xV;3J`zKmKV_7_~zsR&m@^OLU%@YLe#9MnZIk zEbZ5@|I$+}5|pGM-Fu83I3{9;7-eYDg5VDZ@q}B~Iw9^UYKeMl5-QoY!ydE<(cb66 z@31y)vS%ruZ)SBRzGz!fN5N9BN5i?x{zIv{4qW7E4TJLsQ?Y7PEw!y1yZ=-hIW_ahqVO8ykP^U-eUe z;pKAAFGpfxLdX^`5!fYAbvOk!kdRN<0zPP4hzJBl48P@GW0cxVotYdEly8LddHfE> zM(SBDfFxdXB!o(z6omgCCn(O{B$7K$*=ycJbQiBDt$X0b^ULl1cPUXRUe#9&84=XV zFzZ0T(52KuLR|~-y1=@Va?(L5H6K$7XYYK|ynx7~yF>%1?q)IH>}_WpaRQcMd#NyTX1TU4HtIl_NsZvAt@$ z(-9^Zyv(0fS*bW`qzdqwB5b{m{a=H%8GsVCV#k&AJMP4jIsfcHsP(Pv16Q-@>Rd)u z^GrC*ixP;>^%AOuL+G^b2)%PPiIziS*v_^OExMuG#xCR>q>Sadqf|>4OiXl6ID}Gy0M9SQm=M%vn#3qXW1_N)apeSovvgNP z&^wce{k;v4sH1zM=NsyOb4zA4ScGR1i^ZgJf;~j?iUpma_Cthfs?C(4>dXy-|5k%W zCHtp7>LokDr3Q@Hc0=Po&x8@18C z08?2{5ovu`8+rYq7>Ni?OqC;m!x`uFtI>Z@=RcZ1TK<>YEB)>Ed>R1|!D+KkxO)IS zmFli}tCl%u==P&gN|bpTb`ZQgs0+}uET2z? zM?-1Ec%YHhjWPvK-GzIjf2wxh=w(=eZHQ|Ssj(45Jb8F^1^6O%k6>)lcM0XNyjh~Z z7DLvr`EdOfg8)GchDb4OC`~>w%4Rzq4v`?jKe`bN1v^rTQ;d$IH5to!aQ|$0&qw0`&Z+KbIQ+ZPtG5Qaa43_4LkuLcvhR_f)f^^v<26R9Oi(09-9v~T&*bRq4@t$>UK67}LC0DN-Nb|# zM&}vz-wIA2N=k?_O+&%p zbS(sIN|12>GfTV4mo*UwbN?Mmn&<+C&gnNr+le2k*AqjWpOkiM3wm@K5+Thlys%fz z(G{+?aq9&Fh8S$lIP0YV*3x8YCJ9BE|MrA}Wuz37=U0w8G5_%U0(8o?pIaLx`P&22 zqS?5sJ*X9&#m@CD4dbU}n2T4F0FanZn9^HB#&LtID=RU(I<*8IOwiUF|E;a^L&RsC z>%?-%{wXr(WBg?&2fzJa9RNaTo2ILPoqvv)azGMT7;B#$+{R^<(I{V7e^rcEgeE19 zubdeEs>=Zc#OgL((ydeF83+cK;GI}XA_zW0h0qVlgfuRwK63Qi8}s5zw2-{XPCj4C zGS}#8>XRwld*{D4r=(#^{wb+*p=v7DHq*fQ>OTg)&rrdEz2d#PYA1CWP6_6!Gh76c z6!+o^e$wCkJvNctbeagi5lo0PonetHDFw_OFiDFqV17;9DgYii&-~{5xyhbX@!qsd zr+Ztfi`9Fnef8gcer$bTIO&x}|38m1u`ZHj7&0TUqJK3K070Jp`i}tkUSGbcG{Kgq zFiK9^ zf|iht_X6liRd!A}Jk%4eP|zPbH@Nb(QCE;g129Bt&&7_QF87Jun)RwmXa*6e2g@X&9VCpvkck-y$q zKQ%^ZUpUa1*!S!ucWzk^nH176CQy7c%adlnYX*`?}GmGRLA zV?t0V2+{=T31t2^UXsDlhs&iC*BHgYqarvOB0T$49^F6as6N$C03GlAoxCJ?uXP~B za?@6iR7tRr=!Tx;7jY^cLzhe+whh_;mX^NX!Y@JlZ?+$M-N@wDK3*>0KYG~|y?%Cw`(z`bo|gjpjd^*0vb-E94q3fwx%Ping#*ox|d1}YCRSaH+lipd%=ijLF&X^?L4u$fYE~>E{PjvujNgd~B<172Te=&j=hCx9W22*V<%_U9NPLGZ3&n zIlEVTD9I%4T^7M6t}8ZdMq*(5Q4+d(a(l0_))(4&;xRLIXF~kWxX%$=&DO3Ip@NlB z)l{KsTBy1#)_&GhLV-PSaf&^lsl@`PyollQ0d8f(B$`u?}y7?5>B$)Xhk909@Zi; zs6T7q;MAACKF&9c0#R_`RXi|(npx!G`J+X1q4yB=mE+PLe;xPphZ9>r;zFqyIyw?~ zR*j`BW+_JO7t*bgXjZSza7PGix^E?#RN}UMX}*8{(7&?~(6AIxe}cv3mzQh6>*pW) zjpff@YnT{)U@CXG_wfRU)IGv42P}pPS3UgZzuK+@q#tZPF{rYO4Jcij_;I+`eqL&g zQ!2>WmPx|Zs^8-Vq2ByPpnWDTdC#O7LpT4(tu6H1TJ-`tQF5kg>INh2pyJ-S-&W)KYnfOaiFt{_gk$@^8fxOa~*qk zdz8Ov*45{vddO|B61P^@&e(LU#8TTi<}K>bhdBWv+~47kJ5yIrnpQeGvHQ!w$VES^ zo6P#s>-a6lnt>;ZKTTt`23LJZ#Qm@LY z-FuHO25~t@UOlsJR+Zi2P;ZkjZU=7en}^Dg>|9C4fv*T13pVFFGa1K3qX>of;{)+Z zmscc#riQTmd?k2#Ane3E{$lq^b~kd^xY4Cm{Jvsu?bpi!wUbwU{CaS^H9tNz1vb?~ zPmtsODg~PxFntUnUY_^)^ay(Ey83Do|V z+bZP^hU#U>Ww1%7(0Hx56}b-0MHYlCYif;qYKmw=$m?fH*}T5+6SC^nTx>KM zxU)KveTneHF+!raZ2f1U9Uf(`x^Hu3W>)r_Bp1H<|6x4;=0EBq(t@5V`X})@I9!$e zfFnl&;g=Tl_3Qr2Qspjo$y@t$(a{Mo{-^Fe{j{0z+CtpW(;u~t$P>>Kq55~FUGY2u zbzd_4nn-rzdi{5W$C#BjM>jnYo$$J0od-KIH3g7IBtO3Qypw4Q!*7qe&rQ7HZ~P1& ztS>NGmS^4LYpVGK&su`3>fOfZNQjTP(@AVvDtB!26yOxUALWB}Qq$b95;@NrOZu{w zom7JcIo$6qM7UYVZDb8q^|!LL`!J?)!(gzYw$2)eZK3%CM(6D#>`%0fQ>Nnk61Kf#~UTX>;fSc;AVul`I=X=lkQuAkx5t2Uv)DFSBV_p-H)QSt5 z0o2R4QSGV=Sw#Z{qqId)-wIfq-nMZBNE^U%nsTd}inIz|2WHCaEj8?hfmUzVE2VQ& z`kPL4=nO2^ZPZic23PY8fd)aUbv-9E!=_OuE9LOw0OMM#BI;3)-N=M{HK>V(t;Jdo zXrouOx7;AL2b2ifJU~3uqnAAZaUX@BR&_sAm6uB@`d6s(vmE#<L)f3Xvg1-*2G1a+7l zPxkU~^IJM{B9`OFM%%7iqRcK{(Osu^EzNX2oWp&9-oxt0-b)J!jeD&n-$n zP)Bh)fd(}e`DuRG8c!v)^dJ#43IF|#_vs)xT6WPi@3nUeqX2l*A=EGZux-cpsqBuG zy&>|EWS7MSAo$Q{9py5!V%tz#`@Uzjwy20op>``z#^GIrl&PhemMeEoaw`rT<;*>B0d7FcbCjE!C?vtU#Lw_KSkZ=B z;)%Fon}J+gj_XPfCSPic094EmizY)tHVk(L0f>`A?=lc$E1O&oJdjQcqjL1q19lIS zTRp|IxSbBbGNhPmtrZ8V>W)*J43HhfBy9!%!zEFOpq;v1(kv1h$m8!j3}lr_#)Pf6 zr!XM|j&?Ltf~t=9Y9RdI2O#UE^gw^;zi`ZolT0ARoDWq(=zJL;s5TLox`r4#QcLEG z!e0=N`QI)7lW{BCk{=YD%u_~i+RZofDZ#5+f`zuZdI8q|V(ZDZ%8jIy8W_dMz6@W` z4_}tTs^(f#kUadQT{aej>F?uEQ?v)B`ry8zZp_C)vaeIDEs(hFg$ntpJ;bO_vhK^| zn8#k@p0PWBu9ovc*+gDp5ok#ey0OM@CmlsM&HZ`^g?_6joefiBW@OM$E^ z!gyzj%zBYpjVdy>Ci`Vth>1)7z{KM* zW0lySNINls0pQz#SI_arZ3V>Cz}RA&rdBo1LO$q{pj61iF3;;vgEkDsrnI;m8nsAz z5|*wM}NWG z2`s=sD*JLOd~8|%-$QWl-olfQjL9KvMm5&51bSZ^`{sbq!tPz-6cXuN zYfV~KulaB2tWfUBfqwsgasP{90K(gut)j0;f1Ko1!Kl{?FLxO#U-0~aom)rvewOaN zgWr3vaxyqbC*FZq#6MrnSKyZ?O3TUyxhI3V?zwFna9(*$l+T1UrlUVswUj(kXi!Kb z;ryqQ@bum(ZKf>BhB`vj+lnQ98&Y6mkkpf04v9c;B669%Qp>``rZbvOgNa9ipQWgI zd?PO@Kz8m?GX8McU}VyiS0k>P;E2+_g%sU_HPNNm(+9HrM$wfS+he2qZEc^BSHoDO zB05c!lR2mE)Oe{X%+=%R9f6m!MzIe(P;@Xxd}z>8EJ+FM%H|J^R1{HTfgt>tH+{>j z?JgD!2UqT+U`^OhD$$v-MrT1hTXD?pN(>1zCA91J_hMWUm&sjgC`A9HC0uX zThK{?zfE7)@7Xx{Da%WWh zKd5e?da8yKf%KZoE3{I3kPA5*@!*vQ!?t3vk%_M$4lyH2_Y^o@9yNi;^G(>%lPk&C zGi9;P4?%T4IfS^N6_O=2PTa-W7YD^wF)J;!rBH4~3YOK$;fJ>9de1vW9wRyQY|*PY zD3tyKfj+*Hm;^pke9x7IUY?6Ct`GcbNX=Ma8xsGi`lfZ^&?nMqyLvuaY8<^<(|~F# zZ70VTrIqFtIu2q(559(8aH+B%MR!lKQ0B~_L9B9?T!I4{jQVo`;ylrf;_MG zNv%kQgj0G4fv^$0L(1T}MiQ;2M)f$@I0B&r(`ZSlV@um2JJS3=Ct&=`;UH&&3$#a* zfz$MrK(NS2`ap>0+IrhURCeq|@eCwF3RAlJ#5Mdmrinrdv2m3i)w~f_ApUTai)x~{ zx=4=MTt5cWWg#^A{c)w6El5*Zks6y+dWUMIJeK%k^cTj|Q_>}_4-1awvA)t-#p6fj z#3je{hFF6%j#E2wK_0|2@rmHlk zh~v7)mZ#J$4p=PSvY@bE2ZbXcw5C~j8#|OK@Ly29K9>(mR7ysSLDWuKQx9LFO%iKX zRs7=>d<0Qh2NI}Vx_Lo+doSPb2w)4&b=NTRE;KC*#;{}@P2JrRY;*1ZCj~j753cg8 zFY7LTkPF$<&|?i=AE+ zLbe~oZ15MIx*ifRc_zPWpgq%Ye)!5VAI|y?iqePFIN$GE`|7TL7sv)QR@y(Qy^DOo zaE#M?S^pRJE{yj}+xqD>9upp~vqVCnEfP(>VZz?7&X16bHC)zOr3V%VOPtq(r3ydN z0!Z;hlk6ReNJm05xPS7qy;s?r`5;z-4sA=t1vdey;U*?v&hc?#Z2MPHJt(m!sDY#m z>yoO$IrL}a6Y?JXd&EPJJ3hZz0pwkNatRCk%w1)o(pi=gUmhT8ZQk`X!Uz%^Eg0B% zbJ0G|S*I8nBoPndb7u=i>YUEf{b(we-R-2uKI4{W;0XRyH{II^*n(2+-MAz?4#*48 zbTG#%kjp6=o<^`$AWn1vC~04D4D-A|JZB3=W8|JlLT4KIR^}s+dx{EuQcTqq>2$8=} zBLZLlH|zVB&Uc`N1xs(RKYVlh?t2ty8 zGWte_O9$r~xMZul2vw;tkMHEG;kU*!5oaC7V-M+5mdRrYh>3 zqlQRJ_7_`^GoynKoi8YH-DEYTv2_t@xO?AM3upD|cT~pxhK)UJbQGNnIV<!uBY3SYGK70S1GUY0 zygIp++%)EQENE^+9$n}fSC5UUR#2r>_VIZe)17HCJtv4P1xiIpuTE}Lg`mSf3rgE< zyYl86mI~e6lg+2xUT@B4YzMena|?^Qur8Cq*ZSFQpiCrO{GguGrY1x1T&10QnvinS z?woV%=r!K%V)8b<3T{nxDnZE%5Yyo%MN|C=bU_ef+Rc;=%ToNaae=zSDTPA8Y4`o? zVVRbk59sM$rty=VSv#_+HH$lxgn4c)IEG&IOX5e3eP zp+(jQAgIa6UUE3kxPr4FJj30U2PGMC=}{g<3fj`a(`EhyK%%Sj?J!?{w8GDhU1h|f zjznr>Kfb)fJ~)bd&kHO=%@u?AM6MOSnWEMysJBnAl>v>LWN16_Ow-Y~T;gUzslCG`0C^Di(IsU`-hl~t9IncBDeoXle8kei3%w!7 zmL3Uw*hbcZEpypw!5Ix#NikW?=m;-DzF3wg3ay5ieB8!9gy z+!~7=9p-nxueAAHY~XfgcPTN0GVn&Q--h9} zmuty?u#H7)80AV__^{H^CBm|Rhjqoa8S&e~5+oZG$D+rhW@SN$9Lb>ZOtZv=;LT_V zH*2kd*2h2?C0_GC2sqy!1O`Sj!NoDg-ywp0(&oPxFEsaoN*IdI7i* zo?xtA#{Tb|k*u5gAk>fl&0eL;zb=|rBQzedZiik4(=_8a#YR9})qxDoxcF>`{(l4@ zJ9NR*y>I>!oPUrM^fdzgCvel|`qa&UTTJ%VzY-v0A+PAvvgt>ZaSB5A*~(BZ4!uw{ zSn}w~{{$l*=3~T5PTv1%NH>0+0As;=u6O7SzWverep0Xqx0}Kdt{la zHm7@_TxLC2nh*LNq=Xw-Mft0dx5S$Qp-V;8?+!x!e&5GkKbhBJhV!eMbi+VB23@PD z4IGn7R$&B8DFaa_oaKTM@ARFu7ru`kJ?+IIm-tY1nUe_6b|#=Z$#l0I2ZP{)Xo_`y zlevrnE({Y9O_$A$R;s;o>axw#n>Vb%!HLUPk!-p$QW3CA+iROsBH4LZaS zm4bw;^9a3z|F-h!{m)rfh$^NaSpu(*=~2&O1=UfeuoDn+8h?v-xoT*747&{y_AGcw zcr<)U4aV0ov?}dxc6nAA!w~~5g6~S@*1W{Oq$76x0{OzY`$i^EcZ7Qn3cghJNQ_rC zTfa>l{XYJeQPIz`T`{Bj4mD#iT+Xm)j`H@>fx)UKHl=>ESE$Jaf(hbn>A503hY?WK z+hX5F64Rigb~P@+RRaL2(FXsACE6C7gTMr?R9 zV?>SAM;b^|Cz~m5(X+mwUG{9$_DhKgNxNQz5XEa=G=9N(Gq>5=2xS;&QHgoIy4-J! zgtuhG)tCDKp~p-PG7>mxP|9Pqw^U|9My81-?7i@JQt(o|f>N2nAXv*~;Wq$8i^Utk%^VNHgDB0q~WLA(vq zo!(x|B}>EVaUY=xw~WR$z=7-6ujh=FZ0$~d<-v^V<{5&se>dVdf;FGfoy|jxc%7QU z`m>n%2WjerXS8vhLQxLWaFeqNTObTqmer!UyW8(f;Wv)$u7^@Y{;N&yipc&y=S0%t zKuVjtyc}P=&Zj_HSkbi%Vau<;{iiDS7$)vGcwH58+#-(EZ9!K;nBFTk>kWRTsZPA* zfWm_*K&vs3@yk>a`Lbo3TDN2#f)VfZ7cC+;|4_yF+ktqfwIclYvp+{f86$Ok7EDpUQHZgNj0s!-)n! zb>MN=0H5h?@4@%YE}=K12+9an^u^{MaF?I`JonrE1r8{FbXFJ3ajZtcadjsiyA&tm z0YL`Gl@1l9;KNRsXthL4*nxR^B$R)K|3u|D${$9zN8&*KSW7H<^01Q(~hYB%)u8s7u6W|pM1${Bqi;l#< zvM!kXxM=lWBYN_sk8dbUczgBVAL4IDo(APoL+_z1`*}qW?!7H|R*^i!fAmGcK`u## z#Jzwr%V47*JYCW%i`h@bA{Eb1L5ZA|z7)of2=o37SHOy$H(B^MX#aP?QBn(1&zZF2 zSbg9UWGfxds<+LS?b`W;8C!6(k=W_THtC+$+_5;pJ!XA|neq$qy7`ZhmK<^zs5GF3 zcA44yP|+WC;1h?vTBG2E%-}HISy^LQTsmJsrhdAVkT*X6q`&v3`1)3VMhM&)x3Gl8 zItIQe_G;S5bACNp()n#|3W->Aic5qua2?9!?8J1)R2_zP{cSPmL8d|_aUz89$jTJ7 zQ#tKV^0-C?(~MEaQ&=RDf%O?!3Kz`3{eYGYoEgNl^`-myuL)Xny$PU&8Vt9@?HP~T zbHoJ1Sa$Tk;9rs&(s)biXV`zSl)9zr=kMTOPkZP4eVg&nv`ys7)y5$o6duQnmZnzY z3Wm$pF+-ZPV=Fe!?QUwce~i0I&@OHTlUt6Da9iB0Al8max+346!8eJ-{jj#SmK+33 zoUD+S<|kP;;IZjoa9y4@!mY?Q7bWsPIm1eQO*ycOoX<=G?XR6^_U(yo7WJvH8>z5_ zMVf(XQ)nGs_Q6z9w&b&k@)v{eqn;Su45t#7IAvTq_MzK%OLefZg*E2^7q)$wHca*m zABQtl6kMcX57u=C!opUkl(0axL7 zZW#!S3rd|=Tbj3vpJOhJT0;`g@V+^OQ765|IQL1WqVT|pu3d)#sSUYG;N&epHzqHG8P&`L(XFFlA zuzhl7CQkA)Uy%A?!zso#YNL>L>;bmc^W~2tJFOs$xHMlizlLbt9^a`XOnCLiT5-pI zZtzuh58`zXR8tbfr%w07)wXo{OqsZy1XNrljYWq-Pq*6VdN!aTlpPMU>L3Jqzy*95ow}hVNWk_kqC4Mer-!8S>2UBMVZeBzM!U zMnWuZk;6VApBjLqPctEbpbf+v=NJ3k|HY=9g-b6tY{-2Q1eOBPdl&WIIHl^Z;o(6ZnjDf*uqurgRhax!`^Hqau!F3qI)zYGGtrHA3gL%#@vY#6 zW-V&Lj5Ry;>>~Aw(pTkboTGVZxo(>;9vk_v(&ykza~5h?c5CHitDLI~=euT|Ms1zqH+m-h zEIZ*$0yg3UKMC_3v6#eXW)Bd-A|-_>Yt}cRlLSH7&iCabZGF0D)OI(mn=WgU8xou^ zn(GpRsk(y?OKd-xvq#I|oJv&BceH^Ss1(CvcJSm`^8I;ZN^5on(ZIfY^;9iAkl#wA z3$*w#6U#J-V2%(&k;#cVUdOC9AJ|t&6JB7!&-)u0l`_taCPa&sY$T?VM^n-;z5X*T zAJmvH9xw_amEv>p0+c3a9!q?A^$By_7r@3_2}xy0B*oeaP)zkUa+cY1WMR`7Bmx5tKd1ngLeuheS+jniqp1x_oP*7Q#B?VJDtC29<_3MNnb-x< zuDiIEMn}Vl^thtgEw_B)F$XzRO=BZiDLu%0E9@{ggv^6~_wB4ApslXwklM53xFkCi zxl+Y6q2$l|^If#hv}ueU4^HhPqNGcS-$J<0+37=?25kc_sG^0ygn2p&ni;#2%f?E0uwP-b6+Gi4HLv;j%rl7Lm4Ud?`A=T1No=h= z`&nu*UcJF90JM(y|2r9%X@Sj`*9HR%c2aR6eUD%0rJPoC|FJXd%#7C4SwEuHOH91q z>xFxa_N!ZNa<9s@$bd%p9XoTJom!Y*nx75*>Zjvh;HQ-KqTT93Tjc21aKP#xr)#Wl z8wbCPlb4r2U%3C|Mc0s(iit|chv|E+{?`fW1;XtG8A6MJgcpB_Q0Q39fA}HN>I1?k z%K#;n_!!Yb(LUiT<4{+($F^ha$_s-sa;=Pq(*F zsEEHxTr~im#pWBZ#{Q-$HC#~f?ByPOFi`7+;XD3x>nx9-{~MNP=Rfhn-%=Rv@Og5p ztwphV{6;K@8^Aut+UZ9s#pyDVL$xVG=#q(-YR5V-c;73XO(mWPAdC)+-UirK3u1s&W3dnoG%!Ym#LXFH;N`;dR46-*|fn5)UAoL zsNf`$xJ~?1Pe|fEb_`x`5nKcyx5MBb$mN^B`0O}6ts>WqL=q=W4~||2%t-|;XAWXA zgM;^If#{1ET{el!V_`AXJkOEu^DFro_L~^Pmw%ESc(IaviIoFG>sg_7=_BS0LLrOP zODF8&RuuYAqe-bmyAg8J|Mu7URD-5>1nc;!PolYMVKy=Y?AK*jjt?RkzCgV0Em;?n zItsf!%@3mzw`XrT9pROP@KJuZ2c}+e;yk@hNOlEN;D>MEej{aDK1(3lqx}j}K`Xn? zi*~}CWlR+!U>@Kx^U(Cw?z@hu^&;do&glGqPg zqvn46#V(c5H(62d&pf#Ja?9e+#ixuv8x)IcZ}y4|s*p0%gI*f&h+o?Rmx@pCrCqvv z;m+~%WG=gCLcM`ZPG6yXO`8BWJ<4+`RNxk_LcN$+)IUiD$n6xM{i|6Q6>|-eWPk9h z-){32bmN{tdZP8>te_PJ9~>sE_OYc+P`fN6&zlHH-#%k+G{4_Y@KL7x=7rg3#0cbc zm7>+fyex$ezH$e@)bwV*c*dR;1fs1o=2cf5_CBkNR&KOewGOa7bU#TEUp*RB{O5}) zQywhv4RjYW>%dwa#0M@;2R?bw?lHc7;6=I4+PBe4|6O-}9CwlW!uOEQjOWs>jRsTq zeEop^YILwiihGc@sYi;3_)p2J?r$qJqdKM=);4=|l+VyTt}$^8Rp(<Fx-UAv%k+_SV$-raV*Q`_ zqyPye;6vX|aJP1i_np`OFV92Y!=Hn(&;=vY5E2;1Y6DK*3wy8r#?WKq{fi!5sUAsK z%;|H}@ecNZqas#Kst=!EoxFtC-Ic@Zu8(3j8hXw>ZrfZ`Xsp>*+?ZTBY%SADRvTGt zQBBm4x!f2Nce%MlWHRXZGnCmt&?)oRB#o1h*FqnYKkSTGdrYbIjiW0eh@D(_42SWF zM&^?|CeDJ&SBR;;vHEY>H5iU@pAPMTbwsrQ(uY>+}JZzWUY)%3DoI6W6ewlkA>)-rR>le<6D4*xOR;u;AsdJuRTrQcu z)^G}&Ij+u#J~Ol8*{{p|e91h|LMyVAqPDWDFjD7K)(-0P1_BBsk-HlvPm@VI8txaR zJujVvq$$_=^kE5^m*po3H1bppHnYd2Ncxpbb1wsS#ok-kD^^58M&J1@Hl?j68>D~B zvC;d+bH87MMmZ>J8}B|%VumcZX5~pPLZLV`z!*Z{c6DTQl53{z3+^=piA%dpd5zeg zHNih^6He`1neu8fjxJr-3f_;|BlhMRKTHVOL5Ai0uI897E93krasphf=EHGk_lv7| zez?Aoo(`C+8V|mQTwN&G9E=1WXo{EU5RRIAXkx>2uT%JfdL?~gqCYKx3zo76 zurgJ@3N%?b&4AHqxY}2yYSTJ{%ZEZw z?b}}%Bd%KbOa55Wy}8>elxlmOU0t8?J6LH^aHirRhk3U^+5RYn+ZG#F3OQdnJ?>0a zKtSMc$xXp^4eqb`VcKol?}^Ec8%_5Q+MknBU$J>-YZDky#qm%lSQR|B5m@);MCqpd&G-e|TLSRz<~YkaWf z4t-v^7==+ok;Ig03Lcg4ISEu ziVJmsO~zzMjuL+~d$XZ<)HV0@E9$0}uibhKr)J4dJT9)a{wOlC+;sOCzPbD3nWHwf z3hocG(GNLNpU+P4Y!Uu2Yb@a=^{g`jFDw!Tma#Ib6A?z$OKUbW}88L{BwQ2_LB$VEOMGL*AlJHr?@O(bC=}1mFg++iA+A+oRj{kFDH6^ zJ~*BQMeJ5@tE)>tJvnAtJX>I%e`L+JXsjeP(yuqJWYLWXV9bsK_Ug5EDi|Hn8F?wL z3^IxuVNN=s{-p`Ln0I&-052dme*5Rxg@?>(P2U&WA7?#vp4vtn1s-=sm4KU5A8w$@ z)_MNdz+8&#C*MjM%;%i^q!fSc{r|1dr`l(0;=}?u!mvh%Fkx)ZDt!!`bBO=BOn+5D z_+ZaI@7K*)C|22rGCD66S+4AvwD}bkOg>4~yX8yOy1n|XQtfyB$Um2wB`8}f(GAt_ zK70Pm|Lh6Rt3P%;A6&~l{u$p64Bj9o>dpkUPLA-#OQoYN&flszIfLGts^;+|C-lR& zi=`h=E+S~X>gBy^Q#nN%I|~WA>iy9}7!G8nKsX(D<&ufU?Eb*DvW`@B#elw>+aw6@ z-x{2M$_bhdYdM>8E*0}3gctGfLej^#Q$NhIQ#*`C*mKd!N8WZh>=k?w5H1NqG}K=L zYzQh@-PpEUPT6ws_;3Pp6u*91gC9}|8@~RdBp_G*mit(blktgt2dlI*ynmk-3kbtM zPcRGU`w&>ZJ7dTYy8p(7Z`N)5$z+B#lf7U7|MJqSe9%H6h|-oE;qx{}sHx&-t!{xu0QwhmvXs`S<5$&NTxE9LkZY$<2Ps3j(J}Ez4hiDZ zyjRfTy}}kCpm24fB0u;}tKKgw9Qk79o*J8ZAh8w&kXe`y(aCu6`>Rl$PprAv@RG?{ z!oKNY6KzGe?Dfe&QMH0YMJ^Suy!rt+-p6L&bNlQ~5xr1sj&2tFKyAPx8q~}#q`wy0 ztHhO-)(&!?R8e@VDaPHo;Zo**&#vgj4|$Nn?MHxG#HT_G)d<3DoC6r~iqYEt_2vvVQ zZG%^fs}`H948-*LdS(2yzdQ(t`ZnA9&-}aZH=nR zpr_wA%#we3C`&&Y5ELy=wjv#!oD2+gJeqv5zLxH`qhMY9IWsI$>(k}f{(l$7IOCJ5 zBfivhOC5FoKOIzjBjwd)?nWdK?9DM*me*x0J47Gb<&I~^9oB)$N(OFyDktn^Yf9+4 zEnWVrJD>3Onsga%ZeVEqWJ}izNk<$$Qf+DzEykf|UGMq6^+9&;@w5Ns`4PHb&h(!; z*UA$(u0xtynJ$49yr47N$B^{8VSV-a$IdT_R4QxOhy&)5o?l|m{EJGvP>x5(Cdcdyi5XF zhflaq>WpqkwF*Uv85+#(ek6DP)?77(AK;JnH8@23=j^{00InMN zGc|kxI3m61%oN=e7Ou8u<6>{h9HnW#Qm}1&#Iw@qZY4^Vm z?6Z>$_H10SlHYgBw0a7mtvSE;$15lKDm>!v+|){JhCj=t+_6Rq=cO0X@K{KufKL|K$yhmHdJ2B`d<#RhYx`TjvI)aOniGew!HZG#)N$o^klVR;+Bof2j&HnVrur|rT#g)jAl(1<$BMzuWYe?Gj2X^yYKTz$;wXR ze8BBSY9l*++83)^de|x|>0M}A+^U&bM>m7s9Cqw8-YAE=v>-prNyM`d-?m$ zt&Okf47r8f@g#m#6w7L95jbf57}A;0!@9-&dBuy;Pzf{naJa$uhNOo8%h52JUn|tP z)f@Xz#o~R9Gj>E_OQfI&+3qLJet42!D^$Vpino^6m12JOR!?c{rSvE_t|4rvDChn} zN?G43YP@#$9I}cdw2C?PJUmA{(&MC@_muWZ+g+ay0`-oy@6ts2M+Cd@Mv(FAO_`V6 zfT0ehZr(?OX_iObzsnt|Z_iHZJq-2p7j_{07EmhnYbaM6;(Zjp#amqwW6u~gKvTw^ zz!OWrN#lWBL*jig>Ps^NwJNmeO1VMt5x+MkV_zjgK<#@?t$+T2S!M$r=q78 zYut(-h3*>s7aYe&b`L8K+s$f*(D0MP&&W%bk{;(hG)fgN+x@(g({pN0w<@(V`QDBd zdGPYU2Ru$_ic{V<EIjNfK#`Y@s0I5%xPZ=y^tFs zlJS%~+j`BW+7mY!cx^ME#*27rsC#ps?z&zpaq4Vq>u-Q)Pj_Vdb1_NGucOhOWL>~a1**cG{%qe?TODYM;W_ns;5+jqMdU>xVY z*AaO!!uW>7`>WE*nB8(opH7)$dvCp5_Y`j*(7Pof_aPQ-zvg}Z!E2!uz$cOYN1RWL zeWX8n(a~EfQ*5oX9I6>{HCEz??lChPXW-0XIKLxHpkjFV!}%Mm&9iZKcViFONOVT- zaq#H*qKJd_j2YhA*4Nw?v^}u5gFg-q47yytC=1wjZ167bf37}wwDQcer*AK=fLkvE z!=;gQrRbg28fY?4n_QVt;VWWCfHQHPYn*)nuiC?e*QGtN-g;x|znC`EL)H*@RVtFZ z6T066{g3SJPClz9o~&g1JacD?G4m4hK4#;}4ZfU)tJ^ok9}1UuIi?0^n$rA0u*smj ztbp0I)<#Sy<`_0Nbd&+Bk9Ay=OxmsPsa6CM@jujoBtde!_%Cl!Hz|&=cEtBS_e_34 zTdYNSV150zphG!#6C0koic4Z<;Nos4h_M==!`}oQUd-CO|IPsOj&=KA9${5@_%0T6 z=F~vQIH&n!uf3Fl{PfkO7dDMQ@3tMxwa<;M+n;%Mf0)C{KXI>i)_c-A5FwGyfH%ND zvtsGN23-0!Mufco@w((PPg@et*p+@YTjx9e(ZR)`?-EkW5DleT6-a3iB>3b^u&P#f z`RO^IDTRXno^p$nJs0yOE|%gFD?+gR&_Mh{JZ4%bFw;jNgrsY zv}qu6G_;h`aSD}*wRS1ma}>pAi-BXB_N3C*Y}r`78w}7>-o3@lKRpq4UrrsknYtfw z2;uE5V%;zVvb!C zkHW6Ja=PKRz3PyZKow4;^~SjH(jk$#*{b#yxth9E%6;82XtMKSwu>Q0Alsm}O_ znWIsiV=3drR2+z*#Q2ioPOuoveL48` zu2DejO(luBKA0abj0w6ZqV4utW1T-ETnN&*uek0ip~6+>+Q|1`PJ5|{cMRK zX)4!Jvh-tt>j-V%+pCCFJ81Z4uLd&~>*n#M7ebh%O_;Z?jgFH|ZzJhJ%M)$twR^=6 zt(F=My;$d{K@oSl`qG!52QbzIPYo;wp~|O zIQ3p(-+;ulT1LCU_08q%IIEy*JU&SULp`^mewfVS*I3BI2zX*6CA$1~OqQL7+-!vZ zN{oL9Q^;8)@^$p?(@?#6%f5B)VY4tF0D3l#`+mBV`i`xdn1WIPrj~vr(uV$PiTh52Puq%Bvx6AySE_@#2r6Os|5M8`GvY?dt*K= z|Mv+~ow7$jnWMGzG266{*d>Fne;L9PS+lo8BMR^d*F{jXs&m{u5$ZU<1b6;fumaYS z3$MKUqhWxw-*@`RAisWtS0=06zJ>9k^CH1|t3R^s@N&lAYM*;!qbF6KGlX8rEWb&@ zDwM99=!MMkc}c%?HSe%HVUw1UCoCejM*dG0z}brxJ5PB7V;Y$Q^B>=ZV{jtN^yR^} z34uSRm_6#NWzAoNsE#)yk0tVt>*?Ft{iND={!3q-w6vqHwxA#3XO6HPu}^Fs|Ez%F zph;`>)TYGMfhvD~M~-$RoN=;X{EVa@4(4Clj5l|a)89I1d$_+$?Rz?3^yv$9tKRT# z5)0b(-kosDfZLtmxb5{9Nq;`5ywxgYUfd65MEg80~FvEqK^?WC}TTIJxUCNa0&(NhN|ERk)a z2U%awN{#JZJ2O@YnvvwZJz?_Wxk^~~P+5d-I1WDdPQGxQ_`Q6W{(_aJK+HkHu0hJ9 zyX*8`<@@eMnx0MNi%@5H$Ewfi2bA#fuUo2!>eP1Q21{adfOE+}dZ^X>{C>D{<9fXQ z+XxZ4H&xGML{T!j`zs;v9nmIqm4KOq&gPA$J3ILq^*&{k>ocj(w-?)nu^L%XDQC|< z^2+aw!~6!Uz@v6IK7y>~-fFoAZZ~4}g1buV$*Z@F668(4@KUysN+8B#GxLYM=0m78 ztCkC!`rDJF@Aed#i#mRXy^q@yVqW`RgO3KtZMckUXex&%9W#kGN)&ZJ(|6|V(zo@_ z{nlc7;_5DI_6K4S`XYzRE_4rk-}ijiqPXA;O6jRmT@D1N^St^rwV<_7xtK} z_Rg}{`ln^g?Kgt!v!O5cwo(un^z+2VF@|@u!f=Z;ZM9b&Uu>cLHdn+b+vKzM@{mE_ zST-UcqCI3k<_bkTZVSfc^i_U5fq{|AQl2(t+ebBTpo4@(iaap$44-*|XL0$#YMiGn zHo_Fd9eFnuHnyjI^!;fwrR^-#y2(2on~E=G@165aQ5x|E+5zqHOD1M4>DA-c(Jnup%@{Q&B$?HZ=OUrKZw4>HhGko=`u zZju5!zS}t9LG(;q68JY3t!GC0(PPy0=c@`h7&Zl0*W~8R56`>)Zd3|o?!EdfyGp!E zECc>29fLM)^er5p>I;Q4ri|8?4n?s!d(Xk5jIWw*sAu$<^U2lAyrA1517Uhxt#t|7 zTr0-zVhRkeqig@9)U$-2nE!Y9L9>+L?V_Y*kFJ_847_sNY~Q3G-!a>j87alTF7z(| zsWz_}lTcX|`er?8f@4id_=gN_jn4(VosS1SjcJZnX{Qr2kp4H|DF^-MOr5x0Rrh=D zKf*AudgotP!B#U&O0FyYa9sHLX+=dtX>Fh za3}VDC2G>_{`Fay#h(~9vO@R$1LJ%_GHYibv?bxjV7yy+b$|WtaqT}}D}MQ&UdHv0 zFC4mrJ0GO&Ep_P!P>oxApR3gSq$YudZ=8rfzMRwGwoE~W6x+8IbRPE-``nDzqe|$h z>Q#;Qt)!2PC1Qh{Z=tC6`;5*eUOC_hP34duS>*h_;nOme*WIj4wGI4QY}fSQRDYTh z^??oCK`XH~2s9dftI755x$~nb8_oi^!tzsn?kz0or|vaNdoTEL5WiKu&o1f#YilK; z%)Q}AAQlYkO_p=c5Ar-bDRx2Wu=?j{3H)j=<*(v{Uwh>}ey|7YGZerRM#j{<*v7bN zCJ*OlAkaG7GhwlRMIfr@l1w9h9c%puMEj#s&OZ=yqu&e&Ir4`jkHpR&sI_Srj!}nL z4CI(0T29P)-zDCY$;49&)WB&T%zGrsAXt^!ev`0s5k>R8_ z?UbXPh5MW8H!`=*Cp(#W_02?#;)AJa2&v$Q8MAdFHz51}jOsF{RW3fx)tJ6c9moue zR^a2L-{I1L;=l%m^s|kNS+auiGqPPlW&S;-22tpOM- zgC3HAxo`P@1+j*mr4*Ap1s)q-C7ey6ryiQz5SDG+0oIhBO{TYjtv2Yh`rO)8iDx#L z<}t{rUmy|g?D>CW-gCmzegf|5?>ScHn73!plgH(#TsVxgUf!r79^h^a3ZD9`y0*w? zYUX0KMa&D6EZm5G#}?h-Q$Bly8FW)5%RJW+a`Df8?IXRAlqj0)mT-snAI&J^*#l2> zh1?|VO+9aZhDL7jvy=+`5Kn>o%NHl8>pCC2Bfht$XRqj#%{d284__OQhj-p+{L+>X zm`cy)RB+;aB-`8W|2v6g+?qJ$wo9*#^Q8q->f}AL-%Rdq4VwxLJ(jy8=;b6R9q?3i zZ?&R;zeIYmOwP@R!LB{!jvlld&*K6M_BtN(u9-BCi7W3-^!==rEQj2`so4Bm;JCwH zG52C?D}@N*p6rc)*RIRWnJx~1hJ6g}rVJYQ2Va!?Ie{jPeY?;Ye#oeiKB2Yo&0S&t z1E?wpse!d#VQ%e=bI(36&I9EwoZK3iZ3nUWd< zt>4Cph`tb7*N?)s$lfBSU>+RO@xm-J{I+hVtM6%Ol7!#>$_rY9Z1S^=a+#6v3F;ox z&p{*qtl;j}ecuz+aCYd3P|(p|h(jAA0-kaQts0zq!m+=kgSS4Ojr*#WhKO{A4Gb8# zq%7A!6H$U z;a0Exl`hkx^F#aC7Vhi$OU!6Mn7MVVrIpA`p`hKbnA&G=ZS%iPg2YtyR@J7a!;OY} zBJ96Vl>1Z<9+f^zR(AzH3D0nJZv80LEnM%dw14llF`tJ#j^Q>oWT0V_xKX1naiW*U z7a=uKoh(;O`*{` z$s`dvsm8#sS<+>K6sPJ#j%#1u@d*EuUSZK~3;i-A6>+OC&P~;z<^N&tt)rrByS8yU zr9?pKP(WJgPDL6-C58s2ySoLXMM6nwsUe3NIt2x!a~K#xI){$mh0puG&mBJB{r>*_ z*0)a9Vq!5|=UnHmWA9_{Zp{EHIaV1x6;gQn0l5Kh6n=*EXZ=REL@~W}0y{Dy`q=I- ztr!$arG+T8ytE#0)Tw^bwS{(Wxg2>q-|Aw!4g$dsu@Yy!O=WC_SLJnj_F^n#@N99} zx3?V8%nsRm(OIF6gm-ybkqS+T42E$yXcQ~Qdt$3!YWY31#R2BFo&kYVCeV^6*+gO@-97|24={FqumKbg5ad(Zsd1(6A2@pztoLK zx|Pk~5NiGm`i{~7%f4;_YxOI+D1(8|(Ukd|ig45e1AB?tXJ(o**I9GY?bzE|C*<&9cgPSK6ezlNgQJwAF3oi~6&@ zm|7kbonEr#M5I4c?hG@3CIGZ)BkiV_JZLfG{>GE7d+R?=t+#G1GEh_TS;QTfV5tS{ z7KVp$5kHO6zI^9hV`&$5jLO}+3%dk@7Ey4qM%Ub@mK)tFl|>|)-SdJ>4xUfiS!I!AWFvwomB8M7yEQB69lAmwts>1{bAtV`|FNFw1JumipM2S+g zBRx`{+J5w{lbxVkZxy*(mAqcFLFo&YKMJE&^c)VBR}i}sn3b)c8)gf8lWIG=hqH=i z#rx9c?vj2V+53f@A%uMo>QYxII&6AHJbUf}aj3S)?LneNF zW^6lOqEnSd;dwD`sy7R$?G7(ZqB<*db*@d0P2!kh4<&3^Nx*>%#<@{sWcaQ|$(|M{ z#BWg>LBTkg-*Lb*z|KLssnsUdjJUw)d02uU6)bLEMTEnu1WKZ@{(#xWXT#7JB(I#t zy(T=$4u-yesUH3Kfm%taQ?ce&Q? zH-8@My$sMuoK-?CtWJ6t_NR-%c}-B6km@HCJB%q{KOFUiIYQ%WgY$l4dFmuPx}!PY ziMegEJ+8phfQjKNmP2=NOw0DC59TM)qBb1LRx2i=n!6u_CChu% zjh>O5&hiclld#pD%L26rOOwq#uPCu|gX3O>hOg>-WE@ygjvAC=gO(btFZB2Ka_^9i zhE8PLSFSOy9Z6LqV@0nScGZ6p5nH#Rzaj3quUFj!Zr(3a_AxWj-7G+6(}pi@H?B%d zydk@l!;SN?n*yxSlNO*dhC-BK6yfy<%(KD<9p{@|6x+P1DY%;QL_ysuZ|gAI%kJXx zob(y@!?caxljOeY@$^586&z?=kaoIhpBIaLhDX$Se1XVl?h$Q0_1KSKNjEn*?(oS<5A%lIhqqC*d%i9-co~14UJHvqzxHhD zf89f{JadY_u-#kyR0OqbzpvT={tyYINJu=sj%8)Pi~_y)3_mg&P&?y6#^HAxh*z)? z*(7u5EOrwd$@CC1p38dEtwVid>#d@!pAR;9DP}hNc21MoT0=Nvkil;WoM;^`(e$dN zXM*d)!yY&|GbjXn58xc%zW{yk+)%0QTjFMJTzvF4Mbl0Er^gz(GJIJ$#$g6R1ED*> zTb{ZK{0d(PX8*3{@4YwURY35sh@eNjh~~+a;p*kOSW3&@G}UJ!vl5_U!;ZGiwB}01 zekS^CVS!SBVxh!&@O{~giwd1!b-FYtw{}tAr>Thq10&n3?yH|~@_DEGb!z@}0YTb5gm7B0-}!-qA{ z`N55oedjNa5}9Hnwi%c;>vbh+Uk+k_$^F&v*0K)2vsk>372T4krtnApo3wH z;TMPLZG0wT4Co*fRZe&^O`cFIK%DWlRq+Wv@z+-86iK67qwK60yt~X6;+6E`A;v}# zS+oK#M}vgOL=lZx8$Ue1r94v24e}MaX6S3v+X1Q>-Z%!`^AMHWjRoW7SEyk|ozSw} zvDV|sgsbRaK9#nW0BYwjz&T-ewSvEmWlOQvF zzxvA%;pJO(IXDUw*5OBK_UL4?WFpo^rR$??aS5>7vpR% zPNqIc3W7M#_Zj**W?RX=f)fWY@tAuUTtal)Xrp*TBU2y0Pn4C=vb6423y>n6_1gH* zBkIA^J>3O>x*l`T`Zk~9d9l_MiWZ}DbH^P)PW|zvJ0ML67-PEW%EjcKs!8T7us6fJJ{kiDrNT;3ddWy<8LR##>av zQ7zRk`@q^BYqBd}wJ97oeZO7o-6;p?6hO_cmLOVEA+n@Jw-F-eI9N6%A9?#4=0i7m4!0M^&(50$dnPOGo<>2gXY zw{52~xiG+~B7YH&LS);X)QUwv3f7tzfAJ%C&58;XUrkTdPelf?no`s)nPapD-1%0C zZ&$A&9GAXdN_6Y{#CwO`(jht<{YfZ9Ws89v;jOzXDBe*|4ZC z&PHArvuyi$Xk0C?8qRu{sv@-CohE!S5M@>vmwMl9BIbX!X5K^8!;jN{aQUvTZZnS7 zL>v0k=H(QdCG-`7ZG&q~?3Pu3$;T?aQ*HEy=0|=Qg_Jz16=)Y`wh$Dm8jdeI4wO1QgHTysqRj$v(GOvqn0Pwl9y`%K0Pk6B z#`bL;&q_a`D*d4wJ&Qiz7?UX^(WWZ1O8|P8C7?7Rr`{wmFnznT)@rV3I5=3K^pa3j zE2eI^G2*DI@yKzCELj0)@MUw`kL7Pg89Fn69mC{j#d;-&p!=HYOUG{l(LP=~gxjn5(FDGbPwPm>3q|z}pBw)N5KMjN*1EQsu=4 z*^#yhL-{hXVap$1WSRGeHy9XM+eoChh|IUOb9c*82a$!gH{KUxwwAD_()^O(OYTfv zS#!7D3}^MQ4PPa5NgIVbX4i%gWZzV3{ZU)Zi(?$YyP2>LakT0wDOc|QQR)>|jmSMM zQ5iji_%%u}4212HqZ(YmEpOBIT@oqQVc<&KD4lF%R++P5SAr4Vd8}h)kBhi}K)GBK zQAcpOmtKuE$J*HuLRR0t37OP-C1XKz$H5LOo%z64v8T$ z_e+awoAWWOteZF}$J@wm#g%~{cP9*R}z3ZZQEn#D} z82#P*O-Iw#6g6sN8mCcfyu-Bn3o0jvRjS|^D{W@nIF!HrNb!?qp$KB8py@g6az!mj zvOMV)92D*DTkbd8n_b%<2+I^Zk}BXD zq&8O|SXb&Hg?RBTc%tu1x%$EDX)Ij#$9X*xV&a+jJ@;pAQb(2O79}nZHP=SJB+Qg@ zl)#@JJaqR?fO+YUxfp{|)ta`}qP?T&47>?HGlr<_O58Foco#5+u)aNRp;qB3+lqq9 zg$9j~K0zVkm6jGZ%`~*gSt}JnbG`>&85d4f_?e5a?t)NKbP7C6AsNLY`}woEaK&I%uC&U}59Ckve>#@m z>WQV>k?ZnMM?W~)>!G6vzvdG=->g#I1h=@RE@=l~vl}&TR!H}cl-8&LL3?52UNIuK z#|CGt+K>Hk251fEc!k? zJjt=!m?CG?rDi((d>7})u3;^|`WdOSOb@{Z1~@mYz#GGZzuS?ftt>HjV}|U`e&7L? zSQOfxz%<5>(zoS%qn95cU2w1gs7Bxa`h0!_mJX-EyBPCszW&VJ=odV2&xLvuI^o5$ zoiZrI{Fyq9sQv9!mfL_o3{|v98ngXq(n7p_qn>)WM_+PUa>j2X@a0T^?L?V=da@ag zcImNKD)Y>-NtEPtE~I<9rW{g4P_68u|8{w=XQK`)5fBs$)z2mL-s@ndksUo@S-$uE z^BUjiVhx*t`mGJ{8Y1j~L(jPtnSOrdnW>yEHpcl;+-rM5Osj0oXY$%&(Zi|eJgtP7 z{OMv`2Vp$A7Y*EowVMvI6uN2y85PaICzWK-x( zOtjpQ!yB8k7n8#uO+kCoI)B$xJ~r_NwsT&+@zF~mFt%~%$BQnrdSpIG|4Nof^aY_1 z55J(buD`S8;G8>*lg{@fzLD^eOQ*W~7Gv_hMeRoO+{#7a+)+HDXD=r`KRur&>kq52 z(Jkw6kRp=hX##S>P-~rE`w~mR-I%E-maHFI>v1UtGRuiJ8%ty|)i?ZN;tsp0>fLb` zQ_;~JG?s4~O7g7zY7(~Guhmzgqm&EP@s79ClCxuBD;genhh-rq4)3OodGVIc?}UNa z?zt(3TD)U0EK0sv*`y=O35iupHe!(mJA7Lx+Z2J7xDXpmA>^?idC+GH^?J!-`rh`o z9b}Hzd_XzUE)f$W{H(zis(Y~*Db8dTI}BuzAF-6v@)!loU`yMju#^ocvb)_$s6{HiU6JCzh<~QtN;#s%JP)AL zPD}CfuN17hNbX8{|DJTkNunScMZ9P&+D)+62XJ@Phl>&rm?^}uL6ujR^V>D(Wl z;DdI&nF>iu)x=i1rsm~cz;N~+c;T`C~Y(#Mj&6FRI!Tmv- z7FGx+M;i=8$8JDy(cbm=`8jNvY#~N5=-gjx%Zq z9g*mQ9y>@~)I9d|3TZUBHj4ikdVnx4%0j$OLz0gBi4ljp#yWRpp?Ke7;5AUAV!2~_ z@k649Ux<923a@>d#;l)@ivvi>1DkfV-yiaEyPB-X;4u!O2Hf+j&A<%j;`@EX@&A*W zHK&2r3N0~d6V)kPU6ryUu#?6&vMRfTcX#{48pHS|%p_c2r%lD09lf0`a`Ha=S}=kJ zn#7-c$5}f)e3`!2wQ7hX7H>7_-r~Ewn?o4uvnLiMSQb`@t;b0<1Bi_w79q{gGT&j< zvF6nGcROb6npNo2kk~j5wc8D@B^#rxvQMD9L85PF@2;XS*%*vLPK2vgdwUm{Xo_x_ zCzmlh6p?DS8{9LXv8&;MF$vKg&u^aJT>F7$xKe*w#BZ?IqZ=sEh%HATHGFo%lm3?X z3+9!QITGugS0ZdGLO&4POBq3;e_Rqax^yin8G%&rS$=9*r5&xik2d?Dr8I8JIZ4s8 zc;I>ECA@d56WK#wCeS<|AeyVQ;r4vq`)6Zr?x?ksLKi?vfT-Lg%D@HmM~iz@nUtB+ zMGe}=xsbA67&^0;@9}LRv@anK?-nCA?US<^Id6sF!ywF_tt$L%l9|84Xx_-fRK(o%@h8iOsyA*QN}FIR}O z0=Y4~b{7jW=pG438*pir>Mj$$szXKP_Vwth!t(eo2Ke`{M^pq8kG5tSwZ`cjT2WO4 ztWGz6LA=ob#A_X9q}86nCTSB!M3-^Yi{~h6;9LkcjcqV!$EXvTHy(WN(K@!*$IJ-1 z#62?r47UJ_4JU{jc9)$UMUL)0HGYQ2BJSFJOAG1Gg}b8wjh;>D!Wz}aHI2i*R5D?8 zgg!P}w^`pGLNayKfzG~yCuSZTPmq#%<32{eJ8T+4fTM$c63I*l6N>bTM+I_r4trSS z0-pD$Z#4dgfw8If%~KI$6-e*;?>%Q&k~HYzT7k9%_+Hxqms7NExa>JY7p2F>C7j{m z!8SPKIM5!(SDT+msRO(N*%obFcpqcZte+HH?e({Z3R(ER9_7ISwjztC^+<}IE21<}Ef92F@-1G=4 z3m|1S^Ulj@r9Rt(+^F8Sdh^W4;O#3I`Xz0SrYaHsK#%sNj|CZDLJodP$SVytc|UFb zS;M@itGR-CUVkRTv3hLfjU(#_P|(n-hPR`TE8~(a(kkofS%cAjTWkCQ<8@ z*KTbaSq|7?wI~f-W8b`(=6jf!vkVktPZ_(;t4VIStTm`iO!gRuzu<1!bkgdUINxTH zr}mXg7mE2TOU$nJQLHOnGL}-bZw?&}1^XUk^dyY+kPa9Q7?xp|VgHq$#6Ly&LF~%^ z`5D;XJI0$*$yzNWb&zL}be?NZu5MYLnz@)zlH&-OsEF8~LpctTE~vhJ zp-5Rk=e)wP=iOCz{T>fzU2r*rkIYRf|F za}T{;x_Kl|_MMZjx$fvR9)2kC&w0K}J=oJe4R zlk8ZT4#W>u?&<-QS2(+DPX55HcXXbl8&xW+F>e^(JgYjrINziH3X})1l|K;OfjU13 z6c?*mL1fxVu96xgpX5k0y}Okit4j*8txF z)%0C{oU{trTSxN@am&@>Uaf43phv0FG7E3G9*Vv-EUv2<>TZwdlb zF5AXVe`2+LMP<=5JCH-qyo4ythqRODn%y>vyc*&={7Q5Vav{-@+8D<}sTN zG7vd=&hkR#c?_h08K_iAXUQqM`=C^}_I>l^xnd76WzE)iEaYnJXwUfEy5Mr5&T-b_ zn)NLE4}SNJ56+qoVBC(MJ`gr4D=I2M1jD!q_39ljWC8^NByhi2I`C)iJp;BIG>+>iW!z4-`G-4P(v1!%|2VMm5#Q zJp3a`9Z1D+x%m|p>P~0OyHwl^Q<7gT+u5I7AGchqw0wH?V0(L7 z{pX%kx*P3+d&(sCVmCflofNIluJnCUq)m!hlazA)(XH2O7d2pwFm1|%j(3(C6M@*Y zKf8ygrS)0dpz3zR>OUQEOh`tLfMyk{5TNzKAs2g{vJ*#&q`#k+_=0hA7@eOs{If=| zesGd4v3+Aw5HtWJ&CoX-rtDHWg)BgtZp;(er5pQMo zd+O0*NQ4G4WYa)cp0DKT;*Nj{6SbLEpyYo{oH%=9V*38fYSyI)prr9~GNgmCzD5he ze!lzRwW*Eu-PQr(M&=$nTqn+f%?`kc-o%a|bK#;uv(w^7#qWeYKbn}-)ru1Bjy@|YM z3IC3juds)+zun7c_#IgKCt6!zE(YM#>MDw{fH=qPwl9m%-oWlJbLo|QhcdXW4z2(v#I`r7>Ayq!@Aw5}kD zQ#~LxTD{lLqxJi$N1RkTUHfi?d>jtFroq3gTGN_ss0%Amc09l`n~bQSk86#V z_5E&}QqZZq6|h=xQ@Bh%O6&2EipQvi0f*Fw5quMOZmD?X2I5d;;4pXvYEvzm?Mkcf zK(@n6|*(1-eQSqRu20nXTl|W8Gq{3JmvCxG< zt5rMohU)n2jmMfCN-{1fb6xXbs-Rj~%azwXLA$gWbMaUma2x!(6`e?E(1CTr>viWz z+YFD`ZKj_Wwbt!hyAnYm_ZkLcn(*$r0+HzF9?UJT)8*tj_R5-QqnLUKP+z6g@smfZ`)<%) zCWA%qQDpYfEl-!L_U%^Q$9=K^$BRHzTvvnU?FQ7%=5O6w1So#blT{}oXt-;c7636| z2!EnIvQvj3Ja#}mGF549?l^c~gFQ)s)HV|TV#2v7jrjpPc9VG6s(gbfy!P4y&3hd1 zHh1`MtFU=?%6YyLDzWD5y<#Z!Z}E?5t>PDB>{yXOao?($$e+3FV+TJw-k#G?E&&ul zZFCipJH12+KqaTl?U>cl;Psn{+c@hECM9mpp(e0cHON@i6pN}hYD244n_wEAM1JuE zT!^pp8P-op9#11E2EY!4VW#8*R2Oa<=fxW{+qJX~jXda$p5|Uy_-1BzZU_>ojdyP;YX*pWIS+pqe()N(lE^yEqthKR=WvCZ^8w1%jV5DIev{IIl#&71(jog#mVBV_&*fK2K5bg=%0rv3$Am3o2p0G67!9(`{E z3I{l)kl`$ijzS&uky34lp5I4tmgP$~c;0i^>&RA@3Z_-H`1cB?Vsq*d?%dFd0^=gX zyl|XPlP(zm3gjh{l{av1dwPVP>$3$A#V+S;0?}q|LS&9)Lp}_~$vrC)MEr=MCy~lO z`tq|Cut6;WonE8(?7Uxk(f<_#Vvd9J>rVZiMG|~@Z zG}sHPe&<`sSEV-&;@p?Z-B{rx*(_949*hDuqfwt};r0RM0j;gJb!m-WNm&AG`$J9TpA#~%vUel1uuSGmuQr0o zj#A>6w99R#9-CM3Tzw4E$2W#D+}fC`GS4?D@^BfeAve2LS0D0&w)+C;PQNx$=M&<_ zF|Z*rM9B21z4_;!d5An6t+Za;+(fm|4~e5mQ_PGplJ*nJGre)azVJ$}8m{sl5N?UP z(;UTX(6cMz!o{{*Az8JYCo_?VL7+BfYm-!NUOP-X!4b1g+W9V`lt_5e%QYHgk1$5q z&JzY6EkH|s&yOHNxJ8Z6(RRZ0C9N_yeQt?B&iY%?(THtpZD+-V&pbIW$4XxC^jN5&=L_WGCB=t{G%+ zcY{J09P&kvhs_&<+s3N_A9=;r@MC(Zt(zoNsi@~gXGa1kE}0d_1kT_Nz-ARwbME0o z^e`ko&Vux9aN?0S385~jZs8HSAdI1;&BLl3jiBY(%Mr5~axXm_Z~CkzfSQ2;t|!8S zqY(wKKb*`Dv>+BR`#JPkU>bKEUOzI8Imzzv@l|ZYCsYI8g;GL;t_5FW8wT=r_Ro<( z|AsP?80_^-ps|${wKx!`U6kBu#nvka*Z_8VmYG-KRR+5aUO1KvLLIYj15`TRKTui% z0w?g}W()MqS;rn4t*;r&9FeTac$P5NCeYVOg(KwE)X`dTg8&PcrgLJO|2!sV4 zo6rTe#?Q45QAh09$9jRIov7Q=)moMgbbde*#^3UVVAM7V?+|Uj7m^_1FG3eA0PQ=c}li5z74?ma0M@-l%M?b zN^p^Q#gz5Ib)oZ_yuxRx+u_HeFR|E;niG@1{yR5UB=aD*sBCx6eO}lYeL9KgwNGAA51Osx76K+1u*jAtuVyAgKwvnU0ZJ;rH8arH$t{2B$&?mp_v_RBWxIhOGPH4b zAZO3$Sr$TX1I&Nkjv!hJW__T1k|%KA5b=50GIfvbNKaPfF3};XDOy>|0gj`M!Z31? zZQu8#M{pgwOGbKbu5vGIl0fiYHZ^`67LhMpI;a#f-G?jw$Zx&=4x*)>tFbN&w_VKc z6C1m4XxO(Wk>vGt`6{Um{Q3{2GyJk>)2O5l$$Q+)iki8i{PVAtE1PTdzNL3XQiyJc zckFQ*_S7{D7~Weazl`?w`|No+^O4tF5s1w7T<*j+pK42%kKmJY^n&Qt`%Vzj3~AVl zJN%O`s9Q#@8~tZ5T1rv0x{zK2@v$v|>V{=$2S|6;{)nSvpPm?+%aQv(?8WMW9NKYN zmJZ!{dN`-+;z@;Nq@wb%@ z2;t=Nd?%&8C}_g_Vwewg^7=AWtxJr&p2=8(A8<;+DlDPRU}pJci&u{qP@*U%4F7fHpnqt@mL-AJh5Q^7bdq!P4NV8VTG z*R9d&bv=hprA!is{&Gm|q((Dr`}z23wc=JMNEcC3%(@m!=RzS4Z-@^+4b*Duz87T^ zX{SRiO>h`_Ddx(nsD0C>tHqdZwpo6m)k$4R7 z7z*5Fw3z`*SEA?i^?{ufT!%8lX$E2o;>9Zb1OooRpWjqjPwccu_8926)`&a>dOP;o z*3PXwj=jhGlnY>RdSH&ljZ$B?<2V3l?ADIb_TbKwDIa`?1=Qrgf6{CL81EFa%=%t@ zx$aDOz9>u>c{^=lrh_nXp9>_XkkP_-Q1EPxNbT9zix;B2o~=*vmUq1x9qr?j^oy!d zkB1fk_WVO2tQ*Y@#h&$njm{bc6DY4)4`|(#%OF1WajxBB*vVZg5~SdLj%(zY`6`rt{Q1&6eAP(Ip?0Q&$u@?dJ`06-Xb>m^eQ?fNg@B_nvwda)vRI zU(-KuW{&ul$yV8Jy=qUkWwTyWB~AL!u(9exEfOX*Yl9e4bjajT4S%13HY+5jq6-Aa z=Gs8zN^W&EU*?nXlS=s94uC24eMz@wtj%rh6@6I0{=LWXi$Sxa(yB-2gID5f6P=DH z^Ve4_?l8{+J%BB0S$IPS07~Uw0SFG$)^v?h&jga&dhui;_tAsvlbk&u#OWuIr(Srx z-Ew{91eC%n0lEo6@dDk+;X*U`#_zpp&tL|FdOH1hLZJX?zI_pqQ+V10Rz-Qq4Fg8} z>IC8JMSAPW=-!jjJEaHwwt9kkf`25C{pZK79fWWL&@eJ8RmO2e`orNJ_?xCN^0b@w zO#-&l&ww;i5PNY>MO}rs`}S;_S1q%X65j6=P6k3U0Haf6L1F%Zop7rKD2%I=@prxWo;iBs=a! zw_a@evU4XS_9uT`tRGoU$IT(uDc=R8@cygk*bmEZOe3dmHLLcywagQs1@s5NL@jqZ zsw^eBZ2s;R3lolY)IdJ;?Qw5Ei}!atrD$}E@i%@-PnWhQ=rlB+7zL)~Iwgl6?aXH) z%(;XdVXp?E544=pk1SbuYN*>++n%7H=1498!m^FX)04mrp3%b9-Cr zE+X|syXou;v@1+72M3ECdG>1tJmL$>DI!E%*FPldJaSrkrZoW6y=0DvAWkUUF21Hh z4?Hhp4L!nRsx^qXD02x+X&`Z(EOF%0RG`^AmH8MLW^+o>1p8lufT@>tWtUI8~+PX~r zC&cczkY3;?Y5I4p0wsBl2Tv7%c2ak@IQ9(vFI|)Fe03MJhw1Ht0WIUnz|X^?_n2F^ zy7#g;W@YT9oq|rh`*WwU)L6vxCLcu7z+SjgiPx|*by1kL?ZZTb;cPtP_2NFa+ZJFy zqNH4%xs;(YL(eq(!=x@r#{sMHgetLRyg;5H#P~i6Q9n$`C zdF?0F6&16NIc|jSw)DLRFaa{1#Vw@R$*YT}CEW#(^*OEoNqax>#7)D8zi9s;2>)jZ zR8L3KbIJZJNDnlUbb>hm93FM+uDZG@C@>=|u(lviDY>sNk-gY8Y8|gOH}3z3BxVhz z;g1ya*OKEoOw3l84=M!cXiV+@cQ1f{uqsyMfz?TT(p8Hq(KluQ13i$#&=;Ag$&CK^ zPT%Z%^i|Xe)Gd_XEUCFF^c%6?nn|7@@t_Hvi1!eW{!7*VU#s~4{hU6KCV(j|_ZX3N z9_1|g%jc7RC=Ik!6bg=a8Tts`o`Wt!KeGmJeA@W*w-3!anhXTgnONJ);3A!;G1O~} z=g5to4P0p9r;|ncSUNGk-4hM(7&<-hzt(>?2siJX*51hR2W!1OyAOvfM2%XXYV25$ zR04-(m&snG?7x(-HT}&Y;B?!?Th7wJF|gCRQNuIr2537Y=MG2lzaOTFkg<|Vr{ie&?U;iTT1Y=lt_(Uh&K~NRK z>Z%by6;`OAgjyEZ2L6kExp}HCj|->)!L@{`Z^_pz%WHuq$dThT!!$!ZB0Zx2^Oy6l zclqZC;chR6Jt@0#O1Jz!92VTVW)X)o*UO(QCmZg&26jJj8dmu3!#6!{;V9t%tX;E= zzudK~{HYr)c2l)_KbavV>>rLL5Z{h_pw-2G_+=W!G3#*U(Poeho7hifIi~;$Nxq2|Nay}J?khw{pr8m`)!cDF7Rs~ zK#I6oBg}quL3R#?`CNh{ZaxgNH$m)_n0yQGH`4M)32Oahgx%NIciYggo2FD~V>K`fg@ zvDeks!1@!B{`b#9%h5ID0JtNZ9TxrmYP5el;Z5m`!sS~6abt%s6VUhXt}FD#S)Ru~ zfEf%1ga6yy-a^SQPHXzPh0NC@spZJ^X@4B%4 zd4JYosI!L3l>eoNLvm1w>YzH`QoCvv-aJ};c(b}x{(eWlZb<={$!!DS!Zh2Z-gvGc zwAntrlgNLTuI$^b;^15cJJ?M?q#{JQ8_@sf>-n!6qF##&+#&C8k9u~aMSOCI>DG_9 z;`SGaC8*oOWa|k3$w|6-e{njnva+&sBH2-%UDfyFc7UZY;CN?$Fs8$-y9alm_|3r> zB|!shOFMd*!H0z;ieyj6j}*z4|LBqZ_r+w-pw9X!_OVBJ2>x_SF1=P`qKo^(Ay0

    <@G#|Ep$A3yL^G}Dp9E-Gk zaiZ?-zcvKKVIMX6jE@@h_M&i<~42rIwt4JXP_ZK3Kf~S9{NTHm3VKRTAum ztnPk?ZCEoPm6-Z>7cRxgD1~arNy#CQ_)qsBOZC?k(?q8V0?q0H$9kLf#f^W>AoK>{ zLj27->&gY7&Fb=L+pzuSZ2!qIl}cwe>H<58QVQB@d);(hoz*CO2KPcT?pOP>UH<-h;CHUIM~qn2o|E+}hr91q^+ z)$ZMachiKv17d$>j2@fc>{dMz2XGo9u_9G|V^#kAEfMA=Klo;Ij})4 zOIrM){cJC?&}{8-JX!Jj^PNeGKYsnOzzIyl`px(D7xSSG5QG3(B=7pYEK1QZs>8A) zO04F`k%h2o;pdeO3N-69jek@gD8SKiqWzP+{Q1WI*IQEG>2HJxbmu<^k?W1rxLWW` zk^OrkI1GU7N|EF;Ot^NNmRJfQA%6*#VUmqFs=5;le=AHI% zIv05_sJ8SCt46*a(=E=04SNl{IN@6!O-&0Ye&nla;rwZcxaKF|uv1ul^4Nc(e%Q#4 zNoVyd5`Bc{{f(@>CuZg5OwNqC)>yxujyrmQ+iEo+dv5qWU?OYLx(da8xi4`a7$wkO zZ8E5k#JcibE?;*8HhcLsuA5q61gs-6KXX!l^-g4#ddIXtwVWLnZ#ju>~48>IvpR%=uG(WK_o<{yn!3+>3ho8 z{FBfW^M~H(&~Eb6;loJs`1jm14qrH?Y$~d~UZ+1>U&$lr5wqRQrQ>6 z*n>_7#B1f-GZHm^_h+bHY-ew+D(Q4Q)|nwqVkUrJuecBP?ND(#+D?@nZ>e7A6Mf|PV9s!$3L0*PJzo4jZ7L%fMk51ThFx%bhhm~AxcN7yWb(k zq5o<L>6jt-X*1GWF{H_6(bteJ#?vo5vBOInEAcCjRwQB? zg$CPnZ6&@WR-f5dBh0u~2|fxfwF@N+JP-#Dj8bf#FYVQu9WC(A33t*`QQvNOQ<-Rb zTpVpsdCIsZDin<*&(vl4B@mrS*yjtP^G^GuZ`0QQiVY1GdVAg$aUie3;r2T;c=j(zDZ-u5V zE=`-PHAuNbpy%xH9Uzy1;*U0M$Q356MdBo-`QutxosX`nf}Qb(WZwsUiEd==PLn&t)Z^h~KN36*kmuJ0AOhDkNhHY(Ym>Tuc0pyOL=W`7IRJJ-Z*I1M~KSTnWn--Pj^ zV-^v|+h6z4R*qLQGi$AYdDYGhjFgB)46Du9Hy^w zzS}E%>n4?6Hy*reJRm&BOv-A1+*oxLgr#Z($zI-9yzHvT1I0EKmrTTF`i$Tv*xtL> z;_d9#Au6hv%gqH6 z1TVhqwZ=mYf^(AB2033(#r%{-k3pyV`3kC?^9Mv>`KwWM-$9z06yfMqnBVljEeJ7C z%*6A7MGHLIL<=U_;c4xu2^*>wEc&rC4^#yo=c_byvxpxzd=rP8*ABQ%*uzQMsTK zgme;O>QcqIM|19m!oaadn&)i+30@{O$xD|!p-YkvJ6pB$N#{E)^SEBXAT7N$pyi6s z@tphq%`h?m-CN2{P<_8W*Jw>L`;YNSoD}0P$1mWIk16`wVy z&c=EEfYQc0fsDzo_`6SQ(^*!m4%!>mTu#tX??NG#7K@%OA?j9+6PT82fyV7Qdiz$s zp|e3Y!s z?r{V?_V3Tqmz~e1=0!B#B$*Yv%M({iCt-A^g9fXaVH*==q;K$~$k*H&f*4-mA0K)tgZ=p{(&*c^7TQOQ$-zX3Z? zju1vRvh2R%F5NAk%juwF^3-`t}3 zU0gMF+}0`I(9;>VtkGZRD=c=YYp7BRJ!%#|4XuWgE*1??*s*vF$#g{Vwj^Ae?}))m z3I|%QIU4&bTZg@|*XZ@*7_$OQqBVZpXNDMMD~zUSnQ~MZmvShPFZ86P!oS5M^UthMWL6$8^fU*$(DA%k@;U&>JZNH$SWwJudXlrfd++IV;U#eG*Ab6aH%-C4FM=e>T~3dP{3k zZ$H%kXs0LJkwc)%$e*nC2vFNfTi zC=mBP8Uh$>^3zS;wRb9>MpND%ww>l17WFbVW&kSKd|x!W*`nFt2fPZctb9x<;UhFw z3etM=|MB*o;c$lC+VJQth!&zI5d=X*?}UU9ozX{&D5Ljo1R>EQh)#%6NAIJAAkm|D zgXnFP(aU>#p8f3a+3&ZH@7>4o9mo62k6b@8_kFKxt#z*RJl9L_UM3MoMibwS?_CYR zioGGgAed7^B8}PSFGZ2w;2f=56t;IbjTxRk78v$_{G*D+6gc+HWXHE3nhc4x22CU$ z=~A&_w~YngkxezhGtQIFA|^payI(E0`xSsVK&xc5W`*a~$i-llJRCs*)NH)YUgS_L z>QwV`tB!UglW4|Do<3;S*!M#s!IJt@AKm-E=Xq(eC}jj)TTAZA-jQVD;sFg~Gvbs7 zXZtCHg=-My5viMiK7jDCQZ=x$IIa&`NgkII?-ip3iQ}eJC*2q5H+b&Z{*l4yiu$ba zEanfvsr~sp_ltn+6Vq?@FES#*#LqO^C}m5ZxM$tt`I}IaOvz{B`&aHBj)=f?)m>#o5o5tzLU$f#cw9lPDR@@86ZO zCK@>4v*X5XGsCk$-m+v5B0{xi`j`)Oanlv}J*jzL2yVU> z+c{qZPpR?URevhX=BMf+fNx|hxOG;axtsYD zIu}&sXNG34ybhP4c+je}_I=^Vf|l><3rdI*Jr_|+OAmcKyzZ;te}7JbV;l_A_0Sui zh>V>KPu`Kz`!FuzZQM0o^d9@$CZEkyslP?u#XPGA)7G6TPnN{tGo`Vd9E4gBMLas< zvN_*CU0TV`b}A7>MF>H3{Cv<@gZoV5ePDHFU|R=TZwa#as~ks*xTKrah>*Pg9thzQ z{i`sWS%friyv*~?Z;l6qx)q8_$56w;;QV{7fer-RH#R z`sowRNsr1FF7QWps4wjpBULMA^(1OuW(bT^xwML&Mx7!!&gpkf=(D%q9Npu~T$I+j zYGwU{5lbvXh=30}*2_R8H);-l-3qlI*noH+OaYGaY51h{3VJ3Ux}nZ&Y;5j(%_o!( zj6$=nkKm(l^{fa%U~mElXbXSJg07%;3xGAASaArz;Ee^A=00p*xOEB|1t@2%_stdn zy4CMxVEfzGu2>eQ^kt_1K}7xI2$CziqwM1VR4}QVZ|N7Ow2UQulJ&l zls*+j3u31ZbRM-)QO}G_CZa1|Fh65GGbrVIF3I2Zc>?awZ*-0&5VNMH=HN|P2okVG1yy*?KY8=ca2J{W+F_NxY_s`SmKygC2yn5 z`F5L->8YzLha*f{WHCr`6PZ=IJ4cRYeBg#BXOPITScUhHJZlq4;~wk=>rD!Hlx@B! zS6&^AX6Ko<$1RnKs(-v|h8&o>XgRuLcRaoE79W(+(3DT%&V5=bO}Zh2P_s(I777v$pT;iXc~(Tng99*5^hW#SpX zSxK1TO@(&5z2Q|dpUs*_n$<;yWEBquXe(ZT{8g01Mwk{%1{ROP()6JnXTXD5?;exm zhU%NQ{XF-PxggfSe``(fx!Bd?ls_m0t@X6aLo=MJ7J`M5*0Q2A`olsTA-wdt9;b=6 zZMobgWHj2!9H}}KN`BB;>$A>C&2`?RRy;G>HRdQ2*~#3s zLvDwjV$@6Xu4s2YW3o}R@(sfS1Fd4spEA$|NX#(?_ZgF^VL9<>n~{THu34&51YJO0R6R8`B1#aq`?Jnq$WmNNj~ zIxm|Zm^sn`vWcT0jo0?1-0hN!-+drn$*K0-Qsz_vHG63cBp1}r1)CFWvrGWeg=VnF67*OCo4Egg{P^!Zmk_Sz-f zZ6Dv+W6y4N&?~K9L-y76s<>dup|?1pI-I31;kWPQ8`+GY^|u3$VzDrNQ)1D|Y19el zI#SZnyCP*)Y_B79+TzH@4RxXZc3@dBvFz2cm#NC#itBH$Mz_udN-AGRX#a?7Jkf)J zdae5sGj+E3?B6saBobLrM~}Q$Xh7db)(RJYJA|!s=K&0(Z}wVQS+T37PQ4jWA~T93 z#`!aUqGHbSpJekP&ilu(rmIy_N?y4sPsoL{8Xi+Q^Yo#lAy95}IhwpBK|NxTrJwv<(Xb+h^so4;oalu;0*YrA`zdloB+Y0m&sL?ZvR|tNlQSPadi+mA{|yBA2c1oI1ods9os?JHm$kS%wRbsxw?rl2KoU zdPqCz@oY>@-KojVx<_b(Sg&3lmN<*Uvb3Gg-=K^c#uCfb2xpp`$(xI$aox7Riu+`w zn;}39i$4AwG8Nj++ig2RUZ*ke$Jp-Tg*DEoR$BtoT`OKitYz`pLYR7$_B zjbzVlT_JHJRW9uBg}=_mylonS&-Ys``wpr5J7oWX_eW`;(?`?p#@vxsvikP4cxaJ- ze=N%HMJD%zbnE-tt0kkeN1=h_(1E&>CJCFBR@xpLj|E~4dbcJmBh$Vm4hEB;RHFc5lVAqoYWG6}CpSpeaA!Jc+vLC&$Y(`k zhE`%GsZPf`T@vVSSQXwT8q`o_2VbAL!f@TZR9Ru%m=>ESayW@BYqfLdrC84mu~d|r zHl+7$kHYm{KWisJZ;Y`MIfnjtBLPyMBBR4Xa~(X{D?UgV#P)}Es}&Dcv+lGzN$0l@ zbbqILTK6#MN zHHHUP+-jCH?jXR}xJs^K+Z~;DXRo5Bb~PON$ml3~itMmr*Fh^-cU90ex*W@SOoiFA zHnsPYCnIUZ@L>ne*?TAHZ=aB#2+L+0tzBV1985Rgm;_BtxMU3Vj-6mIUA?|J$?*jN zWy{miOr8_uO-N$Tq$?*J6z|1bGA8Ow(X^{3A)$=%PoAa?sx7l2LSkM)%tB}7Vau4Q zqFw#*82y8yeMbTpXxQPX_(qJv$)l zVmq(cv+8(ESKKkCnqQL_n0!ZXOwnF9tH7h>mAUYJ%*TTvM3Pf&0<*u@l^Hh^W0T^% zTS{|W@zw)~0{_CEKff0{6LX;Kc%)ww(4&2Ozd~x$>V4)kQDgLC-nrADgf)Quj?ngq zsiE8q{Z(1YXvz4ozxedcGlv_W^+1L-^mCKmi5Ui;-2Pa1$W8PswAwV6Mh3`O@~$r+ zoY(+%z`y~B{?E^kRHWJW*2tJ8l{nPWv-{ITMgR?_4dC=jarOLNA6+A`csojT&JsZb ziwp(i9ryaPWK37hK@)K?UjGvSB3PEY4dhsGLDz;6i&`c{ZOWJ_;$V4*u0F-$!X6Lt zs<1&5rWOT$<^5;x5Tj!dcyRuOmvida--#iBO*)*6uHd-N!`9~H&|Z$mTN!uO!{)E_ z^m#7^{|;8H#RbHbFT@?zYP8x5Fn z6$7?8VK}ea1nAA4g(5S~Mi2IO3U+(&bsn`1@w6IpH1{tV7q@z5XUZ^#nk>i#Ofx*g zLlz5NI6-GB-M?!3n2yeD;T4R`Fgwgo(Z6+Rhc?(j45>Z1lx^ImaheO3S*6rEKT3g$ z(LV{+iO+>n=3l%Q5W>T)JNcYZy;kIaFDOvb?K9j_!6h3`KO-|0-8k#fC~j3k^D1;K zCQP*g!Ko(9Np%?&tS<=0q}Jg-eF`$>*jrW%TWe=Kv{qK{1w%{8kjqr_QXFKTuNrO6 z;4P9Ut|4;S(6Z_aI=o#b8kqWM|>-SymT@h6d2}^D}457)cEBixt z#EO#Db+8P+3l+>);*X-M-i;oGB!wQ#eTbkHG&Iq{({MLZlN>p_KLN%xH3#aiyi8B+ z@B|^GJ-2&gC6OCTso2iLsu~!>ehRlhq5LHmzTBQq!qOPeru|{W4C9~}V%wu}d@(G$ zW)Km_jta}Z=Tr?p&k~_z{`e6+JPy?6J#O_MGN-)Kkut+GYbPyoPE{>s_Qypobw=m+ zH4607Ha}e$d(#lm(eIoix|q8pcZ>NwGv1T+;81=bFmxNj{1hvJcQnS7X&tA^d`jkH zcln+;U_z{F>v za+ftnkIlfAXRmmH@?`AMx;dXVj5l2Wy0zsV=WAaHZox;&IVLfnmfOmN_$#ug}BEg{<5_F7$M_iq!~X7#kiHh@(~ zCysG{7l&^C8G@`CvL(2&%)g*Ga*4E@V=yh{srg=~?EP4zE3Ol%APv7;F)-u(tR_t$ z!W6xuSQ*HK?^eV&EoMayo0{!t&@tclaXW;MrQKAKW?VN56jPIG?9M2*K7U{$B^Uk8 zzTrdlxsjjURkzxCA=d?dA45xwaQaA|a_U>f)B6+e7@8p?eP=Eu9TBWNUFxA;%JIxF z4y2XEmGl%M?%1?m1>&cXG*!&8wEg0?R6KcZ`YBnJEM`Xj4}yupt?Mt|0zx$+_JmRI zkTbQJ_-9=e>EZtNdle#xL1M;!y;FISx{p!xyDEcafe#tW7m)n1g_)6WD_Ot%b4Bo^>wRi0F^0mGx z)+Hd6qi;svwx{|FVwE(YP$=O8RW6Ki*4L}0}?bdD#MEziebT6Kf~9unp_%t>9x`z`Ut(8k*{#DR&!3qG>D;iUILwYk<1QPnH-DnwB!75L1FKF33VKGG;R{ySG-1s}0 z)23~50GBj>pc)~)0`rjwiX7%TJj3;j8bC$01NcC+?(1UgQ{dx);6rqokGw<)kb5q#tE5%*)?12XA7 z*4?0_GaK!P;@9;@0zB79*c*4=Ee-Pw(SYRCkv|pH1q= zc7E(?zi@7i3|I7?!GA+u{+sYy(9xhfcXMC%H~tTj*!5pYB3mvMUd*V;HqE8W`F{f$ z%ZEIXFt9QZZ2aTJ*gR~JF)Ls$!NmL!r-j;QOo&==V@~rw1t}ym2i}!Is1V4F`ds(L1vW8PgDv2j%({|aDj}@80dlw?J z7$z`XgEP^b(mkIDb*QdxEG;qt$~^?ABV6xK{>3=myCy<}H_eW*R7FW6x1X8UBT2QNmF>e^e%~LIRn7vbH5c{5KwJSc; zUVu*EoS8xs$=}PwiS%*;I{vdp^5mYO)IQxJY0L4 zp)R2yefFL0( z9isWUL3l+ZFbV4c#`A8OYq<;wulyOuCRN`b9y1+)KQ|n3LIh-CJq3W{iu>(W+e>j6 zN%l!)FK^@%O3?0Yhs7XlAGZ$y&FVHXCKKnW14xNS|k-g>jX7rr>} zwvXb_zu2zNh$I|mA4~2dL{|zmkMxRL-SaX<$lOiRP18W8^_aI_l>ra?3EUsb%B-YJ zz%0VPgQk3e)!IkS1$P$wIz7)T&Ths3X_h;7V&s zof1SF_9JZ;t+u8YymI6_+G3hUt@JfQh%Jd9RVSrP-c%|*5r>~GE-9Zp!O794OicFD z-)G0QVVujX7cKhaU;{1D!{3!p4)V$*ne4Y6DA)?!ji(hpBPEV_PwUinPJCyuh}wxQ z!iB^Hq_xxRA3k~qQy(TAUz^wY`aMUdl!eJ>KGINA&$dW*R&mH({)sr|hZ&#}{VtCJ zq4A(Ah|CvZHMi5D^#IqXTHn$TkCjKBzuyo3CE@>r3@XC5Fp#ilNIu)lczN(W*k*#P zFXfB@uEN&}*2uLBZ&CdTq_E!u^SL2pVF;O}#!$b9$ddQaCSrY({Uy-wL%|C#=%#>q zL8!51gOkRJkpoSry>(TO<@jVIf$?GU9Yi?gJjTV8sUHVn7wenSzZoVN5Uo35Kc;pF zCICxFPG^WO%oxqf^v#^-7*k~&%tRAlTqCBo8uxEVU2d{>&&%r=y zuP4$|Z;DA5TY9oiK;60xhn`d1x(#oR^BhDnAB3JJ@RIL-kwQl6z=9$oMnhut zvAAzTtgzjsL^cnI#77tuE4b}75Q%D=Xfg1EJRt0tiArSMZ{u|$Lc1I|<9(+bdzVHj zdF>Q{Lgvpkl>c`y1T14Vlae1Oig0;u*oj#5grapF`L>t*V z-1+@*oMkVDHM_DhmF6;L3-6QXYW1`Gb_ryGPrh~_xB|AZ+HJ*a60!CGb1i4Aa)Tdi zG&Mc8<39>R9sUCW)iZ-T5=gT|4HB}tH#hUu`0Y|Z&V$SQebG~wNLzKJWj@A5+k9}t zxb|K6&g2H~ts+H}#KX-Miw|pEuOmT7IYKc(|bT>M%7wgt!q?b zueGI(ocN*;jn!-d-uW{)v%|XZ`7G8HjM!&bL{J9=fj+u&U41Nq@v;z5OMF724P1?eyr8-| zAY5JTwx}nN2e;3YD8{_}($vaccD(x-L4+KY`5cB(X!QV{WK+e|_Z7rD0_jb`Y|NU6N7Z;~T zh#<$+7A}B;EYp5DArK(a)#hgv_}AT~wgXmLS|}DGkJE$=|arYe`Ldu(gkVrJ`1= zTy2Ms-7YeXc1?oaePYTwfYlL;LS-htQkhuBWzBchSe!t5C-?9Ohl$?l-~3gcKDZgb z4}p5kR?7jqt#HWNxYyzz5=5)l7P0)k`itQ-nXUX`w4~?6_Zc#y@#KLXi2pRN(gaqg zCGu=)!ihJ3Zeiix@FWflAN6jrD7G*!1$~G61u(VPJlGm3?B_nt^rkXTz!hmXvk}x# zx;f&P{RqrOx;V0E)@|W%Y_Z3oOL82#^Odn{!#`a7zHOHHQH18>ac^qBgoJT@0DWL& za8~O2QT0^X$XK)Zz3+`p`F_e<){0t7ycipJ?(U1VhNc(H{<-Yql%r1&avhDa9Nu&u z4DNJ_SR6ehEJrM3*UyVw6uz(rqJ#-#GpkNo_++GZaSy&8zLcn~{Oze)s2Nh}Di5jR zR_V>lSjGG*YymxhEsP0W_(I_Hb5VP{Tb-7Pt0#DEDb?@b$(lYdrpYXHaglDL zPmU!)tvpS4p|G;W*N=av!7lAcZ3~ZDMqI;to*K=)t zUJnt0*gT=0C*QaA_U`r|)(>BEIM;~r64LA27!y^kA^54^?ePe~Lj2C-JxRZ>Arr$^ zu?pWnk^1Fq?9b17CgG!zufYy-jH`bcD`Kz-qdXlHd_nUczb>mCz8-+mGMAe#1iPIK z9c;K&aIYDL_(Z?<89eq~fcb0yj0gWzH15^}`!eKJi6UgLxD+BjJOiIz#*N&9mdr(h zir!S6%p;aa$b19gTeTzJ`u{8C@R!T_Ln#jwa8uU^7t z)TVu(07}M;90V8mEQKUBGa&DA>;_G7iXFPv0y*$pPKm z{m}uVi2&-sgmrosVlZrtC>9Ic){HG_It%UO6wt%U#;wxNn$h zo+^6DuVld-E0@@*yLmt;4a(@$=tb)AwOZL%p25G1ZX-wACweRB522l8b6EU1a#@i> z7rzU6kUg_r^-j=iTgjuSXB>7=l$inhzK$2KtnYJM}ytHSC}@Fd0Gw&@!R%a<%$p7?Sxn=KWvC+qv> zjgx4ZRZ(da#BvDa*};6UuO0Tm5}Q{YKYaIVFB;)iSB80Ag$>Nb??Hh)2I!P@i5?OT z`;6uwu0)|HiIAVb1kW;YEFxrHAhreA<}owY0E`rm`c-<1VJ)v7zMlSQWy}I}11>{GJ2(|yF$XTjFG1!S8G=es)9&+C@OE^;)9Kb z|5N&l8ltvU`>c~OA?1>sXKeYt6a%(>>rngZmS@N@yYlkPg^k7?LFQ3oFrOf*MdihW zg+q7q>n#~~EmhaqCAJ@!*r1mee6wsLD^3L}9gP_rdrqahxksW`hGx1%ElZlCIdO(J zoPRkX2!<_qFBH`Bf*-xDN!cc}Rs*dwL1xPQKZy{}IhI96ja=&JZsM0ON=mhmW?zc; z9TGbU>e8`Yl#c}`iDD%-1rUKB<3h;wu@v#V zTSR+0I1I1~ZwpGo|1Nd@e-xBYzyV~UL2gX+^Bevuy{KS^QtCd*VHAipmU(BNVXtFC`f*_g2- zwRaoeMJ|?7!VDe^srddOt>;Bmj{ z3570kS=hOCBu3J1p;(QJr548961ePkpAF**s{%Fb(qz7bQd@1kq`QDw2}@QhWBb;$ zmU7pG!;Rav)#SnzE(6)8iv0Ojxbzd#TODyLU`6PXLWrn2T)dhc6^VTkwn(VGD!Q?nk){5wRI(`{#ZTlQTpy|3&xj_oOSif+jDQ4K34necxTW)jm&i#uTF7S9?Qb<`tJlaZ`w z8Bp@;TX1`tr674`WAy%Ptd%jx=6O!GlvtplF=I{*!Xaa9X(eWUZMr81GUU8vH4Ma` z-rYUF`zGCxi3~ZOoB4U;?~?ei`jvs2u3oM`*&_=5F7UI^>y%a(@eF%CIvVi8VY9>0 zn307EY;+wV_+dgFKH8XbWpnH)#xY@O)$&XCw|1N`!`v;x3wnO6d&g0Rt)Vp=lD4x zw5!iyK9M8!!nw3TwQ=GqezA<14qA)v%HU$bMy4AO?>9RO!So5l99qt!Ggt+j!S4MmxA3L!_v16MNG$t_mtu{Hh&7;)PGt6^V> zO>%N`=iY)epv&XUu}H_3vv&Yo^GMSF)_WU}T#Z$h5HNegDyxd;Z;IN7SAJwvhS$Xt zqsb}aebE%$X5WDr<<=FAp^4Cet-a1;_WwyN%Gq|<`Idsj<7Uhk9uWYjjL3&r9Se7HdS;08N*6E5*95)hqKXH z5U3Wg6l1+5+Y*NOE-I|*AN2GjToOEBfCep) zY?*wM5e~yEt9&MmkK>`YAe);rh7H?7X5sNAtH&9;VIBUqN&0KE;oRA6Zlob?PHH+2cI+ zE7jNav*ca-=>yL@b+#B5gM~k!1o4e)6el@^m|F#2a0rN&_|d(}AV!MF!;3g!25Syy zuupiCyMK8!zv~(Gl{L)B#BFK7!~L}21b#)@nsxY3)gx)zxx>PT^y~N$TG8*}oiEYPx!kq0#RdwWm$US%AhDc3R(tX#J%J4&7Btkw zahtRHplL1m-G{09tC2J?64j`dyU=*12ekaVct1&P#7|_8#2gzuzluMaKY1>mrw>(e z_{W@EasuaWdb6JY_iV@eD?3GOtbw z9rGioM-i=gxeHX@4NejH^8cWJRm7at18haA2k7rv{YiXElcj^_vo8%iAiHYGB3jngP#E7MQMpcK zbtY5|FmhYtY(bdem2{*XPt%5SxKeykgkY=)ZM*edV)=F_`sLb}y$fHykvo)($S3F_ z?m2gI6k&lwg0r#e{Z4kjcQgA%eTt0C{X~Gihkgn(kgWx56Q3U(ZB4|Ygl>tFORe{5 z+<&tr4*_<%*69;op8vu0(uBE(lQAg+%XhJ^_JVGx_NvF?JhFM=x20>kecxZVOL+zM z6Y09SQUF7lF1Bl z0}jWG_rY3x!(@Ab#LCdW5)+kUtzGI+v%(+v^M)QYAG&ied1v$I=ZR;$uO%pz2!kL7 zKEh9nO*i$MuEjR^-VHv2Q4vPN>*7E!JQq31C2xlSHC6S z&52XTAP>DQN)q6ons3nZ4U%B&b$(86-d@9rzS;85;TJtS<`4vN^AFF-pY?@ly zX!sBrcR8I0CwWb|?e4kP_d2;lx`J=~?vz;zU{Hp(9|)DXEhiZCN5a+QSqHc$f%(mk z)Zx9Q#a9jANmXn%`lj5GgB0mWd~eJU^+a8C!;(K5e}@Z-m%ppkOAHp~-ivzI9ET5D zxpb1x6m*HI7+LO;8~xj%WV1B%>uR{k$z>}}M2MTtv@{ls$+nkLDiGW*H6R#&{IyB) z$O3m*B%mzOzfd;XO1EpZX?*yDVoTB%-}yvO6Awsm<@NlXnj+U>D~8f6i-!EE8h(0M z@u1UsEPr&17M7(s&=nER2T-6>{MtOY6#87Kj1kEheSY@?n3uP(L3(48?UL6P*KcyA zGMFi4k*Bm!v_yAqKZp1HOZwRmeGK_-%8-mA0n=wy4Zekf z47dQ$bY^(7zzC$X8Jzyy?Kb`!0tR`!%7CnVV(8M-rwb(I)nlo;*(U6NX58l5b||Fj z$X61l9^&^fU77;K`)OS2WRY%2`(-I{52cK9vY^bzCq!NbK0*RW<45tQIV>{S9TL7x2d7O-*3>%q6}PiuGkFed;1D z^da?SQ{F>T=I33{exTLtev0m)s&@YY@yw`vQ7vyX_5^5;8@i>d*OEk8T->FSWnARu zT%=tVE|Cde>R7Wr&4ijsq=$GlUoQ`8{r(Hy$br4J$G`&9n=I+EY9k3ii=!gG&8q3hJ6Xf%G`W>`lyS;j2h2PzB>n=#oZmPT-*VU=;iH; zmsL6bXv|f{vlUPsTP%ONN@o?)reIVoMJ+BKeY6iWNtJz?eKH@fc?6ZC3PT85($=M=(9}%Z`|zP4nrQ#ChnKsnH2Q9(cvoA zQ^qqLhd;dP*8Tmh!^G3bG1ZuPAR_xsugRf9{ zIl1X(5Z>=XHh*8_jrdAD=|saNk4FJJBB7?YK%-<4tx@!%$+}5n!c-S8^8`{Gf(mBH zIh1NH?692EO{$*R^wq~C_(X@ZJC@mcMn~hL9xW8L^5g(pXDz66x?b9bXu0svEK4(P zMr>`R1a#lm5dW4N?cfDf4z-4G;2*O zjL3Z#aGLAmfB~BrOr75L(@b0rcXd*xOHLt%^pl-Ux@jqnpw&Kad>Wjb8;}1}8b@eT zQT6tRwfo<`5Ur-FpDGIHk-AE}YrEs*D=H6tJ=aroli2no#v(~XV`)XtO-0+4ihzn7 zUx9&K>jcp2?Vh=Nj~6^eR&5ILmz9YLl^u#iVmz#QxHjG2EC0O8x?>T&anJR-+ z;NS!#5%hvKvNh0f$gYPr@4?3DsK*4R_|y6G5*0_P(*+o__v>rS*!={-X2m?bQ4(q z_OC*K^zgqF0@Sd`B`gv^EXiiz<5}7u66>o*4G4&8s;e*4Xp=``vK$4?D5Nxh9N-J0 z(=~M;U?s9AA&a6Eoc22;+Ekg&KY`)*v3a&Vqrk`}Sa}UGI$~z=&+h2HSNqO)&Zm%T zBBm`rg+NL#)K|?egE^8Mij8Vk7#36Cn^4svU+;&P2d(2fVS4=4Rm*ur4le`6*aIJR zY14hxu(BYT%)8Py;qlPQ+}#Eo!pgt4^8Yod+V93jNy$*6#F@Db+zYIdzs7mtfc8dfE)lcynSP&uPg)iVxqSa=+Avnd+lS!^NR8=> zR!S^J=BXTQFF#M0VL*J{;EKGwMoZ7*+OLX-!bIea*oNCje?gmJlbZ0u#4MqgbsNbPo%qnA$RA_8hR9nXAGYt^6SOb~aF@ zQjMzMdA@#THgy9IQ4uWinzL55(Vf~jFY~MPk(OPed$1?6ntXD>I-s&r>6>V=TuGF8 z|NT6pv#hY{Jqs+&2wL$H?CHs+(%R82-$k~mM^6ZQ2ek9VA`R6`B`4eEH>YXAI>FON z&(Q}&ZANn;$iTpj5(C`9=Km0FOhKqHl7-V=RkfY2SLJpSwWj_m&@595Uvqf>%Mb7X zH$!iR+wl_Rk#H6c;p{)AEi9qPjg2)R6X#*7JPX7xS35l%r=rB%ZH}aMM+-}B)T_LV zMmDGhqF^7@+0ZR(UNN^&VfEf{M(tL5}wTJbsNIIgz(HPpR_#O ztdYTwzM2lL?FRI&<7!NM*Vn=uR}9_Y2dyn#?NmNFpb@VdS?^qtvRn)Mnt%$oL}+My zt5y8bgSqqA44p9wBRrIN>GIdXuM>o7&-ez)0?fr6T7RG4P=KMu^xcUK<0qO6*SpZ^ z^J0&#UfBY9yf5MWlg?mm8n(Kxk){zI=YaT-VqY}wWPK@ha=W$EHol%i?*zV+wf)Lu zSKP$=id^oer!TJURoSq2j8X%33N9*NYa2+t$;za|4UPa}mEjleph63TR-TG_Inzc7 zfGWH1GS%|TQKQa2J4&@5=j8&``f!EbWWKvL5R;7l}<*Q1Vo&z5rP-ZiqtD|U*!p`Uf__tEF6^S*y4eicvpV9XYre%blY9R zbhaphEcR|@K&V&Kr%Ttf+`u0PA1D#3iKQQ_iQ?G1bbOc=A8LVEJX#TaGRwR9r5AkD zFT2kf<1Hzc3m4P#5!qTIR&J@~*zF^BV8<8`3CTvALDTwM2CR>t8q(bg*oDrr!-~&H z?(U()E()s+IISXuSc4oK>@Lj@BL+p%Fo+Vpw4NDZ3Xieu?YZ#6F3rWA3Z1C%fyF zw#t04htyi+JNsVU8()T7)+MNjq=_+^*_51IO7@IlOY88a+7qd^nJI|%psPsb&9^Qw zw?}0xYWYjku5W+IaXDx`E#pChr|gv(x;?rJB|QdCrXLbVu$85DgGeY2YS&2GkS2XQ z@nPRlgNs$iBY)(=|JJaeza?L!>+dq8r~W5SRK!DPxygnn=1oUjG0?}d zQ|FNk6q1G)qyz&Cs@;Cfi6=9Td#o<%Ri-6}Xy-^wDXJHLxVN-22bujQW@i>h$Yd@7 zyoNEgZJ+tc1<;%=FuLF2!06G6+=-P2#q#K%Q+j2feFPUdGjiVrK-B~#snZA=XCQ$@ zCW!mT&=3NEO{gL^_gxd<)E}WGYT(nRV#XTlo8NzRL=6W09tD$N**L8!S#MU;Y13$(e-Mq#$VP zvH;ciHVw>rZmf(q5#^J`{Xw~`gsX-O_3BW(_~5ZcB;Y_ZFOmolst&7S7J1wwWaCOeXB!AIU-q(dvatP!%uvovi zXkxhoCYfy1Z7KVK2*IyM;CB@+q&O|;bgS71SnUVg|Gu-?%L-%IvQ5C_v0shi8u+IbtOXo z1a6-UkB8=y)>+OBj{gy9y?Np5&ou5Jx#CokFl0BE;^-5X-C%833ks$HFWp`F|JqB};Gxk#*@OF2D+3bQ*#7p0IDEp=A0rcNPrkAp zZt|5#x;$xhw>h1Uy1qOGE``T&NxJbbLk8*O@wn;pUaME!2R@v;?s&p)3}2@0n#fOe zyV|_%jpS_7@J=ezd|h>-{=E|a`{=I0qRWNe@5B0lZxfn^^{)7uV5O<_js`(w@7Wi> z2krr6jq{M5HOvBl?aZrT;XChq`RL>iJcLN6;v#ih03yO{s5rh}0zU80q7DszH*a70 z=1B7F=bu1F$hJ@KM*0Jw6ud@X#2LkT-+n3(OT@#|+pi#y#g*hU{9mB+w*B*32m z?wlSCe5AuhSb*?dnXhf8 zaUn(4I#XM#(XOFNCy$y||CP_^^}eG{?&IwY=|72Z+cV@f+_oFH?!if3C0g6|w zloY}P{C4zt6pva9kZ?bjiA~T+0zVJ8Y;baE6u8USJf_|Hf83VE&gY+aR5O4>T5zce zM#kGi@UqF_(SHqhi@E+KD#lEcEFJ-bcIud_3hWYDLvAyC5$;G8#vP$y64{zcC6JPp zRn8F&O{T12E@Qj|w!cTo+|}!el^Iwq;;>1Cvx3uMI(|~Q!TsOW`$cfB#?u zz%`bv;y1geF4XW8EX$>VCs_If-gAi@YWQaHZTNujd*uOCGx`Imm2qc|yp92Q^Q-iu zDo>5?^G{G^Nn>M)rTmLsr2+uu=aFgDSi6kE zKc4qr;8S~img*M$WfQXdBEAc zG5OA#C9)XJHr!gh@zR$o4r#xRt(<1m4HQXOr|s~yxm}^6`LVxBSiWvXOAOIlo~?Se zx0Jlco_ep~y*>7QG2q|dgnsboZE|!yQcouE`fclgwp(O*^nSwH-sRvHH1Y3m=tAB8 zC%pr@?!nanN?YMbCX_4&_;TKl=-JzD-o}{tj%A?_uqUYEZLHsXt;0-LbDuj`+}dk# z4F1gL-TzD^DgUoT5@}gmjpOWA72tCnmHXJ3n)|L79@o~GC$3$;S&qwX7GwCKmz(gS_B5`WoOoVU-vQ3B{} z{}*j<8C7MwwGCejq)SjbO_Wr+K>-nvP`W_`q`PY=DkuslrP3kIqPrF#A>Ccl-MxtK zTzb3rzQ6nV^E~g^{~S|>L*_NlIgfeFx{+E`oB7%|02dvxexO~{HtzzBA38e!3Tq%@ zRsa7Y7TUO$3xmIzVojxt>{yi#kp_Z2Oxq&%No1);Soi-Ze}w-Z?-@a3W(<|kxN`8f z>%R~xx}E86>|X8A2}`{6dfz;=o|-#A=ka5D?eI!IDOmZ8$wR~17R@G&tfQHJ80JWnd3rFcFBYs5e-Pg zC#~Q7?gq25)>!%zxHJ3qN==}_B*QNuBC>{BHy{46CJe#|Ct7|Y-4xL?MHA)nc;M$u z?cE9gZ-lEy7ZqAR6;hI8;3qZ;RX=UdaaJ>3#deB*_F%z|_1F0LL(X5nqi^#6+wW+F zZ2)eoQOMiJ?yL_NXw2Uo{aF?de+IM@5`-V}1u~j+U!Y$eE?@?SEQ!M6;^OR9f*C~R zl*Ep%(~G!;_?*lz_QGM9WKYcgs$&rC{m&ulsR~m&JTFbcq#VAazm_Z82{*Q?=U;Yv zn|+8}2y*sn_$t1M;eh#PO7O)6v=zR5#Y-Lq9N8n&EhA0Pi}2F_f5g6S)un^)R7?@T z32>Ecl+CRJPcf~Z=_F^4Z9t7wu-Xu4zvOn;x;qhTZf@?z04_(>$gNy(YS#m7VM+%_ zTzKrKr9drJPJ0yWzF2z892>tjTGFegp(hRMweLO0{~~1h{)Vi7Jv@6p;JX53Uld}l zT1lw&H#@<=zikvH)($=Y=4e>_xKZA4KF_|YFP zXMcR&f&7zhj1sxC1L$CU}J3 zm!r~vFH#80ADA0yzl3}bj$<+F`JV1M9WSNon9XadOQ;xv>C9c!xPSP5CMe!sp+rNlrB5kF!k` zT3&h{(`c#c>)%(^y{{$RAoXp|M@}?cCY-7{;-iq62Ro>nSRU3d!dmx&tkE6sPr z$Zu5c5RZH9wD(oGZp_j&6k#dCpd7GIi{HqzmAyn6oM=`Vc=MWovWM2T@?Ke485wRz zM@LW;`=5{A@eglnUmV67;=-V+f_Qj`@XoOU{AIYbwCZD4{}vsdka(;8;?pqa!aFH% zsOAEnumsa5$-(xuu{sSiWDEy06jKFCTtYR3D^py#xIT204Y11cr3Q*FJ(c z^@G;8BmhV}F1ML&17c&L_rxNu9q7Vh($0p7b?P3_1;h90WNNexykGOMDJ4Pc;^K#b zXVGX~AX>|6#n8HtEaYjf1I}Ey)*{vlUCwZu#xrjQ>jV|S_=h6mv98Y4<d(GDN}lG!qOvXMN6>d&NKQcHvv# zPz#gDZk>v)x(%@j`Q_#`TszHglxB3I$8Y3XKiACLKf}>RQG8EY$17E5qnc`lx*(fLx6pbWz{_V(Y#nt@(FNHYhxB&JXAtGoB)I)$-km6|dYvv1IEu%>(LFyo z+#-9#!-{?^U%AbQ*$t|7V<&5T#rM`m`LBAryO%vukv!qU3yw|0Gy#X*R4Gba*0e{8 zEGhdh8(eBE(=M{;j=$%JyF|LbKF(@=JRQinSc}7WnGq8a56-jpe&w~CJ&G0ed~$wv zny!+nxa|hE2k-iepWIuYQL1oRTLkj~Dd4O0d@+l?y>k2Z?Sx>lY-$U89okXnG)65;M%PoBPgIu0-gwFwzv6u`&RjJaL?`$OQNElJuyYJM z_Gx@i?LddT*~e`+B>`Mr^r~+m<_>H|6YKp8@L?`CQoj@=vid&M)-+gH{}UX(O$CQg zTe;%Awq?uI7M>2L0CwT|!hg;l-GQ&D2y{evU{QU3C(n2tf2e?caLjgCOZ5w5xp^xK z%S{&c;B3A5?FNNZlYnXJ;w*c5mi2*0rtLZvkq*SsxonM=$vrn%y{@U=w&A;BNBhR^ zaV+sj#xB=HZBmYgFh<;jwK&Qu&20RVRq%>wav(i|NHO?TEJ|3k&6M?Do}d%Ni4`p_ z18Q_f59bUw)1`C6NLWmp!h3Y1!Cm=gtY>ian~x7Iduxy86vmQgUuNV1QHK43L+^A7 za1o`lU;19Y#GhK9sM7KHpoY8}{}@?>3o-tbRfoL_z`S(?1|+E~$jUE>;2x60mbNM{ z#dJaVcg79QHkWU=u*x2IWyUp$Eqly{_E<{r!FDm)=So8=XjmmM= z+Y^Lju8$H@UW-n@6DD`h>X~7xiQd;TE>t{^Ven&Om`^+mx%l?A!U)gq?FA$p~C z@BU@viVP3ApQHXBKij-JMYNBx{9h}LD#88+glqfB>_dQSe5^WOi7Y2LfdN78gtD;* z>c~i7mR>&^zi>SQwu>&8jeQ1`JXxq$w4fw9al1m_-u@oUDKX#u5t-k1?}A-0o#0hb zI7ah@HrzYpuvlGkDm>hsAmQ~8=nAqP6zE!cAe^7$Z#ekI$A>(p#2Hp zCCHrmVY<;$RRTD0)fmjQw}N*p2iTSr)N38!(lBles#tJhiH+87Jt@(GXeIc8p8ECEgGtV+ zQLJ<;NZN?Ra)2rzS;1-(8vl7Sm|7-1yBnlR$_?1U?`2`PLvm0j< zgV2zg>CQ6bg>PG!iw9$Hft_9D#9*@M3x-$wE~lr?ik%?~xEdQ>YfyR~=cflIWdTi^ z4WIil8(S_ZiClqcNen8UzAfy+nISqJ`i8?4B$lIB!FM{(U-PjzUJ+T{MGDjR?8bS{ z9B)%d56fK#`wy89`WfArvBwD8!D?=8a%-!8w|lSDXg|DSa7EM3UppDvBY*r0Go~_2 zF<{$y<2MasspG^N)r(@y7b)Rn+yJ9xaTu|66jgoH|JO%s)}u7ljXov4{ zHt8MYJP_qYno3`UW?mw`6<)Ji?Z*~wcDTI68@Mt|X~J#h1L>!g2`Oi$Zam~`BCxWV zF594H0@QU|lEzb5TiO(h`Sp8c1@ktT+gwaoDihIKs0xm0ah@@O)VwY%p zdx^PcDK(B`=H%pYZXxwzUy*cKi~4uWC$Dkz7x6f&FtG_k)L1`LdJ}pwg26((R2E#d z4_Htp%L!<0OFBPU5Z_k*K+p#Z&igg$i@)AjiUAQSAsKy7@>UIoHaF`@RFWRNRJjOq zhw<4?R_j^3_IA^H0FN96x0+=zM%BC6Ms^Qpf;Eh`RxD}#XEh?#0wR?M?e@^95Fr#VQ|NRP1M z3>j(6QPQ_(=>_{2=hlTuu}Zb(%KTATUyy$)F-T9Vs!a8+^G@lw3yAVSZ?HzPmZA79d+_#5NdrazgT+Se$UQpK6F_lx|gA0>sVUTXYw zcR0EZaPbACkE=6mE6p&L1+fImhpw>!0J_@?`UYZ8?7T9BBTNcCJy`0MSvPJo43fAsr=}g- zb++hS=XVGGv_MbWVXy*ZCXC)2{{(LoURb&>J+*i(TZ+}U9?^JVaV24;_+VRQdUCwR zJ+?QY>T)8onMYTR7E`WeJ{;2wi|}{i?I(bbvfP3wV{N`Mt3jn0-@#N-i=A~`OGvVH z{@Oe3xK^Ls&?d-ETCk{Q>;^P;E#ZumnyuEl;-x?=n*aN2yWa~Q?qhNo zKzeNvMU9EWq zq$U`}4@SC^WMtmo3(H<1P-=!kNS#P}0O`VSr~|EmgYQ=4Q+lTO=iO`h7B#U0tve8+5g~dXRP}5VOaY&=#k`-LM#=13ceBfbK?l30e(JDFd89X#JTrw+jd)wd;qL#6iDP5}&!O!eGbmKH}1cRqB- zJ*y@0k$~Ub%XOHOJFaIuiK1&F??xaA&rf0b`c9QV``Pb8}6$_Mf^+5)E(k3{!s-evB&%q*Qi(A@Ab^*3lp=+vZI3N13u zZ*}&p+gBUNT+61vJ3wh&tv1k>u>DfxemPysw=6Q45P{t&`>hzZVKq^gwY)%$BeE(5 z=hL?~jFFvxR@`1dGf|QodI*TqoEm%u!~jrt`Hp6 z8+R6lzF=SFj|Qv`D+4nu`06IG`|tg6bWK)4&VnA*x?r2^Q3|pua3JNeN7$Or>nU>v zpF^Xiaf*G>=vg#MYHQ1CDv5*@fXJN4TS?Mbm5;_50YSj z?#$VJ>E@&O?m7a5+AS8At9|JuTbVi4iRY-A^Uxo65gesc808>QS_F(lY9L2>a|RW4 z>L}J7TH{s=kzoo$$E&|{oDb>6-G7P&Md71I7cfgZjyJW`nTGLIX_Xbmz??$14c3QG zlh8Hk^3~8ejQ4B>*vUy@GXv3Kdx66~M!DgL*jlxUH&H8rp{WKH%WYeTQKRDC2b4)( z;rdo4xR`s7Yc0Za0IAv1$qY3RPSIqPPsk3R*jry=e)h+mb4mU(iOzpjHkV;8AhGc? z6VYkIzmCpXWXZl};uQiQi81bN<@Jdi^cp>@Ei0Em&xnVNH$DJ!a^Qz3L=^k6h>+t| zp8N^`)fY2NT@msAS}TWy*PQL;EP;K^%UyoA6tWmh0U?X{NB*KTue4%FRhYKZ zEV=J3XXZrMFOxVu&}(5`|9DL%nO_$fgWI+IQHCJ_oZh!O}d+*KQ%57utR?G{>a zK&RLbFHabKlz|o5pd@R%ZVk57b53`kfz)3Oqx^ZO9{s~ijKWedTG*G6_qt@rGN&p6 zkY8rszqq2Apkv@=p7Bg+yf3(G+}LFjsb{Ka;hrT~>Ea!qnyypAp%5!l)^Z4s-LxZs z)6Pg>NpwD^MOsSy7_V?mC1+LtwHpocS$ipFuqv`MGUxnG>GyhyXF2_Xf7VlI-(I^K z1kRNQxmR)?3XTZ*t^=O2y$T+RF&0{ypZ*7+sP-pfP0r zH`OoqhwA^yxcYx6XbOT2#9CU^wcPAXlCNt0aC&(Mb&cJWv6A-(bZonOzR7>n=r*2i zO$V>P=5VR>{{19%rk|5%`~1h?ec?%Lpp(Co4O_O02zXd zfBZdj!ynK}K!X5f~0%W*a%bz;t61 z`65*ZPVF@Qx-{$Hjpom3L8{0ktCG?!snKkal97Ic8@~3kQcrZCl0*>;Rbv5X+pT^wR3lz}RVZaKC_rXD>C+{y37bwfXdm5q(Fy3EC$ym4ig& z!Qd^1+vrq8WaJ5b>lEW^hH;KV)O0q8Q*Nv+b828hH&(Ste~#}4Xe;A<`y`?@TM@*k zbj7M4*0N#1RgrzOdfG|^k`dk%r8vdj6b0^AFhc>K6E{3w3{AZnA5lGrA2*yP+!ucE zfYhIcT`ON|J*sM|F6uUfgvb?t{fsz+B=$I=KsC zPcOLn&N0dbLXNpH_`j(=elw__199LhUu56^nZ4H`yb)&oJrBR-rrxD!6~ioIUknzk z_xQM%yzP4x_|<=MqP zeDBj;m7n49;62q9lp9zWw+k4;)`yso7H5;92K{o?^gGt;a3ZDRMU`Da!>4;n{pJ(P z$HtG0tP)Ob>H*S`;WljxalhlTXP?lbY^*?EpOT3vmkSa^mOve7NL_0)guwAuWI6*c z^#c^SS7>4Ifs)Rc158{uEUP{OVofnz~!Q3aaWe+3-oB z<6@ZFRk$3CP<0gQ2NSOXIQBuxjN6eHA8@YbI z)(ca0Dmi@(#7yc!@3IM}Qv_JW4T5l*+|#$;KKcSB)676?SOT^flakY0lkvBZr_^Dw zPlbP1sAJKovdjv)GdFqwJBQ+|mIK|j!E6BH;E%y*OTt)SfxkQ<=-M~}T^nWdQ|Q{K zfOkVg3TW+MPVW_q`09r{RY$PoMR@SUU>UcIS1x(w+;k#ONX$nX-=4GHb!d(fr;C??>UQoQ9XJKGBOO$O7o zKOBMk68p&*ufYBO-Gu;Oz*Rrrnr_%#uh@_q+BOqMec25nIHa5~e~ex=jh@5Je^lZd z!gzdT43sZ=FtbEJA}Vo1VhYqpWa$ljPo1^P984}$;@OsMh6O?)mt6*P3=CM?JqELK z1pA8y^;t#ft}*P3?DeU0Ur z{4kRs>EF|@VZct;5Z>wo9cESbE}y1yd4b(EyJx74Ov%x;T%-C$&q-A5s*K}R2!W2= zRsGt1qdJ)x9QI`oKRC za{9tSr`Rf8v7u1mcZ@B%_Xl(RYPg~%ntCU@f&FafHoIA12}a(&#``1k=I;=qCMX-@ z5k(9k`LlIOQcFQjHKDxld%Ats;LW*B8t~%q4-E^L-*uh|J-5V3euLk8mf<0#Ds`ky zCSHM9(Re*NY($x}{kp_uZ+KtwMOU_(@fTss1z4gnpJ7?+vBLZi z;?8F;zIFyET6U=xQM%l$y=HCbba&5eg#KpP5MG>wF}#(z7SBb z#q&>ksnEBukB|fu%LFrQYr2yMJ-kjlRpq)lRoj!4b3|uVxz$K(!ZWfB_yF}6Dd8nX z?_qBBF}#)$WmH_Aby!3AUD~zPYFy7rCr{U1%~yx=v>!d!2v4ZIuCrutBb4IB8RjBU zDFuT+I&9-rTgc9G^qlU*ohJ)A&PzqtX*L|*A6DUf}w) z={<)cx};XvZM*rWA*6Gn`56>hdpXYUru6XBwH(czKw$#BH|5w^;filD@)E;ov7Z<{ zQ2*#AnNg^#74|8cp2~ck(%cp_@IJ=5rdFP{*>3gCE%cGNEtEQalY0gEIOB@QC7Hs} zZwwg>RPm9VMDON;TaVSqU0jA5GQAoHQp75JZrN%}G*oH-Sar{Id9q(^{NV9%(8}@N zBVtsB$Zi~MXAg_$d{TI-e#O4p-76y}>7TCfl0NX1-m|9(f2=rM)J zd9ls-2$x_bvW}u~3;6=mY5F_fmkveaZ>;f}vs+|x^77`W{k5JQwh{bhLG3uV+l=Ng z&P3uxf9Q0%Fa6p<)d_6#6jTJYJUHLr%*-?ew{mrh<8Io3a0ZhocWI{BCV~ zR&m4Vl5G%7DbqD%Yd%>pwb#gZ-O!#CGP}WlYq~_zP&pUz>LB@(exiC@lR#O4);p$&QPQ z@etzzE&>+=^CDAG2$RIcq(m`i0N0qayvKHA|x^{3~?6FBneZy7Ct|cDSxeQHc5+=-!gZmyhqdcT#3arwrk< zX+Y<(Y=hsHH1u%nq7XUjjLT9Q-(wv6mo$(F3=iIWbr@lnV?H$aa-S^coGssnC(>@? zFnURx&&HixDhCTi>rUAyUwxQ7Kb=fP2kYIyn!~_d`I=pMt(0t&_shy`<;3TWwkM4} zHkIx~{BwdnWIjb78e9GP8^4M*_4ltEeEkmiwTh*R>GTFCE@8aZ!f6MmEAZrf8;kG3>g;CxxWzh zj?JBWON?A?$|ugrBNpMHuBi@!v?3Ya9M;)Hy*y=j>paqT#r85AjwaDgIQvTZ3 z!*P5FsaH~0uotyGh4}h>yx=A0)v;D;5rjUhPj>HXeWE9Ryy7o`60A?&d!#;J7%lig zE|Ludvfd+xl7u#`jTE zQ$fnJ@{;rQ$y4FuUhz|v<2{3O=i{g z-VaLpIB?6T*UwMXF-rw`>kElgkdT~~-z(ait@j16V<;NQE8{UEAA}Uf$K`{t?DrKYIL$ zvK#kC*rv*RB!~3y&(=4T5AF6DBPV(<;UDFYUkF}r#?8-S^w;h_`v5a9W+tJ(98Ax0 z)LuTVGgyAZKX~r<7l803URZ&T(4L~w{aC@>PJ<^%AtspfDj#n_K;|PXWoDC%w?%wv zu)ZHDrWE$slCZv3A=QSjQ7O>!vtF)uZUYJ65A+!b-}V%Ej>4Al_`4**uAhn7qTX9#M*fhvGOFiF>>v0oF@jWCtH@axUfBT-?DB~4rw6et0IDuDu}>_ZZc_C(_m88i9c@7qZ-MpmCR&pkgxd#2D)zB(-7F z;h$i%j(Z8O*l?hCACyeA&+T#i=HGO7Am*j87TPLkC{S9VRG%XrX1QB^9(Gcqahcd- zTcq{4#ch?*;9|U^dahP`=W)iW+c+YcY}@u#c5m#q{4n`~$q4u)Ew+{SVYeWxU!SF) z1p=MERsRo<0y%iqGEDFQ6cJ1~21|>SnLo(On)*wn4vQZri6_>awAS!+klL+ro^NyZ zP9DW zvi5>}!KH2YA)_e5?PIa}~#GC5OFT=~tKsFB|6N z?h({%667b@ZtH*9h}xzT$Ez7>G!q`=5p$=95Y`llTacY2zQ1`?5*&j>Fi{Pz`xwbC zGL$gYO`jfhK1=Ryh6O`raEClj%^$OPr?0gW>#RFut&%IgGPN8>@`LtneA%?}$}+uL zLzqd-^OH{LehIr4+AvPh=4iDXtNJ2>{^!T$ZSkQH!c=^Fj3swsk#1*Qwg zlXnS5#TqxMDyEziPbmkwIkPPF#)&%snggK$?U>{)LvWq9ZGB-luKiLgvE*K)KlMAN z?Dv4aGY07>##JEaX|%u_KVE;immy;OF%T#srp$pr@o$1te4gJ?Q|)h26E-yuVo|Xo z4C~fA7DiDlf56J|=!a82 zbJbnmcNUXKxMNlf9cdP=wQ&ajt)TWN5M;x9WYywVVUg(EiC-OH$7!}%>H$o(-;y|R z{We_49xV{VQs&$31q93*n}tBY{5OFQ*4N(#mGShS1~r;0agQm8&^O-)^{S1^ zzQJQ@%4|%F*LZ>)$&#pprA@Q;JpcR5<>xKF+7b+eUlFTPnc1Oxsz*7HZub#i=}$xn zA(5ZLY%Zn zh3tjr=lG(hXF+|o{ng4o85&7q77{Hhvu=@ZHagELrGEMBSuPW78_9q9&e3@Af-UmL z{>w%K{B*901P-f;P{gOT!>kFa0d{>bQU zWv!VPl-v#TXI7lLQnnr|DQ;9!KUopNaGt>;vgM)wK9ZP(Xfn(cs7vcbhnHKV}kiAL>ALU~gnIm-`>8~9#kGt1h zFZPzWO!oY#om!w$oVZT3F;L~tJzj-ntdN8PTi6;DRB0Agzm|Pk} zf^hR$?Yn9*P+UHFgGW>v09cm_-hCeU1}&TDwLBeHcmg@+%MMGit)TzFVUo9g6Rq52 ztE&;ttX+S_U(mzfaz$gk^hWDlJ!=5|bC^!xAh{}@;~F!5J|ktt4ACWPFR z8P*EN;aJhsrU^({N{1`|oD_oBQN_>gEeK`f`%QP9bl0}Hi3Q7JAo3=){l|Zf``m>h z*RJ1F-xkHkA+*64ZyNjH()Dd~{fcYlT8M9la#|<7&&KMH=%cvG>lDML zp}O;c+E(C6p!c1LEi?kdC&BJ3`}zbd6+Pd5qdi8XK_>*KT|c;e*ppYeaK8IWWM6ju zTGcfKc25hQyif94K_N;$qOhW{LUQ8Nm}YYFTPuqD(ER{wWpnyd9VN3=q{i?-t9J0P zdZ0|U=-Ck21TI!Q|32(@Y{}9AdS6j@EA~-g7*o5H?Ww*g{mN6&uc@CEE|jkCsObdK zi??XO-fg%?x{{}+iwqD5m%U5{0-?VP{wQ6Y{C`k7pp`Hc6%Lech+#_~)jjFrp-G$m z2-&2v*XqFZ@i(2cWHgGZF?bt}xFq-)BDWt5N3KN2H7Tcwm`SMO7^+0b*Ti7l=QvFA zOSJIGk*}V-@$~|?vcOBNRG@r2k;JX;tX}hl_7LqsYT+1`i<+1ksiN!A$BV@7;|xXA zuVVJKopu^9@#^+{cBzYUsNPq3Kh&>auU*;P);><{+>u(CNS?4#qQm$e?j9_$YJTTq zjCK>rf%#$h=&Zv1k<%$|y!aNpx(-98o$CX%6D!?Et_;mOsPiT2J+YZ}L?U-CG1<=X z7vgW2B>Lr@J?my%PZ=&xj3h11;P9-WE?3W&Pt{j=Ux&>O$aG$xvWh)DipknLJbM3r zV}Q>00cWup)$T;B?zJaq;47g3@{sHYhrr2X-qb$GnhL}{aKH}E)PS6yRL$ou#$u#h zLJL+@puHz?`?;$@K;Y_tr33`de-~)P-|pNB-OS8pDRxwt2_1w@jhJ4cA%XZ)?LM34 zNN5>8u62F_dx&b5i|KYcSIxzzyS$JoagRK>L^vcyt-kxA%l>8hCmI-~Ey}eTCI)Pw z=`+@~r{VK98R9~4VWI`0zBis@un5?2?&wV+QRZ@LxzLF_Q^ZAtNkLo~r5}^Z#Z}hb zSmDa{rF22748F^3M475Mm!^QpqK@Lp#{P z=;SxTLI=%ab?_AWldFLP%6K~<%6fRUt}42AW|>?fMm0x}tvnT4{*D$LUzVuqOBH3S z06zYEjBaf&5XAglK>obN@#Ol6MdrIT-QL4lXQ;GTE1(e**?yZYMT<4w&u3bxYe5h{ zr@%CqL+O#DBk)8HE@-gcw9R%oer_(joco-n;TlvsMc{hF@YV~x^^j$I8C`p}H4&j2 zxifBgQG$&e9wn8Nx58hx1+gB~|4vCmn0&_v7ehdoht38X|SFmur&AY|Rt`8?f z7-SQV$KCUd(5P0-Q4-|8hF>bYvbYYnnK0gTHk0rxpm5fo2s!`JO8uNw2v26`S*)wD z6y;#+i=MzJt%;(J3JrtR-j$ji#A=A=iCJplPA|1)me7?z;))r)H|kY)6*xP82v=Pl z-g0e@2^-7}9;hO@*;K*fbl%?JMZEoXzyXdyG^SI*fU(2fO8;N* z_LuU(uoX~#<$qoI$`oDd1409^KHhsc*UKbLZ^*pU8x_f_k~Di)lm0dRh=z(~YRVak zz3J%f z(x#srPRO(sO`e*775Ot9+2;H}g~7%Muyb@0Rs%-qU55GUYyG{+;&WXc9x%8T#!S>G zF!&{7R1(|T+!9zNwf7%a>`I_;^&yY3%&G263O%3EyNWHl;dSuFgYzcgnaAvw&qg#3 z&m5Ki#;ODV6zwudGm1NrEPl$zGifZpC!wO8?qa=@J5L;we)bjP1EOh15V3ju^*PTc!_RQ7D(^SC zM;GItPjs|@{IVNKTyG(p%Yz$$vpJ4EfnHT7YDn#)ee;4*{#!ewDcjnGCza>h0s<|s>66x z6AoBs?CInfS23{iGmp3DeS`2u-4TZj@Pji3K1~i`) z{)|5;bWq+Uf*koQ;#zE{pT>IV%d@YLF0AlfQ0}xQ7Ssy6an=RXG?vk57f*;Jf@ccl z;SVmHNmXKh_E-zjJve4X?Jf&f@CYt;tur(1=_{sr`zV|Ra&L=I6IZI(V!w1~G9EsP zfN6Vp%Q^j^w=3&i0~SA(%N)L~U+yRg^srKYmPqKQJ>?| z=LBbo>m8A6du%@7#IRd*S?qjvq>FmVX%9y2{Y>(J{mc`uB}Wb0v&uM>SNFc-fG>$U zZG+x#Zm>BKJODNpa>icp02;0hw~=p3e>a^ce;l3(Ehp=W=8c#FJ0EVVyqd9h3+|y6 zjL>v00D;;{U5vEd1Nm*}+a``1O1?{1uCIWUqOSLV~zX13@Wj#f}R{cchUNvy^a* zLx*!e@`X065+6F)E1^20D>OgP5vB2}^VL2(x&Z>ktHv6#QmaEPx%yxQ76nR)E(sZj?6mti^$CPQMG#RN=_m{ zLUoN0$E2niv+g+KT&h#rOGfv#(e>bbNv#TRBDz#(X9*6Lwl`-L5iEh$W5qKn^hoHp zLIK0n&hY%dOrSK7H{%Xu(GRgO$X1hcHOAR)&9`yEO26!AhbyWL%gQQb$&aQoQIQhK z-1TA=id76ML#-;xBYLX8K0&?uId~z>Vl+=9i{I-!_JVFCg7S#=H^g?@IfQpGmfT(} zN;`P-eA7!xSiCBP-n^-T5J#zz%xjMtv4CGkWa@2y=P;{d=}4Ci9F_u z3=YH$3Qj8x9q@$fEZ&xOxDT{+OsHq_`R1av8kGZyyh3A}z8o|Mmig3TuvU ztjf4;n~`^7VpUd5?^`b`2b!*VNRr}Ume%SAzs#wY@0%&>R7`iS8@Ft5ww0?j3jV1R z=cWJh{+amQ@LKhw)D>pJ*_%6=LQC5hNo`AoL*RGfo~$I9O`EKbd3s*S5!{iSoGeC_ zEqa-~`s&KV4c93UBdGbzB!QYeD{eoiB>W&6C_Xt<&o-5}cG!qb-1MtbK=g|N{PEv5 z;Qrgn+_%*9;%O~@go*d=z2{mqjQBjiw$VDQg+#nJ&0tJ%T5|b8OZbdgle&{9BqVE* ziM3Xh)E1e$WXCmlMMEI^+e{_~c|C_;Az_<`Mt#|y)Piq8-%-AWTwLm2Cq&NejWSjl zLI;oZDGfK~_)TNnP_|UXb8ku$dvjb}q^lUcAH)!>XGJyVEGM%@L~P|#0HVNN?kB;% zUvSw@E312ZIOFkIgkiz!9q9#~&lUq+?_*x949MWvnKUhY2Re5x_>@~myLZ$m$#t6e zYVD9b#h&1Ip}-U!4NaMOKxZLucexpsfmCTEx0`Mi;B1z8{iP3ppZz6>!$^xfF7!8X zMGHb%-L!!q^lyS1jNer&Yqh+8)U0@J<)-5cV2CV1F%M!#RU17h9~R<9q-B0}knWFDp6B*yA{C(j2V%qx3_r3WY1KBjk{cWs9B*NyXS>*N11Rgxj&i>6h$e#*LDj;)Mr)7CX1oOI?DJ3L^z5 z#Z-HYROghwS7cqXAMySvz$oXtB}M`=h3Z_LA4bQOcl9`bq?hk?uLb6QLY3IZ8QfS3 zGWliC%JDu}(3EF=ZJ)(ob*QGJEr;*kBNR45wc(s`o8vbDvhX4sn?|Gh#(O~Ln&3@W> zC^tGg*|w$X^KOoL?kT$6X&cZ%Jz@gaq$9gyg~|`*Afoq>Yn{xw8F6msqagYi1+5fA$%-fJE;l0pk6WQmRaS-OarqAdL@I#cu4)_2 z?xWGg#Mm_l&p!o&2S)!a7$_S`l50YfEz5Knm}XkAg32A5h&ZasS-0z&tuY33wL;fn zt!{Lak1(PWd$S-r(b!2;2naf0;fn^5#UJDg!Ustz4v|vD&vO*o% zaOYNt0!(J*rj8vI7P^kBi2zY>t~|`U2u(goXK`oJ-rT)zdP`GX<(@72x$o@_65(O@6~jYZcP(Oe!<#o}R-MTVF- z5w{cc&BY9s?xqD55C(yoX%f3ZITgNLnDF<;m^b|b)vQ9_djvjzSm9DG@4R@s(^kd5 z@*|`p9;Z>PcUO;(Aw;J^@TUm3;It3 zbQm7XXxp#Xh%k5mC~+ijgOy^?k)zm4D`fZ$MB=;Y*Gnr_b`A+fPIDMl7J8}Sw3tnL z0}e>O3(e78#$LXW95wdA7}$~C5qZ3G9OYIuj$$ciO{=Uqk#ypYxv%2hoHVeejtAq6 zRCVu=Z!lMwWH4rXPkf)sUGmstsGG)Sow6FYvQxZB0|?y}4G3C4=B1$c`hV;q`H!{| zgFkA{_|HC$Uuy2ZOC<4xK10K{m#?#UhW%O#(Jk}%1W0iQURk!L(`YU_rtZoshVh`v zMdzz7Wali?CsNHJG(q!Xah!g8ow0Mk%l^L84^^w}uI&Wm#O%c*{o!7uy1mkTPCI0C zC(%5(qK|=5xwKx-u0eEtkyRKK+b-0Kzv+Cq=g(7C5JiMEslW(`aXAbZp2W9vEu2h@ zZ=GUe6mvZxMEr@Y>juRXdS7BV+wm$!b#1=sA!6MNfby!(bVF7RmQ4|L^QZs=4U)J=A*O3 zd;O%eD>qjbO!|rI8PEiJ`~~2oBbc7PxdAlJ;g_i+c)>u*%4CGJ@EhP{$%K zEpP&+&WY~7$VL|{)RrFP3WC3xMOR(rKvRkOH`-bX)xX$U>xchfYk41Wzr4zOh!MJ? zf z#@KX3KKr)f|3}+jMn(O7ZNT^pDJ@7yV*mn52nY-7vJ)j`cIdlvnq9UP`!~oJ= z58_TJZZ?d$ZsG4gDdCdzwk z0gZcv@Th!kf4u!YWB$N%`I9bjW zh|PG}ueJ>>AU3s?ii_hwY|KVUZ&m03u{m63`#Sj#xAB1Ve`6#_ri@jP(x$AC9Y{r8 zp+iytW=j5)H$2Yb9#ujDQGE=PK6yp&!4&03?Kc_ z6(C_+LxVMn8*aFv%;bu%xwKLFtiA&|6tb^}uaHZP?u-n5RbL9QAcMP2Soa^l9nt%_ z_W?X>jbGHcxA+xLu9qnN(y&jtH)2=Ve0C)|BjE5ZTXC43JG-M4%$0ojoQ$!E^3cMQ zEZGwrKEj=rkX!W<@%r&}n@^KRT%E@)443(*CsRal$)pcRnd6dmmuXs%+f4WIUEpv? zf$jg4FqAxicqh(G^j|Fwb6>~dA;(-x_R{nDAXicY0x}MEdxZ0YFhqpvyEWm&3W}PI zYr{qlz!A}Gcbg>5;>zCN+N#=->KWwa&<4BXEw0tasvo&LM|3ihLuQr=io`~5OX6q3 zd^NE*D5hQvN^aB*X#PZ(P40$*UYT2r^0*=C{2+-9?i;!>1;4BWqPv8OhxUy50Wh1yBoPq=t6pbs8FN%Zz_k7$zp>yTmphy-B+D zFbs3!Wrx5`&4QOBy`3Gb0rGzUEl1!6qaPLQBn2v=nC4MimH>g9^HXk^=;5#;WSsj5Fj$K=Ngh(qR)`xNB-m{3s@yf{@B%xiI4Hk#`%3Hr>rc{cahos+s^?JaN?8TK_y_93tQxHt44kGzUoM;Z_y>54eJc18)P`cfFt{0NeR8BFLxfF7=VI<@sPrNwAe;; z`>BXgSOz1soCp=ND_m92hiQ4;=5<6EfU)q;BdJ2VlA=VpXvO}P^#CT2hr# ze3)3vR+qCLv$-|V$ys3`3HU0&L$W?+a{RNWD~ulY0+HG3#tX;pqS?84i17lc>u(X0 z_Hn*=B9v^?Uln3tZ-*t*%lU(7S)90yWNtfn3u7qn3T#vPcw@iFoA-Ofgh`-uPN@CM ze*1>CRCuu9mtCl;wn-xVI~={Gj5jl%nW=^;>EGE_IB8VM8{i|V)_9>zY|A8^_u`C< zR%UPVLbS1;V(ofPz`)E~nJ}K;%@ta{8Pa~*VgdXf6=7{h5E{dy8AA{%WcU~GlmxC= zh2x#jf#C5_$@o~{L|82BJqT%Lpq>N<$l`!x@XUBg&^{jMVr?|asjXiEdE+r%)0wRr zkT)pwo&a_gatKE~k;W!2Mfia?A!D*TP+hk1FeaD8dG^Q~Ax3 zK#z}H_o4~cn2Wf=L)Q0Jaz;Lz7slwxA2Z3kpAB=lZO?VN@10{z4U*U>vn;`MQkE-8 zb~pv;on+2=)QCR>zj5N$pOz@bHd@H0f3wDxP0a zOszcGIcQ`ht#f(tsvHgpSZ zVY#zik_)?d^+nTT^yOS5XK^Ox4^T)>1(=;{69I8$nf}Y#W1sWZ)_2Xgg?>eB%B}XBiJ@YVgRT zHrSeE?l94~BeXCAfaX1$Se+{yt+zHJC&*Ji2&jDIw?G)7ZTKZ#dS;2k1Vs~HjRjen z*h)-SNs*4VHH2 zuMttn#W!Rs)hJ{&jo(|s)9*fvWGAtzcZ+|xNj~l4^n7EK+$tD&yUD_tHPE_^@x?zX z+%a5@s~yq&?*bA0${KTw^&O2MqLv%kJKm<8+mSHC8i!{4xJ_uY6Y`B6Sgngx_kPwI z1(8VIWD*!T2q%&?4Y!}~3@u@E)3x>6f2WV0(u!#HnDW;Um&JyM2`2LjEt{jDaSx1IKXY2 zXU!UGQt|Q`{woC7gP_~{D}LTjE;@r5i`pFn0}^#z>xA>mw-$Pe&g)7A;ENK;dIcsI zUl~!u>(A@&!v`R6%%=?0QKdpr+rmNk!;^Z(sk^(J@RcYKKeO>kr8(vBW+wrxM#m-%N5ej|{EpbVZqzB2qbv=K}K zDmt(?U62C)Y+&<^s>EOG;7`5^k8F71xPmZT@ZPHd*w~Dj$m*d}k?Gglnl38S3wB8I zyw8-m2#d@i&qjoqN5YB;Ul`cUpw>qmU#hY(Zv|PI*J$N#9rjLOD&4`YJo@NRN+U?y zR3T67jFHH}ZTf%A!uNoo493FCcBS2dCp3}t&gOO3)uQ3|k_7P6mc%#1t4&m=?(Fm} z3~!`Q>##xtm7+k6oGo=$*+WPjWqN&=$*B`}qG&97>ioMTyV%JcCi{rj0rr0-f<>`7 zM3k!#H$k9Wx~bQ|K)ty{&ZbickW!xArv1_Y;DK8h1=J+zG8?Ajthj|m(!>#9A??2w z3jZf_7-;>U%n>K9j87jJOrsVId6%P-1VLU8N?BH1(8_$qdRJp1o{~*;S~h)Q!dUoS zMCC^A`7g3OIu1=&SGU_7e22vZq5_3zkYgBlVx<2oxgscI(B!6k-F7&d^}hQ=l7Dr6 zJbWT^>O2~(Lz0!FQbHbnDiap#V4+7O-ds%1p~Y%idjW^Ukgx7SekBq-C7kPMo$@|} zzDs>o`^dsr$Zji@Z>{G0$&DWLdUj~Nr}UFix+{0rJ3?#i1)69c7J#u}wyteBh2-0~|mm;$VGo(b2N9eP8zg-rA` z6|(?2-XA(94~kQ}jq2+DyEMTl$`W$rwqfL493Dt3QA)16p=(&HRl$ zdg|h^AtS+=^uxf>UH<9J_v(Bn>5nIl+$G$#DenAe2J4#k1cwJUtDIqL2 ztC@!nc)7e_TmVdDk#GH5H&mg5549*E{UYhs*L?SSQq<|?&*h`Xbs35p_M<;g*KY0hsAmT0x?f4wQFdf>geY$P_ru&$~;%PXp9*?D!VLjqaZ zCp5VqEE7)pmq_RUkSjZ#P+HG_yZ}z(_zj8yxG?(UgY~21n|ReA(lkJl_-ypbtz^&| zfftC>Ob2xE&4};I6mB44GT!S^q7hJ^x#kNxdEqb@`%UV~+J8ue)S~}QDp=2nusYE2 z_rO9mSw&AyS=6pKr}Q$sE`i(kyO12~g@kci*@HwZ-z`cSi6QB?VnhQF9ibmBoW?BX zT#&R)gWwm0bDrzat;SLEIZB@O(l-dJYl!CzE>#~PEhX!nDBWFYk~)46@n4+~ZZ@p1K`x9kN8veb(_%mqw`km!?XI8V$j))&JFxJ&Kw5x{k^qQBhO%S}M2cY_F0I76lpZ?mS{Vr8+ zBOQsrmX}`+UEH*tZASP+-H4byg|P`-8udvETAUp{p4GuyZ}|3PO?&(PHl6Lqg!DXBM{Ygm!ynDvk4IOxoCBSBz^_(PhecS<#lr_V8kbuaS6F9=`LkAN2m3 zZXAbh7A@hv&(+av{n|87t9S&@0eeVweAbX7y6p~89 zL)9>6@gv#VJ$l3a+65g&cQCO81+N{{PHxx)_dc{u`smmWb-&u#jj(2wyX8!-dW1eS zc#Bs#{QetM8O!%~!X~ZkFPJH0F`gFTYxF`tBU6Td#G|K!KJhKK3t7m_-~G^6;{tnw z(n4WAY@y*#$0vsmw0j21>i;feE@~2oXQ-+8bV)tS?SrP6O#{8Hw^i#yTW==uv@?dy zZm@qeCTn|JKLSs=J*GWur7An1ppNQs>%?t1b3jy1fK6vAAd4VLw&`*x0Lcr(5iRR? z!lQ}XLdzCRe6xQ0lB<-||H%Rz+q|+bPP+_*6M2$H7GR$2boaX7z`;KCNnv_J(4qf_wbgB{B zvF}fOoCOp{NSs>D%4y_Zl|dAM2WhiX@R9xuePis`gu<7TD6?U&L9_eUMNGJe-VVbE zIX+WX^FeIaI^%kxF6Vt2F|q4&o@sEB(n(GKp}M8xWt8l_nLvQ8G;RzM-tP12nEQP~ zE@gP#0wlArBs>w;YEbtHYzR(COn3&;!K;x+vbdKT%CfOF-vCb?*=e*L%mSAO4JxE{ z(Ia(Lc%vMUbhbx*OEMs<%2kP5+xuv7MbK?c8P~{%HaqVHyMEX5<@EwwT^&S7#xfA` za?b&?qmx_n#)O7sL7!Q$l1doVm38{!s00HoZ}V{;YsAxl!1KgIiPTcQajG&Ky+XZ( z4oJb>`XWkPqhP}P=R+R(|2i!B|Bm|+HI2iwI~Mi$vPrqJYhA(lvHXu7&oQ>f*4rKr zI*+kYbWNsZb?pSzM_#VK0@I9h0U(&dV$QsFOtJ3 z8~Ep2>!%_=gh;|&%oPnfVa*P|(JR_P0GFoPlZc%fa0!#N+=ZQZGzr%yL_Tc7FEljV_){Xx%<5w$kdYmHiB81ctxd~AOFY0o_W-Mk6OOn14@Iy-AbS(1Ki z13Ym(suA6|@qx#L0NsI?xDOM*kdW&KagY`X4T>vC3vU^8Uo5_rYdo^x$Xee&U53Q? z#RAk^I)-lZfCu1<3QA~!Ir-NfP3nC{!LmdbL$Ki!tuD06PfZ$lA?6xB(#8!(z3;tw zDnA>;>K1`2lu;$%hcE1$BRl{F8$}@gX4WL;+m;)n8s)OT7G2UahGIeXs#=E*%tu&r zE#`+eLXw?$SAT?^3=?|f62pm!8W*Qw9l{9$xB^@(PedQE4~R27tsE$q294vns_WLzHj?i5wI}BgM2!3Wk!!S~Z}%~@TJ&*-Dt4w) zN(DPU15H%@EG_pXmusc$nrXVo@s1>TX#Hk>kWkK5Bz9WZJGAMVa9uwb>c`T9#(a>J zaJE>O%c}QgH!FS368+L`!5fyE2OIMAfX2@&8egV*?8u<^)MYG4PXktQEw8__CT{dn z&-Pzc4(cqFihwGfj82Kv-k4K2-qG;S{BpX2x#Cv>&poXf08NR=YZ_*RrjUw=z|@9E zbrv2^r3mMkb8GrY40_}k^YRH%IYYEYK4~AFcg3Bw|j-P?o?qgC58{_3sk@LDFDrz8D&(7E=Q~Bu8yn8hO?rZ_!pPPjwj$HVDhMm)h7n8-_u*~2yt;T zx$#U*^Y|Jt3|m!mzfybM)7URq&*(cVrqk^ks$52}jP07-ve_HACy@)r_r4?-b3fIGqw8Ja>T`3AP;H*bUVpZ&do+uv^jdyBaJ zUEhwT0H)gwq8;AHD*^knXOn_?*k*t?#rFbA&3OjQi6!GQl>US z*a~6Pjq2s-BDz^VvpLG_bs=bUTo;Z0Al=Qy5TVz4qPk z&LL-n#vb)*)QJE0{Zr;{K14^`qMA0J?md?sTIpR&bA)w3$1me5~ zqwdlp+~YSMPQ!^3Yz$ouT@jFFkImF=p$t|D~paVcynz3=c^Qj>3~7 z52O0XbxkiR|M&ZvbDv5(PV971lDXoz&*n%6>TRYlhyC?DI#hRpPC&im&4Eot{MTL+ zzUl8krZxPN)F;=1+A=3*|02dW zZFadVQVuKxJTSWG4O=|f^z(RF8zZ&{i#!YlIdS=p@m@uTacl2-m}59v{*HLdnc_a- zXu&}M<8X*+AHT=)9w2T7SFeog1H^5a+4rJA9B~UQNK^og#UakmjlrIWAx^gs`DK<18+WJtoatoSp)yVi>$ctHSHn$fA^WP6A z0Y1_9WLq_8s46z^K`y3Xi;Ac_0xN6HwtpOW?HS0e1T#2X!S;OC^Pyr*HNNJ=^@|W!6id zx{&V|1U(8pTiq4sg@cM|)9Zv*asupPZ8*)jC3w(&q*Y5D~~g^%Z%JLXtF2rHJkmmhy()&blLDc5GUDty{UeK6#SRjYj!6 z6~And4L@$`(-7wHjhrRH+ZGPkNKY!`UYtCh#O-@M?z1~9QV@)9Qf8sOy5y{}~mie7jD_6-g?zA^%syt~Ao*-vG%SDd~7s@qhnivRWqjMb&< zAqCZSvQ6lAmhB|bEzdI>!*{c1ylXFOl4Ky!{AG!PZCw}@cG>R;fmPjm_H&AkgeA*` zNZ=taU@Z1A=}OYVj$fgc8T*^Kza1rR`sv?u#IPF|VZD=cB};#~L%(2&(0RAVKHx?#A8f^nmyGz+FO*ctUS~v?MSqdra5%wXD%r%4oH-aQ7*`^TMZ}Vva1{YkNsq zz2r33n6yM*S&upOaE;;0wJ#8oWpI-wem`79vR^R0LL7n5dVsAlcK1;RQ@UYX#YW5dtgbr&wy20ks99`Sm|_YC(9VZ z{wA|RlpOkOKI}@mbph1iFQ0Qmr%~kz25XyncPD8wf0DdgfbpuG)+fP;@F&yn0E{dx zqXvT|Q1WRiR=9wGVtb(JmJJ_JV{1E^Zb##!vB1K*Az(-1)c)a_0nQ|;lP1)`8MuJj zIhna^V}Y9co|5>ldujiqPWXSO&bm*4aSVdo`T1*UW#aM?qAU7d+CA@UpmS)1PUz^k zj$?E0I`!jQbnr}Y>U=>(y#Vn&e96@DU;$E>c^wZk0?Vknk-36hx#kA6lH^E^BOx>@ z=~b+GRTHddC%7j|sILn$#$xF@Uluv@iyf?jaUJp@k|ku}-R#9}eO%$lQLP@gx+6le zsvNmcKE^Hd-b)yBmIE5orAn;Vp3^+i7`;J%cQRh{Ty#2vSkf6(&{}UIG-ErsQuJ6% z@u&U@peaJXH|>iMt`r!lRQ>t5-RsG5H)}}qjon)iM&h8_@srhX{g*+nJxs@`jNEMf z+*9zkOMJ5PqjD-_eETv1VrCz@B2_b(9`AO-gsr~xDUkH7^)0%!uzJ2CY?YL^xtM#e zUNp13s+zZ}ylK_Sch0RFcRC0!&+{ahz6;0$377NZchgU}@@8&Ln-bum3}RggY_oxx zWpzRF+2=s4a0>_xKyRz^ThKNaSMO+5QQP1ox&Nh8B>ZQZnfcp)Vv1rksBT83=|Pvi zY$uQyhGAW=)$-jkq2auTjhkMOO7{!f%;Kc=1{RcVydoimwFf=OoCZmk%iT+-7CX_e z>Hq1K50Qv1xMm7uCofT=qJ!o5+t3?*V|~z><7}>YT;@`52?%ZM%i!vx8Vkx8rh;4; z!){Ao`j`gI3m<@N@KYjmptwleRHd`%$o;HDZje*|K=v;b__S*eYSdQUfRJXIwi-MD zH;zulYT+RT_(#cZTKlFWGB$P6h3h*MKvR71iK5926Ind>$LMjv1n{Jk2c@`n(zSkA z;gY~*O{|{LaW-U*^b#$H)_z)BLH@zZcD#Gk%S-uuOZvy*-p@c$CLj6L9+iTD>J@?8 z?&?ap%H7nnp2CgiUnC%BYfMfIYqkn}O3g9!E zILP@G{NDqo;{A1ZGD3A=#60cF`$;u8(7&26%lW$iL0M%oB>;kCLM7+FPWsoyr+f3< zChb3if*UcPDzRj8crA$@y zmXeT3m?AxGMCN)$;F-{sn%$>*s@U>L2IMXkKBRbuA?NY8|#g_F)FcmnMTmHatZtE5i}GKGE_nZ|-RXjrq=q@nE%9Ye2fphw*vA zM_bSA9~m7lI21G%oHj=UN*QfiG=J-5*3bnqAPNQ;0LY8~NLCW@v_MqYCwb_nns2{fizDq-AIRv5K0D)w+d8C1ERmK0F$*1Y;Zh48(RBc+E5GJ%)oyV zQFi}Ox084N^H%#K`iWNVB!S;G;O#BT<9IgW=;5s^n#o^XtSXA;K1@v!^EfaDp|2My zv#r&M!s88_{Ey;EKg1peu2%7A330UJXV}j;xM7$F`wT~wFS5?L>F*KD>3gPQZ=qU% zOT+MSi|lW^_5eMLF?G-s%*WVLu3+tjHQE0#RYNqO&2N-#EmGzoO5ol+2OO5`bSNR> zS*nVj^^l8jqs;OGqJKbll2n&=$md(Tp9Nza1NX(TX`Ro1sY{xtT%4%uf~dqVcV(X@ zXknj$kXrA40X~ny%-~Q!E~1u=E0exf|7&H^pU?Z7Wmy1=UPDISLUfbvin@{OtxW4) z)f+obFM4v_n8GtQgAZCYcDW*+`)9K}UyLg$_G6kZ6?id9v6jz_5_R3w#D<;o61s>s zRXFGkDtag026&~+veIkozaWePd6+#b@E0wFrG$(}noEW@?8ccjFc-jcZwqeIrZIy2 zW#AHyTl#C>b+%+^Qaf+zMDHiG+%YXQ?2Ka4mXwi{)e`IV99khu;?;-K%cPmHtA zlJS{-KcofOQBsKa+&}>1!^Ry(i_(l$_R(V1Z>}m-HP0u6BKa}_dz(nqiXnHeh^%P9 z6Q452^2|zqjc&ifK`whgXdG2lkL4_x0n?yCQ6s+ z&)8L;$|2{!hNc_jcr?H^j^Y~M zdHexRuKghywEso6%fVGhY$pT&1a^^GLbzkYSy>Zi*Tfumw%`~`czs*dFKFqs9Z zyKS%X*S;iFg-+PlsL-HZAS`0jN)JkA1b}CuK&z>ei!iStnc9<@L94Xjl`E2T*hna6 z7Sk|iSxpoIdT%M)25Ebq9s(3+UXH@V`=7A@{%7V5;D68LbXLUwXGZY%Z%T?DeeyBm zuSnT(+y13qzpo!;o#hr-Q#OA(L(YDphp_wVuH2M9ss(f<7e9KvWaoM+#lRk^?Nb+` zq*h~FEjx^uE^*naujTcF%L_7pWngl^<3}K5)lH0qJy3W9bE6kIfJMzYi=7pLYU1&J z;pG9m?zoxfe4}1EO)>1<#KXskAuefhNubAX`eD{EJOSjbp+r3KIXEzyLi~+@!5U{M z0k3o^hyOM3V7N;iGfMoxJ! zO&*JaF)+4}R8>9h8G9+yf@@A4HSXtm_5&lGo=L6ksT|?#)%hSLQ$H!ruu;08^1}&vBVqRZcvS(f6+c+~e0$p=YPwM+3N#u3UFXLKL=lPIbgxjTV&Q$Q6i1siZ*S`2>{ys=0raeSa)0&`yDkuNc3$tNaJdUj9HysTOM9@2 z5KK5zZy^a9UA(M1d@WP{~cDLdy5TFP5^RMLKv;drBpO={O z;ppx-hb34E;O`VHW${nA#L%I5e>_I{^5otm^H9hQZ04#|rGt@yxANbBje0G^Rj--mwGGH&0d7JByb@U79iFJ3PdlzFNLnly!I}{CIge2k&Lhlo;l} zW3IB~3lx%t$5NT9u7{ZsuV1$b-3+rkT3IuoT3r@$LrL#vw_sVp7hnO%<{ zE)d2(t?FA~!>aG<=tk-?KTnl>Zt~+@0opt%SGQ%jNtL1WOjVCIlYO7EwBIQ@DnIws zb1GY$rAsCz0%l%)_kR#IxE^r6-q?23;4CG~TS}i<{|^4B+_C(o+3E74Ry?_}G2HiT zA!f&8*j|lWi_fk+<_xb%iqvflP=Bijtre~2;AJuB2ou-mY61)C6GcnF!nOZesKTp1 zFsK)0_*H+Zb7{3H)%%R?4zleh`#+!?;JkzeJct3CC^{WEVtaCqUc9~x{}{3(Ep8)Y zC>!1iO>&Is`Mke~8KF^ciG0R8&}&l;<*-5%8E%~4lHcKy_FpT=lITbL>$9cjwjO>r z?sQ5qook%jA?XsC(7R&d+TiN_`<&tA$6<(Wp^s=3_6?<(cGb4~PUW?aK8FWEPOe*6 z)poy5Rvlr`hw`1rn^6}u*apWauzo9s#D_q)Q?W$Bf!rw=gU~~B|498FL*PINPpVSH|VBo?){&d^!cx5qD&YA(0p z{@`zk-QHg*@10Qp9ZB0&0n7jZ#~0oEypHW9Jv741=i0r{e(3wYQ9dk#BGWytga91x zI+TVJ6}%^g8-(>KpeqCO~s321)P zzFPWgP-uY;2Kt%+k2L^~u+)Uiy-)!9ED;eQhuoLINn?tl6d!aT909BtN%W+}a`0xf z%3Wk}=4oqdW>QenIV;dhJBQ*t*!`B0vc?CGE%1xd@F9@x2v=Dc)aJ7m3-iNdaF`A5!6U4zFDtD18xSWjHs^OQ|xZZS2V6w9x0@L}qb z)B1sRe?DV&pLjsv%P7iBnq%Q&kT@eD*XJi_&UmV8SZ~a(ow73`h?r*ou;s?aS$*&I zeJMn6qZxl_;fBUlhYAaD!e^E0@&iMM*%sfTR6WRS-2BVYgM%g*$=ohx;6Q6y7>>aj z*_n4@Up*r>F55hA02|f$J-UebWOv?W;CZ~s=egA*%;YR1BkuL6kjrZb^TpD8CSA|36dxh<9c?a2-Uvxh%{124Ggy`SAkx z5T^U$VN;bY29v7d^0*7#E^wzS)xqLF^iFcMc}jYD)z5G@Bv1TDb0gr7k@UMG)3<@E zGCoqdsl<*jj%e=9C!HV{+a#sfKO-33-#&4^js_zkSAXD#DMjmfX6M18`9p(?@#0gQ z?NHeq;Xip!vnhUH#+aOr+M1G_dJTH5&Zj(i!b2IJUs&$sVOAZ}FWTLgihhf(mveIP z*kREMyH7eBBt@ljldQa#M@!EQ_I=+dlH+%l+v}@V^F!i@!ZyQky>;a85#ddicmjd4 z9U+dlR|3efy&_XC(lcT;i40fUPhSa+SnqhG^t5~eDIXl%TRUgv}}y!pLccVfbiYTRRlY8=3veawH(+3&6cfi1BP{5lEv`b<% zS;JatVu&j6s*bkrIYJ#gcUGy5>KViRt_{o;_N>gwdOxg9>cLNnoX<==$^iYy_O*0u zPQv6Yl#JO=If~mj4w^Cv7fF4q&yqVYAXs=@rE?)^Tg{%blVbb<>UXEt6ELv5XkTJU zX2rJOT85t`912q4LRA# z(B%Rh$C41(x3iQVq#>q_K7{4PDpS2oH?sidRLQ8Lu|Nq3lwk+GcRr3v{jUWBe`Nv( zw}vZfZ?EkUZu3XrQS?jD9X})Ex~2A=vF-WK z%uTUJvP&wzb&M1zW%UXrio$g^Wh!%Cr$3NB7sKkMCeze+Wd6gND9dHWr`o3&rUw=8aoPRB`f5kP( zuFffJrPFB5@8sP({{9mS03Yc8F>P_ntCGyAwexj=ty2 zn;nq2yS?_LbLHWqwuHQ-@p=8A1ypaT6Mu_s?Wozp4l55tzw5BpDYE&u^=e$0Uu zs3||o;3YL&JhyhBCEc5!w(K>6YMR}ZgXEp(J--6sifz?*@rL#|yJEYe)l&@Bo#R+a z54WB>D}f>`tZJC1%xNlnGqeFo33RHWrY6u)EZ*5Gy>#5qpaCw& z)riAp?11D2f-VCd>A=muVl?MuFIwr(YwO)CdI)g7d`?NX>*d;NuW&u|=Omq*jo?g~ zqoEZ9e8_~Z1azu#0B=RyzCkqe5F7v$hyj8~azYy5(9pb^yGQ%=*!#Mbw%pR_f~*C1sDlV^G(g0$q@p1o%~w9YO{nJ-TTFW8 zcggnYj55(tXXM&ujfXG)Wu&|MyX(mLU?s_HE05_BS+HGRj3tLWD*Py2TxupP7ov~@ zYZ@~@xjHJ$S}^2a?zgX!kX=lVC?t<83)L4`$jt@Wt)U;b9EUXC-TQ&PHA2DGU6+uE zZ*fvZFnOZoy0+Xa3+_{~-x>&)AF!0ujV)xIMfbLTRh$NV2@v*=r+LH0F5Db{ z)gw_Lflq$yCoxocM}-b96pFulsUt4>(Vth|GqbTjMXc;6)M#9YEhZfNhAuv33p{_y z&o!gyOToT5a3XfnyM9>Za;)=u&Bs$K3%}fs2#w1${0Q7&x8wz#VF2D95Q*gj6eF!} zI#6Hs4nLDo#in2GU8dAdZmAm-(I?I&*Q{JN<#Jaq^;DsIdQLvq@DuGsy{&QQ-rSS+ z$ddf2v5Q_ENrIL72r);Q{*h$?#HfAc5lz$^*uiD{xM1MHHip-D8Gww^n z0=;1>07>OBLaDs$>j6#Nao{2f0rC*x!#wjG`51j~o`$S7cfM$vWX+=4R8tz1Pop2i zo8)OmfbGoq@N@g2I_iLB(7@B)a7peDtQnKY*NePYVd>P4!uMn!V{Q)npMZHchdhN& z(&sg2d`M&NDhuY*n&VK7&3mY3sUScRKF+=WtB~U-hXttk&$M zjV#0GxKY`9mp+Xn#jywwKjycrpVGaHsW^PIC>2ta^hEkjfWpPrJ)*^=+M96%kAkp^ zJFYYcga+;~YG`rbg8UM|Js+ZNr3+`W%u8B zi3@!t(SLOTxX{N#r;k0nE;t3RkuItO&k`+uqlhR6JTN<>x!6n%fWp7{8(BaFu+aWr z3x>e?PO^tD?v;6fbk3GczyqHzugM+@Tov8}toxid=G}5ZQ<@-tV?z6pY&a!bI`~_a zz!SMA{*TUhsfa3t&$1l|e|siCFF*Vcwz_wzu~we^Z9>e3 zyAle#e^{?ViJf}sfvicjd*U#-#xcyYbp{wkiUwzN@U(#z|(G^+F^lE^#klMh7i!UGWmT-xyV~~c=whl;K-MvCL?*f)gX~++{ zrh7o*vhfY2HgyCJakFR>>0~PIz&azmN6MK{%C0E$k#NcR6nwk1h37!z@^=cJ5Pp7l z8zLCVJf@x;0)F8{F~+YPlXLiCAZg%o#`!ahsLPu9|It?)1cJ2;C7Kk7gFu!IA?(oTQa|fMe(iD6cI$3$&phDyp0V=?I zOSjFp9#R?aHe@M2wFKoydWmDU&-dRyyx# zQ*ITk2lGKsf>yqEwyvM9i+=fnyImy~akuNzn<^RlWTo-qq#pFCx z8g}yw`W5suG>|R8)TO}RL%)VpO?XMz+OQZ}QwO3@=zmt(Sig!YtUS!UpLbFXD#)%9 zbU|r$t`rv6d*2!t(qNA{k|J{Ol3tTqpp54>BuinV-M+i7@8Z;j35wHktuZgmJo^GY zsM(_^)@lB#C>Bwlff-QS4cZK&REyip#W3mS`ti5;ZXZji#rWvby8)xK8DZ>CsSMbq zZ*6Tn9+)hv4Ldg@!(_!5bt24;yaxRGYbA*U%0AMcsln1Qc?D#Ck84lPymSKC0?#C# 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 ?X=plf8trCr{C6Br}UcCd& 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

    XA<>dS0bhg7+w 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 z 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

    HyZa+a%IDlg2O0|L!Q<@V;&YC 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%0DrEV=A9u0F(yA9!JL|yITb2t^j(x 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

    F(p-lk3-gzOU`&nlA)8o})zx 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


    $K!XnulmGvd#Uo7F&` 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%0DKh8@SxDJBbA)p)fzjU6OI@rC$ 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

    Zy+clo0fzz8UBPR?gHz@QQcDueLYKtKv= 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%0ARODK!6g}ZS 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 diff --git a/web/static/js9_old/images/js9logo.png b/web/static/js9_old/images/js9logo.png deleted file mode 100644 index c5594897a3f9eb86782cb93498068b1a4178807c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7957 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 G3;!Q&`Pnc4 diff --git a/web/static/js9_old/images/js9logo/mac/js9logo-is32.icns b/web/static/js9_old/images/js9logo/mac/js9logo-is32.icns deleted file mode 100644 index 3b7c417309a875304766fef92c38b975a7809e75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65249 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 diff --git a/web/static/js9_old/images/js9logo/mac/js9logo.icns b/web/static/js9_old/images/js9logo/mac/js9logo.icns deleted file mode 100644 index a4c12e20c2e63da197875f85b4ae5dfb89814d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69783 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 diff --git a/web/static/js9_old/images/js9logo/png/js9logo_48.png b/web/static/js9_old/images/js9logo/png/js9logo_48.png deleted file mode 100644 index edcff5c8b156123613feda830e4f485d5f85eae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3433 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 LNkvXXu0mjfx$C2o diff --git a/web/static/js9_old/images/js9logo/png/js9logo_512.png b/web/static/js9_old/images/js9logo/png/js9logo_512.png deleted file mode 100644 index d73e085d29e2371f7def965e33273e2855257e4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69334 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 diff --git a/web/static/js9_old/images/js9logo/png/js9logo_64.png b/web/static/js9_old/images/js9logo/png/js9logo_64.png deleted file mode 100644 index d892467030fc56eb642786b33282960f67ac1fef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5439 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 diff --git a/web/static/js9_old/images/min.gif b/web/static/js9_old/images/min.gif deleted file mode 100644 index ce83aa823ef555bc75a3c7387cb231feccfb87dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 872 zcmX|=Pe@cz6vlt|>P*@~o-fA~1Yg*q$rdhLs0o&+qXz1xTI51$kQNz6U04<3fo}LiEZ=pY=+<}(sOeqe}#h*p@Xw1 zW)u7V0{k0@QB0g30zTxJw^ysLm5?4ay4%M8`-j;|!k~wNAjp81t0OX-QLIl)wz-mz zx0rWW)av>v2yp zsdg)sua_!^>JU`{dco1aee0URpA6V0uWNV2n9vE3?gy*{j_nCI3E%fQH?JP}D)#uF zY9j%yUZl7~Cywy&m%G59E`>aoM9ixS$~R%n_!r>!FgvB#Q6oeFmo}IfCF0`tpnRw? zl#6b2hhie#>~3;>g0!~H>$%&dM54G_^t^VGn`!>MP?YY?NgU0Gw6<79!by?ub+SB% z@DkB8I`4V4yRDKDW$RI*;6gI>#kN~?HSzAU&TuLawKXOlFJJ!|wp%=+)?*4&w3;}p z{177D-T^D`fs;(-dm6T3A)NHU<&2aQ4ihy*H-xpeucy#)iRmE5dRR;1U1e&%e{Jck z{Vt^E^T?k}@A!mS%|8*!swX?EsB!KSQrgGcXUY~%$E-tDN3E&pm$wfWH-sy$mW1v~ lMv9)zJ$w~&TF0w{9gmtvOPZ$Z7M~;{_baY_dtPX9@*lhV=WPH0 diff --git a/web/static/js9_old/images/resize.gif b/web/static/js9_old/images/resize.gif deleted file mode 100644 index 751ff64000a9a12c8307f2625157dbfe23ab0457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 859 zcmXYwT}TvB6vuyeXE*i1SS~wawwS#I7Az{H1+fpAR-g%efJL~rP(jANNif*xuFyk) zf)6W%eb7S>JrqQ2FHtcM5kViU7QI#O&RVjGL?5tpyLaruT>kgWng9IGnKOL{4|MmW z8foMg z@6m@RN3A)ZqKV(!l`lP9l*J!>EPhsLnc=;|aK`f@mNgrAszgq?sNMjxN+ir|o5o}s&qqx1$T5Z< zST;%RGjb$hHM!8MbyN_7R;{4$W-L|LYX@gbXBoe>7ICPSnDJW^G0<>=v7S+cI`Iv-lfn;D+}Q2hJL6;OJ!|i>-dct z-^xr%!+&V1?#pW?7jec(E>kKq7+4lOQesVD@-Ia6_J75eD76M;(6t6-gZUJGPxGrC znKj?8nR8VZW^f&x3@U<}ML8(Nh+;wEDx5K55y7lU=g>;*M>}p7M;~IR@Yie^KzNFF zMOLS)0;C9NG)OcqR0TW8>Do;CHQB@3=!B~MP`<0Aqnp)y(yx4$azLjS#uBM?#m<_7 z^M$UV@9CC-05p2v-%^nq1@qMx8&i0h*me900fQil&~~N|(JNhkIxVvXREelE71{dU zZ%Gs+MZ*wvrj*}{ZClWhhV4H`j2R&uf7|rKHh)iCR2Jk>Sr>a uo=t7CJ97OGM!o6C){eQt+gtmuHSHb_Hw>M5esx>V>D3+Y(l4ilVDCSjwDQ{k diff --git a/web/static/js9_old/images/restore.gif b/web/static/js9_old/images/restore.gif deleted file mode 100644 index d00ca4f26b009adb5440328745e14fb4df01cfb6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125 zcmZ?wbhEHb6kyAGa!P==j XhP}RxC0}ecy+!{U5py ze&|2+al+w`laG9ya_rNL;S&wW{T;mfLvUshlGy6*DV z_1C^`x%GYb-R}n;{y6#M=eZZZuD;0ccpZ+}m_V?Y-e_#Io|NZ~}e}+*o8UlkL z1QdU=0A2B)K?md(P@Z7m=x6Zfknz~Cz_Ce9NKNP91jWvFes_;48jF&S3P>0>-PrN5 z*}Y%RsqKx!B$f8b>gFp#RxV6E&0~<5G{f?9lkaS?qGxLkOjd85Z?DcFsZ%3V*I5z{DoI#>Ylz&;c4?XJfoZyp+w<8^Ox0eH RcbB2!Bh!u3+w&b5tN{WDr2hZ_ diff --git a/web/static/js9_old/images/shadeactive.gif b/web/static/js9_old/images/shadeactive.gif deleted file mode 100644 index e5c8097e3cebb4b2012d43927848b06eaed6d230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 838 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 Fe*vg;Va@;m diff --git a/web/static/js9_old/images/sun.png b/web/static/js9_old/images/sun.png deleted file mode 100644 index 42e3fc8a753abbc2c47835d9248ac9691695e238..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1925 zcmV;02YUF4P)4Tx04R}-Ro!pfR1`mnZ(O7nKcKOW4i$^9Ra0BJ8yc;~21%2p=|UR0&DbiW z$#rfTQ`a`O(`{9s_5yDV_yd5l2Of}kLK+Oj_Ok5(v`JGz71bo9J#^YYXp{DWs&KBa zQ@dTpxRI}aIp=pi@6k0t$5)!;m`NF6-tt{FpOKHBn3g+MAqmexC-gw4rh87hTrL7G z#)U`L!(So6-Zux@>;H3gR;i~0B%VTSS3P|m@o9jRsXML@Al^p#@G0Lx-0?i(9WEw_ zSYddU<1E8793KxjQ|c&UmW!mTC>k>?{om1c9S zUx<6_jj_!T&^M{wWM#>IBbOSf*xP<^F{$j$aOQ5Y{cT zROCL1M7^NKKL z&(yA}mSw#iM0^;IB{ZO5!wl{^Sg-*ysE~&Yz8!E;Qv(A`lu*=Clo*MpVGd>OdF6n^ zam1Jntk;<}MrqIC5$=Q>n{*R}?8oOIDUw5En2dl--Xw34!z7E+5pr-OgyQ-soSab)C%saskMla`aQLVzg0+MZf20tJU&K{hZoBrUc+U4e9&3o zw|KmGEe4#xz17wBu{f`SS_4i66?j31EjY7n{zGfhONK~c+td!TS#B}JoR}5UAd7p& z5phTyXSkK0xCeD3xaYP^o&J~#Xp9xFb0C;HHml5fA<%h1eR|qw7wxF+oNL9T1Aits?sKNIwvGaN)^WO$I^cUV)HzL_| z1K?{9p!>B*)`xfEv!4N6IG{J&h49W#Bz^(#YWw%`e_a{8n{G9m5AeR~_yl0%<7V@p zc z)7@`VWdH}@-}`Y+=}Oy`mUe5abc4yHl8%whF_nO31i6FQZI~!}p%S>z3lnb;vk*zp zsMqL)ABl^$egTF#Fo6Mape%!AZI_L8gtED=tZQj$&uPzjU$6AaKj681h?Eil&>shj zMPUNKp>YJ<=G@kNRdY32S$VT>UE=jNZyEr04_)S$KGuynmn#wHa%{mic>I$tWJo;DWHf5BWH`)X(Xct3y4W_FTpc@I^7p;x z{%K8JQ{;B*lo-$Z@kaASwZc3d-({578qAqLetCZH-Tru-5h*1;OJd!(iPXfK&6h)e zF8OOO`>$~!4ce#_AR(X-$kUnq^-j-S^+LX<6!P~(KJLam1prd~_1y!$`OwX5K!3Ys zSbf|&MY~+TW0UPRBF<50rb>=(7*J%!~=~Q)V=_~eDnBJUCZkjClf`_LE!DyLuxz3_e zZv|jLND4-3sG5Gb)GSn@k*g0n-y=x}HiGVIV;IsxI2?!)4 z2nYhm!rW^Y_KlM)mjs*YzYz^1b_gCjb|}kdI5~6@^J7H@yHb| z;Aohl#U02)QO_P*d#zCbo<}>k+Ua_$pp*Jj)WIcbSLrQBW8~1u-Y0)1 zLqk*^IU>mats1(Kel}aIY@4e-viU3yy+}P1XZEbW0s#M}0Dyl0`p0pY#`Y7s00000 LNkvXXu0mjf1huK{ diff --git a/web/static/js9_old/images/toolbar/dax_images/10_4.png b/web/static/js9_old/images/toolbar/dax_images/10_4.png deleted file mode 100644 index f97b6e0e9cd7990bec6f5294b8040bf69a565e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W_!2~2vB}S(JDK$?Q#}J9B$$$R;w`bnj(AwD8 uIB}w2Ki7_zGfvGov29w=*`6ssBpG(h=j3?es`&t@gTd3)&t;ucLK6VRg&!9H diff --git a/web/static/js9_old/images/toolbar/dax_images/2_2.png b/web/static/js9_old/images/toolbar/dax_images/2_2.png deleted file mode 100644 index eafebaf7ac6d7e475e2e8e821c68798ba5f6f093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W_!2~2vB}S(JDJ4%A#}J9B$$$R;w`ab|uDSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uzu>gnPbVj;LT z)LUblqln%7Xg%(o!iw8nCVF>GnDG11p>wzVPK9;lh)9cQZgSu{nd`YoCvs=X;v0%Z z{VvbvKmWPE+%A6Kzux~>&djlVZh8Jp^|Ld3^geb}U5U@sbJ=XXSn8+fY~eRWf1kSk z_rKKK%zX3Ktw|Ry1XNa5PF%H0OH)@@)ZX5{{q^w|YU+k3*4EV2y!i2B$FnC-GQ7OH zo;`b(RaCUe&D}k_pkTwY<;!1x_^@GCYtET+*4an1?&nsOmoJ|J^0H-WXHTELJaeYx-hKPF9Sjc- zw=y+dDk&)$6%yhy>Eubz*WW#D%*@;r%BD}4u)x~dnup=zp+iiwH=p?S&1|FEeVP9L ze%+nd`+zPMogWh$yO!boyLUnsMn;DYyr0i6&B84%B9f7nwW_SF>{8pg?jIjMOkfX< zj$WOco6DlBuP@wkps|tB>;*?mRFu-Pty`x`dwO|YTE1NU)}9V_c6Lq;9i1y%x0*7Y zI(5op)22;_EUjK}wD51*wQJSQn>TIxzkV&f^ z*@sU>NvX+hd2-yDzL~3M&5{E8CtOBt$@=yEmZk~T-@bpp%+8}HcuLsx?dJ~-GE!1W z8;TE~v36|QyxCY*RyMVnk5O}7O>(lb_qyfF+sjJc`BvoJ`}^0ncjnBQQStHT8+vwgj=7XxWz5VnbKPn8vXRwzP z7AkJvzJ1cvsYkVL+`m8l=g-Q_{QPtttLF-Dz50@vwr<}(U7MYaEvv9_V^~PYhKJsB zejTgcxMRnQmYWv~l&?+ZdR?ep@p8iVY172?Ce4_!LQzri*2Rkp)24SlzdF6)v%A)Y zN&1yFHB%ZI7!32fTH4!xH$_MXF(z?{{agKaQ~C4j0o70b8|?nSxSqk?Ozx`4n)jPQ OWs|3?pUXO@geCyq>mq3Y diff --git a/web/static/js9_old/images/toolbar/dax_images/back.png b/web/static/js9_old/images/toolbar/dax_images/back.png deleted file mode 100644 index ce502f825c44583c04c0301f38cea36615edb684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 946 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@K>q{ zzb9^erN$qz*%7_^)49ub%N~1dxa+Q7)Y@q`+}>Y*Q)5@mF2cpSBuKMB&%%_+%l|{s z&LegEkAJLSdG6!!tbujy_17n!7R~Tc`|$fOo8CrV^$e@IN&*}SX0sPwf4wkjtc0t_Tvbi|BR``naU4nJ&PBbj(OGSqDL(Hgts2?h?EZ~oy-6WIK$cyC;6?e|1++R`5A5$ddB(Kx5&NR^<3B3-XECzeun(dvfW3swi?Mk zZ@YDW$Ei@~li73cF@9E(gBQgvfE+4B`cYXH^#99Ek1tl4x{>H&nc%qq!9Cl`PXW*R#L;t}R}9-FBdKlp+&lBcVm%Q~loCIAu*cT4~P diff --git a/web/static/js9_old/images/toolbar/dax_images/bin_minus.png b/web/static/js9_old/images/toolbar/dax_images/bin_minus.png deleted file mode 100644 index d86fd763412f3fbaaff842d7ded0085848a52b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@J_%PZ!4!3&G?R zhlc+gYOXqN6Y>lgm;7gDbX|7P#MsE`4C}-YW09K$Y7*_YzN|R-K_Inp$WC`&{|(?<0ey@kL8y&3|v79CY-ibl#4~ l8O-mw-(S0&vPAB(XzEr4qfpb{#X!3mJYD@<);T3K0RR!>MyCJ( diff --git a/web/static/js9_old/images/toolbar/dax_images/bin_plus.png b/web/static/js9_old/images/toolbar/dax_images/bin_plus.png deleted file mode 100644 index 4057c2d3757cae0c9fa34d5f5e6d1ecb9949f066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP%z!o z#WBR9_wCe!Tnz?1&cYx6*YA|uV%m``XH@XQy2tR?;w2Y^)EW8LFgv(Z?0NETY4EB~ zN3%rg3O7D``XX&|cJt@@)gOi3Kep`N@x?c}(*0=E#pAP=e_;#nyepiyucy7UeciGn byL`;Qy;0TEak7F*P|sg7q*v0|VnZ2FByX`ldh`22WQ%mvv4FO#rW05o7=W diff --git a/web/static/js9_old/images/toolbar/dax_images/blk.png b/web/static/js9_old/images/toolbar/dax_images/blk.png deleted file mode 100644 index 623ad269ef65622d5a3f88a4ad751dc0ac3ebd4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6DG4C(Q&rUPlPeg?l~Wlw<|c~2L|5RLQ6DG3P)KY&KmvuQD^Wl5T3Jy_A$ beA0no$rl!Z&dr^iK&1?xu6{1-oD!M<8)_=w diff --git a/web/static/js9_old/images/toolbar/dax_images/box.png b/web/static/js9_old/images/toolbar/dax_images/box.png deleted file mode 100644 index 673abd14ba0828365013ba8b14ef9163ba14c49b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 912 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 diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_aips0.png b/web/static/js9_old/images/toolbar/dax_images/cmap_aips0.png deleted file mode 100644 index 00a6eef83400aba426b7083c5d0b016132cabd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXse}NZ5Z8kT51N~s8yXrK7#Y}T zI+d_Yu4I@~$uPT`VOAi+Dh7rVBFg8Z7rcyL{yK5_2g`+h4AU7HrZF&FU|{&c!0?Ts z{1?Oj{|x_6G5lZ8@P7lt|BVd)7c=~qVffF$@SmOi|E5if?AIcIc5xPXL>2>S4={E+ znQaGT*n7G-hG?8mPDn^;VoDPWGb`hG@Zd=kbDmtB#)HS=4UCS8iGmUWqRq^OoSqyL zCQX~z%4k{H7U=D!D|rj(i2sa6oPi<&eL$mBOI#yLQW8s2t&)pUffR$0fuV)2fuXK} xNr<6|m4T_1iMcM2G%&a=bL~BfhTQy=%(P0}8df>x1p_rOc)I$ztaD0e0ss%JXx#t+ diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_b.png b/web/static/js9_old/images/toolbar/dax_images/cmap_b.png deleted file mode 100644 index 84efe32a5873c1a2a576c62fffcecda9a5630a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gO-#}O7{(v^m_QO%X6YK2Y_l!wk6^8GPo+k&O zuv&}`ksdKp=~A)v@`xFbY_V55P0?sHBO?<~0=YmwPzaO)6@U$>1>8Uj&;|4W0U!i~ zfl(j^OafCt5=a5_Kw5%dGNiLHuR>}wl3F}0!=wdq2d*7NxCui(1Wuy67hQvB9)|lW zYQ|ujfbl*`6WIC!`E$ryK-Nzz=Q2dgdo_fF6;P!b%ph(c@)q+MX=$smzK`1upO4MQt!t92bkN*hGM?Hrc VkN;nYl($rg0<0#R@%j!|&mTQB^KAeC diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_bb.png b/web/static/js9_old/images/toolbar/dax_images/cmap_bb.png deleted file mode 100644 index 9e005eaa1cfc59fc842998c04d6ab900f784cb39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYeA@M=z%Q20@#5( zARll8#Xu?G15N|yB&c2rzZ|uZXo$wmI5e+A>w2_pLB}?9Ytgp@{b?B3gFz!+nh~^O zEEf|;5OQGpC}upEE5kws7SDiHVLUHoO$6(r*cijxO18xF&PLwd%1(j3Nqn@EPty5R z&*zyOvT(%Cw|RV*&q)_Q7jw3R^Ira{-QB>%5PQRc0FctdrF?L1t%9yCttD3G}t8c8k-f+-j%Q>*$ZXFvM4vxMa zd6O(?HA(8k?GHNd2YS1Dx+_Y(Wv5R1%71>H|F$sq<9lRygnYS7vFyr)nv1pm%a`^U zvonj<^tguWTRbv^_1@|lZ(7?Y9`imc1epND+;mtu1A}vDk8pF{eIhg3#8U4MVi0TQ5WqLZFsf zD;r1=MG%Rkd(uS^K?s2aWoauIfn}Biky$1LQGfc@hd!KhF86W{_uf{Yx5S`dtp^Nl zm!n*$BB0eS5L~S9DS>&Ld>+}Us;Wk#1<_w9=8z>EkOR4p2diKW;gMDK*YPj170Wt87iR~YTy6_AP8Zog*s?}2sA+qj>Abf1*f4I&Oi&a zK|6Fp9J(L@-Eal2!40?xx8OGPLLVey08(%t9>7C*1Viu`hT#c3g%KEqG`xlkyn%6; zfJvBwPw*M0VFqSl4t{Dhzf|>i&GxGu;(fY^t6FS}>o4{U*Xwi$oib9*H&0O@E*H@pblFwsw(zvCfdy*>bL}qqY5PsmrrBymC+(i(jwT zF+bIv%p~%~sT4+?`=d%A8nOi&Lqaf1redRHGD;TNWU)zBo2AGoSdubp(_j8E)E`z3 Wg-`t7&|`0?5C+^%uj9^cfAb%gQJP%< diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_color.png b/web/static/js9_old/images/toolbar/dax_images/cmap_color.png deleted file mode 100644 index 88f6a20e9d0dcd700ff146b67d570af20aa638bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsTBb}A+DP?ZDMC<2lBMEwDk1! zjEs!J!^0C265`|I8yg$@`}_O)`qr#jbKt;%{rmUt+qduP)vNE{zkm1c-KS6Q7Oa2A zsQ->Z?;V5gdj^Xq46z3p;`cKo?_j8IW2moZXsTt{6v1%7mtnsj!+j}+_Y4g07_^Qs z_|IeTo6q38fFW@bNL5_}Lq`$AJb#AyehjOf7+$aeRWZC`U^~X(w4cF$KZD;v_TV?0 zPA$20;RVo@oCO|{#X#BvjNMLV+W{Gwo-U3d8t0P}5>l9$+|tAp5>k_&KX{Pv{K+FW zCb>8}JG(kYM@2=&M8QBqL&HK&Pfdjh(Kpaup{S3j3^ HP6 diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_cool.png b/web/static/js9_old/images/toolbar/dax_images/cmap_cool.png deleted file mode 100644 index 8e43a8cecdeb3ba95ba61373b7ec53a15dcf23f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gUr5t&6vfY6x<78y={AQ#f>b0p`c3DQMN%?#GqtHR%l@g`3^8lDnI#w`6`H20 zsUSoMK9q&!OiQSgh%kK6%oUZ9)yyFJr&$TY?VE2sbm5$H@5ASEx%HN;G^sdT3_xl& z8FN_LnS??<^F(oP8o-OOWLQ%?9*;mE0tA2rkOL|p0*D0G0nxxFAdV5h79bg5Tn3O0 zl;zNPh9XZaR2AP;zfz$x1@AMdWfV>lDSA$MM2dR ze3F7sk^BtF>nNm=LYgVGjT9ZE=pyAMQg)N7hg4T6>^glmevQ|<)qo1%kWa=xJI89F^nO+Mm>7+V128cwU>bXKj-z{MMMdJS`qt0{ZE=O3W_h`qGr#Qy<_-Z9Sr Nm{YQheaVHje*pOl>^%Sg diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_green.png b/web/static/js9_old/images/toolbar/dax_images/cmap_green.png deleted file mode 100644 index 63dcac937129ef26062146cad43ca410de04e4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmZ{gZAg=G6vclPv=^IMn!SlcAVxHLwziZ-#bnDZ#+v$M2|-(XHVV;}Zk0$7Lg2f# zvVjCq1d&9xCtU;)L=Z?&mbQcum}W%~nQ1~0^`~!r=)*bZaxdp_?``vW%MJQf!k?sZ$c%cGhsD>Ii1cxC2K?uW9sD*lnKqJK9G&I8*I14Rs4qBld zx}XQ*&_%)&e@z)v*4H0p2FHy582@6$zGHDX;{f3at{c9$q(Ziijo^dji@D@VeC zQ1Ii#`^gXQrl(ftkONmjiBxMTHU;i=G9aoNp VoBnU;x7Sw*18%3+ai`4R@(05xn^FJ( diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_grey.png b/web/static/js9_old/images/toolbar/dax_images/cmap_grey.png deleted file mode 100644 index addfaad34f0fbb501c9dfd20cfe44f1450183454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@0VEi-_Oq@8QcOwS?k)`f+xyS#2l6-zJR*yM zv+di#63ia%eDuHG(hSNr$h>-Y6-f!=PqlDDQYFw{9roNz|9RSxJ3)e_f; zl9a@fRIB8oR3OD*WMF8aYhb8rU=m_zVr5`zWn!iaBn=E|v+qWuXvob^$xN%nt%1iZ R^*K-jgQu&X%Q~loCIG{`ae4p% diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_he.png b/web/static/js9_old/images/toolbar/dax_images/cmap_he.png deleted file mode 100644 index 1e9972ea67892eb9846b1cdc560f03420e32d467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_-n7Y-U8saXwSmE> zo*}EAp|+l(zn*nYz2wY#{VDY>ef3eD_4zIJ4fXY{RrTE^^%L^yr)JjAN~xb8U%xc6 zepN{QdjI+@UiCX&>-RY{9&l_q;L?83z4M@F&mo__Lw*wv2TnN>GVMs%%%hRBkHyS8 z7QgU#;^O1U%TA=NIGM5fWcIpKc^gg_Y(8DQ^-SrGGZnkfR_{GmyZ?N{f%8p=F18-N z)N$le*Rd1S`wJ%4-Q<-5zT-d}tD z;l|sKx8Hrb`~LHTk6#{t`ug-X2+f4=|u`|IDozyJUL zKWA}y1~B*-lf2zsl4JJit^#s63p^r=fwTu0yPeFo12RfIT^vI+&L<}%q$H&!rY1js z@Z{06hfg1i3y27b35p6&pD<<8w24zEhX;fNg$0HNU%znW(zT0MFPj^f7?~NG8gJjQ zWz)8eTQ`>%loXW}mKJ~i@a5CDk6%CYbMSESaq@Eacl31ib@q1qd-!;zNo-BIGHGEh zCj-;ASsQOpm)i++fNF_rL`h0wNvc(HQ7VvPFfuT-&^0jBH82S=G_f);wK6f+1(F5^ iw`H!qN70a*pOTqYiCe=e$Gl*m1_n=8KbLh*2~7a6x-;Ma diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_heat.png b/web/static/js9_old/images/toolbar/dax_images/cmap_heat.png deleted file mode 100644 index 5b4512e347931cc7cbd8fa71356a6fe297e60f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYe>@p6vdB8HK!}fw1*@iNFfgYTbtR!!r0nYX494_2~GDXS=!QRg&1KJJ~GQE zm=Ki^nN&_)h#`a!Xi%nRp$I-QO9<35E2z_-zV)FC=lt&daNuxDO^JG$bdwZ-%xKUi zi?oT7NPI<)l{V`EpD0s;S?BS1q>`2Xz6e@@Pzl2Q5h;Tr5Ichq9|FThm_m^n2Fn(l z2uDr?3bx`xB(BI&5sexp8r5iuMawR<$DwNvdg9Ti#eg0oMoc8&QzGV)@ZF5xDPS6y z4ju}2d-NivL-mF{(4PS-HqDnqb755 zO45+gU?T2OFhSt&guuic+gj<*Dwq>~O8f&gy1eAgzRxT*y ug37E=X#}-K6(bj25Q>~*$NmXqpSEQ=&i_9U5M!Sa12F0mwGa1NivIwZrT{Yl diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_hsv.png b/web/static/js9_old/images/toolbar/dax_images/cmap_hsv.png deleted file mode 100644 index 90c7fb7bb41fd77aa53b04d6c7d1d3cdb6891f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+_+IzM%LQW#>L6Q z$1^CvH!>(7AviECI4CQNUpuDm}VO68-no6m4`4St_L^s6>ZwV6E>dv>_ zhG(Y%*De)~JreADxw!YUiXUWAJjASXn91@eqsuXdz!MCyCmFI&GgO>mXg|j=oHrw`U9A=@-A-CUvh`?m@BA!)&!jNm`Gi z^`8WrJoUAF=3)2T)%B%k=u7|PSD^)OVjA8g^}NfR{jOm7hw@Dy>-K(ZJMpRa(&uS+ zzRZ36b;+x5Yd?P9`t9q!AD@r?{B-WuryIXNKm7ge<)0s){{H>*9|*orWpV%pA7hfY zyGwG+KHXJ74rhT!WHFHT0Ash4*>*risi%u$h{pNkgoKo&w8Yfp=MSDddiLg4c%kf5-@(BSJAu3Wly@#(0%~CJboFyt=akR{08ohj`~Uy| diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_i8.png b/web/static/js9_old/images/toolbar/dax_images/cmap_i8.png deleted file mode 100644 index 9a9976a6f290508ddff612dff6a101e392db8bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXDW?FR5Z6tcHnFp_19=R>3=G#9 z82&Rbq|O3SA^#cv{b%_9U-r?XN3ya&;s1;b|5pPA82-;n1xaZ9|NrJc5Ip?R;Q-Xm znB?v5BKq{k&&5CvXMsm#F_88EW4Dvpc0h))r;B5V#`)xggp?-cG_f$2gk*OHK0iH+ z2hSe1GTYTLvIvMcF(e8GsvI!LI=MpC`L+;4{5$2FFD7rX25MI=ag8WRNi0dVN-jzT zQVd20h8DU8hPnnOA%-Sa2Buaf=DI-Az~Hvbwf86*a`RI%(<*UmSml@(4Aj8j>FVdQ I&MBb@0N4Rzvj6}9 diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_inferno.png b/web/static/js9_old/images/toolbar/dax_images/cmap_inferno.png deleted file mode 100644 index 86bdceb58d6ec6b7dbea419021b12adfe1b76992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjTulZlC+ zg;|7+MT&z>fty{8pHoMO%Se>lLXz8Fmd90*+gpu0K$|N}pDWsgGv0zT$(A$Kku%+u zE7OZR%a1oFh%YCMKQ~G+H(n?&StKuAG%s5`FJB_BSSq(%Cbvd5r(Qn0MIpOGF{?*8 zbAn376t%P&>Zx-ylNV|wE!9a_sTa3aKW3w0)K=s0ou*-X%!3bD1|G5TJ8tKF+QIXj zv)d&%=c}F$H+*bw`&-=$Hh&mq@+8XeS*+fRMD5q9>Tfeu-sdWQER_9JCiSIC{A<1N z_hx|~9XvmKIDbuK|22*6_iVP`^Vxqd;rhLb@ArD)-3@ZutDI``fRnzy2=#_y5Vi)k}T@gO9VoBeEDs zdw{Xq$!t3yqtw&IF+}5haza8%Qd(ka^798z9zA>b^s%^rh>)0|sPOa&QzlKDICXM( zKuAznU}*653s){(yLk1oxq*q1nW3ri_6=J$ZQHnYb9q5YQCVSW@%Im3K7IT6^)o*Q z4;LRNFL!@OPgh@OZ@0gPk5`(+)|4xg7Ups?Fm0Q)@%D7Noj?bumbgZgq$HN4S|t~y z0x1R~14DCN14CUS(-1==Dzopr088HEWdHyG diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_magma.png b/web/static/js9_old/images/toolbar/dax_images/cmap_magma.png deleted file mode 100644 index 4be28a369be8095c473684cf53a6711f741aa627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjT;lZlCs zg;|)5Rg!~Ej+;Y;k4sa4M_-uNRE*DBO2AQ8z(Y~cPem|9Q!q+bAi+=|&5S?Gia+0; zzsQ-t)I*@cN1!r5s5(TrCPK6>MyxJDqCQ2cAw#+$N4B9rzOhuHu|lb_R=KfJwXs#L zu~Vb5SF>TFR>M@ChFQAx^YrQ#8PqK^tX*wfv)-h7vuV|K^NKwd5F?c&wT<_0E4W`?H5+c#|4v~AHpwm>Z&(v_5 znb|y3tK}xP>kOTC=(!)z@;;#$cu^wk24Bowmc$2)DGwMk9x`V?V9mYHQE-pD_%3hh zZGnngg4H*KYOf17Toq}$BGP(Uxbu==&n5o;OT3dVa!tL+G2yi_!%Z{ z_nt|Cd-@~yb|>y@%h=aku&<$Ve@*@Vs`mY5efx?h?<<_OFK^+#oaOs6*X~Wci8;z zF_XV14S%22{dGb6=VguW*VVq=QvP~R@ylb`FVCgEyq5U(LFD^a!5_aw{{G#zRJTkB z7<`-s9+AaB+5?Q;PG;Ky8Ks^sjv*T7lM@nBlF|}Wlb=6$^61&ar;o)2M1;fyMTMtN zm@;YF#Ho|R144qr0z-qZU$}DV+QqAv%?(V9%nVJ9w{O_8Y1_uFo68GIipmO0i@$&P z^6A^hub=rjc)0jDdAa*Ldb;{Ld%OKTe7w>mwx(Q}v@n;Gfoa>Ujkl-E?F2eNwZt`| zBqgyV)hf9t6-Y4{85o-D8W`#tnT8k|SpkuOg|30Am4QJ|`l>z@4Y~O#nQ4`{HT<;_ RG6HH~@O1TaS?83{1OTUD1$Y1e diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_plasma.png b/web/static/js9_old/images/toolbar/dax_images/cmap_plasma.png deleted file mode 100644 index b9c842cfd085d1a4c4ea8e48472244493a44d6f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+j3i+w_Ad(TaL9) znRS9D>tsEasm3hR%~@vJFwb&ep5wwi&y#7sFVn(6#zmowiz6AA#4#*QVpx{Ousn-l zc^<=xB8C-Zj4P@bSJW~uZ)92C%C@YNV`(qIq#B-enpo9 z^RI^FUJuW{8JT$}Htk+Q%KhY|M`;O9GUJ}+L_g1ud|4F!x-{fXW$?S2fDiS4ADewX zw|Rc)bpP7x`fY;K_bHA)rrZ6TZS!ls)$c{-f0mj4S!MiZo#Ee2`hU0S{@tbhcc13p zLmGdNsr@;n`sbYL@5?H`uB-gKt@8bW%C{$~Utg$weyjHBquPgWTEG78G2F?g3=BTb z0*}aIAngIhZYQ(tfQ(X47sn8d^T`PbDM@LGsmaeDJbCo&;nTcT9`polE3Ac(Z=hp@Mg?z-sWJMVwqvqG+Rd|M6Axu^0^h(k0^aauh0;>i~3LpI**!A9jZZlP!Y;O>Bxza&{7nO zA|ph!SS(hGRIyoPi9!(+)#9jV6z$@w=oWXxpm-@hh$->=7y5)o(J;D)2GDhM0kxoG zs21%i*Ye2rl-*a z8bc%K0lI}c(IwQ1>d|3Tfl5(6@}Lc94O)ic&1<6+4)L^S^&R_U7H__}hhZ`hzVwPjAVoB~TU*MaVzK2GV@Q=l&Jvin$>))ss;X)=8c|&+x{xL2AsccaA6CL@D1f!F4hmsCYy=~0 z1~XWN8*GE^uoLXy0AcP14|t&zWT=2jI0%Oz06_@D5vYb*h(JBW-~^n4({KhF;Vd*k z3$#KT#GxG$&;i%r2Hb+%a0l+fJ$L{~=zoWQOgu6o6c&jMQQe9 z+PbN=xwY6VQS+jjcHtJ4O9L_3$p2$EwGxR!@pRT*7hSyX^L-c3zU^}x%XNJ24lV$` zL9eM~Xk$VUsZ6W5PjmpQz<9{4^?JRTX@Yzd6rrRHwHCNs=)QnQ=h5Gc#}0U`7^uad z5hMHYLXPnQOyuA#8&lX8gzz(VQYiciG6r=LdKy(Uj?*|t!%gE}68-BKqA(W5`$>de zgBrqeKNk8BaUCa6FuBZ{T}+*u<9vyvt%cJQpLoe>{>B@@@3E}-uqfuqjy}wd_GQPqgz?K6iB@8x ziM@4^uql6ip2F(GpvDG)!*{!Sd%Zt>)%2J*% zTa=rXBksG|bG!G}-8)rAbLG*BBc|D@z{lY9jDIhwkSk@yMWfG#z0U_nhR!xQo6nqf zwZy-#ul@WHiwcMgZe}{4*L}6~+6{Nt^}|THQc+ea-5%}*#s&8;R=a23G4~6d+G?k* z&S_U$o9zrBCuJ%rDU*^4vrM5Ti`5FHlxdP|cSLIc5l)`6H8!;VU&v6}R~Z2YZMkOP HpykpZ+j-^! diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_staircase.png b/web/static/js9_old/images/toolbar/dax_images/cmap_staircase.png deleted file mode 100644 index 2e8136280a67003931d27584577944c919690660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsigrvA+FoE9}*L@l9$(!|095|W=kc=F`Qqh}9U8SUy61O!Bc#2A?Z4GRkkIXyKq6(&raI+>k` z)m2p?AS^JHnW>c5S65dzS2kAQ!ew&<6B837Ge*W>Kd4Y7@Alam|B?txu#YI2D%~3*iba&=BH$) XRpQnV!zs55sDZ)L)z4*}Q$iB}!fbz> diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_standard.png b/web/static/js9_old/images/toolbar/dax_images/cmap_standard.png deleted file mode 100644 index dfe88b8bbb2a3c9de2387a41f2667540253c4992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O&y-gNvD&n~hDF zgF~8&ONoa^i=W>}P|#Xf*jY@>OF|+@S~^NrHc4JSOG&9vMWs?rtwB?>LtA@-uI_Yw z{rN^lD@;u{n3?UcwA^oPecaCOyo1AaC#Uoj#X>*(#!GuUTf ze8kxFq^bEibE_*>HaBhT@7p^(ad3X+?DpQxeZ!Vb+cs|9TwYL8R90A8{Qbk1Pv1U%{mjq7!^OwR z%iZ76)7976+wJe+?)FK#IZ0 zz|cb1z);t~B*f6f%D~jh1jseDGBD5$S;mHzopr E0GH6eqyPW_ diff --git a/web/static/js9_old/images/toolbar/dax_images/cmap_viridis.png b/web/static/js9_old/images/toolbar/dax_images/cmap_viridis.png deleted file mode 100644 index 785019a6f69b32e4fdb3c1722bc0357ce8b66a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LC~-+acCGuo9c%8e`5 zjW5w%D8*eY!$UILLnhBdq0mFQ#9gh-U8~Yfx7y91*44P))x6Q!s@ci5#mS-7!MWYu zt=-PE)7Gcc#=pxdsM|86+akQjEUL#erpF|{*Eq4)Fs0WZy;nc8S1+eeH?L2puur?B zPphm?v$9X4x=+2fPpzR(wW&{~wO6^lSE;jCv8PwDuSa2GkNo6r`Dxv9GrHtvb;`}{ zkelBjzo<=NX{+M$7Uh*qs;e6{*41losMFh2W4N`-bbE#6&N90_#ZLPQ-4EpX9Lf$n zk`Z<+HReQ8(y922Gts%{B8tz4R9y^cxa`}0#iRF{%arR5vv1feyk)-Pw(1A~vVz$3C4NPB>> z+sSM@AfwdN#W6(Vd~!lUN>W;4YVz|3PaZvc`1G;3fQXQops4Wl2~#Fbn>clHctA){ zSYT-I^$S-nUAuVovblkYk(r^X@%9Z{Hf`Iub#r+^Nl{s0Y4P_DUp{^N`1LbC2M-q? zCogw@M^9H@XK%N^hmTj9#MYE6lNRQ3GB9nMwej|Jxt%}>u+TLywK6d1Nnh26q9HdwB{QuOw}!t~LPkIh44$rjF6*2U FngCKT=lTEu diff --git a/web/static/js9_old/images/toolbar/dax_images/contour.png b/web/static/js9_old/images/toolbar/dax_images/contour.png deleted file mode 100644 index 992877147a923b839cdad42609412e8f20e37ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1242 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 Bj~M^} diff --git a/web/static/js9_old/images/toolbar/dax_images/filter.png b/web/static/js9_old/images/toolbar/dax_images/filter.png deleted file mode 100644 index 88e4a90d25b5e808770927c033382fe6f8c82ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP%z!o z#WBR9H#xR*L|Np;YIDMjElAf|DudCUd&WNMEy}c@u=bCc3^%~wO zCtcaJfLnmMBhcC@#)n7Y^idT_8>wT>+C82|6#+Xc9D-Rd9#vb}kj853yIM_RK~^dk Z!?M88#s8;OKL=XL;OXk;vd$@?2>>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uy*>gnPbVj;LT zbnm*tK!MnQu76sc^tnX+7kpqbQJQyjafVIPgcVb&0yVajs0jW4|1SNk>1|8(BYSt= zSNVNr&duy=anIiD-T7h5`t%>mPaMsvyz}?^-G4`x9o4&Tu0P-DR*u=l43h^RD++An zHr{_X5`8K*C;a}o=f>M^>t1?k60}l;ubp{@ z^2S+0ziaF&_QsugUhJbL+?*PBR^Wb~d0?Q{)BwHdg*#(ojfJ(tlJug zxqo`MPug_O?T_>#{|M=gTixe#S^7`)TN;(VOL7{`Avk)6F$cz82hnURURCA--Xsy^D?1ciYePGvxm-{?FjH W;=O@U=aU{#-t%TmC;XAcNE7zzuOjUp$w@*DvM?hOWK)e6peMdSZ&5; z)A}SR?+XUrX0n&P><{3@H_^qn#bNYev~>8ekcw_u7HiR|Rf>wBA|m#-g%)~y?{5#- zYa2|q2fxX=x%cLGJ~`+7e&_rI?!x3Y0Z35+S1g;&l1il*8yh1Mi4Y71*}s23%gf8y?RFdv z2l05ESS&_393~J5;PH59Zf-^hVVY8%MmC#eaBz^5Cr^^eWEdD2;PBzY%+Ag-Iyy=^ zod&?~_cJgsKsKADr>BR(!9i42ttpAM@?sbUsZ@%yXV22r)y1)6$IL~FqF}SxuvjcL z&f#zvDJAF5o#W73?bBzfu6bg)ujnQ@dIKiV|Qz$GW5eUFyvC!WB2~MYzVzGc$ z(hwF4_4W0H!eN9E#N%;x?AU?R>0Aq@0)F&pis9j3`6}=wPbTk^xS8bcy$3u<-D76@ z2{vmTLJ02OxlJS*Vf@AoUMwu4={liMh)5)2mZ}DP{`^mL2K+p}^Cu&tzmu9>#6TjY z!Lqu*v&Rp~s~M)BP7{elm`F~rvbsX$#0G;wE?l^<9(?K25PNs+;(9DbdhQL|_xaej zXE(cd@8Q6~gLLftoOX8`8(Ti6uCAWeO)ji@nP*R@nVOoy=kqZ%G_-#6q=ej3k-z_$ zX3O3Kc(%5nt*R`%dd1?K0#a9yO9m^ey6HSKGsD8d0-C1L($ez&Qvqu|T`J4BsTh=s z873bl8UN!xrSb;$eG#CvQa0DS-ELZ2TPZE&*-&3!12#(`fJS>AJ3rgZYqiMa^Bi?{ z7p_fPSzcP=<;xiw8^CV2nnAR=-E80Pr9ldWuGfIgh`Udm;MVO4{6{+}{*~tD_&A1l z8-;v9>0Ru<%rlF1~!z2EZV z58v}BJ;ke>hV!E)tis^+8x==G6Q6EtXMXNE4=2;uof~Q2(uSff@$5yB(W}G!GW0VY z9UW_JT>I;lX=rFzzj=zH;PH4k zb?OvXu3RA+jlLILt&x!tE?>S(Z*MPNuNOsmH`CUQO;uG%rBcM>adT|?{r(!@wQJXi z#bSg)A&wk5g4gR^H#T_-mQqS-7=|A&mF3F@=BwL$;@002ovPDHLkV1nfsCAI(n diff --git a/web/static/js9_old/images/toolbar/dax_images/grn.png b/web/static/js9_old/images/toolbar/dax_images/grn.png deleted file mode 100644 index 4c83a3fd406dee8ac9a1f7d5d7328788127bbdec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|X-^l&5RLQ6DG5LR%QvlLp0OhJ!ivVlY!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;n6ER-uV;<<~ws5jWh+R`)XNIWoRgO-51rv>wjDUa+CnuK`YJyH4E{ezQ z{#Nw;hOPD~ zKCvUe@W~0AwT`cZ?h5Hn_m)`lE4NRkcHXl1#xIP$Zp}?g-@bh5DLTolAV5LDfbp@W zPsz@h8+Y%{-DGcXzd3F5Nw>v<+^tS2=hHSHx&GSJ`OkZg(o1j4e5WqItQo&H%tnUq zbJ^~*ck|4}7ih6N>4+IWT{wYj6655PE&5{ITzX>Nd%{*vypy%HLTRExrGdnU@88Q$ zv9`&vf8sCHJoU6lrQAyP*~bbGx&GrmB8oR37HkO7I$E|{wz{GsVWLM%<=(id`)}sV zIQ>*f*13Jvsh|2RJ@a1e2+%Mv%sZ2}{qn|}IXvu+8h?KNJn6Sw_-ZRp)BUWilm0(` z+7hSf}Ape^9Oe9-m~fzGwCuE*;tW zQ?I}7%G6@nAy~2du2jMI-?pWdHgddWf2=(B*KzsCX0xs8V>+2~>BGJ6-@nT!BneO5 z8>1(@Z=WOchu5!HbG13I+2GaCca$N~bHVrDwR&o8-I+m!Djla8)@WW@z9T}4>xgxe z)>N*SS`NY!^iMMMyl3Qjap(Q_;NuaIkpeQY=hBQfxh@Wr<6--G`?mD_^UqVH`Py4@ z8QPX!e;wE$Gk5xQ@pqqpR#?qdt5%!5@W|nZ4!<5hR(`oOsIz3_yCuv&_Ww2YObBc- eX!%yzA-e=d#Wzp$P!u0JAOt diff --git a/web/static/js9_old/images/toolbar/dax_images/lightcurve.png b/web/static/js9_old/images/toolbar/dax_images/lightcurve.png deleted file mode 100644 index f57807c566712562450ba8e6b3ab70efa51cf4b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)T)lE+FKp4RB{}>aaMD2t`6IRfBxGHB54q#bXJ%LRa zZ(v+e4t?=H9X05^Gts8)pnx<&23B!<9tHs&b*~-BC#S#ki>FEij6t3&iY&P*ck1Web)0E@mV@^&^0Epw5 zZnw+*{XIemeBZY?z+M5*=W{#LTCGN-(ZKUO0N&r!Ore8Q8*66yZ1y&1Q2e^gAx4B#NSS_~GFJ zDWzTh|AgmxNGW-Id|Zcj9s56b`Hb0YMv^4<)R&`Lt@8bXZ3UM~B~DLInM@{RS+3g9@-@8E-j11gouKl^;&B71m25Rj%RaU5?m)=KnxJ+#(bUth1o zzVD;8rrYiE`ue&x8pkou&(CPBxw^Vqhh5ht3`3G6*%~kEMUo_hVTkLxHfQ(v@bHjU ztA!8(r4%nOF9;$2dSQCKo<;BO?(lt|qoX66-&i&~oeoMVq?AZ0H^N$LTQ+^)=luM9 zrEKyA8)J;g^V}>J3p1Tg&0sJvK@b=r#Ksl`f$8`AW;&gk#bROdJhu*Cg}%Ul+|zBM gc$$`fzMVd%AN|5P?jV}8^Z)<=07*qoM6N<$f?_@_Tw&>D($Ya&I`Gxu!2lg4Q od7N)z$i{zB1m+Frm>}N9meL6wm<-p00i_>zopr06FzUi~s-t diff --git a/web/static/js9_old/images/toolbar/dax_images/log.png b/web/static/js9_old/images/toolbar/dax_images/log.png deleted file mode 100644 index f942ea2e770054c0b6376690474821f2a17ba163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_W9= z#WBR9_vzJxLJbNWEEkr({9iwluXXA)fxOsT&Bx98n7F=aSWGNp2ng-d-n8qGOaG4} zP1|NqJ0qzw$>2?6sb%aBuAV(7b?30|F6d3$wJf@8qFK%@-CwWz6HmXm5Wse%H8M3L vfjhapCb+Bq@bZ(%dVj+At8srdj%E1St7g%4^Y(P0D;PXo{an^LB{Ts58|_Pd diff --git a/web/static/js9_old/images/toolbar/dax_images/mag.png b/web/static/js9_old/images/toolbar/dax_images/mag.png deleted file mode 100644 index 242716a95b5e1ee722bf737405d0620b1846f26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_Wh0 z#WBR9_w7}0z6JvhmJ5=P|E}-huHWjQEha2}?ojW`#VaE^jGN|ss9+G7C^J1K*6l*> zM6bQ`RGtZLsEZfd!CGydEjq7i##ZU|36Tr9?a%VpbL4$3+R>lA=KJC)g%3HBzV6_R z&iFDZD1A<&mIZfcf!M7Ucm02-kDs2Ubl~*jO#fE~u?+uDnVN~t-Bbs35QC?ypUXO@ GgeCxL=}n{n diff --git a/web/static/js9_old/images/toolbar/dax_images/mag_minus.png b/web/static/js9_old/images/toolbar/dax_images/mag_minus.png deleted file mode 100644 index fffe6ba64b15b2dfbdd36f62ae263fbe612a30b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_WtmV&1anUedj@e9n&IDSG+#BCMTjt=8;-7i8T7))mf?Y>wYl{? SJ1d~m7(8A5T-G@yGywp|tyA9s diff --git a/web/static/js9_old/images/toolbar/dax_images/mag_one.png b/web/static/js9_old/images/toolbar/dax_images/mag_one.png deleted file mode 100644 index f6fa977bb41e44c2cf91966fe04276bb0ac449cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP;jEB zi(`mI@7=48LJbNWtO0eG|E~AxUL?YqxWu>qqSJBp$vsW;46d?#Z||6~^BAk2xa5~8 z6PNYu4!^lpJipEB^dUO+-m%*}n^!SjNHn_M=ljs3H0)Brmj#y#OzhiA#b4-6EbP2} zd>8W~*@uTDkGv8Q-ge=Qs_CD{TqO;wFEFliimmwi=sn;1SE7o)eq>IXVz-R_K#QGO Uwd=BDK*uq7y85}Sb4q9e0I5w^@&Et; diff --git a/web/static/js9_old/images/toolbar/dax_images/mag_plus.png b/web/static/js9_old/images/toolbar/dax_images/mag_plus.png deleted file mode 100644 index d324f4befd735a17644ba9ff6918e0a1c59f44a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP;iE) zi(`mI@7bvbg&Gt%Ty8G=|3B4AWNC+nr}5i^&3yhb5{$MwPz{_SOaU9+$kpHitF$KxBaUo?joskDi{T7yhdk=f6Dpa?#>Nf+}SZCYet087zub8vlfI_!(Bc+P!C8z@?yh zHeq~EqPMi3`0%T@NLTCV$900Cp%cD5?5cXOD(Ls~`LRnEo-}=R=a(|TK+;X z=i*M`zK5c(=DJI5Td^W%w<_!T47EdyGiTd(Gx;4Y{pKGiUe~>A!_K9B7gXoCrW$`` zt_jMt?$?Y8k1&~~5xugV={%ccyRAcRi^k1x;S2gx-e`Ra_!Aa<`h3VN4yFUV2HjEm U#i4(5f&O9eboFyt=akR{027~XDSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@J_Io-U3d7J_d> z9r;=mcyw03*!<(a?|K=_Pt2l+w#8~pxGNoJwz0EhL5YsAlt_rTD4(M1O`8S&8O}MX zkt_N2d$&*A_GG=$&fE4!7QIkz^>A!>XLx(px+|)md@oPgaxF7b>|4w8%4rohv)Ag1 zyvd9;DLZ$tP-aJ%?lF$*r3WkLz2R&Zc-7XkE%$fSYpeYGDrJf8tWHJ0E7~$@=Ykl@K0XgE+%|t>#Jah6AFIYa62BY!v9#i!|D4!=!Ty(9 bzs!((S}A3e6`_9?XeWcGtDnm{r-UW|ELS!caZtwMFqx3juV)385NW)<2F^Tyd=i4 zc-DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@K?XPZ!4!3&E|S zyH_;L0^@hX ze&gd`b+kTg`L^><#?k~+-kiLdwJpcGMVB59z0YVn|9pT5>-xEKo^>wE zsOT&9S;ghn{oz?$u4chylj4qVJA)F=?O0z?tjKz7{eSt_Pt~;Uy)9EQpY#02^*Ub} kiIXMs>-pAxj5+j&@fV-+)y@A6CW2D2r>mdKI;Vst0O7qc6aWAK diff --git a/web/static/js9_old/images/toolbar/dax_images/poly.png b/web/static/js9_old/images/toolbar/dax_images/poly.png deleted file mode 100644 index a8f27d8cd0d8426449c420fe9ba48b44a4449b15..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 997 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-uy*>gnPbVj;M7 z>i*M}filO>*H*D9OXf@oN}JrcW|C5UW6+cwHty8PNfSKXR6Z%QNv0SJ1WqzK*>ECd zQpvvWpF2dzWe#lHK%On|Ngn>zW(u@=XT0evehoTf6AiZajU$h{QX6?XJn2u z_SEd--W#Krviq*kR4>=I!-^}zR=X^|D8SI?ru?XEx8eVa8sTgi9<~%4IpOxhjY)I; z+(o!pFTVcDvF-L-m$hNSOM^Vcx>;X-tx}QT;nIj;^L+EYIzswS#ojon?xQQtKVSSu zC$QRXKI{311rD(*Lk``#+x}X+L(bDg%Jt*pxV$;%pRYKbwz=ua{Dh2KIcAP$ywWyH zI$eIbWrZ&HzPouDFTVd)I{cb<|F;#MDnjd1&!isgbz}AwI=1$)Xb)K_G1nT2i`abit+R&Z9HM}sb1aWT9#>Ayx5(WB^P$w%t`5;>cwjMwruvw z#B&nU7^VJqSMBYyT6|GsqS3(spQS-UhN~~UEfdT$kZ{T6tk@d0P@wFtHKW4jn?C-_ zg>R`m@KO7`G?l?T=cUs^2VF7lDu!p@f8R{Va8nY@`B(eU-*ndLrx_M9Vh#(+cgC2^ zKY#gpyY8%yA1hoASM7Cs_O)th!HO0qML`aqr$sXlotw-pSg|ukNkOhZc=Ab=rh|TS z{FWEVc*-6qxRAUhN>`?Qx9rCXntzu#y7=hW)X`E38~D%t-0na`2(k1;L5 VS#opQiI1SX=jrO_vd$@?2>_8yhcW;F diff --git a/web/static/js9_old/images/toolbar/dax_images/pow.png b/web/static/js9_old/images/toolbar/dax_images/pow.png deleted file mode 100644 index 4664426a5657389576dfaf8f6d5ebeb2a3c91fd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_Wd~ z#WBR9_wCiQd<_ab%nz>p__yAM-^ho@KJUupZwGqyd0QM~3^NYxVlXi7^`56EnsM*} zpJz_?-(No!YV6}B@0{k(PS|f@`6hGk9TS_Z-7M8r#cHhQZ!JqapP}_m@P+4PHJO_h pvmY)zHj)3~)%7dICY@ONhOtLgS(l4pLO;*}44$rjF6*2Ung9s@Mrr^6 diff --git a/web/static/js9_old/images/toolbar/dax_images/pur.png b/web/static/js9_old/images/toolbar/dax_images/pur.png deleted file mode 100644 index f93c2e037583768797755fad053be37171a3de36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6fBw&JdQ&rUPlPeg?l~Wlw<|IZqeI5RLQ6fBw&JY;0t73Su@0JiQ>0*_~I$ bhmDD0%^MbhlcpUiK$Q%hu6{1-oD!MDSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@K>jo-U3d7J^$t zZO=103e2mXyJE|~<`*stmxXvHRsQ z+}LwtKGW{5k8Tu5x|aXgAkSY5Hly%*7WIdRpf_FU*s0 z5xSpe9=QJc%oX?FbKn0S`nSL$<$sA4Z?Tqi=UUscSn)|Gm-N^#jnQ+~ni_QMX_2D& zmfN`zded{-8#iXHzy3J3)Jk?^+F=@xf8;sa#7gXKoX` z^S*rB#}c!R+mz(`i{Cx|nBe1ZkI}K?Xi`sUf`Gr8aE96JImyb`e$P3Zmbm+FksV`m zguPT;UvGpT=anqeM+|%0=CEz7Gnvy?W9PqQy>vPNTl0!Mc8ViZ{`Pg9ZX>O{8Q%3&;Pgh|Azmc_2SGc gwUa*_R-gUHv_PBl%H?;e`k*Z0>FVdQ&MBb@0Jd^t0ssI2 diff --git a/web/static/js9_old/images/toolbar/dax_images/spectrum.png b/web/static/js9_old/images/toolbar/dax_images/spectrum.png deleted file mode 100644 index f158e988aca73e572f2f37f46e9eb1428e20f99b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP%zxn z#WBR9_w7|fz6JvxW{2JK?ek|hGHA-KxWdEpO+YiW_>|bA&H&+itPM+^7|r|sV!H_= zL&$zl^Qv9B4&uVoqGtZ+N<7@gEB%k(XVQH6^y0b8bf(E&W@fn}q_xw!X(`YO22WQ% Jmvv4FO#me0Gsyq| diff --git a/web/static/js9_old/images/toolbar/dax_images/srcbkg.png b/web/static/js9_old/images/toolbar/dax_images/srcbkg.png deleted file mode 100644 index 1ad534c7ca6283a90ddac01a00f7c5b9e8f07522..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1067 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;n|{4ESoDN<3a9eP@QL}IK`xRB_xDcQynV0b z-`%n0S8rCYz5i?N{afcEk8eD1`o`(Mr#2^;>ei&+*%u^yRP1!{_v^beR$pcEkz#qY zc>d|99J}woZ|QYg%rB?b!+c5eo~5O%yfzWh=f$Us3*G?>oCIYHix8yDv)`?w4P_w9|UAtV38$bW}+O+5Q+p=h}M85SI zCSDSH3j;bf6j=D|_K=8)-4V2MgNMo|$DZSl*F>!q>a(7e5vC#1vaIX%p{6@IW}P8= z)0a9J&75Lae|d?17F%=U&JEYT=`)FlwAC3%ED`v--p+Sr2v?1r{NMZ!6Ptb1oYxzN mPrq+-?}_D=7d4qBH|%G9)mnJ`(|b6Mw<&;$TF7^Fl1 diff --git a/web/static/js9_old/images/toolbar/dax_images/stats.png b/web/static/js9_old/images/toolbar/dax_images/stats.png deleted file mode 100644 index e12d554eab8b38c975fba83af4edaf56b1ded52c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_V<( z#WBR9_vlndz6JvhmdMBd_xG^73b$~z9&Wk8`=Cxh(D-{r<7IB$y>Uw} z_N|?EK7IQ>ot4U8E9x`U#2)78uCthw5hW8FkY=VWt+uY`LAvPXT7Bv5|Bt*4UU*XP zNx+<&jhcll3~90Jc1*e^8h(!BVd<{Sm!DRi*z_e!C`$h_bHBThiQoq5BA}ZXJYD@< J);T3K0RVH(Os)U` diff --git a/web/static/js9_old/images/toolbar/dax_images/text.png b/web/static/js9_old/images/toolbar/dax_images/text.png deleted file mode 100644 index f6b7bfd640c23d01a0a3f07a84f80a5cf38dac13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1075 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)$-ux=?CIhdVj;M8 zs=aqrpv3Y0v%03eNKlk;#`$8f8e%_{kSWplyykSOa*Z~RTR-c0)W zY*U=n6^`vI8#k`K{`$wSUrmP}GKfm-Pg~>h%+B6E)z?DCEbsd7kTucEFE8}>IhwY) z_fFpTjNII_ChM=o#>V#Edb{o1gFiiwoE9pmAA4NL!o+AX*Y8V}ZAL-h%c7kdHg9hB zTH5sccXhzmr%#vmtiHNxjq(945$CDrpQnm+AARus_tW5)LSjzgVPPMB{OD+IW>%T( zDPShUC)n#2s5P}@66c+)tpPe>g*7!jSFeU%$udglKR57w^LoilfCVs*9j%Mz*IzklDjef#k1*Q;}u7>V6FeY$(gOdqzD zAzTXsJigi3+Me8V^7t**hmRgH@$>UP+I{%2bL5vle|q}+`5Uv$TfToU|J!i(tnZxp z^A}&t=ulXH-I{xvB0Q;n;ew{8grMOYH97&|^vacJpmn<4TvA>}IXA zKe}AaH=Dg<=T64M9n()7`S7#mQh0VQ&rUPlPeg?l~Wlw<|NlzEY5RLQ6fB0E>LYRE67-d{J5Xj6vxskzK Wl7q){P17ErA_h-aKbLh*2~7aA`z0U% diff --git a/web/static/js9_old/images/toolbar/dax_images/yel.png b/web/static/js9_old/images/toolbar/dax_images/yel.png deleted file mode 100644 index 31983b4f3316674cfb15bfbe40a83434bde97261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6e}LNS+1md9mt4UzV@2wP6^)D8 c_|%vgKmTOo`z^L10;rV1)78&qol`;+0Ba;HzW@LL diff --git a/web/static/js9_old/images/toolbar/odax_images/10_4.png b/web/static/js9_old/images/toolbar/odax_images/10_4.png deleted file mode 100644 index f97b6e0e9cd7990bec6f5294b8040bf69a565e85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W_!2~2vB}S(JDK$?Q#}J9B$$$R;w`bnj(AwD8 uIB}w2Ki7_zGfvGov29w=*`6ssBpG(h=j3?es`&t@gTd3)&t;ucLK6VRg&!9H diff --git a/web/static/js9_old/images/toolbar/odax_images/2_2.png b/web/static/js9_old/images/toolbar/odax_images/2_2.png deleted file mode 100644 index eafebaf7ac6d7e475e2e8e821c68798ba5f6f093..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91 zcmeAS@N?(olHy`uVBq!ia0vp^B0$W_!2~2vB}S(JDJ4%A#}J9B$$$R;w`ab|u!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;nhSzFQWjpPZAo6 zm8VzNe$Ti3UEE(?a5{GD^|<>{|G(b<{buVoJG)Bp&w2k&e44oS)VX7)`ftQ+I{*Dx z_rED$K7I@|GdE8yEe)MCdGgbT4;`hXrH{V>rlz4>+}ul-FL!5SV{3WeFEshbr%yq@e*H?x&i2;Q(t7gZg~z4KmzOSB z;PBbs&#z_T)Tyd7XU;S-F;UsOcW>aGiH|QVeqeFt@87+d`T6Firl!l*u00zP7B*|< zOv&Pcf(3;lW_AW=&z@DYw!YnRI8nbZG5lgv<++|b1rFlLlzzBM`vXD9>s^PR8duZnbYr5R8(}u&f0qNmMtb5 zRq_>9Z~Q3ed|=Y&U%#}(#l>GaS00IBQ!z9Q%*)TeTITs}#uw?lLLY;7x9r6eUMPMapSet}4bduB~d%%@MEz7#&{`n+z+^y#lP zkJM=Q_4hB`zd!!l_wP&BtnvBw?VF0deY}^KmkFo+j8&_&D(mXRet#|%G<%|=X6RUE zXKt>(O@Ax1k&#i$qYFVc^93&D>DX9UXvoUS_60xp@09JDpDQnM^Tv$}*ZG24%y+I^ z=Lhu85wU9r_x_Ad;?Ly0_w>h)io2%npQlvd$@?2>?JY8btsA diff --git a/web/static/js9_old/images/toolbar/odax_images/back.png b/web/static/js9_old/images/toolbar/odax_images/back.png deleted file mode 100644 index 787cc93bda142c3eb105b0bded4b45fabfe531f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^VjwKQ1|+AbY^VTIEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq^kHGbExU!q>+tIX_n~ zF(p4KRj(qq0H}k3!KT6r$jnVGNmQuF&B-gas<2f8tFQvHLBje<3ScEA*|tg%z5xo( z`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNbQbtKhft9{~d3m{Bxv^e;QM$gNrKP35 zfswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}fnFS@8`FRQ;a}$&DOG|8(lt3220mPjp znP~`{@`|C}0(wv%B%^PrXP^%^8>rO=Bx>bfl$i>&8Dzelp$%9iiWt-$8-0-FNREN{ z6f6q#svVb&K0Mg$xO@(&M*;)+il>WXhzIZ6>-HHUjv@^o^ZO;5RvZlCVUJT(I^xva zyKJMcaNvc8scvhWw5(kPbaLJ{^)B+*Ai&bQV(-)>(F;L>-2a=r774zqxj*U6!F9*u z68w4Y{OOu~cW&k9XLk>sRb6|vY_HmmPc9pt&is+SwldDZUhT&A6^}kKw?^9woHRYS z?0r+ChyEJlM~!CUv$q}?y@`LIs4aW+~7W%Zue<@bJN7TO%D|hE}q`S$$jd4)bX#0F4}@Q z(tB%}b>_p7kVT#u+YLm~-Wq_30IN)dW1XuKiZ}@z<-c z*8T0nR<7;xYrkb_#66o59r8Y^ZtvE)DKEd|y`1N=txS5=SK)VGuU}nXu>a6bt}pSO zF^*dM?-YpY{W+1hj$6#1BkUQ=R_3mzvrDzs$82ZZ+%h}3i-n(4u1Cu+o1e8hU(+wL z`ITAC*T#rvG;Khes!qRy`%vp-4s@+*^F zyMAkzx-uSTIX?f?;Uv%7tq;Diy0)^18m(+Pe)ezE#qKP2owWtkFaBTr&Ah7aiAwb2 RR##9~@pScbS?83{1OVivZxa9j diff --git a/web/static/js9_old/images/toolbar/odax_images/bin_minus.png b/web/static/js9_old/images/toolbar/odax_images/bin_minus.png deleted file mode 100644 index d86fd763412f3fbaaff842d7ded0085848a52b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 563 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@J_%PZ!4!3&G?R zhlc+gYOXqN6Y>lgm;7gDbX|7P#MsE`4C}-YW09K$Y7*_YzN|R-K_Inp$WC`&{|(?<0ey@kL8y&3|v79CY-ibl#4~ l8O-mw-(S0&vPAB(XzEr4qfpb{#X!3mJYD@<);T3K0RR!>MyCJ( diff --git a/web/static/js9_old/images/toolbar/odax_images/bin_plus.png b/web/static/js9_old/images/toolbar/odax_images/bin_plus.png deleted file mode 100644 index 4057c2d3757cae0c9fa34d5f5e6d1ecb9949f066..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP%z!o z#WBR9_wCe!Tnz?1&cYx6*YA|uV%m``XH@XQy2tR?;w2Y^)EW8LFgv(Z?0NETY4EB~ zN3%rg3O7D``XX&|cJt@@)gOi3Kep`N@x?c}(*0=E#pAP=e_;#nyepiyucy7UeciGn byL`;Qy;0TEak7F*P|sg7q*v0|VnZ2FByX`ldh`22WQ%mvv4FO#rW05o7=W diff --git a/web/static/js9_old/images/toolbar/odax_images/blk.png b/web/static/js9_old/images/toolbar/odax_images/blk.png deleted file mode 100644 index 623ad269ef65622d5a3f88a4ad751dc0ac3ebd4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6DG4C(h?X&sHg;q@=(~U%$M(T(8_%FTW^V z-_X+1Qs2Nx-^fT8s6w~6GOr}DLN~8i8Da>`9GBGM!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;nsE zmET^<)Gc{&B5Tf}YqyTwV%;H=?0V2oBer4NI))V+KE}^Wf1=f25SsK_#lrl~%>1^G zMFt=uWuUU>PX$GXHjJIxl(d!A@CbHT-o2NgDl zOnhV3hvy1z&A+|v$gXwWKWp?pX3l!V=FiE-eB*6~$)r=((H5~b?8f`=7BYPP8@TGe{?J!-uHb*ltjempG_T>okHi)F-gjTxdznXd_LsYP;a_HC ziv{plhL}5Ij;GjgH`_4DEY?Eu0M`% z=5Y6_u9;=`(t!Wc+RcG?>;obLe(t;|_~rZ3oA#{lXYoI>zpnyH*q*L_F6*2UngDbb BO-uj) diff --git a/web/static/js9_old/images/toolbar/odax_images/circle.png b/web/static/js9_old/images/toolbar/odax_images/circle.png deleted file mode 100644 index 937505a9d969cae3ffaa1f515c3e33da554f6fd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1154 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;njiabVa2@&{{VqCx|7;g{dp)vAb%<%Xp9H`hqSSE{ixR#BxM&G_AbUv7lq^4Gj%0 ztwlwf-XAmm_}S~k0ZZ$5`#!(fWxd(m*?!rd9rd3~I;QDg)H?LfCAisiR=(an^@XRO zPO`JNUm2q}`C`VBn>lWc4h=SP{IM}HE7mlZF;7o8a5HT6)JdnGPC0(u{piDj6YSgv zlDFSZt+$#RcEm+y^V^&)yB~b4Si{on$jSKQ)2E=q-FLk#WTu^e`&QSVVSj{9p7GLp zhI!|o3vo@j|9-mm*%TwM%{QMU{CLsKCd~Zl&!01o3-}J)%n2*2+8cLs-`>4%S#tg# zkYHG~?QY)Z4}228TSaYbY&3p!zkmN;$L1+RU3t0s*Oeh%sSN*x^)tU#&6Vn9>ugq@ ze%f_mfQPKrO*bXMBCEM61`-}REp3Mtvn6A+rh3e=DBT^~b^Ni8#dC*li6v=EgAy&9 z4Yk+Ye?R$XQsO~N_NXHaH6=&8k2)E-R9!5wvOWH|Fhg*2{+^_XaYbnp-M)PKv}wKd zPwA*5FTPgo+PO1Pwi)Q0r4Gw42QI(7Flz0wMZtU~7m}nms%n&9m8dB#bv>Cf$%XO4 z*RQ6XUcdEa0y55|ZQkQN!8L4k=+jfvKJ!2Av2n{&`WP6iaWiiHaj73Kgf%s{t_b+C zHmuvUsq4|rz1jjC7Qe3UW)fBv;{3UyoK>xjZ~B$jueF^YDtvpf)pDkf#}so>E>@xc zPI6sgtCxPQ@>QGMIl=Kntf8W)WSzK zcJfD)3=bu~za9CZ>_CFS1c5cT(l+Pv%l^=kV4l6!^1`28$)CUe_~($j=&9$wStSw; bZl zreOFmgf14POBY5DtLPzpFw3n-C@oVEtSs#gr$4>*(8D>u^YVj_uhD4GMa$#m0HX8s zT9Zhd7^!rT*lF@^9U$3k%s1!w{r^ufKMx?sl^yaM^nQO7Wu}!{9yb$m8^v!&~3HN}QUEpZyRs|6}nl;wLdjOcSq( z5HUnNBnF5c;wsTev=U83J>e!Cgq0{Ij6^Q6olp}=L;?{@$SILf4#t7&K_!?5W`hM_ zDQE|s;4$zt=mk5$>tG)k1c$&dI04Rr-y=zXm!{!?_&%9aUs5Ad|2Mf$4rYp@Hcy*n zP8zmaEVlBBGP`wpeDdwo#QS%vVq%xaEnB&w{bH-Pt@%>RUZdHxXLnKIi>IT{!Xu&Q zse(qmO_h>-x2Mk^=)4%sRzj{aZh&Z;UD1?1%zw6}Iz8vX#N+3Jk| diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_aips0.png b/web/static/js9_old/images/toolbar/odax_images/cmap_aips0.png deleted file mode 100644 index 00a6eef83400aba426b7083c5d0b016132cabd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXse}NZ5Z8kT51N~s8yXrK7#Y}T zI+d_Yu4I@~$uPT`VOAi+Dh7rVBFg8Z7rcyL{yK5_2g`+h4AU7HrZF&FU|{&c!0?Ts z{1?Oj{|x_6G5lZ8@P7lt|BVd)7c=~qVffF$@SmOi|E5if?AIcIc5xPXL>2>S4={E+ znQaGT*n7G-hG?8mPDn^;VoDPWGb`hG@Zd=kbDmtB#)HS=4UCS8iGmUWqRq^OoSqyL zCQX~z%4k{H7U=D!D|rj(i2sa6oPi<&eL$mBOI#yLQW8s2t&)pUffR$0fuV)2fuXK} xNr<6|m4T_1iMcM2G%&a=bL~BfhTQy=%(P0}8df>x1p_rOc)I$ztaD0e0ss%JXx#t+ diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_b.png b/web/static/js9_old/images/toolbar/odax_images/cmap_b.png deleted file mode 100644 index 84efe32a5873c1a2a576c62fffcecda9a5630a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gO-#}O7{(v^m_QO%X6YK2Y_l!wk6^8GPo+k&O zuv&}`ksdKp=~A)v@`xFbY_V55P0?sHBO?<~0=YmwPzaO)6@U$>1>8Uj&;|4W0U!i~ zfl(j^OafCt5=a5_Kw5%dGNiLHuR>}wl3F}0!=wdq2d*7NxCui(1Wuy67hQvB9)|lW zYQ|ujfbl*`6WIC!`E$ryK-Nzz=Q2dgdo_fF6;P!b%ph(c@)q+MX=$smzK`1upO4MQt!t92bkN*hGM?Hrc VkN;nYl($rg0<0#R@%j!|&mTQB^KAeC diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_bb.png b/web/static/js9_old/images/toolbar/odax_images/cmap_bb.png deleted file mode 100644 index 9e005eaa1cfc59fc842998c04d6ab900f784cb39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYeA@M=z%Q20@#5( zARll8#Xu?G15N|yB&c2rzZ|uZXo$wmI5e+A>w2_pLB}?9Ytgp@{b?B3gFz!+nh~^O zEEf|;5OQGpC}upEE5kws7SDiHVLUHoO$6(r*cijxO18xF&PLwd%1(j3Nqn@EPty5R z&*zyOvT(%Cw|RV*&q)_Q7jw3R^Ira{-QB>%5PQRc0FctdrF?L1t%9yCttD3G}t8c8k-f+-j%Q>*$ZXFvM4vxMa zd6O(?HA(8k?GHNd2YS1Dx+_Y(Wv5R1%71>H|F$sq<9lRygnYS7vFyr)nv1pm%a`^U zvonj<^tguWTRbv^_1@|lZ(7?Y9`imc1epND+;mtu1A}vDk8pF{eIhg3#8U4MVi0TQ5WqLZFsf zD;r1=MG%Rkd(uS^K?s2aWoauIfn}Biky$1LQGfc@hd!KhF86W{_uf{Yx5S`dtp^Nl zm!n*$BB0eS5L~S9DS>&Ld>+}Us;Wk#1<_w9=8z>EkOR4p2diKW;gMDK*YPj170Wt87iR~YTy6_AP8Zog*s?}2sA+qj>Abf1*f4I&Oi&a zK|6Fp9J(L@-Eal2!40?xx8OGPLLVey08(%t9>7C*1Viu`hT#c3g%KEqG`xlkyn%6; zfJvBwPw*M0VFqSl4t{Dhzf|>i&GxGu;(fY^t6FS}>o4{U*Xwi$oib9*H&0O@E*H@pblFwsw(zvCfdy*>bL}qqY5PsmrrBymC+(i(jwT zF+bIv%p~%~sT4+?`=d%A8nOi&Lqaf1redRHGD;TNWU)zBo2AGoSdubp(_j8E)E`z3 Wg-`t7&|`0?5C+^%uj9^cfAb%gQJP%< diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_color.png b/web/static/js9_old/images/toolbar/odax_images/cmap_color.png deleted file mode 100644 index 88f6a20e9d0dcd700ff146b67d570af20aa638bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsTBb}A+DP?ZDMC<2lBMEwDk1! zjEs!J!^0C265`|I8yg$@`}_O)`qr#jbKt;%{rmUt+qduP)vNE{zkm1c-KS6Q7Oa2A zsQ->Z?;V5gdj^Xq46z3p;`cKo?_j8IW2moZXsTt{6v1%7mtnsj!+j}+_Y4g07_^Qs z_|IeTo6q38fFW@bNL5_}Lq`$AJb#AyehjOf7+$aeRWZC`U^~X(w4cF$KZD;v_TV?0 zPA$20;RVo@oCO|{#X#BvjNMLV+W{Gwo-U3d8t0P}5>l9$+|tAp5>k_&KX{Pv{K+FW zCb>8}JG(kYM@2=&M8QBqL&HK&Pfdjh(Kpaup{S3j3^ HP6 diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_cool.png b/web/static/js9_old/images/toolbar/odax_images/cmap_cool.png deleted file mode 100644 index 8e43a8cecdeb3ba95ba61373b7ec53a15dcf23f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gUr5t&6vfY6x<78y={AQ#f>b0p`c3DQMN%?#GqtHR%l@g`3^8lDnI#w`6`H20 zsUSoMK9q&!OiQSgh%kK6%oUZ9)yyFJr&$TY?VE2sbm5$H@5ASEx%HN;G^sdT3_xl& z8FN_LnS??<^F(oP8o-OOWLQ%?9*;mE0tA2rkOL|p0*D0G0nxxFAdV5h79bg5Tn3O0 zl;zNPh9XZaR2AP;zfz$x1@AMdWfV>lDSA$MM2dR ze3F7sk^BtF>nNm=LYgVGjT9ZE=pyAMQg)N7hg4T6>^glmevQ|<)qo1%kWa=xJI89F^nO+Mm>7+V128cwU>bXKj-z{MMMdJS`qt0{ZE=O3W_h`qGr#Qy<_-Z9Sr Nm{YQheaVHje*pOl>^%Sg diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_green.png b/web/static/js9_old/images/toolbar/odax_images/cmap_green.png deleted file mode 100644 index 63dcac937129ef26062146cad43ca410de04e4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmZ{gZAg=G6vclPv=^IMn!SlcAVxHLwziZ-#bnDZ#+v$M2|-(XHVV;}Zk0$7Lg2f# zvVjCq1d&9xCtU;)L=Z?&mbQcum}W%~nQ1~0^`~!r=)*bZaxdp_?``vW%MJQf!k?sZ$c%cGhsD>Ii1cxC2K?uW9sD*lnKqJK9G&I8*I14Rs4qBld zx}XQ*&_%)&e@z)v*4H0p2FHy582@6$zGHDX;{f3at{c9$q(Ziijo^dji@D@VeC zQ1Ii#`^gXQrl(ftkONmjiBxMTHU;i=G9aoNp VoBnU;x7Sw*18%3+ai`4R@(05xn^FJ( diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_grey.png b/web/static/js9_old/images/toolbar/odax_images/cmap_grey.png deleted file mode 100644 index addfaad34f0fbb501c9dfd20cfe44f1450183454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@0VEi-_Oq@8QcOwS?k)`f+xyS#2l6-zJR*yM zv+di#63ia%eDuHG(hSNr$h>-Y6-f!=PqlDDQYFw{9roNz|9RSxJ3)e_f; zl9a@fRIB8oR3OD*WMF8aYhb8rU=m_zVr5`zWn!iaBn=E|v+qWuXvob^$xN%nt%1iZ R^*K-jgQu&X%Q~loCIG{`ae4p% diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_he.png b/web/static/js9_old/images/toolbar/odax_images/cmap_he.png deleted file mode 100644 index 1e9972ea67892eb9846b1cdc560f03420e32d467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_-n7Y-U8saXwSmE> zo*}EAp|+l(zn*nYz2wY#{VDY>ef3eD_4zIJ4fXY{RrTE^^%L^yr)JjAN~xb8U%xc6 zepN{QdjI+@UiCX&>-RY{9&l_q;L?83z4M@F&mo__Lw*wv2TnN>GVMs%%%hRBkHyS8 z7QgU#;^O1U%TA=NIGM5fWcIpKc^gg_Y(8DQ^-SrGGZnkfR_{GmyZ?N{f%8p=F18-N z)N$le*Rd1S`wJ%4-Q<-5zT-d}tD z;l|sKx8Hrb`~LHTk6#{t`ug-X2+f4=|u`|IDozyJUL zKWA}y1~B*-lf2zsl4JJit^#s63p^r=fwTu0yPeFo12RfIT^vI+&L<}%q$H&!rY1js z@Z{06hfg1i3y27b35p6&pD<<8w24zEhX;fNg$0HNU%znW(zT0MFPj^f7?~NG8gJjQ zWz)8eTQ`>%loXW}mKJ~i@a5CDk6%CYbMSESaq@Eacl31ib@q1qd-!;zNo-BIGHGEh zCj-;ASsQOpm)i++fNF_rL`h0wNvc(HQ7VvPFfuT-&^0jBH82S=G_f);wK6f+1(F5^ iw`H!qN70a*pOTqYiCe=e$Gl*m1_n=8KbLh*2~7a6x-;Ma diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_heat.png b/web/static/js9_old/images/toolbar/odax_images/cmap_heat.png deleted file mode 100644 index 5b4512e347931cc7cbd8fa71356a6fe297e60f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYe>@p6vdB8HK!}fw1*@iNFfgYTbtR!!r0nYX494_2~GDXS=!QRg&1KJJ~GQE zm=Ki^nN&_)h#`a!Xi%nRp$I-QO9<35E2z_-zV)FC=lt&daNuxDO^JG$bdwZ-%xKUi zi?oT7NPI<)l{V`EpD0s;S?BS1q>`2Xz6e@@Pzl2Q5h;Tr5Ichq9|FThm_m^n2Fn(l z2uDr?3bx`xB(BI&5sexp8r5iuMawR<$DwNvdg9Ti#eg0oMoc8&QzGV)@ZF5xDPS6y z4ju}2d-NivL-mF{(4PS-HqDnqb755 zO45+gU?T2OFhSt&guuic+gj<*Dwq>~O8f&gy1eAgzRxT*y ug37E=X#}-K6(bj25Q>~*$NmXqpSEQ=&i_9U5M!Sa12F0mwGa1NivIwZrT{Yl diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_hsv.png b/web/static/js9_old/images/toolbar/odax_images/cmap_hsv.png deleted file mode 100644 index 90c7fb7bb41fd77aa53b04d6c7d1d3cdb6891f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+_+IzM%LQW#>L6Q z$1^CvH!>(7AviECI4CQNUpuDm}VO68-no6m4`4St_L^s6>ZwV6E>dv>_ zhG(Y%*De)~JreADxw!YUiXUWAJjASXn91@eqsuXdz!MCyCmFI&GgO>mXg|j=oHrw`U9A=@-A-CUvh`?m@BA!)&!jNm`Gi z^`8WrJoUAF=3)2T)%B%k=u7|PSD^)OVjA8g^}NfR{jOm7hw@Dy>-K(ZJMpRa(&uS+ zzRZ36b;+x5Yd?P9`t9q!AD@r?{B-WuryIXNKm7ge<)0s){{H>*9|*orWpV%pA7hfY zyGwG+KHXJ74rhT!WHFHT0Ash4*>*risi%u$h{pNkgoKo&w8Yfp=MSDddiLg4c%kf5-@(BSJAu3Wly@#(0%~CJboFyt=akR{08ohj`~Uy| diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_i8.png b/web/static/js9_old/images/toolbar/odax_images/cmap_i8.png deleted file mode 100644 index 9a9976a6f290508ddff612dff6a101e392db8bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXDW?FR5Z6tcHnFp_19=R>3=G#9 z82&Rbq|O3SA^#cv{b%_9U-r?XN3ya&;s1;b|5pPA82-;n1xaZ9|NrJc5Ip?R;Q-Xm znB?v5BKq{k&&5CvXMsm#F_88EW4Dvpc0h))r;B5V#`)xggp?-cG_f$2gk*OHK0iH+ z2hSe1GTYTLvIvMcF(e8GsvI!LI=MpC`L+;4{5$2FFD7rX25MI=ag8WRNi0dVN-jzT zQVd20h8DU8hPnnOA%-Sa2Buaf=DI-Az~Hvbwf86*a`RI%(<*UmSml@(4Aj8j>FVdQ I&MBb@0N4Rzvj6}9 diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_inferno.png b/web/static/js9_old/images/toolbar/odax_images/cmap_inferno.png deleted file mode 100644 index 86bdceb58d6ec6b7dbea419021b12adfe1b76992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjTulZlC+ zg;|7+MT&z>fty{8pHoMO%Se>lLXz8Fmd90*+gpu0K$|N}pDWsgGv0zT$(A$Kku%+u zE7OZR%a1oFh%YCMKQ~G+H(n?&StKuAG%s5`FJB_BSSq(%Cbvd5r(Qn0MIpOGF{?*8 zbAn376t%P&>Zx-ylNV|wE!9a_sTa3aKW3w0)K=s0ou*-X%!3bD1|G5TJ8tKF+QIXj zv)d&%=c}F$H+*bw`&-=$Hh&mq@+8XeS*+fRMD5q9>Tfeu-sdWQER_9JCiSIC{A<1N z_hx|~9XvmKIDbuK|22*6_iVP`^Vxqd;rhLb@ArD)-3@ZutDI``fRnzy2=#_y5Vi)k}T@gO9VoBeEDs zdw{Xq$!t3yqtw&IF+}5haza8%Qd(ka^798z9zA>b^s%^rh>)0|sPOa&QzlKDICXM( zKuAznU}*653s){(yLk1oxq*q1nW3ri_6=J$ZQHnYb9q5YQCVSW@%Im3K7IT6^)o*Q z4;LRNFL!@OPgh@OZ@0gPk5`(+)|4xg7Ups?Fm0Q)@%D7Noj?bumbgZgq$HN4S|t~y z0x1R~14DCN14CUS(-1==Dzopr088HEWdHyG diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_magma.png b/web/static/js9_old/images/toolbar/odax_images/cmap_magma.png deleted file mode 100644 index 4be28a369be8095c473684cf53a6711f741aa627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjT;lZlCs zg;|)5Rg!~Ej+;Y;k4sa4M_-uNRE*DBO2AQ8z(Y~cPem|9Q!q+bAi+=|&5S?Gia+0; zzsQ-t)I*@cN1!r5s5(TrCPK6>MyxJDqCQ2cAw#+$N4B9rzOhuHu|lb_R=KfJwXs#L zu~Vb5SF>TFR>M@ChFQAx^YrQ#8PqK^tX*wfv)-h7vuV|K^NKwd5F?c&wT<_0E4W`?H5+c#|4v~AHpwm>Z&(v_5 znb|y3tK}xP>kOTC=(!)z@;;#$cu^wk24Bowmc$2)DGwMk9x`V?V9mYHQE-pD_%3hh zZGnngg4H*KYOf17Toq}$BGP(Uxbu==&n5o;OT3dVa!tL+G2yi_!%Z{ z_nt|Cd-@~yb|>y@%h=aku&<$Ve@*@Vs`mY5efx?h?<<_OFK^+#oaOs6*X~Wci8;z zF_XV14S%22{dGb6=VguW*VVq=QvP~R@ylb`FVCgEyq5U(LFD^a!5_aw{{G#zRJTkB z7<`-s9+AaB+5?Q;PG;Ky8Ks^sjv*T7lM@nBlF|}Wlb=6$^61&ar;o)2M1;fyMTMtN zm@;YF#Ho|R144qr0z-qZU$}DV+QqAv%?(V9%nVJ9w{O_8Y1_uFo68GIipmO0i@$&P z^6A^hub=rjc)0jDdAa*Ldb;{Ld%OKTe7w>mwx(Q}v@n;Gfoa>Ujkl-E?F2eNwZt`| zBqgyV)hf9t6-Y4{85o-D8W`#tnT8k|SpkuOg|30Am4QJ|`l>z@4Y~O#nQ4`{HT<;_ RG6HH~@O1TaS?83{1OTUD1$Y1e diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_plasma.png b/web/static/js9_old/images/toolbar/odax_images/cmap_plasma.png deleted file mode 100644 index b9c842cfd085d1a4c4ea8e48472244493a44d6f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+j3i+w_Ad(TaL9) znRS9D>tsEasm3hR%~@vJFwb&ep5wwi&y#7sFVn(6#zmowiz6AA#4#*QVpx{Ousn-l zc^<=xB8C-Zj4P@bSJW~uZ)92C%C@YNV`(qIq#B-enpo9 z^RI^FUJuW{8JT$}Htk+Q%KhY|M`;O9GUJ}+L_g1ud|4F!x-{fXW$?S2fDiS4ADewX zw|Rc)bpP7x`fY;K_bHA)rrZ6TZS!ls)$c{-f0mj4S!MiZo#Ee2`hU0S{@tbhcc13p zLmGdNsr@;n`sbYL@5?H`uB-gKt@8bW%C{$~Utg$weyjHBquPgWTEG78G2F?g3=BTb z0*}aIAngIhZYQ(tfQ(X47sn8d^T`PbDM@LGsmaeDJbCo&;nTcT9`polE3Ac(Z=hp@Mg?z-sWJMVwqvqG+Rd|M6Axu^0^h(k0^aauh0;>i~3LpI**!A9jZZlP!Y;O>Bxza&{7nO zA|ph!SS(hGRIyoPi9!(+)#9jV6z$@w=oWXxpm-@hh$->=7y5)o(J;D)2GDhM0kxoG zs21%i*Ye2rl-*a z8bc%K0lI}c(IwQ1>d|3Tfl5(6@}Lc94O)ic&1<6+4)L^S^&R_U7H__}hhZ`hzVwPjAVoB~TU*MaVzK2GV@Q=l&Jvin$>))ss;X)=8c|&+x{xL2AsccaA6CL@D1f!F4hmsCYy=~0 z1~XWN8*GE^uoLXy0AcP14|t&zWT=2jI0%Oz06_@D5vYb*h(JBW-~^n4({KhF;Vd*k z3$#KT#GxG$&;i%r2Hb+%a0l+fJ$L{~=zoWQOgu6o6c&jMQQe9 z+PbN=xwY6VQS+jjcHtJ4O9L_3$p2$EwGxR!@pRT*7hSyX^L-c3zU^}x%XNJ24lV$` zL9eM~Xk$VUsZ6W5PjmpQz<9{4^?JRTX@Yzd6rrRHwHCNs=)QnQ=h5Gc#}0U`7^uad z5hMHYLXPnQOyuA#8&lX8gzz(VQYiciG6r=LdKy(Uj?*|t!%gE}68-BKqA(W5`$>de zgBrqeKNk8BaUCa6FuBZ{T}+*u<9vyvt%cJQpLoe>{>B@@@3E}-uqfuqjy}wd_GQPqgz?K6iB@8x ziM@4^uql6ip2F(GpvDG)!*{!Sd%Zt>)%2J*% zTa=rXBksG|bG!G}-8)rAbLG*BBc|D@z{lY9jDIhwkSk@yMWfG#z0U_nhR!xQo6nqf zwZy-#ul@WHiwcMgZe}{4*L}6~+6{Nt^}|THQc+ea-5%}*#s&8;R=a23G4~6d+G?k* z&S_U$o9zrBCuJ%rDU*^4vrM5Ti`5FHlxdP|cSLIc5l)`6H8!;VU&v6}R~Z2YZMkOP HpykpZ+j-^! diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_staircase.png b/web/static/js9_old/images/toolbar/odax_images/cmap_staircase.png deleted file mode 100644 index 2e8136280a67003931d27584577944c919690660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsigrvA+FoE9}*L@l9$(!|095|W=kc=F`Qqh}9U8SUy61O!Bc#2A?Z4GRkkIXyKq6(&raI+>k` z)m2p?AS^JHnW>c5S65dzS2kAQ!ew&<6B837Ge*W>Kd4Y7@Alam|B?txu#YI2D%~3*iba&=BH$) XRpQnV!zs55sDZ)L)z4*}Q$iB}!fbz> diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_standard.png b/web/static/js9_old/images/toolbar/odax_images/cmap_standard.png deleted file mode 100644 index dfe88b8bbb2a3c9de2387a41f2667540253c4992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O&y-gNvD&n~hDF zgF~8&ONoa^i=W>}P|#Xf*jY@>OF|+@S~^NrHc4JSOG&9vMWs?rtwB?>LtA@-uI_Yw z{rN^lD@;u{n3?UcwA^oPecaCOyo1AaC#Uoj#X>*(#!GuUTf ze8kxFq^bEibE_*>HaBhT@7p^(ad3X+?DpQxeZ!Vb+cs|9TwYL8R90A8{Qbk1Pv1U%{mjq7!^OwR z%iZ76)7976+wJe+?)FK#IZ0 zz|cb1z);t~B*f6f%D~jh1jseDGBD5$S;mHzopr E0GH6eqyPW_ diff --git a/web/static/js9_old/images/toolbar/odax_images/cmap_viridis.png b/web/static/js9_old/images/toolbar/odax_images/cmap_viridis.png deleted file mode 100644 index 785019a6f69b32e4fdb3c1722bc0357ce8b66a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LC~-+acCGuo9c%8e`5 zjW5w%D8*eY!$UILLnhBdq0mFQ#9gh-U8~Yfx7y91*44P))x6Q!s@ci5#mS-7!MWYu zt=-PE)7Gcc#=pxdsM|86+akQjEUL#erpF|{*Eq4)Fs0WZy;nc8S1+eeH?L2puur?B zPphm?v$9X4x=+2fPpzR(wW&{~wO6^lSE;jCv8PwDuSa2GkNo6r`Dxv9GrHtvb;`}{ zkelBjzo<=NX{+M$7Uh*qs;e6{*41losMFh2W4N`-bbE#6&N90_#ZLPQ-4EpX9Lf$n zk`Z<+HReQ8(y922Gts%{B8tz4R9y^cxa`}0#iRF{%arR5vv1feyk)-Pw(1A~vVz$3C4NPB>> z+sSM@AfwdN#W6(Vd~!lUN>W;4YVz|3PaZvc`1G;3fQXQops4Wl2~#Fbn>clHctA){ zSYT-I^$S-nUAuVovblkYk(r^X@%9Z{Hf`Iub#r+^Nl{s0Y4P_DUp{^N`1LbC2M-q? zCogw@M^9H@XK%N^hmTj9#MYE6lNRQ3GB9nMwej|Jxt%}>u+TLywK6d1Nnh26q9HdwB{QuOw}!t~LPkIh44$rjF6*2U FngCKT=lTEu diff --git a/web/static/js9_old/images/toolbar/odax_images/contour.png b/web/static/js9_old/images/toolbar/odax_images/contour.png deleted file mode 100644 index bbd52c2b2fd7572c0e07c224b3ba0542dd246cac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 235 zcmV@I2t*hzvrW3qxT$wd#x-aIK>C-QDfrA_ zS%L?6N=7tE=F8ma@_iPs9mUh=A4SW;B07SODu`NWh@y%pi`j;nr9c26S)~*R(okKM zej#$^@f>?|@m3X*B8w^!<2Q)>{i!bUKirFa@$NKvJDPo=Ri2N$Bh0%g)`wy)<# lDwY%V9)J4N$kKKZja~4Oq7K@pK{x;a002ovPDHLkV1jAJWmy0K diff --git a/web/static/js9_old/images/toolbar/odax_images/coords.png b/web/static/js9_old/images/toolbar/odax_images/coords.png deleted file mode 100644 index cb068bde0b9b8801decd92edbd075320f2b6096e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 zcmV+f0sH=mP)c;^9NK}O|^N%Vt zwA%|k{H)?-MmcY%smO!ch3RE!DvnucQ7Lrh)l_&DkCp&{nd_xYDE{dXv99?a_ToY? zGk!BpkziG9QcPJxRH{kK<;j@FpFK>T5a-Dmn_YwkX>%*zKffQWj&G-=IRkb80000< KMNUMnLSTXkHf@ps diff --git a/web/static/js9_old/images/toolbar/odax_images/cyn.png b/web/static/js9_old/images/toolbar/odax_images/cyn.png deleted file mode 100644 index 0adfe0df04d08f2e310abcd7d5a8ad0a6389fd3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6DG5IyCP=PenXw}E!ivVlY!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;nrU zdKY4fChJ)180X99$2&AuZ>YYd6}%xj=Es?eEl#Uvi!MEKG&_BP?}zojmc9NdKSQKe z({D~u|>tr_H))_uxR0zZ}>`{K9XC*b?-w{EdX)0c@X%dDHylzncIhSIhZMJ7^$ zkNexxBgJ^wn0LhJHF>VTUTw8!R?@W81*=vS2(GjBocY|cI5s?~x%B<9tgT7MA5SdU z;Fokpe2K%f+i%4tsWck!uohqWP-1m3#i;RP1<#+aj+aeV`u~`>{(;}6=56L2cUEf8 yYWXK;ASdURZWVsN^Ame$61R0|=4#Igf7$e>27LPC_2vvHU3!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;n66+GAush^%g!&FePCVy&ka}Q-B&794zG9OKDuEue?Xn% zy(TZ=%Nk2I>@HsZrjq5`f(i%r`<*+4JHvnRwI!6*|ywqTWn!%)bH%}j4 zJe{-6!}&{O^Ov3X{8fKm*IlGob1XhBa{v3Vimyh0nf9@CyfJS+JPVYNJYD@<);T3K F0RTxc0&@TW diff --git a/web/static/js9_old/images/toolbar/odax_images/filter.png b/web/static/js9_old/images/toolbar/odax_images/filter.png deleted file mode 100644 index 88e4a90d25b5e808770927c033382fe6f8c82ca9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181 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 f-B$+UIy)p zQ2ibsAhOKU%T=QPOLdoI>E>w{BsufKUJV7p-m24<0r?pVEDHMRL;@ y^H3J^%IH%TYqoN=F}44FubTw&>D($Ya&I`Gxu!2lg4Q od7N)z$i{zB1m+Frm>}N9meL6wm<-p00i_>zopr06FzUi~s-t diff --git a/web/static/js9_old/images/toolbar/odax_images/log.png b/web/static/js9_old/images/toolbar/odax_images/log.png deleted file mode 100644 index f942ea2e770054c0b6376690474821f2a17ba163..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_W9= z#WBR9_vzJxLJbNWEEkr({9iwluXXA)fxOsT&Bx98n7F=aSWGNp2ng-d-n8qGOaG4} zP1|NqJ0qzw$>2?6sb%aBuAV(7b?30|F6d3$wJf@8qFK%@-CwWz6HmXm5Wse%H8M3L vfjhapCb+Bq@bZ(%dVj+At8srdj%E1St7g%4^Y(P0D;PXo{an^LB{Ts58|_Pd diff --git a/web/static/js9_old/images/toolbar/odax_images/mag.png b/web/static/js9_old/images/toolbar/odax_images/mag.png deleted file mode 100644 index 242716a95b5e1ee722bf737405d0620b1846f26e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_Wh0 z#WBR9_w7}0z6JvhmJ5=P|E}-huHWjQEha2}?ojW`#VaE^jGN|ss9+G7C^J1K*6l*> zM6bQ`RGtZLsEZfd!CGydEjq7i##ZU|36Tr9?a%VpbL4$3+R>lA=KJC)g%3HBzV6_R z&iFDZD1A<&mIZfcf!M7Ucm02-kDs2Ubl~*jO#fE~u?+uDnVN~t-Bbs35QC?ypUXO@ GgeCxL=}n{n diff --git a/web/static/js9_old/images/toolbar/odax_images/mag_minus.png b/web/static/js9_old/images/toolbar/odax_images/mag_minus.png deleted file mode 100644 index fffe6ba64b15b2dfbdd36f62ae263fbe612a30b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_WtmV&1anUedj@e9n&IDSG+#BCMTjt=8;-7i8T7))mf?Y>wYl{? SJ1d~m7(8A5T-G@yGywp|tyA9s diff --git a/web/static/js9_old/images/toolbar/odax_images/mag_one.png b/web/static/js9_old/images/toolbar/odax_images/mag_one.png deleted file mode 100644 index f6fa977bb41e44c2cf91966fe04276bb0ac449cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP;jEB zi(`mI@7=48LJbNWtO0eG|E~AxUL?YqxWu>qqSJBp$vsW;46d?#Z||6~^BAk2xa5~8 z6PNYu4!^lpJipEB^dUO+-m%*}n^!SjNHn_M=ljs3H0)Brmj#y#OzhiA#b4-6EbP2} zd>8W~*@uTDkGv8Q-ge=Qs_CD{TqO;wFEFliimmwi=sn;1SE7o)eq>IXVz-R_K#QGO Uwd=BDK*uq7y85}Sb4q9e0I5w^@&Et; diff --git a/web/static/js9_old/images/toolbar/odax_images/mag_plus.png b/web/static/js9_old/images/toolbar/odax_images/mag_plus.png deleted file mode 100644 index d324f4befd735a17644ba9ff6918e0a1c59f44a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP;iE) zi(`mI@7bvbg&Gt%Ty8G=|3B4AWNC+nr}5i^&3yhb5{$MwPz{_SOaU9+$kpHitF$KxBaUo?joskDi{T32Jh3kvYrMcW#WnpvK) zNA(!5(GyU;ppcZJp%M6(pC|;SsQf;F$`}pdzA?!*L#Oa6x&(XF*LMpZq0xDiVUMcm zv|CE>9j!z8J~9+QfPRa#3#IxLmEf1(RDO{aUM>&w?Ct;n002ovPDHLkV1mzxWFi0n diff --git a/web/static/js9_old/images/toolbar/odax_images/minus.png b/web/static/js9_old/images/toolbar/odax_images/minus.png deleted file mode 100644 index ce3fd03ccc6d3cf929451559e1ec62404f92c7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmeAS@N?(olHy`uVBq!ia0vp^VjwKQ1|+AbY^VTIEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq^kHGbExU!q>+tIX_n~ zF(p4KRj(qq0H}k3!KT6r$jnVGNmQuF&B-gas<2f8tFQvHLBje<3ScEA*|tg%z5xo( z`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNbQbtKhft9{~d3m{Bxv^e;QM$gNrKP35 zfswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}fnFS@8`FRQ;a}$&DOG|8(lt3220mPjp znP~`{@`|C}0(wv%B%^PrXP^%^8>rO=Bx>bfl$i>&8Dzelp$%9iiWt-$8-0-FNREN{ z6f6q#svVb&K0Mg$xO@(&M*>6gt*47)hzIZ6seAbt9Yx&E|LS*oD=6Z$c=6>AY)XOE ztgO9$3vWyh&=P&*tD-g4X<-n@H{oRwH+4EYbBv0+c23?~{P}6h=GS-Ub+@buaVnZM zLvKT1;>vcwxrvJp1wG`67Ro-B=JQoYPnq%Y)`rWG4!6V$R(E|^d;a{r0G7Y2 z*<)%MCvR&ga&@8(_uT*h diff --git a/web/static/js9_old/images/toolbar/odax_images/open.png b/web/static/js9_old/images/toolbar/odax_images/open.png deleted file mode 100644 index 6d964d23ad87d6dc6a2994ee5c7d982293035f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP%y*O z#WBR9_wCe;d<_O1to_IS|4%722$Ri_t}K1UE88zFbzn!KNklC}`Spske(N=t`u{Ww z*y|~>DrJf8tWHJ0E7~$@=Ykl@K0XgE+%|t>#Jah6AFIYa62BY!v9#i!|D4!=!Ty(9 bzs!((S}A3e6`_9?XeWcGtDnm{r-UW|ELS!caZtwMFqx3juV)385NW)<2F^Tyd=i4 zc-!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$Ysfq^kHGbExU!q>+tIX_n~ zF(p4KRj(qq0H}k3!KT6r$jnVGNmQuF&B-gas<2f8tFQvHLBje<3ScEA*|tg%z5xo( z`9-M;rg|oN21<5Z3JMA~MJZ`kK`w4k?LeNbQbtKhft9{~d3m{Bxv^e;QM$gNrKP35 zfswwEkuFe$ZgFK^Nn(X=Ua>O75STeGsl~}fnFS@8`FRQ;a}$&DOG|8(lt3220mPjp znP~`{@`|C}0(wv%B%^PrXP^%^8>rO=Bx>bfl$i>&8Dzelp$%9iiWt-$8-0-FNREN{ z6f6q#svVb&K0Mg$xO@(&M=~%laeKNrhIsH^y<(do;wW+Kd`8t2|s`mFt|?ESrRxwP+Uo9mlPjj~>=Joh?tiK%{{{)f*~)_l?b?_8tWb#88M zlGzoJ&Bo`KWNhF1dQ$n1-vv4;C%(@%4ZMth_=>ovmMYtRP)sRxm-a|iw%lMVc-~wnA$O&Yex!}Z zBcX0?rs>g4pT8gRZ?t~&{*`uP)cOO5L>t$uAFVf6-SBt8kN3}xzSiSR2|v1CzWe-j z7PUBzoJwUw-@0?G|E>sG)Pyg1-&pau{1NXz79C!W94WyYHtHKHLLPYUKX8fjvzVRh(EkyZut|BtR@H)S z@qhML#O-;vvf{({N7sL|O6_Lh>+z1+ds-&Gb5U`1)S0&R-8U>;068`=_x_ zc{%eM&Db)HkE@>qFWTmAbM$RPPKZ!&sir@lkJuW$KxZxKlWR9eKdL_!_%Zp-vXE)l z`&S<^{2g_M?Nw4)j)&0fGN4MC>iZUYY5e8hd!qmSxnI2FQ2VSaRzGF^qV_s`j6Ya0 VhkwreLRU}@^K|udS?83{1ORCRgI)jt diff --git a/web/static/js9_old/images/toolbar/odax_images/poly.png b/web/static/js9_old/images/toolbar/odax_images/poly.png deleted file mode 100644 index c9c9f234a4b85b2858262ae45af65684530b0309..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1051 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;nN}^Z}v;AzF<$bJ|{iRSgp7Px^RY4KC2ov3BAI#A^kDZ5D=z#Ud0OPb)vVTr9JB7-O^tiv^z+t-FIdlf;nx17 z=CG9^8^q7EbF?~D?CX+$Dp|WfIL7x&*2ULf-v_6Neo+#58~^*t%b-8}&Y##-8 SUl!m5%7UJ*elF{r5}E*^NRfE} diff --git a/web/static/js9_old/images/toolbar/odax_images/pow.png b/web/static/js9_old/images/toolbar/odax_images/pow.png deleted file mode 100644 index 4664426a5657389576dfaf8f6d5ebeb2a3c91fd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4foCO|{#S9F5M?jcysy3fAP_Wd~ z#WBR9_wCiQd<_ab%nz>p__yAM-^ho@KJUupZwGqyd0QM~3^NYxVlXi7^`56EnsM*} zpJz_?-(No!YV6}B@0{k(PS|f@`6hGk9TS_Z-7M8r#cHhQZ!JqapP}_m@P+4PHJO_h pvmY)zHj)3~)%7dICY@ONhOtLgS(l4pLO;*}44$rjF6*2Ung9s@Mrr^6 diff --git a/web/static/js9_old/images/toolbar/odax_images/pur.png b/web/static/js9_old/images/toolbar/odax_images/pur.png deleted file mode 100644 index f93c2e037583768797755fad053be37171a3de36..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6fBw&JdQ&rUPlPeg?l~Wlw<|IZqeI5RLQ6fBw&JY;0t73Su@0JiQ>0*_~I$ bhmDD0%^MbhlcpUiK$Q%hu6{1-oD!MT1z?8>WVCXCFo0{J*T1-HtWC@Tz(A z^64}Q&ZZB3bDekAzkL_BZsuMUyPtlof7y?|$Tc{6t6ufPbou+7$t!m*cL?3$2y`Zc Mr>mdKI;Vst01B2?@c;k- diff --git a/web/static/js9_old/images/toolbar/odax_images/spectrum.png b/web/static/js9_old/images/toolbar/odax_images/spectrum.png deleted file mode 100644 index bcd74583a31736460fbcb609e1de20c18015a14c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1SGw${mubWHl8kyAr`%FuPE{zFyLW6@Oevp zzWsR*Pw!?m)e8@Dri4trcQ<{)0dBbyr?^+=>hGN;+$NFKp;+g>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;n)E!g*_Ufg}@i@M3hd9j`04rc^p!8)y?e)Q zEtgSVR`$)+&*!%2Ey0y5S3bD9 z7bo`fx81*-&p+2J)||cZ{PW2#qNAfN?CrPD3<(Kw;O783Ef?U-zCVXt)N9x$N7rrRCD4peIkB)V!3MUFhb<#?;6lCMLGPnsN2&)z@||TgKMj-hSfT zxwducZtm`ZF)=#t&3b3NJaK~K*RNjzv9Y>!F-!FJ$Nnh$uz2ITHP(ev($cJLHtPK@ z2erRKelF{r5}E+m C6dv9H diff --git a/web/static/js9_old/images/toolbar/odax_images/stats.png b/web/static/js9_old/images/toolbar/odax_images/stats.png deleted file mode 100644 index 21b79d081e7911a372d1610cac0d3314702c6c8e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1SGw${mubWm7Xq+Ar`%7ryS%vpupiAzWM+E zr|%q$j9WNgO#1rB^+BTJ1ei_@% diff --git a/web/static/js9_old/images/toolbar/odax_images/text.png b/web/static/js9_old/images/toolbar/odax_images/text.png deleted file mode 100644 index 34269cbc856396547713d0e12c0dd503ebada788..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1098 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fEa{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBD8X6a5n0T@z;^_M8K-LV zNi#4oMrMXYltlRYSS9D@>LsS+C#C9DVstT4fPE4;bsH1+JHo@{EISEfi{E8 zw==W>t3(ll+GC>+vK+}V5TAlYfnK%aveAbJn;nJt})+{Y~TSXJ=;4Tzf!#Z+&k4*5C+EL}3wK^?i`AQ6SXI?^`n0!1uN#|O|M4{r zazf|dmMy-RkzhCf@slSkN0S7f1n5n_Eg7<@EoD`RR=~=TKb7L*;xc?pOB}bv=o!lJ z339LqaJ61|{dGpVfkeRCuyPNh2Y$<&YwY;<-|zqYxwvF^tjprSioJ1X(u~8Zs;iy% z-)C=q@bDocFs-b(nx#;;H_o0XXKU2QA3r#jU+xTA+2WznRA6!D-lRneT%t#3Y0ULg zmh0c_w=m#=zQR78W9jMX9!rB}_$`;&9iii9#N+c&&?QkYefQnI-@mJEY;6ywZEl>S zJc*Ip^_SzxlpvY!M#<%hH+RJ7T@X;|-k2bl{C9uDN~QWm^Ht3_l-fCcW?jDD_+NCx z73WhjUgj$|I+hqA4hOAgn|=0<|B@;d_X95O)vnu)*~_o+&p9!_OZT(9SlKsbpSFk3 TjXyiafpV;;tDnm{r-UW|Dfp@v diff --git a/web/static/js9_old/images/toolbar/odax_images/wht.png b/web/static/js9_old/images/toolbar/odax_images/wht.png deleted file mode 100644 index d7119bf5f17cf83f321c2b4a4c08d728a15d688e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|NlzEY5RLQ6fB0E>LYRE67-d{J5Xj6vxskzK Wl7q){P17ErA_h-aKbLh*2~7aA`z0U% diff --git a/web/static/js9_old/images/toolbar/odax_images/yel.png b/web/static/js9_old/images/toolbar/odax_images/yel.png deleted file mode 100644 index 31983b4f3316674cfb15bfbe40a83434bde97261..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^AU2l(8<4!aNcbO+VoUONcli$noDtve07WQ&rUPlPeg?l~Wlw<|c~2L|5RLQ6e}LNS+1md9mt4UzV@2wP6^)D8 c_|%vgKmTOo`z^L10;rV1)78&qol`;+0Ba;HzW@LL diff --git a/web/static/js9_old/images/toolbar/svg b/web/static/js9_old/images/toolbar/svg deleted file mode 120000 index 4c4e1fb..0000000 --- a/web/static/js9_old/images/toolbar/svg +++ /dev/null @@ -1 +0,0 @@ -../voyager \ No newline at end of file diff --git a/web/static/js9_old/images/toolbar/threedots.png b/web/static/js9_old/images/toolbar/threedots.png deleted file mode 100644 index c7ac221b0d76a48dcf1f73e1b3a3bb60dfdba01d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fjKx9jP7LeL$-D$|I14-?iy0XB zj({-ZRBb+Kpn}NEkcg59UmvUF{9L`nl>DSry^7odplSvNn+hu+GdHy)QK2F?C$HG5 z!d3~a!V1U+3F|8Y3;nDA{o-C@9zzrKDK}xwt{K19`Se z86_nJR{Hwo<>h+i#(Mch>H3D2mX`VkM*2oZx=P7{9O-#x!EwNQn0$BtH5O0c3d|4@L;p!@;Rg)2@GUMPZ!4!3&FJ^ zX9JxKC0u3-?quXWaZ&EefwN2t7`+w<>Kx3napLx3ei69$gx*Ob=@ZqJHaBLT{XX0G z-t?K*UtW29>{RWKB@axWN=4qcINVpNQhTs^iuSF%Hx(^^nf@zp-*86o73ajY+nSqwmjpeL)I&#FE6)PI8Wea)GWc*B2Rdq7v7hC!xo~u?7X>%g`3{= zFD5e!{ZyuVw|F=5ExS;>#3fWabIz5m6P?yCkn8{F`lzb#UdW|bUHPHD09w!0@0(;)nT`45|E`i|$0 z?c08FUX@jSC~orcn!Q5(+%GeguLvte7xO1S-MjnXDfwFdJ>CD*bFzQ%EDwluy(GTJ meW%+s^Lxqcniak~o9{AaYw8;bCOrHEN|&ClelF{r5}E*uDjM?u diff --git a/web/static/js9_old/images/voyager.icns b/web/static/js9_old/images/voyager.icns deleted file mode 100644 index 6c7e50c8c4e7f493c641a356c1d41b1a3d32181d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1410285 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

    $bP*SpyeXNxwkRPZG|fMS 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

    Mik{5;{=NGgf6Wx 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 H!?QT~n#!C*6T12It0bDa2l_+5vaWm} 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�me!%J}^qaeMjhb&R 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

    E=Ay5WkfKT@65Hzdxs? zPye!F2>Hg1ftqkW#+o%Sh=|y2kkM%L=MXIq43lXvE>!~yo+R;Idz^z};De!d#Nj3nSS4>Zq|~q7 zTh1(d_An@wuh6V#rcn={7YTb|_4kj4*O>!jQz5QCYgzdK6!t|q=%pw%J$VIelDdi@ zSk^9M9ytL{X6r}!znC;3(qgu=pe21-26ObZ>7gvrE$Y6}h&bgi2dx3hI>l$dU*i4O zY!ke0&H_SwlnS7(I)NfwBW_tTE1^7Wc`xpL!i%rr1@PVmfM2}1%ho9tUKG%P3JI79 z%ZPzDG9Fi%$Ok$F2FlY8E|AylTOPCcA@pIFo|vK9?kDwNiA-||yvb?71p~|8gTozA z&_@+c{1#W&Y#?yKibHTO4SrU)h9U)qE4BI41K}ukkV!!dan}PDfJ(e*g$()3x2TUS>b7f~Br^t{+NB;QY$DEe`K;a|Ju{GJce9{6&*+%C8OyxZUX*}uO2 z{U835H$`BM+C77%n+%-`=9lhx$VUxaXa-JqB61fan+OC#SPw#YfT9A?jDreK{l{`0mK=-ER2`+H)6U;A1OfL#E;)SlOo9U%7W(B?~yab!^@6oSOPc409N zGIbBzz#ts{5x7^2u$GswCC@hcEkhVQS4cx&)TA5ytIKZd%sRPy9YhmBo71Y z5!M=X|4SVmky9TVl&aLTWTgTBKOp^Hq?5yef`Wl)_T#((K93+ogKLP@MmVe<0)S9c z>eG`s1XcxbpbgQ#QZ)xWZH7UyV**Bd`*2s^-7tLJ2B39U>lX?Q4QAQtM)~8D;1OYc zc&8V4Akrm=JZA?u}~>AN&aNQ;NH0bDC#*3vt%9c z`RDbpZ})Y$<~|?I$A15WdDaMRNUds)Nv~*n@+=HjN1`E-Y)%!=GxfqtSi^WYYxd7;`y43@lnL(Tba5>SayxAI)-}|C|?qUsm zxm|AmdAGm%6I<}lKl;aCY(@3;_E~-ZgWIC|e8S;+uM9!qOy&!$o>wtOq&v;iAiW!O8%O;9JI7vdAN_Pzk< z`!TtYAJq&jXA;9?b0H>i&Ravkt$=v}DQ$&6-+Q$s!z)StI-kVK7B(pT9Jn^$;EH{s z_y;F@6gU9s=l+GB4?F=bWWdYqa{EueZREcae(96XNwVwy9diD=)80Nx2?Yyxve|*2 zwg!R4oQI9~`@?}}FUe-fvw8B$4~%<2kKMe4`+6JbWRZX(hqqCXc00HzZ)3!JQt_`a z$hor-(O%KKCL7Uam&2rF++1Za9(`dm(mlv=CX?WpMZ}9_CM!u$COnlBI=|L_rybFP zQNMSzJ#mfB6Y}6zE!jf@0F$?2ZvtZ#=OKE6)&ixSWy*G^qhFU?VJ%Wk>ci_zdHG=C zyPXwrY|jruN~*X8Q||IcGx^DjOAa}*l-#3yM>bZQzqOoel|9tB*|(cKsT>*OKi!|M zzMBK^-rH9s0lvJwmFWV=59J{&%Vd|ngCu{;WYPqf@(Xt_2<1^)aZ-^_+UrDD5)k#m zK@pF*K#>+m_V|9FvtK=(O(Pc^uBYH-#n;;z@YwFI`he&8zMTa{P<<66o}T=ia1IP= zLtzIIoT{j-VofC%&QA{SlS$(uy}^q>$$vW|iZ(3aWImqNw1c93vF8U-iR8Y#vD!!P zFO#_Pk%m3(TC(Qpn3kCX~uhsypD}d-7ih>p7Rs#n;dO;6zn_;&ku$nIx z(12*|CMr8M|J)(TK5@Wq<}~plj7OjXPu05s0mwH}0Z@8@;;KAq<^aH#Y4jx z+fN{d_I!2e%9EAx&kLw- z9tKp(4$c?oo&iA;+SpSAVQ4fc7oeRL;Tjgk?QQw^Z*OaWizmS4cDa4yx4-+pY~;Ux z^pQ7PlitqFFT@M=kD7nLyqy9d;k3Kf=qm%s!DX-Q#a4`DnGy=Lfizy23>eptR;?krGQ&gX84>V%zwQd)H~-BS z_=J<6sQiXU?w3NAeiFNn)LHU*HLBIVgmAUGzGPVhodK^N^J$~_A~~u8`-TLiUWtJ^ zxH`5s4HpNW!|{>4spnflLFiOd=w7>z?AG*{ay)zp!q6Il`JR(MkOEBPL*A=fyqVv${jtB4&ilTwhh=4`9@A5$zQjn{Fi|8IdRw-rVo5upa*)?fmR`3uW zW^m9?FzbJ{3O0Wd#6EsjcVUhBwafBav~$_m_T(KbVdWaEx9;0N3(6-)U?;ahr%GfZ4a<;!*48z@vfW7+Ft8{QuWO_>D6Z z;LrWkg$r=GU2fm#?Qh!r=L>H&GvUWiFjDN zYozhb-iB&A$n@9;)(ZFnz~8^t?q2vv#JOPoyR&VHB2!r)T{Qh+>=al`i4zF`wLnV0 zE;|}{R5Rk8C4Fm#Xsv&tqbp_K)n-B+4KQ1uQ+c))o7Sm@>y!8ORIr`p2pFp8&VTg> z(0YN+xh1TjN705rat5qM@~hAa+q2eH>z`LMpR!uWMiVmAX7m%c37`20uJ>gnABON= z2H^Wz0dP+-Bzra|?^%LOe1a~d%1GZ#AN_bR%bw8pNy}&a^#0nWJ$LQjXORX^56=Bb z+TG)o!<0@fx!x3ZNwJbK;z%EG_vigQo`(WG&eu5V^BI@=+ z008+1_+aC4c0CstM2*&9Osx+rH+s*b`~gVv%L7va`;KWu;fE#mwJQ9W5*-1@VJ9gZ zc`H>Gyv5*DlKhSei97GpSk_q-2VL*C}jJ&U;PgueCdUr+eHm+sBEyl9!;frnN+K4W8%DCbt#8eRCflRv4jv8mW`!a-wEY#mH1dC2IBnupaS&I$u4 zvM{NG*Pw}2AtlvGf@|=-S^Sh5I>tAy21h*vNC*QF>bh0G!MjsMAXkU=B_kw#q6!Ln z!{L~Wj07{Yxf;o|p%1YW52dDHD6(UUU5&Z67CCQl<1!nX3O**8nKfNi9Gx`kgB{#JKXsxB__b;_D&++f;~M2B4GOsE&!No1O=7P|+^d z^24mBz0uJ6gRM{7N51fTbuh~fqb1`h^S|7WqtKsbrLl974e-p~hS zM(6ed0_q`;K#WYt6Blam+xOz48nrwhj<4C=$LV}brg}x^!njD=uS)OxY!}_wD%{X6 zTy(m)I5H!NBguV)j0WWsNbgx!LLHp^Rwf3%hrS3R08*;A--3B+htZ3QHP-{~;zHN$ z?+w3?zLo~51Kfx@{6Y7D&5Zdvt4^Q9Kx_C>*wNz*ehl8PQvvb)<0JD6j#~}@U-?Bj z0K6Z3&+Gc{ar;jT#A54C^=@mM7j39v&ScJ`d$!TVy3===Vi2Pz%tHFnK?G$){Est1`FMWYCz zSb7;$FN&LlWTIZLbM3heL8f{&^p%SPgoAr90&D)Nz2W@`$t@5!&; zq7*Q}HISk9_Jl?S#KjO4L?7D)H|(FaN4*aDz7=bR@&vgBVpRaxJzR6Q!{^0)$vzC_ zx^=#L?rIV{#6^$^AfnR?Qrj8q(?->$J*NfQ|JKct^oKWZkcTeeeN;Cz5%3TIDRF6? z_QRqJhiH(UpJ4QGFMTPlhlT5eARYXz-xOT0bKN2vt0rkYwNyQY8(Obs%$K@0huZ0v zjo8;^dkV6!M}Xybos4HM5bgF4+r_Ydy21O^1jONq*92vA0wl*E>1ScK2$CWCB?SEd zfq+XOkc<<8f7;)t8}0a^bbuEDo(~WVWCGx&M1w+ZW_yf({K@Si`-_)=pv&!YdtWz1 z{{FbN|FHdi`QoLl*sGyJxUZHw*|H;&y}lWyhu>?>z?)%ihY`3{AkgivzPp`2*E(az zM^t#h-ghM)p?Ho5&Ys$R3x2GKcn1$_kWN3}KX-wzF6xy;ZKeS3jtUAIv|_+H4J8&N zfn1$t@xw6f6J4mvD+jlX0dL%K&ul)F6Jr=ZDlS*afLq1@CVU_krP?8{=)5J$fqxmJ z<=RzJ$wi2PBzG#AKjW~o_P_Eu(B?i09Zy3# z^Wyg*A0-u32%d?ChHr}-2Jq3iR^ac{R~0q9tJ)hi(aK{(fO|3TUI44gEQEIVwXvmJa>9zq~ZSJZ8CpoUz=tzP_M6^S#siSBTo&j8KIIg%_hX=@CnFAf+9j(N$3QR4Cxd+BqT$@0{|Am zo%qJZ^P*7~7&QzO0Q=w~8y+z$ARwFqlYhIAhusH+8tf1!Ij|FqBSy@2VVB2Yw-X`& zt^h82kxV91%^4fa?rTvJ6E9+QPFz^m(b?2NMi5bO5cc)EFzERZ z?6Fjk&($`>{JpzLQE-aj!7GQ|mK%Vd&GtK>Z$Xj&02>;64Se+1^*rDSaFGOFZkOBp zXaKDJ|H2#h;S<071$~D3p@yaHllHmN-=V|jL60JXL5Tc-FSXBQ8?Nr(4D<8{?c8`7 z7XCT4GxcdZv%WJ7`|sq$orc%65`YXk4S)~65NlgnF)(L ziglFZ;A&^wP1zjo!~b8Dghuzlq);F_0lM}ng-=L9>h`Hs2sim|Ra2Ri{+jVQ^+yH8 z%YJz5yL7)s*(5(TDV>}r9sw8lw3wHmAwb{< z45Q+RTho$kfcw)nXXkeyELDT7IN1FfeEj@)YW;zdMcwEng=)-_StagDe zAhrO)%G>S*#dV(B*MKPODw~tMY<~Nxc;a8lg5KYo6j*I{opzSt_4nFp0y6oBt*ayF z^0+kvR`jS3>WxU)Sfk1Of^PIt&D$&{7gp0r(_xbv^07Ksp}OgqOh}BIcR{F|kC8G#&y3YghV z7#|#jxa%4@udhYu>T8?eNfCe>5C9+nm)qrbxqUVG|G!)R{(pb;_eJCZ;@LWV__5S3^C9`}$PX?W zgvbKeleq+;m(va104x4G-G!x{t$F@(INkjrwe&Egfjes09km9);4&!27BG9p-?Pcy z?E{~|;KvG-_c@UujfMcKv86RA3*h=7c%ICBG#2eSf?QpQQWS^mh}$&)b%48IQ8YWP zi1&LL0-^R4k-qVmGNpsndXMidR&R|AO<}FU`nJpQKnN_sSp}Y|2f54^<{f|sl~>7K zan5=1nt;U}4u|Xd!v)sveJt!~S{5C=smJqC!(XWs!{IunqQSbe`AfD9a$X~XhiH$2 z)$vcwMsZ5v`Q(3=`n!<#^P_qzgkb+?G6?_{V#=vyg&WOmZ0|BgF(yuhhb z)-!_+Rb=T-(=L{z3A)qXxff!Wce0s+trIapSG>7jZg0jdU1b!o^Mn$^gn%EelCVZt z1irKvZY*|E!u_@91B4*%QrPVuiGzU73(ke@v8MSQ`!BZ+bgB#hB7y-e|J2>7cI`J& z2OSaZTLilxO^OB-+!ZNHmoGNgN0rh)8DLeDP6}5iRHWdYI%%EK!*fzOBWUc-3T532 zJ#MFaheCB#h?)PmYpw`x!kWMb10n9~yLr^!=v^=D-qZ8LaATEAJPY$NFQ9jz$qfQI zEWK$Nw&yuGwwNTvvj!#D4Y11#<4H{duJd2`jqN)7u?rXAa=YBV;tjIDzW@K{pZs$8 z;@g9We@OAe2b1=-gQC?3=hkD`L1s%UfK1`*dSa5eHQ>zc49x9}UGCp(jlc~X1|S2| z{g;?APal(=oc2Z_0}dXEWl*wf&MvxD1>U41oV#o`T9HQ0;2B!2{SR_+MS3eC`f@Uv zTx7PTwm~n>QeIJWZ@c0s=U4oWCCWXIXD}!Gk!SaqWE@BHILZPMDz|jqLa)@GR;oPw zdEPC~uIUM^Lx;vC#q&Ns^mVIOz2sa3O+x&gFa*O$sOKg6_a(6pM=GO*Gw*B8IvlG5 zkocHYyZ_)czhc#bB9qNAsMYDMXR<*5Z#VjhYZFlIp4ib|8wI;rd0!2H4sz{0$X5h& zvt2ZTnW~)jhCLeu?Ve}ZFAfr_)4$me2u&FfBE$=%k`ur?O?)D|UlKi^ zaom)1QhQ;LCOEe@>oibeLfz+bWRpQg|L!C+pM7ji->n-jHz|OT2FVeJ{Zn4huzsvb zopDCul?Cz8tM)KO?Dp|N8kvW^Q?SG-vnvL%4o8ELr0$fa}^Yxl~jH5$-fF2kv({1qAM!Wc#?AK+egHZ)e=RIp6n{%+EPttlD z%ojid(v<=o1xPz51n&G8$?k+9YzhT84#gCZ==g^)p5;_mi!0jKe(h5s+}?W)@H3YN z;Bvd%zVh^cM*jPicNo8k;fMCORl^Z1+Ibx3JMX6{kdrfCo95x3Dut9YNNU^d z*O*8C@OY)}22}z@K8r|E7!&L*MCl~8VhMupgV4$q8w5&NsJ)+*M-4CL1^*v>S23LS7k#l&?Y0s%;9Fb#Al_Lnw% zgwUNH@)R7m8@<=(wrSa#h1jQYGwi!Oup9lb5Z{N@>z^I%1Hl<4_K|jRVsbHI{9xx# zUbptxs4mu4-RM5&ZTk0?M^1!iK}GRwrO+=tk^-+q0PN4xYSJ|k@fUtmKL$U5izmS4 zcDa4^2H@s)4j=j0f8>X}67IvfX+9Q+fWs5-zbiw3X#HYITh1@Zk&*}hiSQk@_sD61 za)5zBa2YFf3uMx36)8zXw}EnK61ayCgfTuPTseXOP7nLZ3*M3IR(P+_=REl=iP2#+ zGs)UK&!Rm1Df=6w>lX>`fm{G(0my+517a=@X1WjNmd$K1`gtR1^CE--uMX=GvSJ1i zsp%7tRizFcF3PMeaHFW2H_ff}8`!9N`#R($Zn zdRGjcq9MT|fQm2^{HkBC7|rbOhICPWHXDt zImgjC)5{u=z@NjOetJ9PJ>K9Ot_JdO*S_mS5(~VoOKTXkh8V)Qd#2dSV7Q%?^(q|3 z*V+YfrS24OH?)?>tObdW9bYErA?+X=M9k&A{Fl+?P7}$1^sT0HAtAS-H3UhPmVjwS zNfIGr%r{`&3a9U(h`IO;28u9wfA0w$&FdIVG#%`@@3`OI2QjQ?*rxw5Y~KIX1is+= zz-O=?9YACc0`BOmcl{>#m2Np4Hlv}qxRA%Q$MAZB@BZkE#fVz5#y_5SpxJ~%k%)t% zu9ZS)5yZ!Sd%M;yD8S`*xxM@L13&cL?a!a)-#_y4FPi_8JUbs{YSRhI`9{-pnLL4B zQK=MZdV_GZXEI@nO3cHV9PA2+qRYVq>t4o=YF(hfH4Ie`Y!bK^T<)dP8bqoahi_}= z!3PW#im6|#O-O3?sus}hY7U^oJ9_oKzeuJLC~Uj6rntc{an*v|A63qyjKE# zN60m^sZX`EN=8PN$O#TUs2Gyp$54BEU!j+RQ2#+K1j&9`CO(WeE}N!rmHfq($k#<{~>q z5Jmt|VGmwbpIW)j#C#+~#n|0;(TG!^HwJGay{Yjg77H=V zLS1=Lo&d(v_jX{ez@Uq~uNx@KJ2D%9ovt|vog~5wrpOHnOY~}8UM7!WCh0E@g0UcD z;Z%HRZ|tF6G*vYH=$vUb1Ip;M*L8F_Mv|8Qtcdq%x^~;&vm)Im>~h8l=zIDe+sh)o z*U#1Yj6<;Wm{9sH@&35;@6o@LyY$Hkf%XIl{(Gq#3Q-;Nn+^4MHc9L#z?IhxU3p-n zpv)Vx5N!+u6ytaQFoe&3Uib0Cf9oO#yxcCg^V|RYvs>`bKlr)d6RB@7$!##h+-Iyj zUp4fw(asakNEHf1qu*jkrR z_g4l$dzc)}7Of|0_=l*l9PBbO()x;GA1jUT zRh0D%3NdNgIr95%2$e%qYVRc)IxuB<5q`XDT_(tW^qx)&t%7OYh|Udmb=i|REH2S; zU445iitWCxuZapkSGsr&u#{Jf7zXJN+=PTzX~u`*mKQv_LP%H=VuGXmqIbt9t>9mY zeVS$xSC$CbV)n&uqs+lBQak1Bs(D(dxpk8Y3xwd9Y{~7qj84*4PX4^s2RZSr9{)Ql zRm>fr%U|~lSk3|=(iy2QnTWUFru2Rh;H8Am|GGOG{jztF3l&lVeD*Hw^gRP6mAa&wTLW32?bxZoWN!avgsBCv+75>rcH1Z+vl* zeL9Ns{L&D8c0#MzwgpnZB#4e2fQa+;rO3{sh}%F4cp#AYCQ}hG?NMaPB9DFs>d>Mz z(m@a^fsC^g`+uD0Q!A86gN6B9JBMND6G8HB=X~`60{wsLWhe@EL?eQ!da1WETLauq z&XgJZgd%5o!tku$X@8Ghd{8b+#h#Njsc>57@Wx=eS?3FzlB%Y_*1ST3llJ>j7R06R z;A>yUS0fB+E^@Z5Dj543<4p>*b!#4n5zy_eCi1S`BqUEK zry{ckUN9nEU{5kL5B7>=j`8XVGpS=wH;VV%w`W|Ws2;6)fzb~lN`gVezI_c|ve8wF zZ&bUC0V^S$3S%c;#H+_-p$_SBdwf?kO8+-cfA-H@or|DTdOPWf36^XQHgyQ^WHgaM(`_P5wSf9xG% zWb?odvNa5OshqZx+5G(c?p_(`RLvao&hb>AD%@^SQ-^d8jksiyu&i#QdxW(#%`W{hV zjc2(s?hHCXuz$V2Ull-xoFZwLpQk%^E9%^Ke1q_2lGuj7V?9tzv&il1fZ4B}a5O*Hi+~wQ2!N_Q2%9I=yJW%e`VHagpu|8MHaRl9Yx>&#t|3qRyjJOowZ(6Qa?G zp;fyD2mwPKCSFvGoQz`oqwo{<0fdughir(~Ks7*B7tB4_Y>lSEt5}5H&{Hy3odZDk zMf*@V9-2jev4oHBnEe7$w+224itj`~a)FLY?&}gmevS?*$fX)_NWFb*_wWDG8u;XY zw@ijgP9p@dKla{8gCBEEo^rBbx^u&F=ig=0iUGglm)_o*0Pp~=E}j6F+vOI1(&WEa zZ3z3suYFGE7~poW_p2m3oVZD>)8F$VA~r2^gIMx3=i!-+qw>nWE2 z`*OeTFPUw?)Y;0l!4UU$&r3ucswbmT#meX7R9T*)MsQ7?`vKP%_c|Qbv$yM3;AQ`71EC^w zplHJ%HY5Ehtu6*3^q)S*_Pd*NGz1Xq8SY=>`&R+*#akA2m%GR8+H!ssL|e?<+XG4| z)5$r>Ps~26n&!chpC_48>;`v&*Nl$CMFu-Zbao`8WEuUGDaq@3UeuYvGI+P65FUX* zLLl1D?~0@%Z2||Zv9to8Q(3c@nL&WdE{P};IlW(N|AZGii*Sg25xkxYU9qsrcp8So zQ&}5>gtvc2BcBrG%^aq}t`-+nB2i|ct6(*ip9DI*aeI&>s|k5fDnw7;0|_+M7Qdau z*WbB17|QQyerDj~O&opQrL^fiQzrl}XHvr3t(Zse-MM00wx3n5f&LB)Z+qxzOQni(p6b5rOromeN1ri|A^$I;+?m6jzr!@|HL-23_oM5VZ6b@(|C~8JKbwP4lQ7@^q2AVKr>eb3S<`Y{oPu_w0Ck@;KV} z4r$8{AfLgsJ~8*Vbi-=7L$Q6(D(Z{+?#>E`8#!Q2AM6}~;P3xxJAgml000{2-u8wv z3>4M0YaQeca)#%+GZa_AF9=MCvgegCMAROKMOGaRHI41!Dpm-Px&MGpXIQICtuL)3 z&Ai~3+jpE?r^Fk$ED>q}F>rdxi=MAH^pyo_ffsB9!aRu+FlQ_zA7iMMrs25s$TqI7mxPVBuH=OmQWI z5Lsfk9F%F`V%oj?S+#r0Sgx6{uMym*tiKzBR>W-m&?43~u5(TY9;Mb=!6@ht5=}gIhPW2c5 zRR}ls1o-gZ`{_#sxZJ*_Z$JIBKe7J(AN<_sc(&5;r=4T9TlJFu)Xw8akHiC*^r5Ap zSy=2aH^~mTTHjtAvc|N&B$P7fOp|r64w!2F8Bhll;-L*ib~0@`)iSUHCkwpK z6#!v}l)P7oPNcD+0pO&fE|CNVR)Ud468ZxGHmbY!3qFVtmn0R$ZYhz>k_F2j_JVx~ zzZ8W~q}B6^CwAK^FWZZ+%STcoS#6^eOxI<36m4se3fg z5+$ePKo0)`cE*B{(j$BHr!^?6KV0aXkCe~$ILnp{Sb7|T*9W!p4(b*bM1H|Jr=aH! zESq|uL-h<-^w-H9Sj;i-=gAJE&Umm9(0C>r>@vW4YeZJ^-+cD_?Y4`wI+p@ zcB{KM?T4^t2as%+%j)$nQskmY_C9CTxH9fTSA|K87bMD4aL~$%sA+ZuqVLw5wM zVMP$4_xUCC$=ot~Mgs@C;V#?S!KA`1iy+u4IIMXB@yrk?)N?D~cMtmUYuEm-f&c&- zp{axlTuzHSpGmG!c!A;3kD^bAIPpC~(J%82Q}r-5E-+=lUcNO2oVM})j)epX8P*Sc zp#k+%GY*~o@KmdXR$S|8(K>%8$!nHK3u=!07k|c7M-R}3{uKmgrFJxo}EbZ$HDDP;j2azPvokR0a z>&q)U3o^ZL3G-6c9Xi5;)OAKd?suB7EyadEm9lL*>A?}O z%jAg2JJ2Kz=06CTB`RQ@K8%2fR9L3h8wr+r5cION_&D4qte|5(^X4DyX^>eH*f>-l zaxtxY(}m5%jzhB!VikSu`KxVtwg1m0+q%BG_|`Se4)nrtR48-M7M=7d2~xdv|xOuNXzUF2@S@fy?}?uAzU58*ot&Iv=7AbS~j~? za1Gh8koe&-;aEjm;3p)vAT|?U$I_ip3seQWN9}J<_1O6A9IoVb3&tERfnT+MJBHF8 zZvoR09WofSWgm9qQ#k>~X!xvs03IFqp`33P`VGidHwoI$Vu^}kFJ49NK|FgG)U!!E zb~0U*e!n|VQf2AAdp%>Cl3Nn2CK%76g3aJxtoP?$zNc#%f+rW@#*TnaA?*GF!I8%G zv|2pyY@uRc+%CEmgBs=j7wkzulOwMWxCK_QGAexJr z%>QMJx(AvPCE1JKq7(MFWiZeXG5m{d-t})QOlwkN^3I;k8Tbu-PtV{XMaOrtR-fd_ zOGrjH!sZ&-kp(p&#Ztf?IULUbe{soDcn{M*tUbeu3UtfjdZs4$`V9cx@)quimdqe~ zyE&aWzCjWf=$$-@7)UlK2zq<@G;>1El%S-Z6TOQ}{bN@&T!*ro2^Z1qp8btfD?JV&g}}5uX!+;%cys=8C^yd~mly}ZQ1rQ-WH5x62v4+4_mr2k@5y_xXfwM` zyrBu-hktLKbq1SudJvffDuH>|J{r&3B%5p!bmYa4HA1w`0uWoYdH_1wGO44)ebCGZ zujT}@Or(T{2p2ZsWW^6^p5IpJ4G4*lN@q>6nABsbn_qo%KsdC3x^6jkg|M@D48 zSRxc1YdT~>ZDK8b8P7>DQx)2PB+dR}_8%`gA2 z5eQ7`jGwPIOcE(^; zz2s5#@_3U6|T&i{k0OKj8m?n!%}T9+O5T14wrRIRY@gpz%+XRIox304R%6zE@NL474IXYK_2s`E8qsUy#%YSzo$Rt~D>9 z>>^)!uzg+SB4}y~eW8o1-~xn;d$sD#4s@%K+Jt4GLVyMp*sZtM50=4zji%v&6K{9@ z3tgVu+4)Bm^)9gsJ&CXV0IUkoM-{{Mq(Jzo(pbojf^pmmeBb+{ugQ5M9d>0w^+eyz zfU*gQ_`dEwnN3XO=hoAIDQ-UOWl$YR)QNy3z#i3fl%53;)Thla&oT~rF2=I)0C4+@ zmxRE}?OW{jlV`y{zwoP%!tUz(!tVM*;qds+g{vojIqZOF*6Vhry{5E2tQ@(w-|G)1 z>Om}Bn&jk@b-2m79|sj4l7zI!Bb1zHt_n(ir~UJDn*Tt8je|p+tl;##16Ktcyb!F0 zv(?@(I0WPw2eRQw16>qR4L?7&=eCrW@?yb|#Dbc+-Wb{$zI*f?JoAGk=9>1iR1Byy zIXh>@QNH7mTKL*s#Zq58c4&PzL*9jUWCr{iKdhbXqUL}x!jl__fve(BRNKJvCn5sX z*Qf&-Xa_-Iye6Ka&=?Sz$UT2hhc+7)t29!wXMoI&*__obO{7PGd{y?KU3whS;WY;N zz!oy?9=A7plvgt^w7E6158@gia(F?6u$iCCMHm&zfy#zLpDJ0jebcjtPr=DXI6YpW z@A15ok7nw3>t90uqFIEVOvx47WEg+)j=sb8=Q|;NHo0$4{c(ym7cAIaD{7yAcEF?4 z0=p`}%_hl%Zb&-$k8#3RF7QS#n0Evs;DcdhvUT);BxyGYyiIar78U8Z~bAImp9ui(Fz96PBh-v-`6}NOI}hyWi-X^CeaT^nj;Tdjf9~jW zkM+E!x+>b*Q%(Gx)BSczwxeY5jt2nNyWFD#4K2znSU^zBKJVuT`uy*?8rW-vo35y+ z!t|{z@!$!%C|8DF<}Q|ti#bzkN7?7XTPA8XK|9`d0Pc3X4Hr*?y$q@d=2gf;XWS=G z>$Rf;JiyGrkI9p{21NYZIPTYYU}iQ{GxhQNEjs*Shxx0_^pZIfC3_NF3%#0@QsqQg z*L1+J$^gTAoB*RdhF2HB5YF5H{l8}|(fdFExX($pfUUCJnbLHC<(Z)~2k^Yo8>)g#7UMtVV9IgF<8LL-@_$mAyw$(ZF~&8W&*j$1`Lq%hh~ z*Vy-v1<}A80iAf-tD<$+Kdd-7T~C&9ped;GpJwxoS78gNu<}onz$$ql^aNOXd+7$%z>dN`9 z=*h5NsCsUx%LV=XNVDjxilpAKU&5 z-CclJKCA^de}YtQ2X=!;qdtTR4}vL>(IFaj%IN~fz6Jats)c2 z&_)daY-@Rb+q8^GYy0{x4O9>W=dpB18A>h63+qPYBUF97rgDmQ#Wp#?&&Qr|ABSxz z%~ZTwp0mt~>Gr;S4p%&z$K$urK#oCjJERVpuN5P?1J%%HS2qo5FzVpCMSXqtK^Vn> zs9jp9rhzVhK`=g_+pszO;qQ1JGFs~Kz@v(L?IpBW1yPA)Ffo>Ae3w`GzmS`gU$!$( z;$1+!cmH)oG}w^1Tt}02U} zH#_#R{i4&t4lpv(QC`rwyi_hU?J6HcnBZ%%m+THOeYoQOhmaH+i0Ovm^dS0SZxj!s ze3C&p!5*nzu_@q(VxE-Hl;OGjDvSvA0bBpNT_gubU(Sh86HGJ8B;9IGVDaCzzne%g zD}|837TDFdKg;~Ku=Vycves?S_w<}LoXg!i?AYLmz@#ST2Rww+!>!(s5ynK_DpDUV z_&z7tP);YmIgrQXjRC(YNyOlP*dY7hNu09ZxvoAGJv$&OP>U1vVBI|%3h(ke8JBQ; z(AtY?p=(R}y0?HQdQRg;7!X6exUnD?W-+sWJ~NcSl)v-mYqo-*OJN^2N5FLOp1*S( zW-A#c^@p*W9|iSUpZvEW+}ac1k`Q>geXHEM?>}xI`*fRxKlEocP#unj(f1_9aV5%g z_!Q>*SM4Kp*Z%E0!~V$+gz@orwa@wMn#!rYkIDfc^W6FL*?~3tt2IL)@b8IGJ3i=j zn!{;6X^p@g{yj-}3RFvq@@2q~_4Kw`XCY&utD6jN*x5$@$kjx(Opa6U8oU!-SFRk* z`&f+txL3myJI9VvD}ZfZ$|i-P91;WNz%)NK8i{**rs&}?%sPMukR;90rxbD=yTy6b zw)c-F`>8RACf-*&6lg_I&k28S1j^ZC2YVcZHIecCAOL(|LpF|8WN-w?7ucT+$&>Fv zCqbpZ5I5>t_MXx-mX8?1X*WRoJ%=X<&>pAhUXCq&ybzP;;nb!jqY^*4pE7h~AEBXg~}vEN+WP-#{gpX)tUm0+uNg>%h;arG0ebUi2_VKcraj&kE{^$M#$f z>Riz(HIt_V-y&X&UT(8ph7kMk~aWcF5 zQHrVBi{M6Hi|stFOa+`({Gtw`?t%(vkm!YNN^900ymm#x{X1c4&CHT-!aTjhW&uMM z-DIOsXiV_Qup&_f1kWKmrX5DR!{adQk1V9YYmU@6=2^13fewj_pHnshQ8?V;{8s9p zV&mz3Smn7;7+J66w$!8QtsbCOJ1U6~%};mgW4v+nuxGNN2GPNYOJ(5F`P#e#rLq#p z;u^#)@~2Y_UxIsEY!WshB*B%2kQ9C zsnXD*vyG1eAC_5P8{*S2wt_yN-lE(vz}V+X9WE@3)9@Yb zx!r~tNi|qTvuWAW9V@|m;9-{30}6+7?X1^*$Xj|OV9g32Pu z*6)O=ypS))&6Qo^7Q)mS%BJZhRRPs8qa-3TPh4L2FkZtM$x*Cz=g{TXMPA*6mysBT zf}Mrhj?67b`GbrZWbHw`Aq;;wo0E}Y68j`QVj;rx0(m$-^KD|^wXPq&|B*pNcRIV{ zJ;~QB?nUIlTtNh%r6j=WHz{zAMn(zGccNsQMs!IezcsFu=t5;tl}lo>aZlfdJH-!c z5$;Ko5N;YA4P0SF$`ZA{=o7SPhXWl8qe)rSuzb$>Ojb9j*t2=Udb%jT0dmF=t)|1f zkQHMPl_kTqg?VR^>cvfJ&97-K(aB()0Jxk-w4M*`?{NV9O2dBrItajT^?&$p{@Wko z3k*UXJoZ;dqGAd<9g&J5m_c3N=;#JEQ_6Pc8US4+^!}LQv0Kk~hQ9AvQAox>{3DtJ z6kC|?FsgD#h@YweV9e*1yL#1Kk-9@E*A|bqJ+_@W1mpKPv%u%A88ONEF8@9p;+^jvr3aS>wQ4IHu< z0*CXI@HpzmiH!kCiS4{!=I07=1L|CNJio``F>UB$=!cUD>2x*BJZPx!GQ2o~P&n-9 zBZJ>F&krI5206l#99cvjUu|{49q=Ah_PNRDv#o`B-}0cL8Ubf~K9L|P9~QX>))g5S z>X0mt*C3~mA#fE6O_m11`Ze2r_}t51_Q28ngYce7U;m98)L+j~<+JlV)DXUg4S*Ve z)|outU;`NE2-Xl*uLTHFna${uZ580nQei-Z9UeXCe3z<4ncsuLAVL6S&{ z+RY@H1EIs@$^a0Ri4=I_0P*v^+qFxkJlBg#*(Vwg5J7H9fXOh*z^H(+=MJFsdk z%yveh#`9lDbdjs!aC|I>ntHH~Qb|s6eB6F|=lp;>W@5`Cd2W;b#Fa;IWCR)scECV3 zhMi*~!z!#NAk~96f+lDdabq5m4>Z-yX3GNIJ|GEYL{2w2AORRDb@h}AkO@NR!lUN-l1^-~zJS3BR z?}f^mMa!ljBp2XoaR6|R0(SFem6D}vZ07x z6!|CeCTNd4a(Jv}TZz#R+u?C{)KC!=SY7)XID93 z{o~mH?~4P#cNNx=cyfcFl0;Z&B#oUre2jK%mN4Dl=nW#fG|HT!*ii<1A+Yjc+t?;@ zUL-&WP(|pX^i+;c(4N+pl8G!um8giVT2C)X{s4MFg};lVasx1mR;mc@+lBU+dV4Ia z6?tfRMzEdY@*vhJUhLr}X^AiJ&@~J)7(>pSh0Mvs@y$qUM57#un zz@BVma{;Qtoi{(l@r~^|}tDly-Pb1m; z)ssD-qrpX=kqie<<$bE2UG!)36$hJNEn7-oM;e%~F}cY+I@)(uV?tLz^AGrZMym_D zQP84QMY0WWSv&xo$rwrW%Ud@}6QMg_pynymGsL0G31JKT*+0_j@*_X>S1y&}a{H#c zf&BMjJOBNgfA@QiwW zAg0yE8$-PIT65lrH;aNi=zNL-hV>~R>vFPxy^0O@?ZdEI-a?wkA*X27tF!-J{wpNi zVL+(zY;okUR=M|FClC9ln;seHE*>)^OTg#%B>rg#fC(~bGJU$f>J&tzX3;Z5%$+(5DTTl_czj9Ta?Zw|0^n;N~9b)oa z8Clbk+5J2-tU>wdV|XLAnF7IxTK06eFKpsRw)fcWdBOyCPsPgdf$k#53F9 zxY_Qk|9BP+++~8Vz5d$!YXE5U1Gye1V44}+D>An_TbaA0q(mt|BIv%dD?!#?C)M6* z9c6e#So~@wk>CY}Bn8G3*t3&(Sf3KQLDx(F=@I_>kJ{9U4(>yO#&_+Pc!2G2S+VV8 z#@RsIt3kgo>?Z*e?AwRnpjhB|-|paH3j6Wf+V{7jJVyEua3_X070(+}K6Xiy3VK1J zAy5c#9MGJQ+5Zq0=vaY=S;j$FHnbx7ITq&;{Gb0!UxO#Wk6k2z zm)kel4aFZ#0O9|SeV&Rd?DDaq1e2dhdYmCM$#0b2;d}wahAx`^B@dK7qcV}ShP@o3 z*}74EP|VhhPzb?SDiCJc5!i0@A=~QmdOo#45|_!-KIqF z;MBlOq!doEP#f@TF!$MAtB7NV$+Lg9g|RXY1Zl{pTmV6_1n*Yskkj*aUffcaNTi@m z^djn=>?$fffAZsjxgTv50Nwz62^I`?oW3>vNAK*FzPE7KuRIn_@bsz~bf`)_V2gH= z;iC);)rVkpgx8?8czQ1@lF{RU`pmzf5Pjr7 z^JA%DgMxc6;IIApzwo2ym*FSAdIP}c=AC@*OXOusa|x;lFlyMkx*!i~T&yrha8xkD zBVU}uAN9dy4R`L zPzdz-)+j8(y`eA=xp3iy#F)y%j#0yTd7(u%E`D+sp0vi}+Me1nCyKk#Q}d1&@R%OA zLj8<8H`*72B9CSVWSiue0lg+3PQ?+Ld}-W9>@XkNGn>XSK(YTEb#A@!)= z%H4mr`sIi6r^{IbL zF5dW_!P3Mo2ka(6Q#+SVFG-uw_uKTS`uPvT+5MF5I>x_ab?__y?{+Qz@C609+`dWS z|5vw5_{6V&iEGlrbt-0%H``}>&jAdoCVpnI&V-w)4+S8k`Qa7W@WtjGSP1~uC+~+^ zeSMHgkcJB>)}^4fWqIC{^VAA8Y|%^24o#b!@v>`0a}v7A3B4#`kM_S|jj9D=%2-`+ z7f!e2N|7d4stfR5%|_N>$aCKDyd)@6FMQB?00hJ6w85gh@eYIIyk6kL0^f5ES#7Eh z2T$CC{SrX7o_L6qYRMuS3>`LD-*Uz;ZU6>Br<$-8Z4cC%jhYx@|DqV=*fQ2D0UBS9u8uL z(Uvi;F@~~8R178I@+62q?Vos*yjP+X_E3wc==pR<31VV=+`UL6h{&W#kgSOZLsdi# z$ew6wT_dO?~ z%vJA+2V0~~`)N!3tI<$@C6@q`GYsMCtiz_-qL*;Kbr)Qygg&VqMq8WJLQNQ#dW}w7=hkVgLGB zz|BawJl?g7;o(HqD%=5)R{*3TwQe{=0+`=X(w1GKcwxc-i465S{th6b$gM`~xgAgs zL>&X_?p4fhD0Wmcc56uGg3P29_;DvL0rq$3pn0v%?S8IX^KeY-0z4)=`FUa|uO=7v zMuQu_akOitV}n4CIs^9Gg$r=GeY4#D&d+Y- zzkl?RFSO4=n{IF4B-&ayeGfWYDap%(zL9`emY3}__@>BuFxWw`T2PKjTx`yR;)wxj zjp!^~6{t4cSv|h+jOAJZiFai6R{PW|Lp;TC8|t#AT{akW?us_e2`h6qk`X1(av%~U z!BO)&^1RiKdPfN&if*N|-a(POv;@{**wX}2wK7%&q1x3>!&@c4p+}Mi!RRkqhq!sA7xU-3 zQy^6p-6j~XeQ`cO)$gF+H<IiM+1{wjI7v;EiOSy9wR< zjR}*ElfGAJrT!UqO7bV^9pDUOopBc9I^tYI~h^n zF>31?hDYsD_ldT-fcMvCa@f57`ErnrpU8QUE#J1w31zbe4tcv~cx?~9uf^PeVbkQV zJ{5~#f5reOS@^P$j~gss%|RgFAo%`@P=V5|e`go%qy9t({Y0-7syvgd#dQ#nC;gh; zESSK;^`8G7KMz+x5CU=g@xOmj16*$39Jg-%^Ed+xA(%;tstIX2@fbrK+kQ z=jxXE^*XL*9dwzaY_2Mby~^5?Dy%4}9tI@tmq`|MI1r{`bo15WHnkg>oeV7x0wJr& zYb%iqvA;R12*!DZ=PPaAX9xW(%6oyEU=}HeDuz7y5bMDp((e=LwQNYCI6A}2N?Nqf zzYmR4Hj7*C%1t^?Hpcp6MVV&Z14+vEAZSk{Z+Qsx$*D3hmFS7KD(`%4n9gPNSNaK`knf?Z?ijY8Or z+rsAdSKnR8gEb8N+V_6%_nv?C`B!ZK=ztU@3(4VCo0M;4wFqKe9@hL~N>eN}uXwZQ z^L*msSw=$8u+O{@`Jy2Lc+O;|CgcLxXPUu0qf9JlFAN6k>4AGC!cB1KOA}q4{(tt~ z?Aey=tPfmkW$xjed+tyrAqf#ia*L_k21yM#g2|`@!3+Ih=r=n8KR5pv?g$6C1B}6H z*}@D0JIv68AB=$(G*D7WRdt6m?7cJBTD^Y5%G_6$RHa6M6md4bzNK@|o-_0NzTfv7 zcszg=i;)q|er{6c(>14jx=S&YP!&>|_4cuDH+(OpzMzzkYlSk9w8A}Dxee3&7843} z&}Ie+jl-jM&b7y{H(>;mmASa+E_G6&*iJwz_Lm`_!1BD*Zf?lZwMJ(s^zjgQFEc_?bm8wxs>(0KXP4;yHQGi?T z_fuGidCS4Gccamh3Deo*29X$prH0jB0>u{GB!2clqbeFnK8O5$qIF&Zxdgqrh~f;u z9u>D&zV*HLo&fi^Z~Wr_Pkvw_|NY`8{))t5WTB|=9Od6n%XATDSXd!HM)565r~^L< zgua1x<$D%mBA8Xypa?`G-)e(v*JV2gb>hY)s73{!eksU#8OL?#W5Ku+1P%E%{@#qN z(Id=+K$;#rRhZ!(cl#wtjCS!^gBFJv#I~1ByQW^*+y?OZkw^kpz+30O1j!O9qo&O$ z3~%l<=+&cL4L4d9FgPf?ri^l(g+c)l@O&J}9KBD`XV$qBK{){QuNj2T6G^VKQ~I=9 zEqpKb;qUwP#ou2${OX;*f{1L5FI|J3T8#qm_qRq=Dsy6nGmrmFBwG`DUAFsmDezy+ z0jPYAw5X`Qc&I)F?K(FNkXAMA%@%O)M1Mu)_=Zq!#{8E7_Ay`<7W=vXAPmgEb12VC;NDYURm ze0}=p+le?uS_oHk*pT+|WNWWu(+c?ESvxM;d$@j1ZUH~=qFq}h3B`dAryDg+?8wVf zz=y5Bpcu~fJuCUH+W_}8&h)?$q1|8K#5&g2GlqXK#Gi{g-_*%`Jv7Kx!qt0x9{XuU z7m`hahATA>WwuF?C-$0F;vd6{_TKw%{PW~~!akG5$OhlvAgLjvg1t_tZeV)KCK{EW z|F!j){NZ~~fcx7w`0aPt|5s04cXkLqa5+D z|A+G`kj=cM91kbzc=1HP$5g&+PUF00GX+%yLP+_fm_}^wLlTB6tsX)3HMLMKb zo=8RT#mTD+>>Ar^8jutiTmvWz3{nN4ppq+)eVG>IPQ@Dc|8vN6U0E7l8!Emtss!#;G1Ef(B!Wz3F52cIzS?qzn zYg; zUN!jL`LFnh$VMWv6#}Ij1Z8GF1z(@kJY@ZT-(U^(OeGM+L*O@Qg#sb}9)#3wko)mE z$Wagt!0Vq6;ZOcTKfhN4+~2;DZy^8m2H+Pz@#o?CS}G?@zQgXJSoT$uyG(VWbK{fc zb34b&UT9lQ@N_TKFkX`wO+@i@tE5&G6ef4*o)8JVAwwbs>Yb?f(*y#7^z>mfO~Fb-Hd zhn-#e(ozU@g_-0-Lry>|=0WQWzMm*R0y*p@Irb&9|HJ6Vf-lRZCif)bH@pM1-#?uJ z@hbA&xTts)Ag;n}o`rb=ee3TaACjfXcJbcG8(0Y%3ao0B%Blf z%7VS9B_t;!T>|K@!Q4=}E$_Ti1vKewLRrWh+T|G1mnf?OIN)+a<~XNz1Wy zwufU#6T*GkfdaxG_4+4~67d+bRul|1x`eVsj7?+;q;{YW^|8JAJ8h`|sQ}_~`JmCT4gPB+@Sg2qhO#?#(+zq&x9-+uiQ*&wk5R5^e@yQ(XIF zc&!x6>i>_)eoU*DlvDqu&;jxXc8mLGHz5<@q^!n6Mc19hor>>iV;;{@YmOxyus1u^ zO-g(Ge`OTl;_+4Z2S0h=1l-@gQFs6AvHNd6`Fbmak8~bVHheTJtKgf`FA&uDPtLcu z-W%lNDr1;jZ#XF=%Crw!p$;1syJ`a;r0W6pCIK0R6X$XpuDIqcN^Qm3k|sMv6D~n& z?fftiEcP~QBF53Xiv8f!lqs>P&g0D-C)H*PbjRS$QQ{@_}~7NNK%2@;YK!+ zXd1TZO8a_9Vn}EmWgQIY2_zEiiY5?Qu4$Bn`}2F;??rAI3UjvU34qT1vi*FQ+>r-q zQw{xyT_3wimbz9zHgquoeqTaDx}pwZZU--2n`H(v;FCHPydxx zP3c5p{jDmDB18J>2ij)BD$%Uy8M0J@!$vvWT-G-}S)(NaMq7wg*<|hf!Mg+M< zxUNZ=*V-cJ5!X^!$U{v)s85?Zmp;W2y$whPE zE=l7Ukf`ob-i;)VsXdZ2Uzn^|T)chp>lZGzQE0_R^ACcXGTleTzS8-Rn^&x7VluTt zi-%RlSKI{ECAZ)_-FHQBO7~tfGB{+1W{|~9 z0mrh_lRgFO?i~ehN593Z9u~TE!<&{u#T|8!JunH{JtLe^zcwVI0t}`_2Pqc}$wLZ> zH7m9E-fb#W2Pp1iUf-#`H^X1Nq>USo;+%uPz35yO(_3?PbJhL!3=M)CmfDSbET`5S!^NxZnXlw_g~|Ms{8mTJ^!5-wQR43HIyiKRe(><+4%%RSjv z+58)F5;Rnpg^uQfK5)ln0>+?+;?Mk-+5=61++NDlALKls8wrii({`DCE>vT(k2nXO zsOxjL9>)70lS6-GeuAc8#H0~Mv`N{!M za&|ifCcB(5XlYCGA^8~i^x`0oeyl!VZ(PJquBkir%?`7ZpirySvJm%xz?|}AUd7bj z_ld}H?x=!O|EfcYmgd0E-{bshNQ;I)FHmdnzr8H~J2wR~w_CEu_UFSN`6^Zb4<9SS z5mf`y4U#XA1ckr~z%8S{r(r8{0}HTt0ptQyWyga3&J;i_lTnznMno_%xA;fX}Q6On;bww&|_#|cNe?X~V}_n2gq83+UR zN3a&gl+G``9q9W@YeL~vHCtAf+1y}#0Ie;jdHPIiiO%Mz3_N*e91LW)Z`k1QB&p9R zXMs6C;)jEoyeQt-@dFjWTjjYFwdommgQYG(n%Ww~xwV5I9G%AgZFf5YCkKv}@ts>0 za2Pm?h^+aHTWP{z>Dqt)iFbnf=^=6o3l-KGA7S>trK1UdM?wAoWMDnqbFCRzbg)vu zh+*ds@EWnv-=V+%?q85rPXs*gr~fd7>$|=NxNiXNZ{IjK$o_u9`~OdU`g7s6*PMQr zMb4p%9;b@{LJxqMa<;%J zbW1)H<4(J^p>Gd0c6S_AX>a5}!u z*W1m4M8?y_ujIU%nigY1y)q8m-BO0g_DfDWj3xpxX{ zieWl84pSd4etg(Zp2nMxO~!(3jp!uVGE`%XU9$3nO$Z2d05 zhTUH=HH$Dm_DWN6+asTXR4!XVerU$otVRHw27J)RSxNhV7WO#GDT_Ra_HXE{Az8#hFm4|+y^zy&daM)c7GXjTeAp@@ zns9s;5fG_?2sHvxG9Du*Y4Qub$Dzm2Y-!&p^nemS7<~Ba=(-i3V~YOuk<)VoU|2Yq zTM%t0+^2m`?Bkj?h;w~;ys{v8cFq!_z{JoqXnz0aS zsh=zz6x(@?E)Hx^(lTjPy90)W>-EKkz(h`BT~h+$TKxNvmzH0B2Qt9caV+jY+TkYp z@t67JgDP1ZFwiN941MT3kpcx(fHh(BaMFGVZ+IhEh=jQqY>cp%(-b<(@W7G=2RE>o zUy<2KM(TJahrM7(Yfg%PJl(V@^_B%#{seMZqD(MqWr5c_BQXmo1)zQ8Yq!V4s|!x?=<@6GO=;Rk0iI6o;8EPKmj23nD1BMOJ_b8@@_f>3P&2{e zo%D%ycD>hNA_nda-*4s7Py6H^GBm9OyiPnOx-dENcRt%a6$?eSLIm*hQML&Sk8_Yi zw9t%M4M(kKh=Ngyo;=7#qyN3pYmMeFeByWR*8umoZ@k<8_A?*n-wgiwtv}9i5-jG%Zk_bgSI(Sxnmf<-1rUJK-xb$VVhX^2`~kQ_0OrgA3PS zoAWSx#Z9eTJ4a`u0mTu*nW${{sh4jHLUwL7DZ?jaR_*{!?1)@}pr9SNwX#WI*p0$? zcw%Gkk7+sVnT3M1K3$AvhxjO8pad%j($2*yQhvx{Tx5X@_?sz!BoIa-9OMa1PZj0^ zzx(mk);qo08i6Z0BF-o6?R(-N6jqRS&s}O+ZT2%d!8Wn!k!7!x1VljMjuU*Xo@}bU zYP_>&^M(n3ka~`EKj$6b_t1=>dBJj!{mFrj)kK-niH82)T)Uanx4`d% ziZ)}mg9&>bPD-mQDXuHDfhbaaI_5!5Y;@z`3;~?`u}4QFH4L?`sDnepv@)<-q4<7( z{8u6T>0jQj0q$?#I5&j;bn@RXed5n`VMkFbI+^H-mzA$VRS+F9_eAvyGEUlc3_}Bz zMCG7Q`UPyBWr>R;Wc?v{@&a0BFuZH$Lf3fYBts zfdo#Oztnn8*o$Z0fU5GvG4B=+YK0KajN@M7`^A?UgYz2yGHUw9PLY%c0N zqxLUMx!Mdw8d!MugGeS*c7THuYT)d*z0iRjE*O$g5aT<`ju_9E@|Nm`a(uyQ9|{G2 zkT?-{ms%$rTfv@h+1y;eOP?KM!?S!1sR zcPiTd4)UtbK?gVYS$6EiK`Lonm4lbz_T;IWMj$>|LucS8kv%$Uu!Q%-vxKNYD})~W z)0=`|J6^^T=XK}LRbO=`z_2C=^8P35{I~0Kfji)ED?ab+-*HMaJsG-FAYWJK81#l> zbaQgv1X%I#t6l@p6X4z$=>GO~e*5X4S%ZIm?ic<vZJcP`(hr78WoQVWf z+xGVGH%`hHv{621r$k!u5_+#%ySDl;&(Bqy%aN~#C?r9Taq%yZ`>S9~@g+K0ATBG8 zPRGM~no5Kq5zGwR&>jARLyN+a3(%blht&UvV1kdV1i-g#07PDSu$4Rm$#)=Xu)b(POUcG`t2Y8D z1^Lv|jlK-Z{-VQc+MB(@!uduvmw1y|3|Id5B=I@DnfV1>sPHgc$QsPe#yVMRK4)bK z@MkB<3j@i1?c}(9Q##s1`+`qWPL^>Zg0S7cr+s;|Qm{@3tuH{_z?WBA=Q!xVM^-S=K3KO!y7LV&;1c@*z+Sj`Jju&C* z;9egHUeyW#e+DZ9Y`92{K=uAVn5f4SVG3dKpfFdU_&s!$0NJd2H7I3RR}CSU1CX^& zkO`5C{B8{kvhRk>fO>Gyyh;WC?SEd6&wucfKXhMV?r&em?}@BJ2ByOs%xz-(<#koJM`Huc#>PQNdQET%MpoW z@^1lQjn=lfW`enkB1V?~B~buM`5ci;$eY8(PVRa@STPjA6m6p+hZ8OSod#%5Q_Y8U zPk4ND`5j0aaWUXIjz)x&fATbJQ`;)oPwNp+;zd&eQCSk<68&G2Eqs%WPh?4~^uHM? zvLF*$y4atmdeR{}fu;b%tb^cmL3MafbhuoPKxR536meV2`s(7rAB)w};{|IOCU~Ia z(T~BJRJEfo{Q}lg(5fVbLvIpDGW0q@t9Um#!8w9)btn$uEF{VfKj~_D^)eY%E3G?wFWGmn`H+!_yf| z{_U_ZRw?-?iG>&in8lmf&q*?uBr*nlxT|(-fRpNURKNs8?0~EecM2~eFCbGR$MnDL zK-o;bd!hXur`)45wPAV$>>cPxEBv&>3q9~h2m*u!JkEKNw*K%W(;`6sWmCn_Jyfj? z%DNk;^X44v+_hwJ@b|KnHNjy&-2WfdH79cjx}=Xp-+C7KbLPj-m;|E^yjInfk3a(; z=MC^2I;{N8E_2x>5kodEFl4H-3NR0o;26 z+~2-lZ$J2BA6pjT~s?jF+8;cP$efhR`W1n=tzzoiDF7 zxPHM!6-X()1O%h;cWhu2`yhsW^nAUf(p46>JFW*L%f6roOLWi&u7z^*i;^m~$r`ck zwRAgouRf!uU{2#zNCAuWc&RD2L)?J#u`+HK71RSDxm*ErA~?{2k1Ghje?|c(4N}X> zvd&I_l^P-&YRC0h20Dq8|9rR(r|H&K^KluAqoGi)u5F*1lJ=d&1js4d^4%957IWCP zgV5-3J3Zv+W~tiUwYYikoSw6rlK%AGx1PcH)i%OCvbQ*7NW6qK;y0d|`h=HO0Y(JA zIQ*xF1TD>qp5ucb_`utf0RMXwU}Oqkgxek&pp}FUb&JxRQFfPi+5vID-`?m>!4??h z(ncL4_Ept!zUWLzP{ID6yXm9hp_4FUiX>#BgAW#-*8y@u{?0ZG_!azbpcBx6f=Eb~ zYNgdMt@GM1)$2D}LjW=c4%p{mPS*;_*-ouczC|ws+3ZzHP!MD^V%LT=D+4Z&t5`=+fs$ZGzIg0RHYcP;>P zmS*375bvlOjYz)VxOL&)aK*O-4|T_?&S#;7@GRQb)DTJndn1vyE3&|I!_5JH-eZQl zJ7D(&z-#=iKRiPL?$-eKx35?D|DXTZO8)zuzij7QD=zHdG5I}c$9cPcjE{&gQf>{k z5DGo5V#tV7_PZz3S)Kq?4aAk^UY%F0b#yWDaZ+QDiotU=DMUq# zKydv`!#bOwMeX5fT;$PMoXFR9a_#*J}XHEnxOLNc*e|CX3 z!eNGVb+uPRwHEp6m4ycSY(O_INI~qxz;2v-P7DldR`6LA@TcCc0a&GgA9@$zn^ZI! zmg6KxJ;3#l!+{k_FXxkC3)xeqY$71w_-PW{bh=iGQ+lAs%W}{QHVYDa(vfk5ZD#59 zp^pQ*Y*019&MC)M%yAH>lk9=vn6(wVo-!L8Jcn+qfLP22bnT0CYaUv&GS&x7%?f7L zgSUX_%HZ4q@CS%4a90FEO8Xf))ssklnQ#{l?&~E2Il>hXCN#IzFrc~+qXIt~$+B^a$%^~w=)rE7O z=B456`}1G}v1;gwe8TQZxRI2vI{J^zv6ey?O%t$j|=teWkg-ecjza`~v}yaO!V= zAv}L!_^Y#baV>4#a6WxO#V-!dOSu)BpZar|o6&+c3m(I@XrjX%EYNo{5n?jnKt%zh z)&=qAhZjE4N0DnmtRAZ;=}74`u2C$;i{-8^4jI!k5Y#czkSzuq4B-NSYgv&FSf)eW z$mT$Vf$u9+r>~BSxluGcPNe{4f|IA1!5i>Mf0pW$J^7{BvX^Y*QR;!&&t0;M-ynis zRCoxk)3DT?>EB;`%{mcl$9*zM=-pv|rcweXYki{c!92WZGE%rQWU1JHrL&cl-fHW2 zrr1^yBjxzREE&9wE!WIKGjkOy8ubZ{n^bezu)nhrqb~6M6?W!-FZx{zps7AAvc_1~ zH9-hxN-l>a;g>)7_docK5rBmt@aW;CtO^}($cRJ3KV_Jxo$NNT+?yxq`ytI>($(ex z?dfo^TI&vC<~RwT>rwubHR@VHwt$7 zqXz?m;o9?&j}>Gg3}U(vhfHsnVpA2auE|jwIg7I*5}^C7K-vp@F}0tcVH7bmo9u0|nE4et4nOdL z55BbGe@6%aV}YYwqp$;7-Tor|oiTydsmmMir95CU z<$+o+MDPQV&oI*v6&5cDsgR6Fo8SDreMTpBvTz(kLZJ^ToD4MTX|IFKSZYcycmky1 zT|5cr>1jBXXWVDu;39DY&)FJ@oUYr42A8I5l4)iZpDRZqw~y&4$f^PfIgEto=GI_f zT|isk&AZx!{D}DkDLe>6E8vOd5X$L2mAZ6%c|P&^VHFA4Ovbkgf}TAVgoNN6-z?@k z-~&{XTeyEZXn+9of127!jlz2yxMtwNaWb*bHp0xhnAh~aU>||J`P>v6HwfF@2u@_J+9X9*;kh(ngIffQ&PdCk~%m)G#_*B_-E zE6k5^Sez$k7Ih-MRnE&?&z`L9mlU&GFAvUH;JtkDoZ9_v;6qTezt2wJGiSj9{uCAV z!{&-eMHbq6#u=FF%YnX2vTCeW6DS5a(SN{v^q>{WSK9yocMZU~8PNOR|5#rVx}EI< zWdP6?H(QD~QBx29>Im~2?74zWd4&50X*22Zs_8xL+LyZ9g-llXod|}Q;At1!`_z?1hQI2cY@Ul^ovTV)e~><5Skdm087)hBJ*-Shr4P=fhIJAjM!YTPtzec}`v zWz?~K$hXf~*~(G6w@rA+*Tj82Ab2=*;X}rXfFo*ZC(tW0p`fGSEloQ3UO*lh)dlk4 z2OomEe=llS_;y;S^cX+qanmRwNkYQ)SXL88=KjgB57Yr0+kzu8uze0#^-+|dVWKqz z4#Yt3c(mEhY|a4g`$#{d_~vf4mt?(n(%&++Z{2J-b18%cxzzgMxZ3*;7pvv)*blOe z(SXyssvzp(`}e@2#rVipmQXzKWgRv6;BffU&xY{1H}$yx@PEBm1Ki)fzKVY*|NYXx zdrikVrguW7P@G-3ChlxY&j%hp&wA&HO7ewwWb zdP8A~-lOrF%_#KU!bnFGf{SiqvCt|N{DFxGglx@eM@-i|6|2%=K}xnC(7=tp1eSP{ z!{tH~>6Dt>&>(x@PKC4$Ine=Zl-O-9iFmO1!5%j_F4!SKiqw^44h_wm1|tV1`(-r> zxg?PIm#iWa>HG6HeW>k#F^6c6uC=5v-n z@a}zPz)|O{70JSLSrr?#8~qgd7)E*e%d|(b`P${yLD>sR96ToiR<8(hSjB%q{teYe zM&UdeX!RE8w-0>qCHVhsIRMKqee-*+d~t^4u50@zX;YySH3kj12n~Vad~J0Y?K2%+ z(6N(AqO9ke=L$<472u%Mz#PUZ*T3pL6JR3lx$tH-S1i(i#_K3{8X}2V9OtZbD|AxG zy@nj5zUd76O&Bg8>mb-}XiE$d9?*w;knLmz3wNtj!U}gQ02KKtxdHMwz%Ksrl7@w4 zcTTq=#^mSnejbfax8?vaUk0auW*x2CZFY=B&hgmp*G^CD`I7aa7;({^pLEjA?ZoNf zIynECvE-$FnWFbZcIX?Hm6`r_5k&(*-;90FfKvZCIgqE+MR^nQwSRACwBU3$p_^}% zPhm-xs$NO5xw|`)0B*FRt5!osa|-w#JiTW-2lk}E)TjNyhfP<@#5F>AQ78EEJ4)~i z2C`oH*7x3%0q<{LH@6@9_(zxj{^d`6wl%Dm$|YeDy3?>h8{Hdo0y4QiX?!T8vRxBF zlm>AxvCy>ZA_#-HKDGOBZY0w_$TY1-#oDSJUiT~~7><$|xg@HMOi%4rwIC=nEQk94 zx&3>USHIeXhMtoOJFfj)KNLp`pJ-;pH7jI>LCj>B^Z-ewY_MNw z@P4qiz$!Spctvvq@R@=0!1cq1MUSX5IbwGr+o9QDO|s1o<;O}0gu^0 z0~Yx4*hj{8aBL!tbSkapHp<7vmkmDxr0Jm3ZLcq%o{5o4=xR^sUfTJi(1TX+xp%oc zst64t*QNcAO#ya5!$D+_6d!A+go9@@>T!m)Vv3u45M`Xfa^0Fs8P_}h$p_|P$GyOzl6#CK~OW`q8^478NhK2k;Cvn|IXjXbD!LN7B>}# z6+ysjrp&oFUOc^S*Qe(!G&BTj*R27O7T3&M4fC_}}Bl_O-v5rb7Ot^wYs0nSG9 zXw*fYFc>}h_r7||gojc(5Rd0hkeh@+OvOg=kp+yb^3yB}P-kBfFI!>C*2(U-bDz_J(vls7hDS<;Aqkd`Rw5w5kZn)$ zo)rEH_7V(zZ4(p=Oli3}4x1!npe0$2&!H`U*X+wHU^LfEtA=1Fz!+B6b_{hf_9@Fk zpc)Ndn}Qw*e4Yrn#v^@Y4}dS%0Q>=00PlMwZNCE~=oh`Sk1Ls~DzM}Jar>2r(t1{F zHc9l@^Gh5r9?KTD+ENaWl_o;!sqPnT88`;e&I8_>F+npe>!?H~Ui}Z`3!q>}do{=1 zPCF-<2W>B9<6GqU9OoSah4S2^iQ!0h6AD6j?()KV%P&65@EySa;4ILpvps(~e1Qa; zTwa9v_<6eb)i%w?L#t><@4~QqJ6*Te`vze;LQ?JIP7hl1goHve=s@5rTm_&38Bt*m zT6zy?Zg9{rQq!mjK95b6DNv7!jzR-^IF1XxDvb9su%`yuOUp4E`?f!z#kcfNJ7kFp`k%36(Zy4u4(+W;+k| z05Be@?YXBR7@E`dCU?8w!RvuZ&;QzIL->t9(7_4>;NspB;Qsb^4*##~s9*l%=NEDo zFWCDlUpK2JS|pLOnSH^N0p2Ar;Q?uyh5dNc_4drJGv=MHqfVGp@?N$z@7|o6PQEM3 z96_iKjWx31f4T;0b((<)ba}PewjvMa#WV*46{OyLEW1vHB*v&n5)+_LukQ@_BVG3o_xKG8*0Q~a#`cZf?vU;C{WQS}w!(dC`exZ&_u@Bw6$DuS2F`&XNUb7slaAP}!+{si)`4#iphOAwcb*+wGN60EQ zP9pr7VV@kJ6HMBpba9OAi17!q%k6u-zaL$sll~rhir=&bN_1o)bv^$<*Q#Jxz9;pe z0XW*rzpn`Jdh*j1)-Tn2``&_D-#>NcfA(Wd`ihV>Q2OsC5f{-A00kK&o7QSU>M8y# zS$Wdc0JH|aM*;3{Unk_h*FJX$|LOPsTo?K_=uqN@9X}+~*qeiGjsxFNZLZhtyq_GB zu~oPkvb{$|t)pncRS(i)NS-Uq*|MT*X^bk!evgTq&rXh2<35toZ#cc z>kUoQ=;I$O_1-Gn4W#731n{ua COp%cGTkgk^ywpC(;pSefR;#!#tQN7zkQ6xDp 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�Qsf(6#kF{3q{hSuJQg$|f&I&u+ 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

    ggq*0b#chd`M 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

    bQA=(oq`;NMXW{(RM-P*t!$L9!2_rR3-!ej*k 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 x`jd86=br>@{8I2{45(= z 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ℜ5FO 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

    %cB$C_hNs+= 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Ξ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 *EDVj!26~!KLk^;~=4 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

    ^Yeb{ysKf}}HH#ln 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

    r(V0 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


    <)G+aF@%4)zqA{pm(#8Vm3J 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 z

    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

    t11TMruQv*${?S&dH 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

    {as#gb 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 fwY@eM#@P#popMu>L)aq-_x5~|Qbin1 \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/binning_bin12.svg b/web/static/js9_old/images/voyager/binning_bin12.svg deleted file mode 100644 index 90c8c7d..0000000 --- a/web/static/js9_old/images/voyager/binning_bin12.svg +++ /dev/null @@ -1 +0,0 @@ -bin12 \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/binning_bin2.svg b/web/static/js9_old/images/voyager/binning_bin2.svg deleted file mode 100644 index aae0f06..0000000 --- a/web/static/js9_old/images/voyager/binning_bin2.svg +++ /dev/null @@ -1 +0,0 @@ -bin2 \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/color_a.png b/web/static/js9_old/images/voyager/color_a.png deleted file mode 100644 index 209a6b8992890a560bc4ce4859d7ad5406dd427a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmZ{gTS(IZ7{$+wa9i4}%u33KFfeNM-<)|NBy+kMGS{4?MljuGNX(YbW<-HP7js>l zreOFmgf14POBY5DtLPzpFw3n-C@oVEtSs#gr$4>*(8D>u^YVj_uhD4GMa$#m0HX8s zT9Zhd7^!rT*lF@^9U$3k%s1!w{r^ufKMx?sl^yaM^nQO7Wu}!{9yb$m8^v!&~3HN}QUEpZyRs|6}nl;wLdjOcSq( z5HUnNBnF5c;wsTev=U83J>e!Cgq0{Ij6^Q6olp}=L;?{@$SILf4#t7&K_!?5W`hM_ zDQE|s;4$zt=mk5$>tG)k1c$&dI04Rr-y=zXm!{!?_&%9aUs5Ad|2Mf$4rYp@Hcy*n zP8zmaEVlBBGP`wpeDdwo#QS%vVq%xaEnB&w{bH-Pt@%>RUZdHxXLnKIi>IT{!Xu&Q zse(qmO_h>-x2Mk^=)4%sRzj{aZh&Z;UD1?1%zw6}Iz8vX#N+3Jk| diff --git a/web/static/js9_old/images/voyager/color_aips0.png b/web/static/js9_old/images/voyager/color_aips0.png deleted file mode 100644 index 00a6eef83400aba426b7083c5d0b016132cabd74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXse}NZ5Z8kT51N~s8yXrK7#Y}T zI+d_Yu4I@~$uPT`VOAi+Dh7rVBFg8Z7rcyL{yK5_2g`+h4AU7HrZF&FU|{&c!0?Ts z{1?Oj{|x_6G5lZ8@P7lt|BVd)7c=~qVffF$@SmOi|E5if?AIcIc5xPXL>2>S4={E+ znQaGT*n7G-hG?8mPDn^;VoDPWGb`hG@Zd=kbDmtB#)HS=4UCS8iGmUWqRq^OoSqyL zCQX~z%4k{H7U=D!D|rj(i2sa6oPi<&eL$mBOI#yLQW8s2t&)pUffR$0fuV)2fuXK} xNr<6|m4T_1iMcM2G%&a=bL~BfhTQy=%(P0}8df>x1p_rOc)I$ztaD0e0ss%JXx#t+ diff --git a/web/static/js9_old/images/voyager/color_b.png b/web/static/js9_old/images/voyager/color_b.png deleted file mode 100644 index 84efe32a5873c1a2a576c62fffcecda9a5630a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gO-#}O7{(v^m_QO%X6YK2Y_l!wk6^8GPo+k&O zuv&}`ksdKp=~A)v@`xFbY_V55P0?sHBO?<~0=YmwPzaO)6@U$>1>8Uj&;|4W0U!i~ zfl(j^OafCt5=a5_Kw5%dGNiLHuR>}wl3F}0!=wdq2d*7NxCui(1Wuy67hQvB9)|lW zYQ|ujfbl*`6WIC!`E$ryK-Nzz=Q2dgdo_fF6;P!b%ph(c@)q+MX=$smzK`1upO4MQt!t92bkN*hGM?Hrc VkN;nYl($rg0<0#R@%j!|&mTQB^KAeC diff --git a/web/static/js9_old/images/voyager/color_bb.png b/web/static/js9_old/images/voyager/color_bb.png deleted file mode 100644 index 9e005eaa1cfc59fc842998c04d6ab900f784cb39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYeA@M=z%Q20@#5( zARll8#Xu?G15N|yB&c2rzZ|uZXo$wmI5e+A>w2_pLB}?9Ytgp@{b?B3gFz!+nh~^O zEEf|;5OQGpC}upEE5kws7SDiHVLUHoO$6(r*cijxO18xF&PLwd%1(j3Nqn@EPty5R z&*zyOvT(%Cw|RV*&q)_Q7jw3R^Ira{-QB>%5PQRc0FctdrF?L1t%9yCttD3G}t8c8k-f+-j%Q>*$ZXFvM4vxMa zd6O(?HA(8k?GHNd2YS1Dx+_Y(Wv5R1%71>H|F$sq<9lRygnYS7vFyr)nv1pm%a`^U zvonj<^tguWTRbv^_1@|lZ(7?Y9`imc1epND+;mtu1A}vDk8pF{eIhg3#8U4MVi0TQ5WqLZFsf zD;r1=MG%Rkd(uS^K?s2aWoauIfn}Biky$1LQGfc@hd!KhF86W{_uf{Yx5S`dtp^Nl zm!n*$BB0eS5L~S9DS>&Ld>+}Us;Wk#1<_w9=8z>EkOR4p2diKW;gMDK*YPj170Wt87iR~YTy6_AP8Zog*s?}2sA+qj>Abf1*f4I&Oi&a zK|6Fp9J(L@-Eal2!40?xx8OGPLLVey08(%t9>7C*1Viu`hT#c3g%KEqG`xlkyn%6; zfJvBwPw*M0VFqSl4t{Dhzf|>i&GxGu;(fY^t6FS}>o4{U*Xwi$oib9*H&0O@E*H@pblFwsw(zvCfdy*>bL}qqY5PsmrrBymC+(i(jwT zF+bIv%p~%~sT4+?`=d%A8nOi&Lqaf1redRHGD;TNWU)zBo2AGoSdubp(_j8E)E`z3 Wg-`t7&|`0?5C+^%uj9^cfAb%gQJP%< diff --git a/web/static/js9_old/images/voyager/color_color.png b/web/static/js9_old/images/voyager/color_color.png deleted file mode 100644 index 88f6a20e9d0dcd700ff146b67d570af20aa638bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 461 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsTBb}A+DP?ZDMC<2lBMEwDk1! zjEs!J!^0C265`|I8yg$@`}_O)`qr#jbKt;%{rmUt+qduP)vNE{zkm1c-KS6Q7Oa2A zsQ->Z?;V5gdj^Xq46z3p;`cKo?_j8IW2moZXsTt{6v1%7mtnsj!+j}+_Y4g07_^Qs z_|IeTo6q38fFW@bNL5_}Lq`$AJb#AyehjOf7+$aeRWZC`U^~X(w4cF$KZD;v_TV?0 zPA$20;RVo@oCO|{#X#BvjNMLV+W{Gwo-U3d8t0P}5>l9$+|tAp5>k_&KX{Pv{K+FW zCb>8}JG(kYM@2=&M8QBqL&HK&Pfdjh(Kpaup{S3j3^ HP6 diff --git a/web/static/js9_old/images/voyager/color_cool.png b/web/static/js9_old/images/voyager/color_cool.png deleted file mode 100644 index 8e43a8cecdeb3ba95ba61373b7ec53a15dcf23f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gUr5t&6vfY6x<78y={AQ#f>b0p`c3DQMN%?#GqtHR%l@g`3^8lDnI#w`6`H20 zsUSoMK9q&!OiQSgh%kK6%oUZ9)yyFJr&$TY?VE2sbm5$H@5ASEx%HN;G^sdT3_xl& z8FN_LnS??<^F(oP8o-OOWLQ%?9*;mE0tA2rkOL|p0*D0G0nxxFAdV5h79bg5Tn3O0 zl;zNPh9XZaR2AP;zfz$x1@AMdWfV>lDSA$MM2dR ze3F7sk^BtF>nNm=LYgVGjT9ZE=pyAMQg)N7hg4T6>^glmevQ|<)qo1%kWa=xJI89F^nO+Mm>7+V128cwU>bXKj-z{MMMdJS`qt0{ZE=O3W_h`qGr#Qy<_-Z9Sr Nm{YQheaVHje*pOl>^%Sg diff --git a/web/static/js9_old/images/voyager/color_green.png b/web/static/js9_old/images/voyager/color_green.png deleted file mode 100644 index 63dcac937129ef26062146cad43ca410de04e4cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmZ{gZAg=G6vclPv=^IMn!SlcAVxHLwziZ-#bnDZ#+v$M2|-(XHVV;}Zk0$7Lg2f# zvVjCq1d&9xCtU;)L=Z?&mbQcum}W%~nQ1~0^`~!r=)*bZaxdp_?``vW%MJQf!k?sZ$c%cGhsD>Ii1cxC2K?uW9sD*lnKqJK9G&I8*I14Rs4qBld zx}XQ*&_%)&e@z)v*4H0p2FHy582@6$zGHDX;{f3at{c9$q(Ziijo^dji@D@VeC zQ1Ii#`^gXQrl(ftkONmjiBxMTHU;i=G9aoNp VoBnU;x7Sw*18%3+ai`4R@(05xn^FJ( diff --git a/web/static/js9_old/images/voyager/color_grey.png b/web/static/js9_old/images/voyager/color_grey.png deleted file mode 100644 index addfaad34f0fbb501c9dfd20cfe44f1450183454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@0VEi-_Oq@8QcOwS?k)`f+xyS#2l6-zJR*yM zv+di#63ia%eDuHG(hSNr$h>-Y6-f!=PqlDDQYFw{9roNz|9RSxJ3)e_f; zl9a@fRIB8oR3OD*WMF8aYhb8rU=m_zVr5`zWn!iaBn=E|v+qWuXvob^$xN%nt%1iZ R^*K-jgQu&X%Q~loCIG{`ae4p% diff --git a/web/static/js9_old/images/voyager/color_he.png b/web/static/js9_old/images/voyager/color_he.png deleted file mode 100644 index 1e9972ea67892eb9846b1cdc560f03420e32d467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_-n7Y-U8saXwSmE> zo*}EAp|+l(zn*nYz2wY#{VDY>ef3eD_4zIJ4fXY{RrTE^^%L^yr)JjAN~xb8U%xc6 zepN{QdjI+@UiCX&>-RY{9&l_q;L?83z4M@F&mo__Lw*wv2TnN>GVMs%%%hRBkHyS8 z7QgU#;^O1U%TA=NIGM5fWcIpKc^gg_Y(8DQ^-SrGGZnkfR_{GmyZ?N{f%8p=F18-N z)N$le*Rd1S`wJ%4-Q<-5zT-d}tD z;l|sKx8Hrb`~LHTk6#{t`ug-X2+f4=|u`|IDozyJUL zKWA}y1~B*-lf2zsl4JJit^#s63p^r=fwTu0yPeFo12RfIT^vI+&L<}%q$H&!rY1js z@Z{06hfg1i3y27b35p6&pD<<8w24zEhX;fNg$0HNU%znW(zT0MFPj^f7?~NG8gJjQ zWz)8eTQ`>%loXW}mKJ~i@a5CDk6%CYbMSESaq@Eacl31ib@q1qd-!;zNo-BIGHGEh zCj-;ASsQOpm)i++fNF_rL`h0wNvc(HQ7VvPFfuT-&^0jBH82S=G_f);wK6f+1(F5^ iw`H!qN70a*pOTqYiCe=e$Gl*m1_n=8KbLh*2~7a6x-;Ma diff --git a/web/static/js9_old/images/voyager/color_heat.png b/web/static/js9_old/images/voyager/color_heat.png deleted file mode 100644 index 5b4512e347931cc7cbd8fa71356a6fe297e60f63..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmZ{gYe>@p6vdB8HK!}fw1*@iNFfgYTbtR!!r0nYX494_2~GDXS=!QRg&1KJJ~GQE zm=Ki^nN&_)h#`a!Xi%nRp$I-QO9<35E2z_-zV)FC=lt&daNuxDO^JG$bdwZ-%xKUi zi?oT7NPI<)l{V`EpD0s;S?BS1q>`2Xz6e@@Pzl2Q5h;Tr5Ichq9|FThm_m^n2Fn(l z2uDr?3bx`xB(BI&5sexp8r5iuMawR<$DwNvdg9Ti#eg0oMoc8&QzGV)@ZF5xDPS6y z4ju}2d-NivL-mF{(4PS-HqDnqb755 zO45+gU?T2OFhSt&guuic+gj<*Dwq>~O8f&gy1eAgzRxT*y ug37E=X#}-K6(bj25Q>~*$NmXqpSEQ=&i_9U5M!Sa12F0mwGa1NivIwZrT{Yl diff --git a/web/static/js9_old/images/voyager/color_hsv.png b/web/static/js9_old/images/voyager/color_hsv.png deleted file mode 100644 index 90c7fb7bb41fd77aa53b04d6c7d1d3cdb6891f80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 618 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+_+IzM%LQW#>L6Q z$1^CvH!>(7AviECI4CQNUpuDm}VO68-no6m4`4St_L^s6>ZwV6E>dv>_ zhG(Y%*De)~JreADxw!YUiXUWAJjASXn91@eqsuXdz!MCyCmFI&GgO>mXg|j=oHrw`U9A=@-A-CUvh`?m@BA!)&!jNm`Gi z^`8WrJoUAF=3)2T)%B%k=u7|PSD^)OVjA8g^}NfR{jOm7hw@Dy>-K(ZJMpRa(&uS+ zzRZ36b;+x5Yd?P9`t9q!AD@r?{B-WuryIXNKm7ge<)0s){{H>*9|*orWpV%pA7hfY zyGwG+KHXJ74rhT!WHFHT0Ash4*>*risi%u$h{pNkgoKo&w8Yfp=MSDddiLg4c%kf5-@(BSJAu3Wly@#(0%~CJboFyt=akR{08ohj`~Uy| diff --git a/web/static/js9_old/images/voyager/color_i8.png b/web/static/js9_old/images/voyager/color_i8.png deleted file mode 100644 index 9a9976a6f290508ddff612dff6a101e392db8bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 318 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXDW?FR5Z6tcHnFp_19=R>3=G#9 z82&Rbq|O3SA^#cv{b%_9U-r?XN3ya&;s1;b|5pPA82-;n1xaZ9|NrJc5Ip?R;Q-Xm znB?v5BKq{k&&5CvXMsm#F_88EW4Dvpc0h))r;B5V#`)xggp?-cG_f$2gk*OHK0iH+ z2hSe1GTYTLvIvMcF(e8GsvI!LI=MpC`L+;4{5$2FFD7rX25MI=ag8WRNi0dVN-jzT zQVd20h8DU8hPnnOA%-Sa2Buaf=DI-Az~Hvbwf86*a`RI%(<*UmSml@(4Aj8j>FVdQ I&MBb@0N4Rzvj6}9 diff --git a/web/static/js9_old/images/voyager/color_inferno.png b/web/static/js9_old/images/voyager/color_inferno.png deleted file mode 100644 index 86bdceb58d6ec6b7dbea419021b12adfe1b76992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjTulZlC+ zg;|7+MT&z>fty{8pHoMO%Se>lLXz8Fmd90*+gpu0K$|N}pDWsgGv0zT$(A$Kku%+u zE7OZR%a1oFh%YCMKQ~G+H(n?&StKuAG%s5`FJB_BSSq(%Cbvd5r(Qn0MIpOGF{?*8 zbAn376t%P&>Zx-ylNV|wE!9a_sTa3aKW3w0)K=s0ou*-X%!3bD1|G5TJ8tKF+QIXj zv)d&%=c}F$H+*bw`&-=$Hh&mq@+8XeS*+fRMD5q9>Tfeu-sdWQER_9JCiSIC{A<1N z_hx|~9XvmKIDbuK|22*6_iVP`^Vxqd;rhLb@ArD)-3@ZutDI``fRnzy2=#_y5Vi)k}T@gO9VoBeEDs zdw{Xq$!t3yqtw&IF+}5haza8%Qd(ka^798z9zA>b^s%^rh>)0|sPOa&QzlKDICXM( zKuAznU}*653s){(yLk1oxq*q1nW3ri_6=J$ZQHnYb9q5YQCVSW@%Im3K7IT6^)o*Q z4;LRNFL!@OPgh@OZ@0gPk5`(+)|4xg7Ups?Fm0Q)@%D7Noj?bumbgZgq$HN4S|t~y z0x1R~14DCN14CUS(-1==Dzopr088HEWdHyG diff --git a/web/static/js9_old/images/voyager/color_magma.png b/web/static/js9_old/images/voyager/color_magma.png deleted file mode 100644 index 4be28a369be8095c473684cf53a6711f741aa627..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O(OSorjT;lZlCs zg;|)5Rg!~Ej+;Y;k4sa4M_-uNRE*DBO2AQ8z(Y~cPem|9Q!q+bAi+=|&5S?Gia+0; zzsQ-t)I*@cN1!r5s5(TrCPK6>MyxJDqCQ2cAw#+$N4B9rzOhuHu|lb_R=KfJwXs#L zu~Vb5SF>TFR>M@ChFQAx^YrQ#8PqK^tX*wfv)-h7vuV|K^NKwd5F?c&wT<_0E4W`?H5+c#|4v~AHpwm>Z&(v_5 znb|y3tK}xP>kOTC=(!)z@;;#$cu^wk24Bowmc$2)DGwMk9x`V?V9mYHQE-pD_%3hh zZGnngg4H*KYOf17Toq}$BGP(Uxbu==&n5o;OT3dVa!tL+G2yi_!%Z{ z_nt|Cd-@~yb|>y@%h=aku&<$Ve@*@Vs`mY5efx?h?<<_OFK^+#oaOs6*X~Wci8;z zF_XV14S%22{dGb6=VguW*VVq=QvP~R@ylb`FVCgEyq5U(LFD^a!5_aw{{G#zRJTkB z7<`-s9+AaB+5?Q;PG;Ky8Ks^sjv*T7lM@nBlF|}Wlb=6$^61&ar;o)2M1;fyMTMtN zm@;YF#Ho|R144qr0z-qZU$}DV+QqAv%?(V9%nVJ9w{O_8Y1_uFo68GIipmO0i@$&P z^6A^hub=rjc)0jDdAa*Ldb;{Ld%OKTe7w>mwx(Q}v@n;Gfoa>Ujkl-E?F2eNwZt`| zBqgyV)hf9t6-Y4{85o-D8W`#tnT8k|SpkuOg|30Am4QJ|`l>z@4Y~O#nQ4`{HT<;_ RG6HH~@O1TaS?83{1OTUD1$Y1e diff --git a/web/static/js9_old/images/voyager/color_plasma.png b/web/static/js9_old/images/voyager/color_plasma.png deleted file mode 100644 index b9c842cfd085d1a4c4ea8e48472244493a44d6f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+j3i+w_Ad(TaL9) znRS9D>tsEasm3hR%~@vJFwb&ep5wwi&y#7sFVn(6#zmowiz6AA#4#*QVpx{Ousn-l zc^<=xB8C-Zj4P@bSJW~uZ)92C%C@YNV`(qIq#B-enpo9 z^RI^FUJuW{8JT$}Htk+Q%KhY|M`;O9GUJ}+L_g1ud|4F!x-{fXW$?S2fDiS4ADewX zw|Rc)bpP7x`fY;K_bHA)rrZ6TZS!ls)$c{-f0mj4S!MiZo#Ee2`hU0S{@tbhcc13p zLmGdNsr@;n`sbYL@5?H`uB-gKt@8bW%C{$~Utg$weyjHBquPgWTEG78G2F?g3=BTb z0*}aIAngIhZYQ(tfQ(X47sn8d^T`PbDM@LGsmaeDJbCo&;nTcT9`polE3Ac(Z=hp@Mg?z-sWJMVwqvqG+Rd|M6Axu^0^h(k0^aauh0;>i~3LpI**!A9jZZlP!Y;O>Bxza&{7nO zA|ph!SS(hGRIyoPi9!(+)#9jV6z$@w=oWXxpm-@hh$->=7y5)o(J;D)2GDhM0kxoG zs21%i*Ye2rl-*a z8bc%K0lI}c(IwQ1>d|3Tfl5(6@}Lc94O)ic&1<6+4)L^S^&R_U7H__}hhZ`hzVwPjAVoB~TU*MaVzK2GV@Q=l&Jvin$>))ss;X)=8c|&+x{xL2AsccaA6CL@D1f!F4hmsCYy=~0 z1~XWN8*GE^uoLXy0AcP14|t&zWT=2jI0%Oz06_@D5vYb*h(JBW-~^n4({KhF;Vd*k z3$#KT#GxG$&;i%r2Hb+%a0l+fJ$L{~=zoWQOgu6o6c&jMQQe9 z+PbN=xwY6VQS+jjcHtJ4O9L_3$p2$EwGxR!@pRT*7hSyX^L-c3zU^}x%XNJ24lV$` zL9eM~Xk$VUsZ6W5PjmpQz<9{4^?JRTX@Yzd6rrRHwHCNs=)QnQ=h5Gc#}0U`7^uad z5hMHYLXPnQOyuA#8&lX8gzz(VQYiciG6r=LdKy(Uj?*|t!%gE}68-BKqA(W5`$>de zgBrqeKNk8BaUCa6FuBZ{T}+*u<9vyvt%cJQpLoe>{>B@@@3E}-uqfuqjy}wd_GQPqgz?K6iB@8x ziM@4^uql6ip2F(GpvDG)!*{!Sd%Zt>)%2J*% zTa=rXBksG|bG!G}-8)rAbLG*BBc|D@z{lY9jDIhwkSk@yMWfG#z0U_nhR!xQo6nqf zwZy-#ul@WHiwcMgZe}{4*L}6~+6{Nt^}|THQc+ea-5%}*#s&8;R=a23G4~6d+G?k* z&S_U$o9zrBCuJ%rDU*^4vrM5Ti`5FHlxdP|cSLIc5l)`6H8!;VU&v6}R~Z2YZMkOP HpykpZ+j-^! diff --git a/web/static/js9_old/images/voyager/color_staircase.png b/web/static/js9_old/images/voyager/color_staircase.png deleted file mode 100644 index 2e8136280a67003931d27584577944c919690660..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 450 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_CXsigrvA+FoE9}*L@l9$(!|095|W=kc=F`Qqh}9U8SUy61O!Bc#2A?Z4GRkkIXyKq6(&raI+>k` z)m2p?AS^JHnW>c5S65dzS2kAQ!ew&<6B837Ge*W>Kd4Y7@Alam|B?txu#YI2D%~3*iba&=BH$) XRpQnV!zs55sDZ)L)z4*}Q$iB}!fbz> diff --git a/web/static/js9_old/images/voyager/color_standard.png b/web/static/js9_old/images/voyager/color_standard.png deleted file mode 100644 index dfe88b8bbb2a3c9de2387a41f2667540253c4992..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LD_+O&y-gNvD&n~hDF zgF~8&ONoa^i=W>}P|#Xf*jY@>OF|+@S~^NrHc4JSOG&9vMWs?rtwB?>LtA@-uI_Yw z{rN^lD@;u{n3?UcwA^oPecaCOyo1AaC#Uoj#X>*(#!GuUTf ze8kxFq^bEibE_*>HaBhT@7p^(ad3X+?DpQxeZ!Vb+cs|9TwYL8R90A8{Qbk1Pv1U%{mjq7!^OwR z%iZ76)7976+wJe+?)FK#IZ0 zz|cb1z);t~B*f6f%D~jh1jseDGBD5$S;mHzopr E0GH6eqyPW_ diff --git a/web/static/js9_old/images/voyager/color_turbo.png b/web/static/js9_old/images/voyager/color_turbo.png deleted file mode 100644 index 0ef988d221f7a6eadae322f840f80973544e36d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 907 zcmV;619bd}P)C)RO3_ZeIn!8MUXYPaa75e_K(Jb)#GmK|lzpmoPIWyqYd%sbMQu}(X-X~#W1a7$0z(vCa*!k6^Kom&5aJ3Vnn z!Hss@IAfIqH#x91slXzP?I5gGRF;FVm4vwx)*@JP!h9smMKG5HDvT*ZTiOMwFt8uM z&X8vX6)SI5J^x?^#ePkSilsK`w&50(+%q z4mkr4eNT9>AmJ^KfaGfTfFS9ZO$Y>&h_*>=ZWI=PWV9paS|Kn9B!qDr8^?8TIme@a zwZ^6|toVR1p*y0o(}- z{RD2Li8w(6*urSP)+#YBF; zZUF)D3t94$%YdQNukN;`HX) zBdI}hOF0-Fq1__Y_)h2v>O-Uq2;ooFkN{M_Pdr_<$VlxoFNqS-##8gGo}Mgq*(w7& zE)*GDsSFZ&J*Z%6phjVL!n}@Hno3@XhvGlFX(xSjfPt81qvcDo>SHAIN^~JGqC?LU hpL*RjUp{^S{06S9Fq9=gu#f-%002ovPDHLkV1lhWo8$lh diff --git a/web/static/js9_old/images/voyager/color_viridis.png b/web/static/js9_old/images/voyager/color_viridis.png deleted file mode 100644 index 785019a6f69b32e4fdb3c1722bc0357ce8b66a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 605 zcmeAS@N?(olHy`uVBq!ia0vp^DL~A@!3-oVxK_C{Ffi%__=LC~-+acCGuo9c%8e`5 zjW5w%D8*eY!$UILLnhBdq0mFQ#9gh-U8~Yfx7y91*44P))x6Q!s@ci5#mS-7!MWYu zt=-PE)7Gcc#=pxdsM|86+akQjEUL#erpF|{*Eq4)Fs0WZy;nc8S1+eeH?L2puur?B zPphm?v$9X4x=+2fPpzR(wW&{~wO6^lSE;jCv8PwDuSa2GkNo6r`Dxv9GrHtvb;`}{ zkelBjzo<=NX{+M$7Uh*qs;e6{*41losMFh2W4N`-bbE#6&N90_#ZLPQ-4EpX9Lf$n zk`Z<+HReQ8(y922Gts%{B8tz4R9y^cxa`}0#iRF{%arR5vv1feyk)-Pw(1A~vVz$3C4NPB>> z+sSM@AfwdN#W6(Vd~!lUN>W;4YVz|3PaZvc`1G;3fQXQops4Wl2~#Fbn>clHctA){ zSYT-I^$S-nUAuVovblkYk(r^X@%9Z{Hf`Iub#r+^Nl{s0Y4P_DUp{^N`1LbC2M-q? zCogw@M^9H@XK%N^hmTj9#MYE6lNRQ3GB9nMwej|Jxt%}>u+TLywK6d1Nnh26q9HdwB{QuOw}!t~LPkIh44$rjF6*2U FngCKT=lTEu diff --git a/web/static/js9_old/images/voyager/regions_annulus.svg b/web/static/js9_old/images/voyager/regions_annulus.svg deleted file mode 100644 index 841706a..0000000 --- a/web/static/js9_old/images/voyager/regions_annulus.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_box.svg b/web/static/js9_old/images/voyager/regions_box.svg deleted file mode 100644 index 1dbcd1f..0000000 --- a/web/static/js9_old/images/voyager/regions_box.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_circle.svg b/web/static/js9_old/images/voyager/regions_circle.svg deleted file mode 100644 index 71e1a3a..0000000 --- a/web/static/js9_old/images/voyager/regions_circle.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_cross.svg b/web/static/js9_old/images/voyager/regions_cross.svg deleted file mode 100644 index 2188a62..0000000 --- a/web/static/js9_old/images/voyager/regions_cross.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/regions_ellipse.svg b/web/static/js9_old/images/voyager/regions_ellipse.svg deleted file mode 100644 index 10e0bb2..0000000 --- a/web/static/js9_old/images/voyager/regions_ellipse.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_line.svg b/web/static/js9_old/images/voyager/regions_line.svg deleted file mode 100644 index edb396d..0000000 --- a/web/static/js9_old/images/voyager/regions_line.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_point.svg b/web/static/js9_old/images/voyager/regions_point.svg deleted file mode 100644 index 8f72841..0000000 --- a/web/static/js9_old/images/voyager/regions_point.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_polygon.svg b/web/static/js9_old/images/voyager/regions_polygon.svg deleted file mode 100644 index 822100d..0000000 --- a/web/static/js9_old/images/voyager/regions_polygon.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/web/static/js9_old/images/voyager/regions_text.svg b/web/static/js9_old/images/voyager/regions_text.svg deleted file mode 100644 index cb89209..0000000 --- a/web/static/js9_old/images/voyager/regions_text.svg +++ /dev/null @@ -1 +0,0 @@ -txt \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_1.svg b/web/static/js9_old/images/voyager/zoom_1.svg deleted file mode 100644 index 18bb5fd..0000000 --- a/web/static/js9_old/images/voyager/zoom_1.svg +++ /dev/null @@ -1 +0,0 @@ -mag1 \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_in.svg b/web/static/js9_old/images/voyager/zoom_in.svg deleted file mode 100644 index 74ed81f..0000000 --- a/web/static/js9_old/images/voyager/zoom_in.svg +++ /dev/null @@ -1 +0,0 @@ -magplus \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_mag.svg b/web/static/js9_old/images/voyager/zoom_mag.svg deleted file mode 100644 index 4da9d2b..0000000 --- a/web/static/js9_old/images/voyager/zoom_mag.svg +++ /dev/null @@ -1 +0,0 @@ -mag \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_out.svg b/web/static/js9_old/images/voyager/zoom_out.svg deleted file mode 100644 index c33604d..0000000 --- a/web/static/js9_old/images/voyager/zoom_out.svg +++ /dev/null @@ -1 +0,0 @@ -magminus \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_tofit.svg b/web/static/js9_old/images/voyager/zoom_tofit.svg deleted file mode 100644 index 8066e25..0000000 --- a/web/static/js9_old/images/voyager/zoom_tofit.svg +++ /dev/null @@ -1 +0,0 @@ -magtofit \ No newline at end of file diff --git a/web/static/js9_old/images/voyager/zoom_zoom.svg b/web/static/js9_old/images/voyager/zoom_zoom.svg deleted file mode 100644 index 4da9d2b..0000000 --- a/web/static/js9_old/images/voyager/zoom_zoom.svg +++ /dev/null @@ -1 +0,0 @@ -mag \ No newline at end of file diff --git a/web/static/js9_old/images/voyagerlogo.png b/web/static/js9_old/images/voyagerlogo.png deleted file mode 100644 index 56dd8792f0cb9c04916aad2853d23e434f8714d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25379 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 VLAQa$-w6N!002ovPDHLkV1jQXDYXCq diff --git a/web/static/js9_old/js/ElementQueries.js b/web/static/js9_old/js/ElementQueries.js deleted file mode 100755 index 4fe4298..0000000 --- a/web/static/js9_old/js/ElementQueries.js +++ /dev/null @@ -1,530 +0,0 @@ -'use strict'; - -/** - * Copyright Marc J. Schmidt. See the LICENSE file at the top-level - * directory of this distribution and at - * https://github.com/marcj/css-element-queries/blob/master/LICENSE. - */ -(function (root, factory) { - if (typeof define === "function" && define.amd) { - define(['./ResizeSensor.js'], factory); - } else if (typeof exports === "object") { - module.exports = factory(require('./ResizeSensor.js')); - } else { - root.ElementQueries = factory(root.ResizeSensor); - root.ElementQueries.listen(); - } -}(typeof window !== 'undefined' ? window : this, function (ResizeSensor) { - - /** - * - * @type {Function} - * @constructor - */ - var ElementQueries = function () { - //\n' - ].join(''); - } - - return markup; - }, - - /** - * @private - */ - _setSVGObjects: function(markup, reviver) { - var instance, i, len, objects = this._objects; - for (i = 0, len = objects.length; i < len; i++) { - instance = objects[i]; - if (instance.excludeFromExport) { - continue; - } - this._setSVGObject(markup, instance, reviver); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - markup.push(instance.toSVG(reviver)); - }, - - /** - * @private - */ - _setSVGBgOverlayImage: function(markup, property, reviver) { - if (this[property] && !this[property].excludeFromExport && this[property].toSVG) { - markup.push(this[property].toSVG(reviver)); - } - }, - - /** - * @private - */ - _setSVGBgOverlayColor: function(markup, property) { - var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width, - finalHeight = this.height; - if (!filler) { - return; - } - if (filler.toLive) { - var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'], - additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : ''; - markup.push( - '\n' - ); - } - else { - markup.push( - '\n' - ); - } - }, - /* _TO_SVG_END_ */ - - /** - * Moves an object or the objects of a multiple selection - * to the bottom of the stack of drawn objects - * @param {fabric.Object} object Object to send to back - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendToBack: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.unshift(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.unshift(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or the objects of a multiple selection - * to the top of the stack of drawn objects - * @param {fabric.Object} object Object to send - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringToFront: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.push(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.push(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or a selection down in stack of drawn objects - * An optional parameter, intersecting allows to move the object in behind - * the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendBackwards: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx > 0 + objsMoved) { - newIdx = idx - 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== 0) { - // if object is not on the bottom of stack - newIdx = this._findNewLowerIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewLowerIndex: function(object, idx, intersecting) { - var newIdx, i; - - if (intersecting) { - newIdx = idx; - - // traverse down the stack looking for the nearest intersecting object - for (i = idx - 1; i >= 0; --i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx - 1; - } - - return newIdx; - }, - - /** - * Moves an object or a selection up in stack of drawn objects - * An optional parameter, intersecting allows to move the object in front - * of the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringForward: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx < this._objects.length - 1 - objsMoved) { - newIdx = idx + 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== this._objects.length - 1) { - // if object is not on top of stack (last item in an array) - newIdx = this._findNewUpperIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewUpperIndex: function(object, idx, intersecting) { - var newIdx, i, len; - - if (intersecting) { - newIdx = idx; - - // traverse up the stack looking for the nearest intersecting object - for (i = idx + 1, len = this._objects.length; i < len; ++i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx + 1; - } - - return newIdx; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {fabric.Object} object Object to send - * @param {Number} index Position to move to - * @return {fabric.Canvas} thisArg - * @chainable - */ - moveTo: function (object, index) { - removeFromArray(this._objects, object); - this._objects.splice(index, 0, object); - return this.renderOnAddRemove && this.requestRenderAll(); - }, - - /** - * Clears a canvas element and dispose objects - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - // cancel eventually ongoing renders - if (this.isRendering) { - fabric.util.cancelAnimFrame(this.isRendering); - this.isRendering = 0; - } - this.forEachObject(function(object) { - object.dispose && object.dispose(); - }); - this._objects = []; - if (this.backgroundImage && this.backgroundImage.dispose) { - this.backgroundImage.dispose(); - } - this.backgroundImage = null; - if (this.overlayImage && this.overlayImage.dispose) { - this.overlayImage.dispose(); - } - this.overlayImage = null; - this._iTextInstances = null; - this.contextContainer = null; - fabric.util.cleanUpJsdomNode(this.lowerCanvasEl); - this.lowerCanvasEl = undefined; - return this; - }, - - /** - * Returns a string representation of an instance - * @return {String} string representation of an instance - */ - toString: function () { - return '#'; - } - }); - - extend(fabric.StaticCanvas.prototype, fabric.Observable); - extend(fabric.StaticCanvas.prototype, fabric.Collection); - extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter); - - extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ { - - /** - * @static - * @type String - * @default - */ - EMPTY_JSON: '{"objects": [], "background": "white"}', - - /** - * Provides a way to check support of some of the canvas methods - * (either those of HTMLCanvasElement itself, or rendering context) - * - * @param {String} methodName Method to check support for; - * Could be one of "setLineDash" - * @return {Boolean | null} `true` if method is supported (or at least exists), - * `null` if canvas element or context can not be initialized - */ - supports: function (methodName) { - var el = createCanvasElement(); - - if (!el || !el.getContext) { - return null; - } - - var ctx = el.getContext('2d'); - if (!ctx) { - return null; - } - - switch (methodName) { - - case 'setLineDash': - return typeof ctx.setLineDash !== 'undefined'; - - default: - return null; - } - } - }); - - /** - * Returns Object representation of canvas - * this alias is provided because if you call JSON.stringify on an instance, - * the toJSON object will be invoked if it exists. - * Having a toJSON method means you can do JSON.stringify(myCanvas) - * @function - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON compatible object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} - * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} - * @example JSON without additional properties - * var json = canvas.toJSON(); - * @example JSON with additional properties included - * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']); - * @example JSON without default values - * canvas.includeDefaultValues = false; - * var json = canvas.toJSON(); - */ - fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; - - if (fabric.isLikelyNode) { - fabric.StaticCanvas.prototype.createPNGStream = function() { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createPNGStream(); - }; - fabric.StaticCanvas.prototype.createJPEGStream = function(opts) { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createJPEGStream(opts); - }; - } -})(); - - -/** - * BaseBrush class - * @class fabric.BaseBrush - * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} - */ -fabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ { - - /** - * Color of a brush - * @type String - * @default - */ - color: 'rgb(0, 0, 0)', - - /** - * Width of a brush, has to be a Number, no string literals - * @type Number - * @default - */ - width: 1, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property replaces "shadowColor" (String), "shadowOffsetX" (Number), - * "shadowOffsetY" (Number) and "shadowBlur" (Number) since v1.2.12 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Line endings style of a brush (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'round', - - /** - * Corner style of a brush (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'round', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of a brush's - * @type Number - * @default - */ - strokeMiterLimit: 10, - - /** - * Stroke Dash Array. - * @type Array - * @default - */ - strokeDashArray: null, - - /** - * When `true`, the free drawing is limited to the whiteboard size. Default to false. - * @type Boolean - * @default false - */ - - limitedToCanvasSize: false, - - - /** - * Sets brush styles - * @private - */ - _setBrushStyles: function() { - var ctx = this.canvas.contextTop; - ctx.strokeStyle = this.color; - ctx.lineWidth = this.width; - ctx.lineCap = this.strokeLineCap; - ctx.miterLimit = this.strokeMiterLimit; - ctx.lineJoin = this.strokeLineJoin; - if (fabric.StaticCanvas.supports('setLineDash')) { - ctx.setLineDash(this.strokeDashArray || []); - } - }, - - /** - * Sets the transformation on given context - * @param {RenderingContext2d} ctx context to render on - * @private - */ - _saveAndTransform: function(ctx) { - var v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - }, - - /** - * Sets brush shadow styles - * @private - */ - _setShadow: function() { - if (!this.shadow) { - return; - } - - var canvas = this.canvas, - shadow = this.shadow, - ctx = canvas.contextTop, - zoom = canvas.getZoom(); - if (canvas && canvas._isRetinaScaling()) { - zoom *= fabric.devicePixelRatio; - } - - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * zoom; - ctx.shadowOffsetX = shadow.offsetX * zoom; - ctx.shadowOffsetY = shadow.offsetY * zoom; - }, - - needsFullRender: function() { - var color = new fabric.Color(this.color); - return color.getAlpha() < 1 || !!this.shadow; - }, - - /** - * Removes brush shadow styles - * @private - */ - _resetShadow: function() { - var ctx = this.canvas.contextTop; - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * Check is pointer is outside canvas boundaries - * @param {Object} pointer - * @private - */ - _isOutSideCanvas: function(pointer) { - return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight(); - } -}); - - -(function() { - /** - * PencilBrush class - * @class fabric.PencilBrush - * @extends fabric.BaseBrush - */ - fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ { - - /** - * Discard points that are less than `decimate` pixel distant from each other - * @type Number - * @default 0.4 - */ - decimate: 0.4, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.PencilBrush} Instance of a pencil brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this._points = []; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - _drawSegment: function (ctx, p1, p2) { - var midPoint = p1.midPointFrom(p2); - ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y); - return midPoint; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - this._prepareForDrawing(pointer); - // capture coordinates immediately - // this allows to draw dots (when movement never occurs) - this._captureDrawingPath(pointer); - this._render(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this._captureDrawingPath(pointer) && this._points.length > 1) { - if (this.needsFullRender()) { - // redraw curve - // clear top canvas - this.canvas.clearContext(this.canvas.contextTop); - this._render(); - } - else { - var points = this._points, length = points.length, ctx = this.canvas.contextTop; - // draw the curve update - this._saveAndTransform(ctx); - if (this.oldEnd) { - ctx.beginPath(); - ctx.moveTo(this.oldEnd.x, this.oldEnd.y); - } - this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true); - ctx.stroke(); - ctx.restore(); - } - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function(options) { - if (!this.canvas._isMainEvent(options.e)) { - return true; - } - this.oldEnd = undefined; - this._finalizeAndAddPath(); - return false; - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _prepareForDrawing: function(pointer) { - - var p = new fabric.Point(pointer.x, pointer.y); - - this._reset(); - this._addPoint(p); - this.canvas.contextTop.moveTo(p.x, p.y); - }, - - /** - * @private - * @param {fabric.Point} point Point to be added to points array - */ - _addPoint: function(point) { - if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) { - return false; - } - this._points.push(point); - return true; - }, - - /** - * Clear points array and set contextTop canvas style. - * @private - */ - _reset: function() { - this._points = []; - this._setBrushStyles(); - this._setShadow(); - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _captureDrawingPath: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y); - return this._addPoint(pointerPoint); - }, - - /** - * Draw a smooth path on the topCanvas using quadraticCurveTo - * @private - */ - _render: function() { - var ctx = this.canvas.contextTop, i, len, - p1 = this._points[0], - p2 = this._points[1]; - - this._saveAndTransform(ctx); - ctx.beginPath(); - //if we only have 2 points in the path and they are the same - //it means that the user only clicked the canvas without moving the mouse - //then we should be drawing a dot. A path isn't drawn between two identical dots - //that's why we set them apart a bit - if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) { - var width = this.width / 1000; - p1 = new fabric.Point(p1.x, p1.y); - p2 = new fabric.Point(p2.x, p2.y); - p1.x -= width; - p2.x += width; - } - ctx.moveTo(p1.x, p1.y); - - for (i = 1, len = this._points.length; i < len; i++) { - // we pick the point between pi + 1 & pi + 2 as the - // end point and p1 as our control point. - this._drawSegment(ctx, p1, p2); - p1 = this._points[i]; - p2 = this._points[i + 1]; - } - // Draw last line as a straight line while - // we wait for the next point to be able to calculate - // the bezier control point - ctx.lineTo(p1.x, p1.y); - ctx.stroke(); - ctx.restore(); - }, - - /** - * Converts points to SVG path - * @param {Array} points Array of points - * @return {String} SVG path - */ - convertPointsToSVGPath: function(points) { - var path = [], i, width = this.width / 1000, - p1 = new fabric.Point(points[0].x, points[0].y), - p2 = new fabric.Point(points[1].x, points[1].y), - len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2; - - if (manyPoints) { - multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1; - multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1; - } - path.push('M ', p1.x - multSignX * width, ' ', p1.y - multSignY * width, ' '); - for (i = 1; i < len; i++) { - if (!p1.eq(p2)) { - var midPoint = p1.midPointFrom(p2); - // p1 is our bezier control point - // midpoint is our endpoint - // start point is p(i-1) value. - path.push('Q ', p1.x, ' ', p1.y, ' ', midPoint.x, ' ', midPoint.y, ' '); - } - p1 = points[i]; - if ((i + 1) < points.length) { - p2 = points[i + 1]; - } - } - if (manyPoints) { - multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1; - multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1; - } - path.push('L ', p1.x + multSignX * width, ' ', p1.y + multSignY * width); - return path; - }, - - /** - * Creates fabric.Path object to add on canvas - * @param {String} pathData Path data - * @return {fabric.Path} Path to add on canvas - */ - createPath: function(pathData) { - var path = new fabric.Path(pathData, { - fill: null, - stroke: this.color, - strokeWidth: this.width, - strokeLineCap: this.strokeLineCap, - strokeMiterLimit: this.strokeMiterLimit, - strokeLineJoin: this.strokeLineJoin, - strokeDashArray: this.strokeDashArray, - }); - if (this.shadow) { - this.shadow.affectStroke = true; - path.shadow = new fabric.Shadow(this.shadow); - } - - return path; - }, - - /** - * Decimate points array with the decimate value - */ - decimatePoints: function(points, distance) { - if (points.length <= 2) { - return points; - } - var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2), - i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint], - cDistance; - for (i = 1; i < l - 1; i++) { - cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2); - if (cDistance >= adjustedDistance) { - lastPoint = points[i]; - newPoints.push(lastPoint); - } - } - /** - * Add the last point from the original line to the end of the array. - * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point. - */ - newPoints.push(points[l]); - return newPoints; - }, - - /** - * On mouseup after drawing the path on contextTop canvas - * we use the points captured to create an new fabric path object - * and add it to the fabric canvas. - */ - _finalizeAndAddPath: function() { - var ctx = this.canvas.contextTop; - ctx.closePath(); - if (this.decimate) { - this._points = this.decimatePoints(this._points, this.decimate); - } - var pathData = this.convertPointsToSVGPath(this._points).join(''); - if (pathData === 'M 0 0 Q 0 0 0 0 L 0 0') { - // do not create 0 width/height paths, as they are - // rendered inconsistently across browsers - // Firefox 4, for example, renders a dot, - // whereas Chrome 10 renders nothing - this.canvas.requestRenderAll(); - return; - } - - var path = this.createPath(pathData); - this.canvas.clearContext(this.canvas.contextTop); - this.canvas.fire('before:path:created', { path: path }); - this.canvas.add(path); - this.canvas.requestRenderAll(); - path.setCoords(); - this._resetShadow(); - - - // fire event 'path' created - this.canvas.fire('path:created', { path: path }); - } - }); -})(); - - -/** - * CircleBrush class - * @class fabric.CircleBrush - */ -fabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ { - - /** - * Width of a brush - * @type Number - * @default - */ - width: 10, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.CircleBrush} Instance of a circle brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.points = []; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - drawDot: function(pointer) { - var point = this.addPoint(pointer), - ctx = this.canvas.contextTop; - this._saveAndTransform(ctx); - this.dot(ctx, point); - ctx.restore(); - }, - - dot: function(ctx, point) { - ctx.fillStyle = point.fill; - ctx.beginPath(); - ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false); - ctx.closePath(); - ctx.fill(); - }, - - /** - * Invoked on mouse down - */ - onMouseDown: function(pointer) { - this.points.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - this.drawDot(pointer); - }, - - /** - * Render the full state of the brush - * @private - */ - _render: function() { - var ctx = this.canvas.contextTop, i, len, - points = this.points; - this._saveAndTransform(ctx); - for (i = 0, len = points.length; i < len; i++) { - this.dot(ctx, points[i]); - } - ctx.restore(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this.needsFullRender()) { - this.canvas.clearContext(this.canvas.contextTop); - this.addPoint(pointer); - this._render(); - } - else { - this.drawDot(pointer); - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len; - this.canvas.renderOnAddRemove = false; - - var circles = []; - - for (i = 0, len = this.points.length; i < len; i++) { - var point = this.points[i], - circle = new fabric.Circle({ - radius: point.radius, - left: point.x, - top: point.y, - originX: 'center', - originY: 'center', - fill: point.fill - }); - - this.shadow && (circle.shadow = new fabric.Shadow(this.shadow)); - - circles.push(circle); - } - var group = new fabric.Group(circles); - group.canvas = this.canvas; - - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @param {Object} pointer - * @return {fabric.Point} Just added pointer point - */ - addPoint: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y), - - circleRadius = fabric.util.getRandomInt( - Math.max(0, this.width - 20), this.width + 20) / 2, - - circleColor = new fabric.Color(this.color) - .setAlpha(fabric.util.getRandomInt(0, 100) / 100) - .toRgba(); - - pointerPoint.radius = circleRadius; - pointerPoint.fill = circleColor; - - this.points.push(pointerPoint); - - return pointerPoint; - } -}); - - -/** - * SprayBrush class - * @class fabric.SprayBrush - */ -fabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ { - - /** - * Width of a spray - * @type Number - * @default - */ - width: 10, - - /** - * Density of a spray (number of dots per chunk) - * @type Number - * @default - */ - density: 20, - - /** - * Width of spray dots - * @type Number - * @default - */ - dotWidth: 1, - - /** - * Width variance of spray dots - * @type Number - * @default - */ - dotWidthVariance: 1, - - /** - * Whether opacity of a dot should be random - * @type Boolean - * @default - */ - randomOpacity: false, - - /** - * Whether overlapping dots (rectangles) should be removed (for performance reasons) - * @type Boolean - * @default - */ - optimizeOverlapping: true, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.SprayBrush} Instance of a spray brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.sprayChunks = []; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer) { - this.sprayChunks.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove; - this.canvas.renderOnAddRemove = false; - - var rects = []; - - for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - var sprayChunk = this.sprayChunks[i]; - - for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) { - - var rect = new fabric.Rect({ - width: sprayChunk[j].width, - height: sprayChunk[j].width, - left: sprayChunk[j].x + 1, - top: sprayChunk[j].y + 1, - originX: 'center', - originY: 'center', - fill: this.color - }); - rects.push(rect); - } - } - - if (this.optimizeOverlapping) { - rects = this._getOptimizedRects(rects); - } - - var group = new fabric.Group(rects); - this.shadow && group.set('shadow', new fabric.Shadow(this.shadow)); - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @private - * @param {Array} rects - */ - _getOptimizedRects: function(rects) { - - // avoid creating duplicate rects at the same coordinates - var uniqueRects = { }, key, i, len; - - for (i = 0, len = rects.length; i < len; i++) { - key = rects[i].left + '' + rects[i].top; - if (!uniqueRects[key]) { - uniqueRects[key] = rects[i]; - } - } - var uniqueRectsArray = []; - for (key in uniqueRects) { - uniqueRectsArray.push(uniqueRects[key]); - } - - return uniqueRectsArray; - }, - - /** - * Render new chunk of spray brush - */ - render: function(sprayChunk) { - var ctx = this.canvas.contextTop, i, len; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, len = sprayChunk.length; i < len; i++) { - var point = sprayChunk[i]; - if (typeof point.opacity !== 'undefined') { - ctx.globalAlpha = point.opacity; - } - ctx.fillRect(point.x, point.y, point.width, point.width); - } - ctx.restore(); - }, - - /** - * Render all spray chunks - */ - _render: function() { - var ctx = this.canvas.contextTop, i, ilen; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - this.render(this.sprayChunks[i]); - } - ctx.restore(); - }, - - /** - * @param {Object} pointer - */ - addSprayChunk: function(pointer) { - this.sprayChunkPoints = []; - - var x, y, width, radius = this.width / 2, i; - - for (i = 0; i < this.density; i++) { - - x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius); - y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius); - - if (this.dotWidthVariance) { - width = fabric.util.getRandomInt( - // bottom clamp width to 1 - Math.max(1, this.dotWidth - this.dotWidthVariance), - this.dotWidth + this.dotWidthVariance); - } - else { - width = this.dotWidth; - } - - var point = new fabric.Point(x, y); - point.width = width; - - if (this.randomOpacity) { - point.opacity = fabric.util.getRandomInt(0, 100) / 100; - } - - this.sprayChunkPoints.push(point); - } - - this.sprayChunks.push(this.sprayChunkPoints); - } -}); - - -/** - * PatternBrush class - * @class fabric.PatternBrush - * @extends fabric.BaseBrush - */ -fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ { - - getPatternSrc: function() { - - var dotWidth = 20, - dotDistance = 5, - patternCanvas = fabric.util.createCanvasElement(), - patternCtx = patternCanvas.getContext('2d'); - - patternCanvas.width = patternCanvas.height = dotWidth + dotDistance; - - patternCtx.fillStyle = this.color; - patternCtx.beginPath(); - patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false); - patternCtx.closePath(); - patternCtx.fill(); - - return patternCanvas; - }, - - getPatternSrcFunction: function() { - return String(this.getPatternSrc).replace('this.color', '"' + this.color + '"'); - }, - - /** - * Creates "pattern" instance property - */ - getPattern: function() { - return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat'); - }, - - /** - * Sets brush styles - */ - _setBrushStyles: function() { - this.callSuper('_setBrushStyles'); - this.canvas.contextTop.strokeStyle = this.getPattern(); - }, - - /** - * Creates path - */ - createPath: function(pathData) { - var path = this.callSuper('createPath', pathData), - topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2); - - path.stroke = new fabric.Pattern({ - source: this.source || this.getPatternSrcFunction(), - offsetX: -topLeft.x, - offsetY: -topLeft.y - }); - return path; - } -}); - - -(function() { - - var getPointer = fabric.util.getPointer, - degreesToRadians = fabric.util.degreesToRadians, - abs = Math.abs, - supportLineDash = fabric.StaticCanvas.supports('setLineDash'), - isTouchEvent = fabric.util.isTouchEvent, - STROKE_OFFSET = 0.5; - - /** - * Canvas class - * @class fabric.Canvas - * @extends fabric.StaticCanvas - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} - * @see {@link fabric.Canvas#initialize} for constructor definition - * - * @fires object:modified at the end of a transform or any change when statefull is true - * @fires object:rotating while an object is being rotated from the control - * @fires object:scaling while an object is being scaled by controls - * @fires object:moving while an object is being dragged - * @fires object:skewing while an object is being skewed from the controls - * - * @fires before:transform before a transform is is started - * @fires before:selection:cleared - * @fires selection:cleared - * @fires selection:updated - * @fires selection:created - * - * @fires path:created after a drawing operation ends and the path is added - * @fires mouse:down - * @fires mouse:move - * @fires mouse:up - * @fires mouse:down:before on mouse down, before the inner fabric logic runs - * @fires mouse:move:before on mouse move, before the inner fabric logic runs - * @fires mouse:up:before on mouse up, before the inner fabric logic runs - * @fires mouse:over - * @fires mouse:out - * @fires mouse:dblclick whenever a native dbl click event fires on the canvas. - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop - * @fires after:render at the end of the render process, receives the context in the callback - * @fires before:render at start the render process, receives the context in the callback - * - * the following events are deprecated: - * @fires object:rotated at the end of a rotation transform - * @fires object:scaled at the end of a scale transform - * @fires object:moved at the end of translation transform - * @fires object:skewed at the end of a skew transform - */ - fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ { - - /** - * Constructor - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(el, options) { - options || (options = { }); - this.renderAndResetBound = this.renderAndReset.bind(this); - this.requestRenderAllBound = this.requestRenderAll.bind(this); - this._initStatic(el, options); - this._initInteractive(); - this._createCacheCanvas(); - }, - - /** - * When true, objects can be transformed by one side (unproportionally) - * when dragged on the corners that normally would not do that. - * @type Boolean - * @default - * @since fabric 4.0 // changed name and default value - */ - uniformScaling: true, - - /** - * Indicates which key switches uniform scaling. - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * totally wrong named. this sounds like `uniform scaling` - * if Canvas.uniformScaling is true, pressing this will set it to false - * and viceversa. - * @since 1.6.2 - * @type String - * @default - */ - uniScaleKey: 'shiftKey', - - /** - * When true, objects use center point as the origin of scale transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, objects use center point as the origin of rotate transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: false, - - /** - * Indicates which key enable centered Transform - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - centeredKey: 'altKey', - - /** - * Indicates which key enable alternate action on corner - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - altActionKey: 'shiftKey', - - /** - * Indicates that canvas is interactive. This property should not be changed. - * @type Boolean - * @default - */ - interactive: true, - - /** - * Indicates whether group selection should be enabled - * @type Boolean - * @default - */ - selection: true, - - /** - * Indicates which key or keys enable multiple click selection - * Pass value as a string or array of strings - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or empty or containing any other string that is not a modifier key - * feature is disabled. - * @since 1.6.2 - * @type String|Array - * @default - */ - selectionKey: 'shiftKey', - - /** - * Indicates which key enable alternative selection - * in case of target overlapping with active object - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * For a series of reason that come from the general expectations on how - * things should work, this feature works only for preserveObjectStacking true. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * @since 1.6.5 - * @type null|String - * @default - */ - altSelectionKey: null, - - /** - * Color of selection - * @type String - * @default - */ - selectionColor: 'rgba(100, 100, 255, 0.3)', // blue - - /** - * Default dash array pattern - * If not empty the selection border is dashed - * @type Array - */ - selectionDashArray: [], - - /** - * Color of the border of selection (usually slightly darker than color of selection itself) - * @type String - * @default - */ - selectionBorderColor: 'rgba(255, 255, 255, 0.3)', - - /** - * Width of a line used in object/group selection - * @type Number - * @default - */ - selectionLineWidth: 1, - - /** - * Select only shapes that are fully contained in the dragged selection rectangle. - * @type Boolean - * @default - */ - selectionFullyContained: false, - - /** - * Default cursor value used when hovering over an object on canvas - * @type String - * @default - */ - hoverCursor: 'move', - - /** - * Default cursor value used when moving an object on canvas - * @type String - * @default - */ - moveCursor: 'move', - - /** - * Default cursor value used for the entire canvas - * @type String - * @default - */ - defaultCursor: 'default', - - /** - * Cursor value used during free drawing - * @type String - * @default - */ - freeDrawingCursor: 'crosshair', - - /** - * Cursor value used for rotation point - * @type String - * @default - */ - rotationCursor: 'crosshair', - - /** - * Cursor value used for disabled elements ( corners with disabled action ) - * @type String - * @since 2.0.0 - * @default - */ - notAllowedCursor: 'not-allowed', - - /** - * Default element class that's given to wrapper (div) element of canvas - * @type String - * @default - */ - containerClass: 'canvas-container', - - /** - * When true, object detection happens on per-pixel basis rather than on per-bounding-box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * Number of pixels around target pixel to tolerate (consider active) during object detection - * @type Number - * @default - */ - targetFindTolerance: 0, - - /** - * When true, target detection is skipped. Target detection will return always undefined. - * click selection won't work anymore, events will fire with no targets. - * if something is selected before setting it to true, it will be deselected at the first click. - * area selection will still work. check the `selection` property too. - * if you deactivate both, you should look into staticCanvas. - * @type Boolean - * @default - */ - skipTargetFind: false, - - /** - * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. - * After mousedown, mousemove creates a shape, - * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. - * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} - * @type Boolean - * @default - */ - isDrawingMode: false, - - /** - * Indicates whether objects should remain in current stack position when selected. - * When false objects are brought to top and rendered as part of the selection group - * @type Boolean - * @default - */ - preserveObjectStacking: false, - - /** - * Indicates the angle that an object will lock to while rotating. - * @type Number - * @since 1.6.7 - * @default - */ - snapAngle: 0, - - /** - * Indicates the distance from the snapAngle the rotation will lock to the snapAngle. - * When `null`, the snapThreshold will default to the snapAngle. - * @type null|Number - * @since 1.6.7 - * @default - */ - snapThreshold: null, - - /** - * Indicates if the right click on canvas can output the context menu or not - * @type Boolean - * @since 1.6.5 - * @default - */ - stopContextMenu: false, - - /** - * Indicates if the canvas can fire right click events - * @type Boolean - * @since 1.6.5 - * @default - */ - fireRightClick: false, - - /** - * Indicates if the canvas can fire middle click events - * @type Boolean - * @since 1.7.8 - * @default - */ - fireMiddleClick: false, - - /** - * Keep track of the subTargets for Mouse Events - * @type fabric.Object[] - */ - targets: [], - - /** - * Keep track of the hovered target - * @type fabric.Object - * @private - */ - _hoveredTarget: null, - - /** - * hold the list of nested targets hovered - * @type fabric.Object[] - * @private - */ - _hoveredTargets: [], - - /** - * @private - */ - _initInteractive: function() { - this._currentTransform = null; - this._groupSelector = null; - this._initWrapperElement(); - this._createUpperCanvas(); - this._initEventListeners(); - - this._initRetinaScaling(); - - this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this); - - this.calcOffset(); - }, - - /** - * Divides objects in two groups, one to render immediately - * and one to render as activeGroup. - * @return {Array} objects to render immediately and pushes the other in the activeGroup. - */ - _chooseObjectsToRender: function() { - var activeObjects = this.getActiveObjects(), - object, objsToRender, activeGroupObjects; - - if (activeObjects.length > 0 && !this.preserveObjectStacking) { - objsToRender = []; - activeGroupObjects = []; - for (var i = 0, length = this._objects.length; i < length; i++) { - object = this._objects[i]; - if (activeObjects.indexOf(object) === -1 ) { - objsToRender.push(object); - } - else { - activeGroupObjects.push(object); - } - } - if (activeObjects.length > 1) { - this._activeObject._objects = activeGroupObjects; - } - objsToRender.push.apply(objsToRender, activeGroupObjects); - } - else { - objsToRender = this._objects; - } - return objsToRender; - }, - - /** - * Renders both the top canvas and the secondary container canvas. - * @return {fabric.Canvas} instance - * @chainable - */ - renderAll: function () { - if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) { - this.clearContext(this.contextTop); - this.contextTopDirty = false; - } - if (this.hasLostContext) { - this.renderTopLayer(this.contextTop); - } - var canvasToDrawOn = this.contextContainer; - this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender()); - return this; - }, - - renderTopLayer: function(ctx) { - ctx.save(); - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this.freeDrawingBrush && this.freeDrawingBrush._render(); - this.contextTopDirty = true; - } - // we render the top context - last object - if (this.selection && this._groupSelector) { - this._drawSelection(ctx); - this.contextTopDirty = true; - } - ctx.restore(); - }, - - /** - * Method to render only the top canvas. - * Also used to render the group selection box. - * @return {fabric.Canvas} thisArg - * @chainable - */ - renderTop: function () { - var ctx = this.contextTop; - this.clearContext(ctx); - this.renderTopLayer(ctx); - this.fire('after:render'); - return this; - }, - - /** - * @private - */ - _normalizePointer: function (object, pointer) { - var m = object.calcTransformMatrix(), - invertedM = fabric.util.invertTransform(m), - vptPointer = this.restorePointerVpt(pointer); - return fabric.util.transformPoint(vptPointer, invertedM); - }, - - /** - * Returns true if object is transparent at a certain location - * @param {fabric.Object} target Object to check - * @param {Number} x Left coordinate - * @param {Number} y Top coordinate - * @return {Boolean} - */ - isTargetTransparent: function (target, x, y) { - // in case the target is the activeObject, we cannot execute this optimization - // because we need to draw controls too. - if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) { - var normalizedPointer = this._normalizePointer(target, {x: x, y: y}), - targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0), - targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0); - - var isTransparent = fabric.util.isTransparent( - target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance); - - return isTransparent; - } - - var ctx = this.contextCache, - originalColor = target.selectionBackgroundColor, v = this.viewportTransform; - - target.selectionBackgroundColor = ''; - - this.clearContext(ctx); - - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - target.render(ctx); - ctx.restore(); - - target.selectionBackgroundColor = originalColor; - - var isTransparent = fabric.util.isTransparent( - ctx, x, y, this.targetFindTolerance); - - return isTransparent; - }, - - /** - * takes an event and determines if selection key has been pressed - * @private - * @param {Event} e Event object - */ - _isSelectionKeyPressed: function(e) { - var selectionKeyPressed = false; - - if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') { - selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; }); - } - else { - selectionKeyPressed = e[this.selectionKey]; - } - - return selectionKeyPressed; - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _shouldClearSelection: function (e, target) { - var activeObjects = this.getActiveObjects(), - activeObject = this._activeObject; - - return ( - !target - || - (target && - activeObject && - activeObjects.length > 1 && - activeObjects.indexOf(target) === -1 && - activeObject !== target && - !this._isSelectionKeyPressed(e)) - || - (target && !target.evented) - || - (target && - !target.selectable && - activeObject && - activeObject !== target) - ); - }, - - /** - * centeredScaling from object can't override centeredScaling from canvas. - * this should be fixed, since object setting should take precedence over canvas. - * also this should be something that will be migrated in the control properties. - * as ability to define the origin of the transformation that the control provide. - * @private - * @param {fabric.Object} target - * @param {String} action - * @param {Boolean} altKey - */ - _shouldCenterTransform: function (target, action, altKey) { - if (!target) { - return; - } - - var centerTransform; - - if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') { - centerTransform = this.centeredScaling || target.centeredScaling; - } - else if (action === 'rotate') { - centerTransform = this.centeredRotation || target.centeredRotation; - } - - return centerTransform ? !altKey : altKey; - }, - - /** - * should disappear before release 4.0 - * @private - */ - _getOriginFromCorner: function(target, corner) { - var origin = { - x: target.originX, - y: target.originY - }; - - if (corner === 'ml' || corner === 'tl' || corner === 'bl') { - origin.x = 'right'; - } - else if (corner === 'mr' || corner === 'tr' || corner === 'br') { - origin.x = 'left'; - } - - if (corner === 'tl' || corner === 'mt' || corner === 'tr') { - origin.y = 'bottom'; - } - else if (corner === 'bl' || corner === 'mb' || corner === 'br') { - origin.y = 'top'; - } - return origin; - }, - - /** - * @private - * @param {Boolean} alreadySelected true if target is already selected - * @param {String} corner a string representing the corner ml, mr, tl ... - * @param {Event} e Event object - * @param {fabric.Object} [target] inserted back to help overriding. Unused - */ - _getActionFromCorner: function(alreadySelected, corner, e, target) { - if (!corner || !alreadySelected) { - return 'drag'; - } - var control = target.controls[corner]; - return control.getActionName(e, control, target); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _setupCurrentTransform: function (e, target, alreadySelected) { - if (!target) { - return; - } - - var pointer = this.getPointer(e), corner = target.__corner, - control = target.controls[corner], - actionHandler = (alreadySelected && corner) ? - control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler, - action = this._getActionFromCorner(alreadySelected, corner, e, target), - origin = this._getOriginFromCorner(target, corner), - altKey = e[this.centeredKey], - transform = { - target: target, - action: action, - actionHandler: actionHandler, - corner: corner, - scaleX: target.scaleX, - scaleY: target.scaleY, - skewX: target.skewX, - skewY: target.skewY, - // used by transation - offsetX: pointer.x - target.left, - offsetY: pointer.y - target.top, - originX: origin.x, - originY: origin.y, - ex: pointer.x, - ey: pointer.y, - lastX: pointer.x, - lastY: pointer.y, - // unsure they are useful anymore. - // left: target.left, - // top: target.top, - theta: degreesToRadians(target.angle), - // end of unsure - width: target.width * target.scaleX, - shiftKey: e.shiftKey, - altKey: altKey, - original: fabric.util.saveObjectTransform(target), - }; - - if (this._shouldCenterTransform(target, action, altKey)) { - transform.originX = 'center'; - transform.originY = 'center'; - } - transform.original.originX = origin.x; - transform.original.originY = origin.y; - this._currentTransform = transform; - this._beforeTransform(e); - }, - - /** - * Set the cursor type of the canvas element - * @param {String} value Cursor type of the canvas element. - * @see http://www.w3.org/TR/css3-ui/#cursor - */ - setCursor: function (value) { - this.upperCanvasEl.style.cursor = value; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx to draw the selection on - */ - _drawSelection: function (ctx) { - var groupSelector = this._groupSelector, - left = groupSelector.left, - top = groupSelector.top, - aleft = abs(left), - atop = abs(top); - - if (this.selectionColor) { - ctx.fillStyle = this.selectionColor; - - ctx.fillRect( - groupSelector.ex - ((left > 0) ? 0 : -left), - groupSelector.ey - ((top > 0) ? 0 : -top), - aleft, - atop - ); - } - - if (!this.selectionLineWidth || !this.selectionBorderColor) { - return; - } - ctx.lineWidth = this.selectionLineWidth; - ctx.strokeStyle = this.selectionBorderColor; - - // selection border - if (this.selectionDashArray.length > 1 && !supportLineDash) { - - var px = groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), - py = groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop); - - ctx.beginPath(); - - fabric.util.drawDashedLine(ctx, px, py, px + aleft, py, this.selectionDashArray); - fabric.util.drawDashedLine(ctx, px, py + atop - 1, px + aleft, py + atop - 1, this.selectionDashArray); - fabric.util.drawDashedLine(ctx, px, py, px, py + atop, this.selectionDashArray); - fabric.util.drawDashedLine(ctx, px + aleft - 1, py, px + aleft - 1, py + atop, this.selectionDashArray); - - ctx.closePath(); - ctx.stroke(); - } - else { - fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray); - ctx.strokeRect( - groupSelector.ex + STROKE_OFFSET - ((left > 0) ? 0 : aleft), - groupSelector.ey + STROKE_OFFSET - ((top > 0) ? 0 : atop), - aleft, - atop - ); - } - }, - - /** - * Method that determines what object we are clicking on - * the skipGroup parameter is for internal use, is needed for shift+click action - * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target - * or the outside part of the corner. - * @param {Event} e mouse event - * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through - * @return {fabric.Object} the target found - */ - findTarget: function (e, skipGroup) { - if (this.skipTargetFind) { - return; - } - - var ignoreZoom = true, - pointer = this.getPointer(e, ignoreZoom), - activeObject = this._activeObject, - aObjects = this.getActiveObjects(), - activeTarget, activeTargetSubs, - isTouch = isTouchEvent(e), - shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1; - - // first check current group (if one exists) - // active group does not check sub targets like normal groups. - // if active group just exits. - this.targets = []; - - // if we hit the corner of an activeObject, let's return that. - if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) { - return activeObject; - } - if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) { - return activeObject; - } - if (aObjects.length === 1 && - activeObject === this._searchPossibleTargets([activeObject], pointer)) { - if (!this.preserveObjectStacking) { - return activeObject; - } - else { - activeTarget = activeObject; - activeTargetSubs = this.targets; - this.targets = []; - } - } - var target = this._searchPossibleTargets(this._objects, pointer); - if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { - target = activeTarget; - this.targets = activeTargetSubs; - } - return target; - }, - - /** - * Checks point is inside the object. - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @param {fabric.Object} obj Object to test against - * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target. - * @return {Boolean} true if point is contained within an area of given object - * @private - */ - _checkTarget: function(pointer, obj, globalPointer) { - if (obj && - obj.visible && - obj.evented && - // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html - // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html - obj.containsPoint(pointer) - ) { - if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { - var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y); - if (!isTransparent) { - return true; - } - } - else { - return true; - } - } - }, - - /** - * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted - * @param {Array} [objects] objects array to look into - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @return {fabric.Object} object that contains pointer - * @private - */ - _searchPossibleTargets: function(objects, pointer) { - // Cache all targets where their bounding box contains point. - var target, i = objects.length, subTarget; - // Do not check for currently grouped objects, since we check the parent group itself. - // until we call this function specifically to search inside the activeGroup - while (i--) { - var objToCheck = objects[i]; - var pointerToUse = objToCheck.group ? - this._normalizePointer(objToCheck.group, pointer) : pointer; - if (this._checkTarget(pointerToUse, objToCheck, pointer)) { - target = objects[i]; - if (target.subTargetCheck && target instanceof fabric.Group) { - subTarget = this._searchPossibleTargets(target._objects, pointer); - subTarget && this.targets.push(subTarget); - } - break; - } - } - return target; - }, - - /** - * Returns pointer coordinates without the effect of the viewport - * @param {Object} pointer with "x" and "y" number values - * @return {Object} object with "x" and "y" number values - */ - restorePointerVpt: function(pointer) { - return fabric.util.transformPoint( - pointer, - fabric.util.invertTransform(this.viewportTransform) - ); - }, - - /** - * Returns pointer coordinates relative to canvas. - * Can return coordinates with or without viewportTransform. - * ignoreZoom false gives back coordinates that represent - * the point clicked on canvas element. - * ignoreZoom true gives back coordinates after being processed - * by the viewportTransform ( sort of coordinates of what is displayed - * on the canvas where you are clicking. - * ignoreZoom true = HTMLElement coordinates relative to top,left - * ignoreZoom false, default = fabric space coordinates, the same used for shape position - * To interact with your shapes top and left you want to use ignoreZoom true - * most of the time, while ignoreZoom false will give you coordinates - * compatible with the object.oCoords system. - * of the time. - * @param {Event} e - * @param {Boolean} ignoreZoom - * @return {Object} object with "x" and "y" number values - */ - getPointer: function (e, ignoreZoom) { - // return cached values if we are in the event processing chain - if (this._absolutePointer && !ignoreZoom) { - return this._absolutePointer; - } - if (this._pointer && ignoreZoom) { - return this._pointer; - } - - var pointer = getPointer(e), - upperCanvasEl = this.upperCanvasEl, - bounds = upperCanvasEl.getBoundingClientRect(), - boundsWidth = bounds.width || 0, - boundsHeight = bounds.height || 0, - cssScale; - - if (!boundsWidth || !boundsHeight ) { - if ('top' in bounds && 'bottom' in bounds) { - boundsHeight = Math.abs( bounds.top - bounds.bottom ); - } - if ('right' in bounds && 'left' in bounds) { - boundsWidth = Math.abs( bounds.right - bounds.left ); - } - } - - this.calcOffset(); - pointer.x = pointer.x - this._offset.left; - pointer.y = pointer.y - this._offset.top; - if (!ignoreZoom) { - pointer = this.restorePointerVpt(pointer); - } - - var retinaScaling = this.getRetinaScaling(); - if (retinaScaling !== 1) { - pointer.x /= retinaScaling; - pointer.y /= retinaScaling; - } - - if (boundsWidth === 0 || boundsHeight === 0) { - // If bounds are not available (i.e. not visible), do not apply scale. - cssScale = { width: 1, height: 1 }; - } - else { - cssScale = { - width: upperCanvasEl.width / boundsWidth, - height: upperCanvasEl.height / boundsHeight - }; - } - - return { - x: pointer.x * cssScale.width, - y: pointer.y * cssScale.height - }; - }, - - /** - * @private - * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized - */ - _createUpperCanvas: function () { - var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/, ''), - lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl; - - // there is no need to create a new upperCanvas element if we have already one. - if (upperCanvasEl) { - upperCanvasEl.className = ''; - } - else { - upperCanvasEl = this._createCanvasElement(); - this.upperCanvasEl = upperCanvasEl; - } - fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass); - - this.wrapperEl.appendChild(upperCanvasEl); - - this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl); - this._applyCanvasStyle(upperCanvasEl); - this.contextTop = upperCanvasEl.getContext('2d'); - }, - - /** - * @private - */ - _createCacheCanvas: function () { - this.cacheCanvasEl = this._createCanvasElement(); - this.cacheCanvasEl.setAttribute('width', this.width); - this.cacheCanvasEl.setAttribute('height', this.height); - this.contextCache = this.cacheCanvasEl.getContext('2d'); - }, - - /** - * @private - */ - _initWrapperElement: function () { - this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { - 'class': this.containerClass - }); - fabric.util.setStyle(this.wrapperEl, { - width: this.width + 'px', - height: this.height + 'px', - position: 'relative' - }); - fabric.util.makeElementUnselectable(this.wrapperEl); - }, - - /** - * @private - * @param {HTMLElement} element canvas element to apply styles on - */ - _applyCanvasStyle: function (element) { - var width = this.width || element.width, - height = this.height || element.height; - - fabric.util.setStyle(element, { - position: 'absolute', - width: width + 'px', - height: height + 'px', - left: 0, - top: 0, - 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none', - '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none' - }); - element.width = width; - element.height = height; - fabric.util.makeElementUnselectable(element); - }, - - /** - * Copy the entire inline style from one element (fromEl) to another (toEl) - * @private - * @param {Element} fromEl Element style is copied from - * @param {Element} toEl Element copied style is applied to - */ - _copyCanvasStyle: function (fromEl, toEl) { - toEl.style.cssText = fromEl.style.cssText; - }, - - /** - * Returns context of canvas where object selection is drawn - * @return {CanvasRenderingContext2D} - */ - getSelectionContext: function() { - return this.contextTop; - }, - - /** - * Returns <canvas> element on which object selection is drawn - * @return {HTMLCanvasElement} - */ - getSelectionElement: function () { - return this.upperCanvasEl; - }, - - /** - * Returns currently active object - * @return {fabric.Object} active object - */ - getActiveObject: function () { - return this._activeObject; - }, - - /** - * Returns an array with the current selected objects - * @return {fabric.Object} active object - */ - getActiveObjects: function () { - var active = this._activeObject; - if (active) { - if (active.type === 'activeSelection' && active._objects) { - return active._objects.slice(0); - } - else { - return [active]; - } - } - return []; - }, - - /** - * @private - * @param {fabric.Object} obj Object that was removed - */ - _onObjectRemoved: function(obj) { - // removing active object should fire "selection:cleared" events - if (obj === this._activeObject) { - this.fire('before:selection:cleared', { target: obj }); - this._discardActiveObject(); - this.fire('selection:cleared', { target: obj }); - obj.fire('deselected'); - } - if (obj === this._hoveredTarget){ - this._hoveredTarget = null; - this._hoveredTargets = []; - } - this.callSuper('_onObjectRemoved', obj); - }, - - /** - * @private - * Compares the old activeObject with the current one and fires correct events - * @param {fabric.Object} obj old activeObject - */ - _fireSelectionEvents: function(oldObjects, e) { - var somethingChanged = false, objects = this.getActiveObjects(), - added = [], removed = []; - oldObjects.forEach(function(oldObject) { - if (objects.indexOf(oldObject) === -1) { - somethingChanged = true; - oldObject.fire('deselected', { - e: e, - target: oldObject - }); - removed.push(oldObject); - } - }); - objects.forEach(function(object) { - if (oldObjects.indexOf(object) === -1) { - somethingChanged = true; - object.fire('selected', { - e: e, - target: object - }); - added.push(object); - } - }); - if (oldObjects.length > 0 && objects.length > 0) { - somethingChanged && this.fire('selection:updated', { - e: e, - selected: added, - deselected: removed, - // added for backward compatibility - // deprecated - updated: added[0] || removed[0], - target: this._activeObject, - }); - } - else if (objects.length > 0) { - this.fire('selection:created', { - e: e, - selected: added, - target: this._activeObject, - }); - } - else if (oldObjects.length > 0) { - this.fire('selection:cleared', { - e: e, - deselected: removed, - }); - } - }, - - /** - * Sets given object as the only active object on canvas - * @param {fabric.Object} object Object to set as an active one - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {fabric.Canvas} thisArg - * @chainable - */ - setActiveObject: function (object, e) { - var currentActives = this.getActiveObjects(); - this._setActiveObject(object, e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to setActiveObject but without firing - * any event. There is commitment to have this stay this way. - * This is the functional part of setActiveObject. - * @private - * @param {Object} object to set as active - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {Boolean} true if the selection happened - */ - _setActiveObject: function(object, e) { - if (this._activeObject === object) { - return false; - } - if (!this._discardActiveObject(e, object)) { - return false; - } - if (object.onSelect({ e: e })) { - return false; - } - this._activeObject = object; - return true; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to discardActiveObject but without firing - * any events. There is commitment to have this stay this way. - * This is the functional part of discardActiveObject. - * @param {Event} [e] Event (passed along when firing "object:deselected") - * @param {Object} object to set as active - * @return {Boolean} true if the selection happened - * @private - */ - _discardActiveObject: function(e, object) { - var obj = this._activeObject; - if (obj) { - // onDeselect return TRUE to cancel selection; - if (obj.onDeselect({ e: e, object: object })) { - return false; - } - this._activeObject = null; - } - return true; - }, - - /** - * Discards currently active object and fire events. If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parameter and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @param {event} e - * @return {fabric.Canvas} thisArg - * @chainable - */ - discardActiveObject: function (e) { - var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject(); - if (currentActives.length) { - this.fire('before:selection:cleared', { target: activeObject, e: e }); - } - this._discardActiveObject(e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * Clears a canvas element and removes all event listeners - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - var wrapper = this.wrapperEl; - this.removeListeners(); - wrapper.removeChild(this.upperCanvasEl); - wrapper.removeChild(this.lowerCanvasEl); - this.contextCache = null; - this.contextTop = null; - ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - if (wrapper.parentNode) { - wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl); - } - delete this.wrapperEl; - fabric.StaticCanvas.prototype.dispose.call(this); - return this; - }, - - /** - * Clears all contexts (background, main, top) of an instance - * @return {fabric.Canvas} thisArg - * @chainable - */ - clear: function () { - // this.discardActiveGroup(); - this.discardActiveObject(); - this.clearContext(this.contextTop); - return this.callSuper('clear'); - }, - - /** - * Draws objects' controls (borders/controls) - * @param {CanvasRenderingContext2D} ctx Context to render controls on - */ - drawControls: function(ctx) { - var activeObject = this._activeObject; - - if (activeObject) { - activeObject._renderControls(ctx); - } - }, - - /** - * @private - */ - _toObject: function(instance, methodName, propertiesToInclude) { - //If the object is part of the current selection group, it should - //be transformed appropriately - //i.e. it should be serialised as it would appear if the selection group - //were to be destroyed. - var originalProperties = this._realizeGroupTransformOnObject(instance), - object = this.callSuper('_toObject', instance, methodName, propertiesToInclude); - //Undo the damage we did by changing all of its properties - this._unwindGroupTransformOnObject(instance, originalProperties); - return object; - }, - - /** - * Realises an object's group transformation on it - * @private - * @param {fabric.Object} [instance] the object to transform (gets mutated) - * @returns the original values of instance which were changed - */ - _realizeGroupTransformOnObject: function(instance) { - if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) { - var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top']; - //Copy all the positionally relevant properties across now - var originalValues = {}; - layoutProps.forEach(function(prop) { - originalValues[prop] = instance[prop]; - }); - fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix()); - return originalValues; - } - else { - return null; - } - }, - - /** - * Restores the changed properties of instance - * @private - * @param {fabric.Object} [instance] the object to un-transform (gets mutated) - * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject - */ - _unwindGroupTransformOnObject: function(instance, originalValues) { - if (originalValues) { - instance.set(originalValues); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - //If the object is in a selection group, simulate what would happen to that - //object when the group is deselected - var originalProperties = this._realizeGroupTransformOnObject(instance); - this.callSuper('_setSVGObject', markup, instance, reviver); - this._unwindGroupTransformOnObject(instance, originalProperties); - }, - - setViewportTransform: function (vpt) { - if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) { - this._activeObject.clearContextTop(); - } - fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt); - } - }); - - // copying static properties manually to work around Opera's bug, - // where "prototype" property is enumerable and overrides existing prototype - for (var prop in fabric.StaticCanvas) { - if (prop !== 'prototype') { - fabric.Canvas[prop] = fabric.StaticCanvas[prop]; - } - } -})(); - - -(function() { - - var addListener = fabric.util.addListener, - removeListener = fabric.util.removeListener, - RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1, - addEventOptions = { passive: false }; - - function checkClick(e, value) { - return e.button && (e.button === value - 1); - } - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * Contains the id of the touch event that owns the fabric transform - * @type Number - * @private - */ - mainTouchId: null, - - /** - * Adds mouse listeners to canvas - * @private - */ - _initEventListeners: function () { - // in case we initialized the class twice. This should not happen normally - // but in some kind of applications where the canvas element may be changed - // this is a workaround to having double listeners. - this.removeListeners(); - this._bindEvents(); - this.addOrRemove(addListener, 'add'); - }, - - /** - * return an event prefix pointer or mouse. - * @private - */ - _getEventPrefix: function () { - return this.enablePointerEvents ? 'pointer' : 'mouse'; - }, - - addOrRemove: function(functor, eventjsFunctor) { - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - functor(fabric.window, 'resize', this._onResize); - functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut); - functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter); - functor(canvasElement, 'wheel', this._onMouseWheel); - functor(canvasElement, 'contextmenu', this._onContextMenu); - functor(canvasElement, 'dblclick', this._onDoubleClick); - functor(canvasElement, 'dragover', this._onDragOver); - functor(canvasElement, 'dragenter', this._onDragEnter); - functor(canvasElement, 'dragleave', this._onDragLeave); - functor(canvasElement, 'drop', this._onDrop); - if (!this.enablePointerEvents) { - functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions); - } - if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) { - eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture); - eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag); - eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange); - eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake); - eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress); - } - }, - - /** - * Removes all event listeners - */ - removeListeners: function() { - this.addOrRemove(removeListener, 'remove'); - // if you dispose on a mouseDown, before mouse up, you need to clean document to... - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - }, - - /** - * @private - */ - _bindEvents: function() { - if (this.eventsBound) { - // for any reason we pass here twice we do not want to bind events twice. - return; - } - this._onMouseDown = this._onMouseDown.bind(this); - this._onTouchStart = this._onTouchStart.bind(this); - this._onMouseMove = this._onMouseMove.bind(this); - this._onMouseUp = this._onMouseUp.bind(this); - this._onTouchEnd = this._onTouchEnd.bind(this); - this._onResize = this._onResize.bind(this); - this._onGesture = this._onGesture.bind(this); - this._onDrag = this._onDrag.bind(this); - this._onShake = this._onShake.bind(this); - this._onLongPress = this._onLongPress.bind(this); - this._onOrientationChange = this._onOrientationChange.bind(this); - this._onMouseWheel = this._onMouseWheel.bind(this); - this._onMouseOut = this._onMouseOut.bind(this); - this._onMouseEnter = this._onMouseEnter.bind(this); - this._onContextMenu = this._onContextMenu.bind(this); - this._onDoubleClick = this._onDoubleClick.bind(this); - this._onDragOver = this._onDragOver.bind(this); - this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter'); - this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave'); - this._onDrop = this._simpleEventHandler.bind(this, 'drop'); - this.eventsBound = true; - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js gesture - * @param {Event} [self] Inner Event object - */ - _onGesture: function(e, self) { - this.__onTransformGesture && this.__onTransformGesture(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js drag - * @param {Event} [self] Inner Event object - */ - _onDrag: function(e, self) { - this.__onDrag && this.__onDrag(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on wheel event - */ - _onMouseWheel: function(e) { - this.__onMouseWheel(e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseOut: function(e) { - var target = this._hoveredTarget; - this.fire('mouse:out', { target: target, e: e }); - this._hoveredTarget = null; - target && target.fire('mouseout', { e: e }); - - var _this = this; - this._hoveredTargets.forEach(function(_target){ - _this.fire('mouse:out', { target: target, e: e }); - _target && target.fire('mouseout', { e: e }); - }); - this._hoveredTargets = []; - - if (this._iTextInstances) { - this._iTextInstances.forEach(function(obj) { - if (obj.isEditing) { - obj.hiddenTextarea.focus(); - } - }); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mouseenter - */ - _onMouseEnter: function(e) { - // This find target and consequent 'mouse:over' is used to - // clear old instances on hovered target. - // calling findTarget has the side effect of killing target.__corner. - // as a short term fix we are not firing this if we are currently transforming. - // as a long term fix we need to separate the action of finding a target with the - // side effects we added to it. - if (!this._currentTransform && !this.findTarget(e)) { - this.fire('mouse:over', { target: null, e: e }); - this._hoveredTarget = null; - this._hoveredTargets = []; - } - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js orientation change - * @param {Event} [self] Inner Event object - */ - _onOrientationChange: function(e, self) { - this.__onOrientationChange && this.__onOrientationChange(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onShake: function(e, self) { - this.__onShake && this.__onShake(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onLongPress: function(e, self) { - this.__onLongPress && this.__onLongPress(e, self); - }, - - /** - * prevent default to allow drop event to be fired - * @private - * @param {Event} [e] Event object fired on Event.js shake - */ - _onDragOver: function(e) { - e.preventDefault(); - var target = this._simpleEventHandler('dragover', e); - this._fireEnterLeaveEvents(target, e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onContextMenu: function (e) { - if (this.stopContextMenu) { - e.stopPropagation(); - e.preventDefault(); - } - return false; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onDoubleClick: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'dblclick'); - this._resetTransformEventData(e); - }, - - /** - * Return a the id of an event. - * returns either the pointerId or the identifier or 0 for the mouse event - * @private - * @param {Event} evt Event object - */ - getPointerId: function(evt) { - var changedTouches = evt.changedTouches; - - if (changedTouches) { - return changedTouches[0] && changedTouches[0].identifier; - } - - if (this.enablePointerEvents) { - return evt.pointerId; - } - - return -1; - }, - - /** - * Determines if an event has the id of the event that is considered main - * @private - * @param {evt} event Event object - */ - _isMainEvent: function(evt) { - if (evt.isPrimary === true) { - return true; - } - if (evt.isPrimary === false) { - return false; - } - if (evt.type === 'touchend' && evt.touches.length === 0) { - return true; - } - if (evt.changedTouches) { - return evt.changedTouches[0].identifier === this.mainTouchId; - } - return true; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchStart: function(e) { - e.preventDefault(); - if (this.mainTouchId === null) { - this.mainTouchId = this.getPointerId(e); - } - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - // Unbind mousedown to prevent double triggers from touch devices - removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDown: function (e) { - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchEnd: function(e) { - if (e.touches.length > 0) { - // if there are still touches stop here - return; - } - this.__onMouseUp(e); - this._resetTransformEventData(); - this.mainTouchId = null; - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - var _this = this; - if (this._willAddMouseDown) { - clearTimeout(this._willAddMouseDown); - } - this._willAddMouseDown = setTimeout(function() { - // Wait 400ms before rebinding mousedown to prevent double triggers - // from touch devices - addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown); - _this._willAddMouseDown = 0; - }, 400); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUp: function (e) { - this.__onMouseUp(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - if (this._isMainEvent(e)) { - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMove: function (e) { - !this.allowTouchScrolling && e.preventDefault && e.preventDefault(); - this.__onMouseMove(e); - }, - - /** - * @private - */ - _onResize: function () { - this.calcOffset(); - }, - - /** - * Decides whether the canvas should be redrawn in mouseup and mousedown events. - * @private - * @param {Object} target - */ - _shouldRender: function(target) { - var activeObject = this._activeObject; - - if ( - !!activeObject !== !!target || - (activeObject && target && (activeObject !== target)) - ) { - // this covers: switch of target, from target to no target, selection of target - // multiSelection with key and mouse - return true; - } - else if (activeObject && activeObject.isEditing) { - // if we mouse up/down over a editing textbox a cursor change, - // there is no need to re render - return false; - } - return false; - }, - - /** - * Method that defines the actions when mouse is released on canvas. - * The method resets the currentTransform parameters, store the image corner - * position in the image object and render the canvas on top. - * @private - * @param {Event} e Event object fired on mouseup - */ - __onMouseUp: function (e) { - var target, transform = this._currentTransform, - groupSelector = this._groupSelector, shouldRender = false, - isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0)); - this._cacheTransformEventData(e); - target = this._target; - this._handleEvent(e, 'up:before'); - // if right/middle click just fire events and return - // target undefined will make the _handleEvent search the target - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'up', RIGHT_CLICK, isClick); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'up', MIDDLE_CLICK, isClick); - } - this._resetTransformEventData(); - return; - } - - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this._onMouseUpInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - if (transform) { - this._finalizeCurrentTransform(e); - shouldRender = transform.actionPerformed; - } - if (!isClick) { - var targetWasActive = target === this._activeObject; - this._maybeGroupObjects(e); - if (!shouldRender) { - shouldRender = ( - this._shouldRender(target) || - (!targetWasActive && target === this._activeObject) - ); - } - } - if (target) { - if (target.selectable && target !== this._activeObject && target.activeOn === 'up') { - this.setActiveObject(target, e); - shouldRender = true; - } - else { - var corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - var control = target.controls[corner], - mouseUpHandler = control && control.getMouseUpHandler(e, target, control); - if (mouseUpHandler) { - var pointer = this.getPointer(e); - mouseUpHandler(e, transform, pointer.x, pointer.y); - } - } - target.isMoving = false; - } - this._setCursorFromEvent(e, target); - this._handleEvent(e, 'up', LEFT_CLICK, isClick); - this._groupSelector = null; - this._currentTransform = null; - // reset the target information about which corner is selected - target && (target.__corner = 0); - if (shouldRender) { - this.requestRenderAll(); - } - else if (!isClick) { - this.renderTop(); - } - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @return {Fabric.Object} target return the the target found, for internal reasons. - */ - _simpleEventHandler: function(eventType, e) { - var target = this.findTarget(e), - targets = this.targets, - options = { - e: e, - target: target, - subTargets: targets, - }; - this.fire(eventType, options); - target && target.fire(eventType, options); - if (!targets) { - return target; - } - for (var i = 0; i < targets.length; i++) { - targets[i].fire(eventType, options); - } - return target; - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @param {fabric.Object} targetObj receiving event - * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right - * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move. - */ - _handleEvent: function(e, eventType, button, isClick) { - var target = this._target, - targets = this.targets || [], - options = { - e: e, - target: target, - subTargets: targets, - button: button || LEFT_CLICK, - isClick: isClick || false, - pointer: this._pointer, - absolutePointer: this._absolutePointer, - transform: this._currentTransform - }; - if (eventType === 'up') { - options.currentTarget = this.findTarget(e); - options.currentSubTargets = this.targets; - } - this.fire('mouse:' + eventType, options); - target && target.fire('mouse' + eventType, options); - for (var i = 0; i < targets.length; i++) { - targets[i].fire('mouse' + eventType, options); - } - }, - - /** - * @private - * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event - */ - _finalizeCurrentTransform: function(e) { - - var transform = this._currentTransform, - target = transform.target, - eventName, - options = { - e: e, - target: target, - transform: transform, - action: transform.action, - }; - - if (target._scaling) { - target._scaling = false; - } - - target.setCoords(); - - if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) { - if (transform.actionPerformed) { - // this is not friendly to the new control api. - // is deprecated. - eventName = this._addEventOptions(options, transform); - this._fire(eventName, options); - } - this._fire('modified', options); - } - }, - - /** - * Mutate option object in order to add by property and give back the event name. - * @private - * @deprecated since 4.2.0 - * @param {Object} options to mutate - * @param {Object} transform to inspect action from - */ - _addEventOptions: function(options, transform) { - // we can probably add more details at low cost - // scale change, rotation changes, translation changes - var eventName, by; - switch (transform.action) { - case 'scaleX': - eventName = 'scaled'; - by = 'x'; - break; - case 'scaleY': - eventName = 'scaled'; - by = 'y'; - break; - case 'skewX': - eventName = 'skewed'; - by = 'x'; - break; - case 'skewY': - eventName = 'skewed'; - by = 'y'; - break; - case 'scale': - eventName = 'scaled'; - by = 'equally'; - break; - case 'rotate': - eventName = 'rotated'; - break; - case 'drag': - eventName = 'moved'; - break; - } - options.by = by; - return eventName; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDownInDrawingMode: function(e) { - this._isCurrentlyDrawing = true; - if (this.getActiveObject()) { - this.discardActiveObject(e).requestRenderAll(); - } - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer }); - this._handleEvent(e, 'down'); - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMoveInDrawingMode: function(e) { - if (this._isCurrentlyDrawing) { - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer }); - } - this.setCursor(this.freeDrawingCursor); - this._handleEvent(e, 'move'); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUpInDrawingMode: function(e) { - var pointer = this.getPointer(e); - this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer }); - this._handleEvent(e, 'up'); - }, - - /** - * Method that defines the actions when mouse is clicked on canvas. - * The method inits the currentTransform parameters and renders all the - * canvas so the current image can be placed on the top canvas and the rest - * in on the container one. - * @private - * @param {Event} e Event object fired on mousedown - */ - __onMouseDown: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'down:before'); - var target = this._target; - // if right click just fire events - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'down', RIGHT_CLICK); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'down', MIDDLE_CLICK); - } - return; - } - - if (this.isDrawingMode) { - this._onMouseDownInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - // ignore if some object is being transformed at this moment - if (this._currentTransform) { - return; - } - - var pointer = this._pointer; - // save pointer for check in __onMouseUp event - this._previousPointer = pointer; - var shouldRender = this._shouldRender(target), - shouldGroup = this._shouldGroup(e, target); - if (this._shouldClearSelection(e, target)) { - this.discardActiveObject(e); - } - else if (shouldGroup) { - this._handleGrouping(e, target); - target = this._activeObject; - } - - if (this.selection && (!target || - (!target.selectable && !target.isEditing && target !== this._activeObject))) { - this._groupSelector = { - ex: pointer.x, - ey: pointer.y, - top: 0, - left: 0 - }; - } - - if (target) { - var alreadySelected = target === this._activeObject; - if (target.selectable && target.activeOn === 'down') { - this.setActiveObject(target, e); - } - var corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - target.__corner = corner; - if (target === this._activeObject && (corner || !shouldGroup)) { - this._setupCurrentTransform(e, target, alreadySelected); - var control = target.controls[corner], - pointer = this.getPointer(e), - mouseDownHandler = control && control.getMouseDownHandler(e, target, control); - if (mouseDownHandler) { - mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y); - } - } - } - this._handleEvent(e, 'down'); - // we must renderAll so that we update the visuals - (shouldRender || shouldGroup) && this.requestRenderAll(); - }, - - /** - * reset cache form common information needed during event processing - * @private - */ - _resetTransformEventData: function() { - this._target = null; - this._pointer = null; - this._absolutePointer = null; - }, - - /** - * Cache common information needed during event processing - * @private - * @param {Event} e Event object fired on event - */ - _cacheTransformEventData: function(e) { - // reset in order to avoid stale caching - this._resetTransformEventData(); - this._pointer = this.getPointer(e, true); - this._absolutePointer = this.restorePointerVpt(this._pointer); - this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null; - }, - - /** - * @private - */ - _beforeTransform: function(e) { - var t = this._currentTransform; - this.stateful && t.target.saveState(); - this.fire('before:transform', { - e: e, - transform: t, - }); - }, - - /** - * Method that defines the actions when mouse is hovering the canvas. - * The currentTransform parameter will define whether the user is rotating/scaling/translating - * an image or neither of them (only hovering). A group selection is also possible and would cancel - * all any other type of action. - * In case of an image transformation only the top canvas will be rendered. - * @private - * @param {Event} e Event object fired on mousemove - */ - __onMouseMove: function (e) { - this._handleEvent(e, 'move:before'); - this._cacheTransformEventData(e); - var target, pointer; - - if (this.isDrawingMode) { - this._onMouseMoveInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - var groupSelector = this._groupSelector; - - // We initially clicked in an empty area, so we draw a box for multiple selection - if (groupSelector) { - pointer = this._pointer; - - groupSelector.left = pointer.x - groupSelector.ex; - groupSelector.top = pointer.y - groupSelector.ey; - - this.renderTop(); - } - else if (!this._currentTransform) { - target = this.findTarget(e) || null; - this._setCursorFromEvent(e, target); - this._fireOverOutEvents(target, e); - } - else { - this._transformObject(e); - } - this._handleEvent(e, 'move'); - this._resetTransformEventData(); - }, - - /** - * Manage the mouseout, mouseover events for the fabric object on the canvas - * @param {Fabric.Object} target the target where the target from the mousemove event - * @param {Event} e Event object fired on mousemove - * @private - */ - _fireOverOutEvents: function(target, e) { - var _hoveredTarget = this._hoveredTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _hoveredTarget, - evtOut: 'mouseout', - canvasEvtOut: 'mouse:out', - evtIn: 'mouseover', - canvasEvtIn: 'mouse:over', - }); - for (var i = 0; i < length; i++){ - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'mouseout', - evtIn: 'mouseover', - }); - } - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - }, - - /** - * Manage the dragEnter, dragLeave events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the onDrag event - * @param {Event} e Event object fired on ondrag - * @private - */ - _fireEnterLeaveEvents: function(target, e) { - var _draggedoverTarget = this._draggedoverTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _draggedoverTarget, - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - for (var i = 0; i < length; i++) { - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - } - this._draggedoverTarget = target; - }, - - /** - * Manage the synthetic in/out events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the supported events - * @param {Event} e Event object fired - * @param {Object} config configuration for the function to work - * @param {String} config.targetName property on the canvas where the old target is stored - * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out - * @param {String} config.evtOut name of the event to fire for out - * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in - * @param {String} config.evtIn name of the event to fire for in - * @private - */ - fireSyntheticInOutEvents: function(target, e, config) { - var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires, - targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut; - if (targetChanged) { - inOpt = { e: e, target: target, previousTarget: oldTarget }; - outOpt = { e: e, target: oldTarget, nextTarget: target }; - } - inFires = target && targetChanged; - outFires = oldTarget && targetChanged; - if (outFires) { - canvasEvtOut && this.fire(canvasEvtOut, outOpt); - oldTarget.fire(config.evtOut, outOpt); - } - if (inFires) { - canvasEvtIn && this.fire(canvasEvtIn, inOpt); - target.fire(config.evtIn, inOpt); - } - }, - - /** - * Method that defines actions when an Event Mouse Wheel - * @param {Event} e Event object fired on mouseup - */ - __onMouseWheel: function(e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'wheel'); - this._resetTransformEventData(); - }, - - /** - * @private - * @param {Event} e Event fired on mousemove - */ - _transformObject: function(e) { - var pointer = this.getPointer(e), - transform = this._currentTransform; - - transform.reset = false; - transform.shiftKey = e.shiftKey; - transform.altKey = e[this.centeredKey]; - - this._performTransformAction(e, transform, pointer); - transform.actionPerformed && this.requestRenderAll(); - }, - - /** - * @private - */ - _performTransformAction: function(e, transform, pointer) { - var x = pointer.x, - y = pointer.y, - action = transform.action, - actionPerformed = false, - actionHandler = transform.actionHandler; - // this object could be created from the function in the control handlers - - - if (actionHandler) { - actionPerformed = actionHandler(e, transform, x, y); - } - if (action === 'drag' && actionPerformed) { - transform.target.isMoving = true; - this.setCursor(transform.target.moveCursor || this.moveCursor); - } - transform.actionPerformed = transform.actionPerformed || actionPerformed; - }, - - /** - * @private - */ - _fire: fabric.controlsUtils.fireEvent, - - /** - * Sets the cursor depending on where the canvas is being hovered. - * Note: very buggy in Opera - * @param {Event} e Event object - * @param {Object} target Object that the mouse is hovering, if so. - */ - _setCursorFromEvent: function (e, target) { - if (!target) { - this.setCursor(this.defaultCursor); - return false; - } - var hoverCursor = target.hoverCursor || this.hoverCursor, - activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ? - this._activeObject : null, - // only show proper corner when group selection is not active - corner = (!activeSelection || !activeSelection.contains(target)) - // here we call findTargetCorner always with undefined for the touch parameter. - // we assume that if you are using a cursor you do not need to interact with - // the bigger touch area. - && target._findTargetCorner(this.getPointer(e, true)); - - if (!corner) { - if (target.subTargetCheck){ - // hoverCursor should come from top-most subTarget, - // so we walk the array backwards - this.targets.concat().reverse().map(function(_target){ - hoverCursor = _target.hoverCursor || hoverCursor; - }); - } - this.setCursor(hoverCursor); - } - else { - this.setCursor(this.getCornerCursor(corner, target, e)); - } - }, - - /** - * @private - */ - getCornerCursor: function(corner, target, e) { - var control = target.controls[corner]; - return control.cursorStyleHandler(e, control, target); - } - }); -})(); - - -(function() { - - var min = Math.min, - max = Math.max; - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - * @return {Boolean} - */ - _shouldGroup: function(e, target) { - var activeObject = this._activeObject; - return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection && - (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e }); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _handleGrouping: function (e, target) { - var activeObject = this._activeObject; - // avoid multi select when shift click on a corner - if (activeObject.__corner) { - return; - } - if (target === activeObject) { - // if it's a group, find target again, using activeGroup objects - target = this.findTarget(e, true); - // if even object is not found or we are on activeObjectCorner, bail out - if (!target || !target.selectable) { - return; - } - } - if (activeObject && activeObject.type === 'activeSelection') { - this._updateActiveSelection(target, e); - } - else { - this._createActiveSelection(target, e); - } - }, - - /** - * @private - */ - _updateActiveSelection: function(target, e) { - var activeSelection = this._activeObject, - currentActiveObjects = activeSelection._objects.slice(0); - if (activeSelection.contains(target)) { - activeSelection.removeWithUpdate(target); - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - if (activeSelection.size() === 1) { - // activate last remaining object - this._setActiveObject(activeSelection.item(0), e); - } - } - else { - activeSelection.addWithUpdate(target); - this._hoveredTarget = activeSelection; - this._hoveredTargets = this.targets.concat(); - } - this._fireSelectionEvents(currentActiveObjects, e); - }, - - /** - * @private - */ - _createActiveSelection: function(target, e) { - var currentActives = this.getActiveObjects(), group = this._createGroup(target); - this._hoveredTarget = group; - // ISSUE 4115: should we consider subTargets here? - // this._hoveredTargets = []; - // this._hoveredTargets = this.targets.concat(); - this._setActiveObject(group, e); - this._fireSelectionEvents(currentActives, e); - }, - - /** - * @private - * @param {Object} target - */ - _createGroup: function(target) { - var objects = this._objects, - isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), - groupObjects = isActiveLower - ? [this._activeObject, target] - : [target, this._activeObject]; - this._activeObject.isEditing && this._activeObject.exitEditing(); - return new fabric.ActiveSelection(groupObjects, { - canvas: this - }); - }, - - /** - * @private - * @param {Event} e mouse event - */ - _groupSelectedObjects: function (e) { - - var group = this._collectObjects(e), - aGroup; - - // do not create group for 1 element only - if (group.length === 1) { - this.setActiveObject(group[0], e); - } - else if (group.length > 1) { - aGroup = new fabric.ActiveSelection(group.reverse(), { - canvas: this - }); - this.setActiveObject(aGroup, e); - } - }, - - /** - * @private - */ - _collectObjects: function(e) { - var group = [], - currentObject, - x1 = this._groupSelector.ex, - y1 = this._groupSelector.ey, - x2 = x1 + this._groupSelector.left, - y2 = y1 + this._groupSelector.top, - selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)), - selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)), - allowIntersect = !this.selectionFullyContained, - isClick = x1 === x2 && y1 === y2; - // we iterate reverse order to collect top first in case of click. - for (var i = this._objects.length; i--; ) { - currentObject = this._objects[i]; - - if (!currentObject || !currentObject.selectable || !currentObject.visible) { - continue; - } - - if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2)) || - currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2) || - (allowIntersect && currentObject.containsPoint(selectionX1Y1)) || - (allowIntersect && currentObject.containsPoint(selectionX2Y2)) - ) { - group.push(currentObject); - // only add one object if it's a click - if (isClick) { - break; - } - } - } - - if (group.length > 1) { - group = group.filter(function(object) { - return !object.onSelect({ e: e }); - }); - } - - return group; - }, - - /** - * @private - */ - _maybeGroupObjects: function(e) { - if (this.selection && this._groupSelector) { - this._groupSelectedObjects(e); - } - this.setCursor(this.defaultCursor); - // clear selection and current transformation - this._groupSelector = null; - } - }); - -})(); - - -(function () { - fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately - * @param {Object} [options] Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo} - * @example Generate jpeg dataURL with lower quality - * var dataURL = canvas.toDataURL({ - * format: 'jpeg', - * quality: 0.8 - * }); - * @example Generate cropped png dataURL (clipping of canvas) - * var dataURL = canvas.toDataURL({ - * format: 'png', - * left: 100, - * top: 100, - * width: 200, - * height: 200 - * }); - * @example Generate double scaled png dataURL - * var dataURL = canvas.toDataURL({ - * format: 'png', - * multiplier: 2 - * }); - */ - toDataURL: function (options) { - options || (options = { }); - - var format = options.format || 'png', - quality = options.quality || 1, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1), - canvasEl = this.toCanvasElement(multiplier, options); - return fabric.util.toDataURL(canvasEl, format, quality); - }, - - /** - * Create a new HTMLCanvas element painted with the current canvas content. - * No need to resize the actual one or repaint it. - * Will transfer object ownership to a new canvas, paint it, and set everything back. - * This is an intermediary step used to get to a dataUrl but also it is useful to - * create quick image copies of a canvas without passing for the dataUrl string - * @param {Number} [multiplier] a zoom factor. - * @param {Object} [cropping] Cropping informations - * @param {Number} [cropping.left] Cropping left offset. - * @param {Number} [cropping.top] Cropping top offset. - * @param {Number} [cropping.width] Cropping width. - * @param {Number} [cropping.height] Cropping height. - */ - toCanvasElement: function(multiplier, cropping) { - multiplier = multiplier || 1; - cropping = cropping || { }; - var scaledWidth = (cropping.width || this.width) * multiplier, - scaledHeight = (cropping.height || this.height) * multiplier, - zoom = this.getZoom(), - originalWidth = this.width, - originalHeight = this.height, - newZoom = zoom * multiplier, - vp = this.viewportTransform, - translateX = (vp[4] - (cropping.left || 0)) * multiplier, - translateY = (vp[5] - (cropping.top || 0)) * multiplier, - originalInteractive = this.interactive, - newVp = [newZoom, 0, 0, newZoom, translateX, translateY], - originalRetina = this.enableRetinaScaling, - canvasEl = fabric.util.createCanvasElement(), - originalContextTop = this.contextTop; - canvasEl.width = scaledWidth; - canvasEl.height = scaledHeight; - this.contextTop = null; - this.enableRetinaScaling = false; - this.interactive = false; - this.viewportTransform = newVp; - this.width = scaledWidth; - this.height = scaledHeight; - this.calcViewportBoundaries(); - this.renderCanvas(canvasEl.getContext('2d'), this._objects); - this.viewportTransform = vp; - this.width = originalWidth; - this.height = originalHeight; - this.calcViewportBoundaries(); - this.interactive = originalInteractive; - this.enableRetinaScaling = originalRetina; - this.contextTop = originalContextTop; - return canvasEl; - }, - }); - -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - /** - * Populates canvas with data from the specified JSON. - * JSON format must conform to the one of {@link fabric.Canvas#toJSON} - * @param {String|Object} json JSON string or object - * @param {Function} callback Callback, invoked when json is parsed - * and corresponding objects (e.g: {@link fabric.Image}) - * are initialized - * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created. - * @return {fabric.Canvas} instance - * @chainable - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} - * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} - * @example loadFromJSON - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas)); - * @example loadFromJSON with reviver - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) { - * // `o` = json object - * // `object` = fabric.Object instance - * // ... do some stuff ... - * }); - */ - loadFromJSON: function (json, callback, reviver) { - if (!json) { - return; - } - - // serialize if it wasn't already - var serialized = (typeof json === 'string') - ? JSON.parse(json) - : fabric.util.object.clone(json); - - var _this = this, - clipPath = serialized.clipPath, - renderOnAddRemove = this.renderOnAddRemove; - - this.renderOnAddRemove = false; - - delete serialized.clipPath; - - this._enlivenObjects(serialized.objects, function (enlivenedObjects) { - _this.clear(); - _this._setBgOverlay(serialized, function () { - if (clipPath) { - _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) { - _this.clipPath = enlivenedCanvasClip[0]; - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - }); - } - else { - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - } - }); - }, reviver); - return this; - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Array} restored canvas objects - * @param {Function} cached renderOnAddRemove callback - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) { - var _this = this; - enlivenedObjects.forEach(function(obj, index) { - // we splice the array just in case some custom classes restored from JSON - // will add more object to canvas at canvas init. - _this.insertAt(obj, index); - }); - this.renderOnAddRemove = renderOnAddRemove; - // remove parts i cannot set as options - delete serialized.objects; - delete serialized.backgroundImage; - delete serialized.overlayImage; - delete serialized.background; - delete serialized.overlay; - // this._initOptions does too many things to just - // call it. Normally loading an Object from JSON - // create the Object instance. Here the Canvas is - // already an instance and we are just loading things over it - this._setOptions(serialized); - this.renderAll(); - callback && callback(); - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - _setBgOverlay: function(serialized, callback) { - var loaded = { - backgroundColor: false, - overlayColor: false, - backgroundImage: false, - overlayImage: false - }; - - if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) { - callback && callback(); - return; - } - - var cbIfLoaded = function () { - if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) { - callback && callback(); - } - }; - - this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded); - this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded); - this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded); - this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded); - }, - - /** - * @private - * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor) - * @param {(Object|String)} value Value to set - * @param {Object} loaded Set loaded property to true if property is set - * @param {Object} callback Callback function to invoke after property is set - */ - __setBgOverlay: function(property, value, loaded, callback) { - var _this = this; - - if (!value) { - loaded[property] = true; - callback && callback(); - return; - } - - if (property === 'backgroundImage' || property === 'overlayImage') { - fabric.util.enlivenObjects([value], function(enlivedObject){ - _this[property] = enlivedObject[0]; - loaded[property] = true; - callback && callback(); - }); - } - else { - this['set' + fabric.util.string.capitalize(property, true)](value, function() { - loaded[property] = true; - callback && callback(); - }); - } - }, - - /** - * @private - * @param {Array} objects - * @param {Function} callback - * @param {Function} [reviver] - */ - _enlivenObjects: function (objects, callback, reviver) { - if (!objects || objects.length === 0) { - callback && callback([]); - return; - } - - fabric.util.enlivenObjects(objects, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, null, reviver); - }, - - /** - * @private - * @param {String} format - * @param {Function} callback - */ - _toDataURL: function (format, callback) { - this.clone(function (clone) { - callback(clone.toDataURL(format)); - }); - }, - - /** - * @private - * @param {String} format - * @param {Number} multiplier - * @param {Function} callback - */ - _toDataURLWithMultiplier: function (format, multiplier, callback) { - this.clone(function (clone) { - callback(clone.toDataURLWithMultiplier(format, multiplier)); - }); - }, - - /** - * Clones canvas instance - * @param {Object} [callback] Receives cloned instance as a first argument - * @param {Array} [properties] Array of properties to include in the cloned canvas and children - */ - clone: function (callback, properties) { - var data = JSON.stringify(this.toJSON(properties)); - this.cloneWithoutData(function(clone) { - clone.loadFromJSON(data, function() { - callback && callback(clone); - }); - }); - }, - - /** - * Clones canvas instance without cloning existing data. - * This essentially copies canvas dimensions, clipping properties, etc. - * but leaves data empty (so that you can populate it with your own) - * @param {Object} [callback] Receives cloned instance as a first argument - */ - cloneWithoutData: function(callback) { - var el = fabric.util.createCanvasElement(); - - el.width = this.width; - el.height = this.height; - - var clone = new fabric.Canvas(el); - if (this.backgroundImage) { - clone.setBackgroundImage(this.backgroundImage.src, function() { - clone.renderAll(); - callback && callback(clone); - }); - clone.backgroundImageOpacity = this.backgroundImageOpacity; - clone.backgroundImageStretch = this.backgroundImageStretch; - } - else { - callback && callback(clone); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed, - capitalize = fabric.util.string.capitalize, - degreesToRadians = fabric.util.degreesToRadians, - supportsLineDash = fabric.StaticCanvas.supports('setLineDash'), - objectCaching = !fabric.isLikelyNode, - ALIASING_LIMIT = 2; - - if (fabric.Object) { - return; - } - - /** - * Root object class from which all 2d shape classes inherit from - * @class fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} - * @see {@link fabric.Object#initialize} for constructor definition - * - * @fires added - * @fires removed - * - * @fires selected - * @fires deselected - * @fires modified - * @fires modified - * @fires moved - * @fires scaled - * @fires rotated - * @fires skewed - * - * @fires rotating - * @fires scaling - * @fires moving - * @fires skewing - * - * @fires mousedown - * @fires mouseup - * @fires mouseover - * @fires mouseout - * @fires mousewheel - * @fires mousedblclick - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop - */ - fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ { - - /** - * Type of an object (rect, circle, path, etc.). - * Note that this property is meant to be read-only and not meant to be modified. - * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly. - * @type String - * @default - */ - type: 'object', - - /** - * Horizontal origin of transformation of an object (one of "left", "right", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originX: 'left', - - /** - * Vertical origin of transformation of an object (one of "top", "bottom", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originY: 'top', - - /** - * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom} - * @type Number - * @default - */ - top: 0, - - /** - * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right} - * @type Number - * @default - */ - left: 0, - - /** - * Object width - * @type Number - * @default - */ - width: 0, - - /** - * Object height - * @type Number - * @default - */ - height: 0, - - /** - * Object scale factor (horizontal) - * @type Number - * @default - */ - scaleX: 1, - - /** - * Object scale factor (vertical) - * @type Number - * @default - */ - scaleY: 1, - - /** - * When true, an object is rendered as flipped horizontally - * @type Boolean - * @default - */ - flipX: false, - - /** - * When true, an object is rendered as flipped vertically - * @type Boolean - * @default - */ - flipY: false, - - /** - * Opacity of an object - * @type Number - * @default - */ - opacity: 1, - - /** - * Angle of rotation of an object (in degrees) - * @type Number - * @default - */ - angle: 0, - - /** - * Angle of skew on x axes of an object (in degrees) - * @type Number - * @default - */ - skewX: 0, - - /** - * Angle of skew on y axes of an object (in degrees) - * @type Number - * @default - */ - skewY: 0, - - /** - * Size of object's controlling corners (in pixels) - * @type Number - * @default - */ - cornerSize: 13, - - /** - * Size of object's controlling corners when touch interaction is detected - * @type Number - * @default - */ - touchCornerSize: 24, - - /** - * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill) - * @type Boolean - * @default - */ - transparentCorners: true, - - /** - * Default cursor value used when hovering over this object on canvas - * @type String - * @default - */ - hoverCursor: null, - - /** - * Default cursor value used when moving this object on canvas - * @type String - * @default - */ - moveCursor: null, - - /** - * Padding between object and its controlling borders (in pixels) - * @type Number - * @default - */ - padding: 0, - - /** - * Color of controlling borders of an object (when it's active) - * @type String - * @default - */ - borderColor: 'rgb(178,204,255)', - - /** - * Array specifying dash pattern of an object's borders (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - borderDashArray: null, - - /** - * Color of controlling corners of an object (when it's active) - * @type String - * @default - */ - cornerColor: 'rgb(178,204,255)', - - /** - * Color of controlling corners of an object (when it's active and transparentCorners false) - * @since 1.6.2 - * @type String - * @default - */ - cornerStrokeColor: null, - - /** - * Specify style of control, 'rect' or 'circle' - * @since 1.6.2 - * @type String - */ - cornerStyle: 'rect', - - /** - * Array specifying dash pattern of an object's control (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - cornerDashArray: null, - - /** - * When true, this object will use center point as the origin of transformation - * when being scaled via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, this object will use center point as the origin of transformation - * when being rotated via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: true, - - /** - * Color of object's fill - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - fill: 'rgb(0,0,0)', - - /** - * Fill rule used to fill an object - * accepted values are nonzero, evenodd - * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead) - * @type String - * @default - */ - fillRule: 'nonzero', - - /** - * Composite rule used for canvas globalCompositeOperation - * @type String - * @default - */ - globalCompositeOperation: 'source-over', - - /** - * Background color of an object. - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - backgroundColor: '', - - /** - * Selection Background color of an object. colored layer behind the object when it is active. - * does not mix good with globalCompositeOperation methods. - * @type String - * @default - */ - selectionBackgroundColor: '', - - /** - * When defined, an object is rendered via stroke and this property specifies its color - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - stroke: null, - - /** - * Width of a stroke used to render this object - * @type Number - * @default - */ - strokeWidth: 1, - - /** - * Array specifying dash pattern of an object's stroke (stroke must be defined) - * @type Array - */ - strokeDashArray: null, - - /** - * Line offset of an object's stroke - * @type Number - * @default - */ - strokeDashOffset: 0, - - /** - * Line endings style of an object's stroke (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'butt', - - /** - * Corner style of an object's stroke (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'miter', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of an object's stroke - * @type Number - * @default - */ - strokeMiterLimit: 4, - - /** - * Shadow object representing shadow of this shape - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Opacity of object's controlling borders when object is active and moving - * @type Number - * @default - */ - borderOpacityWhenMoving: 0.4, - - /** - * Scale factor of object's controlling borders - * bigger number will make a thicker border - * border is 1, so this is basically a border thickness - * since there is no way to change the border itself. - * @type Number - * @default - */ - borderScaleFactor: 1, - - /** - * Minimum allowed scale value of an object - * @type Number - * @default - */ - minScaleLimit: 0, - - /** - * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection). - * But events still fire on it. - * @type Boolean - * @default - */ - selectable: true, - - /** - * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4 - * @type Boolean - * @default - */ - evented: true, - - /** - * When set to `false`, an object is not rendered on canvas - * @type Boolean - * @default - */ - visible: true, - - /** - * When set to `false`, object's controls are not displayed and can not be used to manipulate object - * @type Boolean - * @default - */ - hasControls: true, - - /** - * When set to `false`, object's controlling borders are not rendered - * @type Boolean - * @default - */ - hasBorders: true, - - /** - * When set to `true`, objects are "found" on canvas on per-pixel basis rather than according to bounding box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * When `false`, default object's values are not included in its serialization - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * When `true`, object horizontal movement is locked - * @type Boolean - * @default - */ - lockMovementX: false, - - /** - * When `true`, object vertical movement is locked - * @type Boolean - * @default - */ - lockMovementY: false, - - /** - * When `true`, object rotation is locked - * @type Boolean - * @default - */ - lockRotation: false, - - /** - * When `true`, object horizontal scaling is locked - * @type Boolean - * @default - */ - lockScalingX: false, - - /** - * When `true`, object vertical scaling is locked - * @type Boolean - * @default - */ - lockScalingY: false, - - /** - * When `true`, object horizontal skewing is locked - * @type Boolean - * @default - */ - lockSkewingX: false, - - /** - * When `true`, object vertical skewing is locked - * @type Boolean - * @default - */ - lockSkewingY: false, - - /** - * When `true`, object cannot be flipped by scaling into negative values - * @type Boolean - * @default - */ - lockScalingFlip: false, - - /** - * When `true`, object is not exported in OBJECT/JSON - * @since 1.6.3 - * @type Boolean - * @default - */ - excludeFromExport: false, - - /** - * When `true`, object is cached on an additional canvas. - * When `false`, object is not cached unless necessary ( clipPath ) - * default to true - * @since 1.7.0 - * @type Boolean - * @default true - */ - objectCaching: objectCaching, - - /** - * When `true`, object properties are checked for cache invalidation. In some particular - * situation you may want this to be disabled ( spray brush, very big, groups) - * or if your application does not allow you to modify properties for groups child you want - * to disable it for groups. - * default to false - * since 1.7.0 - * @type Boolean - * @default false - */ - statefullCache: false, - - /** - * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled - * too much and will be redrawn with correct details at the end of scaling. - * this setting is performance and application dependant. - * default to true - * since 1.7.0 - * @type Boolean - * @default true - */ - noScaleCache: true, - - /** - * When `false`, the stoke width will scale with the object. - * When `true`, the stroke will always match the exact pixel size entered for stroke width. - * default to false - * @since 2.6.0 - * @type Boolean - * @default false - * @type Boolean - * @default false - */ - strokeUniform: false, - - /** - * When set to `true`, object's cache will be rerendered next render call. - * since 1.7.0 - * @type Boolean - * @default true - */ - dirty: true, - - /** - * keeps the value of the last hovered corner during mouse move. - * 0 is no corner, or 'mt', 'ml', 'mtr' etc.. - * It should be private, but there is no harm in using it as - * a read-only property. - * @type number|string|any - * @default 0 - */ - __corner: 0, - - /** - * Determines if the fill or the stroke is drawn first (one of "fill" or "stroke") - * @type String - * @default - */ - paintFirst: 'fill', - - /** - * When 'down', object is set to active on mousedown/touchstart - * When 'up', object is set to active on mouseup/touchend - * Experimental. Let's see if this breaks anything before supporting officially - * @private - * since 4.4.0 - * @type String - * @default 'down' - */ - activeOn: 'down', - - /** - * List of properties to consider when checking if state - * of an object is changed (fabric.Object#hasStateChanged) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: ( - 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' + - 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' + - 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' + - 'skewX skewY fillRule paintFirst clipPath strokeUniform' - ).split(' '), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: ( - 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' + - ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath' - ).split(' '), - - /** - * List of properties to consider for animating colors. - * @type Array - */ - colorProperties: ( - 'fill stroke backgroundColor' - ).split(' '), - - /** - * a fabricObject that, without stroke define a clipping area with their shape. filled in black - * the clipPath object gets used when the object has rendered, and the context is placed in the center - * of the object cacheCanvas. - * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center' - * @type fabric.Object - */ - clipPath: undefined, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will make the object clip to the outside of the clipPath - * since 2.4.0 - * @type boolean - * @default false - */ - inverted: false, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will have its top and left relative to canvas, and will - * not be influenced by the object transform. This will make the clipPath relative - * to the canvas, but clipping just a particular object. - * WARNING this is beta, this feature may change or be renamed. - * since 2.4.0 - * @type boolean - * @default false - */ - absolutePositioned: false, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Create a the canvas used to keep the cached copy of the object - * @private - */ - _createCacheCanvas: function() { - this._cacheProperties = {}; - this._cacheCanvas = fabric.util.createCanvasElement(); - this._cacheContext = this._cacheCanvas.getContext('2d'); - this._updateCacheCanvas(); - // if canvas gets created, is empty, so dirty. - this.dirty = true; - }, - - /** - * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal - * and each side do not cross fabric.cacheSideLimit - * those numbers are configurable so that you can get as much detail as you want - * making bargain with performances. - * @param {Object} dims - * @param {Object} dims.width width of canvas - * @param {Object} dims.height height of canvas - * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _limitCacheSize: function(dims) { - var perfLimitSizeTotal = fabric.perfLimitSizeTotal, - width = dims.width, height = dims.height, - max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit; - if (width <= max && height <= max && width * height <= perfLimitSizeTotal) { - if (width < min) { - dims.width = min; - } - if (height < min) { - dims.height = min; - } - return dims; - } - var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal), - capValue = fabric.util.capValue, - x = capValue(min, limitedDims.x, max), - y = capValue(min, limitedDims.y, max); - if (width > x) { - dims.zoomX /= width / x; - dims.width = x; - dims.capped = true; - } - if (height > y) { - dims.zoomY /= height / y; - dims.height = y; - dims.capped = true; - } - return dims; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @return {Object}.x width of object to be cached - * @return {Object}.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var objectScale = this.getTotalObjectScaling(), - // caculate dimensions without skewing - dim = this._getTransformedDimensions(0, 0), - neededX = dim.x * objectScale.scaleX / this.scaleX, - neededY = dim.y * objectScale.scaleY / this.scaleY; - return { - // for sure this ALIASING_LIMIT is slightly creating problem - // in situation in which the cache canvas gets an upper limit - // also objectScale contains already scaleX and scaleY - width: neededX + ALIASING_LIMIT, - height: neededY + ALIASING_LIMIT, - zoomX: objectScale.scaleX, - zoomY: objectScale.scaleY, - x: neededX, - y: neededY - }; - }, - - /** - * Update width and height of the canvas for cache - * returns true or false if canvas needed resize. - * @private - * @return {Boolean} true if the canvas has been resized - */ - _updateCacheCanvas: function() { - var targetCanvas = this.canvas; - if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) { - var target = targetCanvas._currentTransform.target, - action = targetCanvas._currentTransform.action; - if (this === target && action.slice && action.slice(0, 5) === 'scale') { - return false; - } - } - var canvas = this._cacheCanvas, - dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - minCacheSize = fabric.minCacheSideLimit, - width = dims.width, height = dims.height, drawingWidth, drawingHeight, - zoomX = dims.zoomX, zoomY = dims.zoomY, - dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight, - zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY, - shouldRedraw = dimensionsChanged || zoomChanged, - additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false; - if (dimensionsChanged) { - var canvasWidth = this._cacheCanvas.width, - canvasHeight = this._cacheCanvas.height, - sizeGrowing = width > canvasWidth || height > canvasHeight, - sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) && - canvasWidth > minCacheSize && canvasHeight > minCacheSize; - shouldResizeCanvas = sizeGrowing || sizeShrinking; - if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) { - additionalWidth = width * 0.1; - additionalHeight = height * 0.1; - } - } - if (shouldRedraw) { - if (shouldResizeCanvas) { - canvas.width = Math.ceil(width + additionalWidth); - canvas.height = Math.ceil(height + additionalHeight); - } - else { - this._cacheContext.setTransform(1, 0, 0, 1, 0, 0); - this._cacheContext.clearRect(0, 0, canvas.width, canvas.height); - } - drawingWidth = dims.x / 2; - drawingHeight = dims.y / 2; - this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth; - this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight; - this.cacheWidth = width; - this.cacheHeight = height; - this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY); - this._cacheContext.scale(zoomX, zoomY); - this.zoomX = zoomX; - this.zoomY = zoomY; - return true; - } - return false; - }, - - /** - * Sets object's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - this._setOptions(options); - this._initGradient(options.fill, 'fill'); - this._initGradient(options.stroke, 'stroke'); - this._initPattern(options.fill, 'fill'); - this._initPattern(options.stroke, 'stroke'); - }, - - /** - * Transforms context when rendering an object - * @param {CanvasRenderingContext2D} ctx Context - */ - transform: function(ctx) { - var needFullTransform = (this.group && !this.group._transformDone) || - (this.group && this.canvas && ctx === this.canvas.contextTop); - var m = this.calcTransformMatrix(!needFullTransform); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - }, - - /** - * Returns an object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - - object = { - type: this.type, - version: fabric.version, - originX: this.originX, - originY: this.originY, - left: toFixed(this.left, NUM_FRACTION_DIGITS), - top: toFixed(this.top, NUM_FRACTION_DIGITS), - width: toFixed(this.width, NUM_FRACTION_DIGITS), - height: toFixed(this.height, NUM_FRACTION_DIGITS), - fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill, - stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke, - strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS), - strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray, - strokeLineCap: this.strokeLineCap, - strokeDashOffset: this.strokeDashOffset, - strokeLineJoin: this.strokeLineJoin, - strokeUniform: this.strokeUniform, - strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS), - scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS), - scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS), - angle: toFixed(this.angle, NUM_FRACTION_DIGITS), - flipX: this.flipX, - flipY: this.flipY, - opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS), - shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow, - visible: this.visible, - backgroundColor: this.backgroundColor, - fillRule: this.fillRule, - paintFirst: this.paintFirst, - globalCompositeOperation: this.globalCompositeOperation, - skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS), - skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS), - }; - - if (this.clipPath) { - object.clipPath = this.clipPath.toObject(propertiesToInclude); - object.clipPath.inverted = this.clipPath.inverted; - object.clipPath.absolutePositioned = this.clipPath.absolutePositioned; - } - - fabric.util.populateWithProperties(this, object, propertiesToInclude); - if (!this.includeDefaultValues) { - object = this._removeDefaultValues(object); - } - - return object; - }, - - /** - * Returns (dataless) object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - // will be overwritten by subclasses - return this.toObject(propertiesToInclude); - }, - - /** - * @private - * @param {Object} object - */ - _removeDefaultValues: function(object) { - var prototype = fabric.util.getKlass(object.type).prototype, - stateProperties = prototype.stateProperties; - stateProperties.forEach(function(prop) { - if (prop === 'left' || prop === 'top') { - return; - } - if (object[prop] === prototype[prop]) { - delete object[prop]; - } - var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' && - Object.prototype.toString.call(prototype[prop]) === '[object Array]'; - - // basically a check for [] === [] - if (isArray && object[prop].length === 0 && prototype[prop].length === 0) { - delete object[prop]; - } - }); - - return object; - }, - - /** - * Returns a string representation of an instance - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Return the object scale factor counting also the group scaling - * @return {Object} object with scaleX and scaleY properties - */ - getObjectScaling: function() { - var options = fabric.util.qrDecompose(this.calcTransformMatrix()); - return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) }; - }, - - /** - * Return the object scale factor counting also the group scaling, zoom and retina - * @return {Object} object with scaleX and scaleY properties - */ - getTotalObjectScaling: function() { - var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY; - if (this.canvas) { - var zoom = this.canvas.getZoom(); - var retina = this.canvas.getRetinaScaling(); - scaleX *= zoom * retina; - scaleY *= zoom * retina; - } - return { scaleX: scaleX, scaleY: scaleY }; - }, - - /** - * Return the object opacity counting also the group property - * @return {Number} - */ - getObjectOpacity: function() { - var opacity = this.opacity; - if (this.group) { - opacity *= this.group.getObjectOpacity(); - } - return opacity; - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Object} thisArg - */ - _set: function(key, value) { - var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'), - isChanged = this[key] !== value, groupNeedsUpdate = false; - - if (shouldConstrainValue) { - value = this._constrainScale(value); - } - if (key === 'scaleX' && value < 0) { - this.flipX = !this.flipX; - value *= -1; - } - else if (key === 'scaleY' && value < 0) { - this.flipY = !this.flipY; - value *= -1; - } - else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) { - value = new fabric.Shadow(value); - } - else if (key === 'dirty' && this.group) { - this.group.set('dirty', value); - } - - this[key] = value; - - if (isChanged) { - groupNeedsUpdate = this.group && this.group.isOnACache(); - if (this.cacheProperties.indexOf(key) > -1) { - this.dirty = true; - groupNeedsUpdate && this.group.set('dirty', true); - } - else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) { - this.group.set('dirty', true); - } - } - return this; - }, - - /** - * This callback function is called by the parent group of an object every - * time a non-delegated property changes on the group. It is passed the key - * and value as parameters. Not adding in this function's signature to avoid - * Travis build error about unused variables. - */ - setOnGroup: function() { - // implemented by sub-classes, as needed. - }, - - /** - * Retrieves viewportTransform from Object's canvas if possible - * @method getViewportTransform - * @memberOf fabric.Object.prototype - * @return {Array} - */ - getViewportTransform: function() { - if (this.canvas && this.canvas.viewportTransform) { - return this.canvas.viewportTransform; - } - return fabric.iMatrix.concat(); - }, - - /* - * @private - * return if the object would be visible in rendering - * @memberOf fabric.Object.prototype - * @return {Boolean} - */ - isNotVisible: function() { - return this.opacity === 0 || - (!this.width && !this.height && this.strokeWidth === 0) || - !this.visible; - }, - - /** - * Renders an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if width/height are zeros or object is not visible - if (this.isNotVisible()) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - ctx.save(); - this._setupCompositeOperation(ctx); - this.drawSelectionBackground(ctx); - this.transform(ctx); - this._setOpacity(ctx); - this._setShadow(ctx, this); - if (this.shouldCache()) { - this.renderCache(); - this.drawCacheOnCanvas(ctx); - } - else { - this._removeCacheCanvas(); - this.dirty = false; - this.drawObject(ctx); - if (this.objectCaching && this.statefullCache) { - this.saveState({ propertySet: 'cacheProperties' }); - } - } - ctx.restore(); - }, - - renderCache: function(options) { - options = options || {}; - if (!this._cacheCanvas) { - this._createCacheCanvas(); - } - if (this.isCacheDirty()) { - this.statefullCache && this.saveState({ propertySet: 'cacheProperties' }); - this.drawObject(this._cacheContext, options.forClipping); - this.dirty = false; - } - }, - - /** - * Remove cacheCanvas and its dimensions from the objects - */ - _removeCacheCanvas: function() { - this._cacheCanvas = null; - this.cacheWidth = 0; - this.cacheHeight = 0; - }, - - /** - * return true if the object will draw a stroke - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when stroke happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the stroke is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasStroke: function() { - return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0; - }, - - /** - * return true if the object will draw a fill - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when fill happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the fill is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasFill: function() { - return this.fill && this.fill !== 'transparent'; - }, - - /** - * When set to `true`, force the object to have its own cache, even if it is inside a group - * it may be needed when your object behave in a particular way on the cache and always needs - * its own isolated canvas to render correctly. - * Created to be overridden - * since 1.7.12 - * @returns Boolean - */ - needsItsOwnCache: function() { - if (this.paintFirst === 'stroke' && - this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') { - return true; - } - if (this.clipPath) { - return true; - } - return false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * Read as: cache if is needed, or if the feature is enabled but we are not already caching. - * @return {Boolean} - */ - shouldCache: function() { - this.ownCaching = this.needsItsOwnCache() || ( - this.objectCaching && - (!this.group || !this.group.isOnACache()) - ); - return this.ownCaching; - }, - - /** - * Check if this object or a child object will cast a shadow - * used by Group.shouldCache to know if child has a shadow recursively - * @return {Boolean} - */ - willDrawShadow: function() { - return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0); - }, - - /** - * Execute the drawing operation for an object clipPath - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawClipPathOnCache: function(ctx) { - var path = this.clipPath; - ctx.save(); - // DEBUG: uncomment this line, comment the following - // ctx.globalAlpha = 0.4 - if (path.inverted) { - ctx.globalCompositeOperation = 'destination-out'; - } - else { - ctx.globalCompositeOperation = 'destination-in'; - } - //ctx.scale(1 / 2, 1 / 2); - if (path.absolutePositioned) { - var m = fabric.util.invertTransform(this.calcTransformMatrix()); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - } - path.transform(ctx); - ctx.scale(1 / path.zoomX, 1 / path.zoomY); - ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY); - ctx.restore(); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx, forClipping) { - var originalFill = this.fill, originalStroke = this.stroke; - if (forClipping) { - this.fill = 'black'; - this.stroke = ''; - this._setClippingProperties(ctx); - } - else { - this._renderBackground(ctx); - } - this._render(ctx); - this._drawClipPath(ctx); - this.fill = originalFill; - this.stroke = originalStroke; - }, - - _drawClipPath: function(ctx) { - var path = this.clipPath; - if (!path) { return; } - // needed to setup a couple of variables - // path canvas gets overridden with this one. - // TODO find a better solution? - path.canvas = this.canvas; - path.shouldCache(); - path._transformDone = true; - path.renderCache({ forClipping: true }); - this.drawClipPathOnCache(ctx); - }, - - /** - * Paint the cached copy of the object on the target context. - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - ctx.scale(1 / this.zoomX, 1 / this.zoomY); - ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY); - }, - - /** - * Check if cache is dirty - * @param {Boolean} skipCanvas skip canvas checks because this object is painted - * on parent canvas. - */ - isCacheDirty: function(skipCanvas) { - if (this.isNotVisible()) { - return false; - } - if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) { - // in this case the context is already cleared. - return true; - } - else { - if (this.dirty || - (this.clipPath && this.clipPath.absolutePositioned) || - (this.statefullCache && this.hasStateChanged('cacheProperties')) - ) { - if (this._cacheCanvas && !skipCanvas) { - var width = this.cacheWidth / this.zoomX; - var height = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-width / 2, -height / 2, width, height); - } - return true; - } - } - return false; - }, - - /** - * Draws a background for the object big as its untransformed dimensions - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderBackground: function(ctx) { - if (!this.backgroundColor) { - return; - } - var dim = this._getNonTransformedDimensions(); - ctx.fillStyle = this.backgroundColor; - - ctx.fillRect( - -dim.x / 2, - -dim.y / 2, - dim.x, - dim.y - ); - // if there is background color no other shadows - // should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setOpacity: function(ctx) { - if (this.group && !this.group._transformDone) { - ctx.globalAlpha = this.getObjectOpacity(); - } - else { - ctx.globalAlpha *= this.opacity; - } - }, - - _setStrokeStyles: function(ctx, decl) { - var stroke = decl.stroke; - if (stroke) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = decl.strokeLineCap; - ctx.lineDashOffset = decl.strokeDashOffset; - ctx.lineJoin = decl.strokeLineJoin; - ctx.miterLimit = decl.strokeMiterLimit; - if (stroke.toLive) { - if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - this._applyPatternForTransformedGradient(ctx, stroke); - } - else { - // is a simple gradient or pattern - ctx.strokeStyle = stroke.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, stroke); - } - } - else { - // is a color - ctx.strokeStyle = decl.stroke; - } - } - }, - - _setFillStyles: function(ctx, decl) { - var fill = decl.fill; - if (fill) { - if (fill.toLive) { - ctx.fillStyle = fill.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, decl.fill); - } - else { - ctx.fillStyle = fill; - } - } - }, - - _setClippingProperties: function(ctx) { - ctx.globalAlpha = 1; - ctx.strokeStyle = 'transparent'; - ctx.fillStyle = '#000000'; - }, - - /** - * @private - * Sets line dash - * @param {CanvasRenderingContext2D} ctx Context to set the dash line on - * @param {Array} dashArray array representing dashes - * @param {Function} alternative function to call if browser does not support lineDash - */ - _setLineDash: function(ctx, dashArray, alternative) { - if (!dashArray || dashArray.length === 0) { - return; - } - // Spec requires the concatenation of two copies the dash list when the number of elements is odd - if (1 & dashArray.length) { - dashArray.push.apply(dashArray, dashArray); - } - if (supportsLineDash) { - ctx.setLineDash(dashArray); - } - else { - alternative && alternative(ctx); - } - }, - - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - */ - _renderControls: function(ctx, styleOverride) { - var vpt = this.getViewportTransform(), - matrix = this.calcTransformMatrix(), - options, drawBorders, drawControls; - styleOverride = styleOverride || { }; - drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders; - drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls; - matrix = fabric.util.multiplyTransformMatrices(vpt, matrix); - options = fabric.util.qrDecompose(matrix); - ctx.save(); - ctx.translate(options.translateX, options.translateY); - ctx.lineWidth = 1 * this.borderScaleFactor; - if (!this.group) { - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - } - if (styleOverride.forActiveSelection) { - ctx.rotate(degreesToRadians(options.angle)); - drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); - } - else { - ctx.rotate(degreesToRadians(this.angle)); - drawBorders && this.drawBorders(ctx, styleOverride); - } - drawControls && this.drawControls(ctx, styleOverride); - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setShadow: function(ctx) { - if (!this.shadow) { - return; - } - - var shadow = this.shadow, canvas = this.canvas, scaling, - multX = (canvas && canvas.viewportTransform[0]) || 1, - multY = (canvas && canvas.viewportTransform[3]) || 1; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - if (canvas && canvas._isRetinaScaling()) { - multX *= fabric.devicePixelRatio; - multY *= fabric.devicePixelRatio; - } - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant * - (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4; - ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX; - ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _removeShadow: function(ctx) { - if (!this.shadow) { - return; - } - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} filler fabric.Pattern or fabric.Gradient - * @return {Object} offset.offsetX offset for text rendering - * @return {Object} offset.offsetY offset for text rendering - */ - _applyPatternGradientTransform: function(ctx, filler) { - if (!filler || !filler.toLive) { - return { offsetX: 0, offsetY: 0 }; - } - var t = filler.gradientTransform || filler.patternTransform; - var offsetX = -this.width / 2 + filler.offsetX || 0, - offsetY = -this.height / 2 + filler.offsetY || 0; - - if (filler.gradientUnits === 'percentage') { - ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY); - } - else { - ctx.transform(1, 0, 0, 1, offsetX, offsetY); - } - if (t) { - ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]); - } - return { offsetX: offsetX, offsetY: offsetY }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderPaintInOrder: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderStroke(ctx); - this._renderFill(ctx); - } - else { - this._renderFill(ctx); - this._renderStroke(ctx); - } - }, - - /** - * @private - * function that actually render something on the context. - * empty here to allow Obects to work on tests to benchmark fabric functionalites - * not related to rendering - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(/* ctx */) { - - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderFill: function(ctx) { - if (!this.fill) { - return; - } - - ctx.save(); - this._setFillStyles(ctx, this); - if (this.fillRule === 'evenodd') { - ctx.fill('evenodd'); - } - else { - ctx.fill(); - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderStroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - if (this.strokeUniform && this.group) { - var scaling = this.getObjectScaling(); - ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY); - } - else if (this.strokeUniform) { - ctx.scale(1 / this.scaleX, 1 / this.scaleY); - } - this._setLineDash(ctx, this.strokeDashArray, this._renderDashedStroke); - this._setStrokeStyles(ctx, this); - ctx.stroke(); - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {fabric.Gradient} filler a fabric gradient instance - */ - _applyPatternForTransformedGradient: function(ctx, filler) { - var dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(), - width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.scale( - dims.zoomX / this.scaleX / retinaScaling, - dims.zoomY / this.scaleY / retinaScaling - ); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fillStyle = filler.toLive(ctx); - pCtx.fill(); - ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2); - ctx.scale( - retinaScaling * this.scaleX / dims.zoomX, - retinaScaling * this.scaleY / dims.zoomY - ); - ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { x: this.left + this.width / 2, y: this.top + this.height / 2 }; - }, - - /** - * This function is an helper for svg import. it decompose the transformMatrix - * and assign properties to object. - * untransformed coordinates - * @private - * @chainable - */ - _assignTransformMatrixProps: function() { - if (this.transformMatrix) { - var options = fabric.util.qrDecompose(this.transformMatrix); - this.flipX = false; - this.flipY = false; - this.set('scaleX', options.scaleX); - this.set('scaleY', options.scaleY); - this.angle = options.angle; - this.skewX = options.skewX; - this.skewY = 0; - } - }, - - /** - * This function is an helper for svg import. it removes the transform matrix - * and set to object properties that fabricjs can handle - * @private - * @param {Object} preserveAspectRatioOptions - * @return {thisArg} - */ - _removeTransformMatrix: function(preserveAspectRatioOptions) { - var center = this._findCenterFromElement(); - if (this.transformMatrix) { - this._assignTransformMatrixProps(); - center = fabric.util.transformPoint(center, this.transformMatrix); - } - this.transformMatrix = null; - if (preserveAspectRatioOptions) { - this.scaleX *= preserveAspectRatioOptions.scaleX; - this.scaleY *= preserveAspectRatioOptions.scaleY; - this.cropX = preserveAspectRatioOptions.cropX; - this.cropY = preserveAspectRatioOptions.cropY; - center.x += preserveAspectRatioOptions.offsetLeft; - center.y += preserveAspectRatioOptions.offsetTop; - this.width = preserveAspectRatioOptions.width; - this.height = preserveAspectRatioOptions.height; - } - this.setPositionByOrigin(center, 'center', 'center'); - }, - - /** - * Clones an instance, using a callback method will work for every object. - * @param {Function} callback Callback is invoked with a clone as a first argument - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - */ - clone: function(callback, propertiesToInclude) { - var objectForm = this.toObject(propertiesToInclude); - if (this.constructor.fromObject) { - this.constructor.fromObject(objectForm, callback); - } - else { - fabric.Object._fromObject('Object', objectForm, callback); - } - }, - - /** - * Creates an instance of fabric.Image out of an object - * makes use of toCanvasElement. - * Once this method was based on toDataUrl and loadImage, so it also had a quality - * and format option. toCanvasElement is faster and produce no loss of quality. - * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it. - * toCanvasElement and then toBlob from the obtained canvas is also a good option. - * This method is sync now, but still support the callback because we did not want to break. - * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback. - * @param {Function} callback callback, invoked with an instance as a first argument - * @param {Object} [options] for clone as image, passed to toDataURL - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {fabric.Object} thisArg - */ - cloneAsImage: function(callback, options) { - var canvasEl = this.toCanvasElement(options); - if (callback) { - callback(new fabric.Image(canvasEl)); - } - return this; - }, - - /** - * Converts an object into a HTMLCanvas element - * @param {Object} options Options object - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object - */ - toCanvasElement: function(options) { - options || (options = { }); - - var utils = fabric.util, origParams = utils.saveObjectTransform(this), - originalGroup = this.group, - originalShadow = this.shadow, abs = Math.abs, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1); - delete this.group; - if (options.withoutTransform) { - utils.resetObjectTransform(this); - } - if (options.withoutShadow) { - this.shadow = null; - } - - var el = fabric.util.createCanvasElement(), - // skip canvas zoom and calculate with setCoords now. - boundingRect = this.getBoundingRect(true, true), - shadow = this.shadow, scaling, - shadowOffset = { x: 0, y: 0 }, shadowBlur, - width, height; - - if (shadow) { - shadowBlur = shadow.blur; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - // consider non scaling shadow. - shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX)); - shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY)); - } - width = boundingRect.width + shadowOffset.x; - height = boundingRect.height + shadowOffset.y; - // if the current width/height is not an integer - // we need to make it so. - el.width = Math.ceil(width); - el.height = Math.ceil(height); - var canvas = new fabric.StaticCanvas(el, { - enableRetinaScaling: false, - renderOnAddRemove: false, - skipOffscreen: false, - }); - if (options.format === 'jpeg') { - canvas.backgroundColor = '#fff'; - } - this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center'); - - var originalCanvas = this.canvas; - canvas.add(this); - var canvasEl = canvas.toCanvasElement(multiplier || 1, options); - this.shadow = originalShadow; - this.set('canvas', originalCanvas); - if (originalGroup) { - this.group = originalGroup; - } - this.set(origParams).setCoords(); - // canvas.dispose will call image.dispose that will nullify the elements - // since this canvas is a simple element for the process, we remove references - // to objects in this way in order to avoid object trashing. - canvas._objects = []; - canvas.dispose(); - canvas = null; - - return canvasEl; - }, - - /** - * Converts an object into a data-url-like string - * @param {Object} options Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - */ - toDataURL: function(options) { - options || (options = { }); - return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1); - }, - - /** - * Returns true if specified type is identical to the type of an instance - * @param {String} type Type to check against - * @return {Boolean} - */ - isType: function(type) { - return this.type === type; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance (is 1 unless subclassed) - */ - complexity: function() { - return 1; - }, - - /** - * Returns a JSON representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON - */ - toJSON: function(propertiesToInclude) { - // delegate, not alias - return this.toObject(propertiesToInclude); - }, - - /** - * Sets "angle" of an instance with centered rotation - * @param {Number} angle Angle value (in degrees) - * @return {fabric.Object} thisArg - * @chainable - */ - rotate: function(angle) { - var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation; - - if (shouldCenterOrigin) { - this._setOriginToCenter(); - } - - this.set('angle', angle); - - if (shouldCenterOrigin) { - this._resetOrigin(); - } - - return this; - }, - - /** - * Centers object horizontally on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerH: function () { - this.canvas && this.canvas.centerObjectH(this); - return this; - }, - - /** - * Centers object horizontally on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterH: function () { - this.canvas && this.canvas.viewportCenterObjectH(this); - return this; - }, - - /** - * Centers object vertically on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerV: function () { - this.canvas && this.canvas.centerObjectV(this); - return this; - }, - - /** - * Centers object vertically on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterV: function () { - this.canvas && this.canvas.viewportCenterObjectV(this); - return this; - }, - - /** - * Centers object vertically and horizontally on canvas to which is was added last - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - center: function () { - this.canvas && this.canvas.centerObject(this); - return this; - }, - - /** - * Centers object on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenter: function () { - this.canvas && this.canvas.viewportCenterObject(this); - return this; - }, - - /** - * Returns coordinates of a pointer relative to an object - * @param {Event} e Event to operate upon - * @param {Object} [pointer] Pointer to operate upon (instead of event) - * @return {Object} Coordinates of a pointer (x, y) - */ - getLocalPointer: function(e, pointer) { - pointer = pointer || this.canvas.getPointer(e); - var pClicked = new fabric.Point(pointer.x, pointer.y), - objectLeftTop = this._getLeftTopCoords(); - if (this.angle) { - pClicked = fabric.util.rotatePoint( - pClicked, objectLeftTop, degreesToRadians(-this.angle)); - } - return { - x: pClicked.x - objectLeftTop.x, - y: pClicked.y - objectLeftTop.y - }; - }, - - /** - * Sets canvas globalCompositeOperation for specific object - * custom composition operation for the particular object can be specified using globalCompositeOperation property - * @param {CanvasRenderingContext2D} ctx Rendering canvas context - */ - _setupCompositeOperation: function (ctx) { - if (this.globalCompositeOperation) { - ctx.globalCompositeOperation = this.globalCompositeOperation; - } - } - }); - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object); - - extend(fabric.Object.prototype, fabric.Observable); - - /** - * Defines the number of fraction digits to use when serializing object values. - * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. - * @static - * @memberOf fabric.Object - * @constant - * @type Number - */ - fabric.Object.NUM_FRACTION_DIGITS = 2; - - fabric.Object._fromObject = function(className, object, callback, extraParam) { - var klass = fabric[className]; - object = clone(object, true); - fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) { - if (typeof patterns[0] !== 'undefined') { - object.fill = patterns[0]; - } - if (typeof patterns[1] !== 'undefined') { - object.stroke = patterns[1]; - } - fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) { - object.clipPath = enlivedProps[0]; - var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); - callback && callback(instance); - }); - }); - }; - - /** - * Unique id used internally when creating SVG elements - * @static - * @memberOf fabric.Object - * @type Number - */ - fabric.Object.__uid = 0; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians, - originXOffset = { - left: -0.5, - center: 0, - right: 0.5 - }, - originYOffset = { - top: -0.5, - center: 0, - bottom: 0.5 - }; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Translates the coordinates from a set of origin to another (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom' - * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) { - var x = point.x, - y = point.y, - offsetX, offsetY, dim; - - if (typeof fromOriginX === 'string') { - fromOriginX = originXOffset[fromOriginX]; - } - else { - fromOriginX -= 0.5; - } - - if (typeof toOriginX === 'string') { - toOriginX = originXOffset[toOriginX]; - } - else { - toOriginX -= 0.5; - } - - offsetX = toOriginX - fromOriginX; - - if (typeof fromOriginY === 'string') { - fromOriginY = originYOffset[fromOriginY]; - } - else { - fromOriginY -= 0.5; - } - - if (typeof toOriginY === 'string') { - toOriginY = originYOffset[toOriginY]; - } - else { - toOriginY -= 0.5; - } - - offsetY = toOriginY - fromOriginY; - - if (offsetX || offsetY) { - dim = this._getTransformedDimensions(); - x = point.x + offsetX * dim.x; - y = point.y + offsetY * dim.y; - } - - return new fabric.Point(x, y); - }, - - /** - * Translates the coordinates from origin to center coordinates (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToCenterPoint: function(point, originX, originY) { - var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center'); - if (this.angle) { - return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Translates the coordinates from center to origin coordinates (based on the object's dimensions) - * @param {fabric.Point} center The point which corresponds to center of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToOriginPoint: function(center, originX, originY) { - var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - if (this.angle) { - return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Returns the real center coordinates of the object - * @return {fabric.Point} - */ - getCenterPoint: function() { - var leftTop = new fabric.Point(this.left, this.top); - return this.translateToCenterPoint(leftTop, this.originX, this.originY); - }, - - /** - * Returns the coordinates of the object based on center coordinates - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @return {fabric.Point} - */ - // getOriginPoint: function(center) { - // return this.translateToOriginPoint(center, this.originX, this.originY); - // }, - - /** - * Returns the coordinates of the object as if it has a different origin - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - getPointByOrigin: function(originX, originY) { - var center = this.getCenterPoint(); - return this.translateToOriginPoint(center, originX, originY); - }, - - /** - * Returns the point in local coordinates - * @param {fabric.Point} point The point relative to the global coordinate system - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - toLocalPoint: function(point, originX, originY) { - var center = this.getCenterPoint(), - p, p2; - - if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) { - p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - } - else { - p = new fabric.Point(this.left, this.top); - } - - p2 = new fabric.Point(point.x, point.y); - if (this.angle) { - p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle)); - } - return p2.subtractEquals(p); - }, - - /** - * Returns the point in global coordinates - * @param {fabric.Point} The point relative to the local coordinate system - * @return {fabric.Point} - */ - // toGlobalPoint: function(point) { - // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top)); - // }, - - /** - * Sets the position of the object taking into consideration the object's origin - * @param {fabric.Point} pos The new position of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {void} - */ - setPositionByOrigin: function(pos, originX, originY) { - var center = this.translateToCenterPoint(pos, originX, originY), - position = this.translateToOriginPoint(center, this.originX, this.originY); - this.set('left', position.x); - this.set('top', position.y); - }, - - /** - * @param {String} to One of 'left', 'center', 'right' - */ - adjustPosition: function(to) { - var angle = degreesToRadians(this.angle), - hypotFull = this.getScaledWidth(), - xFull = fabric.util.cos(angle) * hypotFull, - yFull = fabric.util.sin(angle) * hypotFull, - offsetFrom, offsetTo; - - //TODO: this function does not consider mixed situation like top, center. - if (typeof this.originX === 'string') { - offsetFrom = originXOffset[this.originX]; - } - else { - offsetFrom = this.originX - 0.5; - } - if (typeof to === 'string') { - offsetTo = originXOffset[to]; - } - else { - offsetTo = to - 0.5; - } - this.left += xFull * (offsetTo - offsetFrom); - this.top += yFull * (offsetTo - offsetFrom); - this.setCoords(); - this.originX = to; - }, - - /** - * Sets the origin/position of the object to it's center point - * @private - * @return {void} - */ - _setOriginToCenter: function() { - this._originalOriginX = this.originX; - this._originalOriginY = this.originY; - - var center = this.getCenterPoint(); - - this.originX = 'center'; - this.originY = 'center'; - - this.left = center.x; - this.top = center.y; - }, - - /** - * Resets the origin/position of the object to it's original origin - * @private - * @return {void} - */ - _resetOrigin: function() { - var originPoint = this.translateToOriginPoint( - this.getCenterPoint(), - this._originalOriginX, - this._originalOriginY); - - this.originX = this._originalOriginX; - this.originY = this._originalOriginY; - - this.left = originPoint.x; - this.top = originPoint.y; - - this._originalOriginX = null; - this._originalOriginY = null; - }, - - /** - * @private - */ - _getLeftTopCoords: function() { - return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top'); - }, - }); - -})(); - - -(function() { - - function arrayFromCoords(coords) { - return [ - new fabric.Point(coords.tl.x, coords.tl.y), - new fabric.Point(coords.tr.x, coords.tr.y), - new fabric.Point(coords.br.x, coords.br.y), - new fabric.Point(coords.bl.x, coords.bl.y) - ]; - } - - var util = fabric.util, - degreesToRadians = util.degreesToRadians, - multiplyMatrices = util.multiplyTransformMatrices, - transformPoint = util.transformPoint; - - util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Describe object's corner position in canvas element coordinates. - * properties are depending on control keys and padding the main controls. - * each property is an object with x, y and corner. - * The `corner` property contains in a similar manner the 4 points of the - * interactive area of the corner. - * The coordinates depends from the controls positionHandler and are used - * to draw and locate controls - * @memberOf fabric.Object.prototype - */ - oCoords: null, - - /** - * Describe object's corner position in canvas object absolute coordinates - * properties are tl,tr,bl,br and describe the four main corner. - * each property is an object with x, y, instance of Fabric.Point. - * The coordinates depends from this properties: width, height, scaleX, scaleY - * skewX, skewY, angle, strokeWidth, top, left. - * Those coordinates are useful to understand where an object is. They get updated - * with oCoords but they do not need to be updated when zoom or panning change. - * The coordinates get updated with @method setCoords. - * You can calculate them without updating with @method calcACoords(); - * @memberOf fabric.Object.prototype - */ - aCoords: null, - - /** - * Describe object's corner position in canvas element coordinates. - * includes padding. Used of object detection. - * set and refreshed with setCoords and calcCoords. - * @memberOf fabric.Object.prototype - */ - lineCoords: null, - - /** - * storage for object transform matrix - */ - ownMatrixCache: null, - - /** - * storage for object full transform matrix - */ - matrixCache: null, - - /** - * custom controls interface - * controls are added by default_controls.js - */ - controls: { }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * @param {Boolean} absolute will return aCoords if true or lineCoords - * @return {Object} {tl, tr, br, bl} points - */ - _getCoords: function(absolute, calculate) { - if (calculate) { - return (absolute ? this.calcACoords() : this.calcLineCoords()); - } - if (!this.aCoords || !this.lineCoords) { - this.setCoords(true); - } - return (absolute ? this.aCoords : this.lineCoords); - }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * The coords are returned in an array. - * @return {Array} [tl, tr, br, bl] of points - */ - getCoords: function(absolute, calculate) { - return arrayFromCoords(this._getCoords(absolute, calculate)); - }, - - /** - * Checks if object intersects with an area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with an area formed by 2 points - */ - intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { - var coords = this.getCoords(absolute, calculate), - intersection = fabric.Intersection.intersectPolygonRectangle( - coords, - pointTL, - pointBR - ); - return intersection.status === 'Intersection'; - }, - - /** - * Checks if object intersects with another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with another object - */ - intersectsWithObject: function(other, absolute, calculate) { - var intersection = fabric.Intersection.intersectPolygonPolygon( - this.getCoords(absolute, calculate), - other.getCoords(absolute, calculate) - ); - - return intersection.status === 'Intersection' - || other.isContainedWithinObject(this, absolute, calculate) - || this.isContainedWithinObject(other, absolute, calculate); - }, - - /** - * Checks if object is fully contained within area of another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area of another object - */ - isContainedWithinObject: function(other, absolute, calculate) { - var points = this.getCoords(absolute, calculate), - otherCoords = absolute ? other.aCoords : other.lineCoords, - i = 0, lines = other._getImageLines(otherCoords); - for (; i < 4; i++) { - if (!other.containsPoint(points[i], lines)) { - return false; - } - } - return true; - }, - - /** - * Checks if object is fully contained within area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area formed by 2 points - */ - isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { - var boundingRect = this.getBoundingRect(absolute, calculate); - - return ( - boundingRect.left >= pointTL.x && - boundingRect.left + boundingRect.width <= pointBR.x && - boundingRect.top >= pointTL.y && - boundingRect.top + boundingRect.height <= pointBR.y - ); - }, - - /** - * Checks if point is inside the object - * @param {fabric.Point} point Point to check against - * @param {Object} [lines] object returned from @method _getImageLines - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if point is inside the object - */ - containsPoint: function(point, lines, absolute, calculate) { - var coords = this._getCoords(absolute, calculate), - lines = lines || this._getImageLines(coords), - xPoints = this._findCrossPoints(point, lines); - // if xPoints is odd then point is inside the object - return (xPoints !== 0 && xPoints % 2 === 1); - }, - - /** - * Checks if object is contained within the canvas with current viewportTransform - * the check is done stopping at first point that appears on screen - * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords - * @return {Boolean} true if object is fully or partially contained within canvas - */ - isOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - var points = this.getCoords(true, calculate); - // if some point is on screen, the object is on screen. - if (points.some(function(point) { - return point.x <= pointBR.x && point.x >= pointTL.x && - point.y <= pointBR.y && point.y >= pointTL.y; - })) { - return true; - } - // no points on screen, check intersection with absolute coordinates - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - return this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Checks if the object contains the midpoint between canvas extremities - * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen - * @private - * @param {Fabric.Point} pointTL Top Left point - * @param {Fabric.Point} pointBR Top Right point - * @param {Boolean} calculate use coordinates of current position instead of .oCoords - * @return {Boolean} true if the object contains the point - */ - _containsCenterOfCanvas: function(pointTL, pointBR, calculate) { - // worst case scenario the object is so big that contains the screen - var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 }; - if (this.containsPoint(centerPoint, null, true, calculate)) { - return true; - } - return false; - }, - - /** - * Checks if object is partially contained within the canvas with current viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is partially contained within canvas - */ - isPartiallyOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) { - return (point.x >= pointBR.x || point.x <= pointTL.x) && - (point.y >= pointBR.y || point.y <= pointTL.y); - }); - return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Method that returns an object with the object edges in it, given the coordinates of the corners - * @private - * @param {Object} oCoords Coordinates of the object corners - */ - _getImageLines: function(oCoords) { - - var lines = { - topline: { - o: oCoords.tl, - d: oCoords.tr - }, - rightline: { - o: oCoords.tr, - d: oCoords.br - }, - bottomline: { - o: oCoords.br, - d: oCoords.bl - }, - leftline: { - o: oCoords.bl, - d: oCoords.tl - } - }; - - // // debugging - // if (this.canvas.contextTop) { - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - // } - - return lines; - }, - - /** - * Helper method to determine how many cross points are between the 4 object edges - * and the horizontal line determined by a point on canvas - * @private - * @param {fabric.Point} point Point to check - * @param {Object} lines Coordinates of the object being evaluated - */ - // remove yi, not used but left code here just in case. - _findCrossPoints: function(point, lines) { - var b1, b2, a1, a2, xi, // yi, - xcount = 0, - iLine; - - for (var lineKey in lines) { - iLine = lines[lineKey]; - // optimisation 1: line below point. no cross - if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) { - continue; - } - // optimisation 2: line above point. no cross - if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) { - continue; - } - // optimisation 3: vertical line case - if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) { - xi = iLine.o.x; - // yi = point.y; - } - // calculate the intersection point - else { - b1 = 0; - b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x); - a1 = point.y - b1 * point.x; - a2 = iLine.o.y - b2 * iLine.o.x; - - xi = -(a1 - a2) / (b1 - b2); - // yi = a1 + b1 * xi; - } - // dont count xi < point.x cases - if (xi >= point.x) { - xcount += 1; - } - // optimisation 4: specific for square images - if (xcount === 2) { - break; - } - } - return xcount; - }, - - /** - * Returns coordinates of object's bounding rectangle (left, top, width, height) - * the box is intended as aligned to axis of canvas. - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords - * @return {Object} Object with left, top, width, height properties - */ - getBoundingRect: function(absolute, calculate) { - var coords = this.getCoords(absolute, calculate); - return util.makeBoundingBoxFromPoints(coords); - }, - - /** - * Returns width of an object's bounding box counting transformations - * before 2.0 it was named getWidth(); - * @return {Number} width value - */ - getScaledWidth: function() { - return this._getTransformedDimensions().x; - }, - - /** - * Returns height of an object bounding box counting transformations - * before 2.0 it was named getHeight(); - * @return {Number} height value - */ - getScaledHeight: function() { - return this._getTransformedDimensions().y; - }, - - /** - * Makes sure the scale is valid and modifies it if necessary - * @private - * @param {Number} value - * @return {Number} - */ - _constrainScale: function(value) { - if (Math.abs(value) < this.minScaleLimit) { - if (value < 0) { - return -this.minScaleLimit; - } - else { - return this.minScaleLimit; - } - } - else if (value === 0) { - return 0.0001; - } - return value; - }, - - /** - * Scales an object (equally by x and y) - * @param {Number} value Scale factor - * @return {fabric.Object} thisArg - * @chainable - */ - scale: function(value) { - this._set('scaleX', value); - this._set('scaleY', value); - return this.setCoords(); - }, - - /** - * Scales an object to a given width, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New width value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToWidth: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth(); - return this.scale(value / this.width / boundingRectFactor); - }, - - /** - * Scales an object to a given height, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New height value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToHeight: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight(); - return this.scale(value / this.height / boundingRectFactor); - }, - - /** - * Calculates and returns the .coords of an object. - * unused by the library, only for the end dev. - * @return {Object} Object with tl, tr, br, bl .... - * @chainable - * @deprecated - */ - calcCoords: function(absolute) { - // this is a compatibility function to avoid removing calcCoords now. - if (absolute) { - return this.calcACoords(); - } - return this.calcOCoords(); - }, - - calcLineCoords: function() { - var vpt = this.getViewportTransform(), - padding = this.padding, angle = degreesToRadians(this.angle), - cos = util.cos(angle), sin = util.sin(angle), - cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP, - cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords(); - - var lineCoords = { - tl: transformPoint(aCoords.tl, vpt), - tr: transformPoint(aCoords.tr, vpt), - bl: transformPoint(aCoords.bl, vpt), - br: transformPoint(aCoords.br, vpt), - }; - - if (padding) { - lineCoords.tl.x -= cosPMinusSinP; - lineCoords.tl.y -= cosPSinP; - lineCoords.tr.x += cosPSinP; - lineCoords.tr.y -= cosPMinusSinP; - lineCoords.bl.x -= cosPSinP; - lineCoords.bl.y += cosPMinusSinP; - lineCoords.br.x += cosPMinusSinP; - lineCoords.br.y += cosPSinP; - } - - return lineCoords; - }, - - calcOCoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - vpt = this.getViewportTransform(), - startMatrix = multiplyMatrices(vpt, translateMatrix), - finalMatrix = multiplyMatrices(startMatrix, rotateMatrix), - finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]), - dim = this._calculateCurrentDimensions(), - coords = {}; - this.forEachControl(function(control, key, fabricObject) { - coords[key] = control.positionHandler(dim, finalMatrix, fabricObject); - }); - - // debug code - // var canvas = this.canvas; - // setTimeout(function() { - // canvas.contextTop.clearRect(0, 0, 700, 700); - // canvas.contextTop.fillStyle = 'green'; - // Object.keys(coords).forEach(function(key) { - // var control = coords[key]; - // canvas.contextTop.fillRect(control.x, control.y, 3, 3); - // }); - // }, 50); - return coords; - }, - - calcACoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix), - dim = this._getTransformedDimensions(), - w = dim.x / 2, h = dim.y / 2; - return { - // corners - tl: transformPoint({ x: -w, y: -h }, finalMatrix), - tr: transformPoint({ x: w, y: -h }, finalMatrix), - bl: transformPoint({ x: -w, y: h }, finalMatrix), - br: transformPoint({ x: w, y: h }, finalMatrix) - }; - }, - - /** - * Sets corner and controls position coordinates based on current angle, width and height, left and top. - * oCoords are used to find the corners - * aCoords are used to quickly find an object on the canvas - * lineCoords are used to quickly find object during pointer events. - * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords} - * @param {Boolean} [skipCorners] skip calculation of oCoords. - * @return {fabric.Object} thisArg - * @chainable - */ - setCoords: function(skipCorners) { - this.aCoords = this.calcACoords(); - // in case we are in a group, for how the inner group target check works, - // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer. - this.lineCoords = this.group ? this.aCoords : this.calcLineCoords(); - if (skipCorners) { - return this; - } - // set coordinates of the draggable boxes in the corners used to scale/rotate the image - this.oCoords = this.calcOCoords(); - this._setCornerCoords && this._setCornerCoords(); - return this; - }, - - /** - * calculate rotation matrix of an object - * @return {Array} rotation matrix for the object - */ - _calcRotateMatrix: function() { - return util.calcRotateMatrix(this); - }, - - /** - * calculate the translation matrix for an object transform - * @return {Array} rotation matrix for the object - */ - _calcTranslateMatrix: function() { - var center = this.getCenterPoint(); - return [1, 0, 0, 1, center.x, center.y]; - }, - - transformMatrixKey: function(skipGroup) { - var sep = '_', prefix = ''; - if (!skipGroup && this.group) { - prefix = this.group.transformMatrixKey(skipGroup) + sep; - }; - return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY + - sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY + - sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties. - * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations - * There are some situation in which this is useful to avoid the fake rotation. - * @return {Array} transform matrix for the object - */ - calcTransformMatrix: function(skipGroup) { - var matrix = this.calcOwnMatrix(); - if (skipGroup || !this.group) { - return matrix; - } - var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {}); - if (cache.key === key) { - return cache.value; - } - if (this.group) { - matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix); - } - cache.key = key; - cache.value = matrix; - return matrix; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties, this matrix does not include the group transformation - * @return {Array} transform matrix for the object - */ - calcOwnMatrix: function() { - var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {}); - if (cache.key === key) { - return cache.value; - } - var tMatrix = this._calcTranslateMatrix(), - options = { - angle: this.angle, - translateX: tMatrix[4], - translateY: tMatrix[5], - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: this.skewX, - skewY: this.skewY, - flipX: this.flipX, - flipY: this.flipY, - }; - cache.key = key; - cache.value = util.composeMatrix(options); - return cache.value; - }, - - /* - * Calculate object dimensions from its properties - * @private - * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix - * not including or including flipX, flipY to emulate the flipping boolean - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) { - return util.calcDimensionsMatrix({ - skewX: skewX, - skewY: skewY, - scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1), - scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1) - }); - }, - - /* - * Calculate object dimensions from its properties - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getNonTransformedDimensions: function() { - var strokeWidth = this.strokeWidth, - w = this.width + strokeWidth, - h = this.height + strokeWidth; - return { x: w, y: h }; - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param {Number} skewX, a value to override current skewX - * @param {Number} skewY, a value to override current skewY - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getTransformedDimensions: function(skewX, skewY) { - if (typeof skewX === 'undefined') { - skewX = this.skewX; - } - if (typeof skewY === 'undefined') { - skewY = this.skewY; - } - var dimensions = this._getNonTransformedDimensions(), dimX, dimY, - noSkew = skewX === 0 && skewY === 0; - - if (this.strokeUniform) { - dimX = this.width; - dimY = this.height; - } - else { - dimX = dimensions.x; - dimY = dimensions.y; - } - if (noSkew) { - return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY); - } - var bbox = util.sizeAfterTransform(dimX, dimY, { - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: skewX, - skewY: skewY, - }); - return this._finalizeDimensions(bbox.x, bbox.y); - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param Number width width of the bbox - * @param Number height height of the bbox - * @private - * @return {Object} .x finalized width dimension - * @return {Object} .y finalized height dimension - */ - _finalizeDimensions: function(width, height) { - return this.strokeUniform ? - { x: width + this.strokeWidth, y: height + this.strokeWidth } - : - { x: width, y: height }; - }, - - /* - * Calculate object dimensions for controls box, including padding and canvas zoom. - * and active selection - * private - */ - _calculateCurrentDimensions: function() { - var vpt = this.getViewportTransform(), - dim = this._getTransformedDimensions(), - p = transformPoint(dim, vpt, true); - return p.scalarAdd(2 * this.padding); - }, - }); -})(); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Moves an object to the bottom of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - sendToBack: function() { - if (this.group) { - fabric.StaticCanvas.prototype.sendToBack.call(this.group, this); - } - else if (this.canvas) { - this.canvas.sendToBack(this); - } - return this; - }, - - /** - * Moves an object to the top of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - bringToFront: function() { - if (this.group) { - fabric.StaticCanvas.prototype.bringToFront.call(this.group, this); - } - else if (this.canvas) { - this.canvas.bringToFront(this); - } - return this; - }, - - /** - * Moves an object down in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - sendBackwards: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.sendBackwards(this, intersecting); - } - return this; - }, - - /** - * Moves an object up in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - bringForward: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.bringForward(this, intersecting); - } - return this; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {Number} index New position of object - * @return {fabric.Object} thisArg - * @chainable - */ - moveTo: function(index) { - if (this.group && this.group.type !== 'activeSelection') { - fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index); - } - else if (this.canvas) { - this.canvas.moveTo(this, index); - } - return this; - } -}); - - -/* _TO_SVG_START_ */ -(function() { - function getSvgColorString(prop, value) { - if (!value) { - return prop + ': none; '; - } - else if (value.toLive) { - return prop + ': url(#SVGID_' + value.id + '); '; - } - else { - var color = new fabric.Color(value), - str = prop + ': ' + color.toRgb() + '; ', - opacity = color.getAlpha(); - if (opacity !== 1) { - //change the color in rgb + opacity - str += prop + '-opacity: ' + opacity.toString() + '; '; - } - return str; - } - } - - var toFixed = fabric.util.toFixed; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - - var fillRule = this.fillRule ? this.fillRule : 'nonzero', - strokeWidth = this.strokeWidth ? this.strokeWidth : '0', - strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none', - strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0', - strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt', - strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter', - strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4', - opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1', - visibility = this.visible ? '' : ' visibility: hidden;', - filter = skipShadow ? '' : this.getSvgFilter(), - fill = getSvgColorString('fill', this.fill), - stroke = getSvgColorString('stroke', this.stroke); - - return [ - stroke, - 'stroke-width: ', strokeWidth, '; ', - 'stroke-dasharray: ', strokeDashArray, '; ', - 'stroke-linecap: ', strokeLineCap, '; ', - 'stroke-dashoffset: ', strokeDashOffset, '; ', - 'stroke-linejoin: ', strokeLineJoin, '; ', - 'stroke-miterlimit: ', strokeMiterLimit, '; ', - fill, - 'fill-rule: ', fillRule, '; ', - 'opacity: ', opacity, ';', - filter, - visibility - ].join(''); - }, - - /** - * Returns styles-string for svg-export - * @param {Object} style the object from which to retrieve style properties - * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style. - * @return {String} - */ - getSvgSpanStyles: function(style, useWhiteSpace) { - var term = '; '; - var fontFamily = style.fontFamily ? - 'font-family: ' + (((style.fontFamily.indexOf('\'') === -1 && style.fontFamily.indexOf('"') === -1) ? - '\'' + style.fontFamily + '\'' : style.fontFamily)) + term : ''; - var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '', - fontFamily = fontFamily, - fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '', - fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '', - fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '', - fill = style.fill ? getSvgColorString('fill', style.fill) : '', - stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '', - textDecoration = this.getSvgTextDecoration(style), - deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : ''; - if (textDecoration) { - textDecoration = 'text-decoration: ' + textDecoration + term; - } - - return [ - stroke, - strokeWidth, - fontFamily, - fontSize, - fontStyle, - fontWeight, - textDecoration, - fill, - deltaY, - useWhiteSpace ? 'white-space: pre; ' : '' - ].join(''); - }, - - /** - * Returns text-decoration property for svg-export - * @param {Object} style the object from which to retrieve style properties - * @return {String} - */ - getSvgTextDecoration: function(style) { - return ['overline', 'underline', 'line-through'].filter(function(decoration) { - return style[decoration.replace('-', '')]; - }).join(' '); - }, - - /** - * Returns filter for svg shadow - * @return {String} - */ - getSvgFilter: function() { - return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : ''; - }, - - /** - * Returns id attribute for svg output - * @return {String} - */ - getSvgCommons: function() { - return [ - this.id ? 'id="' + this.id + '" ' : '', - this.clipPath ? 'clip-path="url(#' + this.clipPath.clipPathId + ')" ' : '', - ].join(''); - }, - - /** - * Returns transform-string for svg-export - * @param {Boolean} use the full transform or the single object one. - * @return {String} - */ - getSvgTransform: function(full, additionalTransform) { - var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(), - svgTransform = 'transform="' + fabric.util.matrixToSVG(transform); - return svgTransform + - (additionalTransform || '') + '" '; - }, - - _setSVGBg: function(textBgRects) { - if (this.backgroundColor) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - } - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - return '\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * @private - */ - _createBaseClipPathSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var reviver = options.reviver, - additionalTransform = options.additionalTransform || '', - commonPieces = [ - this.getSvgTransform(true, additionalTransform), - this.getSvgCommons(), - ].join(''), - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'); - objectMarkup[index] = commonPieces; - return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join(''); - }, - - /** - * @private - */ - _createBaseSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var noStyle = options.noStyle, - reviver = options.reviver, - styleInfo = noStyle ? '' : 'style="' + this.getSvgStyles() + '" ', - shadowInfo = options.withShadow ? 'style="' + this.getSvgFilter() + '" ' : '', - clipPath = this.clipPath, - vectorEffect = this.strokeUniform ? 'vector-effect="non-scaling-stroke" ' : '', - absoluteClipPath = clipPath && clipPath.absolutePositioned, - stroke = this.stroke, fill = this.fill, shadow = this.shadow, - commonPieces, markup = [], clipPathMarkup, - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'), - additionalTransform = options.additionalTransform; - if (clipPath) { - clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; - clipPathMarkup = '\n' + - clipPath.toClipPathSVG(reviver) + - '\n'; - } - if (absoluteClipPath) { - markup.push( - '\n' - ); - } - markup.push( - '\n' - ); - commonPieces = [ - styleInfo, - vectorEffect, - noStyle ? '' : this.addPaintOrder(), ' ', - additionalTransform ? 'transform="' + additionalTransform + '" ' : '', - ].join(''); - objectMarkup[index] = commonPieces; - if (fill && fill.toLive) { - markup.push(fill.toSVG(this)); - } - if (stroke && stroke.toLive) { - markup.push(stroke.toSVG(this)); - } - if (shadow) { - markup.push(shadow.toSVG(this)); - } - if (clipPath) { - markup.push(clipPathMarkup); - } - markup.push(objectMarkup.join('')); - markup.push('\n'); - absoluteClipPath && markup.push('\n'); - return reviver ? reviver(markup.join('')) : markup.join(''); - }, - - addPaintOrder: function() { - return this.paintFirst !== 'fill' ? ' paint-order="' + this.paintFirst + '" ' : ''; - } - }); -})(); -/* _TO_SVG_END_ */ - - -(function() { - - var extend = fabric.util.object.extend, - originalSet = 'stateProperties'; - - /* - Depends on `stateProperties` - */ - function saveProps(origin, destination, props) { - var tmpObj = { }, deep = true; - props.forEach(function(prop) { - tmpObj[prop] = origin[prop]; - }); - - extend(origin[destination], tmpObj, deep); - } - - function _isEqual(origValue, currentValue, firstPass) { - if (origValue === currentValue) { - // if the objects are identical, return - return true; - } - else if (Array.isArray(origValue)) { - if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) { - return false; - } - for (var i = 0, len = origValue.length; i < len; i++) { - if (!_isEqual(origValue[i], currentValue[i])) { - return false; - } - } - return true; - } - else if (origValue && typeof origValue === 'object') { - var keys = Object.keys(origValue), key; - if (!currentValue || - typeof currentValue !== 'object' || - (!firstPass && keys.length !== Object.keys(currentValue).length) - ) { - return false; - } - for (var i = 0, len = keys.length; i < len; i++) { - key = keys[i]; - // since clipPath is in the statefull cache list and the clipPath objects - // would be iterated as an object, this would lead to possible infinite recursion - // we do not want to compare those. - if (key === 'canvas' || key === 'group') { - continue; - } - if (!_isEqual(origValue[key], currentValue[key])) { - return false; - } - } - return true; - } - } - - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Returns true if object state (one of its state properties) was changed - * @param {String} [propertySet] optional name for the set of property we want to save - * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called - */ - hasStateChanged: function(propertySet) { - propertySet = propertySet || originalSet; - var dashedPropertySet = '_' + propertySet; - if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) { - return true; - } - return !_isEqual(this[dashedPropertySet], this, true); - }, - - /** - * Saves state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - saveState: function(options) { - var propertySet = options && options.propertySet || originalSet, - destination = '_' + propertySet; - if (!this[destination]) { - return this.setupState(options); - } - saveProps(this, destination, this[propertySet]); - if (options && options.stateProperties) { - saveProps(this, destination, options.stateProperties); - } - return this; - }, - - /** - * Setups state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - setupState: function(options) { - options = options || { }; - var propertySet = options.propertySet || originalSet; - options.propertySet = propertySet; - this['_' + propertySet] = { }; - this.saveState(options); - return this; - } - }); -})(); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Determines which corner has been clicked - * @private - * @param {Object} pointer The pointer indicating the mouse position - * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found - */ - _findTargetCorner: function(pointer, forTouch) { - // objects in group, anykind, are not self modificable, - // must not return an hovered corner. - if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) { - return false; - } - - var ex = pointer.x, - ey = pointer.y, - xPoints, - lines, keys = Object.keys(this.oCoords), - j = keys.length - 1, i; - this.__corner = 0; - - // cycle in reverse order so we pick first the one on top - for (; j >= 0; j--) { - i = keys[j]; - if (!this.isControlVisible(i)) { - continue; - } - - lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner); - // // debugging - // - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - - xPoints = this._findCrossPoints({ x: ex, y: ey }, lines); - if (xPoints !== 0 && xPoints % 2 === 1) { - this.__corner = i; - return i; - } - } - return false; - }, - - /** - * Calls a function for each control. The function gets called, - * with the control, the object that is calling the iterator and the control's key - * @param {Function} fn function to iterate over the controls over - */ - forEachControl: function(fn) { - for (var i in this.controls) { - fn(this.controls[i], i, this); - }; - }, - - /** - * Sets the coordinates of the draggable boxes in the corners of - * the image used to scale/rotate it. - * note: if we would switch to ROUND corner area, all of this would disappear. - * everything would resolve to a single point and a pythagorean theorem for the distance - * @private - */ - _setCornerCoords: function() { - var coords = this.oCoords; - - for (var control in coords) { - var controlObject = this.controls[control]; - coords[control].corner = controlObject.calcCornerCoords( - this.angle, this.cornerSize, coords[control].x, coords[control].y, false); - coords[control].touchCorner = controlObject.calcCornerCoords( - this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true); - } - }, - - /** - * Draws a colored layer behind the object, inside its selection borders. - * Requires public options: padding, selectionBackgroundColor - * this function is called when the context is transformed - * has checks to be skipped when the object is on a staticCanvas - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @return {fabric.Object} thisArg - * @chainable - */ - drawSelectionBackground: function(ctx) { - if (!this.selectionBackgroundColor || - (this.canvas && !this.canvas.interactive) || - (this.canvas && this.canvas._activeObject !== this) - ) { - return this; - } - ctx.save(); - var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(), - vpt = this.canvas.viewportTransform; - ctx.translate(center.x, center.y); - ctx.scale(1 / vpt[0], 1 / vpt[3]); - ctx.rotate(degreesToRadians(this.angle)); - ctx.fillStyle = this.selectionBackgroundColor; - ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y); - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBorders: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - var wh = this._calculateCurrentDimensions(), - strokeWidth = this.borderScaleFactor, - width = wh.x + strokeWidth, - height = wh.y + strokeWidth, - hasControls = typeof styleOverride.hasControls !== 'undefined' ? - styleOverride.hasControls : this.hasControls, - shouldStroke = false; - - ctx.save(); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null); - - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - if (hasControls) { - ctx.beginPath(); - this.forEachControl(function(control, key, fabricObject) { - // in this moment, the ctx is centered on the object. - // width and height of the above function are the size of the bbox. - if (control.withConnection && control.getVisibility(fabricObject, key)) { - // reset movement for each control - shouldStroke = true; - ctx.moveTo(control.x * width, control.y * height); - ctx.lineTo( - control.x * width + control.offsetX, - control.y * height + control.offsetY - ); - } - }); - if (shouldStroke) { - ctx.stroke(); - } - } - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box when it is inside a group. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {object} options object representing current object parameters - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBordersInGroup: function(ctx, options, styleOverride) { - styleOverride = styleOverride || {}; - var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options), - strokeWidth = this.strokeWidth, - strokeUniform = this.strokeUniform, - borderScaleFactor = this.borderScaleFactor, - width = - bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor, - height = - bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor; - ctx.save(); - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray, null); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - ctx.restore(); - return this; - }, - - /** - * Draws corners of an object's bounding box. - * Requires public properties: width, height - * Requires public options: cornerSize, padding - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawControls: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - ctx.save(); - ctx.setTransform(this.canvas.getRetinaScaling(), 0, 0, this.canvas.getRetinaScaling(), 0, 0); - ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor; - if (!this.transparentCorners) { - ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor; - } - this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray, null); - this.setCoords(); - this.forEachControl(function(control, key, fabricObject) { - if (control.getVisibility(fabricObject, key)) { - control.render(ctx, - fabricObject.oCoords[key].x, - fabricObject.oCoords[key].y, styleOverride, fabricObject); - } - }); - ctx.restore(); - - return this; - }, - - /** - * Returns true if the specified control is visible, false otherwise. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @returns {Boolean} true if the specified control is visible, false otherwise - */ - isControlVisible: function(controlKey) { - return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey); - }, - - /** - * Sets the visibility of the specified control. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @param {Boolean} visible true to set the specified control visible, false otherwise - * @return {fabric.Object} thisArg - * @chainable - */ - setControlVisible: function(controlKey, visible) { - if (!this._controlsVisibility) { - this._controlsVisibility = {}; - } - this._controlsVisibility[controlKey] = visible; - return this; - }, - - /** - * Sets the visibility state of object controls. - * @param {Object} [options] Options object - * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it - * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it - * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it - * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it - * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it - * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it - * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it - * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it - * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it - * @return {fabric.Object} thisArg - * @chainable - */ - setControlsVisibility: function(options) { - options || (options = { }); - - for (var p in options) { - this.setControlVisible(p, options[p]); - } - return this; - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to deselect this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onDeselect: function() { - // implemented by sub-classes, as needed. - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to select this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onSelect: function() { - // implemented by sub-classes, as needed. - } - }); -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Animation duration (in ms) for fx* methods - * @type Number - * @default - */ - FX_DURATION: 500, - - /** - * Centers object horizontally with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxCenterObjectH: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.left, - endValue: this.getCenter().left, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('left', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - - return this; - }, - - /** - * Centers object vertically with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxCenterObjectV: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.top, - endValue: this.getCenter().top, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('top', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - - return this; - }, - - /** - * Same as `fabric.Canvas#remove` but animated - * @param {fabric.Object} object Object to remove - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxRemove: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.opacity, - endValue: 0, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('opacity', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function () { - _this.remove(object); - onComplete(); - } - }); - - return this; - } -}); - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Animates object's properties - * @param {String|Object} property Property to animate (if string) or properties to animate (if object) - * @param {Number|Object} value Value to animate property to (if string was given first) or options object - * @return {fabric.Object} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} - * @chainable - * - * As object — multiple properties - * - * object.animate({ left: ..., top: ... }); - * object.animate({ left: ..., top: ... }, { duration: ... }); - * - * As string — one property - * - * object.animate('left', ...); - * object.animate('left', { duration: ... }); - * - */ - animate: function() { - if (arguments[0] && typeof arguments[0] === 'object') { - var propsToAnimate = [], prop, skipCallbacks; - for (prop in arguments[0]) { - propsToAnimate.push(prop); - } - for (var i = 0, len = propsToAnimate.length; i < len; i++) { - prop = propsToAnimate[i]; - skipCallbacks = i !== len - 1; - this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks); - } - } - else { - this._animate.apply(this, arguments); - } - return this; - }, - - /** - * @private - * @param {String} property Property to animate - * @param {String} to Value to animate to - * @param {Object} [options] Options object - * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked - */ - _animate: function(property, to, options, skipCallbacks) { - var _this = this, propPair; - - to = to.toString(); - - if (!options) { - options = { }; - } - else { - options = fabric.util.object.clone(options); - } - - if (~property.indexOf('.')) { - propPair = property.split('.'); - } - - var propIsColor = - _this.colorProperties.indexOf(property) > -1 || - (propPair && _this.colorProperties.indexOf(propPair[1]) > -1); - - var currentValue = propPair - ? this.get(propPair[0])[propPair[1]] - : this.get(property); - - if (!('from' in options)) { - options.from = currentValue; - } - - if (!propIsColor) { - if (~to.indexOf('=')) { - to = currentValue + parseFloat(to.replace('=', '')); - } - else { - to = parseFloat(to); - } - } - - var _options = { - startValue: options.from, - endValue: to, - byValue: options.by, - easing: options.easing, - duration: options.duration, - abort: options.abort && function () { - return options.abort.call(_this); - }, - onChange: function (value, valueProgress, timeProgress) { - if (propPair) { - _this[propPair[0]][propPair[1]] = value; - } - else { - _this.set(property, value); - } - if (skipCallbacks) { - return; - } - options.onChange && options.onChange(value, valueProgress, timeProgress); - }, - onComplete: function (value, valueProgress, timeProgress) { - if (skipCallbacks) { - return; - } - - _this.setCoords(); - options.onComplete && options.onComplete(value, valueProgress, timeProgress); - } - }; - - if (propIsColor) { - fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options); - } - else { - fabric.util.animate(_options); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 }, - supportsLineDash = fabric.StaticCanvas.supports('setLineDash'); - - if (fabric.Line) { - fabric.warn('fabric.Line is already defined'); - return; - } - - /** - * Line class - * @class fabric.Line - * @extends fabric.Object - * @see {@link fabric.Line#initialize} for constructor definition - */ - fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'line', - - /** - * x value or first line edge - * @type Number - * @default - */ - x1: 0, - - /** - * y value or first line edge - * @type Number - * @default - */ - y1: 0, - - /** - * x value or second line edge - * @type Number - * @default - */ - x2: 0, - - /** - * y value or second line edge - * @type Number - * @default - */ - y2: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'), - - /** - * Constructor - * @param {Array} [points] Array of points - * @param {Object} [options] Options object - * @return {fabric.Line} thisArg - */ - initialize: function(points, options) { - if (!points) { - points = [0, 0, 0, 0]; - } - - this.callSuper('initialize', options); - - this.set('x1', points[0]); - this.set('y1', points[1]); - this.set('x2', points[2]); - this.set('y2', points[3]); - - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Object} [options] Options - */ - _setWidthHeight: function(options) { - options || (options = { }); - - this.width = Math.abs(this.x2 - this.x1); - this.height = Math.abs(this.y2 - this.y1); - - this.left = 'left' in options - ? options.left - : this._getLeftToOriginX(); - - this.top = 'top' in options - ? options.top - : this._getTopToOriginY(); - }, - - /** - * @private - * @param {String} key - * @param {*} value - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - if (typeof coordProps[key] !== 'undefined') { - this._setWidthHeight(); - } - return this; - }, - - /** - * @private - * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line. - */ - _getLeftToOriginX: makeEdgeToOriginGetter( - { // property names - origin: 'originX', - axis1: 'x1', - axis2: 'x2', - dimension: 'width' - }, - { // possible values of origin - nearest: 'left', - center: 'center', - farthest: 'right' - } - ), - - /** - * @private - * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line. - */ - _getTopToOriginY: makeEdgeToOriginGetter( - { // property names - origin: 'originY', - axis1: 'y1', - axis2: 'y2', - dimension: 'height' - }, - { // possible values of origin - nearest: 'top', - center: 'center', - farthest: 'bottom' - } - ), - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - - if (!this.strokeDashArray || this.strokeDashArray && supportsLineDash) { - // move from center (of virtual box) to its left/top corner - // we can't assume x1, y1 is top left and x2, y2 is bottom right - var p = this.calcLinePoints(); - ctx.moveTo(p.x1, p.y1); - ctx.lineTo(p.x2, p.y2); - } - - ctx.lineWidth = this.strokeWidth; - - // TODO: test this - // make sure setting "fill" changes color of a line - // (by copying fillStyle to strokeStyle, since line is stroked, not filled) - var origStrokeStyle = ctx.strokeStyle; - ctx.strokeStyle = this.stroke || ctx.fillStyle; - this.stroke && this._renderStroke(ctx); - ctx.strokeStyle = origStrokeStyle; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - var p = this.calcLinePoints(); - - ctx.beginPath(); - fabric.util.drawDashedLine(ctx, p.x1, p.y1, p.x2, p.y2, this.strokeDashArray); - ctx.closePath(); - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { - x: (this.x1 + this.x2) / 2, - y: (this.y1 + this.y2) / 2, - }; - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints()); - }, - - /* - * Calculate object dimensions from its properties - * @private - */ - _getNonTransformedDimensions: function() { - var dim = this.callSuper('_getNonTransformedDimensions'); - if (this.strokeLineCap === 'butt') { - if (this.width === 0) { - dim.y -= this.strokeWidth; - } - if (this.height === 0) { - dim.x -= this.strokeWidth; - } - } - return dim; - }, - - /** - * Recalculates line points given width and height - * @private - */ - calcLinePoints: function() { - var xMult = this.x1 <= this.x2 ? -1 : 1, - yMult = this.y1 <= this.y2 ? -1 : 1, - x1 = (xMult * this.width * 0.5), - y1 = (yMult * this.height * 0.5), - x2 = (xMult * this.width * -0.5), - y2 = (yMult * this.height * -0.5); - - return { - x1: x1, - x2: x2, - y1: y1, - y2: y2 - }; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var p = this.calcLinePoints(); - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement}) - * @static - * @memberOf fabric.Line - * @see http://www.w3.org/TR/SVG/shapes.html#LineElement - */ - fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' ')); - - /** - * Returns fabric.Line instance from an SVG element - * @static - * @memberOf fabric.Line - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} [callback] callback function invoked after parsing - */ - fabric.Line.fromElement = function(element, callback, options) { - options = options || { }; - var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES), - points = [ - parsedAttributes.x1 || 0, - parsedAttributes.y1 || 0, - parsedAttributes.x2 || 0, - parsedAttributes.y2 || 0 - ]; - callback(new fabric.Line(points, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Line instance from an object representation - * @static - * @memberOf fabric.Line - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Line.fromObject = function(object, callback) { - function _callback(instance) { - delete instance.points; - callback && callback(instance); - }; - var options = clone(object, true); - options.points = [object.x1, object.y1, object.x2, object.y2]; - fabric.Object._fromObject('Line', options, _callback, 'points'); - }; - - /** - * Produces a function that calculates distance from canvas edge to Line origin. - */ - function makeEdgeToOriginGetter(propertyNames, originValues) { - var origin = propertyNames.origin, - axis1 = propertyNames.axis1, - axis2 = propertyNames.axis2, - dimension = propertyNames.dimension, - nearest = originValues.nearest, - center = originValues.center, - farthest = originValues.farthest; - - return function() { - switch (this.get(origin)) { - case nearest: - return Math.min(this.get(axis1), this.get(axis2)); - case center: - return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension)); - case farthest: - return Math.max(this.get(axis1), this.get(axis2)); - } - }; - - } - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - pi = Math.PI; - - if (fabric.Circle) { - fabric.warn('fabric.Circle is already defined.'); - return; - } - - /** - * Circle class - * @class fabric.Circle - * @extends fabric.Object - * @see {@link fabric.Circle#initialize} for constructor definition - */ - fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'circle', - - /** - * Radius of this circle - * @type Number - * @default - */ - radius: 0, - - /** - * Start angle of the circle, moving clockwise - * deprecated type, this should be in degree, this was an oversight. - * probably will change to degrees in next major version - * @type Number - * @default 0 - */ - startAngle: 0, - - /** - * End angle of the circle - * deprecated type, this should be in degree, this was an oversight. - * probably will change to degrees in next major version - * @type Number - * @default 2Pi - */ - endAngle: pi * 2, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'), - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Circle} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - - if (key === 'radius') { - this.setRadius(value); - } - - return this; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString, x = 0, y = 0, - angle = (this.endAngle - this.startAngle) % ( 2 * pi); - - if (angle === 0) { - svgString = [ - '\n' - ]; - } - else { - var startX = fabric.util.cos(this.startAngle) * this.radius, - startY = fabric.util.sin(this.startAngle) * this.radius, - endX = fabric.util.cos(this.endAngle) * this.radius, - endY = fabric.util.sin(this.endAngle) * this.radius, - largeFlag = angle > pi ? '1' : '0'; - svgString = [ - '\n' - ]; - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.arc( - 0, - 0, - this.radius, - this.startAngle, - this.endAngle, false); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusX: function() { - return this.get('radius') * this.get('scaleX'); - }, - - /** - * Returns vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusY: function() { - return this.get('radius') * this.get('scaleY'); - }, - - /** - * Sets radius of an object (and updates width accordingly) - * @return {fabric.Circle} thisArg - */ - setRadius: function(value) { - this.radius = value; - return this.set('width', value * 2).set('height', value * 2); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement}) - * @static - * @memberOf fabric.Circle - * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement - */ - fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' ')); - - /** - * Returns {@link fabric.Circle} instance from an SVG element - * @static - * @memberOf fabric.Circle - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @param {Object} [options] Options object - * @throws {Error} If value of `r` attribute is missing or invalid - */ - fabric.Circle.fromElement = function(element, callback) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); - - if (!isValidRadius(parsedAttributes)) { - throw new Error('value of `r` attribute is required and can not be negative'); - } - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius; - callback(new fabric.Circle(parsedAttributes)); - }; - - /** - * @private - */ - function isValidRadius(attributes) { - return (('radius' in attributes) && (attributes.radius >= 0)); - } - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Circle} instance from an object representation - * @static - * @memberOf fabric.Circle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {Object} Instance of fabric.Circle - */ - fabric.Circle.fromObject = function(object, callback) { - return fabric.Object._fromObject('Circle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Triangle) { - fabric.warn('fabric.Triangle is already defined'); - return; - } - - /** - * Triangle class - * @class fabric.Triangle - * @extends fabric.Object - * @return {fabric.Triangle} thisArg - * @see {@link fabric.Triangle#initialize} for constructor definition - */ - fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'triangle', - - /** - * Width is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - width: 100, - - /** - * Height is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - height: 100, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2; - - ctx.beginPath(); - ctx.moveTo(-widthBy2, heightBy2); - ctx.lineTo(0, -heightBy2); - ctx.lineTo(widthBy2, heightBy2); - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2; - - ctx.beginPath(); - fabric.util.drawDashedLine(ctx, -widthBy2, heightBy2, 0, -heightBy2, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, 0, -heightBy2, widthBy2, heightBy2, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, widthBy2, heightBy2, -widthBy2, heightBy2, this.strokeDashArray); - ctx.closePath(); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2, - points = [ - -widthBy2 + ' ' + heightBy2, - '0 ' + -heightBy2, - widthBy2 + ' ' + heightBy2 - ].join(','); - return [ - '' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Triangle} instance from an object representation - * @static - * @memberOf fabric.Triangle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Triangle.fromObject = function(object, callback) { - return fabric.Object._fromObject('Triangle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - piBy2 = Math.PI * 2; - - if (fabric.Ellipse) { - fabric.warn('fabric.Ellipse is already defined.'); - return; - } - - /** - * Ellipse class - * @class fabric.Ellipse - * @extends fabric.Object - * @return {fabric.Ellipse} thisArg - * @see {@link fabric.Ellipse#initialize} for constructor definition - */ - fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'ellipse', - - /** - * Horizontal radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {fabric.Ellipse} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this.set('rx', options && options.rx || 0); - this.set('ry', options && options.ry || 0); - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Ellipse} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - switch (key) { - - case 'rx': - this.rx = value; - this.set('width', value * 2); - break; - - case 'ry': - this.ry = value; - this.set('height', value * 2); - break; - - } - return this; - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRx: function() { - return this.get('rx') * this.get('scaleX'); - }, - - /** - * Returns Vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRy: function() { - return this.get('ry') * this.get('scaleY'); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.save(); - ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0); - ctx.arc( - 0, - 0, - this.rx, - 0, - piBy2, - false); - ctx.restore(); - this._renderPaintInOrder(ctx); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement}) - * @static - * @memberOf fabric.Ellipse - * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement - */ - fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' ')); - - /** - * Returns {@link fabric.Ellipse} instance from an SVG element - * @static - * @memberOf fabric.Ellipse - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @return {fabric.Ellipse} - */ - fabric.Ellipse.fromElement = function(element, callback) { - - var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES); - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry; - callback(new fabric.Ellipse(parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Ellipse} instance from an object representation - * @static - * @memberOf fabric.Ellipse - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {fabric.Ellipse} - */ - fabric.Ellipse.fromObject = function(object, callback) { - return fabric.Object._fromObject('Ellipse', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend; - - if (fabric.Rect) { - fabric.warn('fabric.Rect is already defined'); - return; - } - - /** - * Rectangle class - * @class fabric.Rect - * @extends fabric.Object - * @return {fabric.Rect} thisArg - * @see {@link fabric.Rect#initialize} for constructor definition - */ - fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ { - - /** - * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'), - - /** - * Type of an object - * @type String - * @default - */ - type: 'rect', - - /** - * Horizontal border radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical border radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this._initRxRy(); - }, - - /** - * Initializes rx/ry attributes - * @private - */ - _initRxRy: function() { - if (this.rx && !this.ry) { - this.ry = this.rx; - } - else if (this.ry && !this.rx) { - this.rx = this.ry; - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - - // 1x1 case (used in spray brush) optimization was removed because - // with caching and higher zoom level this makes more damage than help - - var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0, - ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, - w = this.width, - h = this.height, - x = -this.width / 2, - y = -this.height / 2, - isRounded = rx !== 0 || ry !== 0, - /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */ - k = 1 - 0.5522847498; - ctx.beginPath(); - - ctx.moveTo(x + rx, y); - - ctx.lineTo(x + w - rx, y); - isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry); - - ctx.lineTo(x + w, y + h - ry); - isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h); - - ctx.lineTo(x + rx, y + h); - isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry); - - ctx.lineTo(x, y + ry); - isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y); - - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - var x = -this.width / 2, - y = -this.height / 2, - w = this.width, - h = this.height; - - ctx.beginPath(); - fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray); - ctx.closePath(); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var x = -this.width / 2, y = -this.height / 2; - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`) - * @static - * @memberOf fabric.Rect - * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement - */ - fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' ')); - - /** - * Returns {@link fabric.Rect} instance from an SVG element - * @static - * @memberOf fabric.Rect - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Rect.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - options = options || { }; - - var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES); - parsedAttributes.left = parsedAttributes.left || 0; - parsedAttributes.top = parsedAttributes.top || 0; - parsedAttributes.height = parsedAttributes.height || 0; - parsedAttributes.width = parsedAttributes.width || 0; - var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - rect.visible = rect.visible && rect.width > 0 && rect.height > 0; - callback(rect); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Rect} instance from an object representation - * @static - * @memberOf fabric.Rect - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created - */ - fabric.Rect.fromObject = function(object, callback) { - return fabric.Object._fromObject('Rect', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - min = fabric.util.array.min, - max = fabric.util.array.max, - toFixed = fabric.util.toFixed; - - if (fabric.Polyline) { - fabric.warn('fabric.Polyline is already defined'); - return; - } - - /** - * Polyline class - * @class fabric.Polyline - * @extends fabric.Object - * @see {@link fabric.Polyline#initialize} for constructor definition - */ - fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polyline', - - /** - * Points array - * @type Array - * @default - */ - points: null, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'), - - /** - * Constructor - * @param {Array} points Array of points (where each point is an object with x and y) - * @param {Object} [options] Options object - * @return {fabric.Polyline} thisArg - * @example - * var poly = new fabric.Polyline([ - * { x: 10, y: 10 }, - * { x: 50, y: 30 }, - * { x: 40, y: 70 }, - * { x: 60, y: 50 }, - * { x: 100, y: 150 }, - * { x: 40, y: 100 } - * ], { - * stroke: 'red', - * left: 100, - * top: 100 - * }); - */ - initialize: function(points, options) { - options = options || {}; - this.points = points || []; - this.callSuper('initialize', options); - this._setPositionDimensions(options); - }, - - _setPositionDimensions: function(options) { - var calcDim = this._calcDimensions(options), correctLeftTop; - this.width = calcDim.width; - this.height = calcDim.height; - if (!options.fromSVG) { - correctLeftTop = this.translateToGivenOrigin( - { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 }, - 'left', - 'top', - this.originX, - this.originY - ); - } - if (typeof options.left === 'undefined') { - this.left = options.fromSVG ? calcDim.left : correctLeftTop.x; - } - if (typeof options.top === 'undefined') { - this.top = options.fromSVG ? calcDim.top : correctLeftTop.y; - } - this.pathOffset = { - x: calcDim.left + this.width / 2, - y: calcDim.top + this.height / 2 - }; - }, - - /** - * Calculate the polygon min and max point from points array, - * returning an object with left, top, width, height to measure the - * polygon size - * @return {Object} object.left X coordinate of the polygon leftmost point - * @return {Object} object.top Y coordinate of the polygon topmost point - * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point - * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point - * @private - */ - _calcDimensions: function() { - - var points = this.points, - minX = min(points, 'x') || 0, - minY = min(points, 'y') || 0, - maxX = max(points, 'x') || 0, - maxY = max(points, 'y') || 0, - width = (maxX - minX), - height = (maxY - minY); - - return { - left: minX, - top: minY, - width: width, - height: height - }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - points: this.points.concat() - }); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y, - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push( - toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', - toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ' - ); - } - return [ - '<' + this.type + ' ', 'COMMON_PARTS', - 'points="', points.join(''), - '" />\n' - ]; - }, - /* _TO_SVG_END_ */ - - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - commonRender: function(ctx) { - var point, len = this.points.length, - x = this.pathOffset.x, - y = this.pathOffset.y; - - if (!len || isNaN(this.points[len - 1].y)) { - // do not draw if no points or odd points - // NaN comes from parseFloat of a empty string in parser - return false; - } - ctx.beginPath(); - ctx.moveTo(this.points[0].x - x, this.points[0].y - y); - for (var i = 0; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x - x, point.y - y); - } - return true; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - this._renderPaintInOrder(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - var p1, p2; - - ctx.beginPath(); - for (var i = 0, len = this.points.length; i < len; i++) { - p1 = this.points[i]; - p2 = this.points[i + 1] || p1; - fabric.util.drawDashedLine(ctx, p1.x, p1.y, p2.x, p2.y, this.strokeDashArray); - } - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.get('points').length; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement}) - * @static - * @memberOf fabric.Polyline - * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement - */ - fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns fabric.Polyline instance from an SVG element - * @static - * @memberOf fabric.Polyline - * @param {SVGElement} element Element to parser - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polyline.fromElementGenerator = function(_class) { - return function(element, callback, options) { - if (!element) { - return callback(null); - } - options || (options = { }); - - var points = fabric.parsePointsAttribute(element.getAttribute('points')), - parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric[_class](points, extend(parsedAttributes, options))); - }; - }; - - fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline'); - - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polyline instance from an object representation - * @static - * @memberOf fabric.Polyline - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Polyline.fromObject = function(object, callback) { - return fabric.Object._fromObject('Polyline', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Polygon) { - fabric.warn('fabric.Polygon is already defined'); - return; - } - - /** - * Polygon class - * @class fabric.Polygon - * @extends fabric.Polyline - * @see {@link fabric.Polygon#initialize} for constructor definition - */ - fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polygon', - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - ctx.closePath(); - this._renderPaintInOrder(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - this.callSuper('_renderDashedStroke', ctx); - ctx.closePath(); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`) - * @static - * @memberOf fabric.Polygon - * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement - */ - fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns {@link fabric.Polygon} instance from an SVG element - * @static - * @memberOf fabric.Polygon - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon'); - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polygon instance from an object representation - * @static - * @memberOf fabric.Polygon - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Polygon.fromObject = function(object, callback) { - return fabric.Object._fromObject('Polygon', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max, - extend = fabric.util.object.extend, - _toString = Object.prototype.toString, - toFixed = fabric.util.toFixed; - - if (fabric.Path) { - fabric.warn('fabric.Path is already defined'); - return; - } - - /** - * Path class - * @class fabric.Path - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup} - * @see {@link fabric.Path#initialize} for constructor definition - */ - fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'path', - - /** - * Array of path points - * @type Array - * @default - */ - path: null, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'), - - stateProperties: fabric.Object.prototype.stateProperties.concat('path'), - - /** - * Constructor - * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) - * @param {Object} [options] Options object - * @return {fabric.Path} thisArg - */ - initialize: function(path, options) { - options = options || { }; - this.callSuper('initialize', options); - if (!path) { - path = []; - } - - var fromArray = _toString.call(path) === '[object Array]'; - - this.path = fromArray - ? fabric.util.makePathSimpler(path) - - : fabric.util.makePathSimpler( - fabric.util.parsePath(path) - ); - - if (!this.path) { - return; - } - fabric.Polyline.prototype._setPositionDimensions.call(this, options); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _renderPathCommands: function(ctx) { - var current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - controlX = 0, // current control point x - controlY = 0, // current control point y - l = -this.pathOffset.x, - t = -this.pathOffset.y; - - ctx.beginPath(); - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - ctx.lineTo(x + l, y + t); - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - ctx.moveTo(x + l, y + t); - break; - - case 'C': // bezierCurveTo, absolute - x = current[5]; - y = current[6]; - controlX = current[3]; - controlY = current[4]; - ctx.bezierCurveTo( - current[1] + l, - current[2] + t, - controlX + l, - controlY + t, - x + l, - y + t - ); - break; - - case 'Q': // quadraticCurveTo, absolute - ctx.quadraticCurveTo( - current[1] + l, - current[2] + t, - current[3] + l, - current[4] + t - ); - x = current[3]; - y = current[4]; - controlX = current[1]; - controlY = current[2]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - ctx.closePath(); - break; - } - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _render: function(ctx) { - this._renderPathCommands(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns string representation of an instance - * @return {String} string representation of an instance - */ - toString: function() { - return '#'; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - path: this.path.map(function(item) { return item.slice(); }), - }); - }, - - /** - * Returns dataless object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var o = this.toObject(['sourcePath'].concat(propertiesToInclude)); - if (o.sourcePath) { - delete o.path; - } - return o; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var path = this.path.map(function(path) { - return path.join(' '); - }).join(' '); - return [ - '\n' - ]; - }, - - _getOffsetTransform: function() { - var digits = fabric.Object.NUM_FRACTION_DIGITS; - return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' + - toFixed(-this.pathOffset.y, digits) + ')'; - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return '\t' + this._createBaseClipPathSVGMarkup( - this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform } - ); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }); - }, - /* _TO_SVG_END_ */ - - /** - * Returns number representation of an instance complexity - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.path.length; - }, - - /** - * @private - */ - _calcDimensions: function() { - - var aX = [], - aY = [], - current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - bounds; - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - bounds = []; - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - bounds = []; - break; - - case 'C': // bezierCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - x = current[5]; - y = current[6]; - break; - - case 'Q': // quadraticCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[1], - current[2], - current[3], - current[4] - ); - x = current[3]; - y = current[4]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - break; - } - bounds.forEach(function (point) { - aX.push(point.x); - aY.push(point.y); - }); - aX.push(x); - aY.push(y); - } - - var minX = min(aX) || 0, - minY = min(aY) || 0, - maxX = max(aX) || 0, - maxY = max(aY) || 0, - deltaX = maxX - minX, - deltaY = maxY - minY; - - return { - left: minX, - top: minY, - width: deltaX, - height: deltaY - }; - } - }); - - /** - * Creates an instance of fabric.Path from an object - * @static - * @memberOf fabric.Path - * @param {Object} object - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Path.fromObject = function(object, callback) { - if (typeof object.sourcePath === 'string') { - var pathUrl = object.sourcePath; - fabric.loadSVGFromURL(pathUrl, function (elements) { - var path = elements[0]; - path.setOptions(object); - callback && callback(path); - }); - } - else { - fabric.Object._fromObject('Path', object, callback, 'path'); - } - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`) - * @static - * @memberOf fabric.Path - * @see http://www.w3.org/TR/SVG/paths.html#PathElement - */ - fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']); - - /** - * Creates an instance of fabric.Path from an SVG element - * @static - * @memberOf fabric.Path - * @param {SVGElement} element to parse - * @param {Function} callback Callback to invoke when an fabric.Path instance is created - * @param {Object} [options] Options object - * @param {Function} [callback] Options callback invoked after parsing is finished - */ - fabric.Path.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max; - - if (fabric.Group) { - return; - } - - /** - * Group class - * @class fabric.Group - * @extends fabric.Object - * @mixes fabric.Collection - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.Group#initialize} for constructor definition - */ - fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'group', - - /** - * Width of stroke - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets - * @type Boolean - * @default - */ - subTargetCheck: false, - - /** - * Groups are container, do not render anything on theyr own, ence no cache properties - * @type Array - * @default - */ - cacheProperties: [], - - /** - * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still - * available setting this boolean to true. - * @type Boolean - * @since 2.0.0 - * @default - */ - useSetOnGroup: false, - - /** - * Constructor - * @param {Object} objects Group objects - * @param {Object} [options] Options object - * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already. - * @return {Object} thisArg - */ - initialize: function(objects, options, isAlreadyGrouped) { - options = options || {}; - this._objects = []; - // if objects enclosed in a group have been grouped already, - // we cannot change properties of objects. - // Thus we need to set options to group without objects, - isAlreadyGrouped && this.callSuper('initialize', options); - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (!isAlreadyGrouped) { - var center = options && options.centerPoint; - // we want to set origins before calculating the bounding box. - // so that the topleft can be set with that in mind. - // if specific top and left are passed, are overwritten later - // with the callSuper('initialize', options) - if (options.originX !== undefined) { - this.originX = options.originX; - } - if (options.originY !== undefined) { - this.originY = options.originY; - } - // if coming from svg i do not want to calc bounds. - // i assume width and height are passed along options - center || this._calcBounds(); - this._updateObjectsCoords(center); - delete options.centerPoint; - this.callSuper('initialize', options); - } - else { - this._updateObjectsACoords(); - } - - this.setCoords(); - }, - - /** - * @private - */ - _updateObjectsACoords: function() { - var skipControls = true; - for (var i = this._objects.length; i--; ){ - this._objects[i].setCoords(skipControls); - } - }, - - /** - * @private - * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change - */ - _updateObjectsCoords: function(center) { - var center = center || this.getCenterPoint(); - for (var i = this._objects.length; i--; ){ - this._updateObjectCoords(this._objects[i], center); - } - }, - - /** - * @private - * @param {Object} object - * @param {fabric.Point} center, current center of group. - */ - _updateObjectCoords: function(object, center) { - var objectLeft = object.left, - objectTop = object.top, - skipControls = true; - - object.set({ - left: objectLeft - center.x, - top: objectTop - center.y - }); - object.group = this; - object.setCoords(skipControls); - }, - - /** - * Returns string represenation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Adds an object to a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - addWithUpdate: function(object) { - var nested = !!this.group; - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - if (object) { - if (nested) { - // if this group is inside another group, we need to pre transform the object - fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix()); - } - this._objects.push(object); - object.group = this; - object._set('canvas', this.canvas); - } - this._calcBounds(); - this._updateObjectsCoords(); - this.dirty = true; - if (nested) { - this.group.addWithUpdate(); - } - else { - this.setCoords(); - } - return this; - }, - - /** - * Removes an object from a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - removeWithUpdate: function(object) { - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - - this.remove(object); - this._calcBounds(); - this._updateObjectsCoords(); - this.setCoords(); - this.dirty = true; - return this; - }, - - /** - * @private - */ - _onObjectAdded: function(object) { - this.dirty = true; - object.group = this; - object._set('canvas', this.canvas); - }, - - /** - * @private - */ - _onObjectRemoved: function(object) { - this.dirty = true; - delete object.group; - }, - - /** - * @private - */ - _set: function(key, value) { - var i = this._objects.length; - if (this.useSetOnGroup) { - while (i--) { - this._objects[i].setOnGroup(key, value); - } - } - if (key === 'canvas') { - while (i--) { - this._objects[i]._set(key, value); - } - } - fabric.Object.prototype._set.call(this, key, value); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - var _includeDefaultValues = this.includeDefaultValues; - var objsToObject = this._objects.map(function(obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Returns object representation of an instance, in dataless mode. - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var objsToObject, sourcePath = this.sourcePath; - if (sourcePath) { - objsToObject = sourcePath; - } - else { - var _includeDefaultValues = this.includeDefaultValues; - objsToObject = this._objects.map(function(obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toDatalessObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - } - var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Renders instance on a given context - * @param {CanvasRenderingContext2D} ctx context to render instance on - */ - render: function(ctx) { - this._transformDone = true; - this.callSuper('render', ctx); - this._transformDone = false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group is already cached. - * @return {Boolean} - */ - shouldCache: function() { - var ownCache = fabric.Object.prototype.shouldCache.call(this); - if (ownCache) { - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - this.ownCaching = false; - return false; - } - } - } - return ownCache; - }, - - /** - * Check if this object or a child object will cast a shadow - * @return {Boolean} - */ - willDrawShadow: function() { - if (fabric.Object.prototype.willDrawShadow.call(this)) { - return true; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - return true; - } - } - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return this.ownCaching || (this.group && this.group.isOnACache()); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx) { - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i].render(ctx); - } - this._drawClipPath(ctx); - }, - - /** - * Check if cache is dirty - */ - isCacheDirty: function(skipCanvas) { - if (this.callSuper('isCacheDirty', skipCanvas)) { - return true; - } - if (!this.statefullCache) { - return false; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].isCacheDirty(true)) { - if (this._cacheCanvas) { - // if this group has not a cache canvas there is nothing to clean - var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-x / 2, -y / 2, x, y); - } - return true; - } - } - return false; - }, - - /** - * Restores original state of each of group objects (original state is that which was before group was created). - * if the nested boolean is true, the original state will be restored just for the - * first group and not for all the group chain - * @private - * @param {Boolean} nested tell the function to restore object state up to the parent group and not more - * @return {fabric.Group} thisArg - * @chainable - */ - _restoreObjectsState: function() { - var groupMatrix = this.calcOwnMatrix(); - this._objects.forEach(function(object) { - // instead of using _this = this; - fabric.util.addTransformToObject(object, groupMatrix); - delete object.group; - object.setCoords(); - }); - return this; - }, - - /** - * Realises the transform from this group onto the supplied object - * i.e. it tells you what would happen if the supplied object was in - * the group, and then the group was destroyed. It mutates the supplied - * object. - * Warning: this method is not useful anymore, it has been kept to no break the api. - * is not used in the fabricJS codebase - * this method will be reduced to using the utility. - * @private - * @deprecated - * @param {fabric.Object} object - * @param {Array} parentMatrix parent transformation - * @return {fabric.Object} transformedObject - */ - realizeTransform: function(object, parentMatrix) { - fabric.util.addTransformToObject(object, parentMatrix); - return object; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - destroy: function() { - // when group is destroyed objects needs to get a repaint to be eventually - // displayed on canvas. - this._objects.forEach(function(object) { - object.set('dirty', true); - }); - return this._restoreObjectsState(); - }, - - /** - * make a group an active selection, remove the group from canvas - * the group has to be on canvas for this to work. - * @return {fabric.ActiveSelection} thisArg - * @chainable - */ - toActiveSelection: function() { - if (!this.canvas) { - return; - } - var objects = this._objects, canvas = this.canvas; - this._objects = []; - var options = this.toObject(); - delete options.objects; - var activeSelection = new fabric.ActiveSelection([]); - activeSelection.set(options); - activeSelection.type = 'activeSelection'; - canvas.remove(this); - objects.forEach(function(object) { - object.group = activeSelection; - object.dirty = true; - canvas.add(object); - }); - activeSelection.canvas = canvas; - activeSelection._objects = objects; - canvas._activeObject = activeSelection; - activeSelection.setCoords(); - return activeSelection; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - ungroupOnCanvas: function() { - return this._restoreObjectsState(); - }, - - /** - * Sets coordinates of all objects inside group - * @return {fabric.Group} thisArg - * @chainable - */ - setObjectsCoords: function() { - var skipControls = true; - this.forEachObject(function(object) { - object.setCoords(skipControls); - }); - return this; - }, - - /** - * @private - */ - _calcBounds: function(onlyWidthHeight) { - var aX = [], - aY = [], - o, prop, coords, - props = ['tr', 'br', 'bl', 'tl'], - i = 0, iLen = this._objects.length, - j, jLen = props.length; - - for ( ; i < iLen; ++i) { - o = this._objects[i]; - coords = o.calcACoords(); - for (j = 0; j < jLen; j++) { - prop = props[j]; - aX.push(coords[prop].x); - aY.push(coords[prop].y); - } - o.aCoords = coords; - } - - this._getBounds(aX, aY, onlyWidthHeight); - }, - - /** - * @private - */ - _getBounds: function(aX, aY, onlyWidthHeight) { - var minXY = new fabric.Point(min(aX), min(aY)), - maxXY = new fabric.Point(max(aX), max(aY)), - top = minXY.y || 0, left = minXY.x || 0, - width = (maxXY.x - minXY.x) || 0, - height = (maxXY.y - minXY.y) || 0; - this.width = width; - this.height = height; - if (!onlyWidthHeight) { - // the bounding box always finds the topleft most corner. - // whatever is the group origin, we set up here the left/top position. - this.setPositionByOrigin({ x: left, y: top }, 'left', 'top'); - } - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function(reviver) { - var svgString = ['\n']; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t\t', this._objects[i].toSVG(reviver)); - } - svgString.push('\n'); - return svgString; - }, - - /** - * Returns styles-string for svg-export, specific version for group - * @return {String} - */ - getSvgStyles: function() { - var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? - 'opacity: ' + this.opacity + ';' : '', - visibility = this.visible ? '' : ' visibility: hidden;'; - return [ - opacity, - this.getSvgFilter(), - visibility - ].join(''); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var svgString = []; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t', this._objects[i].toClipPathSVG(reviver)); - } - - return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver }); - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Group} instance from an object representation - * @static - * @memberOf fabric.Group - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an group instance is created - */ - fabric.Group.fromObject = function(object, callback) { - var objects = object.objects, - options = fabric.util.object.clone(object, true); - delete options.objects; - if (typeof objects === 'string') { - // it has to be an url or something went wrong. - fabric.loadSVGFromURL(objects, function (elements) { - var group = fabric.util.groupSVGElements(elements, object, objects); - group.set(options); - callback && callback(group); - }); - return; - } - fabric.util.enlivenObjects(objects, function(enlivenedObjects) { - fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) { - var options = fabric.util.object.clone(object, true); - options.clipPath = enlivedClipPath[0]; - delete options.objects; - callback && callback(new fabric.Group(enlivenedObjects, options, true)); - }); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.ActiveSelection) { - return; - } - - /** - * Group class - * @class fabric.ActiveSelection - * @extends fabric.Group - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.ActiveSelection#initialize} for constructor definition - */ - fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'activeSelection', - - /** - * Constructor - * @param {Object} objects ActiveSelection objects - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(objects, options) { - options = options || {}; - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (options.originX) { - this.originX = options.originX; - } - if (options.originY) { - this.originY = options.originY; - } - this._calcBounds(); - this._updateObjectsCoords(); - fabric.Object.prototype.initialize.call(this, options); - this.setCoords(); - }, - - /** - * Change te activeSelection to a normal group, - * High level function that automatically adds it to canvas as - * active object. no events fired. - * @since 2.0.0 - * @return {fabric.Group} - */ - toGroup: function() { - var objects = this._objects.concat(); - this._objects = []; - var options = fabric.Object.prototype.toObject.call(this); - var newGroup = new fabric.Group([]); - delete options.type; - newGroup.set(options); - objects.forEach(function(object) { - object.canvas.remove(object); - object.group = newGroup; - }); - newGroup._objects = objects; - if (!this.canvas) { - return newGroup; - } - var canvas = this.canvas; - canvas.add(newGroup); - canvas._activeObject = newGroup; - newGroup.setCoords(); - return newGroup; - }, - - /** - * If returns true, deselection is cancelled. - * @since 2.0.0 - * @return {Boolean} [cancel] - */ - onDeselect: function() { - this.destroy(); - return false; - }, - - /** - * Returns string representation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * @return {Boolean} - */ - shouldCache: function() { - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return false; - }, - - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - * @param {Object} [childrenOverride] properties to override the children overrides - */ - _renderControls: function(ctx, styleOverride, childrenOverride) { - ctx.save(); - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - this.callSuper('_renderControls', ctx, styleOverride); - childrenOverride = childrenOverride || { }; - if (typeof childrenOverride.hasControls === 'undefined') { - childrenOverride.hasControls = false; - } - childrenOverride.forActiveSelection = true; - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i]._renderControls(ctx, childrenOverride); - } - ctx.restore(); - }, - }); - - /** - * Returns {@link fabric.ActiveSelection} instance from an object representation - * @static - * @memberOf fabric.ActiveSelection - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created - */ - fabric.ActiveSelection.fromObject = function(object, callback) { - fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { - delete object.objects; - callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var extend = fabric.util.object.extend; - - if (!global.fabric) { - global.fabric = { }; - } - - if (global.fabric.Image) { - fabric.warn('fabric.Image is already defined.'); - return; - } - - /** - * Image class - * @class fabric.Image - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} - * @see {@link fabric.Image#initialize} for constructor definition - */ - fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'image', - - /** - * Width of a stroke. - * For image quality a stroke multiple of 2 gives better results. - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`. - * This allows for relative urls as image src. - * @since 2.7.0 - * @type Boolean - * @default - */ - srcFromAttribute: false, - - /** - * private - * contains last value of scaleX to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleX: 1, - - /** - * private - * contains last value of scaleY to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleY: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingX: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingY: 1, - - /** - * minimum scale factor under which any resizeFilter is triggered to resize the image - * 0 will disable the automatic resize. 1 will trigger automatically always. - * number bigger than 1 are not implemented yet. - * @type Number - */ - minimumScaleTrigger: 0.5, - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'), - - /** - * key used to retrieve the texture representing this image - * @since 2.0.0 - * @type String - * @default - */ - cacheKey: '', - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropX: 0, - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropY: 0, - - /** - * Indicates whether this canvas will use image smoothing when painting this image. - * Also influence if the cacheCanvas for this image uses imageSmoothing - * @since 4.0.0-beta.11 - * @type Boolean - * @default - */ - imageSmoothing: true, - - /** - * Constructor - * Image can be initialized with any canvas drawable or a string. - * The string should be a url and will be loaded as an image. - * Canvas and Image element work out of the box, while videos require extra code to work. - * Please check video element events for seeking. - * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element - * @param {Object} [options] Options object - * @param {function} [callback] callback function to call after eventual filters applied. - * @return {fabric.Image} thisArg - */ - initialize: function(element, options) { - options || (options = { }); - this.filters = []; - this.cacheKey = 'texture' + fabric.Object.__uid++; - this.callSuper('initialize', options); - this._initElement(element, options); - }, - - /** - * Returns image element which this instance if based on - * @return {HTMLImageElement} Image element - */ - getElement: function() { - return this._element || {}; - }, - - /** - * Sets image element for this instance to a specified one. - * If filters defined they are applied to new image. - * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. - * @param {HTMLImageElement} element - * @param {Object} [options] Options object - * @return {fabric.Image} thisArg - * @chainable - */ - setElement: function(element, options) { - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._element = element; - this._originalElement = element; - this._initConfig(options); - if (this.filters.length !== 0) { - this.applyFilters(); - } - // resizeFilters work on the already filtered copy. - // we need to apply resizeFilters AFTER normal filters. - // applyResizeFilters is run more often than normal filters - // and is triggered by user interactions rather than dev code - if (this.resizeFilter) { - this.applyResizeFilters(); - } - return this; - }, - - /** - * Delete a single texture if in webgl mode - */ - removeTexture: function(key) { - var backend = fabric.filterBackend; - if (backend && backend.evictCachesForKey) { - backend.evictCachesForKey(key); - } - }, - - /** - * Delete textures, reference to elements and eventually JSDOM cleanup - */ - dispose: function() { - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._cacheContext = undefined; - ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - }, - - /** - * Get the crossOrigin value (of the corresponding image element) - */ - getCrossOrigin: function() { - return this._originalElement && (this._originalElement.crossOrigin || null); - }, - - /** - * Returns original size of an image - * @return {Object} Object with "width" and "height" properties - */ - getOriginalSize: function() { - var element = this.getElement(); - return { - width: element.naturalWidth || element.width, - height: element.naturalHeight || element.height - }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _stroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - var w = this.width / 2, h = this.height / 2; - ctx.beginPath(); - ctx.moveTo(-w, -h); - ctx.lineTo(w, -h); - ctx.lineTo(w, h); - ctx.lineTo(-w, h); - ctx.lineTo(-w, -h); - ctx.closePath(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderDashedStroke: function(ctx) { - var x = -this.width / 2, - y = -this.height / 2, - w = this.width, - h = this.height; - - ctx.save(); - this._setStrokeStyles(ctx, this); - - ctx.beginPath(); - fabric.util.drawDashedLine(ctx, x, y, x + w, y, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x + w, y, x + w, y + h, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x + w, y + h, x, y + h, this.strokeDashArray); - fabric.util.drawDashedLine(ctx, x, y + h, x, y, this.strokeDashArray); - ctx.closePath(); - ctx.restore(); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var filters = []; - - this.filters.forEach(function(filterObj) { - if (filterObj) { - filters.push(filterObj.toObject()); - } - }); - var object = extend( - this.callSuper( - 'toObject', - ['cropX', 'cropY'].concat(propertiesToInclude) - ), { - src: this.getSrc(), - crossOrigin: this.getCrossOrigin(), - filters: filters, - }); - if (this.resizeFilter) { - object.resizeFilter = this.resizeFilter.toObject(); - } - return object; - }, - - /** - * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height. - * @return {Boolean} - */ - hasCrop: function() { - return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString = [], imageMarkup = [], strokeSvg, element = this._element, - x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = ''; - if (!element) { - return []; - } - if (this.hasCrop()) { - var clipPathId = fabric.Object.__uid++; - svgString.push( - '\n', - '\t\n', - '\n' - ); - clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" '; - } - if (!this.imageSmoothing) { - imageRendering = '" image-rendering="optimizeSpeed'; - } - imageMarkup.push('\t\n'); - - if (this.stroke || this.strokeDashArray) { - var origFill = this.fill; - this.fill = null; - strokeSvg = [ - '\t\n' - ]; - this.fill = origFill; - } - if (this.paintFirst !== 'fill') { - svgString = svgString.concat(strokeSvg, imageMarkup); - } - else { - svgString = svgString.concat(imageMarkup, strokeSvg); - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * Returns source of an image - * @param {Boolean} filtered indicates if the src is needed for svg - * @return {String} Source of an image - */ - getSrc: function(filtered) { - var element = filtered ? this._element : this._originalElement; - if (element) { - if (element.toDataURL) { - return element.toDataURL(); - } - - if (this.srcFromAttribute) { - return element.getAttribute('src'); - } - else { - return element.src; - } - } - else { - return this.src || ''; - } - }, - - /** - * Sets source of an image - * @param {String} src Source string (URL) - * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) - * @param {Object} [options] Options object - * @param {String} [options.crossOrigin] crossOrigin value (one of "", "anonymous", "use-credentials") - * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes - * @return {fabric.Image} thisArg - * @chainable - */ - setSrc: function(src, callback, options) { - fabric.util.loadImage(src, function(img, isError) { - this.setElement(img, options); - this._setWidthHeight(); - callback && callback(this, isError); - }, this, options && options.crossOrigin); - return this; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of an instance - */ - toString: function() { - return '#'; - }, - - applyResizeFilters: function() { - var filter = this.resizeFilter, - minimumScale = this.minimumScaleTrigger, - objectScale = this.getTotalObjectScaling(), - scaleX = objectScale.scaleX, - scaleY = objectScale.scaleY, - elementToFilter = this._filteredEl || this._originalElement; - if (this.group) { - this.set('dirty', true); - } - if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) { - this._element = elementToFilter; - this._filterScalingX = 1; - this._filterScalingY = 1; - this._lastScaleX = scaleX; - this._lastScaleY = scaleY; - return; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - var canvasEl = fabric.util.createCanvasElement(), - cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey, - sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height; - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._lastScaleX = filter.scaleX = scaleX; - this._lastScaleY = filter.scaleY = scaleY; - fabric.filterBackend.applyFilters( - [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey); - this._filterScalingX = canvasEl.width / this._originalElement.width; - this._filterScalingY = canvasEl.height / this._originalElement.height; - }, - - /** - * Applies filters assigned to this image (from "filters" array) or from filter param - * @method applyFilters - * @param {Array} filters to be applied - * @param {Boolean} forResizing specify if the filter operation is a resize operation - * @return {thisArg} return the fabric.Image object - * @chainable - */ - applyFilters: function(filters) { - - filters = filters || this.filters || []; - filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); }); - this.set('dirty', true); - - // needs to clear out or WEBGL will not resize correctly - this.removeTexture(this.cacheKey + '_filtered'); - - if (filters.length === 0) { - this._element = this._originalElement; - this._filteredEl = null; - this._filterScalingX = 1; - this._filterScalingY = 1; - return this; - } - - var imgElement = this._originalElement, - sourceWidth = imgElement.naturalWidth || imgElement.width, - sourceHeight = imgElement.naturalHeight || imgElement.height; - - if (this._element === this._originalElement) { - // if the element is the same we need to create a new element - var canvasEl = fabric.util.createCanvasElement(); - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._filteredEl = canvasEl; - } - else { - // clear the existing element to get new filter data - // also dereference the eventual resized _element - this._element = this._filteredEl; - this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight); - // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y - this._lastScaleX = 1; - this._lastScaleY = 1; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - fabric.filterBackend.applyFilters( - filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey); - if (this._originalElement.width !== this._element.width || - this._originalElement.height !== this._element.height) { - this._filterScalingX = this._element.width / this._originalElement.width; - this._filterScalingY = this._element.height / this._originalElement.height; - } - return this; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - if (this.isMoving !== true && this.resizeFilter && this._needsResize()) { - this.applyResizeFilters(); - } - this._stroke(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Paint the cached copy of the object on the target context. - * it will set the imageSmoothing for the draw operation - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx); - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * This is the special image version where we would like to avoid caching where possible. - * Essentially images do not benefit from caching. They may require caching, and in that - * case we do it. Also caching an image usually ends in a loss of details. - * A full performance audit should be done. - * @return {Boolean} - */ - shouldCache: function() { - return this.needsItsOwnCache(); - }, - - _renderFill: function(ctx) { - var elementToDraw = this._element; - if (!elementToDraw) { - return; - } - var scaleX = this._filterScalingX, scaleY = this._filterScalingY, - w = this.width, h = this.height, min = Math.min, max = Math.max, - // crop values cannot be lesser than 0. - cropX = max(this.cropX, 0), cropY = max(this.cropY, 0), - elWidth = elementToDraw.naturalWidth || elementToDraw.width, - elHeight = elementToDraw.naturalHeight || elementToDraw.height, - sX = cropX * scaleX, - sY = cropY * scaleY, - // the width height cannot exceed element width/height, starting from the crop offset. - sW = min(w * scaleX, elWidth - sX), - sH = min(h * scaleY, elHeight - sY), - x = -w / 2, y = -h / 2, - maxDestW = min(w, elWidth / scaleX - cropX), - maxDestH = min(h, elHeight / scaleY - cropY); - - elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH); - }, - - /** - * needed to check if image needs resize - * @private - */ - _needsResize: function() { - var scale = this.getTotalObjectScaling(); - return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY); - }, - - /** - * @private - */ - _resetWidthHeight: function() { - this.set(this.getOriginalSize()); - }, - - /** - * The Image class's initialization method. This method is automatically - * called by the constructor. - * @private - * @param {HTMLImageElement|String} element The element representing the image - * @param {Object} [options] Options object - */ - _initElement: function(element, options) { - this.setElement(fabric.util.getById(element), options); - fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS); - }, - - /** - * @private - * @param {Object} [options] Options object - */ - _initConfig: function(options) { - options || (options = { }); - this.setOptions(options); - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Array} filters to be initialized - * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created - */ - _initFilters: function(filters, callback) { - if (filters && filters.length) { - fabric.util.enlivenObjects(filters, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, 'fabric.Image.filters'); - } - else { - callback && callback(); - } - }, - - /** - * @private - * Set the width and the height of the image object, using the element or the - * options. - * @param {Object} [options] Object with width/height properties - */ - _setWidthHeight: function(options) { - options || (options = { }); - var el = this.getElement(); - this.width = options.width || el.naturalWidth || el.width || 0; - this.height = options.height || el.naturalHeight || el.height || 0; - }, - - /** - * Calculate offset for center and scale factor for the image in order to respect - * the preserveAspectRatio attribute - * @private - * @return {Object} - */ - parsePreserveAspectRatioAttribute: function() { - var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''), - rWidth = this._element.width, rHeight = this._element.height, - scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0, - offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight }; - if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) { - if (pAR.meetOrSlice === 'meet') { - scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes); - offset = (pWidth - rWidth * scaleX) / 2; - if (pAR.alignX === 'Min') { - offsetLeft = -offset; - } - if (pAR.alignX === 'Max') { - offsetLeft = offset; - } - offset = (pHeight - rHeight * scaleY) / 2; - if (pAR.alignY === 'Min') { - offsetTop = -offset; - } - if (pAR.alignY === 'Max') { - offsetTop = offset; - } - } - if (pAR.meetOrSlice === 'slice') { - scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes); - offset = rWidth - pWidth / scaleX; - if (pAR.alignX === 'Mid') { - cropX = offset / 2; - } - if (pAR.alignX === 'Max') { - cropX = offset; - } - offset = rHeight - pHeight / scaleY; - if (pAR.alignY === 'Mid') { - cropY = offset / 2; - } - if (pAR.alignY === 'Max') { - cropY = offset; - } - rWidth = pWidth / scaleX; - rHeight = pHeight / scaleY; - } - } - else { - scaleX = pWidth / rWidth; - scaleY = pHeight / rHeight; - } - return { - width: rWidth, - height: rHeight, - scaleX: scaleX, - scaleY: scaleY, - offsetLeft: offsetLeft, - offsetTop: offsetTop, - cropX: cropX, - cropY: cropY - }; - } - }); - - /** - * Default CSS class name for canvas - * @static - * @type String - * @default - */ - fabric.Image.CSS_CANVAS = 'canvas-img'; - - /** - * Alias for getSrc - * @static - */ - fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc; - - /** - * Creates an instance of fabric.Image from its object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} callback Callback to invoke when an image instance is created - */ - fabric.Image.fromObject = function(_object, callback) { - var object = fabric.util.object.clone(_object); - fabric.util.loadImage(object.src, function(img, isError) { - if (isError) { - callback && callback(null, true); - return; - } - fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) { - object.filters = filters || []; - fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) { - object.resizeFilter = resizeFilters[0]; - fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) { - object.clipPath = enlivedProps[0]; - var image = new fabric.Image(img, object); - callback(image, false); - }); - }); - }); - }, null, object.crossOrigin); - }; - - /** - * Creates an instance of fabric.Image from an URL string - * @static - * @param {String} url URL to create an image from - * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not. - * @param {Object} [imgOptions] Options object - */ - fabric.Image.fromURL = function(url, callback, imgOptions) { - fabric.util.loadImage(url, function(img, isError) { - callback && callback(new fabric.Image(img, imgOptions), isError); - }, null, imgOptions && imgOptions.crossOrigin); - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement}) - * @static - * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} - */ - fabric.Image.ATTRIBUTE_NAMES = - fabric.SHARED_ATTRIBUTES.concat( - 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ') - ); - - /** - * Returns {@link fabric.Image} instance from an SVG element - * @static - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} callback Callback to execute when fabric.Image object is created - * @return {fabric.Image} Instance of fabric.Image - */ - fabric.Image.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); - fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, - extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * @private - * @return {Number} angle value - */ - _getAngleValueForStraighten: function() { - var angle = this.angle % 360; - if (angle > 0) { - return Math.round((angle - 1) / 90) * 90; - } - return Math.round(angle / 90) * 90; - }, - - /** - * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer) - * @return {fabric.Object} thisArg - * @chainable - */ - straighten: function() { - this.rotate(this._getAngleValueForStraighten()); - return this; - }, - - /** - * Same as {@link fabric.Object.prototype.straighten} but with animation - * @param {Object} callbacks Object with callback functions - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Object} thisArg - * @chainable - */ - fxStraighten: function(callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: this.get('angle'), - endValue: this._getAngleValueForStraighten(), - duration: this.FX_DURATION, - onChange: function(value) { - _this.rotate(value); - onChange(); - }, - onComplete: function() { - _this.setCoords(); - onComplete(); - }, - }); - - return this; - } -}); - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Straightens object, then rerenders canvas - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - * @chainable - */ - straightenObject: function (object) { - object.straighten(); - this.requestRenderAll(); - return this; - }, - - /** - * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxStraightenObject: function (object) { - object.fxStraighten({ - onChange: this.requestRenderAllBound - }); - return this; - } -}); - - -(function() { - - 'use strict'; - - /** - * Tests if webgl supports certain precision - * @param {WebGL} Canvas WebGL context to test on - * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp' - * @returns {Boolean} Whether the user's browser WebGL supports given precision. - */ - function testPrecision(gl, precision){ - var fragmentSource = 'precision ' + precision + ' float;\nvoid main(){}'; - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - return false; - } - return true; - } - - /** - * Indicate whether this filtering backend is supported by the user's browser. - * @param {Number} tileSize check if the tileSize is supported - * @returns {Boolean} Whether the user's browser supports WebGL. - */ - fabric.isWebglSupported = function(tileSize) { - if (fabric.isLikelyNode) { - return false; - } - tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize; - var canvas = document.createElement('canvas'); - var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); - var isSupported = false; - // eslint-disable-next-line - if (gl) { - fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - isSupported = fabric.maxTextureSize >= tileSize; - var precisions = ['highp', 'mediump', 'lowp']; - for (var i = 0; i < 3; i++){ - if (testPrecision(gl, precisions[i])){ - fabric.webGlPrecision = precisions[i]; - break; - }; - } - } - this.isSupported = isSupported; - return isSupported; - }; - - fabric.WebglFilterBackend = WebglFilterBackend; - - /** - * WebGL filter backend. - */ - function WebglFilterBackend(options) { - if (options && options.tileSize) { - this.tileSize = options.tileSize; - } - this.setupGLContext(this.tileSize, this.tileSize); - this.captureGPUInfo(); - }; - - WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ { - - tileSize: 2048, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Setup a WebGL context suitable for filtering, and bind any needed event handlers. - */ - setupGLContext: function(width, height) { - this.dispose(); - this.createWebGLCanvas(width, height); - // eslint-disable-next-line - this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]); - this.chooseFastestCopyGLTo2DMethod(width, height); - }, - - /** - * Pick a method to copy data from GL context to 2d canvas. In some browsers using - * putImageData is faster than drawImage for that specific operation. - */ - chooseFastestCopyGLTo2DMethod: function(width, height) { - var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData; - try { - new ImageData(1, 1); - canUseImageData = true; - } - catch (e) { - canUseImageData = false; - } - // eslint-disable-next-line no-undef - var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined'; - // eslint-disable-next-line no-undef - var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined'; - - if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { - return; - } - - var targetCanvas = fabric.util.createCanvasElement(); - // eslint-disable-next-line no-undef - var imageBuffer = new ArrayBuffer(width * height * 4); - if (fabric.forceGLPutImageData) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - return; - } - var testContext = { - imageBuffer: imageBuffer, - destinationWidth: width, - destinationHeight: height, - targetCanvas: targetCanvas - }; - var startTime, drawImageTime, putImageDataTime; - targetCanvas.width = width; - targetCanvas.height = height; - - startTime = window.performance.now(); - copyGLTo2DDrawImage.call(testContext, this.gl, testContext); - drawImageTime = window.performance.now() - startTime; - - startTime = window.performance.now(); - copyGLTo2DPutImageData.call(testContext, this.gl, testContext); - putImageDataTime = window.performance.now() - startTime; - - if (drawImageTime > putImageDataTime) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - } - else { - this.copyGLTo2D = copyGLTo2DDrawImage; - } - }, - - /** - * Create a canvas element and associated WebGL context and attaches them as - * class properties to the GLFilterBackend class. - */ - createWebGLCanvas: function(width, height) { - var canvas = fabric.util.createCanvasElement(); - canvas.width = width; - canvas.height = height; - var glOptions = { - alpha: true, - premultipliedAlpha: false, - depth: false, - stencil: false, - antialias: false - }, - gl = canvas.getContext('webgl', glOptions); - if (!gl) { - gl = canvas.getContext('experimental-webgl', glOptions); - } - if (!gl) { - return; - } - gl.clearColor(0, 0, 0, 0); - // this canvas can fire webglcontextlost and webglcontextrestored - this.canvas = canvas; - this.gl = gl; - }, - - /** - * Attempts to apply the requested filters to the source provided, drawing the filtered output - * to the provided target canvas. - * - * @param {Array} filters The filters to apply. - * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered. - * @param {Number} width The width of the source input. - * @param {Number} height The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - * @param {String|undefined} cacheKey A key used to cache resources related to the source. If - * omitted, caching will be skipped. - */ - applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) { - var gl = this.gl; - var cachedTexture; - if (cacheKey) { - cachedTexture = this.getCachedTexture(cacheKey, source); - } - var pipelineState = { - originalWidth: source.width || source.originalWidth, - originalHeight: source.height || source.originalHeight, - sourceWidth: width, - sourceHeight: height, - destinationWidth: width, - destinationHeight: height, - context: gl, - sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source), - targetTexture: this.createTexture(gl, width, height), - originalTexture: cachedTexture || - this.createTexture(gl, width, height, !cachedTexture && source), - passes: filters.length, - webgl: true, - aPosition: this.aPosition, - programCache: this.programCache, - pass: 0, - filterBackend: this, - targetCanvas: targetCanvas - }; - var tempFbo = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); - filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); - resizeCanvasIfNeeded(pipelineState); - this.copyGLTo2D(gl, pipelineState); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.deleteTexture(pipelineState.sourceTexture); - gl.deleteTexture(pipelineState.targetTexture); - gl.deleteFramebuffer(tempFbo); - targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); - return pipelineState; - }, - - /** - * Detach event listeners, remove references, and clean up caches. - */ - dispose: function() { - if (this.canvas) { - this.canvas = null; - this.gl = null; - } - this.clearWebGLCaches(); - }, - - /** - * Wipe out WebGL-related caches. - */ - clearWebGLCaches: function() { - this.programCache = {}; - this.textureCache = {}; - }, - - /** - * Create a WebGL texture object. - * - * Accepts specific dimensions to initialize the texture to or a source image. - * - * @param {WebGLRenderingContext} gl The GL context to use for creating the texture. - * @param {Number} width The width to initialize the texture at. - * @param {Number} height The height to initialize the texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data. - * @returns {WebGLTexture} - */ - createTexture: function(gl, width, height, textureImageSource) { - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (textureImageSource) { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource); - } - else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - return texture; - }, - - /** - * Can be optionally used to get a texture from the cache array - * - * If an existing texture is not found, a new texture is created and cached. - * - * @param {String} uniqueId A cache key to use to find an existing texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the - * texture cache entry if one does not already exist. - */ - getCachedTexture: function(uniqueId, textureImageSource) { - if (this.textureCache[uniqueId]) { - return this.textureCache[uniqueId]; - } - else { - var texture = this.createTexture( - this.gl, textureImageSource.width, textureImageSource.height, textureImageSource); - this.textureCache[uniqueId] = texture; - return texture; - } - }, - - /** - * Clear out cached resources related to a source image that has been - * filtered previously. - * - * @param {String} cacheKey The cache key provided when the source image was filtered. - */ - evictCachesForKey: function(cacheKey) { - if (this.textureCache[cacheKey]) { - this.gl.deleteTexture(this.textureCache[cacheKey]); - delete this.textureCache[cacheKey]; - } - }, - - copyGLTo2D: copyGLTo2DDrawImage, - - /** - * Attempt to extract GPU information strings from a WebGL context. - * - * Useful information when debugging or blacklisting specific GPUs. - * - * @returns {Object} A GPU info object with renderer and vendor strings. - */ - captureGPUInfo: function() { - if (this.gpuInfo) { - return this.gpuInfo; - } - var gl = this.gl, gpuInfo = { renderer: '', vendor: '' }; - if (!gl) { - return gpuInfo; - } - var ext = gl.getExtension('WEBGL_debug_renderer_info'); - if (ext) { - var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); - var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); - if (renderer) { - gpuInfo.renderer = renderer.toLowerCase(); - } - if (vendor) { - gpuInfo.vendor = vendor.toLowerCase(); - } - } - this.gpuInfo = gpuInfo; - return gpuInfo; - }, - }; -})(); - -function resizeCanvasIfNeeded(pipelineState) { - var targetCanvas = pipelineState.targetCanvas, - width = targetCanvas.width, height = targetCanvas.height, - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight; - - if (width !== dWidth || height !== dHeight) { - targetCanvas.width = dWidth; - targetCanvas.height = dHeight; - } -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas. - * - * The WebGL canvas is assumed to be upside down, with the top-left pixel of the - * desired output image appearing in the bottom-left corner of the WebGL canvas. - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DDrawImage(gl, pipelineState) { - var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas, - ctx = targetCanvas.getContext('2d'); - ctx.translate(0, targetCanvas.height); // move it down again - ctx.scale(1, -1); // vertical flip - // where is my image on the big glcanvas? - var sourceY = glCanvas.height - targetCanvas.height; - ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, - targetCanvas.width, targetCanvas.height); -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData - * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra). - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DPutImageData(gl, pipelineState) { - var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'), - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight, - numBytes = dWidth * dHeight * 4; - - // eslint-disable-next-line no-undef - var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); - // eslint-disable-next-line no-undef - var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); - - gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8); - var imgData = new ImageData(u8Clamped, dWidth, dHeight); - ctx.putImageData(imgData, 0, 0); -} - - -(function() { - - 'use strict'; - - var noop = function() {}; - - fabric.Canvas2dFilterBackend = Canvas2dFilterBackend; - - /** - * Canvas 2D filter backend. - */ - function Canvas2dFilterBackend() {}; - - Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ { - evictCachesForKey: noop, - dispose: noop, - clearWebGLCaches: noop, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Apply a set of filters against a source image and draw the filtered output - * to the provided destination canvas. - * - * @param {EnhancedFilter} filters The filter to apply. - * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered. - * @param {Number} sourceWidth The width of the source input. - * @param {Number} sourceHeight The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - */ - applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) { - var ctx = targetCanvas.getContext('2d'); - ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight); - var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var pipelineState = { - sourceWidth: sourceWidth, - sourceHeight: sourceHeight, - imageData: imageData, - originalEl: sourceElement, - originalImageData: originalImageData, - canvasEl: targetCanvas, - ctx: ctx, - filterBackend: this, - }; - filters.forEach(function(filter) { filter.applyTo(pipelineState); }); - if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) { - targetCanvas.width = pipelineState.imageData.width; - targetCanvas.height = pipelineState.imageData.height; - } - ctx.putImageData(pipelineState.imageData, 0, 0); - return pipelineState; - }, - - }; -})(); - - -/** - * @namespace fabric.Image.filters - * @memberOf fabric.Image - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters} - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - */ -fabric.Image = fabric.Image || { }; -fabric.Image.filters = fabric.Image.filters || { }; - -/** - * Root filter class from which all filter classes inherit from - * @class fabric.Image.filters.BaseFilter - * @memberOf fabric.Image.filters - */ -fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'BaseFilter', - - /** - * Array of attributes to send with buffers. do not modify - * @private - */ - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - fragmentSource: 'precision highp float;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform sampler2D uTexture;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - '}', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Sets filter's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } - }, - - /** - * Compile this filter's shader program. - * - * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation. - * @param {String} fragmentSource fragmentShader source for compilation - * @param {String} vertexSource vertexShader source for compilation - */ - createProgram: function(gl, fragmentSource, vertexSource) { - fragmentSource = fragmentSource || this.fragmentSource; - vertexSource = vertexSource || this.vertexSource; - if (fabric.webGlPrecision !== 'highp'){ - fragmentSource = fragmentSource.replace( - /precision highp float/g, - 'precision ' + fabric.webGlPrecision + ' float' - ); - } - var vertexShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Vertex shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(vertexShader) - ); - } - - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Fragment shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(fragmentShader) - ); - } - - var program = gl.createProgram(); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Shader link error for "${this.type}" ' + - gl.getProgramInfoLog(program) - ); - } - - var attributeLocations = this.getAttributeLocations(gl, program); - var uniformLocations = this.getUniformLocations(gl, program) || { }; - uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW'); - uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH'); - return { - program: program, - attributeLocations: attributeLocations, - uniformLocations: uniformLocations - }; - }, - - /** - * Return a map of attribute names to WebGLAttributeLocation objects. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take attribute locations. - * @returns {Object} A map of attribute names to attribute locations. - */ - getAttributeLocations: function(gl, program) { - return { - aPosition: gl.getAttribLocation(program, 'aPosition'), - }; - }, - - /** - * Return a map of uniform names to WebGLUniformLocation objects. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take uniform locations. - * @returns {Object} A map of uniform names to uniform locations. - */ - getUniformLocations: function (/* gl, program */) { - // in case i do not need any special uniform i need to return an empty object - return { }; - }, - - /** - * Send attribute data from this filter to its shader program on the GPU. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} attributeLocations A map of shader attribute names to their locations. - */ - sendAttributeData: function(gl, attributeLocations, aPositionData) { - var attributeLocation = attributeLocations.aPosition; - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.enableVertexAttribArray(attributeLocation); - gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0); - gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW); - }, - - _setupFrameBuffer: function(options) { - var gl = options.context, width, height; - if (options.passes > 1) { - width = options.destinationWidth; - height = options.destinationHeight; - if (options.sourceWidth !== width || options.sourceHeight !== height) { - gl.deleteTexture(options.targetTexture); - options.targetTexture = options.filterBackend.createTexture(gl, width, height); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, - options.targetTexture, 0); - } - else { - // draw last filter on canvas and not to framebuffer. - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.finish(); - } - }, - - _swapTextures: function(options) { - options.passes--; - options.pass++; - var temp = options.targetTexture; - options.targetTexture = options.sourceTexture; - options.sourceTexture = temp; - }, - - /** - * Generic isNeutral implementation for one parameter based filters. - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter ) - * @param {Object} options - **/ - isNeutralState: function(/* options */) { - var main = this.mainParameter, - _class = fabric.Image.filters[this.type].prototype; - if (main) { - if (Array.isArray(_class[main])) { - for (var i = _class[main].length; i--;) { - if (this[main][i] !== _class[main][i]) { - return false; - } - } - return true; - } - else { - return _class[main] === this[main]; - } - } - else { - return false; - } - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - if (!options.programCache.hasOwnProperty(this.type)) { - options.programCache[this.type] = this.createProgram(options.context); - } - return options.programCache[this.type]; - }, - - /** - * Apply this filter using webgl. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.originalTexture The texture of the original input image. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyToWebGL: function(options) { - var gl = options.context; - var shader = this.retrieveShader(options); - if (options.pass === 0 && options.originalTexture) { - gl.bindTexture(gl.TEXTURE_2D, options.originalTexture); - } - else { - gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture); - } - gl.useProgram(shader.program); - this.sendAttributeData(gl, shader.attributeLocations, options.aPosition); - - gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth); - gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight); - - this.sendUniformData(gl, shader.uniformLocations); - gl.viewport(0, 0, options.destinationWidth, options.destinationHeight); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - }, - - bindAdditionalTexture: function(gl, texture, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, texture); - // reset active texture to 0 as usual - gl.activeTexture(gl.TEXTURE0); - }, - - unbindAdditionalTexture: function(gl, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.activeTexture(gl.TEXTURE0); - }, - - getMainParameter: function() { - return this[this.mainParameter]; - }, - - setMainParameter: function(value) { - this[this.mainParameter] = value; - }, - - /** - * Send uniform data from this filter to its shader program on the GPU. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} uniformLocations A map of shader uniform names to their locations. - */ - sendUniformData: function(/* gl, uniformLocations */) { - // Intentionally left blank. Override me in subclasses. - }, - - /** - * If needed by a 2d filter, this functions can create an helper canvas to be used - * remember that options.targetCanvas is available for use till end of chain. - */ - createHelpLayer: function(options) { - if (!options.helpLayer) { - var helpLayer = document.createElement('canvas'); - helpLayer.width = options.sourceWidth; - helpLayer.height = options.sourceHeight; - options.helpLayer = helpLayer; - } - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - var object = { type: this.type }, mainP = this.mainParameter; - if (mainP) { - object[mainP] = this[mainP]; - } - return object; - }, - - /** - * Returns a JSON representation of an instance - * @return {Object} JSON - */ - toJSON: function() { - // delegate, not alias - return this.toObject(); - } -}); - -fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { - var filter = new fabric.Image.filters[object.type](object); - callback && callback(filter); - return filter; -}; - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Matrix filter class - * @class fabric.Image.filters.ColorMatrix - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php} - * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl} - * @example Kodachrome filter - * var filter = new fabric.Image.filters.ColorMatrix({ - * matrix: [ - 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502, - -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203, - -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946, - 0, 0, 0, 1, 0 - ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'ColorMatrix', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform mat4 uColorMatrix;\n' + - 'uniform vec4 uConstants;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color *= uColorMatrix;\n' + - 'color += uConstants;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Colormatrix for pixels. - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ], - - mainParameter: 'matrix', - - /** - * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario - * to save some calculation - */ - colorsOnly: true, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.matrix = this.matrix.slice(0); - }, - - /** - * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = data.length, - m = this.matrix, - r, g, b, a, i, colorsOnly = this.colorsOnly; - - for (i = 0; i < iLen; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - if (colorsOnly) { - data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255; - } - else { - a = data[i + 3]; - data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255; - data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'), - uConstants: gl.getUniformLocation(program, 'uConstants'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var m = this.matrix, - matrix = [ - m[0], m[1], m[2], m[3], - m[5], m[6], m[7], m[8], - m[10], m[11], m[12], m[13], - m[15], m[16], m[17], m[18] - ], - constants = [m[4], m[9], m[14], m[19]]; - gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix); - gl.uniform4fv(uniformLocations.uConstants, constants); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] function to invoke after filter creation - * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix - */ - fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Brightness filter class - * @class fabric.Image.filters.Brightness - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Brightness({ - * brightness: 0.05 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Brightness', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBrightness;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += uBrightness;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Brightness value, from -1 to 1. - * translated to -255 to 255 for 2d - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Number} brightness - * @default - */ - brightness: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'brightness', - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.brightness === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - brightness = Math.round(this.brightness * 255); - for (i = 0; i < len; i += 4) { - data[i] = data[i] + brightness; - data[i + 1] = data[i + 1] + brightness; - data[i + 2] = data[i + 2] + brightness; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBrightness: gl.getUniformLocation(program, 'uBrightness'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBrightness, this.brightness); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness - */ - fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Adapted from html5rocks article - * @class fabric.Image.filters.Convolute - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example Sharpen filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 0, -1, 0, - * -1, 5, -1, - * 0, -1, 0 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Blur filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter with opaqueness - * var filter = new fabric.Image.filters.Convolute({ - * opaque: true, - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Convolute', - - /* - * Opaque value (true/false) - */ - opaque: false, - - /* - * matrix for the filter, max 9x9 - */ - matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0], - - /** - * Fragment source for the brightness program - */ - fragmentSource: { - Convolute_3_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_3_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_5_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_5_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_7_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_7_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_9_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_9_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - }, - - /** - * Constructor - * @memberOf fabric.Image.filters.Convolute.prototype - * @param {Object} [options] Options object - * @param {Boolean} [options.opaque=false] Opaque value (true/false) - * @param {Array} [options.matrix] Filter matrix - */ - - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var size = Math.sqrt(this.matrix.length); - var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0); - var shaderSource = this.fragmentSource[cacheKey]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - weights = this.matrix, - side = Math.round(Math.sqrt(weights.length)), - halfSide = Math.floor(side / 2), - sw = imageData.width, - sh = imageData.height, - output = options.ctx.createImageData(sw, sh), - dst = output.data, - // go through the destination image pixels - alphaFac = this.opaque ? 1 : 0, - r, g, b, a, dstOff, - scx, scy, srcOff, wt, - x, y, cx, cy; - - for (y = 0; y < sh; y++) { - for (x = 0; x < sw; x++) { - dstOff = (y * sw + x) * 4; - // calculate the weighed sum of the source image pixels that - // fall under the convolution matrix - r = 0; g = 0; b = 0; a = 0; - - for (cy = 0; cy < side; cy++) { - for (cx = 0; cx < side; cx++) { - scy = y + cy - halfSide; - scx = x + cx - halfSide; - - // eslint-disable-next-line max-depth - if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) { - continue; - } - - srcOff = (scy * sw + scx) * 4; - wt = weights[cy * side + cx]; - - r += data[srcOff] * wt; - g += data[srcOff + 1] * wt; - b += data[srcOff + 2] * wt; - // eslint-disable-next-line max-depth - if (!alphaFac) { - a += data[srcOff + 3] * wt; - } - } - } - dst[dstOff] = r; - dst[dstOff + 1] = g; - dst[dstOff + 2] = b; - if (!alphaFac) { - dst[dstOff + 3] = a; - } - else { - dst[dstOff + 3] = data[dstOff + 3]; - } - } - } - options.imageData = output; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMatrix: gl.getUniformLocation(program, 'uMatrix'), - uOpaque: gl.getUniformLocation(program, 'uOpaque'), - uHalfSize: gl.getUniformLocation(program, 'uHalfSize'), - uSize: gl.getUniformLocation(program, 'uSize'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1fv(uniformLocations.uMatrix, this.matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - opaque: this.opaque, - matrix: this.matrix - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute - */ - fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Grayscale image filter class - * @class fabric.Image.filters.Grayscale - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Grayscale(); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Grayscale', - - fragmentSource: { - average: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float average = (color.r + color.b + color.g) / 3.0;\n' + - 'gl_FragColor = vec4(average, average, average, color.a);\n' + - '}', - lightness: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - luminosity: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - }, - - - /** - * Grayscale mode, between 'average', 'lightness', 'luminosity' - * @param {String} type - * @default - */ - mode: 'average', - - mainParameter: 'mode', - - /** - * Apply the Grayscale operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length, value, - mode = this.mode; - for (i = 0; i < len; i += 4) { - if (mode === 'average') { - value = (data[i] + data[i + 1] + data[i + 2]) / 3; - } - else if (mode === 'lightness') { - value = (Math.min(data[i], data[i + 1], data[i + 2]) + - Math.max(data[i], data[i + 1], data[i + 2])) / 2; - } - else if (mode === 'luminosity') { - value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2]; - } - data[i] = value; - data[i + 1] = value; - data[i + 2] = value; - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var shaderSource = this.fragmentSource[this.mode]; - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMode: gl.getUniformLocation(program, 'uMode'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - // default average mode. - var mode = 1; - gl.uniform1i(uniformLocations.uMode, mode); - }, - - /** - * Grayscale filter isNeutralState implementation - * The filter is never neutral - * on the image - **/ - isNeutralState: function() { - return false; - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale - */ - fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Invert filter class - * @class fabric.Image.filters.Invert - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Invert(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Invert', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uInvert;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'if (uInvert == 1) {\n' + - 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n' + - '} else {\n' + - 'gl_FragColor = color;\n' + - '}\n' + - '}', - - /** - * Filter invert. if false, does nothing - * @param {Boolean} invert - * @default - */ - invert: true, - - mainParameter: 'invert', - - /** - * Apply the Invert operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length; - for (i = 0; i < len; i += 4) { - data[i] = 255 - data[i]; - data[i + 1] = 255 - data[i + 1]; - data[i + 2] = 255 - data[i + 2]; - } - }, - - /** - * Invert filter isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function() { - return !this.invert; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uInvert: gl.getUniformLocation(program, 'uInvert'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1i(uniformLocations.uInvert, this.invert); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert - */ - fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject; - - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Noise filter class - * @class fabric.Image.filters.Noise - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Noise({ - * noise: 700 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Noise', - - /** - * Fragment source for the noise program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uStepH;\n' + - 'uniform float uNoise;\n' + - 'uniform float uSeed;\n' + - 'varying vec2 vTexCoord;\n' + - 'float rand(vec2 co, float seed, float vScale) {\n' + - 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'noise', - - /** - * Noise value, from - * @param {Number} noise - * @default - */ - noise: 0, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.noise === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - noise = this.noise, rand; - - for (i = 0, len = data.length; i < len; i += 4) { - - rand = (0.5 - Math.random()) * noise; - - data[i] += rand; - data[i + 1] += rand; - data[i + 2] += rand; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uNoise: gl.getUniformLocation(program, 'uNoise'), - uSeed: gl.getUniformLocation(program, 'uSeed'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uNoise, this.noise / 255); - gl.uniform1f(uniformLocations.uSeed, Math.random()); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - noise: this.noise - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise - */ - fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Pixelate filter class - * @class fabric.Image.filters.Pixelate - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Pixelate({ - * blocksize: 8 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Pixelate', - - blocksize: 4, - - mainParameter: 'blocksize', - - /** - * Fragment source for the Pixelate program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBlocksize;\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'float blockW = uBlocksize * uStepW;\n' + - 'float blockH = uBlocksize * uStepW;\n' + - 'int posX = int(vTexCoord.x / blockW);\n' + - 'int posY = int(vTexCoord.y / blockH);\n' + - 'float fposX = float(posX);\n' + - 'float fposY = float(posY);\n' + - 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n' + - 'vec4 color = texture2D(uTexture, squareCoords);\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = imageData.height, - jLen = imageData.width, - index, i, j, r, g, b, a, - _i, _j, _iLen, _jLen; - - for (i = 0; i < iLen; i += this.blocksize) { - for (j = 0; j < jLen; j += this.blocksize) { - - index = (i * 4) * jLen + (j * 4); - - r = data[index]; - g = data[index + 1]; - b = data[index + 2]; - a = data[index + 3]; - - _iLen = Math.min(i + this.blocksize, iLen); - _jLen = Math.min(j + this.blocksize, jLen); - for (_i = i; _i < _iLen; _i++) { - for (_j = j; _j < _jLen; _j++) { - index = (_i * 4) * jLen + (_j * 4); - data[index] = r; - data[index + 1] = g; - data[index + 2] = b; - data[index + 3] = a; - } - } - } - } - }, - - /** - * Indicate when the filter is not gonna apply changes to the image - **/ - isNeutralState: function() { - return this.blocksize === 1; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBlocksize: gl.getUniformLocation(program, 'uBlocksize'), - uStepW: gl.getUniformLocation(program, 'uStepW'), - uStepH: gl.getUniformLocation(program, 'uStepH'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBlocksize, this.blocksize); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate - */ - fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Remove white filter class - * @class fabric.Image.filters.RemoveColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.RemoveColor({ - * threshold: 0.2, - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'RemoveColor', - - /** - * Color to remove, in any format understood by fabric.Color. - * @param {String} type - * @default - */ - color: '#FFFFFF', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uLow;\n' + - 'uniform vec4 uHigh;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n' + - 'gl_FragColor.a = 0.0;\n' + - '}\n' + - '}', - - /** - * distance to actual color, as value up or down from each r,g,b - * between 0 and 1 - **/ - distance: 0.02, - - /** - * For color to remove inside distance, use alpha channel for a smoother deletion - * NOT IMPLEMENTED YET - **/ - useAlpha: false, - - /** - * Constructor - * @memberOf fabric.Image.filters.RemoveWhite.prototype - * @param {Object} [options] Options object - * @param {Number} [options.color=#RRGGBB] Threshold value - * @param {Number} [options.distance=10] Distance value - */ - - /** - * Applies filter to canvas element - * @param {Object} canvasEl Canvas element to apply filter to - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - distance = this.distance * 255, - r, g, b, - source = new fabric.Color(this.color).getSource(), - lowC = [ - source[0] - distance, - source[1] - distance, - source[2] - distance, - ], - highC = [ - source[0] + distance, - source[1] + distance, - source[2] + distance, - ]; - - - for (i = 0; i < data.length; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - if (r > lowC[0] && - g > lowC[1] && - b > lowC[2] && - r < highC[0] && - g < highC[1] && - b < highC[2]) { - data[i + 3] = 0; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uLow: gl.getUniformLocation(program, 'uLow'), - uHigh: gl.getUniformLocation(program, 'uHigh'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(), - distance = parseFloat(this.distance), - lowC = [ - 0 + source[0] / 255 - distance, - 0 + source[1] / 255 - distance, - 0 + source[2] / 255 - distance, - 1 - ], - highC = [ - source[0] / 255 + distance, - source[1] / 255 + distance, - source[2] / 255 + distance, - 1 - ]; - gl.uniform4fv(uniformLocations.uLow, lowC); - gl.uniform4fv(uniformLocations.uHigh, highC); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - color: this.color, - distance: this.distance - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite - */ - fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - var matrices = { - Brownie: [ - 0.59970,0.34553,-0.27082,0,0.186, - -0.03770,0.86095,0.15059,0,-0.1449, - 0.24113,-0.07441,0.44972,0,-0.02965, - 0,0,0,1,0 - ], - Vintage: [ - 0.62793,0.32021,-0.03965,0,0.03784, - 0.02578,0.64411,0.03259,0,0.02926, - 0.04660,-0.08512,0.52416,0,0.02023, - 0,0,0,1,0 - ], - Kodachrome: [ - 1.12855,-0.39673,-0.03992,0,0.24991, - -0.16404,1.08352,-0.05498,0,0.09698, - -0.16786,-0.56034,1.60148,0,0.13972, - 0,0,0,1,0 - ], - Technicolor: [ - 1.91252,-0.85453,-0.09155,0,0.04624, - -0.30878,1.76589,-0.10601,0,-0.27589, - -0.23110,-0.75018,1.84759,0,0.12137, - 0,0,0,1,0 - ], - Polaroid: [ - 1.438,-0.062,-0.062,0,0, - -0.122,1.378,-0.122,0,0, - -0.016,-0.016,1.483,0,0, - 0,0,0,1,0 - ], - Sepia: [ - 0.393, 0.769, 0.189, 0, 0, - 0.349, 0.686, 0.168, 0, 0, - 0.272, 0.534, 0.131, 0, 0, - 0, 0, 0, 1, 0 - ], - BlackWhite: [ - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 0, 0, 0, 1, 0, - ] - }; - - for (var key in matrices) { - filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: key, - - /** - * Colormatrix for the effect - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: matrices[key], - - /** - * Lock the matrix export for this kind of static, parameter less filters. - */ - mainParameter: false, - /** - * Lock the colormatrix on the color part, skipping alpha - */ - colorsOnly: true, - - }); - fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject; - } -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Blend filter class - * @class fabric.Image.filter.BlendColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ { - type: 'BlendColor', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - **/ - color: '#F95C63', - - /** - * Blend mode for the filter: one of multiply, add, diff, screen, subtract, - * darken, lighten, overlay, exclusion, tint. - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend color operation. - **/ - alpha: 1, - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'gl_FragColor.rgb *= uColor.rgb;\n', - screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n', - add: 'gl_FragColor.rgb += uColor.rgb;\n', - diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n', - subtract: 'gl_FragColor.rgb -= uColor.rgb;\n', - lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n', - darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n', - exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n', - overlay: 'if (uColor.r < 0.5) {\n' + - 'gl_FragColor.r *= 2.0 * uColor.r;\n' + - '} else {\n' + - 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n' + - '}\n' + - 'if (uColor.g < 0.5) {\n' + - 'gl_FragColor.g *= 2.0 * uColor.g;\n' + - '} else {\n' + - 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n' + - '}\n' + - 'if (uColor.b < 0.5) {\n' + - 'gl_FragColor.b *= 2.0 * uColor.b;\n' + - '} else {\n' + - 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n' + - '}\n', - tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\n' + - 'gl_FragColor.rgb += uColor.rgb;\n', - }, - - /** - * build the fragment source for the filters, joining the common part with - * the specific one. - * @param {String} mode the mode of the filter, a key of this.fragmentSource - * @return {String} the source to be compiled - * @private - */ - buildSource: function(mode) { - return 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'gl_FragColor = color;\n' + - 'if (color.a > 0.0) {\n' + - this.fragmentSource[mode] + - '}\n' + - '}'; - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode, shaderSource; - if (!options.programCache.hasOwnProperty(cacheKey)) { - shaderSource = this.buildSource(this.mode); - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, iLen = data.length, - tr, tg, tb, - r, g, b, - source, alpha1 = 1 - this.alpha; - - source = new fabric.Color(this.color).getSource(); - tr = source[0] * this.alpha; - tg = source[1] * this.alpha; - tb = source[2] * this.alpha; - - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - break; - case 'screen': - data[i] = 255 - (255 - r) * (255 - tr) / 255; - data[i + 1] = 255 - (255 - g) * (255 - tg) / 255; - data[i + 2] = 255 - (255 - b) * (255 - tb) / 255; - break; - case 'add': - data[i] = r + tr; - data[i + 1] = g + tg; - data[i + 2] = b + tb; - break; - case 'diff': - case 'difference': - data[i] = Math.abs(r - tr); - data[i + 1] = Math.abs(g - tg); - data[i + 2] = Math.abs(b - tb); - break; - case 'subtract': - data[i] = r - tr; - data[i + 1] = g - tg; - data[i + 2] = b - tb; - break; - case 'darken': - data[i] = Math.min(r, tr); - data[i + 1] = Math.min(g, tg); - data[i + 2] = Math.min(b, tb); - break; - case 'lighten': - data[i] = Math.max(r, tr); - data[i + 1] = Math.max(g, tg); - data[i + 2] = Math.max(b, tb); - break; - case 'overlay': - data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255); - data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255); - data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255); - break; - case 'exclusion': - data[i] = tr + r - ((2 * tr * r) / 255); - data[i + 1] = tg + g - ((2 * tg * g) / 255); - data[i + 2] = tb + b - ((2 * tb * b) / 255); - break; - case 'tint': - data[i] = tr + r * alpha1; - data[i + 1] = tg + g * alpha1; - data[i + 2] = tb + b * alpha1; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColor: gl.getUniformLocation(program, 'uColor'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(); - source[0] = this.alpha * source[0] / 255; - source[1] = this.alpha * source[1] / 255; - source[2] = this.alpha * source[2] / 255; - source[3] = this.alpha; - gl.uniform4fv(uniformLocations.uColor, source); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - color: this.color, - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor - */ - fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Image Blend filter class - * @class fabric.Image.filter.BlendImage - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ { - type: 'BlendImage', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - **/ - image: null, - - /** - * Blend mode for the filter: one of multiply, add, diff, screen, subtract, - * darken, lighten, overlay, exclusion, tint. - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend image operation. - * not implemented. - **/ - alpha: 1, - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'uniform mat3 uTransformMatrix;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.rgba *= color2.rgba;\n' + - 'gl_FragColor = color;\n' + - '}', - mask: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.a = color2.a;\n' + - 'gl_FragColor = color;\n' + - '}', - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - var shaderSource = this.fragmentSource[this.mode]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - applyToWebGL: function(options) { - // load texture to blend. - var gl = options.context, - texture = this.createTexture(options.filterBackend, this.image); - this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); - this.callSuper('applyToWebGL', options); - this.unbindAdditionalTexture(gl, gl.TEXTURE1); - }, - - createTexture: function(backend, image) { - return backend.getCachedTexture(image.cacheKey, image._element); - }, - - /** - * Calculate a transformMatrix to adapt the image to blend over - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - calculateMatrix: function() { - var image = this.image, - width = image._element.width, - height = image._element.height; - return [ - 1 / image.scaleX, 0, 0, - 0, 1 / image.scaleY, 0, - -image.left / width, -image.top / height, 1 - ]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - resources = options.filterBackend.resources, - data = imageData.data, iLen = data.length, - width = imageData.width, - height = imageData.height, - tr, tg, tb, ta, - r, g, b, a, - canvas1, context, image = this.image, blendData; - - if (!resources.blendImage) { - resources.blendImage = fabric.util.createCanvasElement(); - } - canvas1 = resources.blendImage; - context = canvas1.getContext('2d'); - if (canvas1.width !== width || canvas1.height !== height) { - canvas1.width = width; - canvas1.height = height; - } - else { - context.clearRect(0, 0, width, height); - } - context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); - context.drawImage(image._element, 0, 0, width, height); - blendData = context.getImageData(0, 0, width, height).data; - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - a = data[i + 3]; - - tr = blendData[i]; - tg = blendData[i + 1]; - tb = blendData[i + 2]; - ta = blendData[i + 3]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - data[i + 3] = a * ta / 255; - break; - case 'mask': - data[i + 3] = ta; - break; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'), - uImage: gl.getUniformLocation(program, 'uImage'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var matrix = this.calculateMatrix(); - gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1. - gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - image: this.image && this.image.toObject(), - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} callback to be invoked after filter creation - * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage - */ - fabric.Image.filters.BlendImage.fromObject = function(object, callback) { - fabric.Image.fromObject(object.image, function(image) { - var options = fabric.util.object.clone(object); - options.image = image; - callback(new fabric.Image.filters.BlendImage(options)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor, - sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin, - ceil = Math.ceil, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Resize image filter class - * @class fabric.Image.filters.Resize - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Resize(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Resize', - - /** - * Resize type - * for webgl resizeType is just lanczos, for canvas2d can be: - * bilinear, hermite, sliceHack, lanczos. - * @param {String} resizeType - * @default - */ - resizeType: 'hermite', - - /** - * Scale factor for resizing, x axis - * @param {Number} scaleX - * @default - */ - scaleX: 1, - - /** - * Scale factor for resizing, y axis - * @param {Number} scaleY - * @default - */ - scaleY: 1, - - /** - * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos - * @param {Number} lanczosLobes - * @default - */ - lanczosLobes: 3, - - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uDelta: gl.getUniformLocation(program, 'uDelta'), - uTaps: gl.getUniformLocation(program, 'uTaps'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]); - gl.uniform1fv(uniformLocations.uTaps, this.taps); - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var fragmentShader = this.generateShader(filterWindow); - options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader); - } - return options.programCache[cacheKey]; - }, - - getFilterWindow: function() { - var scale = this.tempScale; - return Math.ceil(this.lanczosLobes / scale); - }, - - getTaps: function() { - var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale, - filterWindow = this.getFilterWindow(), taps = new Array(filterWindow); - for (var i = 1; i <= filterWindow; i++) { - taps[i - 1] = lobeFunction(i * scale); - } - return taps; - }, - - /** - * Generate vertex and shader sources from the necessary steps numbers - * @param {Number} filterWindow - */ - generateShader: function(filterWindow) { - var offsets = new Array(filterWindow), - fragmentShader = this.fragmentSourceTOP, filterWindow; - - for (var i = 1; i <= filterWindow; i++) { - offsets[i - 1] = i + '.0 * uDelta'; - } - - fragmentShader += 'uniform float uTaps[' + filterWindow + '];\n'; - fragmentShader += 'void main() {\n'; - fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\n'; - fragmentShader += ' float sum = 1.0;\n'; - - offsets.forEach(function(offset, i) { - fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\n'; - }); - fragmentShader += ' gl_FragColor = color / sum;\n'; - fragmentShader += '}'; - return fragmentShader; - }, - - fragmentSourceTOP: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n', - - /** - * Apply the resize filter to the image - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - options.passes++; - this.width = options.sourceWidth; - this.horizontal = true; - this.dW = Math.round(this.width * this.scaleX); - this.dH = options.sourceHeight; - this.tempScale = this.dW / this.width; - this.taps = this.getTaps(); - options.destinationWidth = this.dW; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceWidth = options.destinationWidth; - - this.height = options.sourceHeight; - this.horizontal = false; - this.dH = Math.round(this.height * this.scaleY); - this.tempScale = this.dH / this.height; - this.taps = this.getTaps(); - options.destinationHeight = this.dH; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceHeight = options.destinationHeight; - } - else { - this.applyTo2d(options); - } - }, - - isNeutralState: function() { - return this.scaleX === 1 && this.scaleY === 1; - }, - - lanczosCreate: function(lobes) { - return function(x) { - if (x >= lobes || x <= -lobes) { - return 0.0; - } - if (x < 1.19209290E-07 && x > -1.19209290E-07) { - return 1.0; - } - x *= Math.PI; - var xx = x / lobes; - return (sin(x) / x) * sin(xx) / xx; - }; - }, - - /** - * Applies filter to canvas element - * @memberOf fabric.Image.filters.Resize.prototype - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} scaleX - * @param {Number} scaleY - */ - applyTo2d: function(options) { - var imageData = options.imageData, - scaleX = this.scaleX, - scaleY = this.scaleY; - - this.rcpScaleX = 1 / scaleX; - this.rcpScaleY = 1 / scaleY; - - var oW = imageData.width, oH = imageData.height, - dW = round(oW * scaleX), dH = round(oH * scaleY), - newData; - - if (this.resizeType === 'sliceHack') { - newData = this.sliceByTwo(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'hermite') { - newData = this.hermiteFastResize(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'bilinear') { - newData = this.bilinearFiltering(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'lanczos') { - newData = this.lanczosResize(options, oW, oH, dW, dH); - } - options.imageData = newData; - }, - - /** - * Filter sliceByTwo - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - sliceByTwo: function(options, oW, oH, dW, dH) { - var imageData = options.imageData, - mult = 0.5, doneW = false, doneH = false, stepW = oW * mult, - stepH = oH * mult, resources = fabric.filterBackend.resources, - tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0; - if (!resources.sliceByTwo) { - resources.sliceByTwo = document.createElement('canvas'); - } - tmpCanvas = resources.sliceByTwo; - if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) { - tmpCanvas.width = oW * 1.5; - tmpCanvas.height = oH; - } - ctx = tmpCanvas.getContext('2d'); - ctx.clearRect(0, 0, oW * 1.5, oH); - ctx.putImageData(imageData, 0, 0); - - dW = floor(dW); - dH = floor(dH); - - while (!doneW || !doneH) { - oW = stepW; - oH = stepH; - if (dW < floor(stepW * mult)) { - stepW = floor(stepW * mult); - } - else { - stepW = dW; - doneW = true; - } - if (dH < floor(stepH * mult)) { - stepH = floor(stepH * mult); - } - else { - stepH = dH; - doneH = true; - } - ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH); - sX = dX; - sY = dY; - dY += stepH; - } - return ctx.getImageData(sX, sY, dW, dH); - }, - - /** - * Filter lanczosResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - lanczosResize: function(options, oW, oH, dW, dH) { - - function process(u) { - var v, i, weight, idx, a, red, green, - blue, alpha, fX, fY; - center.x = (u + 0.5) * ratioX; - icenter.x = floor(center.x); - for (v = 0; v < dH; v++) { - center.y = (v + 0.5) * ratioY; - icenter.y = floor(center.y); - a = 0; red = 0; green = 0; blue = 0; alpha = 0; - for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) { - if (i < 0 || i >= oW) { - continue; - } - fX = floor(1000 * abs(i - center.x)); - if (!cacheLanc[fX]) { - cacheLanc[fX] = { }; - } - for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) { - if (j < 0 || j >= oH) { - continue; - } - fY = floor(1000 * abs(j - center.y)); - if (!cacheLanc[fX][fY]) { - cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000); - } - weight = cacheLanc[fX][fY]; - if (weight > 0) { - idx = (j * oW + i) * 4; - a += weight; - red += weight * srcData[idx]; - green += weight * srcData[idx + 1]; - blue += weight * srcData[idx + 2]; - alpha += weight * srcData[idx + 3]; - } - } - } - idx = (v * dW + u) * 4; - destData[idx] = red / a; - destData[idx + 1] = green / a; - destData[idx + 2] = blue / a; - destData[idx + 3] = alpha / a; - } - - if (++u < dW) { - return process(u); - } - else { - return destImg; - } - } - - var srcData = options.imageData.data, - destImg = options.ctx.createImageData(dW, dH), - destData = destImg.data, - lanczos = this.lanczosCreate(this.lanczosLobes), - ratioX = this.rcpScaleX, ratioY = this.rcpScaleY, - rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY, - range2X = ceil(ratioX * this.lanczosLobes / 2), - range2Y = ceil(ratioY * this.lanczosLobes / 2), - cacheLanc = { }, center = { }, icenter = { }; - - return process(0); - }, - - /** - * bilinearFiltering - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - bilinearFiltering: function(options, oW, oH, dW, dH) { - var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl, - color, offset = 0, origPix, ratioX = this.rcpScaleX, - ratioY = this.rcpScaleY, - w4 = 4 * (oW - 1), img = options.imageData, - pixels = img.data, destImage = options.ctx.createImageData(dW, dH), - destPixels = destImage.data; - for (i = 0; i < dH; i++) { - for (j = 0; j < dW; j++) { - x = floor(ratioX * j); - y = floor(ratioY * i); - xDiff = ratioX * j - x; - yDiff = ratioY * i - y; - origPix = 4 * (y * oW + x); - - for (chnl = 0; chnl < 4; chnl++) { - a = pixels[origPix + chnl]; - b = pixels[origPix + 4 + chnl]; - c = pixels[origPix + w4 + chnl]; - d = pixels[origPix + w4 + 4 + chnl]; - color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) + - c * yDiff * (1 - xDiff) + d * xDiff * yDiff; - destPixels[offset++] = color; - } - } - } - return destImage; - }, - - /** - * hermiteFastResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - hermiteFastResize: function(options, oW, oH, dW, dH) { - var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, - ratioWHalf = ceil(ratioW / 2), - ratioHHalf = ceil(ratioH / 2), - img = options.imageData, data = img.data, - img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; - for (var j = 0; j < dH; j++) { - for (var i = 0; i < dW; i++) { - var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, - gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH; - for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) { - var dy = abs(centerY - (yy + 0.5)) / ratioHHalf, - centerX = (i + 0.5) * ratioW, w0 = dy * dy; - for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) { - var dx = abs(centerX - (xx + 0.5)) / ratioWHalf, - w = sqrt(w0 + dx * dx); - /* eslint-disable max-depth */ - if (w > 1 && w < -1) { - continue; - } - //hermite filter - weight = 2 * w * w * w - 3 * w * w + 1; - if (weight > 0) { - dx = 4 * (xx + yy * oW); - //alpha - gxA += weight * data[dx + 3]; - weightsAlpha += weight; - //colors - if (data[dx + 3] < 255) { - weight = weight * data[dx + 3] / 250; - } - gxR += weight * data[dx]; - gxG += weight * data[dx + 1]; - gxB += weight * data[dx + 2]; - weights += weight; - } - /* eslint-enable max-depth */ - } - } - data2[x2] = gxR / weights; - data2[x2 + 1] = gxG / weights; - data2[x2 + 2] = gxB / weights; - data2[x2 + 3] = gxA / weightsAlpha; - } - } - return img2; - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - scaleX: this.scaleX, - scaleY: this.scaleY, - resizeType: this.resizeType, - lanczosLobes: this.lanczosLobes - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize - */ - fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Contrast filter class - * @class fabric.Image.filters.Contrast - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Contrast({ - * contrast: 0.25 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Contrast', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uContrast;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n' + - 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * contrast value, range from -1 to 1. - * @param {Number} contrast - * @default 0 - */ - contrast: 0, - - mainParameter: 'contrast', - - /** - * Constructor - * @memberOf fabric.Image.filters.Contrast.prototype - * @param {Object} [options] Options object - * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1) - */ - - /** - * Apply the Contrast operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - if (this.contrast === 0) { - return; - } - var imageData = options.imageData, i, len, - data = imageData.data, len = data.length, - contrast = Math.floor(this.contrast * 255), - contrastF = 259 * (contrast + 255) / (255 * (259 - contrast)); - - for (i = 0; i < len; i += 4) { - data[i] = contrastF * (data[i] - 128) + 128; - data[i + 1] = contrastF * (data[i + 1] - 128) + 128; - data[i + 2] = contrastF * (data[i + 2] - 128) + 128; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uContrast: gl.getUniformLocation(program, 'uContrast'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uContrast, this.contrast); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast - */ - fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Saturate filter class - * @class fabric.Image.filters.Saturation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Saturation({ - * saturation: 100 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Saturation', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uSaturation;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float rgMax = max(color.r, color.g);\n' + - 'float rgbMax = max(rgMax, color.b);\n' + - 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n' + - 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n' + - 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n' + - 'gl_FragColor = color;\n' + - '}', - - saturation: 0, - - mainParameter: 'saturation', - - /** - * Constructor - * @memberOf fabric.Image.filters.Saturate.prototype - * @param {Object} [options] Options object - * @param {Number} [options.saturate=0] Value to saturate the image (-1...1) - */ - - /** - * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.saturation === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, len = data.length, - adjust = -this.saturation, i, max; - - for (i = 0; i < len; i += 4) { - max = Math.max(data[i], data[i + 1], data[i + 2]); - data[i] += max !== data[i] ? (max - data[i]) * adjust : 0; - data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0; - data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uSaturation: gl.getUniformLocation(program, 'uSaturation'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uSaturation, -this.saturation); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate - */ - fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Blur filter class - * @class fabric.Image.filters.Blur - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Blur({ - * blur: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ { - - type: 'Blur', - - /* -'gl_FragColor = vec4(0.0);', -'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;', -'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;', -'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;', -*/ - - /* eslint-disable max-len */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n' + - 'const float nSamples = 15.0;\n' + - 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n' + - 'float random(vec3 scale) {\n' + - /* use the fragment position for a different seed per-pixel */ - 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = vec4(0.0);\n' + - 'float total = 0.0;\n' + - 'float offset = random(v3offset);\n' + - 'for (float t = -nSamples; t <= nSamples; t++) {\n' + - 'float percent = (t + offset - 0.5) / nSamples;\n' + - 'float weight = 1.0 - abs(percent);\n' + - 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\n' + - 'total += weight;\n' + - '}\n' + - 'gl_FragColor = color / total;\n' + - '}', - /* eslint-enable max-len */ - - /** - * blur value, in percentage of image dimensions. - * specific to keep the image blur constant at different resolutions - * range between 0 and 1. - */ - blur: 0, - - mainParameter: 'blur', - - applyTo: function(options) { - if (options.webgl) { - // this aspectRatio is used to give the same blur to vertical and horizontal - this.aspectRatio = options.sourceWidth / options.sourceHeight; - options.passes++; - this._setupFrameBuffer(options); - this.horizontal = true; - this.applyToWebGL(options); - this._swapTextures(options); - this._setupFrameBuffer(options); - this.horizontal = false; - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - applyTo2d: function(options) { - // paint canvasEl with current image data. - //options.ctx.putImageData(options.imageData, 0, 0); - options.imageData = this.simpleBlur(options); - }, - - simpleBlur: function(options) { - var resources = options.filterBackend.resources, canvas1, canvas2, - width = options.imageData.width, - height = options.imageData.height; - - if (!resources.blurLayer1) { - resources.blurLayer1 = fabric.util.createCanvasElement(); - resources.blurLayer2 = fabric.util.createCanvasElement(); - } - canvas1 = resources.blurLayer1; - canvas2 = resources.blurLayer2; - if (canvas1.width !== width || canvas1.height !== height) { - canvas2.width = canvas1.width = width; - canvas2.height = canvas1.height = height; - } - var ctx1 = canvas1.getContext('2d'), - ctx2 = canvas2.getContext('2d'), - nSamples = 15, - random, percent, j, i, - blur = this.blur * 0.06 * 0.5; - - // load first canvas - ctx1.putImageData(options.imageData, 0, 0); - ctx2.clearRect(0, 0, width, height); - - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * width + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, j, random); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * height + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, random, j); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - options.ctx.drawImage(canvas1, 0, 0); - var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height); - ctx1.globalAlpha = 1; - ctx1.clearRect(0, 0, canvas1.width, canvas1.height); - return newImageData; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - delta: gl.getUniformLocation(program, 'uDelta'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var delta = this.chooseRightDelta(); - gl.uniform2fv(uniformLocations.delta, delta); - }, - - /** - * choose right value of image percentage to blur with - * @returns {Array} a numeric array with delta values - */ - chooseRightDelta: function() { - var blurScale = 1, delta = [0, 0], blur; - if (this.horizontal) { - if (this.aspectRatio > 1) { - // image is wide, i want to shrink radius horizontal - blurScale = 1 / this.aspectRatio; - } - } - else { - if (this.aspectRatio < 1) { - // image is tall, i want to shrink radius vertical - blurScale = this.aspectRatio; - } - } - blur = blurScale * this.blur * 0.12; - if (this.horizontal) { - delta[0] = blur; - } - else { - delta[1] = blur; - } - return delta; - }, - }); - - /** - * Deserialize a JSON definition of a BlurFilter into a concrete instance. - */ - filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Gamma filter class - * @class fabric.Image.filters.Gamma - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Gamma({ - * gamma: [1, 0.5, 2.1] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Gamma', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec3 uGamma;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec3 correction = (1.0 / uGamma);\n' + - 'color.r = pow(color.r, correction.r);\n' + - 'color.g = pow(color.g, correction.g);\n' + - 'color.b = pow(color.b, correction.b);\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.rgb *= color.a;\n' + - '}', - - /** - * Gamma array value, from 0.01 to 2.2. - * @param {Array} gamma - * @default - */ - gamma: [1, 1, 1], - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'gamma', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.gamma = [1, 1, 1]; - filters.BaseFilter.prototype.initialize.call(this, options); - }, - - /** - * Apply the Gamma operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, data = imageData.data, - gamma = this.gamma, len = data.length, - rInv = 1 / gamma[0], gInv = 1 / gamma[1], - bInv = 1 / gamma[2], i; - - if (!this.rVals) { - // eslint-disable-next-line - this.rVals = new Uint8Array(256); - // eslint-disable-next-line - this.gVals = new Uint8Array(256); - // eslint-disable-next-line - this.bVals = new Uint8Array(256); - } - - // This is an optimization - pre-compute a look-up table for each color channel - // instead of performing these pow calls for each pixel in the image. - for (i = 0, len = 256; i < len; i++) { - this.rVals[i] = Math.pow(i / 255, rInv) * 255; - this.gVals[i] = Math.pow(i / 255, gInv) * 255; - this.bVals[i] = Math.pow(i / 255, bInv) * 255; - } - for (i = 0, len = data.length; i < len; i += 4) { - data[i] = this.rVals[data[i]]; - data[i + 1] = this.gVals[data[i + 1]]; - data[i + 2] = this.bVals[data[i + 2]]; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uGamma: gl.getUniformLocation(program, 'uGamma'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform3fv(uniformLocations.uGamma, this.gamma); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma - */ - fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * A container class that knows how to apply a sequence of filters to an input image. - */ - filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ { - - type: 'Composed', - - /** - * A non sparse array of filters to apply - */ - subFilters: [], - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.subFilters = this.subFilters.slice(0); - }, - - /** - * Apply this container's filters to the input image provided. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be applied. - */ - applyTo: function(options) { - options.passes += this.subFilters.length - 1; - this.subFilters.forEach(function(filter) { - filter.applyTo(options); - }); - }, - - /** - * Serialize this filter into JSON. - * - * @returns {Object} A JSON representation of this filter. - */ - toObject: function() { - return fabric.util.object.extend(this.callSuper('toObject'), { - subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }), - }); - }, - - isNeutralState: function() { - return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); }); - } - }); - - /** - * Deserialize a JSON definition of a ComposedFilter into a concrete instance. - */ - fabric.Image.filters.Composed.fromObject = function(object, callback) { - var filters = object.subFilters || [], - subFilters = filters.map(function(filter) { - return new fabric.Image.filters[filter.type](filter); - }), - instance = new fabric.Image.filters.Composed({ subFilters: subFilters }); - callback && callback(instance); - return instance; - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * HueRotation filter class - * @class fabric.Image.filters.HueRotation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.HueRotation({ - * rotation: -0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'HueRotation', - - /** - * HueRotation value, from -1 to 1. - * the unit is radians - * @param {Number} myParameter - * @default - */ - rotation: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'rotation', - - calculateMatrix: function() { - var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad), - aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos; - this.matrix = [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ]; - this.matrix[0] = cos + OneMinusCos / 3; - this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[6] = cos + aThird * OneMinusCos; - this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[12] = cos + aThird * OneMinusCos; - }, - - /** - * HueRotation isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function(options) { - this.calculateMatrix(); - return filters.BaseFilter.prototype.isNeutralState.call(this, options); - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - this.calculateMatrix(); - filters.BaseFilter.prototype.applyTo.call(this, options); - }, - - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation - */ - fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - clone = fabric.util.object.clone; - - if (fabric.Text) { - fabric.warn('fabric.Text is already defined'); - return; - } - - var additionalProps = - ('fontFamily fontWeight fontSize text underline overline linethrough' + - ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles path').split(' '); - - /** - * Text class - * @class fabric.Text - * @extends fabric.Object - * @return {fabric.Text} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} - * @see {@link fabric.Text#initialize} for constructor definition - */ - fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ { - - /** - * Properties which when set cause object to change dimensions - * @type Array - * @private - */ - _dimensionAffectingProps: [ - 'fontSize', - 'fontWeight', - 'fontFamily', - 'fontStyle', - 'lineHeight', - 'text', - 'charSpacing', - 'textAlign', - 'styles', - 'path' - ], - - /** - * @private - */ - _reNewline: /\r?\n/, - - /** - * Use this regular expression to filter for whitespaces that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpacesAndTabs: /[ \t\r]/g, - - /** - * Use this regular expression to filter for whitespace that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpaceAndTab: /[ \t\r]/, - - /** - * Use this regular expression to filter consecutive groups of non spaces. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reWords: /\S+/g, - - /** - * Type of an object - * @type String - * @default - */ - type: 'text', - - /** - * Font size (in pixels) - * @type Number - * @default - */ - fontSize: 40, - - /** - * Font weight (e.g. bold, normal, 400, 600, 800) - * @type {(Number|String)} - * @default - */ - fontWeight: 'normal', - - /** - * Font family - * @type String - * @default - */ - fontFamily: 'Times New Roman', - - /** - * Text decoration underline. - * @type Boolean - * @default - */ - underline: false, - - /** - * Text decoration overline. - * @type Boolean - * @default - */ - overline: false, - - /** - * Text decoration linethrough. - * @type Boolean - * @default - */ - linethrough: false, - - /** - * Text alignment. Possible values: "left", "center", "right", "justify", - * "justify-left", "justify-center" or "justify-right". - * @type String - * @default - */ - textAlign: 'left', - - /** - * Font style . Possible values: "", "normal", "italic" or "oblique". - * @type String - * @default - */ - fontStyle: 'normal', - - /** - * Line height - * @type Number - * @default - */ - lineHeight: 1.16, - - /** - * Superscript schema object (minimum overlap) - * @type {Object} - * @default - */ - superscript: { - size: 0.60, // fontSize factor - baseline: -0.35 // baseline-shift factor (upwards) - }, - - /** - * Subscript schema object (minimum overlap) - * @type {Object} - * @default - */ - subscript: { - size: 0.60, // fontSize factor - baseline: 0.11 // baseline-shift factor (downwards) - }, - - /** - * Background color of text lines - * @type String - * @default - */ - textBackgroundColor: '', - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps), - - /** - * List of properties to consider when checking if cache needs refresh - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps), - - /** - * When defined, an object is rendered via stroke and this property specifies its color. - * Backwards incompatibility note: This property was named "strokeStyle" until v1.1.6 - * @type String - * @default - */ - stroke: null, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property was named "textShadow" (String) until v1.2.11 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * fabric.Path that the text can follow. - * This feature is in BETA. - * @type fabric.Path - * @default - */ - path: null, - - /** - * @private - */ - _fontSizeFraction: 0.222, - - /** - * @private - */ - offsets: { - underline: 0.10, - linethrough: -0.315, - overline: -0.88 - }, - - /** - * Text Line proportion to font Size (in pixels) - * @type Number - * @default - */ - _fontSizeMult: 1.13, - - /** - * additional space between characters - * expressed in thousands of em unit - * @type Number - * @default - */ - charSpacing: 0, - - /** - * Object containing character styles - top-level properties -> line numbers, - * 2nd-level properties - character numbers - * @type Object - * @default - */ - styles: null, - - /** - * Reference to a context to measure text char or couple of chars - * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas - * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every - * text object created. - * @type {CanvasRenderingContext2D} - * @default - */ - _measuringContext: null, - - /** - * Baseline shift, styles only, keep at 0 for the main text object - * @type {Number} - * @default - */ - deltaY: 0, - - /** - * WARNING: EXPERIMENTAL. NOT SUPPORTED YET - * determine the direction of the text. - * This has to be set manually together with textAlign and originX for proper - * experience. - * some interesting link for the future - * https://www.w3.org/International/questions/qa-bidi-unicode-controls - * @since 4.5.0 - * @type {String} 'ltr|rtl' - * @default - */ - direction: 'ltr', - - /** - * Array of properties that define a style unit (of 'styles'). - * @type {Array} - * @default - */ - _styleProperties: [ - 'stroke', - 'strokeWidth', - 'fill', - 'fontFamily', - 'fontSize', - 'fontWeight', - 'fontStyle', - 'underline', - 'overline', - 'linethrough', - 'deltaY', - 'textBackgroundColor', - ], - - /** - * contains characters bounding boxes - */ - __charBounds: [], - - /** - * use this size when measuring text. To avoid IE11 rounding errors - * @type {Number} - * @default - * @readonly - * @private - */ - CACHE_FONT_SIZE: 400, - - /** - * contains the min text width to avoid getting 0 - * @type {Number} - * @default - */ - MIN_TEXT_WIDTH: 2, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - initialize: function(text, options) { - this.styles = options ? (options.styles || { }) : { }; - this.text = text; - this.__skipDimension = true; - this.callSuper('initialize', options); - if (this.path) { - this.setPathInfo(); - } - this.__skipDimension = false; - this.initDimensions(); - this.setCoords(); - this.setupState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * If text has a path, it will add the extra information needed - * for path and text calculations - * @return {fabric.Text} thisArg - */ - setPathInfo: function() { - var path = this.path; - if (path) { - path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path); - } - }, - - /** - * Return a context for measurement of text string. - * if created it gets stored for reuse - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - getMeasuringContext: function() { - // if we did not return we have to measure something. - if (!fabric._measuringContext) { - fabric._measuringContext = this.canvas && this.canvas.contextCache || - fabric.util.createCanvasElement().getContext('2d'); - } - return fabric._measuringContext; - }, - - /** - * @private - * Divides text into lines of text and lines of graphemes. - */ - _splitText: function() { - var newLines = this._splitTextIntoLines(this.text); - this.textLines = newLines.lines; - this._textLines = newLines.graphemeLines; - this._unwrappedTextLines = newLines._unwrappedLines; - this._text = newLines.graphemeText; - return newLines; - }, - - /** - * Initialize or update text dimensions. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this._splitText(); - this._clearCache(); - if (this.path) { - this.width = this.path.width; - this.height = this.path.height; - } - else { - this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH; - this.height = this.calcTextHeight(); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Enlarge space boxes and shift the others - */ - enlargeSpaces: function() { - var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) { - continue; - } - accumulatedSpace = 0; - line = this._textLines[i]; - currentLineWidth = this.getLineWidth(i); - if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) { - numberOfSpaces = spaces.length; - diffSpace = (this.width - currentLineWidth) / numberOfSpaces; - for (var j = 0, jlen = line.length; j <= jlen; j++) { - charBound = this.__charBounds[i][j]; - if (this._reSpaceAndTab.test(line[j])) { - charBound.width += diffSpace; - charBound.kernedWidth += diffSpace; - charBound.left += accumulatedSpace; - accumulatedSpace += diffSpace; - } - else { - charBound.left += accumulatedSpace; - } - } - } - } - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - return lineIndex === this._textLines.length - 1; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * It return always for text and Itext. - * @return Number - */ - missingNewlineOffset: function() { - return 1; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of text object - */ - toString: function() { - return '#'; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @param {Object} dim.x width of object to be cached - * @param {Object} dim.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var dims = this.callSuper('_getCacheCanvasDimensions'); - var fontSize = this.fontSize; - dims.width += fontSize * dims.zoomX; - dims.height += fontSize * dims.zoomY; - return dims; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - this._setTextStyles(ctx); - this._renderTextLinesBackground(ctx); - this._renderTextDecoration(ctx, 'underline'); - this._renderText(ctx); - this._renderTextDecoration(ctx, 'overline'); - this._renderTextDecoration(ctx, 'linethrough'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderText: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderTextStroke(ctx); - this._renderTextFill(ctx); - } - else { - this._renderTextFill(ctx); - this._renderTextStroke(ctx); - } - }, - - /** - * Set the font parameter of the context with the object properties or with charStyle - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [charStyle] object with font style properties - * @param {String} [charStyle.fontFamily] Font Family - * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix ) - * @param {String} [charStyle.fontWeight] Font weight - * @param {String} [charStyle.fontStyle] Font style (italic|normal) - */ - _setTextStyles: function(ctx, charStyle, forMeasuring) { - ctx.textBaseline = 'alphabetic'; - ctx.font = this._getFontDeclaration(charStyle, forMeasuring); - }, - - /** - * calculate and return the text Width measuring each line. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @return {Number} Maximum width of fabric.Text object - */ - calcTextWidth: function() { - var maxWidth = this.getLineWidth(0); - - for (var i = 1, len = this._textLines.length; i < len; i++) { - var currentLineWidth = this.getLineWidth(i); - if (currentLineWidth > maxWidth) { - maxWidth = currentLineWidth; - } - } - return maxWidth; - }, - - /** - * @private - * @param {String} method Method name ("fillText" or "strokeText") - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} line Text to render - * @param {Number} left Left position of text - * @param {Number} top Top position of text - * @param {Number} lineIndex Index of a line in a text - */ - _renderTextLine: function(method, ctx, line, left, top, lineIndex) { - this._renderChars(method, ctx, line, left, top, lineIndex); - }, - - /** - * Renders the text background for lines, taking care of style - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextLinesBackground: function(ctx) { - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) { - return; - } - var heightOfLine, - lineLeftOffset, originalFill = ctx.fillStyle, - line, lastColor, - leftOffset = this._getLeftOffset(), - lineTopOffset = this._getTopOffset(), - boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path, - drawStart; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) { - lineTopOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - lineLeftOffset = this._getLineLeftOffset(i); - boxWidth = 0; - boxStart = 0; - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillStyle = currentColor; - currentColor && ctx.fillRect( - -charBox.width / 2, - -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction), - charBox.width, - heightOfLine / this.lineHeight - ); - ctx.restore(); - } - else if (currentColor !== lastColor) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = lastColor; - lastColor && ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - if (currentColor && !path) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentColor; - ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - } - lineTopOffset += heightOfLine; - } - ctx.fillStyle = originalFill; - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {Object} decl style declaration for cache - * @param {String} decl.fontFamily fontFamily - * @param {String} decl.fontStyle fontStyle - * @param {String} decl.fontWeight fontWeight - * @return {Object} reference to cache - */ - getFontCache: function(decl) { - var fontFamily = decl.fontFamily.toLowerCase(); - if (!fabric.charWidthsCache[fontFamily]) { - fabric.charWidthsCache[fontFamily] = { }; - } - var cache = fabric.charWidthsCache[fontFamily], - cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase(); - if (!cache[cacheProp]) { - cache[cacheProp] = { }; - } - return cache[cacheProp]; - }, - - /** - * measure and return the width of a single character. - * possibly overridden to accommodate different measure logic or - * to hook some external lib for character measurement - * @private - * @param {String} _char, char to be measured - * @param {Object} charStyle style of char to be measured - * @param {String} [previousChar] previous char - * @param {Object} [prevCharStyle] style of previous char - */ - _measureChar: function(_char, charStyle, previousChar, prevCharStyle) { - // first i try to return from cache - var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle), - previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char, - stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth, - fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth; - - if (previousChar && fontCache[previousChar] !== undefined) { - previousWidth = fontCache[previousChar]; - } - if (fontCache[_char] !== undefined) { - kernedWidth = width = fontCache[_char]; - } - if (stylesAreEqual && fontCache[couple] !== undefined) { - coupleWidth = fontCache[couple]; - kernedWidth = coupleWidth - previousWidth; - } - if (width === undefined || previousWidth === undefined || coupleWidth === undefined) { - var ctx = this.getMeasuringContext(); - // send a TRUE to specify measuring font size CACHE_FONT_SIZE - this._setTextStyles(ctx, charStyle, true); - } - if (width === undefined) { - kernedWidth = width = ctx.measureText(_char).width; - fontCache[_char] = width; - } - if (previousWidth === undefined && stylesAreEqual && previousChar) { - previousWidth = ctx.measureText(previousChar).width; - fontCache[previousChar] = previousWidth; - } - if (stylesAreEqual && coupleWidth === undefined) { - // we can measure the kerning couple and subtract the width of the previous character - coupleWidth = ctx.measureText(couple).width; - fontCache[couple] = coupleWidth; - kernedWidth = coupleWidth - previousWidth; - } - return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier }; - }, - - /** - * Computes height of character at given position - * @param {Number} line the line index number - * @param {Number} _char the character index number - * @return {Number} fontSize of the character - */ - getHeightOfChar: function(line, _char) { - return this.getValueOfPropertyAt(line, _char, 'fontSize'); - }, - - /** - * measure a text line measuring all characters. - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - measureLine: function(lineIndex) { - var lineInfo = this._measureLine(lineIndex); - if (this.charSpacing !== 0) { - lineInfo.width -= this._getWidthOfCharSpacing(); - } - if (lineInfo.width < 0) { - lineInfo.width = 0; - } - return lineInfo; - }, - - /** - * measure every grapheme of a line, populating __charBounds - * @param {Number} lineIndex - * @return {Object} object.width total width of characters - * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs - */ - _measureLine: function(lineIndex) { - var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme, - graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length), - positionInPath = 0, startingPoint, totalPathLength, path = this.path; - - this.__charBounds[lineIndex] = lineBounds; - if (path) { - startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo); - totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length; - startingPoint.x += path.pathOffset.x; - startingPoint.y += path.pathOffset.y; - } - for (i = 0; i < line.length; i++) { - grapheme = line[i]; - graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme); - if (path) { - if (positionInPath > totalPathLength) { - positionInPath %= totalPathLength; - } - // it would probably much fater to send all the grapheme position for a line - // and calculate path position/angle at once. - this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint); - } - lineBounds[i] = graphemeInfo; - width += graphemeInfo.kernedWidth; - positionInPath += graphemeInfo.kernedWidth; - prevGrapheme = grapheme; - } - // this latest bound box represent the last character of the line - // to simplify cursor handling in interactive mode. - lineBounds[i] = { - left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0, - width: 0, - kernedWidth: 0, - height: this.fontSize - }; - return { width: width, numOfSpaces: numOfSpaces }; - }, - - /** - * Calculate the angle and the left,top position of the char that follow a path. - * It appends it to graphemeInfo to be reused later at rendering - * @private - * @param {Number} positionInPath to be measured - * @param {Object} graphemeInfo current grapheme box information - * @param {Object} startingPoint position of the point - */ - _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) { - var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2, - path = this.path; - - // we are at currentPositionOnPath. we want to know what point on the path is. - var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo); - graphemeInfo.renderLeft = info.x - startingPoint.x; - graphemeInfo.renderTop = info.y - startingPoint.y; - graphemeInfo.angle = info.angle; - }, - - /** - * Measure and return the info of a single grapheme. - * needs the the info of previous graphemes already filled - * @private - * @param {String} grapheme to be measured - * @param {Number} lineIndex index of the line where the char is - * @param {Number} charIndex position in the line - * @param {String} [prevGrapheme] character preceding the one to be measured - */ - _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) { - var style = this.getCompleteStyleDeclaration(lineIndex, charIndex), - prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { }, - info = this._measureChar(grapheme, style, prevGrapheme, prevStyle), - kernedWidth = info.kernedWidth, - width = info.width, charSpacing; - - if (this.charSpacing !== 0) { - charSpacing = this._getWidthOfCharSpacing(); - width += charSpacing; - kernedWidth += charSpacing; - } - - var box = { - width: width, - left: 0, - height: style.fontSize, - kernedWidth: kernedWidth, - deltaY: style.deltaY, - }; - if (charIndex > 0 && !skipLeft) { - var previousBox = this.__charBounds[lineIndex][charIndex - 1]; - box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width; - } - return box; - }, - - /** - * Calculate height of line at 'lineIndex' - * @param {Number} lineIndex index of line to calculate - * @return {Number} - */ - getHeightOfLine: function(lineIndex) { - if (this.__lineHeights[lineIndex]) { - return this.__lineHeights[lineIndex]; - } - - var line = this._textLines[lineIndex], - // char 0 is measured before the line cycle because it nneds to char - // emptylines - maxHeight = this.getHeightOfChar(lineIndex, 0); - for (var i = 1, len = line.length; i < len; i++) { - maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight); - } - - return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult; - }, - - /** - * Calculate text box height - */ - calcTextHeight: function() { - var lineHeight, height = 0; - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineHeight = this.getHeightOfLine(i); - height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight); - } - return height; - }, - - /** - * @private - * @return {Number} Left offset - */ - _getLeftOffset: function() { - return this.direction === 'ltr' ? -this.width / 2 : this.width / 2; - }, - - /** - * @private - * @return {Number} Top offset - */ - _getTopOffset: function() { - return -this.height / 2; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} method Method name ("fillText" or "strokeText") - */ - _renderTextCommon: function(ctx, method) { - ctx.save(); - var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(); - for (var i = 0, len = this._textLines.length; i < len; i++) { - var heightOfLine = this.getHeightOfLine(i), - maxHeight = heightOfLine / this.lineHeight, - leftOffset = this._getLineLeftOffset(i); - this._renderTextLine( - method, - ctx, - this._textLines[i], - left + leftOffset, - top + lineHeights + maxHeight, - i - ); - lineHeights += heightOfLine; - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextFill: function(ctx) { - if (!this.fill && !this.styleHas('fill')) { - return; - } - - this._renderTextCommon(ctx, 'fillText'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextStroke: function(ctx) { - if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - this._setLineDash(ctx, this.strokeDashArray); - ctx.beginPath(); - this._renderTextCommon(ctx, 'strokeText'); - ctx.closePath(); - ctx.restore(); - }, - - /** - * @private - * @param {String} method fillText or strokeText. - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Array} line Content of the line, splitted in an array by grapheme - * @param {Number} left - * @param {Number} top - * @param {Number} lineIndex - */ - _renderChars: function(method, ctx, line, left, top, lineIndex) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, - boxWidth = 0, - timeToRender, - path = this.path, - shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path, - isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1, - drawingLeft; - - ctx.save(); - top -= lineHeight * this._fontSizeFraction / this.lineHeight; - if (shortCut) { - // render all the line in one pass without checking - // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex); - ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); - ctx.direction = isLtr ? 'ltr' : 'rtl'; - ctx.textAlign = isLtr ? 'left' : 'right'; - this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight); - ctx.restore(); - return; - } - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing || path; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - left += sign * (charBox.kernedWidth - charBox.width); - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChanged(actualStyle, nextStyle); - } - if (timeToRender) { - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight); - ctx.restore(); - } - else { - drawingLeft = left; - ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); - ctx.direction = isLtr ? 'ltr' : 'rtl'; - ctx.textAlign = isLtr ? 'left' : 'right'; - this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight); - } - charsToRender = ''; - actualStyle = nextStyle; - left += sign * boxWidth; - boxWidth = 0; - } - } - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {fabric.Gradient} filler a fabric gradient instance - * @return {CanvasPattern} a pattern to use as fill/stroke style - */ - _applyPatternGradientTransformText: function(filler) { - var pCanvas = fabric.util.createCanvasElement(), pCtx, - // TODO: verify compatibility with strokeUniform - width = this.width + this.strokeWidth, height = this.height + this.strokeWidth; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.fillStyle = filler.toLive(pCtx); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fill(); - return pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - handleFiller: function(ctx, property, filler) { - var offsetX, offsetY; - if (filler.toLive) { - if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - offsetX = -this.width / 2; - offsetY = -this.height / 2; - ctx.translate(offsetX, offsetY); - ctx[property] = this._applyPatternGradientTransformText(filler); - return { offsetX: offsetX, offsetY: offsetY }; - } - else { - // is a simple gradient or pattern - ctx[property] = filler.toLive(ctx, this); - return this._applyPatternGradientTransform(ctx, filler); - } - } - else { - // is a color - ctx[property] = filler; - } - return { offsetX: 0, offsetY: 0 }; - }, - - _setStrokeStyles: function(ctx, decl) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = this.strokeLineCap; - ctx.lineDashOffset = this.strokeDashOffset; - ctx.lineJoin = this.strokeLineJoin; - ctx.miterLimit = this.strokeMiterLimit; - return this.handleFiller(ctx, 'strokeStyle', decl.stroke); - }, - - _setFillStyles: function(ctx, decl) { - return this.handleFiller(ctx, 'fillStyle', decl.fill); - }, - - /** - * @private - * @param {String} method - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {String} _char - * @param {Number} left Left coordinate - * @param {Number} top Top coordinate - * @param {Number} lineHeight Height of the line - */ - _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) { - var decl = this._getStyleDeclaration(lineIndex, charIndex), - fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex), - shouldFill = method === 'fillText' && fullDecl.fill, - shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth, - fillOffsets, strokeOffsets; - - if (!shouldStroke && !shouldFill) { - return; - } - ctx.save(); - - shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl)); - shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl)); - - ctx.font = this._getFontDeclaration(fullDecl); - - - if (decl && decl.textBackgroundColor) { - this._removeShadow(ctx); - } - if (decl && decl.deltaY) { - top += decl.deltaY; - } - shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY); - shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY); - ctx.restore(); - }, - - /** - * Turns the character into a 'superior figure' (i.e. 'superscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSuperscript: function(start, end) { - return this._setScript(start, end, this.superscript); - }, - - /** - * Turns the character into an 'inferior figure' (i.e. 'subscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSubscript: function(start, end) { - return this._setScript(start, end, this.subscript); - }, - - /** - * Applies 'schema' at given position - * @private - * @param {Number} start selection start - * @param {Number} end selection end - * @param {Number} schema - * @returns {fabric.Text} thisArg - * @chainable - */ - _setScript: function(start, end, schema) { - var loc = this.get2DCursorLocation(start, true), - fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'), - dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'), - style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline }; - this.setSelectionStyles(style, start, end); - return this; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChanged: function(prevStyle, thisStyle) { - return prevStyle.fill !== thisStyle.fill || - prevStyle.stroke !== thisStyle.stroke || - prevStyle.strokeWidth !== thisStyle.strokeWidth || - prevStyle.fontSize !== thisStyle.fontSize || - prevStyle.fontFamily !== thisStyle.fontFamily || - prevStyle.fontWeight !== thisStyle.fontWeight || - prevStyle.fontStyle !== thisStyle.fontStyle || - prevStyle.deltaY !== thisStyle.deltaY; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChangedForSvg: function(prevStyle, thisStyle) { - return this._hasStyleChanged(prevStyle, thisStyle) || - prevStyle.overline !== thisStyle.overline || - prevStyle.underline !== thisStyle.underline || - prevStyle.linethrough !== thisStyle.linethrough; - }, - - /** - * @private - * @param {Number} lineIndex index text line - * @return {Number} Line left offset - */ - _getLineLeftOffset: function(lineIndex) { - var lineWidth = this.getLineWidth(lineIndex), - lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction, - isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex); - if (textAlign === 'justify' - || (textAlign === 'justify-center' && !isEndOfWrapping) - || (textAlign === 'justify-right' && !isEndOfWrapping) - || (textAlign === 'justify-left' && !isEndOfWrapping) - ) { - return 0; - } - if (textAlign === 'center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'right') { - leftOffset = lineDiff; - } - if (textAlign === 'justify-center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'justify-right') { - leftOffset = lineDiff; - } - if (direction === 'rtl') { - leftOffset -= lineDiff; - } - return leftOffset; - }, - - /** - * @private - */ - _clearCache: function() { - this.__lineWidths = []; - this.__lineHeights = []; - this.__charBounds = []; - }, - - /** - * @private - */ - _shouldClearDimensionCache: function() { - var shouldClear = this._forceClearCache; - shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps')); - if (shouldClear) { - this.dirty = true; - this._forceClearCache = false; - } - return shouldClear; - }, - - /** - * Measure a single line given its index. Used to calculate the initial - * text bounding box. The values are calculated and stored in __lineWidths cache. - * @private - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - getLineWidth: function(lineIndex) { - if (this.__lineWidths[lineIndex]) { - return this.__lineWidths[lineIndex]; - } - - var width, line = this._textLines[lineIndex], lineInfo; - - if (line === '') { - width = 0; - } - else { - lineInfo = this.measureLine(lineIndex); - width = lineInfo.width; - } - this.__lineWidths[lineIndex] = width; - return width; - }, - - _getWidthOfCharSpacing: function() { - if (this.charSpacing !== 0) { - return this.fontSize * this.charSpacing / 1000; - } - return 0; - }, - - /** - * Retrieves the value of property at given character position - * @param {Number} lineIndex the line number - * @param {Number} charIndex the character number - * @param {String} property the property name - * @returns the value of 'property' - */ - getValueOfPropertyAt: function(lineIndex, charIndex, property) { - var charStyle = this._getStyleDeclaration(lineIndex, charIndex); - if (charStyle && typeof charStyle[property] !== 'undefined') { - return charStyle[property]; - } - return this[property]; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextDecoration: function(ctx, type) { - if (!this[type] && !this.styleHas(type)) { - return; - } - var heightOfLine, size, _size, - lineLeftOffset, dy, _dy, - line, lastDecoration, - leftOffset = this._getLeftOffset(), - topOffset = this._getTopOffset(), top, - boxStart, boxWidth, charBox, currentDecoration, - maxHeight, currentFill, lastFill, path = this.path, - charSpacing = this._getWidthOfCharSpacing(), - offsetY = this.offsets[type]; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this[type] && !this.styleHas(type, i)) { - topOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - maxHeight = heightOfLine / this.lineHeight; - lineLeftOffset = this._getLineLeftOffset(i); - boxStart = 0; - boxWidth = 0; - lastDecoration = this.getValueOfPropertyAt(i, 0, type); - lastFill = this.getValueOfPropertyAt(i, 0, 'fill'); - top = topOffset + maxHeight * (1 - this._fontSizeFraction); - size = this.getHeightOfChar(i, 0); - dy = this.getValueOfPropertyAt(i, 0, 'deltaY'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentDecoration = this.getValueOfPropertyAt(i, j, type); - currentFill = this.getValueOfPropertyAt(i, j, 'fill'); - _size = this.getHeightOfChar(i, j); - _dy = this.getValueOfPropertyAt(i, j, 'deltaY'); - if (path && currentDecoration && currentFill) { - ctx.save(); - ctx.fillStyle = lastFill; - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillRect( - -charBox.kernedWidth / 2, - offsetY * _size + _dy, - charBox.kernedWidth, - this.fontSize / 15 - ); - ctx.restore(); - } - else if ( - (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) - && boxWidth > 0 - ) { - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - if (lastDecoration && lastFill) { - ctx.fillStyle = lastFill; - ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth, - this.fontSize / 15 - ); - } - boxStart = charBox.left; - boxWidth = charBox.width; - lastDecoration = currentDecoration; - lastFill = currentFill; - size = _size; - dy = _dy; - } - else { - boxWidth += charBox.kernedWidth; - } - } - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentFill; - currentDecoration && currentFill && ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth - charSpacing, - this.fontSize / 15 - ); - topOffset += heightOfLine; - } - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * return font declaration string for canvas context - * @param {Object} [styleObject] object - * @returns {String} font declaration formatted for canvas context. - */ - _getFontDeclaration: function(styleObject, forMeasuring) { - var style = styleObject || this, family = this.fontFamily, - fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1; - var fontFamily = family === undefined || - family.indexOf('\'') > -1 || family.indexOf(',') > -1 || - family.indexOf('"') > -1 || fontIsGeneric - ? style.fontFamily : '"' + style.fontFamily + '"'; - return [ - // node-canvas needs "weight style", while browsers need "style weight" - // verify if this can be fixed in JSDOM - (fabric.isLikelyNode ? style.fontWeight : style.fontStyle), - (fabric.isLikelyNode ? style.fontStyle : style.fontWeight), - forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px', - fontFamily - ].join(' '); - }, - - /** - * Renders text instance on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if object is not visible - if (!this.visible) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - } - this.callSuper('render', ctx); - }, - - /** - * Returns the text as an array of lines. - * @param {String} text text to split - * @returns {Array} Lines in the text - */ - _splitTextIntoLines: function(text) { - var lines = text.split(this._reNewline), - newLines = new Array(lines.length), - newLine = ['\n'], - newText = []; - for (var i = 0; i < lines.length; i++) { - newLines[i] = fabric.util.string.graphemeSplit(lines[i]); - newText = newText.concat(newLines[i], newLine); - } - newText.pop(); - return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var additionalProperties = [ - 'text', - 'fontSize', - 'fontWeight', - 'fontFamily', - 'fontStyle', - 'lineHeight', - 'underline', - 'overline', - 'linethrough', - 'textAlign', - 'textBackgroundColor', - 'charSpacing', - 'path', - 'direction', - ].concat(propertiesToInclude); - var obj = this.callSuper('toObject', additionalProperties); - obj.styles = clone(this.styles, true); - obj.path = this.path && this.path.toObject(); - return obj; - }, - - /** - * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. - * @param {String|Object} key Property name or object (if object, iterate over the object properties) - * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) - * @return {fabric.Object} thisArg - * @chainable - */ - set: function(key, value) { - this.callSuper('set', key, value); - var needsDims = false; - var isAddingPath = false; - if (typeof key === 'object') { - for (var _key in key) { - if (_key === 'path') { - this.setPathInfo(); - } - needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1; - isAddingPath = isAddingPath || _key === 'path'; - } - } - else { - needsDims = this._dimensionAffectingProps.indexOf(key) !== -1; - isAddingPath = key === 'path'; - } - if (isAddingPath) { - this.setPathInfo(); - } - if (needsDims) { - this.initDimensions(); - this.setCoords(); - } - return this; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement}) - * @static - * @memberOf fabric.Text - * @see: http://www.w3.org/TR/SVG/text.html#TextElement - */ - fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat( - 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' ')); - - /** - * Default SVG font size - * @static - * @memberOf fabric.Text - */ - fabric.Text.DEFAULT_SVG_FONT_SIZE = 16; - - /** - * Returns fabric.Text instance from an SVG element (not yet implemented) - * @static - * @memberOf fabric.Text - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Text.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - - var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES), - parsedAnchor = parsedAttributes.textAnchor || 'left'; - options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes); - - options.top = options.top || 0; - options.left = options.left || 0; - if (parsedAttributes.textDecoration) { - var textDecoration = parsedAttributes.textDecoration; - if (textDecoration.indexOf('underline') !== -1) { - options.underline = true; - } - if (textDecoration.indexOf('overline') !== -1) { - options.overline = true; - } - if (textDecoration.indexOf('line-through') !== -1) { - options.linethrough = true; - } - delete options.textDecoration; - } - if ('dx' in parsedAttributes) { - options.left += parsedAttributes.dx; - } - if ('dy' in parsedAttributes) { - options.top += parsedAttributes.dy; - } - if (!('fontSize' in options)) { - options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; - } - - var textContent = ''; - - // The XML is not properly parsed in IE9 so a workaround to get - // textContent is through firstChild.data. Another workaround would be - // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does) - if (!('textContent' in element)) { - if ('firstChild' in element && element.firstChild !== null) { - if ('data' in element.firstChild && element.firstChild.data !== null) { - textContent = element.firstChild.data; - } - } - } - else { - textContent = element.textContent; - } - - textContent = textContent.replace(/^\s+|\s+$|\n+/g, '').replace(/\s+/g, ' '); - var originalStrokeWidth = options.strokeWidth; - options.strokeWidth = 0; - - var text = new fabric.Text(textContent, options), - textHeightScaleFactor = text.getScaledHeight() / text.height, - lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height, - scaledDiff = lineHeightDiff * textHeightScaleFactor, - textHeight = text.getScaledHeight() + scaledDiff, - offX = 0; - /* - Adjust positioning: - x/y attributes in SVG correspond to the bottom-left corner of text bounding box - fabric output by default at top, left. - */ - if (parsedAnchor === 'center') { - offX = text.getScaledWidth() / 2; - } - if (parsedAnchor === 'right') { - offX = text.getScaledWidth(); - } - text.set({ - left: text.left - offX, - top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight, - strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1, - }); - callback(text); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Text instance from an object representation - * @static - * @memberOf fabric.Text - * @param {Object} object plain js Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created - */ - fabric.Text.fromObject = function(object, callback) { - var objectCopy = clone(object), path = object.path; - delete objectCopy.path; - return fabric.Object._fromObject('Text', objectCopy, function(textInstance) { - if (path) { - fabric.Object._fromObject('Path', path, function(pathInstance) { - textInstance.set('path', pathInstance); - callback(textInstance); - }, 'path'); - } - else { - callback(textInstance); - } - }, 'text'); - }; - - fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace']; - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text); - -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return true; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - return true; - }, - - /** - * Returns true if object has a style property or has it ina specified line - * This function is used to detect if a text will use a particular property or not. - * @param {String} property to check for - * @param {Number} lineIndex to check the style on - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (!this.styles || !property || property === '') { - return false; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return false; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] }; - // eslint-disable-next-line - for (var p1 in obj) { - // eslint-disable-next-line - for (var p2 in obj[p1]) { - if (typeof obj[p1][p2][property] !== 'undefined') { - return true; - } - } - } - return false; - }, - - /** - * Check if characters in a text have a value for a property - * whose value matches the textbox's value for that property. If so, - * the character-level property is deleted. If the character - * has no other properties, then it is also deleted. Finally, - * if the line containing that character has no other characters - * then it also is deleted. - * - * @param {string} property The property to compare between characters and text. - */ - cleanStyle: function(property) { - if (!this.styles || !property || property === '') { - return false; - } - var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue, - allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject; - // eslint-disable-next-line - for (var p1 in obj) { - letterCount = 0; - // eslint-disable-next-line - for (var p2 in obj[p1]) { - var styleObject = obj[p1][p2], - stylePropertyHasBeenSet = styleObject.hasOwnProperty(property); - - stylesCount++; - - if (stylePropertyHasBeenSet) { - if (!stylePropertyValue) { - stylePropertyValue = styleObject[property]; - } - else if (styleObject[property] !== stylePropertyValue) { - allStyleObjectPropertiesMatch = false; - } - - if (styleObject[property] === this[property]) { - delete styleObject[property]; - } - } - else { - allStyleObjectPropertiesMatch = false; - } - - if (Object.keys(styleObject).length !== 0) { - letterCount++; - } - else { - delete obj[p1][p2]; - } - } - - if (letterCount === 0) { - delete obj[p1]; - } - } - // if every grapheme has the same style set then - // delete those styles and set it on the parent - for (var i = 0; i < this._textLines.length; i++) { - graphemeCount += this._textLines[i].length; - } - if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) { - this[property] = stylePropertyValue; - this.removeStyle(property); - } - }, - - /** - * Remove a style property or properties from all individual character styles - * in a text object. Deletes the character style object if it contains no other style - * props. Deletes a line style object if it contains no other character styles. - * - * @param {String} props The property to remove from character styles. - */ - removeStyle: function(property) { - if (!this.styles || !property || property === '') { - return; - } - var obj = this.styles, line, lineNum, charNum; - for (lineNum in obj) { - line = obj[lineNum]; - for (charNum in line) { - delete line[charNum][property]; - if (Object.keys(line[charNum]).length === 0) { - delete line[charNum]; - } - } - if (Object.keys(line).length === 0) { - delete obj[lineNum]; - } - } - }, - - /** - * @private - */ - _extendStyles: function(index, styles) { - var loc = this.get2DCursorLocation(index); - - if (!this._getLineStyle(loc.lineIndex)) { - this._setLineStyle(loc.lineIndex); - } - - if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) { - this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {}); - } - - fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles); - }, - - /** - * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start) - * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used. - * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles. - */ - get2DCursorLocation: function(selectionStart, skipWrapping) { - if (typeof selectionStart === 'undefined') { - selectionStart = this.selectionStart; - } - var lines = skipWrapping ? this._unwrappedTextLines : this._textLines, - len = lines.length; - for (var i = 0; i < len; i++) { - if (selectionStart <= lines[i].length) { - return { - lineIndex: i, - charIndex: selectionStart - }; - } - selectionStart -= lines[i].length + this.missingNewlineOffset(i); - } - return { - lineIndex: i - 1, - charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart - }; - }, - - /** - * Gets style of a current selection/cursor (at the start position) - * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used. - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @param {Boolean} [complete] get full style or not - * @return {Array} styles an array with one, zero or more Style objects - */ - getSelectionStyles: function(startIndex, endIndex, complete) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - var styles = []; - for (var i = startIndex; i < endIndex; i++) { - styles.push(this.getStyleAtPosition(i, complete)); - } - return styles; - }, - - /** - * Gets style of a current selection/cursor position - * @param {Number} position to get styles at - * @param {Boolean} [complete] full style if true - * @return {Object} style Style object at a specified index - * @private - */ - getStyleAtPosition: function(position, complete) { - var loc = this.get2DCursorLocation(position), - style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) : - this._getStyleDeclaration(loc.lineIndex, loc.charIndex); - return style || {}; - }, - - /** - * Sets style of a current selection, if no selection exist, do not set anything. - * @param {Object} [styles] Styles object - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @return {fabric.IText} thisArg - * @chainable - */ - setSelectionStyles: function(styles, startIndex, endIndex) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - for (var i = startIndex; i < endIndex; i++) { - this._extendStyles(i, styles); - } - /* not included in _extendStyles to avoid clearing cache more than once */ - this._forceClearCache = true; - return this; - }, - - /** - * get the reference, not a clone, of the style object for a given character - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Object} style object - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - var lineStyle = this.styles && this.styles[lineIndex]; - if (!lineStyle) { - return null; - } - return lineStyle[charIndex]; - }, - - /** - * return a new object that contains all the style property for a character - * the object returned is newly created - * @param {Number} lineIndex of the line where the character is - * @param {Number} charIndex position of the character on the line - * @return {Object} style object - */ - getCompleteStyleDeclaration: function(lineIndex, charIndex) { - var style = this._getStyleDeclaration(lineIndex, charIndex) || { }, - styleObject = { }, prop; - for (var i = 0; i < this._styleProperties.length; i++) { - prop = this._styleProperties[i]; - styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop]; - } - return styleObject; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - this.styles[lineIndex][charIndex] = style; - }, - - /** - * - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - delete this.styles[lineIndex][charIndex]; - }, - - /** - * @param {Number} lineIndex - * @return {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - return !!this.styles[lineIndex]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @private - */ - _setLineStyle: function(lineIndex) { - this.styles[lineIndex] = {}; - }, - - /** - * @param {Number} lineIndex - * @private - */ - _deleteLineStyle: function(lineIndex) { - delete this.styles[lineIndex]; - } - }); -})(); - - -(function() { - - function parseDecoration(object) { - if (object.textDecoration) { - object.textDecoration.indexOf('underline') > -1 && (object.underline = true); - object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true); - object.textDecoration.indexOf('overline') > -1 && (object.overline = true); - delete object.textDecoration; - } - } - - /** - * IText class (introduced in v1.4) Events are also fired with "text:" - * prefix when observing canvas. - * @class fabric.IText - * @extends fabric.Text - * @mixes fabric.Observable - * - * @fires changed - * @fires selection:changed - * @fires editing:entered - * @fires editing:exited - * - * @return {fabric.IText} thisArg - * @see {@link fabric.IText#initialize} for constructor definition - * - *

    Supported key combinations:

    - *
    -   *   Move cursor:                    left, right, up, down
    -   *   Select character:               shift + left, shift + right
    -   *   Select text vertically:         shift + up, shift + down
    -   *   Move cursor by word:            alt + left, alt + right
    -   *   Select words:                   shift + alt + left, shift + alt + right
    -   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end
    -   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end
    -   *   Jump to start/end of text:      cmd + up, cmd + down
    -   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown
    -   *   Delete character:               backspace
    -   *   Delete word:                    alt + backspace
    -   *   Delete line:                    cmd + backspace
    -   *   Forward delete:                 delete
    -   *   Copy text:                      ctrl/cmd + c
    -   *   Paste text:                     ctrl/cmd + v
    -   *   Cut text:                       ctrl/cmd + x
    -   *   Select entire text:             ctrl/cmd + a
    -   *   Quit editing                    tab or esc
    -   * 
    - * - *

    Supported mouse/touch combination

    - *
    -   *   Position cursor:                click/touch
    -   *   Create selection:               click/touch & drag
    -   *   Create selection:               click & shift + click
    -   *   Select word:                    double click
    -   *   Select line:                    triple click
    -   * 
    - */ - fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'i-text', - - /** - * Index where text selection starts (or where cursor is when there is no selection) - * @type Number - * @default - */ - selectionStart: 0, - - /** - * Index where text selection ends - * @type Number - * @default - */ - selectionEnd: 0, - - /** - * Color of text selection - * @type String - * @default - */ - selectionColor: 'rgba(17,119,255,0.3)', - - /** - * Indicates whether text is in editing mode - * @type Boolean - * @default - */ - isEditing: false, - - /** - * Indicates whether a text can be edited - * @type Boolean - * @default - */ - editable: true, - - /** - * Border color of text object while it's in editing mode - * @type String - * @default - */ - editingBorderColor: 'rgba(102,153,255,0.25)', - - /** - * Width of cursor (in px) - * @type Number - * @default - */ - cursorWidth: 2, - - /** - * Color of text cursor color in editing mode. - * if not set (default) will take color from the text. - * if set to a color value that fabric can understand, it will - * be used instead of the color of the text at the current position. - * @type String - * @default - */ - cursorColor: '', - - /** - * Delay between cursor blink (in ms) - * @type Number - * @default - */ - cursorDelay: 1000, - - /** - * Duration of cursor fadein (in ms) - * @type Number - * @default - */ - cursorDuration: 600, - - /** - * Indicates whether internal text char widths can be cached - * @type Boolean - * @default - */ - caching: true, - - /** - * @private - */ - _reSpace: /\s|\n/, - - /** - * @private - */ - _currentCursorOpacity: 0, - - /** - * @private - */ - _selectionDirection: null, - - /** - * @private - */ - _abortCursorAnimation: false, - - /** - * @private - */ - __widthOfSpace: [], - - /** - * Helps determining when the text is in composition, so that the cursor - * rendering is altered. - */ - inCompositionMode: false, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.IText} thisArg - */ - initialize: function(text, options) { - this.callSuper('initialize', text, options); - this.initBehavior(); - }, - - /** - * Sets selection start (left boundary of a selection) - * @param {Number} index Index to set selection start to - */ - setSelectionStart: function(index) { - index = Math.max(index, 0); - this._updateAndFire('selectionStart', index); - }, - - /** - * Sets selection end (right boundary of a selection) - * @param {Number} index Index to set selection end to - */ - setSelectionEnd: function(index) { - index = Math.min(index, this.text.length); - this._updateAndFire('selectionEnd', index); - }, - - /** - * @private - * @param {String} property 'selectionStart' or 'selectionEnd' - * @param {Number} index new position of property - */ - _updateAndFire: function(property, index) { - if (this[property] !== index) { - this._fireSelectionChanged(); - this[property] = index; - } - this._updateTextarea(); - }, - - /** - * Fires the even of selection changed - * @private - */ - _fireSelectionChanged: function() { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - }, - - /** - * Initialize text dimensions. Render all text on given context - * or on a offscreen canvas to get the text width with measureText. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - * @private - */ - initDimensions: function() { - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this.callSuper('initDimensions'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - this.clearContextTop(); - this.callSuper('render', ctx); - // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor - // the correct position but not at every cursor animation. - this.cursorOffsetCache = { }; - this.renderCursorOrSelection(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - this.callSuper('_render', ctx); - }, - - /** - * Prepare and clean the contextTop - */ - clearContextTop: function(skipRestore) { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - this.transform(ctx); - this._clearTextArea(ctx); - skipRestore || ctx.restore(); - }, - /** - * Renders cursor or selection (depending on what exists) - * it does on the contextTop. If contextTop is not available, do nothing. - */ - renderCursorOrSelection: function() { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var boundaries = this._getCursorBoundaries(), - ctx = this.canvas.contextTop; - this.clearContextTop(true); - if (this.selectionStart === this.selectionEnd) { - this.renderCursor(boundaries, ctx); - } - else { - this.renderSelection(boundaries, ctx); - } - ctx.restore(); - }, - - _clearTextArea: function(ctx) { - // we add 4 pixel, to be sure to do not leave any pixel out - var width = this.width + 4, height = this.height + 4; - ctx.clearRect(-width / 2, -height / 2, width, height); - }, - - /** - * Returns cursor boundaries (left, top, leftOffset, topOffset) - * @private - * @param {Array} chars Array of characters - * @param {String} typeOfBoundaries - */ - _getCursorBoundaries: function(position) { - - // left/top are left/top of entire text box - // leftOffset/topOffset are offset from that left/top point of a text box - - if (typeof position === 'undefined') { - position = this.selectionStart; - } - - var left = this._getLeftOffset(), - top = this._getTopOffset(), - offsets = this._getCursorBoundariesOffsets(position); - return { - left: left, - top: top, - leftOffset: offsets.left, - topOffset: offsets.top - }; - }, - - /** - * @private - */ - _getCursorBoundariesOffsets: function(position) { - if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) { - return this.cursorOffsetCache; - } - var lineLeftOffset, - lineIndex, - charIndex, - topOffset = 0, - leftOffset = 0, - boundaries, - cursorPosition = this.get2DCursorLocation(position); - charIndex = cursorPosition.charIndex; - lineIndex = cursorPosition.lineIndex; - for (var i = 0; i < lineIndex; i++) { - topOffset += this.getHeightOfLine(i); - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - var bound = this.__charBounds[lineIndex][charIndex]; - bound && (leftOffset = bound.left); - if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) { - leftOffset -= this._getWidthOfCharSpacing(); - } - boundaries = { - top: topOffset, - left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0), - }; - if (this.direction === 'rtl') { - boundaries.left *= -1; - } - this.cursorOffsetCache = boundaries; - return this.cursorOffsetCache; - }, - - /** - * Renders cursor - * @param {Object} boundaries - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderCursor: function(boundaries, ctx) { - var cursorLocation = this.get2DCursorLocation(), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'), - multiplier = this.scaleX * this.canvas.getZoom(), - cursorWidth = this.cursorWidth / multiplier, - topOffset = boundaries.topOffset, - dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'); - topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight - - charHeight * (1 - this._fontSizeFraction); - - if (this.inCompositionMode) { - this.renderSelection(boundaries, ctx); - } - ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill'); - ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity; - ctx.fillRect( - boundaries.left + boundaries.leftOffset - cursorWidth / 2, - topOffset + boundaries.top + dy, - cursorWidth, - charHeight); - }, - - /** - * Renders text selection - * @param {Object} boundaries Object with left/top/leftOffset/topOffset - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderSelection: function(boundaries, ctx) { - - var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart, - selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd, - isJustify = this.textAlign.indexOf('justify') !== -1, - start = this.get2DCursorLocation(selectionStart), - end = this.get2DCursorLocation(selectionEnd), - startLine = start.lineIndex, - endLine = end.lineIndex, - startChar = start.charIndex < 0 ? 0 : start.charIndex, - endChar = end.charIndex < 0 ? 0 : end.charIndex; - - for (var i = startLine; i <= endLine; i++) { - var lineOffset = this._getLineLeftOffset(i) || 0, - lineHeight = this.getHeightOfLine(i), - realLineHeight = 0, boxStart = 0, boxEnd = 0; - - if (i === startLine) { - boxStart = this.__charBounds[startLine][startChar].left; - } - if (i >= startLine && i < endLine) { - boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5? - } - else if (i === endLine) { - if (endChar === 0) { - boxEnd = this.__charBounds[endLine][endChar].left; - } - else { - var charSpacing = this._getWidthOfCharSpacing(); - boxEnd = this.__charBounds[endLine][endChar - 1].left - + this.__charBounds[endLine][endChar - 1].width - charSpacing; - } - } - realLineHeight = lineHeight; - if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) { - lineHeight /= this.lineHeight; - } - var drawStart = boundaries.left + lineOffset + boxStart, - drawWidth = boxEnd - boxStart, - drawHeight = lineHeight, extraTop = 0; - if (this.inCompositionMode) { - ctx.fillStyle = this.compositionColor || 'black'; - drawHeight = 1; - extraTop = lineHeight; - } - else { - ctx.fillStyle = this.selectionColor; - } - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - drawWidth; - } - ctx.fillRect( - drawStart, - boundaries.top + boundaries.topOffset + extraTop, - drawWidth, - drawHeight); - boundaries.topOffset += realLineHeight; - } - }, - - /** - * High level function to know the height of the cursor. - * the currentChar is the one that precedes the cursor - * Returns fontSize of char at the current cursor - * Unused from the library, is for the end user - * @return {Number} Character font size - */ - getCurrentCharFontSize: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize'); - }, - - /** - * High level function to know the color of the cursor. - * the currentChar is the one that precedes the cursor - * Returns color (fill) of char at the current cursor - * if the text object has a pattern or gradient for filler, it will return that. - * Unused by the library, is for the end user - * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill) - */ - getCurrentCharColor: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fill'); - }, - - /** - * Returns the cursor position for the getCurrent.. functions - * @private - */ - _getCurrentCharIndex: function() { - var cursorPosition = this.get2DCursorLocation(this.selectionStart, true), - charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0; - return { l: cursorPosition.lineIndex, c: charIndex }; - } - }); - - /** - * Returns fabric.IText instance from an object representation - * @static - * @memberOf fabric.IText - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as argument - */ - fabric.IText.fromObject = function(object, callback) { - parseDecoration(object); - if (object.styles) { - for (var i in object.styles) { - for (var j in object.styles[i]) { - parseDecoration(object.styles[i][j]); - } - } - } - fabric.Object._fromObject('IText', object, callback, 'text'); - }; -})(); - - -(function() { - - var clone = fabric.util.object.clone; - - fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes all the interactive behavior of IText - */ - initBehavior: function() { - this.initAddedHandler(); - this.initRemovedHandler(); - this.initCursorSelectionHandlers(); - this.initDoubleClickSimulation(); - this.mouseMoveHandler = this.mouseMoveHandler.bind(this); - }, - - onDeselect: function() { - this.isEditing && this.exitEditing(); - this.selected = false; - }, - - /** - * Initializes "added" event handler - */ - initAddedHandler: function() { - var _this = this; - this.on('added', function() { - var canvas = _this.canvas; - if (canvas) { - if (!canvas._hasITextHandlers) { - canvas._hasITextHandlers = true; - _this._initCanvasHandlers(canvas); - } - canvas._iTextInstances = canvas._iTextInstances || []; - canvas._iTextInstances.push(_this); - } - }); - }, - - initRemovedHandler: function() { - var _this = this; - this.on('removed', function() { - var canvas = _this.canvas; - if (canvas) { - canvas._iTextInstances = canvas._iTextInstances || []; - fabric.util.removeFromArray(canvas._iTextInstances, _this); - if (canvas._iTextInstances.length === 0) { - canvas._hasITextHandlers = false; - _this._removeCanvasHandlers(canvas); - } - } - }); - }, - - /** - * register canvas event to manage exiting on other instances - * @private - */ - _initCanvasHandlers: function(canvas) { - canvas._mouseUpITextHandler = function() { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.__isMousedown = false; - }); - } - }; - canvas.on('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * remove canvas event to manage exiting on other instances - * @private - */ - _removeCanvasHandlers: function(canvas) { - canvas.off('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * @private - */ - _tick: function() { - this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete'); - }, - - /** - * @private - */ - _animateCursor: function(obj, targetOpacity, duration, completeMethod) { - - var tickState; - - tickState = { - isAborted: false, - abort: function() { - this.isAborted = true; - }, - }; - - obj.animate('_currentCursorOpacity', targetOpacity, { - duration: duration, - onComplete: function() { - if (!tickState.isAborted) { - obj[completeMethod](); - } - }, - onChange: function() { - // we do not want to animate a selection, only cursor - if (obj.canvas && obj.selectionStart === obj.selectionEnd) { - obj.renderCursorOrSelection(); - } - }, - abort: function() { - return tickState.isAborted; - } - }); - return tickState; - }, - - /** - * @private - */ - _onTickComplete: function() { - - var _this = this; - - if (this._cursorTimeout1) { - clearTimeout(this._cursorTimeout1); - } - this._cursorTimeout1 = setTimeout(function() { - _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick'); - }, 100); - }, - - /** - * Initializes delayed cursor - */ - initDelayedCursor: function(restart) { - var _this = this, - delay = restart ? 0 : this.cursorDelay; - - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this._cursorTimeout2 = setTimeout(function() { - _this._tick(); - }, delay); - }, - - /** - * Aborts cursor animation and clears all timeouts - */ - abortCursorAnimation: function() { - var shouldClear = this._currentTickState || this._currentTickCompleteState, - canvas = this.canvas; - this._currentTickState && this._currentTickState.abort(); - this._currentTickCompleteState && this._currentTickCompleteState.abort(); - - clearTimeout(this._cursorTimeout1); - clearTimeout(this._cursorTimeout2); - - this._currentCursorOpacity = 0; - // to clear just itext area we need to transform the context - // it may not be worth it - if (shouldClear && canvas) { - canvas.clearContext(canvas.contextTop || canvas.contextContainer); - } - - }, - - /** - * Selects entire text - * @return {fabric.IText} thisArg - * @chainable - */ - selectAll: function() { - this.selectionStart = 0; - this.selectionEnd = this._text.length; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Returns selected text - * @return {String} - */ - getSelectedText: function() { - return this._text.slice(this.selectionStart, this.selectionEnd).join(''); - }, - - /** - * Find new selection index representing start of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - // remove space before cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index--; - } - } - while (/\S/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - // remove space after cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index++; - } - } - while (/\S/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Find new selection index representing start of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - while (!/\n/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - while (!/\n/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Finds index corresponding to beginning or end of a word - * @param {Number} selectionStart Index of a character - * @param {Number} direction 1 or -1 - * @return {Number} Index of the beginning or end of a word - */ - searchWordBoundary: function(selectionStart, direction) { - var text = this._text, - index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart, - _char = text[index], - // wrong - reNonWord = fabric.reNonWord; - - while (!reNonWord.test(_char) && index > 0 && index < text.length) { - index += direction; - _char = text[index]; - } - if (reNonWord.test(_char)) { - index += direction === 1 ? 0 : 1; - } - return index; - }, - - /** - * Selects a word based on the index - * @param {Number} selectionStart Index of a character - */ - selectWord: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ - newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - }, - - /** - * Selects a line based on the index - * @param {Number} selectionStart Index of a character - * @return {fabric.IText} thisArg - * @chainable - */ - selectLine: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.findLineBoundaryLeft(selectionStart), - newSelectionEnd = this.findLineBoundaryRight(selectionStart); - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Enters editing state - * @return {fabric.IText} thisArg - * @chainable - */ - enterEditing: function(e) { - if (this.isEditing || !this.editable) { - return; - } - - if (this.canvas) { - this.canvas.calcOffset(); - this.exitEditingOnOthers(this.canvas); - } - - this.isEditing = true; - - this.initHiddenTextarea(e); - this.hiddenTextarea.focus(); - this.hiddenTextarea.value = this.text; - this._updateTextarea(); - this._saveEditingProps(); - this._setEditingProps(); - this._textBeforeEdit = this.text; - - this._tick(); - this.fire('editing:entered'); - this._fireSelectionChanged(); - if (!this.canvas) { - return this; - } - this.canvas.fire('text:editing:entered', { target: this }); - this.initMouseMoveHandler(); - this.canvas.requestRenderAll(); - return this; - }, - - exitEditingOnOthers: function(canvas) { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.selected = false; - if (obj.isEditing) { - obj.exitEditing(); - } - }); - } - }, - - /** - * Initializes "mousemove" event handler - */ - initMouseMoveHandler: function() { - this.canvas.on('mouse:move', this.mouseMoveHandler); - }, - - /** - * @private - */ - mouseMoveHandler: function(options) { - if (!this.__isMousedown || !this.isEditing) { - return; - } - - var newSelectionStart = this.getSelectionStartFromPointer(options.e), - currentStart = this.selectionStart, - currentEnd = this.selectionEnd; - if ( - (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) - && - (currentStart === newSelectionStart || currentEnd === newSelectionStart) - ) { - return; - } - if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.selectionStart = this.__selectionStartOnMouseDown; - this.selectionEnd = newSelectionStart; - } - else { - this.selectionStart = newSelectionStart; - this.selectionEnd = this.__selectionStartOnMouseDown; - } - if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { - this.restartCursorIfNeeded(); - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - } - }, - - /** - * @private - */ - _setEditingProps: function() { - this.hoverCursor = 'text'; - - if (this.canvas) { - this.canvas.defaultCursor = this.canvas.moveCursor = 'text'; - } - - this.borderColor = this.editingBorderColor; - this.hasControls = this.selectable = false; - this.lockMovementX = this.lockMovementY = true; - }, - - /** - * convert from textarea to grapheme indexes - */ - fromStringToGraphemeSelection: function(start, end, text) { - var smallerTextStart = text.slice(0, start), - graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = text.slice(start, end), - graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * convert from fabric to textarea values - */ - fromGraphemeToStringSelection: function(start, end, _text) { - var smallerTextStart = _text.slice(0, start), - graphemeStart = smallerTextStart.join('').length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = _text.slice(start, end), - graphemeEnd = smallerTextEnd.join('').length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * @private - */ - _updateTextarea: function() { - this.cursorOffsetCache = { }; - if (!this.hiddenTextarea) { - return; - } - if (!this.inCompositionMode) { - var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text); - this.hiddenTextarea.selectionStart = newSelection.selectionStart; - this.hiddenTextarea.selectionEnd = newSelection.selectionEnd; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateFromTextArea: function() { - if (!this.hiddenTextarea) { - return; - } - this.cursorOffsetCache = { }; - this.text = this.hiddenTextarea.value; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - var newSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value); - this.selectionEnd = this.selectionStart = newSelection.selectionEnd; - if (!this.inCompositionMode) { - this.selectionStart = newSelection.selectionStart; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateTextareaPosition: function() { - if (this.selectionStart === this.selectionEnd) { - var style = this._calcTextareaPosition(); - this.hiddenTextarea.style.left = style.left; - this.hiddenTextarea.style.top = style.top; - } - }, - - /** - * @private - * @return {Object} style contains style for hiddenTextarea - */ - _calcTextareaPosition: function() { - if (!this.canvas) { - return { x: 1, y: 1 }; - } - var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart, - boundaries = this._getCursorBoundaries(desiredPosition), - cursorLocation = this.get2DCursorLocation(desiredPosition), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight, - leftOffset = boundaries.leftOffset, - m = this.calcTransformMatrix(), - p = { - x: boundaries.left + leftOffset, - y: boundaries.top + boundaries.topOffset + charHeight - }, - retinaScaling = this.canvas.getRetinaScaling(), - upperCanvas = this.canvas.upperCanvasEl, - upperCanvasWidth = upperCanvas.width / retinaScaling, - upperCanvasHeight = upperCanvas.height / retinaScaling, - maxWidth = upperCanvasWidth - charHeight, - maxHeight = upperCanvasHeight - charHeight, - scaleX = upperCanvas.clientWidth / upperCanvasWidth, - scaleY = upperCanvas.clientHeight / upperCanvasHeight; - - p = fabric.util.transformPoint(p, m); - p = fabric.util.transformPoint(p, this.canvas.viewportTransform); - p.x *= scaleX; - p.y *= scaleY; - if (p.x < 0) { - p.x = 0; - } - if (p.x > maxWidth) { - p.x = maxWidth; - } - if (p.y < 0) { - p.y = 0; - } - if (p.y > maxHeight) { - p.y = maxHeight; - } - - // add canvas offset on document - p.x += this.canvas._offset.left; - p.y += this.canvas._offset.top; - - return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight }; - }, - - /** - * @private - */ - _saveEditingProps: function() { - this._savedProps = { - hasControls: this.hasControls, - borderColor: this.borderColor, - lockMovementX: this.lockMovementX, - lockMovementY: this.lockMovementY, - hoverCursor: this.hoverCursor, - selectable: this.selectable, - defaultCursor: this.canvas && this.canvas.defaultCursor, - moveCursor: this.canvas && this.canvas.moveCursor - }; - }, - - /** - * @private - */ - _restoreEditingProps: function() { - if (!this._savedProps) { - return; - } - - this.hoverCursor = this._savedProps.hoverCursor; - this.hasControls = this._savedProps.hasControls; - this.borderColor = this._savedProps.borderColor; - this.selectable = this._savedProps.selectable; - this.lockMovementX = this._savedProps.lockMovementX; - this.lockMovementY = this._savedProps.lockMovementY; - - if (this.canvas) { - this.canvas.defaultCursor = this._savedProps.defaultCursor; - this.canvas.moveCursor = this._savedProps.moveCursor; - } - }, - - /** - * Exits from editing state - * @return {fabric.IText} thisArg - * @chainable - */ - exitEditing: function() { - var isTextChanged = (this._textBeforeEdit !== this.text); - var hiddenTextarea = this.hiddenTextarea; - this.selected = false; - this.isEditing = false; - - this.selectionEnd = this.selectionStart; - - if (hiddenTextarea) { - hiddenTextarea.blur && hiddenTextarea.blur(); - hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea); - } - this.hiddenTextarea = null; - this.abortCursorAnimation(); - this._restoreEditingProps(); - this._currentCursorOpacity = 0; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this.fire('editing:exited'); - isTextChanged && this.fire('modified'); - if (this.canvas) { - this.canvas.off('mouse:move', this.mouseMoveHandler); - this.canvas.fire('text:editing:exited', { target: this }); - isTextChanged && this.canvas.fire('object:modified', { target: this }); - } - return this; - }, - - /** - * @private - */ - _removeExtraneousStyles: function() { - for (var prop in this.styles) { - if (!this._textLines[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * remove and reflow a style block from start to end. - * @param {Number} start linear start position for removal (included in removal) - * @param {Number} end linear end position for removal ( excluded from removal ) - */ - removeStyleFromTo: function(start, end) { - var cursorStart = this.get2DCursorLocation(start, true), - cursorEnd = this.get2DCursorLocation(end, true), - lineStart = cursorStart.lineIndex, - charStart = cursorStart.charIndex, - lineEnd = cursorEnd.lineIndex, - charEnd = cursorEnd.charIndex, - i, styleObj; - if (lineStart !== lineEnd) { - // step1 remove the trailing of lineStart - if (this.styles[lineStart]) { - for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) { - delete this.styles[lineStart][i]; - } - } - // step2 move the trailing of lineEnd to lineStart if needed - if (this.styles[lineEnd]) { - for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) { - styleObj = this.styles[lineEnd][i]; - if (styleObj) { - this.styles[lineStart] || (this.styles[lineStart] = { }); - this.styles[lineStart][charStart + i - charEnd] = styleObj; - } - } - } - // step3 detects lines will be completely removed. - for (i = lineStart + 1; i <= lineEnd; i++) { - delete this.styles[i]; - } - // step4 shift remaining lines. - this.shiftLineStyles(lineEnd, lineStart - lineEnd); - } - else { - // remove and shift left on the same line - if (this.styles[lineStart]) { - styleObj = this.styles[lineStart]; - var diff = charEnd - charStart, numericChar, _char; - for (i = charStart; i < charEnd; i++) { - delete styleObj[i]; - } - for (_char in this.styles[lineStart]) { - numericChar = parseInt(_char, 10); - if (numericChar >= charEnd) { - styleObj[numericChar - diff] = styleObj[_char]; - delete styleObj[_char]; - } - } - } - } - }, - - /** - * Shifts line styles up or down - * @param {Number} lineIndex Index of a line - * @param {Number} offset Can any number? - */ - shiftLineStyles: function(lineIndex, offset) { - // shift all line styles by offset upward or downward - // do not clone deep. we need new array, not new style objects - var clonedStyles = clone(this.styles); - for (var line in this.styles) { - var numericLine = parseInt(line, 10); - if (numericLine > lineIndex) { - this.styles[numericLine + offset] = clonedStyles[numericLine]; - if (!clonedStyles[numericLine - offset]) { - delete this.styles[numericLine]; - } - } - } - }, - - restartCursorIfNeeded: function() { - if (!this._currentTickState || this._currentTickState.isAborted - || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted - ) { - this.initDelayedCursor(); - } - }, - - /** - * Handle insertion of more consecutive style lines for when one or more - * newlines gets added to the text. Since current style needs to be shifted - * first we shift the current style of the number lines needed, then we add - * new lines from the last to the first. - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} qty number of lines to add - * @param {Array} copiedStyle Array of objects styles - */ - insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) { - var currentCharStyle, - newLineStyles = {}, - somethingAdded = false, - isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex; - - qty || (qty = 1); - this.shiftLineStyles(lineIndex, qty); - if (this.styles[lineIndex]) { - currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]; - } - // we clone styles of all chars - // after cursor onto the current line - for (var index in this.styles[lineIndex]) { - var numIndex = parseInt(index, 10); - if (numIndex >= charIndex) { - somethingAdded = true; - newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index]; - // remove lines from the previous line since they're on a new line now - if (!(isEndOfLine && charIndex === 0)) { - delete this.styles[lineIndex][index]; - } - } - } - var styleCarriedOver = false; - if (somethingAdded && !isEndOfLine) { - // if is end of line, the extra style we copied - // is probably not something we want - this.styles[lineIndex + qty] = newLineStyles; - styleCarriedOver = true; - } - if (styleCarriedOver) { - // skip the last line of since we already prepared it. - qty--; - } - // for the all the lines or all the other lines - // we clone current char style onto the next (otherwise empty) line - while (qty > 0) { - if (copiedStyle && copiedStyle[qty - 1]) { - this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) }; - } - else if (currentCharStyle) { - this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) }; - } - else { - delete this.styles[lineIndex + qty]; - } - qty--; - } - this._forceClearCache = true; - }, - - /** - * Inserts style object for a given line/char index - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} quantity number Style object to insert, if given - * @param {Array} copiedStyle array of style objects - */ - insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) { - if (!this.styles) { - this.styles = {}; - } - var currentLineStyles = this.styles[lineIndex], - currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {}; - - quantity || (quantity = 1); - // shift all char styles by quantity forward - // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4 - for (var index in currentLineStylesCloned) { - var numericIndex = parseInt(index, 10); - if (numericIndex >= charIndex) { - currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex]; - // only delete the style if there was nothing moved there - if (!currentLineStylesCloned[numericIndex - quantity]) { - delete currentLineStyles[numericIndex]; - } - } - } - this._forceClearCache = true; - if (copiedStyle) { - while (quantity--) { - if (!Object.keys(copiedStyle[quantity]).length) { - continue; - } - if (!this.styles[lineIndex]) { - this.styles[lineIndex] = {}; - } - this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]); - } - return; - } - if (!currentLineStyles) { - return; - } - var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1]; - while (newStyle && quantity--) { - this.styles[lineIndex][charIndex + quantity] = clone(newStyle); - } - }, - - /** - * Inserts style object(s) - * @param {Array} insertedText Characters at the location where style is inserted - * @param {Number} start cursor index for inserting style - * @param {Array} [copiedStyle] array of style objects to insert. - */ - insertNewStyleBlock: function(insertedText, start, copiedStyle) { - var cursorLoc = this.get2DCursorLocation(start, true), - addedLines = [0], linesLength = 0; - // get an array of how many char per lines are being added. - for (var i = 0; i < insertedText.length; i++) { - if (insertedText[i] === '\n') { - linesLength++; - addedLines[linesLength] = 0; - } - else { - addedLines[linesLength]++; - } - } - // for the first line copy the style from the current char position. - if (addedLines[0] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle); - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1); - } - linesLength && this.insertNewlineStyleObject( - cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength); - for (var i = 1; i < linesLength; i++) { - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - else if (copiedStyle) { - this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0]; - } - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1); - } - // we use i outside the loop to get it like linesLength - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - }, - - /** - * Set the selectionStart and selectionEnd according to the new position of cursor - * mimic the key - mouse navigation when shift is pressed. - */ - setSelectionStartEndWithShift: function(start, end, newSelection) { - if (newSelection <= start) { - if (end === start) { - this._selectionDirection = 'left'; - } - else if (this._selectionDirection === 'right') { - this._selectionDirection = 'left'; - this.selectionEnd = start; - } - this.selectionStart = newSelection; - } - else if (newSelection > start && newSelection < end) { - if (this._selectionDirection === 'right') { - this.selectionEnd = newSelection; - } - else { - this.selectionStart = newSelection; - } - } - else { - // newSelection is > selection start and end - if (end === start) { - this._selectionDirection = 'right'; - } - else if (this._selectionDirection === 'left') { - this._selectionDirection = 'right'; - this.selectionStart = end; - } - this.selectionEnd = newSelection; - } - }, - - setSelectionInBoundaries: function() { - var length = this.text.length; - if (this.selectionStart > length) { - this.selectionStart = length; - } - else if (this.selectionStart < 0) { - this.selectionStart = 0; - } - if (this.selectionEnd > length) { - this.selectionEnd = length; - } - else if (this.selectionEnd < 0) { - this.selectionEnd = 0; - } - } - }); -})(); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - /** - * Initializes "dbclick" event handler - */ - initDoubleClickSimulation: function() { - - // for double click - this.__lastClickTime = +new Date(); - - // for triple click - this.__lastLastClickTime = +new Date(); - - this.__lastPointer = { }; - - this.on('mousedown', this.onMouseDown); - }, - - /** - * Default event handler to simulate triple click - * @private - */ - onMouseDown: function(options) { - if (!this.canvas) { - return; - } - this.__newClickTime = +new Date(); - var newPointer = options.pointer; - if (this.isTripleClick(newPointer)) { - this.fire('tripleclick', options); - this._stopEvent(options.e); - } - this.__lastLastClickTime = this.__lastClickTime; - this.__lastClickTime = this.__newClickTime; - this.__lastPointer = newPointer; - this.__lastIsEditing = this.isEditing; - this.__lastSelected = this.selected; - }, - - isTripleClick: function(newPointer) { - return this.__newClickTime - this.__lastClickTime < 500 && - this.__lastClickTime - this.__lastLastClickTime < 500 && - this.__lastPointer.x === newPointer.x && - this.__lastPointer.y === newPointer.y; - }, - - /** - * @private - */ - _stopEvent: function(e) { - e.preventDefault && e.preventDefault(); - e.stopPropagation && e.stopPropagation(); - }, - - /** - * Initializes event handlers related to cursor or selection - */ - initCursorSelectionHandlers: function() { - this.initMousedownHandler(); - this.initMouseupHandler(); - this.initClicks(); - }, - - /** - * Default handler for double click, select a word - */ - doubleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectWord(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Default handler for triple click, select a line - */ - tripleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectLine(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Initializes double and triple click event handlers - */ - initClicks: function() { - this.on('mousedblclick', this.doubleClickHandler); - this.on('tripleclick', this.tripleClickHandler); - }, - - /** - * Default event handler for the basic functionalities needed on _mouseDown - * can be overridden to do something different. - * Scope of this implementation is: find the click position, set selectionStart - * find selectionEnd, initialize the drawing of either cursor or selection area - * initializing a mousedDown on a text area will cancel fabricjs knowledge of - * current compositionMode. It will be set to false. - */ - _mouseDownHandler: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - - this.__isMousedown = true; - - if (this.selected) { - this.inCompositionMode = false; - this.setCursorByClick(options.e); - } - - if (this.isEditing) { - this.__selectionStartOnMouseDown = this.selectionStart; - if (this.selectionStart === this.selectionEnd) { - this.abortCursorAnimation(); - } - this.renderCursorOrSelection(); - } - }, - - /** - * Default event handler for the basic functionalities needed on mousedown:before - * can be overridden to do something different. - * Scope of this implementation is: verify the object is already selected when mousing down - */ - _mouseDownHandlerBefore: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - // we want to avoid that an object that was selected and then becomes unselectable, - // may trigger editing mode in some way. - this.selected = this === this.canvas._activeObject; - }, - - /** - * Initializes "mousedown" event handler - */ - initMousedownHandler: function() { - this.on('mousedown', this._mouseDownHandler); - this.on('mousedown:before', this._mouseDownHandlerBefore); - }, - - /** - * Initializes "mouseup" event handler - */ - initMouseupHandler: function() { - this.on('mouseup', this.mouseUpHandler); - }, - - /** - * standard handler for mouse up, overridable - * @private - */ - mouseUpHandler: function(options) { - this.__isMousedown = false; - if (!this.editable || this.group || - (options.transform && options.transform.actionPerformed) || - (options.e.button && options.e.button !== 1)) { - return; - } - - if (this.canvas) { - var currentActive = this.canvas._activeObject; - if (currentActive && currentActive !== this) { - // avoid running this logic when there is an active object - // this because is possible with shift click and fast clicks, - // to rapidly deselect and reselect this object and trigger an enterEdit - return; - } - } - - if (this.__lastSelected && !this.__corner) { - this.selected = false; - this.__lastSelected = false; - this.enterEditing(options.e); - if (this.selectionStart === this.selectionEnd) { - this.initDelayedCursor(true); - } - else { - this.renderCursorOrSelection(); - } - } - else { - this.selected = true; - } - }, - - /** - * Changes cursor location in a text depending on passed pointer (x/y) object - * @param {Event} e Event object - */ - setCursorByClick: function(e) { - var newSelection = this.getSelectionStartFromPointer(e), - start = this.selectionStart, end = this.selectionEnd; - if (e.shiftKey) { - this.setSelectionStartEndWithShift(start, end, newSelection); - } - else { - this.selectionStart = newSelection; - this.selectionEnd = newSelection; - } - if (this.isEditing) { - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Returns index of a character corresponding to where an object was clicked - * @param {Event} e Event object - * @return {Number} Index of a character - */ - getSelectionStartFromPointer: function(e) { - var mouseOffset = this.getLocalPointer(e), - prevWidth = 0, - width = 0, - height = 0, - charIndex = 0, - lineIndex = 0, - lineLeftOffset, - line; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (height <= mouseOffset.y) { - height += this.getHeightOfLine(i) * this.scaleY; - lineIndex = i; - if (i > 0) { - charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1); - } - } - else { - break; - } - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - width = lineLeftOffset * this.scaleX; - line = this._textLines[lineIndex]; - // handling of RTL: in order to get things work correctly, - // we assume RTL writing is mirrored compared to LTR writing. - // so in position detection we mirror the X offset, and when is time - // of rendering it, we mirror it again. - if (this.direction === 'rtl') { - mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width; - } - for (var j = 0, jlen = line.length; j < jlen; j++) { - prevWidth = width; - // i removed something about flipX here, check. - width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX; - if (width <= mouseOffset.x) { - charIndex++; - } - else { - break; - } - } - return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen); - }, - - /** - * @private - */ - _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) { - // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0 - var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth, - distanceBtwNextCharAndCursor = width - mouseOffset.x, - offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor || - distanceBtwNextCharAndCursor < 0 ? 0 : 1, - newSelectionStart = index + offset; - // if object is horizontally flipped, mirror cursor location from the end - if (this.flipX) { - newSelectionStart = jlen - newSelectionStart; - } - - if (newSelectionStart > this._text.length) { - newSelectionStart = this._text.length; - } - - return newSelectionStart; - } -}); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes hidden textarea (needed to bring up keyboard in iOS) - */ - initHiddenTextarea: function() { - this.hiddenTextarea = fabric.document.createElement('textarea'); - this.hiddenTextarea.setAttribute('autocapitalize', 'off'); - this.hiddenTextarea.setAttribute('autocorrect', 'off'); - this.hiddenTextarea.setAttribute('autocomplete', 'off'); - this.hiddenTextarea.setAttribute('spellcheck', 'false'); - this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', ''); - this.hiddenTextarea.setAttribute('wrap', 'off'); - var style = this._calcTextareaPosition(); - // line-height: 1px; was removed from the style to fix this: - // https://bugs.chromium.org/p/chromium/issues/detail?id=870966 - this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + - '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' + - ' paddingーtop: ' + style.fontSize + ';'; - fabric.document.body.appendChild(this.hiddenTextarea); - - fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this)); - - if (!this._clickHandlerInitialized && this.canvas) { - fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this)); - this._clickHandlerInitialized = true; - } - }, - - /** - * For functionalities on keyDown - * Map a special key to a function of the instance/prototype - * If you need different behaviour for ESC or TAB or arrows, you have to change - * this map setting the name of a function that you build on the fabric.Itext or - * your prototype. - * the map change will affect all Instances unless you need for only some text Instances - * in that case you have to clone this object and assign your Instance. - * this.keysMap = fabric.util.object.clone(this.keysMap); - * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0] - */ - keysMap: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorRight', - 36: 'moveCursorLeft', - 37: 'moveCursorLeft', - 38: 'moveCursorUp', - 39: 'moveCursorRight', - 40: 'moveCursorDown', - }, - - keysMapRtl: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorLeft', - 36: 'moveCursorRight', - 37: 'moveCursorRight', - 38: 'moveCursorUp', - 39: 'moveCursorLeft', - 40: 'moveCursorDown', - }, - - /** - * For functionalities on keyUp + ctrl || cmd - */ - ctrlKeysMapUp: { - 67: 'copy', - 88: 'cut' - }, - - /** - * For functionalities on keyDown + ctrl || cmd - */ - ctrlKeysMapDown: { - 65: 'selectAll' - }, - - onClick: function() { - // No need to trigger click event here, focus is enough to have the keyboard appear on Android - this.hiddenTextarea && this.hiddenTextarea.focus(); - }, - - /** - * Handles keydown event - * only used for arrows and combination of modifier keys. - * @param {Event} e Event object - */ - onKeyDown: function(e) { - if (!this.isEditing) { - return; - } - var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap; - if (e.keyCode in keyMap) { - this[keyMap[e.keyCode]](e); - } - else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapDown[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - if (e.keyCode >= 33 && e.keyCode <= 40) { - // if i press an arrow key just update selection - this.inCompositionMode = false; - this.clearContextTop(); - this.renderCursorOrSelection(); - } - else { - this.canvas && this.canvas.requestRenderAll(); - } - }, - - /** - * Handles keyup event - * We handle KeyUp because ie11 and edge have difficulties copy/pasting - * if a copy/cut event fired, keyup is dismissed - * @param {Event} e Event object - */ - onKeyUp: function(e) { - if (!this.isEditing || this._copyDone || this.inCompositionMode) { - this._copyDone = false; - return; - } - if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapUp[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - this.canvas && this.canvas.requestRenderAll(); - }, - - /** - * Handles onInput event - * @param {Event} e Event object - */ - onInput: function(e) { - var fromPaste = this.fromPaste; - this.fromPaste = false; - e && e.stopPropagation(); - if (!this.isEditing) { - return; - } - // decisions about style changes. - var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText, - charCount = this._text.length, - nextCharCount = nextText.length, - removedText, insertedText, - charDiff = nextCharCount - charCount, - selectionStart = this.selectionStart, selectionEnd = this.selectionEnd, - selection = selectionStart !== selectionEnd, - copiedStyle, removeFrom, removeTo; - if (this.hiddenTextarea.value === '') { - this.styles = { }; - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - return; - } - - var textareaSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, - this.hiddenTextarea.selectionEnd, - this.hiddenTextarea.value - ); - var backDelete = selectionStart > textareaSelection.selectionStart; - - if (selection) { - removedText = this._text.slice(selectionStart, selectionEnd); - charDiff += selectionEnd - selectionStart; - } - else if (nextCharCount < charCount) { - if (backDelete) { - removedText = this._text.slice(selectionEnd + charDiff, selectionEnd); - } - else { - removedText = this._text.slice(selectionStart, selectionStart - charDiff); - } - } - insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd); - if (removedText && removedText.length) { - if (insertedText.length) { - // let's copy some style before deleting. - // we want to copy the style before the cursor OR the style at the cursor if selection - // is bigger than 0. - copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false); - // now duplicate the style one for each inserted text. - copiedStyle = insertedText.map(function() { - // this return an array of references, but that is fine since we are - // copying the style later. - return copiedStyle[0]; - }); - } - if (selection) { - removeFrom = selectionStart; - removeTo = selectionEnd; - } - else if (backDelete) { - // detect differences between forwardDelete and backDelete - removeFrom = selectionEnd - removedText.length; - removeTo = selectionEnd; - } - else { - removeFrom = selectionEnd; - removeTo = selectionEnd + removedText.length; - } - this.removeStyleFromTo(removeFrom, removeTo); - } - if (insertedText.length) { - if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) { - copiedStyle = fabric.copiedTextStyle; - } - this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle); - } - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - }, - /** - * Composition start - */ - onCompositionStart: function() { - this.inCompositionMode = true; - }, - - /** - * Composition end - */ - onCompositionEnd: function() { - this.inCompositionMode = false; - }, - - // /** - // * Composition update - // */ - onCompositionUpdate: function(e) { - this.compositionStart = e.target.selectionStart; - this.compositionEnd = e.target.selectionEnd; - this.updateTextareaPosition(); - }, - - /** - * Copies selected text - * @param {Event} e Event object - */ - copy: function() { - if (this.selectionStart === this.selectionEnd) { - //do not cut-copy if no selection - return; - } - - fabric.copiedText = this.getSelectedText(); - if (!fabric.disableStyleCopyPaste) { - fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true); - } - else { - fabric.copiedTextStyle = null; - } - this._copyDone = true; - }, - - /** - * Pastes text - * @param {Event} e Event object - */ - paste: function() { - this.fromPaste = true; - }, - - /** - * @private - * @param {Event} e Event object - * @return {Object} Clipboard data object - */ - _getClipboardData: function(e) { - return (e && e.clipboardData) || fabric.window.clipboardData; - }, - - /** - * Finds the width in pixels before the cursor on the same line - * @private - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Number} widthBeforeCursor width before cursor - */ - _getWidthBeforeCursor: function(lineIndex, charIndex) { - var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound; - - if (charIndex > 0) { - bound = this.__charBounds[lineIndex][charIndex - 1]; - widthBeforeCursor += bound.left + bound.width; - } - return widthBeforeCursor; - }, - - /** - * Gets start offset of a selection - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getDownCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - // if on last line, down cursor goes to end of line - if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) { - // move to the end of a text - return this._text.length - selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor), - textAfterCursor = this._textLines[lineIndex].slice(charIndex); - return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex); - }, - - /** - * private - * Helps finding if the offset should be counted from Start or End - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - _getSelectionForOffset: function(e, isRight) { - if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) { - return this.selectionEnd; - } - else { - return this.selectionStart; - } - }, - - /** - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getUpCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - if (lineIndex === 0 || e.metaKey || e.keyCode === 33) { - // if on first line, up cursor goes to start of line - return -selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor), - textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex), - missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1); - // return a negative offset - return -this._textLines[lineIndex - 1].length - + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset); - }, - - /** - * for a given width it founds the matching character. - * @private - */ - _getIndexOnLine: function(lineIndex, width) { - - var line = this._textLines[lineIndex], - lineLeftOffset = this._getLineLeftOffset(lineIndex), - widthOfCharsOnLine = lineLeftOffset, - indexOnLine = 0, charWidth, foundMatch; - - for (var j = 0, jlen = line.length; j < jlen; j++) { - charWidth = this.__charBounds[lineIndex][j].width; - widthOfCharsOnLine += charWidth; - if (widthOfCharsOnLine > width) { - foundMatch = true; - var leftEdge = widthOfCharsOnLine - charWidth, - rightEdge = widthOfCharsOnLine, - offsetFromLeftEdge = Math.abs(leftEdge - width), - offsetFromRightEdge = Math.abs(rightEdge - width); - - indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1); - break; - } - } - - // reached end - if (!foundMatch) { - indexOnLine = line.length - 1; - } - - return indexOnLine; - }, - - - /** - * Moves cursor down - * @param {Event} e Event object - */ - moveCursorDown: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorUpOrDown('Down', e); - }, - - /** - * Moves cursor up - * @param {Event} e Event object - */ - moveCursorUp: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorUpOrDown('Up', e); - }, - - /** - * Moves cursor up or down, fires the events - * @param {String} direction 'Up' or 'Down' - * @param {Event} e Event object - */ - _moveCursorUpOrDown: function(direction, e) { - // getUpCursorOffset - // getDownCursorOffset - var action = 'get' + direction + 'CursorOffset', - offset = this[action](e, this._selectionDirection === 'right'); - if (e.shiftKey) { - this.moveCursorWithShift(offset); - } - else { - this.moveCursorWithoutShift(offset); - } - if (offset !== 0) { - this.setSelectionInBoundaries(); - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor with shift - * @param {Number} offset - */ - moveCursorWithShift: function(offset) { - var newSelection = this._selectionDirection === 'left' - ? this.selectionStart + offset - : this.selectionEnd + offset; - this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection); - return offset !== 0; - }, - - /** - * Moves cursor up without shift - * @param {Number} offset - */ - moveCursorWithoutShift: function(offset) { - if (offset < 0) { - this.selectionStart += offset; - this.selectionEnd = this.selectionStart; - } - else { - this.selectionEnd += offset; - this.selectionStart = this.selectionEnd; - } - return offset !== 0; - }, - - /** - * Moves cursor left - * @param {Event} e Event object - */ - moveCursorLeft: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorLeftOrRight('Left', e); - }, - - /** - * @private - * @return {Boolean} true if a change happened - */ - _move: function(e, prop, direction) { - var newValue; - if (e.altKey) { - newValue = this['findWordBoundary' + direction](this[prop]); - } - else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { - newValue = this['findLineBoundary' + direction](this[prop]); - } - else { - this[prop] += direction === 'Left' ? -1 : 1; - return true; - } - if (typeof newValue !== undefined && this[prop] !== newValue) { - this[prop] = newValue; - return true; - } - }, - - /** - * @private - */ - _moveLeft: function(e, prop) { - return this._move(e, prop, 'Left'); - }, - - /** - * @private - */ - _moveRight: function(e, prop) { - return this._move(e, prop, 'Right'); - }, - - /** - * Moves cursor left without keeping selection - * @param {Event} e - */ - moveCursorLeftWithoutShift: function(e) { - var change = true; - this._selectionDirection = 'left'; - - // only move cursor when there is no selection, - // otherwise we discard it, and leave cursor on same place - if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { - change = this._moveLeft(e, 'selectionStart'); - - } - this.selectionEnd = this.selectionStart; - return change; - }, - - /** - * Moves cursor left while keeping selection - * @param {Event} e - */ - moveCursorLeftWithShift: function(e) { - if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { - return this._moveLeft(e, 'selectionEnd'); - } - else if (this.selectionStart !== 0){ - this._selectionDirection = 'left'; - return this._moveLeft(e, 'selectionStart'); - } - }, - - /** - * Moves cursor right - * @param {Event} e Event object - */ - moveCursorRight: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorLeftOrRight('Right', e); - }, - - /** - * Moves cursor right or Left, fires event - * @param {String} direction 'Left', 'Right' - * @param {Event} e Event object - */ - _moveCursorLeftOrRight: function(direction, e) { - var actionName = 'moveCursor' + direction + 'With'; - this._currentCursorOpacity = 1; - - if (e.shiftKey) { - actionName += 'Shift'; - } - else { - actionName += 'outShift'; - } - if (this[actionName](e)) { - this.abortCursorAnimation(); - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor right while keeping selection - * @param {Event} e - */ - moveCursorRightWithShift: function(e) { - if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { - return this._moveRight(e, 'selectionStart'); - } - else if (this.selectionEnd !== this._text.length) { - this._selectionDirection = 'right'; - return this._moveRight(e, 'selectionEnd'); - } - }, - - /** - * Moves cursor right without keeping selection - * @param {Event} e Event object - */ - moveCursorRightWithoutShift: function(e) { - var changed = true; - this._selectionDirection = 'right'; - - if (this.selectionStart === this.selectionEnd) { - changed = this._moveRight(e, 'selectionStart'); - this.selectionEnd = this.selectionStart; - } - else { - this.selectionStart = this.selectionEnd; - } - return changed; - }, - - /** - * Removes characters from start/end - * start/end ar per grapheme position in _text array. - * - * @param {Number} start - * @param {Number} end default to start + 1 - */ - removeChars: function(start, end) { - if (typeof end === 'undefined') { - end = start + 1; - } - this.removeStyleFromTo(start, end); - this._text.splice(start, end - start); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - - /** - * insert characters at start position, before start position. - * start equal 1 it means the text get inserted between actual grapheme 0 and 1 - * if style array is provided, it must be as the same length of text in graphemes - * if end is provided and is bigger than start, old text is replaced. - * start/end ar per grapheme position in _text array. - * - * @param {String} text text to insert - * @param {Array} style array of style objects - * @param {Number} start - * @param {Number} end default to start + 1 - */ - insertChars: function(text, style, start, end) { - if (typeof end === 'undefined') { - end = start; - } - if (end > start) { - this.removeStyleFromTo(start, end); - } - var graphemes = fabric.util.string.graphemeSplit(text); - this.insertNewStyleBlock(graphemes, start, style); - this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end)); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - -}); - - -/* _TO_SVG_START_ */ -(function() { - var toFixed = fabric.util.toFixed, - multipleSpacesRegex = / +/g; - - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - - /** - * Returns SVG representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function() { - var offsets = this._getSVGLeftTopOffsets(), - textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); - return this._wrapSVGTextAndBg(textAndBg); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup( - this._toSVG(), - { reviver: reviver, noStyle: true, withShadow: true } - ); - }, - - /** - * @private - */ - _getSVGLeftTopOffsets: function() { - return { - textLeft: -this.width / 2, - textTop: -this.height / 2, - lineTop: this.getHeightOfLine(0) - }; - }, - - /** - * @private - */ - _wrapSVGTextAndBg: function(textAndBg) { - var noShadow = true, - textDecoration = this.getSvgTextDecoration(this); - return [ - textAndBg.textBgRects.join(''), - '\t\t', - textAndBg.textSpans.join(''), - '\n' - ]; - }, - - /** - * @private - * @param {Number} textTopOffset Text top offset - * @param {Number} textLeftOffset Text left offset - * @return {Object} - */ - _getSVGTextAndBg: function(textTopOffset, textLeftOffset) { - var textSpans = [], - textBgRects = [], - height = textTopOffset, lineOffset; - // bounding-box background - this._setSVGBg(textBgRects); - - // text and text-background - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineOffset = this._getLineLeftOffset(i); - if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) { - this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height); - } - this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height); - height += this.getHeightOfLine(i); - } - - return { - textSpans: textSpans, - textBgRects: textBgRects - }; - }, - - /** - * @private - */ - _createTextCharSpan: function(_char, styleDecl, left, top) { - var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex), - styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace), - fillStyles = styleProps ? 'style="' + styleProps + '"' : '', - dy = styleDecl.deltaY, dySpan = '', - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - if (dy) { - dySpan = ' dy="' + toFixed(dy, NUM_FRACTION_DIGITS) + '" '; - } - return [ - '', - fabric.util.string.escapeXml(_char), - '' - ].join(''); - }, - - _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, style, - boxWidth = 0, - line = this._textLines[lineIndex], - timeToRender; - - textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight; - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - textLeftOffset += charBox.kernedWidth - charBox.width; - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle); - } - if (timeToRender) { - style = this._getStyleDeclaration(lineIndex, i) || { }; - textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset)); - charsToRender = ''; - actualStyle = nextStyle; - textLeftOffset += boxWidth; - boxWidth = 0; - } - } - }, - - _pushTextBgRect: function(textBgRects, color, left, top, width, height) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - }, - - _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) { - var line = this._textLines[i], - heightOfLine = this.getHeightOfLine(i) / this.lineHeight, - boxWidth = 0, - boxStart = 0, - charBox, currentColor, - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (currentColor !== lastColor) { - lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - }, - - /** - * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values - * we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1 - * - * @private - * @param {*} value - * @return {String} - */ - _getFillAttributes: function(value) { - var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : ''; - if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) { - return 'fill="' + value + '"'; - } - return 'opacity="' + fillColor.getAlpha() + '" fill="' + fillColor.setAlpha(1).toRgb() + '"'; - }, - - /** - * @private - */ - _getSVGLineTopOffset: function(lineIndex) { - var lineTopOffset = 0, lastHeight = 0; - for (var j = 0; j < lineIndex; j++) { - lineTopOffset += this.getHeightOfLine(j); - } - lastHeight = this.getHeightOfLine(j); - return { - lineTop: lineTopOffset, - offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult) - }; - }, - - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow); - return svgStyle + ' white-space: pre;'; - }, - }); -})(); -/* _TO_SVG_END_ */ - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = {}); - - /** - * Textbox class, based on IText, allows the user to resize the text rectangle - * and wraps lines automatically. Textboxes have their Y scaling locked, the - * user can only change width. Height is adjusted automatically based on the - * wrapping of lines. - * @class fabric.Textbox - * @extends fabric.IText - * @mixes fabric.Observable - * @return {fabric.Textbox} thisArg - * @see {@link fabric.Textbox#initialize} for constructor definition - */ - fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, { - - /** - * Type of an object - * @type String - * @default - */ - type: 'textbox', - - /** - * Minimum width of textbox, in pixels. - * @type Number - * @default - */ - minWidth: 20, - - /** - * Minimum calculated width of a textbox, in pixels. - * fixed to 2 so that an empty textbox cannot go to 0 - * and is still selectable without text. - * @type Number - * @default - */ - dynamicMinWidth: 2, - - /** - * Cached array of text wrapping. - * @type Array - */ - __cachedLines: null, - - /** - * Override standard Object class values - */ - lockScalingFlip: true, - - /** - * Override standard Object class values - * Textbox needs this on false - */ - noScaleCache: false, - - /** - * Properties which when set cause object to change dimensions - * @type Object - * @private - */ - _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'), - - /** - * Use this regular expression to split strings in breakable lines - * @private - */ - _wordJoiners: /[ \t\r]/, - - /** - * Use this boolean property in order to split strings that have no white space concept. - * this is a cheap way to help with chinese/japanese - * @type Boolean - * @since 2.6.0 - */ - splitByGrapheme: false, - - /** - * Unlike superclass's version of this function, Textbox does not update - * its width. - * @private - * @override - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this._clearCache(); - // clear dynamicMinWidth as it will be different after we re-wrap line - this.dynamicMinWidth = 0; - // wrap lines - this._styleMap = this._generateStyleMap(this._splitText()); - // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap - if (this.dynamicMinWidth > this.width) { - this._set('width', this.dynamicMinWidth); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - // clear cache and re-calculate height - this.height = this.calcTextHeight(); - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Generate an object that translates the style object so that it is - * broken up by visual lines (new lines and automatic wrapping). - * The original text styles object is broken up by actual lines (new lines only), - * which is only sufficient for Text / IText - * @private - */ - _generateStyleMap: function(textInfo) { - var realLineCount = 0, - realLineCharCount = 0, - charCount = 0, - map = {}; - - for (var i = 0; i < textInfo.graphemeLines.length; i++) { - if (textInfo.graphemeText[charCount] === '\n' && i > 0) { - realLineCharCount = 0; - charCount++; - realLineCount++; - } - else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) { - // this case deals with space's that are removed from end of lines when wrapping - realLineCharCount++; - charCount++; - } - - map[i] = { line: realLineCount, offset: realLineCharCount }; - - charCount += textInfo.graphemeLines[i].length; - realLineCharCount += textInfo.graphemeLines[i].length; - } - - return map; - }, - - /** - * Returns true if object has a style property or has it on a specified line - * @param {Number} lineIndex - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (map) { - lineIndex = map.line; - } - } - return fabric.Text.prototype.styleHas.call(this, property, lineIndex); - }, - - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false, - map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1]; - if (map) { - lineIndex = map.line; - offset = map.offset; - } - if (mapNextLine) { - nextLineIndex = mapNextLine.line; - shouldLimit = nextLineIndex === lineIndex; - nextOffset = mapNextLine.offset; - } - obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - } - return true; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (!map) { - return null; - } - lineIndex = map.line; - charIndex = map.offset + charIndex; - } - return this.callSuper('_getStyleDeclaration', lineIndex, charIndex); - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - - this.styles[lineIndex][charIndex] = style; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - delete this.styles[lineIndex][charIndex]; - }, - - /** - * probably broken need a fix - * Returns the real style line that correspond to the wrapped lineIndex line - * Used just to verify if the line does exist or not. - * @param {Number} lineIndex - * @returns {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - return !!this.styles[map.line]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @param {Object} style - * @private - */ - _setLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - this.styles[map.line] = {}; - }, - - /** - * Wraps text using the 'width' property of Textbox. First this function - * splits text on newlines, so we preserve newlines entered by the user. - * Then it wraps each line using the width of the Textbox by calling - * _wrapLine(). - * @param {Array} lines The string array of text that is split into lines - * @param {Number} desiredWidth width you want to wrap to - * @returns {Array} Array of lines - */ - _wrapText: function(lines, desiredWidth) { - var wrapped = [], i; - this.isWrapping = true; - for (i = 0; i < lines.length; i++) { - wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth)); - } - this.isWrapping = false; - return wrapped; - }, - - /** - * Helper function to measure a string of text, given its lineIndex and charIndex offset - * it gets called when charBounds are not available yet. - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {number} lineIndex - * @param {number} charOffset - * @returns {number} - * @private - */ - _measureWord: function(word, lineIndex, charOffset) { - var width = 0, prevGrapheme, skipLeft = true; - charOffset = charOffset || 0; - for (var i = 0, len = word.length; i < len; i++) { - var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft); - width += box.kernedWidth; - prevGrapheme = word[i]; - } - return width; - }, - - /** - * Wraps a line of text using the width of the Textbox and a context. - * @param {Array} line The grapheme array that represent the line - * @param {Number} lineIndex - * @param {Number} desiredWidth width you want to wrap the line to - * @param {Number} reservedSpace space to remove from wrapping for custom functionalities - * @returns {Array} Array of line(s) into which the given text is wrapped - * to. - */ - _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) { - var lineWidth = 0, - splitByGrapheme = this.splitByGrapheme, - graphemeLines = [], - line = [], - // spaces in different languages? - words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners), - word = '', - offset = 0, - infix = splitByGrapheme ? '' : ' ', - wordWidth = 0, - infixWidth = 0, - largestWordWidth = 0, - lineJustStarted = true, - additionalSpace = this._getWidthOfCharSpacing(), - reservedSpace = reservedSpace || 0; - // fix a difference between split and graphemeSplit - if (words.length === 0) { - words.push([]); - } - desiredWidth -= reservedSpace; - for (var i = 0; i < words.length; i++) { - // if using splitByGrapheme words are already in graphemes. - word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]); - wordWidth = this._measureWord(word, lineIndex, offset); - offset += word.length; - - lineWidth += infixWidth + wordWidth - additionalSpace; - if (lineWidth > desiredWidth && !lineJustStarted) { - graphemeLines.push(line); - line = []; - lineWidth = wordWidth; - lineJustStarted = true; - } - else { - lineWidth += additionalSpace; - } - - if (!lineJustStarted && !splitByGrapheme) { - line.push(infix); - } - line = line.concat(word); - - infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset); - offset++; - lineJustStarted = false; - // keep track of largest word - if (wordWidth > largestWordWidth) { - largestWordWidth = wordWidth; - } - } - - i && graphemeLines.push(line); - - if (largestWordWidth + reservedSpace > this.dynamicMinWidth) { - this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace; - } - return graphemeLines; - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @param {Number} lineIndex text to split - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - if (!this._styleMap[lineIndex + 1]) { - // is last line, return true; - return true; - } - if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) { - // this is last line before a line break, return true; - return true; - } - return false; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * @return Number - */ - missingNewlineOffset: function(lineIndex) { - if (this.splitByGrapheme) { - return this.isEndOfWrapping(lineIndex) ? 1 : 0; - } - return 1; - }, - - /** - * Gets lines of text to render in the Textbox. This function calculates - * text wrapping on the fly every time it is called. - * @param {String} text text to split - * @returns {Array} Array of lines in the Textbox. - * @override - */ - _splitTextIntoLines: function(text) { - var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text), - graphemeLines = this._wrapText(newText.lines, this.width), - lines = new Array(graphemeLines.length); - for (var i = 0; i < graphemeLines.length; i++) { - lines[i] = graphemeLines[i].join(''); - } - newText.lines = lines; - newText.graphemeLines = graphemeLines; - return newText; - }, - - getMinWidth: function() { - return Math.max(this.minWidth, this.dynamicMinWidth); - }, - - _removeExtraneousStyles: function() { - var linesToKeep = {}; - for (var prop in this._styleMap) { - if (this._textLines[prop]) { - linesToKeep[this._styleMap[prop].line] = 1; - } - } - for (var prop in this.styles) { - if (!linesToKeep[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)); - } - }); - - /** - * Returns fabric.Textbox instance from an object representation - * @static - * @memberOf fabric.Textbox - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created - */ - fabric.Textbox.fromObject = function(object, callback) { - return fabric.Object._fromObject('Textbox', object, callback, 'text'); - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var controlsUtils = fabric.controlsUtils, - scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler, - scaleStyleHandler = controlsUtils.scaleCursorStyleHandler, - scalingEqually = controlsUtils.scalingEqually, - scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX, - scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY, - scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName, - objectControls = fabric.Object.prototype.controls; - - objectControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mb = new fabric.Control({ - x: 0, - y: 0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mt = new fabric.Control({ - x: 0, - y: -0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.tl = new fabric.Control({ - x: -0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.tr = new fabric.Control({ - x: 0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.bl = new fabric.Control({ - x: -0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.br = new fabric.Control({ - x: 0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.mtr = new fabric.Control({ - x: 0, - y: -0.5, - actionHandler: controlsUtils.rotationWithSnapping, - cursorStyleHandler: controlsUtils.rotationStyleHandler, - offsetY: -40, - withConnection: true, - actionName: 'rotate', - }); - - if (fabric.Textbox) { - // this is breaking the prototype inheritance, no time / ideas to fix it. - // is important to document that if you want to have all objects to have a - // specific custom control, you have to add it to Object prototype and to Textbox - // prototype. The controls are shared as references. So changes to control `tr` - // can still apply to all objects if needed. - var textBoxControls = fabric.Textbox.prototype.controls = { }; - - textBoxControls.mtr = objectControls.mtr; - textBoxControls.tr = objectControls.tr; - textBoxControls.br = objectControls.br; - textBoxControls.tl = objectControls.tl; - textBoxControls.bl = objectControls.bl; - textBoxControls.mt = objectControls.mt; - textBoxControls.mb = objectControls.mb; - - textBoxControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - - textBoxControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - } -})(); - diff --git a/web/static/js9_old/js/fabric-v4.5.1.min.js b/web/static/js9_old/js/fabric-v4.5.1.min.js deleted file mode 100644 index a60f0d6..0000000 --- a/web/static/js9_old/js/fabric-v4.5.1.min.js +++ /dev/null @@ -1 +0,0 @@ -var fabric=fabric||{version:"4.5.1"};if("undefined"!=typeof exports?exports.fabric=fabric:"function"==typeof define&&define.amd&&define([],function(){return fabric}),"undefined"!=typeof document&&"undefined"!=typeof window)document instanceof("undefined"!=typeof HTMLDocument?HTMLDocument:Document)?fabric.document=document:fabric.document=document.implementation.createHTMLDocument(""),fabric.window=window;else{var jsdom=require("jsdom"),virtualWindow=new jsdom.JSDOM(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]},resources:"usable"}).window;fabric.document=virtualWindow.document,fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.nodeCanvas=require("jsdom/lib/jsdom/utils").Canvas,fabric.window=virtualWindow,DOMParser=fabric.window.DOMParser}function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,s=t.destinationHeight;i===n&&r===s||(e.width=n,e.height=s)}function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.targetCanvas,n=r.getContext("2d");n.translate(0,r.height),n.scale(1,-1);var s=i.height-r.height;n.drawImage(i,0,s,r.width,r.height,0,0,r.width,r.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,n=e.destinationHeight,s=r*n*4,o=new Uint8Array(this.imageBuffer,0,s),a=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,o);var h=new ImageData(a,r,n);i.putImageData(h,0,0)}fabric.isTouchSupported="ontouchstart"in fabric.window||"ontouchstart"in fabric.document||fabric.window&&fabric.window.navigator&&0_)for(var C=1,S=d.length;C/g,">")},graphemeSplit:function(t){var e,i=0,r=[];for(i=0;it.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,e){return void 0===e&&(e=.5),e=Math.max(Math.min(1,e),0),new i(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new i(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new i(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new i(this.x,this.y)}}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var f=t.fabric||(t.fabric={});function d(t){this.status=t,this.points=[]}f.Intersection?f.warn("fabric.Intersection is already defined"):(f.Intersection=d,f.Intersection.prototype={constructor:d,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},f.Intersection.intersectLineLine=function(t,e,i,r){var n,s=(r.x-i.x)*(t.y-i.y)-(r.y-i.y)*(t.x-i.x),o=(e.x-t.x)*(t.y-i.y)-(e.y-t.y)*(t.x-i.x),a=(r.y-i.y)*(e.x-t.x)-(r.x-i.x)*(e.y-t.y);if(0!==a){var h=s/a,c=o/a;0<=h&&h<=1&&0<=c&&c<=1?(n=new d("Intersection")).appendPoint(new f.Point(t.x+h*(e.x-t.x),t.y+h*(e.y-t.y))):n=new d}else n=new d(0===s||0===o?"Coincident":"Parallel");return n},f.Intersection.intersectLinePolygon=function(t,e,i){var r,n,s,o,a=new d,h=i.length;for(o=0;o=h&&(c.x-=h),c.x<=-h&&(c.x+=h),c.y>=h&&(c.y-=h),c.y<=h&&(c.y+=h),c.x-=o.offsetX,c.y-=o.offsetY,c}function y(t){return t.flipX!==t.flipY}function _(t,e,i,r,n){if(0!==t[e]){var s=n/t._getTransformedDimensions()[r]*t[i];t.set(i,s)}}function x(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(0,s.skewY),a=P(e,e.originX,e.originY,i,r),h=Math.abs(2*a.x)-o.x,c=s.skewX;h<2?n=0:(n=v(Math.atan2(h/s.scaleX,o.y/s.scaleY)),e.originX===f&&e.originY===p&&(n=-n),e.originX===g&&e.originY===d&&(n=-n),y(s)&&(n=-n));var l=c!==n;if(l){var u=s._getTransformedDimensions().y;s.set("skewX",n),_(s,"skewY","scaleY","y",u)}return l}function C(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(s.skewX,0),a=P(e,e.originX,e.originY,i,r),h=Math.abs(2*a.y)-o.y,c=s.skewY;h<2?n=0:(n=v(Math.atan2(h/s.scaleY,o.x/s.scaleX)),e.originX===f&&e.originY===p&&(n=-n),e.originX===g&&e.originY===d&&(n=-n),y(s)&&(n=-n));var l=c!==n;if(l){var u=s._getTransformedDimensions().x;s.set("skewY",n),_(s,"skewX","scaleX","x",u)}return l}function D(t,e,i,r,n){n=n||{};var s,o,a,h,c,l,u=e.target,f=u.lockScalingX,d=u.lockScalingY,g=n.by,p=w(t,u),v=k(u,g,p),m=e.gestureScale;if(v)return!1;if(m)o=e.scaleX*m,a=e.scaleY*m;else{if(s=P(e,e.originX,e.originY,i,r),c="y"!==g?T(s.x):1,l="x"!==g?T(s.y):1,e.signX||(e.signX=c),e.signY||(e.signY=l),u.lockScalingFlip&&(e.signX!==c||e.signY!==l))return!1;if(h=u._getTransformedDimensions(),p&&!g){var b=Math.abs(s.x)+Math.abs(s.y),y=e.original,_=b/(Math.abs(h.x*y.scaleX/u.scaleX)+Math.abs(h.y*y.scaleY/u.scaleY));o=y.scaleX*_,a=y.scaleY*_}else o=Math.abs(s.x*u.scaleX/h.x),a=Math.abs(s.y*u.scaleY/h.y);O(e)&&(o*=2,a*=2),e.signX!==c&&"y"!==g&&(e.originX=S[e.originX],o*=-1,e.signX=c),e.signY!==l&&"x"!==g&&(e.originY=S[e.originY],a*=-1,e.signY=l)}var x=u.scaleX,C=u.scaleY;return g?("x"===g&&u.set("scaleX",o),"y"===g&&u.set("scaleY",a)):(!f&&u.set("scaleX",o),!d&&u.set("scaleY",a)),x!==u.scaleX||C!==u.scaleY}n.scaleCursorStyleHandler=function(t,e,i){var r=w(t,i),n="";if(0!==e.x&&0===e.y?n="x":0===e.x&&0!==e.y&&(n="y"),k(i,n,r))return"not-allowed";var s=a(i,e);return o[s]+"-resize"},n.skewCursorStyleHandler=function(t,e,i){var r="not-allowed";if(0!==e.x&&i.lockSkewingY)return r;if(0!==e.y&&i.lockSkewingX)return r;var n=a(i,e)%4;return s[n]+"-resize"},n.scaleSkewCursorStyleHandler=function(t,e,i){return t[i.canvas.altActionKey]?n.skewCursorStyleHandler(t,e,i):n.scaleCursorStyleHandler(t,e,i)},n.rotationWithSnapping=b("rotating",m(function(t,e,i,r){var n=e,s=n.target,o=s.translateToOriginPoint(s.getCenterPoint(),n.originX,n.originY);if(s.lockRotation)return!1;var a,h=Math.atan2(n.ey-o.y,n.ex-o.x),c=Math.atan2(r-o.y,i-o.x),l=v(c-h+n.theta);if(0o.r2,c=this.gradientTransform?this.gradientTransform.concat():fabric.iMatrix.concat(),l=-this.offsetX,u=-this.offsetY,f=!!e.additionalTransform,d="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox";if(a.sort(function(t,e){return t.offset-e.offset}),"objectBoundingBox"===d?(l/=t.width,u/=t.height):(l+=t.width/2,u+=t.height/2),"path"===t.type&&"percentage"!==this.gradientUnits&&(l-=t.pathOffset.x,u-=t.pathOffset.y),c[4]-=l,c[5]-=u,s='id="SVGID_'+this.id+'" gradientUnits="'+d+'"',s+=' gradientTransform="'+(f?e.additionalTransform+" ":"")+fabric.util.matrixToSVG(c)+'" ',"linear"===this.type?n=["\n']:"radial"===this.type&&(n=["\n']),"radial"===this.type){if(h)for((a=a.concat()).reverse(),i=0,r=a.length;i\n')}return n.push("linear"===this.type?"\n":"\n"),n.join("")},toLive:function(t){var e,i,r,n=fabric.util.object.clone(this.coords);if(this.type){for("linear"===this.type?e=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(e=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2)),i=0,r=this.colorStops.length;i\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e=this.source;if(!e)return"";if(void 0!==e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var o=t.fabric||(t.fabric={}),a=o.util.toFixed;o.Shadow?o.warn("fabric.Shadow is already defined."):(o.Shadow=o.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1,initialize:function(t){for(var e in"string"==typeof t&&(t=this._parseShadow(t)),t)this[e]=t[e];this.id=o.Object.__uid++},_parseShadow:function(t){var e=t.trim(),i=o.Shadow.reOffsetsAndBlur.exec(e)||[];return{color:(e.replace(o.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)").trim(),offsetX:parseFloat(i[1],10)||0,offsetY:parseFloat(i[2],10)||0,blur:parseFloat(i[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var e=40,i=40,r=o.Object.NUM_FRACTION_DIGITS,n=o.util.rotateVector({x:this.offsetX,y:this.offsetY},o.util.degreesToRadians(-t.angle)),s=new o.Color(this.color);return t.width&&t.height&&(e=100*a((Math.abs(n.x)+this.blur)/t.width,r)+20,i=100*a((Math.abs(n.y)+this.blur)/t.height,r)+20),t.flipX&&(n.x*=-1),t.flipY&&(n.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling};var e={},i=o.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke","nonScaling"].forEach(function(t){this[t]!==i[t]&&(e[t]=this[t])},this),e}}),o.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/)}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)fabric.warn("fabric.StaticCanvas is already defined.");else{var n=fabric.util.object.extend,t=fabric.util.getElementOffset,c=fabric.util.removeFromArray,a=fabric.util.toFixed,s=fabric.util.transformPoint,o=fabric.util.invertTransform,i=fabric.util.getNodeCanvas,r=fabric.util.createCanvasElement,e=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,clipPath:void 0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_initRetinaScaling:function(){if(this._isRetinaScaling()){var t=fabric.devicePixelRatio;this.__initRetinaScaling(t,this.lowerCanvasEl,this.contextContainer),this.upperCanvasEl&&this.__initRetinaScaling(t,this.upperCanvasEl,this.contextTop)}},__initRetinaScaling:function(t,e,i){e.setAttribute("width",this.width*t),e.setAttribute("height",this.height*t),i.scale(t,t)},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},__setBgOverlayImage:function(r,t,n,s){return"string"==typeof t?fabric.util.loadImage(t,function(t,e){if(t){var i=new fabric.Image(t,s);(this[r]=i).canvas=this}n&&n(t,e)},this,s&&s.crossOrigin):(s&&t.setOptions(s),(this[r]=t)&&(t.canvas=this),n&&n(t,!1)),this},__setBgOverlayColor:function(t,e,i){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(){var t=r();if(!t)throw e;if(t.style||(t.style={}),void 0===t.getContext)throw e;return t},_initOptions:function(t){var e=this.lowerCanvasEl;this._setOptions(t),this.width=this.width||parseInt(e.width,10)||0,this.height=this.height||parseInt(e.height,10)||0,this.lowerCanvasEl.style&&(e.width=this.width,e.height=this.height,e.style.width=this.width+"px",e.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice())},_createLowerCanvas:function(t){t&&t.getContext?this.lowerCanvasEl=t:this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i;for(var r in e=e||{},t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px",this.hasLostContext=!0),e.backstoreOnly||this._setCssDimension(r,i);return this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(),this._initRetinaScaling(),this.calcOffset(),e.cssOnly||this.requestRenderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return this.viewportTransform[0]},setViewportTransform:function(t){var e,i,r,n=this._activeObject,s=this.backgroundImage,o=this.overlayImage;for(this.viewportTransform=t,i=0,r=this._objects.length;i\n'),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push(""),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,r=e.width||this.width,n=e.height||this.height,s='viewBox="0 0 '+this.width+" "+this.height+'" ',o=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?s='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,s='viewBox="'+a(-i[4]/i[0],o)+" "+a(-i[5]/i[3],o)+" "+a(this.width/i[0],o)+" "+a(this.height/i[3],o)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")},createSVGClipPathMarkup:function(t){var e=this.clipPath;return e?(e.clipPathId="CLIPPATH_"+fabric.Object.__uid++,'\n'+this.clipPath.toClipPathSVG(t.reviver)+"\n"):""},createSVGRefElementsMarkup:function(){var s=this;return["background","overlay"].map(function(t){var e=s[t+"Color"];if(e&&e.toLive){var i=s[t+"Vpt"],r=s.viewportTransform,n={width:s.width/(i?r[0]:1),height:s.height/(i?r[3]:1)};return e.toSVG(n,{additionalTransform:i?fabric.util.matrixToSVG(r):""})}}).join("")},createSVGFontFacesMarkup:function(){var t,e,i,r,n,s,o,a,h="",c={},l=fabric.fontPaths,u=[];for(this._objects.forEach(function t(e){u.push(e),e._objects&&e._objects.forEach(t)}),o=0,a=u.length;o',"\n",h,"","\n"].join("")),h},_setSVGObjects:function(t,e){var i,r,n,s=this._objects;for(r=0,n=s.length;r\n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(e=(r=n._objects).length;e--;)i=r[e],c(this._objects,i),this._objects.unshift(i);else c(this._objects,t),this._objects.unshift(t);return this.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(r=n._objects,e=0;e"}}),n(fabric.StaticCanvas.prototype,fabric.Observable),n(fabric.StaticCanvas.prototype,fabric.Collection),n(fabric.StaticCanvas.prototype,fabric.DataURLExporter),n(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=r();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"setLineDash":return void 0!==i.setLineDash;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject,fabric.isLikelyNode&&(fabric.StaticCanvas.prototype.createPNGStream=function(){var t=i(this.lowerCanvasEl);return t&&t.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){var e=i(this.lowerCanvasEl);return e&&e.createJPEGStream(t)})}}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeMiterLimit:10,strokeDashArray:null,limitedToCanvasSize:!1,_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,fabric.StaticCanvas.supports("setLineDash")&&t.setLineDash(this.strokeDashArray||[])},_saveAndTransform:function(t){var e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])},_setShadow:function(){if(this.shadow){var t=this.canvas,e=this.shadow,i=t.contextTop,r=t.getZoom();t&&t._isRetinaScaling()&&(r*=fabric.devicePixelRatio),i.shadowColor=e.color,i.shadowBlur=e.blur*r,i.shadowOffsetX=e.offsetX*r,i.shadowOffsetY=e.offsetY*r}},needsFullRender:function(){return new fabric.Color(this.color).getAlpha()<1||!!this.shadow},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0},_isOutSideCanvas:function(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}),fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{decimate:.4,initialize:function(t){this.canvas=t,this._points=[]},_drawSegment:function(t,e,i){var r=e.midPointFrom(i);return t.quadraticCurveTo(e.x,e.y,r.x,r.y),r},onMouseDown:function(t,e){this.canvas._isMainEvent(e.e)&&(this._prepareForDrawing(t),this._captureDrawingPath(t),this._render())},onMouseMove:function(t,e){if(this.canvas._isMainEvent(e.e)&&(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._captureDrawingPath(t)&&1t[e-2].x?1:n.x===t[e-2].x?0:-1,h=n.y>t[e-2].y?1:n.y===t[e-2].y?0:-1),i.push("L ",n.x+a*r," ",n.y+h*r),i},createPath:function(t){var e=new fabric.Path(t,{fill:null,stroke:this.color,strokeWidth:this.width,strokeLineCap:this.strokeLineCap,strokeMiterLimit:this.strokeMiterLimit,strokeLineJoin:this.strokeLineJoin,strokeDashArray:this.strokeDashArray});return this.shadow&&(this.shadow.affectStroke=!0,e.shadow=new fabric.Shadow(this.shadow)),e},decimatePoints:function(t,e){if(t.length<=2)return t;var i,r=this.canvas.getZoom(),n=Math.pow(e/r,2),s=t.length-1,o=t[0],a=[o];for(i=1;i"},getObjectScaling:function(){var t=x.util.qrDecompose(this.calcTransformMatrix());return{scaleX:Math.abs(t.scaleX),scaleY:Math.abs(t.scaleY)}},getTotalObjectScaling:function(){var t=this.getObjectScaling(),e=t.scaleX,i=t.scaleY;if(this.canvas){var r=this.canvas.getZoom(),n=this.canvas.getRetinaScaling();e*=r*n,i*=r*n}return{scaleX:e,scaleY:i}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_set:function(t,e){var i="scaleX"===t||"scaleY"===t,r=this[t]!==e,n=!1;return i&&(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof x.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",e):e=new x.Shadow(e),this[t]=e,r&&(n=this.group&&this.group.isOnACache(),-1=t.x&&n.left+n.width<=e.x&&n.top>=t.y&&n.top+n.height<=e.y},containsPoint:function(t,e,i,r){var n=this._getCoords(i,r),s=(e=e||this._getImageLines(n),this._findCrossPoints(t,e));return 0!==s&&s%2==1},isOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.getCoords(!0,t).some(function(t){return t.x<=i.x&&t.x>=e.x&&t.y<=i.y&&t.y>=e.y})||(!!this.intersectsWithRect(e,i,!0,t)||this._containsCenterOfCanvas(e,i,t))},_containsCenterOfCanvas:function(t,e,i){var r={x:(t.x+e.x)/2,y:(t.y+e.y)/2};return!!this.containsPoint(r,null,!0,i)},isPartiallyOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.intersectsWithRect(e,i,!0,t)||this.getCoords(!0,t).every(function(t){return(t.x>=i.x||t.x<=e.x)&&(t.y>=i.y||t.y<=e.y)})&&this._containsCenterOfCanvas(e,i,t)},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s=0;for(var o in e)if(!((n=e[o]).o.y=t.y&&n.d.y>=t.y||(n.o.x===n.d.x&&n.o.x>=t.x?r=n.o.x:(0,i=(n.d.y-n.o.y)/(n.d.x-n.o.x),r=-(t.y-0*t.x-(n.o.y-i*n.o.x))/(0-i)),r>=t.x&&(s+=1),2!==s)))break;return s},getBoundingRect:function(t,e){var i=this.getCoords(t,e);return c.makeBoundingBoxFromPoints(i)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)\n')}},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})},toClipPathSVG:function(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})},_createBaseClipPathSVGMarkup:function(t,e){var i=(e=e||{}).reviver,r=e.additionalTransform||"",n=[this.getSvgTransform(!0,r),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=n,i?i(t.join("")):t.join("")},_createBaseSVGMarkup:function(t,e){var i,r,n=(e=e||{}).noStyle,s=e.reviver,o=n?"":'style="'+this.getSvgStyles()+'" ',a=e.withShadow?'style="'+this.getSvgFilter()+'" ':"",h=this.clipPath,c=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=h&&h.absolutePositioned,u=this.stroke,f=this.fill,d=this.shadow,g=[],p=t.indexOf("COMMON_PARTS"),v=e.additionalTransform;return h&&(h.clipPathId="CLIPPATH_"+fabric.Object.__uid++,r='\n'+h.toClipPathSVG(s)+"\n"),l&&g.push("\n"),g.push("\n"),i=[o,c,n?"":this.addPaintOrder()," ",v?'transform="'+v+'" ':""].join(""),t[p]=i,f&&f.toLive&&g.push(f.toSVG(this)),u&&u.toLive&&g.push(u.toSVG(this)),d&&g.push(d.toSVG(this)),h&&g.push(r),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")},addPaintOrder:function(){return"fill"!==this.paintFirst?' paint-order="'+this.paintFirst+'" ':""}})}(),function(){var n=fabric.util.object.extend,r="stateProperties";function s(e,t,i){var r={};i.forEach(function(t){r[t]=e[t]}),n(e[t],r,!0)}fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(t){var e="_"+(t=t||r);return Object.keys(this[e]).length\n']}}),s.Line.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),s.Line.fromElement=function(t,e,i){i=i||{};var r=s.parseAttributes(t,s.Line.ATTRIBUTE_NAMES),n=[r.x1||0,r.y1||0,r.x2||0,r.y2||0];e(new s.Line(n,o(r,i)))},s.Line.fromObject=function(t,e){var i=r(t,!0);i.points=[t.x1,t.y1,t.x2,t.y2],s.Object._fromObject("Line",i,function(t){delete t.points,e&&e(t)},"points")})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var a=t.fabric||(t.fabric={}),h=Math.PI;a.Circle?a.warn("fabric.Circle is already defined."):(a.Circle=a.util.createClass(a.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*h,cacheProperties:a.Object.prototype.cacheProperties.concat("radius","startAngle","endAngle"),_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},_toSVG:function(){var t,e=(this.endAngle-this.startAngle)%(2*h);if(0===e)t=["\n'];else{var i=a.util.cos(this.startAngle)*this.radius,r=a.util.sin(this.startAngle)*this.radius,n=a.util.cos(this.endAngle)*this.radius,s=a.util.sin(this.endAngle)*this.radius,o=h\n"]}return t},_render:function(t){t.beginPath(),t.arc(0,0,this.radius,this.startAngle,this.endAngle,!1),this._renderPaintInOrder(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),a.Circle.ATTRIBUTE_NAMES=a.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),a.Circle.fromElement=function(t,e){var i,r=a.parseAttributes(t,a.Circle.ATTRIBUTE_NAMES);if(!("radius"in(i=r)&&0<=i.radius))throw new Error("value of `r` attribute is required and can not be negative");r.left=(r.left||0)-r.radius,r.top=(r.top||0)-r.radius,e(new a.Circle(r))},a.Circle.fromObject=function(t,e){return a.Object._fromObject("Circle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var r=t.fabric||(t.fabric={});r.Triangle?r.warn("fabric.Triangle is already defined"):(r.Triangle=r.util.createClass(r.Object,{type:"triangle",width:100,height:100,_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)},_renderDashedStroke:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),r.util.drawDashedLine(t,-e,i,0,-i,this.strokeDashArray),r.util.drawDashedLine(t,0,-i,e,i,this.strokeDashArray),r.util.drawDashedLine(t,e,i,-e,i,this.strokeDashArray),t.closePath()},_toSVG:function(){var t=this.width/2,e=this.height/2;return["']}}),r.Triangle.fromObject=function(t,e){return r.Object._fromObject("Triangle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var r=t.fabric||(t.fabric={}),e=2*Math.PI;r.Ellipse?r.warn("fabric.Ellipse is already defined."):(r.Ellipse=r.util.createClass(r.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:r.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,e,!1),t.restore(),this._renderPaintInOrder(t)}}),r.Ellipse.ATTRIBUTE_NAMES=r.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),r.Ellipse.fromElement=function(t,e){var i=r.parseAttributes(t,r.Ellipse.ATTRIBUTE_NAMES);i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,e(new r.Ellipse(i))},r.Ellipse.fromObject=function(t,e){return r.Object._fromObject("Ellipse",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var s=t.fabric||(t.fabric={}),o=s.util.object.extend;s.Rect?s.warn("fabric.Rect is already defined"):(s.Rect=s.util.createClass(s.Object,{stateProperties:s.Object.prototype.stateProperties.concat("rx","ry"),type:"rect",rx:0,ry:0,cacheProperties:s.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t){var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,h=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-h*e,o,s+r,o+h*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-h*i,s+r-h*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+h*e,o+n,s,o+n-h*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+h*i,s+h*e,o,s+e,o),t.closePath(),this._renderPaintInOrder(t)},_renderDashedStroke:function(t){var e=-this.width/2,i=-this.height/2,r=this.width,n=this.height;t.beginPath(),s.util.drawDashedLine(t,e,i,e+r,i,this.strokeDashArray),s.util.drawDashedLine(t,e+r,i,e+r,i+n,this.strokeDashArray),s.util.drawDashedLine(t,e+r,i+n,e,i+n,this.strokeDashArray),s.util.drawDashedLine(t,e,i+n,e,i,this.strokeDashArray),t.closePath()},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']}}),s.Rect.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),s.Rect.fromElement=function(t,e,i){if(!t)return e(null);i=i||{};var r=s.parseAttributes(t,s.Rect.ATTRIBUTE_NAMES);r.left=r.left||0,r.top=r.top||0,r.height=r.height||0,r.width=r.width||0;var n=new s.Rect(o(i?s.util.object.clone(i):{},r));n.visible=n.visible&&0\n']},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){return n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()})})},toDatalessObject:function(t){var e=this.toObject(["sourcePath"].concat(t));return e.sourcePath&&delete e.path,e},_toSVG:function(){return["\n"]},_getOffsetTransform:function(){var t=f.Object.NUM_FRACTION_DIGITS;return" translate("+e(-this.pathOffset.x,t)+", "+e(-this.pathOffset.y,t)+")"},toClipPathSVG:function(t){var e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},toSVG:function(t){var e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},complexity:function(){return this.path.length},_calcDimensions:function(){for(var t,e,i=[],r=[],n=0,s=0,o=0,a=0,h=0,c=this.path.length;h"},addWithUpdate:function(t){var e=!!this.group;return this._restoreObjectsState(),c.util.resetObjectTransform(this),t&&(e&&c.util.removeTransformFromObject(t,this.group.calcTransformMatrix()),this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,e?this.group.addWithUpdate():this.setCoords(),this},removeWithUpdate:function(t){return this._restoreObjectsState(),c.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);if("canvas"===t)for(;i--;)this._objects[i]._set(t,e);c.Object.prototype._set.call(this,t,e)},toObject:function(r){var n=this.includeDefaultValues,t=this._objects.map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toObject(r);return t.includeDefaultValues=e,i}),e=c.Object.prototype.toObject.call(this,r);return e.objects=t,e},toDatalessObject:function(r){var t,e=this.sourcePath;if(e)t=e;else{var n=this.includeDefaultValues;t=this._objects.map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toDatalessObject(r);return t.includeDefaultValues=e,i})}var i=c.Object.prototype.toDatalessObject.call(this,r);return i.objects=t,i},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=c.Object.prototype.shouldCache.call(this);if(t)for(var e=0,i=this._objects.length;e\n"],i=0,r=this._objects.length;i\n"),e},getSvgStyles:function(){var t=void 0!==this.opacity&&1!==this.opacity?"opacity: "+this.opacity+";":"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")},toClipPathSVG:function(t){for(var e=[],i=0,r=this._objects.length;i"},shouldCache:function(){return!1},isOnACache:function(){return!1},_renderControls:function(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.callSuper("_renderControls",t,e),void 0===(i=i||{}).hasControls&&(i.hasControls=!1),i.forActiveSelection=!0;for(var r=0,n=this._objects.length;r\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+h+')" '}if(this.imageSmoothing||(a='" image-rendering="optimizeSpeed'),i.push("\t\n"),this.stroke||this.strokeDashArray){var c=this.fill;this.fill=null,t=["\t\n'],this.fill=c}return e="fill"!==this.paintFirst?e.concat(t,i):e.concat(i,t)},getSrc:function(t){var e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src"):e.src:this.src||""},setSrc:function(t,i,r){return fabric.util.loadImage(t,function(t,e){this.setElement(t,r),this._setWidthHeight(),i&&i(this,e)},this,r&&r.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.scaleX,n=i.scaleY,s=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||e=t;for(var a=["highp","mediump","lowp"],h=0;h<3;h++)if(void 0,i="precision "+a[h]+" float;\nvoid main(){}",r=(e=s).createShader(e.FRAGMENT_SHADER),e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)){fabric.webGlPrecision=a[h];break}}return this.isSupported=o},(fabric.WebglFilterBackend=t).prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.aPosition=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i,r=void 0!==window.performance;try{new ImageData(1,1),i=!0}catch(t){i=!1}var n="undefined"!=typeof ArrayBuffer,s="undefined"!=typeof Uint8ClampedArray;if(r&&i&&n&&s){var o=fabric.util.createCanvasElement(),a=new ArrayBuffer(t*e*4);if(fabric.forceGLPutImageData)return this.imageBuffer=a,void(this.copyGLTo2D=copyGLTo2DPutImageData);var h,c,l={imageBuffer:a,destinationWidth:t,destinationHeight:e,targetCanvas:o};o.width=t,o.height=e,h=window.performance.now(),copyGLTo2DDrawImage.call(l,this.gl,l),c=window.performance.now()-h,h=window.performance.now(),copyGLTo2DPutImageData.call(l,this.gl,l),window.performance.now()-h 0.0) {\n"+this.fragmentSource[t]+"}\n}"},retrieveShader:function(t){var e,i=this.type+"_"+this.mode;return t.programCache.hasOwnProperty(i)||(e=this.buildSource(this.mode),t.programCache[i]=this.createProgram(t.context,e)),t.programCache[i]},applyTo2d:function(t){var e,i,r,n,s,o,a,h=t.imageData.data,c=h.length,l=1-this.alpha;e=(a=new f.Color(this.color).getSource())[0]*this.alpha,i=a[1]*this.alpha,r=a[2]*this.alpha;for(var u=0;u'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))},_setTextStyles:function(t,e,i){t.textBaseline="alphabetic",t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;ethis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this.restartCursorIfNeeded(),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),n=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e);return{selectionStart:n,selectionEnd:n+fabric.util.string.graphemeSplit(s).length}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}},_updateTextarea:function(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){var t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}},updateFromTextArea:function(){if(this.hiddenTextarea){this.cursorOffsetCache={},this.text=this.hiddenTextarea.value,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords());var t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value);this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition()}},updateTextareaPosition:function(){if(this.selectionStart===this.selectionEnd){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.calcTransformMatrix(),h={x:e.left+o,y:e.top+e.topOffset+s},c=this.canvas.getRetinaScaling(),l=this.canvas.upperCanvasEl,u=l.width/c,f=l.height/c,d=u-s,g=f-s,p=l.clientWidth/u,v=l.clientHeight/f;return h=fabric.util.transformPoint(h,a),(h=fabric.util.transformPoint(h,this.canvas.viewportTransform)).x*=p,h.y*=v,h.x<0&&(h.x=0),h.x>d&&(h.x=d),h.y<0&&(h.y=0),h.y>g&&(h.y=g),h.x+=this.canvas._offset.left,h.y+=this.canvas._offset.top,{left:h.x+"px",top:h.y+"px",fontSize:s+"px",charHeight:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text,e=this.hiddenTextarea;return this.selected=!1,this.isEditing=!1,this.selectionEnd=this.selectionStart,e&&(e.blur&&e.blur(),e.parentNode&&e.parentNode.removeChild(e)),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},removeStyleFromTo:function(t,e){var i,r,n=this.get2DCursorLocation(t,!0),s=this.get2DCursorLocation(e,!0),o=n.lineIndex,a=n.charIndex,h=s.lineIndex,c=s.charIndex;if(o!==h){if(this.styles[o])for(i=a;it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown)},onMouseDown:function(t){if(this.canvas){this.__newClickTime=+new Date;var e=t.pointer;this.isTripleClick(e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected}},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},doubleClickHandler:function(t){this.isEditing&&this.selectWord(this.getSelectionStartFromPointer(t.e))},tripleClickHandler:function(t){this.isEditing&&this.selectLine(this.getSelectionStartFromPointer(t.e))},initClicks:function(){this.on("mousedblclick",this.doubleClickHandler),this.on("tripleclick",this.tripleClickHandler)},_mouseDownHandler:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.__isMousedown=!0,this.selected&&(this.inCompositionMode=!1,this.setCursorByClick(t.e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()))},_mouseDownHandlerBefore:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.selected=this===this.canvas._activeObject)},initMousedownHandler:function(){this.on("mousedown",this._mouseDownHandler),this.on("mousedown:before",this._mouseDownHandlerBefore)},initMouseupHandler:function(){this.on("mouseup",this.mouseUpHandler)},mouseUpHandler:function(t){if(this.__isMousedown=!1,!(!this.editable||this.group||t.transform&&t.transform.actionPerformed||t.e.button&&1!==t.e.button)){if(this.canvas){var e=this.canvas._activeObject;if(e&&e!==this)return}this.__lastSelected&&!this.__corner?(this.selected=!1,this.__lastSelected=!1,this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()):this.selected=!0}},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e,i=this.getLocalPointer(t),r=0,n=0,s=0,o=0,a=0,h=0,c=this._textLines.length;hthis._text.length&&(a=this._text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; paddingーtop: "+t.fontSize+";",fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},keysMap:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},keysMapRtl:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorLeft",36:"moveCursorRight",37:"moveCursorRight",38:"moveCursorUp",39:"moveCursorLeft",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){var e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),33<=t.keyCode&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n,s,o,a=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,h=this._text.length,c=a.length,l=c-h,u=this.selectionStart,f=this.selectionEnd,d=u!==f;if(""===this.hiddenTextarea.value)return this.styles={},this.updateFromTextArea(),this.fire("changed"),void(this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll()));var g=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),p=u>g.selectionStart;d?(i=this._text.slice(u,f),l+=f-u):c=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i=this["get"+t+"CursorOffset"](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,e.shiftKey?i+="Shift":i+="outShift",this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t,e){void 0===e&&(e=t+1),this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()},insertChars:function(t,e,i,r){void 0===r&&(r=i),i",t.textSpans.join(""),"\n"]},_getSVGTextAndBg:function(t,e){var i,r=[],n=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(t),""].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,h,c=this.getHeightOfLine(e),l=-1!==this.textAlign.indexOf("justify"),u="",f=0,d=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var g=0,p=d.length-1;g<=p;g++)h=g===p||this.charSpacing,u+=d[g],o=this.__charBounds[e][g],0===f?(i+=o.kernedWidth-o.width,f+=o.width):f+=o.kernedWidth,l&&!h&&this._reSpaceAndTab.test(d[g])&&(h=!0),h||(n=n||this.getCompleteStyleDeclaration(e,g),s=this.getCompleteStyleDeclaration(e,g+1),h=this._hasStyleChangedForSvg(n,s)),h&&(a=this._getStyleDeclaration(e,g)||{},t.push(this._createTextCharSpan(u,a,i,r)),u="",n=s,i+=f,f=0)},_pushTextBgRect:function(t,e,i,r,n,s){var o=fabric.Object.NUM_FRACTION_DIGITS;t.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,h=0,c=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),-1!==this.textAlign.indexOf("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight(),this.saveState({propertySet:"_dimensionAffectingProps"}))},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;sthis.dynamicMinWidth&&(this.dynamicMinWidth=g-v+r),o},isEndOfWrapping:function(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line},missingNewlineOffset:function(t){return this.splitByGrapheme?this.isEndOfWrapping(t)?1:0:1},_splitTextIntoLines:function(t){for(var e=b.Text.prototype._splitTextIntoLines.call(this,t),i=this._wrapText(e.lines,this.width),r=new Array(i.length),n=0;n 0); - -/** - * True when in environment that's probably Node.js - * @type boolean - */ -fabric.isLikelyNode = typeof Buffer !== 'undefined' && - typeof window === 'undefined'; - -/* _FROM_SVG_START_ */ -/** - * Attributes parsed from all SVG elements - * @type array - */ -fabric.SHARED_ATTRIBUTES = [ - 'display', - 'transform', - 'fill', 'fill-opacity', 'fill-rule', - 'opacity', - 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset', - 'stroke-linejoin', 'stroke-miterlimit', - 'stroke-opacity', 'stroke-width', - 'id', 'paint-order', 'vector-effect', - 'instantiated_by_use', 'clip-path', -]; -/* _FROM_SVG_END_ */ - -/** - * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion. - */ -fabric.DPI = 96; -fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:[eE][-+]?\\d+)?)'; -fabric.commaWsp = '(?:\\s+,?\\s*|,\\s*)'; -fabric.rePathCommand = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:[eE][-+]?\d+)?)/ig; -fabric.reNonWord = /[ \n\.,;!\?\-]/; -fabric.fontPaths = { }; -fabric.iMatrix = [1, 0, 0, 1, 0, 0]; -fabric.svgNS = 'http://www.w3.org/2000/svg'; - -/** - * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine. - * @since 1.7.14 - * @type Number - * @default - */ -fabric.perfLimitSizeTotal = 2097152; - -/** - * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000 - * @since 1.7.14 - * @type Number - * @default - */ -fabric.maxCacheSideLimit = 4096; - -/** - * Lowest pixel limit for cache canvases, set at 256PX - * @since 1.7.14 - * @type Number - * @default - */ -fabric.minCacheSideLimit = 256; - -/** - * Cache Object for widths of chars in text rendering. - */ -fabric.charWidthsCache = { }; - -/** - * if webgl is enabled and available, textureSize will determine the size - * of the canvas backend - * @since 2.0.0 - * @type Number - * @default - */ -fabric.textureSize = 2048; - -/** - * When 'true', style information is not retained when copy/pasting text, making - * pasted text use destination style. - * Defaults to 'false'. - * @type Boolean - * @default - */ -fabric.disableStyleCopyPaste = false; - -/** - * Enable webgl for filtering picture is available - * A filtering backend will be initialized, this will both take memory and - * time since a default 2048x2048 canvas will be created for the gl context - * @since 2.0.0 - * @type Boolean - * @default - */ -fabric.enableGLFiltering = true; - -/** - * Device Pixel Ratio - * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html - */ -fabric.devicePixelRatio = fabric.window.devicePixelRatio || - fabric.window.webkitDevicePixelRatio || - fabric.window.mozDevicePixelRatio || - 1; -/** - * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value, - * which is unitless and not rendered equally across browsers. - * - * Values that work quite well (as of October 2017) are: - * - Chrome: 1.5 - * - Edge: 1.75 - * - Firefox: 0.9 - * - Safari: 0.95 - * - * @since 2.0.0 - * @type Number - * @default 1 - */ -fabric.browserShadowBlurConstant = 1; - -/** - * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again. - * It was an internal variable, is accessible since version 2.3.4 - */ -fabric.arcToSegmentsCache = { }; - -/** - * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it. - * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing - * you do not get any speed benefit and you get a big object in memory. - * The object was a private variable before, while now is appended to the lib so that you have access to it and you - * can eventually clear it. - * It was an internal variable, is accessible since version 2.3.4 - */ -fabric.boundsOfCurveCache = { }; - -/** - * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better - * @default true - */ -fabric.cachesBoundsOfCurve = true; - -/** - * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on - * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true - * this has to be set before instantiating the filtering backend ( before filtering the first image ) - * @type Boolean - * @default false - */ -fabric.forceGLPutImageData = false; - -fabric.initFilterBackend = function() { - if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) { - console.log('max texture size: ' + fabric.maxTextureSize); - return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize })); - } - else if (fabric.Canvas2dFilterBackend) { - return (new fabric.Canvas2dFilterBackend()); - } -}; - - -if (typeof document !== 'undefined' && typeof window !== 'undefined') { - // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system) - window.fabric = fabric; -} - - -(function() { - - /** - * @private - * @param {String} eventName - * @param {Function} handler - */ - function _removeEventListener(eventName, handler) { - if (!this.__eventListeners[eventName]) { - return; - } - var eventListener = this.__eventListeners[eventName]; - if (handler) { - eventListener[eventListener.indexOf(handler)] = false; - } - else { - fabric.util.array.fill(eventListener, false); - } - } - - /** - * Observes specified event - * @memberOf fabric.Observable - * @alias on - * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) - * @param {Function} handler Function that receives a notification when an event of the specified type occurs - * @return {Self} thisArg - * @chainable - */ - function on(eventName, handler) { - if (!this.__eventListeners) { - this.__eventListeners = { }; - } - // one object with key/value pairs was passed - if (arguments.length === 1) { - for (var prop in eventName) { - this.on(prop, eventName[prop]); - } - } - else { - if (!this.__eventListeners[eventName]) { - this.__eventListeners[eventName] = []; - } - this.__eventListeners[eventName].push(handler); - } - return this; - } - - function _once(eventName, handler) { - var _handler = function () { - handler.apply(this, arguments); - this.off(eventName, _handler); - }.bind(this); - this.on(eventName, _handler); - } - - function once(eventName, handler) { - // one object with key/value pairs was passed - if (arguments.length === 1) { - for (var prop in eventName) { - _once.call(this, prop, eventName[prop]); - } - } - else { - _once.call(this, eventName, handler); - } - return this; - } - - /** - * Stops event observing for a particular event handler. Calling this method - * without arguments removes all handlers for all events - * @memberOf fabric.Observable - * @alias off - * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) - * @param {Function} handler Function to be deleted from EventListeners - * @return {Self} thisArg - * @chainable - */ - function off(eventName, handler) { - if (!this.__eventListeners) { - return this; - } - - // remove all key/value pairs (event name -> event handler) - if (arguments.length === 0) { - for (eventName in this.__eventListeners) { - _removeEventListener.call(this, eventName); - } - } - // one object with key/value pairs was passed - else if (arguments.length === 1 && typeof arguments[0] === 'object') { - for (var prop in eventName) { - _removeEventListener.call(this, prop, eventName[prop]); - } - } - else { - _removeEventListener.call(this, eventName, handler); - } - return this; - } - - /** - * Fires event with an optional options object - * @memberOf fabric.Observable - * @param {String} eventName Event name to fire - * @param {Object} [options] Options object - * @return {Self} thisArg - * @chainable - */ - function fire(eventName, options) { - if (!this.__eventListeners) { - return this; - } - - var listenersForEvent = this.__eventListeners[eventName]; - if (!listenersForEvent) { - return this; - } - - for (var i = 0, len = listenersForEvent.length; i < len; i++) { - listenersForEvent[i] && listenersForEvent[i].call(this, options || { }); - } - this.__eventListeners[eventName] = listenersForEvent.filter(function(value) { - return value !== false; - }); - return this; - } - - /** - * @namespace fabric.Observable - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events} - * @see {@link http://fabricjs.com/events|Events demo} - */ - fabric.Observable = { - fire: fire, - on: on, - once: once, - off: off, - }; -})(); - - -/** - * @namespace fabric.Collection - */ -fabric.Collection = { - - _objects: [], - - /** - * Adds objects to collection, Canvas or Group, then renders canvas - * (if `renderOnAddRemove` is not `false`). - * in case of Group no changes to bounding box are made. - * Objects should be instances of (or inherit from) fabric.Object - * Use of this function is highly discouraged for groups. - * you can add a bunch of objects with the add method but then you NEED - * to run a addWithUpdate call for the Group class or position/bbox will be wrong. - * @param {...fabric.Object} object Zero or more fabric instances - * @return {Self} thisArg - * @chainable - */ - add: function () { - this._objects.push.apply(this._objects, arguments); - if (this._onObjectAdded) { - for (var i = 0, length = arguments.length; i < length; i++) { - this._onObjectAdded(arguments[i]); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`) - * An object should be an instance of (or inherit from) fabric.Object - * Use of this function is highly discouraged for groups. - * you can add a bunch of objects with the insertAt method but then you NEED - * to run a addWithUpdate call for the Group class or position/bbox will be wrong. - * @param {Object} object Object to insert - * @param {Number} index Index to insert object at - * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs - * @return {Self} thisArg - * @chainable - */ - insertAt: function (object, index, nonSplicing) { - var objects = this._objects; - if (nonSplicing) { - objects[index] = object; - } - else { - objects.splice(index, 0, object); - } - this._onObjectAdded && this._onObjectAdded(object); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`) - * @param {...fabric.Object} object Zero or more fabric instances - * @return {Self} thisArg - * @chainable - */ - remove: function() { - var objects = this._objects, - index, somethingRemoved = false; - - for (var i = 0, length = arguments.length; i < length; i++) { - index = objects.indexOf(arguments[i]); - - // only call onObjectRemoved if an object was actually removed - if (index !== -1) { - somethingRemoved = true; - objects.splice(index, 1); - this._onObjectRemoved && this._onObjectRemoved(arguments[i]); - } - } - - this.renderOnAddRemove && somethingRemoved && this.requestRenderAll(); - return this; - }, - - /** - * Executes given function for each object in this group - * @param {Function} callback - * Callback invoked with current object as first argument, - * index - as second and an array of all objects - as third. - * Callback is invoked in a context of Global Object (e.g. `window`) - * when no `context` argument is given - * - * @param {Object} context Context (aka thisObject) - * @return {Self} thisArg - * @chainable - */ - forEachObject: function(callback, context) { - var objects = this.getObjects(); - for (var i = 0, len = objects.length; i < len; i++) { - callback.call(context, objects[i], i, objects); - } - return this; - }, - - /** - * Returns an array of children objects of this instance - * Type parameter introduced in 1.3.10 - * since 2.3.5 this method return always a COPY of the array; - * @param {String} [type] When specified, only objects of this type are returned - * @return {Array} - */ - getObjects: function(type) { - if (typeof type === 'undefined') { - return this._objects.concat(); - } - return this._objects.filter(function(o) { - return o.type === type; - }); - }, - - /** - * Returns object at specified index - * @param {Number} index - * @return {Self} thisArg - */ - item: function (index) { - return this._objects[index]; - }, - - /** - * Returns true if collection contains no objects - * @return {Boolean} true if collection is empty - */ - isEmpty: function () { - return this._objects.length === 0; - }, - - /** - * Returns a size of a collection (i.e: length of an array containing its objects) - * @return {Number} Collection size - */ - size: function() { - return this._objects.length; - }, - - /** - * Returns true if collection contains an object - * @param {Object} object Object to check against - * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects` - * @return {Boolean} `true` if collection contains an object - */ - contains: function (object, deep) { - if (this._objects.indexOf(object) > -1) { - return true; - } - else if (deep) { - return this._objects.some(function (obj) { - return typeof obj.contains === 'function' && obj.contains(object, true); - }); - } - return false; - }, - - /** - * Returns number representation of a collection complexity - * @return {Number} complexity - */ - complexity: function () { - return this._objects.reduce(function (memo, current) { - memo += current.complexity ? current.complexity() : 0; - return memo; - }, 0); - } -}; - - -/** - * @namespace fabric.CommonMethods - */ -fabric.CommonMethods = { - - /** - * Sets object's properties from options - * @param {Object} [options] Options object - */ - _setOptions: function(options) { - for (var prop in options) { - this.set(prop, options[prop]); - } - }, - - /** - * @private - * @param {Object} [filler] Options object - * @param {String} [property] property to set the Gradient to - */ - _initGradient: function(filler, property) { - if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) { - this.set(property, new fabric.Gradient(filler)); - } - }, - - /** - * @private - * @param {Object} [filler] Options object - * @param {String} [property] property to set the Pattern to - * @param {Function} [callback] callback to invoke after pattern load - */ - _initPattern: function(filler, property, callback) { - if (filler && filler.source && !(filler instanceof fabric.Pattern)) { - this.set(property, new fabric.Pattern(filler, callback)); - } - else { - callback && callback(); - } - }, - - /** - * @private - */ - _setObject: function(obj) { - for (var prop in obj) { - this._set(prop, obj[prop]); - } - }, - - /** - * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. - * @param {String|Object} key Property name or object (if object, iterate over the object properties) - * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) - * @return {fabric.Object} thisArg - * @chainable - */ - set: function(key, value) { - if (typeof key === 'object') { - this._setObject(key); - } - else { - this._set(key, value); - } - return this; - }, - - _set: function(key, value) { - this[key] = value; - }, - - /** - * Toggles specified property from `true` to `false` or from `false` to `true` - * @param {String} property Property to toggle - * @return {fabric.Object} thisArg - * @chainable - */ - toggle: function(property) { - var value = this.get(property); - if (typeof value === 'boolean') { - this.set(property, !value); - } - return this; - }, - - /** - * Basic getter - * @param {String} property Property name - * @return {*} value of a property - */ - get: function(property) { - return this[property]; - } -}; - - -(function(global) { - - var sqrt = Math.sqrt, - atan2 = Math.atan2, - pow = Math.pow, - PiBy180 = Math.PI / 180, - PiBy2 = Math.PI / 2; - - /** - * @namespace fabric.util - */ - fabric.util = { - - /** - * Calculate the cos of an angle, avoiding returning floats for known results - * @static - * @memberOf fabric.util - * @param {Number} angle the angle in radians or in degree - * @return {Number} - */ - cos: function(angle) { - if (angle === 0) { return 1; } - if (angle < 0) { - // cos(a) = cos(-a) - angle = -angle; - } - var angleSlice = angle / PiBy2; - switch (angleSlice) { - case 1: case 3: return 0; - case 2: return -1; - } - return Math.cos(angle); - }, - - /** - * Calculate the sin of an angle, avoiding returning floats for known results - * @static - * @memberOf fabric.util - * @param {Number} angle the angle in radians or in degree - * @return {Number} - */ - sin: function(angle) { - if (angle === 0) { return 0; } - var angleSlice = angle / PiBy2, sign = 1; - if (angle < 0) { - // sin(-a) = -sin(a) - sign = -1; - } - switch (angleSlice) { - case 1: return sign; - case 2: return 0; - case 3: return -sign; - } - return Math.sin(angle); - }, - - /** - * Removes value from an array. - * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf` - * @static - * @memberOf fabric.util - * @param {Array} array - * @param {*} value - * @return {Array} original array - */ - removeFromArray: function(array, value) { - var idx = array.indexOf(value); - if (idx !== -1) { - array.splice(idx, 1); - } - return array; - }, - - /** - * Returns random number between 2 specified ones. - * @static - * @memberOf fabric.util - * @param {Number} min lower limit - * @param {Number} max upper limit - * @return {Number} random value (between min and max) - */ - getRandomInt: function(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - }, - - /** - * Transforms degrees to radians. - * @static - * @memberOf fabric.util - * @param {Number} degrees value in degrees - * @return {Number} value in radians - */ - degreesToRadians: function(degrees) { - return degrees * PiBy180; - }, - - /** - * Transforms radians to degrees. - * @static - * @memberOf fabric.util - * @param {Number} radians value in radians - * @return {Number} value in degrees - */ - radiansToDegrees: function(radians) { - return radians / PiBy180; - }, - - /** - * Rotates `point` around `origin` with `radians` - * @static - * @memberOf fabric.util - * @param {fabric.Point} point The point to rotate - * @param {fabric.Point} origin The origin of the rotation - * @param {Number} radians The radians of the angle for the rotation - * @return {fabric.Point} The new rotated point - */ - rotatePoint: function(point, origin, radians) { - var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y), - v = fabric.util.rotateVector(newPoint, radians); - return new fabric.Point(v.x, v.y).addEquals(origin); - }, - - /** - * Rotates `vector` with `radians` - * @static - * @memberOf fabric.util - * @param {Object} vector The vector to rotate (x and y) - * @param {Number} radians The radians of the angle for the rotation - * @return {Object} The new rotated point - */ - rotateVector: function(vector, radians) { - var sin = fabric.util.sin(radians), - cos = fabric.util.cos(radians), - rx = vector.x * cos - vector.y * sin, - ry = vector.x * sin + vector.y * cos; - return { - x: rx, - y: ry - }; - }, - - /** - * Apply transform t to point p - * @static - * @memberOf fabric.util - * @param {fabric.Point} p The point to transform - * @param {Array} t The transform - * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied - * @return {fabric.Point} The transformed point - */ - transformPoint: function(p, t, ignoreOffset) { - if (ignoreOffset) { - return new fabric.Point( - t[0] * p.x + t[2] * p.y, - t[1] * p.x + t[3] * p.y - ); - } - return new fabric.Point( - t[0] * p.x + t[2] * p.y + t[4], - t[1] * p.x + t[3] * p.y + t[5] - ); - }, - - /** - * Returns coordinates of points's bounding rectangle (left, top, width, height) - * @param {Array} points 4 points array - * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix - * @return {Object} Object with left, top, width, height properties - */ - makeBoundingBoxFromPoints: function(points, transform) { - if (transform) { - for (var i = 0; i < points.length; i++) { - points[i] = fabric.util.transformPoint(points[i], transform); - } - } - var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x], - minX = fabric.util.array.min(xPoints), - maxX = fabric.util.array.max(xPoints), - width = maxX - minX, - yPoints = [points[0].y, points[1].y, points[2].y, points[3].y], - minY = fabric.util.array.min(yPoints), - maxY = fabric.util.array.max(yPoints), - height = maxY - minY; - - return { - left: minX, - top: minY, - width: width, - height: height - }; - }, - - /** - * Invert transformation t - * @static - * @memberOf fabric.util - * @param {Array} t The transform - * @return {Array} The inverted transform - */ - invertTransform: function(t) { - var a = 1 / (t[0] * t[3] - t[1] * t[2]), - r = [a * t[3], -a * t[1], -a * t[2], a * t[0]], - o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true); - r[4] = -o.x; - r[5] = -o.y; - return r; - }, - - /** - * A wrapper around Number#toFixed, which contrary to native method returns number, not string. - * @static - * @memberOf fabric.util - * @param {Number|String} number number to operate on - * @param {Number} fractionDigits number of fraction digits to "leave" - * @return {Number} - */ - toFixed: function(number, fractionDigits) { - return parseFloat(Number(number).toFixed(fractionDigits)); - }, - - /** - * Converts from attribute value to pixel value if applicable. - * Returns converted pixels or original value not converted. - * @param {Number|String} value number to operate on - * @param {Number} fontSize - * @return {Number|String} - */ - parseUnit: function(value, fontSize) { - var unit = /\D{0,2}$/.exec(value), - number = parseFloat(value); - if (!fontSize) { - fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; - } - switch (unit[0]) { - case 'mm': - return number * fabric.DPI / 25.4; - - case 'cm': - return number * fabric.DPI / 2.54; - - case 'in': - return number * fabric.DPI; - - case 'pt': - return number * fabric.DPI / 72; // or * 4 / 3 - - case 'pc': - return number * fabric.DPI / 72 * 12; // or * 16 - - case 'em': - return number * fontSize; - - default: - return number; - } - }, - - /** - * Function which always returns `false`. - * @static - * @memberOf fabric.util - * @return {Boolean} - */ - falseFunction: function() { - return false; - }, - - /** - * Returns klass "Class" object of given namespace - * @memberOf fabric.util - * @param {String} type Type of object (eg. 'circle') - * @param {String} namespace Namespace to get klass "Class" object from - * @return {Object} klass "Class" - */ - getKlass: function(type, namespace) { - // capitalize first letter only - type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1)); - return fabric.util.resolveNamespace(namespace)[type]; - }, - - /** - * Returns array of attributes for given svg that fabric parses - * @memberOf fabric.util - * @param {String} type Type of svg element (eg. 'circle') - * @return {Array} string names of supported attributes - */ - getSvgAttributes: function(type) { - var attributes = [ - 'instantiated_by_use', - 'style', - 'id', - 'class' - ]; - switch (type) { - case 'linearGradient': - attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']); - break; - case 'radialGradient': - attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']); - break; - case 'stop': - attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']); - break; - } - return attributes; - }, - - /** - * Returns object of given namespace - * @memberOf fabric.util - * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric' - * @return {Object} Object for given namespace (default fabric) - */ - resolveNamespace: function(namespace) { - if (!namespace) { - return fabric; - } - - var parts = namespace.split('.'), - len = parts.length, i, - obj = global || fabric.window; - - for (i = 0; i < len; ++i) { - obj = obj[parts[i]]; - } - - return obj; - }, - - /** - * Loads image element from given url and passes it to a callback - * @memberOf fabric.util - * @param {String} url URL representing an image - * @param {Function} callback Callback; invoked with loaded image - * @param {*} [context] Context to invoke callback in - * @param {Object} [crossOrigin] crossOrigin value to set image element to - */ - loadImage: function(url, callback, context, crossOrigin) { - if (!url) { - callback && callback.call(context, url); - return; - } - - var img = fabric.util.createImage(); - - /** @ignore */ - var onLoadCallback = function () { - callback && callback.call(context, img, false); - img = img.onload = img.onerror = null; - }; - - img.onload = onLoadCallback; - /** @ignore */ - img.onerror = function() { - fabric.log('Error loading ' + img.src); - callback && callback.call(context, null, true); - img = img.onload = img.onerror = null; - }; - - // data-urls appear to be buggy with crossOrigin - // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767 - // see https://code.google.com/p/chromium/issues/detail?id=315152 - // https://bugzilla.mozilla.org/show_bug.cgi?id=935069 - // crossOrigin null is the same as not set. - if (url.indexOf('data') !== 0 && - crossOrigin !== undefined && - crossOrigin !== null) { - img.crossOrigin = crossOrigin; - } - - // IE10 / IE11-Fix: SVG contents from data: URI - // will only be available if the IMG is present - // in the DOM (and visible) - if (url.substring(0,14) === 'data:image/svg') { - img.onload = null; - fabric.util.loadImageInDom(img, onLoadCallback); - } - - img.src = url; - }, - - /** - * Attaches SVG image with data: URL to the dom - * @memberOf fabric.util - * @param {Object} img Image object with data:image/svg src - * @param {Function} callback Callback; invoked with loaded image - * @return {Object} DOM element (div containing the SVG image) - */ - loadImageInDom: function(img, onLoadCallback) { - var div = fabric.document.createElement('div'); - div.style.width = div.style.height = '1px'; - div.style.left = div.style.top = '-100%'; - div.style.position = 'absolute'; - div.appendChild(img); - fabric.document.querySelector('body').appendChild(div); - /** - * Wrap in function to: - * 1. Call existing callback - * 2. Cleanup DOM - */ - img.onload = function () { - onLoadCallback(); - div.parentNode.removeChild(div); - div = null; - }; - }, - - /** - * Creates corresponding fabric instances from their object representations - * @static - * @memberOf fabric.util - * @param {Array} objects Objects to enliven - * @param {Function} callback Callback to invoke when all objects are created - * @param {String} namespace Namespace to get klass "Class" object from - * @param {Function} reviver Method for further parsing of object elements, - * called after each fabric object created. - */ - enlivenObjects: function(objects, callback, namespace, reviver) { - objects = objects || []; - - var enlivenedObjects = [], - numLoadedObjects = 0, - numTotalObjects = objects.length; - - function onLoaded() { - if (++numLoadedObjects === numTotalObjects) { - callback && callback(enlivenedObjects.filter(function(obj) { - // filter out undefined objects (objects that gave error) - return obj; - })); - } - } - - if (!numTotalObjects) { - callback && callback(enlivenedObjects); - return; - } - - objects.forEach(function (o, index) { - // if sparse array - if (!o || !o.type) { - onLoaded(); - return; - } - var klass = fabric.util.getKlass(o.type, namespace); - klass.fromObject(o, function (obj, error) { - error || (enlivenedObjects[index] = obj); - reviver && reviver(o, obj, error); - onLoaded(); - }); - }); - }, - - /** - * Create and wait for loading of patterns - * @static - * @memberOf fabric.util - * @param {Array} patterns Objects to enliven - * @param {Function} callback Callback to invoke when all objects are created - * called after each fabric object created. - */ - enlivenPatterns: function(patterns, callback) { - patterns = patterns || []; - - function onLoaded() { - if (++numLoadedPatterns === numPatterns) { - callback && callback(enlivenedPatterns); - } - } - - var enlivenedPatterns = [], - numLoadedPatterns = 0, - numPatterns = patterns.length; - - if (!numPatterns) { - callback && callback(enlivenedPatterns); - return; - } - - patterns.forEach(function (p, index) { - if (p && p.source) { - new fabric.Pattern(p, function(pattern) { - enlivenedPatterns[index] = pattern; - onLoaded(); - }); - } - else { - enlivenedPatterns[index] = p; - onLoaded(); - } - }); - }, - - /** - * Groups SVG elements (usually those retrieved from SVG document) - * @static - * @memberOf fabric.util - * @param {Array} elements SVG elements to group - * @param {Object} [options] Options object - * @param {String} path Value to set sourcePath to - * @return {fabric.Object|fabric.Group} - */ - groupSVGElements: function(elements, options, path) { - var object; - if (elements && elements.length === 1) { - return elements[0]; - } - if (options) { - if (options.width && options.height) { - options.centerPoint = { - x: options.width / 2, - y: options.height / 2 - }; - } - else { - delete options.width; - delete options.height; - } - } - object = new fabric.Group(elements, options); - if (typeof path !== 'undefined') { - object.sourcePath = path; - } - return object; - }, - - /** - * Populates an object with properties of another object - * @static - * @memberOf fabric.util - * @param {Object} source Source object - * @param {Object} destination Destination object - * @return {Array} properties Properties names to include - */ - populateWithProperties: function(source, destination, properties) { - if (properties && Object.prototype.toString.call(properties) === '[object Array]') { - for (var i = 0, len = properties.length; i < len; i++) { - if (properties[i] in source) { - destination[properties[i]] = source[properties[i]]; - } - } - } - }, - - /** - * WARNING: THIS WAS TO SUPPORT OLD BROWSERS. deprecated. - * WILL BE REMOVED IN FABRIC 5.0 - * Draws a dashed line between two points - * - * This method is used to draw dashed line around selection area. - * See dotted stroke in canvas - * - * @param {CanvasRenderingContext2D} ctx context - * @param {Number} x start x coordinate - * @param {Number} y start y coordinate - * @param {Number} x2 end x coordinate - * @param {Number} y2 end y coordinate - * @param {Array} da dash array pattern - * @deprecated - */ - drawDashedLine: function(ctx, x, y, x2, y2, da) { - var dx = x2 - x, - dy = y2 - y, - len = sqrt(dx * dx + dy * dy), - rot = atan2(dy, dx), - dc = da.length, - di = 0, - draw = true; - - ctx.save(); - ctx.translate(x, y); - ctx.moveTo(0, 0); - ctx.rotate(rot); - - x = 0; - while (len > x) { - x += da[di++ % dc]; - if (x > len) { - x = len; - } - ctx[draw ? 'lineTo' : 'moveTo'](x, 0); - draw = !draw; - } - - ctx.restore(); - }, - - /** - * Creates canvas element - * @static - * @memberOf fabric.util - * @return {CanvasElement} initialized canvas element - */ - createCanvasElement: function() { - return fabric.document.createElement('canvas'); - }, - - /** - * Creates a canvas element that is a copy of another and is also painted - * @param {CanvasElement} canvas to copy size and content of - * @static - * @memberOf fabric.util - * @return {CanvasElement} initialized canvas element - */ - copyCanvasElement: function(canvas) { - var newCanvas = fabric.util.createCanvasElement(); - newCanvas.width = canvas.width; - newCanvas.height = canvas.height; - newCanvas.getContext('2d').drawImage(canvas, 0, 0); - return newCanvas; - }, - - /** - * since 2.6.0 moved from canvas instance to utility. - * @param {CanvasElement} canvasEl to copy size and content of - * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too - * @param {Number} quality <= 1 and > 0 - * @static - * @memberOf fabric.util - * @return {String} data url - */ - toDataURL: function(canvasEl, format, quality) { - return canvasEl.toDataURL('image/' + format, quality); - }, - - /** - * Creates image element (works on client and node) - * @static - * @memberOf fabric.util - * @return {HTMLImageElement} HTML image element - */ - createImage: function() { - return fabric.document.createElement('img'); - }, - - /** - * Multiply matrix A by matrix B to nest transformations - * @static - * @memberOf fabric.util - * @param {Array} a First transformMatrix - * @param {Array} b Second transformMatrix - * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices - * @return {Array} The product of the two transform matrices - */ - multiplyTransformMatrices: function(a, b, is2x2) { - // Matrix multiply a * b - return [ - a[0] * b[0] + a[2] * b[1], - a[1] * b[0] + a[3] * b[1], - a[0] * b[2] + a[2] * b[3], - a[1] * b[2] + a[3] * b[3], - is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4], - is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5] - ]; - }, - - /** - * Decomposes standard 2x3 matrix into transform components - * @static - * @memberOf fabric.util - * @param {Array} a transformMatrix - * @return {Object} Components of transform - */ - qrDecompose: function(a) { - var angle = atan2(a[1], a[0]), - denom = pow(a[0], 2) + pow(a[1], 2), - scaleX = sqrt(denom), - scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX, - skewX = atan2(a[0] * a[2] + a[1] * a [3], denom); - return { - angle: angle / PiBy180, - scaleX: scaleX, - scaleY: scaleY, - skewX: skewX / PiBy180, - skewY: 0, - translateX: a[4], - translateY: a[5] - }; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.angle] angle in degrees - * @return {Number[]} transform matrix - */ - calcRotateMatrix: function(options) { - if (!options.angle) { - return fabric.iMatrix.concat(); - } - var theta = fabric.util.degreesToRadians(options.angle), - cos = fabric.util.cos(theta), - sin = fabric.util.sin(theta); - return [cos, sin, -sin, cos, 0, 0]; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet. - * is called DimensionsTransformMatrix because those properties are the one that influence - * the size of the resulting box of the object. - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.scaleX] - * @param {Number} [options.scaleY] - * @param {Boolean} [options.flipX] - * @param {Boolean} [options.flipY] - * @param {Number} [options.skewX] - * @param {Number} [options.skewX] - * @return {Number[]} transform matrix - */ - calcDimensionsMatrix: function(options) { - var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX, - scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY, - scaleMatrix = [ - options.flipX ? -scaleX : scaleX, - 0, - 0, - options.flipY ? -scaleY : scaleY, - 0, - 0], - multiply = fabric.util.multiplyTransformMatrices, - degreesToRadians = fabric.util.degreesToRadians; - if (options.skewX) { - scaleMatrix = multiply( - scaleMatrix, - [1, 0, Math.tan(degreesToRadians(options.skewX)), 1], - true); - } - if (options.skewY) { - scaleMatrix = multiply( - scaleMatrix, - [1, Math.tan(degreesToRadians(options.skewY)), 0, 1], - true); - } - return scaleMatrix; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.angle] - * @param {Number} [options.scaleX] - * @param {Number} [options.scaleY] - * @param {Boolean} [options.flipX] - * @param {Boolean} [options.flipY] - * @param {Number} [options.skewX] - * @param {Number} [options.skewX] - * @param {Number} [options.translateX] - * @param {Number} [options.translateY] - * @return {Number[]} transform matrix - */ - composeMatrix: function(options) { - var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0], - multiply = fabric.util.multiplyTransformMatrices; - if (options.angle) { - matrix = multiply(matrix, fabric.util.calcRotateMatrix(options)); - } - if (options.scaleX !== 1 || options.scaleY !== 1 || - options.skewX || options.skewY || options.flipX || options.flipY) { - matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options)); - } - return matrix; - }, - - /** - * reset an object transform state to neutral. Top and left are not accounted for - * @static - * @memberOf fabric.util - * @param {fabric.Object} target object to transform - */ - resetObjectTransform: function (target) { - target.scaleX = 1; - target.scaleY = 1; - target.skewX = 0; - target.skewY = 0; - target.flipX = false; - target.flipY = false; - target.rotate(0); - }, - - /** - * Extract Object transform values - * @static - * @memberOf fabric.util - * @param {fabric.Object} target object to read from - * @return {Object} Components of transform - */ - saveObjectTransform: function (target) { - return { - scaleX: target.scaleX, - scaleY: target.scaleY, - skewX: target.skewX, - skewY: target.skewY, - angle: target.angle, - left: target.left, - flipX: target.flipX, - flipY: target.flipY, - top: target.top - }; - }, - - /** - * Returns true if context has transparent pixel - * at specified location (taking tolerance into account) - * @param {CanvasRenderingContext2D} ctx context - * @param {Number} x x coordinate - * @param {Number} y y coordinate - * @param {Number} tolerance Tolerance - */ - isTransparent: function(ctx, x, y, tolerance) { - - // If tolerance is > 0 adjust start coords to take into account. - // If moves off Canvas fix to 0 - if (tolerance > 0) { - if (x > tolerance) { - x -= tolerance; - } - else { - x = 0; - } - if (y > tolerance) { - y -= tolerance; - } - else { - y = 0; - } - } - - var _isTransparent = true, i, temp, - imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1), - l = imageData.data.length; - - // Split image data - for tolerance > 1, pixelDataSize = 4; - for (i = 3; i < l; i += 4) { - temp = imageData.data[i]; - _isTransparent = temp <= 0; - if (_isTransparent === false) { - break; // Stop if colour found - } - } - - imageData = null; - - return _isTransparent; - }, - - /** - * Parse preserveAspectRatio attribute from element - * @param {string} attribute to be parsed - * @return {Object} an object containing align and meetOrSlice attribute - */ - parsePreserveAspectRatioAttribute: function(attribute) { - var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid', - aspectRatioAttrs = attribute.split(' '), align; - - if (aspectRatioAttrs && aspectRatioAttrs.length) { - meetOrSlice = aspectRatioAttrs.pop(); - if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') { - align = meetOrSlice; - meetOrSlice = 'meet'; - } - else if (aspectRatioAttrs.length) { - align = aspectRatioAttrs.pop(); - } - } - //divide align in alignX and alignY - alignX = align !== 'none' ? align.slice(1, 4) : 'none'; - alignY = align !== 'none' ? align.slice(5, 8) : 'none'; - return { - meetOrSlice: meetOrSlice, - alignX: alignX, - alignY: alignY - }; - }, - - /** - * Clear char widths cache for the given font family or all the cache if no - * fontFamily is specified. - * Use it if you know you are loading fonts in a lazy way and you are not waiting - * for custom fonts to load properly when adding text objects to the canvas. - * If a text object is added when its own font is not loaded yet, you will get wrong - * measurement and so wrong bounding boxes. - * After the font cache is cleared, either change the textObject text content or call - * initDimensions() to trigger a recalculation - * @memberOf fabric.util - * @param {String} [fontFamily] font family to clear - */ - clearFabricFontCache: function(fontFamily) { - fontFamily = (fontFamily || '').toLowerCase(); - if (!fontFamily) { - fabric.charWidthsCache = { }; - } - else if (fabric.charWidthsCache[fontFamily]) { - delete fabric.charWidthsCache[fontFamily]; - } - }, - - /** - * Given current aspect ratio, determines the max width and height that can - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Number} ar aspect ratio - * @param {Number} maximumArea Maximum area you want to achieve - * @return {Object.x} Limited dimensions by X - * @return {Object.y} Limited dimensions by Y - */ - limitDimsByArea: function(ar, maximumArea) { - var roughWidth = Math.sqrt(maximumArea * ar), - perfLimitSizeY = Math.floor(maximumArea / roughWidth); - return { x: Math.floor(roughWidth), y: perfLimitSizeY }; - }, - - capValue: function(min, value, max) { - return Math.max(min, Math.min(value, max)); - }, - - /** - * Finds the scale for the object source to fit inside the object destination, - * keeping aspect ratio intact. - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Object | fabric.Object} source - * @param {Number} source.height natural unscaled height of the object - * @param {Number} source.width natural unscaled width of the object - * @param {Object | fabric.Object} destination - * @param {Number} destination.height natural unscaled height of the object - * @param {Number} destination.width natural unscaled width of the object - * @return {Number} scale factor to apply to source to fit into destination - */ - findScaleToFit: function(source, destination) { - return Math.min(destination.width / source.width, destination.height / source.height); - }, - - /** - * Finds the scale for the object source to cover entirely the object destination, - * keeping aspect ratio intact. - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Object | fabric.Object} source - * @param {Number} source.height natural unscaled height of the object - * @param {Number} source.width natural unscaled width of the object - * @param {Object | fabric.Object} destination - * @param {Number} destination.height natural unscaled height of the object - * @param {Number} destination.width natural unscaled width of the object - * @return {Number} scale factor to apply to source to cover destination - */ - findScaleToCover: function(source, destination) { - return Math.max(destination.width / source.width, destination.height / source.height); - }, - - /** - * given an array of 6 number returns something like `"matrix(...numbers)"` - * @memberOf fabric.util - * @param {Array} transform an array with 6 numbers - * @return {String} transform matrix for svg - * @return {Object.y} Limited dimensions by Y - */ - matrixToSVG: function(transform) { - return 'matrix(' + transform.map(function(value) { - return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS); - }).join(' ') + ')'; - }, - - /** - * given an object and a transform, apply the inverse transform to the object, - * this is equivalent to remove from that object that transformation, so that - * added in a space with the removed transform, the object will be the same as before. - * Removing from an object a transform that scale by 2 is like scaling it by 1/2. - * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg - * in the opposite direction. - * This util is used to add objects inside transformed groups or nested groups. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - removeTransformFromObject: function(object, transform) { - var inverted = fabric.util.invertTransform(transform), - finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix()); - fabric.util.applyTransformToObject(object, finalTransform); - }, - - /** - * given an object and a transform, apply the transform to the object. - * this is equivalent to change the space where the object is drawn. - * Adding to an object a transform that scale by 2 is like scaling it by 2. - * This is used when removing an object from an active selection for example. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - addTransformToObject: function(object, transform) { - fabric.util.applyTransformToObject( - object, - fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix()) - ); - }, - - /** - * discard an object transform state and apply the one from the matrix. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - applyTransformToObject: function(object, transform) { - var options = fabric.util.qrDecompose(transform), - center = new fabric.Point(options.translateX, options.translateY); - object.flipX = false; - object.flipY = false; - object.set('scaleX', options.scaleX); - object.set('scaleY', options.scaleY); - object.skewX = options.skewX; - object.skewY = options.skewY; - object.angle = options.angle; - object.setPositionByOrigin(center, 'center', 'center'); - }, - - /** - * given a width and height, return the size of the bounding box - * that can contains the box with width/height with applied transform - * described in options. - * Use to calculate the boxes around objects for controls. - * @memberOf fabric.util - * @param {Number} width - * @param {Number} height - * @param {Object} options - * @param {Number} options.scaleX - * @param {Number} options.scaleY - * @param {Number} options.skewX - * @param {Number} options.skewY - * @return {Object.x} width of containing - * @return {Object.y} height of containing - */ - sizeAfterTransform: function(width, height, options) { - var dimX = width / 2, dimY = height / 2, - points = [ - { - x: -dimX, - y: -dimY - }, - { - x: dimX, - y: -dimY - }, - { - x: -dimX, - y: dimY - }, - { - x: dimX, - y: dimY - }], - transformMatrix = fabric.util.calcDimensionsMatrix(options), - bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix); - return { - x: bbox.width, - y: bbox.height, - }; - } - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - var _join = Array.prototype.join, - commandLengths = { - m: 2, - l: 2, - h: 1, - v: 1, - c: 6, - s: 4, - q: 4, - t: 2, - a: 7 - }, - repeatedCommands = { - m: 'l', - M: 'L' - }; - function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) { - var costh2 = fabric.util.cos(th2), - sinth2 = fabric.util.sin(th2), - costh3 = fabric.util.cos(th3), - sinth3 = fabric.util.sin(th3), - toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1, - toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1, - cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2), - cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2), - cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3), - cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3); - - return ['C', - cp1X, cp1Y, - cp2X, cp2Y, - toX, toY - ]; - } - - /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp - * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here - * http://mozilla.org/MPL/2.0/ - */ - function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) { - var PI = Math.PI, th = rotateX * PI / 180, - sinTh = fabric.util.sin(th), - cosTh = fabric.util.cos(th), - fromX = 0, fromY = 0; - - rx = Math.abs(rx); - ry = Math.abs(ry); - - var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5, - py = -cosTh * toY * 0.5 + sinTh * toX * 0.5, - rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px, - pl = rx2 * ry2 - rx2 * py2 - ry2 * px2, - root = 0; - - if (pl < 0) { - var s = Math.sqrt(1 - pl / (rx2 * ry2)); - rx *= s; - ry *= s; - } - else { - root = (large === sweep ? -1.0 : 1.0) * - Math.sqrt( pl / (rx2 * py2 + ry2 * px2)); - } - - var cx = root * rx * py / ry, - cy = -root * ry * px / rx, - cx1 = cosTh * cx - sinTh * cy + toX * 0.5, - cy1 = sinTh * cx + cosTh * cy + toY * 0.5, - mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry), - dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry); - - if (sweep === 0 && dtheta > 0) { - dtheta -= 2 * PI; - } - else if (sweep === 1 && dtheta < 0) { - dtheta += 2 * PI; - } - - // Convert into cubic bezier segments <= 90deg - var segments = Math.ceil(Math.abs(dtheta / PI * 2)), - result = [], mDelta = dtheta / segments, - mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2), - th3 = mTheta + mDelta; - - for (var i = 0; i < segments; i++) { - result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY); - fromX = result[i][5]; - fromY = result[i][6]; - mTheta = th3; - th3 += mDelta; - } - return result; - } - - /* - * Private - */ - function calcVectorAngle(ux, uy, vx, vy) { - var ta = Math.atan2(uy, ux), - tb = Math.atan2(vy, vx); - if (tb >= ta) { - return tb - ta; - } - else { - return 2 * Math.PI - (ta - tb); - } - } - - /** - * Calculate bounding box of a beziercurve - * @param {Number} x0 starting point - * @param {Number} y0 - * @param {Number} x1 first control point - * @param {Number} y1 - * @param {Number} x2 secondo control point - * @param {Number} y2 - * @param {Number} x3 end of bezier - * @param {Number} y3 - */ - // taken from http://jsbin.com/ivomiq/56/edit no credits available for that. - // TODO: can we normalize this with the starting points set at 0 and then translated the bbox? - function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) { - var argsString; - if (fabric.cachesBoundsOfCurve) { - argsString = _join.call(arguments); - if (fabric.boundsOfCurveCache[argsString]) { - return fabric.boundsOfCurveCache[argsString]; - } - } - - var sqrt = Math.sqrt, - min = Math.min, max = Math.max, - abs = Math.abs, tvalues = [], - bounds = [[], []], - a, b, c, t, t1, t2, b2ac, sqrtb2ac; - - b = 6 * x0 - 12 * x1 + 6 * x2; - a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; - c = 3 * x1 - 3 * x0; - - for (var i = 0; i < 2; ++i) { - if (i > 0) { - b = 6 * y0 - 12 * y1 + 6 * y2; - a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; - c = 3 * y1 - 3 * y0; - } - - if (abs(a) < 1e-12) { - if (abs(b) < 1e-12) { - continue; - } - t = -c / b; - if (0 < t && t < 1) { - tvalues.push(t); - } - continue; - } - b2ac = b * b - 4 * c * a; - if (b2ac < 0) { - continue; - } - sqrtb2ac = sqrt(b2ac); - t1 = (-b + sqrtb2ac) / (2 * a); - if (0 < t1 && t1 < 1) { - tvalues.push(t1); - } - t2 = (-b - sqrtb2ac) / (2 * a); - if (0 < t2 && t2 < 1) { - tvalues.push(t2); - } - } - - var x, y, j = tvalues.length, jlen = j, mt; - while (j--) { - t = tvalues[j]; - mt = 1 - t; - x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); - bounds[0][j] = x; - - y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); - bounds[1][j] = y; - } - - bounds[0][jlen] = x0; - bounds[1][jlen] = y0; - bounds[0][jlen + 1] = x3; - bounds[1][jlen + 1] = y3; - var result = [ - { - x: min.apply(null, bounds[0]), - y: min.apply(null, bounds[1]) - }, - { - x: max.apply(null, bounds[0]), - y: max.apply(null, bounds[1]) - } - ]; - if (fabric.cachesBoundsOfCurve) { - fabric.boundsOfCurveCache[argsString] = result; - } - return result; - } - - /** - * Converts arc to a bunch of bezier curves - * @param {Number} fx starting point x - * @param {Number} fy starting point y - * @param {Array} coords Arc command - */ - function fromArcToBeziers(fx, fy, coords) { - var rx = coords[1], - ry = coords[2], - rot = coords[3], - large = coords[4], - sweep = coords[5], - tx = coords[6], - ty = coords[7], - segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); - - for (var i = 0, len = segsNorm.length; i < len; i++) { - segsNorm[i][1] += fx; - segsNorm[i][2] += fy; - segsNorm[i][3] += fx; - segsNorm[i][4] += fy; - segsNorm[i][5] += fx; - segsNorm[i][6] += fy; - } - return segsNorm; - }; - - /** - * This function take a parsed SVG path and make it simpler for fabricJS logic. - * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute ) - * S converted in C, T converted in Q, A converted in C. - * @param {Array} path the array of commands of a parsed svg path for fabric.Path - * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path - */ - function makePathSimpler(path) { - // x and y represent the last point of the path. the previous command point. - // we add them to each relative command to make it an absolute comment. - // we also swap the v V h H with L, because are easier to transform. - var x = 0, y = 0, len = path.length, - // x1 and y1 represent the last point of the subpath. the subpath is started with - // m or M command. When a z or Z command is drawn, x and y need to be resetted to - // the last x1 and y1. - x1 = 0, y1 = 0, current, i, converted, - // previous will host the letter of the previous command, to handle S and T. - // controlX and controlY will host the previous reflected control point - destinationPath = [], previous, controlX, controlY; - for (i = 0; i < len; ++i) { - converted = false; - current = path[i].slice(0); - switch (current[0]) { // first letter - case 'l': // lineto, relative - current[0] = 'L'; - current[1] += x; - current[2] += y; - // falls through - case 'L': - x = current[1]; - y = current[2]; - break; - case 'h': // horizontal lineto, relative - current[1] += x; - // falls through - case 'H': - current[0] = 'L'; - current[2] = y; - x = current[1]; - break; - case 'v': // vertical lineto, relative - current[1] += y; - // falls through - case 'V': - current[0] = 'L'; - y = current[1]; - current[1] = x; - current[2] = y; - break; - case 'm': // moveTo, relative - current[0] = 'M'; - current[1] += x; - current[2] += y; - // falls through - case 'M': - x = current[1]; - y = current[2]; - x1 = current[1]; - y1 = current[2]; - break; - case 'c': // bezierCurveTo, relative - current[0] = 'C'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - current[5] += x; - current[6] += y; - // falls through - case 'C': - controlX = current[3]; - controlY = current[4]; - x = current[5]; - y = current[6]; - break; - case 's': // shorthand cubic bezierCurveTo, relative - current[0] = 'S'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - // falls through - case 'S': - // would be sScC but since we are swapping sSc for C, we check just that. - if (previous === 'C') { - // calculate reflection of previous control points - controlX = 2 * x - controlX; - controlY = 2 * y - controlY; - } - else { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - controlX = x; - controlY = y; - } - x = current[3]; - y = current[4]; - current[0] = 'C'; - current[5] = current[3]; - current[6] = current[4]; - current[3] = current[1]; - current[4] = current[2]; - current[1] = controlX; - current[2] = controlY; - // current[3] and current[4] are NOW the second control point. - // we keep it for the next reflection. - controlX = current[3]; - controlY = current[4]; - break; - case 'q': // quadraticCurveTo, relative - current[0] = 'Q'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - // falls through - case 'Q': - controlX = current[1]; - controlY = current[2]; - x = current[3]; - y = current[4]; - break; - case 't': // shorthand quadraticCurveTo, relative - current[0] = 'T'; - current[1] += x; - current[2] += y; - // falls through - case 'T': - if (previous === 'Q') { - // calculate reflection of previous control point - controlX = 2 * x - controlX; - controlY = 2 * y - controlY; - } - else { - // If there is no previous command or if the previous command was not a Q, q, T or t, - // assume the control point is coincident with the current point - controlX = x; - controlY = y; - } - current[0] = 'Q'; - x = current[1]; - y = current[2]; - current[1] = controlX; - current[2] = controlY; - current[3] = x; - current[4] = y; - break; - case 'a': - current[0] = 'A'; - current[6] += x; - current[7] += y; - // falls through - case 'A': - converted = true; - destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current)); - x = current[6]; - y = current[7]; - break; - case 'z': - case 'Z': - x = x1; - y = y1; - break; - default: - } - if (!converted) { - destinationPath.push(current); - } - previous = current[0]; - } - return destinationPath; - }; - - /** - * Calc length from point x1,y1 to x2,y2 - * @param {Number} x1 starting point x - * @param {Number} y1 starting point y - * @param {Number} x2 starting point x - * @param {Number} y2 starting point y - * @return {Number} length of segment - */ - function calcLineLength(x1, y1, x2, y2) { - return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); - } - - // functions for the Cubic beizer - // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350 - function CB1(t) { - return t * t * t; - } - function CB2(t) { - return 3 * t * t * (1 - t); - } - function CB3(t) { - return 3 * t * (1 - t) * (1 - t); - } - function CB4(t) { - return (1 - t) * (1 - t) * (1 - t); - } - - function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { - return function(pct) { - var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct); - return { - x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4, - y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4 - }; - }; - } - - function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { - return function (pct) { - var invT = 1 - pct, - tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) + - (3 * pct * pct * (p4x - p3x)), - tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) + - (3 * pct * pct * (p4y - p3y)); - return Math.atan2(tangentY, tangentX); - }; - } - - function QB1(t) { - return t * t; - } - - function QB2(t) { - return 2 * t * (1 - t); - } - - function QB3(t) { - return (1 - t) * (1 - t); - } - - function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) { - return function(pct) { - var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct); - return { - x: p3x * c1 + p2x * c2 + p1x * c3, - y: p3y * c1 + p2y * c2 + p1y * c3 - }; - }; - } - - function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) { - return function (pct) { - var invT = 1 - pct, - tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)), - tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y)); - return Math.atan2(tangentY, tangentX); - }; - } - - - // this will run over a path segment ( a cubic or quadratic segment) and approximate it - // with 100 segemnts. This will good enough to calculate the length of the curve - function pathIterator(iterator, x1, y1) { - var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc; - for (perc = 1; perc <= 100; perc += 1) { - p = iterator(perc / 100); - tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y); - tempP = p; - } - return tmpLen; - } - - /** - * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1 - * that correspond to that pixels run over the path. - * The percentage will be then used to find the correct point on the canvas for the path. - * @param {Array} segInfo fabricJS collection of information on a parsed path - * @param {Number} distance from starting point, in pixels. - * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point; - */ - function findPercentageForDistance(segInfo, distance) { - var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y }, - p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc; - // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100 - // the path - while (tmpLen < distance && perc <= 1 && nextStep > 0.0001) { - p = iterator(perc); - lastPerc = perc; - nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y); - // compare tmpLen each cycle with distance, decide next perc to test. - if ((nextLen + tmpLen) > distance) { - // we discard this step and we make smaller steps. - nextStep /= 2; - perc -= nextStep; - } - else { - tempP = p; - perc += nextStep; - tmpLen += nextLen; - } - } - p.angle = angleFinder(lastPerc); - return p; - } - - /** - * Run over a parsed and simplifed path and extrac some informations. - * informations are length of each command and starting point - * @param {Array} path fabricJS parsed path commands - * @return {Array} path commands informations - */ - function getPathSegmentsInfo(path) { - var totalLength = 0, len = path.length, current, - //x2 and y2 are the coords of segment start - //x1 and y1 are the coords of the current point - x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder; - for (var i = 0; i < len; i++) { - current = path[i]; - tempInfo = { - x: x1, - y: y1, - command: current[0], - }; - switch (current[0]) { //first letter - case 'M': - tempInfo.length = 0; - x2 = x1 = current[1]; - y2 = y1 = current[2]; - break; - case 'L': - tempInfo.length = calcLineLength(x1, y1, current[1], current[2]); - x1 = current[1]; - y1 = current[2]; - break; - case 'C': - iterator = getPointOnCubicBezierIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - angleFinder = getTangentCubicIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - tempInfo.iterator = iterator; - tempInfo.angleFinder = angleFinder; - tempInfo.length = pathIterator(iterator, x1, y1); - x1 = current[5]; - y1 = current[6]; - break; - case 'Q': - iterator = getPointOnQuadraticBezierIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4] - ); - angleFinder = getTangentQuadraticIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4] - ); - tempInfo.iterator = iterator; - tempInfo.angleFinder = angleFinder; - tempInfo.length = pathIterator(iterator, x1, y1); - x1 = current[3]; - y1 = current[4]; - break; - case 'Z': - case 'z': - // we add those in order to ease calculations later - tempInfo.destX = x2; - tempInfo.destY = y2; - tempInfo.length = calcLineLength(x1, y1, x2, y2); - x1 = x2; - y1 = y2; - break; - } - totalLength += tempInfo.length; - info.push(tempInfo); - } - info.push({ length: totalLength, x: x1, y: y1 }); - return info; - } - - function getPointOnPath(path, distance, infos) { - if (!infos) { - infos = getPathSegmentsInfo(path); - } - var i = 0; - while ((distance - infos[i].length > 0) && i < (infos.length - 2)) { - distance -= infos[i].length; - i++; - } - // var distance = infos[infos.length - 1] * perc; - var segInfo = infos[i], segPercent = distance / segInfo.length, - command = segInfo.command, segment = path[i], info; - - switch (command) { - case 'M': - return { x: segInfo.x, y: segInfo.y, angle: 0 }; - case 'Z': - case 'z': - info = new fabric.Point(segInfo.x, segInfo.y).lerp( - new fabric.Point(segInfo.destX, segInfo.destY), - segPercent - ); - info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x); - return info; - case 'L': - info = new fabric.Point(segInfo.x, segInfo.y).lerp( - new fabric.Point(segment[1], segment[2]), - segPercent - ); - info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x); - return info; - case 'C': - return findPercentageForDistance(segInfo, distance); - case 'Q': - return findPercentageForDistance(segInfo, distance); - } - } - - /** - * - * @param {string} pathString - * @return {(string|number)[][]} An array of SVG path commands - * @example Usage - * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [ - * ['M', 3, 4], - * ['Q', 3, 5, 2, 1, 4, 0], - * ['Q', 9, 12, 2, 1, 4, 0], - * ]; - * - */ - function parsePath(pathString) { - var result = [], - coords = [], - currentPath, - parsed, - re = fabric.rePathCommand, - rNumber = '[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*', - rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp, - rFlagCommaWsp = '([01])' + fabric.commaWsp + '?', - rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp + - rNumberCommaWsp + '?(' + rNumber + ')', - regArcArgumentSequence = new RegExp(rArcSeq, 'g'), - match, - coordsStr, - // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values) - path; - if (!pathString || !pathString.match) { - return result; - } - path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi); - - for (var i = 0, coordsParsed, len = path.length; i < len; i++) { - currentPath = path[i]; - - coordsStr = currentPath.slice(1).trim(); - coords.length = 0; - - var command = currentPath.charAt(0); - coordsParsed = [command]; - - if (command.toLowerCase() === 'a') { - // arcs have special flags that apparently don't require spaces so handle special - for (var args; (args = regArcArgumentSequence.exec(coordsStr));) { - for (var j = 1; j < args.length; j++) { - coords.push(args[j]); - } - } - } - else { - while ((match = re.exec(coordsStr))) { - coords.push(match[0]); - } - } - - for (var j = 0, jlen = coords.length; j < jlen; j++) { - parsed = parseFloat(coords[j]); - if (!isNaN(parsed)) { - coordsParsed.push(parsed); - } - } - - var commandLength = commandLengths[command.toLowerCase()], - repeatedCommand = repeatedCommands[command] || command; - - if (coordsParsed.length - 1 > commandLength) { - for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) { - result.push([command].concat(coordsParsed.slice(k, k + commandLength))); - command = repeatedCommand; - } - } - else { - result.push(coordsParsed); - } - } - - return result; - }; - - /** - * - * Converts points to a smooth SVG path - * @param {{ x: number,y: number }[]} points Array of points - * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value. - * @return {(string|number)[][]} An array of SVG path commands - */ - function getSmoothPathFromPoints(points, correction) { - var path = [], i, - p1 = new fabric.Point(points[0].x, points[0].y), - p2 = new fabric.Point(points[1].x, points[1].y), - len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2; - correction = correction || 0; - - if (manyPoints) { - multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1; - multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1; - } - path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]); - for (i = 1; i < len; i++) { - if (!p1.eq(p2)) { - var midPoint = p1.midPointFrom(p2); - // p1 is our bezier control point - // midpoint is our endpoint - // start point is p(i-1) value. - path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]); - } - p1 = points[i]; - if ((i + 1) < points.length) { - p2 = points[i + 1]; - } - } - if (manyPoints) { - multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1; - multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1; - } - path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]); - return path; - } - /** - * Transform a path by transforming each segment. - * it has to be a simplified path or it won't work. - * WARNING: this depends from pathOffset for correct operation - * @param {Array} path fabricJS parsed and simplified path commands - * @param {Array} transform matrix that represent the transformation - * @param {Object} [pathOffset] the fabric.Path pathOffset - * @param {Number} pathOffset.x - * @param {Number} pathOffset.y - * @returns {Array} the transformed path - */ - function transformPath(path, transform, pathOffset) { - if (pathOffset) { - transform = fabric.util.multiplyTransformMatrices( - transform, - [1, 0, 0, 1, -pathOffset.x, -pathOffset.y] - ); - } - return path.map(function(pathSegment) { - var newSegment = pathSegment.slice(0), point = {}; - for (var i = 1; i < pathSegment.length - 1; i += 2) { - point.x = pathSegment[i]; - point.y = pathSegment[i + 1]; - point = fabric.util.transformPoint(point, transform); - newSegment[i] = point.x; - newSegment[i + 1] = point.y; - } - return newSegment; - }); - } - - /** - * Calculate bounding box of a elliptic-arc - * @deprecated - * @param {Number} fx start point of arc - * @param {Number} fy - * @param {Number} rx horizontal radius - * @param {Number} ry vertical radius - * @param {Number} rot angle of horizontal axis - * @param {Number} large 1 or 0, whatever the arc is the big or the small on the 2 points - * @param {Number} sweep 1 or 0, 1 clockwise or counterclockwise direction - * @param {Number} tx end point of arc - * @param {Number} ty - */ - function getBoundsOfArc(fx, fy, rx, ry, rot, large, sweep, tx, ty) { - - var fromX = 0, fromY = 0, bound, bounds = [], - segs = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); - - for (var i = 0, len = segs.length; i < len; i++) { - bound = getBoundsOfCurve(fromX, fromY, segs[i][1], segs[i][2], segs[i][3], segs[i][4], segs[i][5], segs[i][6]); - bounds.push({ x: bound[0].x + fx, y: bound[0].y + fy }); - bounds.push({ x: bound[1].x + fx, y: bound[1].y + fy }); - fromX = segs[i][5]; - fromY = segs[i][6]; - } - return bounds; - }; - - /** - * Draws arc - * @deprecated - * @param {CanvasRenderingContext2D} ctx - * @param {Number} fx - * @param {Number} fy - * @param {Array} coords coords of the arc, without the front 'A/a' - */ - function drawArc(ctx, fx, fy, coords) { - coords = coords.slice(0).unshift('X'); // command A or a does not matter - var beziers = fromArcToBeziers(fx, fy, coords); - beziers.forEach(function(bezier) { - ctx.bezierCurveTo.apply(ctx, bezier.slice(1)); - }); - }; - - /** - * Join path commands to go back to svg format - * @param {Array} pathData fabricJS parsed path commands - * @return {String} joined path 'M 0 0 L 20 30' - */ - fabric.util.joinPath = function(pathData) { - return pathData.map(function (segment) { return segment.join(' '); }).join(' '); - }; - fabric.util.parsePath = parsePath; - fabric.util.makePathSimpler = makePathSimpler; - fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints; - fabric.util.getPathSegmentsInfo = getPathSegmentsInfo; - fabric.util.getBoundsOfCurve = getBoundsOfCurve; - fabric.util.getPointOnPath = getPointOnPath; - fabric.util.transformPath = transformPath; - /** - * Typo of `fromArcToBeziers` kept for not breaking the api once corrected. - * Will be removed in fabric 5.0 - * @deprecated - */ - fabric.util.fromArcToBeizers = fromArcToBeziers; - // kept because we do not want to make breaking changes. - // but useless and deprecated. - fabric.util.getBoundsOfArc = getBoundsOfArc; - fabric.util.drawArc = drawArc; -})(); - - -(function() { - - var slice = Array.prototype.slice; - - /** - * Invokes method on all items in a given array - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} method Name of a method to invoke - * @return {Array} - */ - function invoke(array, method) { - var args = slice.call(arguments, 2), result = []; - for (var i = 0, len = array.length; i < len; i++) { - result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]); - } - return result; - } - - /** - * Finds maximum value in array (not necessarily "first" one) - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} byProperty - * @return {*} - */ - function max(array, byProperty) { - return find(array, byProperty, function(value1, value2) { - return value1 >= value2; - }); - } - - /** - * Finds minimum value in array (not necessarily "first" one) - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} byProperty - * @return {*} - */ - function min(array, byProperty) { - return find(array, byProperty, function(value1, value2) { - return value1 < value2; - }); - } - - /** - * @private - */ - function fill(array, value) { - var k = array.length; - while (k--) { - array[k] = value; - } - return array; - } - - /** - * @private - */ - function find(array, byProperty, condition) { - if (!array || array.length === 0) { - return; - } - - var i = array.length - 1, - result = byProperty ? array[i][byProperty] : array[i]; - if (byProperty) { - while (i--) { - if (condition(array[i][byProperty], result)) { - result = array[i][byProperty]; - } - } - } - else { - while (i--) { - if (condition(array[i], result)) { - result = array[i]; - } - } - } - return result; - } - - /** - * @namespace fabric.util.array - */ - fabric.util.array = { - fill: fill, - invoke: invoke, - min: min, - max: max - }; - -})(); - - -(function() { - /** - * Copies all enumerable properties of one js object to another - * this does not and cannot compete with generic utils. - * Does not clone or extend fabric.Object subclasses. - * This is mostly for internal use and has extra handling for fabricJS objects - * it skips the canvas and group properties in deep cloning. - * @memberOf fabric.util.object - * @param {Object} destination Where to copy to - * @param {Object} source Where to copy from - * @param {Boolean} [deep] Whether to extend nested objects - * @return {Object} - */ - - function extend(destination, source, deep) { - // JScript DontEnum bug is not taken care of - // the deep clone is for internal use, is not meant to avoid - // javascript traps or cloning html element or self referenced objects. - if (deep) { - if (!fabric.isLikelyNode && source instanceof Element) { - // avoid cloning deep images, canvases, - destination = source; - } - else if (source instanceof Array) { - destination = []; - for (var i = 0, len = source.length; i < len; i++) { - destination[i] = extend({ }, source[i], deep); - } - } - else if (source && typeof source === 'object') { - for (var property in source) { - if (property === 'canvas' || property === 'group') { - // we do not want to clone this props at all. - // we want to keep the keys in the copy - destination[property] = null; - } - else if (source.hasOwnProperty(property)) { - destination[property] = extend({ }, source[property], deep); - } - } - } - else { - // this sounds odd for an extend but is ok for recursive use - destination = source; - } - } - else { - for (var property in source) { - destination[property] = source[property]; - } - } - return destination; - } - - /** - * Creates an empty object and copies all enumerable properties of another object to it - * This method is mostly for internal use, and not intended for duplicating shapes in canvas. - * @memberOf fabric.util.object - * @param {Object} object Object to clone - * @param {Boolean} [deep] Whether to clone nested objects - * @return {Object} - */ - - //TODO: this function return an empty object if you try to clone null - function clone(object, deep) { - return extend({ }, object, deep); - } - - /** @namespace fabric.util.object */ - fabric.util.object = { - extend: extend, - clone: clone - }; - fabric.util.object.extend(fabric.util, fabric.Observable); -})(); - - -(function() { - - /** - * Camelizes a string - * @memberOf fabric.util.string - * @param {String} string String to camelize - * @return {String} Camelized version of a string - */ - function camelize(string) { - return string.replace(/-+(.)?/g, function(match, character) { - return character ? character.toUpperCase() : ''; - }); - } - - /** - * Capitalizes a string - * @memberOf fabric.util.string - * @param {String} string String to capitalize - * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized - * and other letters stay untouched, if false first letter is capitalized - * and other letters are converted to lowercase. - * @return {String} Capitalized version of a string - */ - function capitalize(string, firstLetterOnly) { - return string.charAt(0).toUpperCase() + - (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()); - } - - /** - * Escapes XML in a string - * @memberOf fabric.util.string - * @param {String} string String to escape - * @return {String} Escaped version of a string - */ - function escapeXml(string) { - return string.replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); - } - - /** - * Divide a string in the user perceived single units - * @memberOf fabric.util.string - * @param {String} textstring String to escape - * @return {Array} array containing the graphemes - */ - function graphemeSplit(textstring) { - var i = 0, chr, graphemes = []; - for (i = 0, chr; i < textstring.length; i++) { - if ((chr = getWholeChar(textstring, i)) === false) { - continue; - } - graphemes.push(chr); - } - return graphemes; - } - - // taken from mdn in the charAt doc page. - function getWholeChar(str, i) { - var code = str.charCodeAt(i); - - if (isNaN(code)) { - return ''; // Position not found - } - if (code < 0xD800 || code > 0xDFFF) { - return str.charAt(i); - } - - // High surrogate (could change last hex to 0xDB7F to treat high private - // surrogates as single characters) - if (0xD800 <= code && code <= 0xDBFF) { - if (str.length <= (i + 1)) { - throw 'High surrogate without following low surrogate'; - } - var next = str.charCodeAt(i + 1); - if (0xDC00 > next || next > 0xDFFF) { - throw 'High surrogate without following low surrogate'; - } - return str.charAt(i) + str.charAt(i + 1); - } - // Low surrogate (0xDC00 <= code && code <= 0xDFFF) - if (i === 0) { - throw 'Low surrogate without preceding high surrogate'; - } - var prev = str.charCodeAt(i - 1); - - // (could change last hex to 0xDB7F to treat high private - // surrogates as single characters) - if (0xD800 > prev || prev > 0xDBFF) { - throw 'Low surrogate without preceding high surrogate'; - } - // We can pass over low surrogates now as the second component - // in a pair which we have already processed - return false; - } - - - /** - * String utilities - * @namespace fabric.util.string - */ - fabric.util.string = { - camelize: camelize, - capitalize: capitalize, - escapeXml: escapeXml, - graphemeSplit: graphemeSplit - }; -})(); - - -(function() { - - var slice = Array.prototype.slice, emptyFunction = function() { }, - - IS_DONTENUM_BUGGY = (function() { - for (var p in { toString: 1 }) { - if (p === 'toString') { - return false; - } - } - return true; - })(), - - /** @ignore */ - addMethods = function(klass, source, parent) { - for (var property in source) { - - if (property in klass.prototype && - typeof klass.prototype[property] === 'function' && - (source[property] + '').indexOf('callSuper') > -1) { - - klass.prototype[property] = (function(property) { - return function() { - - var superclass = this.constructor.superclass; - this.constructor.superclass = parent; - var returnValue = source[property].apply(this, arguments); - this.constructor.superclass = superclass; - - if (property !== 'initialize') { - return returnValue; - } - }; - })(property); - } - else { - klass.prototype[property] = source[property]; - } - - if (IS_DONTENUM_BUGGY) { - if (source.toString !== Object.prototype.toString) { - klass.prototype.toString = source.toString; - } - if (source.valueOf !== Object.prototype.valueOf) { - klass.prototype.valueOf = source.valueOf; - } - } - } - }; - - function Subclass() { } - - function callSuper(methodName) { - var parentMethod = null, - _this = this; - - // climb prototype chain to find method not equal to callee's method - while (_this.constructor.superclass) { - var superClassMethod = _this.constructor.superclass.prototype[methodName]; - if (_this[methodName] !== superClassMethod) { - parentMethod = superClassMethod; - break; - } - // eslint-disable-next-line - _this = _this.constructor.superclass.prototype; - } - - if (!parentMethod) { - return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this); - } - - return (arguments.length > 1) - ? parentMethod.apply(this, slice.call(arguments, 1)) - : parentMethod.call(this); - } - - /** - * Helper for creation of "classes". - * @memberOf fabric.util - * @param {Function} [parent] optional "Class" to inherit from - * @param {Object} [properties] Properties shared by all instances of this class - * (be careful modifying objects defined here as this would affect all instances) - */ - function createClass() { - var parent = null, - properties = slice.call(arguments, 0); - - if (typeof properties[0] === 'function') { - parent = properties.shift(); - } - function klass() { - this.initialize.apply(this, arguments); - } - - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - Subclass.prototype = parent.prototype; - klass.prototype = new Subclass(); - parent.subclasses.push(klass); - } - for (var i = 0, length = properties.length; i < length; i++) { - addMethods(klass, properties[i], parent); - } - if (!klass.prototype.initialize) { - klass.prototype.initialize = emptyFunction; - } - klass.prototype.constructor = klass; - klass.prototype.callSuper = callSuper; - return klass; - } - - fabric.util.createClass = createClass; -})(); - - -(function () { - // since ie11 can use addEventListener but they do not support options, i need to check - var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent, - touchEvents = ['touchstart', 'touchmove', 'touchend']; - /** - * Adds an event listener to an element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {String} eventName - * @param {Function} handler - */ - fabric.util.addListener = function(element, eventName, handler, options) { - element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options); - }; - - /** - * Removes an event listener from an element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {String} eventName - * @param {Function} handler - */ - fabric.util.removeListener = function(element, eventName, handler, options) { - element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options); - }; - - function getTouchInfo(event) { - var touchProp = event.changedTouches; - if (touchProp && touchProp[0]) { - return touchProp[0]; - } - return event; - } - - fabric.util.getPointer = function(event) { - var element = event.target, - scroll = fabric.util.getScrollLeftTop(element), - _evt = getTouchInfo(event); - return { - x: _evt.clientX + scroll.left, - y: _evt.clientY + scroll.top - }; - }; - - fabric.util.isTouchEvent = function(event) { - return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch'; - }; -})(); - - -(function () { - - /** - * Cross-browser wrapper for setting element's style - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {Object} styles - * @return {HTMLElement} Element that was passed as a first argument - */ - function setStyle(element, styles) { - var elementStyle = element.style; - if (!elementStyle) { - return element; - } - if (typeof styles === 'string') { - element.style.cssText += ';' + styles; - return styles.indexOf('opacity') > -1 - ? setOpacity(element, styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) - : element; - } - for (var property in styles) { - if (property === 'opacity') { - setOpacity(element, styles[property]); - } - else { - var normalizedProperty = (property === 'float' || property === 'cssFloat') - ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat') - : property; - elementStyle[normalizedProperty] = styles[property]; - } - } - return element; - } - - var parseEl = fabric.document.createElement('div'), - supportsOpacity = typeof parseEl.style.opacity === 'string', - supportsFilters = typeof parseEl.style.filter === 'string', - reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, - - /** @ignore */ - setOpacity = function (element) { return element; }; - - if (supportsOpacity) { - /** @ignore */ - setOpacity = function(element, value) { - element.style.opacity = value; - return element; - }; - } - else if (supportsFilters) { - /** @ignore */ - setOpacity = function(element, value) { - var es = element.style; - if (element.currentStyle && !element.currentStyle.hasLayout) { - es.zoom = 1; - } - if (reOpacity.test(es.filter)) { - value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')'); - es.filter = es.filter.replace(reOpacity, value); - } - else { - es.filter += ' alpha(opacity=' + (value * 100) + ')'; - } - return element; - }; - } - - fabric.util.setStyle = setStyle; - -})(); - - -(function() { - - var _slice = Array.prototype.slice; - - /** - * Takes id and returns an element with that id (if one exists in a document) - * @memberOf fabric.util - * @param {String|HTMLElement} id - * @return {HTMLElement|null} - */ - function getById(id) { - return typeof id === 'string' ? fabric.document.getElementById(id) : id; - } - - var sliceCanConvertNodelists, - /** - * Converts an array-like object (e.g. arguments or NodeList) to an array - * @memberOf fabric.util - * @param {Object} arrayLike - * @return {Array} - */ - toArray = function(arrayLike) { - return _slice.call(arrayLike, 0); - }; - - try { - sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; - } - catch (err) { } - - if (!sliceCanConvertNodelists) { - toArray = function(arrayLike) { - var arr = new Array(arrayLike.length), i = arrayLike.length; - while (i--) { - arr[i] = arrayLike[i]; - } - return arr; - }; - } - - /** - * Creates specified element with specified attributes - * @memberOf fabric.util - * @param {String} tagName Type of an element to create - * @param {Object} [attributes] Attributes to set on an element - * @return {HTMLElement} Newly created element - */ - function makeElement(tagName, attributes) { - var el = fabric.document.createElement(tagName); - for (var prop in attributes) { - if (prop === 'class') { - el.className = attributes[prop]; - } - else if (prop === 'for') { - el.htmlFor = attributes[prop]; - } - else { - el.setAttribute(prop, attributes[prop]); - } - } - return el; - } - - /** - * Adds class to an element - * @memberOf fabric.util - * @param {HTMLElement} element Element to add class to - * @param {String} className Class to add to an element - */ - function addClass(element, className) { - if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) { - element.className += (element.className ? ' ' : '') + className; - } - } - - /** - * Wraps element with another element - * @memberOf fabric.util - * @param {HTMLElement} element Element to wrap - * @param {HTMLElement|String} wrapper Element to wrap with - * @param {Object} [attributes] Attributes to set on a wrapper - * @return {HTMLElement} wrapper - */ - function wrapElement(element, wrapper, attributes) { - if (typeof wrapper === 'string') { - wrapper = makeElement(wrapper, attributes); - } - if (element.parentNode) { - element.parentNode.replaceChild(wrapper, element); - } - wrapper.appendChild(element); - return wrapper; - } - - /** - * Returns element scroll offsets - * @memberOf fabric.util - * @param {HTMLElement} element Element to operate on - * @return {Object} Object with left/top values - */ - function getScrollLeftTop(element) { - - var left = 0, - top = 0, - docElement = fabric.document.documentElement, - body = fabric.document.body || { - scrollLeft: 0, scrollTop: 0 - }; - - // While loop checks (and then sets element to) .parentNode OR .host - // to account for ShadowDOM. We still want to traverse up out of ShadowDOM, - // but the .parentNode of a root ShadowDOM node will always be null, instead - // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938 - while (element && (element.parentNode || element.host)) { - - // Set element to element parent, or 'host' in case of ShadowDOM - element = element.parentNode || element.host; - - if (element === fabric.document) { - left = body.scrollLeft || docElement.scrollLeft || 0; - top = body.scrollTop || docElement.scrollTop || 0; - } - else { - left += element.scrollLeft || 0; - top += element.scrollTop || 0; - } - - if (element.nodeType === 1 && element.style.position === 'fixed') { - break; - } - } - - return { left: left, top: top }; - } - - /** - * Returns offset for a given element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element Element to get offset for - * @return {Object} Object with "left" and "top" properties - */ - function getElementOffset(element) { - var docElem, - doc = element && element.ownerDocument, - box = { left: 0, top: 0 }, - offset = { left: 0, top: 0 }, - scrollLeftTop, - offsetAttributes = { - borderLeftWidth: 'left', - borderTopWidth: 'top', - paddingLeft: 'left', - paddingTop: 'top' - }; - - if (!doc) { - return offset; - } - - for (var attr in offsetAttributes) { - offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0; - } - - docElem = doc.documentElement; - if ( typeof element.getBoundingClientRect !== 'undefined' ) { - box = element.getBoundingClientRect(); - } - - scrollLeftTop = getScrollLeftTop(element); - - return { - left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left, - top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top - }; - } - - /** - * Returns style attribute value of a given element - * @memberOf fabric.util - * @param {HTMLElement} element Element to get style attribute for - * @param {String} attr Style attribute to get for element - * @return {String} Style attribute value of the given element. - */ - var getElementStyle; - if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) { - getElementStyle = function(element, attr) { - var style = fabric.document.defaultView.getComputedStyle(element, null); - return style ? style[attr] : undefined; - }; - } - else { - getElementStyle = function(element, attr) { - var value = element.style[attr]; - if (!value && element.currentStyle) { - value = element.currentStyle[attr]; - } - return value; - }; - } - - (function () { - var style = fabric.document.documentElement.style, - selectProp = 'userSelect' in style - ? 'userSelect' - : 'MozUserSelect' in style - ? 'MozUserSelect' - : 'WebkitUserSelect' in style - ? 'WebkitUserSelect' - : 'KhtmlUserSelect' in style - ? 'KhtmlUserSelect' - : ''; - - /** - * Makes element unselectable - * @memberOf fabric.util - * @param {HTMLElement} element Element to make unselectable - * @return {HTMLElement} Element that was passed in - */ - function makeElementUnselectable(element) { - if (typeof element.onselectstart !== 'undefined') { - element.onselectstart = fabric.util.falseFunction; - } - if (selectProp) { - element.style[selectProp] = 'none'; - } - else if (typeof element.unselectable === 'string') { - element.unselectable = 'on'; - } - return element; - } - - /** - * Makes element selectable - * @memberOf fabric.util - * @param {HTMLElement} element Element to make selectable - * @return {HTMLElement} Element that was passed in - */ - function makeElementSelectable(element) { - if (typeof element.onselectstart !== 'undefined') { - element.onselectstart = null; - } - if (selectProp) { - element.style[selectProp] = ''; - } - else if (typeof element.unselectable === 'string') { - element.unselectable = ''; - } - return element; - } - - fabric.util.makeElementUnselectable = makeElementUnselectable; - fabric.util.makeElementSelectable = makeElementSelectable; - })(); - - function getNodeCanvas(element) { - var impl = fabric.jsdomImplForWrapper(element); - return impl._canvas || impl._image; - }; - - function cleanUpJsdomNode(element) { - if (!fabric.isLikelyNode) { - return; - } - var impl = fabric.jsdomImplForWrapper(element); - if (impl) { - impl._image = null; - impl._canvas = null; - // unsure if necessary - impl._currentSrc = null; - impl._attributes = null; - impl._classList = null; - } - } - - function setImageSmoothing(ctx, value) { - ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled - || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled; - ctx.imageSmoothingEnabled = value; - } - - /** - * setImageSmoothing sets the context imageSmoothingEnabled property. - * Used by canvas and by ImageObject. - * @memberOf fabric.util - * @since 4.0.0 - * @param {HTMLRenderingContext2D} ctx to set on - * @param {Boolean} value true or false - */ - fabric.util.setImageSmoothing = setImageSmoothing; - fabric.util.getById = getById; - fabric.util.toArray = toArray; - fabric.util.addClass = addClass; - fabric.util.makeElement = makeElement; - fabric.util.wrapElement = wrapElement; - fabric.util.getScrollLeftTop = getScrollLeftTop; - fabric.util.getElementOffset = getElementOffset; - fabric.util.getNodeCanvas = getNodeCanvas; - fabric.util.cleanUpJsdomNode = cleanUpJsdomNode; - -})(); - - -(function() { - - function addParamToUrl(url, param) { - return url + (/\?/.test(url) ? '&' : '?') + param; - } - - function emptyFn() { } - - /** - * Cross-browser abstraction for sending XMLHttpRequest - * @memberOf fabric.util - * @param {String} url URL to send XMLHttpRequest to - * @param {Object} [options] Options object - * @param {String} [options.method="GET"] - * @param {String} [options.parameters] parameters to append to url in GET or in body - * @param {String} [options.body] body to send with POST or PUT request - * @param {Function} options.onComplete Callback to invoke when request is completed - * @return {XMLHttpRequest} request - */ - function request(url, options) { - options || (options = { }); - - var method = options.method ? options.method.toUpperCase() : 'GET', - onComplete = options.onComplete || function() { }, - xhr = new fabric.window.XMLHttpRequest(), - body = options.body || options.parameters; - - /** @ignore */ - xhr.onreadystatechange = function() { - if (xhr.readyState === 4) { - onComplete(xhr); - xhr.onreadystatechange = emptyFn; - } - }; - - if (method === 'GET') { - body = null; - if (typeof options.parameters === 'string') { - url = addParamToUrl(url, options.parameters); - } - } - - xhr.open(method, url, true); - - if (method === 'POST' || method === 'PUT') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - xhr.send(body); - return xhr; - } - - fabric.util.request = request; -})(); - - -/** - * Wrapper around `console.log` (when available) - * @param {*} [values] Values to log - */ -fabric.log = console.log; - -/** - * Wrapper around `console.warn` (when available) - * @param {*} [values] Values to log as a warning - */ -fabric.warn = console.warn; - - -(function() { - - function noop() { - return false; - } - - function defaultEasing(t, b, c, d) { - return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; - } - - /** - * Changes value from one to another within certain period of time, invoking callbacks as value is being changed. - * @memberOf fabric.util - * @param {Object} [options] Animation options - * @param {Function} [options.onChange] Callback; invoked on every value change - * @param {Function} [options.onComplete] Callback; invoked when value change is completed - * @param {Number} [options.startValue=0] Starting value - * @param {Number} [options.endValue=100] Ending value - * @param {Number} [options.byValue=100] Value to modify the property by - * @param {Function} [options.easing] Easing function - * @param {Number} [options.duration=500] Duration of change (in ms) - * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called. - * @returns {Function} abort function - */ - function animate(options) { - var cancel = false; - requestAnimFrame(function(timestamp) { - options || (options = { }); - - var start = timestamp || +new Date(), - duration = options.duration || 500, - finish = start + duration, time, - onChange = options.onChange || noop, - abort = options.abort || noop, - onComplete = options.onComplete || noop, - easing = options.easing || defaultEasing, - startValue = 'startValue' in options ? options.startValue : 0, - endValue = 'endValue' in options ? options.endValue : 100, - byValue = options.byValue || endValue - startValue; - - options.onStart && options.onStart(); - - (function tick(ticktime) { - // TODO: move abort call after calculation - // and pass (current,valuePerc, timePerc) as arguments - time = ticktime || +new Date(); - var currentTime = time > finish ? duration : (time - start), - timePerc = currentTime / duration, - current = easing(currentTime, startValue, byValue, duration), - valuePerc = Math.abs((current - startValue) / byValue); - if (cancel) { - return; - } - if (abort(current, valuePerc, timePerc)) { - // remove this in 4.0 - // does to even make sense to abort and run onComplete? - onComplete(endValue, 1, 1); - return; - } - if (time > finish) { - onChange(endValue, 1, 1); - onComplete(endValue, 1, 1); - return; - } - else { - onChange(current, valuePerc, timePerc); - requestAnimFrame(tick); - } - })(start); - }); - return function() { - cancel = true; - }; - } - - var _requestAnimFrame = fabric.window.requestAnimationFrame || - fabric.window.webkitRequestAnimationFrame || - fabric.window.mozRequestAnimationFrame || - fabric.window.oRequestAnimationFrame || - fabric.window.msRequestAnimationFrame || - function(callback) { - return fabric.window.setTimeout(callback, 1000 / 60); - }; - - var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout; - - /** - * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method - * @memberOf fabric.util - * @param {Function} callback Callback to invoke - * @param {DOMElement} element optional Element to associate with animation - */ - function requestAnimFrame() { - return _requestAnimFrame.apply(fabric.window, arguments); - } - - function cancelAnimFrame() { - return _cancelAnimFrame.apply(fabric.window, arguments); - } - - fabric.util.animate = animate; - fabric.util.requestAnimFrame = requestAnimFrame; - fabric.util.cancelAnimFrame = cancelAnimFrame; -})(); - - -(function() { - // Calculate an in-between color. Returns a "rgba()" string. - // Credit: Edwin Martin - // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js - function calculateColor(begin, end, pos) { - var color = 'rgba(' - + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ',' - + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ',' - + parseInt((begin[2] + pos * (end[2] - begin[2])), 10); - - color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1); - color += ')'; - return color; - } - - /** - * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed. - * @memberOf fabric.util - * @param {String} fromColor The starting color in hex or rgb(a) format. - * @param {String} toColor The starting color in hex or rgb(a) format. - * @param {Number} [duration] Duration of change (in ms). - * @param {Object} [options] Animation options - * @param {Function} [options.onChange] Callback; invoked on every value change - * @param {Function} [options.onComplete] Callback; invoked when value change is completed - * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used. - * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called. - * @returns {Function} abort function - */ - function animateColor(fromColor, toColor, duration, options) { - var startColor = new fabric.Color(fromColor).getSource(), - endColor = new fabric.Color(toColor).getSource(), - originalOnComplete = options.onComplete, - originalOnChange = options.onChange; - options = options || {}; - - return fabric.util.animate(fabric.util.object.extend(options, { - duration: duration || 500, - startValue: startColor, - endValue: endColor, - byValue: endColor, - easing: function (currentTime, startValue, byValue, duration) { - var posValue = options.colorEasing - ? options.colorEasing(currentTime, duration) - : 1 - Math.cos(currentTime / duration * (Math.PI / 2)); - return calculateColor(startValue, byValue, posValue); - }, - // has to take in account for color restoring; - onComplete: function(current, valuePerc, timePerc) { - if (originalOnComplete) { - return originalOnComplete( - calculateColor(endColor, endColor, 0), - valuePerc, - timePerc - ); - } - }, - onChange: function(current, valuePerc, timePerc) { - if (originalOnChange) { - if (Array.isArray(current)) { - return originalOnChange( - calculateColor(current, current, 0), - valuePerc, - timePerc - ); - } - originalOnChange(current, valuePerc, timePerc); - } - } - })); - } - - fabric.util.animateColor = animateColor; - -})(); - - -(function() { - - function normalize(a, c, p, s) { - if (a < Math.abs(c)) { - a = c; - s = p / 4; - } - else { - //handle the 0/0 case: - if (c === 0 && a === 0) { - s = p / (2 * Math.PI) * Math.asin(1); - } - else { - s = p / (2 * Math.PI) * Math.asin(c / a); - } - } - return { a: a, c: c, p: p, s: s }; - } - - function elastic(opts, t, d) { - return opts.a * - Math.pow(2, 10 * (t -= 1)) * - Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p ); - } - - /** - * Cubic easing out - * @memberOf fabric.util.ease - */ - function easeOutCubic(t, b, c, d) { - return c * ((t = t / d - 1) * t * t + 1) + b; - } - - /** - * Cubic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutCubic(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t + b; - } - return c / 2 * ((t -= 2) * t * t + 2) + b; - } - - /** - * Quartic easing in - * @memberOf fabric.util.ease - */ - function easeInQuart(t, b, c, d) { - return c * (t /= d) * t * t * t + b; - } - - /** - * Quartic easing out - * @memberOf fabric.util.ease - */ - function easeOutQuart(t, b, c, d) { - return -c * ((t = t / d - 1) * t * t * t - 1) + b; - } - - /** - * Quartic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutQuart(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t * t + b; - } - return -c / 2 * ((t -= 2) * t * t * t - 2) + b; - } - - /** - * Quintic easing in - * @memberOf fabric.util.ease - */ - function easeInQuint(t, b, c, d) { - return c * (t /= d) * t * t * t * t + b; - } - - /** - * Quintic easing out - * @memberOf fabric.util.ease - */ - function easeOutQuint(t, b, c, d) { - return c * ((t = t / d - 1) * t * t * t * t + 1) + b; - } - - /** - * Quintic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutQuint(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t * t * t + b; - } - return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; - } - - /** - * Sinusoidal easing in - * @memberOf fabric.util.ease - */ - function easeInSine(t, b, c, d) { - return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; - } - - /** - * Sinusoidal easing out - * @memberOf fabric.util.ease - */ - function easeOutSine(t, b, c, d) { - return c * Math.sin(t / d * (Math.PI / 2)) + b; - } - - /** - * Sinusoidal easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutSine(t, b, c, d) { - return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; - } - - /** - * Exponential easing in - * @memberOf fabric.util.ease - */ - function easeInExpo(t, b, c, d) { - return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; - } - - /** - * Exponential easing out - * @memberOf fabric.util.ease - */ - function easeOutExpo(t, b, c, d) { - return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; - } - - /** - * Exponential easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutExpo(t, b, c, d) { - if (t === 0) { - return b; - } - if (t === d) { - return b + c; - } - t /= d / 2; - if (t < 1) { - return c / 2 * Math.pow(2, 10 * (t - 1)) + b; - } - return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; - } - - /** - * Circular easing in - * @memberOf fabric.util.ease - */ - function easeInCirc(t, b, c, d) { - return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; - } - - /** - * Circular easing out - * @memberOf fabric.util.ease - */ - function easeOutCirc(t, b, c, d) { - return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; - } - - /** - * Circular easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutCirc(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; - } - return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; - } - - /** - * Elastic easing in - * @memberOf fabric.util.ease - */ - function easeInElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d; - if (t === 1) { - return b + c; - } - if (!p) { - p = d * 0.3; - } - var opts = normalize(a, c, p, s); - return -elastic(opts, t, d) + b; - } - - /** - * Elastic easing out - * @memberOf fabric.util.ease - */ - function easeOutElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d; - if (t === 1) { - return b + c; - } - if (!p) { - p = d * 0.3; - } - var opts = normalize(a, c, p, s); - return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b; - } - - /** - * Elastic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d / 2; - if (t === 2) { - return b + c; - } - if (!p) { - p = d * (0.3 * 1.5); - } - var opts = normalize(a, c, p, s); - if (t < 1) { - return -0.5 * elastic(opts, t, d) + b; - } - return opts.a * Math.pow(2, -10 * (t -= 1)) * - Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b; - } - - /** - * Backwards easing in - * @memberOf fabric.util.ease - */ - function easeInBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - return c * (t /= d) * t * ((s + 1) * t - s) + b; - } - - /** - * Backwards easing out - * @memberOf fabric.util.ease - */ - function easeOutBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; - } - - /** - * Backwards easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - t /= d / 2; - if (t < 1) { - return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; - } - return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; - } - - /** - * Bouncing easing in - * @memberOf fabric.util.ease - */ - function easeInBounce(t, b, c, d) { - return c - easeOutBounce (d - t, 0, c, d) + b; - } - - /** - * Bouncing easing out - * @memberOf fabric.util.ease - */ - function easeOutBounce(t, b, c, d) { - if ((t /= d) < (1 / 2.75)) { - return c * (7.5625 * t * t) + b; - } - else if (t < (2 / 2.75)) { - return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; - } - else if (t < (2.5 / 2.75)) { - return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; - } - else { - return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; - } - } - - /** - * Bouncing easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutBounce(t, b, c, d) { - if (t < d / 2) { - return easeInBounce (t * 2, 0, c, d) * 0.5 + b; - } - return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; - } - - /** - * Easing functions - * See Easing Equations by Robert Penner - * @namespace fabric.util.ease - */ - fabric.util.ease = { - - /** - * Quadratic easing in - * @memberOf fabric.util.ease - */ - easeInQuad: function(t, b, c, d) { - return c * (t /= d) * t + b; - }, - - /** - * Quadratic easing out - * @memberOf fabric.util.ease - */ - easeOutQuad: function(t, b, c, d) { - return -c * (t /= d) * (t - 2) + b; - }, - - /** - * Quadratic easing in and out - * @memberOf fabric.util.ease - */ - easeInOutQuad: function(t, b, c, d) { - t /= (d / 2); - if (t < 1) { - return c / 2 * t * t + b; - } - return -c / 2 * ((--t) * (t - 2) - 1) + b; - }, - - /** - * Cubic easing in - * @memberOf fabric.util.ease - */ - easeInCubic: function(t, b, c, d) { - return c * (t /= d) * t * t + b; - }, - - easeOutCubic: easeOutCubic, - easeInOutCubic: easeInOutCubic, - easeInQuart: easeInQuart, - easeOutQuart: easeOutQuart, - easeInOutQuart: easeInOutQuart, - easeInQuint: easeInQuint, - easeOutQuint: easeOutQuint, - easeInOutQuint: easeInOutQuint, - easeInSine: easeInSine, - easeOutSine: easeOutSine, - easeInOutSine: easeInOutSine, - easeInExpo: easeInExpo, - easeOutExpo: easeOutExpo, - easeInOutExpo: easeInOutExpo, - easeInCirc: easeInCirc, - easeOutCirc: easeOutCirc, - easeInOutCirc: easeInOutCirc, - easeInElastic: easeInElastic, - easeOutElastic: easeOutElastic, - easeInOutElastic: easeInOutElastic, - easeInBack: easeInBack, - easeOutBack: easeOutBack, - easeInOutBack: easeInOutBack, - easeInBounce: easeInBounce, - easeOutBounce: easeOutBounce, - easeInOutBounce: easeInOutBounce - }; - -})(); - - -(function(global) { - - 'use strict'; - - /** - * @name fabric - * @namespace - */ - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed, - parseUnit = fabric.util.parseUnit, - multiplyTransformMatrices = fabric.util.multiplyTransformMatrices, - - svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line', - 'image', 'text'], - svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'], - svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'], - svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'], - - attributesMap = { - cx: 'left', - x: 'left', - r: 'radius', - cy: 'top', - y: 'top', - display: 'visible', - visibility: 'visible', - transform: 'transformMatrix', - 'fill-opacity': 'fillOpacity', - 'fill-rule': 'fillRule', - 'font-family': 'fontFamily', - 'font-size': 'fontSize', - 'font-style': 'fontStyle', - 'font-weight': 'fontWeight', - 'letter-spacing': 'charSpacing', - 'paint-order': 'paintFirst', - 'stroke-dasharray': 'strokeDashArray', - 'stroke-dashoffset': 'strokeDashOffset', - 'stroke-linecap': 'strokeLineCap', - 'stroke-linejoin': 'strokeLineJoin', - 'stroke-miterlimit': 'strokeMiterLimit', - 'stroke-opacity': 'strokeOpacity', - 'stroke-width': 'strokeWidth', - 'text-decoration': 'textDecoration', - 'text-anchor': 'textAnchor', - opacity: 'opacity', - 'clip-path': 'clipPath', - 'clip-rule': 'clipRule', - 'vector-effect': 'strokeUniform', - 'image-rendering': 'imageSmoothing', - }, - - colorAttributes = { - stroke: 'strokeOpacity', - fill: 'fillOpacity' - }, - - fSize = 'font-size', cPath = 'clip-path'; - - fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames); - fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements); - fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors); - fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents); - - fabric.cssRules = { }; - fabric.gradientDefs = { }; - fabric.clipPaths = { }; - - function normalizeAttr(attr) { - // transform attribute names - if (attr in attributesMap) { - return attributesMap[attr]; - } - return attr; - } - - function normalizeValue(attr, value, parentAttributes, fontSize) { - var isArray = Object.prototype.toString.call(value) === '[object Array]', - parsed; - - if ((attr === 'fill' || attr === 'stroke') && value === 'none') { - value = ''; - } - else if (attr === 'strokeUniform') { - return (value === 'non-scaling-stroke'); - } - else if (attr === 'strokeDashArray') { - if (value === 'none') { - value = null; - } - else { - value = value.replace(/,/g, ' ').split(/\s+/).map(parseFloat); - } - } - else if (attr === 'transformMatrix') { - if (parentAttributes && parentAttributes.transformMatrix) { - value = multiplyTransformMatrices( - parentAttributes.transformMatrix, fabric.parseTransformAttribute(value)); - } - else { - value = fabric.parseTransformAttribute(value); - } - } - else if (attr === 'visible') { - value = value !== 'none' && value !== 'hidden'; - // display=none on parent element always takes precedence over child element - if (parentAttributes && parentAttributes.visible === false) { - value = false; - } - } - else if (attr === 'opacity') { - value = parseFloat(value); - if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') { - value *= parentAttributes.opacity; - } - } - else if (attr === 'textAnchor' /* text-anchor */) { - value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center'; - } - else if (attr === 'charSpacing') { - // parseUnit returns px and we convert it to em - parsed = parseUnit(value, fontSize) / fontSize * 1000; - } - else if (attr === 'paintFirst') { - var fillIndex = value.indexOf('fill'); - var strokeIndex = value.indexOf('stroke'); - var value = 'fill'; - if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) { - value = 'stroke'; - } - else if (fillIndex === -1 && strokeIndex > -1) { - value = 'stroke'; - } - } - else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') { - return value; - } - else if (attr === 'imageSmoothing') { - return (value === 'optimizeQuality'); - } - else { - parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize); - } - - return (!isArray && isNaN(parsed) ? value : parsed); - } - - /** - * @private - */ - function getSvgRegex(arr) { - return new RegExp('^(' + arr.join('|') + ')\\b', 'i'); - } - - /** - * @private - * @param {Object} attributes Array of attributes to parse - */ - function _setStrokeFillOpacity(attributes) { - for (var attr in colorAttributes) { - - if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') { - continue; - } - - if (typeof attributes[attr] === 'undefined') { - if (!fabric.Object.prototype[attr]) { - continue; - } - attributes[attr] = fabric.Object.prototype[attr]; - } - - if (attributes[attr].indexOf('url(') === 0) { - continue; - } - - var color = new fabric.Color(attributes[attr]); - attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba(); - } - return attributes; - } - - /** - * @private - */ - function _getMultipleNodes(doc, nodeNames) { - var nodeName, nodeArray = [], nodeList, i, len; - for (i = 0, len = nodeNames.length; i < len; i++) { - nodeName = nodeNames[i]; - nodeList = doc.getElementsByTagName(nodeName); - nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList)); - } - return nodeArray; - } - - /** - * Parses "transform" attribute, returning an array of values - * @static - * @function - * @memberOf fabric - * @param {String} attributeValue String containing attribute value - * @return {Array} Array of 6 elements representing transformation matrix - */ - fabric.parseTransformAttribute = (function() { - function rotateMatrix(matrix, args) { - var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]), - x = 0, y = 0; - if (args.length === 3) { - x = args[1]; - y = args[2]; - } - - matrix[0] = cos; - matrix[1] = sin; - matrix[2] = -sin; - matrix[3] = cos; - matrix[4] = x - (cos * x - sin * y); - matrix[5] = y - (sin * x + cos * y); - } - - function scaleMatrix(matrix, args) { - var multiplierX = args[0], - multiplierY = (args.length === 2) ? args[1] : args[0]; - - matrix[0] = multiplierX; - matrix[3] = multiplierY; - } - - function skewMatrix(matrix, args, pos) { - matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0])); - } - - function translateMatrix(matrix, args) { - matrix[4] = args[0]; - if (args.length === 2) { - matrix[5] = args[1]; - } - } - - // identity matrix - var iMatrix = fabric.iMatrix, - - // == begin transform regexp - number = fabric.reNum, - - commaWsp = fabric.commaWsp, - - skewX = '(?:(skewX)\\s*\\(\\s*(' + number + ')\\s*\\))', - - skewY = '(?:(skewY)\\s*\\(\\s*(' + number + ')\\s*\\))', - - rotate = '(?:(rotate)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + ')' + - commaWsp + '(' + number + '))?\\s*\\))', - - scale = '(?:(scale)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + '))?\\s*\\))', - - translate = '(?:(translate)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + '))?\\s*\\))', - - matrix = '(?:(matrix)\\s*\\(\\s*' + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + - '\\s*\\))', - - transform = '(?:' + - matrix + '|' + - translate + '|' + - scale + '|' + - rotate + '|' + - skewX + '|' + - skewY + - ')', - - transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')', - - transformList = '^\\s*(?:' + transforms + '?)\\s*$', - - // http://www.w3.org/TR/SVG/coords.html#TransformAttribute - reTransformList = new RegExp(transformList), - // == end transform regexp - - reTransform = new RegExp(transform, 'g'); - - return function(attributeValue) { - - // start with identity matrix - var matrix = iMatrix.concat(), - matrices = []; - - // return if no argument was given or - // an argument does not match transform attribute regexp - if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) { - return matrix; - } - - attributeValue.replace(reTransform, function(match) { - - var m = new RegExp(transform).exec(match).filter(function (match) { - // match !== '' && match != null - return (!!match); - }), - operation = m[1], - args = m.slice(2).map(parseFloat); - - switch (operation) { - case 'translate': - translateMatrix(matrix, args); - break; - case 'rotate': - args[0] = fabric.util.degreesToRadians(args[0]); - rotateMatrix(matrix, args); - break; - case 'scale': - scaleMatrix(matrix, args); - break; - case 'skewX': - skewMatrix(matrix, args, 2); - break; - case 'skewY': - skewMatrix(matrix, args, 1); - break; - case 'matrix': - matrix = args; - break; - } - - // snapshot current matrix into matrices array - matrices.push(matrix.concat()); - // reset - matrix = iMatrix.concat(); - }); - - var combinedMatrix = matrices[0]; - while (matrices.length > 1) { - matrices.shift(); - combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]); - } - return combinedMatrix; - }; - })(); - - /** - * @private - */ - function parseStyleString(style, oStyle) { - var attr, value; - style.replace(/;\s*$/, '').split(';').forEach(function (chunk) { - var pair = chunk.split(':'); - - attr = pair[0].trim().toLowerCase(); - value = pair[1].trim(); - - oStyle[attr] = value; - }); - } - - /** - * @private - */ - function parseStyleObject(style, oStyle) { - var attr, value; - for (var prop in style) { - if (typeof style[prop] === 'undefined') { - continue; - } - - attr = prop.toLowerCase(); - value = style[prop]; - - oStyle[attr] = value; - } - } - - /** - * @private - */ - function getGlobalStylesForElement(element, svgUid) { - var styles = { }; - for (var rule in fabric.cssRules[svgUid]) { - if (elementMatchesRule(element, rule.split(' '))) { - for (var property in fabric.cssRules[svgUid][rule]) { - styles[property] = fabric.cssRules[svgUid][rule][property]; - } - } - } - return styles; - } - - /** - * @private - */ - function elementMatchesRule(element, selectors) { - var firstMatching, parentMatching = true; - //start from rightmost selector. - firstMatching = selectorMatches(element, selectors.pop()); - if (firstMatching && selectors.length) { - parentMatching = doesSomeParentMatch(element, selectors); - } - return firstMatching && parentMatching && (selectors.length === 0); - } - - function doesSomeParentMatch(element, selectors) { - var selector, parentMatching = true; - while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) { - if (parentMatching) { - selector = selectors.pop(); - } - element = element.parentNode; - parentMatching = selectorMatches(element, selector); - } - return selectors.length === 0; - } - - /** - * @private - */ - function selectorMatches(element, selector) { - var nodeName = element.nodeName, - classNames = element.getAttribute('class'), - id = element.getAttribute('id'), matcher, i; - // i check if a selector matches slicing away part from it. - // if i get empty string i should match - matcher = new RegExp('^' + nodeName, 'i'); - selector = selector.replace(matcher, ''); - if (id && selector.length) { - matcher = new RegExp('#' + id + '(?![a-zA-Z\\-]+)', 'i'); - selector = selector.replace(matcher, ''); - } - if (classNames && selector.length) { - classNames = classNames.split(' '); - for (i = classNames.length; i--;) { - matcher = new RegExp('\\.' + classNames[i] + '(?![a-zA-Z\\-]+)', 'i'); - selector = selector.replace(matcher, ''); - } - } - return selector.length === 0; - } - - /** - * @private - * to support IE8 missing getElementById on SVGdocument and on node xmlDOM - */ - function elementById(doc, id) { - var el; - doc.getElementById && (el = doc.getElementById(id)); - if (el) { - return el; - } - var node, i, len, nodelist = doc.getElementsByTagName('*'); - for (i = 0, len = nodelist.length; i < len; i++) { - node = nodelist[i]; - if (id === node.getAttribute('id')) { - return node; - } - } - } - - /** - * @private - */ - function parseUseDirectives(doc) { - var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0; - while (nodelist.length && i < nodelist.length) { - var el = nodelist[i], - xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href'); - - if (xlinkAttribute === null) { - return; - } - - var xlink = xlinkAttribute.substr(1), - x = el.getAttribute('x') || 0, - y = el.getAttribute('y') || 0, - el2 = elementById(doc, xlink).cloneNode(true), - currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', - parentNode, - oldLength = nodelist.length, attr, - j, - attrs, - len, - namespace = fabric.svgNS; - - applyViewboxTransform(el2); - if (/^svg$/i.test(el2.nodeName)) { - var el3 = el2.ownerDocument.createElementNS(namespace, 'g'); - for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) { - attr = attrs.item(j); - el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue); - } - // el2.firstChild != null - while (el2.firstChild) { - el3.appendChild(el2.firstChild); - } - el2 = el3; - } - - for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) { - attr = attrs.item(j); - if (attr.nodeName === 'x' || attr.nodeName === 'y' || - attr.nodeName === 'xlink:href' || attr.nodeName === 'href') { - continue; - } - - if (attr.nodeName === 'transform') { - currentTrans = attr.nodeValue + ' ' + currentTrans; - } - else { - el2.setAttribute(attr.nodeName, attr.nodeValue); - } - } - - el2.setAttribute('transform', currentTrans); - el2.setAttribute('instantiated_by_use', '1'); - el2.removeAttribute('id'); - parentNode = el.parentNode; - parentNode.replaceChild(el2, el); - // some browsers do not shorten nodelist after replaceChild (IE8) - if (nodelist.length === oldLength) { - i++; - } - } - } - - // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute - // matches, e.g.: +14.56e-12, etc. - var reViewBoxAttrValue = new RegExp( - '^' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*' + - '$' - ); - - /** - * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements - */ - function applyViewboxTransform(element) { - if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) { - return {}; - } - var viewBoxAttr = element.getAttribute('viewBox'), - scaleX = 1, - scaleY = 1, - minX = 0, - minY = 0, - viewBoxWidth, viewBoxHeight, matrix, el, - widthAttr = element.getAttribute('width'), - heightAttr = element.getAttribute('height'), - x = element.getAttribute('x') || 0, - y = element.getAttribute('y') || 0, - preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '', - missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))), - missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'), - toBeParsed = missingViewBox && missingDimAttr, - parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0; - - parsedDim.width = 0; - parsedDim.height = 0; - parsedDim.toBeParsed = toBeParsed; - - if (missingViewBox) { - if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) { - translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; - matrix = (element.getAttribute('transform') || '') + translateMatrix; - element.setAttribute('transform', matrix); - element.removeAttribute('x'); - element.removeAttribute('y'); - } - } - - if (toBeParsed) { - return parsedDim; - } - - if (missingViewBox) { - parsedDim.width = parseUnit(widthAttr); - parsedDim.height = parseUnit(heightAttr); - // set a transform for elements that have x y and are inner(only) SVGs - return parsedDim; - } - minX = -parseFloat(viewBoxAttr[1]); - minY = -parseFloat(viewBoxAttr[2]); - viewBoxWidth = parseFloat(viewBoxAttr[3]); - viewBoxHeight = parseFloat(viewBoxAttr[4]); - parsedDim.minX = minX; - parsedDim.minY = minY; - parsedDim.viewBoxWidth = viewBoxWidth; - parsedDim.viewBoxHeight = viewBoxHeight; - if (!missingDimAttr) { - parsedDim.width = parseUnit(widthAttr); - parsedDim.height = parseUnit(heightAttr); - scaleX = parsedDim.width / viewBoxWidth; - scaleY = parsedDim.height / viewBoxHeight; - } - else { - parsedDim.width = viewBoxWidth; - parsedDim.height = viewBoxHeight; - } - - // default is to preserve aspect ratio - preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio); - if (preserveAspectRatio.alignX !== 'none') { - //translate all container for the effect of Mid, Min, Max - if (preserveAspectRatio.meetOrSlice === 'meet') { - scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX); - // calculate additional translation to move the viewbox - } - if (preserveAspectRatio.meetOrSlice === 'slice') { - scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY); - // calculate additional translation to move the viewbox - } - widthDiff = parsedDim.width - viewBoxWidth * scaleX; - heightDiff = parsedDim.height - viewBoxHeight * scaleX; - if (preserveAspectRatio.alignX === 'Mid') { - widthDiff /= 2; - } - if (preserveAspectRatio.alignY === 'Mid') { - heightDiff /= 2; - } - if (preserveAspectRatio.alignX === 'Min') { - widthDiff = 0; - } - if (preserveAspectRatio.alignY === 'Min') { - heightDiff = 0; - } - } - - if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) { - return parsedDim; - } - if ((x || y) && element.parentNode.nodeName !== '#document') { - translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; - } - - matrix = translateMatrix + ' matrix(' + scaleX + - ' 0' + - ' 0 ' + - scaleY + ' ' + - (minX * scaleX + widthDiff) + ' ' + - (minY * scaleY + heightDiff) + ') '; - // seems unused. - // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix); - if (element.nodeName === 'svg') { - el = element.ownerDocument.createElementNS(fabric.svgNS, 'g'); - // element.firstChild != null - while (element.firstChild) { - el.appendChild(element.firstChild); - } - element.appendChild(el); - } - else { - el = element; - el.removeAttribute('x'); - el.removeAttribute('y'); - matrix = el.getAttribute('transform') + matrix; - } - el.setAttribute('transform', matrix); - return parsedDim; - } - - function hasAncestorWithNodeName(element, nodeName) { - while (element && (element = element.parentNode)) { - if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', '')) - && !element.getAttribute('instantiated_by_use')) { - return true; - } - } - return false; - } - - /** - * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @param {Function} callback Callback to call when parsing is finished; - * It's being passed an array of elements (parsed from a document). - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [parsingOptions] options for parsing document - * @param {String} [parsingOptions.crossOrigin] crossOrigin settings - */ - fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) { - if (!doc) { - return; - } - - parseUseDirectives(doc); - - var svgUid = fabric.Object.__uid++, i, len, - options = applyViewboxTransform(doc), - descendants = fabric.util.toArray(doc.getElementsByTagName('*')); - options.crossOrigin = parsingOptions && parsingOptions.crossOrigin; - options.svgUid = svgUid; - - if (descendants.length === 0 && fabric.isLikelyNode) { - // we're likely in node, where "o3-xml" library fails to gEBTN("*") - // https://github.com/ajaxorg/node-o3-xml/issues/21 - descendants = doc.selectNodes('//*[name(.)!="svg"]'); - var arr = []; - for (i = 0, len = descendants.length; i < len; i++) { - arr[i] = descendants[i]; - } - descendants = arr; - } - - var elements = descendants.filter(function(el) { - applyViewboxTransform(el); - return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) && - !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement - }); - if (!elements || (elements && !elements.length)) { - callback && callback([], {}); - return; - } - var clipPaths = { }; - descendants.filter(function(el) { - return el.nodeName.replace('svg:', '') === 'clipPath'; - }).forEach(function(el) { - var id = el.getAttribute('id'); - clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) { - return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')); - }); - }); - fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); - fabric.cssRules[svgUid] = fabric.getCSSRules(doc); - fabric.clipPaths[svgUid] = clipPaths; - // Precedence of rules: style > class > attribute - fabric.parseElements(elements, function(instances, elements) { - if (callback) { - callback(instances, options, elements, descendants); - delete fabric.gradientDefs[svgUid]; - delete fabric.cssRules[svgUid]; - delete fabric.clipPaths[svgUid]; - } - }, clone(options), reviver, parsingOptions); - }; - - function recursivelyParseGradientsXlink(doc, gradient) { - var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'], - xlinkAttr = 'xlink:href', - xLink = gradient.getAttribute(xlinkAttr).substr(1), - referencedGradient = elementById(doc, xLink); - if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) { - recursivelyParseGradientsXlink(doc, referencedGradient); - } - gradientsAttrs.forEach(function(attr) { - if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) { - gradient.setAttribute(attr, referencedGradient.getAttribute(attr)); - } - }); - if (!gradient.children.length) { - var referenceClone = referencedGradient.cloneNode(true); - while (referenceClone.firstChild) { - gradient.appendChild(referenceClone.firstChild); - } - } - gradient.removeAttribute(xlinkAttr); - } - - var reFontDeclaration = new RegExp( - '(normal|italic)?\\s*(normal|small-caps)?\\s*' + - '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' + - fabric.reNum + - '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)'); - - extend(fabric, { - /** - * Parses a short font declaration, building adding its properties to a style object - * @static - * @function - * @memberOf fabric - * @param {String} value font declaration - * @param {Object} oStyle definition - */ - parseFontDeclaration: function(value, oStyle) { - var match = value.match(reFontDeclaration); - - if (!match) { - return; - } - var fontStyle = match[1], - // font variant is not used - // fontVariant = match[2], - fontWeight = match[3], - fontSize = match[4], - lineHeight = match[5], - fontFamily = match[6]; - - if (fontStyle) { - oStyle.fontStyle = fontStyle; - } - if (fontWeight) { - oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); - } - if (fontSize) { - oStyle.fontSize = parseUnit(fontSize); - } - if (fontFamily) { - oStyle.fontFamily = fontFamily; - } - if (lineHeight) { - oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; - } - }, - - /** - * Parses an SVG document, returning all of the gradient declarations found in it - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element - */ - getGradientDefs: function(doc) { - var tagArray = [ - 'linearGradient', - 'radialGradient', - 'svg:linearGradient', - 'svg:radialGradient'], - elList = _getMultipleNodes(doc, tagArray), - el, j = 0, gradientDefs = { }; - j = elList.length; - while (j--) { - el = elList[j]; - if (el.getAttribute('xlink:href')) { - recursivelyParseGradientsXlink(doc, el); - } - gradientDefs[el.getAttribute('id')] = el; - } - return gradientDefs; - }, - - /** - * Returns an object of attributes' name/value, given element and an array of attribute names; - * Parses parent "g" nodes recursively upwards. - * @static - * @memberOf fabric - * @param {DOMElement} element Element to parse - * @param {Array} attributes Array of attributes to parse - * @return {Object} object containing parsed attributes' names/values - */ - parseAttributes: function(element, attributes, svgUid) { - - if (!element) { - return; - } - - var value, - parentAttributes = { }, - fontSize, parentFontSize; - - if (typeof svgUid === 'undefined') { - svgUid = element.getAttribute('svgUid'); - } - // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards - if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) { - parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid); - } - - var ownAttributes = attributes.reduce(function(memo, attr) { - value = element.getAttribute(attr); - if (value) { // eslint-disable-line - memo[attr] = value; - } - return memo; - }, { }); - // add values parsed from style, which take precedence over attributes - // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) - var cssAttrs = extend( - getGlobalStylesForElement(element, svgUid), - fabric.parseStyleAttribute(element) - ); - ownAttributes = extend( - ownAttributes, - cssAttrs - ); - if (cssAttrs[cPath]) { - element.setAttribute(cPath, cssAttrs[cPath]); - } - fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE; - if (ownAttributes[fSize]) { - // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers. - ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize); - } - - var normalizedAttr, normalizedValue, normalizedStyle = {}; - for (var attr in ownAttributes) { - normalizedAttr = normalizeAttr(attr); - normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize); - normalizedStyle[normalizedAttr] = normalizedValue; - } - if (normalizedStyle && normalizedStyle.font) { - fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle); - } - var mergedAttrs = extend(parentAttributes, normalizedStyle); - return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs); - }, - - /** - * Transforms an array of svg elements to corresponding fabric.* instances - * @static - * @memberOf fabric - * @param {Array} elements Array of elements to parse - * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) - * @param {Object} [options] Options object - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - parseElements: function(elements, callback, options, reviver, parsingOptions) { - new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse(); - }, - - /** - * Parses "style" attribute, retuning an object with values - * @static - * @memberOf fabric - * @param {SVGElement} element Element to parse - * @return {Object} Objects with values parsed from style attribute of an element - */ - parseStyleAttribute: function(element) { - var oStyle = { }, - style = element.getAttribute('style'); - - if (!style) { - return oStyle; - } - - if (typeof style === 'string') { - parseStyleString(style, oStyle); - } - else { - parseStyleObject(style, oStyle); - } - - return oStyle; - }, - - /** - * Parses "points" attribute, returning an array of values - * @static - * @memberOf fabric - * @param {String} points points attribute string - * @return {Array} array of points - */ - parsePointsAttribute: function(points) { - - // points attribute is required and must not be empty - if (!points) { - return null; - } - - // replace commas with whitespace and remove bookending whitespace - points = points.replace(/,/g, ' ').trim(); - - points = points.split(/\s+/); - var parsedPoints = [], i, len; - - for (i = 0, len = points.length; i < len; i += 2) { - parsedPoints.push({ - x: parseFloat(points[i]), - y: parseFloat(points[i + 1]) - }); - } - - // odd number of points is an error - // if (parsedPoints.length % 2 !== 0) { - // return null; - // } - - return parsedPoints; - }, - - /** - * Returns CSS rules for a given SVG document - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} CSS rules of this document - */ - getCSSRules: function(doc) { - var styles = doc.getElementsByTagName('style'), i, len, - allRules = { }, rules; - - // very crude parsing of style contents - for (i = 0, len = styles.length; i < len; i++) { - var styleContents = styles[i].textContent; - - // remove comments - styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); - if (styleContents.trim() === '') { - continue; - } - rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = rules.map(function(rule) { return rule.trim(); }); - // eslint-disable-next-line no-loop-func - rules.forEach(function(rule) { - - var match = rule.match(/([\s\S]*?)\s*\{([^}]*)\}/), - ruleObj = { }, declaration = match[2].trim(), - propertyValuePairs = declaration.replace(/;$/, '').split(/\s*;\s*/); - - for (i = 0, len = propertyValuePairs.length; i < len; i++) { - var pair = propertyValuePairs[i].split(/\s*:\s*/), - property = pair[0], - value = pair[1]; - ruleObj[property] = value; - } - rule = match[1]; - rule.split(',').forEach(function(_rule) { - _rule = _rule.replace(/^svg/i, '').trim(); - if (_rule === '') { - return; - } - if (allRules[_rule]) { - fabric.util.object.extend(allRules[_rule], ruleObj); - } - else { - allRules[_rule] = fabric.util.object.clone(ruleObj); - } - }); - }); - } - return allRules; - }, - - /** - * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. - * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) - * @memberOf fabric - * @param {String} url - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [options] Object containing options for parsing - * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources - */ - loadSVGFromURL: function(url, callback, reviver, options) { - - url = url.replace(/^\n\s*/, '').trim(); - new fabric.util.request(url, { - method: 'get', - onComplete: onComplete - }); - - function onComplete(r) { - - var xml = r.responseXML; - if (!xml || !xml.documentElement) { - callback && callback(null); - return false; - } - - fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) { - callback && callback(results, _options, elements, allElements); - }, reviver, options); - } - }, - - /** - * Takes string corresponding to an SVG document, and parses it into a set of fabric objects - * @memberOf fabric - * @param {String} string - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [options] Object containing options for parsing - * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources - */ - loadSVGFromString: function(string, callback, reviver, options) { - var parser = new fabric.window.DOMParser(), - doc = parser.parseFromString(string.trim(), 'text/xml'); - fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) { - callback(results, _options, elements, allElements); - }, reviver, options); - } - }); - -})(typeof exports !== 'undefined' ? exports : this); - - -fabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) { - this.elements = elements; - this.callback = callback; - this.options = options; - this.reviver = reviver; - this.svgUid = (options && options.svgUid) || 0; - this.parsingOptions = parsingOptions; - this.regexUrl = /^url\(['"]?#([^'"]+)['"]?\)/g; - this.doc = doc; -}; - -(function(proto) { - proto.parse = function() { - this.instances = new Array(this.elements.length); - this.numElements = this.elements.length; - this.createObjects(); - }; - - proto.createObjects = function() { - var _this = this; - this.elements.forEach(function(element, i) { - element.setAttribute('svgUid', _this.svgUid); - _this.createObject(element, i); - }); - }; - - proto.findTag = function(el) { - return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))]; - }; - - proto.createObject = function(el, index) { - var klass = this.findTag(el); - if (klass && klass.fromElement) { - try { - klass.fromElement(el, this.createCallback(index, el), this.options); - } - catch (err) { - fabric.log(err); - } - } - else { - this.checkIfDone(); - } - }; - - proto.createCallback = function(index, el) { - var _this = this; - return function(obj) { - var _options; - _this.resolveGradient(obj, el, 'fill'); - _this.resolveGradient(obj, el, 'stroke'); - if (obj instanceof fabric.Image && obj._originalElement) { - _options = obj.parsePreserveAspectRatioAttribute(el); - } - obj._removeTransformMatrix(_options); - _this.resolveClipPath(obj, el); - _this.reviver && _this.reviver(el, obj); - _this.instances[index] = obj; - _this.checkIfDone(); - }; - }; - - proto.extractPropertyDefinition = function(obj, property, storage) { - var value = obj[property], regex = this.regexUrl; - if (!regex.test(value)) { - return; - } - regex.lastIndex = 0; - var id = regex.exec(value)[1]; - regex.lastIndex = 0; - return fabric[storage][this.svgUid][id]; - }; - - proto.resolveGradient = function(obj, el, property) { - var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs'); - if (gradientDef) { - var opacityAttr = el.getAttribute(property + '-opacity'); - var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options); - obj.set(property, gradient); - } - }; - - proto.createClipPathCallback = function(obj, container) { - return function(_newObj) { - _newObj._removeTransformMatrix(); - _newObj.fillRule = _newObj.clipRule; - container.push(_newObj); - }; - }; - - proto.resolveClipPath = function(obj, usingElement) { - var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'), - element, klass, objTransformInv, container, gTransform, options; - if (clipPath) { - container = []; - objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix()); - // move the clipPath tag as sibling to the real element that is using it - var clipPathTag = clipPath[0].parentNode; - var clipPathOwner = usingElement; - while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) { - clipPathOwner = clipPathOwner.parentNode; - } - clipPathOwner.parentNode.appendChild(clipPathTag); - for (var i = 0; i < clipPath.length; i++) { - element = clipPath[i]; - klass = this.findTag(element); - klass.fromElement( - element, - this.createClipPathCallback(obj, container), - this.options - ); - } - if (container.length === 1) { - clipPath = container[0]; - } - else { - clipPath = new fabric.Group(container); - } - gTransform = fabric.util.multiplyTransformMatrices( - objTransformInv, - clipPath.calcTransformMatrix() - ); - if (clipPath.clipPath) { - this.resolveClipPath(clipPath, clipPathOwner); - } - var options = fabric.util.qrDecompose(gTransform); - clipPath.flipX = false; - clipPath.flipY = false; - clipPath.set('scaleX', options.scaleX); - clipPath.set('scaleY', options.scaleY); - clipPath.angle = options.angle; - clipPath.skewX = options.skewX; - clipPath.skewY = 0; - clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center'); - obj.clipPath = clipPath; - } - else { - // if clip-path does not resolve to any element, delete the property. - delete obj.clipPath; - } - }; - - proto.checkIfDone = function() { - if (--this.numElements === 0) { - this.instances = this.instances.filter(function(el) { - // eslint-disable-next-line no-eq-null, eqeqeq - return el != null; - }); - this.callback(this.instances, this.elements); - } - }; -})(fabric.ElementsParser.prototype); - - -(function(global) { - - 'use strict'; - - /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Point) { - fabric.warn('fabric.Point is already defined'); - return; - } - - fabric.Point = Point; - - /** - * Point class - * @class fabric.Point - * @memberOf fabric - * @constructor - * @param {Number} x - * @param {Number} y - * @return {fabric.Point} thisArg - */ - function Point(x, y) { - this.x = x; - this.y = y; - } - - Point.prototype = /** @lends fabric.Point.prototype */ { - - type: 'point', - - constructor: Point, - - /** - * Adds another point to this one and returns another one - * @param {fabric.Point} that - * @return {fabric.Point} new Point instance with added values - */ - add: function (that) { - return new Point(this.x + that.x, this.y + that.y); - }, - - /** - * Adds another point to this one - * @param {fabric.Point} that - * @return {fabric.Point} thisArg - * @chainable - */ - addEquals: function (that) { - this.x += that.x; - this.y += that.y; - return this; - }, - - /** - * Adds value to this point and returns a new one - * @param {Number} scalar - * @return {fabric.Point} new Point with added value - */ - scalarAdd: function (scalar) { - return new Point(this.x + scalar, this.y + scalar); - }, - - /** - * Adds value to this point - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - scalarAddEquals: function (scalar) { - this.x += scalar; - this.y += scalar; - return this; - }, - - /** - * Subtracts another point from this point and returns a new one - * @param {fabric.Point} that - * @return {fabric.Point} new Point object with subtracted values - */ - subtract: function (that) { - return new Point(this.x - that.x, this.y - that.y); - }, - - /** - * Subtracts another point from this point - * @param {fabric.Point} that - * @return {fabric.Point} thisArg - * @chainable - */ - subtractEquals: function (that) { - this.x -= that.x; - this.y -= that.y; - return this; - }, - - /** - * Subtracts value from this point and returns a new one - * @param {Number} scalar - * @return {fabric.Point} - */ - scalarSubtract: function (scalar) { - return new Point(this.x - scalar, this.y - scalar); - }, - - /** - * Subtracts value from this point - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - scalarSubtractEquals: function (scalar) { - this.x -= scalar; - this.y -= scalar; - return this; - }, - - /** - * Multiplies this point by a value and returns a new one - * TODO: rename in scalarMultiply in 2.0 - * @param {Number} scalar - * @return {fabric.Point} - */ - multiply: function (scalar) { - return new Point(this.x * scalar, this.y * scalar); - }, - - /** - * Multiplies this point by a value - * TODO: rename in scalarMultiplyEquals in 2.0 - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - multiplyEquals: function (scalar) { - this.x *= scalar; - this.y *= scalar; - return this; - }, - - /** - * Divides this point by a value and returns a new one - * TODO: rename in scalarDivide in 2.0 - * @param {Number} scalar - * @return {fabric.Point} - */ - divide: function (scalar) { - return new Point(this.x / scalar, this.y / scalar); - }, - - /** - * Divides this point by a value - * TODO: rename in scalarDivideEquals in 2.0 - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - divideEquals: function (scalar) { - this.x /= scalar; - this.y /= scalar; - return this; - }, - - /** - * Returns true if this point is equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - eq: function (that) { - return (this.x === that.x && this.y === that.y); - }, - - /** - * Returns true if this point is less than another one - * @param {fabric.Point} that - * @return {Boolean} - */ - lt: function (that) { - return (this.x < that.x && this.y < that.y); - }, - - /** - * Returns true if this point is less than or equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - lte: function (that) { - return (this.x <= that.x && this.y <= that.y); - }, - - /** - - * Returns true if this point is greater another one - * @param {fabric.Point} that - * @return {Boolean} - */ - gt: function (that) { - return (this.x > that.x && this.y > that.y); - }, - - /** - * Returns true if this point is greater than or equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - gte: function (that) { - return (this.x >= that.x && this.y >= that.y); - }, - - /** - * Returns new point which is the result of linear interpolation with this one and another one - * @param {fabric.Point} that - * @param {Number} t , position of interpolation, between 0 and 1 default 0.5 - * @return {fabric.Point} - */ - lerp: function (that, t) { - if (typeof t === 'undefined') { - t = 0.5; - } - t = Math.max(Math.min(1, t), 0); - return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t); - }, - - /** - * Returns distance from this point and another one - * @param {fabric.Point} that - * @return {Number} - */ - distanceFrom: function (that) { - var dx = this.x - that.x, - dy = this.y - that.y; - return Math.sqrt(dx * dx + dy * dy); - }, - - /** - * Returns the point between this point and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - midPointFrom: function (that) { - return this.lerp(that); - }, - - /** - * Returns a new point which is the min of this and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - min: function (that) { - return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y)); - }, - - /** - * Returns a new point which is the max of this and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - max: function (that) { - return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y)); - }, - - /** - * Returns string representation of this point - * @return {String} - */ - toString: function () { - return this.x + ',' + this.y; - }, - - /** - * Sets x/y of this point - * @param {Number} x - * @param {Number} y - * @chainable - */ - setXY: function (x, y) { - this.x = x; - this.y = y; - return this; - }, - - /** - * Sets x of this point - * @param {Number} x - * @chainable - */ - setX: function (x) { - this.x = x; - return this; - }, - - /** - * Sets y of this point - * @param {Number} y - * @chainable - */ - setY: function (y) { - this.y = y; - return this; - }, - - /** - * Sets x/y of this point from another point - * @param {fabric.Point} that - * @chainable - */ - setFromPoint: function (that) { - this.x = that.x; - this.y = that.y; - return this; - }, - - /** - * Swaps x/y of this point and another point - * @param {fabric.Point} that - */ - swap: function (that) { - var x = this.x, - y = this.y; - this.x = that.x; - this.y = that.y; - that.x = x; - that.y = y; - }, - - /** - * return a cloned instance of the point - * @return {fabric.Point} - */ - clone: function () { - return new Point(this.x, this.y); - } - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Intersection) { - fabric.warn('fabric.Intersection is already defined'); - return; - } - - /** - * Intersection class - * @class fabric.Intersection - * @memberOf fabric - * @constructor - */ - function Intersection(status) { - this.status = status; - this.points = []; - } - - fabric.Intersection = Intersection; - - fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ { - - constructor: Intersection, - - /** - * Appends a point to intersection - * @param {fabric.Point} point - * @return {fabric.Intersection} thisArg - * @chainable - */ - appendPoint: function (point) { - this.points.push(point); - return this; - }, - - /** - * Appends points to intersection - * @param {Array} points - * @return {fabric.Intersection} thisArg - * @chainable - */ - appendPoints: function (points) { - this.points = this.points.concat(points); - return this; - } - }; - - /** - * Checks if one line intersects another - * TODO: rename in intersectSegmentSegment - * @static - * @param {fabric.Point} a1 - * @param {fabric.Point} a2 - * @param {fabric.Point} b1 - * @param {fabric.Point} b2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) { - var result, - uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), - ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x), - uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - if (uB !== 0) { - var ua = uaT / uB, - ub = ubT / uB; - if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { - result = new Intersection('Intersection'); - result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); - } - else { - result = new Intersection(); - } - } - else { - if (uaT === 0 || ubT === 0) { - result = new Intersection('Coincident'); - } - else { - result = new Intersection('Parallel'); - } - } - return result; - }; - - /** - * Checks if line intersects polygon - * TODO: rename in intersectSegmentPolygon - * fix detection of coincident - * @static - * @param {fabric.Point} a1 - * @param {fabric.Point} a2 - * @param {Array} points - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectLinePolygon = function(a1, a2, points) { - var result = new Intersection(), - length = points.length, - b1, b2, inter, i; - - for (i = 0; i < length; i++) { - b1 = points[i]; - b2 = points[(i + 1) % length]; - inter = Intersection.intersectLineLine(a1, a2, b1, b2); - - result.appendPoints(inter.points); - } - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - - /** - * Checks if polygon intersects another polygon - * @static - * @param {Array} points1 - * @param {Array} points2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectPolygonPolygon = function (points1, points2) { - var result = new Intersection(), - length = points1.length, i; - - for (i = 0; i < length; i++) { - var a1 = points1[i], - a2 = points1[(i + 1) % length], - inter = Intersection.intersectLinePolygon(a1, a2, points2); - - result.appendPoints(inter.points); - } - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - - /** - * Checks if polygon intersects rectangle - * @static - * @param {Array} points - * @param {fabric.Point} r1 - * @param {fabric.Point} r2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) { - var min = r1.min(r2), - max = r1.max(r2), - topRight = new fabric.Point(max.x, min.y), - bottomLeft = new fabric.Point(min.x, max.y), - inter1 = Intersection.intersectLinePolygon(min, topRight, points), - inter2 = Intersection.intersectLinePolygon(topRight, max, points), - inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points), - inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points), - result = new Intersection(); - - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Color) { - fabric.warn('fabric.Color is already defined.'); - return; - } - - /** - * Color class - * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations; - * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects. - * - * @class fabric.Color - * @param {String} color optional in hex or rgb(a) or hsl format or from known color list - * @return {fabric.Color} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors} - */ - function Color(color) { - if (!color) { - this.setSource([0, 0, 0, 1]); - } - else { - this._tryParsingColor(color); - } - } - - fabric.Color = Color; - - fabric.Color.prototype = /** @lends fabric.Color.prototype */ { - - /** - * @private - * @param {String|Array} color Color value to parse - */ - _tryParsingColor: function(color) { - var source; - - if (color in Color.colorNameMap) { - color = Color.colorNameMap[color]; - } - - if (color === 'transparent') { - source = [255, 255, 255, 0]; - } - - if (!source) { - source = Color.sourceFromHex(color); - } - if (!source) { - source = Color.sourceFromRgb(color); - } - if (!source) { - source = Color.sourceFromHsl(color); - } - if (!source) { - //if color is not recognize let's make black as canvas does - source = [0, 0, 0, 1]; - } - if (source) { - this.setSource(source); - } - }, - - /** - * Adapted from https://github.com/mjijackson - * @private - * @param {Number} r Red color value - * @param {Number} g Green color value - * @param {Number} b Blue color value - * @return {Array} Hsl color - */ - _rgbToHsl: function(r, g, b) { - r /= 255; g /= 255; b /= 255; - - var h, s, l, - max = fabric.util.array.max([r, g, b]), - min = fabric.util.array.min([r, g, b]); - - l = (max + min) / 2; - - if (max === min) { - h = s = 0; // achromatic - } - else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - - return [ - Math.round(h * 360), - Math.round(s * 100), - Math.round(l * 100) - ]; - }, - - /** - * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1]) - * @return {Array} - */ - getSource: function() { - return this._source; - }, - - /** - * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1]) - * @param {Array} source - */ - setSource: function(source) { - this._source = source; - }, - - /** - * Returns color representation in RGB format - * @return {String} ex: rgb(0-255,0-255,0-255) - */ - toRgb: function() { - var source = this.getSource(); - return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')'; - }, - - /** - * Returns color representation in RGBA format - * @return {String} ex: rgba(0-255,0-255,0-255,0-1) - */ - toRgba: function() { - var source = this.getSource(); - return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')'; - }, - - /** - * Returns color representation in HSL format - * @return {String} ex: hsl(0-360,0%-100%,0%-100%) - */ - toHsl: function() { - var source = this.getSource(), - hsl = this._rgbToHsl(source[0], source[1], source[2]); - - return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)'; - }, - - /** - * Returns color representation in HSLA format - * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1) - */ - toHsla: function() { - var source = this.getSource(), - hsl = this._rgbToHsl(source[0], source[1], source[2]); - - return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')'; - }, - - /** - * Returns color representation in HEX format - * @return {String} ex: FF5555 - */ - toHex: function() { - var source = this.getSource(), r, g, b; - - r = source[0].toString(16); - r = (r.length === 1) ? ('0' + r) : r; - - g = source[1].toString(16); - g = (g.length === 1) ? ('0' + g) : g; - - b = source[2].toString(16); - b = (b.length === 1) ? ('0' + b) : b; - - return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); - }, - - /** - * Returns color representation in HEXA format - * @return {String} ex: FF5555CC - */ - toHexa: function() { - var source = this.getSource(), a; - - a = Math.round(source[3] * 255); - a = a.toString(16); - a = (a.length === 1) ? ('0' + a) : a; - - return this.toHex() + a.toUpperCase(); - }, - - /** - * Gets value of alpha channel for this color - * @return {Number} 0-1 - */ - getAlpha: function() { - return this.getSource()[3]; - }, - - /** - * Sets value of alpha channel for this color - * @param {Number} alpha Alpha value 0-1 - * @return {fabric.Color} thisArg - */ - setAlpha: function(alpha) { - var source = this.getSource(); - source[3] = alpha; - this.setSource(source); - return this; - }, - - /** - * Transforms color to its grayscale representation - * @return {fabric.Color} thisArg - */ - toGrayscale: function() { - var source = this.getSource(), - average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10), - currentAlpha = source[3]; - this.setSource([average, average, average, currentAlpha]); - return this; - }, - - /** - * Transforms color to its black and white representation - * @param {Number} threshold - * @return {fabric.Color} thisArg - */ - toBlackWhite: function(threshold) { - var source = this.getSource(), - average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), - currentAlpha = source[3]; - - threshold = threshold || 127; - - average = (Number(average) < Number(threshold)) ? 0 : 255; - this.setSource([average, average, average, currentAlpha]); - return this; - }, - - /** - * Overlays color with another color - * @param {String|fabric.Color} otherColor - * @return {fabric.Color} thisArg - */ - overlayWith: function(otherColor) { - if (!(otherColor instanceof Color)) { - otherColor = new Color(otherColor); - } - - var result = [], - alpha = this.getAlpha(), - otherAlpha = 0.5, - source = this.getSource(), - otherSource = otherColor.getSource(), i; - - for (i = 0; i < 3; i++) { - result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha))); - } - - result[3] = alpha; - this.setSource(result); - return this; - } - }; - - /** - * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5)) - * @static - * @field - * @memberOf fabric.Color - */ - // eslint-disable-next-line max-len - fabric.Color.reRGBa = /^rgba?\(\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*(?:\s*,\s*((?:\d*\.?\d+)?)\s*)?\)$/i; - - /** - * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 )) - * @static - * @field - * @memberOf fabric.Color - */ - fabric.Color.reHSLa = /^hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3}\%)\s*,\s*(\d{1,3}\%)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\)$/i; - - /** - * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff) - * @static - * @field - * @memberOf fabric.Color - */ - fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i; - - /** - * Map of the 148 color names with HEX code - * @static - * @field - * @memberOf fabric.Color - * @see: https://www.w3.org/TR/css3-color/#svg-color - */ - fabric.Color.colorNameMap = { - aliceblue: '#F0F8FF', - antiquewhite: '#FAEBD7', - aqua: '#00FFFF', - aquamarine: '#7FFFD4', - azure: '#F0FFFF', - beige: '#F5F5DC', - bisque: '#FFE4C4', - black: '#000000', - blanchedalmond: '#FFEBCD', - blue: '#0000FF', - blueviolet: '#8A2BE2', - brown: '#A52A2A', - burlywood: '#DEB887', - cadetblue: '#5F9EA0', - chartreuse: '#7FFF00', - chocolate: '#D2691E', - coral: '#FF7F50', - cornflowerblue: '#6495ED', - cornsilk: '#FFF8DC', - crimson: '#DC143C', - cyan: '#00FFFF', - darkblue: '#00008B', - darkcyan: '#008B8B', - darkgoldenrod: '#B8860B', - darkgray: '#A9A9A9', - darkgrey: '#A9A9A9', - darkgreen: '#006400', - darkkhaki: '#BDB76B', - darkmagenta: '#8B008B', - darkolivegreen: '#556B2F', - darkorange: '#FF8C00', - darkorchid: '#9932CC', - darkred: '#8B0000', - darksalmon: '#E9967A', - darkseagreen: '#8FBC8F', - darkslateblue: '#483D8B', - darkslategray: '#2F4F4F', - darkslategrey: '#2F4F4F', - darkturquoise: '#00CED1', - darkviolet: '#9400D3', - deeppink: '#FF1493', - deepskyblue: '#00BFFF', - dimgray: '#696969', - dimgrey: '#696969', - dodgerblue: '#1E90FF', - firebrick: '#B22222', - floralwhite: '#FFFAF0', - forestgreen: '#228B22', - fuchsia: '#FF00FF', - gainsboro: '#DCDCDC', - ghostwhite: '#F8F8FF', - gold: '#FFD700', - goldenrod: '#DAA520', - gray: '#808080', - grey: '#808080', - green: '#008000', - greenyellow: '#ADFF2F', - honeydew: '#F0FFF0', - hotpink: '#FF69B4', - indianred: '#CD5C5C', - indigo: '#4B0082', - ivory: '#FFFFF0', - khaki: '#F0E68C', - lavender: '#E6E6FA', - lavenderblush: '#FFF0F5', - lawngreen: '#7CFC00', - lemonchiffon: '#FFFACD', - lightblue: '#ADD8E6', - lightcoral: '#F08080', - lightcyan: '#E0FFFF', - lightgoldenrodyellow: '#FAFAD2', - lightgray: '#D3D3D3', - lightgrey: '#D3D3D3', - lightgreen: '#90EE90', - lightpink: '#FFB6C1', - lightsalmon: '#FFA07A', - lightseagreen: '#20B2AA', - lightskyblue: '#87CEFA', - lightslategray: '#778899', - lightslategrey: '#778899', - lightsteelblue: '#B0C4DE', - lightyellow: '#FFFFE0', - lime: '#00FF00', - limegreen: '#32CD32', - linen: '#FAF0E6', - magenta: '#FF00FF', - maroon: '#800000', - mediumaquamarine: '#66CDAA', - mediumblue: '#0000CD', - mediumorchid: '#BA55D3', - mediumpurple: '#9370DB', - mediumseagreen: '#3CB371', - mediumslateblue: '#7B68EE', - mediumspringgreen: '#00FA9A', - mediumturquoise: '#48D1CC', - mediumvioletred: '#C71585', - midnightblue: '#191970', - mintcream: '#F5FFFA', - mistyrose: '#FFE4E1', - moccasin: '#FFE4B5', - navajowhite: '#FFDEAD', - navy: '#000080', - oldlace: '#FDF5E6', - olive: '#808000', - olivedrab: '#6B8E23', - orange: '#FFA500', - orangered: '#FF4500', - orchid: '#DA70D6', - palegoldenrod: '#EEE8AA', - palegreen: '#98FB98', - paleturquoise: '#AFEEEE', - palevioletred: '#DB7093', - papayawhip: '#FFEFD5', - peachpuff: '#FFDAB9', - peru: '#CD853F', - pink: '#FFC0CB', - plum: '#DDA0DD', - powderblue: '#B0E0E6', - purple: '#800080', - rebeccapurple: '#663399', - red: '#FF0000', - rosybrown: '#BC8F8F', - royalblue: '#4169E1', - saddlebrown: '#8B4513', - salmon: '#FA8072', - sandybrown: '#F4A460', - seagreen: '#2E8B57', - seashell: '#FFF5EE', - sienna: '#A0522D', - silver: '#C0C0C0', - skyblue: '#87CEEB', - slateblue: '#6A5ACD', - slategray: '#708090', - slategrey: '#708090', - snow: '#FFFAFA', - springgreen: '#00FF7F', - steelblue: '#4682B4', - tan: '#D2B48C', - teal: '#008080', - thistle: '#D8BFD8', - tomato: '#FF6347', - turquoise: '#40E0D0', - violet: '#EE82EE', - wheat: '#F5DEB3', - white: '#FFFFFF', - whitesmoke: '#F5F5F5', - yellow: '#FFFF00', - yellowgreen: '#9ACD32' - }; - - /** - * @private - * @param {Number} p - * @param {Number} q - * @param {Number} t - * @return {Number} - */ - function hue2rgb(p, q, t) { - if (t < 0) { - t += 1; - } - if (t > 1) { - t -= 1; - } - if (t < 1 / 6) { - return p + (q - p) * 6 * t; - } - if (t < 1 / 2) { - return q; - } - if (t < 2 / 3) { - return p + (q - p) * (2 / 3 - t) * 6; - } - return p; - } - - /** - * Returns new color object, when given a color in RGB format - * @memberOf fabric.Color - * @param {String} color Color value ex: rgb(0-255,0-255,0-255) - * @return {fabric.Color} - */ - fabric.Color.fromRgb = function(color) { - return Color.fromSource(Color.sourceFromRgb(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format - * @memberOf fabric.Color - * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%) - * @return {Array} source - */ - fabric.Color.sourceFromRgb = function(color) { - var match = color.match(Color.reRGBa); - if (match) { - var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1), - g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1), - b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1); - - return [ - parseInt(r, 10), - parseInt(g, 10), - parseInt(b, 10), - match[4] ? parseFloat(match[4]) : 1 - ]; - } - }; - - /** - * Returns new color object, when given a color in RGBA format - * @static - * @function - * @memberOf fabric.Color - * @param {String} color - * @return {fabric.Color} - */ - fabric.Color.fromRgba = Color.fromRgb; - - /** - * Returns new color object, when given a color in HSL format - * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%) - * @memberOf fabric.Color - * @return {fabric.Color} - */ - fabric.Color.fromHsl = function(color) { - return Color.fromSource(Color.sourceFromHsl(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format. - * Adapted from https://github.com/mjijackson - * @memberOf fabric.Color - * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1) - * @return {Array} source - * @see http://http://www.w3.org/TR/css3-color/#hsl-color - */ - fabric.Color.sourceFromHsl = function(color) { - var match = color.match(Color.reHSLa); - if (!match) { - return; - } - - var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360, - s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1), - l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1), - r, g, b; - - if (s === 0) { - r = g = b = l; - } - else { - var q = l <= 0.5 ? l * (s + 1) : l + s - l * s, - p = l * 2 - q; - - r = hue2rgb(p, q, h + 1 / 3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1 / 3); - } - - return [ - Math.round(r * 255), - Math.round(g * 255), - Math.round(b * 255), - match[4] ? parseFloat(match[4]) : 1 - ]; - }; - - /** - * Returns new color object, when given a color in HSLA format - * @static - * @function - * @memberOf fabric.Color - * @param {String} color - * @return {fabric.Color} - */ - fabric.Color.fromHsla = Color.fromHsl; - - /** - * Returns new color object, when given a color in HEX format - * @static - * @memberOf fabric.Color - * @param {String} color Color value ex: FF5555 - * @return {fabric.Color} - */ - fabric.Color.fromHex = function(color) { - return Color.fromSource(Color.sourceFromHex(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format - * @static - * @memberOf fabric.Color - * @param {String} color ex: FF5555 or FF5544CC (RGBa) - * @return {Array} source - */ - fabric.Color.sourceFromHex = function(color) { - if (color.match(Color.reHex)) { - var value = color.slice(color.indexOf('#') + 1), - isShortNotation = (value.length === 3 || value.length === 4), - isRGBa = (value.length === 8 || value.length === 4), - r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2), - g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4), - b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6), - a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF'; - - return [ - parseInt(r, 16), - parseInt(g, 16), - parseInt(b, 16), - parseFloat((parseInt(a, 16) / 255).toFixed(2)) - ]; - } - }; - - /** - * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5]) - * @static - * @memberOf fabric.Color - * @param {Array} source - * @return {fabric.Color} - */ - fabric.Color.fromSource = function(source) { - var oColor = new Color(); - oColor.setSource(source); - return oColor; - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'], - skewMap = ['ns', 'nesw', 'ew', 'nwse'], - controls = {}, - LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center', - opposite = { - top: BOTTOM, - bottom: TOP, - left: RIGHT, - right: LEFT, - center: CENTER, - }, radiansToDegrees = fabric.util.radiansToDegrees, - sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; }); - - /** - * Combine control position and object angle to find the control direction compared - * to the object center. - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - * @param {fabric.Control} control the control class - * @return {Number} 0 - 7 a quadrant number - */ - function findCornerQuadrant(fabricObject, control) { - var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360; - return Math.round((cornerAngle % 360) / 45); - } - - function fireEvent(eventName, options) { - var target = options.transform.target, - canvas = target.canvas, - canvasOptions = fabric.util.object.clone(options); - canvasOptions.target = target; - canvas && canvas.fire('object:' + eventName, canvasOptions); - target.fire(eventName, options); - } - - /** - * Inspect event and fabricObject properties to understand if the scaling action - * @param {Event} eventData from the user action - * @param {fabric.Object} fabricObject the fabric object about to scale - * @return {Boolean} true if scale is proportional - */ - function scaleIsProportional(eventData, fabricObject) { - var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey, - uniformIsToggled = eventData[uniScaleKey]; - return (canvas.uniformScaling && !uniformIsToggled) || - (!canvas.uniformScaling && uniformIsToggled); - } - - /** - * Checks if transform is centered - * @param {Object} transform transform data - * @return {Boolean} true if transform is centered - */ - function isTransformCentered(transform) { - return transform.originX === CENTER && transform.originY === CENTER; - } - - /** - * Inspect fabricObject to understand if the current scaling action is allowed - * @param {fabric.Object} fabricObject the fabric object about to scale - * @param {String} by 'x' or 'y' or '' - * @param {Boolean} scaleProportionally true if we are trying to scale proportionally - * @return {Boolean} true if scaling is not allowed at current conditions - */ - function scalingIsForbidden(fabricObject, by, scaleProportionally) { - var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY; - if (lockX && lockY) { - return true; - } - if (!by && (lockX || lockY) && scaleProportionally) { - return true; - } - if (lockX && by === 'x') { - return true; - } - if (lockY && by === 'y') { - return true; - } - return false; - } - - /** - * return the correct cursor style for the scale action - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function scaleCursorStyleHandler(eventData, control, fabricObject) { - var notAllowed = 'not-allowed', - scaleProportionally = scaleIsProportional(eventData, fabricObject), - by = ''; - if (control.x !== 0 && control.y === 0) { - by = 'x'; - } - else if (control.x === 0 && control.y !== 0) { - by = 'y'; - } - if (scalingIsForbidden(fabricObject, by, scaleProportionally)) { - return notAllowed; - } - var n = findCornerQuadrant(fabricObject, control); - return scaleMap[n] + '-resize'; - } - - /** - * return the correct cursor style for the skew action - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function skewCursorStyleHandler(eventData, control, fabricObject) { - var notAllowed = 'not-allowed'; - if (control.x !== 0 && fabricObject.lockSkewingY) { - return notAllowed; - } - if (control.y !== 0 && fabricObject.lockSkewingX) { - return notAllowed; - } - var n = findCornerQuadrant(fabricObject, control) % 4; - return skewMap[n] + '-resize'; - } - - /** - * Combine skew and scale style handlers to cover fabric standard use case - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function scaleSkewCursorStyleHandler(eventData, control, fabricObject) { - if (eventData[fabricObject.canvas.altActionKey]) { - return controls.skewCursorStyleHandler(eventData, control, fabricObject); - } - return controls.scaleCursorStyleHandler(eventData, control, fabricObject); - } - - /** - * Inspect event, control and fabricObject to return the correct action name - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} an action name - */ - function scaleOrSkewActionName(eventData, control, fabricObject) { - var isAlternative = eventData[fabricObject.canvas.altActionKey]; - if (control.x === 0) { - // then is scaleY or skewX - return isAlternative ? 'skewX' : 'scaleY'; - } - if (control.y === 0) { - // then is scaleY or skewX - return isAlternative ? 'skewY' : 'scaleX'; - } - } - - /** - * Find the correct style for the control that is used for rotation. - * this function is very simple and it just take care of not-allowed or standard cursor - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function rotationStyleHandler(eventData, control, fabricObject) { - if (fabricObject.lockRotation) { - return 'not-allowed'; - } - return control.cursorStyle; - } - - function commonEventInfo(eventData, transform, x, y) { - return { - e: eventData, - transform: transform, - pointer: { - x: x, - y: y, - } - }; - } - - /** - * Wrap an action handler with saving/restoring object position on the transform. - * this is the code that permits to objects to keep their position while transforming. - * @param {Function} actionHandler the function to wrap - * @return {Function} a function with an action handler signature - */ - function wrapWithFixedAnchor(actionHandler) { - return function(eventData, transform, x, y) { - var target = transform.target, centerPoint = target.getCenterPoint(), - constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY), - actionPerformed = actionHandler(eventData, transform, x, y); - target.setPositionByOrigin(constraint, transform.originX, transform.originY); - return actionPerformed; - }; - } - - /** - * Wrap an action handler with firing an event if the action is performed - * @param {Function} actionHandler the function to wrap - * @return {Function} a function with an action handler signature - */ - function wrapWithFireEvent(eventName, actionHandler) { - return function(eventData, transform, x, y) { - var actionPerformed = actionHandler(eventData, transform, x, y); - if (actionPerformed) { - fireEvent(eventName, commonEventInfo(eventData, transform, x, y)); - } - return actionPerformed; - }; - } - - /** - * Transforms a point described by x and y in a distance from the top left corner of the object - * bounding box. - * @param {Object} transform - * @param {String} originX - * @param {String} originY - * @param {number} x - * @param {number} y - * @return {Fabric.Point} the normalized point - */ - function getLocalPoint(transform, originX, originY, x, y) { - var target = transform.target, - control = target.controls[transform.corner], - zoom = target.canvas.getZoom(), - padding = target.padding / zoom, - localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY); - if (localPoint.x >= padding) { - localPoint.x -= padding; - } - if (localPoint.x <= -padding) { - localPoint.x += padding; - } - if (localPoint.y >= padding) { - localPoint.y -= padding; - } - if (localPoint.y <= padding) { - localPoint.y += padding; - } - localPoint.x -= control.offsetX; - localPoint.y -= control.offsetY; - return localPoint; - } - - /** - * Detect if the fabric object is flipped on one side. - * @param {fabric.Object} target - * @return {Boolean} true if one flip, but not two. - */ - function targetHasOneFlip(target) { - return target.flipX !== target.flipY; - } - - /** - * Utility function to compensate the scale factor when skew is applied on both axes - * @private - */ - function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) { - if (target[oppositeSkew] !== 0) { - var newDim = target._getTransformedDimensions()[axis]; - var newValue = reference / newDim * target[scaleToCompensate]; - target.set(scaleToCompensate, newValue); - } - } - - /** - * Action handler for skewing on the X axis - * @private - */ - function skewObjectX(eventData, transform, x, y) { - var target = transform.target, - // find how big the object would be, if there was no skewX. takes in account scaling - dimNoSkew = target._getTransformedDimensions(0, target.skewY), - localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - // the mouse is in the center of the object, and we want it to stay there. - // so the object will grow twice as much as the mouse. - // this makes the skew growth to localPoint * 2 - dimNoSkew. - totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x, - currentSkew = target.skewX, newSkew; - if (totalSkewSize < 2) { - // let's make it easy to go back to position 0. - newSkew = 0; - } - else { - newSkew = radiansToDegrees( - Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY)) - ); - // now we have to find the sign of the skew. - // it mostly depend on the origin of transformation. - if (transform.originX === LEFT && transform.originY === BOTTOM) { - newSkew = -newSkew; - } - if (transform.originX === RIGHT && transform.originY === TOP) { - newSkew = -newSkew; - } - if (targetHasOneFlip(target)) { - newSkew = -newSkew; - } - } - var hasSkewed = currentSkew !== newSkew; - if (hasSkewed) { - var dimBeforeSkewing = target._getTransformedDimensions().y; - target.set('skewX', newSkew); - compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing); - } - return hasSkewed; - } - - /** - * Action handler for skewing on the Y axis - * @private - */ - function skewObjectY(eventData, transform, x, y) { - var target = transform.target, - // find how big the object would be, if there was no skewX. takes in account scaling - dimNoSkew = target._getTransformedDimensions(target.skewX, 0), - localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - // the mouse is in the center of the object, and we want it to stay there. - // so the object will grow twice as much as the mouse. - // this makes the skew growth to localPoint * 2 - dimNoSkew. - totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y, - currentSkew = target.skewY, newSkew; - if (totalSkewSize < 2) { - // let's make it easy to go back to position 0. - newSkew = 0; - } - else { - newSkew = radiansToDegrees( - Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX)) - ); - // now we have to find the sign of the skew. - // it mostly depend on the origin of transformation. - if (transform.originX === LEFT && transform.originY === BOTTOM) { - newSkew = -newSkew; - } - if (transform.originX === RIGHT && transform.originY === TOP) { - newSkew = -newSkew; - } - if (targetHasOneFlip(target)) { - newSkew = -newSkew; - } - } - var hasSkewed = currentSkew !== newSkew; - if (hasSkewed) { - var dimBeforeSkewing = target._getTransformedDimensions().x; - target.set('skewY', newSkew); - compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing); - } - return hasSkewed; - } - - /** - * Wrapped Action handler for skewing on the Y axis, takes care of the - * skew direction and determine the correct transform origin for the anchor point - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function skewHandlerX(eventData, transform, x, y) { - // step1 figure out and change transform origin. - // if skewX > 0 and originY bottom we anchor on right - // if skewX > 0 and originY top we anchor on left - // if skewX < 0 and originY bottom we anchor on left - // if skewX < 0 and originY top we anchor on right - // if skewX is 0, we look for mouse position to understand where are we going. - var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY; - if (target.lockSkewingX) { - return false; - } - if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); - if (localPointFromCenter.x > 0) { - // we are pulling right, anchor left; - originX = LEFT; - } - else { - // we are pulling right, anchor right - originX = RIGHT; - } - } - else { - if (currentSkew > 0) { - originX = originY === TOP ? LEFT : RIGHT; - } - if (currentSkew < 0) { - originX = originY === TOP ? RIGHT : LEFT; - } - // is the object flipped on one side only? swap the origin. - if (targetHasOneFlip(target)) { - originX = originX === LEFT ? RIGHT : LEFT; - } - } - - // once we have the origin, we find the anchor point - transform.originX = originX; - var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX)); - return finalHandler(eventData, transform, x, y); - } - - /** - * Wrapped Action handler for skewing on the Y axis, takes care of the - * skew direction and determine the correct transform origin for the anchor point - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function skewHandlerY(eventData, transform, x, y) { - // step1 figure out and change transform origin. - // if skewY > 0 and originX left we anchor on top - // if skewY > 0 and originX right we anchor on bottom - // if skewY < 0 and originX left we anchor on bottom - // if skewY < 0 and originX right we anchor on top - // if skewY is 0, we look for mouse position to understand where are we going. - var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX; - if (target.lockSkewingY) { - return false; - } - if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); - if (localPointFromCenter.y > 0) { - // we are pulling down, anchor up; - originY = TOP; - } - else { - // we are pulling up, anchor down - originY = BOTTOM; - } - } - else { - if (currentSkew > 0) { - originY = originX === LEFT ? TOP : BOTTOM; - } - if (currentSkew < 0) { - originY = originX === LEFT ? BOTTOM : TOP; - } - // is the object flipped on one side only? swap the origin. - if (targetHasOneFlip(target)) { - originY = originY === TOP ? BOTTOM : TOP; - } - } - - // once we have the origin, we find the anchor point - transform.originY = originY; - var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY)); - return finalHandler(eventData, transform, x, y); - } - - /** - * Action handler for rotation and snapping, without anchor point. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - * @private - */ - function rotationWithSnapping(eventData, transform, x, y) { - var t = transform, - target = t.target, - pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY); - - if (target.lockRotation) { - return false; - } - - var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x), - curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x), - angle = radiansToDegrees(curAngle - lastAngle + t.theta), - hasRotated = true; - - if (target.snapAngle > 0) { - var snapAngle = target.snapAngle, - snapThreshold = target.snapThreshold || snapAngle, - rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle, - leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle; - - if (Math.abs(angle - leftAngleLocked) < snapThreshold) { - angle = leftAngleLocked; - } - else if (Math.abs(angle - rightAngleLocked) < snapThreshold) { - angle = rightAngleLocked; - } - } - - // normalize angle to positive value - if (angle < 0) { - angle = 360 + angle; - } - angle %= 360; - - hasRotated = target.angle !== angle; - target.angle = angle; - return hasRotated; - } - - /** - * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @param {Object} options additional information for scaling - * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling - * @return {Boolean} true if some change happened - * @private - */ - function scaleObject(eventData, transform, x, y, options) { - options = options || {}; - var target = transform.target, - lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY, - by = options.by, newPoint, scaleX, scaleY, dim, - scaleProportionally = scaleIsProportional(eventData, target), - forbidScaling = scalingIsForbidden(target, by, scaleProportionally), - signX, signY, gestureScale = transform.gestureScale; - - if (forbidScaling) { - return false; - } - if (gestureScale) { - scaleX = transform.scaleX * gestureScale; - scaleY = transform.scaleY * gestureScale; - } - else { - newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y); - // use of sign: We use sign to detect change of direction of an action. sign usually change when - // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling - // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily - // cross many time the origin point and flip the object. so we need a way to filter out the noise. - // This ternary here should be ok to filter out X scaling when we want Y only and vice versa. - signX = by !== 'y' ? sign(newPoint.x) : 1; - signY = by !== 'x' ? sign(newPoint.y) : 1; - if (!transform.signX) { - transform.signX = signX; - } - if (!transform.signY) { - transform.signY = signY; - } - - if (target.lockScalingFlip && - (transform.signX !== signX || transform.signY !== signY) - ) { - return false; - } - - dim = target._getTransformedDimensions(); - // missing detection of flip and logic to switch the origin - if (scaleProportionally && !by) { - // uniform scaling - var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y), - original = transform.original, - originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) + - Math.abs(dim.y * original.scaleY / target.scaleY), - scale = distance / originalDistance; - scaleX = original.scaleX * scale; - scaleY = original.scaleY * scale; - } - else { - scaleX = Math.abs(newPoint.x * target.scaleX / dim.x); - scaleY = Math.abs(newPoint.y * target.scaleY / dim.y); - } - // if we are scaling by center, we need to double the scale - if (isTransformCentered(transform)) { - scaleX *= 2; - scaleY *= 2; - } - if (transform.signX !== signX && by !== 'y') { - transform.originX = opposite[transform.originX]; - scaleX *= -1; - transform.signX = signX; - } - if (transform.signY !== signY && by !== 'x') { - transform.originY = opposite[transform.originY]; - scaleY *= -1; - transform.signY = signY; - } - } - // minScale is taken are in the setter. - var oldScaleX = target.scaleX, oldScaleY = target.scaleY; - if (!by) { - !lockScalingX && target.set('scaleX', scaleX); - !lockScalingY && target.set('scaleY', scaleY); - } - else { - // forbidden cases already handled on top here. - by === 'x' && target.set('scaleX', scaleX); - by === 'y' && target.set('scaleY', scaleY); - } - return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY; - } - - /** - * Generic scaling logic, to scale from corners either equally or freely. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectFromCorner(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y); - } - - /** - * Scaling logic for the X axis. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectX(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y , { by: 'x' }); - } - - /** - * Scaling logic for the Y axis. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectY(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y , { by: 'y' }); - } - - /** - * Composed action handler to either scale Y or skew X - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scalingYOrSkewingX(eventData, transform, x, y) { - // ok some safety needed here. - if (eventData[transform.target.canvas.altActionKey]) { - return controls.skewHandlerX(eventData, transform, x, y); - } - return controls.scalingY(eventData, transform, x, y); - } - - /** - * Composed action handler to either scale X or skew Y - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scalingXOrSkewingY(eventData, transform, x, y) { - // ok some safety needed here. - if (eventData[transform.target.canvas.altActionKey]) { - return controls.skewHandlerY(eventData, transform, x, y); - } - return controls.scalingX(eventData, transform, x, y); - } - - /** - * Action handler to change textbox width - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function changeWidth(eventData, transform, x, y) { - var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1), - multiplier = isTransformCentered(transform) ? 2 : 1, - oldWidth = target.width, - newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding; - target.set('width', Math.max(newWidth, 0)); - return oldWidth !== newWidth; - } - - /** - * Action handler - * @private - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if the translation occurred - */ - function dragHandler(eventData, transform, x, y) { - var target = transform.target, - newLeft = x - transform.offsetX, - newTop = y - transform.offsetY, - moveX = !target.get('lockMovementX') && target.left !== newLeft, - moveY = !target.get('lockMovementY') && target.top !== newTop; - moveX && target.set('left', newLeft); - moveY && target.set('top', newTop); - if (moveX || moveY) { - fireEvent('moving', commonEventInfo(eventData, transform, x, y)); - } - return moveX || moveY; - } - - controls.scaleCursorStyleHandler = scaleCursorStyleHandler; - controls.skewCursorStyleHandler = skewCursorStyleHandler; - controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler; - controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping)); - controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner)); - controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX)); - controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY)); - controls.scalingYOrSkewingX = scalingYOrSkewingX; - controls.scalingXOrSkewingY = scalingXOrSkewingY; - controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth)); - controls.skewHandlerX = skewHandlerX; - controls.skewHandlerY = skewHandlerY; - controls.dragHandler = dragHandler; - controls.scaleOrSkewActionName = scaleOrSkewActionName; - controls.rotationStyleHandler = rotationStyleHandler; - controls.fireEvent = fireEvent; - controls.wrapWithFixedAnchor = wrapWithFixedAnchor; - controls.wrapWithFireEvent = wrapWithFireEvent; - controls.getLocalPoint = getLocalPoint; - fabric.controlsUtils = controls; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - degreesToRadians = fabric.util.degreesToRadians, - controls = fabric.controlsUtils; - - /** - * Render a round control, as per fabric features. - * This function is written to respect object properties like transparentCorners, cornerSize - * cornerColor, cornerStrokeColor - * plus the addition of offsetY and offsetX. - * @param {CanvasRenderingContext2D} ctx context to render on - * @param {Number} left x coordinate where the control center should be - * @param {Number} top y coordinate where the control center should be - * @param {Object} styleOverride override for fabric.Object controls style - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - */ - function renderCircleControl (ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, - ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, - transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? - styleOverride.transparentCorners : fabricObject.transparentCorners, - methodName = transparentCorners ? 'stroke' : 'fill', - stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor), - myLeft = left, - myTop = top, size; - ctx.save(); - ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; - ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; - // as soon as fabric react v5, remove ie11, use proper ellipse code. - if (xSize > ySize) { - size = xSize; - ctx.scale(1.0, ySize / xSize); - myTop = top * xSize / ySize; - } - else if (ySize > xSize) { - size = ySize; - ctx.scale(xSize / ySize, 1.0); - myLeft = left * ySize / xSize; - } - else { - size = xSize; - } - // this is still wrong - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false); - ctx[methodName](); - if (stroke) { - ctx.stroke(); - } - ctx.restore(); - } - - /** - * Render a square control, as per fabric features. - * This function is written to respect object properties like transparentCorners, cornerSize - * cornerColor, cornerStrokeColor - * plus the addition of offsetY and offsetX. - * @param {CanvasRenderingContext2D} ctx context to render on - * @param {Number} left x coordinate where the control center should be - * @param {Number} top y coordinate where the control center should be - * @param {Object} styleOverride override for fabric.Object controls style - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - */ - function renderSquareControl(ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, - ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, - transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? - styleOverride.transparentCorners : fabricObject.transparentCorners, - methodName = transparentCorners ? 'stroke' : 'fill', - stroke = !transparentCorners && ( - styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor - ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2; - ctx.save(); - ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; - ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; - // this is still wrong - ctx.lineWidth = 1; - ctx.translate(left, top); - ctx.rotate(degreesToRadians(fabricObject.angle)); - // this does not work, and fixed with ( && ) does not make sense. - // to have real transparent corners we need the controls on upperCanvas - // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize); - ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize); - if (stroke) { - ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize); - } - ctx.restore(); - } - - controls.renderCircleControl = renderCircleControl; - controls.renderSquareControl = renderSquareControl; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - function Control(options) { - for (var i in options) { - this[i] = options[i]; - } - } - - fabric.Control = Control; - - fabric.Control.prototype = /** @lends fabric.Control.prototype */ { - - /** - * keep track of control visibility. - * mainly for backward compatibility. - * if you do not want to see a control, you can remove it - * from the controlset. - * @type {Boolean} - * @default true - */ - visible: true, - - /** - * Name of the action that the control will likely execute. - * This is optional. FabricJS uses to identify what the user is doing for some - * extra optimizations. If you are writing a custom control and you want to know - * somewhere else in the code what is going on, you can use this string here. - * you can also provide a custom getActionName if your control run multiple actions - * depending on some external state. - * default to scale since is the most common, used on 4 corners by default - * @type {String} - * @default 'scale' - */ - actionName: 'scale', - - /** - * Drawing angle of the control. - * NOT used for now, but name marked as needed for internal logic - * example: to reuse the same drawing function for different rotated controls - * @type {Number} - * @default 0 - */ - angle: 0, - - /** - * Relative position of the control. X - * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities - * of the bounding box. - * @type {Number} - * @default 0 - */ - x: 0, - - /** - * Relative position of the control. Y - * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities - * of the bounding box. - * @type {Number} - * @default 0 - */ - y: 0, - - /** - * Horizontal offset of the control from the defined position. In pixels - * Positive offset moves the control to the right, negative to the left. - * It used when you want to have position of control that does not scale with - * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on - * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will - * stay 30 pixels no matter how the object is big. Another example is having 2 - * controls in the corner, that stay in the same position when the object scale. - * of the bounding box. - * @type {Number} - * @default 0 - */ - offsetX: 0, - - /** - * Vertical offset of the control from the defined position. In pixels - * Positive offset moves the control to the bottom, negative to the top. - * @type {Number} - * @default 0 - */ - offsetY: 0, - - /** - * Sets the length of the control. If null, defaults to object's cornerSize. - * Expects both sizeX and sizeY to be set when set. - * @type {?Number} - * @default null - */ - sizeX: null, - - /** - * Sets the height of the control. If null, defaults to object's cornerSize. - * Expects both sizeX and sizeY to be set when set. - * @type {?Number} - * @default null - */ - sizeY: null, - - /** - * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize. - * Expects both touchSizeX and touchSizeY to be set when set. - * @type {?Number} - * @default null - */ - touchSizeX: null, - - /** - * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize. - * Expects both touchSizeX and touchSizeY to be set when set. - * @type {?Number} - * @default null - */ - touchSizeY: null, - - /** - * Css cursor style to display when the control is hovered. - * if the method `cursorStyleHandler` is provided, this property is ignored. - * @type {String} - * @default 'crosshair' - */ - cursorStyle: 'crosshair', - - /** - * If controls has an offsetY or offsetX, draw a line that connects - * the control to the bounding box - * @type {Boolean} - * @default false - */ - withConnection: false, - - /** - * The control actionHandler, provide one to handle action ( control being moved ) - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - actionHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * The control handler for mouse down, provide one to handle mouse down on control - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - mouseDownHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * The control mouseUpHandler, provide one to handle an effect on mouse up. - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - mouseUpHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * Returns control actionHandler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getActionHandler: function(/* eventData, fabricObject, control */) { - return this.actionHandler; - }, - - /** - * Returns control mouseDown handler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getMouseDownHandler: function(/* eventData, fabricObject, control */) { - return this.mouseDownHandler; - }, - - /** - * Returns control mouseUp handler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getMouseUpHandler: function(/* eventData, fabricObject, control */) { - return this.mouseUpHandler; - }, - - /** - * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate - * function you can pass one in the constructor - * the cursorStyle property - * @param {Event} eventData the native mouse event - * @param {fabric.Control} control the current control ( likely this) - * @param {fabric.Object} object on which the control is displayed - * @return {String} - */ - cursorStyleHandler: function(eventData, control /* fabricObject */) { - return control.cursorStyle; - }, - - /** - * Returns the action name. The basic implementation just return the actionName property. - * @param {Event} eventData the native mouse event - * @param {fabric.Control} control the current control ( likely this) - * @param {fabric.Object} object on which the control is displayed - * @return {String} - */ - getActionName: function(eventData, control /* fabricObject */) { - return control.actionName; - }, - - /** - * Returns controls visibility - * @param {fabric.Object} object on which the control is displayed - * @param {String} controlKey key where the control is memorized on the - * @return {Boolean} - */ - getVisibility: function(fabricObject, controlKey) { - var objectVisibility = fabricObject._controlsVisibility; - if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') { - return objectVisibility[controlKey]; - } - return this.visible; - }, - - /** - * Sets controls visibility - * @param {Boolean} visibility for the object - * @return {Void} - */ - setVisibility: function(visibility /* name, fabricObject */) { - this.visible = visibility; - }, - - - positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) { - var point = fabric.util.transformPoint({ - x: this.x * dim.x + this.offsetX, - y: this.y * dim.y + this.offsetY }, finalMatrix); - return point; - }, - - /** - * Returns the coords for this control based on object values. - * @param {Number} objectAngle angle from the fabric object holding the control - * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if - * isTouch is true) - * @param {Number} centerX x coordinate where the control center should be - * @param {Number} centerY y coordinate where the control center should be - * @param {boolean} isTouch true if touch corner, false if normal corner - */ - calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) { - var cosHalfOffset, - sinHalfOffset, - cosHalfOffsetComp, - sinHalfOffsetComp, - xSize = (isTouch) ? this.touchSizeX : this.sizeX, - ySize = (isTouch) ? this.touchSizeY : this.sizeY; - if (xSize && ySize && xSize !== ySize) { - // handle rectangular corners - var controlTriangleAngle = Math.atan2(ySize, xSize); - var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2; - var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); - var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); - cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta); - sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta); - // use complementary angle for two corners - cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp); - sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp); - } - else { - // handle square corners - // use default object corner size unless size is defined - var cornerSize = (xSize && ySize) ? xSize : objectCornerSize; - /* 0.7071067812 stands for sqrt(2)/2 */ - cornerHypotenuse = cornerSize * 0.7071067812; - // complementary angles are equal since they're both 45 degrees - var newTheta = fabric.util.degreesToRadians(45 - objectAngle); - cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta); - sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta); - } - - return { - tl: { - x: centerX - sinHalfOffsetComp, - y: centerY - cosHalfOffsetComp, - }, - tr: { - x: centerX + cosHalfOffset, - y: centerY - sinHalfOffset, - }, - bl: { - x: centerX - cosHalfOffset, - y: centerY + sinHalfOffset, - }, - br: { - x: centerX + sinHalfOffsetComp, - y: centerY + cosHalfOffsetComp, - }, - }; - }, - - /** - * Render function for the control. - * When this function runs the context is unscaled. unrotate. Just retina scaled. - * all the functions will have to translate to the point left,top before starting Drawing - * if they want to draw a control where the position is detected. - * left and top are the result of the positionHandler function - * @param {RenderingContext2D} ctx the context where the control will be drawn - * @param {Number} left position of the canvas where we are about to render the control. - * @param {Number} top position of the canvas where we are about to render the control. - * @param {Object} styleOverride - * @param {fabric.Object} fabricObject the object where the control is about to be rendered - */ - render: function(ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - switch (styleOverride.cornerStyle || fabricObject.cornerStyle) { - case 'circle': - fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject); - break; - default: - fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject); - } - }, - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - /* _FROM_SVG_START_ */ - function getColorStop(el, multiplier) { - var style = el.getAttribute('style'), - offset = el.getAttribute('offset') || 0, - color, colorAlpha, opacity, i; - - // convert percents to absolute values - offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1); - offset = offset < 0 ? 0 : offset > 1 ? 1 : offset; - if (style) { - var keyValuePairs = style.split(/\s*;\s*/); - - if (keyValuePairs[keyValuePairs.length - 1] === '') { - keyValuePairs.pop(); - } - - for (i = keyValuePairs.length; i--; ) { - - var split = keyValuePairs[i].split(/\s*:\s*/), - key = split[0].trim(), - value = split[1].trim(); - - if (key === 'stop-color') { - color = value; - } - else if (key === 'stop-opacity') { - opacity = value; - } - } - } - - if (!color) { - color = el.getAttribute('stop-color') || 'rgb(0,0,0)'; - } - if (!opacity) { - opacity = el.getAttribute('stop-opacity'); - } - - color = new fabric.Color(color); - colorAlpha = color.getAlpha(); - opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity); - opacity *= colorAlpha * multiplier; - - return { - offset: offset, - color: color.toRgb(), - opacity: opacity - }; - } - - function getLinearCoords(el) { - return { - x1: el.getAttribute('x1') || 0, - y1: el.getAttribute('y1') || 0, - x2: el.getAttribute('x2') || '100%', - y2: el.getAttribute('y2') || 0 - }; - } - - function getRadialCoords(el) { - return { - x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%', - y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%', - r1: 0, - x2: el.getAttribute('cx') || '50%', - y2: el.getAttribute('cy') || '50%', - r2: el.getAttribute('r') || '50%' - }; - } - /* _FROM_SVG_END_ */ - - var clone = fabric.util.object.clone; - - /** - * Gradient class - * @class fabric.Gradient - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients} - * @see {@link fabric.Gradient#initialize} for constructor definition - */ - fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ { - - /** - * Horizontal offset for aligning gradients coming from SVG when outside pathgroups - * @type Number - * @default 0 - */ - offsetX: 0, - - /** - * Vertical offset for aligning gradients coming from SVG when outside pathgroups - * @type Number - * @default 0 - */ - offsetY: 0, - - /** - * A transform matrix to apply to the gradient before painting. - * Imported from svg gradients, is not applied with the current transform in the center. - * Before this transform is applied, the origin point is at the top left corner of the object - * plus the addition of offsetY and offsetX. - * @type Number[] - * @default null - */ - gradientTransform: null, - - /** - * coordinates units for coords. - * If `pixels`, the number of coords are in the same unit of width / height. - * If set as `percentage` the coords are still a number, but 1 means 100% of width - * for the X and 100% of the height for the y. It can be bigger than 1 and negative. - * allowed values pixels or percentage. - * @type String - * @default 'pixels' - */ - gradientUnits: 'pixels', - - /** - * Gradient type linear or radial - * @type String - * @default 'pixels' - */ - type: 'linear', - - /** - * Constructor - * @param {Object} options Options object with type, coords, gradientUnits and colorStops - * @param {Object} [options.type] gradient type linear or radial - * @param {Object} [options.gradientUnits] gradient units - * @param {Object} [options.offsetX] SVG import compatibility - * @param {Object} [options.offsetY] SVG import compatibility - * @param {Object[]} options.colorStops contains the colorstops. - * @param {Object} options.coords contains the coords of the gradient - * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial - * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial - * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial - * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial - * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle - * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle - * @return {fabric.Gradient} thisArg - */ - initialize: function(options) { - options || (options = { }); - options.coords || (options.coords = { }); - - var coords, _this = this; - - // sets everything, then coords and colorstops get sets again - Object.keys(options).forEach(function(option) { - _this[option] = options[option]; - }); - - if (this.id) { - this.id += '_' + fabric.Object.__uid++; - } - else { - this.id = fabric.Object.__uid++; - } - - coords = { - x1: options.coords.x1 || 0, - y1: options.coords.y1 || 0, - x2: options.coords.x2 || 0, - y2: options.coords.y2 || 0 - }; - - if (this.type === 'radial') { - coords.r1 = options.coords.r1 || 0; - coords.r2 = options.coords.r2 || 0; - } - - this.coords = coords; - this.colorStops = options.colorStops.slice(); - }, - - /** - * Adds another colorStop - * @param {Object} colorStop Object with offset and color - * @return {fabric.Gradient} thisArg - */ - addColorStop: function(colorStops) { - for (var position in colorStops) { - var color = new fabric.Color(colorStops[position]); - this.colorStops.push({ - offset: parseFloat(position), - color: color.toRgb(), - opacity: color.getAlpha() - }); - } - return this; - }, - - /** - * Returns object representation of a gradient - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} - */ - toObject: function(propertiesToInclude) { - var object = { - type: this.type, - coords: this.coords, - colorStops: this.colorStops, - offsetX: this.offsetX, - offsetY: this.offsetY, - gradientUnits: this.gradientUnits, - gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); - - return object; - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of an gradient - * @param {Object} object Object to create a gradient for - * @return {String} SVG representation of an gradient (linear/radial) - */ - toSVG: function(object, options) { - var coords = clone(this.coords, true), i, len, options = options || {}, - markup, commonAttributes, colorStops = clone(this.colorStops, true), - needsSwap = coords.r1 > coords.r2, - transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(), - offsetX = -this.offsetX, offsetY = -this.offsetY, - withViewport = !!options.additionalTransform, - gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox'; - // colorStops must be sorted ascending - colorStops.sort(function(a, b) { - return a.offset - b.offset; - }); - - if (gradientUnits === 'objectBoundingBox') { - offsetX /= object.width; - offsetY /= object.height; - } - else { - offsetX += object.width / 2; - offsetY += object.height / 2; - } - if (object.type === 'path' && this.gradientUnits !== 'percentage') { - offsetX -= object.pathOffset.x; - offsetY -= object.pathOffset.y; - } - - - transform[4] -= offsetX; - transform[5] -= offsetY; - - commonAttributes = 'id="SVGID_' + this.id + - '" gradientUnits="' + gradientUnits + '"'; - commonAttributes += ' gradientTransform="' + (withViewport ? - options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '" '; - - if (this.type === 'linear') { - markup = [ - '\n' - ]; - } - else if (this.type === 'radial') { - // svg radial gradient has just 1 radius. the biggest. - markup = [ - '\n' - ]; - } - - if (this.type === 'radial') { - if (needsSwap) { - // svg goes from internal to external radius. if radius are inverted, swap color stops. - colorStops = colorStops.concat(); - colorStops.reverse(); - for (i = 0, len = colorStops.length; i < len; i++) { - colorStops[i].offset = 1 - colorStops[i].offset; - } - } - var minRadius = Math.min(coords.r1, coords.r2); - if (minRadius > 0) { - // i have to shift all colorStops and add new one in 0. - var maxRadius = Math.max(coords.r1, coords.r2), - percentageShift = minRadius / maxRadius; - for (i = 0, len = colorStops.length; i < len; i++) { - colorStops[i].offset += percentageShift * (1 - colorStops[i].offset); - } - } - } - - for (i = 0, len = colorStops.length; i < len; i++) { - var colorStop = colorStops[i]; - markup.push( - '\n' - ); - } - - markup.push((this.type === 'linear' ? '\n' : '\n')); - - return markup.join(''); - }, - /* _TO_SVG_END_ */ - - /** - * Returns an instance of CanvasGradient - * @param {CanvasRenderingContext2D} ctx Context to render on - * @return {CanvasGradient} - */ - toLive: function(ctx) { - var gradient, coords = fabric.util.object.clone(this.coords), i, len; - - if (!this.type) { - return; - } - - if (this.type === 'linear') { - gradient = ctx.createLinearGradient( - coords.x1, coords.y1, coords.x2, coords.y2); - } - else if (this.type === 'radial') { - gradient = ctx.createRadialGradient( - coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2); - } - - for (i = 0, len = this.colorStops.length; i < len; i++) { - var color = this.colorStops[i].color, - opacity = this.colorStops[i].opacity, - offset = this.colorStops[i].offset; - - if (typeof opacity !== 'undefined') { - color = new fabric.Color(color).setAlpha(opacity).toRgba(); - } - gradient.addColorStop(offset, color); - } - - return gradient; - } - }); - - fabric.util.object.extend(fabric.Gradient, { - - /* _FROM_SVG_START_ */ - /** - * Returns {@link fabric.Gradient} instance from an SVG element - * @static - * @memberOf fabric.Gradient - * @param {SVGGradientElement} el SVG gradient element - * @param {fabric.Object} instance - * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity. - * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients - * that uses gradientUnits as 'userSpaceOnUse' and percentages. - * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg - * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg - * @param {Object.number} width width part of the svg tag if viewBox is not specified - * @param {Object.number} height height part of the svg tag if viewBox is not specified - * @return {fabric.Gradient} Gradient instance - * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement - * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement - */ - fromElement: function(el, instance, opacityAttr, svgOptions) { - /** - * @example: - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * - */ - - var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1); - multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier; - if (isNaN(multiplier)) { - multiplier = 1; - } - - var colorStopEls = el.getElementsByTagName('stop'), - type, - gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ? - 'pixels' : 'percentage', - gradientTransform = el.getAttribute('gradientTransform') || '', - colorStops = [], - coords, i, offsetX = 0, offsetY = 0, - transformMatrix; - if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') { - type = 'linear'; - coords = getLinearCoords(el); - } - else { - type = 'radial'; - coords = getRadialCoords(el); - } - - for (i = colorStopEls.length; i--; ) { - colorStops.push(getColorStop(colorStopEls[i], multiplier)); - } - - transformMatrix = fabric.parseTransformAttribute(gradientTransform); - - __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits); - - if (gradientUnits === 'pixels') { - offsetX = -instance.left; - offsetY = -instance.top; - } - - var gradient = new fabric.Gradient({ - id: el.getAttribute('id'), - type: type, - coords: coords, - colorStops: colorStops, - gradientUnits: gradientUnits, - gradientTransform: transformMatrix, - offsetX: offsetX, - offsetY: offsetY, - }); - - return gradient; - } - /* _FROM_SVG_END_ */ - }); - - /** - * @private - */ - function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) { - var propValue, finalValue; - Object.keys(options).forEach(function(prop) { - propValue = options[prop]; - if (propValue === 'Infinity') { - finalValue = 1; - } - else if (propValue === '-Infinity') { - finalValue = 0; - } - else { - finalValue = parseFloat(options[prop], 10); - if (typeof propValue === 'string' && /^(\d+\.\d+)%|(\d+)%$/.test(propValue)) { - finalValue *= 0.01; - if (gradientUnits === 'pixels') { - // then we need to fix those percentages here in svg parsing - if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - finalValue *= svgOptions.viewBoxWidth || svgOptions.width; - } - if (prop === 'y1' || prop === 'y2') { - finalValue *= svgOptions.viewBoxHeight || svgOptions.height; - } - } - } - } - options[prop] = finalValue; - }); - } -})(); - - -(function() { - - 'use strict'; - - var toFixed = fabric.util.toFixed; - - /** - * Pattern class - * @class fabric.Pattern - * @see {@link http://fabricjs.com/patterns|Pattern demo} - * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo} - * @see {@link fabric.Pattern#initialize} for constructor definition - */ - - - fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ { - - /** - * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat) - * @type String - * @default - */ - repeat: 'repeat', - - /** - * Pattern horizontal offset from object's left/top corner - * @type Number - * @default - */ - offsetX: 0, - - /** - * Pattern vertical offset from object's left/top corner - * @type Number - * @default - */ - offsetY: 0, - - /** - * crossOrigin value (one of "", "anonymous", "use-credentials") - * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes - * @type String - * @default - */ - crossOrigin: '', - - /** - * transform matrix to change the pattern, imported from svgs. - * @type Array - * @default - */ - patternTransform: null, - - /** - * Constructor - * @param {Object} [options] Options object - * @param {Function} [callback] function to invoke after callback init. - * @return {fabric.Pattern} thisArg - */ - initialize: function(options, callback) { - options || (options = { }); - - this.id = fabric.Object.__uid++; - this.setOptions(options); - if (!options.source || (options.source && typeof options.source !== 'string')) { - callback && callback(this); - return; - } - else { - // img src string - var _this = this; - this.source = fabric.util.createImage(); - fabric.util.loadImage(options.source, function(img, isError) { - _this.source = img; - callback && callback(_this, isError); - }, null, this.crossOrigin); - } - }, - - /** - * Returns object representation of a pattern - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of a pattern instance - */ - toObject: function(propertiesToInclude) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - source, object; - - // element - if (typeof this.source.src === 'string') { - source = this.source.src; - } - // element - else if (typeof this.source === 'object' && this.source.toDataURL) { - source = this.source.toDataURL(); - } - - object = { - type: 'pattern', - source: source, - repeat: this.repeat, - crossOrigin: this.crossOrigin, - offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS), - offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS), - patternTransform: this.patternTransform ? this.patternTransform.concat() : null - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); - - return object; - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of a pattern - * @param {fabric.Object} object - * @return {String} SVG representation of a pattern - */ - toSVG: function(object) { - var patternSource = typeof this.source === 'function' ? this.source() : this.source, - patternWidth = patternSource.width / object.width, - patternHeight = patternSource.height / object.height, - patternOffsetX = this.offsetX / object.width, - patternOffsetY = this.offsetY / object.height, - patternImgSrc = ''; - if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') { - patternHeight = 1; - if (patternOffsetY) { - patternHeight += Math.abs(patternOffsetY); - } - } - if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') { - patternWidth = 1; - if (patternOffsetX) { - patternWidth += Math.abs(patternOffsetX); - } - - } - if (patternSource.src) { - patternImgSrc = patternSource.src; - } - else if (patternSource.toDataURL) { - patternImgSrc = patternSource.toDataURL(); - } - - return '\n' + - '\n' + - '\n'; - }, - /* _TO_SVG_END_ */ - - setOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } - }, - - /** - * Returns an instance of CanvasPattern - * @param {CanvasRenderingContext2D} ctx Context to create pattern - * @return {CanvasPattern} - */ - toLive: function(ctx) { - var source = this.source; - // if the image failed to load, return, and allow rest to continue loading - if (!source) { - return ''; - } - - // if an image - if (typeof source.src !== 'undefined') { - if (!source.complete) { - return ''; - } - if (source.naturalWidth === 0 || source.naturalHeight === 0) { - return ''; - } - } - return ctx.createPattern(source, this.repeat); - } - }); -})(); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - toFixed = fabric.util.toFixed; - - if (fabric.Shadow) { - fabric.warn('fabric.Shadow is already defined.'); - return; - } - - /** - * Shadow class - * @class fabric.Shadow - * @see {@link http://fabricjs.com/shadows|Shadow demo} - * @see {@link fabric.Shadow#initialize} for constructor definition - */ - fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ { - - /** - * Shadow color - * @type String - * @default - */ - color: 'rgb(0,0,0)', - - /** - * Shadow blur - * @type Number - */ - blur: 0, - - /** - * Shadow horizontal offset - * @type Number - * @default - */ - offsetX: 0, - - /** - * Shadow vertical offset - * @type Number - * @default - */ - offsetY: 0, - - /** - * Whether the shadow should affect stroke operations - * @type Boolean - * @default - */ - affectStroke: false, - - /** - * Indicates whether toObject should include default values - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * When `false`, the shadow will scale with the object. - * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale. - * default to false - * @type Boolean - * @default - */ - nonScaling: false, - - /** - * Constructor - * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. "rgba(0,0,0,0.2) 2px 2px 10px") - * @return {fabric.Shadow} thisArg - */ - initialize: function(options) { - - if (typeof options === 'string') { - options = this._parseShadow(options); - } - - for (var prop in options) { - this[prop] = options[prop]; - } - - this.id = fabric.Object.__uid++; - }, - - /** - * @private - * @param {String} shadow Shadow value to parse - * @return {Object} Shadow object with color, offsetX, offsetY and blur - */ - _parseShadow: function(shadow) { - var shadowStr = shadow.trim(), - offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [], - color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)'; - - return { - color: color.trim(), - offsetX: parseFloat(offsetsAndBlur[1], 10) || 0, - offsetY: parseFloat(offsetsAndBlur[2], 10) || 0, - blur: parseFloat(offsetsAndBlur[3], 10) || 0 - }; - }, - - /** - * Returns a string representation of an instance - * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow - * @return {String} Returns CSS3 text-shadow declaration - */ - toString: function() { - return [this.offsetX, this.offsetY, this.blur, this.color].join('px '); - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of a shadow - * @param {fabric.Object} object - * @return {String} SVG representation of a shadow - */ - toSVG: function(object) { - var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - offset = fabric.util.rotateVector( - { x: this.offsetX, y: this.offsetY }, - fabric.util.degreesToRadians(-object.angle)), - BLUR_BOX = 20, color = new fabric.Color(this.color); - - if (object.width && object.height) { - //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion - // we add some extra space to filter box to contain the blur ( 20 ) - fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; - fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; - } - if (object.flipX) { - offset.x *= -1; - } - if (object.flipY) { - offset.y *= -1; - } - - return ( - '\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\t\n' + - '\t\t\n' + - '\t\n' + - '\n'); - }, - /* _TO_SVG_END_ */ - - /** - * Returns object representation of a shadow - * @return {Object} Object representation of a shadow instance - */ - toObject: function() { - if (this.includeDefaultValues) { - return { - color: this.color, - blur: this.blur, - offsetX: this.offsetX, - offsetY: this.offsetY, - affectStroke: this.affectStroke, - nonScaling: this.nonScaling - }; - } - var obj = { }, proto = fabric.Shadow.prototype; - - ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) { - if (this[prop] !== proto[prop]) { - obj[prop] = this[prop]; - } - }, this); - - return obj; - } - }); - - /** - * Regex matching shadow offsetX, offsetY and blur (ex: "2px 2px 10px rgba(0,0,0,0.2)", "rgb(0,255,0) 2px 2px") - * @static - * @field - * @memberOf fabric.Shadow - */ - // eslint-disable-next-line max-len - fabric.Shadow.reOffsetsAndBlur = /(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function () { - - 'use strict'; - - if (fabric.StaticCanvas) { - fabric.warn('fabric.StaticCanvas is already defined.'); - return; - } - - // aliases for faster resolution - var extend = fabric.util.object.extend, - getElementOffset = fabric.util.getElementOffset, - removeFromArray = fabric.util.removeFromArray, - toFixed = fabric.util.toFixed, - transformPoint = fabric.util.transformPoint, - invertTransform = fabric.util.invertTransform, - getNodeCanvas = fabric.util.getNodeCanvas, - createCanvasElement = fabric.util.createCanvasElement, - - CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'); - - /** - * Static canvas class - * @class fabric.StaticCanvas - * @mixes fabric.Collection - * @mixes fabric.Observable - * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo} - * @see {@link fabric.StaticCanvas#initialize} for constructor definition - * @fires before:render - * @fires after:render - * @fires canvas:cleared - * @fires object:added - * @fires object:removed - */ - fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Constructor - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(el, options) { - options || (options = { }); - this.renderAndResetBound = this.renderAndReset.bind(this); - this.requestRenderAllBound = this.requestRenderAll.bind(this); - this._initStatic(el, options); - }, - - /** - * Background color of canvas instance. - * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}. - * @type {(String|fabric.Pattern)} - * @default - */ - backgroundColor: '', - - /** - * Background image of canvas instance. - * since 2.4.0 image caching is active, please when putting an image as background, add to the - * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom - * vale. As an alternative you can disable image objectCaching - * @type fabric.Image - * @default - */ - backgroundImage: null, - - /** - * Overlay color of canvas instance. - * Should be set via {@link fabric.StaticCanvas#setOverlayColor} - * @since 1.3.9 - * @type {(String|fabric.Pattern)} - * @default - */ - overlayColor: '', - - /** - * Overlay image of canvas instance. - * since 2.4.0 image caching is active, please when putting an image as overlay, add to the - * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom - * vale. As an alternative you can disable image objectCaching - * @type fabric.Image - * @default - */ - overlayImage: null, - - /** - * Indicates whether toObject/toDatalessObject should include default values - * if set to false, takes precedence over the object value. - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * Indicates whether objects' state should be saved - * @type Boolean - * @default - */ - stateful: false, - - /** - * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove}, - * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas. - * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once - * since the renders are quequed and executed one per frame. - * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() ) - * Left default to true to do not break documentation and old app, fiddles. - * @type Boolean - * @default - */ - renderOnAddRemove: true, - - /** - * Indicates whether object controls (borders/controls) are rendered above overlay image - * @type Boolean - * @default - */ - controlsAboveOverlay: false, - - /** - * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas - * @type Boolean - * @default - */ - allowTouchScrolling: false, - - /** - * Indicates whether this canvas will use image smoothing, this is on by default in browsers - * @type Boolean - * @default - */ - imageSmoothingEnabled: true, - - /** - * The transformation (in the format of Canvas transform) which focuses the viewport - * @type Array - * @default - */ - viewportTransform: fabric.iMatrix.concat(), - - /** - * if set to false background image is not affected by viewport transform - * @since 1.6.3 - * @type Boolean - * @default - */ - backgroundVpt: true, - - /** - * if set to false overlya image is not affected by viewport transform - * @since 1.6.3 - * @type Boolean - * @default - */ - overlayVpt: true, - - /** - * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens - * @type Boolean - * @default - */ - enableRetinaScaling: true, - - /** - * Describe canvas element extension over design - * properties are tl,tr,bl,br. - * if canvas is not zoomed/panned those points are the four corner of canvas - * if canvas is viewportTransformed you those points indicate the extension - * of canvas element in plain untrasformed coordinates - * The coordinates get updated with @method calcViewportBoundaries. - * @memberOf fabric.StaticCanvas.prototype - */ - vptCoords: { }, - - /** - * Based on vptCoords and object.aCoords, skip rendering of objects that - * are not included in current viewport. - * May greatly help in applications with crowded canvas and use of zoom/pan - * If One of the corner of the bounding box of the object is on the canvas - * the objects get rendered. - * @memberOf fabric.StaticCanvas.prototype - * @type Boolean - * @default - */ - skipOffscreen: true, - - /** - * a fabricObject that, without stroke define a clipping area with their shape. filled in black - * the clipPath object gets used when the canvas has rendered, and the context is placed in the - * top left corner of the canvas. - * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true - * @type fabric.Object - */ - clipPath: undefined, - - /** - * @private - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - */ - _initStatic: function(el, options) { - var cb = this.requestRenderAllBound; - this._objects = []; - this._createLowerCanvas(el); - this._initOptions(options); - // only initialize retina scaling once - if (!this.interactive) { - this._initRetinaScaling(); - } - - if (options.overlayImage) { - this.setOverlayImage(options.overlayImage, cb); - } - if (options.backgroundImage) { - this.setBackgroundImage(options.backgroundImage, cb); - } - if (options.backgroundColor) { - this.setBackgroundColor(options.backgroundColor, cb); - } - if (options.overlayColor) { - this.setOverlayColor(options.overlayColor, cb); - } - this.calcOffset(); - }, - - /** - * @private - */ - _isRetinaScaling: function() { - return (fabric.devicePixelRatio !== 1 && this.enableRetinaScaling); - }, - - /** - * @private - * @return {Number} retinaScaling if applied, otherwise 1; - */ - getRetinaScaling: function() { - return this._isRetinaScaling() ? fabric.devicePixelRatio : 1; - }, - - /** - * @private - */ - _initRetinaScaling: function() { - if (!this._isRetinaScaling()) { - return; - } - var scaleRatio = fabric.devicePixelRatio; - this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer); - if (this.upperCanvasEl) { - this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop); - } - }, - - __initRetinaScaling: function(scaleRatio, canvas, context) { - canvas.setAttribute('width', this.width * scaleRatio); - canvas.setAttribute('height', this.height * scaleRatio); - context.scale(scaleRatio, scaleRatio); - }, - - - /** - * Calculates canvas element offset relative to the document - * This method is also attached as "resize" event handler of window - * @return {fabric.Canvas} instance - * @chainable - */ - calcOffset: function () { - this._offset = getElementOffset(this.lowerCanvasEl); - return this; - }, - - /** - * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas - * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to - * @param {Function} callback callback to invoke when image is loaded and set as an overlay - * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}. - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo} - * @example Normal overlayImage with left/top = 0 - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * // Needed to position overlayImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example overlayImage with different properties - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top' - * }); - * @example Stretched overlayImage #1 - width/height correspond to canvas width/height - * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) { - * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); - * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas)); - * }); - * @example Stretched overlayImage #2 - width/height correspond to canvas width/height - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * width: canvas.width, - * height: canvas.height, - * // Needed to position overlayImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example overlayImage loaded from cross-origin - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top', - * crossOrigin: 'anonymous' - * }); - */ - setOverlayImage: function (image, callback, options) { - return this.__setBgOverlayImage('overlayImage', image, callback, options); - }, - - /** - * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas - * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to - * @param {Function} callback Callback to invoke when image is loaded and set as background - * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}. - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo} - * @example Normal backgroundImage with left/top = 0 - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * // Needed to position backgroundImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example backgroundImage with different properties - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top' - * }); - * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height - * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) { - * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); - * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas)); - * }); - * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * width: canvas.width, - * height: canvas.height, - * // Needed to position backgroundImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example backgroundImage loaded from cross-origin - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top', - * crossOrigin: 'anonymous' - * }); - */ - // TODO: fix stretched examples - setBackgroundImage: function (image, callback, options) { - return this.__setBgOverlayImage('backgroundImage', image, callback, options); - }, - - /** - * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas - * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to - * @param {Function} callback Callback to invoke when foreground color is set - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo} - * @example Normal overlayColor - color value - * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as overlayColor - * canvas.setOverlayColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png' - * }, canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as overlayColor with repeat and offset - * canvas.setOverlayColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png', - * repeat: 'repeat', - * offsetX: 200, - * offsetY: 100 - * }, canvas.renderAll.bind(canvas)); - */ - setOverlayColor: function(overlayColor, callback) { - return this.__setBgOverlayColor('overlayColor', overlayColor, callback); - }, - - /** - * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas - * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to - * @param {Function} callback Callback to invoke when background color is set - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo} - * @example Normal backgroundColor - color value - * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as backgroundColor - * canvas.setBackgroundColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png' - * }, canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as backgroundColor with repeat and offset - * canvas.setBackgroundColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png', - * repeat: 'repeat', - * offsetX: 200, - * offsetY: 100 - * }, canvas.renderAll.bind(canvas)); - */ - setBackgroundColor: function(backgroundColor, callback) { - return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback); - }, - - /** - * @private - * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage} - * or {@link fabric.StaticCanvas#overlayImage|overlayImage}) - * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to - * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not. - * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}. - */ - __setBgOverlayImage: function(property, image, callback, options) { - if (typeof image === 'string') { - fabric.util.loadImage(image, function(img, isError) { - if (img) { - var instance = new fabric.Image(img, options); - this[property] = instance; - instance.canvas = this; - } - callback && callback(img, isError); - }, this, options && options.crossOrigin); - } - else { - options && image.setOptions(options); - this[property] = image; - image && (image.canvas = this); - callback && callback(image, false); - } - - return this; - }, - - /** - * @private - * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor} - * or {@link fabric.StaticCanvas#overlayColor|overlayColor}) - * @param {(Object|String|null)} color Object with pattern information, color value or null - * @param {Function} [callback] Callback is invoked when color is set - */ - __setBgOverlayColor: function(property, color, callback) { - this[property] = color; - this._initGradient(color, property); - this._initPattern(color, property, callback); - return this; - }, - - /** - * @private - */ - _createCanvasElement: function() { - var element = createCanvasElement(); - if (!element) { - throw CANVAS_INIT_ERROR; - } - if (!element.style) { - element.style = { }; - } - if (typeof element.getContext === 'undefined') { - throw CANVAS_INIT_ERROR; - } - return element; - }, - - /** - * @private - * @param {Object} [options] Options object - */ - _initOptions: function (options) { - var lowerCanvasEl = this.lowerCanvasEl; - this._setOptions(options); - - this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0; - this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0; - - if (!this.lowerCanvasEl.style) { - return; - } - - lowerCanvasEl.width = this.width; - lowerCanvasEl.height = this.height; - - lowerCanvasEl.style.width = this.width + 'px'; - lowerCanvasEl.style.height = this.height + 'px'; - - this.viewportTransform = this.viewportTransform.slice(); - }, - - /** - * Creates a bottom canvas - * @private - * @param {HTMLElement} [canvasEl] - */ - _createLowerCanvas: function (canvasEl) { - // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node - if (canvasEl && canvasEl.getContext) { - this.lowerCanvasEl = canvasEl; - } - else { - this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement(); - } - - fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas'); - this._originalCanvasStyle = this.lowerCanvasEl.style; - if (this.interactive) { - this._applyCanvasStyle(this.lowerCanvasEl); - } - - this.contextContainer = this.lowerCanvasEl.getContext('2d'); - }, - - /** - * Returns canvas width (in px) - * @return {Number} - */ - getWidth: function () { - return this.width; - }, - - /** - * Returns canvas height (in px) - * @return {Number} - */ - getHeight: function () { - return this.height; - }, - - /** - * Sets width of this canvas instance - * @param {Number|String} value Value to set width to - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} instance - * @chainable true - */ - setWidth: function (value, options) { - return this.setDimensions({ width: value }, options); - }, - - /** - * Sets height of this canvas instance - * @param {Number|String} value Value to set height to - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} instance - * @chainable true - */ - setHeight: function (value, options) { - return this.setDimensions({ height: value }, options); - }, - - /** - * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em) - * @param {Object} dimensions Object with width/height properties - * @param {Number|String} [dimensions.width] Width of canvas element - * @param {Number|String} [dimensions.height] Height of canvas element - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} thisArg - * @chainable - */ - setDimensions: function (dimensions, options) { - var cssValue; - - options = options || {}; - - for (var prop in dimensions) { - cssValue = dimensions[prop]; - - if (!options.cssOnly) { - this._setBackstoreDimension(prop, dimensions[prop]); - cssValue += 'px'; - this.hasLostContext = true; - } - - if (!options.backstoreOnly) { - this._setCssDimension(prop, cssValue); - } - } - if (this._isCurrentlyDrawing) { - this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(); - } - this._initRetinaScaling(); - this.calcOffset(); - - if (!options.cssOnly) { - this.requestRenderAll(); - } - - return this; - }, - - /** - * Helper for setting width/height - * @private - * @param {String} prop property (width|height) - * @param {Number} value value to set property to - * @return {fabric.Canvas} instance - * @chainable true - */ - _setBackstoreDimension: function (prop, value) { - this.lowerCanvasEl[prop] = value; - - if (this.upperCanvasEl) { - this.upperCanvasEl[prop] = value; - } - - if (this.cacheCanvasEl) { - this.cacheCanvasEl[prop] = value; - } - - this[prop] = value; - - return this; - }, - - /** - * Helper for setting css width/height - * @private - * @param {String} prop property (width|height) - * @param {String} value value to set property to - * @return {fabric.Canvas} instance - * @chainable true - */ - _setCssDimension: function (prop, value) { - this.lowerCanvasEl.style[prop] = value; - - if (this.upperCanvasEl) { - this.upperCanvasEl.style[prop] = value; - } - - if (this.wrapperEl) { - this.wrapperEl.style[prop] = value; - } - - return this; - }, - - /** - * Returns canvas zoom level - * @return {Number} - */ - getZoom: function () { - return this.viewportTransform[0]; - }, - - /** - * Sets viewport transform of this canvas instance - * @param {Array} vpt the transform in the form of context.transform - * @return {fabric.Canvas} instance - * @chainable true - */ - setViewportTransform: function (vpt) { - var activeObject = this._activeObject, - backgroundObject = this.backgroundImage, - overlayObject = this.overlayImage, - object, i, len; - this.viewportTransform = vpt; - for (i = 0, len = this._objects.length; i < len; i++) { - object = this._objects[i]; - object.group || object.setCoords(true); - } - if (activeObject) { - activeObject.setCoords(); - } - if (backgroundObject) { - backgroundObject.setCoords(true); - } - if (overlayObject) { - overlayObject.setCoords(true); - } - this.calcViewportBoundaries(); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Sets zoom level of this canvas instance, the zoom centered around point - * meaning that following zoom to point with the same point will have the visual - * effect of the zoom originating from that point. The point won't move. - * It has nothing to do with canvas center or visual center of the viewport. - * @param {fabric.Point} point to zoom with respect to - * @param {Number} value to set zoom to, less than 1 zooms out - * @return {fabric.Canvas} instance - * @chainable true - */ - zoomToPoint: function (point, value) { - // TODO: just change the scale, preserve other transformations - var before = point, vpt = this.viewportTransform.slice(0); - point = transformPoint(point, invertTransform(this.viewportTransform)); - vpt[0] = value; - vpt[3] = value; - var after = transformPoint(point, vpt); - vpt[4] += before.x - after.x; - vpt[5] += before.y - after.y; - return this.setViewportTransform(vpt); - }, - - /** - * Sets zoom level of this canvas instance - * @param {Number} value to set zoom to, less than 1 zooms out - * @return {fabric.Canvas} instance - * @chainable true - */ - setZoom: function (value) { - this.zoomToPoint(new fabric.Point(0, 0), value); - return this; - }, - - /** - * Pan viewport so as to place point at top left corner of canvas - * @param {fabric.Point} point to move to - * @return {fabric.Canvas} instance - * @chainable true - */ - absolutePan: function (point) { - var vpt = this.viewportTransform.slice(0); - vpt[4] = -point.x; - vpt[5] = -point.y; - return this.setViewportTransform(vpt); - }, - - /** - * Pans viewpoint relatively - * @param {fabric.Point} point (position vector) to move by - * @return {fabric.Canvas} instance - * @chainable true - */ - relativePan: function (point) { - return this.absolutePan(new fabric.Point( - -point.x - this.viewportTransform[4], - -point.y - this.viewportTransform[5] - )); - }, - - /** - * Returns <canvas> element corresponding to this instance - * @return {HTMLCanvasElement} - */ - getElement: function () { - return this.lowerCanvasEl; - }, - - /** - * @private - * @param {fabric.Object} obj Object that was added - */ - _onObjectAdded: function(obj) { - this.stateful && obj.setupState(); - obj._set('canvas', this); - obj.setCoords(); - this.fire('object:added', { target: obj }); - obj.fire('added'); - }, - - /** - * @private - * @param {fabric.Object} obj Object that was removed - */ - _onObjectRemoved: function(obj) { - this.fire('object:removed', { target: obj }); - obj.fire('removed'); - delete obj.canvas; - }, - - /** - * Clears specified context of canvas element - * @param {CanvasRenderingContext2D} ctx Context to clear - * @return {fabric.Canvas} thisArg - * @chainable - */ - clearContext: function(ctx) { - ctx.clearRect(0, 0, this.width, this.height); - return this; - }, - - /** - * Returns context of canvas where objects are drawn - * @return {CanvasRenderingContext2D} - */ - getContext: function () { - return this.contextContainer; - }, - - /** - * Clears all contexts (background, main, top) of an instance - * @return {fabric.Canvas} thisArg - * @chainable - */ - clear: function () { - this.remove.apply(this, this.getObjects()); - this.backgroundImage = null; - this.overlayImage = null; - this.backgroundColor = ''; - this.overlayColor = ''; - if (this._hasITextHandlers) { - this.off('mouse:up', this._mouseUpITextHandler); - this._iTextInstances = null; - this._hasITextHandlers = false; - } - this.clearContext(this.contextContainer); - this.fire('canvas:cleared'); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Renders the canvas - * @return {fabric.Canvas} instance - * @chainable - */ - renderAll: function () { - var canvasToDrawOn = this.contextContainer; - this.renderCanvas(canvasToDrawOn, this._objects); - return this; - }, - - /** - * Function created to be instance bound at initialization - * used in requestAnimationFrame rendering - * Let the fabricJS call it. If you call it manually you could have more - * animationFrame stacking on to of each other - * for an imperative rendering, use canvas.renderAll - * @private - * @return {fabric.Canvas} instance - * @chainable - */ - renderAndReset: function() { - this.isRendering = 0; - this.renderAll(); - }, - - /** - * Append a renderAll request to next animation frame. - * unless one is already in progress, in that case nothing is done - * a boolean flag will avoid appending more. - * @return {fabric.Canvas} instance - * @chainable - */ - requestRenderAll: function () { - if (!this.isRendering) { - this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound); - } - return this; - }, - - /** - * Calculate the position of the 4 corner of canvas with current viewportTransform. - * helps to determinate when an object is in the current rendering viewport using - * object absolute coordinates ( aCoords ) - * @return {Object} points.tl - * @chainable - */ - calcViewportBoundaries: function() { - var points = { }, width = this.width, height = this.height, - iVpt = invertTransform(this.viewportTransform); - points.tl = transformPoint({ x: 0, y: 0 }, iVpt); - points.br = transformPoint({ x: width, y: height }, iVpt); - points.tr = new fabric.Point(points.br.x, points.tl.y); - points.bl = new fabric.Point(points.tl.x, points.br.y); - this.vptCoords = points; - return points; - }, - - cancelRequestedRender: function() { - if (this.isRendering) { - fabric.util.cancelAnimFrame(this.isRendering); - this.isRendering = 0; - } - }, - - /** - * Renders background, objects, overlay and controls. - * @param {CanvasRenderingContext2D} ctx - * @param {Array} objects to render - * @return {fabric.Canvas} instance - * @chainable - */ - renderCanvas: function(ctx, objects) { - var v = this.viewportTransform, path = this.clipPath; - this.cancelRequestedRender(); - this.calcViewportBoundaries(); - this.clearContext(ctx); - fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled); - this.fire('before:render', { ctx: ctx, }); - this._renderBackground(ctx); - - ctx.save(); - //apply viewport transform once for all rendering process - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - this._renderObjects(ctx, objects); - ctx.restore(); - if (!this.controlsAboveOverlay && this.interactive) { - this.drawControls(ctx); - } - if (path) { - path.canvas = this; - // needed to setup a couple of variables - path.shouldCache(); - path._transformDone = true; - path.renderCache({ forClipping: true }); - this.drawClipPathOnCanvas(ctx); - } - this._renderOverlay(ctx); - if (this.controlsAboveOverlay && this.interactive) { - this.drawControls(ctx); - } - this.fire('after:render', { ctx: ctx, }); - }, - - /** - * Paint the cached clipPath on the lowerCanvasEl - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawClipPathOnCanvas: function(ctx) { - var v = this.viewportTransform, path = this.clipPath; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - // DEBUG: uncomment this line, comment the following - // ctx.globalAlpha = 0.4; - ctx.globalCompositeOperation = 'destination-in'; - path.transform(ctx); - ctx.scale(1 / path.zoomX, 1 / path.zoomY); - ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY); - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Array} objects to render - */ - _renderObjects: function(ctx, objects) { - var i, len; - for (i = 0, len = objects.length; i < len; ++i) { - objects[i] && objects[i].render(ctx); - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {string} property 'background' or 'overlay' - */ - _renderBackgroundOrOverlay: function(ctx, property) { - var fill = this[property + 'Color'], object = this[property + 'Image'], - v = this.viewportTransform, needsVpt = this[property + 'Vpt']; - if (!fill && !object) { - return; - } - if (fill) { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(this.width, 0); - ctx.lineTo(this.width, this.height); - ctx.lineTo(0, this.height); - ctx.closePath(); - ctx.fillStyle = fill.toLive - ? fill.toLive(ctx, this) - : fill; - if (needsVpt) { - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - } - ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0); - var m = fill.gradientTransform || fill.patternTransform; - m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - ctx.fill(); - ctx.restore(); - } - if (object) { - ctx.save(); - if (needsVpt) { - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - } - object.render(ctx); - ctx.restore(); - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderBackground: function(ctx) { - this._renderBackgroundOrOverlay(ctx, 'background'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderOverlay: function(ctx) { - this._renderBackgroundOrOverlay(ctx, 'overlay'); - }, - - /** - * Returns coordinates of a center of canvas. - * Returned value is an object with top and left properties - * @return {Object} object with "top" and "left" number values - */ - getCenter: function () { - return { - top: this.height / 2, - left: this.width / 2 - }; - }, - - /** - * Centers object horizontally in the canvas - * @param {fabric.Object} object Object to center horizontally - * @return {fabric.Canvas} thisArg - */ - centerObjectH: function (object) { - return this._centerObject(object, new fabric.Point(this.getCenter().left, object.getCenterPoint().y)); - }, - - /** - * Centers object vertically in the canvas - * @param {fabric.Object} object Object to center vertically - * @return {fabric.Canvas} thisArg - * @chainable - */ - centerObjectV: function (object) { - return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenter().top)); - }, - - /** - * Centers object vertically and horizontally in the canvas - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - centerObject: function(object) { - var center = this.getCenter(); - - return this._centerObject(object, new fabric.Point(center.left, center.top)); - }, - - /** - * Centers object vertically and horizontally in the viewport - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObject: function(object) { - var vpCenter = this.getVpCenter(); - - return this._centerObject(object, vpCenter); - }, - - /** - * Centers object horizontally in the viewport, object.top is unchanged - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObjectH: function(object) { - var vpCenter = this.getVpCenter(); - this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y)); - return this; - }, - - /** - * Centers object Vertically in the viewport, object.top is unchanged - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObjectV: function(object) { - var vpCenter = this.getVpCenter(); - - return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y)); - }, - - /** - * Calculate the point in canvas that correspond to the center of actual viewport. - * @return {fabric.Point} vpCenter, viewport center - * @chainable - */ - getVpCenter: function() { - var center = this.getCenter(), - iVpt = invertTransform(this.viewportTransform); - return transformPoint({ x: center.left, y: center.top }, iVpt); - }, - - /** - * @private - * @param {fabric.Object} object Object to center - * @param {fabric.Point} center Center point - * @return {fabric.Canvas} thisArg - * @chainable - */ - _centerObject: function(object, center) { - object.setPositionByOrigin(center, 'center', 'center'); - object.setCoords(); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Returns dataless JSON representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {String} json string - */ - toDatalessJSON: function (propertiesToInclude) { - return this.toDatalessObject(propertiesToInclude); - }, - - /** - * Returns object representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function (propertiesToInclude) { - return this._toObjectMethod('toObject', propertiesToInclude); - }, - - /** - * Returns dataless object representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function (propertiesToInclude) { - return this._toObjectMethod('toDatalessObject', propertiesToInclude); - }, - - /** - * @private - */ - _toObjectMethod: function (methodName, propertiesToInclude) { - - var clipPath = this.clipPath, data = { - version: fabric.version, - objects: this._toObjects(methodName, propertiesToInclude), - }; - if (clipPath && !clipPath.excludeFromExport) { - data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude); - } - extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude)); - - fabric.util.populateWithProperties(this, data, propertiesToInclude); - - return data; - }, - - /** - * @private - */ - _toObjects: function(methodName, propertiesToInclude) { - return this._objects.filter(function(object) { - return !object.excludeFromExport; - }).map(function(instance) { - return this._toObject(instance, methodName, propertiesToInclude); - }, this); - }, - - /** - * @private - */ - _toObject: function(instance, methodName, propertiesToInclude) { - var originalValue; - - if (!this.includeDefaultValues) { - originalValue = instance.includeDefaultValues; - instance.includeDefaultValues = false; - } - - var object = instance[methodName](propertiesToInclude); - if (!this.includeDefaultValues) { - instance.includeDefaultValues = originalValue; - } - return object; - }, - - /** - * @private - */ - __serializeBgOverlay: function(methodName, propertiesToInclude) { - var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage, - bgColor = this.backgroundColor, overlayColor = this.overlayColor; - - if (bgColor && bgColor.toObject) { - if (!bgColor.excludeFromExport) { - data.background = bgColor.toObject(propertiesToInclude); - } - } - else if (bgColor) { - data.background = bgColor; - } - - if (overlayColor && overlayColor.toObject) { - if (!overlayColor.excludeFromExport) { - data.overlay = overlayColor.toObject(propertiesToInclude); - } - } - else if (overlayColor) { - data.overlay = overlayColor; - } - - if (bgImage && !bgImage.excludeFromExport) { - data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude); - } - if (overlayImage && !overlayImage.excludeFromExport) { - data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude); - } - - return data; - }, - - /* _TO_SVG_START_ */ - /** - * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true, - * a zoomed canvas will then produce zoomed SVG output. - * @type Boolean - * @default - */ - svgViewportTransformation: true, - - /** - * Returns SVG representation of canvas - * @function - * @param {Object} [options] Options object for SVG output - * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included - * @param {Object} [options.viewBox] SVG viewbox object - * @param {Number} [options.viewBox.x] x-coordinate of viewbox - * @param {Number} [options.viewBox.y] y-coordinate of viewbox - * @param {Number} [options.viewBox.width] Width of viewbox - * @param {Number} [options.viewBox.height] Height of viewbox - * @param {String} [options.encoding=UTF-8] Encoding of SVG output - * @param {String} [options.width] desired width of svg with or without units - * @param {String} [options.height] desired height of svg with or without units - * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation. - * @return {String} SVG string - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} - * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo} - * @example Normal SVG output - * var svg = canvas.toSVG(); - * @example SVG output without preamble (without <?xml ../>) - * var svg = canvas.toSVG({suppressPreamble: true}); - * @example SVG output with viewBox attribute - * var svg = canvas.toSVG({ - * viewBox: { - * x: 100, - * y: 100, - * width: 200, - * height: 300 - * } - * }); - * @example SVG output with different encoding (default: UTF-8) - * var svg = canvas.toSVG({encoding: 'ISO-8859-1'}); - * @example Modify SVG output with reviver function - * var svg = canvas.toSVG(null, function(svg) { - * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', ''); - * }); - */ - toSVG: function(options, reviver) { - options || (options = { }); - options.reviver = reviver; - var markup = []; - - this._setSVGPreamble(markup, options); - this._setSVGHeader(markup, options); - if (this.clipPath) { - markup.push('\n'); - } - this._setSVGBgOverlayColor(markup, 'background'); - this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver); - this._setSVGObjects(markup, reviver); - if (this.clipPath) { - markup.push('\n'); - } - this._setSVGBgOverlayColor(markup, 'overlay'); - this._setSVGBgOverlayImage(markup, 'overlayImage', reviver); - - markup.push(''); - - return markup.join(''); - }, - - /** - * @private - */ - _setSVGPreamble: function(markup, options) { - if (options.suppressPreamble) { - return; - } - markup.push( - '\n', - '\n' - ); - }, - - /** - * @private - */ - _setSVGHeader: function(markup, options) { - var width = options.width || this.width, - height = options.height || this.height, - vpt, viewBox = 'viewBox="0 0 ' + this.width + ' ' + this.height + '" ', - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - - if (options.viewBox) { - viewBox = 'viewBox="' + - options.viewBox.x + ' ' + - options.viewBox.y + ' ' + - options.viewBox.width + ' ' + - options.viewBox.height + '" '; - } - else { - if (this.svgViewportTransformation) { - vpt = this.viewportTransform; - viewBox = 'viewBox="' + - toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' + - toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' + - toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' + - toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '" '; - } - } - - markup.push( - '\n', - 'Created with Fabric.js ', fabric.version, '\n', - '\n', - this.createSVGFontFacesMarkup(), - this.createSVGRefElementsMarkup(), - this.createSVGClipPathMarkup(options), - '\n' - ); - }, - - createSVGClipPathMarkup: function(options) { - var clipPath = this.clipPath; - if (clipPath) { - clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; - return '\n' + - this.clipPath.toClipPathSVG(options.reviver) + - '\n'; - } - return ''; - }, - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @return {String} - */ - createSVGRefElementsMarkup: function() { - var _this = this, - markup = ['background', 'overlay'].map(function(prop) { - var fill = _this[prop + 'Color']; - if (fill && fill.toLive) { - var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform, - object = { - width: _this.width / (shouldTransform ? vpt[0] : 1), - height: _this.height / (shouldTransform ? vpt[3] : 1) - }; - return fill.toSVG( - object, - { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' } - ); - } - }); - return markup.join(''); - }, - - /** - * Creates markup containing SVG font faces, - * font URLs for font faces must be collected by developers - * and are not extracted from the DOM by fabricjs - * @param {Array} objects Array of fabric objects - * @return {String} - */ - createSVGFontFacesMarkup: function() { - var markup = '', fontList = { }, obj, fontFamily, - style, row, rowIndex, _char, charIndex, i, len, - fontPaths = fabric.fontPaths, objects = []; - - this._objects.forEach(function add(object) { - objects.push(object); - if (object._objects) { - object._objects.forEach(add); - } - }); - - for (i = 0, len = objects.length; i < len; i++) { - obj = objects[i]; - fontFamily = obj.fontFamily; - if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { - continue; - } - fontList[fontFamily] = true; - if (!obj.styles) { - continue; - } - style = obj.styles; - for (rowIndex in style) { - row = style[rowIndex]; - for (charIndex in row) { - _char = row[charIndex]; - fontFamily = _char.fontFamily; - if (!fontList[fontFamily] && fontPaths[fontFamily]) { - fontList[fontFamily] = true; - } - } - } - } - - for (var j in fontList) { - markup += [ - '\t\t@font-face {\n', - '\t\t\tfont-family: \'', j, '\';\n', - '\t\t\tsrc: url(\'', fontPaths[j], '\');\n', - '\t\t}\n' - ].join(''); - } - - if (markup) { - markup = [ - '\t\n' - ].join(''); - } - - return markup; - }, - - /** - * @private - */ - _setSVGObjects: function(markup, reviver) { - var instance, i, len, objects = this._objects; - for (i = 0, len = objects.length; i < len; i++) { - instance = objects[i]; - if (instance.excludeFromExport) { - continue; - } - this._setSVGObject(markup, instance, reviver); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - markup.push(instance.toSVG(reviver)); - }, - - /** - * @private - */ - _setSVGBgOverlayImage: function(markup, property, reviver) { - if (this[property] && !this[property].excludeFromExport && this[property].toSVG) { - markup.push(this[property].toSVG(reviver)); - } - }, - - /** - * @private - */ - _setSVGBgOverlayColor: function(markup, property) { - var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width, - finalHeight = this.height; - if (!filler) { - return; - } - if (filler.toLive) { - var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'], - additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : ''; - markup.push( - '\n' - ); - } - else { - markup.push( - '\n' - ); - } - }, - /* _TO_SVG_END_ */ - - /** - * Moves an object or the objects of a multiple selection - * to the bottom of the stack of drawn objects - * @param {fabric.Object} object Object to send to back - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendToBack: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.unshift(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.unshift(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or the objects of a multiple selection - * to the top of the stack of drawn objects - * @param {fabric.Object} object Object to send - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringToFront: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.push(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.push(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or a selection down in stack of drawn objects - * An optional parameter, intersecting allows to move the object in behind - * the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendBackwards: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx > 0 + objsMoved) { - newIdx = idx - 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== 0) { - // if object is not on the bottom of stack - newIdx = this._findNewLowerIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewLowerIndex: function(object, idx, intersecting) { - var newIdx, i; - - if (intersecting) { - newIdx = idx; - - // traverse down the stack looking for the nearest intersecting object - for (i = idx - 1; i >= 0; --i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx - 1; - } - - return newIdx; - }, - - /** - * Moves an object or a selection up in stack of drawn objects - * An optional parameter, intersecting allows to move the object in front - * of the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringForward: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx < this._objects.length - 1 - objsMoved) { - newIdx = idx + 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== this._objects.length - 1) { - // if object is not on top of stack (last item in an array) - newIdx = this._findNewUpperIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewUpperIndex: function(object, idx, intersecting) { - var newIdx, i, len; - - if (intersecting) { - newIdx = idx; - - // traverse up the stack looking for the nearest intersecting object - for (i = idx + 1, len = this._objects.length; i < len; ++i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx + 1; - } - - return newIdx; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {fabric.Object} object Object to send - * @param {Number} index Position to move to - * @return {fabric.Canvas} thisArg - * @chainable - */ - moveTo: function (object, index) { - removeFromArray(this._objects, object); - this._objects.splice(index, 0, object); - return this.renderOnAddRemove && this.requestRenderAll(); - }, - - /** - * Clears a canvas element and dispose objects - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - // cancel eventually ongoing renders - if (this.isRendering) { - fabric.util.cancelAnimFrame(this.isRendering); - this.isRendering = 0; - } - this.forEachObject(function(object) { - object.dispose && object.dispose(); - }); - this._objects = []; - if (this.backgroundImage && this.backgroundImage.dispose) { - this.backgroundImage.dispose(); - } - this.backgroundImage = null; - if (this.overlayImage && this.overlayImage.dispose) { - this.overlayImage.dispose(); - } - this.overlayImage = null; - this._iTextInstances = null; - this.contextContainer = null; - // restore canvas style - this.lowerCanvasEl.classList.remove('lower-canvas'); - this.lowerCanvasEl.style = this._originalCanvasStyle; - delete this._originalCanvasStyle; - // restore canvas size to original size in case retina scaling was applied - this.lowerCanvasEl.setAttribute('width', this.width); - this.lowerCanvasEl.setAttribute('height', this.height); - fabric.util.cleanUpJsdomNode(this.lowerCanvasEl); - this.lowerCanvasEl = undefined; - return this; - }, - - /** - * Returns a string representation of an instance - * @return {String} string representation of an instance - */ - toString: function () { - return '#'; - } - }); - - extend(fabric.StaticCanvas.prototype, fabric.Observable); - extend(fabric.StaticCanvas.prototype, fabric.Collection); - extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter); - - extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ { - - /** - * @static - * @type String - * @default - */ - EMPTY_JSON: '{"objects": [], "background": "white"}', - - /** - * Provides a way to check support of some of the canvas methods - * (either those of HTMLCanvasElement itself, or rendering context) - * - * @param {String} methodName Method to check support for; - * Could be one of "setLineDash" - * @return {Boolean | null} `true` if method is supported (or at least exists), - * `null` if canvas element or context can not be initialized - */ - supports: function (methodName) { - var el = createCanvasElement(); - - if (!el || !el.getContext) { - return null; - } - - var ctx = el.getContext('2d'); - if (!ctx) { - return null; - } - - switch (methodName) { - - case 'setLineDash': - return typeof ctx.setLineDash !== 'undefined'; - - default: - return null; - } - } - }); - - /** - * Returns Object representation of canvas - * this alias is provided because if you call JSON.stringify on an instance, - * the toJSON object will be invoked if it exists. - * Having a toJSON method means you can do JSON.stringify(myCanvas) - * @function - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON compatible object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} - * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} - * @example JSON without additional properties - * var json = canvas.toJSON(); - * @example JSON with additional properties included - * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']); - * @example JSON without default values - * canvas.includeDefaultValues = false; - * var json = canvas.toJSON(); - */ - fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; - - if (fabric.isLikelyNode) { - fabric.StaticCanvas.prototype.createPNGStream = function() { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createPNGStream(); - }; - fabric.StaticCanvas.prototype.createJPEGStream = function(opts) { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createJPEGStream(opts); - }; - } -})(); - - -/** - * BaseBrush class - * @class fabric.BaseBrush - * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} - */ -fabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ { - - /** - * Color of a brush - * @type String - * @default - */ - color: 'rgb(0, 0, 0)', - - /** - * Width of a brush, has to be a Number, no string literals - * @type Number - * @default - */ - width: 1, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property replaces "shadowColor" (String), "shadowOffsetX" (Number), - * "shadowOffsetY" (Number) and "shadowBlur" (Number) since v1.2.12 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Line endings style of a brush (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'round', - - /** - * Corner style of a brush (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'round', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of a brush's - * @type Number - * @default - */ - strokeMiterLimit: 10, - - /** - * Stroke Dash Array. - * @type Array - * @default - */ - strokeDashArray: null, - - /** - * When `true`, the free drawing is limited to the whiteboard size. Default to false. - * @type Boolean - * @default false - */ - - limitedToCanvasSize: false, - - - /** - * Sets brush styles - * @private - */ - _setBrushStyles: function() { - var ctx = this.canvas.contextTop; - ctx.strokeStyle = this.color; - ctx.lineWidth = this.width; - ctx.lineCap = this.strokeLineCap; - ctx.miterLimit = this.strokeMiterLimit; - ctx.lineJoin = this.strokeLineJoin; - ctx.setLineDash(this.strokeDashArray || []); - }, - - /** - * Sets the transformation on given context - * @param {RenderingContext2d} ctx context to render on - * @private - */ - _saveAndTransform: function(ctx) { - var v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - }, - - /** - * Sets brush shadow styles - * @private - */ - _setShadow: function() { - if (!this.shadow) { - return; - } - - var canvas = this.canvas, - shadow = this.shadow, - ctx = canvas.contextTop, - zoom = canvas.getZoom(); - if (canvas && canvas._isRetinaScaling()) { - zoom *= fabric.devicePixelRatio; - } - - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * zoom; - ctx.shadowOffsetX = shadow.offsetX * zoom; - ctx.shadowOffsetY = shadow.offsetY * zoom; - }, - - needsFullRender: function() { - var color = new fabric.Color(this.color); - return color.getAlpha() < 1 || !!this.shadow; - }, - - /** - * Removes brush shadow styles - * @private - */ - _resetShadow: function() { - var ctx = this.canvas.contextTop; - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * Check is pointer is outside canvas boundaries - * @param {Object} pointer - * @private - */ - _isOutSideCanvas: function(pointer) { - return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight(); - } -}); - - -(function() { - /** - * PencilBrush class - * @class fabric.PencilBrush - * @extends fabric.BaseBrush - */ - fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ { - - /** - * Discard points that are less than `decimate` pixel distant from each other - * @type Number - * @default 0.4 - */ - decimate: 0.4, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.PencilBrush} Instance of a pencil brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this._points = []; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - _drawSegment: function (ctx, p1, p2) { - var midPoint = p1.midPointFrom(p2); - ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y); - return midPoint; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - this._prepareForDrawing(pointer); - // capture coordinates immediately - // this allows to draw dots (when movement never occurs) - this._captureDrawingPath(pointer); - this._render(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this._captureDrawingPath(pointer) && this._points.length > 1) { - if (this.needsFullRender()) { - // redraw curve - // clear top canvas - this.canvas.clearContext(this.canvas.contextTop); - this._render(); - } - else { - var points = this._points, length = points.length, ctx = this.canvas.contextTop; - // draw the curve update - this._saveAndTransform(ctx); - if (this.oldEnd) { - ctx.beginPath(); - ctx.moveTo(this.oldEnd.x, this.oldEnd.y); - } - this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true); - ctx.stroke(); - ctx.restore(); - } - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function(options) { - if (!this.canvas._isMainEvent(options.e)) { - return true; - } - this.oldEnd = undefined; - this._finalizeAndAddPath(); - return false; - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _prepareForDrawing: function(pointer) { - - var p = new fabric.Point(pointer.x, pointer.y); - - this._reset(); - this._addPoint(p); - this.canvas.contextTop.moveTo(p.x, p.y); - }, - - /** - * @private - * @param {fabric.Point} point Point to be added to points array - */ - _addPoint: function(point) { - if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) { - return false; - } - this._points.push(point); - return true; - }, - - /** - * Clear points array and set contextTop canvas style. - * @private - */ - _reset: function() { - this._points = []; - this._setBrushStyles(); - this._setShadow(); - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _captureDrawingPath: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y); - return this._addPoint(pointerPoint); - }, - - /** - * Draw a smooth path on the topCanvas using quadraticCurveTo - * @private - */ - _render: function() { - var ctx = this.canvas.contextTop, i, len, - p1 = this._points[0], - p2 = this._points[1]; - - this._saveAndTransform(ctx); - ctx.beginPath(); - //if we only have 2 points in the path and they are the same - //it means that the user only clicked the canvas without moving the mouse - //then we should be drawing a dot. A path isn't drawn between two identical dots - //that's why we set them apart a bit - if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) { - var width = this.width / 1000; - p1 = new fabric.Point(p1.x, p1.y); - p2 = new fabric.Point(p2.x, p2.y); - p1.x -= width; - p2.x += width; - } - ctx.moveTo(p1.x, p1.y); - - for (i = 1, len = this._points.length; i < len; i++) { - // we pick the point between pi + 1 & pi + 2 as the - // end point and p1 as our control point. - this._drawSegment(ctx, p1, p2); - p1 = this._points[i]; - p2 = this._points[i + 1]; - } - // Draw last line as a straight line while - // we wait for the next point to be able to calculate - // the bezier control point - ctx.lineTo(p1.x, p1.y); - ctx.stroke(); - ctx.restore(); - }, - - /** - * Converts points to SVG path - * @param {Array} points Array of points - * @return {(string|number)[][]} SVG path commands - */ - convertPointsToSVGPath: function (points) { - var correction = this.width / 1000; - return fabric.util.getSmoothPathFromPoints(points, correction); - }, - - /** - * @private - * @param {(string|number)[][]} pathData SVG path commands - * @returns {boolean} - */ - _isEmptySVGPath: function (pathData) { - var pathString = fabric.util.joinPath(pathData); - return pathString === 'M 0 0 Q 0 0 0 0 L 0 0'; - }, - - /** - * Creates fabric.Path object to add on canvas - * @param {(string|number)[][]} pathData Path data - * @return {fabric.Path} Path to add on canvas - */ - createPath: function(pathData) { - var path = new fabric.Path(pathData, { - fill: null, - stroke: this.color, - strokeWidth: this.width, - strokeLineCap: this.strokeLineCap, - strokeMiterLimit: this.strokeMiterLimit, - strokeLineJoin: this.strokeLineJoin, - strokeDashArray: this.strokeDashArray, - }); - if (this.shadow) { - this.shadow.affectStroke = true; - path.shadow = new fabric.Shadow(this.shadow); - } - - return path; - }, - - /** - * Decimate points array with the decimate value - */ - decimatePoints: function(points, distance) { - if (points.length <= 2) { - return points; - } - var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2), - i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint], - cDistance; - for (i = 1; i < l - 1; i++) { - cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2); - if (cDistance >= adjustedDistance) { - lastPoint = points[i]; - newPoints.push(lastPoint); - } - } - /** - * Add the last point from the original line to the end of the array. - * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point. - */ - newPoints.push(points[l]); - return newPoints; - }, - - /** - * On mouseup after drawing the path on contextTop canvas - * we use the points captured to create an new fabric path object - * and add it to the fabric canvas. - */ - _finalizeAndAddPath: function() { - var ctx = this.canvas.contextTop; - ctx.closePath(); - if (this.decimate) { - this._points = this.decimatePoints(this._points, this.decimate); - } - var pathData = this.convertPointsToSVGPath(this._points); - if (this._isEmptySVGPath(pathData)) { - // do not create 0 width/height paths, as they are - // rendered inconsistently across browsers - // Firefox 4, for example, renders a dot, - // whereas Chrome 10 renders nothing - this.canvas.requestRenderAll(); - return; - } - - var path = this.createPath(pathData); - this.canvas.clearContext(this.canvas.contextTop); - this.canvas.fire('before:path:created', { path: path }); - this.canvas.add(path); - this.canvas.requestRenderAll(); - path.setCoords(); - this._resetShadow(); - - - // fire event 'path' created - this.canvas.fire('path:created', { path: path }); - } - }); -})(); - - -/** - * CircleBrush class - * @class fabric.CircleBrush - */ -fabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ { - - /** - * Width of a brush - * @type Number - * @default - */ - width: 10, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.CircleBrush} Instance of a circle brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.points = []; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - drawDot: function(pointer) { - var point = this.addPoint(pointer), - ctx = this.canvas.contextTop; - this._saveAndTransform(ctx); - this.dot(ctx, point); - ctx.restore(); - }, - - dot: function(ctx, point) { - ctx.fillStyle = point.fill; - ctx.beginPath(); - ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false); - ctx.closePath(); - ctx.fill(); - }, - - /** - * Invoked on mouse down - */ - onMouseDown: function(pointer) { - this.points.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - this.drawDot(pointer); - }, - - /** - * Render the full state of the brush - * @private - */ - _render: function() { - var ctx = this.canvas.contextTop, i, len, - points = this.points; - this._saveAndTransform(ctx); - for (i = 0, len = points.length; i < len; i++) { - this.dot(ctx, points[i]); - } - ctx.restore(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this.needsFullRender()) { - this.canvas.clearContext(this.canvas.contextTop); - this.addPoint(pointer); - this._render(); - } - else { - this.drawDot(pointer); - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len; - this.canvas.renderOnAddRemove = false; - - var circles = []; - - for (i = 0, len = this.points.length; i < len; i++) { - var point = this.points[i], - circle = new fabric.Circle({ - radius: point.radius, - left: point.x, - top: point.y, - originX: 'center', - originY: 'center', - fill: point.fill - }); - - this.shadow && (circle.shadow = new fabric.Shadow(this.shadow)); - - circles.push(circle); - } - var group = new fabric.Group(circles); - group.canvas = this.canvas; - - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @param {Object} pointer - * @return {fabric.Point} Just added pointer point - */ - addPoint: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y), - - circleRadius = fabric.util.getRandomInt( - Math.max(0, this.width - 20), this.width + 20) / 2, - - circleColor = new fabric.Color(this.color) - .setAlpha(fabric.util.getRandomInt(0, 100) / 100) - .toRgba(); - - pointerPoint.radius = circleRadius; - pointerPoint.fill = circleColor; - - this.points.push(pointerPoint); - - return pointerPoint; - } -}); - - -/** - * SprayBrush class - * @class fabric.SprayBrush - */ -fabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ { - - /** - * Width of a spray - * @type Number - * @default - */ - width: 10, - - /** - * Density of a spray (number of dots per chunk) - * @type Number - * @default - */ - density: 20, - - /** - * Width of spray dots - * @type Number - * @default - */ - dotWidth: 1, - - /** - * Width variance of spray dots - * @type Number - * @default - */ - dotWidthVariance: 1, - - /** - * Whether opacity of a dot should be random - * @type Boolean - * @default - */ - randomOpacity: false, - - /** - * Whether overlapping dots (rectangles) should be removed (for performance reasons) - * @type Boolean - * @default - */ - optimizeOverlapping: true, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.SprayBrush} Instance of a spray brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.sprayChunks = []; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer) { - this.sprayChunks.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove; - this.canvas.renderOnAddRemove = false; - - var rects = []; - - for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - var sprayChunk = this.sprayChunks[i]; - - for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) { - - var rect = new fabric.Rect({ - width: sprayChunk[j].width, - height: sprayChunk[j].width, - left: sprayChunk[j].x + 1, - top: sprayChunk[j].y + 1, - originX: 'center', - originY: 'center', - fill: this.color - }); - rects.push(rect); - } - } - - if (this.optimizeOverlapping) { - rects = this._getOptimizedRects(rects); - } - - var group = new fabric.Group(rects); - this.shadow && group.set('shadow', new fabric.Shadow(this.shadow)); - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @private - * @param {Array} rects - */ - _getOptimizedRects: function(rects) { - - // avoid creating duplicate rects at the same coordinates - var uniqueRects = { }, key, i, len; - - for (i = 0, len = rects.length; i < len; i++) { - key = rects[i].left + '' + rects[i].top; - if (!uniqueRects[key]) { - uniqueRects[key] = rects[i]; - } - } - var uniqueRectsArray = []; - for (key in uniqueRects) { - uniqueRectsArray.push(uniqueRects[key]); - } - - return uniqueRectsArray; - }, - - /** - * Render new chunk of spray brush - */ - render: function(sprayChunk) { - var ctx = this.canvas.contextTop, i, len; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, len = sprayChunk.length; i < len; i++) { - var point = sprayChunk[i]; - if (typeof point.opacity !== 'undefined') { - ctx.globalAlpha = point.opacity; - } - ctx.fillRect(point.x, point.y, point.width, point.width); - } - ctx.restore(); - }, - - /** - * Render all spray chunks - */ - _render: function() { - var ctx = this.canvas.contextTop, i, ilen; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - this.render(this.sprayChunks[i]); - } - ctx.restore(); - }, - - /** - * @param {Object} pointer - */ - addSprayChunk: function(pointer) { - this.sprayChunkPoints = []; - - var x, y, width, radius = this.width / 2, i; - - for (i = 0; i < this.density; i++) { - - x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius); - y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius); - - if (this.dotWidthVariance) { - width = fabric.util.getRandomInt( - // bottom clamp width to 1 - Math.max(1, this.dotWidth - this.dotWidthVariance), - this.dotWidth + this.dotWidthVariance); - } - else { - width = this.dotWidth; - } - - var point = new fabric.Point(x, y); - point.width = width; - - if (this.randomOpacity) { - point.opacity = fabric.util.getRandomInt(0, 100) / 100; - } - - this.sprayChunkPoints.push(point); - } - - this.sprayChunks.push(this.sprayChunkPoints); - } -}); - - -/** - * PatternBrush class - * @class fabric.PatternBrush - * @extends fabric.BaseBrush - */ -fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ { - - getPatternSrc: function() { - - var dotWidth = 20, - dotDistance = 5, - patternCanvas = fabric.util.createCanvasElement(), - patternCtx = patternCanvas.getContext('2d'); - - patternCanvas.width = patternCanvas.height = dotWidth + dotDistance; - - patternCtx.fillStyle = this.color; - patternCtx.beginPath(); - patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false); - patternCtx.closePath(); - patternCtx.fill(); - - return patternCanvas; - }, - - getPatternSrcFunction: function() { - return String(this.getPatternSrc).replace('this.color', '"' + this.color + '"'); - }, - - /** - * Creates "pattern" instance property - */ - getPattern: function() { - return this.canvas.contextTop.createPattern(this.source || this.getPatternSrc(), 'repeat'); - }, - - /** - * Sets brush styles - */ - _setBrushStyles: function() { - this.callSuper('_setBrushStyles'); - this.canvas.contextTop.strokeStyle = this.getPattern(); - }, - - /** - * Creates path - */ - createPath: function(pathData) { - var path = this.callSuper('createPath', pathData), - topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2); - - path.stroke = new fabric.Pattern({ - source: this.source || this.getPatternSrcFunction(), - offsetX: -topLeft.x, - offsetY: -topLeft.y - }); - return path; - } -}); - - -(function() { - - var getPointer = fabric.util.getPointer, - degreesToRadians = fabric.util.degreesToRadians, - isTouchEvent = fabric.util.isTouchEvent; - - /** - * Canvas class - * @class fabric.Canvas - * @extends fabric.StaticCanvas - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} - * @see {@link fabric.Canvas#initialize} for constructor definition - * - * @fires object:modified at the end of a transform or any change when statefull is true - * @fires object:rotating while an object is being rotated from the control - * @fires object:scaling while an object is being scaled by controls - * @fires object:moving while an object is being dragged - * @fires object:skewing while an object is being skewed from the controls - * - * @fires before:transform before a transform is is started - * @fires before:selection:cleared - * @fires selection:cleared - * @fires selection:updated - * @fires selection:created - * - * @fires path:created after a drawing operation ends and the path is added - * @fires mouse:down - * @fires mouse:move - * @fires mouse:up - * @fires mouse:down:before on mouse down, before the inner fabric logic runs - * @fires mouse:move:before on mouse move, before the inner fabric logic runs - * @fires mouse:up:before on mouse up, before the inner fabric logic runs - * @fires mouse:over - * @fires mouse:out - * @fires mouse:dblclick whenever a native dbl click event fires on the canvas. - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop - * @fires after:render at the end of the render process, receives the context in the callback - * @fires before:render at start the render process, receives the context in the callback - * - * the following events are deprecated: - * @fires object:rotated at the end of a rotation transform - * @fires object:scaled at the end of a scale transform - * @fires object:moved at the end of translation transform - * @fires object:skewed at the end of a skew transform - */ - fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ { - - /** - * Constructor - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(el, options) { - options || (options = { }); - this.renderAndResetBound = this.renderAndReset.bind(this); - this.requestRenderAllBound = this.requestRenderAll.bind(this); - this._initStatic(el, options); - this._initInteractive(); - this._createCacheCanvas(); - }, - - /** - * When true, objects can be transformed by one side (unproportionally) - * when dragged on the corners that normally would not do that. - * @type Boolean - * @default - * @since fabric 4.0 // changed name and default value - */ - uniformScaling: true, - - /** - * Indicates which key switches uniform scaling. - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * totally wrong named. this sounds like `uniform scaling` - * if Canvas.uniformScaling is true, pressing this will set it to false - * and viceversa. - * @since 1.6.2 - * @type String - * @default - */ - uniScaleKey: 'shiftKey', - - /** - * When true, objects use center point as the origin of scale transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, objects use center point as the origin of rotate transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: false, - - /** - * Indicates which key enable centered Transform - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - centeredKey: 'altKey', - - /** - * Indicates which key enable alternate action on corner - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - altActionKey: 'shiftKey', - - /** - * Indicates that canvas is interactive. This property should not be changed. - * @type Boolean - * @default - */ - interactive: true, - - /** - * Indicates whether group selection should be enabled - * @type Boolean - * @default - */ - selection: true, - - /** - * Indicates which key or keys enable multiple click selection - * Pass value as a string or array of strings - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or empty or containing any other string that is not a modifier key - * feature is disabled. - * @since 1.6.2 - * @type String|Array - * @default - */ - selectionKey: 'shiftKey', - - /** - * Indicates which key enable alternative selection - * in case of target overlapping with active object - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * For a series of reason that come from the general expectations on how - * things should work, this feature works only for preserveObjectStacking true. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * @since 1.6.5 - * @type null|String - * @default - */ - altSelectionKey: null, - - /** - * Color of selection - * @type String - * @default - */ - selectionColor: 'rgba(100, 100, 255, 0.3)', // blue - - /** - * Default dash array pattern - * If not empty the selection border is dashed - * @type Array - */ - selectionDashArray: [], - - /** - * Color of the border of selection (usually slightly darker than color of selection itself) - * @type String - * @default - */ - selectionBorderColor: 'rgba(255, 255, 255, 0.3)', - - /** - * Width of a line used in object/group selection - * @type Number - * @default - */ - selectionLineWidth: 1, - - /** - * Select only shapes that are fully contained in the dragged selection rectangle. - * @type Boolean - * @default - */ - selectionFullyContained: false, - - /** - * Default cursor value used when hovering over an object on canvas - * @type String - * @default - */ - hoverCursor: 'move', - - /** - * Default cursor value used when moving an object on canvas - * @type String - * @default - */ - moveCursor: 'move', - - /** - * Default cursor value used for the entire canvas - * @type String - * @default - */ - defaultCursor: 'default', - - /** - * Cursor value used during free drawing - * @type String - * @default - */ - freeDrawingCursor: 'crosshair', - - /** - * Cursor value used for rotation point - * @type String - * @default - */ - rotationCursor: 'crosshair', - - /** - * Cursor value used for disabled elements ( corners with disabled action ) - * @type String - * @since 2.0.0 - * @default - */ - notAllowedCursor: 'not-allowed', - - /** - * Default element class that's given to wrapper (div) element of canvas - * @type String - * @default - */ - containerClass: 'canvas-container', - - /** - * When true, object detection happens on per-pixel basis rather than on per-bounding-box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * Number of pixels around target pixel to tolerate (consider active) during object detection - * @type Number - * @default - */ - targetFindTolerance: 0, - - /** - * When true, target detection is skipped. Target detection will return always undefined. - * click selection won't work anymore, events will fire with no targets. - * if something is selected before setting it to true, it will be deselected at the first click. - * area selection will still work. check the `selection` property too. - * if you deactivate both, you should look into staticCanvas. - * @type Boolean - * @default - */ - skipTargetFind: false, - - /** - * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. - * After mousedown, mousemove creates a shape, - * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. - * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} - * @type Boolean - * @default - */ - isDrawingMode: false, - - /** - * Indicates whether objects should remain in current stack position when selected. - * When false objects are brought to top and rendered as part of the selection group - * @type Boolean - * @default - */ - preserveObjectStacking: false, - - /** - * Indicates the angle that an object will lock to while rotating. - * @type Number - * @since 1.6.7 - * @default - */ - snapAngle: 0, - - /** - * Indicates the distance from the snapAngle the rotation will lock to the snapAngle. - * When `null`, the snapThreshold will default to the snapAngle. - * @type null|Number - * @since 1.6.7 - * @default - */ - snapThreshold: null, - - /** - * Indicates if the right click on canvas can output the context menu or not - * @type Boolean - * @since 1.6.5 - * @default - */ - stopContextMenu: false, - - /** - * Indicates if the canvas can fire right click events - * @type Boolean - * @since 1.6.5 - * @default - */ - fireRightClick: false, - - /** - * Indicates if the canvas can fire middle click events - * @type Boolean - * @since 1.7.8 - * @default - */ - fireMiddleClick: false, - - /** - * Keep track of the subTargets for Mouse Events - * @type fabric.Object[] - */ - targets: [], - - /** - * Keep track of the hovered target - * @type fabric.Object - * @private - */ - _hoveredTarget: null, - - /** - * hold the list of nested targets hovered - * @type fabric.Object[] - * @private - */ - _hoveredTargets: [], - - /** - * @private - */ - _initInteractive: function() { - this._currentTransform = null; - this._groupSelector = null; - this._initWrapperElement(); - this._createUpperCanvas(); - this._initEventListeners(); - - this._initRetinaScaling(); - - this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this); - - this.calcOffset(); - }, - - /** - * Divides objects in two groups, one to render immediately - * and one to render as activeGroup. - * @return {Array} objects to render immediately and pushes the other in the activeGroup. - */ - _chooseObjectsToRender: function() { - var activeObjects = this.getActiveObjects(), - object, objsToRender, activeGroupObjects; - - if (activeObjects.length > 0 && !this.preserveObjectStacking) { - objsToRender = []; - activeGroupObjects = []; - for (var i = 0, length = this._objects.length; i < length; i++) { - object = this._objects[i]; - if (activeObjects.indexOf(object) === -1 ) { - objsToRender.push(object); - } - else { - activeGroupObjects.push(object); - } - } - if (activeObjects.length > 1) { - this._activeObject._objects = activeGroupObjects; - } - objsToRender.push.apply(objsToRender, activeGroupObjects); - } - else { - objsToRender = this._objects; - } - return objsToRender; - }, - - /** - * Renders both the top canvas and the secondary container canvas. - * @return {fabric.Canvas} instance - * @chainable - */ - renderAll: function () { - if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) { - this.clearContext(this.contextTop); - this.contextTopDirty = false; - } - if (this.hasLostContext) { - this.renderTopLayer(this.contextTop); - } - var canvasToDrawOn = this.contextContainer; - this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender()); - return this; - }, - - renderTopLayer: function(ctx) { - ctx.save(); - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this.freeDrawingBrush && this.freeDrawingBrush._render(); - this.contextTopDirty = true; - } - // we render the top context - last object - if (this.selection && this._groupSelector) { - this._drawSelection(ctx); - this.contextTopDirty = true; - } - ctx.restore(); - }, - - /** - * Method to render only the top canvas. - * Also used to render the group selection box. - * @return {fabric.Canvas} thisArg - * @chainable - */ - renderTop: function () { - var ctx = this.contextTop; - this.clearContext(ctx); - this.renderTopLayer(ctx); - this.fire('after:render'); - return this; - }, - - /** - * @private - */ - _normalizePointer: function (object, pointer) { - var m = object.calcTransformMatrix(), - invertedM = fabric.util.invertTransform(m), - vptPointer = this.restorePointerVpt(pointer); - return fabric.util.transformPoint(vptPointer, invertedM); - }, - - /** - * Returns true if object is transparent at a certain location - * @param {fabric.Object} target Object to check - * @param {Number} x Left coordinate - * @param {Number} y Top coordinate - * @return {Boolean} - */ - isTargetTransparent: function (target, x, y) { - // in case the target is the activeObject, we cannot execute this optimization - // because we need to draw controls too. - if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) { - var normalizedPointer = this._normalizePointer(target, {x: x, y: y}), - targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0), - targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0); - - var isTransparent = fabric.util.isTransparent( - target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance); - - return isTransparent; - } - - var ctx = this.contextCache, - originalColor = target.selectionBackgroundColor, v = this.viewportTransform; - - target.selectionBackgroundColor = ''; - - this.clearContext(ctx); - - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - target.render(ctx); - ctx.restore(); - - target.selectionBackgroundColor = originalColor; - - var isTransparent = fabric.util.isTransparent( - ctx, x, y, this.targetFindTolerance); - - return isTransparent; - }, - - /** - * takes an event and determines if selection key has been pressed - * @private - * @param {Event} e Event object - */ - _isSelectionKeyPressed: function(e) { - var selectionKeyPressed = false; - - if (Object.prototype.toString.call(this.selectionKey) === '[object Array]') { - selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; }); - } - else { - selectionKeyPressed = e[this.selectionKey]; - } - - return selectionKeyPressed; - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _shouldClearSelection: function (e, target) { - var activeObjects = this.getActiveObjects(), - activeObject = this._activeObject; - - return ( - !target - || - (target && - activeObject && - activeObjects.length > 1 && - activeObjects.indexOf(target) === -1 && - activeObject !== target && - !this._isSelectionKeyPressed(e)) - || - (target && !target.evented) - || - (target && - !target.selectable && - activeObject && - activeObject !== target) - ); - }, - - /** - * centeredScaling from object can't override centeredScaling from canvas. - * this should be fixed, since object setting should take precedence over canvas. - * also this should be something that will be migrated in the control properties. - * as ability to define the origin of the transformation that the control provide. - * @private - * @param {fabric.Object} target - * @param {String} action - * @param {Boolean} altKey - */ - _shouldCenterTransform: function (target, action, altKey) { - if (!target) { - return; - } - - var centerTransform; - - if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') { - centerTransform = this.centeredScaling || target.centeredScaling; - } - else if (action === 'rotate') { - centerTransform = this.centeredRotation || target.centeredRotation; - } - - return centerTransform ? !altKey : altKey; - }, - - /** - * should disappear before release 4.0 - * @private - */ - _getOriginFromCorner: function(target, corner) { - var origin = { - x: target.originX, - y: target.originY - }; - - if (corner === 'ml' || corner === 'tl' || corner === 'bl') { - origin.x = 'right'; - } - else if (corner === 'mr' || corner === 'tr' || corner === 'br') { - origin.x = 'left'; - } - - if (corner === 'tl' || corner === 'mt' || corner === 'tr') { - origin.y = 'bottom'; - } - else if (corner === 'bl' || corner === 'mb' || corner === 'br') { - origin.y = 'top'; - } - return origin; - }, - - /** - * @private - * @param {Boolean} alreadySelected true if target is already selected - * @param {String} corner a string representing the corner ml, mr, tl ... - * @param {Event} e Event object - * @param {fabric.Object} [target] inserted back to help overriding. Unused - */ - _getActionFromCorner: function(alreadySelected, corner, e, target) { - if (!corner || !alreadySelected) { - return 'drag'; - } - var control = target.controls[corner]; - return control.getActionName(e, control, target); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _setupCurrentTransform: function (e, target, alreadySelected) { - if (!target) { - return; - } - - var pointer = this.getPointer(e), corner = target.__corner, - control = target.controls[corner], - actionHandler = (alreadySelected && corner) ? - control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler, - action = this._getActionFromCorner(alreadySelected, corner, e, target), - origin = this._getOriginFromCorner(target, corner), - altKey = e[this.centeredKey], - transform = { - target: target, - action: action, - actionHandler: actionHandler, - corner: corner, - scaleX: target.scaleX, - scaleY: target.scaleY, - skewX: target.skewX, - skewY: target.skewY, - // used by transation - offsetX: pointer.x - target.left, - offsetY: pointer.y - target.top, - originX: origin.x, - originY: origin.y, - ex: pointer.x, - ey: pointer.y, - lastX: pointer.x, - lastY: pointer.y, - // unsure they are useful anymore. - // left: target.left, - // top: target.top, - theta: degreesToRadians(target.angle), - // end of unsure - width: target.width * target.scaleX, - shiftKey: e.shiftKey, - altKey: altKey, - original: fabric.util.saveObjectTransform(target), - }; - - if (this._shouldCenterTransform(target, action, altKey)) { - transform.originX = 'center'; - transform.originY = 'center'; - } - transform.original.originX = origin.x; - transform.original.originY = origin.y; - this._currentTransform = transform; - this._beforeTransform(e); - }, - - /** - * Set the cursor type of the canvas element - * @param {String} value Cursor type of the canvas element. - * @see http://www.w3.org/TR/css3-ui/#cursor - */ - setCursor: function (value) { - this.upperCanvasEl.style.cursor = value; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx to draw the selection on - */ - _drawSelection: function (ctx) { - var selector = this._groupSelector, - viewportStart = new fabric.Point(selector.ex, selector.ey), - start = fabric.util.transformPoint(viewportStart, this.viewportTransform), - viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top), - extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform), - minX = Math.min(start.x, extent.x), - minY = Math.min(start.y, extent.y), - maxX = Math.max(start.x, extent.x), - maxY = Math.max(start.y, extent.y), - strokeOffset = this.selectionLineWidth / 2; - - if (this.selectionColor) { - ctx.fillStyle = this.selectionColor; - ctx.fillRect(minX, minY, maxX - minX, maxY - minY); - } - - if (!this.selectionLineWidth || !this.selectionBorderColor) { - return; - } - ctx.lineWidth = this.selectionLineWidth; - ctx.strokeStyle = this.selectionBorderColor; - - minX += strokeOffset; - minY += strokeOffset; - maxX -= strokeOffset; - maxY -= strokeOffset; - // selection border - fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray); - ctx.strokeRect(minX, minY, maxX - minX, maxY - minY); - }, - - /** - * Method that determines what object we are clicking on - * the skipGroup parameter is for internal use, is needed for shift+click action - * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target - * or the outside part of the corner. - * @param {Event} e mouse event - * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through - * @return {fabric.Object} the target found - */ - findTarget: function (e, skipGroup) { - if (this.skipTargetFind) { - return; - } - - var ignoreZoom = true, - pointer = this.getPointer(e, ignoreZoom), - activeObject = this._activeObject, - aObjects = this.getActiveObjects(), - activeTarget, activeTargetSubs, - isTouch = isTouchEvent(e), - shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1; - - // first check current group (if one exists) - // active group does not check sub targets like normal groups. - // if active group just exits. - this.targets = []; - - // if we hit the corner of an activeObject, let's return that. - if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) { - return activeObject; - } - if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) { - return activeObject; - } - if (aObjects.length === 1 && - activeObject === this._searchPossibleTargets([activeObject], pointer)) { - if (!this.preserveObjectStacking) { - return activeObject; - } - else { - activeTarget = activeObject; - activeTargetSubs = this.targets; - this.targets = []; - } - } - var target = this._searchPossibleTargets(this._objects, pointer); - if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { - target = activeTarget; - this.targets = activeTargetSubs; - } - return target; - }, - - /** - * Checks point is inside the object. - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @param {fabric.Object} obj Object to test against - * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target. - * @return {Boolean} true if point is contained within an area of given object - * @private - */ - _checkTarget: function(pointer, obj, globalPointer) { - if (obj && - obj.visible && - obj.evented && - // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html - // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html - obj.containsPoint(pointer) - ) { - if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { - var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y); - if (!isTransparent) { - return true; - } - } - else { - return true; - } - } - }, - - /** - * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted - * @param {Array} [objects] objects array to look into - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @return {fabric.Object} object that contains pointer - * @private - */ - _searchPossibleTargets: function(objects, pointer) { - // Cache all targets where their bounding box contains point. - var target, i = objects.length, subTarget; - // Do not check for currently grouped objects, since we check the parent group itself. - // until we call this function specifically to search inside the activeGroup - while (i--) { - var objToCheck = objects[i]; - var pointerToUse = objToCheck.group ? - this._normalizePointer(objToCheck.group, pointer) : pointer; - if (this._checkTarget(pointerToUse, objToCheck, pointer)) { - target = objects[i]; - if (target.subTargetCheck && target instanceof fabric.Group) { - subTarget = this._searchPossibleTargets(target._objects, pointer); - subTarget && this.targets.push(subTarget); - } - break; - } - } - return target; - }, - - /** - * Returns pointer coordinates without the effect of the viewport - * @param {Object} pointer with "x" and "y" number values - * @return {Object} object with "x" and "y" number values - */ - restorePointerVpt: function(pointer) { - return fabric.util.transformPoint( - pointer, - fabric.util.invertTransform(this.viewportTransform) - ); - }, - - /** - * Returns pointer coordinates relative to canvas. - * Can return coordinates with or without viewportTransform. - * ignoreZoom false gives back coordinates that represent - * the point clicked on canvas element. - * ignoreZoom true gives back coordinates after being processed - * by the viewportTransform ( sort of coordinates of what is displayed - * on the canvas where you are clicking. - * ignoreZoom true = HTMLElement coordinates relative to top,left - * ignoreZoom false, default = fabric space coordinates, the same used for shape position - * To interact with your shapes top and left you want to use ignoreZoom true - * most of the time, while ignoreZoom false will give you coordinates - * compatible with the object.oCoords system. - * of the time. - * @param {Event} e - * @param {Boolean} ignoreZoom - * @return {Object} object with "x" and "y" number values - */ - getPointer: function (e, ignoreZoom) { - // return cached values if we are in the event processing chain - if (this._absolutePointer && !ignoreZoom) { - return this._absolutePointer; - } - if (this._pointer && ignoreZoom) { - return this._pointer; - } - - var pointer = getPointer(e), - upperCanvasEl = this.upperCanvasEl, - bounds = upperCanvasEl.getBoundingClientRect(), - boundsWidth = bounds.width || 0, - boundsHeight = bounds.height || 0, - cssScale; - - if (!boundsWidth || !boundsHeight ) { - if ('top' in bounds && 'bottom' in bounds) { - boundsHeight = Math.abs( bounds.top - bounds.bottom ); - } - if ('right' in bounds && 'left' in bounds) { - boundsWidth = Math.abs( bounds.right - bounds.left ); - } - } - - this.calcOffset(); - pointer.x = pointer.x - this._offset.left; - pointer.y = pointer.y - this._offset.top; - if (!ignoreZoom) { - pointer = this.restorePointerVpt(pointer); - } - - var retinaScaling = this.getRetinaScaling(); - if (retinaScaling !== 1) { - pointer.x /= retinaScaling; - pointer.y /= retinaScaling; - } - - if (boundsWidth === 0 || boundsHeight === 0) { - // If bounds are not available (i.e. not visible), do not apply scale. - cssScale = { width: 1, height: 1 }; - } - else { - cssScale = { - width: upperCanvasEl.width / boundsWidth, - height: upperCanvasEl.height / boundsHeight - }; - } - - return { - x: pointer.x * cssScale.width, - y: pointer.y * cssScale.height - }; - }, - - /** - * @private - * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized - */ - _createUpperCanvas: function () { - var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/, ''), - lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl; - - // there is no need to create a new upperCanvas element if we have already one. - if (upperCanvasEl) { - upperCanvasEl.className = ''; - } - else { - upperCanvasEl = this._createCanvasElement(); - this.upperCanvasEl = upperCanvasEl; - } - fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass); - - this.wrapperEl.appendChild(upperCanvasEl); - - this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl); - this._applyCanvasStyle(upperCanvasEl); - this.contextTop = upperCanvasEl.getContext('2d'); - }, - - /** - * @private - */ - _createCacheCanvas: function () { - this.cacheCanvasEl = this._createCanvasElement(); - this.cacheCanvasEl.setAttribute('width', this.width); - this.cacheCanvasEl.setAttribute('height', this.height); - this.contextCache = this.cacheCanvasEl.getContext('2d'); - }, - - /** - * @private - */ - _initWrapperElement: function () { - this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { - 'class': this.containerClass - }); - fabric.util.setStyle(this.wrapperEl, { - width: this.width + 'px', - height: this.height + 'px', - position: 'relative' - }); - fabric.util.makeElementUnselectable(this.wrapperEl); - }, - - /** - * @private - * @param {HTMLElement} element canvas element to apply styles on - */ - _applyCanvasStyle: function (element) { - var width = this.width || element.width, - height = this.height || element.height; - - fabric.util.setStyle(element, { - position: 'absolute', - width: width + 'px', - height: height + 'px', - left: 0, - top: 0, - 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none', - '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none' - }); - element.width = width; - element.height = height; - fabric.util.makeElementUnselectable(element); - }, - - /** - * Copy the entire inline style from one element (fromEl) to another (toEl) - * @private - * @param {Element} fromEl Element style is copied from - * @param {Element} toEl Element copied style is applied to - */ - _copyCanvasStyle: function (fromEl, toEl) { - toEl.style.cssText = fromEl.style.cssText; - }, - - /** - * Returns context of canvas where object selection is drawn - * @return {CanvasRenderingContext2D} - */ - getSelectionContext: function() { - return this.contextTop; - }, - - /** - * Returns <canvas> element on which object selection is drawn - * @return {HTMLCanvasElement} - */ - getSelectionElement: function () { - return this.upperCanvasEl; - }, - - /** - * Returns currently active object - * @return {fabric.Object} active object - */ - getActiveObject: function () { - return this._activeObject; - }, - - /** - * Returns an array with the current selected objects - * @return {fabric.Object} active object - */ - getActiveObjects: function () { - var active = this._activeObject; - if (active) { - if (active.type === 'activeSelection' && active._objects) { - return active._objects.slice(0); - } - else { - return [active]; - } - } - return []; - }, - - /** - * @private - * @param {fabric.Object} obj Object that was removed - */ - _onObjectRemoved: function(obj) { - // removing active object should fire "selection:cleared" events - if (obj === this._activeObject) { - this.fire('before:selection:cleared', { target: obj }); - this._discardActiveObject(); - this.fire('selection:cleared', { target: obj }); - obj.fire('deselected'); - } - if (obj === this._hoveredTarget){ - this._hoveredTarget = null; - this._hoveredTargets = []; - } - this.callSuper('_onObjectRemoved', obj); - }, - - /** - * @private - * Compares the old activeObject with the current one and fires correct events - * @param {fabric.Object} obj old activeObject - */ - _fireSelectionEvents: function(oldObjects, e) { - var somethingChanged = false, objects = this.getActiveObjects(), - added = [], removed = []; - oldObjects.forEach(function(oldObject) { - if (objects.indexOf(oldObject) === -1) { - somethingChanged = true; - oldObject.fire('deselected', { - e: e, - target: oldObject - }); - removed.push(oldObject); - } - }); - objects.forEach(function(object) { - if (oldObjects.indexOf(object) === -1) { - somethingChanged = true; - object.fire('selected', { - e: e, - target: object - }); - added.push(object); - } - }); - if (oldObjects.length > 0 && objects.length > 0) { - somethingChanged && this.fire('selection:updated', { - e: e, - selected: added, - deselected: removed, - // added for backward compatibility - // deprecated - updated: added[0] || removed[0], - target: this._activeObject, - }); - } - else if (objects.length > 0) { - this.fire('selection:created', { - e: e, - selected: added, - target: this._activeObject, - }); - } - else if (oldObjects.length > 0) { - this.fire('selection:cleared', { - e: e, - deselected: removed, - }); - } - }, - - /** - * Sets given object as the only active object on canvas - * @param {fabric.Object} object Object to set as an active one - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {fabric.Canvas} thisArg - * @chainable - */ - setActiveObject: function (object, e) { - var currentActives = this.getActiveObjects(); - this._setActiveObject(object, e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to setActiveObject but without firing - * any event. There is commitment to have this stay this way. - * This is the functional part of setActiveObject. - * @private - * @param {Object} object to set as active - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {Boolean} true if the selection happened - */ - _setActiveObject: function(object, e) { - if (this._activeObject === object) { - return false; - } - if (!this._discardActiveObject(e, object)) { - return false; - } - if (object.onSelect({ e: e })) { - return false; - } - this._activeObject = object; - return true; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to discardActiveObject but without firing - * any events. There is commitment to have this stay this way. - * This is the functional part of discardActiveObject. - * @param {Event} [e] Event (passed along when firing "object:deselected") - * @param {Object} object to set as active - * @return {Boolean} true if the selection happened - * @private - */ - _discardActiveObject: function(e, object) { - var obj = this._activeObject; - if (obj) { - // onDeselect return TRUE to cancel selection; - if (obj.onDeselect({ e: e, object: object })) { - return false; - } - this._activeObject = null; - } - return true; - }, - - /** - * Discards currently active object and fire events. If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parameter and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @param {event} e - * @return {fabric.Canvas} thisArg - * @chainable - */ - discardActiveObject: function (e) { - var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject(); - if (currentActives.length) { - this.fire('before:selection:cleared', { target: activeObject, e: e }); - } - this._discardActiveObject(e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * Clears a canvas element and removes all event listeners - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - var wrapper = this.wrapperEl; - this.removeListeners(); - wrapper.removeChild(this.upperCanvasEl); - wrapper.removeChild(this.lowerCanvasEl); - this.contextCache = null; - this.contextTop = null; - ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - if (wrapper.parentNode) { - wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl); - } - delete this.wrapperEl; - fabric.StaticCanvas.prototype.dispose.call(this); - return this; - }, - - /** - * Clears all contexts (background, main, top) of an instance - * @return {fabric.Canvas} thisArg - * @chainable - */ - clear: function () { - // this.discardActiveGroup(); - this.discardActiveObject(); - this.clearContext(this.contextTop); - return this.callSuper('clear'); - }, - - /** - * Draws objects' controls (borders/controls) - * @param {CanvasRenderingContext2D} ctx Context to render controls on - */ - drawControls: function(ctx) { - var activeObject = this._activeObject; - - if (activeObject) { - activeObject._renderControls(ctx); - } - }, - - /** - * @private - */ - _toObject: function(instance, methodName, propertiesToInclude) { - //If the object is part of the current selection group, it should - //be transformed appropriately - //i.e. it should be serialised as it would appear if the selection group - //were to be destroyed. - var originalProperties = this._realizeGroupTransformOnObject(instance), - object = this.callSuper('_toObject', instance, methodName, propertiesToInclude); - //Undo the damage we did by changing all of its properties - this._unwindGroupTransformOnObject(instance, originalProperties); - return object; - }, - - /** - * Realises an object's group transformation on it - * @private - * @param {fabric.Object} [instance] the object to transform (gets mutated) - * @returns the original values of instance which were changed - */ - _realizeGroupTransformOnObject: function(instance) { - if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) { - var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top']; - //Copy all the positionally relevant properties across now - var originalValues = {}; - layoutProps.forEach(function(prop) { - originalValues[prop] = instance[prop]; - }); - fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix()); - return originalValues; - } - else { - return null; - } - }, - - /** - * Restores the changed properties of instance - * @private - * @param {fabric.Object} [instance] the object to un-transform (gets mutated) - * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject - */ - _unwindGroupTransformOnObject: function(instance, originalValues) { - if (originalValues) { - instance.set(originalValues); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - //If the object is in a selection group, simulate what would happen to that - //object when the group is deselected - var originalProperties = this._realizeGroupTransformOnObject(instance); - this.callSuper('_setSVGObject', markup, instance, reviver); - this._unwindGroupTransformOnObject(instance, originalProperties); - }, - - setViewportTransform: function (vpt) { - if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) { - this._activeObject.clearContextTop(); - } - fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt); - } - }); - - // copying static properties manually to work around Opera's bug, - // where "prototype" property is enumerable and overrides existing prototype - for (var prop in fabric.StaticCanvas) { - if (prop !== 'prototype') { - fabric.Canvas[prop] = fabric.StaticCanvas[prop]; - } - } -})(); - - -(function() { - - var addListener = fabric.util.addListener, - removeListener = fabric.util.removeListener, - RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1, - addEventOptions = { passive: false }; - - function checkClick(e, value) { - return e.button && (e.button === value - 1); - } - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * Contains the id of the touch event that owns the fabric transform - * @type Number - * @private - */ - mainTouchId: null, - - /** - * Adds mouse listeners to canvas - * @private - */ - _initEventListeners: function () { - // in case we initialized the class twice. This should not happen normally - // but in some kind of applications where the canvas element may be changed - // this is a workaround to having double listeners. - this.removeListeners(); - this._bindEvents(); - this.addOrRemove(addListener, 'add'); - }, - - /** - * return an event prefix pointer or mouse. - * @private - */ - _getEventPrefix: function () { - return this.enablePointerEvents ? 'pointer' : 'mouse'; - }, - - addOrRemove: function(functor, eventjsFunctor) { - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - functor(fabric.window, 'resize', this._onResize); - functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut); - functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter); - functor(canvasElement, 'wheel', this._onMouseWheel); - functor(canvasElement, 'contextmenu', this._onContextMenu); - functor(canvasElement, 'dblclick', this._onDoubleClick); - functor(canvasElement, 'dragover', this._onDragOver); - functor(canvasElement, 'dragenter', this._onDragEnter); - functor(canvasElement, 'dragleave', this._onDragLeave); - functor(canvasElement, 'drop', this._onDrop); - if (!this.enablePointerEvents) { - functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions); - } - if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) { - eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture); - eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag); - eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange); - eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake); - eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress); - } - }, - - /** - * Removes all event listeners - */ - removeListeners: function() { - this.addOrRemove(removeListener, 'remove'); - // if you dispose on a mouseDown, before mouse up, you need to clean document to... - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - }, - - /** - * @private - */ - _bindEvents: function() { - if (this.eventsBound) { - // for any reason we pass here twice we do not want to bind events twice. - return; - } - this._onMouseDown = this._onMouseDown.bind(this); - this._onTouchStart = this._onTouchStart.bind(this); - this._onMouseMove = this._onMouseMove.bind(this); - this._onMouseUp = this._onMouseUp.bind(this); - this._onTouchEnd = this._onTouchEnd.bind(this); - this._onResize = this._onResize.bind(this); - this._onGesture = this._onGesture.bind(this); - this._onDrag = this._onDrag.bind(this); - this._onShake = this._onShake.bind(this); - this._onLongPress = this._onLongPress.bind(this); - this._onOrientationChange = this._onOrientationChange.bind(this); - this._onMouseWheel = this._onMouseWheel.bind(this); - this._onMouseOut = this._onMouseOut.bind(this); - this._onMouseEnter = this._onMouseEnter.bind(this); - this._onContextMenu = this._onContextMenu.bind(this); - this._onDoubleClick = this._onDoubleClick.bind(this); - this._onDragOver = this._onDragOver.bind(this); - this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter'); - this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave'); - this._onDrop = this._simpleEventHandler.bind(this, 'drop'); - this.eventsBound = true; - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js gesture - * @param {Event} [self] Inner Event object - */ - _onGesture: function(e, self) { - this.__onTransformGesture && this.__onTransformGesture(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js drag - * @param {Event} [self] Inner Event object - */ - _onDrag: function(e, self) { - this.__onDrag && this.__onDrag(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on wheel event - */ - _onMouseWheel: function(e) { - this.__onMouseWheel(e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseOut: function(e) { - var target = this._hoveredTarget; - this.fire('mouse:out', { target: target, e: e }); - this._hoveredTarget = null; - target && target.fire('mouseout', { e: e }); - - var _this = this; - this._hoveredTargets.forEach(function(_target){ - _this.fire('mouse:out', { target: target, e: e }); - _target && target.fire('mouseout', { e: e }); - }); - this._hoveredTargets = []; - - if (this._iTextInstances) { - this._iTextInstances.forEach(function(obj) { - if (obj.isEditing) { - obj.hiddenTextarea.focus(); - } - }); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mouseenter - */ - _onMouseEnter: function(e) { - // This find target and consequent 'mouse:over' is used to - // clear old instances on hovered target. - // calling findTarget has the side effect of killing target.__corner. - // as a short term fix we are not firing this if we are currently transforming. - // as a long term fix we need to separate the action of finding a target with the - // side effects we added to it. - if (!this._currentTransform && !this.findTarget(e)) { - this.fire('mouse:over', { target: null, e: e }); - this._hoveredTarget = null; - this._hoveredTargets = []; - } - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js orientation change - * @param {Event} [self] Inner Event object - */ - _onOrientationChange: function(e, self) { - this.__onOrientationChange && this.__onOrientationChange(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onShake: function(e, self) { - this.__onShake && this.__onShake(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onLongPress: function(e, self) { - this.__onLongPress && this.__onLongPress(e, self); - }, - - /** - * prevent default to allow drop event to be fired - * @private - * @param {Event} [e] Event object fired on Event.js shake - */ - _onDragOver: function(e) { - e.preventDefault(); - var target = this._simpleEventHandler('dragover', e); - this._fireEnterLeaveEvents(target, e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onContextMenu: function (e) { - if (this.stopContextMenu) { - e.stopPropagation(); - e.preventDefault(); - } - return false; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onDoubleClick: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'dblclick'); - this._resetTransformEventData(e); - }, - - /** - * Return a the id of an event. - * returns either the pointerId or the identifier or 0 for the mouse event - * @private - * @param {Event} evt Event object - */ - getPointerId: function(evt) { - var changedTouches = evt.changedTouches; - - if (changedTouches) { - return changedTouches[0] && changedTouches[0].identifier; - } - - if (this.enablePointerEvents) { - return evt.pointerId; - } - - return -1; - }, - - /** - * Determines if an event has the id of the event that is considered main - * @private - * @param {evt} event Event object - */ - _isMainEvent: function(evt) { - if (evt.isPrimary === true) { - return true; - } - if (evt.isPrimary === false) { - return false; - } - if (evt.type === 'touchend' && evt.touches.length === 0) { - return true; - } - if (evt.changedTouches) { - return evt.changedTouches[0].identifier === this.mainTouchId; - } - return true; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchStart: function(e) { - e.preventDefault(); - if (this.mainTouchId === null) { - this.mainTouchId = this.getPointerId(e); - } - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - // Unbind mousedown to prevent double triggers from touch devices - removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDown: function (e) { - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchEnd: function(e) { - if (e.touches.length > 0) { - // if there are still touches stop here - return; - } - this.__onMouseUp(e); - this._resetTransformEventData(); - this.mainTouchId = null; - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - var _this = this; - if (this._willAddMouseDown) { - clearTimeout(this._willAddMouseDown); - } - this._willAddMouseDown = setTimeout(function() { - // Wait 400ms before rebinding mousedown to prevent double triggers - // from touch devices - addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown); - _this._willAddMouseDown = 0; - }, 400); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUp: function (e) { - this.__onMouseUp(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - if (this._isMainEvent(e)) { - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMove: function (e) { - !this.allowTouchScrolling && e.preventDefault && e.preventDefault(); - this.__onMouseMove(e); - }, - - /** - * @private - */ - _onResize: function () { - this.calcOffset(); - }, - - /** - * Decides whether the canvas should be redrawn in mouseup and mousedown events. - * @private - * @param {Object} target - */ - _shouldRender: function(target) { - var activeObject = this._activeObject; - - if ( - !!activeObject !== !!target || - (activeObject && target && (activeObject !== target)) - ) { - // this covers: switch of target, from target to no target, selection of target - // multiSelection with key and mouse - return true; - } - else if (activeObject && activeObject.isEditing) { - // if we mouse up/down over a editing textbox a cursor change, - // there is no need to re render - return false; - } - return false; - }, - - /** - * Method that defines the actions when mouse is released on canvas. - * The method resets the currentTransform parameters, store the image corner - * position in the image object and render the canvas on top. - * @private - * @param {Event} e Event object fired on mouseup - */ - __onMouseUp: function (e) { - var target, transform = this._currentTransform, - groupSelector = this._groupSelector, shouldRender = false, - isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0)); - this._cacheTransformEventData(e); - target = this._target; - this._handleEvent(e, 'up:before'); - // if right/middle click just fire events and return - // target undefined will make the _handleEvent search the target - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'up', RIGHT_CLICK, isClick); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'up', MIDDLE_CLICK, isClick); - } - this._resetTransformEventData(); - return; - } - - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this._onMouseUpInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - if (transform) { - this._finalizeCurrentTransform(e); - shouldRender = transform.actionPerformed; - } - if (!isClick) { - var targetWasActive = target === this._activeObject; - this._maybeGroupObjects(e); - if (!shouldRender) { - shouldRender = ( - this._shouldRender(target) || - (!targetWasActive && target === this._activeObject) - ); - } - } - if (target) { - if (target.selectable && target !== this._activeObject && target.activeOn === 'up') { - this.setActiveObject(target, e); - shouldRender = true; - } - else { - var corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - var control = target.controls[corner], - mouseUpHandler = control && control.getMouseUpHandler(e, target, control); - if (mouseUpHandler) { - var pointer = this.getPointer(e); - mouseUpHandler(e, transform, pointer.x, pointer.y); - } - } - target.isMoving = false; - } - this._setCursorFromEvent(e, target); - this._handleEvent(e, 'up', LEFT_CLICK, isClick); - this._groupSelector = null; - this._currentTransform = null; - // reset the target information about which corner is selected - target && (target.__corner = 0); - if (shouldRender) { - this.requestRenderAll(); - } - else if (!isClick) { - this.renderTop(); - } - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @return {Fabric.Object} target return the the target found, for internal reasons. - */ - _simpleEventHandler: function(eventType, e) { - var target = this.findTarget(e), - targets = this.targets, - options = { - e: e, - target: target, - subTargets: targets, - }; - this.fire(eventType, options); - target && target.fire(eventType, options); - if (!targets) { - return target; - } - for (var i = 0; i < targets.length; i++) { - targets[i].fire(eventType, options); - } - return target; - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @param {fabric.Object} targetObj receiving event - * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right - * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move. - */ - _handleEvent: function(e, eventType, button, isClick) { - var target = this._target, - targets = this.targets || [], - options = { - e: e, - target: target, - subTargets: targets, - button: button || LEFT_CLICK, - isClick: isClick || false, - pointer: this._pointer, - absolutePointer: this._absolutePointer, - transform: this._currentTransform - }; - if (eventType === 'up') { - options.currentTarget = this.findTarget(e); - options.currentSubTargets = this.targets; - } - this.fire('mouse:' + eventType, options); - target && target.fire('mouse' + eventType, options); - for (var i = 0; i < targets.length; i++) { - targets[i].fire('mouse' + eventType, options); - } - }, - - /** - * @private - * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event - */ - _finalizeCurrentTransform: function(e) { - - var transform = this._currentTransform, - target = transform.target, - eventName, - options = { - e: e, - target: target, - transform: transform, - action: transform.action, - }; - - if (target._scaling) { - target._scaling = false; - } - - target.setCoords(); - - if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) { - if (transform.actionPerformed) { - // this is not friendly to the new control api. - // is deprecated. - eventName = this._addEventOptions(options, transform); - this._fire(eventName, options); - } - this._fire('modified', options); - } - }, - - /** - * Mutate option object in order to add by property and give back the event name. - * @private - * @deprecated since 4.2.0 - * @param {Object} options to mutate - * @param {Object} transform to inspect action from - */ - _addEventOptions: function(options, transform) { - // we can probably add more details at low cost - // scale change, rotation changes, translation changes - var eventName, by; - switch (transform.action) { - case 'scaleX': - eventName = 'scaled'; - by = 'x'; - break; - case 'scaleY': - eventName = 'scaled'; - by = 'y'; - break; - case 'skewX': - eventName = 'skewed'; - by = 'x'; - break; - case 'skewY': - eventName = 'skewed'; - by = 'y'; - break; - case 'scale': - eventName = 'scaled'; - by = 'equally'; - break; - case 'rotate': - eventName = 'rotated'; - break; - case 'drag': - eventName = 'moved'; - break; - } - options.by = by; - return eventName; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDownInDrawingMode: function(e) { - this._isCurrentlyDrawing = true; - if (this.getActiveObject()) { - this.discardActiveObject(e).requestRenderAll(); - } - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer }); - this._handleEvent(e, 'down'); - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMoveInDrawingMode: function(e) { - if (this._isCurrentlyDrawing) { - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer }); - } - this.setCursor(this.freeDrawingCursor); - this._handleEvent(e, 'move'); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUpInDrawingMode: function(e) { - var pointer = this.getPointer(e); - this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer }); - this._handleEvent(e, 'up'); - }, - - /** - * Method that defines the actions when mouse is clicked on canvas. - * The method inits the currentTransform parameters and renders all the - * canvas so the current image can be placed on the top canvas and the rest - * in on the container one. - * @private - * @param {Event} e Event object fired on mousedown - */ - __onMouseDown: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'down:before'); - var target = this._target; - // if right click just fire events - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'down', RIGHT_CLICK); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'down', MIDDLE_CLICK); - } - return; - } - - if (this.isDrawingMode) { - this._onMouseDownInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - // ignore if some object is being transformed at this moment - if (this._currentTransform) { - return; - } - - var pointer = this._pointer; - // save pointer for check in __onMouseUp event - this._previousPointer = pointer; - var shouldRender = this._shouldRender(target), - shouldGroup = this._shouldGroup(e, target); - if (this._shouldClearSelection(e, target)) { - this.discardActiveObject(e); - } - else if (shouldGroup) { - this._handleGrouping(e, target); - target = this._activeObject; - } - - if (this.selection && (!target || - (!target.selectable && !target.isEditing && target !== this._activeObject))) { - this._groupSelector = { - ex: this._absolutePointer.x, - ey: this._absolutePointer.y, - top: 0, - left: 0 - }; - } - - if (target) { - var alreadySelected = target === this._activeObject; - if (target.selectable && target.activeOn === 'down') { - this.setActiveObject(target, e); - } - var corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - target.__corner = corner; - if (target === this._activeObject && (corner || !shouldGroup)) { - this._setupCurrentTransform(e, target, alreadySelected); - var control = target.controls[corner], - pointer = this.getPointer(e), - mouseDownHandler = control && control.getMouseDownHandler(e, target, control); - if (mouseDownHandler) { - mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y); - } - } - } - this._handleEvent(e, 'down'); - // we must renderAll so that we update the visuals - (shouldRender || shouldGroup) && this.requestRenderAll(); - }, - - /** - * reset cache form common information needed during event processing - * @private - */ - _resetTransformEventData: function() { - this._target = null; - this._pointer = null; - this._absolutePointer = null; - }, - - /** - * Cache common information needed during event processing - * @private - * @param {Event} e Event object fired on event - */ - _cacheTransformEventData: function(e) { - // reset in order to avoid stale caching - this._resetTransformEventData(); - this._pointer = this.getPointer(e, true); - this._absolutePointer = this.restorePointerVpt(this._pointer); - this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null; - }, - - /** - * @private - */ - _beforeTransform: function(e) { - var t = this._currentTransform; - this.stateful && t.target.saveState(); - this.fire('before:transform', { - e: e, - transform: t, - }); - }, - - /** - * Method that defines the actions when mouse is hovering the canvas. - * The currentTransform parameter will define whether the user is rotating/scaling/translating - * an image or neither of them (only hovering). A group selection is also possible and would cancel - * all any other type of action. - * In case of an image transformation only the top canvas will be rendered. - * @private - * @param {Event} e Event object fired on mousemove - */ - __onMouseMove: function (e) { - this._handleEvent(e, 'move:before'); - this._cacheTransformEventData(e); - var target, pointer; - - if (this.isDrawingMode) { - this._onMouseMoveInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - var groupSelector = this._groupSelector; - - // We initially clicked in an empty area, so we draw a box for multiple selection - if (groupSelector) { - pointer = this._absolutePointer; - - groupSelector.left = pointer.x - groupSelector.ex; - groupSelector.top = pointer.y - groupSelector.ey; - - this.renderTop(); - } - else if (!this._currentTransform) { - target = this.findTarget(e) || null; - this._setCursorFromEvent(e, target); - this._fireOverOutEvents(target, e); - } - else { - this._transformObject(e); - } - this._handleEvent(e, 'move'); - this._resetTransformEventData(); - }, - - /** - * Manage the mouseout, mouseover events for the fabric object on the canvas - * @param {Fabric.Object} target the target where the target from the mousemove event - * @param {Event} e Event object fired on mousemove - * @private - */ - _fireOverOutEvents: function(target, e) { - var _hoveredTarget = this._hoveredTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _hoveredTarget, - evtOut: 'mouseout', - canvasEvtOut: 'mouse:out', - evtIn: 'mouseover', - canvasEvtIn: 'mouse:over', - }); - for (var i = 0; i < length; i++){ - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'mouseout', - evtIn: 'mouseover', - }); - } - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - }, - - /** - * Manage the dragEnter, dragLeave events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the onDrag event - * @param {Event} e Event object fired on ondrag - * @private - */ - _fireEnterLeaveEvents: function(target, e) { - var _draggedoverTarget = this._draggedoverTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _draggedoverTarget, - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - for (var i = 0; i < length; i++) { - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - } - this._draggedoverTarget = target; - }, - - /** - * Manage the synthetic in/out events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the supported events - * @param {Event} e Event object fired - * @param {Object} config configuration for the function to work - * @param {String} config.targetName property on the canvas where the old target is stored - * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out - * @param {String} config.evtOut name of the event to fire for out - * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in - * @param {String} config.evtIn name of the event to fire for in - * @private - */ - fireSyntheticInOutEvents: function(target, e, config) { - var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires, - targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut; - if (targetChanged) { - inOpt = { e: e, target: target, previousTarget: oldTarget }; - outOpt = { e: e, target: oldTarget, nextTarget: target }; - } - inFires = target && targetChanged; - outFires = oldTarget && targetChanged; - if (outFires) { - canvasEvtOut && this.fire(canvasEvtOut, outOpt); - oldTarget.fire(config.evtOut, outOpt); - } - if (inFires) { - canvasEvtIn && this.fire(canvasEvtIn, inOpt); - target.fire(config.evtIn, inOpt); - } - }, - - /** - * Method that defines actions when an Event Mouse Wheel - * @param {Event} e Event object fired on mouseup - */ - __onMouseWheel: function(e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'wheel'); - this._resetTransformEventData(); - }, - - /** - * @private - * @param {Event} e Event fired on mousemove - */ - _transformObject: function(e) { - var pointer = this.getPointer(e), - transform = this._currentTransform; - - transform.reset = false; - transform.shiftKey = e.shiftKey; - transform.altKey = e[this.centeredKey]; - - this._performTransformAction(e, transform, pointer); - transform.actionPerformed && this.requestRenderAll(); - }, - - /** - * @private - */ - _performTransformAction: function(e, transform, pointer) { - var x = pointer.x, - y = pointer.y, - action = transform.action, - actionPerformed = false, - actionHandler = transform.actionHandler; - // this object could be created from the function in the control handlers - - - if (actionHandler) { - actionPerformed = actionHandler(e, transform, x, y); - } - if (action === 'drag' && actionPerformed) { - transform.target.isMoving = true; - this.setCursor(transform.target.moveCursor || this.moveCursor); - } - transform.actionPerformed = transform.actionPerformed || actionPerformed; - }, - - /** - * @private - */ - _fire: fabric.controlsUtils.fireEvent, - - /** - * Sets the cursor depending on where the canvas is being hovered. - * Note: very buggy in Opera - * @param {Event} e Event object - * @param {Object} target Object that the mouse is hovering, if so. - */ - _setCursorFromEvent: function (e, target) { - if (!target) { - this.setCursor(this.defaultCursor); - return false; - } - var hoverCursor = target.hoverCursor || this.hoverCursor, - activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ? - this._activeObject : null, - // only show proper corner when group selection is not active - corner = (!activeSelection || !activeSelection.contains(target)) - // here we call findTargetCorner always with undefined for the touch parameter. - // we assume that if you are using a cursor you do not need to interact with - // the bigger touch area. - && target._findTargetCorner(this.getPointer(e, true)); - - if (!corner) { - if (target.subTargetCheck){ - // hoverCursor should come from top-most subTarget, - // so we walk the array backwards - this.targets.concat().reverse().map(function(_target){ - hoverCursor = _target.hoverCursor || hoverCursor; - }); - } - this.setCursor(hoverCursor); - } - else { - this.setCursor(this.getCornerCursor(corner, target, e)); - } - }, - - /** - * @private - */ - getCornerCursor: function(corner, target, e) { - var control = target.controls[corner]; - return control.cursorStyleHandler(e, control, target); - } - }); -})(); - - -(function() { - - var min = Math.min, - max = Math.max; - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - * @return {Boolean} - */ - _shouldGroup: function(e, target) { - var activeObject = this._activeObject; - return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection && - (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e }); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _handleGrouping: function (e, target) { - var activeObject = this._activeObject; - // avoid multi select when shift click on a corner - if (activeObject.__corner) { - return; - } - if (target === activeObject) { - // if it's a group, find target again, using activeGroup objects - target = this.findTarget(e, true); - // if even object is not found or we are on activeObjectCorner, bail out - if (!target || !target.selectable) { - return; - } - } - if (activeObject && activeObject.type === 'activeSelection') { - this._updateActiveSelection(target, e); - } - else { - this._createActiveSelection(target, e); - } - }, - - /** - * @private - */ - _updateActiveSelection: function(target, e) { - var activeSelection = this._activeObject, - currentActiveObjects = activeSelection._objects.slice(0); - if (activeSelection.contains(target)) { - activeSelection.removeWithUpdate(target); - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - if (activeSelection.size() === 1) { - // activate last remaining object - this._setActiveObject(activeSelection.item(0), e); - } - } - else { - activeSelection.addWithUpdate(target); - this._hoveredTarget = activeSelection; - this._hoveredTargets = this.targets.concat(); - } - this._fireSelectionEvents(currentActiveObjects, e); - }, - - /** - * @private - */ - _createActiveSelection: function(target, e) { - var currentActives = this.getActiveObjects(), group = this._createGroup(target); - this._hoveredTarget = group; - // ISSUE 4115: should we consider subTargets here? - // this._hoveredTargets = []; - // this._hoveredTargets = this.targets.concat(); - this._setActiveObject(group, e); - this._fireSelectionEvents(currentActives, e); - }, - - /** - * @private - * @param {Object} target - */ - _createGroup: function(target) { - var objects = this._objects, - isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), - groupObjects = isActiveLower - ? [this._activeObject, target] - : [target, this._activeObject]; - this._activeObject.isEditing && this._activeObject.exitEditing(); - return new fabric.ActiveSelection(groupObjects, { - canvas: this - }); - }, - - /** - * @private - * @param {Event} e mouse event - */ - _groupSelectedObjects: function (e) { - - var group = this._collectObjects(e), - aGroup; - - // do not create group for 1 element only - if (group.length === 1) { - this.setActiveObject(group[0], e); - } - else if (group.length > 1) { - aGroup = new fabric.ActiveSelection(group.reverse(), { - canvas: this - }); - this.setActiveObject(aGroup, e); - } - }, - - /** - * @private - */ - _collectObjects: function(e) { - var group = [], - currentObject, - x1 = this._groupSelector.ex, - y1 = this._groupSelector.ey, - x2 = x1 + this._groupSelector.left, - y2 = y1 + this._groupSelector.top, - selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)), - selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)), - allowIntersect = !this.selectionFullyContained, - isClick = x1 === x2 && y1 === y2; - // we iterate reverse order to collect top first in case of click. - for (var i = this._objects.length; i--; ) { - currentObject = this._objects[i]; - - if (!currentObject || !currentObject.selectable || !currentObject.visible) { - continue; - } - - if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) || - currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) || - (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) || - (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true)) - ) { - group.push(currentObject); - // only add one object if it's a click - if (isClick) { - break; - } - } - } - - if (group.length > 1) { - group = group.filter(function(object) { - return !object.onSelect({ e: e }); - }); - } - - return group; - }, - - /** - * @private - */ - _maybeGroupObjects: function(e) { - if (this.selection && this._groupSelector) { - this._groupSelectedObjects(e); - } - this.setCursor(this.defaultCursor); - // clear selection and current transformation - this._groupSelector = null; - } - }); - -})(); - - -(function () { - fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately - * @param {Object} [options] Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo} - * @example Generate jpeg dataURL with lower quality - * var dataURL = canvas.toDataURL({ - * format: 'jpeg', - * quality: 0.8 - * }); - * @example Generate cropped png dataURL (clipping of canvas) - * var dataURL = canvas.toDataURL({ - * format: 'png', - * left: 100, - * top: 100, - * width: 200, - * height: 200 - * }); - * @example Generate double scaled png dataURL - * var dataURL = canvas.toDataURL({ - * format: 'png', - * multiplier: 2 - * }); - */ - toDataURL: function (options) { - options || (options = { }); - - var format = options.format || 'png', - quality = options.quality || 1, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1), - canvasEl = this.toCanvasElement(multiplier, options); - return fabric.util.toDataURL(canvasEl, format, quality); - }, - - /** - * Create a new HTMLCanvas element painted with the current canvas content. - * No need to resize the actual one or repaint it. - * Will transfer object ownership to a new canvas, paint it, and set everything back. - * This is an intermediary step used to get to a dataUrl but also it is useful to - * create quick image copies of a canvas without passing for the dataUrl string - * @param {Number} [multiplier] a zoom factor. - * @param {Object} [cropping] Cropping informations - * @param {Number} [cropping.left] Cropping left offset. - * @param {Number} [cropping.top] Cropping top offset. - * @param {Number} [cropping.width] Cropping width. - * @param {Number} [cropping.height] Cropping height. - */ - toCanvasElement: function(multiplier, cropping) { - multiplier = multiplier || 1; - cropping = cropping || { }; - var scaledWidth = (cropping.width || this.width) * multiplier, - scaledHeight = (cropping.height || this.height) * multiplier, - zoom = this.getZoom(), - originalWidth = this.width, - originalHeight = this.height, - newZoom = zoom * multiplier, - vp = this.viewportTransform, - translateX = (vp[4] - (cropping.left || 0)) * multiplier, - translateY = (vp[5] - (cropping.top || 0)) * multiplier, - originalInteractive = this.interactive, - newVp = [newZoom, 0, 0, newZoom, translateX, translateY], - originalRetina = this.enableRetinaScaling, - canvasEl = fabric.util.createCanvasElement(), - originalContextTop = this.contextTop; - canvasEl.width = scaledWidth; - canvasEl.height = scaledHeight; - this.contextTop = null; - this.enableRetinaScaling = false; - this.interactive = false; - this.viewportTransform = newVp; - this.width = scaledWidth; - this.height = scaledHeight; - this.calcViewportBoundaries(); - this.renderCanvas(canvasEl.getContext('2d'), this._objects); - this.viewportTransform = vp; - this.width = originalWidth; - this.height = originalHeight; - this.calcViewportBoundaries(); - this.interactive = originalInteractive; - this.enableRetinaScaling = originalRetina; - this.contextTop = originalContextTop; - return canvasEl; - }, - }); - -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - /** - * Populates canvas with data from the specified JSON. - * JSON format must conform to the one of {@link fabric.Canvas#toJSON} - * @param {String|Object} json JSON string or object - * @param {Function} callback Callback, invoked when json is parsed - * and corresponding objects (e.g: {@link fabric.Image}) - * are initialized - * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created. - * @return {fabric.Canvas} instance - * @chainable - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} - * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} - * @example loadFromJSON - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas)); - * @example loadFromJSON with reviver - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) { - * // `o` = json object - * // `object` = fabric.Object instance - * // ... do some stuff ... - * }); - */ - loadFromJSON: function (json, callback, reviver) { - if (!json) { - return; - } - - // serialize if it wasn't already - var serialized = (typeof json === 'string') - ? JSON.parse(json) - : fabric.util.object.clone(json); - - var _this = this, - clipPath = serialized.clipPath, - renderOnAddRemove = this.renderOnAddRemove; - - this.renderOnAddRemove = false; - - delete serialized.clipPath; - - this._enlivenObjects(serialized.objects, function (enlivenedObjects) { - _this.clear(); - _this._setBgOverlay(serialized, function () { - if (clipPath) { - _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) { - _this.clipPath = enlivenedCanvasClip[0]; - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - }); - } - else { - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - } - }); - }, reviver); - return this; - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Array} restored canvas objects - * @param {Function} cached renderOnAddRemove callback - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) { - var _this = this; - enlivenedObjects.forEach(function(obj, index) { - // we splice the array just in case some custom classes restored from JSON - // will add more object to canvas at canvas init. - _this.insertAt(obj, index); - }); - this.renderOnAddRemove = renderOnAddRemove; - // remove parts i cannot set as options - delete serialized.objects; - delete serialized.backgroundImage; - delete serialized.overlayImage; - delete serialized.background; - delete serialized.overlay; - // this._initOptions does too many things to just - // call it. Normally loading an Object from JSON - // create the Object instance. Here the Canvas is - // already an instance and we are just loading things over it - this._setOptions(serialized); - this.renderAll(); - callback && callback(); - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - _setBgOverlay: function(serialized, callback) { - var loaded = { - backgroundColor: false, - overlayColor: false, - backgroundImage: false, - overlayImage: false - }; - - if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) { - callback && callback(); - return; - } - - var cbIfLoaded = function () { - if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) { - callback && callback(); - } - }; - - this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded); - this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded); - this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded); - this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded); - }, - - /** - * @private - * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor) - * @param {(Object|String)} value Value to set - * @param {Object} loaded Set loaded property to true if property is set - * @param {Object} callback Callback function to invoke after property is set - */ - __setBgOverlay: function(property, value, loaded, callback) { - var _this = this; - - if (!value) { - loaded[property] = true; - callback && callback(); - return; - } - - if (property === 'backgroundImage' || property === 'overlayImage') { - fabric.util.enlivenObjects([value], function(enlivedObject){ - _this[property] = enlivedObject[0]; - loaded[property] = true; - callback && callback(); - }); - } - else { - this['set' + fabric.util.string.capitalize(property, true)](value, function() { - loaded[property] = true; - callback && callback(); - }); - } - }, - - /** - * @private - * @param {Array} objects - * @param {Function} callback - * @param {Function} [reviver] - */ - _enlivenObjects: function (objects, callback, reviver) { - if (!objects || objects.length === 0) { - callback && callback([]); - return; - } - - fabric.util.enlivenObjects(objects, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, null, reviver); - }, - - /** - * @private - * @param {String} format - * @param {Function} callback - */ - _toDataURL: function (format, callback) { - this.clone(function (clone) { - callback(clone.toDataURL(format)); - }); - }, - - /** - * @private - * @param {String} format - * @param {Number} multiplier - * @param {Function} callback - */ - _toDataURLWithMultiplier: function (format, multiplier, callback) { - this.clone(function (clone) { - callback(clone.toDataURLWithMultiplier(format, multiplier)); - }); - }, - - /** - * Clones canvas instance - * @param {Object} [callback] Receives cloned instance as a first argument - * @param {Array} [properties] Array of properties to include in the cloned canvas and children - */ - clone: function (callback, properties) { - var data = JSON.stringify(this.toJSON(properties)); - this.cloneWithoutData(function(clone) { - clone.loadFromJSON(data, function() { - callback && callback(clone); - }); - }); - }, - - /** - * Clones canvas instance without cloning existing data. - * This essentially copies canvas dimensions, clipping properties, etc. - * but leaves data empty (so that you can populate it with your own) - * @param {Object} [callback] Receives cloned instance as a first argument - */ - cloneWithoutData: function(callback) { - var el = fabric.util.createCanvasElement(); - - el.width = this.width; - el.height = this.height; - - var clone = new fabric.Canvas(el); - if (this.backgroundImage) { - clone.setBackgroundImage(this.backgroundImage.src, function() { - clone.renderAll(); - callback && callback(clone); - }); - clone.backgroundImageOpacity = this.backgroundImageOpacity; - clone.backgroundImageStretch = this.backgroundImageStretch; - } - else { - callback && callback(clone); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed, - capitalize = fabric.util.string.capitalize, - degreesToRadians = fabric.util.degreesToRadians, - objectCaching = !fabric.isLikelyNode, - ALIASING_LIMIT = 2; - - if (fabric.Object) { - return; - } - - /** - * Root object class from which all 2d shape classes inherit from - * @class fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} - * @see {@link fabric.Object#initialize} for constructor definition - * - * @fires added - * @fires removed - * - * @fires selected - * @fires deselected - * @fires modified - * @fires modified - * @fires moved - * @fires scaled - * @fires rotated - * @fires skewed - * - * @fires rotating - * @fires scaling - * @fires moving - * @fires skewing - * - * @fires mousedown - * @fires mouseup - * @fires mouseover - * @fires mouseout - * @fires mousewheel - * @fires mousedblclick - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop - */ - fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ { - - /** - * Type of an object (rect, circle, path, etc.). - * Note that this property is meant to be read-only and not meant to be modified. - * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly. - * @type String - * @default - */ - type: 'object', - - /** - * Horizontal origin of transformation of an object (one of "left", "right", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originX: 'left', - - /** - * Vertical origin of transformation of an object (one of "top", "bottom", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originY: 'top', - - /** - * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom} - * @type Number - * @default - */ - top: 0, - - /** - * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right} - * @type Number - * @default - */ - left: 0, - - /** - * Object width - * @type Number - * @default - */ - width: 0, - - /** - * Object height - * @type Number - * @default - */ - height: 0, - - /** - * Object scale factor (horizontal) - * @type Number - * @default - */ - scaleX: 1, - - /** - * Object scale factor (vertical) - * @type Number - * @default - */ - scaleY: 1, - - /** - * When true, an object is rendered as flipped horizontally - * @type Boolean - * @default - */ - flipX: false, - - /** - * When true, an object is rendered as flipped vertically - * @type Boolean - * @default - */ - flipY: false, - - /** - * Opacity of an object - * @type Number - * @default - */ - opacity: 1, - - /** - * Angle of rotation of an object (in degrees) - * @type Number - * @default - */ - angle: 0, - - /** - * Angle of skew on x axes of an object (in degrees) - * @type Number - * @default - */ - skewX: 0, - - /** - * Angle of skew on y axes of an object (in degrees) - * @type Number - * @default - */ - skewY: 0, - - /** - * Size of object's controlling corners (in pixels) - * @type Number - * @default - */ - cornerSize: 13, - - /** - * Size of object's controlling corners when touch interaction is detected - * @type Number - * @default - */ - touchCornerSize: 24, - - /** - * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill) - * @type Boolean - * @default - */ - transparentCorners: true, - - /** - * Default cursor value used when hovering over this object on canvas - * @type String - * @default - */ - hoverCursor: null, - - /** - * Default cursor value used when moving this object on canvas - * @type String - * @default - */ - moveCursor: null, - - /** - * Padding between object and its controlling borders (in pixels) - * @type Number - * @default - */ - padding: 0, - - /** - * Color of controlling borders of an object (when it's active) - * @type String - * @default - */ - borderColor: 'rgb(178,204,255)', - - /** - * Array specifying dash pattern of an object's borders (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - borderDashArray: null, - - /** - * Color of controlling corners of an object (when it's active) - * @type String - * @default - */ - cornerColor: 'rgb(178,204,255)', - - /** - * Color of controlling corners of an object (when it's active and transparentCorners false) - * @since 1.6.2 - * @type String - * @default - */ - cornerStrokeColor: null, - - /** - * Specify style of control, 'rect' or 'circle' - * @since 1.6.2 - * @type String - */ - cornerStyle: 'rect', - - /** - * Array specifying dash pattern of an object's control (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - cornerDashArray: null, - - /** - * When true, this object will use center point as the origin of transformation - * when being scaled via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, this object will use center point as the origin of transformation - * when being rotated via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: true, - - /** - * Color of object's fill - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - fill: 'rgb(0,0,0)', - - /** - * Fill rule used to fill an object - * accepted values are nonzero, evenodd - * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead) - * @type String - * @default - */ - fillRule: 'nonzero', - - /** - * Composite rule used for canvas globalCompositeOperation - * @type String - * @default - */ - globalCompositeOperation: 'source-over', - - /** - * Background color of an object. - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - backgroundColor: '', - - /** - * Selection Background color of an object. colored layer behind the object when it is active. - * does not mix good with globalCompositeOperation methods. - * @type String - * @default - */ - selectionBackgroundColor: '', - - /** - * When defined, an object is rendered via stroke and this property specifies its color - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - stroke: null, - - /** - * Width of a stroke used to render this object - * @type Number - * @default - */ - strokeWidth: 1, - - /** - * Array specifying dash pattern of an object's stroke (stroke must be defined) - * @type Array - */ - strokeDashArray: null, - - /** - * Line offset of an object's stroke - * @type Number - * @default - */ - strokeDashOffset: 0, - - /** - * Line endings style of an object's stroke (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'butt', - - /** - * Corner style of an object's stroke (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'miter', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of an object's stroke - * @type Number - * @default - */ - strokeMiterLimit: 4, - - /** - * Shadow object representing shadow of this shape - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Opacity of object's controlling borders when object is active and moving - * @type Number - * @default - */ - borderOpacityWhenMoving: 0.4, - - /** - * Scale factor of object's controlling borders - * bigger number will make a thicker border - * border is 1, so this is basically a border thickness - * since there is no way to change the border itself. - * @type Number - * @default - */ - borderScaleFactor: 1, - - /** - * Minimum allowed scale value of an object - * @type Number - * @default - */ - minScaleLimit: 0, - - /** - * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection). - * But events still fire on it. - * @type Boolean - * @default - */ - selectable: true, - - /** - * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4 - * @type Boolean - * @default - */ - evented: true, - - /** - * When set to `false`, an object is not rendered on canvas - * @type Boolean - * @default - */ - visible: true, - - /** - * When set to `false`, object's controls are not displayed and can not be used to manipulate object - * @type Boolean - * @default - */ - hasControls: true, - - /** - * When set to `false`, object's controlling borders are not rendered - * @type Boolean - * @default - */ - hasBorders: true, - - /** - * When set to `true`, objects are "found" on canvas on per-pixel basis rather than according to bounding box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * When `false`, default object's values are not included in its serialization - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * When `true`, object horizontal movement is locked - * @type Boolean - * @default - */ - lockMovementX: false, - - /** - * When `true`, object vertical movement is locked - * @type Boolean - * @default - */ - lockMovementY: false, - - /** - * When `true`, object rotation is locked - * @type Boolean - * @default - */ - lockRotation: false, - - /** - * When `true`, object horizontal scaling is locked - * @type Boolean - * @default - */ - lockScalingX: false, - - /** - * When `true`, object vertical scaling is locked - * @type Boolean - * @default - */ - lockScalingY: false, - - /** - * When `true`, object horizontal skewing is locked - * @type Boolean - * @default - */ - lockSkewingX: false, - - /** - * When `true`, object vertical skewing is locked - * @type Boolean - * @default - */ - lockSkewingY: false, - - /** - * When `true`, object cannot be flipped by scaling into negative values - * @type Boolean - * @default - */ - lockScalingFlip: false, - - /** - * When `true`, object is not exported in OBJECT/JSON - * @since 1.6.3 - * @type Boolean - * @default - */ - excludeFromExport: false, - - /** - * When `true`, object is cached on an additional canvas. - * When `false`, object is not cached unless necessary ( clipPath ) - * default to true - * @since 1.7.0 - * @type Boolean - * @default true - */ - objectCaching: objectCaching, - - /** - * When `true`, object properties are checked for cache invalidation. In some particular - * situation you may want this to be disabled ( spray brush, very big, groups) - * or if your application does not allow you to modify properties for groups child you want - * to disable it for groups. - * default to false - * since 1.7.0 - * @type Boolean - * @default false - */ - statefullCache: false, - - /** - * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled - * too much and will be redrawn with correct details at the end of scaling. - * this setting is performance and application dependant. - * default to true - * since 1.7.0 - * @type Boolean - * @default true - */ - noScaleCache: true, - - /** - * When `false`, the stoke width will scale with the object. - * When `true`, the stroke will always match the exact pixel size entered for stroke width. - * default to false - * @since 2.6.0 - * @type Boolean - * @default false - * @type Boolean - * @default false - */ - strokeUniform: false, - - /** - * When set to `true`, object's cache will be rerendered next render call. - * since 1.7.0 - * @type Boolean - * @default true - */ - dirty: true, - - /** - * keeps the value of the last hovered corner during mouse move. - * 0 is no corner, or 'mt', 'ml', 'mtr' etc.. - * It should be private, but there is no harm in using it as - * a read-only property. - * @type number|string|any - * @default 0 - */ - __corner: 0, - - /** - * Determines if the fill or the stroke is drawn first (one of "fill" or "stroke") - * @type String - * @default - */ - paintFirst: 'fill', - - /** - * When 'down', object is set to active on mousedown/touchstart - * When 'up', object is set to active on mouseup/touchend - * Experimental. Let's see if this breaks anything before supporting officially - * @private - * since 4.4.0 - * @type String - * @default 'down' - */ - activeOn: 'down', - - /** - * List of properties to consider when checking if state - * of an object is changed (fabric.Object#hasStateChanged) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: ( - 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' + - 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' + - 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' + - 'skewX skewY fillRule paintFirst clipPath strokeUniform' - ).split(' '), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: ( - 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' + - ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath' - ).split(' '), - - /** - * List of properties to consider for animating colors. - * @type Array - */ - colorProperties: ( - 'fill stroke backgroundColor' - ).split(' '), - - /** - * a fabricObject that, without stroke define a clipping area with their shape. filled in black - * the clipPath object gets used when the object has rendered, and the context is placed in the center - * of the object cacheCanvas. - * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center' - * @type fabric.Object - */ - clipPath: undefined, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will make the object clip to the outside of the clipPath - * since 2.4.0 - * @type boolean - * @default false - */ - inverted: false, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will have its top and left relative to canvas, and will - * not be influenced by the object transform. This will make the clipPath relative - * to the canvas, but clipping just a particular object. - * WARNING this is beta, this feature may change or be renamed. - * since 2.4.0 - * @type boolean - * @default false - */ - absolutePositioned: false, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Create a the canvas used to keep the cached copy of the object - * @private - */ - _createCacheCanvas: function() { - this._cacheProperties = {}; - this._cacheCanvas = fabric.util.createCanvasElement(); - this._cacheContext = this._cacheCanvas.getContext('2d'); - this._updateCacheCanvas(); - // if canvas gets created, is empty, so dirty. - this.dirty = true; - }, - - /** - * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal - * and each side do not cross fabric.cacheSideLimit - * those numbers are configurable so that you can get as much detail as you want - * making bargain with performances. - * @param {Object} dims - * @param {Object} dims.width width of canvas - * @param {Object} dims.height height of canvas - * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _limitCacheSize: function(dims) { - var perfLimitSizeTotal = fabric.perfLimitSizeTotal, - width = dims.width, height = dims.height, - max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit; - if (width <= max && height <= max && width * height <= perfLimitSizeTotal) { - if (width < min) { - dims.width = min; - } - if (height < min) { - dims.height = min; - } - return dims; - } - var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal), - capValue = fabric.util.capValue, - x = capValue(min, limitedDims.x, max), - y = capValue(min, limitedDims.y, max); - if (width > x) { - dims.zoomX /= width / x; - dims.width = x; - dims.capped = true; - } - if (height > y) { - dims.zoomY /= height / y; - dims.height = y; - dims.capped = true; - } - return dims; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @return {Object}.x width of object to be cached - * @return {Object}.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var objectScale = this.getTotalObjectScaling(), - // caculate dimensions without skewing - dim = this._getTransformedDimensions(0, 0), - neededX = dim.x * objectScale.scaleX / this.scaleX, - neededY = dim.y * objectScale.scaleY / this.scaleY; - return { - // for sure this ALIASING_LIMIT is slightly creating problem - // in situation in which the cache canvas gets an upper limit - // also objectScale contains already scaleX and scaleY - width: neededX + ALIASING_LIMIT, - height: neededY + ALIASING_LIMIT, - zoomX: objectScale.scaleX, - zoomY: objectScale.scaleY, - x: neededX, - y: neededY - }; - }, - - /** - * Update width and height of the canvas for cache - * returns true or false if canvas needed resize. - * @private - * @return {Boolean} true if the canvas has been resized - */ - _updateCacheCanvas: function() { - var targetCanvas = this.canvas; - if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) { - var target = targetCanvas._currentTransform.target, - action = targetCanvas._currentTransform.action; - if (this === target && action.slice && action.slice(0, 5) === 'scale') { - return false; - } - } - var canvas = this._cacheCanvas, - dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - minCacheSize = fabric.minCacheSideLimit, - width = dims.width, height = dims.height, drawingWidth, drawingHeight, - zoomX = dims.zoomX, zoomY = dims.zoomY, - dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight, - zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY, - shouldRedraw = dimensionsChanged || zoomChanged, - additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false; - if (dimensionsChanged) { - var canvasWidth = this._cacheCanvas.width, - canvasHeight = this._cacheCanvas.height, - sizeGrowing = width > canvasWidth || height > canvasHeight, - sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) && - canvasWidth > minCacheSize && canvasHeight > minCacheSize; - shouldResizeCanvas = sizeGrowing || sizeShrinking; - if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) { - additionalWidth = width * 0.1; - additionalHeight = height * 0.1; - } - } - if (this instanceof fabric.Text && this.path) { - shouldRedraw = true; - shouldResizeCanvas = true; - additionalWidth += this.getHeightOfLine(0) * this.zoomX; - additionalHeight += this.getHeightOfLine(0) * this.zoomY; - } - if (shouldRedraw) { - if (shouldResizeCanvas) { - canvas.width = Math.ceil(width + additionalWidth); - canvas.height = Math.ceil(height + additionalHeight); - } - else { - this._cacheContext.setTransform(1, 0, 0, 1, 0, 0); - this._cacheContext.clearRect(0, 0, canvas.width, canvas.height); - } - drawingWidth = dims.x / 2; - drawingHeight = dims.y / 2; - this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth; - this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight; - this.cacheWidth = width; - this.cacheHeight = height; - this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY); - this._cacheContext.scale(zoomX, zoomY); - this.zoomX = zoomX; - this.zoomY = zoomY; - return true; - } - return false; - }, - - /** - * Sets object's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - this._setOptions(options); - this._initGradient(options.fill, 'fill'); - this._initGradient(options.stroke, 'stroke'); - this._initPattern(options.fill, 'fill'); - this._initPattern(options.stroke, 'stroke'); - }, - - /** - * Transforms context when rendering an object - * @param {CanvasRenderingContext2D} ctx Context - */ - transform: function(ctx) { - var needFullTransform = (this.group && !this.group._transformDone) || - (this.group && this.canvas && ctx === this.canvas.contextTop); - var m = this.calcTransformMatrix(!needFullTransform); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - }, - - /** - * Returns an object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - - object = { - type: this.type, - version: fabric.version, - originX: this.originX, - originY: this.originY, - left: toFixed(this.left, NUM_FRACTION_DIGITS), - top: toFixed(this.top, NUM_FRACTION_DIGITS), - width: toFixed(this.width, NUM_FRACTION_DIGITS), - height: toFixed(this.height, NUM_FRACTION_DIGITS), - fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill, - stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke, - strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS), - strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray, - strokeLineCap: this.strokeLineCap, - strokeDashOffset: this.strokeDashOffset, - strokeLineJoin: this.strokeLineJoin, - strokeUniform: this.strokeUniform, - strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS), - scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS), - scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS), - angle: toFixed(this.angle, NUM_FRACTION_DIGITS), - flipX: this.flipX, - flipY: this.flipY, - opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS), - shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow, - visible: this.visible, - backgroundColor: this.backgroundColor, - fillRule: this.fillRule, - paintFirst: this.paintFirst, - globalCompositeOperation: this.globalCompositeOperation, - skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS), - skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS), - }; - - if (this.clipPath && !this.clipPath.excludeFromExport) { - object.clipPath = this.clipPath.toObject(propertiesToInclude); - object.clipPath.inverted = this.clipPath.inverted; - object.clipPath.absolutePositioned = this.clipPath.absolutePositioned; - } - - fabric.util.populateWithProperties(this, object, propertiesToInclude); - if (!this.includeDefaultValues) { - object = this._removeDefaultValues(object); - } - - return object; - }, - - /** - * Returns (dataless) object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - // will be overwritten by subclasses - return this.toObject(propertiesToInclude); - }, - - /** - * @private - * @param {Object} object - */ - _removeDefaultValues: function(object) { - var prototype = fabric.util.getKlass(object.type).prototype, - stateProperties = prototype.stateProperties; - stateProperties.forEach(function(prop) { - if (prop === 'left' || prop === 'top') { - return; - } - if (object[prop] === prototype[prop]) { - delete object[prop]; - } - var isArray = Object.prototype.toString.call(object[prop]) === '[object Array]' && - Object.prototype.toString.call(prototype[prop]) === '[object Array]'; - - // basically a check for [] === [] - if (isArray && object[prop].length === 0 && prototype[prop].length === 0) { - delete object[prop]; - } - }); - - return object; - }, - - /** - * Returns a string representation of an instance - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Return the object scale factor counting also the group scaling - * @return {Object} object with scaleX and scaleY properties - */ - getObjectScaling: function() { - // if the object is a top level one, on the canvas, we go for simple aritmetic - // otherwise the complex method with angles will return approximations and decimals - // and will likely kill the cache when not needed - // https://github.com/fabricjs/fabric.js/issues/7157 - if (!this.group) { - return { - scaleX: this.scaleX, - scaleY: this.scaleY, - }; - } - // if we are inside a group total zoom calculation is complex, we defer to generic matrices - var options = fabric.util.qrDecompose(this.calcTransformMatrix()); - return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) }; - }, - - /** - * Return the object scale factor counting also the group scaling, zoom and retina - * @return {Object} object with scaleX and scaleY properties - */ - getTotalObjectScaling: function() { - var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY; - if (this.canvas) { - var zoom = this.canvas.getZoom(); - var retina = this.canvas.getRetinaScaling(); - scaleX *= zoom * retina; - scaleY *= zoom * retina; - } - return { scaleX: scaleX, scaleY: scaleY }; - }, - - /** - * Return the object opacity counting also the group property - * @return {Number} - */ - getObjectOpacity: function() { - var opacity = this.opacity; - if (this.group) { - opacity *= this.group.getObjectOpacity(); - } - return opacity; - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Object} thisArg - */ - _set: function(key, value) { - var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'), - isChanged = this[key] !== value, groupNeedsUpdate = false; - - if (shouldConstrainValue) { - value = this._constrainScale(value); - } - if (key === 'scaleX' && value < 0) { - this.flipX = !this.flipX; - value *= -1; - } - else if (key === 'scaleY' && value < 0) { - this.flipY = !this.flipY; - value *= -1; - } - else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) { - value = new fabric.Shadow(value); - } - else if (key === 'dirty' && this.group) { - this.group.set('dirty', value); - } - - this[key] = value; - - if (isChanged) { - groupNeedsUpdate = this.group && this.group.isOnACache(); - if (this.cacheProperties.indexOf(key) > -1) { - this.dirty = true; - groupNeedsUpdate && this.group.set('dirty', true); - } - else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) { - this.group.set('dirty', true); - } - } - return this; - }, - - /** - * This callback function is called by the parent group of an object every - * time a non-delegated property changes on the group. It is passed the key - * and value as parameters. Not adding in this function's signature to avoid - * Travis build error about unused variables. - */ - setOnGroup: function() { - // implemented by sub-classes, as needed. - }, - - /** - * Retrieves viewportTransform from Object's canvas if possible - * @method getViewportTransform - * @memberOf fabric.Object.prototype - * @return {Array} - */ - getViewportTransform: function() { - if (this.canvas && this.canvas.viewportTransform) { - return this.canvas.viewportTransform; - } - return fabric.iMatrix.concat(); - }, - - /* - * @private - * return if the object would be visible in rendering - * @memberOf fabric.Object.prototype - * @return {Boolean} - */ - isNotVisible: function() { - return this.opacity === 0 || - (!this.width && !this.height && this.strokeWidth === 0) || - !this.visible; - }, - - /** - * Renders an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if width/height are zeros or object is not visible - if (this.isNotVisible()) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - ctx.save(); - this._setupCompositeOperation(ctx); - this.drawSelectionBackground(ctx); - this.transform(ctx); - this._setOpacity(ctx); - this._setShadow(ctx, this); - if (this.shouldCache()) { - this.renderCache(); - this.drawCacheOnCanvas(ctx); - } - else { - this._removeCacheCanvas(); - this.dirty = false; - this.drawObject(ctx); - if (this.objectCaching && this.statefullCache) { - this.saveState({ propertySet: 'cacheProperties' }); - } - } - ctx.restore(); - }, - - renderCache: function(options) { - options = options || {}; - if (!this._cacheCanvas) { - this._createCacheCanvas(); - } - if (this.isCacheDirty()) { - this.statefullCache && this.saveState({ propertySet: 'cacheProperties' }); - this.drawObject(this._cacheContext, options.forClipping); - this.dirty = false; - } - }, - - /** - * Remove cacheCanvas and its dimensions from the objects - */ - _removeCacheCanvas: function() { - this._cacheCanvas = null; - this.cacheWidth = 0; - this.cacheHeight = 0; - }, - - /** - * return true if the object will draw a stroke - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when stroke happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the stroke is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasStroke: function() { - return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0; - }, - - /** - * return true if the object will draw a fill - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when fill happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the fill is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasFill: function() { - return this.fill && this.fill !== 'transparent'; - }, - - /** - * When set to `true`, force the object to have its own cache, even if it is inside a group - * it may be needed when your object behave in a particular way on the cache and always needs - * its own isolated canvas to render correctly. - * Created to be overridden - * since 1.7.12 - * @returns Boolean - */ - needsItsOwnCache: function() { - if (this.paintFirst === 'stroke' && - this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') { - return true; - } - if (this.clipPath) { - return true; - } - return false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * Read as: cache if is needed, or if the feature is enabled but we are not already caching. - * @return {Boolean} - */ - shouldCache: function() { - this.ownCaching = this.needsItsOwnCache() || ( - this.objectCaching && - (!this.group || !this.group.isOnACache()) - ); - return this.ownCaching; - }, - - /** - * Check if this object or a child object will cast a shadow - * used by Group.shouldCache to know if child has a shadow recursively - * @return {Boolean} - */ - willDrawShadow: function() { - return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0); - }, - - /** - * Execute the drawing operation for an object clipPath - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawClipPathOnCache: function(ctx) { - var path = this.clipPath; - ctx.save(); - // DEBUG: uncomment this line, comment the following - // ctx.globalAlpha = 0.4 - if (path.inverted) { - ctx.globalCompositeOperation = 'destination-out'; - } - else { - ctx.globalCompositeOperation = 'destination-in'; - } - //ctx.scale(1 / 2, 1 / 2); - if (path.absolutePositioned) { - var m = fabric.util.invertTransform(this.calcTransformMatrix()); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - } - path.transform(ctx); - ctx.scale(1 / path.zoomX, 1 / path.zoomY); - ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY); - ctx.restore(); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx, forClipping) { - var originalFill = this.fill, originalStroke = this.stroke; - if (forClipping) { - this.fill = 'black'; - this.stroke = ''; - this._setClippingProperties(ctx); - } - else { - this._renderBackground(ctx); - } - this._render(ctx); - this._drawClipPath(ctx); - this.fill = originalFill; - this.stroke = originalStroke; - }, - - _drawClipPath: function(ctx) { - var path = this.clipPath; - if (!path) { return; } - // needed to setup a couple of variables - // path canvas gets overridden with this one. - // TODO find a better solution? - path.canvas = this.canvas; - path.shouldCache(); - path._transformDone = true; - path.renderCache({ forClipping: true }); - this.drawClipPathOnCache(ctx); - }, - - /** - * Paint the cached copy of the object on the target context. - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - ctx.scale(1 / this.zoomX, 1 / this.zoomY); - ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY); - }, - - /** - * Check if cache is dirty - * @param {Boolean} skipCanvas skip canvas checks because this object is painted - * on parent canvas. - */ - isCacheDirty: function(skipCanvas) { - if (this.isNotVisible()) { - return false; - } - if (this._cacheCanvas && !skipCanvas && this._updateCacheCanvas()) { - // in this case the context is already cleared. - return true; - } - else { - if (this.dirty || - (this.clipPath && this.clipPath.absolutePositioned) || - (this.statefullCache && this.hasStateChanged('cacheProperties')) - ) { - if (this._cacheCanvas && !skipCanvas) { - var width = this.cacheWidth / this.zoomX; - var height = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-width / 2, -height / 2, width, height); - } - return true; - } - } - return false; - }, - - /** - * Draws a background for the object big as its untransformed dimensions - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderBackground: function(ctx) { - if (!this.backgroundColor) { - return; - } - var dim = this._getNonTransformedDimensions(); - ctx.fillStyle = this.backgroundColor; - - ctx.fillRect( - -dim.x / 2, - -dim.y / 2, - dim.x, - dim.y - ); - // if there is background color no other shadows - // should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setOpacity: function(ctx) { - if (this.group && !this.group._transformDone) { - ctx.globalAlpha = this.getObjectOpacity(); - } - else { - ctx.globalAlpha *= this.opacity; - } - }, - - _setStrokeStyles: function(ctx, decl) { - var stroke = decl.stroke; - if (stroke) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = decl.strokeLineCap; - ctx.lineDashOffset = decl.strokeDashOffset; - ctx.lineJoin = decl.strokeLineJoin; - ctx.miterLimit = decl.strokeMiterLimit; - if (stroke.toLive) { - if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - this._applyPatternForTransformedGradient(ctx, stroke); - } - else { - // is a simple gradient or pattern - ctx.strokeStyle = stroke.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, stroke); - } - } - else { - // is a color - ctx.strokeStyle = decl.stroke; - } - } - }, - - _setFillStyles: function(ctx, decl) { - var fill = decl.fill; - if (fill) { - if (fill.toLive) { - ctx.fillStyle = fill.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, decl.fill); - } - else { - ctx.fillStyle = fill; - } - } - }, - - _setClippingProperties: function(ctx) { - ctx.globalAlpha = 1; - ctx.strokeStyle = 'transparent'; - ctx.fillStyle = '#000000'; - }, - - /** - * @private - * Sets line dash - * @param {CanvasRenderingContext2D} ctx Context to set the dash line on - * @param {Array} dashArray array representing dashes - */ - _setLineDash: function(ctx, dashArray) { - if (!dashArray || dashArray.length === 0) { - return; - } - // Spec requires the concatenation of two copies the dash list when the number of elements is odd - if (1 & dashArray.length) { - dashArray.push.apply(dashArray, dashArray); - } - ctx.setLineDash(dashArray); - }, - - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - */ - _renderControls: function(ctx, styleOverride) { - var vpt = this.getViewportTransform(), - matrix = this.calcTransformMatrix(), - options, drawBorders, drawControls; - styleOverride = styleOverride || { }; - drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders; - drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls; - matrix = fabric.util.multiplyTransformMatrices(vpt, matrix); - options = fabric.util.qrDecompose(matrix); - ctx.save(); - ctx.translate(options.translateX, options.translateY); - ctx.lineWidth = 1 * this.borderScaleFactor; - if (!this.group) { - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - } - ctx.rotate(degreesToRadians(options.angle)); - if (styleOverride.forActiveSelection || this.group) { - drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); - } - else { - drawBorders && this.drawBorders(ctx, styleOverride); - } - drawControls && this.drawControls(ctx, styleOverride); - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setShadow: function(ctx) { - if (!this.shadow) { - return; - } - - var shadow = this.shadow, canvas = this.canvas, scaling, - multX = (canvas && canvas.viewportTransform[0]) || 1, - multY = (canvas && canvas.viewportTransform[3]) || 1; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - if (canvas && canvas._isRetinaScaling()) { - multX *= fabric.devicePixelRatio; - multY *= fabric.devicePixelRatio; - } - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant * - (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4; - ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX; - ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _removeShadow: function(ctx) { - if (!this.shadow) { - return; - } - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} filler fabric.Pattern or fabric.Gradient - * @return {Object} offset.offsetX offset for text rendering - * @return {Object} offset.offsetY offset for text rendering - */ - _applyPatternGradientTransform: function(ctx, filler) { - if (!filler || !filler.toLive) { - return { offsetX: 0, offsetY: 0 }; - } - var t = filler.gradientTransform || filler.patternTransform; - var offsetX = -this.width / 2 + filler.offsetX || 0, - offsetY = -this.height / 2 + filler.offsetY || 0; - - if (filler.gradientUnits === 'percentage') { - ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY); - } - else { - ctx.transform(1, 0, 0, 1, offsetX, offsetY); - } - if (t) { - ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]); - } - return { offsetX: offsetX, offsetY: offsetY }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderPaintInOrder: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderStroke(ctx); - this._renderFill(ctx); - } - else { - this._renderFill(ctx); - this._renderStroke(ctx); - } - }, - - /** - * @private - * function that actually render something on the context. - * empty here to allow Obects to work on tests to benchmark fabric functionalites - * not related to rendering - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(/* ctx */) { - - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderFill: function(ctx) { - if (!this.fill) { - return; - } - - ctx.save(); - this._setFillStyles(ctx, this); - if (this.fillRule === 'evenodd') { - ctx.fill('evenodd'); - } - else { - ctx.fill(); - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderStroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - if (this.strokeUniform && this.group) { - var scaling = this.getObjectScaling(); - ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY); - } - else if (this.strokeUniform) { - ctx.scale(1 / this.scaleX, 1 / this.scaleY); - } - this._setLineDash(ctx, this.strokeDashArray); - this._setStrokeStyles(ctx, this); - ctx.stroke(); - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {fabric.Gradient} filler a fabric gradient instance - */ - _applyPatternForTransformedGradient: function(ctx, filler) { - var dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(), - width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.scale( - dims.zoomX / this.scaleX / retinaScaling, - dims.zoomY / this.scaleY / retinaScaling - ); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fillStyle = filler.toLive(ctx); - pCtx.fill(); - ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2); - ctx.scale( - retinaScaling * this.scaleX / dims.zoomX, - retinaScaling * this.scaleY / dims.zoomY - ); - ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { x: this.left + this.width / 2, y: this.top + this.height / 2 }; - }, - - /** - * This function is an helper for svg import. it decompose the transformMatrix - * and assign properties to object. - * untransformed coordinates - * @private - * @chainable - */ - _assignTransformMatrixProps: function() { - if (this.transformMatrix) { - var options = fabric.util.qrDecompose(this.transformMatrix); - this.flipX = false; - this.flipY = false; - this.set('scaleX', options.scaleX); - this.set('scaleY', options.scaleY); - this.angle = options.angle; - this.skewX = options.skewX; - this.skewY = 0; - } - }, - - /** - * This function is an helper for svg import. it removes the transform matrix - * and set to object properties that fabricjs can handle - * @private - * @param {Object} preserveAspectRatioOptions - * @return {thisArg} - */ - _removeTransformMatrix: function(preserveAspectRatioOptions) { - var center = this._findCenterFromElement(); - if (this.transformMatrix) { - this._assignTransformMatrixProps(); - center = fabric.util.transformPoint(center, this.transformMatrix); - } - this.transformMatrix = null; - if (preserveAspectRatioOptions) { - this.scaleX *= preserveAspectRatioOptions.scaleX; - this.scaleY *= preserveAspectRatioOptions.scaleY; - this.cropX = preserveAspectRatioOptions.cropX; - this.cropY = preserveAspectRatioOptions.cropY; - center.x += preserveAspectRatioOptions.offsetLeft; - center.y += preserveAspectRatioOptions.offsetTop; - this.width = preserveAspectRatioOptions.width; - this.height = preserveAspectRatioOptions.height; - } - this.setPositionByOrigin(center, 'center', 'center'); - }, - - /** - * Clones an instance, using a callback method will work for every object. - * @param {Function} callback Callback is invoked with a clone as a first argument - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - */ - clone: function(callback, propertiesToInclude) { - var objectForm = this.toObject(propertiesToInclude); - if (this.constructor.fromObject) { - this.constructor.fromObject(objectForm, callback); - } - else { - fabric.Object._fromObject('Object', objectForm, callback); - } - }, - - /** - * Creates an instance of fabric.Image out of an object - * makes use of toCanvasElement. - * Once this method was based on toDataUrl and loadImage, so it also had a quality - * and format option. toCanvasElement is faster and produce no loss of quality. - * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it. - * toCanvasElement and then toBlob from the obtained canvas is also a good option. - * This method is sync now, but still support the callback because we did not want to break. - * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback. - * @param {Function} callback callback, invoked with an instance as a first argument - * @param {Object} [options] for clone as image, passed to toDataURL - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {fabric.Object} thisArg - */ - cloneAsImage: function(callback, options) { - var canvasEl = this.toCanvasElement(options); - if (callback) { - callback(new fabric.Image(canvasEl)); - } - return this; - }, - - /** - * Converts an object into a HTMLCanvas element - * @param {Object} options Options object - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object - */ - toCanvasElement: function(options) { - options || (options = { }); - - var utils = fabric.util, origParams = utils.saveObjectTransform(this), - originalGroup = this.group, - originalShadow = this.shadow, abs = Math.abs, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1); - delete this.group; - if (options.withoutTransform) { - utils.resetObjectTransform(this); - } - if (options.withoutShadow) { - this.shadow = null; - } - - var el = fabric.util.createCanvasElement(), - // skip canvas zoom and calculate with setCoords now. - boundingRect = this.getBoundingRect(true, true), - shadow = this.shadow, scaling, - shadowOffset = { x: 0, y: 0 }, shadowBlur, - width, height; - - if (shadow) { - shadowBlur = shadow.blur; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - // consider non scaling shadow. - shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX)); - shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY)); - } - width = boundingRect.width + shadowOffset.x; - height = boundingRect.height + shadowOffset.y; - // if the current width/height is not an integer - // we need to make it so. - el.width = Math.ceil(width); - el.height = Math.ceil(height); - var canvas = new fabric.StaticCanvas(el, { - enableRetinaScaling: false, - renderOnAddRemove: false, - skipOffscreen: false, - }); - if (options.format === 'jpeg') { - canvas.backgroundColor = '#fff'; - } - this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center'); - - var originalCanvas = this.canvas; - canvas.add(this); - var canvasEl = canvas.toCanvasElement(multiplier || 1, options); - this.shadow = originalShadow; - this.set('canvas', originalCanvas); - if (originalGroup) { - this.group = originalGroup; - } - this.set(origParams).setCoords(); - // canvas.dispose will call image.dispose that will nullify the elements - // since this canvas is a simple element for the process, we remove references - // to objects in this way in order to avoid object trashing. - canvas._objects = []; - canvas.dispose(); - canvas = null; - - return canvasEl; - }, - - /** - * Converts an object into a data-url-like string - * @param {Object} options Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - */ - toDataURL: function(options) { - options || (options = { }); - return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1); - }, - - /** - * Returns true if specified type is identical to the type of an instance - * @param {String} type Type to check against - * @return {Boolean} - */ - isType: function(type) { - return this.type === type; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance (is 1 unless subclassed) - */ - complexity: function() { - return 1; - }, - - /** - * Returns a JSON representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON - */ - toJSON: function(propertiesToInclude) { - // delegate, not alias - return this.toObject(propertiesToInclude); - }, - - /** - * Sets "angle" of an instance with centered rotation - * @param {Number} angle Angle value (in degrees) - * @return {fabric.Object} thisArg - * @chainable - */ - rotate: function(angle) { - var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation; - - if (shouldCenterOrigin) { - this._setOriginToCenter(); - } - - this.set('angle', angle); - - if (shouldCenterOrigin) { - this._resetOrigin(); - } - - return this; - }, - - /** - * Centers object horizontally on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerH: function () { - this.canvas && this.canvas.centerObjectH(this); - return this; - }, - - /** - * Centers object horizontally on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterH: function () { - this.canvas && this.canvas.viewportCenterObjectH(this); - return this; - }, - - /** - * Centers object vertically on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerV: function () { - this.canvas && this.canvas.centerObjectV(this); - return this; - }, - - /** - * Centers object vertically on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterV: function () { - this.canvas && this.canvas.viewportCenterObjectV(this); - return this; - }, - - /** - * Centers object vertically and horizontally on canvas to which is was added last - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - center: function () { - this.canvas && this.canvas.centerObject(this); - return this; - }, - - /** - * Centers object on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenter: function () { - this.canvas && this.canvas.viewportCenterObject(this); - return this; - }, - - /** - * Returns coordinates of a pointer relative to an object - * @param {Event} e Event to operate upon - * @param {Object} [pointer] Pointer to operate upon (instead of event) - * @return {Object} Coordinates of a pointer (x, y) - */ - getLocalPointer: function(e, pointer) { - pointer = pointer || this.canvas.getPointer(e); - var pClicked = new fabric.Point(pointer.x, pointer.y), - objectLeftTop = this._getLeftTopCoords(); - if (this.angle) { - pClicked = fabric.util.rotatePoint( - pClicked, objectLeftTop, degreesToRadians(-this.angle)); - } - return { - x: pClicked.x - objectLeftTop.x, - y: pClicked.y - objectLeftTop.y - }; - }, - - /** - * Sets canvas globalCompositeOperation for specific object - * custom composition operation for the particular object can be specified using globalCompositeOperation property - * @param {CanvasRenderingContext2D} ctx Rendering canvas context - */ - _setupCompositeOperation: function (ctx) { - if (this.globalCompositeOperation) { - ctx.globalCompositeOperation = this.globalCompositeOperation; - } - } - }); - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object); - - extend(fabric.Object.prototype, fabric.Observable); - - /** - * Defines the number of fraction digits to use when serializing object values. - * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. - * @static - * @memberOf fabric.Object - * @constant - * @type Number - */ - fabric.Object.NUM_FRACTION_DIGITS = 2; - - fabric.Object._fromObject = function(className, object, callback, extraParam) { - var klass = fabric[className]; - object = clone(object, true); - fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) { - if (typeof patterns[0] !== 'undefined') { - object.fill = patterns[0]; - } - if (typeof patterns[1] !== 'undefined') { - object.stroke = patterns[1]; - } - fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) { - object.clipPath = enlivedProps[0]; - var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); - callback && callback(instance); - }); - }); - }; - - /** - * Unique id used internally when creating SVG elements - * @static - * @memberOf fabric.Object - * @type Number - */ - fabric.Object.__uid = 0; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians, - originXOffset = { - left: -0.5, - center: 0, - right: 0.5 - }, - originYOffset = { - top: -0.5, - center: 0, - bottom: 0.5 - }; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Translates the coordinates from a set of origin to another (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom' - * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) { - var x = point.x, - y = point.y, - offsetX, offsetY, dim; - - if (typeof fromOriginX === 'string') { - fromOriginX = originXOffset[fromOriginX]; - } - else { - fromOriginX -= 0.5; - } - - if (typeof toOriginX === 'string') { - toOriginX = originXOffset[toOriginX]; - } - else { - toOriginX -= 0.5; - } - - offsetX = toOriginX - fromOriginX; - - if (typeof fromOriginY === 'string') { - fromOriginY = originYOffset[fromOriginY]; - } - else { - fromOriginY -= 0.5; - } - - if (typeof toOriginY === 'string') { - toOriginY = originYOffset[toOriginY]; - } - else { - toOriginY -= 0.5; - } - - offsetY = toOriginY - fromOriginY; - - if (offsetX || offsetY) { - dim = this._getTransformedDimensions(); - x = point.x + offsetX * dim.x; - y = point.y + offsetY * dim.y; - } - - return new fabric.Point(x, y); - }, - - /** - * Translates the coordinates from origin to center coordinates (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToCenterPoint: function(point, originX, originY) { - var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center'); - if (this.angle) { - return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Translates the coordinates from center to origin coordinates (based on the object's dimensions) - * @param {fabric.Point} center The point which corresponds to center of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToOriginPoint: function(center, originX, originY) { - var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - if (this.angle) { - return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Returns the real center coordinates of the object - * @return {fabric.Point} - */ - getCenterPoint: function() { - var leftTop = new fabric.Point(this.left, this.top); - return this.translateToCenterPoint(leftTop, this.originX, this.originY); - }, - - /** - * Returns the coordinates of the object based on center coordinates - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @return {fabric.Point} - */ - // getOriginPoint: function(center) { - // return this.translateToOriginPoint(center, this.originX, this.originY); - // }, - - /** - * Returns the coordinates of the object as if it has a different origin - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - getPointByOrigin: function(originX, originY) { - var center = this.getCenterPoint(); - return this.translateToOriginPoint(center, originX, originY); - }, - - /** - * Returns the point in local coordinates - * @param {fabric.Point} point The point relative to the global coordinate system - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - toLocalPoint: function(point, originX, originY) { - var center = this.getCenterPoint(), - p, p2; - - if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) { - p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - } - else { - p = new fabric.Point(this.left, this.top); - } - - p2 = new fabric.Point(point.x, point.y); - if (this.angle) { - p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle)); - } - return p2.subtractEquals(p); - }, - - /** - * Returns the point in global coordinates - * @param {fabric.Point} The point relative to the local coordinate system - * @return {fabric.Point} - */ - // toGlobalPoint: function(point) { - // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top)); - // }, - - /** - * Sets the position of the object taking into consideration the object's origin - * @param {fabric.Point} pos The new position of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {void} - */ - setPositionByOrigin: function(pos, originX, originY) { - var center = this.translateToCenterPoint(pos, originX, originY), - position = this.translateToOriginPoint(center, this.originX, this.originY); - this.set('left', position.x); - this.set('top', position.y); - }, - - /** - * @param {String} to One of 'left', 'center', 'right' - */ - adjustPosition: function(to) { - var angle = degreesToRadians(this.angle), - hypotFull = this.getScaledWidth(), - xFull = fabric.util.cos(angle) * hypotFull, - yFull = fabric.util.sin(angle) * hypotFull, - offsetFrom, offsetTo; - - //TODO: this function does not consider mixed situation like top, center. - if (typeof this.originX === 'string') { - offsetFrom = originXOffset[this.originX]; - } - else { - offsetFrom = this.originX - 0.5; - } - if (typeof to === 'string') { - offsetTo = originXOffset[to]; - } - else { - offsetTo = to - 0.5; - } - this.left += xFull * (offsetTo - offsetFrom); - this.top += yFull * (offsetTo - offsetFrom); - this.setCoords(); - this.originX = to; - }, - - /** - * Sets the origin/position of the object to it's center point - * @private - * @return {void} - */ - _setOriginToCenter: function() { - this._originalOriginX = this.originX; - this._originalOriginY = this.originY; - - var center = this.getCenterPoint(); - - this.originX = 'center'; - this.originY = 'center'; - - this.left = center.x; - this.top = center.y; - }, - - /** - * Resets the origin/position of the object to it's original origin - * @private - * @return {void} - */ - _resetOrigin: function() { - var originPoint = this.translateToOriginPoint( - this.getCenterPoint(), - this._originalOriginX, - this._originalOriginY); - - this.originX = this._originalOriginX; - this.originY = this._originalOriginY; - - this.left = originPoint.x; - this.top = originPoint.y; - - this._originalOriginX = null; - this._originalOriginY = null; - }, - - /** - * @private - */ - _getLeftTopCoords: function() { - return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top'); - }, - }); - -})(); - - -(function() { - - function arrayFromCoords(coords) { - return [ - new fabric.Point(coords.tl.x, coords.tl.y), - new fabric.Point(coords.tr.x, coords.tr.y), - new fabric.Point(coords.br.x, coords.br.y), - new fabric.Point(coords.bl.x, coords.bl.y) - ]; - } - - var util = fabric.util, - degreesToRadians = util.degreesToRadians, - multiplyMatrices = util.multiplyTransformMatrices, - transformPoint = util.transformPoint; - - util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Describe object's corner position in canvas element coordinates. - * properties are depending on control keys and padding the main controls. - * each property is an object with x, y and corner. - * The `corner` property contains in a similar manner the 4 points of the - * interactive area of the corner. - * The coordinates depends from the controls positionHandler and are used - * to draw and locate controls - * @memberOf fabric.Object.prototype - */ - oCoords: null, - - /** - * Describe object's corner position in canvas object absolute coordinates - * properties are tl,tr,bl,br and describe the four main corner. - * each property is an object with x, y, instance of Fabric.Point. - * The coordinates depends from this properties: width, height, scaleX, scaleY - * skewX, skewY, angle, strokeWidth, top, left. - * Those coordinates are useful to understand where an object is. They get updated - * with oCoords but they do not need to be updated when zoom or panning change. - * The coordinates get updated with @method setCoords. - * You can calculate them without updating with @method calcACoords(); - * @memberOf fabric.Object.prototype - */ - aCoords: null, - - /** - * Describe object's corner position in canvas element coordinates. - * includes padding. Used of object detection. - * set and refreshed with setCoords and calcCoords. - * @memberOf fabric.Object.prototype - */ - lineCoords: null, - - /** - * storage for object transform matrix - */ - ownMatrixCache: null, - - /** - * storage for object full transform matrix - */ - matrixCache: null, - - /** - * custom controls interface - * controls are added by default_controls.js - */ - controls: { }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * @param {Boolean} absolute will return aCoords if true or lineCoords - * @return {Object} {tl, tr, br, bl} points - */ - _getCoords: function(absolute, calculate) { - if (calculate) { - return (absolute ? this.calcACoords() : this.calcLineCoords()); - } - if (!this.aCoords || !this.lineCoords) { - this.setCoords(true); - } - return (absolute ? this.aCoords : this.lineCoords); - }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * The coords are returned in an array. - * @return {Array} [tl, tr, br, bl] of points - */ - getCoords: function(absolute, calculate) { - return arrayFromCoords(this._getCoords(absolute, calculate)); - }, - - /** - * Checks if object intersects with an area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with an area formed by 2 points - */ - intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { - var coords = this.getCoords(absolute, calculate), - intersection = fabric.Intersection.intersectPolygonRectangle( - coords, - pointTL, - pointBR - ); - return intersection.status === 'Intersection'; - }, - - /** - * Checks if object intersects with another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with another object - */ - intersectsWithObject: function(other, absolute, calculate) { - var intersection = fabric.Intersection.intersectPolygonPolygon( - this.getCoords(absolute, calculate), - other.getCoords(absolute, calculate) - ); - - return intersection.status === 'Intersection' - || other.isContainedWithinObject(this, absolute, calculate) - || this.isContainedWithinObject(other, absolute, calculate); - }, - - /** - * Checks if object is fully contained within area of another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area of another object - */ - isContainedWithinObject: function(other, absolute, calculate) { - var points = this.getCoords(absolute, calculate), - otherCoords = absolute ? other.aCoords : other.lineCoords, - i = 0, lines = other._getImageLines(otherCoords); - for (; i < 4; i++) { - if (!other.containsPoint(points[i], lines)) { - return false; - } - } - return true; - }, - - /** - * Checks if object is fully contained within area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area formed by 2 points - */ - isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { - var boundingRect = this.getBoundingRect(absolute, calculate); - - return ( - boundingRect.left >= pointTL.x && - boundingRect.left + boundingRect.width <= pointBR.x && - boundingRect.top >= pointTL.y && - boundingRect.top + boundingRect.height <= pointBR.y - ); - }, - - /** - * Checks if point is inside the object - * @param {fabric.Point} point Point to check against - * @param {Object} [lines] object returned from @method _getImageLines - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if point is inside the object - */ - containsPoint: function(point, lines, absolute, calculate) { - var coords = this._getCoords(absolute, calculate), - lines = lines || this._getImageLines(coords), - xPoints = this._findCrossPoints(point, lines); - // if xPoints is odd then point is inside the object - return (xPoints !== 0 && xPoints % 2 === 1); - }, - - /** - * Checks if object is contained within the canvas with current viewportTransform - * the check is done stopping at first point that appears on screen - * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords - * @return {Boolean} true if object is fully or partially contained within canvas - */ - isOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - var points = this.getCoords(true, calculate); - // if some point is on screen, the object is on screen. - if (points.some(function(point) { - return point.x <= pointBR.x && point.x >= pointTL.x && - point.y <= pointBR.y && point.y >= pointTL.y; - })) { - return true; - } - // no points on screen, check intersection with absolute coordinates - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - return this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Checks if the object contains the midpoint between canvas extremities - * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen - * @private - * @param {Fabric.Point} pointTL Top Left point - * @param {Fabric.Point} pointBR Top Right point - * @param {Boolean} calculate use coordinates of current position instead of .oCoords - * @return {Boolean} true if the object contains the point - */ - _containsCenterOfCanvas: function(pointTL, pointBR, calculate) { - // worst case scenario the object is so big that contains the screen - var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 }; - if (this.containsPoint(centerPoint, null, true, calculate)) { - return true; - } - return false; - }, - - /** - * Checks if object is partially contained within the canvas with current viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is partially contained within canvas - */ - isPartiallyOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) { - return (point.x >= pointBR.x || point.x <= pointTL.x) && - (point.y >= pointBR.y || point.y <= pointTL.y); - }); - return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Method that returns an object with the object edges in it, given the coordinates of the corners - * @private - * @param {Object} oCoords Coordinates of the object corners - */ - _getImageLines: function(oCoords) { - - var lines = { - topline: { - o: oCoords.tl, - d: oCoords.tr - }, - rightline: { - o: oCoords.tr, - d: oCoords.br - }, - bottomline: { - o: oCoords.br, - d: oCoords.bl - }, - leftline: { - o: oCoords.bl, - d: oCoords.tl - } - }; - - // // debugging - // if (this.canvas.contextTop) { - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - // } - - return lines; - }, - - /** - * Helper method to determine how many cross points are between the 4 object edges - * and the horizontal line determined by a point on canvas - * @private - * @param {fabric.Point} point Point to check - * @param {Object} lines Coordinates of the object being evaluated - */ - // remove yi, not used but left code here just in case. - _findCrossPoints: function(point, lines) { - var b1, b2, a1, a2, xi, // yi, - xcount = 0, - iLine; - - for (var lineKey in lines) { - iLine = lines[lineKey]; - // optimisation 1: line below point. no cross - if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) { - continue; - } - // optimisation 2: line above point. no cross - if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) { - continue; - } - // optimisation 3: vertical line case - if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) { - xi = iLine.o.x; - // yi = point.y; - } - // calculate the intersection point - else { - b1 = 0; - b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x); - a1 = point.y - b1 * point.x; - a2 = iLine.o.y - b2 * iLine.o.x; - - xi = -(a1 - a2) / (b1 - b2); - // yi = a1 + b1 * xi; - } - // dont count xi < point.x cases - if (xi >= point.x) { - xcount += 1; - } - // optimisation 4: specific for square images - if (xcount === 2) { - break; - } - } - return xcount; - }, - - /** - * Returns coordinates of object's bounding rectangle (left, top, width, height) - * the box is intended as aligned to axis of canvas. - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords - * @return {Object} Object with left, top, width, height properties - */ - getBoundingRect: function(absolute, calculate) { - var coords = this.getCoords(absolute, calculate); - return util.makeBoundingBoxFromPoints(coords); - }, - - /** - * Returns width of an object's bounding box counting transformations - * before 2.0 it was named getWidth(); - * @return {Number} width value - */ - getScaledWidth: function() { - return this._getTransformedDimensions().x; - }, - - /** - * Returns height of an object bounding box counting transformations - * before 2.0 it was named getHeight(); - * @return {Number} height value - */ - getScaledHeight: function() { - return this._getTransformedDimensions().y; - }, - - /** - * Makes sure the scale is valid and modifies it if necessary - * @private - * @param {Number} value - * @return {Number} - */ - _constrainScale: function(value) { - if (Math.abs(value) < this.minScaleLimit) { - if (value < 0) { - return -this.minScaleLimit; - } - else { - return this.minScaleLimit; - } - } - else if (value === 0) { - return 0.0001; - } - return value; - }, - - /** - * Scales an object (equally by x and y) - * @param {Number} value Scale factor - * @return {fabric.Object} thisArg - * @chainable - */ - scale: function(value) { - this._set('scaleX', value); - this._set('scaleY', value); - return this.setCoords(); - }, - - /** - * Scales an object to a given width, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New width value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToWidth: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth(); - return this.scale(value / this.width / boundingRectFactor); - }, - - /** - * Scales an object to a given height, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New height value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToHeight: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight(); - return this.scale(value / this.height / boundingRectFactor); - }, - - /** - * Calculates and returns the .coords of an object. - * unused by the library, only for the end dev. - * @return {Object} Object with tl, tr, br, bl .... - * @chainable - * @deprecated - */ - calcCoords: function(absolute) { - // this is a compatibility function to avoid removing calcCoords now. - if (absolute) { - return this.calcACoords(); - } - return this.calcOCoords(); - }, - - calcLineCoords: function() { - var vpt = this.getViewportTransform(), - padding = this.padding, angle = degreesToRadians(this.angle), - cos = util.cos(angle), sin = util.sin(angle), - cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP, - cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords(); - - var lineCoords = { - tl: transformPoint(aCoords.tl, vpt), - tr: transformPoint(aCoords.tr, vpt), - bl: transformPoint(aCoords.bl, vpt), - br: transformPoint(aCoords.br, vpt), - }; - - if (padding) { - lineCoords.tl.x -= cosPMinusSinP; - lineCoords.tl.y -= cosPSinP; - lineCoords.tr.x += cosPSinP; - lineCoords.tr.y -= cosPMinusSinP; - lineCoords.bl.x -= cosPSinP; - lineCoords.bl.y += cosPMinusSinP; - lineCoords.br.x += cosPMinusSinP; - lineCoords.br.y += cosPSinP; - } - - return lineCoords; - }, - - calcOCoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - vpt = this.getViewportTransform(), - startMatrix = multiplyMatrices(vpt, translateMatrix), - finalMatrix = multiplyMatrices(startMatrix, rotateMatrix), - finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]), - dim = this._calculateCurrentDimensions(), - coords = {}; - this.forEachControl(function(control, key, fabricObject) { - coords[key] = control.positionHandler(dim, finalMatrix, fabricObject); - }); - - // debug code - // var canvas = this.canvas; - // setTimeout(function() { - // canvas.contextTop.clearRect(0, 0, 700, 700); - // canvas.contextTop.fillStyle = 'green'; - // Object.keys(coords).forEach(function(key) { - // var control = coords[key]; - // canvas.contextTop.fillRect(control.x, control.y, 3, 3); - // }); - // }, 50); - return coords; - }, - - calcACoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix), - dim = this._getTransformedDimensions(), - w = dim.x / 2, h = dim.y / 2; - return { - // corners - tl: transformPoint({ x: -w, y: -h }, finalMatrix), - tr: transformPoint({ x: w, y: -h }, finalMatrix), - bl: transformPoint({ x: -w, y: h }, finalMatrix), - br: transformPoint({ x: w, y: h }, finalMatrix) - }; - }, - - /** - * Sets corner and controls position coordinates based on current angle, width and height, left and top. - * oCoords are used to find the corners - * aCoords are used to quickly find an object on the canvas - * lineCoords are used to quickly find object during pointer events. - * See {@link https://github.com/kangax/fabric.js/wiki/When-to-call-setCoords|When-to-call-setCoords} - * @param {Boolean} [skipCorners] skip calculation of oCoords. - * @return {fabric.Object} thisArg - * @chainable - */ - setCoords: function(skipCorners) { - this.aCoords = this.calcACoords(); - // in case we are in a group, for how the inner group target check works, - // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer. - this.lineCoords = this.group ? this.aCoords : this.calcLineCoords(); - if (skipCorners) { - return this; - } - // set coordinates of the draggable boxes in the corners used to scale/rotate the image - this.oCoords = this.calcOCoords(); - this._setCornerCoords && this._setCornerCoords(); - return this; - }, - - /** - * calculate rotation matrix of an object - * @return {Array} rotation matrix for the object - */ - _calcRotateMatrix: function() { - return util.calcRotateMatrix(this); - }, - - /** - * calculate the translation matrix for an object transform - * @return {Array} rotation matrix for the object - */ - _calcTranslateMatrix: function() { - var center = this.getCenterPoint(); - return [1, 0, 0, 1, center.x, center.y]; - }, - - transformMatrixKey: function(skipGroup) { - var sep = '_', prefix = ''; - if (!skipGroup && this.group) { - prefix = this.group.transformMatrixKey(skipGroup) + sep; - }; - return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY + - sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY + - sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties. - * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations - * There are some situation in which this is useful to avoid the fake rotation. - * @return {Array} transform matrix for the object - */ - calcTransformMatrix: function(skipGroup) { - var matrix = this.calcOwnMatrix(); - if (skipGroup || !this.group) { - return matrix; - } - var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {}); - if (cache.key === key) { - return cache.value; - } - if (this.group) { - matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix); - } - cache.key = key; - cache.value = matrix; - return matrix; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties, this matrix does not include the group transformation - * @return {Array} transform matrix for the object - */ - calcOwnMatrix: function() { - var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {}); - if (cache.key === key) { - return cache.value; - } - var tMatrix = this._calcTranslateMatrix(), - options = { - angle: this.angle, - translateX: tMatrix[4], - translateY: tMatrix[5], - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: this.skewX, - skewY: this.skewY, - flipX: this.flipX, - flipY: this.flipY, - }; - cache.key = key; - cache.value = util.composeMatrix(options); - return cache.value; - }, - - /* - * Calculate object dimensions from its properties - * @private - * @deprecated since 3.4.0, please use fabric.util._calcDimensionsTransformMatrix - * not including or including flipX, flipY to emulate the flipping boolean - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _calcDimensionsTransformMatrix: function(skewX, skewY, flipping) { - return util.calcDimensionsMatrix({ - skewX: skewX, - skewY: skewY, - scaleX: this.scaleX * (flipping && this.flipX ? -1 : 1), - scaleY: this.scaleY * (flipping && this.flipY ? -1 : 1) - }); - }, - - /* - * Calculate object dimensions from its properties - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getNonTransformedDimensions: function() { - var strokeWidth = this.strokeWidth, - w = this.width + strokeWidth, - h = this.height + strokeWidth; - return { x: w, y: h }; - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param {Number} skewX, a value to override current skewX - * @param {Number} skewY, a value to override current skewY - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getTransformedDimensions: function(skewX, skewY) { - if (typeof skewX === 'undefined') { - skewX = this.skewX; - } - if (typeof skewY === 'undefined') { - skewY = this.skewY; - } - var dimensions, dimX, dimY, - noSkew = skewX === 0 && skewY === 0; - - if (this.strokeUniform) { - dimX = this.width; - dimY = this.height; - } - else { - dimensions = this._getNonTransformedDimensions(); - dimX = dimensions.x; - dimY = dimensions.y; - } - if (noSkew) { - return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY); - } - var bbox = util.sizeAfterTransform(dimX, dimY, { - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: skewX, - skewY: skewY, - }); - return this._finalizeDimensions(bbox.x, bbox.y); - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param Number width width of the bbox - * @param Number height height of the bbox - * @private - * @return {Object} .x finalized width dimension - * @return {Object} .y finalized height dimension - */ - _finalizeDimensions: function(width, height) { - return this.strokeUniform ? - { x: width + this.strokeWidth, y: height + this.strokeWidth } - : - { x: width, y: height }; - }, - - /* - * Calculate object dimensions for controls box, including padding and canvas zoom. - * and active selection - * private - */ - _calculateCurrentDimensions: function() { - var vpt = this.getViewportTransform(), - dim = this._getTransformedDimensions(), - p = transformPoint(dim, vpt, true); - return p.scalarAdd(2 * this.padding); - }, - }); -})(); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Moves an object to the bottom of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - sendToBack: function() { - if (this.group) { - fabric.StaticCanvas.prototype.sendToBack.call(this.group, this); - } - else if (this.canvas) { - this.canvas.sendToBack(this); - } - return this; - }, - - /** - * Moves an object to the top of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - bringToFront: function() { - if (this.group) { - fabric.StaticCanvas.prototype.bringToFront.call(this.group, this); - } - else if (this.canvas) { - this.canvas.bringToFront(this); - } - return this; - }, - - /** - * Moves an object down in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - sendBackwards: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.sendBackwards(this, intersecting); - } - return this; - }, - - /** - * Moves an object up in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - bringForward: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.bringForward(this, intersecting); - } - return this; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {Number} index New position of object - * @return {fabric.Object} thisArg - * @chainable - */ - moveTo: function(index) { - if (this.group && this.group.type !== 'activeSelection') { - fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index); - } - else if (this.canvas) { - this.canvas.moveTo(this, index); - } - return this; - } -}); - - -/* _TO_SVG_START_ */ -(function() { - function getSvgColorString(prop, value) { - if (!value) { - return prop + ': none; '; - } - else if (value.toLive) { - return prop + ': url(#SVGID_' + value.id + '); '; - } - else { - var color = new fabric.Color(value), - str = prop + ': ' + color.toRgb() + '; ', - opacity = color.getAlpha(); - if (opacity !== 1) { - //change the color in rgb + opacity - str += prop + '-opacity: ' + opacity.toString() + '; '; - } - return str; - } - } - - var toFixed = fabric.util.toFixed; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - - var fillRule = this.fillRule ? this.fillRule : 'nonzero', - strokeWidth = this.strokeWidth ? this.strokeWidth : '0', - strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none', - strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0', - strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt', - strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter', - strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4', - opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1', - visibility = this.visible ? '' : ' visibility: hidden;', - filter = skipShadow ? '' : this.getSvgFilter(), - fill = getSvgColorString('fill', this.fill), - stroke = getSvgColorString('stroke', this.stroke); - - return [ - stroke, - 'stroke-width: ', strokeWidth, '; ', - 'stroke-dasharray: ', strokeDashArray, '; ', - 'stroke-linecap: ', strokeLineCap, '; ', - 'stroke-dashoffset: ', strokeDashOffset, '; ', - 'stroke-linejoin: ', strokeLineJoin, '; ', - 'stroke-miterlimit: ', strokeMiterLimit, '; ', - fill, - 'fill-rule: ', fillRule, '; ', - 'opacity: ', opacity, ';', - filter, - visibility - ].join(''); - }, - - /** - * Returns styles-string for svg-export - * @param {Object} style the object from which to retrieve style properties - * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style. - * @return {String} - */ - getSvgSpanStyles: function(style, useWhiteSpace) { - var term = '; '; - var fontFamily = style.fontFamily ? - 'font-family: ' + (((style.fontFamily.indexOf('\'') === -1 && style.fontFamily.indexOf('"') === -1) ? - '\'' + style.fontFamily + '\'' : style.fontFamily)) + term : ''; - var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '', - fontFamily = fontFamily, - fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '', - fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '', - fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '', - fill = style.fill ? getSvgColorString('fill', style.fill) : '', - stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '', - textDecoration = this.getSvgTextDecoration(style), - deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : ''; - if (textDecoration) { - textDecoration = 'text-decoration: ' + textDecoration + term; - } - - return [ - stroke, - strokeWidth, - fontFamily, - fontSize, - fontStyle, - fontWeight, - textDecoration, - fill, - deltaY, - useWhiteSpace ? 'white-space: pre; ' : '' - ].join(''); - }, - - /** - * Returns text-decoration property for svg-export - * @param {Object} style the object from which to retrieve style properties - * @return {String} - */ - getSvgTextDecoration: function(style) { - return ['overline', 'underline', 'line-through'].filter(function(decoration) { - return style[decoration.replace('-', '')]; - }).join(' '); - }, - - /** - * Returns filter for svg shadow - * @return {String} - */ - getSvgFilter: function() { - return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : ''; - }, - - /** - * Returns id attribute for svg output - * @return {String} - */ - getSvgCommons: function() { - return [ - this.id ? 'id="' + this.id + '" ' : '', - this.clipPath ? 'clip-path="url(#' + this.clipPath.clipPathId + ')" ' : '', - ].join(''); - }, - - /** - * Returns transform-string for svg-export - * @param {Boolean} use the full transform or the single object one. - * @return {String} - */ - getSvgTransform: function(full, additionalTransform) { - var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(), - svgTransform = 'transform="' + fabric.util.matrixToSVG(transform); - return svgTransform + - (additionalTransform || '') + '" '; - }, - - _setSVGBg: function(textBgRects) { - if (this.backgroundColor) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - } - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - return '\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * @private - */ - _createBaseClipPathSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var reviver = options.reviver, - additionalTransform = options.additionalTransform || '', - commonPieces = [ - this.getSvgTransform(true, additionalTransform), - this.getSvgCommons(), - ].join(''), - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'); - objectMarkup[index] = commonPieces; - return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join(''); - }, - - /** - * @private - */ - _createBaseSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var noStyle = options.noStyle, - reviver = options.reviver, - styleInfo = noStyle ? '' : 'style="' + this.getSvgStyles() + '" ', - shadowInfo = options.withShadow ? 'style="' + this.getSvgFilter() + '" ' : '', - clipPath = this.clipPath, - vectorEffect = this.strokeUniform ? 'vector-effect="non-scaling-stroke" ' : '', - absoluteClipPath = clipPath && clipPath.absolutePositioned, - stroke = this.stroke, fill = this.fill, shadow = this.shadow, - commonPieces, markup = [], clipPathMarkup, - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'), - additionalTransform = options.additionalTransform; - if (clipPath) { - clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; - clipPathMarkup = '\n' + - clipPath.toClipPathSVG(reviver) + - '\n'; - } - if (absoluteClipPath) { - markup.push( - '\n' - ); - } - markup.push( - '\n' - ); - commonPieces = [ - styleInfo, - vectorEffect, - noStyle ? '' : this.addPaintOrder(), ' ', - additionalTransform ? 'transform="' + additionalTransform + '" ' : '', - ].join(''); - objectMarkup[index] = commonPieces; - if (fill && fill.toLive) { - markup.push(fill.toSVG(this)); - } - if (stroke && stroke.toLive) { - markup.push(stroke.toSVG(this)); - } - if (shadow) { - markup.push(shadow.toSVG(this)); - } - if (clipPath) { - markup.push(clipPathMarkup); - } - markup.push(objectMarkup.join('')); - markup.push('\n'); - absoluteClipPath && markup.push('\n'); - return reviver ? reviver(markup.join('')) : markup.join(''); - }, - - addPaintOrder: function() { - return this.paintFirst !== 'fill' ? ' paint-order="' + this.paintFirst + '" ' : ''; - } - }); -})(); -/* _TO_SVG_END_ */ - - -(function() { - - var extend = fabric.util.object.extend, - originalSet = 'stateProperties'; - - /* - Depends on `stateProperties` - */ - function saveProps(origin, destination, props) { - var tmpObj = { }, deep = true; - props.forEach(function(prop) { - tmpObj[prop] = origin[prop]; - }); - - extend(origin[destination], tmpObj, deep); - } - - function _isEqual(origValue, currentValue, firstPass) { - if (origValue === currentValue) { - // if the objects are identical, return - return true; - } - else if (Array.isArray(origValue)) { - if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) { - return false; - } - for (var i = 0, len = origValue.length; i < len; i++) { - if (!_isEqual(origValue[i], currentValue[i])) { - return false; - } - } - return true; - } - else if (origValue && typeof origValue === 'object') { - var keys = Object.keys(origValue), key; - if (!currentValue || - typeof currentValue !== 'object' || - (!firstPass && keys.length !== Object.keys(currentValue).length) - ) { - return false; - } - for (var i = 0, len = keys.length; i < len; i++) { - key = keys[i]; - // since clipPath is in the statefull cache list and the clipPath objects - // would be iterated as an object, this would lead to possible infinite recursion - // we do not want to compare those. - if (key === 'canvas' || key === 'group') { - continue; - } - if (!_isEqual(origValue[key], currentValue[key])) { - return false; - } - } - return true; - } - } - - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Returns true if object state (one of its state properties) was changed - * @param {String} [propertySet] optional name for the set of property we want to save - * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called - */ - hasStateChanged: function(propertySet) { - propertySet = propertySet || originalSet; - var dashedPropertySet = '_' + propertySet; - if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) { - return true; - } - return !_isEqual(this[dashedPropertySet], this, true); - }, - - /** - * Saves state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - saveState: function(options) { - var propertySet = options && options.propertySet || originalSet, - destination = '_' + propertySet; - if (!this[destination]) { - return this.setupState(options); - } - saveProps(this, destination, this[propertySet]); - if (options && options.stateProperties) { - saveProps(this, destination, options.stateProperties); - } - return this; - }, - - /** - * Setups state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - setupState: function(options) { - options = options || { }; - var propertySet = options.propertySet || originalSet; - options.propertySet = propertySet; - this['_' + propertySet] = { }; - this.saveState(options); - return this; - } - }); -})(); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Determines which corner has been clicked - * @private - * @param {Object} pointer The pointer indicating the mouse position - * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found - */ - _findTargetCorner: function(pointer, forTouch) { - // objects in group, anykind, are not self modificable, - // must not return an hovered corner. - if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) { - return false; - } - - var ex = pointer.x, - ey = pointer.y, - xPoints, - lines, keys = Object.keys(this.oCoords), - j = keys.length - 1, i; - this.__corner = 0; - - // cycle in reverse order so we pick first the one on top - for (; j >= 0; j--) { - i = keys[j]; - if (!this.isControlVisible(i)) { - continue; - } - - lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner); - // // debugging - // - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - - xPoints = this._findCrossPoints({ x: ex, y: ey }, lines); - if (xPoints !== 0 && xPoints % 2 === 1) { - this.__corner = i; - return i; - } - } - return false; - }, - - /** - * Calls a function for each control. The function gets called, - * with the control, the object that is calling the iterator and the control's key - * @param {Function} fn function to iterate over the controls over - */ - forEachControl: function(fn) { - for (var i in this.controls) { - fn(this.controls[i], i, this); - }; - }, - - /** - * Sets the coordinates of the draggable boxes in the corners of - * the image used to scale/rotate it. - * note: if we would switch to ROUND corner area, all of this would disappear. - * everything would resolve to a single point and a pythagorean theorem for the distance - * @private - */ - _setCornerCoords: function() { - var coords = this.oCoords; - - for (var control in coords) { - var controlObject = this.controls[control]; - coords[control].corner = controlObject.calcCornerCoords( - this.angle, this.cornerSize, coords[control].x, coords[control].y, false); - coords[control].touchCorner = controlObject.calcCornerCoords( - this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true); - } - }, - - /** - * Draws a colored layer behind the object, inside its selection borders. - * Requires public options: padding, selectionBackgroundColor - * this function is called when the context is transformed - * has checks to be skipped when the object is on a staticCanvas - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @return {fabric.Object} thisArg - * @chainable - */ - drawSelectionBackground: function(ctx) { - if (!this.selectionBackgroundColor || - (this.canvas && !this.canvas.interactive) || - (this.canvas && this.canvas._activeObject !== this) - ) { - return this; - } - ctx.save(); - var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(), - vpt = this.canvas.viewportTransform; - ctx.translate(center.x, center.y); - ctx.scale(1 / vpt[0], 1 / vpt[3]); - ctx.rotate(degreesToRadians(this.angle)); - ctx.fillStyle = this.selectionBackgroundColor; - ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y); - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBorders: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - var wh = this._calculateCurrentDimensions(), - strokeWidth = this.borderScaleFactor, - width = wh.x + strokeWidth, - height = wh.y + strokeWidth, - hasControls = typeof styleOverride.hasControls !== 'undefined' ? - styleOverride.hasControls : this.hasControls, - shouldStroke = false; - - ctx.save(); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); - - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - if (hasControls) { - ctx.beginPath(); - this.forEachControl(function(control, key, fabricObject) { - // in this moment, the ctx is centered on the object. - // width and height of the above function are the size of the bbox. - if (control.withConnection && control.getVisibility(fabricObject, key)) { - // reset movement for each control - shouldStroke = true; - ctx.moveTo(control.x * width, control.y * height); - ctx.lineTo( - control.x * width + control.offsetX, - control.y * height + control.offsetY - ); - } - }); - if (shouldStroke) { - ctx.stroke(); - } - } - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box when it is inside a group. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {object} options object representing current object parameters - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBordersInGroup: function(ctx, options, styleOverride) { - styleOverride = styleOverride || {}; - var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options), - strokeWidth = this.strokeWidth, - strokeUniform = this.strokeUniform, - borderScaleFactor = this.borderScaleFactor, - width = - bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor, - height = - bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor; - ctx.save(); - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - ctx.restore(); - return this; - }, - - /** - * Draws corners of an object's bounding box. - * Requires public properties: width, height - * Requires public options: cornerSize, padding - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawControls: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - ctx.save(); - var retinaScaling = this.canvas.getRetinaScaling(), matrix, p; - ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0); - ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor; - if (!this.transparentCorners) { - ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor; - } - this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray); - this.setCoords(); - if (this.group) { - // fabricJS does not really support drawing controls inside groups, - // this piece of code here helps having at least the control in places. - // If an application needs to show some objects as selected because of some UI state - // can still call Object._renderControls() on any object they desire, independently of groups. - // using no padding, circular controls and hiding the rotating cursor is higly suggested, - matrix = this.group.calcTransformMatrix(); - } - this.forEachControl(function(control, key, fabricObject) { - p = fabricObject.oCoords[key]; - if (control.getVisibility(fabricObject, key)) { - if (matrix) { - p = fabric.util.transformPoint(p, matrix); - } - control.render(ctx, p.x, p.y, styleOverride, fabricObject); - } - }); - ctx.restore(); - - return this; - }, - - /** - * Returns true if the specified control is visible, false otherwise. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @returns {Boolean} true if the specified control is visible, false otherwise - */ - isControlVisible: function(controlKey) { - return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey); - }, - - /** - * Sets the visibility of the specified control. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @param {Boolean} visible true to set the specified control visible, false otherwise - * @return {fabric.Object} thisArg - * @chainable - */ - setControlVisible: function(controlKey, visible) { - if (!this._controlsVisibility) { - this._controlsVisibility = {}; - } - this._controlsVisibility[controlKey] = visible; - return this; - }, - - /** - * Sets the visibility state of object controls. - * @param {Object} [options] Options object - * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it - * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it - * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it - * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it - * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it - * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it - * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it - * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it - * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it - * @return {fabric.Object} thisArg - * @chainable - */ - setControlsVisibility: function(options) { - options || (options = { }); - - for (var p in options) { - this.setControlVisible(p, options[p]); - } - return this; - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to deselect this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onDeselect: function() { - // implemented by sub-classes, as needed. - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to select this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onSelect: function() { - // implemented by sub-classes, as needed. - } - }); -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Animation duration (in ms) for fx* methods - * @type Number - * @default - */ - FX_DURATION: 500, - - /** - * Centers object horizontally with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxCenterObjectH: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.left, - endValue: this.getCenter().left, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('left', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - - return this; - }, - - /** - * Centers object vertically with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxCenterObjectV: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.top, - endValue: this.getCenter().top, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('top', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - - return this; - }, - - /** - * Same as `fabric.Canvas#remove` but animated - * @param {fabric.Object} object Object to remove - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxRemove: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: object.opacity, - endValue: 0, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('opacity', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function () { - _this.remove(object); - onComplete(); - } - }); - - return this; - } -}); - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Animates object's properties - * @param {String|Object} property Property to animate (if string) or properties to animate (if object) - * @param {Number|Object} value Value to animate property to (if string was given first) or options object - * @return {fabric.Object} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} - * @chainable - * - * As object — multiple properties - * - * object.animate({ left: ..., top: ... }); - * object.animate({ left: ..., top: ... }, { duration: ... }); - * - * As string — one property - * - * object.animate('left', ...); - * object.animate('left', { duration: ... }); - * - */ - animate: function() { - if (arguments[0] && typeof arguments[0] === 'object') { - var propsToAnimate = [], prop, skipCallbacks; - for (prop in arguments[0]) { - propsToAnimate.push(prop); - } - for (var i = 0, len = propsToAnimate.length; i < len; i++) { - prop = propsToAnimate[i]; - skipCallbacks = i !== len - 1; - this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks); - } - } - else { - this._animate.apply(this, arguments); - } - return this; - }, - - /** - * @private - * @param {String} property Property to animate - * @param {String} to Value to animate to - * @param {Object} [options] Options object - * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked - */ - _animate: function(property, to, options, skipCallbacks) { - var _this = this, propPair; - - to = to.toString(); - - if (!options) { - options = { }; - } - else { - options = fabric.util.object.clone(options); - } - - if (~property.indexOf('.')) { - propPair = property.split('.'); - } - - var propIsColor = - _this.colorProperties.indexOf(property) > -1 || - (propPair && _this.colorProperties.indexOf(propPair[1]) > -1); - - var currentValue = propPair - ? this.get(propPair[0])[propPair[1]] - : this.get(property); - - if (!('from' in options)) { - options.from = currentValue; - } - - if (!propIsColor) { - if (~to.indexOf('=')) { - to = currentValue + parseFloat(to.replace('=', '')); - } - else { - to = parseFloat(to); - } - } - - var _options = { - startValue: options.from, - endValue: to, - byValue: options.by, - easing: options.easing, - duration: options.duration, - abort: options.abort && function(value, valueProgress, timeProgress) { - return options.abort.call(_this, value, valueProgress, timeProgress); - }, - onChange: function (value, valueProgress, timeProgress) { - if (propPair) { - _this[propPair[0]][propPair[1]] = value; - } - else { - _this.set(property, value); - } - if (skipCallbacks) { - return; - } - options.onChange && options.onChange(value, valueProgress, timeProgress); - }, - onComplete: function (value, valueProgress, timeProgress) { - if (skipCallbacks) { - return; - } - - _this.setCoords(); - options.onComplete && options.onComplete(value, valueProgress, timeProgress); - } - }; - - if (propIsColor) { - return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options); - } - else { - return fabric.util.animate(_options); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 }; - - if (fabric.Line) { - fabric.warn('fabric.Line is already defined'); - return; - } - - /** - * Line class - * @class fabric.Line - * @extends fabric.Object - * @see {@link fabric.Line#initialize} for constructor definition - */ - fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'line', - - /** - * x value or first line edge - * @type Number - * @default - */ - x1: 0, - - /** - * y value or first line edge - * @type Number - * @default - */ - y1: 0, - - /** - * x value or second line edge - * @type Number - * @default - */ - x2: 0, - - /** - * y value or second line edge - * @type Number - * @default - */ - y2: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'), - - /** - * Constructor - * @param {Array} [points] Array of points - * @param {Object} [options] Options object - * @return {fabric.Line} thisArg - */ - initialize: function(points, options) { - if (!points) { - points = [0, 0, 0, 0]; - } - - this.callSuper('initialize', options); - - this.set('x1', points[0]); - this.set('y1', points[1]); - this.set('x2', points[2]); - this.set('y2', points[3]); - - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Object} [options] Options - */ - _setWidthHeight: function(options) { - options || (options = { }); - - this.width = Math.abs(this.x2 - this.x1); - this.height = Math.abs(this.y2 - this.y1); - - this.left = 'left' in options - ? options.left - : this._getLeftToOriginX(); - - this.top = 'top' in options - ? options.top - : this._getTopToOriginY(); - }, - - /** - * @private - * @param {String} key - * @param {*} value - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - if (typeof coordProps[key] !== 'undefined') { - this._setWidthHeight(); - } - return this; - }, - - /** - * @private - * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line. - */ - _getLeftToOriginX: makeEdgeToOriginGetter( - { // property names - origin: 'originX', - axis1: 'x1', - axis2: 'x2', - dimension: 'width' - }, - { // possible values of origin - nearest: 'left', - center: 'center', - farthest: 'right' - } - ), - - /** - * @private - * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line. - */ - _getTopToOriginY: makeEdgeToOriginGetter( - { // property names - origin: 'originY', - axis1: 'y1', - axis2: 'y2', - dimension: 'height' - }, - { // possible values of origin - nearest: 'top', - center: 'center', - farthest: 'bottom' - } - ), - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - - - var p = this.calcLinePoints(); - ctx.moveTo(p.x1, p.y1); - ctx.lineTo(p.x2, p.y2); - - ctx.lineWidth = this.strokeWidth; - - // TODO: test this - // make sure setting "fill" changes color of a line - // (by copying fillStyle to strokeStyle, since line is stroked, not filled) - var origStrokeStyle = ctx.strokeStyle; - ctx.strokeStyle = this.stroke || ctx.fillStyle; - this.stroke && this._renderStroke(ctx); - ctx.strokeStyle = origStrokeStyle; - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { - x: (this.x1 + this.x2) / 2, - y: (this.y1 + this.y2) / 2, - }; - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints()); - }, - - /* - * Calculate object dimensions from its properties - * @private - */ - _getNonTransformedDimensions: function() { - var dim = this.callSuper('_getNonTransformedDimensions'); - if (this.strokeLineCap === 'butt') { - if (this.width === 0) { - dim.y -= this.strokeWidth; - } - if (this.height === 0) { - dim.x -= this.strokeWidth; - } - } - return dim; - }, - - /** - * Recalculates line points given width and height - * @private - */ - calcLinePoints: function() { - var xMult = this.x1 <= this.x2 ? -1 : 1, - yMult = this.y1 <= this.y2 ? -1 : 1, - x1 = (xMult * this.width * 0.5), - y1 = (yMult * this.height * 0.5), - x2 = (xMult * this.width * -0.5), - y2 = (yMult * this.height * -0.5); - - return { - x1: x1, - x2: x2, - y1: y1, - y2: y2 - }; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var p = this.calcLinePoints(); - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement}) - * @static - * @memberOf fabric.Line - * @see http://www.w3.org/TR/SVG/shapes.html#LineElement - */ - fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' ')); - - /** - * Returns fabric.Line instance from an SVG element - * @static - * @memberOf fabric.Line - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} [callback] callback function invoked after parsing - */ - fabric.Line.fromElement = function(element, callback, options) { - options = options || { }; - var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES), - points = [ - parsedAttributes.x1 || 0, - parsedAttributes.y1 || 0, - parsedAttributes.x2 || 0, - parsedAttributes.y2 || 0 - ]; - callback(new fabric.Line(points, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Line instance from an object representation - * @static - * @memberOf fabric.Line - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Line.fromObject = function(object, callback) { - function _callback(instance) { - delete instance.points; - callback && callback(instance); - }; - var options = clone(object, true); - options.points = [object.x1, object.y1, object.x2, object.y2]; - fabric.Object._fromObject('Line', options, _callback, 'points'); - }; - - /** - * Produces a function that calculates distance from canvas edge to Line origin. - */ - function makeEdgeToOriginGetter(propertyNames, originValues) { - var origin = propertyNames.origin, - axis1 = propertyNames.axis1, - axis2 = propertyNames.axis2, - dimension = propertyNames.dimension, - nearest = originValues.nearest, - center = originValues.center, - farthest = originValues.farthest; - - return function() { - switch (this.get(origin)) { - case nearest: - return Math.min(this.get(axis1), this.get(axis2)); - case center: - return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension)); - case farthest: - return Math.max(this.get(axis1), this.get(axis2)); - } - }; - - } - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - pi = Math.PI; - - if (fabric.Circle) { - fabric.warn('fabric.Circle is already defined.'); - return; - } - - /** - * Circle class - * @class fabric.Circle - * @extends fabric.Object - * @see {@link fabric.Circle#initialize} for constructor definition - */ - fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'circle', - - /** - * Radius of this circle - * @type Number - * @default - */ - radius: 0, - - /** - * Start angle of the circle, moving clockwise - * deprecated type, this should be in degree, this was an oversight. - * probably will change to degrees in next major version - * @type Number - * @default 0 - */ - startAngle: 0, - - /** - * End angle of the circle - * deprecated type, this should be in degree, this was an oversight. - * probably will change to degrees in next major version - * @type Number - * @default 2Pi - */ - endAngle: pi * 2, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'), - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Circle} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - - if (key === 'radius') { - this.setRadius(value); - } - - return this; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString, x = 0, y = 0, - angle = (this.endAngle - this.startAngle) % ( 2 * pi); - - if (angle === 0) { - svgString = [ - '\n' - ]; - } - else { - var startX = fabric.util.cos(this.startAngle) * this.radius, - startY = fabric.util.sin(this.startAngle) * this.radius, - endX = fabric.util.cos(this.endAngle) * this.radius, - endY = fabric.util.sin(this.endAngle) * this.radius, - largeFlag = angle > pi ? '1' : '0'; - svgString = [ - '\n' - ]; - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.arc( - 0, - 0, - this.radius, - this.startAngle, - this.endAngle, false); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusX: function() { - return this.get('radius') * this.get('scaleX'); - }, - - /** - * Returns vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusY: function() { - return this.get('radius') * this.get('scaleY'); - }, - - /** - * Sets radius of an object (and updates width accordingly) - * @return {fabric.Circle} thisArg - */ - setRadius: function(value) { - this.radius = value; - return this.set('width', value * 2).set('height', value * 2); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement}) - * @static - * @memberOf fabric.Circle - * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement - */ - fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' ')); - - /** - * Returns {@link fabric.Circle} instance from an SVG element - * @static - * @memberOf fabric.Circle - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @param {Object} [options] Options object - * @throws {Error} If value of `r` attribute is missing or invalid - */ - fabric.Circle.fromElement = function(element, callback) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); - - if (!isValidRadius(parsedAttributes)) { - throw new Error('value of `r` attribute is required and can not be negative'); - } - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius; - callback(new fabric.Circle(parsedAttributes)); - }; - - /** - * @private - */ - function isValidRadius(attributes) { - return (('radius' in attributes) && (attributes.radius >= 0)); - } - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Circle} instance from an object representation - * @static - * @memberOf fabric.Circle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {void} - */ - fabric.Circle.fromObject = function(object, callback) { - fabric.Object._fromObject('Circle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Triangle) { - fabric.warn('fabric.Triangle is already defined'); - return; - } - - /** - * Triangle class - * @class fabric.Triangle - * @extends fabric.Object - * @return {fabric.Triangle} thisArg - * @see {@link fabric.Triangle#initialize} for constructor definition - */ - fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'triangle', - - /** - * Width is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - width: 100, - - /** - * Height is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - height: 100, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2; - - ctx.beginPath(); - ctx.moveTo(-widthBy2, heightBy2); - ctx.lineTo(0, -heightBy2); - ctx.lineTo(widthBy2, heightBy2); - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2, - points = [ - -widthBy2 + ' ' + heightBy2, - '0 ' + -heightBy2, - widthBy2 + ' ' + heightBy2 - ].join(','); - return [ - '' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Triangle} instance from an object representation - * @static - * @memberOf fabric.Triangle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Triangle.fromObject = function(object, callback) { - return fabric.Object._fromObject('Triangle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - piBy2 = Math.PI * 2; - - if (fabric.Ellipse) { - fabric.warn('fabric.Ellipse is already defined.'); - return; - } - - /** - * Ellipse class - * @class fabric.Ellipse - * @extends fabric.Object - * @return {fabric.Ellipse} thisArg - * @see {@link fabric.Ellipse#initialize} for constructor definition - */ - fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'ellipse', - - /** - * Horizontal radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {fabric.Ellipse} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this.set('rx', options && options.rx || 0); - this.set('ry', options && options.ry || 0); - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Ellipse} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - switch (key) { - - case 'rx': - this.rx = value; - this.set('width', value * 2); - break; - - case 'ry': - this.ry = value; - this.set('height', value * 2); - break; - - } - return this; - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRx: function() { - return this.get('rx') * this.get('scaleX'); - }, - - /** - * Returns Vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRy: function() { - return this.get('ry') * this.get('scaleY'); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.save(); - ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0); - ctx.arc( - 0, - 0, - this.rx, - 0, - piBy2, - false); - ctx.restore(); - this._renderPaintInOrder(ctx); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement}) - * @static - * @memberOf fabric.Ellipse - * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement - */ - fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' ')); - - /** - * Returns {@link fabric.Ellipse} instance from an SVG element - * @static - * @memberOf fabric.Ellipse - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @return {fabric.Ellipse} - */ - fabric.Ellipse.fromElement = function(element, callback) { - - var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES); - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry; - callback(new fabric.Ellipse(parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Ellipse} instance from an object representation - * @static - * @memberOf fabric.Ellipse - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {void} - */ - fabric.Ellipse.fromObject = function(object, callback) { - fabric.Object._fromObject('Ellipse', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend; - - if (fabric.Rect) { - fabric.warn('fabric.Rect is already defined'); - return; - } - - /** - * Rectangle class - * @class fabric.Rect - * @extends fabric.Object - * @return {fabric.Rect} thisArg - * @see {@link fabric.Rect#initialize} for constructor definition - */ - fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ { - - /** - * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'), - - /** - * Type of an object - * @type String - * @default - */ - type: 'rect', - - /** - * Horizontal border radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical border radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this._initRxRy(); - }, - - /** - * Initializes rx/ry attributes - * @private - */ - _initRxRy: function() { - if (this.rx && !this.ry) { - this.ry = this.rx; - } - else if (this.ry && !this.rx) { - this.rx = this.ry; - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - - // 1x1 case (used in spray brush) optimization was removed because - // with caching and higher zoom level this makes more damage than help - - var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0, - ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, - w = this.width, - h = this.height, - x = -this.width / 2, - y = -this.height / 2, - isRounded = rx !== 0 || ry !== 0, - /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */ - k = 1 - 0.5522847498; - ctx.beginPath(); - - ctx.moveTo(x + rx, y); - - ctx.lineTo(x + w - rx, y); - isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry); - - ctx.lineTo(x + w, y + h - ry); - isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h); - - ctx.lineTo(x + rx, y + h); - isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry); - - ctx.lineTo(x, y + ry); - isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y); - - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var x = -this.width / 2, y = -this.height / 2; - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`) - * @static - * @memberOf fabric.Rect - * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement - */ - fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' ')); - - /** - * Returns {@link fabric.Rect} instance from an SVG element - * @static - * @memberOf fabric.Rect - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Rect.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - options = options || { }; - - var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES); - parsedAttributes.left = parsedAttributes.left || 0; - parsedAttributes.top = parsedAttributes.top || 0; - parsedAttributes.height = parsedAttributes.height || 0; - parsedAttributes.width = parsedAttributes.width || 0; - var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - rect.visible = rect.visible && rect.width > 0 && rect.height > 0; - callback(rect); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Rect} instance from an object representation - * @static - * @memberOf fabric.Rect - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created - */ - fabric.Rect.fromObject = function(object, callback) { - return fabric.Object._fromObject('Rect', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - min = fabric.util.array.min, - max = fabric.util.array.max, - toFixed = fabric.util.toFixed; - - if (fabric.Polyline) { - fabric.warn('fabric.Polyline is already defined'); - return; - } - - /** - * Polyline class - * @class fabric.Polyline - * @extends fabric.Object - * @see {@link fabric.Polyline#initialize} for constructor definition - */ - fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polyline', - - /** - * Points array - * @type Array - * @default - */ - points: null, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'), - - /** - * Constructor - * @param {Array} points Array of points (where each point is an object with x and y) - * @param {Object} [options] Options object - * @return {fabric.Polyline} thisArg - * @example - * var poly = new fabric.Polyline([ - * { x: 10, y: 10 }, - * { x: 50, y: 30 }, - * { x: 40, y: 70 }, - * { x: 60, y: 50 }, - * { x: 100, y: 150 }, - * { x: 40, y: 100 } - * ], { - * stroke: 'red', - * left: 100, - * top: 100 - * }); - */ - initialize: function(points, options) { - options = options || {}; - this.points = points || []; - this.callSuper('initialize', options); - this._setPositionDimensions(options); - }, - - _setPositionDimensions: function(options) { - var calcDim = this._calcDimensions(options), correctLeftTop; - this.width = calcDim.width; - this.height = calcDim.height; - if (!options.fromSVG) { - correctLeftTop = this.translateToGivenOrigin( - { x: calcDim.left - this.strokeWidth / 2, y: calcDim.top - this.strokeWidth / 2 }, - 'left', - 'top', - this.originX, - this.originY - ); - } - if (typeof options.left === 'undefined') { - this.left = options.fromSVG ? calcDim.left : correctLeftTop.x; - } - if (typeof options.top === 'undefined') { - this.top = options.fromSVG ? calcDim.top : correctLeftTop.y; - } - this.pathOffset = { - x: calcDim.left + this.width / 2, - y: calcDim.top + this.height / 2 - }; - }, - - /** - * Calculate the polygon min and max point from points array, - * returning an object with left, top, width, height to measure the - * polygon size - * @return {Object} object.left X coordinate of the polygon leftmost point - * @return {Object} object.top Y coordinate of the polygon topmost point - * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point - * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point - * @private - */ - _calcDimensions: function() { - - var points = this.points, - minX = min(points, 'x') || 0, - minY = min(points, 'y') || 0, - maxX = max(points, 'x') || 0, - maxY = max(points, 'y') || 0, - width = (maxX - minX), - height = (maxY - minY); - - return { - left: minX, - top: minY, - width: width, - height: height - }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - points: this.points.concat() - }); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y, - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push( - toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', - toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ' - ); - } - return [ - '<' + this.type + ' ', 'COMMON_PARTS', - 'points="', points.join(''), - '" />\n' - ]; - }, - /* _TO_SVG_END_ */ - - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - commonRender: function(ctx) { - var point, len = this.points.length, - x = this.pathOffset.x, - y = this.pathOffset.y; - - if (!len || isNaN(this.points[len - 1].y)) { - // do not draw if no points or odd points - // NaN comes from parseFloat of a empty string in parser - return false; - } - ctx.beginPath(); - ctx.moveTo(this.points[0].x - x, this.points[0].y - y); - for (var i = 0; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x - x, point.y - y); - } - return true; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - this._renderPaintInOrder(ctx); - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.get('points').length; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement}) - * @static - * @memberOf fabric.Polyline - * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement - */ - fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns fabric.Polyline instance from an SVG element - * @static - * @memberOf fabric.Polyline - * @param {SVGElement} element Element to parser - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polyline.fromElementGenerator = function(_class) { - return function(element, callback, options) { - if (!element) { - return callback(null); - } - options || (options = { }); - - var points = fabric.parsePointsAttribute(element.getAttribute('points')), - parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric[_class](points, extend(parsedAttributes, options))); - }; - }; - - fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline'); - - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polyline instance from an object representation - * @static - * @memberOf fabric.Polyline - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Polyline.fromObject = function(object, callback) { - return fabric.Object._fromObject('Polyline', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Polygon) { - fabric.warn('fabric.Polygon is already defined'); - return; - } - - /** - * Polygon class - * @class fabric.Polygon - * @extends fabric.Polyline - * @see {@link fabric.Polygon#initialize} for constructor definition - */ - fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polygon', - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - ctx.closePath(); - this._renderPaintInOrder(ctx); - }, - - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`) - * @static - * @memberOf fabric.Polygon - * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement - */ - fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns {@link fabric.Polygon} instance from an SVG element - * @static - * @memberOf fabric.Polygon - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon'); - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polygon instance from an object representation - * @static - * @memberOf fabric.Polygon - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - * @return {void} - */ - fabric.Polygon.fromObject = function(object, callback) { - fabric.Object._fromObject('Polygon', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max, - extend = fabric.util.object.extend, - _toString = Object.prototype.toString, - toFixed = fabric.util.toFixed; - - if (fabric.Path) { - fabric.warn('fabric.Path is already defined'); - return; - } - - /** - * Path class - * @class fabric.Path - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup} - * @see {@link fabric.Path#initialize} for constructor definition - */ - fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'path', - - /** - * Array of path points - * @type Array - * @default - */ - path: null, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'), - - stateProperties: fabric.Object.prototype.stateProperties.concat('path'), - - /** - * Constructor - * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) - * @param {Object} [options] Options object - * @return {fabric.Path} thisArg - */ - initialize: function(path, options) { - options = options || { }; - this.callSuper('initialize', options); - if (!path) { - path = []; - } - - var fromArray = _toString.call(path) === '[object Array]'; - - this.path = fabric.util.makePathSimpler( - fromArray ? path : fabric.util.parsePath(path) - ); - - if (!this.path) { - return; - } - fabric.Polyline.prototype._setPositionDimensions.call(this, options); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _renderPathCommands: function(ctx) { - var current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - controlX = 0, // current control point x - controlY = 0, // current control point y - l = -this.pathOffset.x, - t = -this.pathOffset.y; - - ctx.beginPath(); - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - ctx.lineTo(x + l, y + t); - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - ctx.moveTo(x + l, y + t); - break; - - case 'C': // bezierCurveTo, absolute - x = current[5]; - y = current[6]; - controlX = current[3]; - controlY = current[4]; - ctx.bezierCurveTo( - current[1] + l, - current[2] + t, - controlX + l, - controlY + t, - x + l, - y + t - ); - break; - - case 'Q': // quadraticCurveTo, absolute - ctx.quadraticCurveTo( - current[1] + l, - current[2] + t, - current[3] + l, - current[4] + t - ); - x = current[3]; - y = current[4]; - controlX = current[1]; - controlY = current[2]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - ctx.closePath(); - break; - } - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _render: function(ctx) { - this._renderPathCommands(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns string representation of an instance - * @return {String} string representation of an instance - */ - toString: function() { - return '#'; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - path: this.path.map(function(item) { return item.slice(); }), - }); - }, - - /** - * Returns dataless object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var o = this.toObject(['sourcePath'].concat(propertiesToInclude)); - if (o.sourcePath) { - delete o.path; - } - return o; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var path = fabric.util.joinPath(this.path); - return [ - '\n' - ]; - }, - - _getOffsetTransform: function() { - var digits = fabric.Object.NUM_FRACTION_DIGITS; - return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' + - toFixed(-this.pathOffset.y, digits) + ')'; - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return '\t' + this._createBaseClipPathSVGMarkup( - this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform } - ); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }); - }, - /* _TO_SVG_END_ */ - - /** - * Returns number representation of an instance complexity - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.path.length; - }, - - /** - * @private - */ - _calcDimensions: function() { - - var aX = [], - aY = [], - current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - bounds; - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - bounds = []; - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - bounds = []; - break; - - case 'C': // bezierCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - x = current[5]; - y = current[6]; - break; - - case 'Q': // quadraticCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[1], - current[2], - current[3], - current[4] - ); - x = current[3]; - y = current[4]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - break; - } - bounds.forEach(function (point) { - aX.push(point.x); - aY.push(point.y); - }); - aX.push(x); - aY.push(y); - } - - var minX = min(aX) || 0, - minY = min(aY) || 0, - maxX = max(aX) || 0, - maxY = max(aY) || 0, - deltaX = maxX - minX, - deltaY = maxY - minY; - - return { - left: minX, - top: minY, - width: deltaX, - height: deltaY - }; - } - }); - - /** - * Creates an instance of fabric.Path from an object - * @static - * @memberOf fabric.Path - * @param {Object} object - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Path.fromObject = function(object, callback) { - if (typeof object.sourcePath === 'string') { - var pathUrl = object.sourcePath; - fabric.loadSVGFromURL(pathUrl, function (elements) { - var path = elements[0]; - path.setOptions(object); - callback && callback(path); - }); - } - else { - fabric.Object._fromObject('Path', object, callback, 'path'); - } - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`) - * @static - * @memberOf fabric.Path - * @see http://www.w3.org/TR/SVG/paths.html#PathElement - */ - fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']); - - /** - * Creates an instance of fabric.Path from an SVG element - * @static - * @memberOf fabric.Path - * @param {SVGElement} element to parse - * @param {Function} callback Callback to invoke when an fabric.Path instance is created - * @param {Object} [options] Options object - * @param {Function} [callback] Options callback invoked after parsing is finished - */ - fabric.Path.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max; - - if (fabric.Group) { - return; - } - - /** - * Group class - * @class fabric.Group - * @extends fabric.Object - * @mixes fabric.Collection - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.Group#initialize} for constructor definition - */ - fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'group', - - /** - * Width of stroke - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets - * @type Boolean - * @default - */ - subTargetCheck: false, - - /** - * Groups are container, do not render anything on theyr own, ence no cache properties - * @type Array - * @default - */ - cacheProperties: [], - - /** - * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still - * available setting this boolean to true. - * @type Boolean - * @since 2.0.0 - * @default - */ - useSetOnGroup: false, - - /** - * Constructor - * @param {Object} objects Group objects - * @param {Object} [options] Options object - * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already. - * @return {Object} thisArg - */ - initialize: function(objects, options, isAlreadyGrouped) { - options = options || {}; - this._objects = []; - // if objects enclosed in a group have been grouped already, - // we cannot change properties of objects. - // Thus we need to set options to group without objects, - isAlreadyGrouped && this.callSuper('initialize', options); - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (!isAlreadyGrouped) { - var center = options && options.centerPoint; - // we want to set origins before calculating the bounding box. - // so that the topleft can be set with that in mind. - // if specific top and left are passed, are overwritten later - // with the callSuper('initialize', options) - if (options.originX !== undefined) { - this.originX = options.originX; - } - if (options.originY !== undefined) { - this.originY = options.originY; - } - // if coming from svg i do not want to calc bounds. - // i assume width and height are passed along options - center || this._calcBounds(); - this._updateObjectsCoords(center); - delete options.centerPoint; - this.callSuper('initialize', options); - } - else { - this._updateObjectsACoords(); - } - - this.setCoords(); - }, - - /** - * @private - */ - _updateObjectsACoords: function() { - var skipControls = true; - for (var i = this._objects.length; i--; ){ - this._objects[i].setCoords(skipControls); - } - }, - - /** - * @private - * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change - */ - _updateObjectsCoords: function(center) { - var center = center || this.getCenterPoint(); - for (var i = this._objects.length; i--; ){ - this._updateObjectCoords(this._objects[i], center); - } - }, - - /** - * @private - * @param {Object} object - * @param {fabric.Point} center, current center of group. - */ - _updateObjectCoords: function(object, center) { - var objectLeft = object.left, - objectTop = object.top, - skipControls = true; - - object.set({ - left: objectLeft - center.x, - top: objectTop - center.y - }); - object.group = this; - object.setCoords(skipControls); - }, - - /** - * Returns string represenation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Adds an object to a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - addWithUpdate: function(object) { - var nested = !!this.group; - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - if (object) { - if (nested) { - // if this group is inside another group, we need to pre transform the object - fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix()); - } - this._objects.push(object); - object.group = this; - object._set('canvas', this.canvas); - } - this._calcBounds(); - this._updateObjectsCoords(); - this.dirty = true; - if (nested) { - this.group.addWithUpdate(); - } - else { - this.setCoords(); - } - return this; - }, - - /** - * Removes an object from a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - removeWithUpdate: function(object) { - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - - this.remove(object); - this._calcBounds(); - this._updateObjectsCoords(); - this.setCoords(); - this.dirty = true; - return this; - }, - - /** - * @private - */ - _onObjectAdded: function(object) { - this.dirty = true; - object.group = this; - object._set('canvas', this.canvas); - }, - - /** - * @private - */ - _onObjectRemoved: function(object) { - this.dirty = true; - delete object.group; - }, - - /** - * @private - */ - _set: function(key, value) { - var i = this._objects.length; - if (this.useSetOnGroup) { - while (i--) { - this._objects[i].setOnGroup(key, value); - } - } - if (key === 'canvas') { - while (i--) { - this._objects[i]._set(key, value); - } - } - fabric.Object.prototype._set.call(this, key, value); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - var _includeDefaultValues = this.includeDefaultValues; - var objsToObject = this._objects - .filter(function (obj) { - return !obj.excludeFromExport; - }) - .map(function (obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Returns object representation of an instance, in dataless mode. - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var objsToObject, sourcePath = this.sourcePath; - if (sourcePath) { - objsToObject = sourcePath; - } - else { - var _includeDefaultValues = this.includeDefaultValues; - objsToObject = this._objects.map(function(obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toDatalessObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - } - var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Renders instance on a given context - * @param {CanvasRenderingContext2D} ctx context to render instance on - */ - render: function(ctx) { - this._transformDone = true; - this.callSuper('render', ctx); - this._transformDone = false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group is already cached. - * @return {Boolean} - */ - shouldCache: function() { - var ownCache = fabric.Object.prototype.shouldCache.call(this); - if (ownCache) { - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - this.ownCaching = false; - return false; - } - } - } - return ownCache; - }, - - /** - * Check if this object or a child object will cast a shadow - * @return {Boolean} - */ - willDrawShadow: function() { - if (fabric.Object.prototype.willDrawShadow.call(this)) { - return true; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - return true; - } - } - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return this.ownCaching || (this.group && this.group.isOnACache()); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx) { - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i].render(ctx); - } - this._drawClipPath(ctx); - }, - - /** - * Check if cache is dirty - */ - isCacheDirty: function(skipCanvas) { - if (this.callSuper('isCacheDirty', skipCanvas)) { - return true; - } - if (!this.statefullCache) { - return false; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].isCacheDirty(true)) { - if (this._cacheCanvas) { - // if this group has not a cache canvas there is nothing to clean - var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-x / 2, -y / 2, x, y); - } - return true; - } - } - return false; - }, - - /** - * Restores original state of each of group objects (original state is that which was before group was created). - * if the nested boolean is true, the original state will be restored just for the - * first group and not for all the group chain - * @private - * @param {Boolean} nested tell the function to restore object state up to the parent group and not more - * @return {fabric.Group} thisArg - * @chainable - */ - _restoreObjectsState: function() { - var groupMatrix = this.calcOwnMatrix(); - this._objects.forEach(function(object) { - // instead of using _this = this; - fabric.util.addTransformToObject(object, groupMatrix); - delete object.group; - object.setCoords(); - }); - return this; - }, - - /** - * Realises the transform from this group onto the supplied object - * i.e. it tells you what would happen if the supplied object was in - * the group, and then the group was destroyed. It mutates the supplied - * object. - * Warning: this method is not useful anymore, it has been kept to no break the api. - * is not used in the fabricJS codebase - * this method will be reduced to using the utility. - * @private - * @deprecated - * @param {fabric.Object} object - * @param {Array} parentMatrix parent transformation - * @return {fabric.Object} transformedObject - */ - realizeTransform: function(object, parentMatrix) { - fabric.util.addTransformToObject(object, parentMatrix); - return object; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - destroy: function() { - // when group is destroyed objects needs to get a repaint to be eventually - // displayed on canvas. - this._objects.forEach(function(object) { - object.set('dirty', true); - }); - return this._restoreObjectsState(); - }, - - /** - * make a group an active selection, remove the group from canvas - * the group has to be on canvas for this to work. - * @return {fabric.ActiveSelection} thisArg - * @chainable - */ - toActiveSelection: function() { - if (!this.canvas) { - return; - } - var objects = this._objects, canvas = this.canvas; - this._objects = []; - var options = this.toObject(); - delete options.objects; - var activeSelection = new fabric.ActiveSelection([]); - activeSelection.set(options); - activeSelection.type = 'activeSelection'; - canvas.remove(this); - objects.forEach(function(object) { - object.group = activeSelection; - object.dirty = true; - canvas.add(object); - }); - activeSelection.canvas = canvas; - activeSelection._objects = objects; - canvas._activeObject = activeSelection; - activeSelection.setCoords(); - return activeSelection; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - ungroupOnCanvas: function() { - return this._restoreObjectsState(); - }, - - /** - * Sets coordinates of all objects inside group - * @return {fabric.Group} thisArg - * @chainable - */ - setObjectsCoords: function() { - var skipControls = true; - this.forEachObject(function(object) { - object.setCoords(skipControls); - }); - return this; - }, - - /** - * @private - */ - _calcBounds: function(onlyWidthHeight) { - var aX = [], - aY = [], - o, prop, coords, - props = ['tr', 'br', 'bl', 'tl'], - i = 0, iLen = this._objects.length, - j, jLen = props.length; - - for ( ; i < iLen; ++i) { - o = this._objects[i]; - coords = o.calcACoords(); - for (j = 0; j < jLen; j++) { - prop = props[j]; - aX.push(coords[prop].x); - aY.push(coords[prop].y); - } - o.aCoords = coords; - } - - this._getBounds(aX, aY, onlyWidthHeight); - }, - - /** - * @private - */ - _getBounds: function(aX, aY, onlyWidthHeight) { - var minXY = new fabric.Point(min(aX), min(aY)), - maxXY = new fabric.Point(max(aX), max(aY)), - top = minXY.y || 0, left = minXY.x || 0, - width = (maxXY.x - minXY.x) || 0, - height = (maxXY.y - minXY.y) || 0; - this.width = width; - this.height = height; - if (!onlyWidthHeight) { - // the bounding box always finds the topleft most corner. - // whatever is the group origin, we set up here the left/top position. - this.setPositionByOrigin({ x: left, y: top }, 'left', 'top'); - } - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function(reviver) { - var svgString = ['\n']; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t\t', this._objects[i].toSVG(reviver)); - } - svgString.push('\n'); - return svgString; - }, - - /** - * Returns styles-string for svg-export, specific version for group - * @return {String} - */ - getSvgStyles: function() { - var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? - 'opacity: ' + this.opacity + ';' : '', - visibility = this.visible ? '' : ' visibility: hidden;'; - return [ - opacity, - this.getSvgFilter(), - visibility - ].join(''); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var svgString = []; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t', this._objects[i].toClipPathSVG(reviver)); - } - - return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver }); - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Group} instance from an object representation - * @static - * @memberOf fabric.Group - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an group instance is created - */ - fabric.Group.fromObject = function(object, callback) { - var objects = object.objects, - options = fabric.util.object.clone(object, true); - delete options.objects; - if (typeof objects === 'string') { - // it has to be an url or something went wrong. - fabric.loadSVGFromURL(objects, function (elements) { - var group = fabric.util.groupSVGElements(elements, object, objects); - group.set(options); - callback && callback(group); - }); - return; - } - fabric.util.enlivenObjects(objects, function(enlivenedObjects) { - fabric.util.enlivenObjects([object.clipPath], function(enlivedClipPath) { - var options = fabric.util.object.clone(object, true); - options.clipPath = enlivedClipPath[0]; - delete options.objects; - callback && callback(new fabric.Group(enlivenedObjects, options, true)); - }); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.ActiveSelection) { - return; - } - - /** - * Group class - * @class fabric.ActiveSelection - * @extends fabric.Group - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.ActiveSelection#initialize} for constructor definition - */ - fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'activeSelection', - - /** - * Constructor - * @param {Object} objects ActiveSelection objects - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(objects, options) { - options = options || {}; - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (options.originX) { - this.originX = options.originX; - } - if (options.originY) { - this.originY = options.originY; - } - this._calcBounds(); - this._updateObjectsCoords(); - fabric.Object.prototype.initialize.call(this, options); - this.setCoords(); - }, - - /** - * Change te activeSelection to a normal group, - * High level function that automatically adds it to canvas as - * active object. no events fired. - * @since 2.0.0 - * @return {fabric.Group} - */ - toGroup: function() { - var objects = this._objects.concat(); - this._objects = []; - var options = fabric.Object.prototype.toObject.call(this); - var newGroup = new fabric.Group([]); - delete options.type; - newGroup.set(options); - objects.forEach(function(object) { - object.canvas.remove(object); - object.group = newGroup; - }); - newGroup._objects = objects; - if (!this.canvas) { - return newGroup; - } - var canvas = this.canvas; - canvas.add(newGroup); - canvas._activeObject = newGroup; - newGroup.setCoords(); - return newGroup; - }, - - /** - * If returns true, deselection is cancelled. - * @since 2.0.0 - * @return {Boolean} [cancel] - */ - onDeselect: function() { - this.destroy(); - return false; - }, - - /** - * Returns string representation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * @return {Boolean} - */ - shouldCache: function() { - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return false; - }, - - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - * @param {Object} [childrenOverride] properties to override the children overrides - */ - _renderControls: function(ctx, styleOverride, childrenOverride) { - ctx.save(); - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - this.callSuper('_renderControls', ctx, styleOverride); - childrenOverride = childrenOverride || { }; - if (typeof childrenOverride.hasControls === 'undefined') { - childrenOverride.hasControls = false; - } - childrenOverride.forActiveSelection = true; - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i]._renderControls(ctx, childrenOverride); - } - ctx.restore(); - }, - }); - - /** - * Returns {@link fabric.ActiveSelection} instance from an object representation - * @static - * @memberOf fabric.ActiveSelection - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created - */ - fabric.ActiveSelection.fromObject = function(object, callback) { - fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { - delete object.objects; - callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var extend = fabric.util.object.extend; - - if (!global.fabric) { - global.fabric = { }; - } - - if (global.fabric.Image) { - fabric.warn('fabric.Image is already defined.'); - return; - } - - /** - * Image class - * @class fabric.Image - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} - * @see {@link fabric.Image#initialize} for constructor definition - */ - fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'image', - - /** - * Width of a stroke. - * For image quality a stroke multiple of 2 gives better results. - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`. - * This allows for relative urls as image src. - * @since 2.7.0 - * @type Boolean - * @default - */ - srcFromAttribute: false, - - /** - * private - * contains last value of scaleX to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleX: 1, - - /** - * private - * contains last value of scaleY to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleY: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingX: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingY: 1, - - /** - * minimum scale factor under which any resizeFilter is triggered to resize the image - * 0 will disable the automatic resize. 1 will trigger automatically always. - * number bigger than 1 are not implemented yet. - * @type Number - */ - minimumScaleTrigger: 0.5, - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'), - - /** - * key used to retrieve the texture representing this image - * @since 2.0.0 - * @type String - * @default - */ - cacheKey: '', - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropX: 0, - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropY: 0, - - /** - * Indicates whether this canvas will use image smoothing when painting this image. - * Also influence if the cacheCanvas for this image uses imageSmoothing - * @since 4.0.0-beta.11 - * @type Boolean - * @default - */ - imageSmoothing: true, - - /** - * Constructor - * Image can be initialized with any canvas drawable or a string. - * The string should be a url and will be loaded as an image. - * Canvas and Image element work out of the box, while videos require extra code to work. - * Please check video element events for seeking. - * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element - * @param {Object} [options] Options object - * @param {function} [callback] callback function to call after eventual filters applied. - * @return {fabric.Image} thisArg - */ - initialize: function(element, options) { - options || (options = { }); - this.filters = []; - this.cacheKey = 'texture' + fabric.Object.__uid++; - this.callSuper('initialize', options); - this._initElement(element, options); - }, - - /** - * Returns image element which this instance if based on - * @return {HTMLImageElement} Image element - */ - getElement: function() { - return this._element || {}; - }, - - /** - * Sets image element for this instance to a specified one. - * If filters defined they are applied to new image. - * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. - * @param {HTMLImageElement} element - * @param {Object} [options] Options object - * @return {fabric.Image} thisArg - * @chainable - */ - setElement: function(element, options) { - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._element = element; - this._originalElement = element; - this._initConfig(options); - if (this.filters.length !== 0) { - this.applyFilters(); - } - // resizeFilters work on the already filtered copy. - // we need to apply resizeFilters AFTER normal filters. - // applyResizeFilters is run more often than normal filters - // and is triggered by user interactions rather than dev code - if (this.resizeFilter) { - this.applyResizeFilters(); - } - return this; - }, - - /** - * Delete a single texture if in webgl mode - */ - removeTexture: function(key) { - var backend = fabric.filterBackend; - if (backend && backend.evictCachesForKey) { - backend.evictCachesForKey(key); - } - }, - - /** - * Delete textures, reference to elements and eventually JSDOM cleanup - */ - dispose: function() { - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._cacheContext = undefined; - ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - }, - - /** - * Get the crossOrigin value (of the corresponding image element) - */ - getCrossOrigin: function() { - return this._originalElement && (this._originalElement.crossOrigin || null); - }, - - /** - * Returns original size of an image - * @return {Object} Object with "width" and "height" properties - */ - getOriginalSize: function() { - var element = this.getElement(); - return { - width: element.naturalWidth || element.width, - height: element.naturalHeight || element.height - }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _stroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - var w = this.width / 2, h = this.height / 2; - ctx.beginPath(); - ctx.moveTo(-w, -h); - ctx.lineTo(w, -h); - ctx.lineTo(w, h); - ctx.lineTo(-w, h); - ctx.lineTo(-w, -h); - ctx.closePath(); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var filters = []; - - this.filters.forEach(function(filterObj) { - if (filterObj) { - filters.push(filterObj.toObject()); - } - }); - var object = extend( - this.callSuper( - 'toObject', - ['cropX', 'cropY'].concat(propertiesToInclude) - ), { - src: this.getSrc(), - crossOrigin: this.getCrossOrigin(), - filters: filters, - }); - if (this.resizeFilter) { - object.resizeFilter = this.resizeFilter.toObject(); - } - return object; - }, - - /** - * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height. - * @return {Boolean} - */ - hasCrop: function() { - return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString = [], imageMarkup = [], strokeSvg, element = this._element, - x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = ''; - if (!element) { - return []; - } - if (this.hasCrop()) { - var clipPathId = fabric.Object.__uid++; - svgString.push( - '\n', - '\t\n', - '\n' - ); - clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" '; - } - if (!this.imageSmoothing) { - imageRendering = '" image-rendering="optimizeSpeed'; - } - imageMarkup.push('\t\n'); - - if (this.stroke || this.strokeDashArray) { - var origFill = this.fill; - this.fill = null; - strokeSvg = [ - '\t\n' - ]; - this.fill = origFill; - } - if (this.paintFirst !== 'fill') { - svgString = svgString.concat(strokeSvg, imageMarkup); - } - else { - svgString = svgString.concat(imageMarkup, strokeSvg); - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * Returns source of an image - * @param {Boolean} filtered indicates if the src is needed for svg - * @return {String} Source of an image - */ - getSrc: function(filtered) { - var element = filtered ? this._element : this._originalElement; - if (element) { - if (element.toDataURL) { - return element.toDataURL(); - } - - if (this.srcFromAttribute) { - return element.getAttribute('src'); - } - else { - return element.src; - } - } - else { - return this.src || ''; - } - }, - - /** - * Sets source of an image - * @param {String} src Source string (URL) - * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) - * @param {Object} [options] Options object - * @param {String} [options.crossOrigin] crossOrigin value (one of "", "anonymous", "use-credentials") - * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes - * @return {fabric.Image} thisArg - * @chainable - */ - setSrc: function(src, callback, options) { - fabric.util.loadImage(src, function(img, isError) { - this.setElement(img, options); - this._setWidthHeight(); - callback && callback(this, isError); - }, this, options && options.crossOrigin); - return this; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of an instance - */ - toString: function() { - return '#'; - }, - - applyResizeFilters: function() { - var filter = this.resizeFilter, - minimumScale = this.minimumScaleTrigger, - objectScale = this.getTotalObjectScaling(), - scaleX = objectScale.scaleX, - scaleY = objectScale.scaleY, - elementToFilter = this._filteredEl || this._originalElement; - if (this.group) { - this.set('dirty', true); - } - if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) { - this._element = elementToFilter; - this._filterScalingX = 1; - this._filterScalingY = 1; - this._lastScaleX = scaleX; - this._lastScaleY = scaleY; - return; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - var canvasEl = fabric.util.createCanvasElement(), - cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey, - sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height; - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._lastScaleX = filter.scaleX = scaleX; - this._lastScaleY = filter.scaleY = scaleY; - fabric.filterBackend.applyFilters( - [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey); - this._filterScalingX = canvasEl.width / this._originalElement.width; - this._filterScalingY = canvasEl.height / this._originalElement.height; - }, - - /** - * Applies filters assigned to this image (from "filters" array) or from filter param - * @method applyFilters - * @param {Array} filters to be applied - * @param {Boolean} forResizing specify if the filter operation is a resize operation - * @return {thisArg} return the fabric.Image object - * @chainable - */ - applyFilters: function(filters) { - - filters = filters || this.filters || []; - filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); }); - this.set('dirty', true); - - // needs to clear out or WEBGL will not resize correctly - this.removeTexture(this.cacheKey + '_filtered'); - - if (filters.length === 0) { - this._element = this._originalElement; - this._filteredEl = null; - this._filterScalingX = 1; - this._filterScalingY = 1; - return this; - } - - var imgElement = this._originalElement, - sourceWidth = imgElement.naturalWidth || imgElement.width, - sourceHeight = imgElement.naturalHeight || imgElement.height; - - if (this._element === this._originalElement) { - // if the element is the same we need to create a new element - var canvasEl = fabric.util.createCanvasElement(); - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._filteredEl = canvasEl; - } - else { - // clear the existing element to get new filter data - // also dereference the eventual resized _element - this._element = this._filteredEl; - this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight); - // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y - this._lastScaleX = 1; - this._lastScaleY = 1; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - fabric.filterBackend.applyFilters( - filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey); - if (this._originalElement.width !== this._element.width || - this._originalElement.height !== this._element.height) { - this._filterScalingX = this._element.width / this._originalElement.width; - this._filterScalingY = this._element.height / this._originalElement.height; - } - return this; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - if (this.isMoving !== true && this.resizeFilter && this._needsResize()) { - this.applyResizeFilters(); - } - this._stroke(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Paint the cached copy of the object on the target context. - * it will set the imageSmoothing for the draw operation - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx); - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * This is the special image version where we would like to avoid caching where possible. - * Essentially images do not benefit from caching. They may require caching, and in that - * case we do it. Also caching an image usually ends in a loss of details. - * A full performance audit should be done. - * @return {Boolean} - */ - shouldCache: function() { - return this.needsItsOwnCache(); - }, - - _renderFill: function(ctx) { - var elementToDraw = this._element; - if (!elementToDraw) { - return; - } - var scaleX = this._filterScalingX, scaleY = this._filterScalingY, - w = this.width, h = this.height, min = Math.min, max = Math.max, - // crop values cannot be lesser than 0. - cropX = max(this.cropX, 0), cropY = max(this.cropY, 0), - elWidth = elementToDraw.naturalWidth || elementToDraw.width, - elHeight = elementToDraw.naturalHeight || elementToDraw.height, - sX = cropX * scaleX, - sY = cropY * scaleY, - // the width height cannot exceed element width/height, starting from the crop offset. - sW = min(w * scaleX, elWidth - sX), - sH = min(h * scaleY, elHeight - sY), - x = -w / 2, y = -h / 2, - maxDestW = min(w, elWidth / scaleX - cropX), - maxDestH = min(h, elHeight / scaleY - cropY); - - elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH); - }, - - /** - * needed to check if image needs resize - * @private - */ - _needsResize: function() { - var scale = this.getTotalObjectScaling(); - return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY); - }, - - /** - * @private - */ - _resetWidthHeight: function() { - this.set(this.getOriginalSize()); - }, - - /** - * The Image class's initialization method. This method is automatically - * called by the constructor. - * @private - * @param {HTMLImageElement|String} element The element representing the image - * @param {Object} [options] Options object - */ - _initElement: function(element, options) { - this.setElement(fabric.util.getById(element), options); - fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS); - }, - - /** - * @private - * @param {Object} [options] Options object - */ - _initConfig: function(options) { - options || (options = { }); - this.setOptions(options); - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Array} filters to be initialized - * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created - */ - _initFilters: function(filters, callback) { - if (filters && filters.length) { - fabric.util.enlivenObjects(filters, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, 'fabric.Image.filters'); - } - else { - callback && callback(); - } - }, - - /** - * @private - * Set the width and the height of the image object, using the element or the - * options. - * @param {Object} [options] Object with width/height properties - */ - _setWidthHeight: function(options) { - options || (options = { }); - var el = this.getElement(); - this.width = options.width || el.naturalWidth || el.width || 0; - this.height = options.height || el.naturalHeight || el.height || 0; - }, - - /** - * Calculate offset for center and scale factor for the image in order to respect - * the preserveAspectRatio attribute - * @private - * @return {Object} - */ - parsePreserveAspectRatioAttribute: function() { - var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''), - rWidth = this._element.width, rHeight = this._element.height, - scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0, - offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight }; - if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) { - if (pAR.meetOrSlice === 'meet') { - scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes); - offset = (pWidth - rWidth * scaleX) / 2; - if (pAR.alignX === 'Min') { - offsetLeft = -offset; - } - if (pAR.alignX === 'Max') { - offsetLeft = offset; - } - offset = (pHeight - rHeight * scaleY) / 2; - if (pAR.alignY === 'Min') { - offsetTop = -offset; - } - if (pAR.alignY === 'Max') { - offsetTop = offset; - } - } - if (pAR.meetOrSlice === 'slice') { - scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes); - offset = rWidth - pWidth / scaleX; - if (pAR.alignX === 'Mid') { - cropX = offset / 2; - } - if (pAR.alignX === 'Max') { - cropX = offset; - } - offset = rHeight - pHeight / scaleY; - if (pAR.alignY === 'Mid') { - cropY = offset / 2; - } - if (pAR.alignY === 'Max') { - cropY = offset; - } - rWidth = pWidth / scaleX; - rHeight = pHeight / scaleY; - } - } - else { - scaleX = pWidth / rWidth; - scaleY = pHeight / rHeight; - } - return { - width: rWidth, - height: rHeight, - scaleX: scaleX, - scaleY: scaleY, - offsetLeft: offsetLeft, - offsetTop: offsetTop, - cropX: cropX, - cropY: cropY - }; - } - }); - - /** - * Default CSS class name for canvas - * @static - * @type String - * @default - */ - fabric.Image.CSS_CANVAS = 'canvas-img'; - - /** - * Alias for getSrc - * @static - */ - fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc; - - /** - * Creates an instance of fabric.Image from its object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} callback Callback to invoke when an image instance is created - */ - fabric.Image.fromObject = function(_object, callback) { - var object = fabric.util.object.clone(_object); - fabric.util.loadImage(object.src, function(img, isError) { - if (isError) { - callback && callback(null, true); - return; - } - fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) { - object.filters = filters || []; - fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) { - object.resizeFilter = resizeFilters[0]; - fabric.util.enlivenObjects([object.clipPath], function(enlivedProps) { - object.clipPath = enlivedProps[0]; - var image = new fabric.Image(img, object); - callback(image, false); - }); - }); - }); - }, null, object.crossOrigin); - }; - - /** - * Creates an instance of fabric.Image from an URL string - * @static - * @param {String} url URL to create an image from - * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not. - * @param {Object} [imgOptions] Options object - */ - fabric.Image.fromURL = function(url, callback, imgOptions) { - fabric.util.loadImage(url, function(img, isError) { - callback && callback(new fabric.Image(img, imgOptions), isError); - }, null, imgOptions && imgOptions.crossOrigin); - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement}) - * @static - * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} - */ - fabric.Image.ATTRIBUTE_NAMES = - fabric.SHARED_ATTRIBUTES.concat( - 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ') - ); - - /** - * Returns {@link fabric.Image} instance from an SVG element - * @static - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} callback Callback to execute when fabric.Image object is created - * @return {fabric.Image} Instance of fabric.Image - */ - fabric.Image.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); - fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, - extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * @private - * @return {Number} angle value - */ - _getAngleValueForStraighten: function() { - var angle = this.angle % 360; - if (angle > 0) { - return Math.round((angle - 1) / 90) * 90; - } - return Math.round(angle / 90) * 90; - }, - - /** - * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer) - * @return {fabric.Object} thisArg - * @chainable - */ - straighten: function() { - this.rotate(this._getAngleValueForStraighten()); - return this; - }, - - /** - * Same as {@link fabric.Object.prototype.straighten} but with animation - * @param {Object} callbacks Object with callback functions - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Object} thisArg - * @chainable - */ - fxStraighten: function(callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - fabric.util.animate({ - startValue: this.get('angle'), - endValue: this._getAngleValueForStraighten(), - duration: this.FX_DURATION, - onChange: function(value) { - _this.rotate(value); - onChange(); - }, - onComplete: function() { - _this.setCoords(); - onComplete(); - }, - }); - - return this; - } -}); - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Straightens object, then rerenders canvas - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - * @chainable - */ - straightenObject: function (object) { - object.straighten(); - this.requestRenderAll(); - return this; - }, - - /** - * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - * @chainable - */ - fxStraightenObject: function (object) { - object.fxStraighten({ - onChange: this.requestRenderAllBound - }); - return this; - } -}); - - -(function() { - - 'use strict'; - - /** - * Tests if webgl supports certain precision - * @param {WebGL} Canvas WebGL context to test on - * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp' - * @returns {Boolean} Whether the user's browser WebGL supports given precision. - */ - function testPrecision(gl, precision){ - var fragmentSource = 'precision ' + precision + ' float;\nvoid main(){}'; - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - return false; - } - return true; - } - - /** - * Indicate whether this filtering backend is supported by the user's browser. - * @param {Number} tileSize check if the tileSize is supported - * @returns {Boolean} Whether the user's browser supports WebGL. - */ - fabric.isWebglSupported = function(tileSize) { - if (fabric.isLikelyNode) { - return false; - } - tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize; - var canvas = document.createElement('canvas'); - var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); - var isSupported = false; - // eslint-disable-next-line - if (gl) { - fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - isSupported = fabric.maxTextureSize >= tileSize; - var precisions = ['highp', 'mediump', 'lowp']; - for (var i = 0; i < 3; i++){ - if (testPrecision(gl, precisions[i])){ - fabric.webGlPrecision = precisions[i]; - break; - }; - } - } - this.isSupported = isSupported; - return isSupported; - }; - - fabric.WebglFilterBackend = WebglFilterBackend; - - /** - * WebGL filter backend. - */ - function WebglFilterBackend(options) { - if (options && options.tileSize) { - this.tileSize = options.tileSize; - } - this.setupGLContext(this.tileSize, this.tileSize); - this.captureGPUInfo(); - }; - - WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ { - - tileSize: 2048, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Setup a WebGL context suitable for filtering, and bind any needed event handlers. - */ - setupGLContext: function(width, height) { - this.dispose(); - this.createWebGLCanvas(width, height); - // eslint-disable-next-line - this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]); - this.chooseFastestCopyGLTo2DMethod(width, height); - }, - - /** - * Pick a method to copy data from GL context to 2d canvas. In some browsers using - * putImageData is faster than drawImage for that specific operation. - */ - chooseFastestCopyGLTo2DMethod: function(width, height) { - var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData; - try { - new ImageData(1, 1); - canUseImageData = true; - } - catch (e) { - canUseImageData = false; - } - // eslint-disable-next-line no-undef - var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined'; - // eslint-disable-next-line no-undef - var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined'; - - if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { - return; - } - - var targetCanvas = fabric.util.createCanvasElement(); - // eslint-disable-next-line no-undef - var imageBuffer = new ArrayBuffer(width * height * 4); - if (fabric.forceGLPutImageData) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - return; - } - var testContext = { - imageBuffer: imageBuffer, - destinationWidth: width, - destinationHeight: height, - targetCanvas: targetCanvas - }; - var startTime, drawImageTime, putImageDataTime; - targetCanvas.width = width; - targetCanvas.height = height; - - startTime = window.performance.now(); - copyGLTo2DDrawImage.call(testContext, this.gl, testContext); - drawImageTime = window.performance.now() - startTime; - - startTime = window.performance.now(); - copyGLTo2DPutImageData.call(testContext, this.gl, testContext); - putImageDataTime = window.performance.now() - startTime; - - if (drawImageTime > putImageDataTime) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - } - else { - this.copyGLTo2D = copyGLTo2DDrawImage; - } - }, - - /** - * Create a canvas element and associated WebGL context and attaches them as - * class properties to the GLFilterBackend class. - */ - createWebGLCanvas: function(width, height) { - var canvas = fabric.util.createCanvasElement(); - canvas.width = width; - canvas.height = height; - var glOptions = { - alpha: true, - premultipliedAlpha: false, - depth: false, - stencil: false, - antialias: false - }, - gl = canvas.getContext('webgl', glOptions); - if (!gl) { - gl = canvas.getContext('experimental-webgl', glOptions); - } - if (!gl) { - return; - } - gl.clearColor(0, 0, 0, 0); - // this canvas can fire webglcontextlost and webglcontextrestored - this.canvas = canvas; - this.gl = gl; - }, - - /** - * Attempts to apply the requested filters to the source provided, drawing the filtered output - * to the provided target canvas. - * - * @param {Array} filters The filters to apply. - * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered. - * @param {Number} width The width of the source input. - * @param {Number} height The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - * @param {String|undefined} cacheKey A key used to cache resources related to the source. If - * omitted, caching will be skipped. - */ - applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) { - var gl = this.gl; - var cachedTexture; - if (cacheKey) { - cachedTexture = this.getCachedTexture(cacheKey, source); - } - var pipelineState = { - originalWidth: source.width || source.originalWidth, - originalHeight: source.height || source.originalHeight, - sourceWidth: width, - sourceHeight: height, - destinationWidth: width, - destinationHeight: height, - context: gl, - sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source), - targetTexture: this.createTexture(gl, width, height), - originalTexture: cachedTexture || - this.createTexture(gl, width, height, !cachedTexture && source), - passes: filters.length, - webgl: true, - aPosition: this.aPosition, - programCache: this.programCache, - pass: 0, - filterBackend: this, - targetCanvas: targetCanvas - }; - var tempFbo = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); - filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); - resizeCanvasIfNeeded(pipelineState); - this.copyGLTo2D(gl, pipelineState); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.deleteTexture(pipelineState.sourceTexture); - gl.deleteTexture(pipelineState.targetTexture); - gl.deleteFramebuffer(tempFbo); - targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); - return pipelineState; - }, - - /** - * Detach event listeners, remove references, and clean up caches. - */ - dispose: function() { - if (this.canvas) { - this.canvas = null; - this.gl = null; - } - this.clearWebGLCaches(); - }, - - /** - * Wipe out WebGL-related caches. - */ - clearWebGLCaches: function() { - this.programCache = {}; - this.textureCache = {}; - }, - - /** - * Create a WebGL texture object. - * - * Accepts specific dimensions to initialize the texture to or a source image. - * - * @param {WebGLRenderingContext} gl The GL context to use for creating the texture. - * @param {Number} width The width to initialize the texture at. - * @param {Number} height The height to initialize the texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data. - * @returns {WebGLTexture} - */ - createTexture: function(gl, width, height, textureImageSource) { - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (textureImageSource) { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource); - } - else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - return texture; - }, - - /** - * Can be optionally used to get a texture from the cache array - * - * If an existing texture is not found, a new texture is created and cached. - * - * @param {String} uniqueId A cache key to use to find an existing texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the - * texture cache entry if one does not already exist. - */ - getCachedTexture: function(uniqueId, textureImageSource) { - if (this.textureCache[uniqueId]) { - return this.textureCache[uniqueId]; - } - else { - var texture = this.createTexture( - this.gl, textureImageSource.width, textureImageSource.height, textureImageSource); - this.textureCache[uniqueId] = texture; - return texture; - } - }, - - /** - * Clear out cached resources related to a source image that has been - * filtered previously. - * - * @param {String} cacheKey The cache key provided when the source image was filtered. - */ - evictCachesForKey: function(cacheKey) { - if (this.textureCache[cacheKey]) { - this.gl.deleteTexture(this.textureCache[cacheKey]); - delete this.textureCache[cacheKey]; - } - }, - - copyGLTo2D: copyGLTo2DDrawImage, - - /** - * Attempt to extract GPU information strings from a WebGL context. - * - * Useful information when debugging or blacklisting specific GPUs. - * - * @returns {Object} A GPU info object with renderer and vendor strings. - */ - captureGPUInfo: function() { - if (this.gpuInfo) { - return this.gpuInfo; - } - var gl = this.gl, gpuInfo = { renderer: '', vendor: '' }; - if (!gl) { - return gpuInfo; - } - var ext = gl.getExtension('WEBGL_debug_renderer_info'); - if (ext) { - var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); - var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); - if (renderer) { - gpuInfo.renderer = renderer.toLowerCase(); - } - if (vendor) { - gpuInfo.vendor = vendor.toLowerCase(); - } - } - this.gpuInfo = gpuInfo; - return gpuInfo; - }, - }; -})(); - -function resizeCanvasIfNeeded(pipelineState) { - var targetCanvas = pipelineState.targetCanvas, - width = targetCanvas.width, height = targetCanvas.height, - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight; - - if (width !== dWidth || height !== dHeight) { - targetCanvas.width = dWidth; - targetCanvas.height = dHeight; - } -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas. - * - * The WebGL canvas is assumed to be upside down, with the top-left pixel of the - * desired output image appearing in the bottom-left corner of the WebGL canvas. - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DDrawImage(gl, pipelineState) { - var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas, - ctx = targetCanvas.getContext('2d'); - ctx.translate(0, targetCanvas.height); // move it down again - ctx.scale(1, -1); // vertical flip - // where is my image on the big glcanvas? - var sourceY = glCanvas.height - targetCanvas.height; - ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, - targetCanvas.width, targetCanvas.height); -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData - * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra). - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DPutImageData(gl, pipelineState) { - var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'), - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight, - numBytes = dWidth * dHeight * 4; - - // eslint-disable-next-line no-undef - var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); - // eslint-disable-next-line no-undef - var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); - - gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8); - var imgData = new ImageData(u8Clamped, dWidth, dHeight); - ctx.putImageData(imgData, 0, 0); -} - - -(function() { - - 'use strict'; - - var noop = function() {}; - - fabric.Canvas2dFilterBackend = Canvas2dFilterBackend; - - /** - * Canvas 2D filter backend. - */ - function Canvas2dFilterBackend() {}; - - Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ { - evictCachesForKey: noop, - dispose: noop, - clearWebGLCaches: noop, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Apply a set of filters against a source image and draw the filtered output - * to the provided destination canvas. - * - * @param {EnhancedFilter} filters The filter to apply. - * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered. - * @param {Number} sourceWidth The width of the source input. - * @param {Number} sourceHeight The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - */ - applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) { - var ctx = targetCanvas.getContext('2d'); - ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight); - var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var pipelineState = { - sourceWidth: sourceWidth, - sourceHeight: sourceHeight, - imageData: imageData, - originalEl: sourceElement, - originalImageData: originalImageData, - canvasEl: targetCanvas, - ctx: ctx, - filterBackend: this, - }; - filters.forEach(function(filter) { filter.applyTo(pipelineState); }); - if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) { - targetCanvas.width = pipelineState.imageData.width; - targetCanvas.height = pipelineState.imageData.height; - } - ctx.putImageData(pipelineState.imageData, 0, 0); - return pipelineState; - }, - - }; -})(); - - -/** - * @namespace fabric.Image.filters - * @memberOf fabric.Image - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters} - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - */ -fabric.Image = fabric.Image || { }; -fabric.Image.filters = fabric.Image.filters || { }; - -/** - * Root filter class from which all filter classes inherit from - * @class fabric.Image.filters.BaseFilter - * @memberOf fabric.Image.filters - */ -fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'BaseFilter', - - /** - * Array of attributes to send with buffers. do not modify - * @private - */ - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - fragmentSource: 'precision highp float;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform sampler2D uTexture;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - '}', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Sets filter's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } - }, - - /** - * Compile this filter's shader program. - * - * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation. - * @param {String} fragmentSource fragmentShader source for compilation - * @param {String} vertexSource vertexShader source for compilation - */ - createProgram: function(gl, fragmentSource, vertexSource) { - fragmentSource = fragmentSource || this.fragmentSource; - vertexSource = vertexSource || this.vertexSource; - if (fabric.webGlPrecision !== 'highp'){ - fragmentSource = fragmentSource.replace( - /precision highp float/g, - 'precision ' + fabric.webGlPrecision + ' float' - ); - } - var vertexShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Vertex shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(vertexShader) - ); - } - - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Fragment shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(fragmentShader) - ); - } - - var program = gl.createProgram(); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Shader link error for "${this.type}" ' + - gl.getProgramInfoLog(program) - ); - } - - var attributeLocations = this.getAttributeLocations(gl, program); - var uniformLocations = this.getUniformLocations(gl, program) || { }; - uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW'); - uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH'); - return { - program: program, - attributeLocations: attributeLocations, - uniformLocations: uniformLocations - }; - }, - - /** - * Return a map of attribute names to WebGLAttributeLocation objects. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take attribute locations. - * @returns {Object} A map of attribute names to attribute locations. - */ - getAttributeLocations: function(gl, program) { - return { - aPosition: gl.getAttribLocation(program, 'aPosition'), - }; - }, - - /** - * Return a map of uniform names to WebGLUniformLocation objects. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take uniform locations. - * @returns {Object} A map of uniform names to uniform locations. - */ - getUniformLocations: function (/* gl, program */) { - // in case i do not need any special uniform i need to return an empty object - return { }; - }, - - /** - * Send attribute data from this filter to its shader program on the GPU. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} attributeLocations A map of shader attribute names to their locations. - */ - sendAttributeData: function(gl, attributeLocations, aPositionData) { - var attributeLocation = attributeLocations.aPosition; - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.enableVertexAttribArray(attributeLocation); - gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0); - gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW); - }, - - _setupFrameBuffer: function(options) { - var gl = options.context, width, height; - if (options.passes > 1) { - width = options.destinationWidth; - height = options.destinationHeight; - if (options.sourceWidth !== width || options.sourceHeight !== height) { - gl.deleteTexture(options.targetTexture); - options.targetTexture = options.filterBackend.createTexture(gl, width, height); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, - options.targetTexture, 0); - } - else { - // draw last filter on canvas and not to framebuffer. - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.finish(); - } - }, - - _swapTextures: function(options) { - options.passes--; - options.pass++; - var temp = options.targetTexture; - options.targetTexture = options.sourceTexture; - options.sourceTexture = temp; - }, - - /** - * Generic isNeutral implementation for one parameter based filters. - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter ) - * @param {Object} options - **/ - isNeutralState: function(/* options */) { - var main = this.mainParameter, - _class = fabric.Image.filters[this.type].prototype; - if (main) { - if (Array.isArray(_class[main])) { - for (var i = _class[main].length; i--;) { - if (this[main][i] !== _class[main][i]) { - return false; - } - } - return true; - } - else { - return _class[main] === this[main]; - } - } - else { - return false; - } - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - if (!options.programCache.hasOwnProperty(this.type)) { - options.programCache[this.type] = this.createProgram(options.context); - } - return options.programCache[this.type]; - }, - - /** - * Apply this filter using webgl. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.originalTexture The texture of the original input image. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyToWebGL: function(options) { - var gl = options.context; - var shader = this.retrieveShader(options); - if (options.pass === 0 && options.originalTexture) { - gl.bindTexture(gl.TEXTURE_2D, options.originalTexture); - } - else { - gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture); - } - gl.useProgram(shader.program); - this.sendAttributeData(gl, shader.attributeLocations, options.aPosition); - - gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth); - gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight); - - this.sendUniformData(gl, shader.uniformLocations); - gl.viewport(0, 0, options.destinationWidth, options.destinationHeight); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - }, - - bindAdditionalTexture: function(gl, texture, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, texture); - // reset active texture to 0 as usual - gl.activeTexture(gl.TEXTURE0); - }, - - unbindAdditionalTexture: function(gl, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.activeTexture(gl.TEXTURE0); - }, - - getMainParameter: function() { - return this[this.mainParameter]; - }, - - setMainParameter: function(value) { - this[this.mainParameter] = value; - }, - - /** - * Send uniform data from this filter to its shader program on the GPU. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} uniformLocations A map of shader uniform names to their locations. - */ - sendUniformData: function(/* gl, uniformLocations */) { - // Intentionally left blank. Override me in subclasses. - }, - - /** - * If needed by a 2d filter, this functions can create an helper canvas to be used - * remember that options.targetCanvas is available for use till end of chain. - */ - createHelpLayer: function(options) { - if (!options.helpLayer) { - var helpLayer = document.createElement('canvas'); - helpLayer.width = options.sourceWidth; - helpLayer.height = options.sourceHeight; - options.helpLayer = helpLayer; - } - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - var object = { type: this.type }, mainP = this.mainParameter; - if (mainP) { - object[mainP] = this[mainP]; - } - return object; - }, - - /** - * Returns a JSON representation of an instance - * @return {Object} JSON - */ - toJSON: function() { - // delegate, not alias - return this.toObject(); - } -}); - -fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { - var filter = new fabric.Image.filters[object.type](object); - callback && callback(filter); - return filter; -}; - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Matrix filter class - * @class fabric.Image.filters.ColorMatrix - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php} - * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl} - * @example Kodachrome filter - * var filter = new fabric.Image.filters.ColorMatrix({ - * matrix: [ - 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502, - -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203, - -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946, - 0, 0, 0, 1, 0 - ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'ColorMatrix', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform mat4 uColorMatrix;\n' + - 'uniform vec4 uConstants;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color *= uColorMatrix;\n' + - 'color += uConstants;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Colormatrix for pixels. - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ], - - mainParameter: 'matrix', - - /** - * Lock the colormatrix on the color part, skipping alpha, manly for non webgl scenario - * to save some calculation - */ - colorsOnly: true, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.matrix = this.matrix.slice(0); - }, - - /** - * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = data.length, - m = this.matrix, - r, g, b, a, i, colorsOnly = this.colorsOnly; - - for (i = 0; i < iLen; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - if (colorsOnly) { - data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255; - } - else { - a = data[i + 3]; - data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255; - data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'), - uConstants: gl.getUniformLocation(program, 'uConstants'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var m = this.matrix, - matrix = [ - m[0], m[1], m[2], m[3], - m[5], m[6], m[7], m[8], - m[10], m[11], m[12], m[13], - m[15], m[16], m[17], m[18] - ], - constants = [m[4], m[9], m[14], m[19]]; - gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix); - gl.uniform4fv(uniformLocations.uConstants, constants); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] function to invoke after filter creation - * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix - */ - fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Brightness filter class - * @class fabric.Image.filters.Brightness - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Brightness({ - * brightness: 0.05 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Brightness', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBrightness;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += uBrightness;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Brightness value, from -1 to 1. - * translated to -255 to 255 for 2d - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Number} brightness - * @default - */ - brightness: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'brightness', - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.brightness === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - brightness = Math.round(this.brightness * 255); - for (i = 0; i < len; i += 4) { - data[i] = data[i] + brightness; - data[i + 1] = data[i + 1] + brightness; - data[i + 2] = data[i + 2] + brightness; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBrightness: gl.getUniformLocation(program, 'uBrightness'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBrightness, this.brightness); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness - */ - fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Adapted from html5rocks article - * @class fabric.Image.filters.Convolute - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example Sharpen filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 0, -1, 0, - * -1, 5, -1, - * 0, -1, 0 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Blur filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter with opaqueness - * var filter = new fabric.Image.filters.Convolute({ - * opaque: true, - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Convolute', - - /* - * Opaque value (true/false) - */ - opaque: false, - - /* - * matrix for the filter, max 9x9 - */ - matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0], - - /** - * Fragment source for the brightness program - */ - fragmentSource: { - Convolute_3_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_3_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_5_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_5_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_7_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_7_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_9_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_9_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - }, - - /** - * Constructor - * @memberOf fabric.Image.filters.Convolute.prototype - * @param {Object} [options] Options object - * @param {Boolean} [options.opaque=false] Opaque value (true/false) - * @param {Array} [options.matrix] Filter matrix - */ - - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var size = Math.sqrt(this.matrix.length); - var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0); - var shaderSource = this.fragmentSource[cacheKey]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - weights = this.matrix, - side = Math.round(Math.sqrt(weights.length)), - halfSide = Math.floor(side / 2), - sw = imageData.width, - sh = imageData.height, - output = options.ctx.createImageData(sw, sh), - dst = output.data, - // go through the destination image pixels - alphaFac = this.opaque ? 1 : 0, - r, g, b, a, dstOff, - scx, scy, srcOff, wt, - x, y, cx, cy; - - for (y = 0; y < sh; y++) { - for (x = 0; x < sw; x++) { - dstOff = (y * sw + x) * 4; - // calculate the weighed sum of the source image pixels that - // fall under the convolution matrix - r = 0; g = 0; b = 0; a = 0; - - for (cy = 0; cy < side; cy++) { - for (cx = 0; cx < side; cx++) { - scy = y + cy - halfSide; - scx = x + cx - halfSide; - - // eslint-disable-next-line max-depth - if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) { - continue; - } - - srcOff = (scy * sw + scx) * 4; - wt = weights[cy * side + cx]; - - r += data[srcOff] * wt; - g += data[srcOff + 1] * wt; - b += data[srcOff + 2] * wt; - // eslint-disable-next-line max-depth - if (!alphaFac) { - a += data[srcOff + 3] * wt; - } - } - } - dst[dstOff] = r; - dst[dstOff + 1] = g; - dst[dstOff + 2] = b; - if (!alphaFac) { - dst[dstOff + 3] = a; - } - else { - dst[dstOff + 3] = data[dstOff + 3]; - } - } - } - options.imageData = output; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMatrix: gl.getUniformLocation(program, 'uMatrix'), - uOpaque: gl.getUniformLocation(program, 'uOpaque'), - uHalfSize: gl.getUniformLocation(program, 'uHalfSize'), - uSize: gl.getUniformLocation(program, 'uSize'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1fv(uniformLocations.uMatrix, this.matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - opaque: this.opaque, - matrix: this.matrix - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute - */ - fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Grayscale image filter class - * @class fabric.Image.filters.Grayscale - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Grayscale(); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Grayscale', - - fragmentSource: { - average: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float average = (color.r + color.b + color.g) / 3.0;\n' + - 'gl_FragColor = vec4(average, average, average, color.a);\n' + - '}', - lightness: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - luminosity: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - }, - - - /** - * Grayscale mode, between 'average', 'lightness', 'luminosity' - * @param {String} type - * @default - */ - mode: 'average', - - mainParameter: 'mode', - - /** - * Apply the Grayscale operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length, value, - mode = this.mode; - for (i = 0; i < len; i += 4) { - if (mode === 'average') { - value = (data[i] + data[i + 1] + data[i + 2]) / 3; - } - else if (mode === 'lightness') { - value = (Math.min(data[i], data[i + 1], data[i + 2]) + - Math.max(data[i], data[i + 1], data[i + 2])) / 2; - } - else if (mode === 'luminosity') { - value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2]; - } - data[i] = value; - data[i + 1] = value; - data[i + 2] = value; - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var shaderSource = this.fragmentSource[this.mode]; - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMode: gl.getUniformLocation(program, 'uMode'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - // default average mode. - var mode = 1; - gl.uniform1i(uniformLocations.uMode, mode); - }, - - /** - * Grayscale filter isNeutralState implementation - * The filter is never neutral - * on the image - **/ - isNeutralState: function() { - return false; - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale - */ - fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Invert filter class - * @class fabric.Image.filters.Invert - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Invert(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Invert', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uInvert;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'if (uInvert == 1) {\n' + - 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n' + - '} else {\n' + - 'gl_FragColor = color;\n' + - '}\n' + - '}', - - /** - * Filter invert. if false, does nothing - * @param {Boolean} invert - * @default - */ - invert: true, - - mainParameter: 'invert', - - /** - * Apply the Invert operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length; - for (i = 0; i < len; i += 4) { - data[i] = 255 - data[i]; - data[i + 1] = 255 - data[i + 1]; - data[i + 2] = 255 - data[i + 2]; - } - }, - - /** - * Invert filter isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function() { - return !this.invert; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uInvert: gl.getUniformLocation(program, 'uInvert'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1i(uniformLocations.uInvert, this.invert); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert - */ - fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject; - - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Noise filter class - * @class fabric.Image.filters.Noise - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Noise({ - * noise: 700 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Noise', - - /** - * Fragment source for the noise program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uStepH;\n' + - 'uniform float uNoise;\n' + - 'uniform float uSeed;\n' + - 'varying vec2 vTexCoord;\n' + - 'float rand(vec2 co, float seed, float vScale) {\n' + - 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'noise', - - /** - * Noise value, from - * @param {Number} noise - * @default - */ - noise: 0, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.noise === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - noise = this.noise, rand; - - for (i = 0, len = data.length; i < len; i += 4) { - - rand = (0.5 - Math.random()) * noise; - - data[i] += rand; - data[i + 1] += rand; - data[i + 2] += rand; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uNoise: gl.getUniformLocation(program, 'uNoise'), - uSeed: gl.getUniformLocation(program, 'uSeed'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uNoise, this.noise / 255); - gl.uniform1f(uniformLocations.uSeed, Math.random()); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - noise: this.noise - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise - */ - fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Pixelate filter class - * @class fabric.Image.filters.Pixelate - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Pixelate({ - * blocksize: 8 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Pixelate', - - blocksize: 4, - - mainParameter: 'blocksize', - - /** - * Fragment source for the Pixelate program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBlocksize;\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'float blockW = uBlocksize * uStepW;\n' + - 'float blockH = uBlocksize * uStepW;\n' + - 'int posX = int(vTexCoord.x / blockW);\n' + - 'int posY = int(vTexCoord.y / blockH);\n' + - 'float fposX = float(posX);\n' + - 'float fposY = float(posY);\n' + - 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n' + - 'vec4 color = texture2D(uTexture, squareCoords);\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = imageData.height, - jLen = imageData.width, - index, i, j, r, g, b, a, - _i, _j, _iLen, _jLen; - - for (i = 0; i < iLen; i += this.blocksize) { - for (j = 0; j < jLen; j += this.blocksize) { - - index = (i * 4) * jLen + (j * 4); - - r = data[index]; - g = data[index + 1]; - b = data[index + 2]; - a = data[index + 3]; - - _iLen = Math.min(i + this.blocksize, iLen); - _jLen = Math.min(j + this.blocksize, jLen); - for (_i = i; _i < _iLen; _i++) { - for (_j = j; _j < _jLen; _j++) { - index = (_i * 4) * jLen + (_j * 4); - data[index] = r; - data[index + 1] = g; - data[index + 2] = b; - data[index + 3] = a; - } - } - } - } - }, - - /** - * Indicate when the filter is not gonna apply changes to the image - **/ - isNeutralState: function() { - return this.blocksize === 1; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBlocksize: gl.getUniformLocation(program, 'uBlocksize'), - uStepW: gl.getUniformLocation(program, 'uStepW'), - uStepH: gl.getUniformLocation(program, 'uStepH'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBlocksize, this.blocksize); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate - */ - fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Remove white filter class - * @class fabric.Image.filters.RemoveColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.RemoveColor({ - * threshold: 0.2, - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'RemoveColor', - - /** - * Color to remove, in any format understood by fabric.Color. - * @param {String} type - * @default - */ - color: '#FFFFFF', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uLow;\n' + - 'uniform vec4 uHigh;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n' + - 'gl_FragColor.a = 0.0;\n' + - '}\n' + - '}', - - /** - * distance to actual color, as value up or down from each r,g,b - * between 0 and 1 - **/ - distance: 0.02, - - /** - * For color to remove inside distance, use alpha channel for a smoother deletion - * NOT IMPLEMENTED YET - **/ - useAlpha: false, - - /** - * Constructor - * @memberOf fabric.Image.filters.RemoveWhite.prototype - * @param {Object} [options] Options object - * @param {Number} [options.color=#RRGGBB] Threshold value - * @param {Number} [options.distance=10] Distance value - */ - - /** - * Applies filter to canvas element - * @param {Object} canvasEl Canvas element to apply filter to - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - distance = this.distance * 255, - r, g, b, - source = new fabric.Color(this.color).getSource(), - lowC = [ - source[0] - distance, - source[1] - distance, - source[2] - distance, - ], - highC = [ - source[0] + distance, - source[1] + distance, - source[2] + distance, - ]; - - - for (i = 0; i < data.length; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - if (r > lowC[0] && - g > lowC[1] && - b > lowC[2] && - r < highC[0] && - g < highC[1] && - b < highC[2]) { - data[i + 3] = 0; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uLow: gl.getUniformLocation(program, 'uLow'), - uHigh: gl.getUniformLocation(program, 'uHigh'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(), - distance = parseFloat(this.distance), - lowC = [ - 0 + source[0] / 255 - distance, - 0 + source[1] / 255 - distance, - 0 + source[2] / 255 - distance, - 1 - ], - highC = [ - source[0] / 255 + distance, - source[1] / 255 + distance, - source[2] / 255 + distance, - 1 - ]; - gl.uniform4fv(uniformLocations.uLow, lowC); - gl.uniform4fv(uniformLocations.uHigh, highC); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - color: this.color, - distance: this.distance - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite - */ - fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - var matrices = { - Brownie: [ - 0.59970,0.34553,-0.27082,0,0.186, - -0.03770,0.86095,0.15059,0,-0.1449, - 0.24113,-0.07441,0.44972,0,-0.02965, - 0,0,0,1,0 - ], - Vintage: [ - 0.62793,0.32021,-0.03965,0,0.03784, - 0.02578,0.64411,0.03259,0,0.02926, - 0.04660,-0.08512,0.52416,0,0.02023, - 0,0,0,1,0 - ], - Kodachrome: [ - 1.12855,-0.39673,-0.03992,0,0.24991, - -0.16404,1.08352,-0.05498,0,0.09698, - -0.16786,-0.56034,1.60148,0,0.13972, - 0,0,0,1,0 - ], - Technicolor: [ - 1.91252,-0.85453,-0.09155,0,0.04624, - -0.30878,1.76589,-0.10601,0,-0.27589, - -0.23110,-0.75018,1.84759,0,0.12137, - 0,0,0,1,0 - ], - Polaroid: [ - 1.438,-0.062,-0.062,0,0, - -0.122,1.378,-0.122,0,0, - -0.016,-0.016,1.483,0,0, - 0,0,0,1,0 - ], - Sepia: [ - 0.393, 0.769, 0.189, 0, 0, - 0.349, 0.686, 0.168, 0, 0, - 0.272, 0.534, 0.131, 0, 0, - 0, 0, 0, 1, 0 - ], - BlackWhite: [ - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 0, 0, 0, 1, 0, - ] - }; - - for (var key in matrices) { - filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: key, - - /** - * Colormatrix for the effect - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: matrices[key], - - /** - * Lock the matrix export for this kind of static, parameter less filters. - */ - mainParameter: false, - /** - * Lock the colormatrix on the color part, skipping alpha - */ - colorsOnly: true, - - }); - fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject; - } -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Blend filter class - * @class fabric.Image.filter.BlendColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ { - type: 'BlendColor', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - **/ - color: '#F95C63', - - /** - * Blend mode for the filter: one of multiply, add, diff, screen, subtract, - * darken, lighten, overlay, exclusion, tint. - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend color operation. - **/ - alpha: 1, - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'gl_FragColor.rgb *= uColor.rgb;\n', - screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n', - add: 'gl_FragColor.rgb += uColor.rgb;\n', - diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n', - subtract: 'gl_FragColor.rgb -= uColor.rgb;\n', - lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n', - darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n', - exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n', - overlay: 'if (uColor.r < 0.5) {\n' + - 'gl_FragColor.r *= 2.0 * uColor.r;\n' + - '} else {\n' + - 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n' + - '}\n' + - 'if (uColor.g < 0.5) {\n' + - 'gl_FragColor.g *= 2.0 * uColor.g;\n' + - '} else {\n' + - 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n' + - '}\n' + - 'if (uColor.b < 0.5) {\n' + - 'gl_FragColor.b *= 2.0 * uColor.b;\n' + - '} else {\n' + - 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n' + - '}\n', - tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\n' + - 'gl_FragColor.rgb += uColor.rgb;\n', - }, - - /** - * build the fragment source for the filters, joining the common part with - * the specific one. - * @param {String} mode the mode of the filter, a key of this.fragmentSource - * @return {String} the source to be compiled - * @private - */ - buildSource: function(mode) { - return 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'gl_FragColor = color;\n' + - 'if (color.a > 0.0) {\n' + - this.fragmentSource[mode] + - '}\n' + - '}'; - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode, shaderSource; - if (!options.programCache.hasOwnProperty(cacheKey)) { - shaderSource = this.buildSource(this.mode); - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, iLen = data.length, - tr, tg, tb, - r, g, b, - source, alpha1 = 1 - this.alpha; - - source = new fabric.Color(this.color).getSource(); - tr = source[0] * this.alpha; - tg = source[1] * this.alpha; - tb = source[2] * this.alpha; - - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - break; - case 'screen': - data[i] = 255 - (255 - r) * (255 - tr) / 255; - data[i + 1] = 255 - (255 - g) * (255 - tg) / 255; - data[i + 2] = 255 - (255 - b) * (255 - tb) / 255; - break; - case 'add': - data[i] = r + tr; - data[i + 1] = g + tg; - data[i + 2] = b + tb; - break; - case 'diff': - case 'difference': - data[i] = Math.abs(r - tr); - data[i + 1] = Math.abs(g - tg); - data[i + 2] = Math.abs(b - tb); - break; - case 'subtract': - data[i] = r - tr; - data[i + 1] = g - tg; - data[i + 2] = b - tb; - break; - case 'darken': - data[i] = Math.min(r, tr); - data[i + 1] = Math.min(g, tg); - data[i + 2] = Math.min(b, tb); - break; - case 'lighten': - data[i] = Math.max(r, tr); - data[i + 1] = Math.max(g, tg); - data[i + 2] = Math.max(b, tb); - break; - case 'overlay': - data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255); - data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255); - data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255); - break; - case 'exclusion': - data[i] = tr + r - ((2 * tr * r) / 255); - data[i + 1] = tg + g - ((2 * tg * g) / 255); - data[i + 2] = tb + b - ((2 * tb * b) / 255); - break; - case 'tint': - data[i] = tr + r * alpha1; - data[i + 1] = tg + g * alpha1; - data[i + 2] = tb + b * alpha1; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColor: gl.getUniformLocation(program, 'uColor'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(); - source[0] = this.alpha * source[0] / 255; - source[1] = this.alpha * source[1] / 255; - source[2] = this.alpha * source[2] / 255; - source[3] = this.alpha; - gl.uniform4fv(uniformLocations.uColor, source); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - color: this.color, - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor - */ - fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Image Blend filter class - * @class fabric.Image.filter.BlendImage - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ { - type: 'BlendImage', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - **/ - image: null, - - /** - * Blend mode for the filter: one of multiply, add, diff, screen, subtract, - * darken, lighten, overlay, exclusion, tint. - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend image operation. - * not implemented. - **/ - alpha: 1, - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'uniform mat3 uTransformMatrix;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.rgba *= color2.rgba;\n' + - 'gl_FragColor = color;\n' + - '}', - mask: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.a = color2.a;\n' + - 'gl_FragColor = color;\n' + - '}', - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - var shaderSource = this.fragmentSource[this.mode]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - applyToWebGL: function(options) { - // load texture to blend. - var gl = options.context, - texture = this.createTexture(options.filterBackend, this.image); - this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); - this.callSuper('applyToWebGL', options); - this.unbindAdditionalTexture(gl, gl.TEXTURE1); - }, - - createTexture: function(backend, image) { - return backend.getCachedTexture(image.cacheKey, image._element); - }, - - /** - * Calculate a transformMatrix to adapt the image to blend over - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - calculateMatrix: function() { - var image = this.image, - width = image._element.width, - height = image._element.height; - return [ - 1 / image.scaleX, 0, 0, - 0, 1 / image.scaleY, 0, - -image.left / width, -image.top / height, 1 - ]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - resources = options.filterBackend.resources, - data = imageData.data, iLen = data.length, - width = imageData.width, - height = imageData.height, - tr, tg, tb, ta, - r, g, b, a, - canvas1, context, image = this.image, blendData; - - if (!resources.blendImage) { - resources.blendImage = fabric.util.createCanvasElement(); - } - canvas1 = resources.blendImage; - context = canvas1.getContext('2d'); - if (canvas1.width !== width || canvas1.height !== height) { - canvas1.width = width; - canvas1.height = height; - } - else { - context.clearRect(0, 0, width, height); - } - context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); - context.drawImage(image._element, 0, 0, width, height); - blendData = context.getImageData(0, 0, width, height).data; - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - a = data[i + 3]; - - tr = blendData[i]; - tg = blendData[i + 1]; - tb = blendData[i + 2]; - ta = blendData[i + 3]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - data[i + 3] = a * ta / 255; - break; - case 'mask': - data[i + 3] = ta; - break; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'), - uImage: gl.getUniformLocation(program, 'uImage'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var matrix = this.calculateMatrix(); - gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1. - gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - image: this.image && this.image.toObject(), - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} callback to be invoked after filter creation - * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage - */ - fabric.Image.filters.BlendImage.fromObject = function(object, callback) { - fabric.Image.fromObject(object.image, function(image) { - var options = fabric.util.object.clone(object); - options.image = image; - callback(new fabric.Image.filters.BlendImage(options)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor, - sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin, - ceil = Math.ceil, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Resize image filter class - * @class fabric.Image.filters.Resize - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Resize(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Resize', - - /** - * Resize type - * for webgl resizeType is just lanczos, for canvas2d can be: - * bilinear, hermite, sliceHack, lanczos. - * @param {String} resizeType - * @default - */ - resizeType: 'hermite', - - /** - * Scale factor for resizing, x axis - * @param {Number} scaleX - * @default - */ - scaleX: 1, - - /** - * Scale factor for resizing, y axis - * @param {Number} scaleY - * @default - */ - scaleY: 1, - - /** - * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos - * @param {Number} lanczosLobes - * @default - */ - lanczosLobes: 3, - - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uDelta: gl.getUniformLocation(program, 'uDelta'), - uTaps: gl.getUniformLocation(program, 'uTaps'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]); - gl.uniform1fv(uniformLocations.uTaps, this.taps); - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var fragmentShader = this.generateShader(filterWindow); - options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader); - } - return options.programCache[cacheKey]; - }, - - getFilterWindow: function() { - var scale = this.tempScale; - return Math.ceil(this.lanczosLobes / scale); - }, - - getTaps: function() { - var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale, - filterWindow = this.getFilterWindow(), taps = new Array(filterWindow); - for (var i = 1; i <= filterWindow; i++) { - taps[i - 1] = lobeFunction(i * scale); - } - return taps; - }, - - /** - * Generate vertex and shader sources from the necessary steps numbers - * @param {Number} filterWindow - */ - generateShader: function(filterWindow) { - var offsets = new Array(filterWindow), - fragmentShader = this.fragmentSourceTOP, filterWindow; - - for (var i = 1; i <= filterWindow; i++) { - offsets[i - 1] = i + '.0 * uDelta'; - } - - fragmentShader += 'uniform float uTaps[' + filterWindow + '];\n'; - fragmentShader += 'void main() {\n'; - fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\n'; - fragmentShader += ' float sum = 1.0;\n'; - - offsets.forEach(function(offset, i) { - fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\n'; - }); - fragmentShader += ' gl_FragColor = color / sum;\n'; - fragmentShader += '}'; - return fragmentShader; - }, - - fragmentSourceTOP: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n', - - /** - * Apply the resize filter to the image - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - options.passes++; - this.width = options.sourceWidth; - this.horizontal = true; - this.dW = Math.round(this.width * this.scaleX); - this.dH = options.sourceHeight; - this.tempScale = this.dW / this.width; - this.taps = this.getTaps(); - options.destinationWidth = this.dW; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceWidth = options.destinationWidth; - - this.height = options.sourceHeight; - this.horizontal = false; - this.dH = Math.round(this.height * this.scaleY); - this.tempScale = this.dH / this.height; - this.taps = this.getTaps(); - options.destinationHeight = this.dH; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceHeight = options.destinationHeight; - } - else { - this.applyTo2d(options); - } - }, - - isNeutralState: function() { - return this.scaleX === 1 && this.scaleY === 1; - }, - - lanczosCreate: function(lobes) { - return function(x) { - if (x >= lobes || x <= -lobes) { - return 0.0; - } - if (x < 1.19209290E-07 && x > -1.19209290E-07) { - return 1.0; - } - x *= Math.PI; - var xx = x / lobes; - return (sin(x) / x) * sin(xx) / xx; - }; - }, - - /** - * Applies filter to canvas element - * @memberOf fabric.Image.filters.Resize.prototype - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} scaleX - * @param {Number} scaleY - */ - applyTo2d: function(options) { - var imageData = options.imageData, - scaleX = this.scaleX, - scaleY = this.scaleY; - - this.rcpScaleX = 1 / scaleX; - this.rcpScaleY = 1 / scaleY; - - var oW = imageData.width, oH = imageData.height, - dW = round(oW * scaleX), dH = round(oH * scaleY), - newData; - - if (this.resizeType === 'sliceHack') { - newData = this.sliceByTwo(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'hermite') { - newData = this.hermiteFastResize(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'bilinear') { - newData = this.bilinearFiltering(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'lanczos') { - newData = this.lanczosResize(options, oW, oH, dW, dH); - } - options.imageData = newData; - }, - - /** - * Filter sliceByTwo - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - sliceByTwo: function(options, oW, oH, dW, dH) { - var imageData = options.imageData, - mult = 0.5, doneW = false, doneH = false, stepW = oW * mult, - stepH = oH * mult, resources = fabric.filterBackend.resources, - tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0; - if (!resources.sliceByTwo) { - resources.sliceByTwo = document.createElement('canvas'); - } - tmpCanvas = resources.sliceByTwo; - if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) { - tmpCanvas.width = oW * 1.5; - tmpCanvas.height = oH; - } - ctx = tmpCanvas.getContext('2d'); - ctx.clearRect(0, 0, oW * 1.5, oH); - ctx.putImageData(imageData, 0, 0); - - dW = floor(dW); - dH = floor(dH); - - while (!doneW || !doneH) { - oW = stepW; - oH = stepH; - if (dW < floor(stepW * mult)) { - stepW = floor(stepW * mult); - } - else { - stepW = dW; - doneW = true; - } - if (dH < floor(stepH * mult)) { - stepH = floor(stepH * mult); - } - else { - stepH = dH; - doneH = true; - } - ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH); - sX = dX; - sY = dY; - dY += stepH; - } - return ctx.getImageData(sX, sY, dW, dH); - }, - - /** - * Filter lanczosResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - lanczosResize: function(options, oW, oH, dW, dH) { - - function process(u) { - var v, i, weight, idx, a, red, green, - blue, alpha, fX, fY; - center.x = (u + 0.5) * ratioX; - icenter.x = floor(center.x); - for (v = 0; v < dH; v++) { - center.y = (v + 0.5) * ratioY; - icenter.y = floor(center.y); - a = 0; red = 0; green = 0; blue = 0; alpha = 0; - for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) { - if (i < 0 || i >= oW) { - continue; - } - fX = floor(1000 * abs(i - center.x)); - if (!cacheLanc[fX]) { - cacheLanc[fX] = { }; - } - for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) { - if (j < 0 || j >= oH) { - continue; - } - fY = floor(1000 * abs(j - center.y)); - if (!cacheLanc[fX][fY]) { - cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000); - } - weight = cacheLanc[fX][fY]; - if (weight > 0) { - idx = (j * oW + i) * 4; - a += weight; - red += weight * srcData[idx]; - green += weight * srcData[idx + 1]; - blue += weight * srcData[idx + 2]; - alpha += weight * srcData[idx + 3]; - } - } - } - idx = (v * dW + u) * 4; - destData[idx] = red / a; - destData[idx + 1] = green / a; - destData[idx + 2] = blue / a; - destData[idx + 3] = alpha / a; - } - - if (++u < dW) { - return process(u); - } - else { - return destImg; - } - } - - var srcData = options.imageData.data, - destImg = options.ctx.createImageData(dW, dH), - destData = destImg.data, - lanczos = this.lanczosCreate(this.lanczosLobes), - ratioX = this.rcpScaleX, ratioY = this.rcpScaleY, - rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY, - range2X = ceil(ratioX * this.lanczosLobes / 2), - range2Y = ceil(ratioY * this.lanczosLobes / 2), - cacheLanc = { }, center = { }, icenter = { }; - - return process(0); - }, - - /** - * bilinearFiltering - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - bilinearFiltering: function(options, oW, oH, dW, dH) { - var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl, - color, offset = 0, origPix, ratioX = this.rcpScaleX, - ratioY = this.rcpScaleY, - w4 = 4 * (oW - 1), img = options.imageData, - pixels = img.data, destImage = options.ctx.createImageData(dW, dH), - destPixels = destImage.data; - for (i = 0; i < dH; i++) { - for (j = 0; j < dW; j++) { - x = floor(ratioX * j); - y = floor(ratioY * i); - xDiff = ratioX * j - x; - yDiff = ratioY * i - y; - origPix = 4 * (y * oW + x); - - for (chnl = 0; chnl < 4; chnl++) { - a = pixels[origPix + chnl]; - b = pixels[origPix + 4 + chnl]; - c = pixels[origPix + w4 + chnl]; - d = pixels[origPix + w4 + 4 + chnl]; - color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) + - c * yDiff * (1 - xDiff) + d * xDiff * yDiff; - destPixels[offset++] = color; - } - } - } - return destImage; - }, - - /** - * hermiteFastResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - hermiteFastResize: function(options, oW, oH, dW, dH) { - var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, - ratioWHalf = ceil(ratioW / 2), - ratioHHalf = ceil(ratioH / 2), - img = options.imageData, data = img.data, - img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; - for (var j = 0; j < dH; j++) { - for (var i = 0; i < dW; i++) { - var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, - gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH; - for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) { - var dy = abs(centerY - (yy + 0.5)) / ratioHHalf, - centerX = (i + 0.5) * ratioW, w0 = dy * dy; - for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) { - var dx = abs(centerX - (xx + 0.5)) / ratioWHalf, - w = sqrt(w0 + dx * dx); - /* eslint-disable max-depth */ - if (w > 1 && w < -1) { - continue; - } - //hermite filter - weight = 2 * w * w * w - 3 * w * w + 1; - if (weight > 0) { - dx = 4 * (xx + yy * oW); - //alpha - gxA += weight * data[dx + 3]; - weightsAlpha += weight; - //colors - if (data[dx + 3] < 255) { - weight = weight * data[dx + 3] / 250; - } - gxR += weight * data[dx]; - gxG += weight * data[dx + 1]; - gxB += weight * data[dx + 2]; - weights += weight; - } - /* eslint-enable max-depth */ - } - } - data2[x2] = gxR / weights; - data2[x2 + 1] = gxG / weights; - data2[x2 + 2] = gxB / weights; - data2[x2 + 3] = gxA / weightsAlpha; - } - } - return img2; - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - scaleX: this.scaleX, - scaleY: this.scaleY, - resizeType: this.resizeType, - lanczosLobes: this.lanczosLobes - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize - */ - fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Contrast filter class - * @class fabric.Image.filters.Contrast - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Contrast({ - * contrast: 0.25 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Contrast', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uContrast;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n' + - 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * contrast value, range from -1 to 1. - * @param {Number} contrast - * @default 0 - */ - contrast: 0, - - mainParameter: 'contrast', - - /** - * Constructor - * @memberOf fabric.Image.filters.Contrast.prototype - * @param {Object} [options] Options object - * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1) - */ - - /** - * Apply the Contrast operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - if (this.contrast === 0) { - return; - } - var imageData = options.imageData, i, len, - data = imageData.data, len = data.length, - contrast = Math.floor(this.contrast * 255), - contrastF = 259 * (contrast + 255) / (255 * (259 - contrast)); - - for (i = 0; i < len; i += 4) { - data[i] = contrastF * (data[i] - 128) + 128; - data[i + 1] = contrastF * (data[i + 1] - 128) + 128; - data[i + 2] = contrastF * (data[i + 2] - 128) + 128; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uContrast: gl.getUniformLocation(program, 'uContrast'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uContrast, this.contrast); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast - */ - fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Saturate filter class - * @class fabric.Image.filters.Saturation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Saturation({ - * saturation: 1 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Saturation', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uSaturation;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float rgMax = max(color.r, color.g);\n' + - 'float rgbMax = max(rgMax, color.b);\n' + - 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n' + - 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n' + - 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Saturation value, from -1 to 1. - * Increases/decreases the color saturation. - * A value of 0 has no effect. - * - * @param {Number} saturation - * @default - */ - saturation: 0, - - mainParameter: 'saturation', - - /** - * Constructor - * @memberOf fabric.Image.filters.Saturate.prototype - * @param {Object} [options] Options object - * @param {Number} [options.saturate=0] Value to saturate the image (-1...1) - */ - - /** - * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.saturation === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, len = data.length, - adjust = -this.saturation, i, max; - - for (i = 0; i < len; i += 4) { - max = Math.max(data[i], data[i + 1], data[i + 2]); - data[i] += max !== data[i] ? (max - data[i]) * adjust : 0; - data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0; - data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uSaturation: gl.getUniformLocation(program, 'uSaturation'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uSaturation, -this.saturation); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate - */ - fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Vibrance filter class - * @class fabric.Image.filters.Vibrance - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Vibrance({ - * vibrance: 1 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Vibrance', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uVibrance;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float max = max(color.r, max(color.g, color.b));\n' + - 'float avg = (color.r + color.g + color.b) / 3.0;\n' + - 'float amt = (abs(max - avg) * 2.0) * uVibrance;\n' + - 'color.r += max != color.r ? (max - color.r) * amt : 0.00;\n' + - 'color.g += max != color.g ? (max - color.g) * amt : 0.00;\n' + - 'color.b += max != color.b ? (max - color.b) * amt : 0.00;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Vibrance value, from -1 to 1. - * Increases/decreases the saturation of more muted colors with less effect on saturated colors. - * A value of 0 has no effect. - * - * @param {Number} vibrance - * @default - */ - vibrance: 0, - - mainParameter: 'vibrance', - - /** - * Constructor - * @memberOf fabric.Image.filters.Vibrance.prototype - * @param {Object} [options] Options object - * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1) - */ - - /** - * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.vibrance === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, len = data.length, - adjust = -this.vibrance, i, max, avg, amt; - - for (i = 0; i < len; i += 4) { - max = Math.max(data[i], data[i + 1], data[i + 2]); - avg = (data[i] + data[i + 1] + data[i + 2]) / 3; - amt = ((Math.abs(max - avg) * 2 / 255) * adjust); - data[i] += max !== data[i] ? (max - data[i]) * amt : 0; - data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0; - data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uVibrance: gl.getUniformLocation(program, 'uVibrance'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uVibrance, -this.vibrance); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance - */ - fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Blur filter class - * @class fabric.Image.filters.Blur - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Blur({ - * blur: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ { - - type: 'Blur', - - /* -'gl_FragColor = vec4(0.0);', -'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;', -'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;', -'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;', -*/ - - /* eslint-disable max-len */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n' + - 'const float nSamples = 15.0;\n' + - 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n' + - 'float random(vec3 scale) {\n' + - /* use the fragment position for a different seed per-pixel */ - 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = vec4(0.0);\n' + - 'float total = 0.0;\n' + - 'float offset = random(v3offset);\n' + - 'for (float t = -nSamples; t <= nSamples; t++) {\n' + - 'float percent = (t + offset - 0.5) / nSamples;\n' + - 'float weight = 1.0 - abs(percent);\n' + - 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\n' + - 'total += weight;\n' + - '}\n' + - 'gl_FragColor = color / total;\n' + - '}', - /* eslint-enable max-len */ - - /** - * blur value, in percentage of image dimensions. - * specific to keep the image blur constant at different resolutions - * range between 0 and 1. - */ - blur: 0, - - mainParameter: 'blur', - - applyTo: function(options) { - if (options.webgl) { - // this aspectRatio is used to give the same blur to vertical and horizontal - this.aspectRatio = options.sourceWidth / options.sourceHeight; - options.passes++; - this._setupFrameBuffer(options); - this.horizontal = true; - this.applyToWebGL(options); - this._swapTextures(options); - this._setupFrameBuffer(options); - this.horizontal = false; - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - applyTo2d: function(options) { - // paint canvasEl with current image data. - //options.ctx.putImageData(options.imageData, 0, 0); - options.imageData = this.simpleBlur(options); - }, - - simpleBlur: function(options) { - var resources = options.filterBackend.resources, canvas1, canvas2, - width = options.imageData.width, - height = options.imageData.height; - - if (!resources.blurLayer1) { - resources.blurLayer1 = fabric.util.createCanvasElement(); - resources.blurLayer2 = fabric.util.createCanvasElement(); - } - canvas1 = resources.blurLayer1; - canvas2 = resources.blurLayer2; - if (canvas1.width !== width || canvas1.height !== height) { - canvas2.width = canvas1.width = width; - canvas2.height = canvas1.height = height; - } - var ctx1 = canvas1.getContext('2d'), - ctx2 = canvas2.getContext('2d'), - nSamples = 15, - random, percent, j, i, - blur = this.blur * 0.06 * 0.5; - - // load first canvas - ctx1.putImageData(options.imageData, 0, 0); - ctx2.clearRect(0, 0, width, height); - - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * width + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, j, random); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * height + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, random, j); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - options.ctx.drawImage(canvas1, 0, 0); - var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height); - ctx1.globalAlpha = 1; - ctx1.clearRect(0, 0, canvas1.width, canvas1.height); - return newImageData; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - delta: gl.getUniformLocation(program, 'uDelta'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var delta = this.chooseRightDelta(); - gl.uniform2fv(uniformLocations.delta, delta); - }, - - /** - * choose right value of image percentage to blur with - * @returns {Array} a numeric array with delta values - */ - chooseRightDelta: function() { - var blurScale = 1, delta = [0, 0], blur; - if (this.horizontal) { - if (this.aspectRatio > 1) { - // image is wide, i want to shrink radius horizontal - blurScale = 1 / this.aspectRatio; - } - } - else { - if (this.aspectRatio < 1) { - // image is tall, i want to shrink radius vertical - blurScale = this.aspectRatio; - } - } - blur = blurScale * this.blur * 0.12; - if (this.horizontal) { - delta[0] = blur; - } - else { - delta[1] = blur; - } - return delta; - }, - }); - - /** - * Deserialize a JSON definition of a BlurFilter into a concrete instance. - */ - filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Gamma filter class - * @class fabric.Image.filters.Gamma - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Gamma({ - * gamma: [1, 0.5, 2.1] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Gamma', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec3 uGamma;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec3 correction = (1.0 / uGamma);\n' + - 'color.r = pow(color.r, correction.r);\n' + - 'color.g = pow(color.g, correction.g);\n' + - 'color.b = pow(color.b, correction.b);\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.rgb *= color.a;\n' + - '}', - - /** - * Gamma array value, from 0.01 to 2.2. - * @param {Array} gamma - * @default - */ - gamma: [1, 1, 1], - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'gamma', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.gamma = [1, 1, 1]; - filters.BaseFilter.prototype.initialize.call(this, options); - }, - - /** - * Apply the Gamma operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, data = imageData.data, - gamma = this.gamma, len = data.length, - rInv = 1 / gamma[0], gInv = 1 / gamma[1], - bInv = 1 / gamma[2], i; - - if (!this.rVals) { - // eslint-disable-next-line - this.rVals = new Uint8Array(256); - // eslint-disable-next-line - this.gVals = new Uint8Array(256); - // eslint-disable-next-line - this.bVals = new Uint8Array(256); - } - - // This is an optimization - pre-compute a look-up table for each color channel - // instead of performing these pow calls for each pixel in the image. - for (i = 0, len = 256; i < len; i++) { - this.rVals[i] = Math.pow(i / 255, rInv) * 255; - this.gVals[i] = Math.pow(i / 255, gInv) * 255; - this.bVals[i] = Math.pow(i / 255, bInv) * 255; - } - for (i = 0, len = data.length; i < len; i += 4) { - data[i] = this.rVals[data[i]]; - data[i + 1] = this.gVals[data[i + 1]]; - data[i + 2] = this.bVals[data[i + 2]]; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uGamma: gl.getUniformLocation(program, 'uGamma'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform3fv(uniformLocations.uGamma, this.gamma); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma - */ - fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * A container class that knows how to apply a sequence of filters to an input image. - */ - filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ { - - type: 'Composed', - - /** - * A non sparse array of filters to apply - */ - subFilters: [], - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.subFilters = this.subFilters.slice(0); - }, - - /** - * Apply this container's filters to the input image provided. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be applied. - */ - applyTo: function(options) { - options.passes += this.subFilters.length - 1; - this.subFilters.forEach(function(filter) { - filter.applyTo(options); - }); - }, - - /** - * Serialize this filter into JSON. - * - * @returns {Object} A JSON representation of this filter. - */ - toObject: function() { - return fabric.util.object.extend(this.callSuper('toObject'), { - subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }), - }); - }, - - isNeutralState: function() { - return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); }); - } - }); - - /** - * Deserialize a JSON definition of a ComposedFilter into a concrete instance. - */ - fabric.Image.filters.Composed.fromObject = function(object, callback) { - var filters = object.subFilters || [], - subFilters = filters.map(function(filter) { - return new fabric.Image.filters[filter.type](filter); - }), - instance = new fabric.Image.filters.Composed({ subFilters: subFilters }); - callback && callback(instance); - return instance; - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * HueRotation filter class - * @class fabric.Image.filters.HueRotation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.HueRotation({ - * rotation: -0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'HueRotation', - - /** - * HueRotation value, from -1 to 1. - * the unit is radians - * @param {Number} myParameter - * @default - */ - rotation: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'rotation', - - calculateMatrix: function() { - var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad), - aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos; - this.matrix = [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ]; - this.matrix[0] = cos + OneMinusCos / 3; - this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[6] = cos + aThird * OneMinusCos; - this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[12] = cos + aThird * OneMinusCos; - }, - - /** - * HueRotation isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function(options) { - this.calculateMatrix(); - return filters.BaseFilter.prototype.isNeutralState.call(this, options); - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - this.calculateMatrix(); - filters.BaseFilter.prototype.applyTo.call(this, options); - }, - - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation - */ - fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - clone = fabric.util.object.clone; - - if (fabric.Text) { - fabric.warn('fabric.Text is already defined'); - return; - } - - var additionalProps = - ('fontFamily fontWeight fontSize text underline overline linethrough' + - ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' + - ' direction path pathStartOffset pathSide').split(' '); - - /** - * Text class - * @class fabric.Text - * @extends fabric.Object - * @return {fabric.Text} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} - * @see {@link fabric.Text#initialize} for constructor definition - */ - fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ { - - /** - * Properties which when set cause object to change dimensions - * @type Array - * @private - */ - _dimensionAffectingProps: [ - 'fontSize', - 'fontWeight', - 'fontFamily', - 'fontStyle', - 'lineHeight', - 'text', - 'charSpacing', - 'textAlign', - 'styles', - 'path', - 'pathStartOffset', - 'pathSide' - ], - - /** - * @private - */ - _reNewline: /\r?\n/, - - /** - * Use this regular expression to filter for whitespaces that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpacesAndTabs: /[ \t\r]/g, - - /** - * Use this regular expression to filter for whitespace that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpaceAndTab: /[ \t\r]/, - - /** - * Use this regular expression to filter consecutive groups of non spaces. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reWords: /\S+/g, - - /** - * Type of an object - * @type String - * @default - */ - type: 'text', - - /** - * Font size (in pixels) - * @type Number - * @default - */ - fontSize: 40, - - /** - * Font weight (e.g. bold, normal, 400, 600, 800) - * @type {(Number|String)} - * @default - */ - fontWeight: 'normal', - - /** - * Font family - * @type String - * @default - */ - fontFamily: 'Times New Roman', - - /** - * Text decoration underline. - * @type Boolean - * @default - */ - underline: false, - - /** - * Text decoration overline. - * @type Boolean - * @default - */ - overline: false, - - /** - * Text decoration linethrough. - * @type Boolean - * @default - */ - linethrough: false, - - /** - * Text alignment. Possible values: "left", "center", "right", "justify", - * "justify-left", "justify-center" or "justify-right". - * @type String - * @default - */ - textAlign: 'left', - - /** - * Font style . Possible values: "", "normal", "italic" or "oblique". - * @type String - * @default - */ - fontStyle: 'normal', - - /** - * Line height - * @type Number - * @default - */ - lineHeight: 1.16, - - /** - * Superscript schema object (minimum overlap) - * @type {Object} - * @default - */ - superscript: { - size: 0.60, // fontSize factor - baseline: -0.35 // baseline-shift factor (upwards) - }, - - /** - * Subscript schema object (minimum overlap) - * @type {Object} - * @default - */ - subscript: { - size: 0.60, // fontSize factor - baseline: 0.11 // baseline-shift factor (downwards) - }, - - /** - * Background color of text lines - * @type String - * @default - */ - textBackgroundColor: '', - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps), - - /** - * List of properties to consider when checking if cache needs refresh - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps), - - /** - * When defined, an object is rendered via stroke and this property specifies its color. - * Backwards incompatibility note: This property was named "strokeStyle" until v1.1.6 - * @type String - * @default - */ - stroke: null, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property was named "textShadow" (String) until v1.2.11 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * fabric.Path that the text should follow. - * since 4.6.0 the path will be drawn automatically. - * if you want to make the path visible, give it a stroke and strokeWidth or fill value - * if you want it to be hidden, assign visible = false to the path. - * This feature is in BETA, and SVG import/export is not yet supported. - * @type fabric.Path - * @example - * var textPath = new fabric.Text('Text on a path', { - * top: 150, - * left: 150, - * textAlign: 'center', - * charSpacing: -50, - * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', { - * strokeWidth: 1, - * visible: false - * }), - * pathSide: 'left', - * pathStartOffset: 0 - * }); - * @default - */ - path: null, - - /** - * Offset amount for text path starting position - * Only used when text has a path - * @type Number - * @default - */ - pathStartOffset: 0, - - /** - * Which side of the path the text should be drawn on. - * Only used when text has a path - * @type {String} 'left|right' - * @default - */ - pathSide: 'left', - - /** - * @private - */ - _fontSizeFraction: 0.222, - - /** - * @private - */ - offsets: { - underline: 0.10, - linethrough: -0.315, - overline: -0.88 - }, - - /** - * Text Line proportion to font Size (in pixels) - * @type Number - * @default - */ - _fontSizeMult: 1.13, - - /** - * additional space between characters - * expressed in thousands of em unit - * @type Number - * @default - */ - charSpacing: 0, - - /** - * Object containing character styles - top-level properties -> line numbers, - * 2nd-level properties - character numbers - * @type Object - * @default - */ - styles: null, - - /** - * Reference to a context to measure text char or couple of chars - * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas - * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every - * text object created. - * @type {CanvasRenderingContext2D} - * @default - */ - _measuringContext: null, - - /** - * Baseline shift, styles only, keep at 0 for the main text object - * @type {Number} - * @default - */ - deltaY: 0, - - /** - * WARNING: EXPERIMENTAL. NOT SUPPORTED YET - * determine the direction of the text. - * This has to be set manually together with textAlign and originX for proper - * experience. - * some interesting link for the future - * https://www.w3.org/International/questions/qa-bidi-unicode-controls - * @since 4.5.0 - * @type {String} 'ltr|rtl' - * @default - */ - direction: 'ltr', - - /** - * Array of properties that define a style unit (of 'styles'). - * @type {Array} - * @default - */ - _styleProperties: [ - 'stroke', - 'strokeWidth', - 'fill', - 'fontFamily', - 'fontSize', - 'fontWeight', - 'fontStyle', - 'underline', - 'overline', - 'linethrough', - 'deltaY', - 'textBackgroundColor', - ], - - /** - * contains characters bounding boxes - */ - __charBounds: [], - - /** - * use this size when measuring text. To avoid IE11 rounding errors - * @type {Number} - * @default - * @readonly - * @private - */ - CACHE_FONT_SIZE: 400, - - /** - * contains the min text width to avoid getting 0 - * @type {Number} - * @default - */ - MIN_TEXT_WIDTH: 2, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - initialize: function(text, options) { - this.styles = options ? (options.styles || { }) : { }; - this.text = text; - this.__skipDimension = true; - this.callSuper('initialize', options); - if (this.path) { - this.setPathInfo(); - } - this.__skipDimension = false; - this.initDimensions(); - this.setCoords(); - this.setupState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * If text has a path, it will add the extra information needed - * for path and text calculations - * @return {fabric.Text} thisArg - */ - setPathInfo: function() { - var path = this.path; - if (path) { - path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path); - } - }, - - /** - * Return a context for measurement of text string. - * if created it gets stored for reuse - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - getMeasuringContext: function() { - // if we did not return we have to measure something. - if (!fabric._measuringContext) { - fabric._measuringContext = this.canvas && this.canvas.contextCache || - fabric.util.createCanvasElement().getContext('2d'); - } - return fabric._measuringContext; - }, - - /** - * @private - * Divides text into lines of text and lines of graphemes. - */ - _splitText: function() { - var newLines = this._splitTextIntoLines(this.text); - this.textLines = newLines.lines; - this._textLines = newLines.graphemeLines; - this._unwrappedTextLines = newLines._unwrappedLines; - this._text = newLines.graphemeText; - return newLines; - }, - - /** - * Initialize or update text dimensions. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this._splitText(); - this._clearCache(); - if (this.path) { - this.width = this.path.width; - this.height = this.path.height; - } - else { - this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH; - this.height = this.calcTextHeight(); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Enlarge space boxes and shift the others - */ - enlargeSpaces: function() { - var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) { - continue; - } - accumulatedSpace = 0; - line = this._textLines[i]; - currentLineWidth = this.getLineWidth(i); - if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) { - numberOfSpaces = spaces.length; - diffSpace = (this.width - currentLineWidth) / numberOfSpaces; - for (var j = 0, jlen = line.length; j <= jlen; j++) { - charBound = this.__charBounds[i][j]; - if (this._reSpaceAndTab.test(line[j])) { - charBound.width += diffSpace; - charBound.kernedWidth += diffSpace; - charBound.left += accumulatedSpace; - accumulatedSpace += diffSpace; - } - else { - charBound.left += accumulatedSpace; - } - } - } - } - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - return lineIndex === this._textLines.length - 1; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * It return always for text and Itext. - * @return Number - */ - missingNewlineOffset: function() { - return 1; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of text object - */ - toString: function() { - return '#'; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @param {Object} dim.x width of object to be cached - * @param {Object} dim.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var dims = this.callSuper('_getCacheCanvasDimensions'); - var fontSize = this.fontSize; - dims.width += fontSize * dims.zoomX; - dims.height += fontSize * dims.zoomY; - return dims; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - var path = this.path; - path && !path.isNotVisible() && path._render(ctx); - this._setTextStyles(ctx); - this._renderTextLinesBackground(ctx); - this._renderTextDecoration(ctx, 'underline'); - this._renderText(ctx); - this._renderTextDecoration(ctx, 'overline'); - this._renderTextDecoration(ctx, 'linethrough'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderText: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderTextStroke(ctx); - this._renderTextFill(ctx); - } - else { - this._renderTextFill(ctx); - this._renderTextStroke(ctx); - } - }, - - /** - * Set the font parameter of the context with the object properties or with charStyle - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [charStyle] object with font style properties - * @param {String} [charStyle.fontFamily] Font Family - * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix ) - * @param {String} [charStyle.fontWeight] Font weight - * @param {String} [charStyle.fontStyle] Font style (italic|normal) - */ - _setTextStyles: function(ctx, charStyle, forMeasuring) { - ctx.textBaseline = 'alphabetic'; - ctx.font = this._getFontDeclaration(charStyle, forMeasuring); - }, - - /** - * calculate and return the text Width measuring each line. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @return {Number} Maximum width of fabric.Text object - */ - calcTextWidth: function() { - var maxWidth = this.getLineWidth(0); - - for (var i = 1, len = this._textLines.length; i < len; i++) { - var currentLineWidth = this.getLineWidth(i); - if (currentLineWidth > maxWidth) { - maxWidth = currentLineWidth; - } - } - return maxWidth; - }, - - /** - * @private - * @param {String} method Method name ("fillText" or "strokeText") - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} line Text to render - * @param {Number} left Left position of text - * @param {Number} top Top position of text - * @param {Number} lineIndex Index of a line in a text - */ - _renderTextLine: function(method, ctx, line, left, top, lineIndex) { - this._renderChars(method, ctx, line, left, top, lineIndex); - }, - - /** - * Renders the text background for lines, taking care of style - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextLinesBackground: function(ctx) { - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) { - return; - } - var heightOfLine, - lineLeftOffset, originalFill = ctx.fillStyle, - line, lastColor, - leftOffset = this._getLeftOffset(), - lineTopOffset = this._getTopOffset(), - boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path, - drawStart; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) { - lineTopOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - lineLeftOffset = this._getLineLeftOffset(i); - boxWidth = 0; - boxStart = 0; - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillStyle = currentColor; - currentColor && ctx.fillRect( - -charBox.width / 2, - -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction), - charBox.width, - heightOfLine / this.lineHeight - ); - ctx.restore(); - } - else if (currentColor !== lastColor) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = lastColor; - lastColor && ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - if (currentColor && !path) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentColor; - ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - } - lineTopOffset += heightOfLine; - } - ctx.fillStyle = originalFill; - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {Object} decl style declaration for cache - * @param {String} decl.fontFamily fontFamily - * @param {String} decl.fontStyle fontStyle - * @param {String} decl.fontWeight fontWeight - * @return {Object} reference to cache - */ - getFontCache: function(decl) { - var fontFamily = decl.fontFamily.toLowerCase(); - if (!fabric.charWidthsCache[fontFamily]) { - fabric.charWidthsCache[fontFamily] = { }; - } - var cache = fabric.charWidthsCache[fontFamily], - cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase(); - if (!cache[cacheProp]) { - cache[cacheProp] = { }; - } - return cache[cacheProp]; - }, - - /** - * measure and return the width of a single character. - * possibly overridden to accommodate different measure logic or - * to hook some external lib for character measurement - * @private - * @param {String} _char, char to be measured - * @param {Object} charStyle style of char to be measured - * @param {String} [previousChar] previous char - * @param {Object} [prevCharStyle] style of previous char - */ - _measureChar: function(_char, charStyle, previousChar, prevCharStyle) { - // first i try to return from cache - var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle), - previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char, - stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth, - fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth; - - if (previousChar && fontCache[previousChar] !== undefined) { - previousWidth = fontCache[previousChar]; - } - if (fontCache[_char] !== undefined) { - kernedWidth = width = fontCache[_char]; - } - if (stylesAreEqual && fontCache[couple] !== undefined) { - coupleWidth = fontCache[couple]; - kernedWidth = coupleWidth - previousWidth; - } - if (width === undefined || previousWidth === undefined || coupleWidth === undefined) { - var ctx = this.getMeasuringContext(); - // send a TRUE to specify measuring font size CACHE_FONT_SIZE - this._setTextStyles(ctx, charStyle, true); - } - if (width === undefined) { - kernedWidth = width = ctx.measureText(_char).width; - fontCache[_char] = width; - } - if (previousWidth === undefined && stylesAreEqual && previousChar) { - previousWidth = ctx.measureText(previousChar).width; - fontCache[previousChar] = previousWidth; - } - if (stylesAreEqual && coupleWidth === undefined) { - // we can measure the kerning couple and subtract the width of the previous character - coupleWidth = ctx.measureText(couple).width; - fontCache[couple] = coupleWidth; - kernedWidth = coupleWidth - previousWidth; - } - return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier }; - }, - - /** - * Computes height of character at given position - * @param {Number} line the line index number - * @param {Number} _char the character index number - * @return {Number} fontSize of the character - */ - getHeightOfChar: function(line, _char) { - return this.getValueOfPropertyAt(line, _char, 'fontSize'); - }, - - /** - * measure a text line measuring all characters. - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - measureLine: function(lineIndex) { - var lineInfo = this._measureLine(lineIndex); - if (this.charSpacing !== 0) { - lineInfo.width -= this._getWidthOfCharSpacing(); - } - if (lineInfo.width < 0) { - lineInfo.width = 0; - } - return lineInfo; - }, - - /** - * measure every grapheme of a line, populating __charBounds - * @param {Number} lineIndex - * @return {Object} object.width total width of characters - * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs - */ - _measureLine: function(lineIndex) { - var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme, - graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length), - positionInPath = 0, startingPoint, totalPathLength, path = this.path, - reverse = this.pathSide === 'right'; - - this.__charBounds[lineIndex] = lineBounds; - for (i = 0; i < line.length; i++) { - grapheme = line[i]; - graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme); - lineBounds[i] = graphemeInfo; - width += graphemeInfo.kernedWidth; - prevGrapheme = grapheme; - } - // this latest bound box represent the last character of the line - // to simplify cursor handling in interactive mode. - lineBounds[i] = { - left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0, - width: 0, - kernedWidth: 0, - height: this.fontSize - }; - if (path) { - totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length; - startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo); - startingPoint.x += path.pathOffset.x; - startingPoint.y += path.pathOffset.y; - switch (this.textAlign) { - case 'left': - positionInPath = reverse ? (totalPathLength - width) : 0; - break; - case 'center': - positionInPath = (totalPathLength - width) / 2; - break; - case 'right': - positionInPath = reverse ? 0 : (totalPathLength - width); - break; - //todo - add support for justify - } - positionInPath += this.pathStartOffset * (reverse ? -1 : 1); - for (i = reverse ? line.length - 1 : 0; - reverse ? i >= 0 : i < line.length; - reverse ? i-- : i++) { - graphemeInfo = lineBounds[i]; - if (positionInPath > totalPathLength) { - positionInPath %= totalPathLength; - } - else if (positionInPath < 0) { - positionInPath += totalPathLength; - } - // it would probably much faster to send all the grapheme position for a line - // and calculate path position/angle at once. - this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint); - positionInPath += graphemeInfo.kernedWidth; - } - } - return { width: width, numOfSpaces: numOfSpaces }; - }, - - /** - * Calculate the angle and the left,top position of the char that follow a path. - * It appends it to graphemeInfo to be reused later at rendering - * @private - * @param {Number} positionInPath to be measured - * @param {Object} graphemeInfo current grapheme box information - * @param {Object} startingPoint position of the point - */ - _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) { - var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2, - path = this.path; - - // we are at currentPositionOnPath. we want to know what point on the path is. - var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo); - graphemeInfo.renderLeft = info.x - startingPoint.x; - graphemeInfo.renderTop = info.y - startingPoint.y; - graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0); - }, - - /** - * Measure and return the info of a single grapheme. - * needs the the info of previous graphemes already filled - * @private - * @param {String} grapheme to be measured - * @param {Number} lineIndex index of the line where the char is - * @param {Number} charIndex position in the line - * @param {String} [prevGrapheme] character preceding the one to be measured - */ - _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) { - var style = this.getCompleteStyleDeclaration(lineIndex, charIndex), - prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { }, - info = this._measureChar(grapheme, style, prevGrapheme, prevStyle), - kernedWidth = info.kernedWidth, - width = info.width, charSpacing; - - if (this.charSpacing !== 0) { - charSpacing = this._getWidthOfCharSpacing(); - width += charSpacing; - kernedWidth += charSpacing; - } - - var box = { - width: width, - left: 0, - height: style.fontSize, - kernedWidth: kernedWidth, - deltaY: style.deltaY, - }; - if (charIndex > 0 && !skipLeft) { - var previousBox = this.__charBounds[lineIndex][charIndex - 1]; - box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width; - } - return box; - }, - - /** - * Calculate height of line at 'lineIndex' - * @param {Number} lineIndex index of line to calculate - * @return {Number} - */ - getHeightOfLine: function(lineIndex) { - if (this.__lineHeights[lineIndex]) { - return this.__lineHeights[lineIndex]; - } - - var line = this._textLines[lineIndex], - // char 0 is measured before the line cycle because it nneds to char - // emptylines - maxHeight = this.getHeightOfChar(lineIndex, 0); - for (var i = 1, len = line.length; i < len; i++) { - maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight); - } - - return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult; - }, - - /** - * Calculate text box height - */ - calcTextHeight: function() { - var lineHeight, height = 0; - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineHeight = this.getHeightOfLine(i); - height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight); - } - return height; - }, - - /** - * @private - * @return {Number} Left offset - */ - _getLeftOffset: function() { - return this.direction === 'ltr' ? -this.width / 2 : this.width / 2; - }, - - /** - * @private - * @return {Number} Top offset - */ - _getTopOffset: function() { - return -this.height / 2; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} method Method name ("fillText" or "strokeText") - */ - _renderTextCommon: function(ctx, method) { - ctx.save(); - var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(); - for (var i = 0, len = this._textLines.length; i < len; i++) { - var heightOfLine = this.getHeightOfLine(i), - maxHeight = heightOfLine / this.lineHeight, - leftOffset = this._getLineLeftOffset(i); - this._renderTextLine( - method, - ctx, - this._textLines[i], - left + leftOffset, - top + lineHeights + maxHeight, - i - ); - lineHeights += heightOfLine; - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextFill: function(ctx) { - if (!this.fill && !this.styleHas('fill')) { - return; - } - - this._renderTextCommon(ctx, 'fillText'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextStroke: function(ctx) { - if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - this._setLineDash(ctx, this.strokeDashArray); - ctx.beginPath(); - this._renderTextCommon(ctx, 'strokeText'); - ctx.closePath(); - ctx.restore(); - }, - - /** - * @private - * @param {String} method fillText or strokeText. - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Array} line Content of the line, splitted in an array by grapheme - * @param {Number} left - * @param {Number} top - * @param {Number} lineIndex - */ - _renderChars: function(method, ctx, line, left, top, lineIndex) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, - boxWidth = 0, - timeToRender, - path = this.path, - shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path, - isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1, - drawingLeft; - - ctx.save(); - top -= lineHeight * this._fontSizeFraction / this.lineHeight; - if (shortCut) { - // render all the line in one pass without checking - // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex); - ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); - ctx.direction = isLtr ? 'ltr' : 'rtl'; - ctx.textAlign = isLtr ? 'left' : 'right'; - this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight); - ctx.restore(); - return; - } - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing || path; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - left += sign * (charBox.kernedWidth - charBox.width); - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChanged(actualStyle, nextStyle); - } - if (timeToRender) { - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight); - ctx.restore(); - } - else { - drawingLeft = left; - ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); - ctx.direction = isLtr ? 'ltr' : 'rtl'; - ctx.textAlign = isLtr ? 'left' : 'right'; - this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight); - } - charsToRender = ''; - actualStyle = nextStyle; - left += sign * boxWidth; - boxWidth = 0; - } - } - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {fabric.Gradient} filler a fabric gradient instance - * @return {CanvasPattern} a pattern to use as fill/stroke style - */ - _applyPatternGradientTransformText: function(filler) { - var pCanvas = fabric.util.createCanvasElement(), pCtx, - // TODO: verify compatibility with strokeUniform - width = this.width + this.strokeWidth, height = this.height + this.strokeWidth; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.fillStyle = filler.toLive(pCtx); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fill(); - return pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - handleFiller: function(ctx, property, filler) { - var offsetX, offsetY; - if (filler.toLive) { - if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - offsetX = -this.width / 2; - offsetY = -this.height / 2; - ctx.translate(offsetX, offsetY); - ctx[property] = this._applyPatternGradientTransformText(filler); - return { offsetX: offsetX, offsetY: offsetY }; - } - else { - // is a simple gradient or pattern - ctx[property] = filler.toLive(ctx, this); - return this._applyPatternGradientTransform(ctx, filler); - } - } - else { - // is a color - ctx[property] = filler; - } - return { offsetX: 0, offsetY: 0 }; - }, - - _setStrokeStyles: function(ctx, decl) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = this.strokeLineCap; - ctx.lineDashOffset = this.strokeDashOffset; - ctx.lineJoin = this.strokeLineJoin; - ctx.miterLimit = this.strokeMiterLimit; - return this.handleFiller(ctx, 'strokeStyle', decl.stroke); - }, - - _setFillStyles: function(ctx, decl) { - return this.handleFiller(ctx, 'fillStyle', decl.fill); - }, - - /** - * @private - * @param {String} method - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {String} _char - * @param {Number} left Left coordinate - * @param {Number} top Top coordinate - * @param {Number} lineHeight Height of the line - */ - _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) { - var decl = this._getStyleDeclaration(lineIndex, charIndex), - fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex), - shouldFill = method === 'fillText' && fullDecl.fill, - shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth, - fillOffsets, strokeOffsets; - - if (!shouldStroke && !shouldFill) { - return; - } - ctx.save(); - - shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl)); - shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl)); - - ctx.font = this._getFontDeclaration(fullDecl); - - - if (decl && decl.textBackgroundColor) { - this._removeShadow(ctx); - } - if (decl && decl.deltaY) { - top += decl.deltaY; - } - shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY); - shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY); - ctx.restore(); - }, - - /** - * Turns the character into a 'superior figure' (i.e. 'superscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSuperscript: function(start, end) { - return this._setScript(start, end, this.superscript); - }, - - /** - * Turns the character into an 'inferior figure' (i.e. 'subscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSubscript: function(start, end) { - return this._setScript(start, end, this.subscript); - }, - - /** - * Applies 'schema' at given position - * @private - * @param {Number} start selection start - * @param {Number} end selection end - * @param {Number} schema - * @returns {fabric.Text} thisArg - * @chainable - */ - _setScript: function(start, end, schema) { - var loc = this.get2DCursorLocation(start, true), - fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'), - dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'), - style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline }; - this.setSelectionStyles(style, start, end); - return this; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChanged: function(prevStyle, thisStyle) { - return prevStyle.fill !== thisStyle.fill || - prevStyle.stroke !== thisStyle.stroke || - prevStyle.strokeWidth !== thisStyle.strokeWidth || - prevStyle.fontSize !== thisStyle.fontSize || - prevStyle.fontFamily !== thisStyle.fontFamily || - prevStyle.fontWeight !== thisStyle.fontWeight || - prevStyle.fontStyle !== thisStyle.fontStyle || - prevStyle.deltaY !== thisStyle.deltaY; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChangedForSvg: function(prevStyle, thisStyle) { - return this._hasStyleChanged(prevStyle, thisStyle) || - prevStyle.overline !== thisStyle.overline || - prevStyle.underline !== thisStyle.underline || - prevStyle.linethrough !== thisStyle.linethrough; - }, - - /** - * @private - * @param {Number} lineIndex index text line - * @return {Number} Line left offset - */ - _getLineLeftOffset: function(lineIndex) { - var lineWidth = this.getLineWidth(lineIndex), - lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction, - isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex); - if (textAlign === 'justify' - || (textAlign === 'justify-center' && !isEndOfWrapping) - || (textAlign === 'justify-right' && !isEndOfWrapping) - || (textAlign === 'justify-left' && !isEndOfWrapping) - ) { - return 0; - } - if (textAlign === 'center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'right') { - leftOffset = lineDiff; - } - if (textAlign === 'justify-center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'justify-right') { - leftOffset = lineDiff; - } - if (direction === 'rtl') { - leftOffset -= lineDiff; - } - return leftOffset; - }, - - /** - * @private - */ - _clearCache: function() { - this.__lineWidths = []; - this.__lineHeights = []; - this.__charBounds = []; - }, - - /** - * @private - */ - _shouldClearDimensionCache: function() { - var shouldClear = this._forceClearCache; - shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps')); - if (shouldClear) { - this.dirty = true; - this._forceClearCache = false; - } - return shouldClear; - }, - - /** - * Measure a single line given its index. Used to calculate the initial - * text bounding box. The values are calculated and stored in __lineWidths cache. - * @private - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - getLineWidth: function(lineIndex) { - if (this.__lineWidths[lineIndex]) { - return this.__lineWidths[lineIndex]; - } - - var width, line = this._textLines[lineIndex], lineInfo; - - if (line === '') { - width = 0; - } - else { - lineInfo = this.measureLine(lineIndex); - width = lineInfo.width; - } - this.__lineWidths[lineIndex] = width; - return width; - }, - - _getWidthOfCharSpacing: function() { - if (this.charSpacing !== 0) { - return this.fontSize * this.charSpacing / 1000; - } - return 0; - }, - - /** - * Retrieves the value of property at given character position - * @param {Number} lineIndex the line number - * @param {Number} charIndex the character number - * @param {String} property the property name - * @returns the value of 'property' - */ - getValueOfPropertyAt: function(lineIndex, charIndex, property) { - var charStyle = this._getStyleDeclaration(lineIndex, charIndex); - if (charStyle && typeof charStyle[property] !== 'undefined') { - return charStyle[property]; - } - return this[property]; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextDecoration: function(ctx, type) { - if (!this[type] && !this.styleHas(type)) { - return; - } - var heightOfLine, size, _size, - lineLeftOffset, dy, _dy, - line, lastDecoration, - leftOffset = this._getLeftOffset(), - topOffset = this._getTopOffset(), top, - boxStart, boxWidth, charBox, currentDecoration, - maxHeight, currentFill, lastFill, path = this.path, - charSpacing = this._getWidthOfCharSpacing(), - offsetY = this.offsets[type]; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this[type] && !this.styleHas(type, i)) { - topOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - maxHeight = heightOfLine / this.lineHeight; - lineLeftOffset = this._getLineLeftOffset(i); - boxStart = 0; - boxWidth = 0; - lastDecoration = this.getValueOfPropertyAt(i, 0, type); - lastFill = this.getValueOfPropertyAt(i, 0, 'fill'); - top = topOffset + maxHeight * (1 - this._fontSizeFraction); - size = this.getHeightOfChar(i, 0); - dy = this.getValueOfPropertyAt(i, 0, 'deltaY'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentDecoration = this.getValueOfPropertyAt(i, j, type); - currentFill = this.getValueOfPropertyAt(i, j, 'fill'); - _size = this.getHeightOfChar(i, j); - _dy = this.getValueOfPropertyAt(i, j, 'deltaY'); - if (path && currentDecoration && currentFill) { - ctx.save(); - ctx.fillStyle = lastFill; - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillRect( - -charBox.kernedWidth / 2, - offsetY * _size + _dy, - charBox.kernedWidth, - this.fontSize / 15 - ); - ctx.restore(); - } - else if ( - (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) - && boxWidth > 0 - ) { - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - if (lastDecoration && lastFill) { - ctx.fillStyle = lastFill; - ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth, - this.fontSize / 15 - ); - } - boxStart = charBox.left; - boxWidth = charBox.width; - lastDecoration = currentDecoration; - lastFill = currentFill; - size = _size; - dy = _dy; - } - else { - boxWidth += charBox.kernedWidth; - } - } - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentFill; - currentDecoration && currentFill && ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth - charSpacing, - this.fontSize / 15 - ); - topOffset += heightOfLine; - } - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * return font declaration string for canvas context - * @param {Object} [styleObject] object - * @returns {String} font declaration formatted for canvas context. - */ - _getFontDeclaration: function(styleObject, forMeasuring) { - var style = styleObject || this, family = this.fontFamily, - fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1; - var fontFamily = family === undefined || - family.indexOf('\'') > -1 || family.indexOf(',') > -1 || - family.indexOf('"') > -1 || fontIsGeneric - ? style.fontFamily : '"' + style.fontFamily + '"'; - return [ - // node-canvas needs "weight style", while browsers need "style weight" - // verify if this can be fixed in JSDOM - (fabric.isLikelyNode ? style.fontWeight : style.fontStyle), - (fabric.isLikelyNode ? style.fontStyle : style.fontWeight), - forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px', - fontFamily - ].join(' '); - }, - - /** - * Renders text instance on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if object is not visible - if (!this.visible) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - } - this.callSuper('render', ctx); - }, - - /** - * Returns the text as an array of lines. - * @param {String} text text to split - * @returns {Array} Lines in the text - */ - _splitTextIntoLines: function(text) { - var lines = text.split(this._reNewline), - newLines = new Array(lines.length), - newLine = ['\n'], - newText = []; - for (var i = 0; i < lines.length; i++) { - newLines[i] = fabric.util.string.graphemeSplit(lines[i]); - newText = newText.concat(newLines[i], newLine); - } - newText.pop(); - return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var allProperties = additionalProps.concat(propertiesToInclude); - var obj = this.callSuper('toObject', allProperties); - // styles will be overridden with a properly cloned structure - obj.styles = clone(this.styles, true); - if (obj.path) { - obj.path = this.path.toObject(); - } - return obj; - }, - - /** - * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. - * @param {String|Object} key Property name or object (if object, iterate over the object properties) - * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) - * @return {fabric.Object} thisArg - * @chainable - */ - set: function(key, value) { - this.callSuper('set', key, value); - var needsDims = false; - var isAddingPath = false; - if (typeof key === 'object') { - for (var _key in key) { - if (_key === 'path') { - this.setPathInfo(); - } - needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1; - isAddingPath = isAddingPath || _key === 'path'; - } - } - else { - needsDims = this._dimensionAffectingProps.indexOf(key) !== -1; - isAddingPath = key === 'path'; - } - if (isAddingPath) { - this.setPathInfo(); - } - if (needsDims) { - this.initDimensions(); - this.setCoords(); - } - return this; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement}) - * @static - * @memberOf fabric.Text - * @see: http://www.w3.org/TR/SVG/text.html#TextElement - */ - fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat( - 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' ')); - - /** - * Default SVG font size - * @static - * @memberOf fabric.Text - */ - fabric.Text.DEFAULT_SVG_FONT_SIZE = 16; - - /** - * Returns fabric.Text instance from an SVG element (not yet implemented) - * @static - * @memberOf fabric.Text - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Text.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - - var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES), - parsedAnchor = parsedAttributes.textAnchor || 'left'; - options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes); - - options.top = options.top || 0; - options.left = options.left || 0; - if (parsedAttributes.textDecoration) { - var textDecoration = parsedAttributes.textDecoration; - if (textDecoration.indexOf('underline') !== -1) { - options.underline = true; - } - if (textDecoration.indexOf('overline') !== -1) { - options.overline = true; - } - if (textDecoration.indexOf('line-through') !== -1) { - options.linethrough = true; - } - delete options.textDecoration; - } - if ('dx' in parsedAttributes) { - options.left += parsedAttributes.dx; - } - if ('dy' in parsedAttributes) { - options.top += parsedAttributes.dy; - } - if (!('fontSize' in options)) { - options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; - } - - var textContent = ''; - - // The XML is not properly parsed in IE9 so a workaround to get - // textContent is through firstChild.data. Another workaround would be - // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does) - if (!('textContent' in element)) { - if ('firstChild' in element && element.firstChild !== null) { - if ('data' in element.firstChild && element.firstChild.data !== null) { - textContent = element.firstChild.data; - } - } - } - else { - textContent = element.textContent; - } - - textContent = textContent.replace(/^\s+|\s+$|\n+/g, '').replace(/\s+/g, ' '); - var originalStrokeWidth = options.strokeWidth; - options.strokeWidth = 0; - - var text = new fabric.Text(textContent, options), - textHeightScaleFactor = text.getScaledHeight() / text.height, - lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height, - scaledDiff = lineHeightDiff * textHeightScaleFactor, - textHeight = text.getScaledHeight() + scaledDiff, - offX = 0; - /* - Adjust positioning: - x/y attributes in SVG correspond to the bottom-left corner of text bounding box - fabric output by default at top, left. - */ - if (parsedAnchor === 'center') { - offX = text.getScaledWidth() / 2; - } - if (parsedAnchor === 'right') { - offX = text.getScaledWidth(); - } - text.set({ - left: text.left - offX, - top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight, - strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1, - }); - callback(text); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Text instance from an object representation - * @static - * @memberOf fabric.Text - * @param {Object} object plain js Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created - */ - fabric.Text.fromObject = function(object, callback) { - var objectCopy = clone(object), path = object.path; - delete objectCopy.path; - return fabric.Object._fromObject('Text', objectCopy, function(textInstance) { - if (path) { - fabric.Object._fromObject('Path', path, function(pathInstance) { - textInstance.set('path', pathInstance); - callback(textInstance); - }, 'path'); - } - else { - callback(textInstance); - } - }, 'text'); - }; - - fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace']; - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text); - -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return true; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - return true; - }, - - /** - * Returns true if object has a style property or has it ina specified line - * This function is used to detect if a text will use a particular property or not. - * @param {String} property to check for - * @param {Number} lineIndex to check the style on - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (!this.styles || !property || property === '') { - return false; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return false; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] }; - // eslint-disable-next-line - for (var p1 in obj) { - // eslint-disable-next-line - for (var p2 in obj[p1]) { - if (typeof obj[p1][p2][property] !== 'undefined') { - return true; - } - } - } - return false; - }, - - /** - * Check if characters in a text have a value for a property - * whose value matches the textbox's value for that property. If so, - * the character-level property is deleted. If the character - * has no other properties, then it is also deleted. Finally, - * if the line containing that character has no other characters - * then it also is deleted. - * - * @param {string} property The property to compare between characters and text. - */ - cleanStyle: function(property) { - if (!this.styles || !property || property === '') { - return false; - } - var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue, - allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject; - // eslint-disable-next-line - for (var p1 in obj) { - letterCount = 0; - // eslint-disable-next-line - for (var p2 in obj[p1]) { - var styleObject = obj[p1][p2], - stylePropertyHasBeenSet = styleObject.hasOwnProperty(property); - - stylesCount++; - - if (stylePropertyHasBeenSet) { - if (!stylePropertyValue) { - stylePropertyValue = styleObject[property]; - } - else if (styleObject[property] !== stylePropertyValue) { - allStyleObjectPropertiesMatch = false; - } - - if (styleObject[property] === this[property]) { - delete styleObject[property]; - } - } - else { - allStyleObjectPropertiesMatch = false; - } - - if (Object.keys(styleObject).length !== 0) { - letterCount++; - } - else { - delete obj[p1][p2]; - } - } - - if (letterCount === 0) { - delete obj[p1]; - } - } - // if every grapheme has the same style set then - // delete those styles and set it on the parent - for (var i = 0; i < this._textLines.length; i++) { - graphemeCount += this._textLines[i].length; - } - if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) { - this[property] = stylePropertyValue; - this.removeStyle(property); - } - }, - - /** - * Remove a style property or properties from all individual character styles - * in a text object. Deletes the character style object if it contains no other style - * props. Deletes a line style object if it contains no other character styles. - * - * @param {String} props The property to remove from character styles. - */ - removeStyle: function(property) { - if (!this.styles || !property || property === '') { - return; - } - var obj = this.styles, line, lineNum, charNum; - for (lineNum in obj) { - line = obj[lineNum]; - for (charNum in line) { - delete line[charNum][property]; - if (Object.keys(line[charNum]).length === 0) { - delete line[charNum]; - } - } - if (Object.keys(line).length === 0) { - delete obj[lineNum]; - } - } - }, - - /** - * @private - */ - _extendStyles: function(index, styles) { - var loc = this.get2DCursorLocation(index); - - if (!this._getLineStyle(loc.lineIndex)) { - this._setLineStyle(loc.lineIndex); - } - - if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) { - this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {}); - } - - fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles); - }, - - /** - * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start) - * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used. - * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles. - */ - get2DCursorLocation: function(selectionStart, skipWrapping) { - if (typeof selectionStart === 'undefined') { - selectionStart = this.selectionStart; - } - var lines = skipWrapping ? this._unwrappedTextLines : this._textLines, - len = lines.length; - for (var i = 0; i < len; i++) { - if (selectionStart <= lines[i].length) { - return { - lineIndex: i, - charIndex: selectionStart - }; - } - selectionStart -= lines[i].length + this.missingNewlineOffset(i); - } - return { - lineIndex: i - 1, - charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart - }; - }, - - /** - * Gets style of a current selection/cursor (at the start position) - * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used. - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @param {Boolean} [complete] get full style or not - * @return {Array} styles an array with one, zero or more Style objects - */ - getSelectionStyles: function(startIndex, endIndex, complete) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - var styles = []; - for (var i = startIndex; i < endIndex; i++) { - styles.push(this.getStyleAtPosition(i, complete)); - } - return styles; - }, - - /** - * Gets style of a current selection/cursor position - * @param {Number} position to get styles at - * @param {Boolean} [complete] full style if true - * @return {Object} style Style object at a specified index - * @private - */ - getStyleAtPosition: function(position, complete) { - var loc = this.get2DCursorLocation(position), - style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) : - this._getStyleDeclaration(loc.lineIndex, loc.charIndex); - return style || {}; - }, - - /** - * Sets style of a current selection, if no selection exist, do not set anything. - * @param {Object} [styles] Styles object - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @return {fabric.IText} thisArg - * @chainable - */ - setSelectionStyles: function(styles, startIndex, endIndex) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - for (var i = startIndex; i < endIndex; i++) { - this._extendStyles(i, styles); - } - /* not included in _extendStyles to avoid clearing cache more than once */ - this._forceClearCache = true; - return this; - }, - - /** - * get the reference, not a clone, of the style object for a given character - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Object} style object - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - var lineStyle = this.styles && this.styles[lineIndex]; - if (!lineStyle) { - return null; - } - return lineStyle[charIndex]; - }, - - /** - * return a new object that contains all the style property for a character - * the object returned is newly created - * @param {Number} lineIndex of the line where the character is - * @param {Number} charIndex position of the character on the line - * @return {Object} style object - */ - getCompleteStyleDeclaration: function(lineIndex, charIndex) { - var style = this._getStyleDeclaration(lineIndex, charIndex) || { }, - styleObject = { }, prop; - for (var i = 0; i < this._styleProperties.length; i++) { - prop = this._styleProperties[i]; - styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop]; - } - return styleObject; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - this.styles[lineIndex][charIndex] = style; - }, - - /** - * - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - delete this.styles[lineIndex][charIndex]; - }, - - /** - * @param {Number} lineIndex - * @return {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - return !!this.styles[lineIndex]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @private - */ - _setLineStyle: function(lineIndex) { - this.styles[lineIndex] = {}; - }, - - /** - * @param {Number} lineIndex - * @private - */ - _deleteLineStyle: function(lineIndex) { - delete this.styles[lineIndex]; - } - }); -})(); - - -(function() { - - function parseDecoration(object) { - if (object.textDecoration) { - object.textDecoration.indexOf('underline') > -1 && (object.underline = true); - object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true); - object.textDecoration.indexOf('overline') > -1 && (object.overline = true); - delete object.textDecoration; - } - } - - /** - * IText class (introduced in v1.4) Events are also fired with "text:" - * prefix when observing canvas. - * @class fabric.IText - * @extends fabric.Text - * @mixes fabric.Observable - * - * @fires changed - * @fires selection:changed - * @fires editing:entered - * @fires editing:exited - * - * @return {fabric.IText} thisArg - * @see {@link fabric.IText#initialize} for constructor definition - * - *

    Supported key combinations:

    - *
    -   *   Move cursor:                    left, right, up, down
    -   *   Select character:               shift + left, shift + right
    -   *   Select text vertically:         shift + up, shift + down
    -   *   Move cursor by word:            alt + left, alt + right
    -   *   Select words:                   shift + alt + left, shift + alt + right
    -   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end
    -   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end
    -   *   Jump to start/end of text:      cmd + up, cmd + down
    -   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown
    -   *   Delete character:               backspace
    -   *   Delete word:                    alt + backspace
    -   *   Delete line:                    cmd + backspace
    -   *   Forward delete:                 delete
    -   *   Copy text:                      ctrl/cmd + c
    -   *   Paste text:                     ctrl/cmd + v
    -   *   Cut text:                       ctrl/cmd + x
    -   *   Select entire text:             ctrl/cmd + a
    -   *   Quit editing                    tab or esc
    -   * 
    - * - *

    Supported mouse/touch combination

    - *
    -   *   Position cursor:                click/touch
    -   *   Create selection:               click/touch & drag
    -   *   Create selection:               click & shift + click
    -   *   Select word:                    double click
    -   *   Select line:                    triple click
    -   * 
    - */ - fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'i-text', - - /** - * Index where text selection starts (or where cursor is when there is no selection) - * @type Number - * @default - */ - selectionStart: 0, - - /** - * Index where text selection ends - * @type Number - * @default - */ - selectionEnd: 0, - - /** - * Color of text selection - * @type String - * @default - */ - selectionColor: 'rgba(17,119,255,0.3)', - - /** - * Indicates whether text is in editing mode - * @type Boolean - * @default - */ - isEditing: false, - - /** - * Indicates whether a text can be edited - * @type Boolean - * @default - */ - editable: true, - - /** - * Border color of text object while it's in editing mode - * @type String - * @default - */ - editingBorderColor: 'rgba(102,153,255,0.25)', - - /** - * Width of cursor (in px) - * @type Number - * @default - */ - cursorWidth: 2, - - /** - * Color of text cursor color in editing mode. - * if not set (default) will take color from the text. - * if set to a color value that fabric can understand, it will - * be used instead of the color of the text at the current position. - * @type String - * @default - */ - cursorColor: '', - - /** - * Delay between cursor blink (in ms) - * @type Number - * @default - */ - cursorDelay: 1000, - - /** - * Duration of cursor fadein (in ms) - * @type Number - * @default - */ - cursorDuration: 600, - - /** - * Indicates whether internal text char widths can be cached - * @type Boolean - * @default - */ - caching: true, - - /** - * DOM container to append the hiddenTextarea. - * An alternative to attaching to the document.body. - * Useful to reduce laggish redraw of the full document.body tree and - * also with modals event capturing that won't let the textarea take focus. - * @type HTMLElement - * @default - */ - hiddenTextareaContainer: null, - - /** - * @private - */ - _reSpace: /\s|\n/, - - /** - * @private - */ - _currentCursorOpacity: 0, - - /** - * @private - */ - _selectionDirection: null, - - /** - * @private - */ - _abortCursorAnimation: false, - - /** - * @private - */ - __widthOfSpace: [], - - /** - * Helps determining when the text is in composition, so that the cursor - * rendering is altered. - */ - inCompositionMode: false, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.IText} thisArg - */ - initialize: function(text, options) { - this.callSuper('initialize', text, options); - this.initBehavior(); - }, - - /** - * Sets selection start (left boundary of a selection) - * @param {Number} index Index to set selection start to - */ - setSelectionStart: function(index) { - index = Math.max(index, 0); - this._updateAndFire('selectionStart', index); - }, - - /** - * Sets selection end (right boundary of a selection) - * @param {Number} index Index to set selection end to - */ - setSelectionEnd: function(index) { - index = Math.min(index, this.text.length); - this._updateAndFire('selectionEnd', index); - }, - - /** - * @private - * @param {String} property 'selectionStart' or 'selectionEnd' - * @param {Number} index new position of property - */ - _updateAndFire: function(property, index) { - if (this[property] !== index) { - this._fireSelectionChanged(); - this[property] = index; - } - this._updateTextarea(); - }, - - /** - * Fires the even of selection changed - * @private - */ - _fireSelectionChanged: function() { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - }, - - /** - * Initialize text dimensions. Render all text on given context - * or on a offscreen canvas to get the text width with measureText. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - * @private - */ - initDimensions: function() { - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this.callSuper('initDimensions'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - this.clearContextTop(); - this.callSuper('render', ctx); - // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor - // the correct position but not at every cursor animation. - this.cursorOffsetCache = { }; - this.renderCursorOrSelection(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - this.callSuper('_render', ctx); - }, - - /** - * Prepare and clean the contextTop - */ - clearContextTop: function(skipRestore) { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - this.transform(ctx); - this._clearTextArea(ctx); - skipRestore || ctx.restore(); - }, - /** - * Renders cursor or selection (depending on what exists) - * it does on the contextTop. If contextTop is not available, do nothing. - */ - renderCursorOrSelection: function() { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var boundaries = this._getCursorBoundaries(), - ctx = this.canvas.contextTop; - this.clearContextTop(true); - if (this.selectionStart === this.selectionEnd) { - this.renderCursor(boundaries, ctx); - } - else { - this.renderSelection(boundaries, ctx); - } - ctx.restore(); - }, - - _clearTextArea: function(ctx) { - // we add 4 pixel, to be sure to do not leave any pixel out - var width = this.width + 4, height = this.height + 4; - ctx.clearRect(-width / 2, -height / 2, width, height); - }, - - /** - * Returns cursor boundaries (left, top, leftOffset, topOffset) - * @private - * @param {Array} chars Array of characters - * @param {String} typeOfBoundaries - */ - _getCursorBoundaries: function(position) { - - // left/top are left/top of entire text box - // leftOffset/topOffset are offset from that left/top point of a text box - - if (typeof position === 'undefined') { - position = this.selectionStart; - } - - var left = this._getLeftOffset(), - top = this._getTopOffset(), - offsets = this._getCursorBoundariesOffsets(position); - return { - left: left, - top: top, - leftOffset: offsets.left, - topOffset: offsets.top - }; - }, - - /** - * @private - */ - _getCursorBoundariesOffsets: function(position) { - if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) { - return this.cursorOffsetCache; - } - var lineLeftOffset, - lineIndex, - charIndex, - topOffset = 0, - leftOffset = 0, - boundaries, - cursorPosition = this.get2DCursorLocation(position); - charIndex = cursorPosition.charIndex; - lineIndex = cursorPosition.lineIndex; - for (var i = 0; i < lineIndex; i++) { - topOffset += this.getHeightOfLine(i); - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - var bound = this.__charBounds[lineIndex][charIndex]; - bound && (leftOffset = bound.left); - if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) { - leftOffset -= this._getWidthOfCharSpacing(); - } - boundaries = { - top: topOffset, - left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0), - }; - if (this.direction === 'rtl') { - boundaries.left *= -1; - } - this.cursorOffsetCache = boundaries; - return this.cursorOffsetCache; - }, - - /** - * Renders cursor - * @param {Object} boundaries - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderCursor: function(boundaries, ctx) { - var cursorLocation = this.get2DCursorLocation(), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'), - multiplier = this.scaleX * this.canvas.getZoom(), - cursorWidth = this.cursorWidth / multiplier, - topOffset = boundaries.topOffset, - dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'); - topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight - - charHeight * (1 - this._fontSizeFraction); - - if (this.inCompositionMode) { - this.renderSelection(boundaries, ctx); - } - ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill'); - ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity; - ctx.fillRect( - boundaries.left + boundaries.leftOffset - cursorWidth / 2, - topOffset + boundaries.top + dy, - cursorWidth, - charHeight); - }, - - /** - * Renders text selection - * @param {Object} boundaries Object with left/top/leftOffset/topOffset - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderSelection: function(boundaries, ctx) { - - var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart, - selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd, - isJustify = this.textAlign.indexOf('justify') !== -1, - start = this.get2DCursorLocation(selectionStart), - end = this.get2DCursorLocation(selectionEnd), - startLine = start.lineIndex, - endLine = end.lineIndex, - startChar = start.charIndex < 0 ? 0 : start.charIndex, - endChar = end.charIndex < 0 ? 0 : end.charIndex; - - for (var i = startLine; i <= endLine; i++) { - var lineOffset = this._getLineLeftOffset(i) || 0, - lineHeight = this.getHeightOfLine(i), - realLineHeight = 0, boxStart = 0, boxEnd = 0; - - if (i === startLine) { - boxStart = this.__charBounds[startLine][startChar].left; - } - if (i >= startLine && i < endLine) { - boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5? - } - else if (i === endLine) { - if (endChar === 0) { - boxEnd = this.__charBounds[endLine][endChar].left; - } - else { - var charSpacing = this._getWidthOfCharSpacing(); - boxEnd = this.__charBounds[endLine][endChar - 1].left - + this.__charBounds[endLine][endChar - 1].width - charSpacing; - } - } - realLineHeight = lineHeight; - if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) { - lineHeight /= this.lineHeight; - } - var drawStart = boundaries.left + lineOffset + boxStart, - drawWidth = boxEnd - boxStart, - drawHeight = lineHeight, extraTop = 0; - if (this.inCompositionMode) { - ctx.fillStyle = this.compositionColor || 'black'; - drawHeight = 1; - extraTop = lineHeight; - } - else { - ctx.fillStyle = this.selectionColor; - } - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - drawWidth; - } - ctx.fillRect( - drawStart, - boundaries.top + boundaries.topOffset + extraTop, - drawWidth, - drawHeight); - boundaries.topOffset += realLineHeight; - } - }, - - /** - * High level function to know the height of the cursor. - * the currentChar is the one that precedes the cursor - * Returns fontSize of char at the current cursor - * Unused from the library, is for the end user - * @return {Number} Character font size - */ - getCurrentCharFontSize: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize'); - }, - - /** - * High level function to know the color of the cursor. - * the currentChar is the one that precedes the cursor - * Returns color (fill) of char at the current cursor - * if the text object has a pattern or gradient for filler, it will return that. - * Unused by the library, is for the end user - * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill) - */ - getCurrentCharColor: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fill'); - }, - - /** - * Returns the cursor position for the getCurrent.. functions - * @private - */ - _getCurrentCharIndex: function() { - var cursorPosition = this.get2DCursorLocation(this.selectionStart, true), - charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0; - return { l: cursorPosition.lineIndex, c: charIndex }; - } - }); - - /** - * Returns fabric.IText instance from an object representation - * @static - * @memberOf fabric.IText - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as argument - */ - fabric.IText.fromObject = function(object, callback) { - parseDecoration(object); - if (object.styles) { - for (var i in object.styles) { - for (var j in object.styles[i]) { - parseDecoration(object.styles[i][j]); - } - } - } - fabric.Object._fromObject('IText', object, callback, 'text'); - }; -})(); - - -(function() { - - var clone = fabric.util.object.clone; - - fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes all the interactive behavior of IText - */ - initBehavior: function() { - this.initAddedHandler(); - this.initRemovedHandler(); - this.initCursorSelectionHandlers(); - this.initDoubleClickSimulation(); - this.mouseMoveHandler = this.mouseMoveHandler.bind(this); - }, - - onDeselect: function() { - this.isEditing && this.exitEditing(); - this.selected = false; - }, - - /** - * Initializes "added" event handler - */ - initAddedHandler: function() { - var _this = this; - this.on('added', function() { - var canvas = _this.canvas; - if (canvas) { - if (!canvas._hasITextHandlers) { - canvas._hasITextHandlers = true; - _this._initCanvasHandlers(canvas); - } - canvas._iTextInstances = canvas._iTextInstances || []; - canvas._iTextInstances.push(_this); - } - }); - }, - - initRemovedHandler: function() { - var _this = this; - this.on('removed', function() { - var canvas = _this.canvas; - if (canvas) { - canvas._iTextInstances = canvas._iTextInstances || []; - fabric.util.removeFromArray(canvas._iTextInstances, _this); - if (canvas._iTextInstances.length === 0) { - canvas._hasITextHandlers = false; - _this._removeCanvasHandlers(canvas); - } - } - }); - }, - - /** - * register canvas event to manage exiting on other instances - * @private - */ - _initCanvasHandlers: function(canvas) { - canvas._mouseUpITextHandler = function() { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.__isMousedown = false; - }); - } - }; - canvas.on('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * remove canvas event to manage exiting on other instances - * @private - */ - _removeCanvasHandlers: function(canvas) { - canvas.off('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * @private - */ - _tick: function() { - this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete'); - }, - - /** - * @private - */ - _animateCursor: function(obj, targetOpacity, duration, completeMethod) { - - var tickState; - - tickState = { - isAborted: false, - abort: function() { - this.isAborted = true; - }, - }; - - obj.animate('_currentCursorOpacity', targetOpacity, { - duration: duration, - onComplete: function() { - if (!tickState.isAborted) { - obj[completeMethod](); - } - }, - onChange: function() { - // we do not want to animate a selection, only cursor - if (obj.canvas && obj.selectionStart === obj.selectionEnd) { - obj.renderCursorOrSelection(); - } - }, - abort: function() { - return tickState.isAborted; - } - }); - return tickState; - }, - - /** - * @private - */ - _onTickComplete: function() { - - var _this = this; - - if (this._cursorTimeout1) { - clearTimeout(this._cursorTimeout1); - } - this._cursorTimeout1 = setTimeout(function() { - _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick'); - }, 100); - }, - - /** - * Initializes delayed cursor - */ - initDelayedCursor: function(restart) { - var _this = this, - delay = restart ? 0 : this.cursorDelay; - - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this._cursorTimeout2 = setTimeout(function() { - _this._tick(); - }, delay); - }, - - /** - * Aborts cursor animation and clears all timeouts - */ - abortCursorAnimation: function() { - var shouldClear = this._currentTickState || this._currentTickCompleteState, - canvas = this.canvas; - this._currentTickState && this._currentTickState.abort(); - this._currentTickCompleteState && this._currentTickCompleteState.abort(); - - clearTimeout(this._cursorTimeout1); - clearTimeout(this._cursorTimeout2); - - this._currentCursorOpacity = 0; - // to clear just itext area we need to transform the context - // it may not be worth it - if (shouldClear && canvas) { - canvas.clearContext(canvas.contextTop || canvas.contextContainer); - } - - }, - - /** - * Selects entire text - * @return {fabric.IText} thisArg - * @chainable - */ - selectAll: function() { - this.selectionStart = 0; - this.selectionEnd = this._text.length; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Returns selected text - * @return {String} - */ - getSelectedText: function() { - return this._text.slice(this.selectionStart, this.selectionEnd).join(''); - }, - - /** - * Find new selection index representing start of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - // remove space before cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index--; - } - } - while (/\S/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - // remove space after cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index++; - } - } - while (/\S/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Find new selection index representing start of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - while (!/\n/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - while (!/\n/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Finds index corresponding to beginning or end of a word - * @param {Number} selectionStart Index of a character - * @param {Number} direction 1 or -1 - * @return {Number} Index of the beginning or end of a word - */ - searchWordBoundary: function(selectionStart, direction) { - var text = this._text, - index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart, - _char = text[index], - // wrong - reNonWord = fabric.reNonWord; - - while (!reNonWord.test(_char) && index > 0 && index < text.length) { - index += direction; - _char = text[index]; - } - if (reNonWord.test(_char)) { - index += direction === 1 ? 0 : 1; - } - return index; - }, - - /** - * Selects a word based on the index - * @param {Number} selectionStart Index of a character - */ - selectWord: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ - newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - }, - - /** - * Selects a line based on the index - * @param {Number} selectionStart Index of a character - * @return {fabric.IText} thisArg - * @chainable - */ - selectLine: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.findLineBoundaryLeft(selectionStart), - newSelectionEnd = this.findLineBoundaryRight(selectionStart); - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Enters editing state - * @return {fabric.IText} thisArg - * @chainable - */ - enterEditing: function(e) { - if (this.isEditing || !this.editable) { - return; - } - - if (this.canvas) { - this.canvas.calcOffset(); - this.exitEditingOnOthers(this.canvas); - } - - this.isEditing = true; - - this.initHiddenTextarea(e); - this.hiddenTextarea.focus(); - this.hiddenTextarea.value = this.text; - this._updateTextarea(); - this._saveEditingProps(); - this._setEditingProps(); - this._textBeforeEdit = this.text; - - this._tick(); - this.fire('editing:entered'); - this._fireSelectionChanged(); - if (!this.canvas) { - return this; - } - this.canvas.fire('text:editing:entered', { target: this }); - this.initMouseMoveHandler(); - this.canvas.requestRenderAll(); - return this; - }, - - exitEditingOnOthers: function(canvas) { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.selected = false; - if (obj.isEditing) { - obj.exitEditing(); - } - }); - } - }, - - /** - * Initializes "mousemove" event handler - */ - initMouseMoveHandler: function() { - this.canvas.on('mouse:move', this.mouseMoveHandler); - }, - - /** - * @private - */ - mouseMoveHandler: function(options) { - if (!this.__isMousedown || !this.isEditing) { - return; - } - - var newSelectionStart = this.getSelectionStartFromPointer(options.e), - currentStart = this.selectionStart, - currentEnd = this.selectionEnd; - if ( - (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) - && - (currentStart === newSelectionStart || currentEnd === newSelectionStart) - ) { - return; - } - if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.selectionStart = this.__selectionStartOnMouseDown; - this.selectionEnd = newSelectionStart; - } - else { - this.selectionStart = newSelectionStart; - this.selectionEnd = this.__selectionStartOnMouseDown; - } - if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { - this.restartCursorIfNeeded(); - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - } - }, - - /** - * @private - */ - _setEditingProps: function() { - this.hoverCursor = 'text'; - - if (this.canvas) { - this.canvas.defaultCursor = this.canvas.moveCursor = 'text'; - } - - this.borderColor = this.editingBorderColor; - this.hasControls = this.selectable = false; - this.lockMovementX = this.lockMovementY = true; - }, - - /** - * convert from textarea to grapheme indexes - */ - fromStringToGraphemeSelection: function(start, end, text) { - var smallerTextStart = text.slice(0, start), - graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = text.slice(start, end), - graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * convert from fabric to textarea values - */ - fromGraphemeToStringSelection: function(start, end, _text) { - var smallerTextStart = _text.slice(0, start), - graphemeStart = smallerTextStart.join('').length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = _text.slice(start, end), - graphemeEnd = smallerTextEnd.join('').length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * @private - */ - _updateTextarea: function() { - this.cursorOffsetCache = { }; - if (!this.hiddenTextarea) { - return; - } - if (!this.inCompositionMode) { - var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text); - this.hiddenTextarea.selectionStart = newSelection.selectionStart; - this.hiddenTextarea.selectionEnd = newSelection.selectionEnd; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateFromTextArea: function() { - if (!this.hiddenTextarea) { - return; - } - this.cursorOffsetCache = { }; - this.text = this.hiddenTextarea.value; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - var newSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value); - this.selectionEnd = this.selectionStart = newSelection.selectionEnd; - if (!this.inCompositionMode) { - this.selectionStart = newSelection.selectionStart; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateTextareaPosition: function() { - if (this.selectionStart === this.selectionEnd) { - var style = this._calcTextareaPosition(); - this.hiddenTextarea.style.left = style.left; - this.hiddenTextarea.style.top = style.top; - } - }, - - /** - * @private - * @return {Object} style contains style for hiddenTextarea - */ - _calcTextareaPosition: function() { - if (!this.canvas) { - return { x: 1, y: 1 }; - } - var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart, - boundaries = this._getCursorBoundaries(desiredPosition), - cursorLocation = this.get2DCursorLocation(desiredPosition), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight, - leftOffset = boundaries.leftOffset, - m = this.calcTransformMatrix(), - p = { - x: boundaries.left + leftOffset, - y: boundaries.top + boundaries.topOffset + charHeight - }, - retinaScaling = this.canvas.getRetinaScaling(), - upperCanvas = this.canvas.upperCanvasEl, - upperCanvasWidth = upperCanvas.width / retinaScaling, - upperCanvasHeight = upperCanvas.height / retinaScaling, - maxWidth = upperCanvasWidth - charHeight, - maxHeight = upperCanvasHeight - charHeight, - scaleX = upperCanvas.clientWidth / upperCanvasWidth, - scaleY = upperCanvas.clientHeight / upperCanvasHeight; - - p = fabric.util.transformPoint(p, m); - p = fabric.util.transformPoint(p, this.canvas.viewportTransform); - p.x *= scaleX; - p.y *= scaleY; - if (p.x < 0) { - p.x = 0; - } - if (p.x > maxWidth) { - p.x = maxWidth; - } - if (p.y < 0) { - p.y = 0; - } - if (p.y > maxHeight) { - p.y = maxHeight; - } - - // add canvas offset on document - p.x += this.canvas._offset.left; - p.y += this.canvas._offset.top; - - return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight }; - }, - - /** - * @private - */ - _saveEditingProps: function() { - this._savedProps = { - hasControls: this.hasControls, - borderColor: this.borderColor, - lockMovementX: this.lockMovementX, - lockMovementY: this.lockMovementY, - hoverCursor: this.hoverCursor, - selectable: this.selectable, - defaultCursor: this.canvas && this.canvas.defaultCursor, - moveCursor: this.canvas && this.canvas.moveCursor - }; - }, - - /** - * @private - */ - _restoreEditingProps: function() { - if (!this._savedProps) { - return; - } - - this.hoverCursor = this._savedProps.hoverCursor; - this.hasControls = this._savedProps.hasControls; - this.borderColor = this._savedProps.borderColor; - this.selectable = this._savedProps.selectable; - this.lockMovementX = this._savedProps.lockMovementX; - this.lockMovementY = this._savedProps.lockMovementY; - - if (this.canvas) { - this.canvas.defaultCursor = this._savedProps.defaultCursor; - this.canvas.moveCursor = this._savedProps.moveCursor; - } - }, - - /** - * Exits from editing state - * @return {fabric.IText} thisArg - * @chainable - */ - exitEditing: function() { - var isTextChanged = (this._textBeforeEdit !== this.text); - var hiddenTextarea = this.hiddenTextarea; - this.selected = false; - this.isEditing = false; - - this.selectionEnd = this.selectionStart; - - if (hiddenTextarea) { - hiddenTextarea.blur && hiddenTextarea.blur(); - hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea); - } - this.hiddenTextarea = null; - this.abortCursorAnimation(); - this._restoreEditingProps(); - this._currentCursorOpacity = 0; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this.fire('editing:exited'); - isTextChanged && this.fire('modified'); - if (this.canvas) { - this.canvas.off('mouse:move', this.mouseMoveHandler); - this.canvas.fire('text:editing:exited', { target: this }); - isTextChanged && this.canvas.fire('object:modified', { target: this }); - } - return this; - }, - - /** - * @private - */ - _removeExtraneousStyles: function() { - for (var prop in this.styles) { - if (!this._textLines[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * remove and reflow a style block from start to end. - * @param {Number} start linear start position for removal (included in removal) - * @param {Number} end linear end position for removal ( excluded from removal ) - */ - removeStyleFromTo: function(start, end) { - var cursorStart = this.get2DCursorLocation(start, true), - cursorEnd = this.get2DCursorLocation(end, true), - lineStart = cursorStart.lineIndex, - charStart = cursorStart.charIndex, - lineEnd = cursorEnd.lineIndex, - charEnd = cursorEnd.charIndex, - i, styleObj; - if (lineStart !== lineEnd) { - // step1 remove the trailing of lineStart - if (this.styles[lineStart]) { - for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) { - delete this.styles[lineStart][i]; - } - } - // step2 move the trailing of lineEnd to lineStart if needed - if (this.styles[lineEnd]) { - for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) { - styleObj = this.styles[lineEnd][i]; - if (styleObj) { - this.styles[lineStart] || (this.styles[lineStart] = { }); - this.styles[lineStart][charStart + i - charEnd] = styleObj; - } - } - } - // step3 detects lines will be completely removed. - for (i = lineStart + 1; i <= lineEnd; i++) { - delete this.styles[i]; - } - // step4 shift remaining lines. - this.shiftLineStyles(lineEnd, lineStart - lineEnd); - } - else { - // remove and shift left on the same line - if (this.styles[lineStart]) { - styleObj = this.styles[lineStart]; - var diff = charEnd - charStart, numericChar, _char; - for (i = charStart; i < charEnd; i++) { - delete styleObj[i]; - } - for (_char in this.styles[lineStart]) { - numericChar = parseInt(_char, 10); - if (numericChar >= charEnd) { - styleObj[numericChar - diff] = styleObj[_char]; - delete styleObj[_char]; - } - } - } - } - }, - - /** - * Shifts line styles up or down - * @param {Number} lineIndex Index of a line - * @param {Number} offset Can any number? - */ - shiftLineStyles: function(lineIndex, offset) { - // shift all line styles by offset upward or downward - // do not clone deep. we need new array, not new style objects - var clonedStyles = clone(this.styles); - for (var line in this.styles) { - var numericLine = parseInt(line, 10); - if (numericLine > lineIndex) { - this.styles[numericLine + offset] = clonedStyles[numericLine]; - if (!clonedStyles[numericLine - offset]) { - delete this.styles[numericLine]; - } - } - } - }, - - restartCursorIfNeeded: function() { - if (!this._currentTickState || this._currentTickState.isAborted - || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted - ) { - this.initDelayedCursor(); - } - }, - - /** - * Handle insertion of more consecutive style lines for when one or more - * newlines gets added to the text. Since current style needs to be shifted - * first we shift the current style of the number lines needed, then we add - * new lines from the last to the first. - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} qty number of lines to add - * @param {Array} copiedStyle Array of objects styles - */ - insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) { - var currentCharStyle, - newLineStyles = {}, - somethingAdded = false, - isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex; - - qty || (qty = 1); - this.shiftLineStyles(lineIndex, qty); - if (this.styles[lineIndex]) { - currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]; - } - // we clone styles of all chars - // after cursor onto the current line - for (var index in this.styles[lineIndex]) { - var numIndex = parseInt(index, 10); - if (numIndex >= charIndex) { - somethingAdded = true; - newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index]; - // remove lines from the previous line since they're on a new line now - if (!(isEndOfLine && charIndex === 0)) { - delete this.styles[lineIndex][index]; - } - } - } - var styleCarriedOver = false; - if (somethingAdded && !isEndOfLine) { - // if is end of line, the extra style we copied - // is probably not something we want - this.styles[lineIndex + qty] = newLineStyles; - styleCarriedOver = true; - } - if (styleCarriedOver) { - // skip the last line of since we already prepared it. - qty--; - } - // for the all the lines or all the other lines - // we clone current char style onto the next (otherwise empty) line - while (qty > 0) { - if (copiedStyle && copiedStyle[qty - 1]) { - this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) }; - } - else if (currentCharStyle) { - this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) }; - } - else { - delete this.styles[lineIndex + qty]; - } - qty--; - } - this._forceClearCache = true; - }, - - /** - * Inserts style object for a given line/char index - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} quantity number Style object to insert, if given - * @param {Array} copiedStyle array of style objects - */ - insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) { - if (!this.styles) { - this.styles = {}; - } - var currentLineStyles = this.styles[lineIndex], - currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {}; - - quantity || (quantity = 1); - // shift all char styles by quantity forward - // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4 - for (var index in currentLineStylesCloned) { - var numericIndex = parseInt(index, 10); - if (numericIndex >= charIndex) { - currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex]; - // only delete the style if there was nothing moved there - if (!currentLineStylesCloned[numericIndex - quantity]) { - delete currentLineStyles[numericIndex]; - } - } - } - this._forceClearCache = true; - if (copiedStyle) { - while (quantity--) { - if (!Object.keys(copiedStyle[quantity]).length) { - continue; - } - if (!this.styles[lineIndex]) { - this.styles[lineIndex] = {}; - } - this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]); - } - return; - } - if (!currentLineStyles) { - return; - } - var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1]; - while (newStyle && quantity--) { - this.styles[lineIndex][charIndex + quantity] = clone(newStyle); - } - }, - - /** - * Inserts style object(s) - * @param {Array} insertedText Characters at the location where style is inserted - * @param {Number} start cursor index for inserting style - * @param {Array} [copiedStyle] array of style objects to insert. - */ - insertNewStyleBlock: function(insertedText, start, copiedStyle) { - var cursorLoc = this.get2DCursorLocation(start, true), - addedLines = [0], linesLength = 0; - // get an array of how many char per lines are being added. - for (var i = 0; i < insertedText.length; i++) { - if (insertedText[i] === '\n') { - linesLength++; - addedLines[linesLength] = 0; - } - else { - addedLines[linesLength]++; - } - } - // for the first line copy the style from the current char position. - if (addedLines[0] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle); - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1); - } - linesLength && this.insertNewlineStyleObject( - cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength); - for (var i = 1; i < linesLength; i++) { - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - else if (copiedStyle) { - this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0]; - } - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1); - } - // we use i outside the loop to get it like linesLength - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - }, - - /** - * Set the selectionStart and selectionEnd according to the new position of cursor - * mimic the key - mouse navigation when shift is pressed. - */ - setSelectionStartEndWithShift: function(start, end, newSelection) { - if (newSelection <= start) { - if (end === start) { - this._selectionDirection = 'left'; - } - else if (this._selectionDirection === 'right') { - this._selectionDirection = 'left'; - this.selectionEnd = start; - } - this.selectionStart = newSelection; - } - else if (newSelection > start && newSelection < end) { - if (this._selectionDirection === 'right') { - this.selectionEnd = newSelection; - } - else { - this.selectionStart = newSelection; - } - } - else { - // newSelection is > selection start and end - if (end === start) { - this._selectionDirection = 'right'; - } - else if (this._selectionDirection === 'left') { - this._selectionDirection = 'right'; - this.selectionStart = end; - } - this.selectionEnd = newSelection; - } - }, - - setSelectionInBoundaries: function() { - var length = this.text.length; - if (this.selectionStart > length) { - this.selectionStart = length; - } - else if (this.selectionStart < 0) { - this.selectionStart = 0; - } - if (this.selectionEnd > length) { - this.selectionEnd = length; - } - else if (this.selectionEnd < 0) { - this.selectionEnd = 0; - } - } - }); -})(); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - /** - * Initializes "dbclick" event handler - */ - initDoubleClickSimulation: function() { - - // for double click - this.__lastClickTime = +new Date(); - - // for triple click - this.__lastLastClickTime = +new Date(); - - this.__lastPointer = { }; - - this.on('mousedown', this.onMouseDown); - }, - - /** - * Default event handler to simulate triple click - * @private - */ - onMouseDown: function(options) { - if (!this.canvas) { - return; - } - this.__newClickTime = +new Date(); - var newPointer = options.pointer; - if (this.isTripleClick(newPointer)) { - this.fire('tripleclick', options); - this._stopEvent(options.e); - } - this.__lastLastClickTime = this.__lastClickTime; - this.__lastClickTime = this.__newClickTime; - this.__lastPointer = newPointer; - this.__lastIsEditing = this.isEditing; - this.__lastSelected = this.selected; - }, - - isTripleClick: function(newPointer) { - return this.__newClickTime - this.__lastClickTime < 500 && - this.__lastClickTime - this.__lastLastClickTime < 500 && - this.__lastPointer.x === newPointer.x && - this.__lastPointer.y === newPointer.y; - }, - - /** - * @private - */ - _stopEvent: function(e) { - e.preventDefault && e.preventDefault(); - e.stopPropagation && e.stopPropagation(); - }, - - /** - * Initializes event handlers related to cursor or selection - */ - initCursorSelectionHandlers: function() { - this.initMousedownHandler(); - this.initMouseupHandler(); - this.initClicks(); - }, - - /** - * Default handler for double click, select a word - */ - doubleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectWord(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Default handler for triple click, select a line - */ - tripleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectLine(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Initializes double and triple click event handlers - */ - initClicks: function() { - this.on('mousedblclick', this.doubleClickHandler); - this.on('tripleclick', this.tripleClickHandler); - }, - - /** - * Default event handler for the basic functionalities needed on _mouseDown - * can be overridden to do something different. - * Scope of this implementation is: find the click position, set selectionStart - * find selectionEnd, initialize the drawing of either cursor or selection area - * initializing a mousedDown on a text area will cancel fabricjs knowledge of - * current compositionMode. It will be set to false. - */ - _mouseDownHandler: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - - this.__isMousedown = true; - - if (this.selected) { - this.inCompositionMode = false; - this.setCursorByClick(options.e); - } - - if (this.isEditing) { - this.__selectionStartOnMouseDown = this.selectionStart; - if (this.selectionStart === this.selectionEnd) { - this.abortCursorAnimation(); - } - this.renderCursorOrSelection(); - } - }, - - /** - * Default event handler for the basic functionalities needed on mousedown:before - * can be overridden to do something different. - * Scope of this implementation is: verify the object is already selected when mousing down - */ - _mouseDownHandlerBefore: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - // we want to avoid that an object that was selected and then becomes unselectable, - // may trigger editing mode in some way. - this.selected = this === this.canvas._activeObject; - }, - - /** - * Initializes "mousedown" event handler - */ - initMousedownHandler: function() { - this.on('mousedown', this._mouseDownHandler); - this.on('mousedown:before', this._mouseDownHandlerBefore); - }, - - /** - * Initializes "mouseup" event handler - */ - initMouseupHandler: function() { - this.on('mouseup', this.mouseUpHandler); - }, - - /** - * standard handler for mouse up, overridable - * @private - */ - mouseUpHandler: function(options) { - this.__isMousedown = false; - if (!this.editable || this.group || - (options.transform && options.transform.actionPerformed) || - (options.e.button && options.e.button !== 1)) { - return; - } - - if (this.canvas) { - var currentActive = this.canvas._activeObject; - if (currentActive && currentActive !== this) { - // avoid running this logic when there is an active object - // this because is possible with shift click and fast clicks, - // to rapidly deselect and reselect this object and trigger an enterEdit - return; - } - } - - if (this.__lastSelected && !this.__corner) { - this.selected = false; - this.__lastSelected = false; - this.enterEditing(options.e); - if (this.selectionStart === this.selectionEnd) { - this.initDelayedCursor(true); - } - else { - this.renderCursorOrSelection(); - } - } - else { - this.selected = true; - } - }, - - /** - * Changes cursor location in a text depending on passed pointer (x/y) object - * @param {Event} e Event object - */ - setCursorByClick: function(e) { - var newSelection = this.getSelectionStartFromPointer(e), - start = this.selectionStart, end = this.selectionEnd; - if (e.shiftKey) { - this.setSelectionStartEndWithShift(start, end, newSelection); - } - else { - this.selectionStart = newSelection; - this.selectionEnd = newSelection; - } - if (this.isEditing) { - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Returns index of a character corresponding to where an object was clicked - * @param {Event} e Event object - * @return {Number} Index of a character - */ - getSelectionStartFromPointer: function(e) { - var mouseOffset = this.getLocalPointer(e), - prevWidth = 0, - width = 0, - height = 0, - charIndex = 0, - lineIndex = 0, - lineLeftOffset, - line; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (height <= mouseOffset.y) { - height += this.getHeightOfLine(i) * this.scaleY; - lineIndex = i; - if (i > 0) { - charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1); - } - } - else { - break; - } - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - width = lineLeftOffset * this.scaleX; - line = this._textLines[lineIndex]; - // handling of RTL: in order to get things work correctly, - // we assume RTL writing is mirrored compared to LTR writing. - // so in position detection we mirror the X offset, and when is time - // of rendering it, we mirror it again. - if (this.direction === 'rtl') { - mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width; - } - for (var j = 0, jlen = line.length; j < jlen; j++) { - prevWidth = width; - // i removed something about flipX here, check. - width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX; - if (width <= mouseOffset.x) { - charIndex++; - } - else { - break; - } - } - return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen); - }, - - /** - * @private - */ - _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) { - // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0 - var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth, - distanceBtwNextCharAndCursor = width - mouseOffset.x, - offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor || - distanceBtwNextCharAndCursor < 0 ? 0 : 1, - newSelectionStart = index + offset; - // if object is horizontally flipped, mirror cursor location from the end - if (this.flipX) { - newSelectionStart = jlen - newSelectionStart; - } - - if (newSelectionStart > this._text.length) { - newSelectionStart = this._text.length; - } - - return newSelectionStart; - } -}); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes hidden textarea (needed to bring up keyboard in iOS) - */ - initHiddenTextarea: function() { - this.hiddenTextarea = fabric.document.createElement('textarea'); - this.hiddenTextarea.setAttribute('autocapitalize', 'off'); - this.hiddenTextarea.setAttribute('autocorrect', 'off'); - this.hiddenTextarea.setAttribute('autocomplete', 'off'); - this.hiddenTextarea.setAttribute('spellcheck', 'false'); - this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', ''); - this.hiddenTextarea.setAttribute('wrap', 'off'); - var style = this._calcTextareaPosition(); - // line-height: 1px; was removed from the style to fix this: - // https://bugs.chromium.org/p/chromium/issues/detail?id=870966 - this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + - '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' + - ' paddingーtop: ' + style.fontSize + ';'; - - if (this.hiddenTextareaContainer) { - this.hiddenTextareaContainer.appendChild(this.hiddenTextarea); - } - else { - fabric.document.body.appendChild(this.hiddenTextarea); - } - - fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this)); - - if (!this._clickHandlerInitialized && this.canvas) { - fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this)); - this._clickHandlerInitialized = true; - } - }, - - /** - * For functionalities on keyDown - * Map a special key to a function of the instance/prototype - * If you need different behaviour for ESC or TAB or arrows, you have to change - * this map setting the name of a function that you build on the fabric.Itext or - * your prototype. - * the map change will affect all Instances unless you need for only some text Instances - * in that case you have to clone this object and assign your Instance. - * this.keysMap = fabric.util.object.clone(this.keysMap); - * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0] - */ - keysMap: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorRight', - 36: 'moveCursorLeft', - 37: 'moveCursorLeft', - 38: 'moveCursorUp', - 39: 'moveCursorRight', - 40: 'moveCursorDown', - }, - - keysMapRtl: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorLeft', - 36: 'moveCursorRight', - 37: 'moveCursorRight', - 38: 'moveCursorUp', - 39: 'moveCursorLeft', - 40: 'moveCursorDown', - }, - - /** - * For functionalities on keyUp + ctrl || cmd - */ - ctrlKeysMapUp: { - 67: 'copy', - 88: 'cut' - }, - - /** - * For functionalities on keyDown + ctrl || cmd - */ - ctrlKeysMapDown: { - 65: 'selectAll' - }, - - onClick: function() { - // No need to trigger click event here, focus is enough to have the keyboard appear on Android - this.hiddenTextarea && this.hiddenTextarea.focus(); - }, - - /** - * Handles keydown event - * only used for arrows and combination of modifier keys. - * @param {Event} e Event object - */ - onKeyDown: function(e) { - if (!this.isEditing) { - return; - } - var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap; - if (e.keyCode in keyMap) { - this[keyMap[e.keyCode]](e); - } - else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapDown[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - if (e.keyCode >= 33 && e.keyCode <= 40) { - // if i press an arrow key just update selection - this.inCompositionMode = false; - this.clearContextTop(); - this.renderCursorOrSelection(); - } - else { - this.canvas && this.canvas.requestRenderAll(); - } - }, - - /** - * Handles keyup event - * We handle KeyUp because ie11 and edge have difficulties copy/pasting - * if a copy/cut event fired, keyup is dismissed - * @param {Event} e Event object - */ - onKeyUp: function(e) { - if (!this.isEditing || this._copyDone || this.inCompositionMode) { - this._copyDone = false; - return; - } - if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapUp[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - this.canvas && this.canvas.requestRenderAll(); - }, - - /** - * Handles onInput event - * @param {Event} e Event object - */ - onInput: function(e) { - var fromPaste = this.fromPaste; - this.fromPaste = false; - e && e.stopPropagation(); - if (!this.isEditing) { - return; - } - // decisions about style changes. - var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText, - charCount = this._text.length, - nextCharCount = nextText.length, - removedText, insertedText, - charDiff = nextCharCount - charCount, - selectionStart = this.selectionStart, selectionEnd = this.selectionEnd, - selection = selectionStart !== selectionEnd, - copiedStyle, removeFrom, removeTo; - if (this.hiddenTextarea.value === '') { - this.styles = { }; - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - return; - } - - var textareaSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, - this.hiddenTextarea.selectionEnd, - this.hiddenTextarea.value - ); - var backDelete = selectionStart > textareaSelection.selectionStart; - - if (selection) { - removedText = this._text.slice(selectionStart, selectionEnd); - charDiff += selectionEnd - selectionStart; - } - else if (nextCharCount < charCount) { - if (backDelete) { - removedText = this._text.slice(selectionEnd + charDiff, selectionEnd); - } - else { - removedText = this._text.slice(selectionStart, selectionStart - charDiff); - } - } - insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd); - if (removedText && removedText.length) { - if (insertedText.length) { - // let's copy some style before deleting. - // we want to copy the style before the cursor OR the style at the cursor if selection - // is bigger than 0. - copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false); - // now duplicate the style one for each inserted text. - copiedStyle = insertedText.map(function() { - // this return an array of references, but that is fine since we are - // copying the style later. - return copiedStyle[0]; - }); - } - if (selection) { - removeFrom = selectionStart; - removeTo = selectionEnd; - } - else if (backDelete) { - // detect differences between forwardDelete and backDelete - removeFrom = selectionEnd - removedText.length; - removeTo = selectionEnd; - } - else { - removeFrom = selectionEnd; - removeTo = selectionEnd + removedText.length; - } - this.removeStyleFromTo(removeFrom, removeTo); - } - if (insertedText.length) { - if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) { - copiedStyle = fabric.copiedTextStyle; - } - this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle); - } - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - }, - /** - * Composition start - */ - onCompositionStart: function() { - this.inCompositionMode = true; - }, - - /** - * Composition end - */ - onCompositionEnd: function() { - this.inCompositionMode = false; - }, - - // /** - // * Composition update - // */ - onCompositionUpdate: function(e) { - this.compositionStart = e.target.selectionStart; - this.compositionEnd = e.target.selectionEnd; - this.updateTextareaPosition(); - }, - - /** - * Copies selected text - * @param {Event} e Event object - */ - copy: function() { - if (this.selectionStart === this.selectionEnd) { - //do not cut-copy if no selection - return; - } - - fabric.copiedText = this.getSelectedText(); - if (!fabric.disableStyleCopyPaste) { - fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true); - } - else { - fabric.copiedTextStyle = null; - } - this._copyDone = true; - }, - - /** - * Pastes text - * @param {Event} e Event object - */ - paste: function() { - this.fromPaste = true; - }, - - /** - * @private - * @param {Event} e Event object - * @return {Object} Clipboard data object - */ - _getClipboardData: function(e) { - return (e && e.clipboardData) || fabric.window.clipboardData; - }, - - /** - * Finds the width in pixels before the cursor on the same line - * @private - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Number} widthBeforeCursor width before cursor - */ - _getWidthBeforeCursor: function(lineIndex, charIndex) { - var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound; - - if (charIndex > 0) { - bound = this.__charBounds[lineIndex][charIndex - 1]; - widthBeforeCursor += bound.left + bound.width; - } - return widthBeforeCursor; - }, - - /** - * Gets start offset of a selection - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getDownCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - // if on last line, down cursor goes to end of line - if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) { - // move to the end of a text - return this._text.length - selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor), - textAfterCursor = this._textLines[lineIndex].slice(charIndex); - return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex); - }, - - /** - * private - * Helps finding if the offset should be counted from Start or End - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - _getSelectionForOffset: function(e, isRight) { - if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) { - return this.selectionEnd; - } - else { - return this.selectionStart; - } - }, - - /** - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getUpCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - if (lineIndex === 0 || e.metaKey || e.keyCode === 33) { - // if on first line, up cursor goes to start of line - return -selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor), - textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex), - missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1); - // return a negative offset - return -this._textLines[lineIndex - 1].length - + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset); - }, - - /** - * for a given width it founds the matching character. - * @private - */ - _getIndexOnLine: function(lineIndex, width) { - - var line = this._textLines[lineIndex], - lineLeftOffset = this._getLineLeftOffset(lineIndex), - widthOfCharsOnLine = lineLeftOffset, - indexOnLine = 0, charWidth, foundMatch; - - for (var j = 0, jlen = line.length; j < jlen; j++) { - charWidth = this.__charBounds[lineIndex][j].width; - widthOfCharsOnLine += charWidth; - if (widthOfCharsOnLine > width) { - foundMatch = true; - var leftEdge = widthOfCharsOnLine - charWidth, - rightEdge = widthOfCharsOnLine, - offsetFromLeftEdge = Math.abs(leftEdge - width), - offsetFromRightEdge = Math.abs(rightEdge - width); - - indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1); - break; - } - } - - // reached end - if (!foundMatch) { - indexOnLine = line.length - 1; - } - - return indexOnLine; - }, - - - /** - * Moves cursor down - * @param {Event} e Event object - */ - moveCursorDown: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorUpOrDown('Down', e); - }, - - /** - * Moves cursor up - * @param {Event} e Event object - */ - moveCursorUp: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorUpOrDown('Up', e); - }, - - /** - * Moves cursor up or down, fires the events - * @param {String} direction 'Up' or 'Down' - * @param {Event} e Event object - */ - _moveCursorUpOrDown: function(direction, e) { - // getUpCursorOffset - // getDownCursorOffset - var action = 'get' + direction + 'CursorOffset', - offset = this[action](e, this._selectionDirection === 'right'); - if (e.shiftKey) { - this.moveCursorWithShift(offset); - } - else { - this.moveCursorWithoutShift(offset); - } - if (offset !== 0) { - this.setSelectionInBoundaries(); - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor with shift - * @param {Number} offset - */ - moveCursorWithShift: function(offset) { - var newSelection = this._selectionDirection === 'left' - ? this.selectionStart + offset - : this.selectionEnd + offset; - this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection); - return offset !== 0; - }, - - /** - * Moves cursor up without shift - * @param {Number} offset - */ - moveCursorWithoutShift: function(offset) { - if (offset < 0) { - this.selectionStart += offset; - this.selectionEnd = this.selectionStart; - } - else { - this.selectionEnd += offset; - this.selectionStart = this.selectionEnd; - } - return offset !== 0; - }, - - /** - * Moves cursor left - * @param {Event} e Event object - */ - moveCursorLeft: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorLeftOrRight('Left', e); - }, - - /** - * @private - * @return {Boolean} true if a change happened - */ - _move: function(e, prop, direction) { - var newValue; - if (e.altKey) { - newValue = this['findWordBoundary' + direction](this[prop]); - } - else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { - newValue = this['findLineBoundary' + direction](this[prop]); - } - else { - this[prop] += direction === 'Left' ? -1 : 1; - return true; - } - if (typeof newValue !== undefined && this[prop] !== newValue) { - this[prop] = newValue; - return true; - } - }, - - /** - * @private - */ - _moveLeft: function(e, prop) { - return this._move(e, prop, 'Left'); - }, - - /** - * @private - */ - _moveRight: function(e, prop) { - return this._move(e, prop, 'Right'); - }, - - /** - * Moves cursor left without keeping selection - * @param {Event} e - */ - moveCursorLeftWithoutShift: function(e) { - var change = true; - this._selectionDirection = 'left'; - - // only move cursor when there is no selection, - // otherwise we discard it, and leave cursor on same place - if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { - change = this._moveLeft(e, 'selectionStart'); - - } - this.selectionEnd = this.selectionStart; - return change; - }, - - /** - * Moves cursor left while keeping selection - * @param {Event} e - */ - moveCursorLeftWithShift: function(e) { - if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { - return this._moveLeft(e, 'selectionEnd'); - } - else if (this.selectionStart !== 0){ - this._selectionDirection = 'left'; - return this._moveLeft(e, 'selectionStart'); - } - }, - - /** - * Moves cursor right - * @param {Event} e Event object - */ - moveCursorRight: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorLeftOrRight('Right', e); - }, - - /** - * Moves cursor right or Left, fires event - * @param {String} direction 'Left', 'Right' - * @param {Event} e Event object - */ - _moveCursorLeftOrRight: function(direction, e) { - var actionName = 'moveCursor' + direction + 'With'; - this._currentCursorOpacity = 1; - - if (e.shiftKey) { - actionName += 'Shift'; - } - else { - actionName += 'outShift'; - } - if (this[actionName](e)) { - this.abortCursorAnimation(); - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor right while keeping selection - * @param {Event} e - */ - moveCursorRightWithShift: function(e) { - if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { - return this._moveRight(e, 'selectionStart'); - } - else if (this.selectionEnd !== this._text.length) { - this._selectionDirection = 'right'; - return this._moveRight(e, 'selectionEnd'); - } - }, - - /** - * Moves cursor right without keeping selection - * @param {Event} e Event object - */ - moveCursorRightWithoutShift: function(e) { - var changed = true; - this._selectionDirection = 'right'; - - if (this.selectionStart === this.selectionEnd) { - changed = this._moveRight(e, 'selectionStart'); - this.selectionEnd = this.selectionStart; - } - else { - this.selectionStart = this.selectionEnd; - } - return changed; - }, - - /** - * Removes characters from start/end - * start/end ar per grapheme position in _text array. - * - * @param {Number} start - * @param {Number} end default to start + 1 - */ - removeChars: function(start, end) { - if (typeof end === 'undefined') { - end = start + 1; - } - this.removeStyleFromTo(start, end); - this._text.splice(start, end - start); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - - /** - * insert characters at start position, before start position. - * start equal 1 it means the text get inserted between actual grapheme 0 and 1 - * if style array is provided, it must be as the same length of text in graphemes - * if end is provided and is bigger than start, old text is replaced. - * start/end ar per grapheme position in _text array. - * - * @param {String} text text to insert - * @param {Array} style array of style objects - * @param {Number} start - * @param {Number} end default to start + 1 - */ - insertChars: function(text, style, start, end) { - if (typeof end === 'undefined') { - end = start; - } - if (end > start) { - this.removeStyleFromTo(start, end); - } - var graphemes = fabric.util.string.graphemeSplit(text); - this.insertNewStyleBlock(graphemes, start, style); - this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end)); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - -}); - - -/* _TO_SVG_START_ */ -(function() { - var toFixed = fabric.util.toFixed, - multipleSpacesRegex = / +/g; - - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - - /** - * Returns SVG representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function() { - var offsets = this._getSVGLeftTopOffsets(), - textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); - return this._wrapSVGTextAndBg(textAndBg); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup( - this._toSVG(), - { reviver: reviver, noStyle: true, withShadow: true } - ); - }, - - /** - * @private - */ - _getSVGLeftTopOffsets: function() { - return { - textLeft: -this.width / 2, - textTop: -this.height / 2, - lineTop: this.getHeightOfLine(0) - }; - }, - - /** - * @private - */ - _wrapSVGTextAndBg: function(textAndBg) { - var noShadow = true, - textDecoration = this.getSvgTextDecoration(this); - return [ - textAndBg.textBgRects.join(''), - '\t\t', - textAndBg.textSpans.join(''), - '\n' - ]; - }, - - /** - * @private - * @param {Number} textTopOffset Text top offset - * @param {Number} textLeftOffset Text left offset - * @return {Object} - */ - _getSVGTextAndBg: function(textTopOffset, textLeftOffset) { - var textSpans = [], - textBgRects = [], - height = textTopOffset, lineOffset; - // bounding-box background - this._setSVGBg(textBgRects); - - // text and text-background - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineOffset = this._getLineLeftOffset(i); - if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) { - this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height); - } - this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height); - height += this.getHeightOfLine(i); - } - - return { - textSpans: textSpans, - textBgRects: textBgRects - }; - }, - - /** - * @private - */ - _createTextCharSpan: function(_char, styleDecl, left, top) { - var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex), - styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace), - fillStyles = styleProps ? 'style="' + styleProps + '"' : '', - dy = styleDecl.deltaY, dySpan = '', - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - if (dy) { - dySpan = ' dy="' + toFixed(dy, NUM_FRACTION_DIGITS) + '" '; - } - return [ - '', - fabric.util.string.escapeXml(_char), - '' - ].join(''); - }, - - _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, style, - boxWidth = 0, - line = this._textLines[lineIndex], - timeToRender; - - textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight; - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - textLeftOffset += charBox.kernedWidth - charBox.width; - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle); - } - if (timeToRender) { - style = this._getStyleDeclaration(lineIndex, i) || { }; - textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset)); - charsToRender = ''; - actualStyle = nextStyle; - textLeftOffset += boxWidth; - boxWidth = 0; - } - } - }, - - _pushTextBgRect: function(textBgRects, color, left, top, width, height) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - }, - - _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) { - var line = this._textLines[i], - heightOfLine = this.getHeightOfLine(i) / this.lineHeight, - boxWidth = 0, - boxStart = 0, - charBox, currentColor, - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (currentColor !== lastColor) { - lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - }, - - /** - * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values - * we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1 - * - * @private - * @param {*} value - * @return {String} - */ - _getFillAttributes: function(value) { - var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : ''; - if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) { - return 'fill="' + value + '"'; - } - return 'opacity="' + fillColor.getAlpha() + '" fill="' + fillColor.setAlpha(1).toRgb() + '"'; - }, - - /** - * @private - */ - _getSVGLineTopOffset: function(lineIndex) { - var lineTopOffset = 0, lastHeight = 0; - for (var j = 0; j < lineIndex; j++) { - lineTopOffset += this.getHeightOfLine(j); - } - lastHeight = this.getHeightOfLine(j); - return { - lineTop: lineTopOffset, - offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult) - }; - }, - - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow); - return svgStyle + ' white-space: pre;'; - }, - }); -})(); -/* _TO_SVG_END_ */ - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = {}); - - /** - * Textbox class, based on IText, allows the user to resize the text rectangle - * and wraps lines automatically. Textboxes have their Y scaling locked, the - * user can only change width. Height is adjusted automatically based on the - * wrapping of lines. - * @class fabric.Textbox - * @extends fabric.IText - * @mixes fabric.Observable - * @return {fabric.Textbox} thisArg - * @see {@link fabric.Textbox#initialize} for constructor definition - */ - fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, { - - /** - * Type of an object - * @type String - * @default - */ - type: 'textbox', - - /** - * Minimum width of textbox, in pixels. - * @type Number - * @default - */ - minWidth: 20, - - /** - * Minimum calculated width of a textbox, in pixels. - * fixed to 2 so that an empty textbox cannot go to 0 - * and is still selectable without text. - * @type Number - * @default - */ - dynamicMinWidth: 2, - - /** - * Cached array of text wrapping. - * @type Array - */ - __cachedLines: null, - - /** - * Override standard Object class values - */ - lockScalingFlip: true, - - /** - * Override standard Object class values - * Textbox needs this on false - */ - noScaleCache: false, - - /** - * Properties which when set cause object to change dimensions - * @type Object - * @private - */ - _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'), - - /** - * Use this regular expression to split strings in breakable lines - * @private - */ - _wordJoiners: /[ \t\r]/, - - /** - * Use this boolean property in order to split strings that have no white space concept. - * this is a cheap way to help with chinese/japanese - * @type Boolean - * @since 2.6.0 - */ - splitByGrapheme: false, - - /** - * Unlike superclass's version of this function, Textbox does not update - * its width. - * @private - * @override - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this._clearCache(); - // clear dynamicMinWidth as it will be different after we re-wrap line - this.dynamicMinWidth = 0; - // wrap lines - this._styleMap = this._generateStyleMap(this._splitText()); - // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap - if (this.dynamicMinWidth > this.width) { - this._set('width', this.dynamicMinWidth); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - // clear cache and re-calculate height - this.height = this.calcTextHeight(); - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Generate an object that translates the style object so that it is - * broken up by visual lines (new lines and automatic wrapping). - * The original text styles object is broken up by actual lines (new lines only), - * which is only sufficient for Text / IText - * @private - */ - _generateStyleMap: function(textInfo) { - var realLineCount = 0, - realLineCharCount = 0, - charCount = 0, - map = {}; - - for (var i = 0; i < textInfo.graphemeLines.length; i++) { - if (textInfo.graphemeText[charCount] === '\n' && i > 0) { - realLineCharCount = 0; - charCount++; - realLineCount++; - } - else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) { - // this case deals with space's that are removed from end of lines when wrapping - realLineCharCount++; - charCount++; - } - - map[i] = { line: realLineCount, offset: realLineCharCount }; - - charCount += textInfo.graphemeLines[i].length; - realLineCharCount += textInfo.graphemeLines[i].length; - } - - return map; - }, - - /** - * Returns true if object has a style property or has it on a specified line - * @param {Number} lineIndex - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (map) { - lineIndex = map.line; - } - } - return fabric.Text.prototype.styleHas.call(this, property, lineIndex); - }, - - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false, - map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1]; - if (map) { - lineIndex = map.line; - offset = map.offset; - } - if (mapNextLine) { - nextLineIndex = mapNextLine.line; - shouldLimit = nextLineIndex === lineIndex; - nextOffset = mapNextLine.offset; - } - obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - } - return true; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (!map) { - return null; - } - lineIndex = map.line; - charIndex = map.offset + charIndex; - } - return this.callSuper('_getStyleDeclaration', lineIndex, charIndex); - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - - this.styles[lineIndex][charIndex] = style; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - delete this.styles[lineIndex][charIndex]; - }, - - /** - * probably broken need a fix - * Returns the real style line that correspond to the wrapped lineIndex line - * Used just to verify if the line does exist or not. - * @param {Number} lineIndex - * @returns {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - return !!this.styles[map.line]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @param {Object} style - * @private - */ - _setLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - this.styles[map.line] = {}; - }, - - /** - * Wraps text using the 'width' property of Textbox. First this function - * splits text on newlines, so we preserve newlines entered by the user. - * Then it wraps each line using the width of the Textbox by calling - * _wrapLine(). - * @param {Array} lines The string array of text that is split into lines - * @param {Number} desiredWidth width you want to wrap to - * @returns {Array} Array of lines - */ - _wrapText: function(lines, desiredWidth) { - var wrapped = [], i; - this.isWrapping = true; - for (i = 0; i < lines.length; i++) { - wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth)); - } - this.isWrapping = false; - return wrapped; - }, - - /** - * Helper function to measure a string of text, given its lineIndex and charIndex offset - * it gets called when charBounds are not available yet. - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {number} lineIndex - * @param {number} charOffset - * @returns {number} - * @private - */ - _measureWord: function(word, lineIndex, charOffset) { - var width = 0, prevGrapheme, skipLeft = true; - charOffset = charOffset || 0; - for (var i = 0, len = word.length; i < len; i++) { - var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft); - width += box.kernedWidth; - prevGrapheme = word[i]; - } - return width; - }, - - /** - * Wraps a line of text using the width of the Textbox and a context. - * @param {Array} line The grapheme array that represent the line - * @param {Number} lineIndex - * @param {Number} desiredWidth width you want to wrap the line to - * @param {Number} reservedSpace space to remove from wrapping for custom functionalities - * @returns {Array} Array of line(s) into which the given text is wrapped - * to. - */ - _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) { - var lineWidth = 0, - splitByGrapheme = this.splitByGrapheme, - graphemeLines = [], - line = [], - // spaces in different languages? - words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners), - word = '', - offset = 0, - infix = splitByGrapheme ? '' : ' ', - wordWidth = 0, - infixWidth = 0, - largestWordWidth = 0, - lineJustStarted = true, - additionalSpace = this._getWidthOfCharSpacing(), - reservedSpace = reservedSpace || 0; - // fix a difference between split and graphemeSplit - if (words.length === 0) { - words.push([]); - } - desiredWidth -= reservedSpace; - for (var i = 0; i < words.length; i++) { - // if using splitByGrapheme words are already in graphemes. - word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]); - wordWidth = this._measureWord(word, lineIndex, offset); - offset += word.length; - - lineWidth += infixWidth + wordWidth - additionalSpace; - if (lineWidth > desiredWidth && !lineJustStarted) { - graphemeLines.push(line); - line = []; - lineWidth = wordWidth; - lineJustStarted = true; - } - else { - lineWidth += additionalSpace; - } - - if (!lineJustStarted && !splitByGrapheme) { - line.push(infix); - } - line = line.concat(word); - - infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset); - offset++; - lineJustStarted = false; - // keep track of largest word - if (wordWidth > largestWordWidth) { - largestWordWidth = wordWidth; - } - } - - i && graphemeLines.push(line); - - if (largestWordWidth + reservedSpace > this.dynamicMinWidth) { - this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace; - } - return graphemeLines; - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @param {Number} lineIndex text to split - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - if (!this._styleMap[lineIndex + 1]) { - // is last line, return true; - return true; - } - if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) { - // this is last line before a line break, return true; - return true; - } - return false; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * @return Number - */ - missingNewlineOffset: function(lineIndex) { - if (this.splitByGrapheme) { - return this.isEndOfWrapping(lineIndex) ? 1 : 0; - } - return 1; - }, - - /** - * Gets lines of text to render in the Textbox. This function calculates - * text wrapping on the fly every time it is called. - * @param {String} text text to split - * @returns {Array} Array of lines in the Textbox. - * @override - */ - _splitTextIntoLines: function(text) { - var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text), - graphemeLines = this._wrapText(newText.lines, this.width), - lines = new Array(graphemeLines.length); - for (var i = 0; i < graphemeLines.length; i++) { - lines[i] = graphemeLines[i].join(''); - } - newText.lines = lines; - newText.graphemeLines = graphemeLines; - return newText; - }, - - getMinWidth: function() { - return Math.max(this.minWidth, this.dynamicMinWidth); - }, - - _removeExtraneousStyles: function() { - var linesToKeep = {}; - for (var prop in this._styleMap) { - if (this._textLines[prop]) { - linesToKeep[this._styleMap[prop].line] = 1; - } - } - for (var prop in this.styles) { - if (!linesToKeep[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)); - } - }); - - /** - * Returns fabric.Textbox instance from an object representation - * @static - * @memberOf fabric.Textbox - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created - */ - fabric.Textbox.fromObject = function(object, callback) { - return fabric.Object._fromObject('Textbox', object, callback, 'text'); - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var controlsUtils = fabric.controlsUtils, - scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler, - scaleStyleHandler = controlsUtils.scaleCursorStyleHandler, - scalingEqually = controlsUtils.scalingEqually, - scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX, - scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY, - scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName, - objectControls = fabric.Object.prototype.controls; - - objectControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mb = new fabric.Control({ - x: 0, - y: 0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mt = new fabric.Control({ - x: 0, - y: -0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.tl = new fabric.Control({ - x: -0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.tr = new fabric.Control({ - x: 0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.bl = new fabric.Control({ - x: -0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.br = new fabric.Control({ - x: 0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.mtr = new fabric.Control({ - x: 0, - y: -0.5, - actionHandler: controlsUtils.rotationWithSnapping, - cursorStyleHandler: controlsUtils.rotationStyleHandler, - offsetY: -40, - withConnection: true, - actionName: 'rotate', - }); - - if (fabric.Textbox) { - // this is breaking the prototype inheritance, no time / ideas to fix it. - // is important to document that if you want to have all objects to have a - // specific custom control, you have to add it to Object prototype and to Textbox - // prototype. The controls are shared as references. So changes to control `tr` - // can still apply to all objects if needed. - var textBoxControls = fabric.Textbox.prototype.controls = { }; - - textBoxControls.mtr = objectControls.mtr; - textBoxControls.tr = objectControls.tr; - textBoxControls.br = objectControls.br; - textBoxControls.tl = objectControls.tl; - textBoxControls.bl = objectControls.bl; - textBoxControls.mt = objectControls.mt; - textBoxControls.mb = objectControls.mb; - - textBoxControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - - textBoxControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - } -})(); - diff --git a/web/static/js9_old/js/fabric-v4.6.0.min.js b/web/static/js9_old/js/fabric-v4.6.0.min.js deleted file mode 100644 index 34c1ff0..0000000 --- a/web/static/js9_old/js/fabric-v4.6.0.min.js +++ /dev/null @@ -1 +0,0 @@ -var jsdom,virtualWindow,fabric=fabric||{version:"4.6.0"};function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,t=t.destinationHeight;i===n&&r===t||(e.width=n,e.height=t)}function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.targetCanvas,t=r.getContext("2d");t.translate(0,r.height),t.scale(1,-1);e=i.height-r.height;t.drawImage(i,0,e,r.width,r.height,0,0,r.width,r.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,n=e.destinationHeight,s=r*n*4,e=new Uint8Array(this.imageBuffer,0,s),s=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,e);n=new ImageData(s,r,n);i.putImageData(n,0,0)}"undefined"!=typeof exports?exports.fabric=fabric:"function"==typeof define&&define.amd&&define([],function(){return fabric}),"undefined"!=typeof document&&"undefined"!=typeof window?(document instanceof("undefined"!=typeof HTMLDocument?HTMLDocument:Document)?fabric.document=document:fabric.document=document.implementation.createHTMLDocument(""),fabric.window=window):(jsdom=require("jsdom"),virtualWindow=new jsdom.JSDOM(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]},resources:"usable"}).window,fabric.document=virtualWindow.document,fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.nodeCanvas=require("jsdom/lib/jsdom/utils").Canvas,fabric.window=virtualWindow,DOMParser=fabric.window.DOMParser),fabric.isTouchSupported="ontouchstart"in fabric.window||"ontouchstart"in fabric.document||fabric.window&&fabric.window.navigator&&0_)for(var C=1,S=v.length;Ct[i-2].x?1:s.x===t[i-2].x?0:-1,h=s.y>t[i-2].y?1:s.y===t[i-2].y?0:-1),n.push(["L",s.x+c*e,s.y+h*e]),n},fabric.util.getPathSegmentsInfo=l,fabric.util.getBoundsOfCurve=v,fabric.util.getPointOnPath=function(t,e,i){i=i||l(t);for(var r=0;0/g,">")},graphemeSplit:function(t){for(var e,i=0,r=[],i=0;it.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,e){return void 0===e&&(e=.5),e=Math.max(Math.min(1,e),0),new i(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)},distanceFrom:function(t){var e=this.x-t.x,t=this.y-t.y;return Math.sqrt(e*e+t*t)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new i(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new i(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new i(this.x,this.y)}}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var a=t.fabric||(t.fabric={});function c(t){this.status=t,this.points=[]}a.Intersection?a.warn("fabric.Intersection is already defined"):(a.Intersection=c,a.Intersection.prototype={constructor:c,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},a.Intersection.intersectLineLine=function(t,e,i,r){var n,s=(r.x-i.x)*(t.y-i.y)-(r.y-i.y)*(t.x-i.x),o=(e.x-t.x)*(t.y-i.y)-(e.y-t.y)*(t.x-i.x),r=(r.y-i.y)*(e.x-t.x)-(r.x-i.x)*(e.y-t.y);return 0!=r?(i=o/r,0<=(r=s/r)&&r<=1&&0<=i&&i<=1?(n=new c("Intersection")).appendPoint(new a.Point(t.x+r*(e.x-t.x),t.y+r*(e.y-t.y))):n=new c):n=new c(0==s||0==o?"Coincident":"Parallel"),n},a.Intersection.intersectLinePolygon=function(t,e,i){for(var r,n,s=new c,o=i.length,a=0;a=t&&(i.x-=t),i.x<=-t&&(i.x+=t),i.y>=t&&(i.y-=t),i.y<=t&&(i.y+=t),i.x-=o.offsetX,i.y-=o.offsetY,i}function w(t){return t.flipX!==t.flipY}function O(t,e,i,r,n){0!==t[e]&&(r=n/t._getTransformedDimensions()[r]*t[i],t.set(i,r))}function k(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(0,s.skewY),i=T(e,e.originX,e.originY,i,r),r=Math.abs(2*i.x)-o.x,i=s.skewX;r<2?n=0:(n=g(Math.atan2(r/s.scaleX,o.y/s.scaleY)),e.originX===c&&e.originY===u&&(n=-n),e.originX===l&&e.originY===h&&(n=-n),w(s)&&(n=-n));e=i!==n;return e&&(i=s._getTransformedDimensions().y,s.set("skewX",n),O(s,"skewY","scaleY","y",i)),e}function P(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(s.skewX,0),i=T(e,e.originX,e.originY,i,r),r=Math.abs(2*i.y)-o.y,i=s.skewY;r<2?n=0:(n=g(Math.atan2(r/s.scaleY,o.x/s.scaleX)),e.originX===c&&e.originY===u&&(n=-n),e.originX===l&&e.originY===h&&(n=-n),w(s)&&(n=-n));e=i!==n;return e&&(i=s._getTransformedDimensions().x,s.set("skewY",n),O(s,"skewX","scaleX","x",i)),e}function E(t,e,i,r,n){var s=e.target,o=s.lockScalingX,a=s.lockScalingY,c=(n=n||{}).by,h=b(t,s),n=_(s,c,h),t=e.gestureScale;if(n)return!1;if(t)l=e.scaleX*t,u=e.scaleY*t;else{if(n=T(e,e.originX,e.originY,i,r),t="y"!==c?p(n.x):1,f="x"!==c?p(n.y):1,e.signX||(e.signX=t),e.signY||(e.signY=f),s.lockScalingFlip&&(e.signX!==t||e.signY!==f))return!1;var l,u,i=s._getTransformedDimensions();u=h&&!c?(r=Math.abs(n.x)+Math.abs(n.y),h=e.original,r=r/(Math.abs(i.x*h.scaleX/s.scaleX)+Math.abs(i.y*h.scaleY/s.scaleY)),l=h.scaleX*r,h.scaleY*r):(l=Math.abs(n.x*s.scaleX/i.x),Math.abs(n.y*s.scaleY/i.y)),y(e)&&(l*=2,u*=2),e.signX!==t&&"y"!==c&&(e.originX=d[e.originX],l*=-1,e.signX=t),e.signY!==f&&"x"!==c&&(e.originY=d[e.originY],u*=-1,e.signY=f)}var e=s.scaleX,f=s.scaleY;return c?("x"===c&&s.set("scaleX",l),"y"===c&&s.set("scaleY",u)):(o||s.set("scaleX",l),a||s.set("scaleY",u)),e!==s.scaleX||f!==s.scaleY}o.scaleCursorStyleHandler=function(t,e,i){var r=b(t,i),t="";return 0!==e.x&&0===e.y?t="x":0===e.x&&0!==e.y&&(t="y"),_(i,t,r)?"not-allowed":(e=m(i,e),n[e]+"-resize")},o.skewCursorStyleHandler=function(t,e,i){var r="not-allowed";return 0!==e.x&&i.lockSkewingY||0!==e.y&&i.lockSkewingX?r:(e=m(i,e)%4,s[e]+"-resize")},o.scaleSkewCursorStyleHandler=function(t,e,i){return t[i.canvas.altActionKey]?o.skewCursorStyleHandler(t,e,i):o.scaleCursorStyleHandler(t,e,i)},o.rotationWithSnapping=S("rotating",C(function(t,e,i,r){var n=e,s=n.target,o=s.translateToOriginPoint(s.getCenterPoint(),n.originX,n.originY);return!s.lockRotation&&(e=Math.atan2(n.ey-o.y,n.ex-o.x),r=Math.atan2(r-o.y,i-o.x),i=g(r-e+n.theta),0r.r2,o=(this.gradientTransform||fabric.iMatrix).concat(),a=-this.offsetX,c=-this.offsetY,h=!!e.additionalTransform,l="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox";if(n.sort(function(t,e){return t.offset-e.offset}),"objectBoundingBox"==l?(a/=t.width,c/=t.height):(a+=t.width/2,c+=t.height/2),"path"===t.type&&"percentage"!==this.gradientUnits&&(a-=t.pathOffset.x,c-=t.pathOffset.y),o[4]-=a,o[5]-=c,l='id="SVGID_'+this.id+'" gradientUnits="'+l+'"',l+=' gradientTransform="'+(h?e.additionalTransform+" ":"")+fabric.util.matrixToSVG(o)+'" ',"linear"===this.type?i=["\n']:"radial"===this.type&&(i=["\n']),"radial"===this.type){if(s)for((n=n.concat()).reverse(),f=0,d=n.length;f\n')}return i.push("linear"===this.type?"\n":"\n"),i.join("")},toLive:function(t){var e,i,r,n=fabric.util.object.clone(this.coords);if(this.type){for("linear"===this.type?e=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(e=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2)),i=0,r=this.colorStops.length;i\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e=this.source;if(!e)return"";if(void 0!==e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var o=t.fabric||(t.fabric={}),a=o.util.toFixed;o.Shadow?o.warn("fabric.Shadow is already defined."):(o.Shadow=o.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1,initialize:function(t){for(var e in t="string"==typeof t?this._parseShadow(t):t)this[e]=t[e];this.id=o.Object.__uid++},_parseShadow:function(t){var e=t.trim(),t=o.Shadow.reOffsetsAndBlur.exec(e)||[];return{color:(e.replace(o.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)").trim(),offsetX:parseFloat(t[1],10)||0,offsetY:parseFloat(t[2],10)||0,blur:parseFloat(t[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var e=40,i=40,r=o.Object.NUM_FRACTION_DIGITS,n=o.util.rotateVector({x:this.offsetX,y:this.offsetY},o.util.degreesToRadians(-t.angle)),s=new o.Color(this.color);return t.width&&t.height&&(e=100*a((Math.abs(n.x)+this.blur)/t.width,r)+20,i=100*a((Math.abs(n.y)+this.blur)/t.height,r)+20),t.flipX&&(n.x*=-1),t.flipY&&(n.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling};var e={},i=o.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke","nonScaling"].forEach(function(t){this[t]!==i[t]&&(e[t]=this[t])},this),e}}),o.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/)}("undefined"!=typeof exports?exports:this),function(){"use strict";var n,t,h,a,s,o,i,r,e;fabric.StaticCanvas?fabric.warn("fabric.StaticCanvas is already defined."):(n=fabric.util.object.extend,t=fabric.util.getElementOffset,h=fabric.util.removeFromArray,a=fabric.util.toFixed,s=fabric.util.transformPoint,o=fabric.util.invertTransform,i=fabric.util.getNodeCanvas,r=fabric.util.createCanvasElement,e=new Error("Could not initialize `canvas` element"),fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e=e||{},this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,clipPath:void 0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1!==fabric.devicePixelRatio&&this.enableRetinaScaling},getRetinaScaling:function(){return this._isRetinaScaling()?fabric.devicePixelRatio:1},_initRetinaScaling:function(){var t;this._isRetinaScaling()&&(t=fabric.devicePixelRatio,this.__initRetinaScaling(t,this.lowerCanvasEl,this.contextContainer),this.upperCanvasEl&&this.__initRetinaScaling(t,this.upperCanvasEl,this.contextTop))},__initRetinaScaling:function(t,e,i){e.setAttribute("width",this.width*t),e.setAttribute("height",this.height*t),i.scale(t,t)},calcOffset:function(){return this._offset=t(this.lowerCanvasEl),this},setOverlayImage:function(t,e,i){return this.__setBgOverlayImage("overlayImage",t,e,i)},setBackgroundImage:function(t,e,i){return this.__setBgOverlayImage("backgroundImage",t,e,i)},setOverlayColor:function(t,e){return this.__setBgOverlayColor("overlayColor",t,e)},setBackgroundColor:function(t,e){return this.__setBgOverlayColor("backgroundColor",t,e)},__setBgOverlayImage:function(r,t,n,s){return"string"==typeof t?fabric.util.loadImage(t,function(t,e){var i;t&&(i=new fabric.Image(t,s),(this[r]=i).canvas=this),n&&n(t,e)},this,s&&s.crossOrigin):(s&&t.setOptions(s),(this[r]=t)&&(t.canvas=this),n&&n(t,!1)),this},__setBgOverlayColor:function(t,e,i){return this[t]=e,this._initGradient(e,t),this._initPattern(e,t,i),this},_createCanvasElement:function(){var t=r();if(!t)throw e;if(t.style||(t.style={}),void 0===t.getContext)throw e;return t},_initOptions:function(t){var e=this.lowerCanvasEl;this._setOptions(t),this.width=this.width||parseInt(e.width,10)||0,this.height=this.height||parseInt(e.height,10)||0,this.lowerCanvasEl.style&&(e.width=this.width,e.height=this.height,e.style.width=this.width+"px",e.style.height=this.height+"px",this.viewportTransform=this.viewportTransform.slice())},_createLowerCanvas:function(t){t&&t.getContext?this.lowerCanvasEl=t:this.lowerCanvasEl=fabric.util.getById(t)||this._createCanvasElement(),fabric.util.addClass(this.lowerCanvasEl,"lower-canvas"),this._originalCanvasStyle=this.lowerCanvasEl.style,this.interactive&&this._applyCanvasStyle(this.lowerCanvasEl),this.contextContainer=this.lowerCanvasEl.getContext("2d")},getWidth:function(){return this.width},getHeight:function(){return this.height},setWidth:function(t,e){return this.setDimensions({width:t},e)},setHeight:function(t,e){return this.setDimensions({height:t},e)},setDimensions:function(t,e){var i,r;for(r in e=e||{},t)i=t[r],e.cssOnly||(this._setBackstoreDimension(r,t[r]),i+="px",this.hasLostContext=!0),e.backstoreOnly||this._setCssDimension(r,i);return this._isCurrentlyDrawing&&this.freeDrawingBrush&&this.freeDrawingBrush._setBrushStyles(),this._initRetinaScaling(),this.calcOffset(),e.cssOnly||this.requestRenderAll(),this},_setBackstoreDimension:function(t,e){return this.lowerCanvasEl[t]=e,this.upperCanvasEl&&(this.upperCanvasEl[t]=e),this.cacheCanvasEl&&(this.cacheCanvasEl[t]=e),this[t]=e,this},_setCssDimension:function(t,e){return this.lowerCanvasEl.style[t]=e,this.upperCanvasEl&&(this.upperCanvasEl.style[t]=e),this.wrapperEl&&(this.wrapperEl.style[t]=e),this},getZoom:function(){return this.viewportTransform[0]},setViewportTransform:function(t){var e,i,r,n=this._activeObject,s=this.backgroundImage,o=this.overlayImage;for(this.viewportTransform=t,i=0,r=this._objects.length;i\n'),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("\n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push(""),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,r=e.width||this.width,n=e.height||this.height,s='viewBox="0 0 '+this.width+" "+this.height+'" ',o=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?s='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,s='viewBox="'+a(-i[4]/i[0],o)+" "+a(-i[5]/i[3],o)+" "+a(this.width/i[0],o)+" "+a(this.height/i[3],o)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")},createSVGClipPathMarkup:function(t){var e=this.clipPath;return e?(e.clipPathId="CLIPPATH_"+fabric.Object.__uid++,'\n'+this.clipPath.toClipPathSVG(t.reviver)+"\n"):""},createSVGRefElementsMarkup:function(){var n=this;return["background","overlay"].map(function(t){var e=n[t+"Color"];if(e&&e.toLive){var i=n[t+"Vpt"],r=n.viewportTransform,t={width:n.width/(i?r[0]:1),height:n.height/(i?r[3]:1)};return e.toSVG(t,{additionalTransform:i?fabric.util.matrixToSVG(r):""})}}).join("")},createSVGFontFacesMarkup:function(){var t,e,i,r,n,s,o,a,c,h="",l={},u=fabric.fontPaths,f=[];for(this._objects.forEach(function t(e){f.push(e),e._objects&&e._objects.forEach(t)}),o=0,a=f.length;o',"\n",h,"","\n"].join("")},_setSVGObjects:function(t,e){for(var i,r=this._objects,n=0,s=r.length;n
    \n")):t.push('\n"))},sendToBack:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(e=(r=n._objects).length;e--;)i=r[e],h(this._objects,i),this._objects.unshift(i);else h(this._objects,t),this._objects.unshift(t);return this.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(r=n._objects,e=0;e"}}),n(fabric.StaticCanvas.prototype,fabric.Observable),n(fabric.StaticCanvas.prototype,fabric.Collection),n(fabric.StaticCanvas.prototype,fabric.DataURLExporter),n(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=r();if(!e||!e.getContext)return null;e=e.getContext("2d");return!e||"setLineDash"!==t?null:void 0!==e.setLineDash}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject,fabric.isLikelyNode&&(fabric.StaticCanvas.prototype.createPNGStream=function(){var t=i(this.lowerCanvasEl);return t&&t.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){var e=i(this.lowerCanvasEl);return e&&e.createJPEGStream(t)}))}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeMiterLimit:10,strokeDashArray:null,limitedToCanvasSize:!1,_setBrushStyles:function(){var t=this.canvas.contextTop;t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])},_saveAndTransform:function(t){var e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])},_setShadow:function(){var t,e,i,r;this.shadow&&(t=this.canvas,e=this.shadow,i=t.contextTop,r=t.getZoom(),t&&t._isRetinaScaling()&&(r*=fabric.devicePixelRatio),i.shadowColor=e.color,i.shadowBlur=e.blur*r,i.shadowOffsetX=e.offsetX*r,i.shadowOffsetY=e.offsetY*r)},needsFullRender:function(){return new fabric.Color(this.color).getAlpha()<1||!!this.shadow},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0},_isOutSideCanvas:function(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}),fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{decimate:.4,initialize:function(t){this.canvas=t,this._points=[]},_drawSegment:function(t,e,i){i=e.midPointFrom(i);return t.quadraticCurveTo(e.x,e.y,i.x,i.y),i},onMouseDown:function(t,e){this.canvas._isMainEvent(e.e)&&(this._prepareForDrawing(t),this._captureDrawingPath(t),this._render())},onMouseMove:function(t,e){var i;this.canvas._isMainEvent(e.e)&&(!0===this.limitedToCanvasSize&&this._isOutSideCanvas(t)||this._captureDrawingPath(t)&&1"},getObjectScaling:function(){if(!this.group)return{scaleX:this.scaleX,scaleY:this.scaleY};var t=g.util.qrDecompose(this.calcTransformMatrix());return{scaleX:Math.abs(t.scaleX),scaleY:Math.abs(t.scaleY)}},getTotalObjectScaling:function(){var t,e=this.getObjectScaling(),i=e.scaleX,r=e.scaleY;return this.canvas&&(i*=(t=this.canvas.getZoom())*(e=this.canvas.getRetinaScaling()),r*=t*e),{scaleX:i,scaleY:r}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_set:function(t,e){var i,r=this[t]!==e;return("scaleX"===t||"scaleY"===t)&&(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof g.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",e):e=new g.Shadow(e),this[t]=e,r&&(i=this.group&&this.group.isOnACache(),-1=t.x&&r.left+r.width<=e.x&&r.top>=t.y&&r.top+r.height<=e.y},containsPoint:function(t,e,i,r){r=this._getCoords(i,r),e=e||this._getImageLines(r),e=this._findCrossPoints(t,e);return 0!==e&&e%2==1},isOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.getCoords(!0,t).some(function(t){return t.x<=i.x&&t.x>=e.x&&t.y<=i.y&&t.y>=e.y})||(!!this.intersectsWithRect(e,i,!0,t)||this._containsCenterOfCanvas(e,i,t))},_containsCenterOfCanvas:function(t,e,i){e={x:(t.x+e.x)/2,y:(t.y+e.y)/2};return!!this.containsPoint(e,null,!0,i)},isPartiallyOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.intersectsWithRect(e,i,!0,t)||this.getCoords(!0,t).every(function(t){return(t.x>=i.x||t.x<=e.x)&&(t.y>=i.y||t.y<=e.y)})&&this._containsCenterOfCanvas(e,i,t)},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s=0;for(n in e)if(!((r=e[n]).o.y=t.y&&r.d.y>=t.y||((r.o.x===r.d.x&&r.o.x>=t.x?r.o.x:(i=(r.d.y-r.o.y)/(r.d.x-r.o.x),-(t.y-0*t.x-(r.o.y-i*r.o.x))/(0-i)))>=t.x&&(s+=1),2!==s)))break;return s},getBoundingRect:function(t,e){e=this.getCoords(t,e);return s.makeBoundingBoxFromPoints(e)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)
    \n'))},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})},toClipPathSVG:function(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})},_createBaseClipPathSVGMarkup:function(t,e){var i=(e=e||{}).reviver,r=e.additionalTransform||"",e=[this.getSvgTransform(!0,r),this.getSvgCommons()].join(""),r=t.indexOf("COMMON_PARTS");return t[r]=e,i?i(t.join("")):t.join("")},_createBaseSVGMarkup:function(t,e){var i,r=(e=e||{}).noStyle,n=e.reviver,s=r?"":'style="'+this.getSvgStyles()+'" ',o=e.withShadow?'style="'+this.getSvgFilter()+'" ':"",a=this.clipPath,c=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",h=a&&a.absolutePositioned,l=this.stroke,u=this.fill,f=this.shadow,d=[],g=t.indexOf("COMMON_PARTS"),e=e.additionalTransform;return a&&(a.clipPathId="CLIPPATH_"+fabric.Object.__uid++,i='\n'+a.toClipPathSVG(n)+"\n"),h&&d.push("\n"),d.push("\n"),e=[s,c,r?"":this.addPaintOrder()," ",e?'transform="'+e+'" ':""].join(""),t[g]=e,u&&u.toLive&&d.push(u.toSVG(this)),l&&l.toLive&&d.push(l.toSVG(this)),f&&d.push(f.toSVG(this)),a&&d.push(i),d.push(t.join("")),d.push("\n"),h&&d.push("\n"),n?n(d.join("")):d.join("")},addPaintOrder:function(){return"fill"!==this.paintFirst?' paint-order="'+this.paintFirst+'" ':""}})}(),function(){var n=fabric.util.object.extend,r="stateProperties";function s(e,t,i){var r={};i.forEach(function(t){r[t]=e[t]}),n(e[t],r,!0)}fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(t){var e="_"+(t=t||r);return Object.keys(this[e]).length\n']}}),n.Line.ATTRIBUTE_NAMES=n.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),n.Line.fromElement=function(t,e,i){i=i||{};var r=n.parseAttributes(t,n.Line.ATTRIBUTE_NAMES),t=[r.x1||0,r.y1||0,r.x2||0,r.y2||0];e(new n.Line(t,s(r,i)))},n.Line.fromObject=function(t,e){var i=r(t,!0);i.points=[t.x1,t.y1,t.x2,t.y2],n.Object._fromObject("Line",i,function(t){delete t.points,e&&e(t)},"points")})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var s=t.fabric||(t.fabric={}),o=Math.PI;s.Circle?s.warn("fabric.Circle is already defined."):(s.Circle=s.util.createClass(s.Object,{type:"circle",radius:0,startAngle:0,endAngle:2*o,cacheProperties:s.Object.prototype.cacheProperties.concat("radius","startAngle","endAngle"),_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},_toSVG:function(){var t,e,i,r,n=(this.endAngle-this.startAngle)%(2*o);return 0==n?["\n']:(t=s.util.cos(this.startAngle)*this.radius,e=s.util.sin(this.startAngle)*this.radius,i=s.util.cos(this.endAngle)*this.radius,r=s.util.sin(this.endAngle)*this.radius,['\n"])},_render:function(t){t.beginPath(),t.arc(0,0,this.radius,this.startAngle,this.endAngle,!1),this._renderPaintInOrder(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),s.Circle.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),s.Circle.fromElement=function(t,e){var i=s.parseAttributes(t,s.Circle.ATTRIBUTE_NAMES);if(!("radius"in(t=i)&&0<=t.radius))throw new Error("value of `r` attribute is required and can not be negative");i.left=(i.left||0)-i.radius,i.top=(i.top||0)-i.radius,e(new s.Circle(i))},s.Circle.fromObject=function(t,e){s.Object._fromObject("Circle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var i=t.fabric||(t.fabric={});i.Triangle?i.warn("fabric.Triangle is already defined"):(i.Triangle=i.util.createClass(i.Object,{type:"triangle",width:100,height:100,_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)},_toSVG:function(){var t=this.width/2,e=this.height/2;return["']}}),i.Triangle.fromObject=function(t,e){return i.Object._fromObject("Triangle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var i=t.fabric||(t.fabric={}),e=2*Math.PI;i.Ellipse?i.warn("fabric.Ellipse is already defined."):(i.Ellipse=i.util.createClass(i.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:i.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,e,!1),t.restore(),this._renderPaintInOrder(t)}}),i.Ellipse.ATTRIBUTE_NAMES=i.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),i.Ellipse.fromElement=function(t,e){t=i.parseAttributes(t,i.Ellipse.ATTRIBUTE_NAMES);t.left=(t.left||0)-t.rx,t.top=(t.top||0)-t.ry,e(new i.Ellipse(t))},i.Ellipse.fromObject=function(t,e){i.Object._fromObject("Ellipse",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var r=t.fabric||(t.fabric={}),n=r.util.object.extend;r.Rect?r.warn("fabric.Rect is already defined"):(r.Rect=r.util.createClass(r.Object,{stateProperties:r.Object.prototype.stateProperties.concat("rx","ry"),type:"rect",rx:0,ry:0,cacheProperties:r.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t){var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,c=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-c*e,o,s+r,o+c*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-c*i,s+r-c*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+c*e,o+n,s,o+n-c*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+c*i,s+c*e,o,s+e,o),t.closePath(),this._renderPaintInOrder(t)},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']}}),r.Rect.ATTRIBUTE_NAMES=r.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),r.Rect.fromElement=function(t,e,i){if(!t)return e(null);i=i||{};t=r.parseAttributes(t,r.Rect.ATTRIBUTE_NAMES);t.left=t.left||0,t.top=t.top||0,t.height=t.height||0,t.width=t.width||0;t=new r.Rect(n(i?r.util.object.clone(i):{},t));t.visible=t.visible&&0\n']},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){return r(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()})})},toDatalessObject:function(t){t=this.toObject(["sourcePath"].concat(t));return t.sourcePath&&delete t.path,t},_toSVG:function(){return["\n"]},_getOffsetTransform:function(){var t=f.Object.NUM_FRACTION_DIGITS;return" translate("+e(-this.pathOffset.x,t)+", "+e(-this.pathOffset.y,t)+")"},toClipPathSVG:function(t){var e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},toSVG:function(t){var e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},complexity:function(){return this.path.length},_calcDimensions:function(){for(var t,e,i=[],r=[],n=0,s=0,o=0,a=0,c=0,h=this.path.length;c"},addWithUpdate:function(t){var e=!!this.group;return this._restoreObjectsState(),o.util.resetObjectTransform(this),t&&(e&&o.util.removeTransformFromObject(t,this.group.calcTransformMatrix()),this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,e?this.group.addWithUpdate():this.setCoords(),this},removeWithUpdate:function(t){return this._restoreObjectsState(),o.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);if("canvas"===t)for(;i--;)this._objects[i]._set(t,e);o.Object.prototype._set.call(this,t,e)},toObject:function(r){var n=this.includeDefaultValues,t=this._objects.filter(function(t){return!t.excludeFromExport}).map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toObject(r);return t.includeDefaultValues=e,i}),e=o.Object.prototype.toObject.call(this,r);return e.objects=t,e},toDatalessObject:function(r){var n,t,e=this.sourcePath;t=e||(n=this.includeDefaultValues,this._objects.map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toDatalessObject(r);return t.includeDefaultValues=e,i}));e=o.Object.prototype.toDatalessObject.call(this,r);return e.objects=t,e},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=o.Object.prototype.shouldCache.call(this);if(t)for(var e=0,i=this._objects.length;e\n"],i=0,r=this._objects.length;i\n"),e},getSvgStyles:function(){var t=void 0!==this.opacity&&1!==this.opacity?"opacity: "+this.opacity+";":"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")},toClipPathSVG:function(t){for(var e=[],i=0,r=this._objects.length;i"},shouldCache:function(){return!1},isOnACache:function(){return!1},_renderControls:function(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.callSuper("_renderControls",t,e),void 0===(i=i||{}).hasControls&&(i.hasControls=!1),i.forActiveSelection=!0;for(var r=0,n=this._objects.length;r\n','\t\n',"\n"),a=' clip-path="url(#imageCrop_'+e+')" '),this.imageSmoothing||(c='" image-rendering="optimizeSpeed'),r.push("\t\n"),(this.stroke||this.strokeDashArray)&&(a=this.fill,this.fill=null,t=["\t\n'],this.fill=a),i="fill"!==this.paintFirst?i.concat(t,r):i.concat(r,t)):[]},getSrc:function(t){t=t?this._element:this._originalElement;return t?t.toDataURL?t.toDataURL():this.srcFromAttribute?t.getAttribute("src"):t.src:this.src||""},setSrc:function(t,i,r){return fabric.util.loadImage(t,function(t,e){this.setElement(t,r),this._setWidthHeight(),i&&i(this,e)},this,r&&r.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.scaleX,n=i.scaleY,s=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||e=t,o=["highp","mediump","lowp"],a=0;a<3;a++)if(r=void 0,r="precision "+(i=o[a])+" float;\nvoid main(){}",i=(e=s).createShader(e.FRAGMENT_SHADER),e.shaderSource(i,r),e.compileShader(i),!!e.getShaderParameter(i,e.COMPILE_STATUS)){fabric.webGlPrecision=o[a];break}}return this.isSupported=n},(fabric.WebglFilterBackend=t).prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.aPosition=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i=void 0!==window.performance;try{new ImageData(1,1),s=!0}catch(t){s=!1}var r="undefined"!=typeof ArrayBuffer,n="undefined"!=typeof Uint8ClampedArray;if(i&&s&&r&&n){var s=fabric.util.createCanvasElement(),r=new ArrayBuffer(t*e*4);if(fabric.forceGLPutImageData)return this.imageBuffer=r,void(this.copyGLTo2D=copyGLTo2DPutImageData);n={imageBuffer:r,destinationWidth:t,destinationHeight:e,targetCanvas:s};s.width=t,s.height=e,s=window.performance.now(),copyGLTo2DDrawImage.call(n,this.gl,n),e=window.performance.now()-s,s=window.performance.now(),copyGLTo2DPutImageData.call(n,this.gl,n),window.performance.now()-s 0.0) {\n"+this.fragmentSource[t]+"}\n}"},retrieveShader:function(t){var e,i=this.type+"_"+this.mode;return t.programCache.hasOwnProperty(i)||(e=this.buildSource(this.mode),t.programCache[i]=this.createProgram(t.context,e)),t.programCache[i]},applyTo2d:function(t){for(var e,i,r,n=t.imageData.data,s=n.length,o=1-this.alpha,t=new u.Color(this.color).getSource(),a=t[0]*this.alpha,c=t[1]*this.alpha,h=t[2]*this.alpha,l=0;l'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){var e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))},_setTextStyles:function(t,e,i){t.textBaseline="alphabetic",t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;ethis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===t||(this.restartCursorIfNeeded(),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection())))},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),r=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:r,selectionEnd:r};e=i.slice(t,e);return{selectionStart:r,selectionEnd:r+fabric.util.string.graphemeSplit(e).length}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}},_updateTextarea:function(){var t;this.cursorOffsetCache={},this.hiddenTextarea&&(this.inCompositionMode||(t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text),this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd),this.updateTextareaPosition())},updateFromTextArea:function(){var t;this.hiddenTextarea&&(this.cursorOffsetCache={},this.text=this.hiddenTextarea.value,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition())},updateTextareaPosition:function(){var t;this.selectionStart===this.selectionEnd&&(t=this._calcTextareaPosition(),this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top)},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.calcTransformMatrix(),t={x:e.left+o,y:e.top+e.topOffset+s},i=this.canvas.getRetinaScaling(),r=this.canvas.upperCanvasEl,n=r.width/i,o=r.height/i,e=n-s,i=o-s,n=r.clientWidth/n,o=r.clientHeight/o,t=fabric.util.transformPoint(t,a);return(t=fabric.util.transformPoint(t,this.canvas.viewportTransform)).x*=n,t.y*=o,t.x<0&&(t.x=0),t.x>e&&(t.x=e),t.y<0&&(t.y=0),t.y>i&&(t.y=i),t.x+=this.canvas._offset.left,t.y+=this.canvas._offset.top,{left:t.x+"px",top:t.y+"px",fontSize:s+"px",charHeight:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text,e=this.hiddenTextarea;return this.selected=!1,this.isEditing=!1,this.selectionEnd=this.selectionStart,e&&(e.blur&&e.blur(),e.parentNode&&e.parentNode.removeChild(e)),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},removeStyleFromTo:function(t,e){var t=this.get2DCursorLocation(t,!0),e=this.get2DCursorLocation(e,!0),i=t.lineIndex,r=t.charIndex,n=e.lineIndex,s=e.charIndex;if(i!==n){if(this.styles[i])for(l=r;lt?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown)},onMouseDown:function(t){var e;this.canvas&&(this.__newClickTime=+new Date,e=t.pointer,this.isTripleClick(e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected)},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},doubleClickHandler:function(t){this.isEditing&&this.selectWord(this.getSelectionStartFromPointer(t.e))},tripleClickHandler:function(t){this.isEditing&&this.selectLine(this.getSelectionStartFromPointer(t.e))},initClicks:function(){this.on("mousedblclick",this.doubleClickHandler),this.on("tripleclick",this.tripleClickHandler)},_mouseDownHandler:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.__isMousedown=!0,this.selected&&(this.inCompositionMode=!1,this.setCursorByClick(t.e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()))},_mouseDownHandlerBefore:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.selected=this===this.canvas._activeObject)},initMousedownHandler:function(){this.on("mousedown",this._mouseDownHandler),this.on("mousedown:before",this._mouseDownHandlerBefore)},initMouseupHandler:function(){this.on("mouseup",this.mouseUpHandler)},mouseUpHandler:function(t){if(this.__isMousedown=!1,!(!this.editable||this.group||t.transform&&t.transform.actionPerformed||t.e.button&&1!==t.e.button)){if(this.canvas){var e=this.canvas._activeObject;if(e&&e!==this)return}this.__lastSelected&&!this.__corner?(this.selected=!1,this.__lastSelected=!1,this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()):this.selected=!0}},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e=this.getLocalPointer(t),i=0,r=0,n=0,s=0,o=0,a=0,c=this._textLines.length;athis._text.length?this._text.length:t}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; paddingーtop: "+t.fontSize+";",(this.hiddenTextareaContainer||fabric.document.body).appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},keysMap:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},keysMapRtl:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorLeft",36:"moveCursorRight",37:"moveCursorRight",38:"moveCursorUp",39:"moveCursorLeft",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){var e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),33<=t.keyCode&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n,s=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,o=this._text.length,a=s.length,c=a-o,h=this.selectionStart,l=this.selectionEnd,u=h!==l;if(""===this.hiddenTextarea.value)return this.styles={},this.updateFromTextArea(),this.fire("changed"),void(this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll()));var f=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),t=h>f.selectionStart;u?(n=this._text.slice(h,l),c+=l-h):a=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){t=this["get"+t+"CursorOffset"](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(t):this.moveCursorWithoutShift(t),0!==t&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){t="moveCursor"+t+"With";this._currentCursorOpacity=1,e.shiftKey?t+="Shift":t+="outShift",this[t](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t,e){this.removeStyleFromTo(t,e=void 0===e?t+1:e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()},insertChars:function(t,e,i,r){i<(r=void 0===r?i:r)&&this.removeStyleFromTo(i,r);t=fabric.util.string.graphemeSplit(t);this.insertNewStyleBlock(t,i,e),this._text=[].concat(this._text.slice(0,i),t,this._text.slice(r)),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()}}),function(){var a=fabric.util.toFixed,c=/ +/g;fabric.util.object.extend(fabric.Text.prototype,{_toSVG:function(){var t=this._getSVGLeftTopOffsets(),t=this._getSVGTextAndBg(t.textTop,t.textLeft);return this._wrapSVGTextAndBg(t)},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,noStyle:!0,withShadow:!0})},_getSVGLeftTopOffsets:function(){return{textLeft:-this.width/2,textTop:-this.height/2,lineTop:this.getHeightOfLine(0)}},_wrapSVGTextAndBg:function(t){var e=this.getSvgTextDecoration(this);return[t.textBgRects.join(""),'\t\t",t.textSpans.join(""),"\n"]},_getSVGTextAndBg:function(t,e){var i,r=[],n=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(t),""].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,c=this.getHeightOfLine(e),h=-1!==this.textAlign.indexOf("justify"),l="",u=0,f=this._textLines[e];r+=c*(1-this._fontSizeFraction)/this.lineHeight;for(var d=0,g=f.length-1;d<=g;d++)a=d===g||this.charSpacing,l+=f[d],o=this.__charBounds[e][d],0===u?(i+=o.kernedWidth-o.width,u+=o.width):u+=o.kernedWidth,(a=h&&!a&&this._reSpaceAndTab.test(f[d])?!0:a)||(n=n||this.getCompleteStyleDeclaration(e,d),s=this.getCompleteStyleDeclaration(e,d+1),a=this._hasStyleChangedForSvg(n,s)),a&&(a=this._getStyleDeclaration(e,d)||{},t.push(this._createTextCharSpan(l,a,i,r)),l="",n=s,i+=u,u=0)},_pushTextBgRect:function(t,e,i,r,n,s){var o=fabric.Object.NUM_FRACTION_DIGITS;t.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,c=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),-1!==this.textAlign.indexOf("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight(),this.saveState({propertySet:"_dimensionAffectingProps"}))},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;sthis.dynamicMinWidth&&(this.dynamicMinWidth=g-m+r),c},isEndOfWrapping:function(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line},missingNewlineOffset:function(t){return!this.splitByGrapheme||this.isEndOfWrapping(t)?1:0},_splitTextIntoLines:function(t){for(var t=b.Text.prototype._splitTextIntoLines.call(this,t),e=this._wrapText(t.lines,this.width),i=new Array(e.length),r=0;r 0); - -/** - * True when in environment that's probably Node.js - * @type boolean - */ -fabric.isLikelyNode = typeof Buffer !== 'undefined' && - typeof window === 'undefined'; - -/* _FROM_SVG_START_ */ -/** - * Attributes parsed from all SVG elements - * @type array - */ -fabric.SHARED_ATTRIBUTES = [ - 'display', - 'transform', - 'fill', 'fill-opacity', 'fill-rule', - 'opacity', - 'stroke', 'stroke-dasharray', 'stroke-linecap', 'stroke-dashoffset', - 'stroke-linejoin', 'stroke-miterlimit', - 'stroke-opacity', 'stroke-width', - 'id', 'paint-order', 'vector-effect', - 'instantiated_by_use', 'clip-path', -]; -/* _FROM_SVG_END_ */ - -/** - * Pixel per Inch as a default value set to 96. Can be changed for more realistic conversion. - */ -fabric.DPI = 96; -fabric.reNum = '(?:[-+]?(?:\\d+|\\d*\\.\\d+)(?:[eE][-+]?\\d+)?)'; -fabric.commaWsp = '(?:\\s+,?\\s*|,\\s*)'; -fabric.rePathCommand = /([-+]?((\d+\.\d+)|((\d+)|(\.\d+)))(?:[eE][-+]?\d+)?)/ig; -fabric.reNonWord = /[ \n\.,;!\?\-]/; -fabric.fontPaths = { }; -fabric.iMatrix = [1, 0, 0, 1, 0, 0]; -fabric.svgNS = 'http://www.w3.org/2000/svg'; - -/** - * Pixel limit for cache canvases. 1Mpx , 4Mpx should be fine. - * @since 1.7.14 - * @type Number - * @default - */ -fabric.perfLimitSizeTotal = 2097152; - -/** - * Pixel limit for cache canvases width or height. IE fixes the maximum at 5000 - * @since 1.7.14 - * @type Number - * @default - */ -fabric.maxCacheSideLimit = 4096; - -/** - * Lowest pixel limit for cache canvases, set at 256PX - * @since 1.7.14 - * @type Number - * @default - */ -fabric.minCacheSideLimit = 256; - -/** - * Cache Object for widths of chars in text rendering. - */ -fabric.charWidthsCache = { }; - -/** - * if webgl is enabled and available, textureSize will determine the size - * of the canvas backend - * @since 2.0.0 - * @type Number - * @default - */ -fabric.textureSize = 2048; - -/** - * When 'true', style information is not retained when copy/pasting text, making - * pasted text use destination style. - * Defaults to 'false'. - * @type Boolean - * @default - */ -fabric.disableStyleCopyPaste = false; - -/** - * Enable webgl for filtering picture is available - * A filtering backend will be initialized, this will both take memory and - * time since a default 2048x2048 canvas will be created for the gl context - * @since 2.0.0 - * @type Boolean - * @default - */ -fabric.enableGLFiltering = true; - -/** - * Device Pixel Ratio - * @see https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/HTML-canvas-guide/SettingUptheCanvas/SettingUptheCanvas.html - */ -fabric.devicePixelRatio = fabric.window.devicePixelRatio || - fabric.window.webkitDevicePixelRatio || - fabric.window.mozDevicePixelRatio || - 1; -/** - * Browser-specific constant to adjust CanvasRenderingContext2D.shadowBlur value, - * which is unitless and not rendered equally across browsers. - * - * Values that work quite well (as of October 2017) are: - * - Chrome: 1.5 - * - Edge: 1.75 - * - Firefox: 0.9 - * - Safari: 0.95 - * - * @since 2.0.0 - * @type Number - * @default 1 - */ -fabric.browserShadowBlurConstant = 1; - -/** - * This object contains the result of arc to bezier conversion for faster retrieving if the same arc needs to be converted again. - * It was an internal variable, is accessible since version 2.3.4 - */ -fabric.arcToSegmentsCache = { }; - -/** - * This object keeps the results of the boundsOfCurve calculation mapped by the joined arguments necessary to calculate it. - * It does speed up calculation, if you parse and add always the same paths, but in case of heavy usage of freedrawing - * you do not get any speed benefit and you get a big object in memory. - * The object was a private variable before, while now is appended to the lib so that you have access to it and you - * can eventually clear it. - * It was an internal variable, is accessible since version 2.3.4 - */ -fabric.boundsOfCurveCache = { }; - -/** - * If disabled boundsOfCurveCache is not used. For apps that make heavy usage of pencil drawing probably disabling it is better - * @default true - */ -fabric.cachesBoundsOfCurve = true; - -/** - * Skip performance testing of setupGLContext and force the use of putImageData that seems to be the one that works best on - * Chrome + old hardware. if your users are experiencing empty images after filtering you may try to force this to true - * this has to be set before instantiating the filtering backend ( before filtering the first image ) - * @type Boolean - * @default false - */ -fabric.forceGLPutImageData = false; - -fabric.initFilterBackend = function() { - if (fabric.enableGLFiltering && fabric.isWebglSupported && fabric.isWebglSupported(fabric.textureSize)) { - console.log('max texture size: ' + fabric.maxTextureSize); - return (new fabric.WebglFilterBackend({ tileSize: fabric.textureSize })); - } - else if (fabric.Canvas2dFilterBackend) { - return (new fabric.Canvas2dFilterBackend()); - } -}; - - -if (typeof document !== 'undefined' && typeof window !== 'undefined') { - // ensure globality even if entire library were function wrapped (as in Meteor.js packaging system) - window.fabric = fabric; -} - - -(function() { - - /** - * @private - * @param {String} eventName - * @param {Function} handler - */ - function _removeEventListener(eventName, handler) { - if (!this.__eventListeners[eventName]) { - return; - } - var eventListener = this.__eventListeners[eventName]; - if (handler) { - eventListener[eventListener.indexOf(handler)] = false; - } - else { - fabric.util.array.fill(eventListener, false); - } - } - - /** - * Observes specified event - * @memberOf fabric.Observable - * @alias on - * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) - * @param {Function} handler Function that receives a notification when an event of the specified type occurs - * @return {Self} thisArg - * @chainable - */ - function on(eventName, handler) { - if (!this.__eventListeners) { - this.__eventListeners = { }; - } - // one object with key/value pairs was passed - if (arguments.length === 1) { - for (var prop in eventName) { - this.on(prop, eventName[prop]); - } - } - else { - if (!this.__eventListeners[eventName]) { - this.__eventListeners[eventName] = []; - } - this.__eventListeners[eventName].push(handler); - } - return this; - } - - function _once(eventName, handler) { - var _handler = function () { - handler.apply(this, arguments); - this.off(eventName, _handler); - }.bind(this); - this.on(eventName, _handler); - } - - function once(eventName, handler) { - // one object with key/value pairs was passed - if (arguments.length === 1) { - for (var prop in eventName) { - _once.call(this, prop, eventName[prop]); - } - } - else { - _once.call(this, eventName, handler); - } - return this; - } - - /** - * Stops event observing for a particular event handler. Calling this method - * without arguments removes all handlers for all events - * @memberOf fabric.Observable - * @alias off - * @param {String|Object} eventName Event name (eg. 'after:render') or object with key/value pairs (eg. {'after:render': handler, 'selection:cleared': handler}) - * @param {Function} handler Function to be deleted from EventListeners - * @return {Self} thisArg - * @chainable - */ - function off(eventName, handler) { - if (!this.__eventListeners) { - return this; - } - - // remove all key/value pairs (event name -> event handler) - if (arguments.length === 0) { - for (eventName in this.__eventListeners) { - _removeEventListener.call(this, eventName); - } - } - // one object with key/value pairs was passed - else if (arguments.length === 1 && typeof arguments[0] === 'object') { - for (var prop in eventName) { - _removeEventListener.call(this, prop, eventName[prop]); - } - } - else { - _removeEventListener.call(this, eventName, handler); - } - return this; - } - - /** - * Fires event with an optional options object - * @memberOf fabric.Observable - * @param {String} eventName Event name to fire - * @param {Object} [options] Options object - * @return {Self} thisArg - * @chainable - */ - function fire(eventName, options) { - if (!this.__eventListeners) { - return this; - } - - var listenersForEvent = this.__eventListeners[eventName]; - if (!listenersForEvent) { - return this; - } - - for (var i = 0, len = listenersForEvent.length; i < len; i++) { - listenersForEvent[i] && listenersForEvent[i].call(this, options || { }); - } - this.__eventListeners[eventName] = listenersForEvent.filter(function(value) { - return value !== false; - }); - return this; - } - - /** - * @namespace fabric.Observable - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#events} - * @see {@link http://fabricjs.com/events|Events demo} - */ - fabric.Observable = { - fire: fire, - on: on, - once: once, - off: off, - }; -})(); - - -/** - * @namespace fabric.Collection - */ -fabric.Collection = { - - _objects: [], - - /** - * Adds objects to collection, Canvas or Group, then renders canvas - * (if `renderOnAddRemove` is not `false`). - * in case of Group no changes to bounding box are made. - * Objects should be instances of (or inherit from) fabric.Object - * Use of this function is highly discouraged for groups. - * you can add a bunch of objects with the add method but then you NEED - * to run a addWithUpdate call for the Group class or position/bbox will be wrong. - * @param {...fabric.Object} object Zero or more fabric instances - * @return {Self} thisArg - * @chainable - */ - add: function () { - this._objects.push.apply(this._objects, arguments); - if (this._onObjectAdded) { - for (var i = 0, length = arguments.length; i < length; i++) { - this._onObjectAdded(arguments[i]); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Inserts an object into collection at specified index, then renders canvas (if `renderOnAddRemove` is not `false`) - * An object should be an instance of (or inherit from) fabric.Object - * Use of this function is highly discouraged for groups. - * you can add a bunch of objects with the insertAt method but then you NEED - * to run a addWithUpdate call for the Group class or position/bbox will be wrong. - * @param {Object} object Object to insert - * @param {Number} index Index to insert object at - * @param {Boolean} nonSplicing When `true`, no splicing (shifting) of objects occurs - * @return {Self} thisArg - * @chainable - */ - insertAt: function (object, index, nonSplicing) { - var objects = this._objects; - if (nonSplicing) { - objects[index] = object; - } - else { - objects.splice(index, 0, object); - } - this._onObjectAdded && this._onObjectAdded(object); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Removes objects from a collection, then renders canvas (if `renderOnAddRemove` is not `false`) - * @param {...fabric.Object} object Zero or more fabric instances - * @return {Self} thisArg - * @chainable - */ - remove: function() { - var objects = this._objects, - index, somethingRemoved = false; - - for (var i = 0, length = arguments.length; i < length; i++) { - index = objects.indexOf(arguments[i]); - - // only call onObjectRemoved if an object was actually removed - if (index !== -1) { - somethingRemoved = true; - objects.splice(index, 1); - this._onObjectRemoved && this._onObjectRemoved(arguments[i]); - } - } - - this.renderOnAddRemove && somethingRemoved && this.requestRenderAll(); - return this; - }, - - /** - * Executes given function for each object in this group - * @param {Function} callback - * Callback invoked with current object as first argument, - * index - as second and an array of all objects - as third. - * Callback is invoked in a context of Global Object (e.g. `window`) - * when no `context` argument is given - * - * @param {Object} context Context (aka thisObject) - * @return {Self} thisArg - * @chainable - */ - forEachObject: function(callback, context) { - var objects = this.getObjects(); - for (var i = 0, len = objects.length; i < len; i++) { - callback.call(context, objects[i], i, objects); - } - return this; - }, - - /** - * Returns an array of children objects of this instance - * Type parameter introduced in 1.3.10 - * since 2.3.5 this method return always a COPY of the array; - * @param {String} [type] When specified, only objects of this type are returned - * @return {Array} - */ - getObjects: function(type) { - if (typeof type === 'undefined') { - return this._objects.concat(); - } - return this._objects.filter(function(o) { - return o.type === type; - }); - }, - - /** - * Returns object at specified index - * @param {Number} index - * @return {Self} thisArg - */ - item: function (index) { - return this._objects[index]; - }, - - /** - * Returns true if collection contains no objects - * @return {Boolean} true if collection is empty - */ - isEmpty: function () { - return this._objects.length === 0; - }, - - /** - * Returns a size of a collection (i.e: length of an array containing its objects) - * @return {Number} Collection size - */ - size: function() { - return this._objects.length; - }, - - /** - * Returns true if collection contains an object - * @param {Object} object Object to check against - * @param {Boolean} [deep=false] `true` to check all descendants, `false` to check only `_objects` - * @return {Boolean} `true` if collection contains an object - */ - contains: function (object, deep) { - if (this._objects.indexOf(object) > -1) { - return true; - } - else if (deep) { - return this._objects.some(function (obj) { - return typeof obj.contains === 'function' && obj.contains(object, true); - }); - } - return false; - }, - - /** - * Returns number representation of a collection complexity - * @return {Number} complexity - */ - complexity: function () { - return this._objects.reduce(function (memo, current) { - memo += current.complexity ? current.complexity() : 0; - return memo; - }, 0); - } -}; - - -/** - * @namespace fabric.CommonMethods - */ -fabric.CommonMethods = { - - /** - * Sets object's properties from options - * @param {Object} [options] Options object - */ - _setOptions: function(options) { - for (var prop in options) { - this.set(prop, options[prop]); - } - }, - - /** - * @private - * @param {Object} [filler] Options object - * @param {String} [property] property to set the Gradient to - */ - _initGradient: function(filler, property) { - if (filler && filler.colorStops && !(filler instanceof fabric.Gradient)) { - this.set(property, new fabric.Gradient(filler)); - } - }, - - /** - * @private - * @param {Object} [filler] Options object - * @param {String} [property] property to set the Pattern to - * @param {Function} [callback] callback to invoke after pattern load - */ - _initPattern: function(filler, property, callback) { - if (filler && filler.source && !(filler instanceof fabric.Pattern)) { - this.set(property, new fabric.Pattern(filler, callback)); - } - else { - callback && callback(); - } - }, - - /** - * @private - */ - _setObject: function(obj) { - for (var prop in obj) { - this._set(prop, obj[prop]); - } - }, - - /** - * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. - * @param {String|Object} key Property name or object (if object, iterate over the object properties) - * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) - * @return {fabric.Object} thisArg - * @chainable - */ - set: function(key, value) { - if (typeof key === 'object') { - this._setObject(key); - } - else { - this._set(key, value); - } - return this; - }, - - _set: function(key, value) { - this[key] = value; - }, - - /** - * Toggles specified property from `true` to `false` or from `false` to `true` - * @param {String} property Property to toggle - * @return {fabric.Object} thisArg - * @chainable - */ - toggle: function(property) { - var value = this.get(property); - if (typeof value === 'boolean') { - this.set(property, !value); - } - return this; - }, - - /** - * Basic getter - * @param {String} property Property name - * @return {*} value of a property - */ - get: function(property) { - return this[property]; - } -}; - - -(function(global) { - - var sqrt = Math.sqrt, - atan2 = Math.atan2, - pow = Math.pow, - PiBy180 = Math.PI / 180, - PiBy2 = Math.PI / 2; - - /** - * @namespace fabric.util - */ - fabric.util = { - - /** - * Calculate the cos of an angle, avoiding returning floats for known results - * @static - * @memberOf fabric.util - * @param {Number} angle the angle in radians or in degree - * @return {Number} - */ - cos: function(angle) { - if (angle === 0) { return 1; } - if (angle < 0) { - // cos(a) = cos(-a) - angle = -angle; - } - var angleSlice = angle / PiBy2; - switch (angleSlice) { - case 1: case 3: return 0; - case 2: return -1; - } - return Math.cos(angle); - }, - - /** - * Calculate the sin of an angle, avoiding returning floats for known results - * @static - * @memberOf fabric.util - * @param {Number} angle the angle in radians or in degree - * @return {Number} - */ - sin: function(angle) { - if (angle === 0) { return 0; } - var angleSlice = angle / PiBy2, sign = 1; - if (angle < 0) { - // sin(-a) = -sin(a) - sign = -1; - } - switch (angleSlice) { - case 1: return sign; - case 2: return 0; - case 3: return -sign; - } - return Math.sin(angle); - }, - - /** - * Removes value from an array. - * Presence of value (and its position in an array) is determined via `Array.prototype.indexOf` - * @static - * @memberOf fabric.util - * @param {Array} array - * @param {*} value - * @return {Array} original array - */ - removeFromArray: function(array, value) { - var idx = array.indexOf(value); - if (idx !== -1) { - array.splice(idx, 1); - } - return array; - }, - - /** - * Returns random number between 2 specified ones. - * @static - * @memberOf fabric.util - * @param {Number} min lower limit - * @param {Number} max upper limit - * @return {Number} random value (between min and max) - */ - getRandomInt: function(min, max) { - return Math.floor(Math.random() * (max - min + 1)) + min; - }, - - /** - * Transforms degrees to radians. - * @static - * @memberOf fabric.util - * @param {Number} degrees value in degrees - * @return {Number} value in radians - */ - degreesToRadians: function(degrees) { - return degrees * PiBy180; - }, - - /** - * Transforms radians to degrees. - * @static - * @memberOf fabric.util - * @param {Number} radians value in radians - * @return {Number} value in degrees - */ - radiansToDegrees: function(radians) { - return radians / PiBy180; - }, - - /** - * Rotates `point` around `origin` with `radians` - * @static - * @memberOf fabric.util - * @param {fabric.Point} point The point to rotate - * @param {fabric.Point} origin The origin of the rotation - * @param {Number} radians The radians of the angle for the rotation - * @return {fabric.Point} The new rotated point - */ - rotatePoint: function(point, origin, radians) { - var newPoint = new fabric.Point(point.x - origin.x, point.y - origin.y), - v = fabric.util.rotateVector(newPoint, radians); - return new fabric.Point(v.x, v.y).addEquals(origin); - }, - - /** - * Rotates `vector` with `radians` - * @static - * @memberOf fabric.util - * @param {Object} vector The vector to rotate (x and y) - * @param {Number} radians The radians of the angle for the rotation - * @return {Object} The new rotated point - */ - rotateVector: function(vector, radians) { - var sin = fabric.util.sin(radians), - cos = fabric.util.cos(radians), - rx = vector.x * cos - vector.y * sin, - ry = vector.x * sin + vector.y * cos; - return { - x: rx, - y: ry - }; - }, - - /** - * Creates a vetor from points represented as a point - * @static - * @memberOf fabric.util - * - * @typedef {Object} Point - * @property {number} x - * @property {number} y - * - * @param {Point} from - * @param {Point} to - * @returns {Point} vector - */ - createVector: function (from, to) { - return new fabric.Point(to.x - from.x, to.y - from.y); - }, - - /** - * Calculates angle between 2 vectors using dot product - * @static - * @memberOf fabric.util - * @param {Point} a - * @param {Point} b - * @returns the angle in radian between the vectors - */ - calcAngleBetweenVectors: function (a, b) { - return Math.acos((a.x * b.x + a.y * b.y) / (Math.hypot(a.x, a.y) * Math.hypot(b.x, b.y))); - }, - - /** - * @static - * @memberOf fabric.util - * @param {Point} v - * @returns {Point} vector representing the unit vector of pointing to the direction of `v` - */ - getHatVector: function (v) { - return new fabric.Point(v.x, v.y).multiply(1 / Math.hypot(v.x, v.y)); - }, - - /** - * @static - * @memberOf fabric.util - * @param {Point} A - * @param {Point} B - * @param {Point} C - * @returns {{ vector: Point, angle: number }} vector representing the bisector of A and A's angle - */ - getBisector: function (A, B, C) { - var AB = fabric.util.createVector(A, B), AC = fabric.util.createVector(A, C); - var alpha = fabric.util.calcAngleBetweenVectors(AB, AC); - // check if alpha is relative to AB->BC - var ro = fabric.util.calcAngleBetweenVectors(fabric.util.rotateVector(AB, alpha), AC); - var phi = alpha * (ro === 0 ? 1 : -1) / 2; - return { - vector: fabric.util.getHatVector(fabric.util.rotateVector(AB, phi)), - angle: alpha - }; - }, - - /** - * Project stroke width on points returning 2 projections for each point as follows: - * - `miter`: 2 points corresponding to the outer boundary and the inner boundary of stroke. - * - `bevel`: 2 points corresponding to the bevel boundaries, tangent to the bisector. - * - `round`: same as `bevel` - * Used to calculate object's bounding box - * @static - * @memberOf fabric.util - * @param {Point[]} points - * @param {Object} options - * @param {number} options.strokeWidth - * @param {'miter'|'bevel'|'round'} options.strokeLineJoin - * @param {number} options.strokeMiterLimit https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-miterlimit - * @param {boolean} options.strokeUniform - * @param {number} options.scaleX - * @param {number} options.scaleY - * @param {boolean} [openPath] whether the shape is open or not, affects the calculations of the first and last points - * @returns {fabric.Point[]} array of size 2n/4n of all suspected points - */ - projectStrokeOnPoints: function (points, options, openPath) { - var coords = [], s = options.strokeWidth / 2, - strokeUniformScalar = options.strokeUniform ? - new fabric.Point(1 / options.scaleX, 1 / options.scaleY) : new fabric.Point(1, 1), - getStrokeHatVector = function (v) { - var scalar = s / (Math.hypot(v.x, v.y)); - return new fabric.Point(v.x * scalar * strokeUniformScalar.x, v.y * scalar * strokeUniformScalar.y); - }; - if (points.length <= 1) {return coords;} - points.forEach(function (p, index) { - var A = new fabric.Point(p.x, p.y), B, C; - if (index === 0) { - C = points[index + 1]; - B = openPath ? getStrokeHatVector(fabric.util.createVector(C, A)).addEquals(A) : points[points.length - 1]; - } - else if (index === points.length - 1) { - B = points[index - 1]; - C = openPath ? getStrokeHatVector(fabric.util.createVector(B, A)).addEquals(A) : points[0]; - } - else { - B = points[index - 1]; - C = points[index + 1]; - } - var bisector = fabric.util.getBisector(A, B, C), - bisectorVector = bisector.vector, - alpha = bisector.angle, - scalar, - miterVector; - if (options.strokeLineJoin === 'miter') { - scalar = -s / Math.sin(alpha / 2); - miterVector = new fabric.Point( - bisectorVector.x * scalar * strokeUniformScalar.x, - bisectorVector.y * scalar * strokeUniformScalar.y - ); - if (Math.hypot(miterVector.x, miterVector.y) / s <= options.strokeMiterLimit) { - coords.push(A.add(miterVector)); - coords.push(A.subtract(miterVector)); - return; - } - } - scalar = -s * Math.SQRT2; - miterVector = new fabric.Point( - bisectorVector.x * scalar * strokeUniformScalar.x, - bisectorVector.y * scalar * strokeUniformScalar.y - ); - coords.push(A.add(miterVector)); - coords.push(A.subtract(miterVector)); - }); - return coords; - }, - - /** - * Apply transform t to point p - * @static - * @memberOf fabric.util - * @param {fabric.Point} p The point to transform - * @param {Array} t The transform - * @param {Boolean} [ignoreOffset] Indicates that the offset should not be applied - * @return {fabric.Point} The transformed point - */ - transformPoint: function(p, t, ignoreOffset) { - if (ignoreOffset) { - return new fabric.Point( - t[0] * p.x + t[2] * p.y, - t[1] * p.x + t[3] * p.y - ); - } - return new fabric.Point( - t[0] * p.x + t[2] * p.y + t[4], - t[1] * p.x + t[3] * p.y + t[5] - ); - }, - - /** - * Returns coordinates of points's bounding rectangle (left, top, width, height) - * @param {Array} points 4 points array - * @param {Array} [transform] an array of 6 numbers representing a 2x3 transform matrix - * @return {Object} Object with left, top, width, height properties - */ - makeBoundingBoxFromPoints: function(points, transform) { - if (transform) { - for (var i = 0; i < points.length; i++) { - points[i] = fabric.util.transformPoint(points[i], transform); - } - } - var xPoints = [points[0].x, points[1].x, points[2].x, points[3].x], - minX = fabric.util.array.min(xPoints), - maxX = fabric.util.array.max(xPoints), - width = maxX - minX, - yPoints = [points[0].y, points[1].y, points[2].y, points[3].y], - minY = fabric.util.array.min(yPoints), - maxY = fabric.util.array.max(yPoints), - height = maxY - minY; - - return { - left: minX, - top: minY, - width: width, - height: height - }; - }, - - /** - * Invert transformation t - * @static - * @memberOf fabric.util - * @param {Array} t The transform - * @return {Array} The inverted transform - */ - invertTransform: function(t) { - var a = 1 / (t[0] * t[3] - t[1] * t[2]), - r = [a * t[3], -a * t[1], -a * t[2], a * t[0]], - o = fabric.util.transformPoint({ x: t[4], y: t[5] }, r, true); - r[4] = -o.x; - r[5] = -o.y; - return r; - }, - - /** - * A wrapper around Number#toFixed, which contrary to native method returns number, not string. - * @static - * @memberOf fabric.util - * @param {Number|String} number number to operate on - * @param {Number} fractionDigits number of fraction digits to "leave" - * @return {Number} - */ - toFixed: function(number, fractionDigits) { - return parseFloat(Number(number).toFixed(fractionDigits)); - }, - - /** - * Converts from attribute value to pixel value if applicable. - * Returns converted pixels or original value not converted. - * @param {Number|String} value number to operate on - * @param {Number} fontSize - * @return {Number|String} - */ - parseUnit: function(value, fontSize) { - var unit = /\D{0,2}$/.exec(value), - number = parseFloat(value); - if (!fontSize) { - fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; - } - switch (unit[0]) { - case 'mm': - return number * fabric.DPI / 25.4; - - case 'cm': - return number * fabric.DPI / 2.54; - - case 'in': - return number * fabric.DPI; - - case 'pt': - return number * fabric.DPI / 72; // or * 4 / 3 - - case 'pc': - return number * fabric.DPI / 72 * 12; // or * 16 - - case 'em': - return number * fontSize; - - default: - return number; - } - }, - - /** - * Function which always returns `false`. - * @static - * @memberOf fabric.util - * @return {Boolean} - */ - falseFunction: function() { - return false; - }, - - /** - * Returns klass "Class" object of given namespace - * @memberOf fabric.util - * @param {String} type Type of object (eg. 'circle') - * @param {String} namespace Namespace to get klass "Class" object from - * @return {Object} klass "Class" - */ - getKlass: function(type, namespace) { - // capitalize first letter only - type = fabric.util.string.camelize(type.charAt(0).toUpperCase() + type.slice(1)); - return fabric.util.resolveNamespace(namespace)[type]; - }, - - /** - * Returns array of attributes for given svg that fabric parses - * @memberOf fabric.util - * @param {String} type Type of svg element (eg. 'circle') - * @return {Array} string names of supported attributes - */ - getSvgAttributes: function(type) { - var attributes = [ - 'instantiated_by_use', - 'style', - 'id', - 'class' - ]; - switch (type) { - case 'linearGradient': - attributes = attributes.concat(['x1', 'y1', 'x2', 'y2', 'gradientUnits', 'gradientTransform']); - break; - case 'radialGradient': - attributes = attributes.concat(['gradientUnits', 'gradientTransform', 'cx', 'cy', 'r', 'fx', 'fy', 'fr']); - break; - case 'stop': - attributes = attributes.concat(['offset', 'stop-color', 'stop-opacity']); - break; - } - return attributes; - }, - - /** - * Returns object of given namespace - * @memberOf fabric.util - * @param {String} namespace Namespace string e.g. 'fabric.Image.filter' or 'fabric' - * @return {Object} Object for given namespace (default fabric) - */ - resolveNamespace: function(namespace) { - if (!namespace) { - return fabric; - } - - var parts = namespace.split('.'), - len = parts.length, i, - obj = global || fabric.window; - - for (i = 0; i < len; ++i) { - obj = obj[parts[i]]; - } - - return obj; - }, - - /** - * Loads image element from given url and passes it to a callback - * @memberOf fabric.util - * @param {String} url URL representing an image - * @param {Function} callback Callback; invoked with loaded image - * @param {*} [context] Context to invoke callback in - * @param {Object} [crossOrigin] crossOrigin value to set image element to - */ - loadImage: function(url, callback, context, crossOrigin) { - if (!url) { - callback && callback.call(context, url); - return; - } - - var img = fabric.util.createImage(); - - /** @ignore */ - var onLoadCallback = function () { - callback && callback.call(context, img, false); - img = img.onload = img.onerror = null; - }; - - img.onload = onLoadCallback; - /** @ignore */ - img.onerror = function() { - fabric.log('Error loading ' + img.src); - callback && callback.call(context, null, true); - img = img.onload = img.onerror = null; - }; - - // data-urls appear to be buggy with crossOrigin - // https://github.com/kangax/fabric.js/commit/d0abb90f1cd5c5ef9d2a94d3fb21a22330da3e0a#commitcomment-4513767 - // see https://code.google.com/p/chromium/issues/detail?id=315152 - // https://bugzilla.mozilla.org/show_bug.cgi?id=935069 - // crossOrigin null is the same as not set. - if (url.indexOf('data') !== 0 && - crossOrigin !== undefined && - crossOrigin !== null) { - img.crossOrigin = crossOrigin; - } - - // IE10 / IE11-Fix: SVG contents from data: URI - // will only be available if the IMG is present - // in the DOM (and visible) - if (url.substring(0,14) === 'data:image/svg') { - img.onload = null; - fabric.util.loadImageInDom(img, onLoadCallback); - } - - img.src = url; - }, - - /** - * Attaches SVG image with data: URL to the dom - * @memberOf fabric.util - * @param {Object} img Image object with data:image/svg src - * @param {Function} callback Callback; invoked with loaded image - * @return {Object} DOM element (div containing the SVG image) - */ - loadImageInDom: function(img, onLoadCallback) { - var div = fabric.document.createElement('div'); - div.style.width = div.style.height = '1px'; - div.style.left = div.style.top = '-100%'; - div.style.position = 'absolute'; - div.appendChild(img); - fabric.document.querySelector('body').appendChild(div); - /** - * Wrap in function to: - * 1. Call existing callback - * 2. Cleanup DOM - */ - img.onload = function () { - onLoadCallback(); - div.parentNode.removeChild(div); - div = null; - }; - }, - - /** - * Creates corresponding fabric instances from their object representations - * @static - * @memberOf fabric.util - * @param {Array} objects Objects to enliven - * @param {Function} callback Callback to invoke when all objects are created - * @param {String} namespace Namespace to get klass "Class" object from - * @param {Function} reviver Method for further parsing of object elements, - * called after each fabric object created. - */ - enlivenObjects: function(objects, callback, namespace, reviver) { - objects = objects || []; - - var enlivenedObjects = [], - numLoadedObjects = 0, - numTotalObjects = objects.length; - - function onLoaded() { - if (++numLoadedObjects === numTotalObjects) { - callback && callback(enlivenedObjects.filter(function(obj) { - // filter out undefined objects (objects that gave error) - return obj; - })); - } - } - - if (!numTotalObjects) { - callback && callback(enlivenedObjects); - return; - } - - objects.forEach(function (o, index) { - // if sparse array - if (!o || !o.type) { - onLoaded(); - return; - } - var klass = fabric.util.getKlass(o.type, namespace); - klass.fromObject(o, function (obj, error) { - error || (enlivenedObjects[index] = obj); - reviver && reviver(o, obj, error); - onLoaded(); - }); - }); - }, - - /** - * Creates corresponding fabric instances residing in an object, e.g. `clipPath` - * @see {@link fabric.Object.ENLIVEN_PROPS} - * @param {Object} object - * @param {Object} [context] assign enlived props to this object (pass null to skip this) - * @param {(objects:fabric.Object[]) => void} callback - */ - enlivenObjectEnlivables: function (object, context, callback) { - var enlivenProps = fabric.Object.ENLIVEN_PROPS.filter(function (key) { return !!object[key]; }); - fabric.util.enlivenObjects(enlivenProps.map(function (key) { return object[key]; }), function (enlivedProps) { - var objects = {}; - enlivenProps.forEach(function (key, index) { - objects[key] = enlivedProps[index]; - context && (context[key] = enlivedProps[index]); - }); - callback && callback(objects); - }); - }, - - /** - * Create and wait for loading of patterns - * @static - * @memberOf fabric.util - * @param {Array} patterns Objects to enliven - * @param {Function} callback Callback to invoke when all objects are created - * called after each fabric object created. - */ - enlivenPatterns: function(patterns, callback) { - patterns = patterns || []; - - function onLoaded() { - if (++numLoadedPatterns === numPatterns) { - callback && callback(enlivenedPatterns); - } - } - - var enlivenedPatterns = [], - numLoadedPatterns = 0, - numPatterns = patterns.length; - - if (!numPatterns) { - callback && callback(enlivenedPatterns); - return; - } - - patterns.forEach(function (p, index) { - if (p && p.source) { - new fabric.Pattern(p, function(pattern) { - enlivenedPatterns[index] = pattern; - onLoaded(); - }); - } - else { - enlivenedPatterns[index] = p; - onLoaded(); - } - }); - }, - - /** - * Groups SVG elements (usually those retrieved from SVG document) - * @static - * @memberOf fabric.util - * @param {Array} elements SVG elements to group - * @param {Object} [options] Options object - * @param {String} path Value to set sourcePath to - * @return {fabric.Object|fabric.Group} - */ - groupSVGElements: function(elements, options, path) { - var object; - if (elements && elements.length === 1) { - return elements[0]; - } - if (options) { - if (options.width && options.height) { - options.centerPoint = { - x: options.width / 2, - y: options.height / 2 - }; - } - else { - delete options.width; - delete options.height; - } - } - object = new fabric.Group(elements, options); - if (typeof path !== 'undefined') { - object.sourcePath = path; - } - return object; - }, - - /** - * Populates an object with properties of another object - * @static - * @memberOf fabric.util - * @param {Object} source Source object - * @param {Object} destination Destination object - * @return {Array} properties Properties names to include - */ - populateWithProperties: function(source, destination, properties) { - if (properties && Array.isArray(properties)) { - for (var i = 0, len = properties.length; i < len; i++) { - if (properties[i] in source) { - destination[properties[i]] = source[properties[i]]; - } - } - } - }, - - /** - * Creates canvas element - * @static - * @memberOf fabric.util - * @return {CanvasElement} initialized canvas element - */ - createCanvasElement: function() { - return fabric.document.createElement('canvas'); - }, - - /** - * Creates a canvas element that is a copy of another and is also painted - * @param {CanvasElement} canvas to copy size and content of - * @static - * @memberOf fabric.util - * @return {CanvasElement} initialized canvas element - */ - copyCanvasElement: function(canvas) { - var newCanvas = fabric.util.createCanvasElement(); - newCanvas.width = canvas.width; - newCanvas.height = canvas.height; - newCanvas.getContext('2d').drawImage(canvas, 0, 0); - return newCanvas; - }, - - /** - * since 2.6.0 moved from canvas instance to utility. - * @param {CanvasElement} canvasEl to copy size and content of - * @param {String} format 'jpeg' or 'png', in some browsers 'webp' is ok too - * @param {Number} quality <= 1 and > 0 - * @static - * @memberOf fabric.util - * @return {String} data url - */ - toDataURL: function(canvasEl, format, quality) { - return canvasEl.toDataURL('image/' + format, quality); - }, - - /** - * Creates image element (works on client and node) - * @static - * @memberOf fabric.util - * @return {HTMLImageElement} HTML image element - */ - createImage: function() { - return fabric.document.createElement('img'); - }, - - /** - * Multiply matrix A by matrix B to nest transformations - * @static - * @memberOf fabric.util - * @param {Array} a First transformMatrix - * @param {Array} b Second transformMatrix - * @param {Boolean} is2x2 flag to multiply matrices as 2x2 matrices - * @return {Array} The product of the two transform matrices - */ - multiplyTransformMatrices: function(a, b, is2x2) { - // Matrix multiply a * b - return [ - a[0] * b[0] + a[2] * b[1], - a[1] * b[0] + a[3] * b[1], - a[0] * b[2] + a[2] * b[3], - a[1] * b[2] + a[3] * b[3], - is2x2 ? 0 : a[0] * b[4] + a[2] * b[5] + a[4], - is2x2 ? 0 : a[1] * b[4] + a[3] * b[5] + a[5] - ]; - }, - - /** - * Decomposes standard 2x3 matrix into transform components - * @static - * @memberOf fabric.util - * @param {Array} a transformMatrix - * @return {Object} Components of transform - */ - qrDecompose: function(a) { - var angle = atan2(a[1], a[0]), - denom = pow(a[0], 2) + pow(a[1], 2), - scaleX = sqrt(denom), - scaleY = (a[0] * a[3] - a[2] * a[1]) / scaleX, - skewX = atan2(a[0] * a[2] + a[1] * a [3], denom); - return { - angle: angle / PiBy180, - scaleX: scaleX, - scaleY: scaleY, - skewX: skewX / PiBy180, - skewY: 0, - translateX: a[4], - translateY: a[5] - }; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.angle] angle in degrees - * @return {Number[]} transform matrix - */ - calcRotateMatrix: function(options) { - if (!options.angle) { - return fabric.iMatrix.concat(); - } - var theta = fabric.util.degreesToRadians(options.angle), - cos = fabric.util.cos(theta), - sin = fabric.util.sin(theta); - return [cos, sin, -sin, cos, 0, 0]; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet. - * is called DimensionsTransformMatrix because those properties are the one that influence - * the size of the resulting box of the object. - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.scaleX] - * @param {Number} [options.scaleY] - * @param {Boolean} [options.flipX] - * @param {Boolean} [options.flipY] - * @param {Number} [options.skewX] - * @param {Number} [options.skewY] - * @return {Number[]} transform matrix - */ - calcDimensionsMatrix: function(options) { - var scaleX = typeof options.scaleX === 'undefined' ? 1 : options.scaleX, - scaleY = typeof options.scaleY === 'undefined' ? 1 : options.scaleY, - scaleMatrix = [ - options.flipX ? -scaleX : scaleX, - 0, - 0, - options.flipY ? -scaleY : scaleY, - 0, - 0], - multiply = fabric.util.multiplyTransformMatrices, - degreesToRadians = fabric.util.degreesToRadians; - if (options.skewX) { - scaleMatrix = multiply( - scaleMatrix, - [1, 0, Math.tan(degreesToRadians(options.skewX)), 1], - true); - } - if (options.skewY) { - scaleMatrix = multiply( - scaleMatrix, - [1, Math.tan(degreesToRadians(options.skewY)), 0, 1], - true); - } - return scaleMatrix; - }, - - /** - * Returns a transform matrix starting from an object of the same kind of - * the one returned from qrDecompose, useful also if you want to calculate some - * transformations from an object that is not enlived yet - * @static - * @memberOf fabric.util - * @param {Object} options - * @param {Number} [options.angle] - * @param {Number} [options.scaleX] - * @param {Number} [options.scaleY] - * @param {Boolean} [options.flipX] - * @param {Boolean} [options.flipY] - * @param {Number} [options.skewX] - * @param {Number} [options.skewX] - * @param {Number} [options.translateX] - * @param {Number} [options.translateY] - * @return {Number[]} transform matrix - */ - composeMatrix: function(options) { - var matrix = [1, 0, 0, 1, options.translateX || 0, options.translateY || 0], - multiply = fabric.util.multiplyTransformMatrices; - if (options.angle) { - matrix = multiply(matrix, fabric.util.calcRotateMatrix(options)); - } - if (options.scaleX !== 1 || options.scaleY !== 1 || - options.skewX || options.skewY || options.flipX || options.flipY) { - matrix = multiply(matrix, fabric.util.calcDimensionsMatrix(options)); - } - return matrix; - }, - - /** - * reset an object transform state to neutral. Top and left are not accounted for - * @static - * @memberOf fabric.util - * @param {fabric.Object} target object to transform - */ - resetObjectTransform: function (target) { - target.scaleX = 1; - target.scaleY = 1; - target.skewX = 0; - target.skewY = 0; - target.flipX = false; - target.flipY = false; - target.rotate(0); - }, - - /** - * Extract Object transform values - * @static - * @memberOf fabric.util - * @param {fabric.Object} target object to read from - * @return {Object} Components of transform - */ - saveObjectTransform: function (target) { - return { - scaleX: target.scaleX, - scaleY: target.scaleY, - skewX: target.skewX, - skewY: target.skewY, - angle: target.angle, - left: target.left, - flipX: target.flipX, - flipY: target.flipY, - top: target.top - }; - }, - - /** - * Returns true if context has transparent pixel - * at specified location (taking tolerance into account) - * @param {CanvasRenderingContext2D} ctx context - * @param {Number} x x coordinate - * @param {Number} y y coordinate - * @param {Number} tolerance Tolerance - */ - isTransparent: function(ctx, x, y, tolerance) { - - // If tolerance is > 0 adjust start coords to take into account. - // If moves off Canvas fix to 0 - if (tolerance > 0) { - if (x > tolerance) { - x -= tolerance; - } - else { - x = 0; - } - if (y > tolerance) { - y -= tolerance; - } - else { - y = 0; - } - } - - var _isTransparent = true, i, temp, - imageData = ctx.getImageData(x, y, (tolerance * 2) || 1, (tolerance * 2) || 1), - l = imageData.data.length; - - // Split image data - for tolerance > 1, pixelDataSize = 4; - for (i = 3; i < l; i += 4) { - temp = imageData.data[i]; - _isTransparent = temp <= 0; - if (_isTransparent === false) { - break; // Stop if colour found - } - } - - imageData = null; - - return _isTransparent; - }, - - /** - * Parse preserveAspectRatio attribute from element - * @param {string} attribute to be parsed - * @return {Object} an object containing align and meetOrSlice attribute - */ - parsePreserveAspectRatioAttribute: function(attribute) { - var meetOrSlice = 'meet', alignX = 'Mid', alignY = 'Mid', - aspectRatioAttrs = attribute.split(' '), align; - - if (aspectRatioAttrs && aspectRatioAttrs.length) { - meetOrSlice = aspectRatioAttrs.pop(); - if (meetOrSlice !== 'meet' && meetOrSlice !== 'slice') { - align = meetOrSlice; - meetOrSlice = 'meet'; - } - else if (aspectRatioAttrs.length) { - align = aspectRatioAttrs.pop(); - } - } - //divide align in alignX and alignY - alignX = align !== 'none' ? align.slice(1, 4) : 'none'; - alignY = align !== 'none' ? align.slice(5, 8) : 'none'; - return { - meetOrSlice: meetOrSlice, - alignX: alignX, - alignY: alignY - }; - }, - - /** - * Clear char widths cache for the given font family or all the cache if no - * fontFamily is specified. - * Use it if you know you are loading fonts in a lazy way and you are not waiting - * for custom fonts to load properly when adding text objects to the canvas. - * If a text object is added when its own font is not loaded yet, you will get wrong - * measurement and so wrong bounding boxes. - * After the font cache is cleared, either change the textObject text content or call - * initDimensions() to trigger a recalculation - * @memberOf fabric.util - * @param {String} [fontFamily] font family to clear - */ - clearFabricFontCache: function(fontFamily) { - fontFamily = (fontFamily || '').toLowerCase(); - if (!fontFamily) { - fabric.charWidthsCache = { }; - } - else if (fabric.charWidthsCache[fontFamily]) { - delete fabric.charWidthsCache[fontFamily]; - } - }, - - /** - * Given current aspect ratio, determines the max width and height that can - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Number} ar aspect ratio - * @param {Number} maximumArea Maximum area you want to achieve - * @return {Object.x} Limited dimensions by X - * @return {Object.y} Limited dimensions by Y - */ - limitDimsByArea: function(ar, maximumArea) { - var roughWidth = Math.sqrt(maximumArea * ar), - perfLimitSizeY = Math.floor(maximumArea / roughWidth); - return { x: Math.floor(roughWidth), y: perfLimitSizeY }; - }, - - capValue: function(min, value, max) { - return Math.max(min, Math.min(value, max)); - }, - - /** - * Finds the scale for the object source to fit inside the object destination, - * keeping aspect ratio intact. - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Object | fabric.Object} source - * @param {Number} source.height natural unscaled height of the object - * @param {Number} source.width natural unscaled width of the object - * @param {Object | fabric.Object} destination - * @param {Number} destination.height natural unscaled height of the object - * @param {Number} destination.width natural unscaled width of the object - * @return {Number} scale factor to apply to source to fit into destination - */ - findScaleToFit: function(source, destination) { - return Math.min(destination.width / source.width, destination.height / source.height); - }, - - /** - * Finds the scale for the object source to cover entirely the object destination, - * keeping aspect ratio intact. - * respect the total allowed area for the cache. - * @memberOf fabric.util - * @param {Object | fabric.Object} source - * @param {Number} source.height natural unscaled height of the object - * @param {Number} source.width natural unscaled width of the object - * @param {Object | fabric.Object} destination - * @param {Number} destination.height natural unscaled height of the object - * @param {Number} destination.width natural unscaled width of the object - * @return {Number} scale factor to apply to source to cover destination - */ - findScaleToCover: function(source, destination) { - return Math.max(destination.width / source.width, destination.height / source.height); - }, - - /** - * given an array of 6 number returns something like `"matrix(...numbers)"` - * @memberOf fabric.util - * @param {Array} transform an array with 6 numbers - * @return {String} transform matrix for svg - * @return {Object.y} Limited dimensions by Y - */ - matrixToSVG: function(transform) { - return 'matrix(' + transform.map(function(value) { - return fabric.util.toFixed(value, fabric.Object.NUM_FRACTION_DIGITS); - }).join(' ') + ')'; - }, - - /** - * given an object and a transform, apply the inverse transform to the object, - * this is equivalent to remove from that object that transformation, so that - * added in a space with the removed transform, the object will be the same as before. - * Removing from an object a transform that scale by 2 is like scaling it by 1/2. - * Removing from an object a transfrom that rotate by 30deg is like rotating by 30deg - * in the opposite direction. - * This util is used to add objects inside transformed groups or nested groups. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - removeTransformFromObject: function(object, transform) { - var inverted = fabric.util.invertTransform(transform), - finalTransform = fabric.util.multiplyTransformMatrices(inverted, object.calcOwnMatrix()); - fabric.util.applyTransformToObject(object, finalTransform); - }, - - /** - * given an object and a transform, apply the transform to the object. - * this is equivalent to change the space where the object is drawn. - * Adding to an object a transform that scale by 2 is like scaling it by 2. - * This is used when removing an object from an active selection for example. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - addTransformToObject: function(object, transform) { - fabric.util.applyTransformToObject( - object, - fabric.util.multiplyTransformMatrices(transform, object.calcOwnMatrix()) - ); - }, - - /** - * discard an object transform state and apply the one from the matrix. - * @memberOf fabric.util - * @param {fabric.Object} object the object you want to transform - * @param {Array} transform the destination transform - */ - applyTransformToObject: function(object, transform) { - var options = fabric.util.qrDecompose(transform), - center = new fabric.Point(options.translateX, options.translateY); - object.flipX = false; - object.flipY = false; - object.set('scaleX', options.scaleX); - object.set('scaleY', options.scaleY); - object.skewX = options.skewX; - object.skewY = options.skewY; - object.angle = options.angle; - object.setPositionByOrigin(center, 'center', 'center'); - }, - - /** - * given a width and height, return the size of the bounding box - * that can contains the box with width/height with applied transform - * described in options. - * Use to calculate the boxes around objects for controls. - * @memberOf fabric.util - * @param {Number} width - * @param {Number} height - * @param {Object} options - * @param {Number} options.scaleX - * @param {Number} options.scaleY - * @param {Number} options.skewX - * @param {Number} options.skewY - * @return {Object.x} width of containing - * @return {Object.y} height of containing - */ - sizeAfterTransform: function(width, height, options) { - var dimX = width / 2, dimY = height / 2, - points = [ - { - x: -dimX, - y: -dimY - }, - { - x: dimX, - y: -dimY - }, - { - x: -dimX, - y: dimY - }, - { - x: dimX, - y: dimY - }], - transformMatrix = fabric.util.calcDimensionsMatrix(options), - bbox = fabric.util.makeBoundingBoxFromPoints(points, transformMatrix); - return { - x: bbox.width, - y: bbox.height, - }; - }, - - /** - * Merges 2 clip paths into one visually equal clip path - * - * **IMPORTANT**:\ - * Does **NOT** clone the arguments, clone them proir if necessary. - * - * Creates a wrapper (group) that contains one clip path and is clipped by the other so content is kept where both overlap. - * Use this method if both the clip paths may have nested clip paths of their own, so assigning one to the other's clip path property is not possible. - * - * In order to handle the `inverted` property we follow logic described in the following cases:\ - * **(1)** both clip paths are inverted - the clip paths pass the inverted prop to the wrapper and loose it themselves.\ - * **(2)** one is inverted and the other isn't - the wrapper shouldn't become inverted and the inverted clip path must clip the non inverted one to produce an identical visual effect.\ - * **(3)** both clip paths are not inverted - wrapper and clip paths remain unchanged. - * - * @memberOf fabric.util - * @param {fabric.Object} c1 - * @param {fabric.Object} c2 - * @returns {fabric.Object} merged clip path - */ - mergeClipPaths: function (c1, c2) { - var a = c1, b = c2; - if (a.inverted && !b.inverted) { - // case (2) - a = c2; - b = c1; - } - // `b` becomes `a`'s clip path so we transform `b` to `a` coordinate plane - fabric.util.applyTransformToObject( - b, - fabric.util.multiplyTransformMatrices( - fabric.util.invertTransform(a.calcTransformMatrix()), - b.calcTransformMatrix() - ) - ); - // assign the `inverted` prop to the wrapping group - var inverted = a.inverted && b.inverted; - if (inverted) { - // case (1) - a.inverted = b.inverted = false; - } - return new fabric.Group([a], { clipPath: b, inverted: inverted }); - }, - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - var _join = Array.prototype.join, - commandLengths = { - m: 2, - l: 2, - h: 1, - v: 1, - c: 6, - s: 4, - q: 4, - t: 2, - a: 7 - }, - repeatedCommands = { - m: 'l', - M: 'L' - }; - function segmentToBezier(th2, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY) { - var costh2 = fabric.util.cos(th2), - sinth2 = fabric.util.sin(th2), - costh3 = fabric.util.cos(th3), - sinth3 = fabric.util.sin(th3), - toX = cosTh * rx * costh3 - sinTh * ry * sinth3 + cx1, - toY = sinTh * rx * costh3 + cosTh * ry * sinth3 + cy1, - cp1X = fromX + mT * ( -cosTh * rx * sinth2 - sinTh * ry * costh2), - cp1Y = fromY + mT * ( -sinTh * rx * sinth2 + cosTh * ry * costh2), - cp2X = toX + mT * ( cosTh * rx * sinth3 + sinTh * ry * costh3), - cp2Y = toY + mT * ( sinTh * rx * sinth3 - cosTh * ry * costh3); - - return ['C', - cp1X, cp1Y, - cp2X, cp2Y, - toX, toY - ]; - } - - /* Adapted from http://dxr.mozilla.org/mozilla-central/source/content/svg/content/src/nsSVGPathDataParser.cpp - * by Andrea Bogazzi code is under MPL. if you don't have a copy of the license you can take it here - * http://mozilla.org/MPL/2.0/ - */ - function arcToSegments(toX, toY, rx, ry, large, sweep, rotateX) { - var PI = Math.PI, th = rotateX * PI / 180, - sinTh = fabric.util.sin(th), - cosTh = fabric.util.cos(th), - fromX = 0, fromY = 0; - - rx = Math.abs(rx); - ry = Math.abs(ry); - - var px = -cosTh * toX * 0.5 - sinTh * toY * 0.5, - py = -cosTh * toY * 0.5 + sinTh * toX * 0.5, - rx2 = rx * rx, ry2 = ry * ry, py2 = py * py, px2 = px * px, - pl = rx2 * ry2 - rx2 * py2 - ry2 * px2, - root = 0; - - if (pl < 0) { - var s = Math.sqrt(1 - pl / (rx2 * ry2)); - rx *= s; - ry *= s; - } - else { - root = (large === sweep ? -1.0 : 1.0) * - Math.sqrt( pl / (rx2 * py2 + ry2 * px2)); - } - - var cx = root * rx * py / ry, - cy = -root * ry * px / rx, - cx1 = cosTh * cx - sinTh * cy + toX * 0.5, - cy1 = sinTh * cx + cosTh * cy + toY * 0.5, - mTheta = calcVectorAngle(1, 0, (px - cx) / rx, (py - cy) / ry), - dtheta = calcVectorAngle((px - cx) / rx, (py - cy) / ry, (-px - cx) / rx, (-py - cy) / ry); - - if (sweep === 0 && dtheta > 0) { - dtheta -= 2 * PI; - } - else if (sweep === 1 && dtheta < 0) { - dtheta += 2 * PI; - } - - // Convert into cubic bezier segments <= 90deg - var segments = Math.ceil(Math.abs(dtheta / PI * 2)), - result = [], mDelta = dtheta / segments, - mT = 8 / 3 * Math.sin(mDelta / 4) * Math.sin(mDelta / 4) / Math.sin(mDelta / 2), - th3 = mTheta + mDelta; - - for (var i = 0; i < segments; i++) { - result[i] = segmentToBezier(mTheta, th3, cosTh, sinTh, rx, ry, cx1, cy1, mT, fromX, fromY); - fromX = result[i][5]; - fromY = result[i][6]; - mTheta = th3; - th3 += mDelta; - } - return result; - } - - /* - * Private - */ - function calcVectorAngle(ux, uy, vx, vy) { - var ta = Math.atan2(uy, ux), - tb = Math.atan2(vy, vx); - if (tb >= ta) { - return tb - ta; - } - else { - return 2 * Math.PI - (ta - tb); - } - } - - /** - * Calculate bounding box of a beziercurve - * @param {Number} x0 starting point - * @param {Number} y0 - * @param {Number} x1 first control point - * @param {Number} y1 - * @param {Number} x2 secondo control point - * @param {Number} y2 - * @param {Number} x3 end of bezier - * @param {Number} y3 - */ - // taken from http://jsbin.com/ivomiq/56/edit no credits available for that. - // TODO: can we normalize this with the starting points set at 0 and then translated the bbox? - function getBoundsOfCurve(x0, y0, x1, y1, x2, y2, x3, y3) { - var argsString; - if (fabric.cachesBoundsOfCurve) { - argsString = _join.call(arguments); - if (fabric.boundsOfCurveCache[argsString]) { - return fabric.boundsOfCurveCache[argsString]; - } - } - - var sqrt = Math.sqrt, - min = Math.min, max = Math.max, - abs = Math.abs, tvalues = [], - bounds = [[], []], - a, b, c, t, t1, t2, b2ac, sqrtb2ac; - - b = 6 * x0 - 12 * x1 + 6 * x2; - a = -3 * x0 + 9 * x1 - 9 * x2 + 3 * x3; - c = 3 * x1 - 3 * x0; - - for (var i = 0; i < 2; ++i) { - if (i > 0) { - b = 6 * y0 - 12 * y1 + 6 * y2; - a = -3 * y0 + 9 * y1 - 9 * y2 + 3 * y3; - c = 3 * y1 - 3 * y0; - } - - if (abs(a) < 1e-12) { - if (abs(b) < 1e-12) { - continue; - } - t = -c / b; - if (0 < t && t < 1) { - tvalues.push(t); - } - continue; - } - b2ac = b * b - 4 * c * a; - if (b2ac < 0) { - continue; - } - sqrtb2ac = sqrt(b2ac); - t1 = (-b + sqrtb2ac) / (2 * a); - if (0 < t1 && t1 < 1) { - tvalues.push(t1); - } - t2 = (-b - sqrtb2ac) / (2 * a); - if (0 < t2 && t2 < 1) { - tvalues.push(t2); - } - } - - var x, y, j = tvalues.length, jlen = j, mt; - while (j--) { - t = tvalues[j]; - mt = 1 - t; - x = (mt * mt * mt * x0) + (3 * mt * mt * t * x1) + (3 * mt * t * t * x2) + (t * t * t * x3); - bounds[0][j] = x; - - y = (mt * mt * mt * y0) + (3 * mt * mt * t * y1) + (3 * mt * t * t * y2) + (t * t * t * y3); - bounds[1][j] = y; - } - - bounds[0][jlen] = x0; - bounds[1][jlen] = y0; - bounds[0][jlen + 1] = x3; - bounds[1][jlen + 1] = y3; - var result = [ - { - x: min.apply(null, bounds[0]), - y: min.apply(null, bounds[1]) - }, - { - x: max.apply(null, bounds[0]), - y: max.apply(null, bounds[1]) - } - ]; - if (fabric.cachesBoundsOfCurve) { - fabric.boundsOfCurveCache[argsString] = result; - } - return result; - } - - /** - * Converts arc to a bunch of bezier curves - * @param {Number} fx starting point x - * @param {Number} fy starting point y - * @param {Array} coords Arc command - */ - function fromArcToBeziers(fx, fy, coords) { - var rx = coords[1], - ry = coords[2], - rot = coords[3], - large = coords[4], - sweep = coords[5], - tx = coords[6], - ty = coords[7], - segsNorm = arcToSegments(tx - fx, ty - fy, rx, ry, large, sweep, rot); - - for (var i = 0, len = segsNorm.length; i < len; i++) { - segsNorm[i][1] += fx; - segsNorm[i][2] += fy; - segsNorm[i][3] += fx; - segsNorm[i][4] += fy; - segsNorm[i][5] += fx; - segsNorm[i][6] += fy; - } - return segsNorm; - }; - - /** - * This function take a parsed SVG path and make it simpler for fabricJS logic. - * simplification consist of: only UPPERCASE absolute commands ( relative converted to absolute ) - * S converted in C, T converted in Q, A converted in C. - * @param {Array} path the array of commands of a parsed svg path for fabric.Path - * @return {Array} the simplified array of commands of a parsed svg path for fabric.Path - */ - function makePathSimpler(path) { - // x and y represent the last point of the path. the previous command point. - // we add them to each relative command to make it an absolute comment. - // we also swap the v V h H with L, because are easier to transform. - var x = 0, y = 0, len = path.length, - // x1 and y1 represent the last point of the subpath. the subpath is started with - // m or M command. When a z or Z command is drawn, x and y need to be resetted to - // the last x1 and y1. - x1 = 0, y1 = 0, current, i, converted, - // previous will host the letter of the previous command, to handle S and T. - // controlX and controlY will host the previous reflected control point - destinationPath = [], previous, controlX, controlY; - for (i = 0; i < len; ++i) { - converted = false; - current = path[i].slice(0); - switch (current[0]) { // first letter - case 'l': // lineto, relative - current[0] = 'L'; - current[1] += x; - current[2] += y; - // falls through - case 'L': - x = current[1]; - y = current[2]; - break; - case 'h': // horizontal lineto, relative - current[1] += x; - // falls through - case 'H': - current[0] = 'L'; - current[2] = y; - x = current[1]; - break; - case 'v': // vertical lineto, relative - current[1] += y; - // falls through - case 'V': - current[0] = 'L'; - y = current[1]; - current[1] = x; - current[2] = y; - break; - case 'm': // moveTo, relative - current[0] = 'M'; - current[1] += x; - current[2] += y; - // falls through - case 'M': - x = current[1]; - y = current[2]; - x1 = current[1]; - y1 = current[2]; - break; - case 'c': // bezierCurveTo, relative - current[0] = 'C'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - current[5] += x; - current[6] += y; - // falls through - case 'C': - controlX = current[3]; - controlY = current[4]; - x = current[5]; - y = current[6]; - break; - case 's': // shorthand cubic bezierCurveTo, relative - current[0] = 'S'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - // falls through - case 'S': - // would be sScC but since we are swapping sSc for C, we check just that. - if (previous === 'C') { - // calculate reflection of previous control points - controlX = 2 * x - controlX; - controlY = 2 * y - controlY; - } - else { - // If there is no previous command or if the previous command was not a C, c, S, or s, - // the control point is coincident with the current point - controlX = x; - controlY = y; - } - x = current[3]; - y = current[4]; - current[0] = 'C'; - current[5] = current[3]; - current[6] = current[4]; - current[3] = current[1]; - current[4] = current[2]; - current[1] = controlX; - current[2] = controlY; - // current[3] and current[4] are NOW the second control point. - // we keep it for the next reflection. - controlX = current[3]; - controlY = current[4]; - break; - case 'q': // quadraticCurveTo, relative - current[0] = 'Q'; - current[1] += x; - current[2] += y; - current[3] += x; - current[4] += y; - // falls through - case 'Q': - controlX = current[1]; - controlY = current[2]; - x = current[3]; - y = current[4]; - break; - case 't': // shorthand quadraticCurveTo, relative - current[0] = 'T'; - current[1] += x; - current[2] += y; - // falls through - case 'T': - if (previous === 'Q') { - // calculate reflection of previous control point - controlX = 2 * x - controlX; - controlY = 2 * y - controlY; - } - else { - // If there is no previous command or if the previous command was not a Q, q, T or t, - // assume the control point is coincident with the current point - controlX = x; - controlY = y; - } - current[0] = 'Q'; - x = current[1]; - y = current[2]; - current[1] = controlX; - current[2] = controlY; - current[3] = x; - current[4] = y; - break; - case 'a': - current[0] = 'A'; - current[6] += x; - current[7] += y; - // falls through - case 'A': - converted = true; - destinationPath = destinationPath.concat(fromArcToBeziers(x, y, current)); - x = current[6]; - y = current[7]; - break; - case 'z': - case 'Z': - x = x1; - y = y1; - break; - default: - } - if (!converted) { - destinationPath.push(current); - } - previous = current[0]; - } - return destinationPath; - }; - - /** - * Calc length from point x1,y1 to x2,y2 - * @param {Number} x1 starting point x - * @param {Number} y1 starting point y - * @param {Number} x2 starting point x - * @param {Number} y2 starting point y - * @return {Number} length of segment - */ - function calcLineLength(x1, y1, x2, y2) { - return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); - } - - // functions for the Cubic beizer - // taken from: https://github.com/konvajs/konva/blob/7.0.5/src/shapes/Path.ts#L350 - function CB1(t) { - return t * t * t; - } - function CB2(t) { - return 3 * t * t * (1 - t); - } - function CB3(t) { - return 3 * t * (1 - t) * (1 - t); - } - function CB4(t) { - return (1 - t) * (1 - t) * (1 - t); - } - - function getPointOnCubicBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { - return function(pct) { - var c1 = CB1(pct), c2 = CB2(pct), c3 = CB3(pct), c4 = CB4(pct); - return { - x: p4x * c1 + p3x * c2 + p2x * c3 + p1x * c4, - y: p4y * c1 + p3y * c2 + p2y * c3 + p1y * c4 - }; - }; - } - - function getTangentCubicIterator(p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) { - return function (pct) { - var invT = 1 - pct, - tangentX = (3 * invT * invT * (p2x - p1x)) + (6 * invT * pct * (p3x - p2x)) + - (3 * pct * pct * (p4x - p3x)), - tangentY = (3 * invT * invT * (p2y - p1y)) + (6 * invT * pct * (p3y - p2y)) + - (3 * pct * pct * (p4y - p3y)); - return Math.atan2(tangentY, tangentX); - }; - } - - function QB1(t) { - return t * t; - } - - function QB2(t) { - return 2 * t * (1 - t); - } - - function QB3(t) { - return (1 - t) * (1 - t); - } - - function getPointOnQuadraticBezierIterator(p1x, p1y, p2x, p2y, p3x, p3y) { - return function(pct) { - var c1 = QB1(pct), c2 = QB2(pct), c3 = QB3(pct); - return { - x: p3x * c1 + p2x * c2 + p1x * c3, - y: p3y * c1 + p2y * c2 + p1y * c3 - }; - }; - } - - function getTangentQuadraticIterator(p1x, p1y, p2x, p2y, p3x, p3y) { - return function (pct) { - var invT = 1 - pct, - tangentX = (2 * invT * (p2x - p1x)) + (2 * pct * (p3x - p2x)), - tangentY = (2 * invT * (p2y - p1y)) + (2 * pct * (p3y - p2y)); - return Math.atan2(tangentY, tangentX); - }; - } - - - // this will run over a path segment ( a cubic or quadratic segment) and approximate it - // with 100 segemnts. This will good enough to calculate the length of the curve - function pathIterator(iterator, x1, y1) { - var tempP = { x: x1, y: y1 }, p, tmpLen = 0, perc; - for (perc = 1; perc <= 100; perc += 1) { - p = iterator(perc / 100); - tmpLen += calcLineLength(tempP.x, tempP.y, p.x, p.y); - tempP = p; - } - return tmpLen; - } - - /** - * Given a pathInfo, and a distance in pixels, find the percentage from 0 to 1 - * that correspond to that pixels run over the path. - * The percentage will be then used to find the correct point on the canvas for the path. - * @param {Array} segInfo fabricJS collection of information on a parsed path - * @param {Number} distance from starting point, in pixels. - * @return {Object} info object with x and y ( the point on canvas ) and angle, the tangent on that point; - */ - function findPercentageForDistance(segInfo, distance) { - var perc = 0, tmpLen = 0, iterator = segInfo.iterator, tempP = { x: segInfo.x, y: segInfo.y }, - p, nextLen, nextStep = 0.01, angleFinder = segInfo.angleFinder, lastPerc; - // nextStep > 0.0001 covers 0.00015625 that 1/64th of 1/100 - // the path - while (tmpLen < distance && nextStep > 0.0001) { - p = iterator(perc); - lastPerc = perc; - nextLen = calcLineLength(tempP.x, tempP.y, p.x, p.y); - // compare tmpLen each cycle with distance, decide next perc to test. - if ((nextLen + tmpLen) > distance) { - // we discard this step and we make smaller steps. - perc -= nextStep; - nextStep /= 2; - } - else { - tempP = p; - perc += nextStep; - tmpLen += nextLen; - } - } - p.angle = angleFinder(lastPerc); - return p; - } - - /** - * Run over a parsed and simplifed path and extrac some informations. - * informations are length of each command and starting point - * @param {Array} path fabricJS parsed path commands - * @return {Array} path commands informations - */ - function getPathSegmentsInfo(path) { - var totalLength = 0, len = path.length, current, - //x2 and y2 are the coords of segment start - //x1 and y1 are the coords of the current point - x1 = 0, y1 = 0, x2 = 0, y2 = 0, info = [], iterator, tempInfo, angleFinder; - for (var i = 0; i < len; i++) { - current = path[i]; - tempInfo = { - x: x1, - y: y1, - command: current[0], - }; - switch (current[0]) { //first letter - case 'M': - tempInfo.length = 0; - x2 = x1 = current[1]; - y2 = y1 = current[2]; - break; - case 'L': - tempInfo.length = calcLineLength(x1, y1, current[1], current[2]); - x1 = current[1]; - y1 = current[2]; - break; - case 'C': - iterator = getPointOnCubicBezierIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - angleFinder = getTangentCubicIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - tempInfo.iterator = iterator; - tempInfo.angleFinder = angleFinder; - tempInfo.length = pathIterator(iterator, x1, y1); - x1 = current[5]; - y1 = current[6]; - break; - case 'Q': - iterator = getPointOnQuadraticBezierIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4] - ); - angleFinder = getTangentQuadraticIterator( - x1, - y1, - current[1], - current[2], - current[3], - current[4] - ); - tempInfo.iterator = iterator; - tempInfo.angleFinder = angleFinder; - tempInfo.length = pathIterator(iterator, x1, y1); - x1 = current[3]; - y1 = current[4]; - break; - case 'Z': - case 'z': - // we add those in order to ease calculations later - tempInfo.destX = x2; - tempInfo.destY = y2; - tempInfo.length = calcLineLength(x1, y1, x2, y2); - x1 = x2; - y1 = y2; - break; - } - totalLength += tempInfo.length; - info.push(tempInfo); - } - info.push({ length: totalLength, x: x1, y: y1 }); - return info; - } - - function getPointOnPath(path, distance, infos) { - if (!infos) { - infos = getPathSegmentsInfo(path); - } - var i = 0; - while ((distance - infos[i].length > 0) && i < (infos.length - 2)) { - distance -= infos[i].length; - i++; - } - // var distance = infos[infos.length - 1] * perc; - var segInfo = infos[i], segPercent = distance / segInfo.length, - command = segInfo.command, segment = path[i], info; - - switch (command) { - case 'M': - return { x: segInfo.x, y: segInfo.y, angle: 0 }; - case 'Z': - case 'z': - info = new fabric.Point(segInfo.x, segInfo.y).lerp( - new fabric.Point(segInfo.destX, segInfo.destY), - segPercent - ); - info.angle = Math.atan2(segInfo.destY - segInfo.y, segInfo.destX - segInfo.x); - return info; - case 'L': - info = new fabric.Point(segInfo.x, segInfo.y).lerp( - new fabric.Point(segment[1], segment[2]), - segPercent - ); - info.angle = Math.atan2(segment[2] - segInfo.y, segment[1] - segInfo.x); - return info; - case 'C': - return findPercentageForDistance(segInfo, distance); - case 'Q': - return findPercentageForDistance(segInfo, distance); - } - } - - /** - * - * @param {string} pathString - * @return {(string|number)[][]} An array of SVG path commands - * @example Usage - * parsePath('M 3 4 Q 3 5 2 1 4 0 Q 9 12 2 1 4 0') === [ - * ['M', 3, 4], - * ['Q', 3, 5, 2, 1, 4, 0], - * ['Q', 9, 12, 2, 1, 4, 0], - * ]; - * - */ - function parsePath(pathString) { - var result = [], - coords = [], - currentPath, - parsed, - re = fabric.rePathCommand, - rNumber = '[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*', - rNumberCommaWsp = '(' + rNumber + ')' + fabric.commaWsp, - rFlagCommaWsp = '([01])' + fabric.commaWsp + '?', - rArcSeq = rNumberCommaWsp + '?' + rNumberCommaWsp + '?' + rNumberCommaWsp + rFlagCommaWsp + rFlagCommaWsp + - rNumberCommaWsp + '?(' + rNumber + ')', - regArcArgumentSequence = new RegExp(rArcSeq, 'g'), - match, - coordsStr, - // one of commands (m,M,l,L,q,Q,c,C,etc.) followed by non-command characters (i.e. command values) - path; - if (!pathString || !pathString.match) { - return result; - } - path = pathString.match(/[mzlhvcsqta][^mzlhvcsqta]*/gi); - - for (var i = 0, coordsParsed, len = path.length; i < len; i++) { - currentPath = path[i]; - - coordsStr = currentPath.slice(1).trim(); - coords.length = 0; - - var command = currentPath.charAt(0); - coordsParsed = [command]; - - if (command.toLowerCase() === 'a') { - // arcs have special flags that apparently don't require spaces so handle special - for (var args; (args = regArcArgumentSequence.exec(coordsStr));) { - for (var j = 1; j < args.length; j++) { - coords.push(args[j]); - } - } - } - else { - while ((match = re.exec(coordsStr))) { - coords.push(match[0]); - } - } - - for (var j = 0, jlen = coords.length; j < jlen; j++) { - parsed = parseFloat(coords[j]); - if (!isNaN(parsed)) { - coordsParsed.push(parsed); - } - } - - var commandLength = commandLengths[command.toLowerCase()], - repeatedCommand = repeatedCommands[command] || command; - - if (coordsParsed.length - 1 > commandLength) { - for (var k = 1, klen = coordsParsed.length; k < klen; k += commandLength) { - result.push([command].concat(coordsParsed.slice(k, k + commandLength))); - command = repeatedCommand; - } - } - else { - result.push(coordsParsed); - } - } - - return result; - }; - - /** - * - * Converts points to a smooth SVG path - * @param {{ x: number,y: number }[]} points Array of points - * @param {number} [correction] Apply a correction to the path (usually we use `width / 1000`). If value is undefined 0 is used as the correction value. - * @return {(string|number)[][]} An array of SVG path commands - */ - function getSmoothPathFromPoints(points, correction) { - var path = [], i, - p1 = new fabric.Point(points[0].x, points[0].y), - p2 = new fabric.Point(points[1].x, points[1].y), - len = points.length, multSignX = 1, multSignY = 0, manyPoints = len > 2; - correction = correction || 0; - - if (manyPoints) { - multSignX = points[2].x < p2.x ? -1 : points[2].x === p2.x ? 0 : 1; - multSignY = points[2].y < p2.y ? -1 : points[2].y === p2.y ? 0 : 1; - } - path.push(['M', p1.x - multSignX * correction, p1.y - multSignY * correction]); - for (i = 1; i < len; i++) { - if (!p1.eq(p2)) { - var midPoint = p1.midPointFrom(p2); - // p1 is our bezier control point - // midpoint is our endpoint - // start point is p(i-1) value. - path.push(['Q', p1.x, p1.y, midPoint.x, midPoint.y]); - } - p1 = points[i]; - if ((i + 1) < points.length) { - p2 = points[i + 1]; - } - } - if (manyPoints) { - multSignX = p1.x > points[i - 2].x ? 1 : p1.x === points[i - 2].x ? 0 : -1; - multSignY = p1.y > points[i - 2].y ? 1 : p1.y === points[i - 2].y ? 0 : -1; - } - path.push(['L', p1.x + multSignX * correction, p1.y + multSignY * correction]); - return path; - } - /** - * Transform a path by transforming each segment. - * it has to be a simplified path or it won't work. - * WARNING: this depends from pathOffset for correct operation - * @param {Array} path fabricJS parsed and simplified path commands - * @param {Array} transform matrix that represent the transformation - * @param {Object} [pathOffset] the fabric.Path pathOffset - * @param {Number} pathOffset.x - * @param {Number} pathOffset.y - * @returns {Array} the transformed path - */ - function transformPath(path, transform, pathOffset) { - if (pathOffset) { - transform = fabric.util.multiplyTransformMatrices( - transform, - [1, 0, 0, 1, -pathOffset.x, -pathOffset.y] - ); - } - return path.map(function(pathSegment) { - var newSegment = pathSegment.slice(0), point = {}; - for (var i = 1; i < pathSegment.length - 1; i += 2) { - point.x = pathSegment[i]; - point.y = pathSegment[i + 1]; - point = fabric.util.transformPoint(point, transform); - newSegment[i] = point.x; - newSegment[i + 1] = point.y; - } - return newSegment; - }); - } - - /** - * Join path commands to go back to svg format - * @param {Array} pathData fabricJS parsed path commands - * @return {String} joined path 'M 0 0 L 20 30' - */ - fabric.util.joinPath = function(pathData) { - return pathData.map(function (segment) { return segment.join(' '); }).join(' '); - }; - fabric.util.parsePath = parsePath; - fabric.util.makePathSimpler = makePathSimpler; - fabric.util.getSmoothPathFromPoints = getSmoothPathFromPoints; - fabric.util.getPathSegmentsInfo = getPathSegmentsInfo; - fabric.util.getBoundsOfCurve = getBoundsOfCurve; - fabric.util.getPointOnPath = getPointOnPath; - fabric.util.transformPath = transformPath; -})(); - - -(function() { - - var slice = Array.prototype.slice; - - /** - * Invokes method on all items in a given array - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} method Name of a method to invoke - * @return {Array} - */ - function invoke(array, method) { - var args = slice.call(arguments, 2), result = []; - for (var i = 0, len = array.length; i < len; i++) { - result[i] = args.length ? array[i][method].apply(array[i], args) : array[i][method].call(array[i]); - } - return result; - } - - /** - * Finds maximum value in array (not necessarily "first" one) - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} byProperty - * @return {*} - */ - function max(array, byProperty) { - return find(array, byProperty, function(value1, value2) { - return value1 >= value2; - }); - } - - /** - * Finds minimum value in array (not necessarily "first" one) - * @memberOf fabric.util.array - * @param {Array} array Array to iterate over - * @param {String} byProperty - * @return {*} - */ - function min(array, byProperty) { - return find(array, byProperty, function(value1, value2) { - return value1 < value2; - }); - } - - /** - * @private - */ - function fill(array, value) { - var k = array.length; - while (k--) { - array[k] = value; - } - return array; - } - - /** - * @private - */ - function find(array, byProperty, condition) { - if (!array || array.length === 0) { - return; - } - - var i = array.length - 1, - result = byProperty ? array[i][byProperty] : array[i]; - if (byProperty) { - while (i--) { - if (condition(array[i][byProperty], result)) { - result = array[i][byProperty]; - } - } - } - else { - while (i--) { - if (condition(array[i], result)) { - result = array[i]; - } - } - } - return result; - } - - /** - * @namespace fabric.util.array - */ - fabric.util.array = { - fill: fill, - invoke: invoke, - min: min, - max: max - }; - -})(); - - -(function() { - /** - * Copies all enumerable properties of one js object to another - * this does not and cannot compete with generic utils. - * Does not clone or extend fabric.Object subclasses. - * This is mostly for internal use and has extra handling for fabricJS objects - * it skips the canvas and group properties in deep cloning. - * @memberOf fabric.util.object - * @param {Object} destination Where to copy to - * @param {Object} source Where to copy from - * @param {Boolean} [deep] Whether to extend nested objects - * @return {Object} - */ - - function extend(destination, source, deep) { - // JScript DontEnum bug is not taken care of - // the deep clone is for internal use, is not meant to avoid - // javascript traps or cloning html element or self referenced objects. - if (deep) { - if (!fabric.isLikelyNode && source instanceof Element) { - // avoid cloning deep images, canvases, - destination = source; - } - else if (source instanceof Array) { - destination = []; - for (var i = 0, len = source.length; i < len; i++) { - destination[i] = extend({ }, source[i], deep); - } - } - else if (source && typeof source === 'object') { - for (var property in source) { - if (property === 'canvas' || property === 'group') { - // we do not want to clone this props at all. - // we want to keep the keys in the copy - destination[property] = null; - } - else if (source.hasOwnProperty(property)) { - destination[property] = extend({ }, source[property], deep); - } - } - } - else { - // this sounds odd for an extend but is ok for recursive use - destination = source; - } - } - else { - for (var property in source) { - destination[property] = source[property]; - } - } - return destination; - } - - /** - * Creates an empty object and copies all enumerable properties of another object to it - * This method is mostly for internal use, and not intended for duplicating shapes in canvas. - * @memberOf fabric.util.object - * @param {Object} object Object to clone - * @param {Boolean} [deep] Whether to clone nested objects - * @return {Object} - */ - - //TODO: this function return an empty object if you try to clone null - function clone(object, deep) { - return extend({ }, object, deep); - } - - /** @namespace fabric.util.object */ - fabric.util.object = { - extend: extend, - clone: clone - }; - fabric.util.object.extend(fabric.util, fabric.Observable); -})(); - - -(function() { - - /** - * Camelizes a string - * @memberOf fabric.util.string - * @param {String} string String to camelize - * @return {String} Camelized version of a string - */ - function camelize(string) { - return string.replace(/-+(.)?/g, function(match, character) { - return character ? character.toUpperCase() : ''; - }); - } - - /** - * Capitalizes a string - * @memberOf fabric.util.string - * @param {String} string String to capitalize - * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized - * and other letters stay untouched, if false first letter is capitalized - * and other letters are converted to lowercase. - * @return {String} Capitalized version of a string - */ - function capitalize(string, firstLetterOnly) { - return string.charAt(0).toUpperCase() + - (firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()); - } - - /** - * Escapes XML in a string - * @memberOf fabric.util.string - * @param {String} string String to escape - * @return {String} Escaped version of a string - */ - function escapeXml(string) { - return string.replace(/&/g, '&') - .replace(/"/g, '"') - .replace(/'/g, ''') - .replace(//g, '>'); - } - - /** - * Divide a string in the user perceived single units - * @memberOf fabric.util.string - * @param {String} textstring String to escape - * @return {Array} array containing the graphemes - */ - function graphemeSplit(textstring) { - var i = 0, chr, graphemes = []; - for (i = 0, chr; i < textstring.length; i++) { - if ((chr = getWholeChar(textstring, i)) === false) { - continue; - } - graphemes.push(chr); - } - return graphemes; - } - - // taken from mdn in the charAt doc page. - function getWholeChar(str, i) { - var code = str.charCodeAt(i); - - if (isNaN(code)) { - return ''; // Position not found - } - if (code < 0xD800 || code > 0xDFFF) { - return str.charAt(i); - } - - // High surrogate (could change last hex to 0xDB7F to treat high private - // surrogates as single characters) - if (0xD800 <= code && code <= 0xDBFF) { - if (str.length <= (i + 1)) { - throw 'High surrogate without following low surrogate'; - } - var next = str.charCodeAt(i + 1); - if (0xDC00 > next || next > 0xDFFF) { - throw 'High surrogate without following low surrogate'; - } - return str.charAt(i) + str.charAt(i + 1); - } - // Low surrogate (0xDC00 <= code && code <= 0xDFFF) - if (i === 0) { - throw 'Low surrogate without preceding high surrogate'; - } - var prev = str.charCodeAt(i - 1); - - // (could change last hex to 0xDB7F to treat high private - // surrogates as single characters) - if (0xD800 > prev || prev > 0xDBFF) { - throw 'Low surrogate without preceding high surrogate'; - } - // We can pass over low surrogates now as the second component - // in a pair which we have already processed - return false; - } - - - /** - * String utilities - * @namespace fabric.util.string - */ - fabric.util.string = { - camelize: camelize, - capitalize: capitalize, - escapeXml: escapeXml, - graphemeSplit: graphemeSplit - }; -})(); - - -(function() { - - var slice = Array.prototype.slice, emptyFunction = function() { }, - - IS_DONTENUM_BUGGY = (function() { - for (var p in { toString: 1 }) { - if (p === 'toString') { - return false; - } - } - return true; - })(), - - /** @ignore */ - addMethods = function(klass, source, parent) { - for (var property in source) { - - if (property in klass.prototype && - typeof klass.prototype[property] === 'function' && - (source[property] + '').indexOf('callSuper') > -1) { - - klass.prototype[property] = (function(property) { - return function() { - - var superclass = this.constructor.superclass; - this.constructor.superclass = parent; - var returnValue = source[property].apply(this, arguments); - this.constructor.superclass = superclass; - - if (property !== 'initialize') { - return returnValue; - } - }; - })(property); - } - else { - klass.prototype[property] = source[property]; - } - - if (IS_DONTENUM_BUGGY) { - if (source.toString !== Object.prototype.toString) { - klass.prototype.toString = source.toString; - } - if (source.valueOf !== Object.prototype.valueOf) { - klass.prototype.valueOf = source.valueOf; - } - } - } - }; - - function Subclass() { } - - function callSuper(methodName) { - var parentMethod = null, - _this = this; - - // climb prototype chain to find method not equal to callee's method - while (_this.constructor.superclass) { - var superClassMethod = _this.constructor.superclass.prototype[methodName]; - if (_this[methodName] !== superClassMethod) { - parentMethod = superClassMethod; - break; - } - // eslint-disable-next-line - _this = _this.constructor.superclass.prototype; - } - - if (!parentMethod) { - return console.log('tried to callSuper ' + methodName + ', method not found in prototype chain', this); - } - - return (arguments.length > 1) - ? parentMethod.apply(this, slice.call(arguments, 1)) - : parentMethod.call(this); - } - - /** - * Helper for creation of "classes". - * @memberOf fabric.util - * @param {Function} [parent] optional "Class" to inherit from - * @param {Object} [properties] Properties shared by all instances of this class - * (be careful modifying objects defined here as this would affect all instances) - */ - function createClass() { - var parent = null, - properties = slice.call(arguments, 0); - - if (typeof properties[0] === 'function') { - parent = properties.shift(); - } - function klass() { - this.initialize.apply(this, arguments); - } - - klass.superclass = parent; - klass.subclasses = []; - - if (parent) { - Subclass.prototype = parent.prototype; - klass.prototype = new Subclass(); - parent.subclasses.push(klass); - } - for (var i = 0, length = properties.length; i < length; i++) { - addMethods(klass, properties[i], parent); - } - if (!klass.prototype.initialize) { - klass.prototype.initialize = emptyFunction; - } - klass.prototype.constructor = klass; - klass.prototype.callSuper = callSuper; - return klass; - } - - fabric.util.createClass = createClass; -})(); - - -(function () { - // since ie11 can use addEventListener but they do not support options, i need to check - var couldUseAttachEvent = !!fabric.document.createElement('div').attachEvent, - touchEvents = ['touchstart', 'touchmove', 'touchend']; - /** - * Adds an event listener to an element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {String} eventName - * @param {Function} handler - */ - fabric.util.addListener = function(element, eventName, handler, options) { - element && element.addEventListener(eventName, handler, couldUseAttachEvent ? false : options); - }; - - /** - * Removes an event listener from an element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {String} eventName - * @param {Function} handler - */ - fabric.util.removeListener = function(element, eventName, handler, options) { - element && element.removeEventListener(eventName, handler, couldUseAttachEvent ? false : options); - }; - - function getTouchInfo(event) { - var touchProp = event.changedTouches; - if (touchProp && touchProp[0]) { - return touchProp[0]; - } - return event; - } - - fabric.util.getPointer = function(event) { - var element = event.target, - scroll = fabric.util.getScrollLeftTop(element), - _evt = getTouchInfo(event); - return { - x: _evt.clientX + scroll.left, - y: _evt.clientY + scroll.top - }; - }; - - fabric.util.isTouchEvent = function(event) { - return touchEvents.indexOf(event.type) > -1 || event.pointerType === 'touch'; - }; -})(); - - -(function () { - - /** - * Cross-browser wrapper for setting element's style - * @memberOf fabric.util - * @param {HTMLElement} element - * @param {Object} styles - * @return {HTMLElement} Element that was passed as a first argument - */ - function setStyle(element, styles) { - var elementStyle = element.style; - if (!elementStyle) { - return element; - } - if (typeof styles === 'string') { - element.style.cssText += ';' + styles; - return styles.indexOf('opacity') > -1 - ? setOpacity(element, styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) - : element; - } - for (var property in styles) { - if (property === 'opacity') { - setOpacity(element, styles[property]); - } - else { - var normalizedProperty = (property === 'float' || property === 'cssFloat') - ? (typeof elementStyle.styleFloat === 'undefined' ? 'cssFloat' : 'styleFloat') - : property; - elementStyle[normalizedProperty] = styles[property]; - } - } - return element; - } - - var parseEl = fabric.document.createElement('div'), - supportsOpacity = typeof parseEl.style.opacity === 'string', - supportsFilters = typeof parseEl.style.filter === 'string', - reOpacity = /alpha\s*\(\s*opacity\s*=\s*([^\)]+)\)/, - - /** @ignore */ - setOpacity = function (element) { return element; }; - - if (supportsOpacity) { - /** @ignore */ - setOpacity = function(element, value) { - element.style.opacity = value; - return element; - }; - } - else if (supportsFilters) { - /** @ignore */ - setOpacity = function(element, value) { - var es = element.style; - if (element.currentStyle && !element.currentStyle.hasLayout) { - es.zoom = 1; - } - if (reOpacity.test(es.filter)) { - value = value >= 0.9999 ? '' : ('alpha(opacity=' + (value * 100) + ')'); - es.filter = es.filter.replace(reOpacity, value); - } - else { - es.filter += ' alpha(opacity=' + (value * 100) + ')'; - } - return element; - }; - } - - fabric.util.setStyle = setStyle; - -})(); - - -(function() { - - var _slice = Array.prototype.slice; - - /** - * Takes id and returns an element with that id (if one exists in a document) - * @memberOf fabric.util - * @param {String|HTMLElement} id - * @return {HTMLElement|null} - */ - function getById(id) { - return typeof id === 'string' ? fabric.document.getElementById(id) : id; - } - - var sliceCanConvertNodelists, - /** - * Converts an array-like object (e.g. arguments or NodeList) to an array - * @memberOf fabric.util - * @param {Object} arrayLike - * @return {Array} - */ - toArray = function(arrayLike) { - return _slice.call(arrayLike, 0); - }; - - try { - sliceCanConvertNodelists = toArray(fabric.document.childNodes) instanceof Array; - } - catch (err) { } - - if (!sliceCanConvertNodelists) { - toArray = function(arrayLike) { - var arr = new Array(arrayLike.length), i = arrayLike.length; - while (i--) { - arr[i] = arrayLike[i]; - } - return arr; - }; - } - - /** - * Creates specified element with specified attributes - * @memberOf fabric.util - * @param {String} tagName Type of an element to create - * @param {Object} [attributes] Attributes to set on an element - * @return {HTMLElement} Newly created element - */ - function makeElement(tagName, attributes) { - var el = fabric.document.createElement(tagName); - for (var prop in attributes) { - if (prop === 'class') { - el.className = attributes[prop]; - } - else if (prop === 'for') { - el.htmlFor = attributes[prop]; - } - else { - el.setAttribute(prop, attributes[prop]); - } - } - return el; - } - - /** - * Adds class to an element - * @memberOf fabric.util - * @param {HTMLElement} element Element to add class to - * @param {String} className Class to add to an element - */ - function addClass(element, className) { - if (element && (' ' + element.className + ' ').indexOf(' ' + className + ' ') === -1) { - element.className += (element.className ? ' ' : '') + className; - } - } - - /** - * Wraps element with another element - * @memberOf fabric.util - * @param {HTMLElement} element Element to wrap - * @param {HTMLElement|String} wrapper Element to wrap with - * @param {Object} [attributes] Attributes to set on a wrapper - * @return {HTMLElement} wrapper - */ - function wrapElement(element, wrapper, attributes) { - if (typeof wrapper === 'string') { - wrapper = makeElement(wrapper, attributes); - } - if (element.parentNode) { - element.parentNode.replaceChild(wrapper, element); - } - wrapper.appendChild(element); - return wrapper; - } - - /** - * Returns element scroll offsets - * @memberOf fabric.util - * @param {HTMLElement} element Element to operate on - * @return {Object} Object with left/top values - */ - function getScrollLeftTop(element) { - - var left = 0, - top = 0, - docElement = fabric.document.documentElement, - body = fabric.document.body || { - scrollLeft: 0, scrollTop: 0 - }; - - // While loop checks (and then sets element to) .parentNode OR .host - // to account for ShadowDOM. We still want to traverse up out of ShadowDOM, - // but the .parentNode of a root ShadowDOM node will always be null, instead - // it should be accessed through .host. See http://stackoverflow.com/a/24765528/4383938 - while (element && (element.parentNode || element.host)) { - - // Set element to element parent, or 'host' in case of ShadowDOM - element = element.parentNode || element.host; - - if (element === fabric.document) { - left = body.scrollLeft || docElement.scrollLeft || 0; - top = body.scrollTop || docElement.scrollTop || 0; - } - else { - left += element.scrollLeft || 0; - top += element.scrollTop || 0; - } - - if (element.nodeType === 1 && element.style.position === 'fixed') { - break; - } - } - - return { left: left, top: top }; - } - - /** - * Returns offset for a given element - * @function - * @memberOf fabric.util - * @param {HTMLElement} element Element to get offset for - * @return {Object} Object with "left" and "top" properties - */ - function getElementOffset(element) { - var docElem, - doc = element && element.ownerDocument, - box = { left: 0, top: 0 }, - offset = { left: 0, top: 0 }, - scrollLeftTop, - offsetAttributes = { - borderLeftWidth: 'left', - borderTopWidth: 'top', - paddingLeft: 'left', - paddingTop: 'top' - }; - - if (!doc) { - return offset; - } - - for (var attr in offsetAttributes) { - offset[offsetAttributes[attr]] += parseInt(getElementStyle(element, attr), 10) || 0; - } - - docElem = doc.documentElement; - if ( typeof element.getBoundingClientRect !== 'undefined' ) { - box = element.getBoundingClientRect(); - } - - scrollLeftTop = getScrollLeftTop(element); - - return { - left: box.left + scrollLeftTop.left - (docElem.clientLeft || 0) + offset.left, - top: box.top + scrollLeftTop.top - (docElem.clientTop || 0) + offset.top - }; - } - - /** - * Returns style attribute value of a given element - * @memberOf fabric.util - * @param {HTMLElement} element Element to get style attribute for - * @param {String} attr Style attribute to get for element - * @return {String} Style attribute value of the given element. - */ - var getElementStyle; - if (fabric.document.defaultView && fabric.document.defaultView.getComputedStyle) { - getElementStyle = function(element, attr) { - var style = fabric.document.defaultView.getComputedStyle(element, null); - return style ? style[attr] : undefined; - }; - } - else { - getElementStyle = function(element, attr) { - var value = element.style[attr]; - if (!value && element.currentStyle) { - value = element.currentStyle[attr]; - } - return value; - }; - } - - (function () { - var style = fabric.document.documentElement.style, - selectProp = 'userSelect' in style - ? 'userSelect' - : 'MozUserSelect' in style - ? 'MozUserSelect' - : 'WebkitUserSelect' in style - ? 'WebkitUserSelect' - : 'KhtmlUserSelect' in style - ? 'KhtmlUserSelect' - : ''; - - /** - * Makes element unselectable - * @memberOf fabric.util - * @param {HTMLElement} element Element to make unselectable - * @return {HTMLElement} Element that was passed in - */ - function makeElementUnselectable(element) { - if (typeof element.onselectstart !== 'undefined') { - element.onselectstart = fabric.util.falseFunction; - } - if (selectProp) { - element.style[selectProp] = 'none'; - } - else if (typeof element.unselectable === 'string') { - element.unselectable = 'on'; - } - return element; - } - - /** - * Makes element selectable - * @memberOf fabric.util - * @param {HTMLElement} element Element to make selectable - * @return {HTMLElement} Element that was passed in - */ - function makeElementSelectable(element) { - if (typeof element.onselectstart !== 'undefined') { - element.onselectstart = null; - } - if (selectProp) { - element.style[selectProp] = ''; - } - else if (typeof element.unselectable === 'string') { - element.unselectable = ''; - } - return element; - } - - fabric.util.makeElementUnselectable = makeElementUnselectable; - fabric.util.makeElementSelectable = makeElementSelectable; - })(); - - function getNodeCanvas(element) { - var impl = fabric.jsdomImplForWrapper(element); - return impl._canvas || impl._image; - }; - - function cleanUpJsdomNode(element) { - if (!fabric.isLikelyNode) { - return; - } - var impl = fabric.jsdomImplForWrapper(element); - if (impl) { - impl._image = null; - impl._canvas = null; - // unsure if necessary - impl._currentSrc = null; - impl._attributes = null; - impl._classList = null; - } - } - - function setImageSmoothing(ctx, value) { - ctx.imageSmoothingEnabled = ctx.imageSmoothingEnabled || ctx.webkitImageSmoothingEnabled - || ctx.mozImageSmoothingEnabled || ctx.msImageSmoothingEnabled || ctx.oImageSmoothingEnabled; - ctx.imageSmoothingEnabled = value; - } - - /** - * setImageSmoothing sets the context imageSmoothingEnabled property. - * Used by canvas and by ImageObject. - * @memberOf fabric.util - * @since 4.0.0 - * @param {HTMLRenderingContext2D} ctx to set on - * @param {Boolean} value true or false - */ - fabric.util.setImageSmoothing = setImageSmoothing; - fabric.util.getById = getById; - fabric.util.toArray = toArray; - fabric.util.addClass = addClass; - fabric.util.makeElement = makeElement; - fabric.util.wrapElement = wrapElement; - fabric.util.getScrollLeftTop = getScrollLeftTop; - fabric.util.getElementOffset = getElementOffset; - fabric.util.getNodeCanvas = getNodeCanvas; - fabric.util.cleanUpJsdomNode = cleanUpJsdomNode; - -})(); - - -(function() { - - function addParamToUrl(url, param) { - return url + (/\?/.test(url) ? '&' : '?') + param; - } - - function emptyFn() { } - - /** - * Cross-browser abstraction for sending XMLHttpRequest - * @memberOf fabric.util - * @param {String} url URL to send XMLHttpRequest to - * @param {Object} [options] Options object - * @param {String} [options.method="GET"] - * @param {String} [options.parameters] parameters to append to url in GET or in body - * @param {String} [options.body] body to send with POST or PUT request - * @param {Function} options.onComplete Callback to invoke when request is completed - * @return {XMLHttpRequest} request - */ - function request(url, options) { - options || (options = { }); - - var method = options.method ? options.method.toUpperCase() : 'GET', - onComplete = options.onComplete || function() { }, - xhr = new fabric.window.XMLHttpRequest(), - body = options.body || options.parameters; - - /** @ignore */ - xhr.onreadystatechange = function() { - if (xhr.readyState === 4) { - onComplete(xhr); - xhr.onreadystatechange = emptyFn; - } - }; - - if (method === 'GET') { - body = null; - if (typeof options.parameters === 'string') { - url = addParamToUrl(url, options.parameters); - } - } - - xhr.open(method, url, true); - - if (method === 'POST' || method === 'PUT') { - xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); - } - - xhr.send(body); - return xhr; - } - - fabric.util.request = request; -})(); - - -/** - * Wrapper around `console.log` (when available) - * @param {*} [values] Values to log - */ -fabric.log = console.log; - -/** - * Wrapper around `console.warn` (when available) - * @param {*} [values] Values to log as a warning - */ -fabric.warn = console.warn; - - -(function () { - - var extend = fabric.util.object.extend, - clone = fabric.util.object.clone; - - /** - * @typedef {Object} AnimationOptions - * Animation of a value or list of values. - * When using lists, think of something like this: - * fabric.util.animate({ - * startValue: [1, 2, 3], - * endValue: [2, 4, 6], - * onChange: function([a, b, c]) { - * canvas.zoomToPoint({x: b, y: c}, a) - * canvas.renderAll() - * } - * }); - * @example - * @property {Function} [onChange] Callback; invoked on every value change - * @property {Function} [onComplete] Callback; invoked when value change is completed - * @example - * // Note: startValue, endValue, and byValue must match the type - * var animationOptions = { startValue: 0, endValue: 1, byValue: 0.25 } - * var animationOptions = { startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] } - * @property {number | number[]} [startValue=0] Starting value - * @property {number | number[]} [endValue=100] Ending value - * @property {number | number[]} [byValue=100] Value to modify the property by - * @property {Function} [easing] Easing function - * @property {Number} [duration=500] Duration of change (in ms) - * @property {Function} [abort] Additional function with logic. If returns true, animation aborts. - * - * @typedef {() => void} CancelFunction - * - * @typedef {Object} AnimationCurrentState - * @property {number | number[]} currentValue value in range [`startValue`, `endValue`] - * @property {number} completionRate value in range [0, 1] - * @property {number} durationRate value in range [0, 1] - * - * @typedef {(AnimationOptions & AnimationCurrentState & { cancel: CancelFunction }} AnimationContext - */ - - /** - * Array holding all running animations - * @memberof fabric - * @type {AnimationContext[]} - */ - var RUNNING_ANIMATIONS = []; - fabric.util.object.extend(RUNNING_ANIMATIONS, { - - /** - * cancel all running animations at the next requestAnimFrame - * @returns {AnimationContext[]} - */ - cancelAll: function () { - var animations = this.splice(0); - animations.forEach(function (animation) { - animation.cancel(); - }); - return animations; - }, - - /** - * cancel all running animations attached to canvas at the next requestAnimFrame - * @param {fabric.Canvas} canvas - * @returns {AnimationContext[]} - */ - cancelByCanvas: function (canvas) { - if (!canvas) { - return []; - } - var cancelled = this.filter(function (animation) { - return typeof animation.target === 'object' && animation.target.canvas === canvas; - }); - cancelled.forEach(function (animation) { - animation.cancel(); - }); - return cancelled; - }, - - /** - * cancel all running animations for target at the next requestAnimFrame - * @param {*} target - * @returns {AnimationContext[]} - */ - cancelByTarget: function (target) { - var cancelled = this.findAnimationsByTarget(target); - cancelled.forEach(function (animation) { - animation.cancel(); - }); - return cancelled; - }, - - /** - * - * @param {CancelFunction} cancelFunc the function returned by animate - * @returns {number} - */ - findAnimationIndex: function (cancelFunc) { - return this.indexOf(this.findAnimation(cancelFunc)); - }, - - /** - * - * @param {CancelFunction} cancelFunc the function returned by animate - * @returns {AnimationContext | undefined} animation's options object - */ - findAnimation: function (cancelFunc) { - return this.find(function (animation) { - return animation.cancel === cancelFunc; - }); - }, - - /** - * - * @param {*} target the object that is assigned to the target property of the animation context - * @returns {AnimationContext[]} array of animation options object associated with target - */ - findAnimationsByTarget: function (target) { - if (!target) { - return []; - } - return this.filter(function (animation) { - return animation.target === target; - }); - } - }); - - function noop() { - return false; - } - - function defaultEasing(t, b, c, d) { - return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; - } - - /** - * Changes value from one to another within certain period of time, invoking callbacks as value is being changed. - * @memberOf fabric.util - * @param {AnimationOptions} [options] Animation options - * @example - * // Note: startValue, endValue, and byValue must match the type - * fabric.util.animate({ startValue: 0, endValue: 1, byValue: 0.25 }) - * fabric.util.animate({ startValue: [0, 1], endValue: [1, 2], byValue: [0.25, 0.25] }) - * @returns {CancelFunction} cancel function - */ - function animate(options) { - options || (options = {}); - var cancel = false, - context, - removeFromRegistry = function () { - var index = fabric.runningAnimations.indexOf(context); - return index > -1 && fabric.runningAnimations.splice(index, 1)[0]; - }; - - context = extend(clone(options), { - cancel: function () { - cancel = true; - return removeFromRegistry(); - }, - currentValue: 'startValue' in options ? options.startValue : 0, - completionRate: 0, - durationRate: 0 - }); - fabric.runningAnimations.push(context); - - requestAnimFrame(function(timestamp) { - var start = timestamp || +new Date(), - duration = options.duration || 500, - finish = start + duration, time, - onChange = options.onChange || noop, - abort = options.abort || noop, - onComplete = options.onComplete || noop, - easing = options.easing || defaultEasing, - isMany = 'startValue' in options ? options.startValue.length > 0 : false, - startValue = 'startValue' in options ? options.startValue : 0, - endValue = 'endValue' in options ? options.endValue : 100, - byValue = options.byValue || (isMany ? startValue.map(function(value, i) { - return endValue[i] - startValue[i]; - }) : endValue - startValue); - - options.onStart && options.onStart(); - - (function tick(ticktime) { - time = ticktime || +new Date(); - var currentTime = time > finish ? duration : (time - start), - timePerc = currentTime / duration, - current = isMany ? startValue.map(function(_value, i) { - return easing(currentTime, startValue[i], byValue[i], duration); - }) : easing(currentTime, startValue, byValue, duration), - valuePerc = isMany ? Math.abs((current[0] - startValue[0]) / byValue[0]) - : Math.abs((current - startValue) / byValue); - // update context - context.currentValue = isMany ? current.slice() : current; - context.completionRate = valuePerc; - context.durationRate = timePerc; - if (cancel) { - return; - } - if (abort(current, valuePerc, timePerc)) { - removeFromRegistry(); - return; - } - if (time > finish) { - // update context - context.currentValue = isMany ? endValue.slice() : endValue; - context.completionRate = 1; - context.durationRate = 1; - // execute callbacks - onChange(isMany ? endValue.slice() : endValue, 1, 1); - onComplete(endValue, 1, 1); - removeFromRegistry(); - return; - } - else { - onChange(current, valuePerc, timePerc); - requestAnimFrame(tick); - } - })(start); - }); - - return context.cancel; - } - - var _requestAnimFrame = fabric.window.requestAnimationFrame || - fabric.window.webkitRequestAnimationFrame || - fabric.window.mozRequestAnimationFrame || - fabric.window.oRequestAnimationFrame || - fabric.window.msRequestAnimationFrame || - function(callback) { - return fabric.window.setTimeout(callback, 1000 / 60); - }; - - var _cancelAnimFrame = fabric.window.cancelAnimationFrame || fabric.window.clearTimeout; - - /** - * requestAnimationFrame polyfill based on http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - * In order to get a precise start time, `requestAnimFrame` should be called as an entry into the method - * @memberOf fabric.util - * @param {Function} callback Callback to invoke - * @param {DOMElement} element optional Element to associate with animation - */ - function requestAnimFrame() { - return _requestAnimFrame.apply(fabric.window, arguments); - } - - function cancelAnimFrame() { - return _cancelAnimFrame.apply(fabric.window, arguments); - } - - fabric.util.animate = animate; - fabric.util.requestAnimFrame = requestAnimFrame; - fabric.util.cancelAnimFrame = cancelAnimFrame; - fabric.runningAnimations = RUNNING_ANIMATIONS; -})(); - - -(function() { - // Calculate an in-between color. Returns a "rgba()" string. - // Credit: Edwin Martin - // http://www.bitstorm.org/jquery/color-animation/jquery.animate-colors.js - function calculateColor(begin, end, pos) { - var color = 'rgba(' - + parseInt((begin[0] + pos * (end[0] - begin[0])), 10) + ',' - + parseInt((begin[1] + pos * (end[1] - begin[1])), 10) + ',' - + parseInt((begin[2] + pos * (end[2] - begin[2])), 10); - - color += ',' + (begin && end ? parseFloat(begin[3] + pos * (end[3] - begin[3])) : 1); - color += ')'; - return color; - } - - /** - * Changes the color from one to another within certain period of time, invoking callbacks as value is being changed. - * @memberOf fabric.util - * @param {String} fromColor The starting color in hex or rgb(a) format. - * @param {String} toColor The starting color in hex or rgb(a) format. - * @param {Number} [duration] Duration of change (in ms). - * @param {Object} [options] Animation options - * @param {Function} [options.onChange] Callback; invoked on every value change - * @param {Function} [options.onComplete] Callback; invoked when value change is completed - * @param {Function} [options.colorEasing] Easing function. Note that this function only take two arguments (currentTime, duration). Thus the regular animation easing functions cannot be used. - * @param {Function} [options.abort] Additional function with logic. If returns true, onComplete is called. - * @returns {Function} abort function - */ - function animateColor(fromColor, toColor, duration, options) { - var startColor = new fabric.Color(fromColor).getSource(), - endColor = new fabric.Color(toColor).getSource(), - originalOnComplete = options.onComplete, - originalOnChange = options.onChange; - options = options || {}; - - return fabric.util.animate(fabric.util.object.extend(options, { - duration: duration || 500, - startValue: startColor, - endValue: endColor, - byValue: endColor, - easing: function (currentTime, startValue, byValue, duration) { - var posValue = options.colorEasing - ? options.colorEasing(currentTime, duration) - : 1 - Math.cos(currentTime / duration * (Math.PI / 2)); - return calculateColor(startValue, byValue, posValue); - }, - // has to take in account for color restoring; - onComplete: function(current, valuePerc, timePerc) { - if (originalOnComplete) { - return originalOnComplete( - calculateColor(endColor, endColor, 0), - valuePerc, - timePerc - ); - } - }, - onChange: function(current, valuePerc, timePerc) { - if (originalOnChange) { - if (Array.isArray(current)) { - return originalOnChange( - calculateColor(current, current, 0), - valuePerc, - timePerc - ); - } - originalOnChange(current, valuePerc, timePerc); - } - } - })); - } - - fabric.util.animateColor = animateColor; - -})(); - - -(function() { - - function normalize(a, c, p, s) { - if (a < Math.abs(c)) { - a = c; - s = p / 4; - } - else { - //handle the 0/0 case: - if (c === 0 && a === 0) { - s = p / (2 * Math.PI) * Math.asin(1); - } - else { - s = p / (2 * Math.PI) * Math.asin(c / a); - } - } - return { a: a, c: c, p: p, s: s }; - } - - function elastic(opts, t, d) { - return opts.a * - Math.pow(2, 10 * (t -= 1)) * - Math.sin( (t * d - opts.s) * (2 * Math.PI) / opts.p ); - } - - /** - * Cubic easing out - * @memberOf fabric.util.ease - */ - function easeOutCubic(t, b, c, d) { - return c * ((t = t / d - 1) * t * t + 1) + b; - } - - /** - * Cubic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutCubic(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t + b; - } - return c / 2 * ((t -= 2) * t * t + 2) + b; - } - - /** - * Quartic easing in - * @memberOf fabric.util.ease - */ - function easeInQuart(t, b, c, d) { - return c * (t /= d) * t * t * t + b; - } - - /** - * Quartic easing out - * @memberOf fabric.util.ease - */ - function easeOutQuart(t, b, c, d) { - return -c * ((t = t / d - 1) * t * t * t - 1) + b; - } - - /** - * Quartic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutQuart(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t * t + b; - } - return -c / 2 * ((t -= 2) * t * t * t - 2) + b; - } - - /** - * Quintic easing in - * @memberOf fabric.util.ease - */ - function easeInQuint(t, b, c, d) { - return c * (t /= d) * t * t * t * t + b; - } - - /** - * Quintic easing out - * @memberOf fabric.util.ease - */ - function easeOutQuint(t, b, c, d) { - return c * ((t = t / d - 1) * t * t * t * t + 1) + b; - } - - /** - * Quintic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutQuint(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return c / 2 * t * t * t * t * t + b; - } - return c / 2 * ((t -= 2) * t * t * t * t + 2) + b; - } - - /** - * Sinusoidal easing in - * @memberOf fabric.util.ease - */ - function easeInSine(t, b, c, d) { - return -c * Math.cos(t / d * (Math.PI / 2)) + c + b; - } - - /** - * Sinusoidal easing out - * @memberOf fabric.util.ease - */ - function easeOutSine(t, b, c, d) { - return c * Math.sin(t / d * (Math.PI / 2)) + b; - } - - /** - * Sinusoidal easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutSine(t, b, c, d) { - return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b; - } - - /** - * Exponential easing in - * @memberOf fabric.util.ease - */ - function easeInExpo(t, b, c, d) { - return (t === 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b; - } - - /** - * Exponential easing out - * @memberOf fabric.util.ease - */ - function easeOutExpo(t, b, c, d) { - return (t === d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; - } - - /** - * Exponential easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutExpo(t, b, c, d) { - if (t === 0) { - return b; - } - if (t === d) { - return b + c; - } - t /= d / 2; - if (t < 1) { - return c / 2 * Math.pow(2, 10 * (t - 1)) + b; - } - return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b; - } - - /** - * Circular easing in - * @memberOf fabric.util.ease - */ - function easeInCirc(t, b, c, d) { - return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b; - } - - /** - * Circular easing out - * @memberOf fabric.util.ease - */ - function easeOutCirc(t, b, c, d) { - return c * Math.sqrt(1 - (t = t / d - 1) * t) + b; - } - - /** - * Circular easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutCirc(t, b, c, d) { - t /= d / 2; - if (t < 1) { - return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b; - } - return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b; - } - - /** - * Elastic easing in - * @memberOf fabric.util.ease - */ - function easeInElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d; - if (t === 1) { - return b + c; - } - if (!p) { - p = d * 0.3; - } - var opts = normalize(a, c, p, s); - return -elastic(opts, t, d) + b; - } - - /** - * Elastic easing out - * @memberOf fabric.util.ease - */ - function easeOutElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d; - if (t === 1) { - return b + c; - } - if (!p) { - p = d * 0.3; - } - var opts = normalize(a, c, p, s); - return opts.a * Math.pow(2, -10 * t) * Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) + opts.c + b; - } - - /** - * Elastic easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutElastic(t, b, c, d) { - var s = 1.70158, p = 0, a = c; - if (t === 0) { - return b; - } - t /= d / 2; - if (t === 2) { - return b + c; - } - if (!p) { - p = d * (0.3 * 1.5); - } - var opts = normalize(a, c, p, s); - if (t < 1) { - return -0.5 * elastic(opts, t, d) + b; - } - return opts.a * Math.pow(2, -10 * (t -= 1)) * - Math.sin((t * d - opts.s) * (2 * Math.PI) / opts.p ) * 0.5 + opts.c + b; - } - - /** - * Backwards easing in - * @memberOf fabric.util.ease - */ - function easeInBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - return c * (t /= d) * t * ((s + 1) * t - s) + b; - } - - /** - * Backwards easing out - * @memberOf fabric.util.ease - */ - function easeOutBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b; - } - - /** - * Backwards easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutBack(t, b, c, d, s) { - if (s === undefined) { - s = 1.70158; - } - t /= d / 2; - if (t < 1) { - return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b; - } - return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b; - } - - /** - * Bouncing easing in - * @memberOf fabric.util.ease - */ - function easeInBounce(t, b, c, d) { - return c - easeOutBounce (d - t, 0, c, d) + b; - } - - /** - * Bouncing easing out - * @memberOf fabric.util.ease - */ - function easeOutBounce(t, b, c, d) { - if ((t /= d) < (1 / 2.75)) { - return c * (7.5625 * t * t) + b; - } - else if (t < (2 / 2.75)) { - return c * (7.5625 * (t -= (1.5 / 2.75)) * t + 0.75) + b; - } - else if (t < (2.5 / 2.75)) { - return c * (7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375) + b; - } - else { - return c * (7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375) + b; - } - } - - /** - * Bouncing easing in and out - * @memberOf fabric.util.ease - */ - function easeInOutBounce(t, b, c, d) { - if (t < d / 2) { - return easeInBounce (t * 2, 0, c, d) * 0.5 + b; - } - return easeOutBounce(t * 2 - d, 0, c, d) * 0.5 + c * 0.5 + b; - } - - /** - * Easing functions - * See Easing Equations by Robert Penner - * @namespace fabric.util.ease - */ - fabric.util.ease = { - - /** - * Quadratic easing in - * @memberOf fabric.util.ease - */ - easeInQuad: function(t, b, c, d) { - return c * (t /= d) * t + b; - }, - - /** - * Quadratic easing out - * @memberOf fabric.util.ease - */ - easeOutQuad: function(t, b, c, d) { - return -c * (t /= d) * (t - 2) + b; - }, - - /** - * Quadratic easing in and out - * @memberOf fabric.util.ease - */ - easeInOutQuad: function(t, b, c, d) { - t /= (d / 2); - if (t < 1) { - return c / 2 * t * t + b; - } - return -c / 2 * ((--t) * (t - 2) - 1) + b; - }, - - /** - * Cubic easing in - * @memberOf fabric.util.ease - */ - easeInCubic: function(t, b, c, d) { - return c * (t /= d) * t * t + b; - }, - - easeOutCubic: easeOutCubic, - easeInOutCubic: easeInOutCubic, - easeInQuart: easeInQuart, - easeOutQuart: easeOutQuart, - easeInOutQuart: easeInOutQuart, - easeInQuint: easeInQuint, - easeOutQuint: easeOutQuint, - easeInOutQuint: easeInOutQuint, - easeInSine: easeInSine, - easeOutSine: easeOutSine, - easeInOutSine: easeInOutSine, - easeInExpo: easeInExpo, - easeOutExpo: easeOutExpo, - easeInOutExpo: easeInOutExpo, - easeInCirc: easeInCirc, - easeOutCirc: easeOutCirc, - easeInOutCirc: easeInOutCirc, - easeInElastic: easeInElastic, - easeOutElastic: easeOutElastic, - easeInOutElastic: easeInOutElastic, - easeInBack: easeInBack, - easeOutBack: easeOutBack, - easeInOutBack: easeInOutBack, - easeInBounce: easeInBounce, - easeOutBounce: easeOutBounce, - easeInOutBounce: easeInOutBounce - }; - -})(); - - -(function(global) { - - 'use strict'; - - /** - * @name fabric - * @namespace - */ - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed, - parseUnit = fabric.util.parseUnit, - multiplyTransformMatrices = fabric.util.multiplyTransformMatrices, - - svgValidTagNames = ['path', 'circle', 'polygon', 'polyline', 'ellipse', 'rect', 'line', - 'image', 'text'], - svgViewBoxElements = ['symbol', 'image', 'marker', 'pattern', 'view', 'svg'], - svgInvalidAncestors = ['pattern', 'defs', 'symbol', 'metadata', 'clipPath', 'mask', 'desc'], - svgValidParents = ['symbol', 'g', 'a', 'svg', 'clipPath', 'defs'], - - attributesMap = { - cx: 'left', - x: 'left', - r: 'radius', - cy: 'top', - y: 'top', - display: 'visible', - visibility: 'visible', - transform: 'transformMatrix', - 'fill-opacity': 'fillOpacity', - 'fill-rule': 'fillRule', - 'font-family': 'fontFamily', - 'font-size': 'fontSize', - 'font-style': 'fontStyle', - 'font-weight': 'fontWeight', - 'letter-spacing': 'charSpacing', - 'paint-order': 'paintFirst', - 'stroke-dasharray': 'strokeDashArray', - 'stroke-dashoffset': 'strokeDashOffset', - 'stroke-linecap': 'strokeLineCap', - 'stroke-linejoin': 'strokeLineJoin', - 'stroke-miterlimit': 'strokeMiterLimit', - 'stroke-opacity': 'strokeOpacity', - 'stroke-width': 'strokeWidth', - 'text-decoration': 'textDecoration', - 'text-anchor': 'textAnchor', - opacity: 'opacity', - 'clip-path': 'clipPath', - 'clip-rule': 'clipRule', - 'vector-effect': 'strokeUniform', - 'image-rendering': 'imageSmoothing', - }, - - colorAttributes = { - stroke: 'strokeOpacity', - fill: 'fillOpacity' - }, - - fSize = 'font-size', cPath = 'clip-path'; - - fabric.svgValidTagNamesRegEx = getSvgRegex(svgValidTagNames); - fabric.svgViewBoxElementsRegEx = getSvgRegex(svgViewBoxElements); - fabric.svgInvalidAncestorsRegEx = getSvgRegex(svgInvalidAncestors); - fabric.svgValidParentsRegEx = getSvgRegex(svgValidParents); - - fabric.cssRules = { }; - fabric.gradientDefs = { }; - fabric.clipPaths = { }; - - function normalizeAttr(attr) { - // transform attribute names - if (attr in attributesMap) { - return attributesMap[attr]; - } - return attr; - } - - function normalizeValue(attr, value, parentAttributes, fontSize) { - var isArray = Array.isArray(value), parsed; - - if ((attr === 'fill' || attr === 'stroke') && value === 'none') { - value = ''; - } - else if (attr === 'strokeUniform') { - return (value === 'non-scaling-stroke'); - } - else if (attr === 'strokeDashArray') { - if (value === 'none') { - value = null; - } - else { - value = value.replace(/,/g, ' ').split(/\s+/).map(parseFloat); - } - } - else if (attr === 'transformMatrix') { - if (parentAttributes && parentAttributes.transformMatrix) { - value = multiplyTransformMatrices( - parentAttributes.transformMatrix, fabric.parseTransformAttribute(value)); - } - else { - value = fabric.parseTransformAttribute(value); - } - } - else if (attr === 'visible') { - value = value !== 'none' && value !== 'hidden'; - // display=none on parent element always takes precedence over child element - if (parentAttributes && parentAttributes.visible === false) { - value = false; - } - } - else if (attr === 'opacity') { - value = parseFloat(value); - if (parentAttributes && typeof parentAttributes.opacity !== 'undefined') { - value *= parentAttributes.opacity; - } - } - else if (attr === 'textAnchor' /* text-anchor */) { - value = value === 'start' ? 'left' : value === 'end' ? 'right' : 'center'; - } - else if (attr === 'charSpacing') { - // parseUnit returns px and we convert it to em - parsed = parseUnit(value, fontSize) / fontSize * 1000; - } - else if (attr === 'paintFirst') { - var fillIndex = value.indexOf('fill'); - var strokeIndex = value.indexOf('stroke'); - var value = 'fill'; - if (fillIndex > -1 && strokeIndex > -1 && strokeIndex < fillIndex) { - value = 'stroke'; - } - else if (fillIndex === -1 && strokeIndex > -1) { - value = 'stroke'; - } - } - else if (attr === 'href' || attr === 'xlink:href' || attr === 'font') { - return value; - } - else if (attr === 'imageSmoothing') { - return (value === 'optimizeQuality'); - } - else { - parsed = isArray ? value.map(parseUnit) : parseUnit(value, fontSize); - } - - return (!isArray && isNaN(parsed) ? value : parsed); - } - - /** - * @private - */ - function getSvgRegex(arr) { - return new RegExp('^(' + arr.join('|') + ')\\b', 'i'); - } - - /** - * @private - * @param {Object} attributes Array of attributes to parse - */ - function _setStrokeFillOpacity(attributes) { - for (var attr in colorAttributes) { - - if (typeof attributes[colorAttributes[attr]] === 'undefined' || attributes[attr] === '') { - continue; - } - - if (typeof attributes[attr] === 'undefined') { - if (!fabric.Object.prototype[attr]) { - continue; - } - attributes[attr] = fabric.Object.prototype[attr]; - } - - if (attributes[attr].indexOf('url(') === 0) { - continue; - } - - var color = new fabric.Color(attributes[attr]); - attributes[attr] = color.setAlpha(toFixed(color.getAlpha() * attributes[colorAttributes[attr]], 2)).toRgba(); - } - return attributes; - } - - /** - * @private - */ - function _getMultipleNodes(doc, nodeNames) { - var nodeName, nodeArray = [], nodeList, i, len; - for (i = 0, len = nodeNames.length; i < len; i++) { - nodeName = nodeNames[i]; - nodeList = doc.getElementsByTagName(nodeName); - nodeArray = nodeArray.concat(Array.prototype.slice.call(nodeList)); - } - return nodeArray; - } - - /** - * Parses "transform" attribute, returning an array of values - * @static - * @function - * @memberOf fabric - * @param {String} attributeValue String containing attribute value - * @return {Array} Array of 6 elements representing transformation matrix - */ - fabric.parseTransformAttribute = (function() { - function rotateMatrix(matrix, args) { - var cos = fabric.util.cos(args[0]), sin = fabric.util.sin(args[0]), - x = 0, y = 0; - if (args.length === 3) { - x = args[1]; - y = args[2]; - } - - matrix[0] = cos; - matrix[1] = sin; - matrix[2] = -sin; - matrix[3] = cos; - matrix[4] = x - (cos * x - sin * y); - matrix[5] = y - (sin * x + cos * y); - } - - function scaleMatrix(matrix, args) { - var multiplierX = args[0], - multiplierY = (args.length === 2) ? args[1] : args[0]; - - matrix[0] = multiplierX; - matrix[3] = multiplierY; - } - - function skewMatrix(matrix, args, pos) { - matrix[pos] = Math.tan(fabric.util.degreesToRadians(args[0])); - } - - function translateMatrix(matrix, args) { - matrix[4] = args[0]; - if (args.length === 2) { - matrix[5] = args[1]; - } - } - - // identity matrix - var iMatrix = fabric.iMatrix, - - // == begin transform regexp - number = fabric.reNum, - - commaWsp = fabric.commaWsp, - - skewX = '(?:(skewX)\\s*\\(\\s*(' + number + ')\\s*\\))', - - skewY = '(?:(skewY)\\s*\\(\\s*(' + number + ')\\s*\\))', - - rotate = '(?:(rotate)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + ')' + - commaWsp + '(' + number + '))?\\s*\\))', - - scale = '(?:(scale)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + '))?\\s*\\))', - - translate = '(?:(translate)\\s*\\(\\s*(' + number + ')(?:' + - commaWsp + '(' + number + '))?\\s*\\))', - - matrix = '(?:(matrix)\\s*\\(\\s*' + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + commaWsp + - '(' + number + ')' + - '\\s*\\))', - - transform = '(?:' + - matrix + '|' + - translate + '|' + - scale + '|' + - rotate + '|' + - skewX + '|' + - skewY + - ')', - - transforms = '(?:' + transform + '(?:' + commaWsp + '*' + transform + ')*' + ')', - - transformList = '^\\s*(?:' + transforms + '?)\\s*$', - - // http://www.w3.org/TR/SVG/coords.html#TransformAttribute - reTransformList = new RegExp(transformList), - // == end transform regexp - - reTransform = new RegExp(transform, 'g'); - - return function(attributeValue) { - - // start with identity matrix - var matrix = iMatrix.concat(), - matrices = []; - - // return if no argument was given or - // an argument does not match transform attribute regexp - if (!attributeValue || (attributeValue && !reTransformList.test(attributeValue))) { - return matrix; - } - - attributeValue.replace(reTransform, function(match) { - - var m = new RegExp(transform).exec(match).filter(function (match) { - // match !== '' && match != null - return (!!match); - }), - operation = m[1], - args = m.slice(2).map(parseFloat); - - switch (operation) { - case 'translate': - translateMatrix(matrix, args); - break; - case 'rotate': - args[0] = fabric.util.degreesToRadians(args[0]); - rotateMatrix(matrix, args); - break; - case 'scale': - scaleMatrix(matrix, args); - break; - case 'skewX': - skewMatrix(matrix, args, 2); - break; - case 'skewY': - skewMatrix(matrix, args, 1); - break; - case 'matrix': - matrix = args; - break; - } - - // snapshot current matrix into matrices array - matrices.push(matrix.concat()); - // reset - matrix = iMatrix.concat(); - }); - - var combinedMatrix = matrices[0]; - while (matrices.length > 1) { - matrices.shift(); - combinedMatrix = fabric.util.multiplyTransformMatrices(combinedMatrix, matrices[0]); - } - return combinedMatrix; - }; - })(); - - /** - * @private - */ - function parseStyleString(style, oStyle) { - var attr, value; - style.replace(/;\s*$/, '').split(';').forEach(function (chunk) { - var pair = chunk.split(':'); - - attr = pair[0].trim().toLowerCase(); - value = pair[1].trim(); - - oStyle[attr] = value; - }); - } - - /** - * @private - */ - function parseStyleObject(style, oStyle) { - var attr, value; - for (var prop in style) { - if (typeof style[prop] === 'undefined') { - continue; - } - - attr = prop.toLowerCase(); - value = style[prop]; - - oStyle[attr] = value; - } - } - - /** - * @private - */ - function getGlobalStylesForElement(element, svgUid) { - var styles = { }; - for (var rule in fabric.cssRules[svgUid]) { - if (elementMatchesRule(element, rule.split(' '))) { - for (var property in fabric.cssRules[svgUid][rule]) { - styles[property] = fabric.cssRules[svgUid][rule][property]; - } - } - } - return styles; - } - - /** - * @private - */ - function elementMatchesRule(element, selectors) { - var firstMatching, parentMatching = true; - //start from rightmost selector. - firstMatching = selectorMatches(element, selectors.pop()); - if (firstMatching && selectors.length) { - parentMatching = doesSomeParentMatch(element, selectors); - } - return firstMatching && parentMatching && (selectors.length === 0); - } - - function doesSomeParentMatch(element, selectors) { - var selector, parentMatching = true; - while (element.parentNode && element.parentNode.nodeType === 1 && selectors.length) { - if (parentMatching) { - selector = selectors.pop(); - } - element = element.parentNode; - parentMatching = selectorMatches(element, selector); - } - return selectors.length === 0; - } - - /** - * @private - */ - function selectorMatches(element, selector) { - var nodeName = element.nodeName, - classNames = element.getAttribute('class'), - id = element.getAttribute('id'), matcher, i; - // i check if a selector matches slicing away part from it. - // if i get empty string i should match - matcher = new RegExp('^' + nodeName, 'i'); - selector = selector.replace(matcher, ''); - if (id && selector.length) { - matcher = new RegExp('#' + id + '(?![a-zA-Z\\-]+)', 'i'); - selector = selector.replace(matcher, ''); - } - if (classNames && selector.length) { - classNames = classNames.split(' '); - for (i = classNames.length; i--;) { - matcher = new RegExp('\\.' + classNames[i] + '(?![a-zA-Z\\-]+)', 'i'); - selector = selector.replace(matcher, ''); - } - } - return selector.length === 0; - } - - /** - * @private - * to support IE8 missing getElementById on SVGdocument and on node xmlDOM - */ - function elementById(doc, id) { - var el; - doc.getElementById && (el = doc.getElementById(id)); - if (el) { - return el; - } - var node, i, len, nodelist = doc.getElementsByTagName('*'); - for (i = 0, len = nodelist.length; i < len; i++) { - node = nodelist[i]; - if (id === node.getAttribute('id')) { - return node; - } - } - } - - /** - * @private - */ - function parseUseDirectives(doc) { - var nodelist = _getMultipleNodes(doc, ['use', 'svg:use']), i = 0; - while (nodelist.length && i < nodelist.length) { - var el = nodelist[i], - xlinkAttribute = el.getAttribute('xlink:href') || el.getAttribute('href'); - - if (xlinkAttribute === null) { - return; - } - - var xlink = xlinkAttribute.slice(1), - x = el.getAttribute('x') || 0, - y = el.getAttribute('y') || 0, - el2 = elementById(doc, xlink).cloneNode(true), - currentTrans = (el2.getAttribute('transform') || '') + ' translate(' + x + ', ' + y + ')', - parentNode, - oldLength = nodelist.length, attr, - j, - attrs, - len, - namespace = fabric.svgNS; - - applyViewboxTransform(el2); - if (/^svg$/i.test(el2.nodeName)) { - var el3 = el2.ownerDocument.createElementNS(namespace, 'g'); - for (j = 0, attrs = el2.attributes, len = attrs.length; j < len; j++) { - attr = attrs.item(j); - el3.setAttributeNS(namespace, attr.nodeName, attr.nodeValue); - } - // el2.firstChild != null - while (el2.firstChild) { - el3.appendChild(el2.firstChild); - } - el2 = el3; - } - - for (j = 0, attrs = el.attributes, len = attrs.length; j < len; j++) { - attr = attrs.item(j); - if (attr.nodeName === 'x' || attr.nodeName === 'y' || - attr.nodeName === 'xlink:href' || attr.nodeName === 'href') { - continue; - } - - if (attr.nodeName === 'transform') { - currentTrans = attr.nodeValue + ' ' + currentTrans; - } - else { - el2.setAttribute(attr.nodeName, attr.nodeValue); - } - } - - el2.setAttribute('transform', currentTrans); - el2.setAttribute('instantiated_by_use', '1'); - el2.removeAttribute('id'); - parentNode = el.parentNode; - parentNode.replaceChild(el2, el); - // some browsers do not shorten nodelist after replaceChild (IE8) - if (nodelist.length === oldLength) { - i++; - } - } - } - - // http://www.w3.org/TR/SVG/coords.html#ViewBoxAttribute - // matches, e.g.: +14.56e-12, etc. - var reViewBoxAttrValue = new RegExp( - '^' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*,?' + - '\\s*(' + fabric.reNum + '+)\\s*' + - '$' - ); - - /** - * Add a element that envelop all child elements and makes the viewbox transformMatrix descend on all elements - */ - function applyViewboxTransform(element) { - if (!fabric.svgViewBoxElementsRegEx.test(element.nodeName)) { - return {}; - } - var viewBoxAttr = element.getAttribute('viewBox'), - scaleX = 1, - scaleY = 1, - minX = 0, - minY = 0, - viewBoxWidth, viewBoxHeight, matrix, el, - widthAttr = element.getAttribute('width'), - heightAttr = element.getAttribute('height'), - x = element.getAttribute('x') || 0, - y = element.getAttribute('y') || 0, - preserveAspectRatio = element.getAttribute('preserveAspectRatio') || '', - missingViewBox = (!viewBoxAttr || !(viewBoxAttr = viewBoxAttr.match(reViewBoxAttrValue))), - missingDimAttr = (!widthAttr || !heightAttr || widthAttr === '100%' || heightAttr === '100%'), - toBeParsed = missingViewBox && missingDimAttr, - parsedDim = { }, translateMatrix = '', widthDiff = 0, heightDiff = 0; - - parsedDim.width = 0; - parsedDim.height = 0; - parsedDim.toBeParsed = toBeParsed; - - if (missingViewBox) { - if (((x || y) && element.parentNode && element.parentNode.nodeName !== '#document')) { - translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; - matrix = (element.getAttribute('transform') || '') + translateMatrix; - element.setAttribute('transform', matrix); - element.removeAttribute('x'); - element.removeAttribute('y'); - } - } - - if (toBeParsed) { - return parsedDim; - } - - if (missingViewBox) { - parsedDim.width = parseUnit(widthAttr); - parsedDim.height = parseUnit(heightAttr); - // set a transform for elements that have x y and are inner(only) SVGs - return parsedDim; - } - minX = -parseFloat(viewBoxAttr[1]); - minY = -parseFloat(viewBoxAttr[2]); - viewBoxWidth = parseFloat(viewBoxAttr[3]); - viewBoxHeight = parseFloat(viewBoxAttr[4]); - parsedDim.minX = minX; - parsedDim.minY = minY; - parsedDim.viewBoxWidth = viewBoxWidth; - parsedDim.viewBoxHeight = viewBoxHeight; - if (!missingDimAttr) { - parsedDim.width = parseUnit(widthAttr); - parsedDim.height = parseUnit(heightAttr); - scaleX = parsedDim.width / viewBoxWidth; - scaleY = parsedDim.height / viewBoxHeight; - } - else { - parsedDim.width = viewBoxWidth; - parsedDim.height = viewBoxHeight; - } - - // default is to preserve aspect ratio - preserveAspectRatio = fabric.util.parsePreserveAspectRatioAttribute(preserveAspectRatio); - if (preserveAspectRatio.alignX !== 'none') { - //translate all container for the effect of Mid, Min, Max - if (preserveAspectRatio.meetOrSlice === 'meet') { - scaleY = scaleX = (scaleX > scaleY ? scaleY : scaleX); - // calculate additional translation to move the viewbox - } - if (preserveAspectRatio.meetOrSlice === 'slice') { - scaleY = scaleX = (scaleX > scaleY ? scaleX : scaleY); - // calculate additional translation to move the viewbox - } - widthDiff = parsedDim.width - viewBoxWidth * scaleX; - heightDiff = parsedDim.height - viewBoxHeight * scaleX; - if (preserveAspectRatio.alignX === 'Mid') { - widthDiff /= 2; - } - if (preserveAspectRatio.alignY === 'Mid') { - heightDiff /= 2; - } - if (preserveAspectRatio.alignX === 'Min') { - widthDiff = 0; - } - if (preserveAspectRatio.alignY === 'Min') { - heightDiff = 0; - } - } - - if (scaleX === 1 && scaleY === 1 && minX === 0 && minY === 0 && x === 0 && y === 0) { - return parsedDim; - } - if ((x || y) && element.parentNode.nodeName !== '#document') { - translateMatrix = ' translate(' + parseUnit(x) + ' ' + parseUnit(y) + ') '; - } - - matrix = translateMatrix + ' matrix(' + scaleX + - ' 0' + - ' 0 ' + - scaleY + ' ' + - (minX * scaleX + widthDiff) + ' ' + - (minY * scaleY + heightDiff) + ') '; - // seems unused. - // parsedDim.viewboxTransform = fabric.parseTransformAttribute(matrix); - if (element.nodeName === 'svg') { - el = element.ownerDocument.createElementNS(fabric.svgNS, 'g'); - // element.firstChild != null - while (element.firstChild) { - el.appendChild(element.firstChild); - } - element.appendChild(el); - } - else { - el = element; - el.removeAttribute('x'); - el.removeAttribute('y'); - matrix = el.getAttribute('transform') + matrix; - } - el.setAttribute('transform', matrix); - return parsedDim; - } - - function hasAncestorWithNodeName(element, nodeName) { - while (element && (element = element.parentNode)) { - if (element.nodeName && nodeName.test(element.nodeName.replace('svg:', '')) - && !element.getAttribute('instantiated_by_use')) { - return true; - } - } - return false; - } - - /** - * Parses an SVG document, converts it to an array of corresponding fabric.* instances and passes them to a callback - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @param {Function} callback Callback to call when parsing is finished; - * It's being passed an array of elements (parsed from a document). - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [parsingOptions] options for parsing document - * @param {String} [parsingOptions.crossOrigin] crossOrigin settings - */ - fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) { - if (!doc) { - return; - } - - parseUseDirectives(doc); - - var svgUid = fabric.Object.__uid++, i, len, - options = applyViewboxTransform(doc), - descendants = fabric.util.toArray(doc.getElementsByTagName('*')); - options.crossOrigin = parsingOptions && parsingOptions.crossOrigin; - options.svgUid = svgUid; - - if (descendants.length === 0 && fabric.isLikelyNode) { - // we're likely in node, where "o3-xml" library fails to gEBTN("*") - // https://github.com/ajaxorg/node-o3-xml/issues/21 - descendants = doc.selectNodes('//*[name(.)!="svg"]'); - var arr = []; - for (i = 0, len = descendants.length; i < len; i++) { - arr[i] = descendants[i]; - } - descendants = arr; - } - - var elements = descendants.filter(function(el) { - applyViewboxTransform(el); - return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')) && - !hasAncestorWithNodeName(el, fabric.svgInvalidAncestorsRegEx); // http://www.w3.org/TR/SVG/struct.html#DefsElement - }); - if (!elements || (elements && !elements.length)) { - callback && callback([], {}); - return; - } - var clipPaths = { }; - descendants.filter(function(el) { - return el.nodeName.replace('svg:', '') === 'clipPath'; - }).forEach(function(el) { - var id = el.getAttribute('id'); - clipPaths[id] = fabric.util.toArray(el.getElementsByTagName('*')).filter(function(el) { - return fabric.svgValidTagNamesRegEx.test(el.nodeName.replace('svg:', '')); - }); - }); - fabric.gradientDefs[svgUid] = fabric.getGradientDefs(doc); - fabric.cssRules[svgUid] = fabric.getCSSRules(doc); - fabric.clipPaths[svgUid] = clipPaths; - // Precedence of rules: style > class > attribute - fabric.parseElements(elements, function(instances, elements) { - if (callback) { - callback(instances, options, elements, descendants); - delete fabric.gradientDefs[svgUid]; - delete fabric.cssRules[svgUid]; - delete fabric.clipPaths[svgUid]; - } - }, clone(options), reviver, parsingOptions); - }; - - function recursivelyParseGradientsXlink(doc, gradient) { - var gradientsAttrs = ['gradientTransform', 'x1', 'x2', 'y1', 'y2', 'gradientUnits', 'cx', 'cy', 'r', 'fx', 'fy'], - xlinkAttr = 'xlink:href', - xLink = gradient.getAttribute(xlinkAttr).slice(1), - referencedGradient = elementById(doc, xLink); - if (referencedGradient && referencedGradient.getAttribute(xlinkAttr)) { - recursivelyParseGradientsXlink(doc, referencedGradient); - } - gradientsAttrs.forEach(function(attr) { - if (referencedGradient && !gradient.hasAttribute(attr) && referencedGradient.hasAttribute(attr)) { - gradient.setAttribute(attr, referencedGradient.getAttribute(attr)); - } - }); - if (!gradient.children.length) { - var referenceClone = referencedGradient.cloneNode(true); - while (referenceClone.firstChild) { - gradient.appendChild(referenceClone.firstChild); - } - } - gradient.removeAttribute(xlinkAttr); - } - - var reFontDeclaration = new RegExp( - '(normal|italic)?\\s*(normal|small-caps)?\\s*' + - '(normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900)?\\s*(' + - fabric.reNum + - '(?:px|cm|mm|em|pt|pc|in)*)(?:\\/(normal|' + fabric.reNum + '))?\\s+(.*)'); - - extend(fabric, { - /** - * Parses a short font declaration, building adding its properties to a style object - * @static - * @function - * @memberOf fabric - * @param {String} value font declaration - * @param {Object} oStyle definition - */ - parseFontDeclaration: function(value, oStyle) { - var match = value.match(reFontDeclaration); - - if (!match) { - return; - } - var fontStyle = match[1], - // font variant is not used - // fontVariant = match[2], - fontWeight = match[3], - fontSize = match[4], - lineHeight = match[5], - fontFamily = match[6]; - - if (fontStyle) { - oStyle.fontStyle = fontStyle; - } - if (fontWeight) { - oStyle.fontWeight = isNaN(parseFloat(fontWeight)) ? fontWeight : parseFloat(fontWeight); - } - if (fontSize) { - oStyle.fontSize = parseUnit(fontSize); - } - if (fontFamily) { - oStyle.fontFamily = fontFamily; - } - if (lineHeight) { - oStyle.lineHeight = lineHeight === 'normal' ? 1 : lineHeight; - } - }, - - /** - * Parses an SVG document, returning all of the gradient declarations found in it - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} Gradient definitions; key corresponds to element id, value -- to gradient definition element - */ - getGradientDefs: function(doc) { - var tagArray = [ - 'linearGradient', - 'radialGradient', - 'svg:linearGradient', - 'svg:radialGradient'], - elList = _getMultipleNodes(doc, tagArray), - el, j = 0, gradientDefs = { }; - j = elList.length; - while (j--) { - el = elList[j]; - if (el.getAttribute('xlink:href')) { - recursivelyParseGradientsXlink(doc, el); - } - gradientDefs[el.getAttribute('id')] = el; - } - return gradientDefs; - }, - - /** - * Returns an object of attributes' name/value, given element and an array of attribute names; - * Parses parent "g" nodes recursively upwards. - * @static - * @memberOf fabric - * @param {DOMElement} element Element to parse - * @param {Array} attributes Array of attributes to parse - * @return {Object} object containing parsed attributes' names/values - */ - parseAttributes: function(element, attributes, svgUid) { - - if (!element) { - return; - } - - var value, - parentAttributes = { }, - fontSize, parentFontSize; - - if (typeof svgUid === 'undefined') { - svgUid = element.getAttribute('svgUid'); - } - // if there's a parent container (`g` or `a` or `symbol` node), parse its attributes recursively upwards - if (element.parentNode && fabric.svgValidParentsRegEx.test(element.parentNode.nodeName)) { - parentAttributes = fabric.parseAttributes(element.parentNode, attributes, svgUid); - } - - var ownAttributes = attributes.reduce(function(memo, attr) { - value = element.getAttribute(attr); - if (value) { // eslint-disable-line - memo[attr] = value; - } - return memo; - }, { }); - // add values parsed from style, which take precedence over attributes - // (see: http://www.w3.org/TR/SVG/styling.html#UsingPresentationAttributes) - var cssAttrs = extend( - getGlobalStylesForElement(element, svgUid), - fabric.parseStyleAttribute(element) - ); - ownAttributes = extend( - ownAttributes, - cssAttrs - ); - if (cssAttrs[cPath]) { - element.setAttribute(cPath, cssAttrs[cPath]); - } - fontSize = parentFontSize = parentAttributes.fontSize || fabric.Text.DEFAULT_SVG_FONT_SIZE; - if (ownAttributes[fSize]) { - // looks like the minimum should be 9px when dealing with ems. this is what looks like in browsers. - ownAttributes[fSize] = fontSize = parseUnit(ownAttributes[fSize], parentFontSize); - } - - var normalizedAttr, normalizedValue, normalizedStyle = {}; - for (var attr in ownAttributes) { - normalizedAttr = normalizeAttr(attr); - normalizedValue = normalizeValue(normalizedAttr, ownAttributes[attr], parentAttributes, fontSize); - normalizedStyle[normalizedAttr] = normalizedValue; - } - if (normalizedStyle && normalizedStyle.font) { - fabric.parseFontDeclaration(normalizedStyle.font, normalizedStyle); - } - var mergedAttrs = extend(parentAttributes, normalizedStyle); - return fabric.svgValidParentsRegEx.test(element.nodeName) ? mergedAttrs : _setStrokeFillOpacity(mergedAttrs); - }, - - /** - * Transforms an array of svg elements to corresponding fabric.* instances - * @static - * @memberOf fabric - * @param {Array} elements Array of elements to parse - * @param {Function} callback Being passed an array of fabric instances (transformed from SVG elements) - * @param {Object} [options] Options object - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - */ - parseElements: function(elements, callback, options, reviver, parsingOptions) { - new fabric.ElementsParser(elements, callback, options, reviver, parsingOptions).parse(); - }, - - /** - * Parses "style" attribute, retuning an object with values - * @static - * @memberOf fabric - * @param {SVGElement} element Element to parse - * @return {Object} Objects with values parsed from style attribute of an element - */ - parseStyleAttribute: function(element) { - var oStyle = { }, - style = element.getAttribute('style'); - - if (!style) { - return oStyle; - } - - if (typeof style === 'string') { - parseStyleString(style, oStyle); - } - else { - parseStyleObject(style, oStyle); - } - - return oStyle; - }, - - /** - * Parses "points" attribute, returning an array of values - * @static - * @memberOf fabric - * @param {String} points points attribute string - * @return {Array} array of points - */ - parsePointsAttribute: function(points) { - - // points attribute is required and must not be empty - if (!points) { - return null; - } - - // replace commas with whitespace and remove bookending whitespace - points = points.replace(/,/g, ' ').trim(); - - points = points.split(/\s+/); - var parsedPoints = [], i, len; - - for (i = 0, len = points.length; i < len; i += 2) { - parsedPoints.push({ - x: parseFloat(points[i]), - y: parseFloat(points[i + 1]) - }); - } - - // odd number of points is an error - // if (parsedPoints.length % 2 !== 0) { - // return null; - // } - - return parsedPoints; - }, - - /** - * Returns CSS rules for a given SVG document - * @static - * @function - * @memberOf fabric - * @param {SVGDocument} doc SVG document to parse - * @return {Object} CSS rules of this document - */ - getCSSRules: function(doc) { - var styles = doc.getElementsByTagName('style'), i, len, - allRules = { }, rules; - - // very crude parsing of style contents - for (i = 0, len = styles.length; i < len; i++) { - var styleContents = styles[i].textContent; - - // remove comments - styleContents = styleContents.replace(/\/\*[\s\S]*?\*\//g, ''); - if (styleContents.trim() === '') { - continue; - } - // recovers all the rule in this form `body { style code... }` - // rules = styleContents.match(/[^{]*\{[\s\S]*?\}/g); - rules = styleContents.split('}'); - // remove empty rules. - rules = rules.filter(function(rule) { return rule.trim(); }); - // at this point we have hopefully an array of rules `body { style code... ` - // eslint-disable-next-line no-loop-func - rules.forEach(function(rule) { - - var match = rule.split('{'), - ruleObj = { }, declaration = match[1].trim(), - propertyValuePairs = declaration.split(';').filter(function(pair) { return pair.trim(); }); - - for (i = 0, len = propertyValuePairs.length; i < len; i++) { - var pair = propertyValuePairs[i].split(':'), - property = pair[0].trim(), - value = pair[1].trim(); - ruleObj[property] = value; - } - rule = match[0].trim(); - rule.split(',').forEach(function(_rule) { - _rule = _rule.replace(/^svg/i, '').trim(); - if (_rule === '') { - return; - } - if (allRules[_rule]) { - fabric.util.object.extend(allRules[_rule], ruleObj); - } - else { - allRules[_rule] = fabric.util.object.clone(ruleObj); - } - }); - }); - } - return allRules; - }, - - /** - * Takes url corresponding to an SVG document, and parses it into a set of fabric objects. - * Note that SVG is fetched via XMLHttpRequest, so it needs to conform to SOP (Same Origin Policy) - * @memberOf fabric - * @param {String} url - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [options] Object containing options for parsing - * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources - */ - loadSVGFromURL: function(url, callback, reviver, options) { - - url = url.replace(/^\n\s*/, '').trim(); - new fabric.util.request(url, { - method: 'get', - onComplete: onComplete - }); - - function onComplete(r) { - - var xml = r.responseXML; - if (!xml || !xml.documentElement) { - callback && callback(null); - return false; - } - - fabric.parseSVGDocument(xml.documentElement, function (results, _options, elements, allElements) { - callback && callback(results, _options, elements, allElements); - }, reviver, options); - } - }, - - /** - * Takes string corresponding to an SVG document, and parses it into a set of fabric objects - * @memberOf fabric - * @param {String} string - * @param {Function} callback - * @param {Function} [reviver] Method for further parsing of SVG elements, called after each fabric object created. - * @param {Object} [options] Object containing options for parsing - * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting to use for external resources - */ - loadSVGFromString: function(string, callback, reviver, options) { - var parser = new fabric.window.DOMParser(), - doc = parser.parseFromString(string.trim(), 'text/xml'); - fabric.parseSVGDocument(doc.documentElement, function (results, _options, elements, allElements) { - callback(results, _options, elements, allElements); - }, reviver, options); - } - }); - -})(typeof exports !== 'undefined' ? exports : this); - - -fabric.ElementsParser = function(elements, callback, options, reviver, parsingOptions, doc) { - this.elements = elements; - this.callback = callback; - this.options = options; - this.reviver = reviver; - this.svgUid = (options && options.svgUid) || 0; - this.parsingOptions = parsingOptions; - this.regexUrl = /^url\(['"]?#([^'"]+)['"]?\)/g; - this.doc = doc; -}; - -(function(proto) { - proto.parse = function() { - this.instances = new Array(this.elements.length); - this.numElements = this.elements.length; - this.createObjects(); - }; - - proto.createObjects = function() { - var _this = this; - this.elements.forEach(function(element, i) { - element.setAttribute('svgUid', _this.svgUid); - _this.createObject(element, i); - }); - }; - - proto.findTag = function(el) { - return fabric[fabric.util.string.capitalize(el.tagName.replace('svg:', ''))]; - }; - - proto.createObject = function(el, index) { - var klass = this.findTag(el); - if (klass && klass.fromElement) { - try { - klass.fromElement(el, this.createCallback(index, el), this.options); - } - catch (err) { - fabric.log(err); - } - } - else { - this.checkIfDone(); - } - }; - - proto.createCallback = function(index, el) { - var _this = this; - return function(obj) { - var _options; - _this.resolveGradient(obj, el, 'fill'); - _this.resolveGradient(obj, el, 'stroke'); - if (obj instanceof fabric.Image && obj._originalElement) { - _options = obj.parsePreserveAspectRatioAttribute(el); - } - obj._removeTransformMatrix(_options); - _this.resolveClipPath(obj, el); - _this.reviver && _this.reviver(el, obj); - _this.instances[index] = obj; - _this.checkIfDone(); - }; - }; - - proto.extractPropertyDefinition = function(obj, property, storage) { - var value = obj[property], regex = this.regexUrl; - if (!regex.test(value)) { - return; - } - regex.lastIndex = 0; - var id = regex.exec(value)[1]; - regex.lastIndex = 0; - return fabric[storage][this.svgUid][id]; - }; - - proto.resolveGradient = function(obj, el, property) { - var gradientDef = this.extractPropertyDefinition(obj, property, 'gradientDefs'); - if (gradientDef) { - var opacityAttr = el.getAttribute(property + '-opacity'); - var gradient = fabric.Gradient.fromElement(gradientDef, obj, opacityAttr, this.options); - obj.set(property, gradient); - } - }; - - proto.createClipPathCallback = function(obj, container) { - return function(_newObj) { - _newObj._removeTransformMatrix(); - _newObj.fillRule = _newObj.clipRule; - container.push(_newObj); - }; - }; - - proto.resolveClipPath = function(obj, usingElement) { - var clipPath = this.extractPropertyDefinition(obj, 'clipPath', 'clipPaths'), - element, klass, objTransformInv, container, gTransform, options; - if (clipPath) { - container = []; - objTransformInv = fabric.util.invertTransform(obj.calcTransformMatrix()); - // move the clipPath tag as sibling to the real element that is using it - var clipPathTag = clipPath[0].parentNode; - var clipPathOwner = usingElement; - while (clipPathOwner.parentNode && clipPathOwner.getAttribute('clip-path') !== obj.clipPath) { - clipPathOwner = clipPathOwner.parentNode; - } - clipPathOwner.parentNode.appendChild(clipPathTag); - for (var i = 0; i < clipPath.length; i++) { - element = clipPath[i]; - klass = this.findTag(element); - klass.fromElement( - element, - this.createClipPathCallback(obj, container), - this.options - ); - } - if (container.length === 1) { - clipPath = container[0]; - } - else { - clipPath = new fabric.Group(container); - } - gTransform = fabric.util.multiplyTransformMatrices( - objTransformInv, - clipPath.calcTransformMatrix() - ); - if (clipPath.clipPath) { - this.resolveClipPath(clipPath, clipPathOwner); - } - var options = fabric.util.qrDecompose(gTransform); - clipPath.flipX = false; - clipPath.flipY = false; - clipPath.set('scaleX', options.scaleX); - clipPath.set('scaleY', options.scaleY); - clipPath.angle = options.angle; - clipPath.skewX = options.skewX; - clipPath.skewY = 0; - clipPath.setPositionByOrigin({ x: options.translateX, y: options.translateY }, 'center', 'center'); - obj.clipPath = clipPath; - } - else { - // if clip-path does not resolve to any element, delete the property. - delete obj.clipPath; - } - }; - - proto.checkIfDone = function() { - if (--this.numElements === 0) { - this.instances = this.instances.filter(function(el) { - // eslint-disable-next-line no-eq-null, eqeqeq - return el != null; - }); - this.callback(this.instances, this.elements); - } - }; -})(fabric.ElementsParser.prototype); - - -(function(global) { - - 'use strict'; - - /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Point) { - fabric.warn('fabric.Point is already defined'); - return; - } - - fabric.Point = Point; - - /** - * Point class - * @class fabric.Point - * @memberOf fabric - * @constructor - * @param {Number} x - * @param {Number} y - * @return {fabric.Point} thisArg - */ - function Point(x, y) { - this.x = x; - this.y = y; - } - - Point.prototype = /** @lends fabric.Point.prototype */ { - - type: 'point', - - constructor: Point, - - /** - * Adds another point to this one and returns another one - * @param {fabric.Point} that - * @return {fabric.Point} new Point instance with added values - */ - add: function (that) { - return new Point(this.x + that.x, this.y + that.y); - }, - - /** - * Adds another point to this one - * @param {fabric.Point} that - * @return {fabric.Point} thisArg - * @chainable - */ - addEquals: function (that) { - this.x += that.x; - this.y += that.y; - return this; - }, - - /** - * Adds value to this point and returns a new one - * @param {Number} scalar - * @return {fabric.Point} new Point with added value - */ - scalarAdd: function (scalar) { - return new Point(this.x + scalar, this.y + scalar); - }, - - /** - * Adds value to this point - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - scalarAddEquals: function (scalar) { - this.x += scalar; - this.y += scalar; - return this; - }, - - /** - * Subtracts another point from this point and returns a new one - * @param {fabric.Point} that - * @return {fabric.Point} new Point object with subtracted values - */ - subtract: function (that) { - return new Point(this.x - that.x, this.y - that.y); - }, - - /** - * Subtracts another point from this point - * @param {fabric.Point} that - * @return {fabric.Point} thisArg - * @chainable - */ - subtractEquals: function (that) { - this.x -= that.x; - this.y -= that.y; - return this; - }, - - /** - * Subtracts value from this point and returns a new one - * @param {Number} scalar - * @return {fabric.Point} - */ - scalarSubtract: function (scalar) { - return new Point(this.x - scalar, this.y - scalar); - }, - - /** - * Subtracts value from this point - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - scalarSubtractEquals: function (scalar) { - this.x -= scalar; - this.y -= scalar; - return this; - }, - - /** - * Multiplies this point by a value and returns a new one - * TODO: rename in scalarMultiply in 2.0 - * @param {Number} scalar - * @return {fabric.Point} - */ - multiply: function (scalar) { - return new Point(this.x * scalar, this.y * scalar); - }, - - /** - * Multiplies this point by a value - * TODO: rename in scalarMultiplyEquals in 2.0 - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - multiplyEquals: function (scalar) { - this.x *= scalar; - this.y *= scalar; - return this; - }, - - /** - * Divides this point by a value and returns a new one - * TODO: rename in scalarDivide in 2.0 - * @param {Number} scalar - * @return {fabric.Point} - */ - divide: function (scalar) { - return new Point(this.x / scalar, this.y / scalar); - }, - - /** - * Divides this point by a value - * TODO: rename in scalarDivideEquals in 2.0 - * @param {Number} scalar - * @return {fabric.Point} thisArg - * @chainable - */ - divideEquals: function (scalar) { - this.x /= scalar; - this.y /= scalar; - return this; - }, - - /** - * Returns true if this point is equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - eq: function (that) { - return (this.x === that.x && this.y === that.y); - }, - - /** - * Returns true if this point is less than another one - * @param {fabric.Point} that - * @return {Boolean} - */ - lt: function (that) { - return (this.x < that.x && this.y < that.y); - }, - - /** - * Returns true if this point is less than or equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - lte: function (that) { - return (this.x <= that.x && this.y <= that.y); - }, - - /** - - * Returns true if this point is greater another one - * @param {fabric.Point} that - * @return {Boolean} - */ - gt: function (that) { - return (this.x > that.x && this.y > that.y); - }, - - /** - * Returns true if this point is greater than or equal to another one - * @param {fabric.Point} that - * @return {Boolean} - */ - gte: function (that) { - return (this.x >= that.x && this.y >= that.y); - }, - - /** - * Returns new point which is the result of linear interpolation with this one and another one - * @param {fabric.Point} that - * @param {Number} t , position of interpolation, between 0 and 1 default 0.5 - * @return {fabric.Point} - */ - lerp: function (that, t) { - if (typeof t === 'undefined') { - t = 0.5; - } - t = Math.max(Math.min(1, t), 0); - return new Point(this.x + (that.x - this.x) * t, this.y + (that.y - this.y) * t); - }, - - /** - * Returns distance from this point and another one - * @param {fabric.Point} that - * @return {Number} - */ - distanceFrom: function (that) { - var dx = this.x - that.x, - dy = this.y - that.y; - return Math.sqrt(dx * dx + dy * dy); - }, - - /** - * Returns the point between this point and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - midPointFrom: function (that) { - return this.lerp(that); - }, - - /** - * Returns a new point which is the min of this and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - min: function (that) { - return new Point(Math.min(this.x, that.x), Math.min(this.y, that.y)); - }, - - /** - * Returns a new point which is the max of this and another one - * @param {fabric.Point} that - * @return {fabric.Point} - */ - max: function (that) { - return new Point(Math.max(this.x, that.x), Math.max(this.y, that.y)); - }, - - /** - * Returns string representation of this point - * @return {String} - */ - toString: function () { - return this.x + ',' + this.y; - }, - - /** - * Sets x/y of this point - * @param {Number} x - * @param {Number} y - * @chainable - */ - setXY: function (x, y) { - this.x = x; - this.y = y; - return this; - }, - - /** - * Sets x of this point - * @param {Number} x - * @chainable - */ - setX: function (x) { - this.x = x; - return this; - }, - - /** - * Sets y of this point - * @param {Number} y - * @chainable - */ - setY: function (y) { - this.y = y; - return this; - }, - - /** - * Sets x/y of this point from another point - * @param {fabric.Point} that - * @chainable - */ - setFromPoint: function (that) { - this.x = that.x; - this.y = that.y; - return this; - }, - - /** - * Swaps x/y of this point and another point - * @param {fabric.Point} that - */ - swap: function (that) { - var x = this.x, - y = this.y; - this.x = that.x; - this.y = that.y; - that.x = x; - that.y = y; - }, - - /** - * return a cloned instance of the point - * @return {fabric.Point} - */ - clone: function () { - return new Point(this.x, this.y); - } - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - /* Adaptation of work of Kevin Lindsey (kevin@kevlindev.com) */ - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Intersection) { - fabric.warn('fabric.Intersection is already defined'); - return; - } - - /** - * Intersection class - * @class fabric.Intersection - * @memberOf fabric - * @constructor - */ - function Intersection(status) { - this.status = status; - this.points = []; - } - - fabric.Intersection = Intersection; - - fabric.Intersection.prototype = /** @lends fabric.Intersection.prototype */ { - - constructor: Intersection, - - /** - * Appends a point to intersection - * @param {fabric.Point} point - * @return {fabric.Intersection} thisArg - * @chainable - */ - appendPoint: function (point) { - this.points.push(point); - return this; - }, - - /** - * Appends points to intersection - * @param {Array} points - * @return {fabric.Intersection} thisArg - * @chainable - */ - appendPoints: function (points) { - this.points = this.points.concat(points); - return this; - } - }; - - /** - * Checks if one line intersects another - * TODO: rename in intersectSegmentSegment - * @static - * @param {fabric.Point} a1 - * @param {fabric.Point} a2 - * @param {fabric.Point} b1 - * @param {fabric.Point} b2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectLineLine = function (a1, a2, b1, b2) { - var result, - uaT = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x), - ubT = (a2.x - a1.x) * (a1.y - b1.y) - (a2.y - a1.y) * (a1.x - b1.x), - uB = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y); - if (uB !== 0) { - var ua = uaT / uB, - ub = ubT / uB; - if (0 <= ua && ua <= 1 && 0 <= ub && ub <= 1) { - result = new Intersection('Intersection'); - result.appendPoint(new fabric.Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y))); - } - else { - result = new Intersection(); - } - } - else { - if (uaT === 0 || ubT === 0) { - result = new Intersection('Coincident'); - } - else { - result = new Intersection('Parallel'); - } - } - return result; - }; - - /** - * Checks if line intersects polygon - * TODO: rename in intersectSegmentPolygon - * fix detection of coincident - * @static - * @param {fabric.Point} a1 - * @param {fabric.Point} a2 - * @param {Array} points - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectLinePolygon = function(a1, a2, points) { - var result = new Intersection(), - length = points.length, - b1, b2, inter, i; - - for (i = 0; i < length; i++) { - b1 = points[i]; - b2 = points[(i + 1) % length]; - inter = Intersection.intersectLineLine(a1, a2, b1, b2); - - result.appendPoints(inter.points); - } - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - - /** - * Checks if polygon intersects another polygon - * @static - * @param {Array} points1 - * @param {Array} points2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectPolygonPolygon = function (points1, points2) { - var result = new Intersection(), - length = points1.length, i; - - for (i = 0; i < length; i++) { - var a1 = points1[i], - a2 = points1[(i + 1) % length], - inter = Intersection.intersectLinePolygon(a1, a2, points2); - - result.appendPoints(inter.points); - } - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - - /** - * Checks if polygon intersects rectangle - * @static - * @param {Array} points - * @param {fabric.Point} r1 - * @param {fabric.Point} r2 - * @return {fabric.Intersection} - */ - fabric.Intersection.intersectPolygonRectangle = function (points, r1, r2) { - var min = r1.min(r2), - max = r1.max(r2), - topRight = new fabric.Point(max.x, min.y), - bottomLeft = new fabric.Point(min.x, max.y), - inter1 = Intersection.intersectLinePolygon(min, topRight, points), - inter2 = Intersection.intersectLinePolygon(topRight, max, points), - inter3 = Intersection.intersectLinePolygon(max, bottomLeft, points), - inter4 = Intersection.intersectLinePolygon(bottomLeft, min, points), - result = new Intersection(); - - result.appendPoints(inter1.points); - result.appendPoints(inter2.points); - result.appendPoints(inter3.points); - result.appendPoints(inter4.points); - - if (result.points.length > 0) { - result.status = 'Intersection'; - } - return result; - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Color) { - fabric.warn('fabric.Color is already defined.'); - return; - } - - /** - * Color class - * The purpose of {@link fabric.Color} is to abstract and encapsulate common color operations; - * {@link fabric.Color} is a constructor and creates instances of {@link fabric.Color} objects. - * - * @class fabric.Color - * @param {String} color optional in hex or rgb(a) or hsl format or from known color list - * @return {fabric.Color} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2/#colors} - */ - function Color(color) { - if (!color) { - this.setSource([0, 0, 0, 1]); - } - else { - this._tryParsingColor(color); - } - } - - fabric.Color = Color; - - fabric.Color.prototype = /** @lends fabric.Color.prototype */ { - - /** - * @private - * @param {String|Array} color Color value to parse - */ - _tryParsingColor: function(color) { - var source; - - if (color in Color.colorNameMap) { - color = Color.colorNameMap[color]; - } - - if (color === 'transparent') { - source = [255, 255, 255, 0]; - } - - if (!source) { - source = Color.sourceFromHex(color); - } - if (!source) { - source = Color.sourceFromRgb(color); - } - if (!source) { - source = Color.sourceFromHsl(color); - } - if (!source) { - //if color is not recognize let's make black as canvas does - source = [0, 0, 0, 1]; - } - if (source) { - this.setSource(source); - } - }, - - /** - * Adapted from https://github.com/mjijackson - * @private - * @param {Number} r Red color value - * @param {Number} g Green color value - * @param {Number} b Blue color value - * @return {Array} Hsl color - */ - _rgbToHsl: function(r, g, b) { - r /= 255; g /= 255; b /= 255; - - var h, s, l, - max = fabric.util.array.max([r, g, b]), - min = fabric.util.array.min([r, g, b]); - - l = (max + min) / 2; - - if (max === min) { - h = s = 0; // achromatic - } - else { - var d = max - min; - s = l > 0.5 ? d / (2 - max - min) : d / (max + min); - switch (max) { - case r: - h = (g - b) / d + (g < b ? 6 : 0); - break; - case g: - h = (b - r) / d + 2; - break; - case b: - h = (r - g) / d + 4; - break; - } - h /= 6; - } - - return [ - Math.round(h * 360), - Math.round(s * 100), - Math.round(l * 100) - ]; - }, - - /** - * Returns source of this color (where source is an array representation; ex: [200, 200, 100, 1]) - * @return {Array} - */ - getSource: function() { - return this._source; - }, - - /** - * Sets source of this color (where source is an array representation; ex: [200, 200, 100, 1]) - * @param {Array} source - */ - setSource: function(source) { - this._source = source; - }, - - /** - * Returns color representation in RGB format - * @return {String} ex: rgb(0-255,0-255,0-255) - */ - toRgb: function() { - var source = this.getSource(); - return 'rgb(' + source[0] + ',' + source[1] + ',' + source[2] + ')'; - }, - - /** - * Returns color representation in RGBA format - * @return {String} ex: rgba(0-255,0-255,0-255,0-1) - */ - toRgba: function() { - var source = this.getSource(); - return 'rgba(' + source[0] + ',' + source[1] + ',' + source[2] + ',' + source[3] + ')'; - }, - - /** - * Returns color representation in HSL format - * @return {String} ex: hsl(0-360,0%-100%,0%-100%) - */ - toHsl: function() { - var source = this.getSource(), - hsl = this._rgbToHsl(source[0], source[1], source[2]); - - return 'hsl(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%)'; - }, - - /** - * Returns color representation in HSLA format - * @return {String} ex: hsla(0-360,0%-100%,0%-100%,0-1) - */ - toHsla: function() { - var source = this.getSource(), - hsl = this._rgbToHsl(source[0], source[1], source[2]); - - return 'hsla(' + hsl[0] + ',' + hsl[1] + '%,' + hsl[2] + '%,' + source[3] + ')'; - }, - - /** - * Returns color representation in HEX format - * @return {String} ex: FF5555 - */ - toHex: function() { - var source = this.getSource(), r, g, b; - - r = source[0].toString(16); - r = (r.length === 1) ? ('0' + r) : r; - - g = source[1].toString(16); - g = (g.length === 1) ? ('0' + g) : g; - - b = source[2].toString(16); - b = (b.length === 1) ? ('0' + b) : b; - - return r.toUpperCase() + g.toUpperCase() + b.toUpperCase(); - }, - - /** - * Returns color representation in HEXA format - * @return {String} ex: FF5555CC - */ - toHexa: function() { - var source = this.getSource(), a; - - a = Math.round(source[3] * 255); - a = a.toString(16); - a = (a.length === 1) ? ('0' + a) : a; - - return this.toHex() + a.toUpperCase(); - }, - - /** - * Gets value of alpha channel for this color - * @return {Number} 0-1 - */ - getAlpha: function() { - return this.getSource()[3]; - }, - - /** - * Sets value of alpha channel for this color - * @param {Number} alpha Alpha value 0-1 - * @return {fabric.Color} thisArg - */ - setAlpha: function(alpha) { - var source = this.getSource(); - source[3] = alpha; - this.setSource(source); - return this; - }, - - /** - * Transforms color to its grayscale representation - * @return {fabric.Color} thisArg - */ - toGrayscale: function() { - var source = this.getSource(), - average = parseInt((source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), 10), - currentAlpha = source[3]; - this.setSource([average, average, average, currentAlpha]); - return this; - }, - - /** - * Transforms color to its black and white representation - * @param {Number} threshold - * @return {fabric.Color} thisArg - */ - toBlackWhite: function(threshold) { - var source = this.getSource(), - average = (source[0] * 0.3 + source[1] * 0.59 + source[2] * 0.11).toFixed(0), - currentAlpha = source[3]; - - threshold = threshold || 127; - - average = (Number(average) < Number(threshold)) ? 0 : 255; - this.setSource([average, average, average, currentAlpha]); - return this; - }, - - /** - * Overlays color with another color - * @param {String|fabric.Color} otherColor - * @return {fabric.Color} thisArg - */ - overlayWith: function(otherColor) { - if (!(otherColor instanceof Color)) { - otherColor = new Color(otherColor); - } - - var result = [], - alpha = this.getAlpha(), - otherAlpha = 0.5, - source = this.getSource(), - otherSource = otherColor.getSource(), i; - - for (i = 0; i < 3; i++) { - result.push(Math.round((source[i] * (1 - otherAlpha)) + (otherSource[i] * otherAlpha))); - } - - result[3] = alpha; - this.setSource(result); - return this; - } - }; - - /** - * Regex matching color in RGB or RGBA formats (ex: rgb(0, 0, 0), rgba(255, 100, 10, 0.5), rgba( 255 , 100 , 10 , 0.5 ), rgb(1,1,1), rgba(100%, 60%, 10%, 0.5)) - * @static - * @field - * @memberOf fabric.Color - */ - // eslint-disable-next-line max-len - fabric.Color.reRGBa = /^rgba?\(\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*,\s*(\d{1,3}(?:\.\d+)?\%?)\s*(?:\s*,\s*((?:\d*\.?\d+)?)\s*)?\)$/i; - - /** - * Regex matching color in HSL or HSLA formats (ex: hsl(200, 80%, 10%), hsla(300, 50%, 80%, 0.5), hsla( 300 , 50% , 80% , 0.5 )) - * @static - * @field - * @memberOf fabric.Color - */ - fabric.Color.reHSLa = /^hsla?\(\s*(\d{1,3})\s*,\s*(\d{1,3}\%)\s*,\s*(\d{1,3}\%)\s*(?:\s*,\s*(\d+(?:\.\d+)?)\s*)?\)$/i; - - /** - * Regex matching color in HEX format (ex: #FF5544CC, #FF5555, 010155, aff) - * @static - * @field - * @memberOf fabric.Color - */ - fabric.Color.reHex = /^#?([0-9a-f]{8}|[0-9a-f]{6}|[0-9a-f]{4}|[0-9a-f]{3})$/i; - - /** - * Map of the 148 color names with HEX code - * @static - * @field - * @memberOf fabric.Color - * @see: https://www.w3.org/TR/css3-color/#svg-color - */ - fabric.Color.colorNameMap = { - aliceblue: '#F0F8FF', - antiquewhite: '#FAEBD7', - aqua: '#00FFFF', - aquamarine: '#7FFFD4', - azure: '#F0FFFF', - beige: '#F5F5DC', - bisque: '#FFE4C4', - black: '#000000', - blanchedalmond: '#FFEBCD', - blue: '#0000FF', - blueviolet: '#8A2BE2', - brown: '#A52A2A', - burlywood: '#DEB887', - cadetblue: '#5F9EA0', - chartreuse: '#7FFF00', - chocolate: '#D2691E', - coral: '#FF7F50', - cornflowerblue: '#6495ED', - cornsilk: '#FFF8DC', - crimson: '#DC143C', - cyan: '#00FFFF', - darkblue: '#00008B', - darkcyan: '#008B8B', - darkgoldenrod: '#B8860B', - darkgray: '#A9A9A9', - darkgrey: '#A9A9A9', - darkgreen: '#006400', - darkkhaki: '#BDB76B', - darkmagenta: '#8B008B', - darkolivegreen: '#556B2F', - darkorange: '#FF8C00', - darkorchid: '#9932CC', - darkred: '#8B0000', - darksalmon: '#E9967A', - darkseagreen: '#8FBC8F', - darkslateblue: '#483D8B', - darkslategray: '#2F4F4F', - darkslategrey: '#2F4F4F', - darkturquoise: '#00CED1', - darkviolet: '#9400D3', - deeppink: '#FF1493', - deepskyblue: '#00BFFF', - dimgray: '#696969', - dimgrey: '#696969', - dodgerblue: '#1E90FF', - firebrick: '#B22222', - floralwhite: '#FFFAF0', - forestgreen: '#228B22', - fuchsia: '#FF00FF', - gainsboro: '#DCDCDC', - ghostwhite: '#F8F8FF', - gold: '#FFD700', - goldenrod: '#DAA520', - gray: '#808080', - grey: '#808080', - green: '#008000', - greenyellow: '#ADFF2F', - honeydew: '#F0FFF0', - hotpink: '#FF69B4', - indianred: '#CD5C5C', - indigo: '#4B0082', - ivory: '#FFFFF0', - khaki: '#F0E68C', - lavender: '#E6E6FA', - lavenderblush: '#FFF0F5', - lawngreen: '#7CFC00', - lemonchiffon: '#FFFACD', - lightblue: '#ADD8E6', - lightcoral: '#F08080', - lightcyan: '#E0FFFF', - lightgoldenrodyellow: '#FAFAD2', - lightgray: '#D3D3D3', - lightgrey: '#D3D3D3', - lightgreen: '#90EE90', - lightpink: '#FFB6C1', - lightsalmon: '#FFA07A', - lightseagreen: '#20B2AA', - lightskyblue: '#87CEFA', - lightslategray: '#778899', - lightslategrey: '#778899', - lightsteelblue: '#B0C4DE', - lightyellow: '#FFFFE0', - lime: '#00FF00', - limegreen: '#32CD32', - linen: '#FAF0E6', - magenta: '#FF00FF', - maroon: '#800000', - mediumaquamarine: '#66CDAA', - mediumblue: '#0000CD', - mediumorchid: '#BA55D3', - mediumpurple: '#9370DB', - mediumseagreen: '#3CB371', - mediumslateblue: '#7B68EE', - mediumspringgreen: '#00FA9A', - mediumturquoise: '#48D1CC', - mediumvioletred: '#C71585', - midnightblue: '#191970', - mintcream: '#F5FFFA', - mistyrose: '#FFE4E1', - moccasin: '#FFE4B5', - navajowhite: '#FFDEAD', - navy: '#000080', - oldlace: '#FDF5E6', - olive: '#808000', - olivedrab: '#6B8E23', - orange: '#FFA500', - orangered: '#FF4500', - orchid: '#DA70D6', - palegoldenrod: '#EEE8AA', - palegreen: '#98FB98', - paleturquoise: '#AFEEEE', - palevioletred: '#DB7093', - papayawhip: '#FFEFD5', - peachpuff: '#FFDAB9', - peru: '#CD853F', - pink: '#FFC0CB', - plum: '#DDA0DD', - powderblue: '#B0E0E6', - purple: '#800080', - rebeccapurple: '#663399', - red: '#FF0000', - rosybrown: '#BC8F8F', - royalblue: '#4169E1', - saddlebrown: '#8B4513', - salmon: '#FA8072', - sandybrown: '#F4A460', - seagreen: '#2E8B57', - seashell: '#FFF5EE', - sienna: '#A0522D', - silver: '#C0C0C0', - skyblue: '#87CEEB', - slateblue: '#6A5ACD', - slategray: '#708090', - slategrey: '#708090', - snow: '#FFFAFA', - springgreen: '#00FF7F', - steelblue: '#4682B4', - tan: '#D2B48C', - teal: '#008080', - thistle: '#D8BFD8', - tomato: '#FF6347', - turquoise: '#40E0D0', - violet: '#EE82EE', - wheat: '#F5DEB3', - white: '#FFFFFF', - whitesmoke: '#F5F5F5', - yellow: '#FFFF00', - yellowgreen: '#9ACD32' - }; - - /** - * @private - * @param {Number} p - * @param {Number} q - * @param {Number} t - * @return {Number} - */ - function hue2rgb(p, q, t) { - if (t < 0) { - t += 1; - } - if (t > 1) { - t -= 1; - } - if (t < 1 / 6) { - return p + (q - p) * 6 * t; - } - if (t < 1 / 2) { - return q; - } - if (t < 2 / 3) { - return p + (q - p) * (2 / 3 - t) * 6; - } - return p; - } - - /** - * Returns new color object, when given a color in RGB format - * @memberOf fabric.Color - * @param {String} color Color value ex: rgb(0-255,0-255,0-255) - * @return {fabric.Color} - */ - fabric.Color.fromRgb = function(color) { - return Color.fromSource(Color.sourceFromRgb(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in RGB or RGBA format - * @memberOf fabric.Color - * @param {String} color Color value ex: rgb(0-255,0-255,0-255), rgb(0%-100%,0%-100%,0%-100%) - * @return {Array} source - */ - fabric.Color.sourceFromRgb = function(color) { - var match = color.match(Color.reRGBa); - if (match) { - var r = parseInt(match[1], 10) / (/%$/.test(match[1]) ? 100 : 1) * (/%$/.test(match[1]) ? 255 : 1), - g = parseInt(match[2], 10) / (/%$/.test(match[2]) ? 100 : 1) * (/%$/.test(match[2]) ? 255 : 1), - b = parseInt(match[3], 10) / (/%$/.test(match[3]) ? 100 : 1) * (/%$/.test(match[3]) ? 255 : 1); - - return [ - parseInt(r, 10), - parseInt(g, 10), - parseInt(b, 10), - match[4] ? parseFloat(match[4]) : 1 - ]; - } - }; - - /** - * Returns new color object, when given a color in RGBA format - * @static - * @function - * @memberOf fabric.Color - * @param {String} color - * @return {fabric.Color} - */ - fabric.Color.fromRgba = Color.fromRgb; - - /** - * Returns new color object, when given a color in HSL format - * @param {String} color Color value ex: hsl(0-260,0%-100%,0%-100%) - * @memberOf fabric.Color - * @return {fabric.Color} - */ - fabric.Color.fromHsl = function(color) { - return Color.fromSource(Color.sourceFromHsl(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HSL or HSLA format. - * Adapted from https://github.com/mjijackson - * @memberOf fabric.Color - * @param {String} color Color value ex: hsl(0-360,0%-100%,0%-100%) or hsla(0-360,0%-100%,0%-100%, 0-1) - * @return {Array} source - * @see http://http://www.w3.org/TR/css3-color/#hsl-color - */ - fabric.Color.sourceFromHsl = function(color) { - var match = color.match(Color.reHSLa); - if (!match) { - return; - } - - var h = (((parseFloat(match[1]) % 360) + 360) % 360) / 360, - s = parseFloat(match[2]) / (/%$/.test(match[2]) ? 100 : 1), - l = parseFloat(match[3]) / (/%$/.test(match[3]) ? 100 : 1), - r, g, b; - - if (s === 0) { - r = g = b = l; - } - else { - var q = l <= 0.5 ? l * (s + 1) : l + s - l * s, - p = l * 2 - q; - - r = hue2rgb(p, q, h + 1 / 3); - g = hue2rgb(p, q, h); - b = hue2rgb(p, q, h - 1 / 3); - } - - return [ - Math.round(r * 255), - Math.round(g * 255), - Math.round(b * 255), - match[4] ? parseFloat(match[4]) : 1 - ]; - }; - - /** - * Returns new color object, when given a color in HSLA format - * @static - * @function - * @memberOf fabric.Color - * @param {String} color - * @return {fabric.Color} - */ - fabric.Color.fromHsla = Color.fromHsl; - - /** - * Returns new color object, when given a color in HEX format - * @static - * @memberOf fabric.Color - * @param {String} color Color value ex: FF5555 - * @return {fabric.Color} - */ - fabric.Color.fromHex = function(color) { - return Color.fromSource(Color.sourceFromHex(color)); - }; - - /** - * Returns array representation (ex: [100, 100, 200, 1]) of a color that's in HEX format - * @static - * @memberOf fabric.Color - * @param {String} color ex: FF5555 or FF5544CC (RGBa) - * @return {Array} source - */ - fabric.Color.sourceFromHex = function(color) { - if (color.match(Color.reHex)) { - var value = color.slice(color.indexOf('#') + 1), - isShortNotation = (value.length === 3 || value.length === 4), - isRGBa = (value.length === 8 || value.length === 4), - r = isShortNotation ? (value.charAt(0) + value.charAt(0)) : value.substring(0, 2), - g = isShortNotation ? (value.charAt(1) + value.charAt(1)) : value.substring(2, 4), - b = isShortNotation ? (value.charAt(2) + value.charAt(2)) : value.substring(4, 6), - a = isRGBa ? (isShortNotation ? (value.charAt(3) + value.charAt(3)) : value.substring(6, 8)) : 'FF'; - - return [ - parseInt(r, 16), - parseInt(g, 16), - parseInt(b, 16), - parseFloat((parseInt(a, 16) / 255).toFixed(2)) - ]; - } - }; - - /** - * Returns new color object, when given color in array representation (ex: [200, 100, 100, 0.5]) - * @static - * @memberOf fabric.Color - * @param {Array} source - * @return {fabric.Color} - */ - fabric.Color.fromSource = function(source) { - var oColor = new Color(); - oColor.setSource(source); - return oColor; - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - scaleMap = ['e', 'se', 's', 'sw', 'w', 'nw', 'n', 'ne', 'e'], - skewMap = ['ns', 'nesw', 'ew', 'nwse'], - controls = {}, - LEFT = 'left', TOP = 'top', RIGHT = 'right', BOTTOM = 'bottom', CENTER = 'center', - opposite = { - top: BOTTOM, - bottom: TOP, - left: RIGHT, - right: LEFT, - center: CENTER, - }, radiansToDegrees = fabric.util.radiansToDegrees, - sign = (Math.sign || function(x) { return ((x > 0) - (x < 0)) || +x; }); - - /** - * Combine control position and object angle to find the control direction compared - * to the object center. - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - * @param {fabric.Control} control the control class - * @return {Number} 0 - 7 a quadrant number - */ - function findCornerQuadrant(fabricObject, control) { - var cornerAngle = fabricObject.angle + radiansToDegrees(Math.atan2(control.y, control.x)) + 360; - return Math.round((cornerAngle % 360) / 45); - } - - function fireEvent(eventName, options) { - var target = options.transform.target, - canvas = target.canvas, - canvasOptions = fabric.util.object.clone(options); - canvasOptions.target = target; - canvas && canvas.fire('object:' + eventName, canvasOptions); - target.fire(eventName, options); - } - - /** - * Inspect event and fabricObject properties to understand if the scaling action - * @param {Event} eventData from the user action - * @param {fabric.Object} fabricObject the fabric object about to scale - * @return {Boolean} true if scale is proportional - */ - function scaleIsProportional(eventData, fabricObject) { - var canvas = fabricObject.canvas, uniScaleKey = canvas.uniScaleKey, - uniformIsToggled = eventData[uniScaleKey]; - return (canvas.uniformScaling && !uniformIsToggled) || - (!canvas.uniformScaling && uniformIsToggled); - } - - /** - * Checks if transform is centered - * @param {Object} transform transform data - * @return {Boolean} true if transform is centered - */ - function isTransformCentered(transform) { - return transform.originX === CENTER && transform.originY === CENTER; - } - - /** - * Inspect fabricObject to understand if the current scaling action is allowed - * @param {fabric.Object} fabricObject the fabric object about to scale - * @param {String} by 'x' or 'y' or '' - * @param {Boolean} scaleProportionally true if we are trying to scale proportionally - * @return {Boolean} true if scaling is not allowed at current conditions - */ - function scalingIsForbidden(fabricObject, by, scaleProportionally) { - var lockX = fabricObject.lockScalingX, lockY = fabricObject.lockScalingY; - if (lockX && lockY) { - return true; - } - if (!by && (lockX || lockY) && scaleProportionally) { - return true; - } - if (lockX && by === 'x') { - return true; - } - if (lockY && by === 'y') { - return true; - } - return false; - } - - /** - * return the correct cursor style for the scale action - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function scaleCursorStyleHandler(eventData, control, fabricObject) { - var notAllowed = 'not-allowed', - scaleProportionally = scaleIsProportional(eventData, fabricObject), - by = ''; - if (control.x !== 0 && control.y === 0) { - by = 'x'; - } - else if (control.x === 0 && control.y !== 0) { - by = 'y'; - } - if (scalingIsForbidden(fabricObject, by, scaleProportionally)) { - return notAllowed; - } - var n = findCornerQuadrant(fabricObject, control); - return scaleMap[n] + '-resize'; - } - - /** - * return the correct cursor style for the skew action - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function skewCursorStyleHandler(eventData, control, fabricObject) { - var notAllowed = 'not-allowed'; - if (control.x !== 0 && fabricObject.lockSkewingY) { - return notAllowed; - } - if (control.y !== 0 && fabricObject.lockSkewingX) { - return notAllowed; - } - var n = findCornerQuadrant(fabricObject, control) % 4; - return skewMap[n] + '-resize'; - } - - /** - * Combine skew and scale style handlers to cover fabric standard use case - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function scaleSkewCursorStyleHandler(eventData, control, fabricObject) { - if (eventData[fabricObject.canvas.altActionKey]) { - return controls.skewCursorStyleHandler(eventData, control, fabricObject); - } - return controls.scaleCursorStyleHandler(eventData, control, fabricObject); - } - - /** - * Inspect event, control and fabricObject to return the correct action name - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} an action name - */ - function scaleOrSkewActionName(eventData, control, fabricObject) { - var isAlternative = eventData[fabricObject.canvas.altActionKey]; - if (control.x === 0) { - // then is scaleY or skewX - return isAlternative ? 'skewX' : 'scaleY'; - } - if (control.y === 0) { - // then is scaleY or skewX - return isAlternative ? 'skewY' : 'scaleX'; - } - } - - /** - * Find the correct style for the control that is used for rotation. - * this function is very simple and it just take care of not-allowed or standard cursor - * @param {Event} eventData the javascript event that is causing the scale - * @param {fabric.Control} control the control that is interested in the action - * @param {fabric.Object} fabricObject the fabric object that is interested in the action - * @return {String} a valid css string for the cursor - */ - function rotationStyleHandler(eventData, control, fabricObject) { - if (fabricObject.lockRotation) { - return 'not-allowed'; - } - return control.cursorStyle; - } - - function commonEventInfo(eventData, transform, x, y) { - return { - e: eventData, - transform: transform, - pointer: { - x: x, - y: y, - } - }; - } - - /** - * Wrap an action handler with saving/restoring object position on the transform. - * this is the code that permits to objects to keep their position while transforming. - * @param {Function} actionHandler the function to wrap - * @return {Function} a function with an action handler signature - */ - function wrapWithFixedAnchor(actionHandler) { - return function(eventData, transform, x, y) { - var target = transform.target, centerPoint = target.getCenterPoint(), - constraint = target.translateToOriginPoint(centerPoint, transform.originX, transform.originY), - actionPerformed = actionHandler(eventData, transform, x, y); - target.setPositionByOrigin(constraint, transform.originX, transform.originY); - return actionPerformed; - }; - } - - /** - * Wrap an action handler with firing an event if the action is performed - * @param {Function} actionHandler the function to wrap - * @return {Function} a function with an action handler signature - */ - function wrapWithFireEvent(eventName, actionHandler) { - return function(eventData, transform, x, y) { - var actionPerformed = actionHandler(eventData, transform, x, y); - if (actionPerformed) { - fireEvent(eventName, commonEventInfo(eventData, transform, x, y)); - } - return actionPerformed; - }; - } - - /** - * Transforms a point described by x and y in a distance from the top left corner of the object - * bounding box. - * @param {Object} transform - * @param {String} originX - * @param {String} originY - * @param {number} x - * @param {number} y - * @return {Fabric.Point} the normalized point - */ - function getLocalPoint(transform, originX, originY, x, y) { - var target = transform.target, - control = target.controls[transform.corner], - zoom = target.canvas.getZoom(), - padding = target.padding / zoom, - localPoint = target.toLocalPoint(new fabric.Point(x, y), originX, originY); - if (localPoint.x >= padding) { - localPoint.x -= padding; - } - if (localPoint.x <= -padding) { - localPoint.x += padding; - } - if (localPoint.y >= padding) { - localPoint.y -= padding; - } - if (localPoint.y <= padding) { - localPoint.y += padding; - } - localPoint.x -= control.offsetX; - localPoint.y -= control.offsetY; - return localPoint; - } - - /** - * Detect if the fabric object is flipped on one side. - * @param {fabric.Object} target - * @return {Boolean} true if one flip, but not two. - */ - function targetHasOneFlip(target) { - return target.flipX !== target.flipY; - } - - /** - * Utility function to compensate the scale factor when skew is applied on both axes - * @private - */ - function compensateScaleForSkew(target, oppositeSkew, scaleToCompensate, axis, reference) { - if (target[oppositeSkew] !== 0) { - var newDim = target._getTransformedDimensions()[axis]; - var newValue = reference / newDim * target[scaleToCompensate]; - target.set(scaleToCompensate, newValue); - } - } - - /** - * Action handler for skewing on the X axis - * @private - */ - function skewObjectX(eventData, transform, x, y) { - var target = transform.target, - // find how big the object would be, if there was no skewX. takes in account scaling - dimNoSkew = target._getTransformedDimensions(0, target.skewY), - localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - // the mouse is in the center of the object, and we want it to stay there. - // so the object will grow twice as much as the mouse. - // this makes the skew growth to localPoint * 2 - dimNoSkew. - totalSkewSize = Math.abs(localPoint.x * 2) - dimNoSkew.x, - currentSkew = target.skewX, newSkew; - if (totalSkewSize < 2) { - // let's make it easy to go back to position 0. - newSkew = 0; - } - else { - newSkew = radiansToDegrees( - Math.atan2((totalSkewSize / target.scaleX), (dimNoSkew.y / target.scaleY)) - ); - // now we have to find the sign of the skew. - // it mostly depend on the origin of transformation. - if (transform.originX === LEFT && transform.originY === BOTTOM) { - newSkew = -newSkew; - } - if (transform.originX === RIGHT && transform.originY === TOP) { - newSkew = -newSkew; - } - if (targetHasOneFlip(target)) { - newSkew = -newSkew; - } - } - var hasSkewed = currentSkew !== newSkew; - if (hasSkewed) { - var dimBeforeSkewing = target._getTransformedDimensions().y; - target.set('skewX', newSkew); - compensateScaleForSkew(target, 'skewY', 'scaleY', 'y', dimBeforeSkewing); - } - return hasSkewed; - } - - /** - * Action handler for skewing on the Y axis - * @private - */ - function skewObjectY(eventData, transform, x, y) { - var target = transform.target, - // find how big the object would be, if there was no skewX. takes in account scaling - dimNoSkew = target._getTransformedDimensions(target.skewX, 0), - localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - // the mouse is in the center of the object, and we want it to stay there. - // so the object will grow twice as much as the mouse. - // this makes the skew growth to localPoint * 2 - dimNoSkew. - totalSkewSize = Math.abs(localPoint.y * 2) - dimNoSkew.y, - currentSkew = target.skewY, newSkew; - if (totalSkewSize < 2) { - // let's make it easy to go back to position 0. - newSkew = 0; - } - else { - newSkew = radiansToDegrees( - Math.atan2((totalSkewSize / target.scaleY), (dimNoSkew.x / target.scaleX)) - ); - // now we have to find the sign of the skew. - // it mostly depend on the origin of transformation. - if (transform.originX === LEFT && transform.originY === BOTTOM) { - newSkew = -newSkew; - } - if (transform.originX === RIGHT && transform.originY === TOP) { - newSkew = -newSkew; - } - if (targetHasOneFlip(target)) { - newSkew = -newSkew; - } - } - var hasSkewed = currentSkew !== newSkew; - if (hasSkewed) { - var dimBeforeSkewing = target._getTransformedDimensions().x; - target.set('skewY', newSkew); - compensateScaleForSkew(target, 'skewX', 'scaleX', 'x', dimBeforeSkewing); - } - return hasSkewed; - } - - /** - * Wrapped Action handler for skewing on the Y axis, takes care of the - * skew direction and determine the correct transform origin for the anchor point - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function skewHandlerX(eventData, transform, x, y) { - // step1 figure out and change transform origin. - // if skewX > 0 and originY bottom we anchor on right - // if skewX > 0 and originY top we anchor on left - // if skewX < 0 and originY bottom we anchor on left - // if skewX < 0 and originY top we anchor on right - // if skewX is 0, we look for mouse position to understand where are we going. - var target = transform.target, currentSkew = target.skewX, originX, originY = transform.originY; - if (target.lockSkewingX) { - return false; - } - if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); - if (localPointFromCenter.x > 0) { - // we are pulling right, anchor left; - originX = LEFT; - } - else { - // we are pulling right, anchor right - originX = RIGHT; - } - } - else { - if (currentSkew > 0) { - originX = originY === TOP ? LEFT : RIGHT; - } - if (currentSkew < 0) { - originX = originY === TOP ? RIGHT : LEFT; - } - // is the object flipped on one side only? swap the origin. - if (targetHasOneFlip(target)) { - originX = originX === LEFT ? RIGHT : LEFT; - } - } - - // once we have the origin, we find the anchor point - transform.originX = originX; - var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectX)); - return finalHandler(eventData, transform, x, y); - } - - /** - * Wrapped Action handler for skewing on the Y axis, takes care of the - * skew direction and determine the correct transform origin for the anchor point - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function skewHandlerY(eventData, transform, x, y) { - // step1 figure out and change transform origin. - // if skewY > 0 and originX left we anchor on top - // if skewY > 0 and originX right we anchor on bottom - // if skewY < 0 and originX left we anchor on bottom - // if skewY < 0 and originX right we anchor on top - // if skewY is 0, we look for mouse position to understand where are we going. - var target = transform.target, currentSkew = target.skewY, originY, originX = transform.originX; - if (target.lockSkewingY) { - return false; - } - if (currentSkew === 0) { - var localPointFromCenter = getLocalPoint(transform, CENTER, CENTER, x, y); - if (localPointFromCenter.y > 0) { - // we are pulling down, anchor up; - originY = TOP; - } - else { - // we are pulling up, anchor down - originY = BOTTOM; - } - } - else { - if (currentSkew > 0) { - originY = originX === LEFT ? TOP : BOTTOM; - } - if (currentSkew < 0) { - originY = originX === LEFT ? BOTTOM : TOP; - } - // is the object flipped on one side only? swap the origin. - if (targetHasOneFlip(target)) { - originY = originY === TOP ? BOTTOM : TOP; - } - } - - // once we have the origin, we find the anchor point - transform.originY = originY; - var finalHandler = wrapWithFireEvent('skewing', wrapWithFixedAnchor(skewObjectY)); - return finalHandler(eventData, transform, x, y); - } - - /** - * Action handler for rotation and snapping, without anchor point. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - * @private - */ - function rotationWithSnapping(eventData, transform, x, y) { - var t = transform, - target = t.target, - pivotPoint = target.translateToOriginPoint(target.getCenterPoint(), t.originX, t.originY); - - if (target.lockRotation) { - return false; - } - - var lastAngle = Math.atan2(t.ey - pivotPoint.y, t.ex - pivotPoint.x), - curAngle = Math.atan2(y - pivotPoint.y, x - pivotPoint.x), - angle = radiansToDegrees(curAngle - lastAngle + t.theta), - hasRotated = true; - - if (target.snapAngle > 0) { - var snapAngle = target.snapAngle, - snapThreshold = target.snapThreshold || snapAngle, - rightAngleLocked = Math.ceil(angle / snapAngle) * snapAngle, - leftAngleLocked = Math.floor(angle / snapAngle) * snapAngle; - - if (Math.abs(angle - leftAngleLocked) < snapThreshold) { - angle = leftAngleLocked; - } - else if (Math.abs(angle - rightAngleLocked) < snapThreshold) { - angle = rightAngleLocked; - } - } - - // normalize angle to positive value - if (angle < 0) { - angle = 360 + angle; - } - angle %= 360; - - hasRotated = target.angle !== angle; - target.angle = angle; - return hasRotated; - } - - /** - * Basic scaling logic, reused with different constrain for scaling X,Y, freely or equally. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @param {Object} options additional information for scaling - * @param {String} options.by 'x', 'y', 'equally' or '' to indicate type of scaling - * @return {Boolean} true if some change happened - * @private - */ - function scaleObject(eventData, transform, x, y, options) { - options = options || {}; - var target = transform.target, - lockScalingX = target.lockScalingX, lockScalingY = target.lockScalingY, - by = options.by, newPoint, scaleX, scaleY, dim, - scaleProportionally = scaleIsProportional(eventData, target), - forbidScaling = scalingIsForbidden(target, by, scaleProportionally), - signX, signY, gestureScale = transform.gestureScale; - - if (forbidScaling) { - return false; - } - if (gestureScale) { - scaleX = transform.scaleX * gestureScale; - scaleY = transform.scaleY * gestureScale; - } - else { - newPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y); - // use of sign: We use sign to detect change of direction of an action. sign usually change when - // we cross the origin point with the mouse. So a scale flip for example. There is an issue when scaling - // by center and scaling using one middle control ( default: mr, mt, ml, mb), the mouse movement can easily - // cross many time the origin point and flip the object. so we need a way to filter out the noise. - // This ternary here should be ok to filter out X scaling when we want Y only and vice versa. - signX = by !== 'y' ? sign(newPoint.x) : 1; - signY = by !== 'x' ? sign(newPoint.y) : 1; - if (!transform.signX) { - transform.signX = signX; - } - if (!transform.signY) { - transform.signY = signY; - } - - if (target.lockScalingFlip && - (transform.signX !== signX || transform.signY !== signY) - ) { - return false; - } - - dim = target._getTransformedDimensions(); - // missing detection of flip and logic to switch the origin - if (scaleProportionally && !by) { - // uniform scaling - var distance = Math.abs(newPoint.x) + Math.abs(newPoint.y), - original = transform.original, - originalDistance = Math.abs(dim.x * original.scaleX / target.scaleX) + - Math.abs(dim.y * original.scaleY / target.scaleY), - scale = distance / originalDistance; - scaleX = original.scaleX * scale; - scaleY = original.scaleY * scale; - } - else { - scaleX = Math.abs(newPoint.x * target.scaleX / dim.x); - scaleY = Math.abs(newPoint.y * target.scaleY / dim.y); - } - // if we are scaling by center, we need to double the scale - if (isTransformCentered(transform)) { - scaleX *= 2; - scaleY *= 2; - } - if (transform.signX !== signX && by !== 'y') { - transform.originX = opposite[transform.originX]; - scaleX *= -1; - transform.signX = signX; - } - if (transform.signY !== signY && by !== 'x') { - transform.originY = opposite[transform.originY]; - scaleY *= -1; - transform.signY = signY; - } - } - // minScale is taken are in the setter. - var oldScaleX = target.scaleX, oldScaleY = target.scaleY; - if (!by) { - !lockScalingX && target.set('scaleX', scaleX); - !lockScalingY && target.set('scaleY', scaleY); - } - else { - // forbidden cases already handled on top here. - by === 'x' && target.set('scaleX', scaleX); - by === 'y' && target.set('scaleY', scaleY); - } - return oldScaleX !== target.scaleX || oldScaleY !== target.scaleY; - } - - /** - * Generic scaling logic, to scale from corners either equally or freely. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectFromCorner(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y); - } - - /** - * Scaling logic for the X axis. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectX(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y , { by: 'x' }); - } - - /** - * Scaling logic for the Y axis. - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scaleObjectY(eventData, transform, x, y) { - return scaleObject(eventData, transform, x, y , { by: 'y' }); - } - - /** - * Composed action handler to either scale Y or skew X - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scalingYOrSkewingX(eventData, transform, x, y) { - // ok some safety needed here. - if (eventData[transform.target.canvas.altActionKey]) { - return controls.skewHandlerX(eventData, transform, x, y); - } - return controls.scalingY(eventData, transform, x, y); - } - - /** - * Composed action handler to either scale X or skew Y - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function scalingXOrSkewingY(eventData, transform, x, y) { - // ok some safety needed here. - if (eventData[transform.target.canvas.altActionKey]) { - return controls.skewHandlerY(eventData, transform, x, y); - } - return controls.scalingX(eventData, transform, x, y); - } - - /** - * Action handler to change textbox width - * Needs to be wrapped with `wrapWithFixedAnchor` to be effective - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if some change happened - */ - function changeWidth(eventData, transform, x, y) { - var target = transform.target, localPoint = getLocalPoint(transform, transform.originX, transform.originY, x, y), - strokePadding = target.strokeWidth / (target.strokeUniform ? target.scaleX : 1), - multiplier = isTransformCentered(transform) ? 2 : 1, - oldWidth = target.width, - newWidth = Math.abs(localPoint.x * multiplier / target.scaleX) - strokePadding; - target.set('width', Math.max(newWidth, 0)); - return oldWidth !== newWidth; - } - - /** - * Action handler - * @private - * @param {Event} eventData javascript event that is doing the transform - * @param {Object} transform javascript object containing a series of information around the current transform - * @param {number} x current mouse x position, canvas normalized - * @param {number} y current mouse y position, canvas normalized - * @return {Boolean} true if the translation occurred - */ - function dragHandler(eventData, transform, x, y) { - var target = transform.target, - newLeft = x - transform.offsetX, - newTop = y - transform.offsetY, - moveX = !target.get('lockMovementX') && target.left !== newLeft, - moveY = !target.get('lockMovementY') && target.top !== newTop; - moveX && target.set('left', newLeft); - moveY && target.set('top', newTop); - if (moveX || moveY) { - fireEvent('moving', commonEventInfo(eventData, transform, x, y)); - } - return moveX || moveY; - } - - controls.scaleCursorStyleHandler = scaleCursorStyleHandler; - controls.skewCursorStyleHandler = skewCursorStyleHandler; - controls.scaleSkewCursorStyleHandler = scaleSkewCursorStyleHandler; - controls.rotationWithSnapping = wrapWithFireEvent('rotating', wrapWithFixedAnchor(rotationWithSnapping)); - controls.scalingEqually = wrapWithFireEvent('scaling', wrapWithFixedAnchor( scaleObjectFromCorner)); - controls.scalingX = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectX)); - controls.scalingY = wrapWithFireEvent('scaling', wrapWithFixedAnchor(scaleObjectY)); - controls.scalingYOrSkewingX = scalingYOrSkewingX; - controls.scalingXOrSkewingY = scalingXOrSkewingY; - controls.changeWidth = wrapWithFireEvent('resizing', wrapWithFixedAnchor(changeWidth)); - controls.skewHandlerX = skewHandlerX; - controls.skewHandlerY = skewHandlerY; - controls.dragHandler = dragHandler; - controls.scaleOrSkewActionName = scaleOrSkewActionName; - controls.rotationStyleHandler = rotationStyleHandler; - controls.fireEvent = fireEvent; - controls.wrapWithFixedAnchor = wrapWithFixedAnchor; - controls.wrapWithFireEvent = wrapWithFireEvent; - controls.getLocalPoint = getLocalPoint; - fabric.controlsUtils = controls; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - degreesToRadians = fabric.util.degreesToRadians, - controls = fabric.controlsUtils; - - /** - * Render a round control, as per fabric features. - * This function is written to respect object properties like transparentCorners, cornerSize - * cornerColor, cornerStrokeColor - * plus the addition of offsetY and offsetX. - * @param {CanvasRenderingContext2D} ctx context to render on - * @param {Number} left x coordinate where the control center should be - * @param {Number} top y coordinate where the control center should be - * @param {Object} styleOverride override for fabric.Object controls style - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - */ - function renderCircleControl (ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, - ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, - transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? - styleOverride.transparentCorners : fabricObject.transparentCorners, - methodName = transparentCorners ? 'stroke' : 'fill', - stroke = !transparentCorners && (styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor), - myLeft = left, - myTop = top, size; - ctx.save(); - ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; - ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; - // as soon as fabric react v5, remove ie11, use proper ellipse code. - if (xSize > ySize) { - size = xSize; - ctx.scale(1.0, ySize / xSize); - myTop = top * xSize / ySize; - } - else if (ySize > xSize) { - size = ySize; - ctx.scale(xSize / ySize, 1.0); - myLeft = left * ySize / xSize; - } - else { - size = xSize; - } - // this is still wrong - ctx.lineWidth = 1; - ctx.beginPath(); - ctx.arc(myLeft, myTop, size / 2, 0, 2 * Math.PI, false); - ctx[methodName](); - if (stroke) { - ctx.stroke(); - } - ctx.restore(); - } - - /** - * Render a square control, as per fabric features. - * This function is written to respect object properties like transparentCorners, cornerSize - * cornerColor, cornerStrokeColor - * plus the addition of offsetY and offsetX. - * @param {CanvasRenderingContext2D} ctx context to render on - * @param {Number} left x coordinate where the control center should be - * @param {Number} top y coordinate where the control center should be - * @param {Object} styleOverride override for fabric.Object controls style - * @param {fabric.Object} fabricObject the fabric object for which we are rendering controls - */ - function renderSquareControl(ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - var xSize = this.sizeX || styleOverride.cornerSize || fabricObject.cornerSize, - ySize = this.sizeY || styleOverride.cornerSize || fabricObject.cornerSize, - transparentCorners = typeof styleOverride.transparentCorners !== 'undefined' ? - styleOverride.transparentCorners : fabricObject.transparentCorners, - methodName = transparentCorners ? 'stroke' : 'fill', - stroke = !transparentCorners && ( - styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor - ), xSizeBy2 = xSize / 2, ySizeBy2 = ySize / 2; - ctx.save(); - ctx.fillStyle = styleOverride.cornerColor || fabricObject.cornerColor; - ctx.strokeStyle = styleOverride.cornerStrokeColor || fabricObject.cornerStrokeColor; - // this is still wrong - ctx.lineWidth = 1; - ctx.translate(left, top); - ctx.rotate(degreesToRadians(fabricObject.angle)); - // this does not work, and fixed with ( && ) does not make sense. - // to have real transparent corners we need the controls on upperCanvas - // transparentCorners || ctx.clearRect(-xSizeBy2, -ySizeBy2, xSize, ySize); - ctx[methodName + 'Rect'](-xSizeBy2, -ySizeBy2, xSize, ySize); - if (stroke) { - ctx.strokeRect(-xSizeBy2, -ySizeBy2, xSize, ySize); - } - ctx.restore(); - } - - controls.renderCircleControl = renderCircleControl; - controls.renderSquareControl = renderSquareControl; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - function Control(options) { - for (var i in options) { - this[i] = options[i]; - } - } - - fabric.Control = Control; - - fabric.Control.prototype = /** @lends fabric.Control.prototype */ { - - /** - * keep track of control visibility. - * mainly for backward compatibility. - * if you do not want to see a control, you can remove it - * from the controlset. - * @type {Boolean} - * @default true - */ - visible: true, - - /** - * Name of the action that the control will likely execute. - * This is optional. FabricJS uses to identify what the user is doing for some - * extra optimizations. If you are writing a custom control and you want to know - * somewhere else in the code what is going on, you can use this string here. - * you can also provide a custom getActionName if your control run multiple actions - * depending on some external state. - * default to scale since is the most common, used on 4 corners by default - * @type {String} - * @default 'scale' - */ - actionName: 'scale', - - /** - * Drawing angle of the control. - * NOT used for now, but name marked as needed for internal logic - * example: to reuse the same drawing function for different rotated controls - * @type {Number} - * @default 0 - */ - angle: 0, - - /** - * Relative position of the control. X - * 0,0 is the center of the Object, while -0.5 (left) or 0.5 (right) are the extremities - * of the bounding box. - * @type {Number} - * @default 0 - */ - x: 0, - - /** - * Relative position of the control. Y - * 0,0 is the center of the Object, while -0.5 (top) or 0.5 (bottom) are the extremities - * of the bounding box. - * @type {Number} - * @default 0 - */ - y: 0, - - /** - * Horizontal offset of the control from the defined position. In pixels - * Positive offset moves the control to the right, negative to the left. - * It used when you want to have position of control that does not scale with - * the bounding box. Example: rotation control is placed at x:0, y: 0.5 on - * the boundindbox, with an offset of 30 pixels vertically. Those 30 pixels will - * stay 30 pixels no matter how the object is big. Another example is having 2 - * controls in the corner, that stay in the same position when the object scale. - * of the bounding box. - * @type {Number} - * @default 0 - */ - offsetX: 0, - - /** - * Vertical offset of the control from the defined position. In pixels - * Positive offset moves the control to the bottom, negative to the top. - * @type {Number} - * @default 0 - */ - offsetY: 0, - - /** - * Sets the length of the control. If null, defaults to object's cornerSize. - * Expects both sizeX and sizeY to be set when set. - * @type {?Number} - * @default null - */ - sizeX: null, - - /** - * Sets the height of the control. If null, defaults to object's cornerSize. - * Expects both sizeX and sizeY to be set when set. - * @type {?Number} - * @default null - */ - sizeY: null, - - /** - * Sets the length of the touch area of the control. If null, defaults to object's touchCornerSize. - * Expects both touchSizeX and touchSizeY to be set when set. - * @type {?Number} - * @default null - */ - touchSizeX: null, - - /** - * Sets the height of the touch area of the control. If null, defaults to object's touchCornerSize. - * Expects both touchSizeX and touchSizeY to be set when set. - * @type {?Number} - * @default null - */ - touchSizeY: null, - - /** - * Css cursor style to display when the control is hovered. - * if the method `cursorStyleHandler` is provided, this property is ignored. - * @type {String} - * @default 'crosshair' - */ - cursorStyle: 'crosshair', - - /** - * If controls has an offsetY or offsetX, draw a line that connects - * the control to the bounding box - * @type {Boolean} - * @default false - */ - withConnection: false, - - /** - * The control actionHandler, provide one to handle action ( control being moved ) - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - actionHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * The control handler for mouse down, provide one to handle mouse down on control - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - mouseDownHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * The control mouseUpHandler, provide one to handle an effect on mouse up. - * @param {Event} eventData the native mouse event - * @param {Object} transformData properties of the current transform - * @param {Number} x x position of the cursor - * @param {Number} y y position of the cursor - * @return {Boolean} true if the action/event modified the object - */ - mouseUpHandler: function(/* eventData, transformData, x, y */) { }, - - /** - * Returns control actionHandler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getActionHandler: function(/* eventData, fabricObject, control */) { - return this.actionHandler; - }, - - /** - * Returns control mouseDown handler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getMouseDownHandler: function(/* eventData, fabricObject, control */) { - return this.mouseDownHandler; - }, - - /** - * Returns control mouseUp handler - * @param {Event} eventData the native mouse event - * @param {fabric.Object} fabricObject on which the control is displayed - * @param {fabric.Control} control control for which the action handler is being asked - * @return {Function} the action handler - */ - getMouseUpHandler: function(/* eventData, fabricObject, control */) { - return this.mouseUpHandler; - }, - - /** - * Returns control cursorStyle for css using cursorStyle. If you need a more elaborate - * function you can pass one in the constructor - * the cursorStyle property - * @param {Event} eventData the native mouse event - * @param {fabric.Control} control the current control ( likely this) - * @param {fabric.Object} object on which the control is displayed - * @return {String} - */ - cursorStyleHandler: function(eventData, control /* fabricObject */) { - return control.cursorStyle; - }, - - /** - * Returns the action name. The basic implementation just return the actionName property. - * @param {Event} eventData the native mouse event - * @param {fabric.Control} control the current control ( likely this) - * @param {fabric.Object} object on which the control is displayed - * @return {String} - */ - getActionName: function(eventData, control /* fabricObject */) { - return control.actionName; - }, - - /** - * Returns controls visibility - * @param {fabric.Object} object on which the control is displayed - * @param {String} controlKey key where the control is memorized on the - * @return {Boolean} - */ - getVisibility: function(fabricObject, controlKey) { - var objectVisibility = fabricObject._controlsVisibility; - if (objectVisibility && typeof objectVisibility[controlKey] !== 'undefined') { - return objectVisibility[controlKey]; - } - return this.visible; - }, - - /** - * Sets controls visibility - * @param {Boolean} visibility for the object - * @return {Void} - */ - setVisibility: function(visibility /* name, fabricObject */) { - this.visible = visibility; - }, - - - positionHandler: function(dim, finalMatrix /*, fabricObject, currentControl */) { - var point = fabric.util.transformPoint({ - x: this.x * dim.x + this.offsetX, - y: this.y * dim.y + this.offsetY }, finalMatrix); - return point; - }, - - /** - * Returns the coords for this control based on object values. - * @param {Number} objectAngle angle from the fabric object holding the control - * @param {Number} objectCornerSize cornerSize from the fabric object holding the control (or touchCornerSize if - * isTouch is true) - * @param {Number} centerX x coordinate where the control center should be - * @param {Number} centerY y coordinate where the control center should be - * @param {boolean} isTouch true if touch corner, false if normal corner - */ - calcCornerCoords: function(objectAngle, objectCornerSize, centerX, centerY, isTouch) { - var cosHalfOffset, - sinHalfOffset, - cosHalfOffsetComp, - sinHalfOffsetComp, - xSize = (isTouch) ? this.touchSizeX : this.sizeX, - ySize = (isTouch) ? this.touchSizeY : this.sizeY; - if (xSize && ySize && xSize !== ySize) { - // handle rectangular corners - var controlTriangleAngle = Math.atan2(ySize, xSize); - var cornerHypotenuse = Math.sqrt(xSize * xSize + ySize * ySize) / 2; - var newTheta = controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); - var newThetaComp = Math.PI / 2 - controlTriangleAngle - fabric.util.degreesToRadians(objectAngle); - cosHalfOffset = cornerHypotenuse * fabric.util.cos(newTheta); - sinHalfOffset = cornerHypotenuse * fabric.util.sin(newTheta); - // use complementary angle for two corners - cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newThetaComp); - sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newThetaComp); - } - else { - // handle square corners - // use default object corner size unless size is defined - var cornerSize = (xSize && ySize) ? xSize : objectCornerSize; - /* 0.7071067812 stands for sqrt(2)/2 */ - cornerHypotenuse = cornerSize * 0.7071067812; - // complementary angles are equal since they're both 45 degrees - var newTheta = fabric.util.degreesToRadians(45 - objectAngle); - cosHalfOffset = cosHalfOffsetComp = cornerHypotenuse * fabric.util.cos(newTheta); - sinHalfOffset = sinHalfOffsetComp = cornerHypotenuse * fabric.util.sin(newTheta); - } - - return { - tl: { - x: centerX - sinHalfOffsetComp, - y: centerY - cosHalfOffsetComp, - }, - tr: { - x: centerX + cosHalfOffset, - y: centerY - sinHalfOffset, - }, - bl: { - x: centerX - cosHalfOffset, - y: centerY + sinHalfOffset, - }, - br: { - x: centerX + sinHalfOffsetComp, - y: centerY + cosHalfOffsetComp, - }, - }; - }, - - /** - * Render function for the control. - * When this function runs the context is unscaled. unrotate. Just retina scaled. - * all the functions will have to translate to the point left,top before starting Drawing - * if they want to draw a control where the position is detected. - * left and top are the result of the positionHandler function - * @param {RenderingContext2D} ctx the context where the control will be drawn - * @param {Number} left position of the canvas where we are about to render the control. - * @param {Number} top position of the canvas where we are about to render the control. - * @param {Object} styleOverride - * @param {fabric.Object} fabricObject the object where the control is about to be rendered - */ - render: function(ctx, left, top, styleOverride, fabricObject) { - styleOverride = styleOverride || {}; - switch (styleOverride.cornerStyle || fabricObject.cornerStyle) { - case 'circle': - fabric.controlsUtils.renderCircleControl.call(this, ctx, left, top, styleOverride, fabricObject); - break; - default: - fabric.controlsUtils.renderSquareControl.call(this, ctx, left, top, styleOverride, fabricObject); - } - }, - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - /* _FROM_SVG_START_ */ - function getColorStop(el, multiplier) { - var style = el.getAttribute('style'), - offset = el.getAttribute('offset') || 0, - color, colorAlpha, opacity, i; - - // convert percents to absolute values - offset = parseFloat(offset) / (/%$/.test(offset) ? 100 : 1); - offset = offset < 0 ? 0 : offset > 1 ? 1 : offset; - if (style) { - var keyValuePairs = style.split(/\s*;\s*/); - - if (keyValuePairs[keyValuePairs.length - 1] === '') { - keyValuePairs.pop(); - } - - for (i = keyValuePairs.length; i--; ) { - - var split = keyValuePairs[i].split(/\s*:\s*/), - key = split[0].trim(), - value = split[1].trim(); - - if (key === 'stop-color') { - color = value; - } - else if (key === 'stop-opacity') { - opacity = value; - } - } - } - - if (!color) { - color = el.getAttribute('stop-color') || 'rgb(0,0,0)'; - } - if (!opacity) { - opacity = el.getAttribute('stop-opacity'); - } - - color = new fabric.Color(color); - colorAlpha = color.getAlpha(); - opacity = isNaN(parseFloat(opacity)) ? 1 : parseFloat(opacity); - opacity *= colorAlpha * multiplier; - - return { - offset: offset, - color: color.toRgb(), - opacity: opacity - }; - } - - function getLinearCoords(el) { - return { - x1: el.getAttribute('x1') || 0, - y1: el.getAttribute('y1') || 0, - x2: el.getAttribute('x2') || '100%', - y2: el.getAttribute('y2') || 0 - }; - } - - function getRadialCoords(el) { - return { - x1: el.getAttribute('fx') || el.getAttribute('cx') || '50%', - y1: el.getAttribute('fy') || el.getAttribute('cy') || '50%', - r1: 0, - x2: el.getAttribute('cx') || '50%', - y2: el.getAttribute('cy') || '50%', - r2: el.getAttribute('r') || '50%' - }; - } - /* _FROM_SVG_END_ */ - - var clone = fabric.util.object.clone; - - /** - * Gradient class - * @class fabric.Gradient - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#gradients} - * @see {@link fabric.Gradient#initialize} for constructor definition - */ - fabric.Gradient = fabric.util.createClass(/** @lends fabric.Gradient.prototype */ { - - /** - * Horizontal offset for aligning gradients coming from SVG when outside pathgroups - * @type Number - * @default 0 - */ - offsetX: 0, - - /** - * Vertical offset for aligning gradients coming from SVG when outside pathgroups - * @type Number - * @default 0 - */ - offsetY: 0, - - /** - * A transform matrix to apply to the gradient before painting. - * Imported from svg gradients, is not applied with the current transform in the center. - * Before this transform is applied, the origin point is at the top left corner of the object - * plus the addition of offsetY and offsetX. - * @type Number[] - * @default null - */ - gradientTransform: null, - - /** - * coordinates units for coords. - * If `pixels`, the number of coords are in the same unit of width / height. - * If set as `percentage` the coords are still a number, but 1 means 100% of width - * for the X and 100% of the height for the y. It can be bigger than 1 and negative. - * allowed values pixels or percentage. - * @type String - * @default 'pixels' - */ - gradientUnits: 'pixels', - - /** - * Gradient type linear or radial - * @type String - * @default 'pixels' - */ - type: 'linear', - - /** - * Constructor - * @param {Object} options Options object with type, coords, gradientUnits and colorStops - * @param {Object} [options.type] gradient type linear or radial - * @param {Object} [options.gradientUnits] gradient units - * @param {Object} [options.offsetX] SVG import compatibility - * @param {Object} [options.offsetY] SVG import compatibility - * @param {Object[]} options.colorStops contains the colorstops. - * @param {Object} options.coords contains the coords of the gradient - * @param {Number} [options.coords.x1] X coordiante of the first point for linear or of the focal point for radial - * @param {Number} [options.coords.y1] Y coordiante of the first point for linear or of the focal point for radial - * @param {Number} [options.coords.x2] X coordiante of the second point for linear or of the center point for radial - * @param {Number} [options.coords.y2] Y coordiante of the second point for linear or of the center point for radial - * @param {Number} [options.coords.r1] only for radial gradient, radius of the inner circle - * @param {Number} [options.coords.r2] only for radial gradient, radius of the external circle - * @return {fabric.Gradient} thisArg - */ - initialize: function(options) { - options || (options = { }); - options.coords || (options.coords = { }); - - var coords, _this = this; - - // sets everything, then coords and colorstops get sets again - Object.keys(options).forEach(function(option) { - _this[option] = options[option]; - }); - - if (this.id) { - this.id += '_' + fabric.Object.__uid++; - } - else { - this.id = fabric.Object.__uid++; - } - - coords = { - x1: options.coords.x1 || 0, - y1: options.coords.y1 || 0, - x2: options.coords.x2 || 0, - y2: options.coords.y2 || 0 - }; - - if (this.type === 'radial') { - coords.r1 = options.coords.r1 || 0; - coords.r2 = options.coords.r2 || 0; - } - - this.coords = coords; - this.colorStops = options.colorStops.slice(); - }, - - /** - * Adds another colorStop - * @param {Object} colorStop Object with offset and color - * @return {fabric.Gradient} thisArg - */ - addColorStop: function(colorStops) { - for (var position in colorStops) { - var color = new fabric.Color(colorStops[position]); - this.colorStops.push({ - offset: parseFloat(position), - color: color.toRgb(), - opacity: color.getAlpha() - }); - } - return this; - }, - - /** - * Returns object representation of a gradient - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} - */ - toObject: function(propertiesToInclude) { - var object = { - type: this.type, - coords: this.coords, - colorStops: this.colorStops, - offsetX: this.offsetX, - offsetY: this.offsetY, - gradientUnits: this.gradientUnits, - gradientTransform: this.gradientTransform ? this.gradientTransform.concat() : this.gradientTransform - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); - - return object; - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of an gradient - * @param {Object} object Object to create a gradient for - * @return {String} SVG representation of an gradient (linear/radial) - */ - toSVG: function(object, options) { - var coords = clone(this.coords, true), i, len, options = options || {}, - markup, commonAttributes, colorStops = clone(this.colorStops, true), - needsSwap = coords.r1 > coords.r2, - transform = this.gradientTransform ? this.gradientTransform.concat() : fabric.iMatrix.concat(), - offsetX = -this.offsetX, offsetY = -this.offsetY, - withViewport = !!options.additionalTransform, - gradientUnits = this.gradientUnits === 'pixels' ? 'userSpaceOnUse' : 'objectBoundingBox'; - // colorStops must be sorted ascending - colorStops.sort(function(a, b) { - return a.offset - b.offset; - }); - - if (gradientUnits === 'objectBoundingBox') { - offsetX /= object.width; - offsetY /= object.height; - } - else { - offsetX += object.width / 2; - offsetY += object.height / 2; - } - if (object.type === 'path' && this.gradientUnits !== 'percentage') { - offsetX -= object.pathOffset.x; - offsetY -= object.pathOffset.y; - } - - - transform[4] -= offsetX; - transform[5] -= offsetY; - - commonAttributes = 'id="SVGID_' + this.id + - '" gradientUnits="' + gradientUnits + '"'; - commonAttributes += ' gradientTransform="' + (withViewport ? - options.additionalTransform + ' ' : '') + fabric.util.matrixToSVG(transform) + '" '; - - if (this.type === 'linear') { - markup = [ - '\n' - ]; - } - else if (this.type === 'radial') { - // svg radial gradient has just 1 radius. the biggest. - markup = [ - '\n' - ]; - } - - if (this.type === 'radial') { - if (needsSwap) { - // svg goes from internal to external radius. if radius are inverted, swap color stops. - colorStops = colorStops.concat(); - colorStops.reverse(); - for (i = 0, len = colorStops.length; i < len; i++) { - colorStops[i].offset = 1 - colorStops[i].offset; - } - } - var minRadius = Math.min(coords.r1, coords.r2); - if (minRadius > 0) { - // i have to shift all colorStops and add new one in 0. - var maxRadius = Math.max(coords.r1, coords.r2), - percentageShift = minRadius / maxRadius; - for (i = 0, len = colorStops.length; i < len; i++) { - colorStops[i].offset += percentageShift * (1 - colorStops[i].offset); - } - } - } - - for (i = 0, len = colorStops.length; i < len; i++) { - var colorStop = colorStops[i]; - markup.push( - '\n' - ); - } - - markup.push((this.type === 'linear' ? '\n' : '\n')); - - return markup.join(''); - }, - /* _TO_SVG_END_ */ - - /** - * Returns an instance of CanvasGradient - * @param {CanvasRenderingContext2D} ctx Context to render on - * @return {CanvasGradient} - */ - toLive: function(ctx) { - var gradient, coords = fabric.util.object.clone(this.coords), i, len; - - if (!this.type) { - return; - } - - if (this.type === 'linear') { - gradient = ctx.createLinearGradient( - coords.x1, coords.y1, coords.x2, coords.y2); - } - else if (this.type === 'radial') { - gradient = ctx.createRadialGradient( - coords.x1, coords.y1, coords.r1, coords.x2, coords.y2, coords.r2); - } - - for (i = 0, len = this.colorStops.length; i < len; i++) { - var color = this.colorStops[i].color, - opacity = this.colorStops[i].opacity, - offset = this.colorStops[i].offset; - - if (typeof opacity !== 'undefined') { - color = new fabric.Color(color).setAlpha(opacity).toRgba(); - } - gradient.addColorStop(offset, color); - } - - return gradient; - } - }); - - fabric.util.object.extend(fabric.Gradient, { - - /* _FROM_SVG_START_ */ - /** - * Returns {@link fabric.Gradient} instance from an SVG element - * @static - * @memberOf fabric.Gradient - * @param {SVGGradientElement} el SVG gradient element - * @param {fabric.Object} instance - * @param {String} opacityAttr A fill-opacity or stroke-opacity attribute to multiply to each stop's opacity. - * @param {Object} svgOptions an object containing the size of the SVG in order to parse correctly gradients - * that uses gradientUnits as 'userSpaceOnUse' and percentages. - * @param {Object.number} viewBoxWidth width part of the viewBox attribute on svg - * @param {Object.number} viewBoxHeight height part of the viewBox attribute on svg - * @param {Object.number} width width part of the svg tag if viewBox is not specified - * @param {Object.number} height height part of the svg tag if viewBox is not specified - * @return {fabric.Gradient} Gradient instance - * @see http://www.w3.org/TR/SVG/pservers.html#LinearGradientElement - * @see http://www.w3.org/TR/SVG/pservers.html#RadialGradientElement - */ - fromElement: function(el, instance, opacityAttr, svgOptions) { - /** - * @example: - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * - * OR - * - * - * - * - * - * - * - */ - - var multiplier = parseFloat(opacityAttr) / (/%$/.test(opacityAttr) ? 100 : 1); - multiplier = multiplier < 0 ? 0 : multiplier > 1 ? 1 : multiplier; - if (isNaN(multiplier)) { - multiplier = 1; - } - - var colorStopEls = el.getElementsByTagName('stop'), - type, - gradientUnits = el.getAttribute('gradientUnits') === 'userSpaceOnUse' ? - 'pixels' : 'percentage', - gradientTransform = el.getAttribute('gradientTransform') || '', - colorStops = [], - coords, i, offsetX = 0, offsetY = 0, - transformMatrix; - if (el.nodeName === 'linearGradient' || el.nodeName === 'LINEARGRADIENT') { - type = 'linear'; - coords = getLinearCoords(el); - } - else { - type = 'radial'; - coords = getRadialCoords(el); - } - - for (i = colorStopEls.length; i--; ) { - colorStops.push(getColorStop(colorStopEls[i], multiplier)); - } - - transformMatrix = fabric.parseTransformAttribute(gradientTransform); - - __convertPercentUnitsToValues(instance, coords, svgOptions, gradientUnits); - - if (gradientUnits === 'pixels') { - offsetX = -instance.left; - offsetY = -instance.top; - } - - var gradient = new fabric.Gradient({ - id: el.getAttribute('id'), - type: type, - coords: coords, - colorStops: colorStops, - gradientUnits: gradientUnits, - gradientTransform: transformMatrix, - offsetX: offsetX, - offsetY: offsetY, - }); - - return gradient; - } - /* _FROM_SVG_END_ */ - }); - - /** - * @private - */ - function __convertPercentUnitsToValues(instance, options, svgOptions, gradientUnits) { - var propValue, finalValue; - Object.keys(options).forEach(function(prop) { - propValue = options[prop]; - if (propValue === 'Infinity') { - finalValue = 1; - } - else if (propValue === '-Infinity') { - finalValue = 0; - } - else { - finalValue = parseFloat(options[prop], 10); - if (typeof propValue === 'string' && /^(\d+\.\d+)%|(\d+)%$/.test(propValue)) { - finalValue *= 0.01; - if (gradientUnits === 'pixels') { - // then we need to fix those percentages here in svg parsing - if (prop === 'x1' || prop === 'x2' || prop === 'r2') { - finalValue *= svgOptions.viewBoxWidth || svgOptions.width; - } - if (prop === 'y1' || prop === 'y2') { - finalValue *= svgOptions.viewBoxHeight || svgOptions.height; - } - } - } - } - options[prop] = finalValue; - }); - } -})(); - - -(function() { - - 'use strict'; - - var toFixed = fabric.util.toFixed; - - /** - * Pattern class - * @class fabric.Pattern - * @see {@link http://fabricjs.com/patterns|Pattern demo} - * @see {@link http://fabricjs.com/dynamic-patterns|DynamicPattern demo} - * @see {@link fabric.Pattern#initialize} for constructor definition - */ - - - fabric.Pattern = fabric.util.createClass(/** @lends fabric.Pattern.prototype */ { - - /** - * Repeat property of a pattern (one of repeat, repeat-x, repeat-y or no-repeat) - * @type String - * @default - */ - repeat: 'repeat', - - /** - * Pattern horizontal offset from object's left/top corner - * @type Number - * @default - */ - offsetX: 0, - - /** - * Pattern vertical offset from object's left/top corner - * @type Number - * @default - */ - offsetY: 0, - - /** - * crossOrigin value (one of "", "anonymous", "use-credentials") - * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes - * @type String - * @default - */ - crossOrigin: '', - - /** - * transform matrix to change the pattern, imported from svgs. - * @type Array - * @default - */ - patternTransform: null, - - /** - * Constructor - * @param {Object} [options] Options object - * @param {Function} [callback] function to invoke after callback init. - * @return {fabric.Pattern} thisArg - */ - initialize: function(options, callback) { - options || (options = { }); - - this.id = fabric.Object.__uid++; - this.setOptions(options); - if (!options.source || (options.source && typeof options.source !== 'string')) { - callback && callback(this); - return; - } - else { - // img src string - var _this = this; - this.source = fabric.util.createImage(); - fabric.util.loadImage(options.source, function(img, isError) { - _this.source = img; - callback && callback(_this, isError); - }, null, this.crossOrigin); - } - }, - - /** - * Returns object representation of a pattern - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of a pattern instance - */ - toObject: function(propertiesToInclude) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - source, object; - - // element - if (typeof this.source.src === 'string') { - source = this.source.src; - } - // element - else if (typeof this.source === 'object' && this.source.toDataURL) { - source = this.source.toDataURL(); - } - - object = { - type: 'pattern', - source: source, - repeat: this.repeat, - crossOrigin: this.crossOrigin, - offsetX: toFixed(this.offsetX, NUM_FRACTION_DIGITS), - offsetY: toFixed(this.offsetY, NUM_FRACTION_DIGITS), - patternTransform: this.patternTransform ? this.patternTransform.concat() : null - }; - fabric.util.populateWithProperties(this, object, propertiesToInclude); - - return object; - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of a pattern - * @param {fabric.Object} object - * @return {String} SVG representation of a pattern - */ - toSVG: function(object) { - var patternSource = typeof this.source === 'function' ? this.source() : this.source, - patternWidth = patternSource.width / object.width, - patternHeight = patternSource.height / object.height, - patternOffsetX = this.offsetX / object.width, - patternOffsetY = this.offsetY / object.height, - patternImgSrc = ''; - if (this.repeat === 'repeat-x' || this.repeat === 'no-repeat') { - patternHeight = 1; - if (patternOffsetY) { - patternHeight += Math.abs(patternOffsetY); - } - } - if (this.repeat === 'repeat-y' || this.repeat === 'no-repeat') { - patternWidth = 1; - if (patternOffsetX) { - patternWidth += Math.abs(patternOffsetX); - } - - } - if (patternSource.src) { - patternImgSrc = patternSource.src; - } - else if (patternSource.toDataURL) { - patternImgSrc = patternSource.toDataURL(); - } - - return '\n' + - '\n' + - '\n'; - }, - /* _TO_SVG_END_ */ - - setOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } - }, - - /** - * Returns an instance of CanvasPattern - * @param {CanvasRenderingContext2D} ctx Context to create pattern - * @return {CanvasPattern} - */ - toLive: function(ctx) { - var source = this.source; - // if the image failed to load, return, and allow rest to continue loading - if (!source) { - return ''; - } - - // if an image - if (typeof source.src !== 'undefined') { - if (!source.complete) { - return ''; - } - if (source.naturalWidth === 0 || source.naturalHeight === 0) { - return ''; - } - } - return ctx.createPattern(source, this.repeat); - } - }); -})(); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - toFixed = fabric.util.toFixed; - - if (fabric.Shadow) { - fabric.warn('fabric.Shadow is already defined.'); - return; - } - - /** - * Shadow class - * @class fabric.Shadow - * @see {@link http://fabricjs.com/shadows|Shadow demo} - * @see {@link fabric.Shadow#initialize} for constructor definition - */ - fabric.Shadow = fabric.util.createClass(/** @lends fabric.Shadow.prototype */ { - - /** - * Shadow color - * @type String - * @default - */ - color: 'rgb(0,0,0)', - - /** - * Shadow blur - * @type Number - */ - blur: 0, - - /** - * Shadow horizontal offset - * @type Number - * @default - */ - offsetX: 0, - - /** - * Shadow vertical offset - * @type Number - * @default - */ - offsetY: 0, - - /** - * Whether the shadow should affect stroke operations - * @type Boolean - * @default - */ - affectStroke: false, - - /** - * Indicates whether toObject should include default values - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * When `false`, the shadow will scale with the object. - * When `true`, the shadow's offsetX, offsetY, and blur will not be affected by the object's scale. - * default to false - * @type Boolean - * @default - */ - nonScaling: false, - - /** - * Constructor - * @param {Object|String} [options] Options object with any of color, blur, offsetX, offsetY properties or string (e.g. "rgba(0,0,0,0.2) 2px 2px 10px") - * @return {fabric.Shadow} thisArg - */ - initialize: function(options) { - - if (typeof options === 'string') { - options = this._parseShadow(options); - } - - for (var prop in options) { - this[prop] = options[prop]; - } - - this.id = fabric.Object.__uid++; - }, - - /** - * @private - * @param {String} shadow Shadow value to parse - * @return {Object} Shadow object with color, offsetX, offsetY and blur - */ - _parseShadow: function(shadow) { - var shadowStr = shadow.trim(), - offsetsAndBlur = fabric.Shadow.reOffsetsAndBlur.exec(shadowStr) || [], - color = shadowStr.replace(fabric.Shadow.reOffsetsAndBlur, '') || 'rgb(0,0,0)'; - - return { - color: color.trim(), - offsetX: parseFloat(offsetsAndBlur[1], 10) || 0, - offsetY: parseFloat(offsetsAndBlur[2], 10) || 0, - blur: parseFloat(offsetsAndBlur[3], 10) || 0 - }; - }, - - /** - * Returns a string representation of an instance - * @see http://www.w3.org/TR/css-text-decor-3/#text-shadow - * @return {String} Returns CSS3 text-shadow declaration - */ - toString: function() { - return [this.offsetX, this.offsetY, this.blur, this.color].join('px '); - }, - - /* _TO_SVG_START_ */ - /** - * Returns SVG representation of a shadow - * @param {fabric.Object} object - * @return {String} SVG representation of a shadow - */ - toSVG: function(object) { - var fBoxX = 40, fBoxY = 40, NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - offset = fabric.util.rotateVector( - { x: this.offsetX, y: this.offsetY }, - fabric.util.degreesToRadians(-object.angle)), - BLUR_BOX = 20, color = new fabric.Color(this.color); - - if (object.width && object.height) { - //http://www.w3.org/TR/SVG/filters.html#FilterEffectsRegion - // we add some extra space to filter box to contain the blur ( 20 ) - fBoxX = toFixed((Math.abs(offset.x) + this.blur) / object.width, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; - fBoxY = toFixed((Math.abs(offset.y) + this.blur) / object.height, NUM_FRACTION_DIGITS) * 100 + BLUR_BOX; - } - if (object.flipX) { - offset.x *= -1; - } - if (object.flipY) { - offset.y *= -1; - } - - return ( - '\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\n' + - '\t\t\n' + - '\t\t\n' + - '\t\n' + - '\n'); - }, - /* _TO_SVG_END_ */ - - /** - * Returns object representation of a shadow - * @return {Object} Object representation of a shadow instance - */ - toObject: function() { - if (this.includeDefaultValues) { - return { - color: this.color, - blur: this.blur, - offsetX: this.offsetX, - offsetY: this.offsetY, - affectStroke: this.affectStroke, - nonScaling: this.nonScaling - }; - } - var obj = { }, proto = fabric.Shadow.prototype; - - ['color', 'blur', 'offsetX', 'offsetY', 'affectStroke', 'nonScaling'].forEach(function(prop) { - if (this[prop] !== proto[prop]) { - obj[prop] = this[prop]; - } - }, this); - - return obj; - } - }); - - /** - * Regex matching shadow offsetX, offsetY and blur (ex: "2px 2px 10px rgba(0,0,0,0.2)", "rgb(0,255,0) 2px 2px") - * @static - * @field - * @memberOf fabric.Shadow - */ - // eslint-disable-next-line max-len - fabric.Shadow.reOffsetsAndBlur = /(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function () { - - 'use strict'; - - if (fabric.StaticCanvas) { - fabric.warn('fabric.StaticCanvas is already defined.'); - return; - } - - // aliases for faster resolution - var extend = fabric.util.object.extend, - getElementOffset = fabric.util.getElementOffset, - removeFromArray = fabric.util.removeFromArray, - toFixed = fabric.util.toFixed, - transformPoint = fabric.util.transformPoint, - invertTransform = fabric.util.invertTransform, - getNodeCanvas = fabric.util.getNodeCanvas, - createCanvasElement = fabric.util.createCanvasElement, - - CANVAS_INIT_ERROR = new Error('Could not initialize `canvas` element'); - - /** - * Static canvas class - * @class fabric.StaticCanvas - * @mixes fabric.Collection - * @mixes fabric.Observable - * @see {@link http://fabricjs.com/static_canvas|StaticCanvas demo} - * @see {@link fabric.StaticCanvas#initialize} for constructor definition - * @fires before:render - * @fires after:render - * @fires canvas:cleared - * @fires object:added - * @fires object:removed - */ - fabric.StaticCanvas = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Constructor - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(el, options) { - options || (options = { }); - this.renderAndResetBound = this.renderAndReset.bind(this); - this.requestRenderAllBound = this.requestRenderAll.bind(this); - this._initStatic(el, options); - }, - - /** - * Background color of canvas instance. - * Should be set via {@link fabric.StaticCanvas#setBackgroundColor}. - * @type {(String|fabric.Pattern)} - * @default - */ - backgroundColor: '', - - /** - * Background image of canvas instance. - * since 2.4.0 image caching is active, please when putting an image as background, add to the - * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom - * vale. As an alternative you can disable image objectCaching - * @type fabric.Image - * @default - */ - backgroundImage: null, - - /** - * Overlay color of canvas instance. - * Should be set via {@link fabric.StaticCanvas#setOverlayColor} - * @since 1.3.9 - * @type {(String|fabric.Pattern)} - * @default - */ - overlayColor: '', - - /** - * Overlay image of canvas instance. - * since 2.4.0 image caching is active, please when putting an image as overlay, add to the - * canvas property a reference to the canvas it is on. Otherwise the image cannot detect the zoom - * vale. As an alternative you can disable image objectCaching - * @type fabric.Image - * @default - */ - overlayImage: null, - - /** - * Indicates whether toObject/toDatalessObject should include default values - * if set to false, takes precedence over the object value. - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * Indicates whether objects' state should be saved - * @type Boolean - * @default - */ - stateful: false, - - /** - * Indicates whether {@link fabric.Collection.add}, {@link fabric.Collection.insertAt} and {@link fabric.Collection.remove}, - * {@link fabric.StaticCanvas.moveTo}, {@link fabric.StaticCanvas.clear} and many more, should also re-render canvas. - * Disabling this option will not give a performance boost when adding/removing a lot of objects to/from canvas at once - * since the renders are quequed and executed one per frame. - * Disabling is suggested anyway and managing the renders of the app manually is not a big effort ( canvas.requestRenderAll() ) - * Left default to true to do not break documentation and old app, fiddles. - * @type Boolean - * @default - */ - renderOnAddRemove: true, - - /** - * Indicates whether object controls (borders/controls) are rendered above overlay image - * @type Boolean - * @default - */ - controlsAboveOverlay: false, - - /** - * Indicates whether the browser can be scrolled when using a touchscreen and dragging on the canvas - * @type Boolean - * @default - */ - allowTouchScrolling: false, - - /** - * Indicates whether this canvas will use image smoothing, this is on by default in browsers - * @type Boolean - * @default - */ - imageSmoothingEnabled: true, - - /** - * The transformation (a Canvas 2D API transform matrix) which focuses the viewport - * @type Array - * @example Default transform - * canvas.viewportTransform = [1, 0, 0, 1, 0, 0]; - * @example Scale by 70% and translate toward bottom-right by 50, without skewing - * canvas.viewportTransform = [0.7, 0, 0, 0.7, 50, 50]; - * @default - */ - viewportTransform: fabric.iMatrix.concat(), - - /** - * if set to false background image is not affected by viewport transform - * @since 1.6.3 - * @type Boolean - * @default - */ - backgroundVpt: true, - - /** - * if set to false overlya image is not affected by viewport transform - * @since 1.6.3 - * @type Boolean - * @default - */ - overlayVpt: true, - - /** - * When true, canvas is scaled by devicePixelRatio for better rendering on retina screens - * @type Boolean - * @default - */ - enableRetinaScaling: true, - - /** - * Describe canvas element extension over design - * properties are tl,tr,bl,br. - * if canvas is not zoomed/panned those points are the four corner of canvas - * if canvas is viewportTransformed you those points indicate the extension - * of canvas element in plain untrasformed coordinates - * The coordinates get updated with @method calcViewportBoundaries. - * @memberOf fabric.StaticCanvas.prototype - */ - vptCoords: { }, - - /** - * Based on vptCoords and object.aCoords, skip rendering of objects that - * are not included in current viewport. - * May greatly help in applications with crowded canvas and use of zoom/pan - * If One of the corner of the bounding box of the object is on the canvas - * the objects get rendered. - * @memberOf fabric.StaticCanvas.prototype - * @type Boolean - * @default - */ - skipOffscreen: true, - - /** - * a fabricObject that, without stroke define a clipping area with their shape. filled in black - * the clipPath object gets used when the canvas has rendered, and the context is placed in the - * top left corner of the canvas. - * clipPath will clip away controls, if you do not want this to happen use controlsAboveOverlay = true - * @type fabric.Object - */ - clipPath: undefined, - - /** - * @private - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - */ - _initStatic: function(el, options) { - var cb = this.requestRenderAllBound; - this._objects = []; - this._createLowerCanvas(el); - this._initOptions(options); - // only initialize retina scaling once - if (!this.interactive) { - this._initRetinaScaling(); - } - - if (options.overlayImage) { - this.setOverlayImage(options.overlayImage, cb); - } - if (options.backgroundImage) { - this.setBackgroundImage(options.backgroundImage, cb); - } - if (options.backgroundColor) { - this.setBackgroundColor(options.backgroundColor, cb); - } - if (options.overlayColor) { - this.setOverlayColor(options.overlayColor, cb); - } - this.calcOffset(); - }, - - /** - * @private - */ - _isRetinaScaling: function() { - return (fabric.devicePixelRatio > 1 && this.enableRetinaScaling); - }, - - /** - * @private - * @return {Number} retinaScaling if applied, otherwise 1; - */ - getRetinaScaling: function() { - return this._isRetinaScaling() ? Math.max(1, fabric.devicePixelRatio) : 1; - }, - - /** - * @private - */ - _initRetinaScaling: function() { - if (!this._isRetinaScaling()) { - return; - } - var scaleRatio = fabric.devicePixelRatio; - this.__initRetinaScaling(scaleRatio, this.lowerCanvasEl, this.contextContainer); - if (this.upperCanvasEl) { - this.__initRetinaScaling(scaleRatio, this.upperCanvasEl, this.contextTop); - } - }, - - __initRetinaScaling: function(scaleRatio, canvas, context) { - canvas.setAttribute('width', this.width * scaleRatio); - canvas.setAttribute('height', this.height * scaleRatio); - context.scale(scaleRatio, scaleRatio); - }, - - - /** - * Calculates canvas element offset relative to the document - * This method is also attached as "resize" event handler of window - * @return {fabric.Canvas} instance - * @chainable - */ - calcOffset: function () { - this._offset = getElementOffset(this.lowerCanvasEl); - return this; - }, - - /** - * Sets {@link fabric.StaticCanvas#overlayImage|overlay image} for this canvas - * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set overlay to - * @param {Function} callback callback to invoke when image is loaded and set as an overlay - * @param {Object} [options] Optional options to set for the {@link fabric.Image|overlay image}. - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/MnzHT/|jsFiddle demo} - * @example Normal overlayImage with left/top = 0 - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * // Needed to position overlayImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example overlayImage with different properties - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top' - * }); - * @example Stretched overlayImage #1 - width/height correspond to canvas width/height - * fabric.Image.fromURL('http://fabricjs.com/assets/jail_cell_bars.png', function(img, isError) { - * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); - * canvas.setOverlayImage(img, canvas.renderAll.bind(canvas)); - * }); - * @example Stretched overlayImage #2 - width/height correspond to canvas width/height - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * width: canvas.width, - * height: canvas.height, - * // Needed to position overlayImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example overlayImage loaded from cross-origin - * canvas.setOverlayImage('http://fabricjs.com/assets/jail_cell_bars.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top', - * crossOrigin: 'anonymous' - * }); - */ - setOverlayImage: function (image, callback, options) { - return this.__setBgOverlayImage('overlayImage', image, callback, options); - }, - - /** - * Sets {@link fabric.StaticCanvas#backgroundImage|background image} for this canvas - * @param {(fabric.Image|String)} image fabric.Image instance or URL of an image to set background to - * @param {Function} callback Callback to invoke when image is loaded and set as background - * @param {Object} [options] Optional options to set for the {@link fabric.Image|background image}. - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/djnr8o7a/28/|jsFiddle demo} - * @example Normal backgroundImage with left/top = 0 - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * // Needed to position backgroundImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example backgroundImage with different properties - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top' - * }); - * @example Stretched backgroundImage #1 - width/height correspond to canvas width/height - * fabric.Image.fromURL('http://fabricjs.com/assets/honey_im_subtle.png', function(img, isError) { - * img.set({width: canvas.width, height: canvas.height, originX: 'left', originY: 'top'}); - * canvas.setBackgroundImage(img, canvas.renderAll.bind(canvas)); - * }); - * @example Stretched backgroundImage #2 - width/height correspond to canvas width/height - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * width: canvas.width, - * height: canvas.height, - * // Needed to position backgroundImage at 0/0 - * originX: 'left', - * originY: 'top' - * }); - * @example backgroundImage loaded from cross-origin - * canvas.setBackgroundImage('http://fabricjs.com/assets/honey_im_subtle.png', canvas.renderAll.bind(canvas), { - * opacity: 0.5, - * angle: 45, - * left: 400, - * top: 400, - * originX: 'left', - * originY: 'top', - * crossOrigin: 'anonymous' - * }); - */ - // TODO: fix stretched examples - setBackgroundImage: function (image, callback, options) { - return this.__setBgOverlayImage('backgroundImage', image, callback, options); - }, - - /** - * Sets {@link fabric.StaticCanvas#overlayColor|foreground color} for this canvas - * @param {(String|fabric.Pattern)} overlayColor Color or pattern to set foreground color to - * @param {Function} callback Callback to invoke when foreground color is set - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/pB55h/|jsFiddle demo} - * @example Normal overlayColor - color value - * canvas.setOverlayColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as overlayColor - * canvas.setOverlayColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png' - * }, canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as overlayColor with repeat and offset - * canvas.setOverlayColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png', - * repeat: 'repeat', - * offsetX: 200, - * offsetY: 100 - * }, canvas.renderAll.bind(canvas)); - */ - setOverlayColor: function(overlayColor, callback) { - return this.__setBgOverlayColor('overlayColor', overlayColor, callback); - }, - - /** - * Sets {@link fabric.StaticCanvas#backgroundColor|background color} for this canvas - * @param {(String|fabric.Pattern)} backgroundColor Color or pattern to set background color to - * @param {Function} callback Callback to invoke when background color is set - * @return {fabric.Canvas} thisArg - * @chainable - * @see {@link http://jsfiddle.net/fabricjs/hXzvk/|jsFiddle demo} - * @example Normal backgroundColor - color value - * canvas.setBackgroundColor('rgba(255, 73, 64, 0.6)', canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as backgroundColor - * canvas.setBackgroundColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png' - * }, canvas.renderAll.bind(canvas)); - * @example fabric.Pattern used as backgroundColor with repeat and offset - * canvas.setBackgroundColor({ - * source: 'http://fabricjs.com/assets/escheresque_ste.png', - * repeat: 'repeat', - * offsetX: 200, - * offsetY: 100 - * }, canvas.renderAll.bind(canvas)); - */ - setBackgroundColor: function(backgroundColor, callback) { - return this.__setBgOverlayColor('backgroundColor', backgroundColor, callback); - }, - - /** - * @private - * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundImage|backgroundImage} - * or {@link fabric.StaticCanvas#overlayImage|overlayImage}) - * @param {(fabric.Image|String|null)} image fabric.Image instance, URL of an image or null to set background or overlay to - * @param {Function} callback Callback to invoke when image is loaded and set as background or overlay. The first argument is the created image, the second argument is a flag indicating whether an error occurred or not. - * @param {Object} [options] Optional options to set for the {@link fabric.Image|image}. - */ - __setBgOverlayImage: function(property, image, callback, options) { - if (typeof image === 'string') { - fabric.util.loadImage(image, function(img, isError) { - if (img) { - var instance = new fabric.Image(img, options); - this[property] = instance; - instance.canvas = this; - } - callback && callback(img, isError); - }, this, options && options.crossOrigin); - } - else { - options && image.setOptions(options); - this[property] = image; - image && (image.canvas = this); - callback && callback(image, false); - } - - return this; - }, - - /** - * @private - * @param {String} property Property to set ({@link fabric.StaticCanvas#backgroundColor|backgroundColor} - * or {@link fabric.StaticCanvas#overlayColor|overlayColor}) - * @param {(Object|String|null)} color Object with pattern information, color value or null - * @param {Function} [callback] Callback is invoked when color is set - */ - __setBgOverlayColor: function(property, color, callback) { - this[property] = color; - this._initGradient(color, property); - this._initPattern(color, property, callback); - return this; - }, - - /** - * @private - */ - _createCanvasElement: function() { - var element = createCanvasElement(); - if (!element) { - throw CANVAS_INIT_ERROR; - } - if (!element.style) { - element.style = { }; - } - if (typeof element.getContext === 'undefined') { - throw CANVAS_INIT_ERROR; - } - return element; - }, - - /** - * @private - * @param {Object} [options] Options object - */ - _initOptions: function (options) { - var lowerCanvasEl = this.lowerCanvasEl; - this._setOptions(options); - - this.width = this.width || parseInt(lowerCanvasEl.width, 10) || 0; - this.height = this.height || parseInt(lowerCanvasEl.height, 10) || 0; - - if (!this.lowerCanvasEl.style) { - return; - } - - lowerCanvasEl.width = this.width; - lowerCanvasEl.height = this.height; - - lowerCanvasEl.style.width = this.width + 'px'; - lowerCanvasEl.style.height = this.height + 'px'; - - this.viewportTransform = this.viewportTransform.slice(); - }, - - /** - * Creates a bottom canvas - * @private - * @param {HTMLElement} [canvasEl] - */ - _createLowerCanvas: function (canvasEl) { - // canvasEl === 'HTMLCanvasElement' does not work on jsdom/node - if (canvasEl && canvasEl.getContext) { - this.lowerCanvasEl = canvasEl; - } - else { - this.lowerCanvasEl = fabric.util.getById(canvasEl) || this._createCanvasElement(); - } - - fabric.util.addClass(this.lowerCanvasEl, 'lower-canvas'); - this._originalCanvasStyle = this.lowerCanvasEl.style; - if (this.interactive) { - this._applyCanvasStyle(this.lowerCanvasEl); - } - - this.contextContainer = this.lowerCanvasEl.getContext('2d'); - }, - - /** - * Returns canvas width (in px) - * @return {Number} - */ - getWidth: function () { - return this.width; - }, - - /** - * Returns canvas height (in px) - * @return {Number} - */ - getHeight: function () { - return this.height; - }, - - /** - * Sets width of this canvas instance - * @param {Number|String} value Value to set width to - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} instance - * @chainable true - */ - setWidth: function (value, options) { - return this.setDimensions({ width: value }, options); - }, - - /** - * Sets height of this canvas instance - * @param {Number|String} value Value to set height to - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} instance - * @chainable true - */ - setHeight: function (value, options) { - return this.setDimensions({ height: value }, options); - }, - - /** - * Sets dimensions (width, height) of this canvas instance. when options.cssOnly flag active you should also supply the unit of measure (px/%/em) - * @param {Object} dimensions Object with width/height properties - * @param {Number|String} [dimensions.width] Width of canvas element - * @param {Number|String} [dimensions.height] Height of canvas element - * @param {Object} [options] Options object - * @param {Boolean} [options.backstoreOnly=false] Set the given dimensions only as canvas backstore dimensions - * @param {Boolean} [options.cssOnly=false] Set the given dimensions only as css dimensions - * @return {fabric.Canvas} thisArg - * @chainable - */ - setDimensions: function (dimensions, options) { - var cssValue; - - options = options || {}; - - for (var prop in dimensions) { - cssValue = dimensions[prop]; - - if (!options.cssOnly) { - this._setBackstoreDimension(prop, dimensions[prop]); - cssValue += 'px'; - this.hasLostContext = true; - } - - if (!options.backstoreOnly) { - this._setCssDimension(prop, cssValue); - } - } - if (this._isCurrentlyDrawing) { - this.freeDrawingBrush && this.freeDrawingBrush._setBrushStyles(this.contextTop); - } - this._initRetinaScaling(); - this.calcOffset(); - - if (!options.cssOnly) { - this.requestRenderAll(); - } - - return this; - }, - - /** - * Helper for setting width/height - * @private - * @param {String} prop property (width|height) - * @param {Number} value value to set property to - * @return {fabric.Canvas} instance - * @chainable true - */ - _setBackstoreDimension: function (prop, value) { - this.lowerCanvasEl[prop] = value; - - if (this.upperCanvasEl) { - this.upperCanvasEl[prop] = value; - } - - if (this.cacheCanvasEl) { - this.cacheCanvasEl[prop] = value; - } - - this[prop] = value; - - return this; - }, - - /** - * Helper for setting css width/height - * @private - * @param {String} prop property (width|height) - * @param {String} value value to set property to - * @return {fabric.Canvas} instance - * @chainable true - */ - _setCssDimension: function (prop, value) { - this.lowerCanvasEl.style[prop] = value; - - if (this.upperCanvasEl) { - this.upperCanvasEl.style[prop] = value; - } - - if (this.wrapperEl) { - this.wrapperEl.style[prop] = value; - } - - return this; - }, - - /** - * Returns canvas zoom level - * @return {Number} - */ - getZoom: function () { - return this.viewportTransform[0]; - }, - - /** - * Sets viewport transformation of this canvas instance - * @param {Array} vpt a Canvas 2D API transform matrix - * @return {fabric.Canvas} instance - * @chainable true - */ - setViewportTransform: function (vpt) { - var activeObject = this._activeObject, - backgroundObject = this.backgroundImage, - overlayObject = this.overlayImage, - object, i, len; - this.viewportTransform = vpt; - for (i = 0, len = this._objects.length; i < len; i++) { - object = this._objects[i]; - object.group || object.setCoords(true); - } - if (activeObject) { - activeObject.setCoords(); - } - if (backgroundObject) { - backgroundObject.setCoords(true); - } - if (overlayObject) { - overlayObject.setCoords(true); - } - this.calcViewportBoundaries(); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Sets zoom level of this canvas instance, the zoom centered around point - * meaning that following zoom to point with the same point will have the visual - * effect of the zoom originating from that point. The point won't move. - * It has nothing to do with canvas center or visual center of the viewport. - * @param {fabric.Point} point to zoom with respect to - * @param {Number} value to set zoom to, less than 1 zooms out - * @return {fabric.Canvas} instance - * @chainable true - */ - zoomToPoint: function (point, value) { - // TODO: just change the scale, preserve other transformations - var before = point, vpt = this.viewportTransform.slice(0); - point = transformPoint(point, invertTransform(this.viewportTransform)); - vpt[0] = value; - vpt[3] = value; - var after = transformPoint(point, vpt); - vpt[4] += before.x - after.x; - vpt[5] += before.y - after.y; - return this.setViewportTransform(vpt); - }, - - /** - * Sets zoom level of this canvas instance - * @param {Number} value to set zoom to, less than 1 zooms out - * @return {fabric.Canvas} instance - * @chainable true - */ - setZoom: function (value) { - this.zoomToPoint(new fabric.Point(0, 0), value); - return this; - }, - - /** - * Pan viewport so as to place point at top left corner of canvas - * @param {fabric.Point} point to move to - * @return {fabric.Canvas} instance - * @chainable true - */ - absolutePan: function (point) { - var vpt = this.viewportTransform.slice(0); - vpt[4] = -point.x; - vpt[5] = -point.y; - return this.setViewportTransform(vpt); - }, - - /** - * Pans viewpoint relatively - * @param {fabric.Point} point (position vector) to move by - * @return {fabric.Canvas} instance - * @chainable true - */ - relativePan: function (point) { - return this.absolutePan(new fabric.Point( - -point.x - this.viewportTransform[4], - -point.y - this.viewportTransform[5] - )); - }, - - /** - * Returns <canvas> element corresponding to this instance - * @return {HTMLCanvasElement} - */ - getElement: function () { - return this.lowerCanvasEl; - }, - - /** - * @private - * @param {fabric.Object} obj Object that was added - */ - _onObjectAdded: function(obj) { - this.stateful && obj.setupState(); - obj._set('canvas', this); - obj.setCoords(); - this.fire('object:added', { target: obj }); - obj.fire('added'); - }, - - /** - * @private - * @param {fabric.Object} obj Object that was removed - */ - _onObjectRemoved: function(obj) { - this.fire('object:removed', { target: obj }); - obj.fire('removed'); - delete obj.canvas; - }, - - /** - * Clears specified context of canvas element - * @param {CanvasRenderingContext2D} ctx Context to clear - * @return {fabric.Canvas} thisArg - * @chainable - */ - clearContext: function(ctx) { - ctx.clearRect(0, 0, this.width, this.height); - return this; - }, - - /** - * Returns context of canvas where objects are drawn - * @return {CanvasRenderingContext2D} - */ - getContext: function () { - return this.contextContainer; - }, - - /** - * Clears all contexts (background, main, top) of an instance - * @return {fabric.Canvas} thisArg - * @chainable - */ - clear: function () { - this.remove.apply(this, this.getObjects()); - this.backgroundImage = null; - this.overlayImage = null; - this.backgroundColor = ''; - this.overlayColor = ''; - if (this._hasITextHandlers) { - this.off('mouse:up', this._mouseUpITextHandler); - this._iTextInstances = null; - this._hasITextHandlers = false; - } - this.clearContext(this.contextContainer); - this.fire('canvas:cleared'); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Renders the canvas - * @return {fabric.Canvas} instance - * @chainable - */ - renderAll: function () { - var canvasToDrawOn = this.contextContainer; - this.renderCanvas(canvasToDrawOn, this._objects); - return this; - }, - - /** - * Function created to be instance bound at initialization - * used in requestAnimationFrame rendering - * Let the fabricJS call it. If you call it manually you could have more - * animationFrame stacking on to of each other - * for an imperative rendering, use canvas.renderAll - * @private - * @return {fabric.Canvas} instance - * @chainable - */ - renderAndReset: function() { - this.isRendering = 0; - this.renderAll(); - }, - - /** - * Append a renderAll request to next animation frame. - * unless one is already in progress, in that case nothing is done - * a boolean flag will avoid appending more. - * @return {fabric.Canvas} instance - * @chainable - */ - requestRenderAll: function () { - if (!this.isRendering) { - this.isRendering = fabric.util.requestAnimFrame(this.renderAndResetBound); - } - return this; - }, - - /** - * Calculate the position of the 4 corner of canvas with current viewportTransform. - * helps to determinate when an object is in the current rendering viewport using - * object absolute coordinates ( aCoords ) - * @return {Object} points.tl - * @chainable - */ - calcViewportBoundaries: function() { - var points = { }, width = this.width, height = this.height, - iVpt = invertTransform(this.viewportTransform); - points.tl = transformPoint({ x: 0, y: 0 }, iVpt); - points.br = transformPoint({ x: width, y: height }, iVpt); - points.tr = new fabric.Point(points.br.x, points.tl.y); - points.bl = new fabric.Point(points.tl.x, points.br.y); - this.vptCoords = points; - return points; - }, - - cancelRequestedRender: function() { - if (this.isRendering) { - fabric.util.cancelAnimFrame(this.isRendering); - this.isRendering = 0; - } - }, - - /** - * Renders background, objects, overlay and controls. - * @param {CanvasRenderingContext2D} ctx - * @param {Array} objects to render - * @return {fabric.Canvas} instance - * @chainable - */ - renderCanvas: function(ctx, objects) { - var v = this.viewportTransform, path = this.clipPath; - this.cancelRequestedRender(); - this.calcViewportBoundaries(); - this.clearContext(ctx); - fabric.util.setImageSmoothing(ctx, this.imageSmoothingEnabled); - this.fire('before:render', { ctx: ctx, }); - this._renderBackground(ctx); - - ctx.save(); - //apply viewport transform once for all rendering process - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - this._renderObjects(ctx, objects); - ctx.restore(); - if (!this.controlsAboveOverlay && this.interactive) { - this.drawControls(ctx); - } - if (path) { - path.canvas = this; - // needed to setup a couple of variables - path.shouldCache(); - path._transformDone = true; - path.renderCache({ forClipping: true }); - this.drawClipPathOnCanvas(ctx); - } - this._renderOverlay(ctx); - if (this.controlsAboveOverlay && this.interactive) { - this.drawControls(ctx); - } - this.fire('after:render', { ctx: ctx, }); - }, - - /** - * Paint the cached clipPath on the lowerCanvasEl - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawClipPathOnCanvas: function(ctx) { - var v = this.viewportTransform, path = this.clipPath; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - // DEBUG: uncomment this line, comment the following - // ctx.globalAlpha = 0.4; - ctx.globalCompositeOperation = 'destination-in'; - path.transform(ctx); - ctx.scale(1 / path.zoomX, 1 / path.zoomY); - ctx.drawImage(path._cacheCanvas, -path.cacheTranslationX, -path.cacheTranslationY); - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Array} objects to render - */ - _renderObjects: function(ctx, objects) { - var i, len; - for (i = 0, len = objects.length; i < len; ++i) { - objects[i] && objects[i].render(ctx); - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {string} property 'background' or 'overlay' - */ - _renderBackgroundOrOverlay: function(ctx, property) { - var fill = this[property + 'Color'], object = this[property + 'Image'], - v = this.viewportTransform, needsVpt = this[property + 'Vpt']; - if (!fill && !object) { - return; - } - if (fill) { - ctx.save(); - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(this.width, 0); - ctx.lineTo(this.width, this.height); - ctx.lineTo(0, this.height); - ctx.closePath(); - ctx.fillStyle = fill.toLive - ? fill.toLive(ctx, this) - : fill; - if (needsVpt) { - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - } - ctx.transform(1, 0, 0, 1, fill.offsetX || 0, fill.offsetY || 0); - var m = fill.gradientTransform || fill.patternTransform; - m && ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - ctx.fill(); - ctx.restore(); - } - if (object) { - ctx.save(); - if (needsVpt) { - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - } - object.render(ctx); - ctx.restore(); - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderBackground: function(ctx) { - this._renderBackgroundOrOverlay(ctx, 'background'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderOverlay: function(ctx) { - this._renderBackgroundOrOverlay(ctx, 'overlay'); - }, - - /** - * Returns coordinates of a center of canvas. - * Returned value is an object with top and left properties - * @return {Object} object with "top" and "left" number values - * @deprecated migrate to `getCenterPoint` - */ - getCenter: function () { - return { - top: this.height / 2, - left: this.width / 2 - }; - }, - - /** - * Returns coordinates of a center of canvas. - * @return {fabric.Point} - */ - getCenterPoint: function () { - return new fabric.Point(this.width / 2, this.height / 2); - }, - - /** - * Centers object horizontally in the canvas - * @param {fabric.Object} object Object to center horizontally - * @return {fabric.Canvas} thisArg - */ - centerObjectH: function (object) { - return this._centerObject(object, new fabric.Point(this.getCenterPoint().x, object.getCenterPoint().y)); - }, - - /** - * Centers object vertically in the canvas - * @param {fabric.Object} object Object to center vertically - * @return {fabric.Canvas} thisArg - * @chainable - */ - centerObjectV: function (object) { - return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, this.getCenterPoint().y)); - }, - - /** - * Centers object vertically and horizontally in the canvas - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - centerObject: function(object) { - var center = this.getCenterPoint(); - return this._centerObject(object, center); - }, - - /** - * Centers object vertically and horizontally in the viewport - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObject: function(object) { - var vpCenter = this.getVpCenter(); - return this._centerObject(object, vpCenter); - }, - - /** - * Centers object horizontally in the viewport, object.top is unchanged - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObjectH: function(object) { - var vpCenter = this.getVpCenter(); - this._centerObject(object, new fabric.Point(vpCenter.x, object.getCenterPoint().y)); - return this; - }, - - /** - * Centers object Vertically in the viewport, object.top is unchanged - * @param {fabric.Object} object Object to center vertically and horizontally - * @return {fabric.Canvas} thisArg - * @chainable - */ - viewportCenterObjectV: function(object) { - var vpCenter = this.getVpCenter(); - - return this._centerObject(object, new fabric.Point(object.getCenterPoint().x, vpCenter.y)); - }, - - /** - * Calculate the point in canvas that correspond to the center of actual viewport. - * @return {fabric.Point} vpCenter, viewport center - * @chainable - */ - getVpCenter: function() { - var center = this.getCenterPoint(), - iVpt = invertTransform(this.viewportTransform); - return transformPoint(center, iVpt); - }, - - /** - * @private - * @param {fabric.Object} object Object to center - * @param {fabric.Point} center Center point - * @return {fabric.Canvas} thisArg - * @chainable - */ - _centerObject: function(object, center) { - object.setPositionByOrigin(center, 'center', 'center'); - object.setCoords(); - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Returns dataless JSON representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {String} json string - */ - toDatalessJSON: function (propertiesToInclude) { - return this.toDatalessObject(propertiesToInclude); - }, - - /** - * Returns object representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function (propertiesToInclude) { - return this._toObjectMethod('toObject', propertiesToInclude); - }, - - /** - * Returns dataless object representation of canvas - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function (propertiesToInclude) { - return this._toObjectMethod('toDatalessObject', propertiesToInclude); - }, - - /** - * @private - */ - _toObjectMethod: function (methodName, propertiesToInclude) { - - var clipPath = this.clipPath, data = { - version: fabric.version, - objects: this._toObjects(methodName, propertiesToInclude), - }; - if (clipPath && !clipPath.excludeFromExport) { - data.clipPath = this._toObject(this.clipPath, methodName, propertiesToInclude); - } - extend(data, this.__serializeBgOverlay(methodName, propertiesToInclude)); - - fabric.util.populateWithProperties(this, data, propertiesToInclude); - - return data; - }, - - /** - * @private - */ - _toObjects: function(methodName, propertiesToInclude) { - return this._objects.filter(function(object) { - return !object.excludeFromExport; - }).map(function(instance) { - return this._toObject(instance, methodName, propertiesToInclude); - }, this); - }, - - /** - * @private - */ - _toObject: function(instance, methodName, propertiesToInclude) { - var originalValue; - - if (!this.includeDefaultValues) { - originalValue = instance.includeDefaultValues; - instance.includeDefaultValues = false; - } - - var object = instance[methodName](propertiesToInclude); - if (!this.includeDefaultValues) { - instance.includeDefaultValues = originalValue; - } - return object; - }, - - /** - * @private - */ - __serializeBgOverlay: function(methodName, propertiesToInclude) { - var data = {}, bgImage = this.backgroundImage, overlayImage = this.overlayImage, - bgColor = this.backgroundColor, overlayColor = this.overlayColor; - - if (bgColor && bgColor.toObject) { - if (!bgColor.excludeFromExport) { - data.background = bgColor.toObject(propertiesToInclude); - } - } - else if (bgColor) { - data.background = bgColor; - } - - if (overlayColor && overlayColor.toObject) { - if (!overlayColor.excludeFromExport) { - data.overlay = overlayColor.toObject(propertiesToInclude); - } - } - else if (overlayColor) { - data.overlay = overlayColor; - } - - if (bgImage && !bgImage.excludeFromExport) { - data.backgroundImage = this._toObject(bgImage, methodName, propertiesToInclude); - } - if (overlayImage && !overlayImage.excludeFromExport) { - data.overlayImage = this._toObject(overlayImage, methodName, propertiesToInclude); - } - - return data; - }, - - /* _TO_SVG_START_ */ - /** - * When true, getSvgTransform() will apply the StaticCanvas.viewportTransform to the SVG transformation. When true, - * a zoomed canvas will then produce zoomed SVG output. - * @type Boolean - * @default - */ - svgViewportTransformation: true, - - /** - * Returns SVG representation of canvas - * @function - * @param {Object} [options] Options object for SVG output - * @param {Boolean} [options.suppressPreamble=false] If true xml tag is not included - * @param {Object} [options.viewBox] SVG viewbox object - * @param {Number} [options.viewBox.x] x-coordinate of viewbox - * @param {Number} [options.viewBox.y] y-coordinate of viewbox - * @param {Number} [options.viewBox.width] Width of viewbox - * @param {Number} [options.viewBox.height] Height of viewbox - * @param {String} [options.encoding=UTF-8] Encoding of SVG output - * @param {String} [options.width] desired width of svg with or without units - * @param {String} [options.height] desired height of svg with or without units - * @param {Function} [reviver] Method for further parsing of svg elements, called after each fabric object converted into svg representation. - * @return {String} SVG string - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} - * @see {@link http://jsfiddle.net/fabricjs/jQ3ZZ/|jsFiddle demo} - * @example Normal SVG output - * var svg = canvas.toSVG(); - * @example SVG output without preamble (without <?xml ../>) - * var svg = canvas.toSVG({suppressPreamble: true}); - * @example SVG output with viewBox attribute - * var svg = canvas.toSVG({ - * viewBox: { - * x: 100, - * y: 100, - * width: 200, - * height: 300 - * } - * }); - * @example SVG output with different encoding (default: UTF-8) - * var svg = canvas.toSVG({encoding: 'ISO-8859-1'}); - * @example Modify SVG output with reviver function - * var svg = canvas.toSVG(null, function(svg) { - * return svg.replace('stroke-dasharray: ; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; ', ''); - * }); - */ - toSVG: function(options, reviver) { - options || (options = { }); - options.reviver = reviver; - var markup = []; - - this._setSVGPreamble(markup, options); - this._setSVGHeader(markup, options); - if (this.clipPath) { - markup.push('\n'); - } - this._setSVGBgOverlayColor(markup, 'background'); - this._setSVGBgOverlayImage(markup, 'backgroundImage', reviver); - this._setSVGObjects(markup, reviver); - if (this.clipPath) { - markup.push('\n'); - } - this._setSVGBgOverlayColor(markup, 'overlay'); - this._setSVGBgOverlayImage(markup, 'overlayImage', reviver); - - markup.push(''); - - return markup.join(''); - }, - - /** - * @private - */ - _setSVGPreamble: function(markup, options) { - if (options.suppressPreamble) { - return; - } - markup.push( - '\n', - '\n' - ); - }, - - /** - * @private - */ - _setSVGHeader: function(markup, options) { - var width = options.width || this.width, - height = options.height || this.height, - vpt, viewBox = 'viewBox="0 0 ' + this.width + ' ' + this.height + '" ', - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - - if (options.viewBox) { - viewBox = 'viewBox="' + - options.viewBox.x + ' ' + - options.viewBox.y + ' ' + - options.viewBox.width + ' ' + - options.viewBox.height + '" '; - } - else { - if (this.svgViewportTransformation) { - vpt = this.viewportTransform; - viewBox = 'viewBox="' + - toFixed(-vpt[4] / vpt[0], NUM_FRACTION_DIGITS) + ' ' + - toFixed(-vpt[5] / vpt[3], NUM_FRACTION_DIGITS) + ' ' + - toFixed(this.width / vpt[0], NUM_FRACTION_DIGITS) + ' ' + - toFixed(this.height / vpt[3], NUM_FRACTION_DIGITS) + '" '; - } - } - - markup.push( - '\n', - 'Created with Fabric.js ', fabric.version, '\n', - '\n', - this.createSVGFontFacesMarkup(), - this.createSVGRefElementsMarkup(), - this.createSVGClipPathMarkup(options), - '\n' - ); - }, - - createSVGClipPathMarkup: function(options) { - var clipPath = this.clipPath; - if (clipPath) { - clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; - return '\n' + - this.clipPath.toClipPathSVG(options.reviver) + - '\n'; - } - return ''; - }, - - /** - * Creates markup containing SVG referenced elements like patterns, gradients etc. - * @return {String} - */ - createSVGRefElementsMarkup: function() { - var _this = this, - markup = ['background', 'overlay'].map(function(prop) { - var fill = _this[prop + 'Color']; - if (fill && fill.toLive) { - var shouldTransform = _this[prop + 'Vpt'], vpt = _this.viewportTransform, - object = { - width: _this.width / (shouldTransform ? vpt[0] : 1), - height: _this.height / (shouldTransform ? vpt[3] : 1) - }; - return fill.toSVG( - object, - { additionalTransform: shouldTransform ? fabric.util.matrixToSVG(vpt) : '' } - ); - } - }); - return markup.join(''); - }, - - /** - * Creates markup containing SVG font faces, - * font URLs for font faces must be collected by developers - * and are not extracted from the DOM by fabricjs - * @param {Array} objects Array of fabric objects - * @return {String} - */ - createSVGFontFacesMarkup: function() { - var markup = '', fontList = { }, obj, fontFamily, - style, row, rowIndex, _char, charIndex, i, len, - fontPaths = fabric.fontPaths, objects = []; - - this._objects.forEach(function add(object) { - objects.push(object); - if (object._objects) { - object._objects.forEach(add); - } - }); - - for (i = 0, len = objects.length; i < len; i++) { - obj = objects[i]; - fontFamily = obj.fontFamily; - if (obj.type.indexOf('text') === -1 || fontList[fontFamily] || !fontPaths[fontFamily]) { - continue; - } - fontList[fontFamily] = true; - if (!obj.styles) { - continue; - } - style = obj.styles; - for (rowIndex in style) { - row = style[rowIndex]; - for (charIndex in row) { - _char = row[charIndex]; - fontFamily = _char.fontFamily; - if (!fontList[fontFamily] && fontPaths[fontFamily]) { - fontList[fontFamily] = true; - } - } - } - } - - for (var j in fontList) { - markup += [ - '\t\t@font-face {\n', - '\t\t\tfont-family: \'', j, '\';\n', - '\t\t\tsrc: url(\'', fontPaths[j], '\');\n', - '\t\t}\n' - ].join(''); - } - - if (markup) { - markup = [ - '\t\n' - ].join(''); - } - - return markup; - }, - - /** - * @private - */ - _setSVGObjects: function(markup, reviver) { - var instance, i, len, objects = this._objects; - for (i = 0, len = objects.length; i < len; i++) { - instance = objects[i]; - if (instance.excludeFromExport) { - continue; - } - this._setSVGObject(markup, instance, reviver); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - markup.push(instance.toSVG(reviver)); - }, - - /** - * @private - */ - _setSVGBgOverlayImage: function(markup, property, reviver) { - if (this[property] && !this[property].excludeFromExport && this[property].toSVG) { - markup.push(this[property].toSVG(reviver)); - } - }, - - /** - * @private - */ - _setSVGBgOverlayColor: function(markup, property) { - var filler = this[property + 'Color'], vpt = this.viewportTransform, finalWidth = this.width, - finalHeight = this.height; - if (!filler) { - return; - } - if (filler.toLive) { - var repeat = filler.repeat, iVpt = fabric.util.invertTransform(vpt), shouldInvert = this[property + 'Vpt'], - additionalTransform = shouldInvert ? fabric.util.matrixToSVG(iVpt) : ''; - markup.push( - '\n' - ); - } - else { - markup.push( - '\n' - ); - } - }, - /* _TO_SVG_END_ */ - - /** - * Moves an object or the objects of a multiple selection - * to the bottom of the stack of drawn objects - * @param {fabric.Object} object Object to send to back - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendToBack: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.unshift(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.unshift(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or the objects of a multiple selection - * to the top of the stack of drawn objects - * @param {fabric.Object} object Object to send - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringToFront: function (object) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, objs; - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - removeFromArray(this._objects, obj); - this._objects.push(obj); - } - } - else { - removeFromArray(this._objects, object); - this._objects.push(object); - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * Moves an object or a selection down in stack of drawn objects - * An optional parameter, intersecting allows to move the object in behind - * the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - sendBackwards: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = 0; i < objs.length; i++) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx > 0 + objsMoved) { - newIdx = idx - 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== 0) { - // if object is not on the bottom of stack - newIdx = this._findNewLowerIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewLowerIndex: function(object, idx, intersecting) { - var newIdx, i; - - if (intersecting) { - newIdx = idx; - - // traverse down the stack looking for the nearest intersecting object - for (i = idx - 1; i >= 0; --i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx - 1; - } - - return newIdx; - }, - - /** - * Moves an object or a selection up in stack of drawn objects - * An optional parameter, intersecting allows to move the object in front - * of the first intersecting object. Where intersection is calculated with - * bounding box. If no intersection is found, there will not be change in the - * stack. - * @param {fabric.Object} object Object to send - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Canvas} thisArg - * @chainable - */ - bringForward: function (object, intersecting) { - if (!object) { - return this; - } - var activeSelection = this._activeObject, - i, obj, idx, newIdx, objs, objsMoved = 0; - - if (object === activeSelection && object.type === 'activeSelection') { - objs = activeSelection._objects; - for (i = objs.length; i--;) { - obj = objs[i]; - idx = this._objects.indexOf(obj); - if (idx < this._objects.length - 1 - objsMoved) { - newIdx = idx + 1; - removeFromArray(this._objects, obj); - this._objects.splice(newIdx, 0, obj); - } - objsMoved++; - } - } - else { - idx = this._objects.indexOf(object); - if (idx !== this._objects.length - 1) { - // if object is not on top of stack (last item in an array) - newIdx = this._findNewUpperIndex(object, idx, intersecting); - removeFromArray(this._objects, object); - this._objects.splice(newIdx, 0, object); - } - } - this.renderOnAddRemove && this.requestRenderAll(); - return this; - }, - - /** - * @private - */ - _findNewUpperIndex: function(object, idx, intersecting) { - var newIdx, i, len; - - if (intersecting) { - newIdx = idx; - - // traverse up the stack looking for the nearest intersecting object - for (i = idx + 1, len = this._objects.length; i < len; ++i) { - - var isIntersecting = object.intersectsWithObject(this._objects[i]) || - object.isContainedWithinObject(this._objects[i]) || - this._objects[i].isContainedWithinObject(object); - - if (isIntersecting) { - newIdx = i; - break; - } - } - } - else { - newIdx = idx + 1; - } - - return newIdx; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {fabric.Object} object Object to send - * @param {Number} index Position to move to - * @return {fabric.Canvas} thisArg - * @chainable - */ - moveTo: function (object, index) { - removeFromArray(this._objects, object); - this._objects.splice(index, 0, object); - return this.renderOnAddRemove && this.requestRenderAll(); - }, - - /** - * Clears a canvas element and dispose objects - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - // cancel eventually ongoing renders - if (this.isRendering) { - fabric.util.cancelAnimFrame(this.isRendering); - this.isRendering = 0; - } - this.forEachObject(function(object) { - object.dispose && object.dispose(); - }); - this._objects = []; - if (this.backgroundImage && this.backgroundImage.dispose) { - this.backgroundImage.dispose(); - } - this.backgroundImage = null; - if (this.overlayImage && this.overlayImage.dispose) { - this.overlayImage.dispose(); - } - this.overlayImage = null; - this._iTextInstances = null; - this.contextContainer = null; - // restore canvas style - this.lowerCanvasEl.classList.remove('lower-canvas'); - fabric.util.setStyle(this.lowerCanvasEl, this._originalCanvasStyle); - delete this._originalCanvasStyle; - // restore canvas size to original size in case retina scaling was applied - this.lowerCanvasEl.setAttribute('width', this.width); - this.lowerCanvasEl.setAttribute('height', this.height); - fabric.util.cleanUpJsdomNode(this.lowerCanvasEl); - this.lowerCanvasEl = undefined; - return this; - }, - - /** - * Returns a string representation of an instance - * @return {String} string representation of an instance - */ - toString: function () { - return '#'; - } - }); - - extend(fabric.StaticCanvas.prototype, fabric.Observable); - extend(fabric.StaticCanvas.prototype, fabric.Collection); - extend(fabric.StaticCanvas.prototype, fabric.DataURLExporter); - - extend(fabric.StaticCanvas, /** @lends fabric.StaticCanvas */ { - - /** - * @static - * @type String - * @default - */ - EMPTY_JSON: '{"objects": [], "background": "white"}', - - /** - * Provides a way to check support of some of the canvas methods - * (either those of HTMLCanvasElement itself, or rendering context) - * - * @param {String} methodName Method to check support for; - * Could be one of "setLineDash" - * @return {Boolean | null} `true` if method is supported (or at least exists), - * `null` if canvas element or context can not be initialized - */ - supports: function (methodName) { - var el = createCanvasElement(); - - if (!el || !el.getContext) { - return null; - } - - var ctx = el.getContext('2d'); - if (!ctx) { - return null; - } - - switch (methodName) { - - case 'setLineDash': - return typeof ctx.setLineDash !== 'undefined'; - - default: - return null; - } - } - }); - - /** - * Returns Object representation of canvas - * this alias is provided because if you call JSON.stringify on an instance, - * the toJSON object will be invoked if it exists. - * Having a toJSON method means you can do JSON.stringify(myCanvas) - * @function - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON compatible object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#serialization} - * @see {@link http://jsfiddle.net/fabricjs/pec86/|jsFiddle demo} - * @example JSON without additional properties - * var json = canvas.toJSON(); - * @example JSON with additional properties included - * var json = canvas.toJSON(['lockMovementX', 'lockMovementY', 'lockRotation', 'lockScalingX', 'lockScalingY']); - * @example JSON without default values - * canvas.includeDefaultValues = false; - * var json = canvas.toJSON(); - */ - fabric.StaticCanvas.prototype.toJSON = fabric.StaticCanvas.prototype.toObject; - - if (fabric.isLikelyNode) { - fabric.StaticCanvas.prototype.createPNGStream = function() { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createPNGStream(); - }; - fabric.StaticCanvas.prototype.createJPEGStream = function(opts) { - var impl = getNodeCanvas(this.lowerCanvasEl); - return impl && impl.createJPEGStream(opts); - }; - } -})(); - - -/** - * BaseBrush class - * @class fabric.BaseBrush - * @see {@link http://fabricjs.com/freedrawing|Freedrawing demo} - */ -fabric.BaseBrush = fabric.util.createClass(/** @lends fabric.BaseBrush.prototype */ { - - /** - * Color of a brush - * @type String - * @default - */ - color: 'rgb(0, 0, 0)', - - /** - * Width of a brush, has to be a Number, no string literals - * @type Number - * @default - */ - width: 1, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property replaces "shadowColor" (String), "shadowOffsetX" (Number), - * "shadowOffsetY" (Number) and "shadowBlur" (Number) since v1.2.12 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Line endings style of a brush (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'round', - - /** - * Corner style of a brush (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'round', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of a brush's - * @type Number - * @default - */ - strokeMiterLimit: 10, - - /** - * Stroke Dash Array. - * @type Array - * @default - */ - strokeDashArray: null, - - /** - * When `true`, the free drawing is limited to the whiteboard size. Default to false. - * @type Boolean - * @default false - */ - - limitedToCanvasSize: false, - - - /** - * Sets brush styles - * @private - * @param {CanvasRenderingContext2D} ctx - */ - _setBrushStyles: function (ctx) { - ctx.strokeStyle = this.color; - ctx.lineWidth = this.width; - ctx.lineCap = this.strokeLineCap; - ctx.miterLimit = this.strokeMiterLimit; - ctx.lineJoin = this.strokeLineJoin; - ctx.setLineDash(this.strokeDashArray || []); - }, - - /** - * Sets the transformation on given context - * @param {RenderingContext2d} ctx context to render on - * @private - */ - _saveAndTransform: function(ctx) { - var v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - }, - - /** - * Sets brush shadow styles - * @private - */ - _setShadow: function() { - if (!this.shadow) { - return; - } - - var canvas = this.canvas, - shadow = this.shadow, - ctx = canvas.contextTop, - zoom = canvas.getZoom(); - if (canvas && canvas._isRetinaScaling()) { - zoom *= fabric.devicePixelRatio; - } - - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * zoom; - ctx.shadowOffsetX = shadow.offsetX * zoom; - ctx.shadowOffsetY = shadow.offsetY * zoom; - }, - - needsFullRender: function() { - var color = new fabric.Color(this.color); - return color.getAlpha() < 1 || !!this.shadow; - }, - - /** - * Removes brush shadow styles - * @private - */ - _resetShadow: function() { - var ctx = this.canvas.contextTop; - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * Check is pointer is outside canvas boundaries - * @param {Object} pointer - * @private - */ - _isOutSideCanvas: function(pointer) { - return pointer.x < 0 || pointer.x > this.canvas.getWidth() || pointer.y < 0 || pointer.y > this.canvas.getHeight(); - } -}); - - -(function() { - /** - * PencilBrush class - * @class fabric.PencilBrush - * @extends fabric.BaseBrush - */ - fabric.PencilBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.PencilBrush.prototype */ { - - /** - * Discard points that are less than `decimate` pixel distant from each other - * @type Number - * @default 0.4 - */ - decimate: 0.4, - - /** - * Draws a straight line between last recorded point to current pointer - * Used for `shift` functionality - * - * @type boolean - * @default false - */ - drawStraightLine: false, - - /** - * The event modifier key that makes the brush draw a straight line. - * If `null` or 'none' or any other string that is not a modifier key the feature is disabled. - * @type {'altKey' | 'shiftKey' | 'ctrlKey' | 'none' | undefined | null} - */ - straightLineKey: 'shiftKey', - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.PencilBrush} Instance of a pencil brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this._points = []; - }, - - needsFullRender: function () { - return this.callSuper('needsFullRender') || this._hasStraightLine; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - _drawSegment: function (ctx, p1, p2) { - var midPoint = p1.midPointFrom(p2); - ctx.quadraticCurveTo(p1.x, p1.y, midPoint.x, midPoint.y); - return midPoint; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - this.drawStraightLine = options.e[this.straightLineKey]; - this._prepareForDrawing(pointer); - // capture coordinates immediately - // this allows to draw dots (when movement never occurs) - this._captureDrawingPath(pointer); - this._render(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer, options) { - if (!this.canvas._isMainEvent(options.e)) { - return; - } - this.drawStraightLine = options.e[this.straightLineKey]; - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this._captureDrawingPath(pointer) && this._points.length > 1) { - if (this.needsFullRender()) { - // redraw curve - // clear top canvas - this.canvas.clearContext(this.canvas.contextTop); - this._render(); - } - else { - var points = this._points, length = points.length, ctx = this.canvas.contextTop; - // draw the curve update - this._saveAndTransform(ctx); - if (this.oldEnd) { - ctx.beginPath(); - ctx.moveTo(this.oldEnd.x, this.oldEnd.y); - } - this.oldEnd = this._drawSegment(ctx, points[length - 2], points[length - 1], true); - ctx.stroke(); - ctx.restore(); - } - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function(options) { - if (!this.canvas._isMainEvent(options.e)) { - return true; - } - this.drawStraightLine = false; - this.oldEnd = undefined; - this._finalizeAndAddPath(); - return false; - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _prepareForDrawing: function(pointer) { - - var p = new fabric.Point(pointer.x, pointer.y); - - this._reset(); - this._addPoint(p); - this.canvas.contextTop.moveTo(p.x, p.y); - }, - - /** - * @private - * @param {fabric.Point} point Point to be added to points array - */ - _addPoint: function(point) { - if (this._points.length > 1 && point.eq(this._points[this._points.length - 1])) { - return false; - } - if (this.drawStraightLine && this._points.length > 1) { - this._hasStraightLine = true; - this._points.pop(); - } - this._points.push(point); - return true; - }, - - /** - * Clear points array and set contextTop canvas style. - * @private - */ - _reset: function() { - this._points = []; - this._setBrushStyles(this.canvas.contextTop); - this._setShadow(); - this._hasStraightLine = false; - }, - - /** - * @private - * @param {Object} pointer Actual mouse position related to the canvas. - */ - _captureDrawingPath: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y); - return this._addPoint(pointerPoint); - }, - - /** - * Draw a smooth path on the topCanvas using quadraticCurveTo - * @private - * @param {CanvasRenderingContext2D} [ctx] - */ - _render: function(ctx) { - var i, len, - p1 = this._points[0], - p2 = this._points[1]; - ctx = ctx || this.canvas.contextTop; - this._saveAndTransform(ctx); - ctx.beginPath(); - //if we only have 2 points in the path and they are the same - //it means that the user only clicked the canvas without moving the mouse - //then we should be drawing a dot. A path isn't drawn between two identical dots - //that's why we set them apart a bit - if (this._points.length === 2 && p1.x === p2.x && p1.y === p2.y) { - var width = this.width / 1000; - p1 = new fabric.Point(p1.x, p1.y); - p2 = new fabric.Point(p2.x, p2.y); - p1.x -= width; - p2.x += width; - } - ctx.moveTo(p1.x, p1.y); - - for (i = 1, len = this._points.length; i < len; i++) { - // we pick the point between pi + 1 & pi + 2 as the - // end point and p1 as our control point. - this._drawSegment(ctx, p1, p2); - p1 = this._points[i]; - p2 = this._points[i + 1]; - } - // Draw last line as a straight line while - // we wait for the next point to be able to calculate - // the bezier control point - ctx.lineTo(p1.x, p1.y); - ctx.stroke(); - ctx.restore(); - }, - - /** - * Converts points to SVG path - * @param {Array} points Array of points - * @return {(string|number)[][]} SVG path commands - */ - convertPointsToSVGPath: function (points) { - var correction = this.width / 1000; - return fabric.util.getSmoothPathFromPoints(points, correction); - }, - - /** - * @private - * @param {(string|number)[][]} pathData SVG path commands - * @returns {boolean} - */ - _isEmptySVGPath: function (pathData) { - var pathString = fabric.util.joinPath(pathData); - return pathString === 'M 0 0 Q 0 0 0 0 L 0 0'; - }, - - /** - * Creates fabric.Path object to add on canvas - * @param {(string|number)[][]} pathData Path data - * @return {fabric.Path} Path to add on canvas - */ - createPath: function(pathData) { - var path = new fabric.Path(pathData, { - fill: null, - stroke: this.color, - strokeWidth: this.width, - strokeLineCap: this.strokeLineCap, - strokeMiterLimit: this.strokeMiterLimit, - strokeLineJoin: this.strokeLineJoin, - strokeDashArray: this.strokeDashArray, - }); - if (this.shadow) { - this.shadow.affectStroke = true; - path.shadow = new fabric.Shadow(this.shadow); - } - - return path; - }, - - /** - * Decimate points array with the decimate value - */ - decimatePoints: function(points, distance) { - if (points.length <= 2) { - return points; - } - var zoom = this.canvas.getZoom(), adjustedDistance = Math.pow(distance / zoom, 2), - i, l = points.length - 1, lastPoint = points[0], newPoints = [lastPoint], - cDistance; - for (i = 1; i < l - 1; i++) { - cDistance = Math.pow(lastPoint.x - points[i].x, 2) + Math.pow(lastPoint.y - points[i].y, 2); - if (cDistance >= adjustedDistance) { - lastPoint = points[i]; - newPoints.push(lastPoint); - } - } - /** - * Add the last point from the original line to the end of the array. - * This ensures decimate doesn't delete the last point on the line, and ensures the line is > 1 point. - */ - newPoints.push(points[l]); - return newPoints; - }, - - /** - * On mouseup after drawing the path on contextTop canvas - * we use the points captured to create an new fabric path object - * and add it to the fabric canvas. - */ - _finalizeAndAddPath: function() { - var ctx = this.canvas.contextTop; - ctx.closePath(); - if (this.decimate) { - this._points = this.decimatePoints(this._points, this.decimate); - } - var pathData = this.convertPointsToSVGPath(this._points); - if (this._isEmptySVGPath(pathData)) { - // do not create 0 width/height paths, as they are - // rendered inconsistently across browsers - // Firefox 4, for example, renders a dot, - // whereas Chrome 10 renders nothing - this.canvas.requestRenderAll(); - return; - } - - var path = this.createPath(pathData); - this.canvas.clearContext(this.canvas.contextTop); - this.canvas.fire('before:path:created', { path: path }); - this.canvas.add(path); - this.canvas.requestRenderAll(); - path.setCoords(); - this._resetShadow(); - - - // fire event 'path' created - this.canvas.fire('path:created', { path: path }); - } - }); -})(); - - -/** - * CircleBrush class - * @class fabric.CircleBrush - */ -fabric.CircleBrush = fabric.util.createClass(fabric.BaseBrush, /** @lends fabric.CircleBrush.prototype */ { - - /** - * Width of a brush - * @type Number - * @default - */ - width: 10, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.CircleBrush} Instance of a circle brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.points = []; - }, - - /** - * Invoked inside on mouse down and mouse move - * @param {Object} pointer - */ - drawDot: function(pointer) { - var point = this.addPoint(pointer), - ctx = this.canvas.contextTop; - this._saveAndTransform(ctx); - this.dot(ctx, point); - ctx.restore(); - }, - - dot: function(ctx, point) { - ctx.fillStyle = point.fill; - ctx.beginPath(); - ctx.arc(point.x, point.y, point.radius, 0, Math.PI * 2, false); - ctx.closePath(); - ctx.fill(); - }, - - /** - * Invoked on mouse down - */ - onMouseDown: function(pointer) { - this.points.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - this.drawDot(pointer); - }, - - /** - * Render the full state of the brush - * @private - */ - _render: function() { - var ctx = this.canvas.contextTop, i, len, - points = this.points; - this._saveAndTransform(ctx); - for (i = 0, len = points.length; i < len; i++) { - this.dot(ctx, points[i]); - } - ctx.restore(); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - if (this.needsFullRender()) { - this.canvas.clearContext(this.canvas.contextTop); - this.addPoint(pointer); - this._render(); - } - else { - this.drawDot(pointer); - } - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove, i, len; - this.canvas.renderOnAddRemove = false; - - var circles = []; - - for (i = 0, len = this.points.length; i < len; i++) { - var point = this.points[i], - circle = new fabric.Circle({ - radius: point.radius, - left: point.x, - top: point.y, - originX: 'center', - originY: 'center', - fill: point.fill - }); - - this.shadow && (circle.shadow = new fabric.Shadow(this.shadow)); - - circles.push(circle); - } - var group = new fabric.Group(circles); - group.canvas = this.canvas; - - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @param {Object} pointer - * @return {fabric.Point} Just added pointer point - */ - addPoint: function(pointer) { - var pointerPoint = new fabric.Point(pointer.x, pointer.y), - - circleRadius = fabric.util.getRandomInt( - Math.max(0, this.width - 20), this.width + 20) / 2, - - circleColor = new fabric.Color(this.color) - .setAlpha(fabric.util.getRandomInt(0, 100) / 100) - .toRgba(); - - pointerPoint.radius = circleRadius; - pointerPoint.fill = circleColor; - - this.points.push(pointerPoint); - - return pointerPoint; - } -}); - - -/** - * SprayBrush class - * @class fabric.SprayBrush - */ -fabric.SprayBrush = fabric.util.createClass( fabric.BaseBrush, /** @lends fabric.SprayBrush.prototype */ { - - /** - * Width of a spray - * @type Number - * @default - */ - width: 10, - - /** - * Density of a spray (number of dots per chunk) - * @type Number - * @default - */ - density: 20, - - /** - * Width of spray dots - * @type Number - * @default - */ - dotWidth: 1, - - /** - * Width variance of spray dots - * @type Number - * @default - */ - dotWidthVariance: 1, - - /** - * Whether opacity of a dot should be random - * @type Boolean - * @default - */ - randomOpacity: false, - - /** - * Whether overlapping dots (rectangles) should be removed (for performance reasons) - * @type Boolean - * @default - */ - optimizeOverlapping: true, - - /** - * Constructor - * @param {fabric.Canvas} canvas - * @return {fabric.SprayBrush} Instance of a spray brush - */ - initialize: function(canvas) { - this.canvas = canvas; - this.sprayChunks = []; - }, - - /** - * Invoked on mouse down - * @param {Object} pointer - */ - onMouseDown: function(pointer) { - this.sprayChunks.length = 0; - this.canvas.clearContext(this.canvas.contextTop); - this._setShadow(); - - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse move - * @param {Object} pointer - */ - onMouseMove: function(pointer) { - if (this.limitedToCanvasSize === true && this._isOutSideCanvas(pointer)) { - return; - } - this.addSprayChunk(pointer); - this.render(this.sprayChunkPoints); - }, - - /** - * Invoked on mouse up - */ - onMouseUp: function() { - var originalRenderOnAddRemove = this.canvas.renderOnAddRemove; - this.canvas.renderOnAddRemove = false; - - var rects = []; - - for (var i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - var sprayChunk = this.sprayChunks[i]; - - for (var j = 0, jlen = sprayChunk.length; j < jlen; j++) { - - var rect = new fabric.Rect({ - width: sprayChunk[j].width, - height: sprayChunk[j].width, - left: sprayChunk[j].x + 1, - top: sprayChunk[j].y + 1, - originX: 'center', - originY: 'center', - fill: this.color - }); - rects.push(rect); - } - } - - if (this.optimizeOverlapping) { - rects = this._getOptimizedRects(rects); - } - - var group = new fabric.Group(rects); - this.shadow && group.set('shadow', new fabric.Shadow(this.shadow)); - this.canvas.fire('before:path:created', { path: group }); - this.canvas.add(group); - this.canvas.fire('path:created', { path: group }); - - this.canvas.clearContext(this.canvas.contextTop); - this._resetShadow(); - this.canvas.renderOnAddRemove = originalRenderOnAddRemove; - this.canvas.requestRenderAll(); - }, - - /** - * @private - * @param {Array} rects - */ - _getOptimizedRects: function(rects) { - - // avoid creating duplicate rects at the same coordinates - var uniqueRects = { }, key, i, len; - - for (i = 0, len = rects.length; i < len; i++) { - key = rects[i].left + '' + rects[i].top; - if (!uniqueRects[key]) { - uniqueRects[key] = rects[i]; - } - } - var uniqueRectsArray = []; - for (key in uniqueRects) { - uniqueRectsArray.push(uniqueRects[key]); - } - - return uniqueRectsArray; - }, - - /** - * Render new chunk of spray brush - */ - render: function(sprayChunk) { - var ctx = this.canvas.contextTop, i, len; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, len = sprayChunk.length; i < len; i++) { - var point = sprayChunk[i]; - if (typeof point.opacity !== 'undefined') { - ctx.globalAlpha = point.opacity; - } - ctx.fillRect(point.x, point.y, point.width, point.width); - } - ctx.restore(); - }, - - /** - * Render all spray chunks - */ - _render: function() { - var ctx = this.canvas.contextTop, i, ilen; - ctx.fillStyle = this.color; - - this._saveAndTransform(ctx); - - for (i = 0, ilen = this.sprayChunks.length; i < ilen; i++) { - this.render(this.sprayChunks[i]); - } - ctx.restore(); - }, - - /** - * @param {Object} pointer - */ - addSprayChunk: function(pointer) { - this.sprayChunkPoints = []; - - var x, y, width, radius = this.width / 2, i; - - for (i = 0; i < this.density; i++) { - - x = fabric.util.getRandomInt(pointer.x - radius, pointer.x + radius); - y = fabric.util.getRandomInt(pointer.y - radius, pointer.y + radius); - - if (this.dotWidthVariance) { - width = fabric.util.getRandomInt( - // bottom clamp width to 1 - Math.max(1, this.dotWidth - this.dotWidthVariance), - this.dotWidth + this.dotWidthVariance); - } - else { - width = this.dotWidth; - } - - var point = new fabric.Point(x, y); - point.width = width; - - if (this.randomOpacity) { - point.opacity = fabric.util.getRandomInt(0, 100) / 100; - } - - this.sprayChunkPoints.push(point); - } - - this.sprayChunks.push(this.sprayChunkPoints); - } -}); - - -/** - * PatternBrush class - * @class fabric.PatternBrush - * @extends fabric.BaseBrush - */ -fabric.PatternBrush = fabric.util.createClass(fabric.PencilBrush, /** @lends fabric.PatternBrush.prototype */ { - - getPatternSrc: function() { - - var dotWidth = 20, - dotDistance = 5, - patternCanvas = fabric.util.createCanvasElement(), - patternCtx = patternCanvas.getContext('2d'); - - patternCanvas.width = patternCanvas.height = dotWidth + dotDistance; - - patternCtx.fillStyle = this.color; - patternCtx.beginPath(); - patternCtx.arc(dotWidth / 2, dotWidth / 2, dotWidth / 2, 0, Math.PI * 2, false); - patternCtx.closePath(); - patternCtx.fill(); - - return patternCanvas; - }, - - getPatternSrcFunction: function() { - return String(this.getPatternSrc).replace('this.color', '"' + this.color + '"'); - }, - - /** - * Creates "pattern" instance property - * @param {CanvasRenderingContext2D} ctx - */ - getPattern: function(ctx) { - return ctx.createPattern(this.source || this.getPatternSrc(), 'repeat'); - }, - - /** - * Sets brush styles - * @param {CanvasRenderingContext2D} ctx - */ - _setBrushStyles: function(ctx) { - this.callSuper('_setBrushStyles', ctx); - ctx.strokeStyle = this.getPattern(ctx); - }, - - /** - * Creates path - */ - createPath: function(pathData) { - var path = this.callSuper('createPath', pathData), - topLeft = path._getLeftTopCoords().scalarAdd(path.strokeWidth / 2); - - path.stroke = new fabric.Pattern({ - source: this.source || this.getPatternSrcFunction(), - offsetX: -topLeft.x, - offsetY: -topLeft.y - }); - return path; - } -}); - - -(function() { - - var getPointer = fabric.util.getPointer, - degreesToRadians = fabric.util.degreesToRadians, - isTouchEvent = fabric.util.isTouchEvent; - - /** - * Canvas class - * @class fabric.Canvas - * @extends fabric.StaticCanvas - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#canvas} - * @see {@link fabric.Canvas#initialize} for constructor definition - * - * @fires object:modified at the end of a transform or any change when statefull is true - * @fires object:rotating while an object is being rotated from the control - * @fires object:scaling while an object is being scaled by controls - * @fires object:moving while an object is being dragged - * @fires object:skewing while an object is being skewed from the controls - * - * @fires before:transform before a transform is is started - * @fires before:selection:cleared - * @fires selection:cleared - * @fires selection:updated - * @fires selection:created - * - * @fires path:created after a drawing operation ends and the path is added - * @fires mouse:down - * @fires mouse:move - * @fires mouse:up - * @fires mouse:down:before on mouse down, before the inner fabric logic runs - * @fires mouse:move:before on mouse move, before the inner fabric logic runs - * @fires mouse:up:before on mouse up, before the inner fabric logic runs - * @fires mouse:over - * @fires mouse:out - * @fires mouse:dblclick whenever a native dbl click event fires on the canvas. - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop:before before drop event. same native event. This is added to handle edge cases - * @fires drop - * @fires after:render at the end of the render process, receives the context in the callback - * @fires before:render at start the render process, receives the context in the callback - * - */ - fabric.Canvas = fabric.util.createClass(fabric.StaticCanvas, /** @lends fabric.Canvas.prototype */ { - - /** - * Constructor - * @param {HTMLElement | String} el <canvas> element to initialize instance on - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(el, options) { - options || (options = { }); - this.renderAndResetBound = this.renderAndReset.bind(this); - this.requestRenderAllBound = this.requestRenderAll.bind(this); - this._initStatic(el, options); - this._initInteractive(); - this._createCacheCanvas(); - }, - - /** - * When true, objects can be transformed by one side (unproportionally) - * when dragged on the corners that normally would not do that. - * @type Boolean - * @default - * @since fabric 4.0 // changed name and default value - */ - uniformScaling: true, - - /** - * Indicates which key switches uniform scaling. - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * totally wrong named. this sounds like `uniform scaling` - * if Canvas.uniformScaling is true, pressing this will set it to false - * and viceversa. - * @since 1.6.2 - * @type String - * @default - */ - uniScaleKey: 'shiftKey', - - /** - * When true, objects use center point as the origin of scale transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, objects use center point as the origin of rotate transformation. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: false, - - /** - * Indicates which key enable centered Transform - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - centeredKey: 'altKey', - - /** - * Indicates which key enable alternate action on corner - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled feature disabled. - * @since 1.6.2 - * @type String - * @default - */ - altActionKey: 'shiftKey', - - /** - * Indicates that canvas is interactive. This property should not be changed. - * @type Boolean - * @default - */ - interactive: true, - - /** - * Indicates whether group selection should be enabled - * @type Boolean - * @default - */ - selection: true, - - /** - * Indicates which key or keys enable multiple click selection - * Pass value as a string or array of strings - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * If `null` or empty or containing any other string that is not a modifier key - * feature is disabled. - * @since 1.6.2 - * @type String|Array - * @default - */ - selectionKey: 'shiftKey', - - /** - * Indicates which key enable alternative selection - * in case of target overlapping with active object - * values: 'altKey', 'shiftKey', 'ctrlKey'. - * For a series of reason that come from the general expectations on how - * things should work, this feature works only for preserveObjectStacking true. - * If `null` or 'none' or any other string that is not a modifier key - * feature is disabled. - * @since 1.6.5 - * @type null|String - * @default - */ - altSelectionKey: null, - - /** - * Color of selection - * @type String - * @default - */ - selectionColor: 'rgba(100, 100, 255, 0.3)', // blue - - /** - * Default dash array pattern - * If not empty the selection border is dashed - * @type Array - */ - selectionDashArray: [], - - /** - * Color of the border of selection (usually slightly darker than color of selection itself) - * @type String - * @default - */ - selectionBorderColor: 'rgba(255, 255, 255, 0.3)', - - /** - * Width of a line used in object/group selection - * @type Number - * @default - */ - selectionLineWidth: 1, - - /** - * Select only shapes that are fully contained in the dragged selection rectangle. - * @type Boolean - * @default - */ - selectionFullyContained: false, - - /** - * Default cursor value used when hovering over an object on canvas - * @type String - * @default - */ - hoverCursor: 'move', - - /** - * Default cursor value used when moving an object on canvas - * @type String - * @default - */ - moveCursor: 'move', - - /** - * Default cursor value used for the entire canvas - * @type String - * @default - */ - defaultCursor: 'default', - - /** - * Cursor value used during free drawing - * @type String - * @default - */ - freeDrawingCursor: 'crosshair', - - /** - * Cursor value used for disabled elements ( corners with disabled action ) - * @type String - * @since 2.0.0 - * @default - */ - notAllowedCursor: 'not-allowed', - - /** - * Default element class that's given to wrapper (div) element of canvas - * @type String - * @default - */ - containerClass: 'canvas-container', - - /** - * When true, object detection happens on per-pixel basis rather than on per-bounding-box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * Number of pixels around target pixel to tolerate (consider active) during object detection - * @type Number - * @default - */ - targetFindTolerance: 0, - - /** - * When true, target detection is skipped. Target detection will return always undefined. - * click selection won't work anymore, events will fire with no targets. - * if something is selected before setting it to true, it will be deselected at the first click. - * area selection will still work. check the `selection` property too. - * if you deactivate both, you should look into staticCanvas. - * @type Boolean - * @default - */ - skipTargetFind: false, - - /** - * When true, mouse events on canvas (mousedown/mousemove/mouseup) result in free drawing. - * After mousedown, mousemove creates a shape, - * and then mouseup finalizes it and adds an instance of `fabric.Path` onto canvas. - * @tutorial {@link http://fabricjs.com/fabric-intro-part-4#free_drawing} - * @type Boolean - * @default - */ - isDrawingMode: false, - - /** - * Indicates whether objects should remain in current stack position when selected. - * When false objects are brought to top and rendered as part of the selection group - * @type Boolean - * @default - */ - preserveObjectStacking: false, - - /** - * Indicates the angle that an object will lock to while rotating. - * @type Number - * @since 1.6.7 - * @default - */ - snapAngle: 0, - - /** - * Indicates the distance from the snapAngle the rotation will lock to the snapAngle. - * When `null`, the snapThreshold will default to the snapAngle. - * @type null|Number - * @since 1.6.7 - * @default - */ - snapThreshold: null, - - /** - * Indicates if the right click on canvas can output the context menu or not - * @type Boolean - * @since 1.6.5 - * @default - */ - stopContextMenu: false, - - /** - * Indicates if the canvas can fire right click events - * @type Boolean - * @since 1.6.5 - * @default - */ - fireRightClick: false, - - /** - * Indicates if the canvas can fire middle click events - * @type Boolean - * @since 1.7.8 - * @default - */ - fireMiddleClick: false, - - /** - * Keep track of the subTargets for Mouse Events - * @type fabric.Object[] - */ - targets: [], - - /** - * When the option is enabled, PointerEvent is used instead of MouseEvent. - * @type Boolean - * @default - */ - enablePointerEvents: false, - - /** - * Keep track of the hovered target - * @type fabric.Object - * @private - */ - _hoveredTarget: null, - - /** - * hold the list of nested targets hovered - * @type fabric.Object[] - * @private - */ - _hoveredTargets: [], - - /** - * @private - */ - _initInteractive: function() { - this._currentTransform = null; - this._groupSelector = null; - this._initWrapperElement(); - this._createUpperCanvas(); - this._initEventListeners(); - - this._initRetinaScaling(); - - this.freeDrawingBrush = fabric.PencilBrush && new fabric.PencilBrush(this); - - this.calcOffset(); - }, - - /** - * Divides objects in two groups, one to render immediately - * and one to render as activeGroup. - * @return {Array} objects to render immediately and pushes the other in the activeGroup. - */ - _chooseObjectsToRender: function() { - var activeObjects = this.getActiveObjects(), - object, objsToRender, activeGroupObjects; - - if (activeObjects.length > 0 && !this.preserveObjectStacking) { - objsToRender = []; - activeGroupObjects = []; - for (var i = 0, length = this._objects.length; i < length; i++) { - object = this._objects[i]; - if (activeObjects.indexOf(object) === -1 ) { - objsToRender.push(object); - } - else { - activeGroupObjects.push(object); - } - } - if (activeObjects.length > 1) { - this._activeObject._objects = activeGroupObjects; - } - objsToRender.push.apply(objsToRender, activeGroupObjects); - } - else { - objsToRender = this._objects; - } - return objsToRender; - }, - - /** - * Renders both the top canvas and the secondary container canvas. - * @return {fabric.Canvas} instance - * @chainable - */ - renderAll: function () { - if (this.contextTopDirty && !this._groupSelector && !this.isDrawingMode) { - this.clearContext(this.contextTop); - this.contextTopDirty = false; - } - if (this.hasLostContext) { - this.renderTopLayer(this.contextTop); - this.hasLostContext = false; - } - var canvasToDrawOn = this.contextContainer; - this.renderCanvas(canvasToDrawOn, this._chooseObjectsToRender()); - return this; - }, - - renderTopLayer: function(ctx) { - ctx.save(); - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this.freeDrawingBrush && this.freeDrawingBrush._render(); - this.contextTopDirty = true; - } - // we render the top context - last object - if (this.selection && this._groupSelector) { - this._drawSelection(ctx); - this.contextTopDirty = true; - } - ctx.restore(); - }, - - /** - * Method to render only the top canvas. - * Also used to render the group selection box. - * @return {fabric.Canvas} thisArg - * @chainable - */ - renderTop: function () { - var ctx = this.contextTop; - this.clearContext(ctx); - this.renderTopLayer(ctx); - this.fire('after:render'); - return this; - }, - - /** - * @private - */ - _normalizePointer: function (object, pointer) { - var m = object.calcTransformMatrix(), - invertedM = fabric.util.invertTransform(m), - vptPointer = this.restorePointerVpt(pointer); - return fabric.util.transformPoint(vptPointer, invertedM); - }, - - /** - * Returns true if object is transparent at a certain location - * @param {fabric.Object} target Object to check - * @param {Number} x Left coordinate - * @param {Number} y Top coordinate - * @return {Boolean} - */ - isTargetTransparent: function (target, x, y) { - // in case the target is the activeObject, we cannot execute this optimization - // because we need to draw controls too. - if (target.shouldCache() && target._cacheCanvas && target !== this._activeObject) { - var normalizedPointer = this._normalizePointer(target, {x: x, y: y}), - targetRelativeX = Math.max(target.cacheTranslationX + (normalizedPointer.x * target.zoomX), 0), - targetRelativeY = Math.max(target.cacheTranslationY + (normalizedPointer.y * target.zoomY), 0); - - var isTransparent = fabric.util.isTransparent( - target._cacheContext, Math.round(targetRelativeX), Math.round(targetRelativeY), this.targetFindTolerance); - - return isTransparent; - } - - var ctx = this.contextCache, - originalColor = target.selectionBackgroundColor, v = this.viewportTransform; - - target.selectionBackgroundColor = ''; - - this.clearContext(ctx); - - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - target.render(ctx); - ctx.restore(); - - target.selectionBackgroundColor = originalColor; - - var isTransparent = fabric.util.isTransparent( - ctx, x, y, this.targetFindTolerance); - - return isTransparent; - }, - - /** - * takes an event and determines if selection key has been pressed - * @private - * @param {Event} e Event object - */ - _isSelectionKeyPressed: function(e) { - var selectionKeyPressed = false; - - if (Array.isArray(this.selectionKey)) { - selectionKeyPressed = !!this.selectionKey.find(function(key) { return e[key] === true; }); - } - else { - selectionKeyPressed = e[this.selectionKey]; - } - - return selectionKeyPressed; - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _shouldClearSelection: function (e, target) { - var activeObjects = this.getActiveObjects(), - activeObject = this._activeObject; - - return ( - !target - || - (target && - activeObject && - activeObjects.length > 1 && - activeObjects.indexOf(target) === -1 && - activeObject !== target && - !this._isSelectionKeyPressed(e)) - || - (target && !target.evented) - || - (target && - !target.selectable && - activeObject && - activeObject !== target) - ); - }, - - /** - * centeredScaling from object can't override centeredScaling from canvas. - * this should be fixed, since object setting should take precedence over canvas. - * also this should be something that will be migrated in the control properties. - * as ability to define the origin of the transformation that the control provide. - * @private - * @param {fabric.Object} target - * @param {String} action - * @param {Boolean} altKey - */ - _shouldCenterTransform: function (target, action, altKey) { - if (!target) { - return; - } - - var centerTransform; - - if (action === 'scale' || action === 'scaleX' || action === 'scaleY' || action === 'resizing') { - centerTransform = this.centeredScaling || target.centeredScaling; - } - else if (action === 'rotate') { - centerTransform = this.centeredRotation || target.centeredRotation; - } - - return centerTransform ? !altKey : altKey; - }, - - /** - * should disappear before release 4.0 - * @private - */ - _getOriginFromCorner: function(target, corner) { - var origin = { - x: target.originX, - y: target.originY - }; - - if (corner === 'ml' || corner === 'tl' || corner === 'bl') { - origin.x = 'right'; - } - else if (corner === 'mr' || corner === 'tr' || corner === 'br') { - origin.x = 'left'; - } - - if (corner === 'tl' || corner === 'mt' || corner === 'tr') { - origin.y = 'bottom'; - } - else if (corner === 'bl' || corner === 'mb' || corner === 'br') { - origin.y = 'top'; - } - return origin; - }, - - /** - * @private - * @param {Boolean} alreadySelected true if target is already selected - * @param {String} corner a string representing the corner ml, mr, tl ... - * @param {Event} e Event object - * @param {fabric.Object} [target] inserted back to help overriding. Unused - */ - _getActionFromCorner: function(alreadySelected, corner, e, target) { - if (!corner || !alreadySelected) { - return 'drag'; - } - var control = target.controls[corner]; - return control.getActionName(e, control, target); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _setupCurrentTransform: function (e, target, alreadySelected) { - if (!target) { - return; - } - - var pointer = this.getPointer(e), corner = target.__corner, - control = target.controls[corner], - actionHandler = (alreadySelected && corner) ? - control.getActionHandler(e, target, control) : fabric.controlsUtils.dragHandler, - action = this._getActionFromCorner(alreadySelected, corner, e, target), - origin = this._getOriginFromCorner(target, corner), - altKey = e[this.centeredKey], - transform = { - target: target, - action: action, - actionHandler: actionHandler, - corner: corner, - scaleX: target.scaleX, - scaleY: target.scaleY, - skewX: target.skewX, - skewY: target.skewY, - // used by transation - offsetX: pointer.x - target.left, - offsetY: pointer.y - target.top, - originX: origin.x, - originY: origin.y, - ex: pointer.x, - ey: pointer.y, - lastX: pointer.x, - lastY: pointer.y, - // unsure they are useful anymore. - // left: target.left, - // top: target.top, - theta: degreesToRadians(target.angle), - // end of unsure - width: target.width * target.scaleX, - shiftKey: e.shiftKey, - altKey: altKey, - original: fabric.util.saveObjectTransform(target), - }; - - if (this._shouldCenterTransform(target, action, altKey)) { - transform.originX = 'center'; - transform.originY = 'center'; - } - transform.original.originX = origin.x; - transform.original.originY = origin.y; - this._currentTransform = transform; - this._beforeTransform(e); - }, - - /** - * Set the cursor type of the canvas element - * @param {String} value Cursor type of the canvas element. - * @see http://www.w3.org/TR/css3-ui/#cursor - */ - setCursor: function (value) { - this.upperCanvasEl.style.cursor = value; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx to draw the selection on - */ - _drawSelection: function (ctx) { - var selector = this._groupSelector, - viewportStart = new fabric.Point(selector.ex, selector.ey), - start = fabric.util.transformPoint(viewportStart, this.viewportTransform), - viewportExtent = new fabric.Point(selector.ex + selector.left, selector.ey + selector.top), - extent = fabric.util.transformPoint(viewportExtent, this.viewportTransform), - minX = Math.min(start.x, extent.x), - minY = Math.min(start.y, extent.y), - maxX = Math.max(start.x, extent.x), - maxY = Math.max(start.y, extent.y), - strokeOffset = this.selectionLineWidth / 2; - - if (this.selectionColor) { - ctx.fillStyle = this.selectionColor; - ctx.fillRect(minX, minY, maxX - minX, maxY - minY); - } - - if (!this.selectionLineWidth || !this.selectionBorderColor) { - return; - } - ctx.lineWidth = this.selectionLineWidth; - ctx.strokeStyle = this.selectionBorderColor; - - minX += strokeOffset; - minY += strokeOffset; - maxX -= strokeOffset; - maxY -= strokeOffset; - // selection border - fabric.Object.prototype._setLineDash.call(this, ctx, this.selectionDashArray); - ctx.strokeRect(minX, minY, maxX - minX, maxY - minY); - }, - - /** - * Method that determines what object we are clicking on - * the skipGroup parameter is for internal use, is needed for shift+click action - * 11/09/2018 TODO: would be cool if findTarget could discern between being a full target - * or the outside part of the corner. - * @param {Event} e mouse event - * @param {Boolean} skipGroup when true, activeGroup is skipped and only objects are traversed through - * @return {fabric.Object} the target found - */ - findTarget: function (e, skipGroup) { - if (this.skipTargetFind) { - return; - } - - var ignoreZoom = true, - pointer = this.getPointer(e, ignoreZoom), - activeObject = this._activeObject, - aObjects = this.getActiveObjects(), - activeTarget, activeTargetSubs, - isTouch = isTouchEvent(e), - shouldLookForActive = (aObjects.length > 1 && !skipGroup) || aObjects.length === 1; - - // first check current group (if one exists) - // active group does not check sub targets like normal groups. - // if active group just exits. - this.targets = []; - - // if we hit the corner of an activeObject, let's return that. - if (shouldLookForActive && activeObject._findTargetCorner(pointer, isTouch)) { - return activeObject; - } - if (aObjects.length > 1 && !skipGroup && activeObject === this._searchPossibleTargets([activeObject], pointer)) { - return activeObject; - } - if (aObjects.length === 1 && - activeObject === this._searchPossibleTargets([activeObject], pointer)) { - if (!this.preserveObjectStacking) { - return activeObject; - } - else { - activeTarget = activeObject; - activeTargetSubs = this.targets; - this.targets = []; - } - } - var target = this._searchPossibleTargets(this._objects, pointer); - if (e[this.altSelectionKey] && target && activeTarget && target !== activeTarget) { - target = activeTarget; - this.targets = activeTargetSubs; - } - return target; - }, - - /** - * Checks point is inside the object. - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @param {fabric.Object} obj Object to test against - * @param {Object} [globalPointer] x,y object of point coordinates relative to canvas used to search per pixel target. - * @return {Boolean} true if point is contained within an area of given object - * @private - */ - _checkTarget: function(pointer, obj, globalPointer) { - if (obj && - obj.visible && - obj.evented && - // http://www.geog.ubc.ca/courses/klink/gis.notes/ncgia/u32.html - // http://idav.ucdavis.edu/~okreylos/TAship/Spring2000/PointInPolygon.html - obj.containsPoint(pointer) - ) { - if ((this.perPixelTargetFind || obj.perPixelTargetFind) && !obj.isEditing) { - var isTransparent = this.isTargetTransparent(obj, globalPointer.x, globalPointer.y); - if (!isTransparent) { - return true; - } - } - else { - return true; - } - } - }, - - /** - * Function used to search inside objects an object that contains pointer in bounding box or that contains pointerOnCanvas when painted - * @param {Array} [objects] objects array to look into - * @param {Object} [pointer] x,y object of point coordinates we want to check. - * @return {fabric.Object} object that contains pointer - * @private - */ - _searchPossibleTargets: function(objects, pointer) { - // Cache all targets where their bounding box contains point. - var target, i = objects.length, subTarget; - // Do not check for currently grouped objects, since we check the parent group itself. - // until we call this function specifically to search inside the activeGroup - while (i--) { - var objToCheck = objects[i]; - var pointerToUse = objToCheck.group ? - this._normalizePointer(objToCheck.group, pointer) : pointer; - if (this._checkTarget(pointerToUse, objToCheck, pointer)) { - target = objects[i]; - if (target.subTargetCheck && target instanceof fabric.Group) { - subTarget = this._searchPossibleTargets(target._objects, pointer); - subTarget && this.targets.push(subTarget); - } - break; - } - } - return target; - }, - - /** - * Returns pointer coordinates without the effect of the viewport - * @param {Object} pointer with "x" and "y" number values - * @return {Object} object with "x" and "y" number values - */ - restorePointerVpt: function(pointer) { - return fabric.util.transformPoint( - pointer, - fabric.util.invertTransform(this.viewportTransform) - ); - }, - - /** - * Returns pointer coordinates relative to canvas. - * Can return coordinates with or without viewportTransform. - * ignoreZoom false gives back coordinates that represent - * the point clicked on canvas element. - * ignoreZoom true gives back coordinates after being processed - * by the viewportTransform ( sort of coordinates of what is displayed - * on the canvas where you are clicking. - * ignoreZoom true = HTMLElement coordinates relative to top,left - * ignoreZoom false, default = fabric space coordinates, the same used for shape position - * To interact with your shapes top and left you want to use ignoreZoom true - * most of the time, while ignoreZoom false will give you coordinates - * compatible with the object.oCoords system. - * of the time. - * @param {Event} e - * @param {Boolean} ignoreZoom - * @return {Object} object with "x" and "y" number values - */ - getPointer: function (e, ignoreZoom) { - // return cached values if we are in the event processing chain - if (this._absolutePointer && !ignoreZoom) { - return this._absolutePointer; - } - if (this._pointer && ignoreZoom) { - return this._pointer; - } - - var pointer = getPointer(e), - upperCanvasEl = this.upperCanvasEl, - bounds = upperCanvasEl.getBoundingClientRect(), - boundsWidth = bounds.width || 0, - boundsHeight = bounds.height || 0, - cssScale; - - if (!boundsWidth || !boundsHeight ) { - if ('top' in bounds && 'bottom' in bounds) { - boundsHeight = Math.abs( bounds.top - bounds.bottom ); - } - if ('right' in bounds && 'left' in bounds) { - boundsWidth = Math.abs( bounds.right - bounds.left ); - } - } - - this.calcOffset(); - pointer.x = pointer.x - this._offset.left; - pointer.y = pointer.y - this._offset.top; - if (!ignoreZoom) { - pointer = this.restorePointerVpt(pointer); - } - - var retinaScaling = this.getRetinaScaling(); - if (retinaScaling !== 1) { - pointer.x /= retinaScaling; - pointer.y /= retinaScaling; - } - - if (boundsWidth === 0 || boundsHeight === 0) { - // If bounds are not available (i.e. not visible), do not apply scale. - cssScale = { width: 1, height: 1 }; - } - else { - cssScale = { - width: upperCanvasEl.width / boundsWidth, - height: upperCanvasEl.height / boundsHeight - }; - } - - return { - x: pointer.x * cssScale.width, - y: pointer.y * cssScale.height - }; - }, - - /** - * @private - * @throws {CANVAS_INIT_ERROR} If canvas can not be initialized - */ - _createUpperCanvas: function () { - var lowerCanvasClass = this.lowerCanvasEl.className.replace(/\s*lower-canvas\s*/, ''), - lowerCanvasEl = this.lowerCanvasEl, upperCanvasEl = this.upperCanvasEl; - - // there is no need to create a new upperCanvas element if we have already one. - if (upperCanvasEl) { - upperCanvasEl.className = ''; - } - else { - upperCanvasEl = this._createCanvasElement(); - this.upperCanvasEl = upperCanvasEl; - } - fabric.util.addClass(upperCanvasEl, 'upper-canvas ' + lowerCanvasClass); - - this.wrapperEl.appendChild(upperCanvasEl); - - this._copyCanvasStyle(lowerCanvasEl, upperCanvasEl); - this._applyCanvasStyle(upperCanvasEl); - this.contextTop = upperCanvasEl.getContext('2d'); - }, - - /** - * Returns context of top canvas where interactions are drawn - * @returns {CanvasRenderingContext2D} - */ - getTopContext: function () { - return this.contextTop; - }, - - /** - * @private - */ - _createCacheCanvas: function () { - this.cacheCanvasEl = this._createCanvasElement(); - this.cacheCanvasEl.setAttribute('width', this.width); - this.cacheCanvasEl.setAttribute('height', this.height); - this.contextCache = this.cacheCanvasEl.getContext('2d'); - }, - - /** - * @private - */ - _initWrapperElement: function () { - this.wrapperEl = fabric.util.wrapElement(this.lowerCanvasEl, 'div', { - 'class': this.containerClass - }); - fabric.util.setStyle(this.wrapperEl, { - width: this.width + 'px', - height: this.height + 'px', - position: 'relative' - }); - fabric.util.makeElementUnselectable(this.wrapperEl); - }, - - /** - * @private - * @param {HTMLElement} element canvas element to apply styles on - */ - _applyCanvasStyle: function (element) { - var width = this.width || element.width, - height = this.height || element.height; - - fabric.util.setStyle(element, { - position: 'absolute', - width: width + 'px', - height: height + 'px', - left: 0, - top: 0, - 'touch-action': this.allowTouchScrolling ? 'manipulation' : 'none', - '-ms-touch-action': this.allowTouchScrolling ? 'manipulation' : 'none' - }); - element.width = width; - element.height = height; - fabric.util.makeElementUnselectable(element); - }, - - /** - * Copy the entire inline style from one element (fromEl) to another (toEl) - * @private - * @param {Element} fromEl Element style is copied from - * @param {Element} toEl Element copied style is applied to - */ - _copyCanvasStyle: function (fromEl, toEl) { - toEl.style.cssText = fromEl.style.cssText; - }, - - /** - * Returns context of canvas where object selection is drawn - * @return {CanvasRenderingContext2D} - */ - getSelectionContext: function() { - return this.contextTop; - }, - - /** - * Returns <canvas> element on which object selection is drawn - * @return {HTMLCanvasElement} - */ - getSelectionElement: function () { - return this.upperCanvasEl; - }, - - /** - * Returns currently active object - * @return {fabric.Object} active object - */ - getActiveObject: function () { - return this._activeObject; - }, - - /** - * Returns an array with the current selected objects - * @return {fabric.Object} active object - */ - getActiveObjects: function () { - var active = this._activeObject; - if (active) { - if (active.type === 'activeSelection' && active._objects) { - return active._objects.slice(0); - } - else { - return [active]; - } - } - return []; - }, - - /** - * @private - * @param {fabric.Object} obj Object that was removed - */ - _onObjectRemoved: function(obj) { - // removing active object should fire "selection:cleared" events - if (obj === this._activeObject) { - this.fire('before:selection:cleared', { target: obj }); - this._discardActiveObject(); - this.fire('selection:cleared', { target: obj }); - obj.fire('deselected'); - } - if (obj === this._hoveredTarget){ - this._hoveredTarget = null; - this._hoveredTargets = []; - } - this.callSuper('_onObjectRemoved', obj); - }, - - /** - * @private - * Compares the old activeObject with the current one and fires correct events - * @param {fabric.Object} obj old activeObject - */ - _fireSelectionEvents: function(oldObjects, e) { - var somethingChanged = false, objects = this.getActiveObjects(), - added = [], removed = []; - oldObjects.forEach(function(oldObject) { - if (objects.indexOf(oldObject) === -1) { - somethingChanged = true; - oldObject.fire('deselected', { - e: e, - target: oldObject - }); - removed.push(oldObject); - } - }); - objects.forEach(function(object) { - if (oldObjects.indexOf(object) === -1) { - somethingChanged = true; - object.fire('selected', { - e: e, - target: object - }); - added.push(object); - } - }); - if (oldObjects.length > 0 && objects.length > 0) { - somethingChanged && this.fire('selection:updated', { - e: e, - selected: added, - deselected: removed, - }); - } - else if (objects.length > 0) { - this.fire('selection:created', { - e: e, - selected: added, - }); - } - else if (oldObjects.length > 0) { - this.fire('selection:cleared', { - e: e, - deselected: removed, - }); - } - }, - - /** - * Sets given object as the only active object on canvas - * @param {fabric.Object} object Object to set as an active one - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {fabric.Canvas} thisArg - * @chainable - */ - setActiveObject: function (object, e) { - var currentActives = this.getActiveObjects(); - this._setActiveObject(object, e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to setActiveObject but without firing - * any event. There is commitment to have this stay this way. - * This is the functional part of setActiveObject. - * @private - * @param {Object} object to set as active - * @param {Event} [e] Event (passed along when firing "object:selected") - * @return {Boolean} true if the selection happened - */ - _setActiveObject: function(object, e) { - if (this._activeObject === object) { - return false; - } - if (!this._discardActiveObject(e, object)) { - return false; - } - if (object.onSelect({ e: e })) { - return false; - } - this._activeObject = object; - return true; - }, - - /** - * This is a private method for now. - * This is supposed to be equivalent to discardActiveObject but without firing - * any events. There is commitment to have this stay this way. - * This is the functional part of discardActiveObject. - * @param {Event} [e] Event (passed along when firing "object:deselected") - * @param {Object} object to set as active - * @return {Boolean} true if the selection happened - * @private - */ - _discardActiveObject: function(e, object) { - var obj = this._activeObject; - if (obj) { - // onDeselect return TRUE to cancel selection; - if (obj.onDeselect({ e: e, object: object })) { - return false; - } - this._activeObject = null; - } - return true; - }, - - /** - * Discards currently active object and fire events. If the function is called by fabric - * as a consequence of a mouse event, the event is passed as a parameter and - * sent to the fire function for the custom events. When used as a method the - * e param does not have any application. - * @param {event} e - * @return {fabric.Canvas} thisArg - * @chainable - */ - discardActiveObject: function (e) { - var currentActives = this.getActiveObjects(), activeObject = this.getActiveObject(); - if (currentActives.length) { - this.fire('before:selection:cleared', { target: activeObject, e: e }); - } - this._discardActiveObject(e); - this._fireSelectionEvents(currentActives, e); - return this; - }, - - /** - * Clears a canvas element and removes all event listeners - * @return {fabric.Canvas} thisArg - * @chainable - */ - dispose: function () { - var wrapper = this.wrapperEl; - this.removeListeners(); - wrapper.removeChild(this.upperCanvasEl); - wrapper.removeChild(this.lowerCanvasEl); - this.contextCache = null; - this.contextTop = null; - ['upperCanvasEl', 'cacheCanvasEl'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - if (wrapper.parentNode) { - wrapper.parentNode.replaceChild(this.lowerCanvasEl, this.wrapperEl); - } - delete this.wrapperEl; - fabric.StaticCanvas.prototype.dispose.call(this); - return this; - }, - - /** - * Clears all contexts (background, main, top) of an instance - * @return {fabric.Canvas} thisArg - * @chainable - */ - clear: function () { - // this.discardActiveGroup(); - this.discardActiveObject(); - this.clearContext(this.contextTop); - return this.callSuper('clear'); - }, - - /** - * Draws objects' controls (borders/controls) - * @param {CanvasRenderingContext2D} ctx Context to render controls on - */ - drawControls: function(ctx) { - var activeObject = this._activeObject; - - if (activeObject) { - activeObject._renderControls(ctx); - } - }, - - /** - * @private - */ - _toObject: function(instance, methodName, propertiesToInclude) { - //If the object is part of the current selection group, it should - //be transformed appropriately - //i.e. it should be serialised as it would appear if the selection group - //were to be destroyed. - var originalProperties = this._realizeGroupTransformOnObject(instance), - object = this.callSuper('_toObject', instance, methodName, propertiesToInclude); - //Undo the damage we did by changing all of its properties - this._unwindGroupTransformOnObject(instance, originalProperties); - return object; - }, - - /** - * Realises an object's group transformation on it - * @private - * @param {fabric.Object} [instance] the object to transform (gets mutated) - * @returns the original values of instance which were changed - */ - _realizeGroupTransformOnObject: function(instance) { - if (instance.group && instance.group.type === 'activeSelection' && this._activeObject === instance.group) { - var layoutProps = ['angle', 'flipX', 'flipY', 'left', 'scaleX', 'scaleY', 'skewX', 'skewY', 'top']; - //Copy all the positionally relevant properties across now - var originalValues = {}; - layoutProps.forEach(function(prop) { - originalValues[prop] = instance[prop]; - }); - fabric.util.addTransformToObject(instance, this._activeObject.calcOwnMatrix()); - return originalValues; - } - else { - return null; - } - }, - - /** - * Restores the changed properties of instance - * @private - * @param {fabric.Object} [instance] the object to un-transform (gets mutated) - * @param {Object} [originalValues] the original values of instance, as returned by _realizeGroupTransformOnObject - */ - _unwindGroupTransformOnObject: function(instance, originalValues) { - if (originalValues) { - instance.set(originalValues); - } - }, - - /** - * @private - */ - _setSVGObject: function(markup, instance, reviver) { - //If the object is in a selection group, simulate what would happen to that - //object when the group is deselected - var originalProperties = this._realizeGroupTransformOnObject(instance); - this.callSuper('_setSVGObject', markup, instance, reviver); - this._unwindGroupTransformOnObject(instance, originalProperties); - }, - - setViewportTransform: function (vpt) { - if (this.renderOnAddRemove && this._activeObject && this._activeObject.isEditing) { - this._activeObject.clearContextTop(); - } - fabric.StaticCanvas.prototype.setViewportTransform.call(this, vpt); - } - }); - - // copying static properties manually to work around Opera's bug, - // where "prototype" property is enumerable and overrides existing prototype - for (var prop in fabric.StaticCanvas) { - if (prop !== 'prototype') { - fabric.Canvas[prop] = fabric.StaticCanvas[prop]; - } - } -})(); - - -(function() { - - var addListener = fabric.util.addListener, - removeListener = fabric.util.removeListener, - RIGHT_CLICK = 3, MIDDLE_CLICK = 2, LEFT_CLICK = 1, - addEventOptions = { passive: false }; - - function checkClick(e, value) { - return e.button && (e.button === value - 1); - } - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * Contains the id of the touch event that owns the fabric transform - * @type Number - * @private - */ - mainTouchId: null, - - /** - * Adds mouse listeners to canvas - * @private - */ - _initEventListeners: function () { - // in case we initialized the class twice. This should not happen normally - // but in some kind of applications where the canvas element may be changed - // this is a workaround to having double listeners. - this.removeListeners(); - this._bindEvents(); - this.addOrRemove(addListener, 'add'); - }, - - /** - * return an event prefix pointer or mouse. - * @private - */ - _getEventPrefix: function () { - return this.enablePointerEvents ? 'pointer' : 'mouse'; - }, - - addOrRemove: function(functor, eventjsFunctor) { - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - functor(fabric.window, 'resize', this._onResize); - functor(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - functor(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - functor(canvasElement, eventTypePrefix + 'out', this._onMouseOut); - functor(canvasElement, eventTypePrefix + 'enter', this._onMouseEnter); - functor(canvasElement, 'wheel', this._onMouseWheel); - functor(canvasElement, 'contextmenu', this._onContextMenu); - functor(canvasElement, 'dblclick', this._onDoubleClick); - functor(canvasElement, 'dragover', this._onDragOver); - functor(canvasElement, 'dragenter', this._onDragEnter); - functor(canvasElement, 'dragleave', this._onDragLeave); - functor(canvasElement, 'drop', this._onDrop); - if (!this.enablePointerEvents) { - functor(canvasElement, 'touchstart', this._onTouchStart, addEventOptions); - } - if (typeof eventjs !== 'undefined' && eventjsFunctor in eventjs) { - eventjs[eventjsFunctor](canvasElement, 'gesture', this._onGesture); - eventjs[eventjsFunctor](canvasElement, 'drag', this._onDrag); - eventjs[eventjsFunctor](canvasElement, 'orientation', this._onOrientationChange); - eventjs[eventjsFunctor](canvasElement, 'shake', this._onShake); - eventjs[eventjsFunctor](canvasElement, 'longpress', this._onLongPress); - } - }, - - /** - * Removes all event listeners - */ - removeListeners: function() { - this.addOrRemove(removeListener, 'remove'); - // if you dispose on a mouseDown, before mouse up, you need to clean document to... - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - }, - - /** - * @private - */ - _bindEvents: function() { - if (this.eventsBound) { - // for any reason we pass here twice we do not want to bind events twice. - return; - } - this._onMouseDown = this._onMouseDown.bind(this); - this._onTouchStart = this._onTouchStart.bind(this); - this._onMouseMove = this._onMouseMove.bind(this); - this._onMouseUp = this._onMouseUp.bind(this); - this._onTouchEnd = this._onTouchEnd.bind(this); - this._onResize = this._onResize.bind(this); - this._onGesture = this._onGesture.bind(this); - this._onDrag = this._onDrag.bind(this); - this._onShake = this._onShake.bind(this); - this._onLongPress = this._onLongPress.bind(this); - this._onOrientationChange = this._onOrientationChange.bind(this); - this._onMouseWheel = this._onMouseWheel.bind(this); - this._onMouseOut = this._onMouseOut.bind(this); - this._onMouseEnter = this._onMouseEnter.bind(this); - this._onContextMenu = this._onContextMenu.bind(this); - this._onDoubleClick = this._onDoubleClick.bind(this); - this._onDragOver = this._onDragOver.bind(this); - this._onDragEnter = this._simpleEventHandler.bind(this, 'dragenter'); - this._onDragLeave = this._simpleEventHandler.bind(this, 'dragleave'); - this._onDrop = this._onDrop.bind(this); - this.eventsBound = true; - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js gesture - * @param {Event} [self] Inner Event object - */ - _onGesture: function(e, self) { - this.__onTransformGesture && this.__onTransformGesture(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js drag - * @param {Event} [self] Inner Event object - */ - _onDrag: function(e, self) { - this.__onDrag && this.__onDrag(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on wheel event - */ - _onMouseWheel: function(e) { - this.__onMouseWheel(e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseOut: function(e) { - var target = this._hoveredTarget; - this.fire('mouse:out', { target: target, e: e }); - this._hoveredTarget = null; - target && target.fire('mouseout', { e: e }); - - var _this = this; - this._hoveredTargets.forEach(function(_target){ - _this.fire('mouse:out', { target: target, e: e }); - _target && target.fire('mouseout', { e: e }); - }); - this._hoveredTargets = []; - - if (this._iTextInstances) { - this._iTextInstances.forEach(function(obj) { - if (obj.isEditing) { - obj.hiddenTextarea.focus(); - } - }); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mouseenter - */ - _onMouseEnter: function(e) { - // This find target and consequent 'mouse:over' is used to - // clear old instances on hovered target. - // calling findTarget has the side effect of killing target.__corner. - // as a short term fix we are not firing this if we are currently transforming. - // as a long term fix we need to separate the action of finding a target with the - // side effects we added to it. - if (!this._currentTransform && !this.findTarget(e)) { - this.fire('mouse:over', { target: null, e: e }); - this._hoveredTarget = null; - this._hoveredTargets = []; - } - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js orientation change - * @param {Event} [self] Inner Event object - */ - _onOrientationChange: function(e, self) { - this.__onOrientationChange && this.__onOrientationChange(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onShake: function(e, self) { - this.__onShake && this.__onShake(e, self); - }, - - /** - * @private - * @param {Event} [e] Event object fired on Event.js shake - * @param {Event} [self] Inner Event object - */ - _onLongPress: function(e, self) { - this.__onLongPress && this.__onLongPress(e, self); - }, - - /** - * prevent default to allow drop event to be fired - * @private - * @param {Event} [e] Event object fired on Event.js shake - */ - _onDragOver: function(e) { - e.preventDefault(); - var target = this._simpleEventHandler('dragover', e); - this._fireEnterLeaveEvents(target, e); - }, - - /** - * `drop:before` is a an event that allow you to schedule logic - * before the `drop` event. Prefer `drop` event always, but if you need - * to run some drop-disabling logic on an event, since there is no way - * to handle event handlers ordering, use `drop:before` - * @param {Event} e - */ - _onDrop: function (e) { - this._simpleEventHandler('drop:before', e); - return this._simpleEventHandler('drop', e); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onContextMenu: function (e) { - if (this.stopContextMenu) { - e.stopPropagation(); - e.preventDefault(); - } - return false; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onDoubleClick: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'dblclick'); - this._resetTransformEventData(e); - }, - - /** - * Return a the id of an event. - * returns either the pointerId or the identifier or 0 for the mouse event - * @private - * @param {Event} evt Event object - */ - getPointerId: function(evt) { - var changedTouches = evt.changedTouches; - - if (changedTouches) { - return changedTouches[0] && changedTouches[0].identifier; - } - - if (this.enablePointerEvents) { - return evt.pointerId; - } - - return -1; - }, - - /** - * Determines if an event has the id of the event that is considered main - * @private - * @param {evt} event Event object - */ - _isMainEvent: function(evt) { - if (evt.isPrimary === true) { - return true; - } - if (evt.isPrimary === false) { - return false; - } - if (evt.type === 'touchend' && evt.touches.length === 0) { - return true; - } - if (evt.changedTouches) { - return evt.changedTouches[0].identifier === this.mainTouchId; - } - return true; - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchStart: function(e) { - e.preventDefault(); - if (this.mainTouchId === null) { - this.mainTouchId = this.getPointerId(e); - } - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - addListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - addListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - // Unbind mousedown to prevent double triggers from touch devices - removeListener(canvasElement, eventTypePrefix + 'down', this._onMouseDown); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDown: function (e) { - this.__onMouseDown(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - removeListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - addListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onTouchEnd: function(e) { - if (e.touches.length > 0) { - // if there are still touches stop here - return; - } - this.__onMouseUp(e); - this._resetTransformEventData(); - this.mainTouchId = null; - var eventTypePrefix = this._getEventPrefix(); - removeListener(fabric.document, 'touchend', this._onTouchEnd, addEventOptions); - removeListener(fabric.document, 'touchmove', this._onMouseMove, addEventOptions); - var _this = this; - if (this._willAddMouseDown) { - clearTimeout(this._willAddMouseDown); - } - this._willAddMouseDown = setTimeout(function() { - // Wait 400ms before rebinding mousedown to prevent double triggers - // from touch devices - addListener(_this.upperCanvasEl, eventTypePrefix + 'down', _this._onMouseDown); - _this._willAddMouseDown = 0; - }, 400); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUp: function (e) { - this.__onMouseUp(e); - this._resetTransformEventData(); - var canvasElement = this.upperCanvasEl, - eventTypePrefix = this._getEventPrefix(); - if (this._isMainEvent(e)) { - removeListener(fabric.document, eventTypePrefix + 'up', this._onMouseUp); - removeListener(fabric.document, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - addListener(canvasElement, eventTypePrefix + 'move', this._onMouseMove, addEventOptions); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMove: function (e) { - !this.allowTouchScrolling && e.preventDefault && e.preventDefault(); - this.__onMouseMove(e); - }, - - /** - * @private - */ - _onResize: function () { - this.calcOffset(); - }, - - /** - * Decides whether the canvas should be redrawn in mouseup and mousedown events. - * @private - * @param {Object} target - */ - _shouldRender: function(target) { - var activeObject = this._activeObject; - - if ( - !!activeObject !== !!target || - (activeObject && target && (activeObject !== target)) - ) { - // this covers: switch of target, from target to no target, selection of target - // multiSelection with key and mouse - return true; - } - else if (activeObject && activeObject.isEditing) { - // if we mouse up/down over a editing textbox a cursor change, - // there is no need to re render - return false; - } - return false; - }, - - /** - * Method that defines the actions when mouse is released on canvas. - * The method resets the currentTransform parameters, store the image corner - * position in the image object and render the canvas on top. - * @private - * @param {Event} e Event object fired on mouseup - */ - __onMouseUp: function (e) { - var target, transform = this._currentTransform, - groupSelector = this._groupSelector, shouldRender = false, - isClick = (!groupSelector || (groupSelector.left === 0 && groupSelector.top === 0)); - this._cacheTransformEventData(e); - target = this._target; - this._handleEvent(e, 'up:before'); - // if right/middle click just fire events and return - // target undefined will make the _handleEvent search the target - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'up', RIGHT_CLICK, isClick); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'up', MIDDLE_CLICK, isClick); - } - this._resetTransformEventData(); - return; - } - - if (this.isDrawingMode && this._isCurrentlyDrawing) { - this._onMouseUpInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - if (transform) { - this._finalizeCurrentTransform(e); - shouldRender = transform.actionPerformed; - } - if (!isClick) { - var targetWasActive = target === this._activeObject; - this._maybeGroupObjects(e); - if (!shouldRender) { - shouldRender = ( - this._shouldRender(target) || - (!targetWasActive && target === this._activeObject) - ); - } - } - var corner, pointer; - if (target) { - corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - if (target.selectable && target !== this._activeObject && target.activeOn === 'up') { - this.setActiveObject(target, e); - shouldRender = true; - } - else { - var control = target.controls[corner], - mouseUpHandler = control && control.getMouseUpHandler(e, target, control); - if (mouseUpHandler) { - pointer = this.getPointer(e); - mouseUpHandler(e, transform, pointer.x, pointer.y); - } - } - target.isMoving = false; - } - // if we are ending up a transform on a different control or a new object - // fire the original mouse up from the corner that started the transform - if (transform && (transform.target !== target || transform.corner !== corner)) { - var originalControl = transform.target && transform.target.controls[transform.corner], - originalMouseUpHandler = originalControl && originalControl.getMouseUpHandler(e, target, control); - pointer = pointer || this.getPointer(e); - originalMouseUpHandler && originalMouseUpHandler(e, transform, pointer.x, pointer.y); - } - this._setCursorFromEvent(e, target); - this._handleEvent(e, 'up', LEFT_CLICK, isClick); - this._groupSelector = null; - this._currentTransform = null; - // reset the target information about which corner is selected - target && (target.__corner = 0); - if (shouldRender) { - this.requestRenderAll(); - } - else if (!isClick) { - this.renderTop(); - } - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @return {Fabric.Object} target return the the target found, for internal reasons. - */ - _simpleEventHandler: function(eventType, e) { - var target = this.findTarget(e), - targets = this.targets, - options = { - e: e, - target: target, - subTargets: targets, - }; - this.fire(eventType, options); - target && target.fire(eventType, options); - if (!targets) { - return target; - } - for (var i = 0; i < targets.length; i++) { - targets[i].fire(eventType, options); - } - return target; - }, - - /** - * @private - * Handle event firing for target and subtargets - * @param {Event} e event from mouse - * @param {String} eventType event to fire (up, down or move) - * @param {fabric.Object} targetObj receiving event - * @param {Number} [button] button used in the event 1 = left, 2 = middle, 3 = right - * @param {Boolean} isClick for left button only, indicates that the mouse up happened without move. - */ - _handleEvent: function(e, eventType, button, isClick) { - var target = this._target, - targets = this.targets || [], - options = { - e: e, - target: target, - subTargets: targets, - button: button || LEFT_CLICK, - isClick: isClick || false, - pointer: this._pointer, - absolutePointer: this._absolutePointer, - transform: this._currentTransform - }; - if (eventType === 'up') { - options.currentTarget = this.findTarget(e); - options.currentSubTargets = this.targets; - } - this.fire('mouse:' + eventType, options); - target && target.fire('mouse' + eventType, options); - for (var i = 0; i < targets.length; i++) { - targets[i].fire('mouse' + eventType, options); - } - }, - - /** - * @private - * @param {Event} e send the mouse event that generate the finalize down, so it can be used in the event - */ - _finalizeCurrentTransform: function(e) { - - var transform = this._currentTransform, - target = transform.target, - options = { - e: e, - target: target, - transform: transform, - action: transform.action, - }; - - if (target._scaling) { - target._scaling = false; - } - - target.setCoords(); - - if (transform.actionPerformed || (this.stateful && target.hasStateChanged())) { - this._fire('modified', options); - } - }, - - /** - * @private - * @param {Event} e Event object fired on mousedown - */ - _onMouseDownInDrawingMode: function(e) { - this._isCurrentlyDrawing = true; - if (this.getActiveObject()) { - this.discardActiveObject(e).requestRenderAll(); - } - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseDown(pointer, { e: e, pointer: pointer }); - this._handleEvent(e, 'down'); - }, - - /** - * @private - * @param {Event} e Event object fired on mousemove - */ - _onMouseMoveInDrawingMode: function(e) { - if (this._isCurrentlyDrawing) { - var pointer = this.getPointer(e); - this.freeDrawingBrush.onMouseMove(pointer, { e: e, pointer: pointer }); - } - this.setCursor(this.freeDrawingCursor); - this._handleEvent(e, 'move'); - }, - - /** - * @private - * @param {Event} e Event object fired on mouseup - */ - _onMouseUpInDrawingMode: function(e) { - var pointer = this.getPointer(e); - this._isCurrentlyDrawing = this.freeDrawingBrush.onMouseUp({ e: e, pointer: pointer }); - this._handleEvent(e, 'up'); - }, - - /** - * Method that defines the actions when mouse is clicked on canvas. - * The method inits the currentTransform parameters and renders all the - * canvas so the current image can be placed on the top canvas and the rest - * in on the container one. - * @private - * @param {Event} e Event object fired on mousedown - */ - __onMouseDown: function (e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'down:before'); - var target = this._target; - // if right click just fire events - if (checkClick(e, RIGHT_CLICK)) { - if (this.fireRightClick) { - this._handleEvent(e, 'down', RIGHT_CLICK); - } - return; - } - - if (checkClick(e, MIDDLE_CLICK)) { - if (this.fireMiddleClick) { - this._handleEvent(e, 'down', MIDDLE_CLICK); - } - return; - } - - if (this.isDrawingMode) { - this._onMouseDownInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - // ignore if some object is being transformed at this moment - if (this._currentTransform) { - return; - } - - var pointer = this._pointer; - // save pointer for check in __onMouseUp event - this._previousPointer = pointer; - var shouldRender = this._shouldRender(target), - shouldGroup = this._shouldGroup(e, target); - if (this._shouldClearSelection(e, target)) { - this.discardActiveObject(e); - } - else if (shouldGroup) { - this._handleGrouping(e, target); - target = this._activeObject; - } - - if (this.selection && (!target || - (!target.selectable && !target.isEditing && target !== this._activeObject))) { - this._groupSelector = { - ex: this._absolutePointer.x, - ey: this._absolutePointer.y, - top: 0, - left: 0 - }; - } - - if (target) { - var alreadySelected = target === this._activeObject; - if (target.selectable && target.activeOn === 'down') { - this.setActiveObject(target, e); - } - var corner = target._findTargetCorner( - this.getPointer(e, true), - fabric.util.isTouchEvent(e) - ); - target.__corner = corner; - if (target === this._activeObject && (corner || !shouldGroup)) { - this._setupCurrentTransform(e, target, alreadySelected); - var control = target.controls[corner], - pointer = this.getPointer(e), - mouseDownHandler = control && control.getMouseDownHandler(e, target, control); - if (mouseDownHandler) { - mouseDownHandler(e, this._currentTransform, pointer.x, pointer.y); - } - } - } - this._handleEvent(e, 'down'); - // we must renderAll so that we update the visuals - (shouldRender || shouldGroup) && this.requestRenderAll(); - }, - - /** - * reset cache form common information needed during event processing - * @private - */ - _resetTransformEventData: function() { - this._target = null; - this._pointer = null; - this._absolutePointer = null; - }, - - /** - * Cache common information needed during event processing - * @private - * @param {Event} e Event object fired on event - */ - _cacheTransformEventData: function(e) { - // reset in order to avoid stale caching - this._resetTransformEventData(); - this._pointer = this.getPointer(e, true); - this._absolutePointer = this.restorePointerVpt(this._pointer); - this._target = this._currentTransform ? this._currentTransform.target : this.findTarget(e) || null; - }, - - /** - * @private - */ - _beforeTransform: function(e) { - var t = this._currentTransform; - this.stateful && t.target.saveState(); - this.fire('before:transform', { - e: e, - transform: t, - }); - }, - - /** - * Method that defines the actions when mouse is hovering the canvas. - * The currentTransform parameter will define whether the user is rotating/scaling/translating - * an image or neither of them (only hovering). A group selection is also possible and would cancel - * all any other type of action. - * In case of an image transformation only the top canvas will be rendered. - * @private - * @param {Event} e Event object fired on mousemove - */ - __onMouseMove: function (e) { - this._handleEvent(e, 'move:before'); - this._cacheTransformEventData(e); - var target, pointer; - - if (this.isDrawingMode) { - this._onMouseMoveInDrawingMode(e); - return; - } - - if (!this._isMainEvent(e)) { - return; - } - - var groupSelector = this._groupSelector; - - // We initially clicked in an empty area, so we draw a box for multiple selection - if (groupSelector) { - pointer = this._absolutePointer; - - groupSelector.left = pointer.x - groupSelector.ex; - groupSelector.top = pointer.y - groupSelector.ey; - - this.renderTop(); - } - else if (!this._currentTransform) { - target = this.findTarget(e) || null; - this._setCursorFromEvent(e, target); - this._fireOverOutEvents(target, e); - } - else { - this._transformObject(e); - } - this._handleEvent(e, 'move'); - this._resetTransformEventData(); - }, - - /** - * Manage the mouseout, mouseover events for the fabric object on the canvas - * @param {Fabric.Object} target the target where the target from the mousemove event - * @param {Event} e Event object fired on mousemove - * @private - */ - _fireOverOutEvents: function(target, e) { - var _hoveredTarget = this._hoveredTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _hoveredTarget, - evtOut: 'mouseout', - canvasEvtOut: 'mouse:out', - evtIn: 'mouseover', - canvasEvtIn: 'mouse:over', - }); - for (var i = 0; i < length; i++){ - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'mouseout', - evtIn: 'mouseover', - }); - } - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - }, - - /** - * Manage the dragEnter, dragLeave events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the onDrag event - * @param {Event} e Event object fired on ondrag - * @private - */ - _fireEnterLeaveEvents: function(target, e) { - var _draggedoverTarget = this._draggedoverTarget, - _hoveredTargets = this._hoveredTargets, targets = this.targets, - length = Math.max(_hoveredTargets.length, targets.length); - - this.fireSyntheticInOutEvents(target, e, { - oldTarget: _draggedoverTarget, - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - for (var i = 0; i < length; i++) { - this.fireSyntheticInOutEvents(targets[i], e, { - oldTarget: _hoveredTargets[i], - evtOut: 'dragleave', - evtIn: 'dragenter', - }); - } - this._draggedoverTarget = target; - }, - - /** - * Manage the synthetic in/out events for the fabric objects on the canvas - * @param {Fabric.Object} target the target where the target from the supported events - * @param {Event} e Event object fired - * @param {Object} config configuration for the function to work - * @param {String} config.targetName property on the canvas where the old target is stored - * @param {String} [config.canvasEvtOut] name of the event to fire at canvas level for out - * @param {String} config.evtOut name of the event to fire for out - * @param {String} [config.canvasEvtIn] name of the event to fire at canvas level for in - * @param {String} config.evtIn name of the event to fire for in - * @private - */ - fireSyntheticInOutEvents: function(target, e, config) { - var inOpt, outOpt, oldTarget = config.oldTarget, outFires, inFires, - targetChanged = oldTarget !== target, canvasEvtIn = config.canvasEvtIn, canvasEvtOut = config.canvasEvtOut; - if (targetChanged) { - inOpt = { e: e, target: target, previousTarget: oldTarget }; - outOpt = { e: e, target: oldTarget, nextTarget: target }; - } - inFires = target && targetChanged; - outFires = oldTarget && targetChanged; - if (outFires) { - canvasEvtOut && this.fire(canvasEvtOut, outOpt); - oldTarget.fire(config.evtOut, outOpt); - } - if (inFires) { - canvasEvtIn && this.fire(canvasEvtIn, inOpt); - target.fire(config.evtIn, inOpt); - } - }, - - /** - * Method that defines actions when an Event Mouse Wheel - * @param {Event} e Event object fired on mouseup - */ - __onMouseWheel: function(e) { - this._cacheTransformEventData(e); - this._handleEvent(e, 'wheel'); - this._resetTransformEventData(); - }, - - /** - * @private - * @param {Event} e Event fired on mousemove - */ - _transformObject: function(e) { - var pointer = this.getPointer(e), - transform = this._currentTransform; - - transform.reset = false; - transform.shiftKey = e.shiftKey; - transform.altKey = e[this.centeredKey]; - - this._performTransformAction(e, transform, pointer); - transform.actionPerformed && this.requestRenderAll(); - }, - - /** - * @private - */ - _performTransformAction: function(e, transform, pointer) { - var x = pointer.x, - y = pointer.y, - action = transform.action, - actionPerformed = false, - actionHandler = transform.actionHandler; - // this object could be created from the function in the control handlers - - - if (actionHandler) { - actionPerformed = actionHandler(e, transform, x, y); - } - if (action === 'drag' && actionPerformed) { - transform.target.isMoving = true; - this.setCursor(transform.target.moveCursor || this.moveCursor); - } - transform.actionPerformed = transform.actionPerformed || actionPerformed; - }, - - /** - * @private - */ - _fire: fabric.controlsUtils.fireEvent, - - /** - * Sets the cursor depending on where the canvas is being hovered. - * Note: very buggy in Opera - * @param {Event} e Event object - * @param {Object} target Object that the mouse is hovering, if so. - */ - _setCursorFromEvent: function (e, target) { - if (!target) { - this.setCursor(this.defaultCursor); - return false; - } - var hoverCursor = target.hoverCursor || this.hoverCursor, - activeSelection = this._activeObject && this._activeObject.type === 'activeSelection' ? - this._activeObject : null, - // only show proper corner when group selection is not active - corner = (!activeSelection || !activeSelection.contains(target)) - // here we call findTargetCorner always with undefined for the touch parameter. - // we assume that if you are using a cursor you do not need to interact with - // the bigger touch area. - && target._findTargetCorner(this.getPointer(e, true)); - - if (!corner) { - if (target.subTargetCheck){ - // hoverCursor should come from top-most subTarget, - // so we walk the array backwards - this.targets.concat().reverse().map(function(_target){ - hoverCursor = _target.hoverCursor || hoverCursor; - }); - } - this.setCursor(hoverCursor); - } - else { - this.setCursor(this.getCornerCursor(corner, target, e)); - } - }, - - /** - * @private - */ - getCornerCursor: function(corner, target, e) { - var control = target.controls[corner]; - return control.cursorStyleHandler(e, control, target); - } - }); -})(); - - -(function() { - - var min = Math.min, - max = Math.max; - - fabric.util.object.extend(fabric.Canvas.prototype, /** @lends fabric.Canvas.prototype */ { - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - * @return {Boolean} - */ - _shouldGroup: function(e, target) { - var activeObject = this._activeObject; - return activeObject && this._isSelectionKeyPressed(e) && target && target.selectable && this.selection && - (activeObject !== target || activeObject.type === 'activeSelection') && !target.onSelect({ e: e }); - }, - - /** - * @private - * @param {Event} e Event object - * @param {fabric.Object} target - */ - _handleGrouping: function (e, target) { - var activeObject = this._activeObject; - // avoid multi select when shift click on a corner - if (activeObject.__corner) { - return; - } - if (target === activeObject) { - // if it's a group, find target again, using activeGroup objects - target = this.findTarget(e, true); - // if even object is not found or we are on activeObjectCorner, bail out - if (!target || !target.selectable) { - return; - } - } - if (activeObject && activeObject.type === 'activeSelection') { - this._updateActiveSelection(target, e); - } - else { - this._createActiveSelection(target, e); - } - }, - - /** - * @private - */ - _updateActiveSelection: function(target, e) { - var activeSelection = this._activeObject, - currentActiveObjects = activeSelection._objects.slice(0); - if (activeSelection.contains(target)) { - activeSelection.removeWithUpdate(target); - this._hoveredTarget = target; - this._hoveredTargets = this.targets.concat(); - if (activeSelection.size() === 1) { - // activate last remaining object - this._setActiveObject(activeSelection.item(0), e); - } - } - else { - activeSelection.addWithUpdate(target); - this._hoveredTarget = activeSelection; - this._hoveredTargets = this.targets.concat(); - } - this._fireSelectionEvents(currentActiveObjects, e); - }, - - /** - * @private - */ - _createActiveSelection: function(target, e) { - var currentActives = this.getActiveObjects(), group = this._createGroup(target); - this._hoveredTarget = group; - // ISSUE 4115: should we consider subTargets here? - // this._hoveredTargets = []; - // this._hoveredTargets = this.targets.concat(); - this._setActiveObject(group, e); - this._fireSelectionEvents(currentActives, e); - }, - - /** - * @private - * @param {Object} target - */ - _createGroup: function(target) { - var objects = this._objects, - isActiveLower = objects.indexOf(this._activeObject) < objects.indexOf(target), - groupObjects = isActiveLower - ? [this._activeObject, target] - : [target, this._activeObject]; - this._activeObject.isEditing && this._activeObject.exitEditing(); - return new fabric.ActiveSelection(groupObjects, { - canvas: this - }); - }, - - /** - * @private - * @param {Event} e mouse event - */ - _groupSelectedObjects: function (e) { - - var group = this._collectObjects(e), - aGroup; - - // do not create group for 1 element only - if (group.length === 1) { - this.setActiveObject(group[0], e); - } - else if (group.length > 1) { - aGroup = new fabric.ActiveSelection(group.reverse(), { - canvas: this - }); - this.setActiveObject(aGroup, e); - } - }, - - /** - * @private - */ - _collectObjects: function(e) { - var group = [], - currentObject, - x1 = this._groupSelector.ex, - y1 = this._groupSelector.ey, - x2 = x1 + this._groupSelector.left, - y2 = y1 + this._groupSelector.top, - selectionX1Y1 = new fabric.Point(min(x1, x2), min(y1, y2)), - selectionX2Y2 = new fabric.Point(max(x1, x2), max(y1, y2)), - allowIntersect = !this.selectionFullyContained, - isClick = x1 === x2 && y1 === y2; - // we iterate reverse order to collect top first in case of click. - for (var i = this._objects.length; i--; ) { - currentObject = this._objects[i]; - - if (!currentObject || !currentObject.selectable || !currentObject.visible) { - continue; - } - - if ((allowIntersect && currentObject.intersectsWithRect(selectionX1Y1, selectionX2Y2, true)) || - currentObject.isContainedWithinRect(selectionX1Y1, selectionX2Y2, true) || - (allowIntersect && currentObject.containsPoint(selectionX1Y1, null, true)) || - (allowIntersect && currentObject.containsPoint(selectionX2Y2, null, true)) - ) { - group.push(currentObject); - // only add one object if it's a click - if (isClick) { - break; - } - } - } - - if (group.length > 1) { - group = group.filter(function(object) { - return !object.onSelect({ e: e }); - }); - } - - return group; - }, - - /** - * @private - */ - _maybeGroupObjects: function(e) { - if (this.selection && this._groupSelector) { - this._groupSelectedObjects(e); - } - this.setCursor(this.defaultCursor); - // clear selection and current transformation - this._groupSelector = null; - } - }); - -})(); - - -(function () { - fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Exports canvas element to a dataurl image. Note that when multiplier is used, cropping is scaled appropriately - * @param {Object} [options] Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by, to have consistent - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 2.0.0 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - * @see {@link http://jsfiddle.net/fabricjs/NfZVb/|jsFiddle demo} - * @example Generate jpeg dataURL with lower quality - * var dataURL = canvas.toDataURL({ - * format: 'jpeg', - * quality: 0.8 - * }); - * @example Generate cropped png dataURL (clipping of canvas) - * var dataURL = canvas.toDataURL({ - * format: 'png', - * left: 100, - * top: 100, - * width: 200, - * height: 200 - * }); - * @example Generate double scaled png dataURL - * var dataURL = canvas.toDataURL({ - * format: 'png', - * multiplier: 2 - * }); - */ - toDataURL: function (options) { - options || (options = { }); - - var format = options.format || 'png', - quality = options.quality || 1, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? this.getRetinaScaling() : 1), - canvasEl = this.toCanvasElement(multiplier, options); - return fabric.util.toDataURL(canvasEl, format, quality); - }, - - /** - * Create a new HTMLCanvas element painted with the current canvas content. - * No need to resize the actual one or repaint it. - * Will transfer object ownership to a new canvas, paint it, and set everything back. - * This is an intermediary step used to get to a dataUrl but also it is useful to - * create quick image copies of a canvas without passing for the dataUrl string - * @param {Number} [multiplier] a zoom factor. - * @param {Object} [cropping] Cropping informations - * @param {Number} [cropping.left] Cropping left offset. - * @param {Number} [cropping.top] Cropping top offset. - * @param {Number} [cropping.width] Cropping width. - * @param {Number} [cropping.height] Cropping height. - */ - toCanvasElement: function(multiplier, cropping) { - multiplier = multiplier || 1; - cropping = cropping || { }; - var scaledWidth = (cropping.width || this.width) * multiplier, - scaledHeight = (cropping.height || this.height) * multiplier, - zoom = this.getZoom(), - originalWidth = this.width, - originalHeight = this.height, - newZoom = zoom * multiplier, - vp = this.viewportTransform, - translateX = (vp[4] - (cropping.left || 0)) * multiplier, - translateY = (vp[5] - (cropping.top || 0)) * multiplier, - originalInteractive = this.interactive, - newVp = [newZoom, 0, 0, newZoom, translateX, translateY], - originalRetina = this.enableRetinaScaling, - canvasEl = fabric.util.createCanvasElement(), - originalContextTop = this.contextTop; - canvasEl.width = scaledWidth; - canvasEl.height = scaledHeight; - this.contextTop = null; - this.enableRetinaScaling = false; - this.interactive = false; - this.viewportTransform = newVp; - this.width = scaledWidth; - this.height = scaledHeight; - this.calcViewportBoundaries(); - this.renderCanvas(canvasEl.getContext('2d'), this._objects); - this.viewportTransform = vp; - this.width = originalWidth; - this.height = originalHeight; - this.calcViewportBoundaries(); - this.interactive = originalInteractive; - this.enableRetinaScaling = originalRetina; - this.contextTop = originalContextTop; - return canvasEl; - }, - }); - -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - /** - * Populates canvas with data from the specified JSON. - * JSON format must conform to the one of {@link fabric.Canvas#toJSON} - * @param {String|Object} json JSON string or object - * @param {Function} callback Callback, invoked when json is parsed - * and corresponding objects (e.g: {@link fabric.Image}) - * are initialized - * @param {Function} [reviver] Method for further parsing of JSON elements, called after each fabric object created. - * @return {fabric.Canvas} instance - * @chainable - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#deserialization} - * @see {@link http://jsfiddle.net/fabricjs/fmgXt/|jsFiddle demo} - * @example loadFromJSON - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas)); - * @example loadFromJSON with reviver - * canvas.loadFromJSON(json, canvas.renderAll.bind(canvas), function(o, object) { - * // `o` = json object - * // `object` = fabric.Object instance - * // ... do some stuff ... - * }); - */ - loadFromJSON: function (json, callback, reviver) { - if (!json) { - return; - } - - // serialize if it wasn't already - var serialized = (typeof json === 'string') - ? JSON.parse(json) - : fabric.util.object.clone(json); - - var _this = this, - clipPath = serialized.clipPath, - renderOnAddRemove = this.renderOnAddRemove; - - this.renderOnAddRemove = false; - - delete serialized.clipPath; - - this._enlivenObjects(serialized.objects, function (enlivenedObjects) { - _this.clear(); - _this._setBgOverlay(serialized, function () { - if (clipPath) { - _this._enlivenObjects([clipPath], function (enlivenedCanvasClip) { - _this.clipPath = enlivenedCanvasClip[0]; - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - }); - } - else { - _this.__setupCanvas.call(_this, serialized, enlivenedObjects, renderOnAddRemove, callback); - } - }); - }, reviver); - return this; - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Array} restored canvas objects - * @param {Function} cached renderOnAddRemove callback - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - __setupCanvas: function(serialized, enlivenedObjects, renderOnAddRemove, callback) { - var _this = this; - enlivenedObjects.forEach(function(obj, index) { - // we splice the array just in case some custom classes restored from JSON - // will add more object to canvas at canvas init. - _this.insertAt(obj, index); - }); - this.renderOnAddRemove = renderOnAddRemove; - // remove parts i cannot set as options - delete serialized.objects; - delete serialized.backgroundImage; - delete serialized.overlayImage; - delete serialized.background; - delete serialized.overlay; - // this._initOptions does too many things to just - // call it. Normally loading an Object from JSON - // create the Object instance. Here the Canvas is - // already an instance and we are just loading things over it - this._setOptions(serialized); - this.renderAll(); - callback && callback(); - }, - - /** - * @private - * @param {Object} serialized Object with background and overlay information - * @param {Function} callback Invoked after all background and overlay images/patterns loaded - */ - _setBgOverlay: function(serialized, callback) { - var loaded = { - backgroundColor: false, - overlayColor: false, - backgroundImage: false, - overlayImage: false - }; - - if (!serialized.backgroundImage && !serialized.overlayImage && !serialized.background && !serialized.overlay) { - callback && callback(); - return; - } - - var cbIfLoaded = function () { - if (loaded.backgroundImage && loaded.overlayImage && loaded.backgroundColor && loaded.overlayColor) { - callback && callback(); - } - }; - - this.__setBgOverlay('backgroundImage', serialized.backgroundImage, loaded, cbIfLoaded); - this.__setBgOverlay('overlayImage', serialized.overlayImage, loaded, cbIfLoaded); - this.__setBgOverlay('backgroundColor', serialized.background, loaded, cbIfLoaded); - this.__setBgOverlay('overlayColor', serialized.overlay, loaded, cbIfLoaded); - }, - - /** - * @private - * @param {String} property Property to set (backgroundImage, overlayImage, backgroundColor, overlayColor) - * @param {(Object|String)} value Value to set - * @param {Object} loaded Set loaded property to true if property is set - * @param {Object} callback Callback function to invoke after property is set - */ - __setBgOverlay: function(property, value, loaded, callback) { - var _this = this; - - if (!value) { - loaded[property] = true; - callback && callback(); - return; - } - - if (property === 'backgroundImage' || property === 'overlayImage') { - fabric.util.enlivenObjects([value], function(enlivedObject){ - _this[property] = enlivedObject[0]; - loaded[property] = true; - callback && callback(); - }); - } - else { - this['set' + fabric.util.string.capitalize(property, true)](value, function() { - loaded[property] = true; - callback && callback(); - }); - } - }, - - /** - * @private - * @param {Array} objects - * @param {Function} callback - * @param {Function} [reviver] - */ - _enlivenObjects: function (objects, callback, reviver) { - if (!objects || objects.length === 0) { - callback && callback([]); - return; - } - - fabric.util.enlivenObjects(objects, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, null, reviver); - }, - - /** - * @private - * @param {String} format - * @param {Function} callback - */ - _toDataURL: function (format, callback) { - this.clone(function (clone) { - callback(clone.toDataURL(format)); - }); - }, - - /** - * @private - * @param {String} format - * @param {Number} multiplier - * @param {Function} callback - */ - _toDataURLWithMultiplier: function (format, multiplier, callback) { - this.clone(function (clone) { - callback(clone.toDataURLWithMultiplier(format, multiplier)); - }); - }, - - /** - * Clones canvas instance - * @param {Object} [callback] Receives cloned instance as a first argument - * @param {Array} [properties] Array of properties to include in the cloned canvas and children - */ - clone: function (callback, properties) { - var data = JSON.stringify(this.toJSON(properties)); - this.cloneWithoutData(function(clone) { - clone.loadFromJSON(data, function() { - callback && callback(clone); - }); - }); - }, - - /** - * Clones canvas instance without cloning existing data. - * This essentially copies canvas dimensions, clipping properties, etc. - * but leaves data empty (so that you can populate it with your own) - * @param {Object} [callback] Receives cloned instance as a first argument - */ - cloneWithoutData: function(callback) { - var el = fabric.util.createCanvasElement(); - - el.width = this.width; - el.height = this.height; - - var clone = new fabric.Canvas(el); - if (this.backgroundImage) { - clone.setBackgroundImage(this.backgroundImage.src, function() { - clone.renderAll(); - callback && callback(clone); - }); - clone.backgroundImageOpacity = this.backgroundImageOpacity; - clone.backgroundImageStretch = this.backgroundImageStretch; - } - else { - callback && callback(clone); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed, - capitalize = fabric.util.string.capitalize, - degreesToRadians = fabric.util.degreesToRadians, - objectCaching = !fabric.isLikelyNode, - ALIASING_LIMIT = 2; - - if (fabric.Object) { - return; - } - - /** - * Root object class from which all 2d shape classes inherit from - * @class fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#objects} - * @see {@link fabric.Object#initialize} for constructor definition - * - * @fires added - * @fires removed - * - * @fires selected - * @fires deselected - * @fires modified - * @fires modified - * @fires moved - * @fires scaled - * @fires rotated - * @fires skewed - * - * @fires rotating - * @fires scaling - * @fires moving - * @fires skewing - * - * @fires mousedown - * @fires mouseup - * @fires mouseover - * @fires mouseout - * @fires mousewheel - * @fires mousedblclick - * - * @fires dragover - * @fires dragenter - * @fires dragleave - * @fires drop - */ - fabric.Object = fabric.util.createClass(fabric.CommonMethods, /** @lends fabric.Object.prototype */ { - - /** - * Type of an object (rect, circle, path, etc.). - * Note that this property is meant to be read-only and not meant to be modified. - * If you modify, certain parts of Fabric (such as JSON loading) won't work correctly. - * @type String - * @default - */ - type: 'object', - - /** - * Horizontal origin of transformation of an object (one of "left", "right", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originX: 'left', - - /** - * Vertical origin of transformation of an object (one of "top", "bottom", "center") - * See http://jsfiddle.net/1ow02gea/244/ on how originX/originY affect objects in groups - * @type String - * @default - */ - originY: 'top', - - /** - * Top position of an object. Note that by default it's relative to object top. You can change this by setting originY={top/center/bottom} - * @type Number - * @default - */ - top: 0, - - /** - * Left position of an object. Note that by default it's relative to object left. You can change this by setting originX={left/center/right} - * @type Number - * @default - */ - left: 0, - - /** - * Object width - * @type Number - * @default - */ - width: 0, - - /** - * Object height - * @type Number - * @default - */ - height: 0, - - /** - * Object scale factor (horizontal) - * @type Number - * @default - */ - scaleX: 1, - - /** - * Object scale factor (vertical) - * @type Number - * @default - */ - scaleY: 1, - - /** - * When true, an object is rendered as flipped horizontally - * @type Boolean - * @default - */ - flipX: false, - - /** - * When true, an object is rendered as flipped vertically - * @type Boolean - * @default - */ - flipY: false, - - /** - * Opacity of an object - * @type Number - * @default - */ - opacity: 1, - - /** - * Angle of rotation of an object (in degrees) - * @type Number - * @default - */ - angle: 0, - - /** - * Angle of skew on x axes of an object (in degrees) - * @type Number - * @default - */ - skewX: 0, - - /** - * Angle of skew on y axes of an object (in degrees) - * @type Number - * @default - */ - skewY: 0, - - /** - * Size of object's controlling corners (in pixels) - * @type Number - * @default - */ - cornerSize: 13, - - /** - * Size of object's controlling corners when touch interaction is detected - * @type Number - * @default - */ - touchCornerSize: 24, - - /** - * When true, object's controlling corners are rendered as transparent inside (i.e. stroke instead of fill) - * @type Boolean - * @default - */ - transparentCorners: true, - - /** - * Default cursor value used when hovering over this object on canvas - * @type String - * @default - */ - hoverCursor: null, - - /** - * Default cursor value used when moving this object on canvas - * @type String - * @default - */ - moveCursor: null, - - /** - * Padding between object and its controlling borders (in pixels) - * @type Number - * @default - */ - padding: 0, - - /** - * Color of controlling borders of an object (when it's active) - * @type String - * @default - */ - borderColor: 'rgb(178,204,255)', - - /** - * Array specifying dash pattern of an object's borders (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - borderDashArray: null, - - /** - * Color of controlling corners of an object (when it's active) - * @type String - * @default - */ - cornerColor: 'rgb(178,204,255)', - - /** - * Color of controlling corners of an object (when it's active and transparentCorners false) - * @since 1.6.2 - * @type String - * @default - */ - cornerStrokeColor: null, - - /** - * Specify style of control, 'rect' or 'circle' - * @since 1.6.2 - * @type String - */ - cornerStyle: 'rect', - - /** - * Array specifying dash pattern of an object's control (hasBorder must be true) - * @since 1.6.2 - * @type Array - */ - cornerDashArray: null, - - /** - * When true, this object will use center point as the origin of transformation - * when being scaled via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredScaling: false, - - /** - * When true, this object will use center point as the origin of transformation - * when being rotated via the controls. - * Backwards incompatibility note: This property replaces "centerTransform" (Boolean). - * @since 1.3.4 - * @type Boolean - * @default - */ - centeredRotation: true, - - /** - * Color of object's fill - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - fill: 'rgb(0,0,0)', - - /** - * Fill rule used to fill an object - * accepted values are nonzero, evenodd - * Backwards incompatibility note: This property was used for setting globalCompositeOperation until v1.4.12 (use `fabric.Object#globalCompositeOperation` instead) - * @type String - * @default - */ - fillRule: 'nonzero', - - /** - * Composite rule used for canvas globalCompositeOperation - * @type String - * @default - */ - globalCompositeOperation: 'source-over', - - /** - * Background color of an object. - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - backgroundColor: '', - - /** - * Selection Background color of an object. colored layer behind the object when it is active. - * does not mix good with globalCompositeOperation methods. - * @type String - * @default - */ - selectionBackgroundColor: '', - - /** - * When defined, an object is rendered via stroke and this property specifies its color - * takes css colors https://www.w3.org/TR/css-color-3/ - * @type String - * @default - */ - stroke: null, - - /** - * Width of a stroke used to render this object - * @type Number - * @default - */ - strokeWidth: 1, - - /** - * Array specifying dash pattern of an object's stroke (stroke must be defined) - * @type Array - */ - strokeDashArray: null, - - /** - * Line offset of an object's stroke - * @type Number - * @default - */ - strokeDashOffset: 0, - - /** - * Line endings style of an object's stroke (one of "butt", "round", "square") - * @type String - * @default - */ - strokeLineCap: 'butt', - - /** - * Corner style of an object's stroke (one of "bevel", "round", "miter") - * @type String - * @default - */ - strokeLineJoin: 'miter', - - /** - * Maximum miter length (used for strokeLineJoin = "miter") of an object's stroke - * @type Number - * @default - */ - strokeMiterLimit: 4, - - /** - * Shadow object representing shadow of this shape - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * Opacity of object's controlling borders when object is active and moving - * @type Number - * @default - */ - borderOpacityWhenMoving: 0.4, - - /** - * Scale factor of object's controlling borders - * bigger number will make a thicker border - * border is 1, so this is basically a border thickness - * since there is no way to change the border itself. - * @type Number - * @default - */ - borderScaleFactor: 1, - - /** - * Minimum allowed scale value of an object - * @type Number - * @default - */ - minScaleLimit: 0, - - /** - * When set to `false`, an object can not be selected for modification (using either point-click-based or group-based selection). - * But events still fire on it. - * @type Boolean - * @default - */ - selectable: true, - - /** - * When set to `false`, an object can not be a target of events. All events propagate through it. Introduced in v1.3.4 - * @type Boolean - * @default - */ - evented: true, - - /** - * When set to `false`, an object is not rendered on canvas - * @type Boolean - * @default - */ - visible: true, - - /** - * When set to `false`, object's controls are not displayed and can not be used to manipulate object - * @type Boolean - * @default - */ - hasControls: true, - - /** - * When set to `false`, object's controlling borders are not rendered - * @type Boolean - * @default - */ - hasBorders: true, - - /** - * When set to `true`, objects are "found" on canvas on per-pixel basis rather than according to bounding box - * @type Boolean - * @default - */ - perPixelTargetFind: false, - - /** - * When `false`, default object's values are not included in its serialization - * @type Boolean - * @default - */ - includeDefaultValues: true, - - /** - * When `true`, object horizontal movement is locked - * @type Boolean - * @default - */ - lockMovementX: false, - - /** - * When `true`, object vertical movement is locked - * @type Boolean - * @default - */ - lockMovementY: false, - - /** - * When `true`, object rotation is locked - * @type Boolean - * @default - */ - lockRotation: false, - - /** - * When `true`, object horizontal scaling is locked - * @type Boolean - * @default - */ - lockScalingX: false, - - /** - * When `true`, object vertical scaling is locked - * @type Boolean - * @default - */ - lockScalingY: false, - - /** - * When `true`, object horizontal skewing is locked - * @type Boolean - * @default - */ - lockSkewingX: false, - - /** - * When `true`, object vertical skewing is locked - * @type Boolean - * @default - */ - lockSkewingY: false, - - /** - * When `true`, object cannot be flipped by scaling into negative values - * @type Boolean - * @default - */ - lockScalingFlip: false, - - /** - * When `true`, object is not exported in OBJECT/JSON - * @since 1.6.3 - * @type Boolean - * @default - */ - excludeFromExport: false, - - /** - * When `true`, object is cached on an additional canvas. - * When `false`, object is not cached unless necessary ( clipPath ) - * default to true - * @since 1.7.0 - * @type Boolean - * @default true - */ - objectCaching: objectCaching, - - /** - * When `true`, object properties are checked for cache invalidation. In some particular - * situation you may want this to be disabled ( spray brush, very big, groups) - * or if your application does not allow you to modify properties for groups child you want - * to disable it for groups. - * default to false - * since 1.7.0 - * @type Boolean - * @default false - */ - statefullCache: false, - - /** - * When `true`, cache does not get updated during scaling. The picture will get blocky if scaled - * too much and will be redrawn with correct details at the end of scaling. - * this setting is performance and application dependant. - * default to true - * since 1.7.0 - * @type Boolean - * @default true - */ - noScaleCache: true, - - /** - * When `false`, the stoke width will scale with the object. - * When `true`, the stroke will always match the exact pixel size entered for stroke width. - * this Property does not work on Text classes or drawing call that uses strokeText,fillText methods - * default to false - * @since 2.6.0 - * @type Boolean - * @default false - * @type Boolean - * @default false - */ - strokeUniform: false, - - /** - * When set to `true`, object's cache will be rerendered next render call. - * since 1.7.0 - * @type Boolean - * @default true - */ - dirty: true, - - /** - * keeps the value of the last hovered corner during mouse move. - * 0 is no corner, or 'mt', 'ml', 'mtr' etc.. - * It should be private, but there is no harm in using it as - * a read-only property. - * @type number|string|any - * @default 0 - */ - __corner: 0, - - /** - * Determines if the fill or the stroke is drawn first (one of "fill" or "stroke") - * @type String - * @default - */ - paintFirst: 'fill', - - /** - * When 'down', object is set to active on mousedown/touchstart - * When 'up', object is set to active on mouseup/touchend - * Experimental. Let's see if this breaks anything before supporting officially - * @private - * since 4.4.0 - * @type String - * @default 'down' - */ - activeOn: 'down', - - /** - * List of properties to consider when checking if state - * of an object is changed (fabric.Object#hasStateChanged) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: ( - 'top left width height scaleX scaleY flipX flipY originX originY transformMatrix ' + - 'stroke strokeWidth strokeDashArray strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit ' + - 'angle opacity fill globalCompositeOperation shadow visible backgroundColor ' + - 'skewX skewY fillRule paintFirst clipPath strokeUniform' - ).split(' '), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: ( - 'fill stroke strokeWidth strokeDashArray width height paintFirst strokeUniform' + - ' strokeLineCap strokeDashOffset strokeLineJoin strokeMiterLimit backgroundColor clipPath' - ).split(' '), - - /** - * List of properties to consider for animating colors. - * @type Array - */ - colorProperties: ( - 'fill stroke backgroundColor' - ).split(' '), - - /** - * a fabricObject that, without stroke define a clipping area with their shape. filled in black - * the clipPath object gets used when the object has rendered, and the context is placed in the center - * of the object cacheCanvas. - * If you want 0,0 of a clipPath to align with an object center, use clipPath.originX/Y to 'center' - * @type fabric.Object - */ - clipPath: undefined, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will make the object clip to the outside of the clipPath - * since 2.4.0 - * @type boolean - * @default false - */ - inverted: false, - - /** - * Meaningful ONLY when the object is used as clipPath. - * if true, the clipPath will have its top and left relative to canvas, and will - * not be influenced by the object transform. This will make the clipPath relative - * to the canvas, but clipping just a particular object. - * WARNING this is beta, this feature may change or be renamed. - * since 2.4.0 - * @type boolean - * @default false - */ - absolutePositioned: false, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Create a the canvas used to keep the cached copy of the object - * @private - */ - _createCacheCanvas: function() { - this._cacheProperties = {}; - this._cacheCanvas = fabric.util.createCanvasElement(); - this._cacheContext = this._cacheCanvas.getContext('2d'); - this._updateCacheCanvas(); - // if canvas gets created, is empty, so dirty. - this.dirty = true; - }, - - /** - * Limit the cache dimensions so that X * Y do not cross fabric.perfLimitSizeTotal - * and each side do not cross fabric.cacheSideLimit - * those numbers are configurable so that you can get as much detail as you want - * making bargain with performances. - * @param {Object} dims - * @param {Object} dims.width width of canvas - * @param {Object} dims.height height of canvas - * @param {Object} dims.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @param {Object} dims.zoomY zoomY zoom value to unscale the canvas before drawing cache - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _limitCacheSize: function(dims) { - var perfLimitSizeTotal = fabric.perfLimitSizeTotal, - width = dims.width, height = dims.height, - max = fabric.maxCacheSideLimit, min = fabric.minCacheSideLimit; - if (width <= max && height <= max && width * height <= perfLimitSizeTotal) { - if (width < min) { - dims.width = min; - } - if (height < min) { - dims.height = min; - } - return dims; - } - var ar = width / height, limitedDims = fabric.util.limitDimsByArea(ar, perfLimitSizeTotal), - capValue = fabric.util.capValue, - x = capValue(min, limitedDims.x, max), - y = capValue(min, limitedDims.y, max); - if (width > x) { - dims.zoomX /= width / x; - dims.width = x; - dims.capped = true; - } - if (height > y) { - dims.zoomY /= height / y; - dims.height = y; - dims.capped = true; - } - return dims; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @return {Object}.x width of object to be cached - * @return {Object}.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var objectScale = this.getTotalObjectScaling(), - // caculate dimensions without skewing - dim = this._getTransformedDimensions(0, 0), - neededX = dim.x * objectScale.scaleX / this.scaleX, - neededY = dim.y * objectScale.scaleY / this.scaleY; - return { - // for sure this ALIASING_LIMIT is slightly creating problem - // in situation in which the cache canvas gets an upper limit - // also objectScale contains already scaleX and scaleY - width: neededX + ALIASING_LIMIT, - height: neededY + ALIASING_LIMIT, - zoomX: objectScale.scaleX, - zoomY: objectScale.scaleY, - x: neededX, - y: neededY - }; - }, - - /** - * Update width and height of the canvas for cache - * returns true or false if canvas needed resize. - * @private - * @return {Boolean} true if the canvas has been resized - */ - _updateCacheCanvas: function() { - var targetCanvas = this.canvas; - if (this.noScaleCache && targetCanvas && targetCanvas._currentTransform) { - var target = targetCanvas._currentTransform.target, - action = targetCanvas._currentTransform.action; - if (this === target && action.slice && action.slice(0, 5) === 'scale') { - return false; - } - } - var canvas = this._cacheCanvas, - dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - minCacheSize = fabric.minCacheSideLimit, - width = dims.width, height = dims.height, drawingWidth, drawingHeight, - zoomX = dims.zoomX, zoomY = dims.zoomY, - dimensionsChanged = width !== this.cacheWidth || height !== this.cacheHeight, - zoomChanged = this.zoomX !== zoomX || this.zoomY !== zoomY, - shouldRedraw = dimensionsChanged || zoomChanged, - additionalWidth = 0, additionalHeight = 0, shouldResizeCanvas = false; - if (dimensionsChanged) { - var canvasWidth = this._cacheCanvas.width, - canvasHeight = this._cacheCanvas.height, - sizeGrowing = width > canvasWidth || height > canvasHeight, - sizeShrinking = (width < canvasWidth * 0.9 || height < canvasHeight * 0.9) && - canvasWidth > minCacheSize && canvasHeight > minCacheSize; - shouldResizeCanvas = sizeGrowing || sizeShrinking; - if (sizeGrowing && !dims.capped && (width > minCacheSize || height > minCacheSize)) { - additionalWidth = width * 0.1; - additionalHeight = height * 0.1; - } - } - if (this instanceof fabric.Text && this.path) { - shouldRedraw = true; - shouldResizeCanvas = true; - additionalWidth += this.getHeightOfLine(0) * this.zoomX; - additionalHeight += this.getHeightOfLine(0) * this.zoomY; - } - if (shouldRedraw) { - if (shouldResizeCanvas) { - canvas.width = Math.ceil(width + additionalWidth); - canvas.height = Math.ceil(height + additionalHeight); - } - else { - this._cacheContext.setTransform(1, 0, 0, 1, 0, 0); - this._cacheContext.clearRect(0, 0, canvas.width, canvas.height); - } - drawingWidth = dims.x / 2; - drawingHeight = dims.y / 2; - this.cacheTranslationX = Math.round(canvas.width / 2 - drawingWidth) + drawingWidth; - this.cacheTranslationY = Math.round(canvas.height / 2 - drawingHeight) + drawingHeight; - this.cacheWidth = width; - this.cacheHeight = height; - this._cacheContext.translate(this.cacheTranslationX, this.cacheTranslationY); - this._cacheContext.scale(zoomX, zoomY); - this.zoomX = zoomX; - this.zoomY = zoomY; - return true; - } - return false; - }, - - /** - * Sets object's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - this._setOptions(options); - this._initGradient(options.fill, 'fill'); - this._initGradient(options.stroke, 'stroke'); - this._initPattern(options.fill, 'fill'); - this._initPattern(options.stroke, 'stroke'); - }, - - /** - * Transforms context when rendering an object - * @param {CanvasRenderingContext2D} ctx Context - */ - transform: function(ctx) { - var needFullTransform = (this.group && !this.group._transformDone) || - (this.group && this.canvas && ctx === this.canvas.contextTop); - var m = this.calcTransformMatrix(!needFullTransform); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - }, - - /** - * Returns an object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS, - - object = { - type: this.type, - version: fabric.version, - originX: this.originX, - originY: this.originY, - left: toFixed(this.left, NUM_FRACTION_DIGITS), - top: toFixed(this.top, NUM_FRACTION_DIGITS), - width: toFixed(this.width, NUM_FRACTION_DIGITS), - height: toFixed(this.height, NUM_FRACTION_DIGITS), - fill: (this.fill && this.fill.toObject) ? this.fill.toObject() : this.fill, - stroke: (this.stroke && this.stroke.toObject) ? this.stroke.toObject() : this.stroke, - strokeWidth: toFixed(this.strokeWidth, NUM_FRACTION_DIGITS), - strokeDashArray: this.strokeDashArray ? this.strokeDashArray.concat() : this.strokeDashArray, - strokeLineCap: this.strokeLineCap, - strokeDashOffset: this.strokeDashOffset, - strokeLineJoin: this.strokeLineJoin, - strokeUniform: this.strokeUniform, - strokeMiterLimit: toFixed(this.strokeMiterLimit, NUM_FRACTION_DIGITS), - scaleX: toFixed(this.scaleX, NUM_FRACTION_DIGITS), - scaleY: toFixed(this.scaleY, NUM_FRACTION_DIGITS), - angle: toFixed(this.angle, NUM_FRACTION_DIGITS), - flipX: this.flipX, - flipY: this.flipY, - opacity: toFixed(this.opacity, NUM_FRACTION_DIGITS), - shadow: (this.shadow && this.shadow.toObject) ? this.shadow.toObject() : this.shadow, - visible: this.visible, - backgroundColor: this.backgroundColor, - fillRule: this.fillRule, - paintFirst: this.paintFirst, - globalCompositeOperation: this.globalCompositeOperation, - skewX: toFixed(this.skewX, NUM_FRACTION_DIGITS), - skewY: toFixed(this.skewY, NUM_FRACTION_DIGITS), - }; - - if (this.clipPath && !this.clipPath.excludeFromExport) { - object.clipPath = this.clipPath.toObject(propertiesToInclude); - object.clipPath.inverted = this.clipPath.inverted; - object.clipPath.absolutePositioned = this.clipPath.absolutePositioned; - } - - fabric.util.populateWithProperties(this, object, propertiesToInclude); - if (!this.includeDefaultValues) { - object = this._removeDefaultValues(object); - } - - return object; - }, - - /** - * Returns (dataless) object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - // will be overwritten by subclasses - return this.toObject(propertiesToInclude); - }, - - /** - * @private - * @param {Object} object - */ - _removeDefaultValues: function(object) { - var prototype = fabric.util.getKlass(object.type).prototype, - stateProperties = prototype.stateProperties; - stateProperties.forEach(function(prop) { - if (prop === 'left' || prop === 'top') { - return; - } - if (object[prop] === prototype[prop]) { - delete object[prop]; - } - // basically a check for [] === [] - if (Array.isArray(object[prop]) && Array.isArray(prototype[prop]) - && object[prop].length === 0 && prototype[prop].length === 0) { - delete object[prop]; - } - }); - - return object; - }, - - /** - * Returns a string representation of an instance - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Return the object scale factor counting also the group scaling - * @return {Object} object with scaleX and scaleY properties - */ - getObjectScaling: function() { - // if the object is a top level one, on the canvas, we go for simple aritmetic - // otherwise the complex method with angles will return approximations and decimals - // and will likely kill the cache when not needed - // https://github.com/fabricjs/fabric.js/issues/7157 - if (!this.group) { - return { - scaleX: this.scaleX, - scaleY: this.scaleY, - }; - } - // if we are inside a group total zoom calculation is complex, we defer to generic matrices - var options = fabric.util.qrDecompose(this.calcTransformMatrix()); - return { scaleX: Math.abs(options.scaleX), scaleY: Math.abs(options.scaleY) }; - }, - - /** - * Return the object scale factor counting also the group scaling, zoom and retina - * @return {Object} object with scaleX and scaleY properties - */ - getTotalObjectScaling: function() { - var scale = this.getObjectScaling(), scaleX = scale.scaleX, scaleY = scale.scaleY; - if (this.canvas) { - var zoom = this.canvas.getZoom(); - var retina = this.canvas.getRetinaScaling(); - scaleX *= zoom * retina; - scaleY *= zoom * retina; - } - return { scaleX: scaleX, scaleY: scaleY }; - }, - - /** - * Return the object opacity counting also the group property - * @return {Number} - */ - getObjectOpacity: function() { - var opacity = this.opacity; - if (this.group) { - opacity *= this.group.getObjectOpacity(); - } - return opacity; - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Object} thisArg - */ - _set: function(key, value) { - var shouldConstrainValue = (key === 'scaleX' || key === 'scaleY'), - isChanged = this[key] !== value, groupNeedsUpdate = false; - - if (shouldConstrainValue) { - value = this._constrainScale(value); - } - if (key === 'scaleX' && value < 0) { - this.flipX = !this.flipX; - value *= -1; - } - else if (key === 'scaleY' && value < 0) { - this.flipY = !this.flipY; - value *= -1; - } - else if (key === 'shadow' && value && !(value instanceof fabric.Shadow)) { - value = new fabric.Shadow(value); - } - else if (key === 'dirty' && this.group) { - this.group.set('dirty', value); - } - - this[key] = value; - - if (isChanged) { - groupNeedsUpdate = this.group && this.group.isOnACache(); - if (this.cacheProperties.indexOf(key) > -1) { - this.dirty = true; - groupNeedsUpdate && this.group.set('dirty', true); - } - else if (groupNeedsUpdate && this.stateProperties.indexOf(key) > -1) { - this.group.set('dirty', true); - } - } - return this; - }, - - /** - * This callback function is called by the parent group of an object every - * time a non-delegated property changes on the group. It is passed the key - * and value as parameters. Not adding in this function's signature to avoid - * Travis build error about unused variables. - */ - setOnGroup: function() { - // implemented by sub-classes, as needed. - }, - - /** - * Retrieves viewportTransform from Object's canvas if possible - * @method getViewportTransform - * @memberOf fabric.Object.prototype - * @return {Array} - */ - getViewportTransform: function() { - if (this.canvas && this.canvas.viewportTransform) { - return this.canvas.viewportTransform; - } - return fabric.iMatrix.concat(); - }, - - /* - * @private - * return if the object would be visible in rendering - * @memberOf fabric.Object.prototype - * @return {Boolean} - */ - isNotVisible: function() { - return this.opacity === 0 || - (!this.width && !this.height && this.strokeWidth === 0) || - !this.visible; - }, - - /** - * Renders an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if width/height are zeros or object is not visible - if (this.isNotVisible()) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - ctx.save(); - this._setupCompositeOperation(ctx); - this.drawSelectionBackground(ctx); - this.transform(ctx); - this._setOpacity(ctx); - this._setShadow(ctx, this); - if (this.shouldCache()) { - this.renderCache(); - this.drawCacheOnCanvas(ctx); - } - else { - this._removeCacheCanvas(); - this.dirty = false; - this.drawObject(ctx); - if (this.objectCaching && this.statefullCache) { - this.saveState({ propertySet: 'cacheProperties' }); - } - } - ctx.restore(); - }, - - renderCache: function(options) { - options = options || {}; - if (!this._cacheCanvas || !this._cacheContext) { - this._createCacheCanvas(); - } - if (this.isCacheDirty()) { - this.statefullCache && this.saveState({ propertySet: 'cacheProperties' }); - this.drawObject(this._cacheContext, options.forClipping); - this.dirty = false; - } - }, - - /** - * Remove cacheCanvas and its dimensions from the objects - */ - _removeCacheCanvas: function() { - this._cacheCanvas = null; - this._cacheContext = null; - this.cacheWidth = 0; - this.cacheHeight = 0; - }, - - /** - * return true if the object will draw a stroke - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when stroke happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the stroke is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasStroke: function() { - return this.stroke && this.stroke !== 'transparent' && this.strokeWidth !== 0; - }, - - /** - * return true if the object will draw a fill - * Does not consider text styles. This is just a shortcut used at rendering time - * We want it to be an approximation and be fast. - * wrote to avoid extra caching, it has to return true when fill happens, - * can guess when it will not happen at 100% chance, does not matter if it misses - * some use case where the fill is invisible. - * @since 3.0.0 - * @returns Boolean - */ - hasFill: function() { - return this.fill && this.fill !== 'transparent'; - }, - - /** - * When set to `true`, force the object to have its own cache, even if it is inside a group - * it may be needed when your object behave in a particular way on the cache and always needs - * its own isolated canvas to render correctly. - * Created to be overridden - * since 1.7.12 - * @returns Boolean - */ - needsItsOwnCache: function() { - if (this.paintFirst === 'stroke' && - this.hasFill() && this.hasStroke() && typeof this.shadow === 'object') { - return true; - } - if (this.clipPath) { - return true; - } - return false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * Read as: cache if is needed, or if the feature is enabled but we are not already caching. - * @return {Boolean} - */ - shouldCache: function() { - this.ownCaching = this.needsItsOwnCache() || ( - this.objectCaching && - (!this.group || !this.group.isOnACache()) - ); - return this.ownCaching; - }, - - /** - * Check if this object or a child object will cast a shadow - * used by Group.shouldCache to know if child has a shadow recursively - * @return {Boolean} - */ - willDrawShadow: function() { - return !!this.shadow && (this.shadow.offsetX !== 0 || this.shadow.offsetY !== 0); - }, - - /** - * Execute the drawing operation for an object clipPath - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {fabric.Object} clipPath - */ - drawClipPathOnCache: function(ctx, clipPath) { - ctx.save(); - // DEBUG: uncomment this line, comment the following - // ctx.globalAlpha = 0.4 - if (clipPath.inverted) { - ctx.globalCompositeOperation = 'destination-out'; - } - else { - ctx.globalCompositeOperation = 'destination-in'; - } - //ctx.scale(1 / 2, 1 / 2); - if (clipPath.absolutePositioned) { - var m = fabric.util.invertTransform(this.calcTransformMatrix()); - ctx.transform(m[0], m[1], m[2], m[3], m[4], m[5]); - } - clipPath.transform(ctx); - ctx.scale(1 / clipPath.zoomX, 1 / clipPath.zoomY); - ctx.drawImage(clipPath._cacheCanvas, -clipPath.cacheTranslationX, -clipPath.cacheTranslationY); - ctx.restore(); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx, forClipping) { - var originalFill = this.fill, originalStroke = this.stroke; - if (forClipping) { - this.fill = 'black'; - this.stroke = ''; - this._setClippingProperties(ctx); - } - else { - this._renderBackground(ctx); - } - this._render(ctx); - this._drawClipPath(ctx, this.clipPath); - this.fill = originalFill; - this.stroke = originalStroke; - }, - - /** - * Prepare clipPath state and cache and draw it on instance's cache - * @param {CanvasRenderingContext2D} ctx - * @param {fabric.Object} clipPath - */ - _drawClipPath: function (ctx, clipPath) { - if (!clipPath) { return; } - // needed to setup a couple of variables - // path canvas gets overridden with this one. - // TODO find a better solution? - clipPath.canvas = this.canvas; - clipPath.shouldCache(); - clipPath._transformDone = true; - clipPath.renderCache({ forClipping: true }); - this.drawClipPathOnCache(ctx, clipPath); - }, - - /** - * Paint the cached copy of the object on the target context. - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - ctx.scale(1 / this.zoomX, 1 / this.zoomY); - ctx.drawImage(this._cacheCanvas, -this.cacheTranslationX, -this.cacheTranslationY); - }, - - /** - * Check if cache is dirty - * @param {Boolean} skipCanvas skip canvas checks because this object is painted - * on parent canvas. - */ - isCacheDirty: function(skipCanvas) { - if (this.isNotVisible()) { - return false; - } - if (this._cacheCanvas && this._cacheContext && !skipCanvas && this._updateCacheCanvas()) { - // in this case the context is already cleared. - return true; - } - else { - if (this.dirty || - (this.clipPath && this.clipPath.absolutePositioned) || - (this.statefullCache && this.hasStateChanged('cacheProperties')) - ) { - if (this._cacheCanvas && this._cacheContext && !skipCanvas) { - var width = this.cacheWidth / this.zoomX; - var height = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-width / 2, -height / 2, width, height); - } - return true; - } - } - return false; - }, - - /** - * Draws a background for the object big as its untransformed dimensions - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderBackground: function(ctx) { - if (!this.backgroundColor) { - return; - } - var dim = this._getNonTransformedDimensions(); - ctx.fillStyle = this.backgroundColor; - - ctx.fillRect( - -dim.x / 2, - -dim.y / 2, - dim.x, - dim.y - ); - // if there is background color no other shadows - // should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setOpacity: function(ctx) { - if (this.group && !this.group._transformDone) { - ctx.globalAlpha = this.getObjectOpacity(); - } - else { - ctx.globalAlpha *= this.opacity; - } - }, - - _setStrokeStyles: function(ctx, decl) { - var stroke = decl.stroke; - if (stroke) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = decl.strokeLineCap; - ctx.lineDashOffset = decl.strokeDashOffset; - ctx.lineJoin = decl.strokeLineJoin; - ctx.miterLimit = decl.strokeMiterLimit; - if (stroke.toLive) { - if (stroke.gradientUnits === 'percentage' || stroke.gradientTransform || stroke.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - this._applyPatternForTransformedGradient(ctx, stroke); - } - else { - // is a simple gradient or pattern - ctx.strokeStyle = stroke.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, stroke); - } - } - else { - // is a color - ctx.strokeStyle = decl.stroke; - } - } - }, - - _setFillStyles: function(ctx, decl) { - var fill = decl.fill; - if (fill) { - if (fill.toLive) { - ctx.fillStyle = fill.toLive(ctx, this); - this._applyPatternGradientTransform(ctx, decl.fill); - } - else { - ctx.fillStyle = fill; - } - } - }, - - _setClippingProperties: function(ctx) { - ctx.globalAlpha = 1; - ctx.strokeStyle = 'transparent'; - ctx.fillStyle = '#000000'; - }, - - /** - * @private - * Sets line dash - * @param {CanvasRenderingContext2D} ctx Context to set the dash line on - * @param {Array} dashArray array representing dashes - */ - _setLineDash: function(ctx, dashArray) { - if (!dashArray || dashArray.length === 0) { - return; - } - // Spec requires the concatenation of two copies the dash list when the number of elements is odd - if (1 & dashArray.length) { - dashArray.push.apply(dashArray, dashArray); - } - ctx.setLineDash(dashArray); - }, - - /** - * Renders controls and borders for the object - * the context here is not transformed - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - */ - _renderControls: function(ctx, styleOverride) { - var vpt = this.getViewportTransform(), - matrix = this.calcTransformMatrix(), - options, drawBorders, drawControls; - styleOverride = styleOverride || { }; - drawBorders = typeof styleOverride.hasBorders !== 'undefined' ? styleOverride.hasBorders : this.hasBorders; - drawControls = typeof styleOverride.hasControls !== 'undefined' ? styleOverride.hasControls : this.hasControls; - matrix = fabric.util.multiplyTransformMatrices(vpt, matrix); - options = fabric.util.qrDecompose(matrix); - ctx.save(); - ctx.translate(options.translateX, options.translateY); - ctx.lineWidth = 1 * this.borderScaleFactor; - if (!this.group) { - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - } - if (this.flipX) { - options.angle -= 180; - } - ctx.rotate(degreesToRadians(this.group ? options.angle : this.angle)); - if (styleOverride.forActiveSelection || this.group) { - drawBorders && this.drawBordersInGroup(ctx, options, styleOverride); - } - else { - drawBorders && this.drawBorders(ctx, styleOverride); - } - drawControls && this.drawControls(ctx, styleOverride); - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _setShadow: function(ctx) { - if (!this.shadow) { - return; - } - - var shadow = this.shadow, canvas = this.canvas, scaling, - multX = (canvas && canvas.viewportTransform[0]) || 1, - multY = (canvas && canvas.viewportTransform[3]) || 1; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - if (canvas && canvas._isRetinaScaling()) { - multX *= fabric.devicePixelRatio; - multY *= fabric.devicePixelRatio; - } - ctx.shadowColor = shadow.color; - ctx.shadowBlur = shadow.blur * fabric.browserShadowBlurConstant * - (multX + multY) * (scaling.scaleX + scaling.scaleY) / 4; - ctx.shadowOffsetX = shadow.offsetX * multX * scaling.scaleX; - ctx.shadowOffsetY = shadow.offsetY * multY * scaling.scaleY; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _removeShadow: function(ctx) { - if (!this.shadow) { - return; - } - - ctx.shadowColor = ''; - ctx.shadowBlur = ctx.shadowOffsetX = ctx.shadowOffsetY = 0; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} filler fabric.Pattern or fabric.Gradient - * @return {Object} offset.offsetX offset for text rendering - * @return {Object} offset.offsetY offset for text rendering - */ - _applyPatternGradientTransform: function(ctx, filler) { - if (!filler || !filler.toLive) { - return { offsetX: 0, offsetY: 0 }; - } - var t = filler.gradientTransform || filler.patternTransform; - var offsetX = -this.width / 2 + filler.offsetX || 0, - offsetY = -this.height / 2 + filler.offsetY || 0; - - if (filler.gradientUnits === 'percentage') { - ctx.transform(this.width, 0, 0, this.height, offsetX, offsetY); - } - else { - ctx.transform(1, 0, 0, 1, offsetX, offsetY); - } - if (t) { - ctx.transform(t[0], t[1], t[2], t[3], t[4], t[5]); - } - return { offsetX: offsetX, offsetY: offsetY }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderPaintInOrder: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderStroke(ctx); - this._renderFill(ctx); - } - else { - this._renderFill(ctx); - this._renderStroke(ctx); - } - }, - - /** - * @private - * function that actually render something on the context. - * empty here to allow Obects to work on tests to benchmark fabric functionalites - * not related to rendering - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(/* ctx */) { - - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderFill: function(ctx) { - if (!this.fill) { - return; - } - - ctx.save(); - this._setFillStyles(ctx, this); - if (this.fillRule === 'evenodd') { - ctx.fill('evenodd'); - } - else { - ctx.fill(); - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderStroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - if (this.strokeUniform && this.group) { - var scaling = this.getObjectScaling(); - ctx.scale(1 / scaling.scaleX, 1 / scaling.scaleY); - } - else if (this.strokeUniform) { - ctx.scale(1 / this.scaleX, 1 / this.scaleY); - } - this._setLineDash(ctx, this.strokeDashArray); - this._setStrokeStyles(ctx, this); - ctx.stroke(); - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drwabacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {fabric.Gradient} filler a fabric gradient instance - */ - _applyPatternForTransformedGradient: function(ctx, filler) { - var dims = this._limitCacheSize(this._getCacheCanvasDimensions()), - pCanvas = fabric.util.createCanvasElement(), pCtx, retinaScaling = this.canvas.getRetinaScaling(), - width = dims.x / this.scaleX / retinaScaling, height = dims.y / this.scaleY / retinaScaling; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.scale( - dims.zoomX / this.scaleX / retinaScaling, - dims.zoomY / this.scaleY / retinaScaling - ); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fillStyle = filler.toLive(ctx); - pCtx.fill(); - ctx.translate(-this.width / 2 - this.strokeWidth / 2, -this.height / 2 - this.strokeWidth / 2); - ctx.scale( - retinaScaling * this.scaleX / dims.zoomX, - retinaScaling * this.scaleY / dims.zoomY - ); - ctx.strokeStyle = pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { x: this.left + this.width / 2, y: this.top + this.height / 2 }; - }, - - /** - * This function is an helper for svg import. it decompose the transformMatrix - * and assign properties to object. - * untransformed coordinates - * @private - * @chainable - */ - _assignTransformMatrixProps: function() { - if (this.transformMatrix) { - var options = fabric.util.qrDecompose(this.transformMatrix); - this.flipX = false; - this.flipY = false; - this.set('scaleX', options.scaleX); - this.set('scaleY', options.scaleY); - this.angle = options.angle; - this.skewX = options.skewX; - this.skewY = 0; - } - }, - - /** - * This function is an helper for svg import. it removes the transform matrix - * and set to object properties that fabricjs can handle - * @private - * @param {Object} preserveAspectRatioOptions - * @return {thisArg} - */ - _removeTransformMatrix: function(preserveAspectRatioOptions) { - var center = this._findCenterFromElement(); - if (this.transformMatrix) { - this._assignTransformMatrixProps(); - center = fabric.util.transformPoint(center, this.transformMatrix); - } - this.transformMatrix = null; - if (preserveAspectRatioOptions) { - this.scaleX *= preserveAspectRatioOptions.scaleX; - this.scaleY *= preserveAspectRatioOptions.scaleY; - this.cropX = preserveAspectRatioOptions.cropX; - this.cropY = preserveAspectRatioOptions.cropY; - center.x += preserveAspectRatioOptions.offsetLeft; - center.y += preserveAspectRatioOptions.offsetTop; - this.width = preserveAspectRatioOptions.width; - this.height = preserveAspectRatioOptions.height; - } - this.setPositionByOrigin(center, 'center', 'center'); - }, - - /** - * Clones an instance, using a callback method will work for every object. - * @param {Function} callback Callback is invoked with a clone as a first argument - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - */ - clone: function(callback, propertiesToInclude) { - var objectForm = this.toObject(propertiesToInclude); - if (this.constructor.fromObject) { - this.constructor.fromObject(objectForm, callback); - } - else { - fabric.Object._fromObject('Object', objectForm, callback); - } - }, - - /** - * Creates an instance of fabric.Image out of an object - * makes use of toCanvasElement. - * Once this method was based on toDataUrl and loadImage, so it also had a quality - * and format option. toCanvasElement is faster and produce no loss of quality. - * If you need to get a real Jpeg or Png from an object, using toDataURL is the right way to do it. - * toCanvasElement and then toBlob from the obtained canvas is also a good option. - * This method is sync now, but still support the callback because we did not want to break. - * When fabricJS 5.0 will be planned, this will probably be changed to not have a callback. - * @param {Function} callback callback, invoked with an instance as a first argument - * @param {Object} [options] for clone as image, passed to toDataURL - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {fabric.Object} thisArg - */ - cloneAsImage: function(callback, options) { - var canvasEl = this.toCanvasElement(options); - if (callback) { - callback(new fabric.Image(canvasEl)); - } - return this; - }, - - /** - * Converts an object into a HTMLCanvas element - * @param {Object} options Options object - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {HTMLCanvasElement} Returns DOM element with the fabric.Object - */ - toCanvasElement: function(options) { - options || (options = { }); - - var utils = fabric.util, origParams = utils.saveObjectTransform(this), - originalGroup = this.group, - originalShadow = this.shadow, abs = Math.abs, - multiplier = (options.multiplier || 1) * (options.enableRetinaScaling ? fabric.devicePixelRatio : 1); - delete this.group; - if (options.withoutTransform) { - utils.resetObjectTransform(this); - } - if (options.withoutShadow) { - this.shadow = null; - } - - var el = fabric.util.createCanvasElement(), - // skip canvas zoom and calculate with setCoords now. - boundingRect = this.getBoundingRect(true, true), - shadow = this.shadow, scaling, - shadowOffset = { x: 0, y: 0 }, shadowBlur, - width, height; - - if (shadow) { - shadowBlur = shadow.blur; - if (shadow.nonScaling) { - scaling = { scaleX: 1, scaleY: 1 }; - } - else { - scaling = this.getObjectScaling(); - } - // consider non scaling shadow. - shadowOffset.x = 2 * Math.round(abs(shadow.offsetX) + shadowBlur) * (abs(scaling.scaleX)); - shadowOffset.y = 2 * Math.round(abs(shadow.offsetY) + shadowBlur) * (abs(scaling.scaleY)); - } - width = boundingRect.width + shadowOffset.x; - height = boundingRect.height + shadowOffset.y; - // if the current width/height is not an integer - // we need to make it so. - el.width = Math.ceil(width); - el.height = Math.ceil(height); - var canvas = new fabric.StaticCanvas(el, { - enableRetinaScaling: false, - renderOnAddRemove: false, - skipOffscreen: false, - }); - if (options.format === 'jpeg') { - canvas.backgroundColor = '#fff'; - } - this.setPositionByOrigin(new fabric.Point(canvas.width / 2, canvas.height / 2), 'center', 'center'); - - var originalCanvas = this.canvas; - canvas.add(this); - var canvasEl = canvas.toCanvasElement(multiplier || 1, options); - this.shadow = originalShadow; - this.set('canvas', originalCanvas); - if (originalGroup) { - this.group = originalGroup; - } - this.set(origParams).setCoords(); - // canvas.dispose will call image.dispose that will nullify the elements - // since this canvas is a simple element for the process, we remove references - // to objects in this way in order to avoid object trashing. - canvas._objects = []; - canvas.dispose(); - canvas = null; - - return canvasEl; - }, - - /** - * Converts an object into a data-url-like string - * @param {Object} options Options object - * @param {String} [options.format=png] The format of the output image. Either "jpeg" or "png" - * @param {Number} [options.quality=1] Quality level (0..1). Only used for jpeg. - * @param {Number} [options.multiplier=1] Multiplier to scale by - * @param {Number} [options.left] Cropping left offset. Introduced in v1.2.14 - * @param {Number} [options.top] Cropping top offset. Introduced in v1.2.14 - * @param {Number} [options.width] Cropping width. Introduced in v1.2.14 - * @param {Number} [options.height] Cropping height. Introduced in v1.2.14 - * @param {Boolean} [options.enableRetinaScaling] Enable retina scaling for clone image. Introduce in 1.6.4 - * @param {Boolean} [options.withoutTransform] Remove current object transform ( no scale , no angle, no flip, no skew ). Introduced in 2.3.4 - * @param {Boolean} [options.withoutShadow] Remove current object shadow. Introduced in 2.4.2 - * @return {String} Returns a data: URL containing a representation of the object in the format specified by options.format - */ - toDataURL: function(options) { - options || (options = { }); - return fabric.util.toDataURL(this.toCanvasElement(options), options.format || 'png', options.quality || 1); - }, - - /** - * Returns true if specified type is identical to the type of an instance - * @param {String} type Type to check against - * @return {Boolean} - */ - isType: function(type) { - return arguments.length > 1 ? Array.from(arguments).includes(this.type) : this.type === type; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance (is 1 unless subclassed) - */ - complexity: function() { - return 1; - }, - - /** - * Returns a JSON representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} JSON - */ - toJSON: function(propertiesToInclude) { - // delegate, not alias - return this.toObject(propertiesToInclude); - }, - - /** - * Sets "angle" of an instance with centered rotation - * @param {Number} angle Angle value (in degrees) - * @return {fabric.Object} thisArg - * @chainable - */ - rotate: function(angle) { - var shouldCenterOrigin = (this.originX !== 'center' || this.originY !== 'center') && this.centeredRotation; - - if (shouldCenterOrigin) { - this._setOriginToCenter(); - } - - this.set('angle', angle); - - if (shouldCenterOrigin) { - this._resetOrigin(); - } - - return this; - }, - - /** - * Centers object horizontally on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerH: function () { - this.canvas && this.canvas.centerObjectH(this); - return this; - }, - - /** - * Centers object horizontally on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterH: function () { - this.canvas && this.canvas.viewportCenterObjectH(this); - return this; - }, - - /** - * Centers object vertically on canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - centerV: function () { - this.canvas && this.canvas.centerObjectV(this); - return this; - }, - - /** - * Centers object vertically on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenterV: function () { - this.canvas && this.canvas.viewportCenterObjectV(this); - return this; - }, - - /** - * Centers object vertically and horizontally on canvas to which is was added last - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - center: function () { - this.canvas && this.canvas.centerObject(this); - return this; - }, - - /** - * Centers object on current viewport of canvas to which it was added last. - * You might need to call `setCoords` on an object after centering, to update controls area. - * @return {fabric.Object} thisArg - * @chainable - */ - viewportCenter: function () { - this.canvas && this.canvas.viewportCenterObject(this); - return this; - }, - - /** - * Returns coordinates of a pointer relative to an object - * @param {Event} e Event to operate upon - * @param {Object} [pointer] Pointer to operate upon (instead of event) - * @return {Object} Coordinates of a pointer (x, y) - */ - getLocalPointer: function(e, pointer) { - pointer = pointer || this.canvas.getPointer(e); - var pClicked = new fabric.Point(pointer.x, pointer.y), - objectLeftTop = this._getLeftTopCoords(); - if (this.angle) { - pClicked = fabric.util.rotatePoint( - pClicked, objectLeftTop, degreesToRadians(-this.angle)); - } - return { - x: pClicked.x - objectLeftTop.x, - y: pClicked.y - objectLeftTop.y - }; - }, - - /** - * Sets canvas globalCompositeOperation for specific object - * custom composition operation for the particular object can be specified using globalCompositeOperation property - * @param {CanvasRenderingContext2D} ctx Rendering canvas context - */ - _setupCompositeOperation: function (ctx) { - if (this.globalCompositeOperation) { - ctx.globalCompositeOperation = this.globalCompositeOperation; - } - }, - - /** - * cancel instance's running animations - * override if necessary to dispose artifacts such as `clipPath` - */ - dispose: function () { - if (fabric.runningAnimations) { - fabric.runningAnimations.cancelByTarget(this); - } - } - }); - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Object); - - extend(fabric.Object.prototype, fabric.Observable); - - /** - * Defines the number of fraction digits to use when serializing object values. - * You can use it to increase/decrease precision of such values like left, top, scaleX, scaleY, etc. - * @static - * @memberOf fabric.Object - * @constant - * @type Number - */ - fabric.Object.NUM_FRACTION_DIGITS = 2; - - /** - * Defines which properties should be enlivened from the object passed to {@link fabric.Object._fromObject} - * @static - * @memberOf fabric.Object - * @constant - * @type string[] - */ - fabric.Object.ENLIVEN_PROPS = ['clipPath']; - - fabric.Object._fromObject = function(className, object, callback, extraParam) { - var klass = fabric[className]; - object = clone(object, true); - fabric.util.enlivenPatterns([object.fill, object.stroke], function(patterns) { - if (typeof patterns[0] !== 'undefined') { - object.fill = patterns[0]; - } - if (typeof patterns[1] !== 'undefined') { - object.stroke = patterns[1]; - } - fabric.util.enlivenObjectEnlivables(object, object, function () { - var instance = extraParam ? new klass(object[extraParam], object) : new klass(object); - callback && callback(instance); - }); - }); - }; - - /** - * Unique id used internally when creating SVG elements - * @static - * @memberOf fabric.Object - * @type Number - */ - fabric.Object.__uid = 0; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians, - originXOffset = { - left: -0.5, - center: 0, - right: 0.5 - }, - originYOffset = { - top: -0.5, - center: 0, - bottom: 0.5 - }; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Translates the coordinates from a set of origin to another (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} fromOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} fromOriginY Vertical origin: 'top', 'center' or 'bottom' - * @param {String} toOriginX Horizontal origin: 'left', 'center' or 'right' - * @param {String} toOriginY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToGivenOrigin: function(point, fromOriginX, fromOriginY, toOriginX, toOriginY) { - var x = point.x, - y = point.y, - offsetX, offsetY, dim; - - if (typeof fromOriginX === 'string') { - fromOriginX = originXOffset[fromOriginX]; - } - else { - fromOriginX -= 0.5; - } - - if (typeof toOriginX === 'string') { - toOriginX = originXOffset[toOriginX]; - } - else { - toOriginX -= 0.5; - } - - offsetX = toOriginX - fromOriginX; - - if (typeof fromOriginY === 'string') { - fromOriginY = originYOffset[fromOriginY]; - } - else { - fromOriginY -= 0.5; - } - - if (typeof toOriginY === 'string') { - toOriginY = originYOffset[toOriginY]; - } - else { - toOriginY -= 0.5; - } - - offsetY = toOriginY - fromOriginY; - - if (offsetX || offsetY) { - dim = this._getTransformedDimensions(); - x = point.x + offsetX * dim.x; - y = point.y + offsetY * dim.y; - } - - return new fabric.Point(x, y); - }, - - /** - * Translates the coordinates from origin to center coordinates (based on the object's dimensions) - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToCenterPoint: function(point, originX, originY) { - var p = this.translateToGivenOrigin(point, originX, originY, 'center', 'center'); - if (this.angle) { - return fabric.util.rotatePoint(p, point, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Translates the coordinates from center to origin coordinates (based on the object's dimensions) - * @param {fabric.Point} center The point which corresponds to center of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - translateToOriginPoint: function(center, originX, originY) { - var p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - if (this.angle) { - return fabric.util.rotatePoint(p, center, degreesToRadians(this.angle)); - } - return p; - }, - - /** - * Returns the real center coordinates of the object - * @return {fabric.Point} - */ - getCenterPoint: function() { - var leftTop = new fabric.Point(this.left, this.top); - return this.translateToCenterPoint(leftTop, this.originX, this.originY); - }, - - /** - * Returns the coordinates of the object based on center coordinates - * @param {fabric.Point} point The point which corresponds to the originX and originY params - * @return {fabric.Point} - */ - // getOriginPoint: function(center) { - // return this.translateToOriginPoint(center, this.originX, this.originY); - // }, - - /** - * Returns the coordinates of the object as if it has a different origin - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - getPointByOrigin: function(originX, originY) { - var center = this.getCenterPoint(); - return this.translateToOriginPoint(center, originX, originY); - }, - - /** - * Returns the point in local coordinates - * @param {fabric.Point} point The point relative to the global coordinate system - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {fabric.Point} - */ - toLocalPoint: function(point, originX, originY) { - var center = this.getCenterPoint(), - p, p2; - - if (typeof originX !== 'undefined' && typeof originY !== 'undefined' ) { - p = this.translateToGivenOrigin(center, 'center', 'center', originX, originY); - } - else { - p = new fabric.Point(this.left, this.top); - } - - p2 = new fabric.Point(point.x, point.y); - if (this.angle) { - p2 = fabric.util.rotatePoint(p2, center, -degreesToRadians(this.angle)); - } - return p2.subtractEquals(p); - }, - - /** - * Returns the point in global coordinates - * @param {fabric.Point} The point relative to the local coordinate system - * @return {fabric.Point} - */ - // toGlobalPoint: function(point) { - // return fabric.util.rotatePoint(point, this.getCenterPoint(), degreesToRadians(this.angle)).addEquals(new fabric.Point(this.left, this.top)); - // }, - - /** - * Sets the position of the object taking into consideration the object's origin - * @param {fabric.Point} pos The new position of the object - * @param {String} originX Horizontal origin: 'left', 'center' or 'right' - * @param {String} originY Vertical origin: 'top', 'center' or 'bottom' - * @return {void} - */ - setPositionByOrigin: function(pos, originX, originY) { - var center = this.translateToCenterPoint(pos, originX, originY), - position = this.translateToOriginPoint(center, this.originX, this.originY); - this.set('left', position.x); - this.set('top', position.y); - }, - - /** - * @param {String} to One of 'left', 'center', 'right' - */ - adjustPosition: function(to) { - var angle = degreesToRadians(this.angle), - hypotFull = this.getScaledWidth(), - xFull = fabric.util.cos(angle) * hypotFull, - yFull = fabric.util.sin(angle) * hypotFull, - offsetFrom, offsetTo; - - //TODO: this function does not consider mixed situation like top, center. - if (typeof this.originX === 'string') { - offsetFrom = originXOffset[this.originX]; - } - else { - offsetFrom = this.originX - 0.5; - } - if (typeof to === 'string') { - offsetTo = originXOffset[to]; - } - else { - offsetTo = to - 0.5; - } - this.left += xFull * (offsetTo - offsetFrom); - this.top += yFull * (offsetTo - offsetFrom); - this.setCoords(); - this.originX = to; - }, - - /** - * Sets the origin/position of the object to it's center point - * @private - * @return {void} - */ - _setOriginToCenter: function() { - this._originalOriginX = this.originX; - this._originalOriginY = this.originY; - - var center = this.getCenterPoint(); - - this.originX = 'center'; - this.originY = 'center'; - - this.left = center.x; - this.top = center.y; - }, - - /** - * Resets the origin/position of the object to it's original origin - * @private - * @return {void} - */ - _resetOrigin: function() { - var originPoint = this.translateToOriginPoint( - this.getCenterPoint(), - this._originalOriginX, - this._originalOriginY); - - this.originX = this._originalOriginX; - this.originY = this._originalOriginY; - - this.left = originPoint.x; - this.top = originPoint.y; - - this._originalOriginX = null; - this._originalOriginY = null; - }, - - /** - * @private - */ - _getLeftTopCoords: function() { - return this.translateToOriginPoint(this.getCenterPoint(), 'left', 'top'); - }, - }); - -})(); - - -(function() { - - function arrayFromCoords(coords) { - return [ - new fabric.Point(coords.tl.x, coords.tl.y), - new fabric.Point(coords.tr.x, coords.tr.y), - new fabric.Point(coords.br.x, coords.br.y), - new fabric.Point(coords.bl.x, coords.bl.y) - ]; - } - - var util = fabric.util, - degreesToRadians = util.degreesToRadians, - multiplyMatrices = util.multiplyTransformMatrices, - transformPoint = util.transformPoint; - - util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Describe object's corner position in canvas element coordinates. - * properties are depending on control keys and padding the main controls. - * each property is an object with x, y and corner. - * The `corner` property contains in a similar manner the 4 points of the - * interactive area of the corner. - * The coordinates depends from the controls positionHandler and are used - * to draw and locate controls - * @memberOf fabric.Object.prototype - */ - oCoords: null, - - /** - * Describe object's corner position in canvas object absolute coordinates - * properties are tl,tr,bl,br and describe the four main corner. - * each property is an object with x, y, instance of Fabric.Point. - * The coordinates depends from this properties: width, height, scaleX, scaleY - * skewX, skewY, angle, strokeWidth, top, left. - * Those coordinates are useful to understand where an object is. They get updated - * with oCoords but they do not need to be updated when zoom or panning change. - * The coordinates get updated with @method setCoords. - * You can calculate them without updating with @method calcACoords(); - * @memberOf fabric.Object.prototype - */ - aCoords: null, - - /** - * Describe object's corner position in canvas element coordinates. - * includes padding. Used of object detection. - * set and refreshed with setCoords. - * @memberOf fabric.Object.prototype - */ - lineCoords: null, - - /** - * storage for object transform matrix - */ - ownMatrixCache: null, - - /** - * storage for object full transform matrix - */ - matrixCache: null, - - /** - * custom controls interface - * controls are added by default_controls.js - */ - controls: { }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * @param {Boolean} absolute will return aCoords if true or lineCoords - * @return {Object} {tl, tr, br, bl} points - */ - _getCoords: function(absolute, calculate) { - if (calculate) { - return (absolute ? this.calcACoords() : this.calcLineCoords()); - } - if (!this.aCoords || !this.lineCoords) { - this.setCoords(true); - } - return (absolute ? this.aCoords : this.lineCoords); - }, - - /** - * return correct set of coordinates for intersection - * this will return either aCoords or lineCoords. - * The coords are returned in an array. - * @return {Array} [tl, tr, br, bl] of points - */ - getCoords: function(absolute, calculate) { - return arrayFromCoords(this._getCoords(absolute, calculate)); - }, - - /** - * Checks if object intersects with an area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with an area formed by 2 points - */ - intersectsWithRect: function(pointTL, pointBR, absolute, calculate) { - var coords = this.getCoords(absolute, calculate), - intersection = fabric.Intersection.intersectPolygonRectangle( - coords, - pointTL, - pointBR - ); - return intersection.status === 'Intersection'; - }, - - /** - * Checks if object intersects with another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object intersects with another object - */ - intersectsWithObject: function(other, absolute, calculate) { - var intersection = fabric.Intersection.intersectPolygonPolygon( - this.getCoords(absolute, calculate), - other.getCoords(absolute, calculate) - ); - - return intersection.status === 'Intersection' - || other.isContainedWithinObject(this, absolute, calculate) - || this.isContainedWithinObject(other, absolute, calculate); - }, - - /** - * Checks if object is fully contained within area of another object - * @param {Object} other Object to test - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area of another object - */ - isContainedWithinObject: function(other, absolute, calculate) { - var points = this.getCoords(absolute, calculate), - otherCoords = absolute ? other.aCoords : other.lineCoords, - i = 0, lines = other._getImageLines(otherCoords); - for (; i < 4; i++) { - if (!other.containsPoint(points[i], lines)) { - return false; - } - } - return true; - }, - - /** - * Checks if object is fully contained within area formed by 2 points - * @param {Object} pointTL top-left point of area - * @param {Object} pointBR bottom-right point of area - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is fully contained within area formed by 2 points - */ - isContainedWithinRect: function(pointTL, pointBR, absolute, calculate) { - var boundingRect = this.getBoundingRect(absolute, calculate); - - return ( - boundingRect.left >= pointTL.x && - boundingRect.left + boundingRect.width <= pointBR.x && - boundingRect.top >= pointTL.y && - boundingRect.top + boundingRect.height <= pointBR.y - ); - }, - - /** - * Checks if point is inside the object - * @param {fabric.Point} point Point to check against - * @param {Object} [lines] object returned from @method _getImageLines - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if point is inside the object - */ - containsPoint: function(point, lines, absolute, calculate) { - var coords = this._getCoords(absolute, calculate), - lines = lines || this._getImageLines(coords), - xPoints = this._findCrossPoints(point, lines); - // if xPoints is odd then point is inside the object - return (xPoints !== 0 && xPoints % 2 === 1); - }, - - /** - * Checks if object is contained within the canvas with current viewportTransform - * the check is done stopping at first point that appears on screen - * @param {Boolean} [calculate] use coordinates of current position instead of .aCoords - * @return {Boolean} true if object is fully or partially contained within canvas - */ - isOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - var points = this.getCoords(true, calculate); - // if some point is on screen, the object is on screen. - if (points.some(function(point) { - return point.x <= pointBR.x && point.x >= pointTL.x && - point.y <= pointBR.y && point.y >= pointTL.y; - })) { - return true; - } - // no points on screen, check intersection with absolute coordinates - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - return this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Checks if the object contains the midpoint between canvas extremities - * Does not make sense outside the context of isOnScreen and isPartiallyOnScreen - * @private - * @param {Fabric.Point} pointTL Top Left point - * @param {Fabric.Point} pointBR Top Right point - * @param {Boolean} calculate use coordinates of current position instead of .oCoords - * @return {Boolean} true if the object contains the point - */ - _containsCenterOfCanvas: function(pointTL, pointBR, calculate) { - // worst case scenario the object is so big that contains the screen - var centerPoint = { x: (pointTL.x + pointBR.x) / 2, y: (pointTL.y + pointBR.y) / 2 }; - if (this.containsPoint(centerPoint, null, true, calculate)) { - return true; - } - return false; - }, - - /** - * Checks if object is partially contained within the canvas with current viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords - * @return {Boolean} true if object is partially contained within canvas - */ - isPartiallyOnScreen: function(calculate) { - if (!this.canvas) { - return false; - } - var pointTL = this.canvas.vptCoords.tl, pointBR = this.canvas.vptCoords.br; - if (this.intersectsWithRect(pointTL, pointBR, true, calculate)) { - return true; - } - var allPointsAreOutside = this.getCoords(true, calculate).every(function(point) { - return (point.x >= pointBR.x || point.x <= pointTL.x) && - (point.y >= pointBR.y || point.y <= pointTL.y); - }); - return allPointsAreOutside && this._containsCenterOfCanvas(pointTL, pointBR, calculate); - }, - - /** - * Method that returns an object with the object edges in it, given the coordinates of the corners - * @private - * @param {Object} oCoords Coordinates of the object corners - */ - _getImageLines: function(oCoords) { - - var lines = { - topline: { - o: oCoords.tl, - d: oCoords.tr - }, - rightline: { - o: oCoords.tr, - d: oCoords.br - }, - bottomline: { - o: oCoords.br, - d: oCoords.bl - }, - leftline: { - o: oCoords.bl, - d: oCoords.tl - } - }; - - // // debugging - // if (this.canvas.contextTop) { - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - // } - - return lines; - }, - - /** - * Helper method to determine how many cross points are between the 4 object edges - * and the horizontal line determined by a point on canvas - * @private - * @param {fabric.Point} point Point to check - * @param {Object} lines Coordinates of the object being evaluated - */ - // remove yi, not used but left code here just in case. - _findCrossPoints: function(point, lines) { - var b1, b2, a1, a2, xi, // yi, - xcount = 0, - iLine; - - for (var lineKey in lines) { - iLine = lines[lineKey]; - // optimisation 1: line below point. no cross - if ((iLine.o.y < point.y) && (iLine.d.y < point.y)) { - continue; - } - // optimisation 2: line above point. no cross - if ((iLine.o.y >= point.y) && (iLine.d.y >= point.y)) { - continue; - } - // optimisation 3: vertical line case - if ((iLine.o.x === iLine.d.x) && (iLine.o.x >= point.x)) { - xi = iLine.o.x; - // yi = point.y; - } - // calculate the intersection point - else { - b1 = 0; - b2 = (iLine.d.y - iLine.o.y) / (iLine.d.x - iLine.o.x); - a1 = point.y - b1 * point.x; - a2 = iLine.o.y - b2 * iLine.o.x; - - xi = -(a1 - a2) / (b1 - b2); - // yi = a1 + b1 * xi; - } - // dont count xi < point.x cases - if (xi >= point.x) { - xcount += 1; - } - // optimisation 4: specific for square images - if (xcount === 2) { - break; - } - } - return xcount; - }, - - /** - * Returns coordinates of object's bounding rectangle (left, top, width, height) - * the box is intended as aligned to axis of canvas. - * @param {Boolean} [absolute] use coordinates without viewportTransform - * @param {Boolean} [calculate] use coordinates of current position instead of .oCoords / .aCoords - * @return {Object} Object with left, top, width, height properties - */ - getBoundingRect: function(absolute, calculate) { - var coords = this.getCoords(absolute, calculate); - return util.makeBoundingBoxFromPoints(coords); - }, - - /** - * Returns width of an object's bounding box counting transformations - * before 2.0 it was named getWidth(); - * @return {Number} width value - */ - getScaledWidth: function() { - return this._getTransformedDimensions().x; - }, - - /** - * Returns height of an object bounding box counting transformations - * before 2.0 it was named getHeight(); - * @return {Number} height value - */ - getScaledHeight: function() { - return this._getTransformedDimensions().y; - }, - - /** - * Makes sure the scale is valid and modifies it if necessary - * @private - * @param {Number} value - * @return {Number} - */ - _constrainScale: function(value) { - if (Math.abs(value) < this.minScaleLimit) { - if (value < 0) { - return -this.minScaleLimit; - } - else { - return this.minScaleLimit; - } - } - else if (value === 0) { - return 0.0001; - } - return value; - }, - - /** - * Scales an object (equally by x and y) - * @param {Number} value Scale factor - * @return {fabric.Object} thisArg - * @chainable - */ - scale: function(value) { - this._set('scaleX', value); - this._set('scaleY', value); - return this.setCoords(); - }, - - /** - * Scales an object to a given width, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New width value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToWidth: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).width / this.getScaledWidth(); - return this.scale(value / this.width / boundingRectFactor); - }, - - /** - * Scales an object to a given height, with respect to bounding box (scaling by x/y equally) - * @param {Number} value New height value - * @param {Boolean} absolute ignore viewport - * @return {fabric.Object} thisArg - * @chainable - */ - scaleToHeight: function(value, absolute) { - // adjust to bounding rect factor so that rotated shapes would fit as well - var boundingRectFactor = this.getBoundingRect(absolute).height / this.getScaledHeight(); - return this.scale(value / this.height / boundingRectFactor); - }, - - calcLineCoords: function() { - var vpt = this.getViewportTransform(), - padding = this.padding, angle = degreesToRadians(this.angle), - cos = util.cos(angle), sin = util.sin(angle), - cosP = cos * padding, sinP = sin * padding, cosPSinP = cosP + sinP, - cosPMinusSinP = cosP - sinP, aCoords = this.calcACoords(); - - var lineCoords = { - tl: transformPoint(aCoords.tl, vpt), - tr: transformPoint(aCoords.tr, vpt), - bl: transformPoint(aCoords.bl, vpt), - br: transformPoint(aCoords.br, vpt), - }; - - if (padding) { - lineCoords.tl.x -= cosPMinusSinP; - lineCoords.tl.y -= cosPSinP; - lineCoords.tr.x += cosPSinP; - lineCoords.tr.y -= cosPMinusSinP; - lineCoords.bl.x -= cosPSinP; - lineCoords.bl.y += cosPMinusSinP; - lineCoords.br.x += cosPMinusSinP; - lineCoords.br.y += cosPSinP; - } - - return lineCoords; - }, - - calcOCoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - vpt = this.getViewportTransform(), - startMatrix = multiplyMatrices(vpt, translateMatrix), - finalMatrix = multiplyMatrices(startMatrix, rotateMatrix), - finalMatrix = multiplyMatrices(finalMatrix, [1 / vpt[0], 0, 0, 1 / vpt[3], 0, 0]), - dim = this._calculateCurrentDimensions(), - coords = {}; - this.forEachControl(function(control, key, fabricObject) { - coords[key] = control.positionHandler(dim, finalMatrix, fabricObject); - }); - - // debug code - // var canvas = this.canvas; - // setTimeout(function() { - // canvas.contextTop.clearRect(0, 0, 700, 700); - // canvas.contextTop.fillStyle = 'green'; - // Object.keys(coords).forEach(function(key) { - // var control = coords[key]; - // canvas.contextTop.fillRect(control.x, control.y, 3, 3); - // }); - // }, 50); - return coords; - }, - - calcACoords: function() { - var rotateMatrix = this._calcRotateMatrix(), - translateMatrix = this._calcTranslateMatrix(), - finalMatrix = multiplyMatrices(translateMatrix, rotateMatrix), - dim = this._getTransformedDimensions(), - w = dim.x / 2, h = dim.y / 2; - return { - // corners - tl: transformPoint({ x: -w, y: -h }, finalMatrix), - tr: transformPoint({ x: w, y: -h }, finalMatrix), - bl: transformPoint({ x: -w, y: h }, finalMatrix), - br: transformPoint({ x: w, y: h }, finalMatrix) - }; - }, - - /** - * Sets corner and controls position coordinates based on current angle, width and height, left and top. - * oCoords are used to find the corners - * aCoords are used to quickly find an object on the canvas - * lineCoords are used to quickly find object during pointer events. - * See {@link https://github.com/fabricjs/fabric.js/wiki/When-to-call-setCoords} and {@link http://fabricjs.com/fabric-gotchas} - * - * @param {Boolean} [skipCorners] skip calculation of oCoords. - * @return {fabric.Object} thisArg - * @chainable - */ - setCoords: function(skipCorners) { - this.aCoords = this.calcACoords(); - // in case we are in a group, for how the inner group target check works, - // lineCoords are exactly aCoords. Since the vpt gets absorbed by the normalized pointer. - this.lineCoords = this.group ? this.aCoords : this.calcLineCoords(); - if (skipCorners) { - return this; - } - // set coordinates of the draggable boxes in the corners used to scale/rotate the image - this.oCoords = this.calcOCoords(); - this._setCornerCoords && this._setCornerCoords(); - return this; - }, - - /** - * calculate rotation matrix of an object - * @return {Array} rotation matrix for the object - */ - _calcRotateMatrix: function() { - return util.calcRotateMatrix(this); - }, - - /** - * calculate the translation matrix for an object transform - * @return {Array} rotation matrix for the object - */ - _calcTranslateMatrix: function() { - var center = this.getCenterPoint(); - return [1, 0, 0, 1, center.x, center.y]; - }, - - transformMatrixKey: function(skipGroup) { - var sep = '_', prefix = ''; - if (!skipGroup && this.group) { - prefix = this.group.transformMatrixKey(skipGroup) + sep; - }; - return prefix + this.top + sep + this.left + sep + this.scaleX + sep + this.scaleY + - sep + this.skewX + sep + this.skewY + sep + this.angle + sep + this.originX + sep + this.originY + - sep + this.width + sep + this.height + sep + this.strokeWidth + this.flipX + this.flipY; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties. - * @param {Boolean} [skipGroup] return transform matrix for object not counting parent transformations - * There are some situation in which this is useful to avoid the fake rotation. - * @return {Array} transform matrix for the object - */ - calcTransformMatrix: function(skipGroup) { - var matrix = this.calcOwnMatrix(); - if (skipGroup || !this.group) { - return matrix; - } - var key = this.transformMatrixKey(skipGroup), cache = this.matrixCache || (this.matrixCache = {}); - if (cache.key === key) { - return cache.value; - } - if (this.group) { - matrix = multiplyMatrices(this.group.calcTransformMatrix(false), matrix); - } - cache.key = key; - cache.value = matrix; - return matrix; - }, - - /** - * calculate transform matrix that represents the current transformations from the - * object's properties, this matrix does not include the group transformation - * @return {Array} transform matrix for the object - */ - calcOwnMatrix: function() { - var key = this.transformMatrixKey(true), cache = this.ownMatrixCache || (this.ownMatrixCache = {}); - if (cache.key === key) { - return cache.value; - } - var tMatrix = this._calcTranslateMatrix(), - options = { - angle: this.angle, - translateX: tMatrix[4], - translateY: tMatrix[5], - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: this.skewX, - skewY: this.skewY, - flipX: this.flipX, - flipY: this.flipY, - }; - cache.key = key; - cache.value = util.composeMatrix(options); - return cache.value; - }, - - /* - * Calculate object dimensions from its properties - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getNonTransformedDimensions: function() { - var strokeWidth = this.strokeWidth, - w = this.width + strokeWidth, - h = this.height + strokeWidth; - return { x: w, y: h }; - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param {Number} skewX, a value to override current skewX - * @param {Number} skewY, a value to override current skewY - * @private - * @return {Object} .x width dimension - * @return {Object} .y height dimension - */ - _getTransformedDimensions: function(skewX, skewY) { - if (typeof skewX === 'undefined') { - skewX = this.skewX; - } - if (typeof skewY === 'undefined') { - skewY = this.skewY; - } - var dimensions, dimX, dimY, - noSkew = skewX === 0 && skewY === 0; - - if (this.strokeUniform) { - dimX = this.width; - dimY = this.height; - } - else { - dimensions = this._getNonTransformedDimensions(); - dimX = dimensions.x; - dimY = dimensions.y; - } - if (noSkew) { - return this._finalizeDimensions(dimX * this.scaleX, dimY * this.scaleY); - } - var bbox = util.sizeAfterTransform(dimX, dimY, { - scaleX: this.scaleX, - scaleY: this.scaleY, - skewX: skewX, - skewY: skewY, - }); - return this._finalizeDimensions(bbox.x, bbox.y); - }, - - /* - * Calculate object bounding box dimensions from its properties scale, skew. - * @param Number width width of the bbox - * @param Number height height of the bbox - * @private - * @return {Object} .x finalized width dimension - * @return {Object} .y finalized height dimension - */ - _finalizeDimensions: function(width, height) { - return this.strokeUniform ? - { x: width + this.strokeWidth, y: height + this.strokeWidth } - : - { x: width, y: height }; - }, - - /* - * Calculate object dimensions for controls box, including padding and canvas zoom. - * and active selection - * private - */ - _calculateCurrentDimensions: function() { - var vpt = this.getViewportTransform(), - dim = this._getTransformedDimensions(), - p = transformPoint(dim, vpt, true); - return p.scalarAdd(2 * this.padding); - }, - }); -})(); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Moves an object to the bottom of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - sendToBack: function() { - if (this.group) { - fabric.StaticCanvas.prototype.sendToBack.call(this.group, this); - } - else if (this.canvas) { - this.canvas.sendToBack(this); - } - return this; - }, - - /** - * Moves an object to the top of the stack of drawn objects - * @return {fabric.Object} thisArg - * @chainable - */ - bringToFront: function() { - if (this.group) { - fabric.StaticCanvas.prototype.bringToFront.call(this.group, this); - } - else if (this.canvas) { - this.canvas.bringToFront(this); - } - return this; - }, - - /** - * Moves an object down in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object behind next lower intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - sendBackwards: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.sendBackwards.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.sendBackwards(this, intersecting); - } - return this; - }, - - /** - * Moves an object up in stack of drawn objects - * @param {Boolean} [intersecting] If `true`, send object in front of next upper intersecting object - * @return {fabric.Object} thisArg - * @chainable - */ - bringForward: function(intersecting) { - if (this.group) { - fabric.StaticCanvas.prototype.bringForward.call(this.group, this, intersecting); - } - else if (this.canvas) { - this.canvas.bringForward(this, intersecting); - } - return this; - }, - - /** - * Moves an object to specified level in stack of drawn objects - * @param {Number} index New position of object - * @return {fabric.Object} thisArg - * @chainable - */ - moveTo: function(index) { - if (this.group && this.group.type !== 'activeSelection') { - fabric.StaticCanvas.prototype.moveTo.call(this.group, this, index); - } - else if (this.canvas) { - this.canvas.moveTo(this, index); - } - return this; - } -}); - - -/* _TO_SVG_START_ */ -(function() { - function getSvgColorString(prop, value) { - if (!value) { - return prop + ': none; '; - } - else if (value.toLive) { - return prop + ': url(#SVGID_' + value.id + '); '; - } - else { - var color = new fabric.Color(value), - str = prop + ': ' + color.toRgb() + '; ', - opacity = color.getAlpha(); - if (opacity !== 1) { - //change the color in rgb + opacity - str += prop + '-opacity: ' + opacity.toString() + '; '; - } - return str; - } - } - - var toFixed = fabric.util.toFixed; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - - var fillRule = this.fillRule ? this.fillRule : 'nonzero', - strokeWidth = this.strokeWidth ? this.strokeWidth : '0', - strokeDashArray = this.strokeDashArray ? this.strokeDashArray.join(' ') : 'none', - strokeDashOffset = this.strokeDashOffset ? this.strokeDashOffset : '0', - strokeLineCap = this.strokeLineCap ? this.strokeLineCap : 'butt', - strokeLineJoin = this.strokeLineJoin ? this.strokeLineJoin : 'miter', - strokeMiterLimit = this.strokeMiterLimit ? this.strokeMiterLimit : '4', - opacity = typeof this.opacity !== 'undefined' ? this.opacity : '1', - visibility = this.visible ? '' : ' visibility: hidden;', - filter = skipShadow ? '' : this.getSvgFilter(), - fill = getSvgColorString('fill', this.fill), - stroke = getSvgColorString('stroke', this.stroke); - - return [ - stroke, - 'stroke-width: ', strokeWidth, '; ', - 'stroke-dasharray: ', strokeDashArray, '; ', - 'stroke-linecap: ', strokeLineCap, '; ', - 'stroke-dashoffset: ', strokeDashOffset, '; ', - 'stroke-linejoin: ', strokeLineJoin, '; ', - 'stroke-miterlimit: ', strokeMiterLimit, '; ', - fill, - 'fill-rule: ', fillRule, '; ', - 'opacity: ', opacity, ';', - filter, - visibility - ].join(''); - }, - - /** - * Returns styles-string for svg-export - * @param {Object} style the object from which to retrieve style properties - * @param {Boolean} useWhiteSpace a boolean to include an additional attribute in the style. - * @return {String} - */ - getSvgSpanStyles: function(style, useWhiteSpace) { - var term = '; '; - var fontFamily = style.fontFamily ? - 'font-family: ' + (((style.fontFamily.indexOf('\'') === -1 && style.fontFamily.indexOf('"') === -1) ? - '\'' + style.fontFamily + '\'' : style.fontFamily)) + term : ''; - var strokeWidth = style.strokeWidth ? 'stroke-width: ' + style.strokeWidth + term : '', - fontFamily = fontFamily, - fontSize = style.fontSize ? 'font-size: ' + style.fontSize + 'px' + term : '', - fontStyle = style.fontStyle ? 'font-style: ' + style.fontStyle + term : '', - fontWeight = style.fontWeight ? 'font-weight: ' + style.fontWeight + term : '', - fill = style.fill ? getSvgColorString('fill', style.fill) : '', - stroke = style.stroke ? getSvgColorString('stroke', style.stroke) : '', - textDecoration = this.getSvgTextDecoration(style), - deltaY = style.deltaY ? 'baseline-shift: ' + (-style.deltaY) + '; ' : ''; - if (textDecoration) { - textDecoration = 'text-decoration: ' + textDecoration + term; - } - - return [ - stroke, - strokeWidth, - fontFamily, - fontSize, - fontStyle, - fontWeight, - textDecoration, - fill, - deltaY, - useWhiteSpace ? 'white-space: pre; ' : '' - ].join(''); - }, - - /** - * Returns text-decoration property for svg-export - * @param {Object} style the object from which to retrieve style properties - * @return {String} - */ - getSvgTextDecoration: function(style) { - return ['overline', 'underline', 'line-through'].filter(function(decoration) { - return style[decoration.replace('-', '')]; - }).join(' '); - }, - - /** - * Returns filter for svg shadow - * @return {String} - */ - getSvgFilter: function() { - return this.shadow ? 'filter: url(#SVGID_' + this.shadow.id + ');' : ''; - }, - - /** - * Returns id attribute for svg output - * @return {String} - */ - getSvgCommons: function() { - return [ - this.id ? 'id="' + this.id + '" ' : '', - this.clipPath ? 'clip-path="url(#' + this.clipPath.clipPathId + ')" ' : '', - ].join(''); - }, - - /** - * Returns transform-string for svg-export - * @param {Boolean} use the full transform or the single object one. - * @return {String} - */ - getSvgTransform: function(full, additionalTransform) { - var transform = full ? this.calcTransformMatrix() : this.calcOwnMatrix(), - svgTransform = 'transform="' + fabric.util.matrixToSVG(transform); - return svgTransform + - (additionalTransform || '') + '" '; - }, - - _setSVGBg: function(textBgRects) { - if (this.backgroundColor) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - } - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - return '\t' + this._createBaseClipPathSVGMarkup(this._toSVG(reviver), { reviver: reviver }); - }, - - /** - * @private - */ - _createBaseClipPathSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var reviver = options.reviver, - additionalTransform = options.additionalTransform || '', - commonPieces = [ - this.getSvgTransform(true, additionalTransform), - this.getSvgCommons(), - ].join(''), - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'); - objectMarkup[index] = commonPieces; - return reviver ? reviver(objectMarkup.join('')) : objectMarkup.join(''); - }, - - /** - * @private - */ - _createBaseSVGMarkup: function(objectMarkup, options) { - options = options || {}; - var noStyle = options.noStyle, - reviver = options.reviver, - styleInfo = noStyle ? '' : 'style="' + this.getSvgStyles() + '" ', - shadowInfo = options.withShadow ? 'style="' + this.getSvgFilter() + '" ' : '', - clipPath = this.clipPath, - vectorEffect = this.strokeUniform ? 'vector-effect="non-scaling-stroke" ' : '', - absoluteClipPath = clipPath && clipPath.absolutePositioned, - stroke = this.stroke, fill = this.fill, shadow = this.shadow, - commonPieces, markup = [], clipPathMarkup, - // insert commons in the markup, style and svgCommons - index = objectMarkup.indexOf('COMMON_PARTS'), - additionalTransform = options.additionalTransform; - if (clipPath) { - clipPath.clipPathId = 'CLIPPATH_' + fabric.Object.__uid++; - clipPathMarkup = '\n' + - clipPath.toClipPathSVG(reviver) + - '\n'; - } - if (absoluteClipPath) { - markup.push( - '\n' - ); - } - markup.push( - '\n' - ); - commonPieces = [ - styleInfo, - vectorEffect, - noStyle ? '' : this.addPaintOrder(), ' ', - additionalTransform ? 'transform="' + additionalTransform + '" ' : '', - ].join(''); - objectMarkup[index] = commonPieces; - if (fill && fill.toLive) { - markup.push(fill.toSVG(this)); - } - if (stroke && stroke.toLive) { - markup.push(stroke.toSVG(this)); - } - if (shadow) { - markup.push(shadow.toSVG(this)); - } - if (clipPath) { - markup.push(clipPathMarkup); - } - markup.push(objectMarkup.join('')); - markup.push('\n'); - absoluteClipPath && markup.push('\n'); - return reviver ? reviver(markup.join('')) : markup.join(''); - }, - - addPaintOrder: function() { - return this.paintFirst !== 'fill' ? ' paint-order="' + this.paintFirst + '" ' : ''; - } - }); -})(); -/* _TO_SVG_END_ */ - - -(function() { - - var extend = fabric.util.object.extend, - originalSet = 'stateProperties'; - - /* - Depends on `stateProperties` - */ - function saveProps(origin, destination, props) { - var tmpObj = { }, deep = true; - props.forEach(function(prop) { - tmpObj[prop] = origin[prop]; - }); - - extend(origin[destination], tmpObj, deep); - } - - function _isEqual(origValue, currentValue, firstPass) { - if (origValue === currentValue) { - // if the objects are identical, return - return true; - } - else if (Array.isArray(origValue)) { - if (!Array.isArray(currentValue) || origValue.length !== currentValue.length) { - return false; - } - for (var i = 0, len = origValue.length; i < len; i++) { - if (!_isEqual(origValue[i], currentValue[i])) { - return false; - } - } - return true; - } - else if (origValue && typeof origValue === 'object') { - var keys = Object.keys(origValue), key; - if (!currentValue || - typeof currentValue !== 'object' || - (!firstPass && keys.length !== Object.keys(currentValue).length) - ) { - return false; - } - for (var i = 0, len = keys.length; i < len; i++) { - key = keys[i]; - // since clipPath is in the statefull cache list and the clipPath objects - // would be iterated as an object, this would lead to possible infinite recursion - // we do not want to compare those. - if (key === 'canvas' || key === 'group') { - continue; - } - if (!_isEqual(origValue[key], currentValue[key])) { - return false; - } - } - return true; - } - } - - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * Returns true if object state (one of its state properties) was changed - * @param {String} [propertySet] optional name for the set of property we want to save - * @return {Boolean} true if instance' state has changed since `{@link fabric.Object#saveState}` was called - */ - hasStateChanged: function(propertySet) { - propertySet = propertySet || originalSet; - var dashedPropertySet = '_' + propertySet; - if (Object.keys(this[dashedPropertySet]).length < this[propertySet].length) { - return true; - } - return !_isEqual(this[dashedPropertySet], this, true); - }, - - /** - * Saves state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - saveState: function(options) { - var propertySet = options && options.propertySet || originalSet, - destination = '_' + propertySet; - if (!this[destination]) { - return this.setupState(options); - } - saveProps(this, destination, this[propertySet]); - if (options && options.stateProperties) { - saveProps(this, destination, options.stateProperties); - } - return this; - }, - - /** - * Setups state of an object - * @param {Object} [options] Object with additional `stateProperties` array to include when saving state - * @return {fabric.Object} thisArg - */ - setupState: function(options) { - options = options || { }; - var propertySet = options.propertySet || originalSet; - options.propertySet = propertySet; - this['_' + propertySet] = { }; - this.saveState(options); - return this; - } - }); -})(); - - -(function() { - - var degreesToRadians = fabric.util.degreesToRadians; - - fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Determines which corner has been clicked - * @private - * @param {Object} pointer The pointer indicating the mouse position - * @return {String|Boolean} corner code (tl, tr, bl, br, etc.), or false if nothing is found - */ - _findTargetCorner: function(pointer, forTouch) { - // objects in group, anykind, are not self modificable, - // must not return an hovered corner. - if (!this.hasControls || this.group || (!this.canvas || this.canvas._activeObject !== this)) { - return false; - } - - var ex = pointer.x, - ey = pointer.y, - xPoints, - lines, keys = Object.keys(this.oCoords), - j = keys.length - 1, i; - this.__corner = 0; - - // cycle in reverse order so we pick first the one on top - for (; j >= 0; j--) { - i = keys[j]; - if (!this.isControlVisible(i)) { - continue; - } - - lines = this._getImageLines(forTouch ? this.oCoords[i].touchCorner : this.oCoords[i].corner); - // // debugging - // - // this.canvas.contextTop.fillRect(lines.bottomline.d.x, lines.bottomline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.bottomline.o.x, lines.bottomline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.leftline.d.x, lines.leftline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.leftline.o.x, lines.leftline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.topline.d.x, lines.topline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.topline.o.x, lines.topline.o.y, 2, 2); - // - // this.canvas.contextTop.fillRect(lines.rightline.d.x, lines.rightline.d.y, 2, 2); - // this.canvas.contextTop.fillRect(lines.rightline.o.x, lines.rightline.o.y, 2, 2); - - xPoints = this._findCrossPoints({ x: ex, y: ey }, lines); - if (xPoints !== 0 && xPoints % 2 === 1) { - this.__corner = i; - return i; - } - } - return false; - }, - - /** - * Calls a function for each control. The function gets called, - * with the control, the object that is calling the iterator and the control's key - * @param {Function} fn function to iterate over the controls over - */ - forEachControl: function(fn) { - for (var i in this.controls) { - fn(this.controls[i], i, this); - }; - }, - - /** - * Sets the coordinates of the draggable boxes in the corners of - * the image used to scale/rotate it. - * note: if we would switch to ROUND corner area, all of this would disappear. - * everything would resolve to a single point and a pythagorean theorem for the distance - * @private - */ - _setCornerCoords: function() { - var coords = this.oCoords; - - for (var control in coords) { - var controlObject = this.controls[control]; - coords[control].corner = controlObject.calcCornerCoords( - this.angle, this.cornerSize, coords[control].x, coords[control].y, false); - coords[control].touchCorner = controlObject.calcCornerCoords( - this.angle, this.touchCornerSize, coords[control].x, coords[control].y, true); - } - }, - - /** - * Draws a colored layer behind the object, inside its selection borders. - * Requires public options: padding, selectionBackgroundColor - * this function is called when the context is transformed - * has checks to be skipped when the object is on a staticCanvas - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @return {fabric.Object} thisArg - * @chainable - */ - drawSelectionBackground: function(ctx) { - if (!this.selectionBackgroundColor || - (this.canvas && !this.canvas.interactive) || - (this.canvas && this.canvas._activeObject !== this) - ) { - return this; - } - ctx.save(); - var center = this.getCenterPoint(), wh = this._calculateCurrentDimensions(), - vpt = this.canvas.viewportTransform; - ctx.translate(center.x, center.y); - ctx.scale(1 / vpt[0], 1 / vpt[3]); - ctx.rotate(degreesToRadians(this.angle)); - ctx.fillStyle = this.selectionBackgroundColor; - ctx.fillRect(-wh.x / 2, -wh.y / 2, wh.x, wh.y); - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBorders: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - var wh = this._calculateCurrentDimensions(), - strokeWidth = this.borderScaleFactor, - width = wh.x + strokeWidth, - height = wh.y + strokeWidth, - hasControls = typeof styleOverride.hasControls !== 'undefined' ? - styleOverride.hasControls : this.hasControls, - shouldStroke = false; - - ctx.save(); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); - - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - if (hasControls) { - ctx.beginPath(); - this.forEachControl(function(control, key, fabricObject) { - // in this moment, the ctx is centered on the object. - // width and height of the above function are the size of the bbox. - if (control.withConnection && control.getVisibility(fabricObject, key)) { - // reset movement for each control - shouldStroke = true; - ctx.moveTo(control.x * width, control.y * height); - ctx.lineTo( - control.x * width + control.offsetX, - control.y * height + control.offsetY - ); - } - }); - if (shouldStroke) { - ctx.stroke(); - } - } - ctx.restore(); - return this; - }, - - /** - * Draws borders of an object's bounding box when it is inside a group. - * Requires public properties: width, height - * Requires public options: padding, borderColor - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {object} options object representing current object parameters - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawBordersInGroup: function(ctx, options, styleOverride) { - styleOverride = styleOverride || {}; - var bbox = fabric.util.sizeAfterTransform(this.width, this.height, options), - strokeWidth = this.strokeWidth, - strokeUniform = this.strokeUniform, - borderScaleFactor = this.borderScaleFactor, - width = - bbox.x + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleX) + borderScaleFactor, - height = - bbox.y + strokeWidth * (strokeUniform ? this.canvas.getZoom() : options.scaleY) + borderScaleFactor; - ctx.save(); - this._setLineDash(ctx, styleOverride.borderDashArray || this.borderDashArray); - ctx.strokeStyle = styleOverride.borderColor || this.borderColor; - ctx.strokeRect( - -width / 2, - -height / 2, - width, - height - ); - - ctx.restore(); - return this; - }, - - /** - * Draws corners of an object's bounding box. - * Requires public properties: width, height - * Requires public options: cornerSize, padding - * @param {CanvasRenderingContext2D} ctx Context to draw on - * @param {Object} styleOverride object to override the object style - * @return {fabric.Object} thisArg - * @chainable - */ - drawControls: function(ctx, styleOverride) { - styleOverride = styleOverride || {}; - ctx.save(); - var retinaScaling = this.canvas.getRetinaScaling(), matrix, p; - ctx.setTransform(retinaScaling, 0, 0, retinaScaling, 0, 0); - ctx.strokeStyle = ctx.fillStyle = styleOverride.cornerColor || this.cornerColor; - if (!this.transparentCorners) { - ctx.strokeStyle = styleOverride.cornerStrokeColor || this.cornerStrokeColor; - } - this._setLineDash(ctx, styleOverride.cornerDashArray || this.cornerDashArray); - this.setCoords(); - if (this.group) { - // fabricJS does not really support drawing controls inside groups, - // this piece of code here helps having at least the control in places. - // If an application needs to show some objects as selected because of some UI state - // can still call Object._renderControls() on any object they desire, independently of groups. - // using no padding, circular controls and hiding the rotating cursor is higly suggested, - matrix = this.group.calcTransformMatrix(); - } - this.forEachControl(function(control, key, fabricObject) { - p = fabricObject.oCoords[key]; - if (control.getVisibility(fabricObject, key)) { - if (matrix) { - p = fabric.util.transformPoint(p, matrix); - } - control.render(ctx, p.x, p.y, styleOverride, fabricObject); - } - }); - ctx.restore(); - - return this; - }, - - /** - * Returns true if the specified control is visible, false otherwise. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @returns {Boolean} true if the specified control is visible, false otherwise - */ - isControlVisible: function(controlKey) { - return this.controls[controlKey] && this.controls[controlKey].getVisibility(this, controlKey); - }, - - /** - * Sets the visibility of the specified control. - * @param {String} controlKey The key of the control. Possible values are 'tl', 'tr', 'br', 'bl', 'ml', 'mt', 'mr', 'mb', 'mtr'. - * @param {Boolean} visible true to set the specified control visible, false otherwise - * @return {fabric.Object} thisArg - * @chainable - */ - setControlVisible: function(controlKey, visible) { - if (!this._controlsVisibility) { - this._controlsVisibility = {}; - } - this._controlsVisibility[controlKey] = visible; - return this; - }, - - /** - * Sets the visibility state of object controls. - * @param {Object} [options] Options object - * @param {Boolean} [options.bl] true to enable the bottom-left control, false to disable it - * @param {Boolean} [options.br] true to enable the bottom-right control, false to disable it - * @param {Boolean} [options.mb] true to enable the middle-bottom control, false to disable it - * @param {Boolean} [options.ml] true to enable the middle-left control, false to disable it - * @param {Boolean} [options.mr] true to enable the middle-right control, false to disable it - * @param {Boolean} [options.mt] true to enable the middle-top control, false to disable it - * @param {Boolean} [options.tl] true to enable the top-left control, false to disable it - * @param {Boolean} [options.tr] true to enable the top-right control, false to disable it - * @param {Boolean} [options.mtr] true to enable the middle-top-rotate control, false to disable it - * @return {fabric.Object} thisArg - * @chainable - */ - setControlsVisibility: function(options) { - options || (options = { }); - - for (var p in options) { - this.setControlVisible(p, options[p]); - } - return this; - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to deselect this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onDeselect: function() { - // implemented by sub-classes, as needed. - }, - - - /** - * This callback function is called every time _discardActiveObject or _setActiveObject - * try to to select this object. If the function returns true, the process is cancelled - * @param {Object} [options] options sent from the upper functions - * @param {Event} [options.e] event if the process is generated by an event - */ - onSelect: function() { - // implemented by sub-classes, as needed. - } - }); -})(); - - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Animation duration (in ms) for fx* methods - * @type Number - * @default - */ - FX_DURATION: 500, - - /** - * Centers object horizontally with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.AnimationContext} context - */ - fxCenterObjectH: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - return fabric.util.animate({ - target: this, - startValue: object.left, - endValue: this.getCenterPoint().x, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('left', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - }, - - /** - * Centers object vertically with animation. - * @param {fabric.Object} object Object to center - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.AnimationContext} context - */ - fxCenterObjectV: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - return fabric.util.animate({ - target: this, - startValue: object.top, - endValue: this.getCenterPoint().y, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('top', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function() { - object.setCoords(); - onComplete(); - } - }); - }, - - /** - * Same as `fabric.Canvas#remove` but animated - * @param {fabric.Object} object Object to remove - * @param {Object} [callbacks] Callbacks object with optional "onComplete" and/or "onChange" properties - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.AnimationContext} context - */ - fxRemove: function (object, callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - return fabric.util.animate({ - target: this, - startValue: object.opacity, - endValue: 0, - duration: this.FX_DURATION, - onChange: function(value) { - object.set('opacity', value); - _this.requestRenderAll(); - onChange(); - }, - onComplete: function () { - _this.remove(object); - onComplete(); - } - }); - } -}); - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - /** - * Animates object's properties - * @param {String|Object} property Property to animate (if string) or properties to animate (if object) - * @param {Number|Object} value Value to animate property to (if string was given first) or options object - * @return {fabric.Object} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#animation} - * @return {fabric.AnimationContext | fabric.AnimationContext[]} animation context (or an array if passed multiple properties) - * - * As object — multiple properties - * - * object.animate({ left: ..., top: ... }); - * object.animate({ left: ..., top: ... }, { duration: ... }); - * - * As string — one property - * - * object.animate('left', ...); - * object.animate('left', { duration: ... }); - * - */ - animate: function () { - if (arguments[0] && typeof arguments[0] === 'object') { - var propsToAnimate = [], prop, skipCallbacks, out = []; - for (prop in arguments[0]) { - propsToAnimate.push(prop); - } - for (var i = 0, len = propsToAnimate.length; i < len; i++) { - prop = propsToAnimate[i]; - skipCallbacks = i !== len - 1; - out.push(this._animate(prop, arguments[0][prop], arguments[1], skipCallbacks)); - } - return out; - } - else { - return this._animate.apply(this, arguments); - } - }, - - /** - * @private - * @param {String} property Property to animate - * @param {String} to Value to animate to - * @param {Object} [options] Options object - * @param {Boolean} [skipCallbacks] When true, callbacks like onchange and oncomplete are not invoked - */ - _animate: function(property, to, options, skipCallbacks) { - var _this = this, propPair; - - to = to.toString(); - - if (!options) { - options = { }; - } - else { - options = fabric.util.object.clone(options); - } - - if (~property.indexOf('.')) { - propPair = property.split('.'); - } - - var propIsColor = - _this.colorProperties.indexOf(property) > -1 || - (propPair && _this.colorProperties.indexOf(propPair[1]) > -1); - - var currentValue = propPair - ? this.get(propPair[0])[propPair[1]] - : this.get(property); - - if (!('from' in options)) { - options.from = currentValue; - } - - if (!propIsColor) { - if (~to.indexOf('=')) { - to = currentValue + parseFloat(to.replace('=', '')); - } - else { - to = parseFloat(to); - } - } - - var _options = { - target: this, - startValue: options.from, - endValue: to, - byValue: options.by, - easing: options.easing, - duration: options.duration, - abort: options.abort && function(value, valueProgress, timeProgress) { - return options.abort.call(_this, value, valueProgress, timeProgress); - }, - onChange: function (value, valueProgress, timeProgress) { - if (propPair) { - _this[propPair[0]][propPair[1]] = value; - } - else { - _this.set(property, value); - } - if (skipCallbacks) { - return; - } - options.onChange && options.onChange(value, valueProgress, timeProgress); - }, - onComplete: function (value, valueProgress, timeProgress) { - if (skipCallbacks) { - return; - } - - _this.setCoords(); - options.onComplete && options.onComplete(value, valueProgress, timeProgress); - } - }; - - if (propIsColor) { - return fabric.util.animateColor(_options.startValue, _options.endValue, _options.duration, _options); - } - else { - return fabric.util.animate(_options); - } - } -}); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - coordProps = { x1: 1, x2: 1, y1: 1, y2: 1 }; - - if (fabric.Line) { - fabric.warn('fabric.Line is already defined'); - return; - } - - /** - * Line class - * @class fabric.Line - * @extends fabric.Object - * @see {@link fabric.Line#initialize} for constructor definition - */ - fabric.Line = fabric.util.createClass(fabric.Object, /** @lends fabric.Line.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'line', - - /** - * x value or first line edge - * @type Number - * @default - */ - x1: 0, - - /** - * y value or first line edge - * @type Number - * @default - */ - y1: 0, - - /** - * x value or second line edge - * @type Number - * @default - */ - x2: 0, - - /** - * y value or second line edge - * @type Number - * @default - */ - y2: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('x1', 'x2', 'y1', 'y2'), - - /** - * Constructor - * @param {Array} [points] Array of points - * @param {Object} [options] Options object - * @return {fabric.Line} thisArg - */ - initialize: function(points, options) { - if (!points) { - points = [0, 0, 0, 0]; - } - - this.callSuper('initialize', options); - - this.set('x1', points[0]); - this.set('y1', points[1]); - this.set('x2', points[2]); - this.set('y2', points[3]); - - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Object} [options] Options - */ - _setWidthHeight: function(options) { - options || (options = { }); - - this.width = Math.abs(this.x2 - this.x1); - this.height = Math.abs(this.y2 - this.y1); - - this.left = 'left' in options - ? options.left - : this._getLeftToOriginX(); - - this.top = 'top' in options - ? options.top - : this._getTopToOriginY(); - }, - - /** - * @private - * @param {String} key - * @param {*} value - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - if (typeof coordProps[key] !== 'undefined') { - this._setWidthHeight(); - } - return this; - }, - - /** - * @private - * @return {Number} leftToOriginX Distance from left edge of canvas to originX of Line. - */ - _getLeftToOriginX: makeEdgeToOriginGetter( - { // property names - origin: 'originX', - axis1: 'x1', - axis2: 'x2', - dimension: 'width' - }, - { // possible values of origin - nearest: 'left', - center: 'center', - farthest: 'right' - } - ), - - /** - * @private - * @return {Number} topToOriginY Distance from top edge of canvas to originY of Line. - */ - _getTopToOriginY: makeEdgeToOriginGetter( - { // property names - origin: 'originY', - axis1: 'y1', - axis2: 'y2', - dimension: 'height' - }, - { // possible values of origin - nearest: 'top', - center: 'center', - farthest: 'bottom' - } - ), - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - - - var p = this.calcLinePoints(); - ctx.moveTo(p.x1, p.y1); - ctx.lineTo(p.x2, p.y2); - - ctx.lineWidth = this.strokeWidth; - - // TODO: test this - // make sure setting "fill" changes color of a line - // (by copying fillStyle to strokeStyle, since line is stroked, not filled) - var origStrokeStyle = ctx.strokeStyle; - ctx.strokeStyle = this.stroke || ctx.fillStyle; - this.stroke && this._renderStroke(ctx); - ctx.strokeStyle = origStrokeStyle; - }, - - /** - * This function is an helper for svg import. it returns the center of the object in the svg - * untransformed coordinates - * @private - * @return {Object} center point from element coordinates - */ - _findCenterFromElement: function() { - return { - x: (this.x1 + this.x2) / 2, - y: (this.y1 + this.y2) / 2, - }; - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), this.calcLinePoints()); - }, - - /* - * Calculate object dimensions from its properties - * @private - */ - _getNonTransformedDimensions: function() { - var dim = this.callSuper('_getNonTransformedDimensions'); - if (this.strokeLineCap === 'butt') { - if (this.width === 0) { - dim.y -= this.strokeWidth; - } - if (this.height === 0) { - dim.x -= this.strokeWidth; - } - } - return dim; - }, - - /** - * Recalculates line points given width and height - * @private - */ - calcLinePoints: function() { - var xMult = this.x1 <= this.x2 ? -1 : 1, - yMult = this.y1 <= this.y2 ? -1 : 1, - x1 = (xMult * this.width * 0.5), - y1 = (yMult * this.height * 0.5), - x2 = (xMult * this.width * -0.5), - y2 = (yMult * this.height * -0.5); - - return { - x1: x1, - x2: x2, - y1: y1, - y2: y2 - }; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var p = this.calcLinePoints(); - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Line.fromElement}) - * @static - * @memberOf fabric.Line - * @see http://www.w3.org/TR/SVG/shapes.html#LineElement - */ - fabric.Line.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x1 y1 x2 y2'.split(' ')); - - /** - * Returns fabric.Line instance from an SVG element - * @static - * @memberOf fabric.Line - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} [callback] callback function invoked after parsing - */ - fabric.Line.fromElement = function(element, callback, options) { - options = options || { }; - var parsedAttributes = fabric.parseAttributes(element, fabric.Line.ATTRIBUTE_NAMES), - points = [ - parsedAttributes.x1 || 0, - parsedAttributes.y1 || 0, - parsedAttributes.x2 || 0, - parsedAttributes.y2 || 0 - ]; - callback(new fabric.Line(points, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Line instance from an object representation - * @static - * @memberOf fabric.Line - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Line.fromObject = function(object, callback) { - function _callback(instance) { - delete instance.points; - callback && callback(instance); - }; - var options = clone(object, true); - options.points = [object.x1, object.y1, object.x2, object.y2]; - fabric.Object._fromObject('Line', options, _callback, 'points'); - }; - - /** - * Produces a function that calculates distance from canvas edge to Line origin. - */ - function makeEdgeToOriginGetter(propertyNames, originValues) { - var origin = propertyNames.origin, - axis1 = propertyNames.axis1, - axis2 = propertyNames.axis2, - dimension = propertyNames.dimension, - nearest = originValues.nearest, - center = originValues.center, - farthest = originValues.farthest; - - return function() { - switch (this.get(origin)) { - case nearest: - return Math.min(this.get(axis1), this.get(axis2)); - case center: - return Math.min(this.get(axis1), this.get(axis2)) + (0.5 * this.get(dimension)); - case farthest: - return Math.max(this.get(axis1), this.get(axis2)); - } - }; - - } - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - degreesToRadians = fabric.util.degreesToRadians; - - if (fabric.Circle) { - fabric.warn('fabric.Circle is already defined.'); - return; - } - - /** - * Circle class - * @class fabric.Circle - * @extends fabric.Object - * @see {@link fabric.Circle#initialize} for constructor definition - */ - fabric.Circle = fabric.util.createClass(fabric.Object, /** @lends fabric.Circle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'circle', - - /** - * Radius of this circle - * @type Number - * @default - */ - radius: 0, - - /** - * degrees of start of the circle. - * probably will change to degrees in next major version - * @type Number 0 - 359 - * @default 0 - */ - startAngle: 0, - - /** - * End angle of the circle - * probably will change to degrees in next major version - * @type Number 1 - 360 - * @default 360 - */ - endAngle: 360, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('radius', 'startAngle', 'endAngle'), - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Circle} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - - if (key === 'radius') { - this.setRadius(value); - } - - return this; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['radius', 'startAngle', 'endAngle'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString, x = 0, y = 0, - angle = (this.endAngle - this.startAngle) % 360; - - if (angle === 0) { - svgString = [ - '\n' - ]; - } - else { - var start = degreesToRadians(this.startAngle), - end = degreesToRadians(this.endAngle), - radius = this.radius, - startX = fabric.util.cos(start) * radius, - startY = fabric.util.sin(start) * radius, - endX = fabric.util.cos(end) * radius, - endY = fabric.util.sin(end) * radius, - largeFlag = angle > 180 ? '1' : '0'; - svgString = [ - '\n' - ]; - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.arc( - 0, - 0, - this.radius, - degreesToRadians(this.startAngle), - degreesToRadians(this.endAngle), - false - ); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusX: function() { - return this.get('radius') * this.get('scaleX'); - }, - - /** - * Returns vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRadiusY: function() { - return this.get('radius') * this.get('scaleY'); - }, - - /** - * Sets radius of an object (and updates width accordingly) - * @return {fabric.Circle} thisArg - */ - setRadius: function(value) { - this.radius = value; - return this.set('width', value * 2).set('height', value * 2); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Circle.fromElement}) - * @static - * @memberOf fabric.Circle - * @see: http://www.w3.org/TR/SVG/shapes.html#CircleElement - */ - fabric.Circle.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy r'.split(' ')); - - /** - * Returns {@link fabric.Circle} instance from an SVG element - * @static - * @memberOf fabric.Circle - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @param {Object} [options] Options object - * @throws {Error} If value of `r` attribute is missing or invalid - */ - fabric.Circle.fromElement = function(element, callback) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Circle.ATTRIBUTE_NAMES); - - if (!isValidRadius(parsedAttributes)) { - throw new Error('value of `r` attribute is required and can not be negative'); - } - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.radius; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.radius; - callback(new fabric.Circle(parsedAttributes)); - }; - - /** - * @private - */ - function isValidRadius(attributes) { - return (('radius' in attributes) && (attributes.radius >= 0)); - } - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Circle} instance from an object representation - * @static - * @memberOf fabric.Circle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {void} - */ - fabric.Circle.fromObject = function(object, callback) { - fabric.Object._fromObject('Circle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.Triangle) { - fabric.warn('fabric.Triangle is already defined'); - return; - } - - /** - * Triangle class - * @class fabric.Triangle - * @extends fabric.Object - * @return {fabric.Triangle} thisArg - * @see {@link fabric.Triangle#initialize} for constructor definition - */ - fabric.Triangle = fabric.util.createClass(fabric.Object, /** @lends fabric.Triangle.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'triangle', - - /** - * Width is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - width: 100, - - /** - * Height is set to 100 to compensate the old initialize code that was setting it to 100 - * @type Number - * @default - */ - height: 100, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2; - - ctx.beginPath(); - ctx.moveTo(-widthBy2, heightBy2); - ctx.lineTo(0, -heightBy2); - ctx.lineTo(widthBy2, heightBy2); - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var widthBy2 = this.width / 2, - heightBy2 = this.height / 2, - points = [ - -widthBy2 + ' ' + heightBy2, - '0 ' + -heightBy2, - widthBy2 + ' ' + heightBy2 - ].join(','); - return [ - '' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Triangle} instance from an object representation - * @static - * @memberOf fabric.Triangle - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - */ - fabric.Triangle.fromObject = function(object, callback) { - return fabric.Object._fromObject('Triangle', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - piBy2 = Math.PI * 2; - - if (fabric.Ellipse) { - fabric.warn('fabric.Ellipse is already defined.'); - return; - } - - /** - * Ellipse class - * @class fabric.Ellipse - * @extends fabric.Object - * @return {fabric.Ellipse} thisArg - * @see {@link fabric.Ellipse#initialize} for constructor definition - */ - fabric.Ellipse = fabric.util.createClass(fabric.Object, /** @lends fabric.Ellipse.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'ellipse', - - /** - * Horizontal radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {fabric.Ellipse} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this.set('rx', options && options.rx || 0); - this.set('ry', options && options.ry || 0); - }, - - /** - * @private - * @param {String} key - * @param {*} value - * @return {fabric.Ellipse} thisArg - */ - _set: function(key, value) { - this.callSuper('_set', key, value); - switch (key) { - - case 'rx': - this.rx = value; - this.set('width', value * 2); - break; - - case 'ry': - this.ry = value; - this.set('height', value * 2); - break; - - } - return this; - }, - - /** - * Returns horizontal radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRx: function() { - return this.get('rx') * this.get('scaleX'); - }, - - /** - * Returns Vertical radius of an object (according to how an object is scaled) - * @return {Number} - */ - getRy: function() { - return this.get('ry') * this.get('scaleY'); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render on - */ - _render: function(ctx) { - ctx.beginPath(); - ctx.save(); - ctx.transform(1, 0, 0, this.ry / this.rx, 0, 0); - ctx.arc( - 0, - 0, - this.rx, - 0, - piBy2, - false); - ctx.restore(); - this._renderPaintInOrder(ctx); - }, - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Ellipse.fromElement}) - * @static - * @memberOf fabric.Ellipse - * @see http://www.w3.org/TR/SVG/shapes.html#EllipseElement - */ - fabric.Ellipse.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('cx cy rx ry'.split(' ')); - - /** - * Returns {@link fabric.Ellipse} instance from an SVG element - * @static - * @memberOf fabric.Ellipse - * @param {SVGElement} element Element to parse - * @param {Function} [callback] Options callback invoked after parsing is finished - * @return {fabric.Ellipse} - */ - fabric.Ellipse.fromElement = function(element, callback) { - - var parsedAttributes = fabric.parseAttributes(element, fabric.Ellipse.ATTRIBUTE_NAMES); - - parsedAttributes.left = (parsedAttributes.left || 0) - parsedAttributes.rx; - parsedAttributes.top = (parsedAttributes.top || 0) - parsedAttributes.ry; - callback(new fabric.Ellipse(parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Ellipse} instance from an object representation - * @static - * @memberOf fabric.Ellipse - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as first argument - * @return {void} - */ - fabric.Ellipse.fromObject = function(object, callback) { - fabric.Object._fromObject('Ellipse', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend; - - if (fabric.Rect) { - fabric.warn('fabric.Rect is already defined'); - return; - } - - /** - * Rectangle class - * @class fabric.Rect - * @extends fabric.Object - * @return {fabric.Rect} thisArg - * @see {@link fabric.Rect#initialize} for constructor definition - */ - fabric.Rect = fabric.util.createClass(fabric.Object, /** @lends fabric.Rect.prototype */ { - - /** - * List of properties to consider when checking if state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('rx', 'ry'), - - /** - * Type of an object - * @type String - * @default - */ - type: 'rect', - - /** - * Horizontal border radius - * @type Number - * @default - */ - rx: 0, - - /** - * Vertical border radius - * @type Number - * @default - */ - ry: 0, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('rx', 'ry'), - - /** - * Constructor - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(options) { - this.callSuper('initialize', options); - this._initRxRy(); - }, - - /** - * Initializes rx/ry attributes - * @private - */ - _initRxRy: function() { - if (this.rx && !this.ry) { - this.ry = this.rx; - } - else if (this.ry && !this.rx) { - this.rx = this.ry; - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - - // 1x1 case (used in spray brush) optimization was removed because - // with caching and higher zoom level this makes more damage than help - - var rx = this.rx ? Math.min(this.rx, this.width / 2) : 0, - ry = this.ry ? Math.min(this.ry, this.height / 2) : 0, - w = this.width, - h = this.height, - x = -this.width / 2, - y = -this.height / 2, - isRounded = rx !== 0 || ry !== 0, - /* "magic number" for bezier approximations of arcs (http://itc.ktu.lt/itc354/Riskus354.pdf) */ - k = 1 - 0.5522847498; - ctx.beginPath(); - - ctx.moveTo(x + rx, y); - - ctx.lineTo(x + w - rx, y); - isRounded && ctx.bezierCurveTo(x + w - k * rx, y, x + w, y + k * ry, x + w, y + ry); - - ctx.lineTo(x + w, y + h - ry); - isRounded && ctx.bezierCurveTo(x + w, y + h - k * ry, x + w - k * rx, y + h, x + w - rx, y + h); - - ctx.lineTo(x + rx, y + h); - isRounded && ctx.bezierCurveTo(x + k * rx, y + h, x, y + h - k * ry, x, y + h - ry); - - ctx.lineTo(x, y + ry); - isRounded && ctx.bezierCurveTo(x, y + k * ry, x + k * rx, y, x + rx, y); - - ctx.closePath(); - - this._renderPaintInOrder(ctx); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['rx', 'ry'].concat(propertiesToInclude)); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var x = -this.width / 2, y = -this.height / 2; - return [ - '\n' - ]; - }, - /* _TO_SVG_END_ */ - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Rect.fromElement`) - * @static - * @memberOf fabric.Rect - * @see: http://www.w3.org/TR/SVG/shapes.html#RectElement - */ - fabric.Rect.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat('x y rx ry width height'.split(' ')); - - /** - * Returns {@link fabric.Rect} instance from an SVG element - * @static - * @memberOf fabric.Rect - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Rect.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - options = options || { }; - - var parsedAttributes = fabric.parseAttributes(element, fabric.Rect.ATTRIBUTE_NAMES); - parsedAttributes.left = parsedAttributes.left || 0; - parsedAttributes.top = parsedAttributes.top || 0; - parsedAttributes.height = parsedAttributes.height || 0; - parsedAttributes.width = parsedAttributes.width || 0; - var rect = new fabric.Rect(extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - rect.visible = rect.visible && rect.width > 0 && rect.height > 0; - callback(rect); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns {@link fabric.Rect} instance from an object representation - * @static - * @memberOf fabric.Rect - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Rect instance is created - */ - fabric.Rect.fromObject = function(object, callback) { - return fabric.Object._fromObject('Rect', object, callback); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - min = fabric.util.array.min, - max = fabric.util.array.max, - toFixed = fabric.util.toFixed, - projectStrokeOnPoints = fabric.util.projectStrokeOnPoints; - - if (fabric.Polyline) { - fabric.warn('fabric.Polyline is already defined'); - return; - } - - /** - * Polyline class - * @class fabric.Polyline - * @extends fabric.Object - * @see {@link fabric.Polyline#initialize} for constructor definition - */ - fabric.Polyline = fabric.util.createClass(fabric.Object, /** @lends fabric.Polyline.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polyline', - - /** - * Points array - * @type Array - * @default - */ - points: null, - - /** - * WARNING: Feature in progress - * Calculate the exact bounding box taking in account strokeWidth on acute angles - * this will be turned to true by default on fabric 6.0 - * maybe will be left in as an optimization since calculations may be slow - * @deprecated - * @type Boolean - * @default false - */ - exactBoundingBox: false, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('points'), - - /** - * Constructor - * @param {Array} points Array of points (where each point is an object with x and y) - * @param {Object} [options] Options object - * @return {fabric.Polyline} thisArg - * @example - * var poly = new fabric.Polyline([ - * { x: 10, y: 10 }, - * { x: 50, y: 30 }, - * { x: 40, y: 70 }, - * { x: 60, y: 50 }, - * { x: 100, y: 150 }, - * { x: 40, y: 100 } - * ], { - * stroke: 'red', - * left: 100, - * top: 100 - * }); - */ - initialize: function(points, options) { - options = options || {}; - this.points = points || []; - this.callSuper('initialize', options); - this._setPositionDimensions(options); - }, - - /** - * @private - */ - _projectStrokeOnPoints: function () { - return projectStrokeOnPoints(this.points, this, true); - }, - - _setPositionDimensions: function(options) { - var calcDim = this._calcDimensions(options), correctLeftTop, - correctSize = this.exactBoundingBox ? this.strokeWidth : 0; - this.width = calcDim.width - correctSize; - this.height = calcDim.height - correctSize; - if (!options.fromSVG) { - correctLeftTop = this.translateToGivenOrigin( - { - // this looks bad, but is one way to keep it optional for now. - x: calcDim.left - this.strokeWidth / 2 + correctSize / 2, - y: calcDim.top - this.strokeWidth / 2 + correctSize / 2 - }, - 'left', - 'top', - this.originX, - this.originY - ); - } - if (typeof options.left === 'undefined') { - this.left = options.fromSVG ? calcDim.left : correctLeftTop.x; - } - if (typeof options.top === 'undefined') { - this.top = options.fromSVG ? calcDim.top : correctLeftTop.y; - } - this.pathOffset = { - x: calcDim.left + this.width / 2 + correctSize / 2, - y: calcDim.top + this.height / 2 + correctSize / 2 - }; - }, - - /** - * Calculate the polygon min and max point from points array, - * returning an object with left, top, width, height to measure the - * polygon size - * @return {Object} object.left X coordinate of the polygon leftmost point - * @return {Object} object.top Y coordinate of the polygon topmost point - * @return {Object} object.width distance between X coordinates of the polygon leftmost and rightmost point - * @return {Object} object.height distance between Y coordinates of the polygon topmost and bottommost point - * @private - */ - _calcDimensions: function() { - - var points = this.exactBoundingBox ? this._projectStrokeOnPoints() : this.points, - minX = min(points, 'x') || 0, - minY = min(points, 'y') || 0, - maxX = max(points, 'x') || 0, - maxY = max(points, 'y') || 0, - width = (maxX - minX), - height = (maxY - minY); - - return { - left: minX, - top: minY, - width: width, - height: height, - }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - points: this.points.concat() - }); - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var points = [], diffX = this.pathOffset.x, diffY = this.pathOffset.y, - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - - for (var i = 0, len = this.points.length; i < len; i++) { - points.push( - toFixed(this.points[i].x - diffX, NUM_FRACTION_DIGITS), ',', - toFixed(this.points[i].y - diffY, NUM_FRACTION_DIGITS), ' ' - ); - } - return [ - '<' + this.type + ' ', 'COMMON_PARTS', - 'points="', points.join(''), - '" />\n' - ]; - }, - /* _TO_SVG_END_ */ - - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - commonRender: function(ctx) { - var point, len = this.points.length, - x = this.pathOffset.x, - y = this.pathOffset.y; - - if (!len || isNaN(this.points[len - 1].y)) { - // do not draw if no points or odd points - // NaN comes from parseFloat of a empty string in parser - return false; - } - ctx.beginPath(); - ctx.moveTo(this.points[0].x - x, this.points[0].y - y); - for (var i = 0; i < len; i++) { - point = this.points[i]; - ctx.lineTo(point.x - x, point.y - y); - } - return true; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - this._renderPaintInOrder(ctx); - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.get('points').length; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Polyline.fromElement}) - * @static - * @memberOf fabric.Polyline - * @see: http://www.w3.org/TR/SVG/shapes.html#PolylineElement - */ - fabric.Polyline.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns fabric.Polyline instance from an SVG element - * @static - * @memberOf fabric.Polyline - * @param {SVGElement} element Element to parser - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polyline.fromElementGenerator = function(_class) { - return function(element, callback, options) { - if (!element) { - return callback(null); - } - options || (options = { }); - - var points = fabric.parsePointsAttribute(element.getAttribute('points')), - parsedAttributes = fabric.parseAttributes(element, fabric[_class].ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric[_class](points, extend(parsedAttributes, options))); - }; - }; - - fabric.Polyline.fromElement = fabric.Polyline.fromElementGenerator('Polyline'); - - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polyline instance from an object representation - * @static - * @memberOf fabric.Polyline - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Polyline.fromObject = function(object, callback) { - return fabric.Object._fromObject('Polyline', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = {}), - projectStrokeOnPoints = fabric.util.projectStrokeOnPoints; - - if (fabric.Polygon) { - fabric.warn('fabric.Polygon is already defined'); - return; - } - - /** - * Polygon class - * @class fabric.Polygon - * @extends fabric.Polyline - * @see {@link fabric.Polygon#initialize} for constructor definition - */ - fabric.Polygon = fabric.util.createClass(fabric.Polyline, /** @lends fabric.Polygon.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'polygon', - - /** - * @private - */ - _projectStrokeOnPoints: function () { - return projectStrokeOnPoints(this.points, this); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - if (!this.commonRender(ctx)) { - return; - } - ctx.closePath(); - this._renderPaintInOrder(ctx); - }, - - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Polygon.fromElement`) - * @static - * @memberOf fabric.Polygon - * @see: http://www.w3.org/TR/SVG/shapes.html#PolygonElement - */ - fabric.Polygon.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(); - - /** - * Returns {@link fabric.Polygon} instance from an SVG element - * @static - * @memberOf fabric.Polygon - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Polygon.fromElement = fabric.Polyline.fromElementGenerator('Polygon'); - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Polygon instance from an object representation - * @static - * @memberOf fabric.Polygon - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - * @return {void} - */ - fabric.Polygon.fromObject = function(object, callback) { - fabric.Object._fromObject('Polygon', object, callback, 'points'); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max, - extend = fabric.util.object.extend, - clone = fabric.util.object.clone, - toFixed = fabric.util.toFixed; - - if (fabric.Path) { - fabric.warn('fabric.Path is already defined'); - return; - } - - /** - * Path class - * @class fabric.Path - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#path_and_pathgroup} - * @see {@link fabric.Path#initialize} for constructor definition - */ - fabric.Path = fabric.util.createClass(fabric.Object, /** @lends fabric.Path.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'path', - - /** - * Array of path points - * @type Array - * @default - */ - path: null, - - cacheProperties: fabric.Object.prototype.cacheProperties.concat('path', 'fillRule'), - - stateProperties: fabric.Object.prototype.stateProperties.concat('path'), - - /** - * Constructor - * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) - * @param {Object} [options] Options object - * @return {fabric.Path} thisArg - */ - initialize: function (path, options) { - options = clone(options || {}); - delete options.path; - this.callSuper('initialize', options); - this._setPath(path || [], options); - }, - - /** - * @private - * @param {Array|String} path Path data (sequence of coordinates and corresponding "command" tokens) - * @param {Object} [options] Options object - */ - _setPath: function (path, options) { - this.path = fabric.util.makePathSimpler( - Array.isArray(path) ? path : fabric.util.parsePath(path) - ); - - fabric.Polyline.prototype._setPositionDimensions.call(this, options || {}); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _renderPathCommands: function(ctx) { - var current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - controlX = 0, // current control point x - controlY = 0, // current control point y - l = -this.pathOffset.x, - t = -this.pathOffset.y; - - ctx.beginPath(); - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - ctx.lineTo(x + l, y + t); - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - ctx.moveTo(x + l, y + t); - break; - - case 'C': // bezierCurveTo, absolute - x = current[5]; - y = current[6]; - controlX = current[3]; - controlY = current[4]; - ctx.bezierCurveTo( - current[1] + l, - current[2] + t, - controlX + l, - controlY + t, - x + l, - y + t - ); - break; - - case 'Q': // quadraticCurveTo, absolute - ctx.quadraticCurveTo( - current[1] + l, - current[2] + t, - current[3] + l, - current[4] + t - ); - x = current[3]; - y = current[4]; - controlX = current[1]; - controlY = current[2]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - ctx.closePath(); - break; - } - } - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx context to render path on - */ - _render: function(ctx) { - this._renderPathCommands(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Returns string representation of an instance - * @return {String} string representation of an instance - */ - toString: function() { - return '#'; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return extend(this.callSuper('toObject', propertiesToInclude), { - path: this.path.map(function(item) { return item.slice(); }), - }); - }, - - /** - * Returns dataless object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var o = this.toObject(['sourcePath'].concat(propertiesToInclude)); - if (o.sourcePath) { - delete o.path; - } - return o; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var path = fabric.util.joinPath(this.path); - return [ - '\n' - ]; - }, - - _getOffsetTransform: function() { - var digits = fabric.Object.NUM_FRACTION_DIGITS; - return ' translate(' + toFixed(-this.pathOffset.x, digits) + ', ' + - toFixed(-this.pathOffset.y, digits) + ')'; - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return '\t' + this._createBaseClipPathSVGMarkup( - this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform } - ); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - var additionalTransform = this._getOffsetTransform(); - return this._createBaseSVGMarkup(this._toSVG(), { reviver: reviver, additionalTransform: additionalTransform }); - }, - /* _TO_SVG_END_ */ - - /** - * Returns number representation of an instance complexity - * @return {Number} complexity of this instance - */ - complexity: function() { - return this.path.length; - }, - - /** - * @private - */ - _calcDimensions: function() { - - var aX = [], - aY = [], - current, // current instruction - subpathStartX = 0, - subpathStartY = 0, - x = 0, // current x - y = 0, // current y - bounds; - - for (var i = 0, len = this.path.length; i < len; ++i) { - - current = this.path[i]; - - switch (current[0]) { // first letter - - case 'L': // lineto, absolute - x = current[1]; - y = current[2]; - bounds = []; - break; - - case 'M': // moveTo, absolute - x = current[1]; - y = current[2]; - subpathStartX = x; - subpathStartY = y; - bounds = []; - break; - - case 'C': // bezierCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[3], - current[4], - current[5], - current[6] - ); - x = current[5]; - y = current[6]; - break; - - case 'Q': // quadraticCurveTo, absolute - bounds = fabric.util.getBoundsOfCurve(x, y, - current[1], - current[2], - current[1], - current[2], - current[3], - current[4] - ); - x = current[3]; - y = current[4]; - break; - - case 'z': - case 'Z': - x = subpathStartX; - y = subpathStartY; - break; - } - bounds.forEach(function (point) { - aX.push(point.x); - aY.push(point.y); - }); - aX.push(x); - aY.push(y); - } - - var minX = min(aX) || 0, - minY = min(aY) || 0, - maxX = max(aX) || 0, - maxY = max(aY) || 0, - deltaX = maxX - minX, - deltaY = maxY - minY; - - return { - left: minX, - top: minY, - width: deltaX, - height: deltaY - }; - } - }); - - /** - * Creates an instance of fabric.Path from an object - * @static - * @memberOf fabric.Path - * @param {Object} object - * @param {Function} [callback] Callback to invoke when an fabric.Path instance is created - */ - fabric.Path.fromObject = function(object, callback) { - if (typeof object.sourcePath === 'string') { - var pathUrl = object.sourcePath; - fabric.loadSVGFromURL(pathUrl, function (elements) { - var path = elements[0]; - path.setOptions(object); - callback && callback(path); - }); - } - else { - fabric.Object._fromObject('Path', object, callback, 'path'); - } - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by `fabric.Path.fromElement`) - * @static - * @memberOf fabric.Path - * @see http://www.w3.org/TR/SVG/paths.html#PathElement - */ - fabric.Path.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat(['d']); - - /** - * Creates an instance of fabric.Path from an SVG element - * @static - * @memberOf fabric.Path - * @param {SVGElement} element to parse - * @param {Function} callback Callback to invoke when an fabric.Path instance is created - * @param {Object} [options] Options object - * @param {Function} [callback] Options callback invoked after parsing is finished - */ - fabric.Path.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Path.ATTRIBUTE_NAMES); - parsedAttributes.fromSVG = true; - callback(new fabric.Path(parsedAttributes.d, extend(parsedAttributes, options))); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - min = fabric.util.array.min, - max = fabric.util.array.max; - - if (fabric.Group) { - return; - } - - /** - * Group class - * @class fabric.Group - * @extends fabric.Object - * @mixes fabric.Collection - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.Group#initialize} for constructor definition - */ - fabric.Group = fabric.util.createClass(fabric.Object, fabric.Collection, /** @lends fabric.Group.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'group', - - /** - * Width of stroke - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * Indicates if click, mouseover, mouseout events & hoverCursor should also check for subtargets - * @type Boolean - * @default - */ - subTargetCheck: false, - - /** - * Groups are container, do not render anything on theyr own, ence no cache properties - * @type Array - * @default - */ - cacheProperties: [], - - /** - * setOnGroup is a method used for TextBox that is no more used since 2.0.0 The behavior is still - * available setting this boolean to true. - * @type Boolean - * @since 2.0.0 - * @default - */ - useSetOnGroup: false, - - /** - * Constructor - * @param {Object} objects Group objects - * @param {Object} [options] Options object - * @param {Boolean} [isAlreadyGrouped] if true, objects have been grouped already. - * @return {Object} thisArg - */ - initialize: function(objects, options, isAlreadyGrouped) { - options = options || {}; - this._objects = []; - // if objects enclosed in a group have been grouped already, - // we cannot change properties of objects. - // Thus we need to set options to group without objects, - isAlreadyGrouped && this.callSuper('initialize', options); - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (!isAlreadyGrouped) { - var center = options && options.centerPoint; - // we want to set origins before calculating the bounding box. - // so that the topleft can be set with that in mind. - // if specific top and left are passed, are overwritten later - // with the callSuper('initialize', options) - if (options.originX !== undefined) { - this.originX = options.originX; - } - if (options.originY !== undefined) { - this.originY = options.originY; - } - // if coming from svg i do not want to calc bounds. - // i assume width and height are passed along options - center || this._calcBounds(); - this._updateObjectsCoords(center); - delete options.centerPoint; - this.callSuper('initialize', options); - } - else { - this._updateObjectsACoords(); - } - - this.setCoords(); - }, - - /** - * @private - */ - _updateObjectsACoords: function() { - var skipControls = true; - for (var i = this._objects.length; i--; ){ - this._objects[i].setCoords(skipControls); - } - }, - - /** - * @private - * @param {Boolean} [skipCoordsChange] if true, coordinates of objects enclosed in a group do not change - */ - _updateObjectsCoords: function(center) { - var center = center || this.getCenterPoint(); - for (var i = this._objects.length; i--; ){ - this._updateObjectCoords(this._objects[i], center); - } - }, - - /** - * @private - * @param {Object} object - * @param {fabric.Point} center, current center of group. - */ - _updateObjectCoords: function(object, center) { - var objectLeft = object.left, - objectTop = object.top, - skipControls = true; - - object.set({ - left: objectLeft - center.x, - top: objectTop - center.y - }); - object.group = this; - object.setCoords(skipControls); - }, - - /** - * Returns string represenation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Adds an object to a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - addWithUpdate: function(object) { - var nested = !!this.group; - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - if (object) { - if (nested) { - // if this group is inside another group, we need to pre transform the object - fabric.util.removeTransformFromObject(object, this.group.calcTransformMatrix()); - } - this._objects.push(object); - object.group = this; - object._set('canvas', this.canvas); - } - this._calcBounds(); - this._updateObjectsCoords(); - this.dirty = true; - if (nested) { - this.group.addWithUpdate(); - } - else { - this.setCoords(); - } - return this; - }, - - /** - * Removes an object from a group; Then recalculates group's dimension, position. - * @param {Object} object - * @return {fabric.Group} thisArg - * @chainable - */ - removeWithUpdate: function(object) { - this._restoreObjectsState(); - fabric.util.resetObjectTransform(this); - - this.remove(object); - this._calcBounds(); - this._updateObjectsCoords(); - this.setCoords(); - this.dirty = true; - return this; - }, - - /** - * @private - */ - _onObjectAdded: function(object) { - this.dirty = true; - object.group = this; - object._set('canvas', this.canvas); - }, - - /** - * @private - */ - _onObjectRemoved: function(object) { - this.dirty = true; - delete object.group; - }, - - /** - * @private - */ - _set: function(key, value) { - var i = this._objects.length; - if (this.useSetOnGroup) { - while (i--) { - this._objects[i].setOnGroup(key, value); - } - } - if (key === 'canvas') { - while (i--) { - this._objects[i]._set(key, value); - } - } - fabric.Object.prototype._set.call(this, key, value); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - var _includeDefaultValues = this.includeDefaultValues; - var objsToObject = this._objects - .filter(function (obj) { - return !obj.excludeFromExport; - }) - .map(function (obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - var obj = fabric.Object.prototype.toObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Returns object representation of an instance, in dataless mode. - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toDatalessObject: function(propertiesToInclude) { - var objsToObject, sourcePath = this.sourcePath; - if (sourcePath) { - objsToObject = sourcePath; - } - else { - var _includeDefaultValues = this.includeDefaultValues; - objsToObject = this._objects.map(function(obj) { - var originalDefaults = obj.includeDefaultValues; - obj.includeDefaultValues = _includeDefaultValues; - var _obj = obj.toDatalessObject(propertiesToInclude); - obj.includeDefaultValues = originalDefaults; - return _obj; - }); - } - var obj = fabric.Object.prototype.toDatalessObject.call(this, propertiesToInclude); - obj.objects = objsToObject; - return obj; - }, - - /** - * Renders instance on a given context - * @param {CanvasRenderingContext2D} ctx context to render instance on - */ - render: function(ctx) { - this._transformDone = true; - this.callSuper('render', ctx); - this._transformDone = false; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group is already cached. - * @return {Boolean} - */ - shouldCache: function() { - var ownCache = fabric.Object.prototype.shouldCache.call(this); - if (ownCache) { - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - this.ownCaching = false; - return false; - } - } - } - return ownCache; - }, - - /** - * Check if this object or a child object will cast a shadow - * @return {Boolean} - */ - willDrawShadow: function() { - if (fabric.Object.prototype.willDrawShadow.call(this)) { - return true; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].willDrawShadow()) { - return true; - } - } - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return this.ownCaching || (this.group && this.group.isOnACache()); - }, - - /** - * Execute the drawing operation for an object on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawObject: function(ctx) { - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i].render(ctx); - } - this._drawClipPath(ctx, this.clipPath); - }, - - /** - * Check if cache is dirty - */ - isCacheDirty: function(skipCanvas) { - if (this.callSuper('isCacheDirty', skipCanvas)) { - return true; - } - if (!this.statefullCache) { - return false; - } - for (var i = 0, len = this._objects.length; i < len; i++) { - if (this._objects[i].isCacheDirty(true)) { - if (this._cacheCanvas) { - // if this group has not a cache canvas there is nothing to clean - var x = this.cacheWidth / this.zoomX, y = this.cacheHeight / this.zoomY; - this._cacheContext.clearRect(-x / 2, -y / 2, x, y); - } - return true; - } - } - return false; - }, - - /** - * Restores original state of each of group objects (original state is that which was before group was created). - * if the nested boolean is true, the original state will be restored just for the - * first group and not for all the group chain - * @private - * @param {Boolean} nested tell the function to restore object state up to the parent group and not more - * @return {fabric.Group} thisArg - * @chainable - */ - _restoreObjectsState: function() { - var groupMatrix = this.calcOwnMatrix(); - this._objects.forEach(function(object) { - // instead of using _this = this; - fabric.util.addTransformToObject(object, groupMatrix); - delete object.group; - object.setCoords(); - }); - return this; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - destroy: function() { - // when group is destroyed objects needs to get a repaint to be eventually - // displayed on canvas. - this._objects.forEach(function(object) { - object.set('dirty', true); - }); - return this._restoreObjectsState(); - }, - - dispose: function () { - this.callSuper('dispose'); - this.forEachObject(function (object) { - object.dispose && object.dispose(); - }); - this._objects = []; - }, - - /** - * make a group an active selection, remove the group from canvas - * the group has to be on canvas for this to work. - * @return {fabric.ActiveSelection} thisArg - * @chainable - */ - toActiveSelection: function() { - if (!this.canvas) { - return; - } - var objects = this._objects, canvas = this.canvas; - this._objects = []; - var options = this.toObject(); - delete options.objects; - var activeSelection = new fabric.ActiveSelection([]); - activeSelection.set(options); - activeSelection.type = 'activeSelection'; - canvas.remove(this); - objects.forEach(function(object) { - object.group = activeSelection; - object.dirty = true; - canvas.add(object); - }); - activeSelection.canvas = canvas; - activeSelection._objects = objects; - canvas._activeObject = activeSelection; - activeSelection.setCoords(); - return activeSelection; - }, - - /** - * Destroys a group (restoring state of its objects) - * @return {fabric.Group} thisArg - * @chainable - */ - ungroupOnCanvas: function() { - return this._restoreObjectsState(); - }, - - /** - * Sets coordinates of all objects inside group - * @return {fabric.Group} thisArg - * @chainable - */ - setObjectsCoords: function() { - var skipControls = true; - this.forEachObject(function(object) { - object.setCoords(skipControls); - }); - return this; - }, - - /** - * @private - */ - _calcBounds: function(onlyWidthHeight) { - var aX = [], - aY = [], - o, prop, coords, - props = ['tr', 'br', 'bl', 'tl'], - i = 0, iLen = this._objects.length, - j, jLen = props.length; - - for ( ; i < iLen; ++i) { - o = this._objects[i]; - coords = o.calcACoords(); - for (j = 0; j < jLen; j++) { - prop = props[j]; - aX.push(coords[prop].x); - aY.push(coords[prop].y); - } - o.aCoords = coords; - } - - this._getBounds(aX, aY, onlyWidthHeight); - }, - - /** - * @private - */ - _getBounds: function(aX, aY, onlyWidthHeight) { - var minXY = new fabric.Point(min(aX), min(aY)), - maxXY = new fabric.Point(max(aX), max(aY)), - top = minXY.y || 0, left = minXY.x || 0, - width = (maxXY.x - minXY.x) || 0, - height = (maxXY.y - minXY.y) || 0; - this.width = width; - this.height = height; - if (!onlyWidthHeight) { - // the bounding box always finds the topleft most corner. - // whatever is the group origin, we set up here the left/top position. - this.setPositionByOrigin({ x: left, y: top }, 'left', 'top'); - } - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function(reviver) { - var svgString = ['\n']; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t\t', this._objects[i].toSVG(reviver)); - } - svgString.push('\n'); - return svgString; - }, - - /** - * Returns styles-string for svg-export, specific version for group - * @return {String} - */ - getSvgStyles: function() { - var opacity = typeof this.opacity !== 'undefined' && this.opacity !== 1 ? - 'opacity: ' + this.opacity + ';' : '', - visibility = this.visible ? '' : ' visibility: hidden;'; - return [ - opacity, - this.getSvgFilter(), - visibility - ].join(''); - }, - - /** - * Returns svg clipPath representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toClipPathSVG: function(reviver) { - var svgString = []; - - for (var i = 0, len = this._objects.length; i < len; i++) { - svgString.push('\t', this._objects[i].toClipPathSVG(reviver)); - } - - return this._createBaseClipPathSVGMarkup(svgString, { reviver: reviver }); - }, - /* _TO_SVG_END_ */ - }); - - /** - * Returns {@link fabric.Group} instance from an object representation - * @static - * @memberOf fabric.Group - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an group instance is created - */ - fabric.Group.fromObject = function(object, callback) { - var objects = object.objects, - options = fabric.util.object.clone(object, true); - delete options.objects; - if (typeof objects === 'string') { - // it has to be an url or something went wrong. - fabric.loadSVGFromURL(objects, function (elements) { - var group = fabric.util.groupSVGElements(elements, object, objects); - group.set(options); - callback && callback(group); - }); - return; - } - fabric.util.enlivenObjects(objects, function (enlivenedObjects) { - var options = fabric.util.object.clone(object, true); - delete options.objects; - fabric.util.enlivenObjectEnlivables(object, options, function () { - callback && callback(new fabric.Group(enlivenedObjects, options, true)); - }); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }); - - if (fabric.ActiveSelection) { - return; - } - - /** - * Group class - * @class fabric.ActiveSelection - * @extends fabric.Group - * @tutorial {@link http://fabricjs.com/fabric-intro-part-3#groups} - * @see {@link fabric.ActiveSelection#initialize} for constructor definition - */ - fabric.ActiveSelection = fabric.util.createClass(fabric.Group, /** @lends fabric.ActiveSelection.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'activeSelection', - - /** - * Constructor - * @param {Object} objects ActiveSelection objects - * @param {Object} [options] Options object - * @return {Object} thisArg - */ - initialize: function(objects, options) { - options = options || {}; - this._objects = objects || []; - for (var i = this._objects.length; i--; ) { - this._objects[i].group = this; - } - - if (options.originX) { - this.originX = options.originX; - } - if (options.originY) { - this.originY = options.originY; - } - this._calcBounds(); - this._updateObjectsCoords(); - fabric.Object.prototype.initialize.call(this, options); - this.setCoords(); - }, - - /** - * Change te activeSelection to a normal group, - * High level function that automatically adds it to canvas as - * active object. no events fired. - * @since 2.0.0 - * @return {fabric.Group} - */ - toGroup: function() { - var objects = this._objects.concat(); - this._objects = []; - var options = fabric.Object.prototype.toObject.call(this); - var newGroup = new fabric.Group([]); - delete options.type; - newGroup.set(options); - objects.forEach(function(object) { - object.canvas.remove(object); - object.group = newGroup; - }); - newGroup._objects = objects; - if (!this.canvas) { - return newGroup; - } - var canvas = this.canvas; - canvas.add(newGroup); - canvas._activeObject = newGroup; - newGroup.setCoords(); - return newGroup; - }, - - /** - * If returns true, deselection is cancelled. - * @since 2.0.0 - * @return {Boolean} [cancel] - */ - onDeselect: function() { - this.destroy(); - return false; - }, - - /** - * Returns string representation of a group - * @return {String} - */ - toString: function() { - return '#'; - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * objectCaching is a global flag, wins over everything - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * @return {Boolean} - */ - shouldCache: function() { - return false; - }, - - /** - * Check if this group or its parent group are caching, recursively up - * @return {Boolean} - */ - isOnACache: function() { - return false; - }, - - /** - * Renders controls and borders for the object - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [styleOverride] properties to override the object style - * @param {Object} [childrenOverride] properties to override the children overrides - */ - _renderControls: function(ctx, styleOverride, childrenOverride) { - ctx.save(); - ctx.globalAlpha = this.isMoving ? this.borderOpacityWhenMoving : 1; - this.callSuper('_renderControls', ctx, styleOverride); - childrenOverride = childrenOverride || { }; - if (typeof childrenOverride.hasControls === 'undefined') { - childrenOverride.hasControls = false; - } - childrenOverride.forActiveSelection = true; - for (var i = 0, len = this._objects.length; i < len; i++) { - this._objects[i]._renderControls(ctx, childrenOverride); - } - ctx.restore(); - }, - }); - - /** - * Returns {@link fabric.ActiveSelection} instance from an object representation - * @static - * @memberOf fabric.ActiveSelection - * @param {Object} object Object to create a group from - * @param {Function} [callback] Callback to invoke when an ActiveSelection instance is created - */ - fabric.ActiveSelection.fromObject = function(object, callback) { - fabric.util.enlivenObjects(object.objects, function(enlivenedObjects) { - delete object.objects; - callback && callback(new fabric.ActiveSelection(enlivenedObjects, object, true)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var extend = fabric.util.object.extend; - - if (!global.fabric) { - global.fabric = { }; - } - - if (global.fabric.Image) { - fabric.warn('fabric.Image is already defined.'); - return; - } - - /** - * Image class - * @class fabric.Image - * @extends fabric.Object - * @tutorial {@link http://fabricjs.com/fabric-intro-part-1#images} - * @see {@link fabric.Image#initialize} for constructor definition - */ - fabric.Image = fabric.util.createClass(fabric.Object, /** @lends fabric.Image.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'image', - - /** - * Width of a stroke. - * For image quality a stroke multiple of 2 gives better results. - * @type Number - * @default - */ - strokeWidth: 0, - - /** - * When calling {@link fabric.Image.getSrc}, return value from element src with `element.getAttribute('src')`. - * This allows for relative urls as image src. - * @since 2.7.0 - * @type Boolean - * @default - */ - srcFromAttribute: false, - - /** - * private - * contains last value of scaleX to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleX: 1, - - /** - * private - * contains last value of scaleY to detect - * if the Image got resized after the last Render - * @type Number - */ - _lastScaleY: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingX: 1, - - /** - * private - * contains last value of scaling applied by the apply filter chain - * @type Number - */ - _filterScalingY: 1, - - /** - * minimum scale factor under which any resizeFilter is triggered to resize the image - * 0 will disable the automatic resize. 1 will trigger automatically always. - * number bigger than 1 are not implemented yet. - * @type Number - */ - minimumScaleTrigger: 0.5, - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat('cropX', 'cropY'), - - /** - * List of properties to consider when checking if cache needs refresh - * Those properties are checked by statefullCache ON ( or lazy mode if we want ) or from single - * calls to Object.set(key, value). If the key is in this list, the object is marked as dirty - * and refreshed at the next render - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat('cropX', 'cropY'), - - /** - * key used to retrieve the texture representing this image - * @since 2.0.0 - * @type String - * @default - */ - cacheKey: '', - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropX: 0, - - /** - * Image crop in pixels from original image size. - * @since 2.0.0 - * @type Number - * @default - */ - cropY: 0, - - /** - * Indicates whether this canvas will use image smoothing when painting this image. - * Also influence if the cacheCanvas for this image uses imageSmoothing - * @since 4.0.0-beta.11 - * @type Boolean - * @default - */ - imageSmoothing: true, - - /** - * Constructor - * Image can be initialized with any canvas drawable or a string. - * The string should be a url and will be loaded as an image. - * Canvas and Image element work out of the box, while videos require extra code to work. - * Please check video element events for seeking. - * @param {HTMLImageElement | HTMLCanvasElement | HTMLVideoElement | String} element Image element - * @param {Object} [options] Options object - * @param {function} [callback] callback function to call after eventual filters applied. - * @return {fabric.Image} thisArg - */ - initialize: function(element, options) { - options || (options = { }); - this.filters = []; - this.cacheKey = 'texture' + fabric.Object.__uid++; - this.callSuper('initialize', options); - this._initElement(element, options); - }, - - /** - * Returns image element which this instance if based on - * @return {HTMLImageElement} Image element - */ - getElement: function() { - return this._element || {}; - }, - - /** - * Sets image element for this instance to a specified one. - * If filters defined they are applied to new image. - * You might need to call `canvas.renderAll` and `object.setCoords` after replacing, to render new image and update controls area. - * @param {HTMLImageElement} element - * @param {Object} [options] Options object - * @return {fabric.Image} thisArg - * @chainable - */ - setElement: function(element, options) { - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._element = element; - this._originalElement = element; - this._initConfig(options); - if (this.filters.length !== 0) { - this.applyFilters(); - } - // resizeFilters work on the already filtered copy. - // we need to apply resizeFilters AFTER normal filters. - // applyResizeFilters is run more often than normal filters - // and is triggered by user interactions rather than dev code - if (this.resizeFilter) { - this.applyResizeFilters(); - } - return this; - }, - - /** - * Delete a single texture if in webgl mode - */ - removeTexture: function(key) { - var backend = fabric.filterBackend; - if (backend && backend.evictCachesForKey) { - backend.evictCachesForKey(key); - } - }, - - /** - * Delete textures, reference to elements and eventually JSDOM cleanup - */ - dispose: function () { - this.callSuper('dispose'); - this.removeTexture(this.cacheKey); - this.removeTexture(this.cacheKey + '_filtered'); - this._cacheContext = undefined; - ['_originalElement', '_element', '_filteredEl', '_cacheCanvas'].forEach((function(element) { - fabric.util.cleanUpJsdomNode(this[element]); - this[element] = undefined; - }).bind(this)); - }, - - /** - * Get the crossOrigin value (of the corresponding image element) - */ - getCrossOrigin: function() { - return this._originalElement && (this._originalElement.crossOrigin || null); - }, - - /** - * Returns original size of an image - * @return {Object} Object with "width" and "height" properties - */ - getOriginalSize: function() { - var element = this.getElement(); - return { - width: element.naturalWidth || element.width, - height: element.naturalHeight || element.height - }; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _stroke: function(ctx) { - if (!this.stroke || this.strokeWidth === 0) { - return; - } - var w = this.width / 2, h = this.height / 2; - ctx.beginPath(); - ctx.moveTo(-w, -h); - ctx.lineTo(w, -h); - ctx.lineTo(w, h); - ctx.lineTo(-w, h); - ctx.lineTo(-w, -h); - ctx.closePath(); - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var filters = []; - - this.filters.forEach(function(filterObj) { - if (filterObj) { - filters.push(filterObj.toObject()); - } - }); - var object = extend( - this.callSuper( - 'toObject', - ['cropX', 'cropY'].concat(propertiesToInclude) - ), { - src: this.getSrc(), - crossOrigin: this.getCrossOrigin(), - filters: filters, - }); - if (this.resizeFilter) { - object.resizeFilter = this.resizeFilter.toObject(); - } - return object; - }, - - /** - * Returns true if an image has crop applied, inspecting values of cropX,cropY,width,height. - * @return {Boolean} - */ - hasCrop: function() { - return this.cropX || this.cropY || this.width < this._element.width || this.height < this._element.height; - }, - - /* _TO_SVG_START_ */ - /** - * Returns svg representation of an instance - * @return {Array} an array of strings with the specific svg representation - * of the instance - */ - _toSVG: function() { - var svgString = [], imageMarkup = [], strokeSvg, element = this._element, - x = -this.width / 2, y = -this.height / 2, clipPath = '', imageRendering = ''; - if (!element) { - return []; - } - if (this.hasCrop()) { - var clipPathId = fabric.Object.__uid++; - svgString.push( - '\n', - '\t\n', - '\n' - ); - clipPath = ' clip-path="url(#imageCrop_' + clipPathId + ')" '; - } - if (!this.imageSmoothing) { - imageRendering = '" image-rendering="optimizeSpeed'; - } - imageMarkup.push('\t\n'); - - if (this.stroke || this.strokeDashArray) { - var origFill = this.fill; - this.fill = null; - strokeSvg = [ - '\t\n' - ]; - this.fill = origFill; - } - if (this.paintFirst !== 'fill') { - svgString = svgString.concat(strokeSvg, imageMarkup); - } - else { - svgString = svgString.concat(imageMarkup, strokeSvg); - } - return svgString; - }, - /* _TO_SVG_END_ */ - - /** - * Returns source of an image - * @param {Boolean} filtered indicates if the src is needed for svg - * @return {String} Source of an image - */ - getSrc: function(filtered) { - var element = filtered ? this._element : this._originalElement; - if (element) { - if (element.toDataURL) { - return element.toDataURL(); - } - - if (this.srcFromAttribute) { - return element.getAttribute('src'); - } - else { - return element.src; - } - } - else { - return this.src || ''; - } - }, - - /** - * Sets source of an image - * @param {String} src Source string (URL) - * @param {Function} [callback] Callback is invoked when image has been loaded (and all filters have been applied) - * @param {Object} [options] Options object - * @param {String} [options.crossOrigin] crossOrigin value (one of "", "anonymous", "use-credentials") - * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_settings_attributes - * @return {fabric.Image} thisArg - * @chainable - */ - setSrc: function(src, callback, options) { - fabric.util.loadImage(src, function(img, isError) { - this.setElement(img, options); - this._setWidthHeight(); - callback && callback(this, isError); - }, this, options && options.crossOrigin); - return this; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of an instance - */ - toString: function() { - return '#'; - }, - - applyResizeFilters: function() { - var filter = this.resizeFilter, - minimumScale = this.minimumScaleTrigger, - objectScale = this.getTotalObjectScaling(), - scaleX = objectScale.scaleX, - scaleY = objectScale.scaleY, - elementToFilter = this._filteredEl || this._originalElement; - if (this.group) { - this.set('dirty', true); - } - if (!filter || (scaleX > minimumScale && scaleY > minimumScale)) { - this._element = elementToFilter; - this._filterScalingX = 1; - this._filterScalingY = 1; - this._lastScaleX = scaleX; - this._lastScaleY = scaleY; - return; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - var canvasEl = fabric.util.createCanvasElement(), - cacheKey = this._filteredEl ? (this.cacheKey + '_filtered') : this.cacheKey, - sourceWidth = elementToFilter.width, sourceHeight = elementToFilter.height; - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._lastScaleX = filter.scaleX = scaleX; - this._lastScaleY = filter.scaleY = scaleY; - fabric.filterBackend.applyFilters( - [filter], elementToFilter, sourceWidth, sourceHeight, this._element, cacheKey); - this._filterScalingX = canvasEl.width / this._originalElement.width; - this._filterScalingY = canvasEl.height / this._originalElement.height; - }, - - /** - * Applies filters assigned to this image (from "filters" array) or from filter param - * @method applyFilters - * @param {Array} filters to be applied - * @param {Boolean} forResizing specify if the filter operation is a resize operation - * @return {thisArg} return the fabric.Image object - * @chainable - */ - applyFilters: function(filters) { - - filters = filters || this.filters || []; - filters = filters.filter(function(filter) { return filter && !filter.isNeutralState(); }); - this.set('dirty', true); - - // needs to clear out or WEBGL will not resize correctly - this.removeTexture(this.cacheKey + '_filtered'); - - if (filters.length === 0) { - this._element = this._originalElement; - this._filteredEl = null; - this._filterScalingX = 1; - this._filterScalingY = 1; - return this; - } - - var imgElement = this._originalElement, - sourceWidth = imgElement.naturalWidth || imgElement.width, - sourceHeight = imgElement.naturalHeight || imgElement.height; - - if (this._element === this._originalElement) { - // if the element is the same we need to create a new element - var canvasEl = fabric.util.createCanvasElement(); - canvasEl.width = sourceWidth; - canvasEl.height = sourceHeight; - this._element = canvasEl; - this._filteredEl = canvasEl; - } - else { - // clear the existing element to get new filter data - // also dereference the eventual resized _element - this._element = this._filteredEl; - this._filteredEl.getContext('2d').clearRect(0, 0, sourceWidth, sourceHeight); - // we also need to resize again at next renderAll, so remove saved _lastScaleX/Y - this._lastScaleX = 1; - this._lastScaleY = 1; - } - if (!fabric.filterBackend) { - fabric.filterBackend = fabric.initFilterBackend(); - } - fabric.filterBackend.applyFilters( - filters, this._originalElement, sourceWidth, sourceHeight, this._element, this.cacheKey); - if (this._originalElement.width !== this._element.width || - this._originalElement.height !== this._element.height) { - this._filterScalingX = this._element.width / this._originalElement.width; - this._filterScalingY = this._element.height / this._originalElement.height; - } - return this; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - if (this.isMoving !== true && this.resizeFilter && this._needsResize()) { - this.applyResizeFilters(); - } - this._stroke(ctx); - this._renderPaintInOrder(ctx); - }, - - /** - * Paint the cached copy of the object on the target context. - * it will set the imageSmoothing for the draw operation - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - drawCacheOnCanvas: function(ctx) { - fabric.util.setImageSmoothing(ctx, this.imageSmoothing); - fabric.Object.prototype.drawCacheOnCanvas.call(this, ctx); - }, - - /** - * Decide if the object should cache or not. Create its own cache level - * needsItsOwnCache should be used when the object drawing method requires - * a cache step. None of the fabric classes requires it. - * Generally you do not cache objects in groups because the group outside is cached. - * This is the special image version where we would like to avoid caching where possible. - * Essentially images do not benefit from caching. They may require caching, and in that - * case we do it. Also caching an image usually ends in a loss of details. - * A full performance audit should be done. - * @return {Boolean} - */ - shouldCache: function() { - return this.needsItsOwnCache(); - }, - - _renderFill: function(ctx) { - var elementToDraw = this._element; - if (!elementToDraw) { - return; - } - var scaleX = this._filterScalingX, scaleY = this._filterScalingY, - w = this.width, h = this.height, min = Math.min, max = Math.max, - // crop values cannot be lesser than 0. - cropX = max(this.cropX, 0), cropY = max(this.cropY, 0), - elWidth = elementToDraw.naturalWidth || elementToDraw.width, - elHeight = elementToDraw.naturalHeight || elementToDraw.height, - sX = cropX * scaleX, - sY = cropY * scaleY, - // the width height cannot exceed element width/height, starting from the crop offset. - sW = min(w * scaleX, elWidth - sX), - sH = min(h * scaleY, elHeight - sY), - x = -w / 2, y = -h / 2, - maxDestW = min(w, elWidth / scaleX - cropX), - maxDestH = min(h, elHeight / scaleY - cropY); - - elementToDraw && ctx.drawImage(elementToDraw, sX, sY, sW, sH, x, y, maxDestW, maxDestH); - }, - - /** - * needed to check if image needs resize - * @private - */ - _needsResize: function() { - var scale = this.getTotalObjectScaling(); - return (scale.scaleX !== this._lastScaleX || scale.scaleY !== this._lastScaleY); - }, - - /** - * @private - */ - _resetWidthHeight: function() { - this.set(this.getOriginalSize()); - }, - - /** - * The Image class's initialization method. This method is automatically - * called by the constructor. - * @private - * @param {HTMLImageElement|String} element The element representing the image - * @param {Object} [options] Options object - */ - _initElement: function(element, options) { - this.setElement(fabric.util.getById(element), options); - fabric.util.addClass(this.getElement(), fabric.Image.CSS_CANVAS); - }, - - /** - * @private - * @param {Object} [options] Options object - */ - _initConfig: function(options) { - options || (options = { }); - this.setOptions(options); - this._setWidthHeight(options); - }, - - /** - * @private - * @param {Array} filters to be initialized - * @param {Function} callback Callback to invoke when all fabric.Image.filters instances are created - */ - _initFilters: function(filters, callback) { - if (filters && filters.length) { - fabric.util.enlivenObjects(filters, function(enlivenedObjects) { - callback && callback(enlivenedObjects); - }, 'fabric.Image.filters'); - } - else { - callback && callback(); - } - }, - - /** - * @private - * Set the width and the height of the image object, using the element or the - * options. - * @param {Object} [options] Object with width/height properties - */ - _setWidthHeight: function(options) { - options || (options = { }); - var el = this.getElement(); - this.width = options.width || el.naturalWidth || el.width || 0; - this.height = options.height || el.naturalHeight || el.height || 0; - }, - - /** - * Calculate offset for center and scale factor for the image in order to respect - * the preserveAspectRatio attribute - * @private - * @return {Object} - */ - parsePreserveAspectRatioAttribute: function() { - var pAR = fabric.util.parsePreserveAspectRatioAttribute(this.preserveAspectRatio || ''), - rWidth = this._element.width, rHeight = this._element.height, - scaleX = 1, scaleY = 1, offsetLeft = 0, offsetTop = 0, cropX = 0, cropY = 0, - offset, pWidth = this.width, pHeight = this.height, parsedAttributes = { width: pWidth, height: pHeight }; - if (pAR && (pAR.alignX !== 'none' || pAR.alignY !== 'none')) { - if (pAR.meetOrSlice === 'meet') { - scaleX = scaleY = fabric.util.findScaleToFit(this._element, parsedAttributes); - offset = (pWidth - rWidth * scaleX) / 2; - if (pAR.alignX === 'Min') { - offsetLeft = -offset; - } - if (pAR.alignX === 'Max') { - offsetLeft = offset; - } - offset = (pHeight - rHeight * scaleY) / 2; - if (pAR.alignY === 'Min') { - offsetTop = -offset; - } - if (pAR.alignY === 'Max') { - offsetTop = offset; - } - } - if (pAR.meetOrSlice === 'slice') { - scaleX = scaleY = fabric.util.findScaleToCover(this._element, parsedAttributes); - offset = rWidth - pWidth / scaleX; - if (pAR.alignX === 'Mid') { - cropX = offset / 2; - } - if (pAR.alignX === 'Max') { - cropX = offset; - } - offset = rHeight - pHeight / scaleY; - if (pAR.alignY === 'Mid') { - cropY = offset / 2; - } - if (pAR.alignY === 'Max') { - cropY = offset; - } - rWidth = pWidth / scaleX; - rHeight = pHeight / scaleY; - } - } - else { - scaleX = pWidth / rWidth; - scaleY = pHeight / rHeight; - } - return { - width: rWidth, - height: rHeight, - scaleX: scaleX, - scaleY: scaleY, - offsetLeft: offsetLeft, - offsetTop: offsetTop, - cropX: cropX, - cropY: cropY - }; - } - }); - - /** - * Default CSS class name for canvas - * @static - * @type String - * @default - */ - fabric.Image.CSS_CANVAS = 'canvas-img'; - - /** - * Alias for getSrc - * @static - */ - fabric.Image.prototype.getSvgSrc = fabric.Image.prototype.getSrc; - - /** - * Creates an instance of fabric.Image from its object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} callback Callback to invoke when an image instance is created - */ - fabric.Image.fromObject = function(_object, callback) { - var object = fabric.util.object.clone(_object); - fabric.util.loadImage(object.src, function(img, isError) { - if (isError) { - callback && callback(null, true); - return; - } - fabric.Image.prototype._initFilters.call(object, object.filters, function(filters) { - object.filters = filters || []; - fabric.Image.prototype._initFilters.call(object, [object.resizeFilter], function(resizeFilters) { - object.resizeFilter = resizeFilters[0]; - fabric.util.enlivenObjectEnlivables(object, object, function () { - var image = new fabric.Image(img, object); - callback(image, false); - }); - }); - }); - }, null, object.crossOrigin); - }; - - /** - * Creates an instance of fabric.Image from an URL string - * @static - * @param {String} url URL to create an image from - * @param {Function} [callback] Callback to invoke when image is created (newly created image is passed as a first argument). Second argument is a boolean indicating if an error occurred or not. - * @param {Object} [imgOptions] Options object - */ - fabric.Image.fromURL = function(url, callback, imgOptions) { - fabric.util.loadImage(url, function(img, isError) { - callback && callback(new fabric.Image(img, imgOptions), isError); - }, null, imgOptions && imgOptions.crossOrigin); - }; - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Image.fromElement}) - * @static - * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement} - */ - fabric.Image.ATTRIBUTE_NAMES = - fabric.SHARED_ATTRIBUTES.concat( - 'x y width height preserveAspectRatio xlink:href crossOrigin image-rendering'.split(' ') - ); - - /** - * Returns {@link fabric.Image} instance from an SVG element - * @static - * @param {SVGElement} element Element to parse - * @param {Object} [options] Options object - * @param {Function} callback Callback to execute when fabric.Image object is created - * @return {fabric.Image} Instance of fabric.Image - */ - fabric.Image.fromElement = function(element, callback, options) { - var parsedAttributes = fabric.parseAttributes(element, fabric.Image.ATTRIBUTE_NAMES); - fabric.Image.fromURL(parsedAttributes['xlink:href'], callback, - extend((options ? fabric.util.object.clone(options) : { }), parsedAttributes)); - }; - /* _FROM_SVG_END_ */ - -})(typeof exports !== 'undefined' ? exports : this); - - -fabric.util.object.extend(fabric.Object.prototype, /** @lends fabric.Object.prototype */ { - - /** - * @private - * @return {Number} angle value - */ - _getAngleValueForStraighten: function() { - var angle = this.angle % 360; - if (angle > 0) { - return Math.round((angle - 1) / 90) * 90; - } - return Math.round(angle / 90) * 90; - }, - - /** - * Straightens an object (rotating it from current angle to one of 0, 90, 180, 270, etc. depending on which is closer) - * @return {fabric.Object} thisArg - * @chainable - */ - straighten: function() { - return this.rotate(this._getAngleValueForStraighten()); - }, - - /** - * Same as {@link fabric.Object.prototype.straighten} but with animation - * @param {Object} callbacks Object with callback functions - * @param {Function} [callbacks.onComplete] Invoked on completion - * @param {Function} [callbacks.onChange] Invoked on every step of animation - * @return {fabric.Object} thisArg - */ - fxStraighten: function(callbacks) { - callbacks = callbacks || { }; - - var empty = function() { }, - onComplete = callbacks.onComplete || empty, - onChange = callbacks.onChange || empty, - _this = this; - - return fabric.util.animate({ - target: this, - startValue: this.get('angle'), - endValue: this._getAngleValueForStraighten(), - duration: this.FX_DURATION, - onChange: function(value) { - _this.rotate(value); - onChange(); - }, - onComplete: function() { - _this.setCoords(); - onComplete(); - }, - }); - } -}); - -fabric.util.object.extend(fabric.StaticCanvas.prototype, /** @lends fabric.StaticCanvas.prototype */ { - - /** - * Straightens object, then rerenders canvas - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - * @chainable - */ - straightenObject: function (object) { - object.straighten(); - this.requestRenderAll(); - return this; - }, - - /** - * Same as {@link fabric.Canvas.prototype.straightenObject}, but animated - * @param {fabric.Object} object Object to straighten - * @return {fabric.Canvas} thisArg - */ - fxStraightenObject: function (object) { - return object.fxStraighten({ - onChange: this.requestRenderAllBound - }); - } -}); - - -(function() { - - 'use strict'; - - /** - * Tests if webgl supports certain precision - * @param {WebGL} Canvas WebGL context to test on - * @param {String} Precision to test can be any of following: 'lowp', 'mediump', 'highp' - * @returns {Boolean} Whether the user's browser WebGL supports given precision. - */ - function testPrecision(gl, precision){ - var fragmentSource = 'precision ' + precision + ' float;\nvoid main(){}'; - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - return false; - } - return true; - } - - /** - * Indicate whether this filtering backend is supported by the user's browser. - * @param {Number} tileSize check if the tileSize is supported - * @returns {Boolean} Whether the user's browser supports WebGL. - */ - fabric.isWebglSupported = function(tileSize) { - if (fabric.isLikelyNode) { - return false; - } - tileSize = tileSize || fabric.WebglFilterBackend.prototype.tileSize; - var canvas = document.createElement('canvas'); - var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); - var isSupported = false; - // eslint-disable-next-line - if (gl) { - fabric.maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE); - isSupported = fabric.maxTextureSize >= tileSize; - var precisions = ['highp', 'mediump', 'lowp']; - for (var i = 0; i < 3; i++){ - if (testPrecision(gl, precisions[i])){ - fabric.webGlPrecision = precisions[i]; - break; - }; - } - } - this.isSupported = isSupported; - return isSupported; - }; - - fabric.WebglFilterBackend = WebglFilterBackend; - - /** - * WebGL filter backend. - */ - function WebglFilterBackend(options) { - if (options && options.tileSize) { - this.tileSize = options.tileSize; - } - this.setupGLContext(this.tileSize, this.tileSize); - this.captureGPUInfo(); - }; - - WebglFilterBackend.prototype = /** @lends fabric.WebglFilterBackend.prototype */ { - - tileSize: 2048, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Setup a WebGL context suitable for filtering, and bind any needed event handlers. - */ - setupGLContext: function(width, height) { - this.dispose(); - this.createWebGLCanvas(width, height); - // eslint-disable-next-line - this.aPosition = new Float32Array([0, 0, 0, 1, 1, 0, 1, 1]); - this.chooseFastestCopyGLTo2DMethod(width, height); - }, - - /** - * Pick a method to copy data from GL context to 2d canvas. In some browsers using - * putImageData is faster than drawImage for that specific operation. - */ - chooseFastestCopyGLTo2DMethod: function(width, height) { - var canMeasurePerf = typeof window.performance !== 'undefined', canUseImageData; - try { - new ImageData(1, 1); - canUseImageData = true; - } - catch (e) { - canUseImageData = false; - } - // eslint-disable-next-line no-undef - var canUseArrayBuffer = typeof ArrayBuffer !== 'undefined'; - // eslint-disable-next-line no-undef - var canUseUint8Clamped = typeof Uint8ClampedArray !== 'undefined'; - - if (!(canMeasurePerf && canUseImageData && canUseArrayBuffer && canUseUint8Clamped)) { - return; - } - - var targetCanvas = fabric.util.createCanvasElement(); - // eslint-disable-next-line no-undef - var imageBuffer = new ArrayBuffer(width * height * 4); - if (fabric.forceGLPutImageData) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - return; - } - var testContext = { - imageBuffer: imageBuffer, - destinationWidth: width, - destinationHeight: height, - targetCanvas: targetCanvas - }; - var startTime, drawImageTime, putImageDataTime; - targetCanvas.width = width; - targetCanvas.height = height; - - startTime = window.performance.now(); - copyGLTo2DDrawImage.call(testContext, this.gl, testContext); - drawImageTime = window.performance.now() - startTime; - - startTime = window.performance.now(); - copyGLTo2DPutImageData.call(testContext, this.gl, testContext); - putImageDataTime = window.performance.now() - startTime; - - if (drawImageTime > putImageDataTime) { - this.imageBuffer = imageBuffer; - this.copyGLTo2D = copyGLTo2DPutImageData; - } - else { - this.copyGLTo2D = copyGLTo2DDrawImage; - } - }, - - /** - * Create a canvas element and associated WebGL context and attaches them as - * class properties to the GLFilterBackend class. - */ - createWebGLCanvas: function(width, height) { - var canvas = fabric.util.createCanvasElement(); - canvas.width = width; - canvas.height = height; - var glOptions = { - alpha: true, - premultipliedAlpha: false, - depth: false, - stencil: false, - antialias: false - }, - gl = canvas.getContext('webgl', glOptions); - if (!gl) { - gl = canvas.getContext('experimental-webgl', glOptions); - } - if (!gl) { - return; - } - gl.clearColor(0, 0, 0, 0); - // this canvas can fire webglcontextlost and webglcontextrestored - this.canvas = canvas; - this.gl = gl; - }, - - /** - * Attempts to apply the requested filters to the source provided, drawing the filtered output - * to the provided target canvas. - * - * @param {Array} filters The filters to apply. - * @param {HTMLImageElement|HTMLCanvasElement} source The source to be filtered. - * @param {Number} width The width of the source input. - * @param {Number} height The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - * @param {String|undefined} cacheKey A key used to cache resources related to the source. If - * omitted, caching will be skipped. - */ - applyFilters: function(filters, source, width, height, targetCanvas, cacheKey) { - var gl = this.gl; - var cachedTexture; - if (cacheKey) { - cachedTexture = this.getCachedTexture(cacheKey, source); - } - var pipelineState = { - originalWidth: source.width || source.originalWidth, - originalHeight: source.height || source.originalHeight, - sourceWidth: width, - sourceHeight: height, - destinationWidth: width, - destinationHeight: height, - context: gl, - sourceTexture: this.createTexture(gl, width, height, !cachedTexture && source), - targetTexture: this.createTexture(gl, width, height), - originalTexture: cachedTexture || - this.createTexture(gl, width, height, !cachedTexture && source), - passes: filters.length, - webgl: true, - aPosition: this.aPosition, - programCache: this.programCache, - pass: 0, - filterBackend: this, - targetCanvas: targetCanvas - }; - var tempFbo = gl.createFramebuffer(); - gl.bindFramebuffer(gl.FRAMEBUFFER, tempFbo); - filters.forEach(function(filter) { filter && filter.applyTo(pipelineState); }); - resizeCanvasIfNeeded(pipelineState); - this.copyGLTo2D(gl, pipelineState); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.deleteTexture(pipelineState.sourceTexture); - gl.deleteTexture(pipelineState.targetTexture); - gl.deleteFramebuffer(tempFbo); - targetCanvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); - return pipelineState; - }, - - /** - * Detach event listeners, remove references, and clean up caches. - */ - dispose: function() { - if (this.canvas) { - this.canvas = null; - this.gl = null; - } - this.clearWebGLCaches(); - }, - - /** - * Wipe out WebGL-related caches. - */ - clearWebGLCaches: function() { - this.programCache = {}; - this.textureCache = {}; - }, - - /** - * Create a WebGL texture object. - * - * Accepts specific dimensions to initialize the texture to or a source image. - * - * @param {WebGLRenderingContext} gl The GL context to use for creating the texture. - * @param {Number} width The width to initialize the texture at. - * @param {Number} height The height to initialize the texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source for the texture data. - * @returns {WebGLTexture} - */ - createTexture: function(gl, width, height, textureImageSource) { - var texture = gl.createTexture(); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); - gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); - if (textureImageSource) { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, textureImageSource); - } - else { - gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, null); - } - return texture; - }, - - /** - * Can be optionally used to get a texture from the cache array - * - * If an existing texture is not found, a new texture is created and cached. - * - * @param {String} uniqueId A cache key to use to find an existing texture. - * @param {HTMLImageElement|HTMLCanvasElement} textureImageSource A source to use to create the - * texture cache entry if one does not already exist. - */ - getCachedTexture: function(uniqueId, textureImageSource) { - if (this.textureCache[uniqueId]) { - return this.textureCache[uniqueId]; - } - else { - var texture = this.createTexture( - this.gl, textureImageSource.width, textureImageSource.height, textureImageSource); - this.textureCache[uniqueId] = texture; - return texture; - } - }, - - /** - * Clear out cached resources related to a source image that has been - * filtered previously. - * - * @param {String} cacheKey The cache key provided when the source image was filtered. - */ - evictCachesForKey: function(cacheKey) { - if (this.textureCache[cacheKey]) { - this.gl.deleteTexture(this.textureCache[cacheKey]); - delete this.textureCache[cacheKey]; - } - }, - - copyGLTo2D: copyGLTo2DDrawImage, - - /** - * Attempt to extract GPU information strings from a WebGL context. - * - * Useful information when debugging or blacklisting specific GPUs. - * - * @returns {Object} A GPU info object with renderer and vendor strings. - */ - captureGPUInfo: function() { - if (this.gpuInfo) { - return this.gpuInfo; - } - var gl = this.gl, gpuInfo = { renderer: '', vendor: '' }; - if (!gl) { - return gpuInfo; - } - var ext = gl.getExtension('WEBGL_debug_renderer_info'); - if (ext) { - var renderer = gl.getParameter(ext.UNMASKED_RENDERER_WEBGL); - var vendor = gl.getParameter(ext.UNMASKED_VENDOR_WEBGL); - if (renderer) { - gpuInfo.renderer = renderer.toLowerCase(); - } - if (vendor) { - gpuInfo.vendor = vendor.toLowerCase(); - } - } - this.gpuInfo = gpuInfo; - return gpuInfo; - }, - }; -})(); - -function resizeCanvasIfNeeded(pipelineState) { - var targetCanvas = pipelineState.targetCanvas, - width = targetCanvas.width, height = targetCanvas.height, - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight; - - if (width !== dWidth || height !== dHeight) { - targetCanvas.width = dWidth; - targetCanvas.height = dHeight; - } -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas. - * - * The WebGL canvas is assumed to be upside down, with the top-left pixel of the - * desired output image appearing in the bottom-left corner of the WebGL canvas. - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DDrawImage(gl, pipelineState) { - var glCanvas = gl.canvas, targetCanvas = pipelineState.targetCanvas, - ctx = targetCanvas.getContext('2d'); - ctx.translate(0, targetCanvas.height); // move it down again - ctx.scale(1, -1); // vertical flip - // where is my image on the big glcanvas? - var sourceY = glCanvas.height - targetCanvas.height; - ctx.drawImage(glCanvas, 0, sourceY, targetCanvas.width, targetCanvas.height, 0, 0, - targetCanvas.width, targetCanvas.height); -} - -/** - * Copy an input WebGL canvas on to an output 2D canvas using 2d canvas' putImageData - * API. Measurably faster than using ctx.drawImage in Firefox (version 54 on OSX Sierra). - * - * @param {WebGLRenderingContext} sourceContext The WebGL context to copy from. - * @param {HTMLCanvasElement} targetCanvas The 2D target canvas to copy on to. - * @param {Object} pipelineState The 2D target canvas to copy on to. - */ -function copyGLTo2DPutImageData(gl, pipelineState) { - var targetCanvas = pipelineState.targetCanvas, ctx = targetCanvas.getContext('2d'), - dWidth = pipelineState.destinationWidth, - dHeight = pipelineState.destinationHeight, - numBytes = dWidth * dHeight * 4; - - // eslint-disable-next-line no-undef - var u8 = new Uint8Array(this.imageBuffer, 0, numBytes); - // eslint-disable-next-line no-undef - var u8Clamped = new Uint8ClampedArray(this.imageBuffer, 0, numBytes); - - gl.readPixels(0, 0, dWidth, dHeight, gl.RGBA, gl.UNSIGNED_BYTE, u8); - var imgData = new ImageData(u8Clamped, dWidth, dHeight); - ctx.putImageData(imgData, 0, 0); -} - - -(function() { - - 'use strict'; - - var noop = function() {}; - - fabric.Canvas2dFilterBackend = Canvas2dFilterBackend; - - /** - * Canvas 2D filter backend. - */ - function Canvas2dFilterBackend() {}; - - Canvas2dFilterBackend.prototype = /** @lends fabric.Canvas2dFilterBackend.prototype */ { - evictCachesForKey: noop, - dispose: noop, - clearWebGLCaches: noop, - - /** - * Experimental. This object is a sort of repository of help layers used to avoid - * of recreating them during frequent filtering. If you are previewing a filter with - * a slider you probably do not want to create help layers every filter step. - * in this object there will be appended some canvases, created once, resized sometimes - * cleared never. Clearing is left to the developer. - **/ - resources: { - - }, - - /** - * Apply a set of filters against a source image and draw the filtered output - * to the provided destination canvas. - * - * @param {EnhancedFilter} filters The filter to apply. - * @param {HTMLImageElement|HTMLCanvasElement} sourceElement The source to be filtered. - * @param {Number} sourceWidth The width of the source input. - * @param {Number} sourceHeight The height of the source input. - * @param {HTMLCanvasElement} targetCanvas The destination for filtered output to be drawn. - */ - applyFilters: function(filters, sourceElement, sourceWidth, sourceHeight, targetCanvas) { - var ctx = targetCanvas.getContext('2d'); - ctx.drawImage(sourceElement, 0, 0, sourceWidth, sourceHeight); - var imageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var originalImageData = ctx.getImageData(0, 0, sourceWidth, sourceHeight); - var pipelineState = { - sourceWidth: sourceWidth, - sourceHeight: sourceHeight, - imageData: imageData, - originalEl: sourceElement, - originalImageData: originalImageData, - canvasEl: targetCanvas, - ctx: ctx, - filterBackend: this, - }; - filters.forEach(function(filter) { filter.applyTo(pipelineState); }); - if (pipelineState.imageData.width !== sourceWidth || pipelineState.imageData.height !== sourceHeight) { - targetCanvas.width = pipelineState.imageData.width; - targetCanvas.height = pipelineState.imageData.height; - } - ctx.putImageData(pipelineState.imageData, 0, 0); - return pipelineState; - }, - - }; -})(); - - -/** - * @namespace fabric.Image.filters - * @memberOf fabric.Image - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#image_filters} - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - */ -fabric.Image = fabric.Image || { }; -fabric.Image.filters = fabric.Image.filters || { }; - -/** - * Root filter class from which all filter classes inherit from - * @class fabric.Image.filters.BaseFilter - * @memberOf fabric.Image.filters - */ -fabric.Image.filters.BaseFilter = fabric.util.createClass(/** @lends fabric.Image.filters.BaseFilter.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'BaseFilter', - - /** - * Array of attributes to send with buffers. do not modify - * @private - */ - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - fragmentSource: 'precision highp float;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform sampler2D uTexture;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - '}', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - if (options) { - this.setOptions(options); - } - }, - - /** - * Sets filter's properties from options - * @param {Object} [options] Options object - */ - setOptions: function(options) { - for (var prop in options) { - this[prop] = options[prop]; - } - }, - - /** - * Compile this filter's shader program. - * - * @param {WebGLRenderingContext} gl The GL canvas context to use for shader compilation. - * @param {String} fragmentSource fragmentShader source for compilation - * @param {String} vertexSource vertexShader source for compilation - */ - createProgram: function(gl, fragmentSource, vertexSource) { - fragmentSource = fragmentSource || this.fragmentSource; - vertexSource = vertexSource || this.vertexSource; - if (fabric.webGlPrecision !== 'highp'){ - fragmentSource = fragmentSource.replace( - /precision highp float/g, - 'precision ' + fabric.webGlPrecision + ' float' - ); - } - var vertexShader = gl.createShader(gl.VERTEX_SHADER); - gl.shaderSource(vertexShader, vertexSource); - gl.compileShader(vertexShader); - if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Vertex shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(vertexShader) - ); - } - - var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); - gl.shaderSource(fragmentShader, fragmentSource); - gl.compileShader(fragmentShader); - if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Fragment shader compile error for ' + this.type + ': ' + - gl.getShaderInfoLog(fragmentShader) - ); - } - - var program = gl.createProgram(); - gl.attachShader(program, vertexShader); - gl.attachShader(program, fragmentShader); - gl.linkProgram(program); - if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { - throw new Error( - // eslint-disable-next-line prefer-template - 'Shader link error for "${this.type}" ' + - gl.getProgramInfoLog(program) - ); - } - - var attributeLocations = this.getAttributeLocations(gl, program); - var uniformLocations = this.getUniformLocations(gl, program) || { }; - uniformLocations.uStepW = gl.getUniformLocation(program, 'uStepW'); - uniformLocations.uStepH = gl.getUniformLocation(program, 'uStepH'); - return { - program: program, - attributeLocations: attributeLocations, - uniformLocations: uniformLocations - }; - }, - - /** - * Return a map of attribute names to WebGLAttributeLocation objects. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take attribute locations. - * @returns {Object} A map of attribute names to attribute locations. - */ - getAttributeLocations: function(gl, program) { - return { - aPosition: gl.getAttribLocation(program, 'aPosition'), - }; - }, - - /** - * Return a map of uniform names to WebGLUniformLocation objects. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {WebGLShaderProgram} program The shader program from which to take uniform locations. - * @returns {Object} A map of uniform names to uniform locations. - */ - getUniformLocations: function (/* gl, program */) { - // in case i do not need any special uniform i need to return an empty object - return { }; - }, - - /** - * Send attribute data from this filter to its shader program on the GPU. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} attributeLocations A map of shader attribute names to their locations. - */ - sendAttributeData: function(gl, attributeLocations, aPositionData) { - var attributeLocation = attributeLocations.aPosition; - var buffer = gl.createBuffer(); - gl.bindBuffer(gl.ARRAY_BUFFER, buffer); - gl.enableVertexAttribArray(attributeLocation); - gl.vertexAttribPointer(attributeLocation, 2, gl.FLOAT, false, 0, 0); - gl.bufferData(gl.ARRAY_BUFFER, aPositionData, gl.STATIC_DRAW); - }, - - _setupFrameBuffer: function(options) { - var gl = options.context, width, height; - if (options.passes > 1) { - width = options.destinationWidth; - height = options.destinationHeight; - if (options.sourceWidth !== width || options.sourceHeight !== height) { - gl.deleteTexture(options.targetTexture); - options.targetTexture = options.filterBackend.createTexture(gl, width, height); - } - gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, - options.targetTexture, 0); - } - else { - // draw last filter on canvas and not to framebuffer. - gl.bindFramebuffer(gl.FRAMEBUFFER, null); - gl.finish(); - } - }, - - _swapTextures: function(options) { - options.passes--; - options.pass++; - var temp = options.targetTexture; - options.targetTexture = options.sourceTexture; - options.sourceTexture = temp; - }, - - /** - * Generic isNeutral implementation for one parameter based filters. - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * Other filters may need their own version ( ColorMatrix, HueRotation, gamma, ComposedFilter ) - * @param {Object} options - **/ - isNeutralState: function(/* options */) { - var main = this.mainParameter, - _class = fabric.Image.filters[this.type].prototype; - if (main) { - if (Array.isArray(_class[main])) { - for (var i = _class[main].length; i--;) { - if (this[main][i] !== _class[main][i]) { - return false; - } - } - return true; - } - else { - return _class[main] === this[main]; - } - } - else { - return false; - } - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - if (!options.programCache.hasOwnProperty(this.type)) { - options.programCache[this.type] = this.createProgram(options.context); - } - return options.programCache[this.type]; - }, - - /** - * Apply this filter using webgl. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.originalTexture The texture of the original input image. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyToWebGL: function(options) { - var gl = options.context; - var shader = this.retrieveShader(options); - if (options.pass === 0 && options.originalTexture) { - gl.bindTexture(gl.TEXTURE_2D, options.originalTexture); - } - else { - gl.bindTexture(gl.TEXTURE_2D, options.sourceTexture); - } - gl.useProgram(shader.program); - this.sendAttributeData(gl, shader.attributeLocations, options.aPosition); - - gl.uniform1f(shader.uniformLocations.uStepW, 1 / options.sourceWidth); - gl.uniform1f(shader.uniformLocations.uStepH, 1 / options.sourceHeight); - - this.sendUniformData(gl, shader.uniformLocations); - gl.viewport(0, 0, options.destinationWidth, options.destinationHeight); - gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); - }, - - bindAdditionalTexture: function(gl, texture, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, texture); - // reset active texture to 0 as usual - gl.activeTexture(gl.TEXTURE0); - }, - - unbindAdditionalTexture: function(gl, textureUnit) { - gl.activeTexture(textureUnit); - gl.bindTexture(gl.TEXTURE_2D, null); - gl.activeTexture(gl.TEXTURE0); - }, - - getMainParameter: function() { - return this[this.mainParameter]; - }, - - setMainParameter: function(value) { - this[this.mainParameter] = value; - }, - - /** - * Send uniform data from this filter to its shader program on the GPU. - * - * Intended to be overridden by subclasses. - * - * @param {WebGLRenderingContext} gl The canvas context used to compile the shader program. - * @param {Object} uniformLocations A map of shader uniform names to their locations. - */ - sendUniformData: function(/* gl, uniformLocations */) { - // Intentionally left blank. Override me in subclasses. - }, - - /** - * If needed by a 2d filter, this functions can create an helper canvas to be used - * remember that options.targetCanvas is available for use till end of chain. - */ - createHelpLayer: function(options) { - if (!options.helpLayer) { - var helpLayer = document.createElement('canvas'); - helpLayer.width = options.sourceWidth; - helpLayer.height = options.sourceHeight; - options.helpLayer = helpLayer; - } - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - var object = { type: this.type }, mainP = this.mainParameter; - if (mainP) { - object[mainP] = this[mainP]; - } - return object; - }, - - /** - * Returns a JSON representation of an instance - * @return {Object} JSON - */ - toJSON: function() { - // delegate, not alias - return this.toObject(); - } -}); - -fabric.Image.filters.BaseFilter.fromObject = function(object, callback) { - var filter = new fabric.Image.filters[object.type](object); - callback && callback(filter); - return filter; -}; - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Matrix filter class - * @class fabric.Image.filters.ColorMatrix - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.ColorMatrix#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @see {@Link http://www.webwasp.co.uk/tutorials/219/Color_Matrix_Filter.php} - * @see {@Link http://phoboslab.org/log/2013/11/fast-image-filters-with-webgl} - * @example Kodachrome filter - * var filter = new fabric.Image.filters.ColorMatrix({ - * matrix: [ - 1.1285582396593525, -0.3967382283601348, -0.03992559172921793, 0, 63.72958762196502, - -0.16404339962244616, 1.0835251566291304, -0.05498805115633132, 0, 24.732407896706203, - -0.16786010706155763, -0.5603416277695248, 1.6014850761964943, 0, 35.62982807460946, - 0, 0, 0, 1, 0 - ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.ColorMatrix = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.ColorMatrix.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'ColorMatrix', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'uniform mat4 uColorMatrix;\n' + - 'uniform vec4 uConstants;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color *= uColorMatrix;\n' + - 'color += uConstants;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Colormatrix for pixels. - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ], - - mainParameter: 'matrix', - - /** - * Lock the colormatrix on the color part, skipping alpha, mainly for non webgl scenario - * to save some calculation - * @type Boolean - * @default true - */ - colorsOnly: true, - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.matrix = this.matrix.slice(0); - }, - - /** - * Apply the ColorMatrix operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = data.length, - m = this.matrix, - r, g, b, a, i, colorsOnly = this.colorsOnly; - - for (i = 0; i < iLen; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - if (colorsOnly) { - data[i] = r * m[0] + g * m[1] + b * m[2] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + m[14] * 255; - } - else { - a = data[i + 3]; - data[i] = r * m[0] + g * m[1] + b * m[2] + a * m[3] + m[4] * 255; - data[i + 1] = r * m[5] + g * m[6] + b * m[7] + a * m[8] + m[9] * 255; - data[i + 2] = r * m[10] + g * m[11] + b * m[12] + a * m[13] + m[14] * 255; - data[i + 3] = r * m[15] + g * m[16] + b * m[17] + a * m[18] + m[19] * 255; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColorMatrix: gl.getUniformLocation(program, 'uColorMatrix'), - uConstants: gl.getUniformLocation(program, 'uConstants'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var m = this.matrix, - matrix = [ - m[0], m[1], m[2], m[3], - m[5], m[6], m[7], m[8], - m[10], m[11], m[12], m[13], - m[15], m[16], m[17], m[18] - ], - constants = [m[4], m[9], m[14], m[19]]; - gl.uniformMatrix4fv(uniformLocations.uColorMatrix, false, matrix); - gl.uniform4fv(uniformLocations.uConstants, constants); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] function to invoke after filter creation - * @return {fabric.Image.filters.ColorMatrix} Instance of fabric.Image.filters.ColorMatrix - */ - fabric.Image.filters.ColorMatrix.fromObject = fabric.Image.filters.BaseFilter.fromObject; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Brightness filter class - * @class fabric.Image.filters.Brightness - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Brightness#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Brightness({ - * brightness: 0.05 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Brightness = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Brightness.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Brightness', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBrightness;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += uBrightness;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Brightness value, from -1 to 1. - * translated to -255 to 255 for 2d - * 0.0039215686 is the part of 1 that get translated to 1 in 2d - * @param {Number} brightness - * @default - */ - brightness: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'brightness', - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.brightness === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - brightness = Math.round(this.brightness * 255); - for (i = 0; i < len; i += 4) { - data[i] = data[i] + brightness; - data[i + 1] = data[i + 1] + brightness; - data[i + 2] = data[i + 2] + brightness; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBrightness: gl.getUniformLocation(program, 'uBrightness'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBrightness, this.brightness); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Brightness} Instance of fabric.Image.filters.Brightness - */ - fabric.Image.filters.Brightness.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Adapted from html5rocks article - * @class fabric.Image.filters.Convolute - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Convolute#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example Sharpen filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 0, -1, 0, - * -1, 5, -1, - * 0, -1, 0 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Blur filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9, - * 1/9, 1/9, 1/9 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter - * var filter = new fabric.Image.filters.Convolute({ - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - * @example Emboss filter with opaqueness - * var filter = new fabric.Image.filters.Convolute({ - * opaque: true, - * matrix: [ 1, 1, 1, - * 1, 0.7, -1, - * -1, -1, -1 ] - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Convolute = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Convolute.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Convolute', - - /* - * Opaque value (true/false) - */ - opaque: false, - - /* - * matrix for the filter, max 9x9 - */ - matrix: [0, 0, 0, 0, 1, 0, 0, 0, 0], - - /** - * Fragment source for the brightness program - */ - fragmentSource: { - Convolute_3_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1), uStepH * (h - 1));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_3_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[9];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 3.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 3.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 1.0), uStepH * (h - 1.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 3.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_5_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_5_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[25];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 5.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 5.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 2.0), uStepH * (h - 2.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 5.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_7_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_7_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[49];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 7.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 7.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 3.0), uStepH * (h - 3.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 7.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - Convolute_9_1: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 0);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color += texture2D(uTexture, vTexCoord + matrixPos) * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'gl_FragColor = color;\n' + - '}', - Convolute_9_0: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uMatrix[81];\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = vec4(0, 0, 0, 1);\n' + - 'for (float h = 0.0; h < 9.0; h+=1.0) {\n' + - 'for (float w = 0.0; w < 9.0; w+=1.0) {\n' + - 'vec2 matrixPos = vec2(uStepW * (w - 4.0), uStepH * (h - 4.0));\n' + - 'color.rgb += texture2D(uTexture, vTexCoord + matrixPos).rgb * uMatrix[int(h * 9.0 + w)];\n' + - '}\n' + - '}\n' + - 'float alpha = texture2D(uTexture, vTexCoord).a;\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.a = alpha;\n' + - '}', - }, - - /** - * Constructor - * @memberOf fabric.Image.filters.Convolute.prototype - * @param {Object} [options] Options object - * @param {Boolean} [options.opaque=false] Opaque value (true/false) - * @param {Array} [options.matrix] Filter matrix - */ - - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var size = Math.sqrt(this.matrix.length); - var cacheKey = this.type + '_' + size + '_' + (this.opaque ? 1 : 0); - var shaderSource = this.fragmentSource[cacheKey]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - weights = this.matrix, - side = Math.round(Math.sqrt(weights.length)), - halfSide = Math.floor(side / 2), - sw = imageData.width, - sh = imageData.height, - output = options.ctx.createImageData(sw, sh), - dst = output.data, - // go through the destination image pixels - alphaFac = this.opaque ? 1 : 0, - r, g, b, a, dstOff, - scx, scy, srcOff, wt, - x, y, cx, cy; - - for (y = 0; y < sh; y++) { - for (x = 0; x < sw; x++) { - dstOff = (y * sw + x) * 4; - // calculate the weighed sum of the source image pixels that - // fall under the convolution matrix - r = 0; g = 0; b = 0; a = 0; - - for (cy = 0; cy < side; cy++) { - for (cx = 0; cx < side; cx++) { - scy = y + cy - halfSide; - scx = x + cx - halfSide; - - // eslint-disable-next-line max-depth - if (scy < 0 || scy >= sh || scx < 0 || scx >= sw) { - continue; - } - - srcOff = (scy * sw + scx) * 4; - wt = weights[cy * side + cx]; - - r += data[srcOff] * wt; - g += data[srcOff + 1] * wt; - b += data[srcOff + 2] * wt; - // eslint-disable-next-line max-depth - if (!alphaFac) { - a += data[srcOff + 3] * wt; - } - } - } - dst[dstOff] = r; - dst[dstOff + 1] = g; - dst[dstOff + 2] = b; - if (!alphaFac) { - dst[dstOff + 3] = a; - } - else { - dst[dstOff + 3] = data[dstOff + 3]; - } - } - } - options.imageData = output; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMatrix: gl.getUniformLocation(program, 'uMatrix'), - uOpaque: gl.getUniformLocation(program, 'uOpaque'), - uHalfSize: gl.getUniformLocation(program, 'uHalfSize'), - uSize: gl.getUniformLocation(program, 'uSize'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1fv(uniformLocations.uMatrix, this.matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - opaque: this.opaque, - matrix: this.matrix - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Convolute} Instance of fabric.Image.filters.Convolute - */ - fabric.Image.filters.Convolute.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Grayscale image filter class - * @class fabric.Image.filters.Grayscale - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Grayscale(); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Grayscale = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Grayscale.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Grayscale', - - fragmentSource: { - average: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float average = (color.r + color.b + color.g) / 3.0;\n' + - 'gl_FragColor = vec4(average, average, average, color.a);\n' + - '}', - lightness: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = (max(max(col.r, col.g),col.b) + min(min(col.r, col.g),col.b)) / 2.0;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - luminosity: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uMode;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 col = texture2D(uTexture, vTexCoord);\n' + - 'float average = 0.21 * col.r + 0.72 * col.g + 0.07 * col.b;\n' + - 'gl_FragColor = vec4(average, average, average, col.a);\n' + - '}', - }, - - - /** - * Grayscale mode, between 'average', 'lightness', 'luminosity' - * @param {String} type - * @default - */ - mode: 'average', - - mainParameter: 'mode', - - /** - * Apply the Grayscale operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length, value, - mode = this.mode; - for (i = 0; i < len; i += 4) { - if (mode === 'average') { - value = (data[i] + data[i + 1] + data[i + 2]) / 3; - } - else if (mode === 'lightness') { - value = (Math.min(data[i], data[i + 1], data[i + 2]) + - Math.max(data[i], data[i + 1], data[i + 2])) / 2; - } - else if (mode === 'luminosity') { - value = 0.21 * data[i] + 0.72 * data[i + 1] + 0.07 * data[i + 2]; - } - data[i] = value; - data[i + 1] = value; - data[i + 2] = value; - } - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var shaderSource = this.fragmentSource[this.mode]; - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uMode: gl.getUniformLocation(program, 'uMode'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - // default average mode. - var mode = 1; - gl.uniform1i(uniformLocations.uMode, mode); - }, - - /** - * Grayscale filter isNeutralState implementation - * The filter is never neutral - * on the image - **/ - isNeutralState: function() { - return false; - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Grayscale} Instance of fabric.Image.filters.Grayscale - */ - fabric.Image.filters.Grayscale.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Invert filter class - * @class fabric.Image.filters.Invert - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Invert(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Invert = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Invert.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Invert', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform int uInvert;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'if (uInvert == 1) {\n' + - 'gl_FragColor = vec4(1.0 - color.r,1.0 -color.g,1.0 -color.b,color.a);\n' + - '} else {\n' + - 'gl_FragColor = color;\n' + - '}\n' + - '}', - - /** - * Filter invert. if false, does nothing - * @param {Boolean} invert - * @default - */ - invert: true, - - mainParameter: 'invert', - - /** - * Apply the Invert operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - len = data.length; - for (i = 0; i < len; i += 4) { - data[i] = 255 - data[i]; - data[i + 1] = 255 - data[i + 1]; - data[i + 2] = 255 - data[i + 2]; - } - }, - - /** - * Invert filter isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function() { - return !this.invert; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uInvert: gl.getUniformLocation(program, 'uInvert'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1i(uniformLocations.uInvert, this.invert); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Invert} Instance of fabric.Image.filters.Invert - */ - fabric.Image.filters.Invert.fromObject = fabric.Image.filters.BaseFilter.fromObject; - - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Noise filter class - * @class fabric.Image.filters.Noise - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Noise#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Noise({ - * noise: 700 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Noise = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Noise.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Noise', - - /** - * Fragment source for the noise program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uStepH;\n' + - 'uniform float uNoise;\n' + - 'uniform float uSeed;\n' + - 'varying vec2 vTexCoord;\n' + - 'float rand(vec2 co, float seed, float vScale) {\n' + - 'return fract(sin(dot(co.xy * vScale ,vec2(12.9898 , 78.233))) * 43758.5453 * (seed + 0.01) / 2.0);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'color.rgb += (0.5 - rand(vTexCoord, uSeed, 0.1 / uStepH)) * uNoise;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'noise', - - /** - * Noise value, from - * @param {Number} noise - * @default - */ - noise: 0, - - /** - * Apply the Brightness operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.noise === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, i, len = data.length, - noise = this.noise, rand; - - for (i = 0, len = data.length; i < len; i += 4) { - - rand = (0.5 - Math.random()) * noise; - - data[i] += rand; - data[i + 1] += rand; - data[i + 2] += rand; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uNoise: gl.getUniformLocation(program, 'uNoise'), - uSeed: gl.getUniformLocation(program, 'uSeed'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uNoise, this.noise / 255); - gl.uniform1f(uniformLocations.uSeed, Math.random()); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - noise: this.noise - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Noise} Instance of fabric.Image.filters.Noise - */ - fabric.Image.filters.Noise.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Pixelate filter class - * @class fabric.Image.filters.Pixelate - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Pixelate#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Pixelate({ - * blocksize: 8 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Pixelate = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Pixelate.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Pixelate', - - blocksize: 4, - - mainParameter: 'blocksize', - - /** - * Fragment source for the Pixelate program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uBlocksize;\n' + - 'uniform float uStepW;\n' + - 'uniform float uStepH;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'float blockW = uBlocksize * uStepW;\n' + - 'float blockH = uBlocksize * uStepW;\n' + - 'int posX = int(vTexCoord.x / blockW);\n' + - 'int posY = int(vTexCoord.y / blockH);\n' + - 'float fposX = float(posX);\n' + - 'float fposY = float(posY);\n' + - 'vec2 squareCoords = vec2(fposX * blockW, fposY * blockH);\n' + - 'vec4 color = texture2D(uTexture, squareCoords);\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Apply the Pixelate operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, - iLen = imageData.height, - jLen = imageData.width, - index, i, j, r, g, b, a, - _i, _j, _iLen, _jLen; - - for (i = 0; i < iLen; i += this.blocksize) { - for (j = 0; j < jLen; j += this.blocksize) { - - index = (i * 4) * jLen + (j * 4); - - r = data[index]; - g = data[index + 1]; - b = data[index + 2]; - a = data[index + 3]; - - _iLen = Math.min(i + this.blocksize, iLen); - _jLen = Math.min(j + this.blocksize, jLen); - for (_i = i; _i < _iLen; _i++) { - for (_j = j; _j < _jLen; _j++) { - index = (_i * 4) * jLen + (_j * 4); - data[index] = r; - data[index + 1] = g; - data[index + 2] = b; - data[index + 3] = a; - } - } - } - } - }, - - /** - * Indicate when the filter is not gonna apply changes to the image - **/ - isNeutralState: function() { - return this.blocksize === 1; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uBlocksize: gl.getUniformLocation(program, 'uBlocksize'), - uStepW: gl.getUniformLocation(program, 'uStepW'), - uStepH: gl.getUniformLocation(program, 'uStepH'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uBlocksize, this.blocksize); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Pixelate} Instance of fabric.Image.filters.Pixelate - */ - fabric.Image.filters.Pixelate.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - extend = fabric.util.object.extend, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Remove white filter class - * @class fabric.Image.filters.RemoveColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.RemoveColor#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.RemoveColor({ - * threshold: 0.2, - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.RemoveColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.RemoveColor.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'RemoveColor', - - /** - * Color to remove, in any format understood by fabric.Color. - * @param {String} type - * @default - */ - color: '#FFFFFF', - - /** - * Fragment source for the brightness program - */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uLow;\n' + - 'uniform vec4 uHigh;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'gl_FragColor = texture2D(uTexture, vTexCoord);\n' + - 'if(all(greaterThan(gl_FragColor.rgb,uLow.rgb)) && all(greaterThan(uHigh.rgb,gl_FragColor.rgb))) {\n' + - 'gl_FragColor.a = 0.0;\n' + - '}\n' + - '}', - - /** - * distance to actual color, as value up or down from each r,g,b - * between 0 and 1 - **/ - distance: 0.02, - - /** - * For color to remove inside distance, use alpha channel for a smoother deletion - * NOT IMPLEMENTED YET - **/ - useAlpha: false, - - /** - * Constructor - * @memberOf fabric.Image.filters.RemoveWhite.prototype - * @param {Object} [options] Options object - * @param {Number} [options.color=#RRGGBB] Threshold value - * @param {Number} [options.distance=10] Distance value - */ - - /** - * Applies filter to canvas element - * @param {Object} canvasEl Canvas element to apply filter to - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, i, - distance = this.distance * 255, - r, g, b, - source = new fabric.Color(this.color).getSource(), - lowC = [ - source[0] - distance, - source[1] - distance, - source[2] - distance, - ], - highC = [ - source[0] + distance, - source[1] + distance, - source[2] + distance, - ]; - - - for (i = 0; i < data.length; i += 4) { - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - if (r > lowC[0] && - g > lowC[1] && - b > lowC[2] && - r < highC[0] && - g < highC[1] && - b < highC[2]) { - data[i + 3] = 0; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uLow: gl.getUniformLocation(program, 'uLow'), - uHigh: gl.getUniformLocation(program, 'uHigh'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(), - distance = parseFloat(this.distance), - lowC = [ - 0 + source[0] / 255 - distance, - 0 + source[1] / 255 - distance, - 0 + source[2] / 255 - distance, - 1 - ], - highC = [ - source[0] / 255 + distance, - source[1] / 255 + distance, - source[2] / 255 + distance, - 1 - ]; - gl.uniform4fv(uniformLocations.uLow, lowC); - gl.uniform4fv(uniformLocations.uHigh, highC); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return extend(this.callSuper('toObject'), { - color: this.color, - distance: this.distance - }); - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.RemoveColor} Instance of fabric.Image.filters.RemoveWhite - */ - fabric.Image.filters.RemoveColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - var matrices = { - Brownie: [ - 0.59970,0.34553,-0.27082,0,0.186, - -0.03770,0.86095,0.15059,0,-0.1449, - 0.24113,-0.07441,0.44972,0,-0.02965, - 0,0,0,1,0 - ], - Vintage: [ - 0.62793,0.32021,-0.03965,0,0.03784, - 0.02578,0.64411,0.03259,0,0.02926, - 0.04660,-0.08512,0.52416,0,0.02023, - 0,0,0,1,0 - ], - Kodachrome: [ - 1.12855,-0.39673,-0.03992,0,0.24991, - -0.16404,1.08352,-0.05498,0,0.09698, - -0.16786,-0.56034,1.60148,0,0.13972, - 0,0,0,1,0 - ], - Technicolor: [ - 1.91252,-0.85453,-0.09155,0,0.04624, - -0.30878,1.76589,-0.10601,0,-0.27589, - -0.23110,-0.75018,1.84759,0,0.12137, - 0,0,0,1,0 - ], - Polaroid: [ - 1.438,-0.062,-0.062,0,0, - -0.122,1.378,-0.122,0,0, - -0.016,-0.016,1.483,0,0, - 0,0,0,1,0 - ], - Sepia: [ - 0.393, 0.769, 0.189, 0, 0, - 0.349, 0.686, 0.168, 0, 0, - 0.272, 0.534, 0.131, 0, 0, - 0, 0, 0, 1, 0 - ], - BlackWhite: [ - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 1.5, 1.5, 1.5, 0, -1, - 0, 0, 0, 1, 0, - ] - }; - - for (var key in matrices) { - filters[key] = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.Sepia.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: key, - - /** - * Colormatrix for the effect - * array of 20 floats. Numbers in positions 4, 9, 14, 19 loose meaning - * outside the -1, 1 range. - * @param {Array} matrix array of 20 numbers. - * @default - */ - matrix: matrices[key], - - /** - * Lock the matrix export for this kind of static, parameter less filters. - */ - mainParameter: false, - /** - * Lock the colormatrix on the color part, skipping alpha - */ - colorsOnly: true, - - }); - fabric.Image.filters[key].fromObject = fabric.Image.filters.BaseFilter.fromObject; - } -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Color Blend filter class - * @class fabric.Image.filter.BlendColor - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendColor = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blend.prototype */ { - type: 'BlendColor', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - * @type String - * @default - **/ - color: '#F95C63', - - /** - * Blend mode for the filter: one of multiply, add, diff, screen, subtract, - * darken, lighten, overlay, exclusion, tint. - * @type String - * @default - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend color operation. - * @type Number - * @default - **/ - alpha: 1, - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'gl_FragColor.rgb *= uColor.rgb;\n', - screen: 'gl_FragColor.rgb = 1.0 - (1.0 - gl_FragColor.rgb) * (1.0 - uColor.rgb);\n', - add: 'gl_FragColor.rgb += uColor.rgb;\n', - diff: 'gl_FragColor.rgb = abs(gl_FragColor.rgb - uColor.rgb);\n', - subtract: 'gl_FragColor.rgb -= uColor.rgb;\n', - lighten: 'gl_FragColor.rgb = max(gl_FragColor.rgb, uColor.rgb);\n', - darken: 'gl_FragColor.rgb = min(gl_FragColor.rgb, uColor.rgb);\n', - exclusion: 'gl_FragColor.rgb += uColor.rgb - 2.0 * (uColor.rgb * gl_FragColor.rgb);\n', - overlay: 'if (uColor.r < 0.5) {\n' + - 'gl_FragColor.r *= 2.0 * uColor.r;\n' + - '} else {\n' + - 'gl_FragColor.r = 1.0 - 2.0 * (1.0 - gl_FragColor.r) * (1.0 - uColor.r);\n' + - '}\n' + - 'if (uColor.g < 0.5) {\n' + - 'gl_FragColor.g *= 2.0 * uColor.g;\n' + - '} else {\n' + - 'gl_FragColor.g = 1.0 - 2.0 * (1.0 - gl_FragColor.g) * (1.0 - uColor.g);\n' + - '}\n' + - 'if (uColor.b < 0.5) {\n' + - 'gl_FragColor.b *= 2.0 * uColor.b;\n' + - '} else {\n' + - 'gl_FragColor.b = 1.0 - 2.0 * (1.0 - gl_FragColor.b) * (1.0 - uColor.b);\n' + - '}\n', - tint: 'gl_FragColor.rgb *= (1.0 - uColor.a);\n' + - 'gl_FragColor.rgb += uColor.rgb;\n', - }, - - /** - * build the fragment source for the filters, joining the common part with - * the specific one. - * @param {String} mode the mode of the filter, a key of this.fragmentSource - * @return {String} the source to be compiled - * @private - */ - buildSource: function(mode) { - return 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'gl_FragColor = color;\n' + - 'if (color.a > 0.0) {\n' + - this.fragmentSource[mode] + - '}\n' + - '}'; - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode, shaderSource; - if (!options.programCache.hasOwnProperty(cacheKey)) { - shaderSource = this.buildSource(this.mode); - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - data = imageData.data, iLen = data.length, - tr, tg, tb, - r, g, b, - source, alpha1 = 1 - this.alpha; - - source = new fabric.Color(this.color).getSource(); - tr = source[0] * this.alpha; - tg = source[1] * this.alpha; - tb = source[2] * this.alpha; - - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - break; - case 'screen': - data[i] = 255 - (255 - r) * (255 - tr) / 255; - data[i + 1] = 255 - (255 - g) * (255 - tg) / 255; - data[i + 2] = 255 - (255 - b) * (255 - tb) / 255; - break; - case 'add': - data[i] = r + tr; - data[i + 1] = g + tg; - data[i + 2] = b + tb; - break; - case 'diff': - case 'difference': - data[i] = Math.abs(r - tr); - data[i + 1] = Math.abs(g - tg); - data[i + 2] = Math.abs(b - tb); - break; - case 'subtract': - data[i] = r - tr; - data[i + 1] = g - tg; - data[i + 2] = b - tb; - break; - case 'darken': - data[i] = Math.min(r, tr); - data[i + 1] = Math.min(g, tg); - data[i + 2] = Math.min(b, tb); - break; - case 'lighten': - data[i] = Math.max(r, tr); - data[i + 1] = Math.max(g, tg); - data[i + 2] = Math.max(b, tb); - break; - case 'overlay': - data[i] = tr < 128 ? (2 * r * tr / 255) : (255 - 2 * (255 - r) * (255 - tr) / 255); - data[i + 1] = tg < 128 ? (2 * g * tg / 255) : (255 - 2 * (255 - g) * (255 - tg) / 255); - data[i + 2] = tb < 128 ? (2 * b * tb / 255) : (255 - 2 * (255 - b) * (255 - tb) / 255); - break; - case 'exclusion': - data[i] = tr + r - ((2 * tr * r) / 255); - data[i + 1] = tg + g - ((2 * tg * g) / 255); - data[i + 2] = tb + b - ((2 * tb * b) / 255); - break; - case 'tint': - data[i] = tr + r * alpha1; - data[i + 1] = tg + g * alpha1; - data[i + 2] = tb + b * alpha1; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uColor: gl.getUniformLocation(program, 'uColor'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var source = new fabric.Color(this.color).getSource(); - source[0] = this.alpha * source[0] / 255; - source[1] = this.alpha * source[1] / 255; - source[2] = this.alpha * source[2] / 255; - source[3] = this.alpha; - gl.uniform4fv(uniformLocations.uColor, source); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - color: this.color, - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.BlendColor} Instance of fabric.Image.filters.BlendColor - */ - fabric.Image.filters.BlendColor.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - 'use strict'; - - var fabric = global.fabric, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Image Blend filter class - * @class fabric.Image.filter.BlendImage - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @example - * var filter = new fabric.Image.filters.BlendColor({ - * color: '#000', - * mode: 'multiply' - * }); - * - * var filter = new fabric.Image.filters.BlendImage({ - * image: fabricImageObject, - * mode: 'multiply', - * alpha: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - - filters.BlendImage = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.BlendImage.prototype */ { - type: 'BlendImage', - - /** - * Color to make the blend operation with. default to a reddish color since black or white - * gives always strong result. - **/ - image: null, - - /** - * Blend mode for the filter (one of "multiply", "mask") - * @type String - * @default - **/ - mode: 'multiply', - - /** - * alpha value. represent the strength of the blend image operation. - * not implemented. - **/ - alpha: 1, - - vertexSource: 'attribute vec2 aPosition;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'uniform mat3 uTransformMatrix;\n' + - 'void main() {\n' + - 'vTexCoord = aPosition;\n' + - 'vTexCoord2 = (uTransformMatrix * vec3(aPosition, 1.0)).xy;\n' + - 'gl_Position = vec4(aPosition * 2.0 - 1.0, 0.0, 1.0);\n' + - '}', - - /** - * Fragment source for the Multiply program - */ - fragmentSource: { - multiply: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.rgba *= color2.rgba;\n' + - 'gl_FragColor = color;\n' + - '}', - mask: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform sampler2D uImage;\n' + - 'uniform vec4 uColor;\n' + - 'varying vec2 vTexCoord;\n' + - 'varying vec2 vTexCoord2;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec4 color2 = texture2D(uImage, vTexCoord2);\n' + - 'color.a = color2.a;\n' + - 'gl_FragColor = color;\n' + - '}', - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var cacheKey = this.type + '_' + this.mode; - var shaderSource = this.fragmentSource[this.mode]; - if (!options.programCache.hasOwnProperty(cacheKey)) { - options.programCache[cacheKey] = this.createProgram(options.context, shaderSource); - } - return options.programCache[cacheKey]; - }, - - applyToWebGL: function(options) { - // load texture to blend. - var gl = options.context, - texture = this.createTexture(options.filterBackend, this.image); - this.bindAdditionalTexture(gl, texture, gl.TEXTURE1); - this.callSuper('applyToWebGL', options); - this.unbindAdditionalTexture(gl, gl.TEXTURE1); - }, - - createTexture: function(backend, image) { - return backend.getCachedTexture(image.cacheKey, image._element); - }, - - /** - * Calculate a transformMatrix to adapt the image to blend over - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - calculateMatrix: function() { - var image = this.image, - width = image._element.width, - height = image._element.height; - return [ - 1 / image.scaleX, 0, 0, - 0, 1 / image.scaleY, 0, - -image.left / width, -image.top / height, 1 - ]; - }, - - /** - * Apply the Blend operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, - resources = options.filterBackend.resources, - data = imageData.data, iLen = data.length, - width = imageData.width, - height = imageData.height, - tr, tg, tb, ta, - r, g, b, a, - canvas1, context, image = this.image, blendData; - - if (!resources.blendImage) { - resources.blendImage = fabric.util.createCanvasElement(); - } - canvas1 = resources.blendImage; - context = canvas1.getContext('2d'); - if (canvas1.width !== width || canvas1.height !== height) { - canvas1.width = width; - canvas1.height = height; - } - else { - context.clearRect(0, 0, width, height); - } - context.setTransform(image.scaleX, 0, 0, image.scaleY, image.left, image.top); - context.drawImage(image._element, 0, 0, width, height); - blendData = context.getImageData(0, 0, width, height).data; - for (var i = 0; i < iLen; i += 4) { - - r = data[i]; - g = data[i + 1]; - b = data[i + 2]; - a = data[i + 3]; - - tr = blendData[i]; - tg = blendData[i + 1]; - tb = blendData[i + 2]; - ta = blendData[i + 3]; - - switch (this.mode) { - case 'multiply': - data[i] = r * tr / 255; - data[i + 1] = g * tg / 255; - data[i + 2] = b * tb / 255; - data[i + 3] = a * ta / 255; - break; - case 'mask': - data[i + 3] = ta; - break; - } - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uTransformMatrix: gl.getUniformLocation(program, 'uTransformMatrix'), - uImage: gl.getUniformLocation(program, 'uImage'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var matrix = this.calculateMatrix(); - gl.uniform1i(uniformLocations.uImage, 1); // texture unit 1. - gl.uniformMatrix3fv(uniformLocations.uTransformMatrix, false, matrix); - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - image: this.image && this.image.toObject(), - mode: this.mode, - alpha: this.alpha - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} callback to be invoked after filter creation - * @return {fabric.Image.filters.BlendImage} Instance of fabric.Image.filters.BlendImage - */ - fabric.Image.filters.BlendImage.fromObject = function(object, callback) { - fabric.Image.fromObject(object.image, function(image) { - var options = fabric.util.object.clone(object); - options.image = image; - callback(new fabric.Image.filters.BlendImage(options)); - }); - }; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), pow = Math.pow, floor = Math.floor, - sqrt = Math.sqrt, abs = Math.abs, round = Math.round, sin = Math.sin, - ceil = Math.ceil, - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Resize image filter class - * @class fabric.Image.filters.Resize - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Resize(); - * object.filters.push(filter); - * object.applyFilters(canvas.renderAll.bind(canvas)); - */ - filters.Resize = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Resize.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Resize', - - /** - * Resize type - * for webgl resizeType is just lanczos, for canvas2d can be: - * bilinear, hermite, sliceHack, lanczos. - * @param {String} resizeType - * @default - */ - resizeType: 'hermite', - - /** - * Scale factor for resizing, x axis - * @param {Number} scaleX - * @default - */ - scaleX: 1, - - /** - * Scale factor for resizing, y axis - * @param {Number} scaleY - * @default - */ - scaleY: 1, - - /** - * LanczosLobes parameter for lanczos filter, valid for resizeType lanczos - * @param {Number} lanczosLobes - * @default - */ - lanczosLobes: 3, - - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uDelta: gl.getUniformLocation(program, 'uDelta'), - uTaps: gl.getUniformLocation(program, 'uTaps'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform2fv(uniformLocations.uDelta, this.horizontal ? [1 / this.width, 0] : [0, 1 / this.height]); - gl.uniform1fv(uniformLocations.uTaps, this.taps); - }, - - /** - * Retrieves the cached shader. - * @param {Object} options - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - retrieveShader: function(options) { - var filterWindow = this.getFilterWindow(), cacheKey = this.type + '_' + filterWindow; - if (!options.programCache.hasOwnProperty(cacheKey)) { - var fragmentShader = this.generateShader(filterWindow); - options.programCache[cacheKey] = this.createProgram(options.context, fragmentShader); - } - return options.programCache[cacheKey]; - }, - - getFilterWindow: function() { - var scale = this.tempScale; - return Math.ceil(this.lanczosLobes / scale); - }, - - getTaps: function() { - var lobeFunction = this.lanczosCreate(this.lanczosLobes), scale = this.tempScale, - filterWindow = this.getFilterWindow(), taps = new Array(filterWindow); - for (var i = 1; i <= filterWindow; i++) { - taps[i - 1] = lobeFunction(i * scale); - } - return taps; - }, - - /** - * Generate vertex and shader sources from the necessary steps numbers - * @param {Number} filterWindow - */ - generateShader: function(filterWindow) { - var offsets = new Array(filterWindow), - fragmentShader = this.fragmentSourceTOP, filterWindow; - - for (var i = 1; i <= filterWindow; i++) { - offsets[i - 1] = i + '.0 * uDelta'; - } - - fragmentShader += 'uniform float uTaps[' + filterWindow + '];\n'; - fragmentShader += 'void main() {\n'; - fragmentShader += ' vec4 color = texture2D(uTexture, vTexCoord);\n'; - fragmentShader += ' float sum = 1.0;\n'; - - offsets.forEach(function(offset, i) { - fragmentShader += ' color += texture2D(uTexture, vTexCoord + ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' color += texture2D(uTexture, vTexCoord - ' + offset + ') * uTaps[' + i + '];\n'; - fragmentShader += ' sum += 2.0 * uTaps[' + i + '];\n'; - }); - fragmentShader += ' gl_FragColor = color / sum;\n'; - fragmentShader += '}'; - return fragmentShader; - }, - - fragmentSourceTOP: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n', - - /** - * Apply the resize filter to the image - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - if (options.webgl) { - options.passes++; - this.width = options.sourceWidth; - this.horizontal = true; - this.dW = Math.round(this.width * this.scaleX); - this.dH = options.sourceHeight; - this.tempScale = this.dW / this.width; - this.taps = this.getTaps(); - options.destinationWidth = this.dW; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceWidth = options.destinationWidth; - - this.height = options.sourceHeight; - this.horizontal = false; - this.dH = Math.round(this.height * this.scaleY); - this.tempScale = this.dH / this.height; - this.taps = this.getTaps(); - options.destinationHeight = this.dH; - this._setupFrameBuffer(options); - this.applyToWebGL(options); - this._swapTextures(options); - options.sourceHeight = options.destinationHeight; - } - else { - this.applyTo2d(options); - } - }, - - isNeutralState: function() { - return this.scaleX === 1 && this.scaleY === 1; - }, - - lanczosCreate: function(lobes) { - return function(x) { - if (x >= lobes || x <= -lobes) { - return 0.0; - } - if (x < 1.19209290E-07 && x > -1.19209290E-07) { - return 1.0; - } - x *= Math.PI; - var xx = x / lobes; - return (sin(x) / x) * sin(xx) / xx; - }; - }, - - /** - * Applies filter to canvas element - * @memberOf fabric.Image.filters.Resize.prototype - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} scaleX - * @param {Number} scaleY - */ - applyTo2d: function(options) { - var imageData = options.imageData, - scaleX = this.scaleX, - scaleY = this.scaleY; - - this.rcpScaleX = 1 / scaleX; - this.rcpScaleY = 1 / scaleY; - - var oW = imageData.width, oH = imageData.height, - dW = round(oW * scaleX), dH = round(oH * scaleY), - newData; - - if (this.resizeType === 'sliceHack') { - newData = this.sliceByTwo(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'hermite') { - newData = this.hermiteFastResize(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'bilinear') { - newData = this.bilinearFiltering(options, oW, oH, dW, dH); - } - else if (this.resizeType === 'lanczos') { - newData = this.lanczosResize(options, oW, oH, dW, dH); - } - options.imageData = newData; - }, - - /** - * Filter sliceByTwo - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - sliceByTwo: function(options, oW, oH, dW, dH) { - var imageData = options.imageData, - mult = 0.5, doneW = false, doneH = false, stepW = oW * mult, - stepH = oH * mult, resources = fabric.filterBackend.resources, - tmpCanvas, ctx, sX = 0, sY = 0, dX = oW, dY = 0; - if (!resources.sliceByTwo) { - resources.sliceByTwo = document.createElement('canvas'); - } - tmpCanvas = resources.sliceByTwo; - if (tmpCanvas.width < oW * 1.5 || tmpCanvas.height < oH) { - tmpCanvas.width = oW * 1.5; - tmpCanvas.height = oH; - } - ctx = tmpCanvas.getContext('2d'); - ctx.clearRect(0, 0, oW * 1.5, oH); - ctx.putImageData(imageData, 0, 0); - - dW = floor(dW); - dH = floor(dH); - - while (!doneW || !doneH) { - oW = stepW; - oH = stepH; - if (dW < floor(stepW * mult)) { - stepW = floor(stepW * mult); - } - else { - stepW = dW; - doneW = true; - } - if (dH < floor(stepH * mult)) { - stepH = floor(stepH * mult); - } - else { - stepH = dH; - doneH = true; - } - ctx.drawImage(tmpCanvas, sX, sY, oW, oH, dX, dY, stepW, stepH); - sX = dX; - sY = dY; - dY += stepH; - } - return ctx.getImageData(sX, sY, dW, dH); - }, - - /** - * Filter lanczosResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - lanczosResize: function(options, oW, oH, dW, dH) { - - function process(u) { - var v, i, weight, idx, a, red, green, - blue, alpha, fX, fY; - center.x = (u + 0.5) * ratioX; - icenter.x = floor(center.x); - for (v = 0; v < dH; v++) { - center.y = (v + 0.5) * ratioY; - icenter.y = floor(center.y); - a = 0; red = 0; green = 0; blue = 0; alpha = 0; - for (i = icenter.x - range2X; i <= icenter.x + range2X; i++) { - if (i < 0 || i >= oW) { - continue; - } - fX = floor(1000 * abs(i - center.x)); - if (!cacheLanc[fX]) { - cacheLanc[fX] = { }; - } - for (var j = icenter.y - range2Y; j <= icenter.y + range2Y; j++) { - if (j < 0 || j >= oH) { - continue; - } - fY = floor(1000 * abs(j - center.y)); - if (!cacheLanc[fX][fY]) { - cacheLanc[fX][fY] = lanczos(sqrt(pow(fX * rcpRatioX, 2) + pow(fY * rcpRatioY, 2)) / 1000); - } - weight = cacheLanc[fX][fY]; - if (weight > 0) { - idx = (j * oW + i) * 4; - a += weight; - red += weight * srcData[idx]; - green += weight * srcData[idx + 1]; - blue += weight * srcData[idx + 2]; - alpha += weight * srcData[idx + 3]; - } - } - } - idx = (v * dW + u) * 4; - destData[idx] = red / a; - destData[idx + 1] = green / a; - destData[idx + 2] = blue / a; - destData[idx + 3] = alpha / a; - } - - if (++u < dW) { - return process(u); - } - else { - return destImg; - } - } - - var srcData = options.imageData.data, - destImg = options.ctx.createImageData(dW, dH), - destData = destImg.data, - lanczos = this.lanczosCreate(this.lanczosLobes), - ratioX = this.rcpScaleX, ratioY = this.rcpScaleY, - rcpRatioX = 2 / this.rcpScaleX, rcpRatioY = 2 / this.rcpScaleY, - range2X = ceil(ratioX * this.lanczosLobes / 2), - range2Y = ceil(ratioY * this.lanczosLobes / 2), - cacheLanc = { }, center = { }, icenter = { }; - - return process(0); - }, - - /** - * bilinearFiltering - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - bilinearFiltering: function(options, oW, oH, dW, dH) { - var a, b, c, d, x, y, i, j, xDiff, yDiff, chnl, - color, offset = 0, origPix, ratioX = this.rcpScaleX, - ratioY = this.rcpScaleY, - w4 = 4 * (oW - 1), img = options.imageData, - pixels = img.data, destImage = options.ctx.createImageData(dW, dH), - destPixels = destImage.data; - for (i = 0; i < dH; i++) { - for (j = 0; j < dW; j++) { - x = floor(ratioX * j); - y = floor(ratioY * i); - xDiff = ratioX * j - x; - yDiff = ratioY * i - y; - origPix = 4 * (y * oW + x); - - for (chnl = 0; chnl < 4; chnl++) { - a = pixels[origPix + chnl]; - b = pixels[origPix + 4 + chnl]; - c = pixels[origPix + w4 + chnl]; - d = pixels[origPix + w4 + 4 + chnl]; - color = a * (1 - xDiff) * (1 - yDiff) + b * xDiff * (1 - yDiff) + - c * yDiff * (1 - xDiff) + d * xDiff * yDiff; - destPixels[offset++] = color; - } - } - } - return destImage; - }, - - /** - * hermiteFastResize - * @param {Object} canvasEl Canvas element to apply filter to - * @param {Number} oW Original Width - * @param {Number} oH Original Height - * @param {Number} dW Destination Width - * @param {Number} dH Destination Height - * @returns {ImageData} - */ - hermiteFastResize: function(options, oW, oH, dW, dH) { - var ratioW = this.rcpScaleX, ratioH = this.rcpScaleY, - ratioWHalf = ceil(ratioW / 2), - ratioHHalf = ceil(ratioH / 2), - img = options.imageData, data = img.data, - img2 = options.ctx.createImageData(dW, dH), data2 = img2.data; - for (var j = 0; j < dH; j++) { - for (var i = 0; i < dW; i++) { - var x2 = (i + j * dW) * 4, weight = 0, weights = 0, weightsAlpha = 0, - gxR = 0, gxG = 0, gxB = 0, gxA = 0, centerY = (j + 0.5) * ratioH; - for (var yy = floor(j * ratioH); yy < (j + 1) * ratioH; yy++) { - var dy = abs(centerY - (yy + 0.5)) / ratioHHalf, - centerX = (i + 0.5) * ratioW, w0 = dy * dy; - for (var xx = floor(i * ratioW); xx < (i + 1) * ratioW; xx++) { - var dx = abs(centerX - (xx + 0.5)) / ratioWHalf, - w = sqrt(w0 + dx * dx); - /* eslint-disable max-depth */ - if (w > 1 && w < -1) { - continue; - } - //hermite filter - weight = 2 * w * w * w - 3 * w * w + 1; - if (weight > 0) { - dx = 4 * (xx + yy * oW); - //alpha - gxA += weight * data[dx + 3]; - weightsAlpha += weight; - //colors - if (data[dx + 3] < 255) { - weight = weight * data[dx + 3] / 250; - } - gxR += weight * data[dx]; - gxG += weight * data[dx + 1]; - gxB += weight * data[dx + 2]; - weights += weight; - } - /* eslint-enable max-depth */ - } - } - data2[x2] = gxR / weights; - data2[x2 + 1] = gxG / weights; - data2[x2 + 2] = gxB / weights; - data2[x2 + 3] = gxA / weightsAlpha; - } - } - return img2; - }, - - /** - * Returns object representation of an instance - * @return {Object} Object representation of an instance - */ - toObject: function() { - return { - type: this.type, - scaleX: this.scaleX, - scaleY: this.scaleY, - resizeType: this.resizeType, - lanczosLobes: this.lanczosLobes - }; - } - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Resize} Instance of fabric.Image.filters.Resize - */ - fabric.Image.filters.Resize.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Contrast filter class - * @class fabric.Image.filters.Contrast - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Contrast#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Contrast({ - * contrast: 0.25 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Contrast = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Contrast.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Contrast', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uContrast;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float contrastF = 1.015 * (uContrast + 1.0) / (1.0 * (1.015 - uContrast));\n' + - 'color.rgb = contrastF * (color.rgb - 0.5) + 0.5;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * contrast value, range from -1 to 1. - * @param {Number} contrast - * @default 0 - */ - contrast: 0, - - mainParameter: 'contrast', - - /** - * Constructor - * @memberOf fabric.Image.filters.Contrast.prototype - * @param {Object} [options] Options object - * @param {Number} [options.contrast=0] Value to contrast the image up (-1...1) - */ - - /** - * Apply the Contrast operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - if (this.contrast === 0) { - return; - } - var imageData = options.imageData, i, len, - data = imageData.data, len = data.length, - contrast = Math.floor(this.contrast * 255), - contrastF = 259 * (contrast + 255) / (255 * (259 - contrast)); - - for (i = 0; i < len; i += 4) { - data[i] = contrastF * (data[i] - 128) + 128; - data[i + 1] = contrastF * (data[i + 1] - 128) + 128; - data[i + 2] = contrastF * (data[i + 2] - 128) + 128; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uContrast: gl.getUniformLocation(program, 'uContrast'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uContrast, this.contrast); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Contrast} Instance of fabric.Image.filters.Contrast - */ - fabric.Image.filters.Contrast.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Saturate filter class - * @class fabric.Image.filters.Saturation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Saturation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Saturation({ - * saturation: 1 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Saturation = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Saturation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Saturation', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uSaturation;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float rgMax = max(color.r, color.g);\n' + - 'float rgbMax = max(rgMax, color.b);\n' + - 'color.r += rgbMax != color.r ? (rgbMax - color.r) * uSaturation : 0.00;\n' + - 'color.g += rgbMax != color.g ? (rgbMax - color.g) * uSaturation : 0.00;\n' + - 'color.b += rgbMax != color.b ? (rgbMax - color.b) * uSaturation : 0.00;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Saturation value, from -1 to 1. - * Increases/decreases the color saturation. - * A value of 0 has no effect. - * - * @param {Number} saturation - * @default - */ - saturation: 0, - - mainParameter: 'saturation', - - /** - * Constructor - * @memberOf fabric.Image.filters.Saturate.prototype - * @param {Object} [options] Options object - * @param {Number} [options.saturate=0] Value to saturate the image (-1...1) - */ - - /** - * Apply the Saturation operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.saturation === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, len = data.length, - adjust = -this.saturation, i, max; - - for (i = 0; i < len; i += 4) { - max = Math.max(data[i], data[i + 1], data[i + 2]); - data[i] += max !== data[i] ? (max - data[i]) * adjust : 0; - data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * adjust : 0; - data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * adjust : 0; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uSaturation: gl.getUniformLocation(program, 'uSaturation'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uSaturation, -this.saturation); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Saturation} Instance of fabric.Image.filters.Saturate - */ - fabric.Image.filters.Saturation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Vibrance filter class - * @class fabric.Image.filters.Vibrance - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Vibrance#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Vibrance({ - * vibrance: 1 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Vibrance = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Vibrance.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Vibrance', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform float uVibrance;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'float max = max(color.r, max(color.g, color.b));\n' + - 'float avg = (color.r + color.g + color.b) / 3.0;\n' + - 'float amt = (abs(max - avg) * 2.0) * uVibrance;\n' + - 'color.r += max != color.r ? (max - color.r) * amt : 0.00;\n' + - 'color.g += max != color.g ? (max - color.g) * amt : 0.00;\n' + - 'color.b += max != color.b ? (max - color.b) * amt : 0.00;\n' + - 'gl_FragColor = color;\n' + - '}', - - /** - * Vibrance value, from -1 to 1. - * Increases/decreases the saturation of more muted colors with less effect on saturated colors. - * A value of 0 has no effect. - * - * @param {Number} vibrance - * @default - */ - vibrance: 0, - - mainParameter: 'vibrance', - - /** - * Constructor - * @memberOf fabric.Image.filters.Vibrance.prototype - * @param {Object} [options] Options object - * @param {Number} [options.vibrance=0] Vibrance value for the image (between -1 and 1) - */ - - /** - * Apply the Vibrance operation to a Uint8ClampedArray representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8ClampedArray to be filtered. - */ - applyTo2d: function(options) { - if (this.vibrance === 0) { - return; - } - var imageData = options.imageData, - data = imageData.data, len = data.length, - adjust = -this.vibrance, i, max, avg, amt; - - for (i = 0; i < len; i += 4) { - max = Math.max(data[i], data[i + 1], data[i + 2]); - avg = (data[i] + data[i + 1] + data[i + 2]) / 3; - amt = ((Math.abs(max - avg) * 2 / 255) * adjust); - data[i] += max !== data[i] ? (max - data[i]) * amt : 0; - data[i + 1] += max !== data[i + 1] ? (max - data[i + 1]) * amt : 0; - data[i + 2] += max !== data[i + 2] ? (max - data[i + 2]) * amt : 0; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uVibrance: gl.getUniformLocation(program, 'uVibrance'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform1f(uniformLocations.uVibrance, -this.vibrance); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {Function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Vibrance} Instance of fabric.Image.filters.Vibrance - */ - fabric.Image.filters.Vibrance.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Blur filter class - * @class fabric.Image.filters.Blur - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Blur#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Blur({ - * blur: 0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - * canvas.renderAll(); - */ - filters.Blur = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Blur.prototype */ { - - type: 'Blur', - - /* -'gl_FragColor = vec4(0.0);', -'gl_FragColor += texture2D(texture, vTexCoord + -7 * uDelta)*0.0044299121055113265;', -'gl_FragColor += texture2D(texture, vTexCoord + -6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + -5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + -4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + -3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + -2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + -1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord )*0.159576912161;', -'gl_FragColor += texture2D(texture, vTexCoord + 1 * uDelta)*0.147308056121;', -'gl_FragColor += texture2D(texture, vTexCoord + 2 * uDelta)*0.115876621105;', -'gl_FragColor += texture2D(texture, vTexCoord + 3 * uDelta)*0.0776744219933;', -'gl_FragColor += texture2D(texture, vTexCoord + 4 * uDelta)*0.0443683338718;', -'gl_FragColor += texture2D(texture, vTexCoord + 5 * uDelta)*0.0215963866053;', -'gl_FragColor += texture2D(texture, vTexCoord + 6 * uDelta)*0.00895781211794;', -'gl_FragColor += texture2D(texture, vTexCoord + 7 * uDelta)*0.0044299121055113265;', -*/ - - /* eslint-disable max-len */ - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec2 uDelta;\n' + - 'varying vec2 vTexCoord;\n' + - 'const float nSamples = 15.0;\n' + - 'vec3 v3offset = vec3(12.9898, 78.233, 151.7182);\n' + - 'float random(vec3 scale) {\n' + - /* use the fragment position for a different seed per-pixel */ - 'return fract(sin(dot(gl_FragCoord.xyz, scale)) * 43758.5453);\n' + - '}\n' + - 'void main() {\n' + - 'vec4 color = vec4(0.0);\n' + - 'float total = 0.0;\n' + - 'float offset = random(v3offset);\n' + - 'for (float t = -nSamples; t <= nSamples; t++) {\n' + - 'float percent = (t + offset - 0.5) / nSamples;\n' + - 'float weight = 1.0 - abs(percent);\n' + - 'color += texture2D(uTexture, vTexCoord + uDelta * percent) * weight;\n' + - 'total += weight;\n' + - '}\n' + - 'gl_FragColor = color / total;\n' + - '}', - /* eslint-enable max-len */ - - /** - * blur value, in percentage of image dimensions. - * specific to keep the image blur constant at different resolutions - * range between 0 and 1. - * @type Number - * @default - */ - blur: 0, - - mainParameter: 'blur', - - applyTo: function(options) { - if (options.webgl) { - // this aspectRatio is used to give the same blur to vertical and horizontal - this.aspectRatio = options.sourceWidth / options.sourceHeight; - options.passes++; - this._setupFrameBuffer(options); - this.horizontal = true; - this.applyToWebGL(options); - this._swapTextures(options); - this._setupFrameBuffer(options); - this.horizontal = false; - this.applyToWebGL(options); - this._swapTextures(options); - } - else { - this.applyTo2d(options); - } - }, - - applyTo2d: function(options) { - // paint canvasEl with current image data. - //options.ctx.putImageData(options.imageData, 0, 0); - options.imageData = this.simpleBlur(options); - }, - - simpleBlur: function(options) { - var resources = options.filterBackend.resources, canvas1, canvas2, - width = options.imageData.width, - height = options.imageData.height; - - if (!resources.blurLayer1) { - resources.blurLayer1 = fabric.util.createCanvasElement(); - resources.blurLayer2 = fabric.util.createCanvasElement(); - } - canvas1 = resources.blurLayer1; - canvas2 = resources.blurLayer2; - if (canvas1.width !== width || canvas1.height !== height) { - canvas2.width = canvas1.width = width; - canvas2.height = canvas1.height = height; - } - var ctx1 = canvas1.getContext('2d'), - ctx2 = canvas2.getContext('2d'), - nSamples = 15, - random, percent, j, i, - blur = this.blur * 0.06 * 0.5; - - // load first canvas - ctx1.putImageData(options.imageData, 0, 0); - ctx2.clearRect(0, 0, width, height); - - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * width + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, j, random); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - for (i = -nSamples; i <= nSamples; i++) { - random = (Math.random() - 0.5) / 4; - percent = i / nSamples; - j = blur * percent * height + random; - ctx2.globalAlpha = 1 - Math.abs(percent); - ctx2.drawImage(canvas1, random, j); - ctx1.drawImage(canvas2, 0, 0); - ctx2.globalAlpha = 1; - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - } - options.ctx.drawImage(canvas1, 0, 0); - var newImageData = options.ctx.getImageData(0, 0, canvas1.width, canvas1.height); - ctx1.globalAlpha = 1; - ctx1.clearRect(0, 0, canvas1.width, canvas1.height); - return newImageData; - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - delta: gl.getUniformLocation(program, 'uDelta'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - var delta = this.chooseRightDelta(); - gl.uniform2fv(uniformLocations.delta, delta); - }, - - /** - * choose right value of image percentage to blur with - * @returns {Array} a numeric array with delta values - */ - chooseRightDelta: function() { - var blurScale = 1, delta = [0, 0], blur; - if (this.horizontal) { - if (this.aspectRatio > 1) { - // image is wide, i want to shrink radius horizontal - blurScale = 1 / this.aspectRatio; - } - } - else { - if (this.aspectRatio < 1) { - // image is tall, i want to shrink radius vertical - blurScale = this.aspectRatio; - } - } - blur = blurScale * this.blur * 0.12; - if (this.horizontal) { - delta[0] = blur; - } - else { - delta[1] = blur; - } - return delta; - }, - }); - - /** - * Deserialize a JSON definition of a BlurFilter into a concrete instance. - */ - filters.Blur.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * Gamma filter class - * @class fabric.Image.filters.Gamma - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.Gamma#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.Gamma({ - * gamma: [1, 0.5, 2.1] - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.Gamma = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Gamma.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'Gamma', - - fragmentSource: 'precision highp float;\n' + - 'uniform sampler2D uTexture;\n' + - 'uniform vec3 uGamma;\n' + - 'varying vec2 vTexCoord;\n' + - 'void main() {\n' + - 'vec4 color = texture2D(uTexture, vTexCoord);\n' + - 'vec3 correction = (1.0 / uGamma);\n' + - 'color.r = pow(color.r, correction.r);\n' + - 'color.g = pow(color.g, correction.g);\n' + - 'color.b = pow(color.b, correction.b);\n' + - 'gl_FragColor = color;\n' + - 'gl_FragColor.rgb *= color.a;\n' + - '}', - - /** - * Gamma array value, from 0.01 to 2.2. - * @param {Array} gamma - * @default - */ - gamma: [1, 1, 1], - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'gamma', - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.gamma = [1, 1, 1]; - filters.BaseFilter.prototype.initialize.call(this, options); - }, - - /** - * Apply the Gamma operation to a Uint8Array representing the pixels of an image. - * - * @param {Object} options - * @param {ImageData} options.imageData The Uint8Array to be filtered. - */ - applyTo2d: function(options) { - var imageData = options.imageData, data = imageData.data, - gamma = this.gamma, len = data.length, - rInv = 1 / gamma[0], gInv = 1 / gamma[1], - bInv = 1 / gamma[2], i; - - if (!this.rVals) { - // eslint-disable-next-line - this.rVals = new Uint8Array(256); - // eslint-disable-next-line - this.gVals = new Uint8Array(256); - // eslint-disable-next-line - this.bVals = new Uint8Array(256); - } - - // This is an optimization - pre-compute a look-up table for each color channel - // instead of performing these pow calls for each pixel in the image. - for (i = 0, len = 256; i < len; i++) { - this.rVals[i] = Math.pow(i / 255, rInv) * 255; - this.gVals[i] = Math.pow(i / 255, gInv) * 255; - this.bVals[i] = Math.pow(i / 255, bInv) * 255; - } - for (i = 0, len = data.length; i < len; i += 4) { - data[i] = this.rVals[data[i]]; - data[i + 1] = this.gVals[data[i + 1]]; - data[i + 2] = this.bVals[data[i + 2]]; - } - }, - - /** - * Return WebGL uniform locations for this filter's shader. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {WebGLShaderProgram} program This filter's compiled shader program. - */ - getUniformLocations: function(gl, program) { - return { - uGamma: gl.getUniformLocation(program, 'uGamma'), - }; - }, - - /** - * Send data from this filter to its shader program's uniforms. - * - * @param {WebGLRenderingContext} gl The GL canvas context used to compile this filter's shader. - * @param {Object} uniformLocations A map of string uniform names to WebGLUniformLocation objects - */ - sendUniformData: function(gl, uniformLocations) { - gl.uniform3fv(uniformLocations.uGamma, this.gamma); - }, - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.Gamma} Instance of fabric.Image.filters.Gamma - */ - fabric.Image.filters.Gamma.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * A container class that knows how to apply a sequence of filters to an input image. - */ - filters.Composed = createClass(filters.BaseFilter, /** @lends fabric.Image.filters.Composed.prototype */ { - - type: 'Composed', - - /** - * A non sparse array of filters to apply - */ - subFilters: [], - - /** - * Constructor - * @param {Object} [options] Options object - */ - initialize: function(options) { - this.callSuper('initialize', options); - // create a new array instead mutating the prototype with push - this.subFilters = this.subFilters.slice(0); - }, - - /** - * Apply this container's filters to the input image provided. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be applied. - */ - applyTo: function(options) { - options.passes += this.subFilters.length - 1; - this.subFilters.forEach(function(filter) { - filter.applyTo(options); - }); - }, - - /** - * Serialize this filter into JSON. - * - * @returns {Object} A JSON representation of this filter. - */ - toObject: function() { - return fabric.util.object.extend(this.callSuper('toObject'), { - subFilters: this.subFilters.map(function(filter) { return filter.toObject(); }), - }); - }, - - isNeutralState: function() { - return !this.subFilters.some(function(filter) { return !filter.isNeutralState(); }); - } - }); - - /** - * Deserialize a JSON definition of a ComposedFilter into a concrete instance. - */ - fabric.Image.filters.Composed.fromObject = function(object, callback) { - var filters = object.subFilters || [], - subFilters = filters.map(function(filter) { - return new fabric.Image.filters[filter.type](filter); - }), - instance = new fabric.Image.filters.Composed({ subFilters: subFilters }); - callback && callback(instance); - return instance; - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - filters = fabric.Image.filters, - createClass = fabric.util.createClass; - - /** - * HueRotation filter class - * @class fabric.Image.filters.HueRotation - * @memberOf fabric.Image.filters - * @extends fabric.Image.filters.BaseFilter - * @see {@link fabric.Image.filters.HueRotation#initialize} for constructor definition - * @see {@link http://fabricjs.com/image-filters|ImageFilters demo} - * @example - * var filter = new fabric.Image.filters.HueRotation({ - * rotation: -0.5 - * }); - * object.filters.push(filter); - * object.applyFilters(); - */ - filters.HueRotation = createClass(filters.ColorMatrix, /** @lends fabric.Image.filters.HueRotation.prototype */ { - - /** - * Filter type - * @param {String} type - * @default - */ - type: 'HueRotation', - - /** - * HueRotation value, from -1 to 1. - * the unit is radians - * @param {Number} myParameter - * @default - */ - rotation: 0, - - /** - * Describe the property that is the filter parameter - * @param {String} m - * @default - */ - mainParameter: 'rotation', - - calculateMatrix: function() { - var rad = this.rotation * Math.PI, cos = fabric.util.cos(rad), sin = fabric.util.sin(rad), - aThird = 1 / 3, aThirdSqtSin = Math.sqrt(aThird) * sin, OneMinusCos = 1 - cos; - this.matrix = [ - 1, 0, 0, 0, 0, - 0, 1, 0, 0, 0, - 0, 0, 1, 0, 0, - 0, 0, 0, 1, 0 - ]; - this.matrix[0] = cos + OneMinusCos / 3; - this.matrix[1] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[2] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[5] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[6] = cos + aThird * OneMinusCos; - this.matrix[7] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[10] = aThird * OneMinusCos - aThirdSqtSin; - this.matrix[11] = aThird * OneMinusCos + aThirdSqtSin; - this.matrix[12] = cos + aThird * OneMinusCos; - }, - - /** - * HueRotation isNeutralState implementation - * Used only in image applyFilters to discard filters that will not have an effect - * on the image - * @param {Object} options - **/ - isNeutralState: function(options) { - this.calculateMatrix(); - return filters.BaseFilter.prototype.isNeutralState.call(this, options); - }, - - /** - * Apply this filter to the input image data provided. - * - * Determines whether to use WebGL or Canvas2D based on the options.webgl flag. - * - * @param {Object} options - * @param {Number} options.passes The number of filters remaining to be executed - * @param {Boolean} options.webgl Whether to use webgl to render the filter. - * @param {WebGLTexture} options.sourceTexture The texture setup as the source to be filtered. - * @param {WebGLTexture} options.targetTexture The texture where filtered output should be drawn. - * @param {WebGLRenderingContext} options.context The GL context used for rendering. - * @param {Object} options.programCache A map of compiled shader programs, keyed by filter type. - */ - applyTo: function(options) { - this.calculateMatrix(); - filters.BaseFilter.prototype.applyTo.call(this, options); - }, - - }); - - /** - * Returns filter instance from an object representation - * @static - * @param {Object} object Object to create an instance from - * @param {function} [callback] to be invoked after filter creation - * @return {fabric.Image.filters.HueRotation} Instance of fabric.Image.filters.HueRotation - */ - fabric.Image.filters.HueRotation.fromObject = fabric.Image.filters.BaseFilter.fromObject; - -})(typeof exports !== 'undefined' ? exports : this); - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = { }), - clone = fabric.util.object.clone; - - if (fabric.Text) { - fabric.warn('fabric.Text is already defined'); - return; - } - - var additionalProps = - ('fontFamily fontWeight fontSize text underline overline linethrough' + - ' textAlign fontStyle lineHeight textBackgroundColor charSpacing styles' + - ' direction path pathStartOffset pathSide pathAlign').split(' '); - - /** - * Text class - * @class fabric.Text - * @extends fabric.Object - * @return {fabric.Text} thisArg - * @tutorial {@link http://fabricjs.com/fabric-intro-part-2#text} - * @see {@link fabric.Text#initialize} for constructor definition - */ - fabric.Text = fabric.util.createClass(fabric.Object, /** @lends fabric.Text.prototype */ { - - /** - * Properties which when set cause object to change dimensions - * @type Array - * @private - */ - _dimensionAffectingProps: [ - 'fontSize', - 'fontWeight', - 'fontFamily', - 'fontStyle', - 'lineHeight', - 'text', - 'charSpacing', - 'textAlign', - 'styles', - 'path', - 'pathStartOffset', - 'pathSide', - 'pathAlign' - ], - - /** - * @private - */ - _reNewline: /\r?\n/, - - /** - * Use this regular expression to filter for whitespaces that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpacesAndTabs: /[ \t\r]/g, - - /** - * Use this regular expression to filter for whitespace that is not a new line. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reSpaceAndTab: /[ \t\r]/, - - /** - * Use this regular expression to filter consecutive groups of non spaces. - * Mostly used when text is 'justify' aligned. - * @private - */ - _reWords: /\S+/g, - - /** - * Type of an object - * @type String - * @default - */ - type: 'text', - - /** - * Font size (in pixels) - * @type Number - * @default - */ - fontSize: 40, - - /** - * Font weight (e.g. bold, normal, 400, 600, 800) - * @type {(Number|String)} - * @default - */ - fontWeight: 'normal', - - /** - * Font family - * @type String - * @default - */ - fontFamily: 'Times New Roman', - - /** - * Text decoration underline. - * @type Boolean - * @default - */ - underline: false, - - /** - * Text decoration overline. - * @type Boolean - * @default - */ - overline: false, - - /** - * Text decoration linethrough. - * @type Boolean - * @default - */ - linethrough: false, - - /** - * Text alignment. Possible values: "left", "center", "right", "justify", - * "justify-left", "justify-center" or "justify-right". - * @type String - * @default - */ - textAlign: 'left', - - /** - * Font style . Possible values: "", "normal", "italic" or "oblique". - * @type String - * @default - */ - fontStyle: 'normal', - - /** - * Line height - * @type Number - * @default - */ - lineHeight: 1.16, - - /** - * Superscript schema object (minimum overlap) - * @type {Object} - * @default - */ - superscript: { - size: 0.60, // fontSize factor - baseline: -0.35 // baseline-shift factor (upwards) - }, - - /** - * Subscript schema object (minimum overlap) - * @type {Object} - * @default - */ - subscript: { - size: 0.60, // fontSize factor - baseline: 0.11 // baseline-shift factor (downwards) - }, - - /** - * Background color of text lines - * @type String - * @default - */ - textBackgroundColor: '', - - /** - * List of properties to consider when checking if - * state of an object is changed ({@link fabric.Object#hasStateChanged}) - * as well as for history (undo/redo) purposes - * @type Array - */ - stateProperties: fabric.Object.prototype.stateProperties.concat(additionalProps), - - /** - * List of properties to consider when checking if cache needs refresh - * @type Array - */ - cacheProperties: fabric.Object.prototype.cacheProperties.concat(additionalProps), - - /** - * When defined, an object is rendered via stroke and this property specifies its color. - * Backwards incompatibility note: This property was named "strokeStyle" until v1.1.6 - * @type String - * @default - */ - stroke: null, - - /** - * Shadow object representing shadow of this shape. - * Backwards incompatibility note: This property was named "textShadow" (String) until v1.2.11 - * @type fabric.Shadow - * @default - */ - shadow: null, - - /** - * fabric.Path that the text should follow. - * since 4.6.0 the path will be drawn automatically. - * if you want to make the path visible, give it a stroke and strokeWidth or fill value - * if you want it to be hidden, assign visible = false to the path. - * This feature is in BETA, and SVG import/export is not yet supported. - * @type fabric.Path - * @example - * var textPath = new fabric.Text('Text on a path', { - * top: 150, - * left: 150, - * textAlign: 'center', - * charSpacing: -50, - * path: new fabric.Path('M 0 0 C 50 -100 150 -100 200 0', { - * strokeWidth: 1, - * visible: false - * }), - * pathSide: 'left', - * pathStartOffset: 0 - * }); - * @default - */ - path: null, - - /** - * Offset amount for text path starting position - * Only used when text has a path - * @type Number - * @default - */ - pathStartOffset: 0, - - /** - * Which side of the path the text should be drawn on. - * Only used when text has a path - * @type {String} 'left|right' - * @default - */ - pathSide: 'left', - - /** - * How text is aligned to the path. This property determines - * the perpendicular position of each character relative to the path. - * (one of "baseline", "center", "ascender", "descender") - * This feature is in BETA, and its behavior may change - * @type String - * @default - */ - pathAlign: 'baseline', - - /** - * @private - */ - _fontSizeFraction: 0.222, - - /** - * @private - */ - offsets: { - underline: 0.10, - linethrough: -0.315, - overline: -0.88 - }, - - /** - * Text Line proportion to font Size (in pixels) - * @type Number - * @default - */ - _fontSizeMult: 1.13, - - /** - * additional space between characters - * expressed in thousands of em unit - * @type Number - * @default - */ - charSpacing: 0, - - /** - * Object containing character styles - top-level properties -> line numbers, - * 2nd-level properties - character numbers - * @type Object - * @default - */ - styles: null, - - /** - * Reference to a context to measure text char or couple of chars - * the cacheContext of the canvas will be used or a freshly created one if the object is not on canvas - * once created it will be referenced on fabric._measuringContext to avoid creating a canvas for every - * text object created. - * @type {CanvasRenderingContext2D} - * @default - */ - _measuringContext: null, - - /** - * Baseline shift, styles only, keep at 0 for the main text object - * @type {Number} - * @default - */ - deltaY: 0, - - /** - * WARNING: EXPERIMENTAL. NOT SUPPORTED YET - * determine the direction of the text. - * This has to be set manually together with textAlign and originX for proper - * experience. - * some interesting link for the future - * https://www.w3.org/International/questions/qa-bidi-unicode-controls - * @since 4.5.0 - * @type {String} 'ltr|rtl' - * @default - */ - direction: 'ltr', - - /** - * Array of properties that define a style unit (of 'styles'). - * @type {Array} - * @default - */ - _styleProperties: [ - 'stroke', - 'strokeWidth', - 'fill', - 'fontFamily', - 'fontSize', - 'fontWeight', - 'fontStyle', - 'underline', - 'overline', - 'linethrough', - 'deltaY', - 'textBackgroundColor', - ], - - /** - * contains characters bounding boxes - */ - __charBounds: [], - - /** - * use this size when measuring text. To avoid IE11 rounding errors - * @type {Number} - * @default - * @readonly - * @private - */ - CACHE_FONT_SIZE: 400, - - /** - * contains the min text width to avoid getting 0 - * @type {Number} - * @default - */ - MIN_TEXT_WIDTH: 2, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - initialize: function(text, options) { - this.styles = options ? (options.styles || { }) : { }; - this.text = text; - this.__skipDimension = true; - this.callSuper('initialize', options); - if (this.path) { - this.setPathInfo(); - } - this.__skipDimension = false; - this.initDimensions(); - this.setCoords(); - this.setupState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * If text has a path, it will add the extra information needed - * for path and text calculations - * @return {fabric.Text} thisArg - */ - setPathInfo: function() { - var path = this.path; - if (path) { - path.segmentsInfo = fabric.util.getPathSegmentsInfo(path.path); - } - }, - - /** - * Return a context for measurement of text string. - * if created it gets stored for reuse - * this is for internal use, please do not use it - * @private - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.Text} thisArg - */ - getMeasuringContext: function() { - // if we did not return we have to measure something. - if (!fabric._measuringContext) { - fabric._measuringContext = this.canvas && this.canvas.contextCache || - fabric.util.createCanvasElement().getContext('2d'); - } - return fabric._measuringContext; - }, - - /** - * @private - * Divides text into lines of text and lines of graphemes. - */ - _splitText: function() { - var newLines = this._splitTextIntoLines(this.text); - this.textLines = newLines.lines; - this._textLines = newLines.graphemeLines; - this._unwrappedTextLines = newLines._unwrappedLines; - this._text = newLines.graphemeText; - return newLines; - }, - - /** - * Initialize or update text dimensions. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this._splitText(); - this._clearCache(); - if (this.path) { - this.width = this.path.width; - this.height = this.path.height; - } - else { - this.width = this.calcTextWidth() || this.cursorWidth || this.MIN_TEXT_WIDTH; - this.height = this.calcTextHeight(); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Enlarge space boxes and shift the others - */ - enlargeSpaces: function() { - var diffSpace, currentLineWidth, numberOfSpaces, accumulatedSpace, line, charBound, spaces; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (this.textAlign !== 'justify' && (i === len - 1 || this.isEndOfWrapping(i))) { - continue; - } - accumulatedSpace = 0; - line = this._textLines[i]; - currentLineWidth = this.getLineWidth(i); - if (currentLineWidth < this.width && (spaces = this.textLines[i].match(this._reSpacesAndTabs))) { - numberOfSpaces = spaces.length; - diffSpace = (this.width - currentLineWidth) / numberOfSpaces; - for (var j = 0, jlen = line.length; j <= jlen; j++) { - charBound = this.__charBounds[i][j]; - if (this._reSpaceAndTab.test(line[j])) { - charBound.width += diffSpace; - charBound.kernedWidth += diffSpace; - charBound.left += accumulatedSpace; - accumulatedSpace += diffSpace; - } - else { - charBound.left += accumulatedSpace; - } - } - } - } - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - return lineIndex === this._textLines.length - 1; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * It return always for text and Itext. - * @return Number - */ - missingNewlineOffset: function() { - return 1; - }, - - /** - * Returns string representation of an instance - * @return {String} String representation of text object - */ - toString: function() { - return '#'; - }, - - /** - * Return the dimension and the zoom level needed to create a cache canvas - * big enough to host the object to be cached. - * @private - * @param {Object} dim.x width of object to be cached - * @param {Object} dim.y height of object to be cached - * @return {Object}.width width of canvas - * @return {Object}.height height of canvas - * @return {Object}.zoomX zoomX zoom value to unscale the canvas before drawing cache - * @return {Object}.zoomY zoomY zoom value to unscale the canvas before drawing cache - */ - _getCacheCanvasDimensions: function() { - var dims = this.callSuper('_getCacheCanvasDimensions'); - var fontSize = this.fontSize; - dims.width += fontSize * dims.zoomX; - dims.height += fontSize * dims.zoomY; - return dims; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - var path = this.path; - path && !path.isNotVisible() && path._render(ctx); - this._setTextStyles(ctx); - this._renderTextLinesBackground(ctx); - this._renderTextDecoration(ctx, 'underline'); - this._renderText(ctx); - this._renderTextDecoration(ctx, 'overline'); - this._renderTextDecoration(ctx, 'linethrough'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderText: function(ctx) { - if (this.paintFirst === 'stroke') { - this._renderTextStroke(ctx); - this._renderTextFill(ctx); - } - else { - this._renderTextFill(ctx); - this._renderTextStroke(ctx); - } - }, - - /** - * Set the font parameter of the context with the object properties or with charStyle - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Object} [charStyle] object with font style properties - * @param {String} [charStyle.fontFamily] Font Family - * @param {Number} [charStyle.fontSize] Font size in pixels. ( without px suffix ) - * @param {String} [charStyle.fontWeight] Font weight - * @param {String} [charStyle.fontStyle] Font style (italic|normal) - */ - _setTextStyles: function(ctx, charStyle, forMeasuring) { - ctx.textBaseline = 'alphabetical'; - if (this.path) { - switch (this.pathAlign) { - case 'center': - ctx.textBaseline = 'middle'; - break; - case 'ascender': - ctx.textBaseline = 'top'; - break; - case 'descender': - ctx.textBaseline = 'bottom'; - break; - } - } - ctx.font = this._getFontDeclaration(charStyle, forMeasuring); - }, - - /** - * calculate and return the text Width measuring each line. - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @return {Number} Maximum width of fabric.Text object - */ - calcTextWidth: function() { - var maxWidth = this.getLineWidth(0); - - for (var i = 1, len = this._textLines.length; i < len; i++) { - var currentLineWidth = this.getLineWidth(i); - if (currentLineWidth > maxWidth) { - maxWidth = currentLineWidth; - } - } - return maxWidth; - }, - - /** - * @private - * @param {String} method Method name ("fillText" or "strokeText") - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} line Text to render - * @param {Number} left Left position of text - * @param {Number} top Top position of text - * @param {Number} lineIndex Index of a line in a text - */ - _renderTextLine: function(method, ctx, line, left, top, lineIndex) { - this._renderChars(method, ctx, line, left, top, lineIndex); - }, - - /** - * Renders the text background for lines, taking care of style - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextLinesBackground: function(ctx) { - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor')) { - return; - } - var heightOfLine, - lineLeftOffset, originalFill = ctx.fillStyle, - line, lastColor, - leftOffset = this._getLeftOffset(), - lineTopOffset = this._getTopOffset(), - boxStart = 0, boxWidth = 0, charBox, currentColor, path = this.path, - drawStart; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this.textBackgroundColor && !this.styleHas('textBackgroundColor', i)) { - lineTopOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - lineLeftOffset = this._getLineLeftOffset(i); - boxWidth = 0; - boxStart = 0; - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillStyle = currentColor; - currentColor && ctx.fillRect( - -charBox.width / 2, - -heightOfLine / this.lineHeight * (1 - this._fontSizeFraction), - charBox.width, - heightOfLine / this.lineHeight - ); - ctx.restore(); - } - else if (currentColor !== lastColor) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = lastColor; - lastColor && ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - if (currentColor && !path) { - drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentColor; - ctx.fillRect( - drawStart, - lineTopOffset, - boxWidth, - heightOfLine / this.lineHeight - ); - } - lineTopOffset += heightOfLine; - } - ctx.fillStyle = originalFill; - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * @private - * @param {Object} decl style declaration for cache - * @param {String} decl.fontFamily fontFamily - * @param {String} decl.fontStyle fontStyle - * @param {String} decl.fontWeight fontWeight - * @return {Object} reference to cache - */ - getFontCache: function(decl) { - var fontFamily = decl.fontFamily.toLowerCase(); - if (!fabric.charWidthsCache[fontFamily]) { - fabric.charWidthsCache[fontFamily] = { }; - } - var cache = fabric.charWidthsCache[fontFamily], - cacheProp = decl.fontStyle.toLowerCase() + '_' + (decl.fontWeight + '').toLowerCase(); - if (!cache[cacheProp]) { - cache[cacheProp] = { }; - } - return cache[cacheProp]; - }, - - /** - * measure and return the width of a single character. - * possibly overridden to accommodate different measure logic or - * to hook some external lib for character measurement - * @private - * @param {String} _char, char to be measured - * @param {Object} charStyle style of char to be measured - * @param {String} [previousChar] previous char - * @param {Object} [prevCharStyle] style of previous char - */ - _measureChar: function(_char, charStyle, previousChar, prevCharStyle) { - // first i try to return from cache - var fontCache = this.getFontCache(charStyle), fontDeclaration = this._getFontDeclaration(charStyle), - previousFontDeclaration = this._getFontDeclaration(prevCharStyle), couple = previousChar + _char, - stylesAreEqual = fontDeclaration === previousFontDeclaration, width, coupleWidth, previousWidth, - fontMultiplier = charStyle.fontSize / this.CACHE_FONT_SIZE, kernedWidth; - - if (previousChar && fontCache[previousChar] !== undefined) { - previousWidth = fontCache[previousChar]; - } - if (fontCache[_char] !== undefined) { - kernedWidth = width = fontCache[_char]; - } - if (stylesAreEqual && fontCache[couple] !== undefined) { - coupleWidth = fontCache[couple]; - kernedWidth = coupleWidth - previousWidth; - } - if (width === undefined || previousWidth === undefined || coupleWidth === undefined) { - var ctx = this.getMeasuringContext(); - // send a TRUE to specify measuring font size CACHE_FONT_SIZE - this._setTextStyles(ctx, charStyle, true); - } - if (width === undefined) { - kernedWidth = width = ctx.measureText(_char).width; - fontCache[_char] = width; - } - if (previousWidth === undefined && stylesAreEqual && previousChar) { - previousWidth = ctx.measureText(previousChar).width; - fontCache[previousChar] = previousWidth; - } - if (stylesAreEqual && coupleWidth === undefined) { - // we can measure the kerning couple and subtract the width of the previous character - coupleWidth = ctx.measureText(couple).width; - fontCache[couple] = coupleWidth; - kernedWidth = coupleWidth - previousWidth; - } - return { width: width * fontMultiplier, kernedWidth: kernedWidth * fontMultiplier }; - }, - - /** - * Computes height of character at given position - * @param {Number} line the line index number - * @param {Number} _char the character index number - * @return {Number} fontSize of the character - */ - getHeightOfChar: function(line, _char) { - return this.getValueOfPropertyAt(line, _char, 'fontSize'); - }, - - /** - * measure a text line measuring all characters. - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - measureLine: function(lineIndex) { - var lineInfo = this._measureLine(lineIndex); - if (this.charSpacing !== 0) { - lineInfo.width -= this._getWidthOfCharSpacing(); - } - if (lineInfo.width < 0) { - lineInfo.width = 0; - } - return lineInfo; - }, - - /** - * measure every grapheme of a line, populating __charBounds - * @param {Number} lineIndex - * @return {Object} object.width total width of characters - * @return {Object} object.widthOfSpaces length of chars that match this._reSpacesAndTabs - */ - _measureLine: function(lineIndex) { - var width = 0, i, grapheme, line = this._textLines[lineIndex], prevGrapheme, - graphemeInfo, numOfSpaces = 0, lineBounds = new Array(line.length), - positionInPath = 0, startingPoint, totalPathLength, path = this.path, - reverse = this.pathSide === 'right'; - - this.__charBounds[lineIndex] = lineBounds; - for (i = 0; i < line.length; i++) { - grapheme = line[i]; - graphemeInfo = this._getGraphemeBox(grapheme, lineIndex, i, prevGrapheme); - lineBounds[i] = graphemeInfo; - width += graphemeInfo.kernedWidth; - prevGrapheme = grapheme; - } - // this latest bound box represent the last character of the line - // to simplify cursor handling in interactive mode. - lineBounds[i] = { - left: graphemeInfo ? graphemeInfo.left + graphemeInfo.width : 0, - width: 0, - kernedWidth: 0, - height: this.fontSize - }; - if (path) { - totalPathLength = path.segmentsInfo[path.segmentsInfo.length - 1].length; - startingPoint = fabric.util.getPointOnPath(path.path, 0, path.segmentsInfo); - startingPoint.x += path.pathOffset.x; - startingPoint.y += path.pathOffset.y; - switch (this.textAlign) { - case 'left': - positionInPath = reverse ? (totalPathLength - width) : 0; - break; - case 'center': - positionInPath = (totalPathLength - width) / 2; - break; - case 'right': - positionInPath = reverse ? 0 : (totalPathLength - width); - break; - //todo - add support for justify - } - positionInPath += this.pathStartOffset * (reverse ? -1 : 1); - for (i = reverse ? line.length - 1 : 0; - reverse ? i >= 0 : i < line.length; - reverse ? i-- : i++) { - graphemeInfo = lineBounds[i]; - if (positionInPath > totalPathLength) { - positionInPath %= totalPathLength; - } - else if (positionInPath < 0) { - positionInPath += totalPathLength; - } - // it would probably much faster to send all the grapheme position for a line - // and calculate path position/angle at once. - this._setGraphemeOnPath(positionInPath, graphemeInfo, startingPoint); - positionInPath += graphemeInfo.kernedWidth; - } - } - return { width: width, numOfSpaces: numOfSpaces }; - }, - - /** - * Calculate the angle and the left,top position of the char that follow a path. - * It appends it to graphemeInfo to be reused later at rendering - * @private - * @param {Number} positionInPath to be measured - * @param {Object} graphemeInfo current grapheme box information - * @param {Object} startingPoint position of the point - */ - _setGraphemeOnPath: function(positionInPath, graphemeInfo, startingPoint) { - var centerPosition = positionInPath + graphemeInfo.kernedWidth / 2, - path = this.path; - - // we are at currentPositionOnPath. we want to know what point on the path is. - var info = fabric.util.getPointOnPath(path.path, centerPosition, path.segmentsInfo); - graphemeInfo.renderLeft = info.x - startingPoint.x; - graphemeInfo.renderTop = info.y - startingPoint.y; - graphemeInfo.angle = info.angle + (this.pathSide === 'right' ? Math.PI : 0); - }, - - /** - * Measure and return the info of a single grapheme. - * needs the the info of previous graphemes already filled - * @private - * @param {String} grapheme to be measured - * @param {Number} lineIndex index of the line where the char is - * @param {Number} charIndex position in the line - * @param {String} [prevGrapheme] character preceding the one to be measured - */ - _getGraphemeBox: function(grapheme, lineIndex, charIndex, prevGrapheme, skipLeft) { - var style = this.getCompleteStyleDeclaration(lineIndex, charIndex), - prevStyle = prevGrapheme ? this.getCompleteStyleDeclaration(lineIndex, charIndex - 1) : { }, - info = this._measureChar(grapheme, style, prevGrapheme, prevStyle), - kernedWidth = info.kernedWidth, - width = info.width, charSpacing; - - if (this.charSpacing !== 0) { - charSpacing = this._getWidthOfCharSpacing(); - width += charSpacing; - kernedWidth += charSpacing; - } - - var box = { - width: width, - left: 0, - height: style.fontSize, - kernedWidth: kernedWidth, - deltaY: style.deltaY, - }; - if (charIndex > 0 && !skipLeft) { - var previousBox = this.__charBounds[lineIndex][charIndex - 1]; - box.left = previousBox.left + previousBox.width + info.kernedWidth - info.width; - } - return box; - }, - - /** - * Calculate height of line at 'lineIndex' - * @param {Number} lineIndex index of line to calculate - * @return {Number} - */ - getHeightOfLine: function(lineIndex) { - if (this.__lineHeights[lineIndex]) { - return this.__lineHeights[lineIndex]; - } - - var line = this._textLines[lineIndex], - // char 0 is measured before the line cycle because it nneds to char - // emptylines - maxHeight = this.getHeightOfChar(lineIndex, 0); - for (var i = 1, len = line.length; i < len; i++) { - maxHeight = Math.max(this.getHeightOfChar(lineIndex, i), maxHeight); - } - - return this.__lineHeights[lineIndex] = maxHeight * this.lineHeight * this._fontSizeMult; - }, - - /** - * Calculate text box height - */ - calcTextHeight: function() { - var lineHeight, height = 0; - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineHeight = this.getHeightOfLine(i); - height += (i === len - 1 ? lineHeight / this.lineHeight : lineHeight); - } - return height; - }, - - /** - * @private - * @return {Number} Left offset - */ - _getLeftOffset: function() { - return this.direction === 'ltr' ? -this.width / 2 : this.width / 2; - }, - - /** - * @private - * @return {Number} Top offset - */ - _getTopOffset: function() { - return -this.height / 2; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {String} method Method name ("fillText" or "strokeText") - */ - _renderTextCommon: function(ctx, method) { - ctx.save(); - var lineHeights = 0, left = this._getLeftOffset(), top = this._getTopOffset(); - for (var i = 0, len = this._textLines.length; i < len; i++) { - var heightOfLine = this.getHeightOfLine(i), - maxHeight = heightOfLine / this.lineHeight, - leftOffset = this._getLineLeftOffset(i); - this._renderTextLine( - method, - ctx, - this._textLines[i], - left + leftOffset, - top + lineHeights + maxHeight, - i - ); - lineHeights += heightOfLine; - } - ctx.restore(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextFill: function(ctx) { - if (!this.fill && !this.styleHas('fill')) { - return; - } - - this._renderTextCommon(ctx, 'fillText'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextStroke: function(ctx) { - if ((!this.stroke || this.strokeWidth === 0) && this.isEmptyStyles()) { - return; - } - - if (this.shadow && !this.shadow.affectStroke) { - this._removeShadow(ctx); - } - - ctx.save(); - this._setLineDash(ctx, this.strokeDashArray); - ctx.beginPath(); - this._renderTextCommon(ctx, 'strokeText'); - ctx.closePath(); - ctx.restore(); - }, - - /** - * @private - * @param {String} method fillText or strokeText. - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Array} line Content of the line, splitted in an array by grapheme - * @param {Number} left - * @param {Number} top - * @param {Number} lineIndex - */ - _renderChars: function(method, ctx, line, left, top, lineIndex) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, - boxWidth = 0, - timeToRender, - path = this.path, - shortCut = !isJustify && this.charSpacing === 0 && this.isEmptyStyles(lineIndex) && !path, - isLtr = this.direction === 'ltr', sign = this.direction === 'ltr' ? 1 : -1, - drawingLeft, currentDirection = ctx.canvas.getAttribute('dir'); - ctx.save(); - if (currentDirection !== this.direction) { - ctx.canvas.setAttribute('dir', isLtr ? 'ltr' : 'rtl'); - ctx.direction = isLtr ? 'ltr' : 'rtl'; - ctx.textAlign = isLtr ? 'left' : 'right'; - } - top -= lineHeight * this._fontSizeFraction / this.lineHeight; - if (shortCut) { - // render all the line in one pass without checking - // drawingLeft = isLtr ? left : left - this.getLineWidth(lineIndex); - this._renderChar(method, ctx, lineIndex, 0, line.join(''), left, top, lineHeight); - ctx.restore(); - return; - } - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing || path; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - left += sign * (charBox.kernedWidth - charBox.width); - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChanged(actualStyle, nextStyle); - } - if (timeToRender) { - if (path) { - ctx.save(); - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - this._renderChar(method, ctx, lineIndex, i, charsToRender, -boxWidth / 2, 0, lineHeight); - ctx.restore(); - } - else { - drawingLeft = left; - this._renderChar(method, ctx, lineIndex, i, charsToRender, drawingLeft, top, lineHeight); - } - charsToRender = ''; - actualStyle = nextStyle; - left += sign * boxWidth; - boxWidth = 0; - } - } - ctx.restore(); - }, - - /** - * This function try to patch the missing gradientTransform on canvas gradients. - * transforming a context to transform the gradient, is going to transform the stroke too. - * we want to transform the gradient but not the stroke operation, so we create - * a transformed gradient on a pattern and then we use the pattern instead of the gradient. - * this method has drawbacks: is slow, is in low resolution, needs a patch for when the size - * is limited. - * @private - * @param {fabric.Gradient} filler a fabric gradient instance - * @return {CanvasPattern} a pattern to use as fill/stroke style - */ - _applyPatternGradientTransformText: function(filler) { - var pCanvas = fabric.util.createCanvasElement(), pCtx, - // TODO: verify compatibility with strokeUniform - width = this.width + this.strokeWidth, height = this.height + this.strokeWidth; - pCanvas.width = width; - pCanvas.height = height; - pCtx = pCanvas.getContext('2d'); - pCtx.beginPath(); pCtx.moveTo(0, 0); pCtx.lineTo(width, 0); pCtx.lineTo(width, height); - pCtx.lineTo(0, height); pCtx.closePath(); - pCtx.translate(width / 2, height / 2); - pCtx.fillStyle = filler.toLive(pCtx); - this._applyPatternGradientTransform(pCtx, filler); - pCtx.fill(); - return pCtx.createPattern(pCanvas, 'no-repeat'); - }, - - handleFiller: function(ctx, property, filler) { - var offsetX, offsetY; - if (filler.toLive) { - if (filler.gradientUnits === 'percentage' || filler.gradientTransform || filler.patternTransform) { - // need to transform gradient in a pattern. - // this is a slow process. If you are hitting this codepath, and the object - // is not using caching, you should consider switching it on. - // we need a canvas as big as the current object caching canvas. - offsetX = -this.width / 2; - offsetY = -this.height / 2; - ctx.translate(offsetX, offsetY); - ctx[property] = this._applyPatternGradientTransformText(filler); - return { offsetX: offsetX, offsetY: offsetY }; - } - else { - // is a simple gradient or pattern - ctx[property] = filler.toLive(ctx, this); - return this._applyPatternGradientTransform(ctx, filler); - } - } - else { - // is a color - ctx[property] = filler; - } - return { offsetX: 0, offsetY: 0 }; - }, - - _setStrokeStyles: function(ctx, decl) { - ctx.lineWidth = decl.strokeWidth; - ctx.lineCap = this.strokeLineCap; - ctx.lineDashOffset = this.strokeDashOffset; - ctx.lineJoin = this.strokeLineJoin; - ctx.miterLimit = this.strokeMiterLimit; - return this.handleFiller(ctx, 'strokeStyle', decl.stroke); - }, - - _setFillStyles: function(ctx, decl) { - return this.handleFiller(ctx, 'fillStyle', decl.fill); - }, - - /** - * @private - * @param {String} method - * @param {CanvasRenderingContext2D} ctx Context to render on - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {String} _char - * @param {Number} left Left coordinate - * @param {Number} top Top coordinate - * @param {Number} lineHeight Height of the line - */ - _renderChar: function(method, ctx, lineIndex, charIndex, _char, left, top) { - var decl = this._getStyleDeclaration(lineIndex, charIndex), - fullDecl = this.getCompleteStyleDeclaration(lineIndex, charIndex), - shouldFill = method === 'fillText' && fullDecl.fill, - shouldStroke = method === 'strokeText' && fullDecl.stroke && fullDecl.strokeWidth, - fillOffsets, strokeOffsets; - - if (!shouldStroke && !shouldFill) { - return; - } - ctx.save(); - - shouldFill && (fillOffsets = this._setFillStyles(ctx, fullDecl)); - shouldStroke && (strokeOffsets = this._setStrokeStyles(ctx, fullDecl)); - - ctx.font = this._getFontDeclaration(fullDecl); - - - if (decl && decl.textBackgroundColor) { - this._removeShadow(ctx); - } - if (decl && decl.deltaY) { - top += decl.deltaY; - } - shouldFill && ctx.fillText(_char, left - fillOffsets.offsetX, top - fillOffsets.offsetY); - shouldStroke && ctx.strokeText(_char, left - strokeOffsets.offsetX, top - strokeOffsets.offsetY); - ctx.restore(); - }, - - /** - * Turns the character into a 'superior figure' (i.e. 'superscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSuperscript: function(start, end) { - return this._setScript(start, end, this.superscript); - }, - - /** - * Turns the character into an 'inferior figure' (i.e. 'subscript') - * @param {Number} start selection start - * @param {Number} end selection end - * @returns {fabric.Text} thisArg - * @chainable - */ - setSubscript: function(start, end) { - return this._setScript(start, end, this.subscript); - }, - - /** - * Applies 'schema' at given position - * @private - * @param {Number} start selection start - * @param {Number} end selection end - * @param {Number} schema - * @returns {fabric.Text} thisArg - * @chainable - */ - _setScript: function(start, end, schema) { - var loc = this.get2DCursorLocation(start, true), - fontSize = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'fontSize'), - dy = this.getValueOfPropertyAt(loc.lineIndex, loc.charIndex, 'deltaY'), - style = { fontSize: fontSize * schema.size, deltaY: dy + fontSize * schema.baseline }; - this.setSelectionStyles(style, start, end); - return this; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChanged: function(prevStyle, thisStyle) { - return prevStyle.fill !== thisStyle.fill || - prevStyle.stroke !== thisStyle.stroke || - prevStyle.strokeWidth !== thisStyle.strokeWidth || - prevStyle.fontSize !== thisStyle.fontSize || - prevStyle.fontFamily !== thisStyle.fontFamily || - prevStyle.fontWeight !== thisStyle.fontWeight || - prevStyle.fontStyle !== thisStyle.fontStyle || - prevStyle.deltaY !== thisStyle.deltaY; - }, - - /** - * @private - * @param {Object} prevStyle - * @param {Object} thisStyle - */ - _hasStyleChangedForSvg: function(prevStyle, thisStyle) { - return this._hasStyleChanged(prevStyle, thisStyle) || - prevStyle.overline !== thisStyle.overline || - prevStyle.underline !== thisStyle.underline || - prevStyle.linethrough !== thisStyle.linethrough; - }, - - /** - * @private - * @param {Number} lineIndex index text line - * @return {Number} Line left offset - */ - _getLineLeftOffset: function(lineIndex) { - var lineWidth = this.getLineWidth(lineIndex), - lineDiff = this.width - lineWidth, textAlign = this.textAlign, direction = this.direction, - isEndOfWrapping, leftOffset = 0, isEndOfWrapping = this.isEndOfWrapping(lineIndex); - if (textAlign === 'justify' - || (textAlign === 'justify-center' && !isEndOfWrapping) - || (textAlign === 'justify-right' && !isEndOfWrapping) - || (textAlign === 'justify-left' && !isEndOfWrapping) - ) { - return 0; - } - if (textAlign === 'center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'right') { - leftOffset = lineDiff; - } - if (textAlign === 'justify-center') { - leftOffset = lineDiff / 2; - } - if (textAlign === 'justify-right') { - leftOffset = lineDiff; - } - if (direction === 'rtl') { - leftOffset -= lineDiff; - } - return leftOffset; - }, - - /** - * @private - */ - _clearCache: function() { - this.__lineWidths = []; - this.__lineHeights = []; - this.__charBounds = []; - }, - - /** - * @private - */ - _shouldClearDimensionCache: function() { - var shouldClear = this._forceClearCache; - shouldClear || (shouldClear = this.hasStateChanged('_dimensionAffectingProps')); - if (shouldClear) { - this.dirty = true; - this._forceClearCache = false; - } - return shouldClear; - }, - - /** - * Measure a single line given its index. Used to calculate the initial - * text bounding box. The values are calculated and stored in __lineWidths cache. - * @private - * @param {Number} lineIndex line number - * @return {Number} Line width - */ - getLineWidth: function(lineIndex) { - if (this.__lineWidths[lineIndex] !== undefined) { - return this.__lineWidths[lineIndex]; - } - - var lineInfo = this.measureLine(lineIndex); - var width = lineInfo.width; - this.__lineWidths[lineIndex] = width; - return width; - }, - - _getWidthOfCharSpacing: function() { - if (this.charSpacing !== 0) { - return this.fontSize * this.charSpacing / 1000; - } - return 0; - }, - - /** - * Retrieves the value of property at given character position - * @param {Number} lineIndex the line number - * @param {Number} charIndex the character number - * @param {String} property the property name - * @returns the value of 'property' - */ - getValueOfPropertyAt: function(lineIndex, charIndex, property) { - var charStyle = this._getStyleDeclaration(lineIndex, charIndex); - if (charStyle && typeof charStyle[property] !== 'undefined') { - return charStyle[property]; - } - return this[property]; - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _renderTextDecoration: function(ctx, type) { - if (!this[type] && !this.styleHas(type)) { - return; - } - var heightOfLine, size, _size, - lineLeftOffset, dy, _dy, - line, lastDecoration, - leftOffset = this._getLeftOffset(), - topOffset = this._getTopOffset(), top, - boxStart, boxWidth, charBox, currentDecoration, - maxHeight, currentFill, lastFill, path = this.path, - charSpacing = this._getWidthOfCharSpacing(), - offsetY = this.offsets[type]; - - for (var i = 0, len = this._textLines.length; i < len; i++) { - heightOfLine = this.getHeightOfLine(i); - if (!this[type] && !this.styleHas(type, i)) { - topOffset += heightOfLine; - continue; - } - line = this._textLines[i]; - maxHeight = heightOfLine / this.lineHeight; - lineLeftOffset = this._getLineLeftOffset(i); - boxStart = 0; - boxWidth = 0; - lastDecoration = this.getValueOfPropertyAt(i, 0, type); - lastFill = this.getValueOfPropertyAt(i, 0, 'fill'); - top = topOffset + maxHeight * (1 - this._fontSizeFraction); - size = this.getHeightOfChar(i, 0); - dy = this.getValueOfPropertyAt(i, 0, 'deltaY'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentDecoration = this.getValueOfPropertyAt(i, j, type); - currentFill = this.getValueOfPropertyAt(i, j, 'fill'); - _size = this.getHeightOfChar(i, j); - _dy = this.getValueOfPropertyAt(i, j, 'deltaY'); - if (path && currentDecoration && currentFill) { - ctx.save(); - ctx.fillStyle = lastFill; - ctx.translate(charBox.renderLeft, charBox.renderTop); - ctx.rotate(charBox.angle); - ctx.fillRect( - -charBox.kernedWidth / 2, - offsetY * _size + _dy, - charBox.kernedWidth, - this.fontSize / 15 - ); - ctx.restore(); - } - else if ( - (currentDecoration !== lastDecoration || currentFill !== lastFill || _size !== size || _dy !== dy) - && boxWidth > 0 - ) { - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - if (lastDecoration && lastFill) { - ctx.fillStyle = lastFill; - ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth, - this.fontSize / 15 - ); - } - boxStart = charBox.left; - boxWidth = charBox.width; - lastDecoration = currentDecoration; - lastFill = currentFill; - size = _size; - dy = _dy; - } - else { - boxWidth += charBox.kernedWidth; - } - } - var drawStart = leftOffset + lineLeftOffset + boxStart; - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - boxWidth; - } - ctx.fillStyle = currentFill; - currentDecoration && currentFill && ctx.fillRect( - drawStart, - top + offsetY * size + dy, - boxWidth - charSpacing, - this.fontSize / 15 - ); - topOffset += heightOfLine; - } - // if there is text background color no - // other shadows should be casted - this._removeShadow(ctx); - }, - - /** - * return font declaration string for canvas context - * @param {Object} [styleObject] object - * @returns {String} font declaration formatted for canvas context. - */ - _getFontDeclaration: function(styleObject, forMeasuring) { - var style = styleObject || this, family = this.fontFamily, - fontIsGeneric = fabric.Text.genericFonts.indexOf(family.toLowerCase()) > -1; - var fontFamily = family === undefined || - family.indexOf('\'') > -1 || family.indexOf(',') > -1 || - family.indexOf('"') > -1 || fontIsGeneric - ? style.fontFamily : '"' + style.fontFamily + '"'; - return [ - // node-canvas needs "weight style", while browsers need "style weight" - // verify if this can be fixed in JSDOM - (fabric.isLikelyNode ? style.fontWeight : style.fontStyle), - (fabric.isLikelyNode ? style.fontStyle : style.fontWeight), - forMeasuring ? this.CACHE_FONT_SIZE + 'px' : style.fontSize + 'px', - fontFamily - ].join(' '); - }, - - /** - * Renders text instance on a specified context - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - // do not render if object is not visible - if (!this.visible) { - return; - } - if (this.canvas && this.canvas.skipOffscreen && !this.group && !this.isOnScreen()) { - return; - } - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - } - this.callSuper('render', ctx); - }, - - /** - * Returns the text as an array of lines. - * @param {String} text text to split - * @returns {Array} Lines in the text - */ - _splitTextIntoLines: function(text) { - var lines = text.split(this._reNewline), - newLines = new Array(lines.length), - newLine = ['\n'], - newText = []; - for (var i = 0; i < lines.length; i++) { - newLines[i] = fabric.util.string.graphemeSplit(lines[i]); - newText = newText.concat(newLines[i], newLine); - } - newText.pop(); - return { _unwrappedLines: newLines, lines: lines, graphemeText: newText, graphemeLines: newLines }; - }, - - /** - * Returns object representation of an instance - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} Object representation of an instance - */ - toObject: function(propertiesToInclude) { - var allProperties = additionalProps.concat(propertiesToInclude); - var obj = this.callSuper('toObject', allProperties); - // styles will be overridden with a properly cloned structure - obj.styles = clone(this.styles, true); - if (obj.path) { - obj.path = this.path.toObject(); - } - return obj; - }, - - /** - * Sets property to a given value. When changing position/dimension -related properties (left, top, scale, angle, etc.) `set` does not update position of object's borders/controls. If you need to update those, call `setCoords()`. - * @param {String|Object} key Property name or object (if object, iterate over the object properties) - * @param {Object|Function} value Property value (if function, the value is passed into it and its return value is used as a new one) - * @return {fabric.Object} thisArg - * @chainable - */ - set: function(key, value) { - this.callSuper('set', key, value); - var needsDims = false; - var isAddingPath = false; - if (typeof key === 'object') { - for (var _key in key) { - if (_key === 'path') { - this.setPathInfo(); - } - needsDims = needsDims || this._dimensionAffectingProps.indexOf(_key) !== -1; - isAddingPath = isAddingPath || _key === 'path'; - } - } - else { - needsDims = this._dimensionAffectingProps.indexOf(key) !== -1; - isAddingPath = key === 'path'; - } - if (isAddingPath) { - this.setPathInfo(); - } - if (needsDims) { - this.initDimensions(); - this.setCoords(); - } - return this; - }, - - /** - * Returns complexity of an instance - * @return {Number} complexity - */ - complexity: function() { - return 1; - } - }); - - /* _FROM_SVG_START_ */ - /** - * List of attribute names to account for when parsing SVG element (used by {@link fabric.Text.fromElement}) - * @static - * @memberOf fabric.Text - * @see: http://www.w3.org/TR/SVG/text.html#TextElement - */ - fabric.Text.ATTRIBUTE_NAMES = fabric.SHARED_ATTRIBUTES.concat( - 'x y dx dy font-family font-style font-weight font-size letter-spacing text-decoration text-anchor'.split(' ')); - - /** - * Default SVG font size - * @static - * @memberOf fabric.Text - */ - fabric.Text.DEFAULT_SVG_FONT_SIZE = 16; - - /** - * Returns fabric.Text instance from an SVG element (not yet implemented) - * @static - * @memberOf fabric.Text - * @param {SVGElement} element Element to parse - * @param {Function} callback callback function invoked after parsing - * @param {Object} [options] Options object - */ - fabric.Text.fromElement = function(element, callback, options) { - if (!element) { - return callback(null); - } - - var parsedAttributes = fabric.parseAttributes(element, fabric.Text.ATTRIBUTE_NAMES), - parsedAnchor = parsedAttributes.textAnchor || 'left'; - options = fabric.util.object.extend((options ? clone(options) : { }), parsedAttributes); - - options.top = options.top || 0; - options.left = options.left || 0; - if (parsedAttributes.textDecoration) { - var textDecoration = parsedAttributes.textDecoration; - if (textDecoration.indexOf('underline') !== -1) { - options.underline = true; - } - if (textDecoration.indexOf('overline') !== -1) { - options.overline = true; - } - if (textDecoration.indexOf('line-through') !== -1) { - options.linethrough = true; - } - delete options.textDecoration; - } - if ('dx' in parsedAttributes) { - options.left += parsedAttributes.dx; - } - if ('dy' in parsedAttributes) { - options.top += parsedAttributes.dy; - } - if (!('fontSize' in options)) { - options.fontSize = fabric.Text.DEFAULT_SVG_FONT_SIZE; - } - - var textContent = ''; - - // The XML is not properly parsed in IE9 so a workaround to get - // textContent is through firstChild.data. Another workaround would be - // to convert XML loaded from a file to be converted using DOMParser (same way loadSVGFromString() does) - if (!('textContent' in element)) { - if ('firstChild' in element && element.firstChild !== null) { - if ('data' in element.firstChild && element.firstChild.data !== null) { - textContent = element.firstChild.data; - } - } - } - else { - textContent = element.textContent; - } - - textContent = textContent.replace(/^\s+|\s+$|\n+/g, '').replace(/\s+/g, ' '); - var originalStrokeWidth = options.strokeWidth; - options.strokeWidth = 0; - - var text = new fabric.Text(textContent, options), - textHeightScaleFactor = text.getScaledHeight() / text.height, - lineHeightDiff = (text.height + text.strokeWidth) * text.lineHeight - text.height, - scaledDiff = lineHeightDiff * textHeightScaleFactor, - textHeight = text.getScaledHeight() + scaledDiff, - offX = 0; - /* - Adjust positioning: - x/y attributes in SVG correspond to the bottom-left corner of text bounding box - fabric output by default at top, left. - */ - if (parsedAnchor === 'center') { - offX = text.getScaledWidth() / 2; - } - if (parsedAnchor === 'right') { - offX = text.getScaledWidth(); - } - text.set({ - left: text.left - offX, - top: text.top - (textHeight - text.fontSize * (0.07 + text._fontSizeFraction)) / text.lineHeight, - strokeWidth: typeof originalStrokeWidth !== 'undefined' ? originalStrokeWidth : 1, - }); - callback(text); - }; - /* _FROM_SVG_END_ */ - - /** - * Returns fabric.Text instance from an object representation - * @static - * @memberOf fabric.Text - * @param {Object} object plain js Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Text instance is created - */ - fabric.Text.fromObject = function(object, callback) { - var objectCopy = clone(object), path = object.path; - delete objectCopy.path; - return fabric.Object._fromObject('Text', objectCopy, function(textInstance) { - if (path) { - fabric.Object._fromObject('Path', path, function(pathInstance) { - textInstance.set('path', pathInstance); - callback(textInstance); - }, 'path'); - } - else { - callback(textInstance); - } - }, 'text'); - }; - - fabric.Text.genericFonts = ['sans-serif', 'serif', 'cursive', 'fantasy', 'monospace']; - - fabric.util.createAccessors && fabric.util.createAccessors(fabric.Text); - -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return true; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - return true; - }, - - /** - * Returns true if object has a style property or has it ina specified line - * This function is used to detect if a text will use a particular property or not. - * @param {String} property to check for - * @param {Number} lineIndex to check the style on - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (!this.styles || !property || property === '') { - return false; - } - if (typeof lineIndex !== 'undefined' && !this.styles[lineIndex]) { - return false; - } - var obj = typeof lineIndex === 'undefined' ? this.styles : { 0: this.styles[lineIndex] }; - // eslint-disable-next-line - for (var p1 in obj) { - // eslint-disable-next-line - for (var p2 in obj[p1]) { - if (typeof obj[p1][p2][property] !== 'undefined') { - return true; - } - } - } - return false; - }, - - /** - * Check if characters in a text have a value for a property - * whose value matches the textbox's value for that property. If so, - * the character-level property is deleted. If the character - * has no other properties, then it is also deleted. Finally, - * if the line containing that character has no other characters - * then it also is deleted. - * - * @param {string} property The property to compare between characters and text. - */ - cleanStyle: function(property) { - if (!this.styles || !property || property === '') { - return false; - } - var obj = this.styles, stylesCount = 0, letterCount, stylePropertyValue, - allStyleObjectPropertiesMatch = true, graphemeCount = 0, styleObject; - // eslint-disable-next-line - for (var p1 in obj) { - letterCount = 0; - // eslint-disable-next-line - for (var p2 in obj[p1]) { - var styleObject = obj[p1][p2], - stylePropertyHasBeenSet = styleObject.hasOwnProperty(property); - - stylesCount++; - - if (stylePropertyHasBeenSet) { - if (!stylePropertyValue) { - stylePropertyValue = styleObject[property]; - } - else if (styleObject[property] !== stylePropertyValue) { - allStyleObjectPropertiesMatch = false; - } - - if (styleObject[property] === this[property]) { - delete styleObject[property]; - } - } - else { - allStyleObjectPropertiesMatch = false; - } - - if (Object.keys(styleObject).length !== 0) { - letterCount++; - } - else { - delete obj[p1][p2]; - } - } - - if (letterCount === 0) { - delete obj[p1]; - } - } - // if every grapheme has the same style set then - // delete those styles and set it on the parent - for (var i = 0; i < this._textLines.length; i++) { - graphemeCount += this._textLines[i].length; - } - if (allStyleObjectPropertiesMatch && stylesCount === graphemeCount) { - this[property] = stylePropertyValue; - this.removeStyle(property); - } - }, - - /** - * Remove a style property or properties from all individual character styles - * in a text object. Deletes the character style object if it contains no other style - * props. Deletes a line style object if it contains no other character styles. - * - * @param {String} props The property to remove from character styles. - */ - removeStyle: function(property) { - if (!this.styles || !property || property === '') { - return; - } - var obj = this.styles, line, lineNum, charNum; - for (lineNum in obj) { - line = obj[lineNum]; - for (charNum in line) { - delete line[charNum][property]; - if (Object.keys(line[charNum]).length === 0) { - delete line[charNum]; - } - } - if (Object.keys(line).length === 0) { - delete obj[lineNum]; - } - } - }, - - /** - * @private - */ - _extendStyles: function(index, styles) { - var loc = this.get2DCursorLocation(index); - - if (!this._getLineStyle(loc.lineIndex)) { - this._setLineStyle(loc.lineIndex); - } - - if (!this._getStyleDeclaration(loc.lineIndex, loc.charIndex)) { - this._setStyleDeclaration(loc.lineIndex, loc.charIndex, {}); - } - - fabric.util.object.extend(this._getStyleDeclaration(loc.lineIndex, loc.charIndex), styles); - }, - - /** - * Returns 2d representation (lineIndex and charIndex) of cursor (or selection start) - * @param {Number} [selectionStart] Optional index. When not given, current selectionStart is used. - * @param {Boolean} [skipWrapping] consider the location for unwrapped lines. useful to manage styles. - */ - get2DCursorLocation: function(selectionStart, skipWrapping) { - if (typeof selectionStart === 'undefined') { - selectionStart = this.selectionStart; - } - var lines = skipWrapping ? this._unwrappedTextLines : this._textLines, - len = lines.length; - for (var i = 0; i < len; i++) { - if (selectionStart <= lines[i].length) { - return { - lineIndex: i, - charIndex: selectionStart - }; - } - selectionStart -= lines[i].length + this.missingNewlineOffset(i); - } - return { - lineIndex: i - 1, - charIndex: lines[i - 1].length < selectionStart ? lines[i - 1].length : selectionStart - }; - }, - - /** - * Gets style of a current selection/cursor (at the start position) - * if startIndex or endIndex are not provided, selectionStart or selectionEnd will be used. - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @param {Boolean} [complete] get full style or not - * @return {Array} styles an array with one, zero or more Style objects - */ - getSelectionStyles: function(startIndex, endIndex, complete) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - var styles = []; - for (var i = startIndex; i < endIndex; i++) { - styles.push(this.getStyleAtPosition(i, complete)); - } - return styles; - }, - - /** - * Gets style of a current selection/cursor position - * @param {Number} position to get styles at - * @param {Boolean} [complete] full style if true - * @return {Object} style Style object at a specified index - * @private - */ - getStyleAtPosition: function(position, complete) { - var loc = this.get2DCursorLocation(position), - style = complete ? this.getCompleteStyleDeclaration(loc.lineIndex, loc.charIndex) : - this._getStyleDeclaration(loc.lineIndex, loc.charIndex); - return style || {}; - }, - - /** - * Sets style of a current selection, if no selection exist, do not set anything. - * @param {Object} [styles] Styles object - * @param {Number} [startIndex] Start index to get styles at - * @param {Number} [endIndex] End index to get styles at, if not specified selectionEnd or startIndex + 1 - * @return {fabric.IText} thisArg - * @chainable - */ - setSelectionStyles: function(styles, startIndex, endIndex) { - if (typeof startIndex === 'undefined') { - startIndex = this.selectionStart || 0; - } - if (typeof endIndex === 'undefined') { - endIndex = this.selectionEnd || startIndex; - } - for (var i = startIndex; i < endIndex; i++) { - this._extendStyles(i, styles); - } - /* not included in _extendStyles to avoid clearing cache more than once */ - this._forceClearCache = true; - return this; - }, - - /** - * get the reference, not a clone, of the style object for a given character - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Object} style object - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - var lineStyle = this.styles && this.styles[lineIndex]; - if (!lineStyle) { - return null; - } - return lineStyle[charIndex]; - }, - - /** - * return a new object that contains all the style property for a character - * the object returned is newly created - * @param {Number} lineIndex of the line where the character is - * @param {Number} charIndex position of the character on the line - * @return {Object} style object - */ - getCompleteStyleDeclaration: function(lineIndex, charIndex) { - var style = this._getStyleDeclaration(lineIndex, charIndex) || { }, - styleObject = { }, prop; - for (var i = 0; i < this._styleProperties.length; i++) { - prop = this._styleProperties[i]; - styleObject[prop] = typeof style[prop] === 'undefined' ? this[prop] : style[prop]; - } - return styleObject; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - this.styles[lineIndex][charIndex] = style; - }, - - /** - * - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - delete this.styles[lineIndex][charIndex]; - }, - - /** - * @param {Number} lineIndex - * @return {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - return !!this.styles[lineIndex]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @private - */ - _setLineStyle: function(lineIndex) { - this.styles[lineIndex] = {}; - }, - - /** - * @param {Number} lineIndex - * @private - */ - _deleteLineStyle: function(lineIndex) { - delete this.styles[lineIndex]; - } - }); -})(); - - -(function() { - - function parseDecoration(object) { - if (object.textDecoration) { - object.textDecoration.indexOf('underline') > -1 && (object.underline = true); - object.textDecoration.indexOf('line-through') > -1 && (object.linethrough = true); - object.textDecoration.indexOf('overline') > -1 && (object.overline = true); - delete object.textDecoration; - } - } - - /** - * IText class (introduced in v1.4) Events are also fired with "text:" - * prefix when observing canvas. - * @class fabric.IText - * @extends fabric.Text - * @mixes fabric.Observable - * - * @fires changed - * @fires selection:changed - * @fires editing:entered - * @fires editing:exited - * - * @return {fabric.IText} thisArg - * @see {@link fabric.IText#initialize} for constructor definition - * - *

    Supported key combinations:

    - *
    -   *   Move cursor:                    left, right, up, down
    -   *   Select character:               shift + left, shift + right
    -   *   Select text vertically:         shift + up, shift + down
    -   *   Move cursor by word:            alt + left, alt + right
    -   *   Select words:                   shift + alt + left, shift + alt + right
    -   *   Move cursor to line start/end:  cmd + left, cmd + right or home, end
    -   *   Select till start/end of line:  cmd + shift + left, cmd + shift + right or shift + home, shift + end
    -   *   Jump to start/end of text:      cmd + up, cmd + down
    -   *   Select till start/end of text:  cmd + shift + up, cmd + shift + down or shift + pgUp, shift + pgDown
    -   *   Delete character:               backspace
    -   *   Delete word:                    alt + backspace
    -   *   Delete line:                    cmd + backspace
    -   *   Forward delete:                 delete
    -   *   Copy text:                      ctrl/cmd + c
    -   *   Paste text:                     ctrl/cmd + v
    -   *   Cut text:                       ctrl/cmd + x
    -   *   Select entire text:             ctrl/cmd + a
    -   *   Quit editing                    tab or esc
    -   * 
    - * - *

    Supported mouse/touch combination

    - *
    -   *   Position cursor:                click/touch
    -   *   Create selection:               click/touch & drag
    -   *   Create selection:               click & shift + click
    -   *   Select word:                    double click
    -   *   Select line:                    triple click
    -   * 
    - */ - fabric.IText = fabric.util.createClass(fabric.Text, fabric.Observable, /** @lends fabric.IText.prototype */ { - - /** - * Type of an object - * @type String - * @default - */ - type: 'i-text', - - /** - * Index where text selection starts (or where cursor is when there is no selection) - * @type Number - * @default - */ - selectionStart: 0, - - /** - * Index where text selection ends - * @type Number - * @default - */ - selectionEnd: 0, - - /** - * Color of text selection - * @type String - * @default - */ - selectionColor: 'rgba(17,119,255,0.3)', - - /** - * Indicates whether text is in editing mode - * @type Boolean - * @default - */ - isEditing: false, - - /** - * Indicates whether a text can be edited - * @type Boolean - * @default - */ - editable: true, - - /** - * Border color of text object while it's in editing mode - * @type String - * @default - */ - editingBorderColor: 'rgba(102,153,255,0.25)', - - /** - * Width of cursor (in px) - * @type Number - * @default - */ - cursorWidth: 2, - - /** - * Color of text cursor color in editing mode. - * if not set (default) will take color from the text. - * if set to a color value that fabric can understand, it will - * be used instead of the color of the text at the current position. - * @type String - * @default - */ - cursorColor: '', - - /** - * Delay between cursor blink (in ms) - * @type Number - * @default - */ - cursorDelay: 1000, - - /** - * Duration of cursor fadein (in ms) - * @type Number - * @default - */ - cursorDuration: 600, - - /** - * Indicates whether internal text char widths can be cached - * @type Boolean - * @default - */ - caching: true, - - /** - * DOM container to append the hiddenTextarea. - * An alternative to attaching to the document.body. - * Useful to reduce laggish redraw of the full document.body tree and - * also with modals event capturing that won't let the textarea take focus. - * @type HTMLElement - * @default - */ - hiddenTextareaContainer: null, - - /** - * @private - */ - _reSpace: /\s|\n/, - - /** - * @private - */ - _currentCursorOpacity: 0, - - /** - * @private - */ - _selectionDirection: null, - - /** - * @private - */ - _abortCursorAnimation: false, - - /** - * @private - */ - __widthOfSpace: [], - - /** - * Helps determining when the text is in composition, so that the cursor - * rendering is altered. - */ - inCompositionMode: false, - - /** - * Constructor - * @param {String} text Text string - * @param {Object} [options] Options object - * @return {fabric.IText} thisArg - */ - initialize: function(text, options) { - this.callSuper('initialize', text, options); - this.initBehavior(); - }, - - /** - * Sets selection start (left boundary of a selection) - * @param {Number} index Index to set selection start to - */ - setSelectionStart: function(index) { - index = Math.max(index, 0); - this._updateAndFire('selectionStart', index); - }, - - /** - * Sets selection end (right boundary of a selection) - * @param {Number} index Index to set selection end to - */ - setSelectionEnd: function(index) { - index = Math.min(index, this.text.length); - this._updateAndFire('selectionEnd', index); - }, - - /** - * @private - * @param {String} property 'selectionStart' or 'selectionEnd' - * @param {Number} index new position of property - */ - _updateAndFire: function(property, index) { - if (this[property] !== index) { - this._fireSelectionChanged(); - this[property] = index; - } - this._updateTextarea(); - }, - - /** - * Fires the even of selection changed - * @private - */ - _fireSelectionChanged: function() { - this.fire('selection:changed'); - this.canvas && this.canvas.fire('text:selection:changed', { target: this }); - }, - - /** - * Initialize text dimensions. Render all text on given context - * or on a offscreen canvas to get the text width with measureText. - * Updates this.width and this.height with the proper values. - * Does not return dimensions. - * @private - */ - initDimensions: function() { - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this.callSuper('initDimensions'); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - render: function(ctx) { - this.clearContextTop(); - this.callSuper('render', ctx); - // clear the cursorOffsetCache, so we ensure to calculate once per renderCursor - // the correct position but not at every cursor animation. - this.cursorOffsetCache = { }; - this.renderCursorOrSelection(); - }, - - /** - * @private - * @param {CanvasRenderingContext2D} ctx Context to render on - */ - _render: function(ctx) { - this.callSuper('_render', ctx); - }, - - /** - * Prepare and clean the contextTop - */ - clearContextTop: function(skipRestore) { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var ctx = this.canvas.contextTop, v = this.canvas.viewportTransform; - ctx.save(); - ctx.transform(v[0], v[1], v[2], v[3], v[4], v[5]); - this.transform(ctx); - this._clearTextArea(ctx); - skipRestore || ctx.restore(); - }, - /** - * Renders cursor or selection (depending on what exists) - * it does on the contextTop. If contextTop is not available, do nothing. - */ - renderCursorOrSelection: function() { - if (!this.isEditing || !this.canvas || !this.canvas.contextTop) { - return; - } - var boundaries = this._getCursorBoundaries(), - ctx = this.canvas.contextTop; - this.clearContextTop(true); - if (this.selectionStart === this.selectionEnd) { - this.renderCursor(boundaries, ctx); - } - else { - this.renderSelection(boundaries, ctx); - } - ctx.restore(); - }, - - _clearTextArea: function(ctx) { - // we add 4 pixel, to be sure to do not leave any pixel out - var width = this.width + 4, height = this.height + 4; - ctx.clearRect(-width / 2, -height / 2, width, height); - }, - - /** - * Returns cursor boundaries (left, top, leftOffset, topOffset) - * @private - * @param {Array} chars Array of characters - * @param {String} typeOfBoundaries - */ - _getCursorBoundaries: function(position) { - - // left/top are left/top of entire text box - // leftOffset/topOffset are offset from that left/top point of a text box - - if (typeof position === 'undefined') { - position = this.selectionStart; - } - - var left = this._getLeftOffset(), - top = this._getTopOffset(), - offsets = this._getCursorBoundariesOffsets(position); - return { - left: left, - top: top, - leftOffset: offsets.left, - topOffset: offsets.top - }; - }, - - /** - * @private - */ - _getCursorBoundariesOffsets: function(position) { - if (this.cursorOffsetCache && 'top' in this.cursorOffsetCache) { - return this.cursorOffsetCache; - } - var lineLeftOffset, - lineIndex, - charIndex, - topOffset = 0, - leftOffset = 0, - boundaries, - cursorPosition = this.get2DCursorLocation(position); - charIndex = cursorPosition.charIndex; - lineIndex = cursorPosition.lineIndex; - for (var i = 0; i < lineIndex; i++) { - topOffset += this.getHeightOfLine(i); - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - var bound = this.__charBounds[lineIndex][charIndex]; - bound && (leftOffset = bound.left); - if (this.charSpacing !== 0 && charIndex === this._textLines[lineIndex].length) { - leftOffset -= this._getWidthOfCharSpacing(); - } - boundaries = { - top: topOffset, - left: lineLeftOffset + (leftOffset > 0 ? leftOffset : 0), - }; - if (this.direction === 'rtl') { - boundaries.left *= -1; - } - this.cursorOffsetCache = boundaries; - return this.cursorOffsetCache; - }, - - /** - * Renders cursor - * @param {Object} boundaries - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderCursor: function(boundaries, ctx) { - var cursorLocation = this.get2DCursorLocation(), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex > 0 ? cursorLocation.charIndex - 1 : 0, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize'), - multiplier = this.scaleX * this.canvas.getZoom(), - cursorWidth = this.cursorWidth / multiplier, - topOffset = boundaries.topOffset, - dy = this.getValueOfPropertyAt(lineIndex, charIndex, 'deltaY'); - topOffset += (1 - this._fontSizeFraction) * this.getHeightOfLine(lineIndex) / this.lineHeight - - charHeight * (1 - this._fontSizeFraction); - - if (this.inCompositionMode) { - this.renderSelection(boundaries, ctx); - } - ctx.fillStyle = this.cursorColor || this.getValueOfPropertyAt(lineIndex, charIndex, 'fill'); - ctx.globalAlpha = this.__isMousedown ? 1 : this._currentCursorOpacity; - ctx.fillRect( - boundaries.left + boundaries.leftOffset - cursorWidth / 2, - topOffset + boundaries.top + dy, - cursorWidth, - charHeight); - }, - - /** - * Renders text selection - * @param {Object} boundaries Object with left/top/leftOffset/topOffset - * @param {CanvasRenderingContext2D} ctx transformed context to draw on - */ - renderSelection: function(boundaries, ctx) { - - var selectionStart = this.inCompositionMode ? this.hiddenTextarea.selectionStart : this.selectionStart, - selectionEnd = this.inCompositionMode ? this.hiddenTextarea.selectionEnd : this.selectionEnd, - isJustify = this.textAlign.indexOf('justify') !== -1, - start = this.get2DCursorLocation(selectionStart), - end = this.get2DCursorLocation(selectionEnd), - startLine = start.lineIndex, - endLine = end.lineIndex, - startChar = start.charIndex < 0 ? 0 : start.charIndex, - endChar = end.charIndex < 0 ? 0 : end.charIndex; - - for (var i = startLine; i <= endLine; i++) { - var lineOffset = this._getLineLeftOffset(i) || 0, - lineHeight = this.getHeightOfLine(i), - realLineHeight = 0, boxStart = 0, boxEnd = 0; - - if (i === startLine) { - boxStart = this.__charBounds[startLine][startChar].left; - } - if (i >= startLine && i < endLine) { - boxEnd = isJustify && !this.isEndOfWrapping(i) ? this.width : this.getLineWidth(i) || 5; // WTF is this 5? - } - else if (i === endLine) { - if (endChar === 0) { - boxEnd = this.__charBounds[endLine][endChar].left; - } - else { - var charSpacing = this._getWidthOfCharSpacing(); - boxEnd = this.__charBounds[endLine][endChar - 1].left - + this.__charBounds[endLine][endChar - 1].width - charSpacing; - } - } - realLineHeight = lineHeight; - if (this.lineHeight < 1 || (i === endLine && this.lineHeight > 1)) { - lineHeight /= this.lineHeight; - } - var drawStart = boundaries.left + lineOffset + boxStart, - drawWidth = boxEnd - boxStart, - drawHeight = lineHeight, extraTop = 0; - if (this.inCompositionMode) { - ctx.fillStyle = this.compositionColor || 'black'; - drawHeight = 1; - extraTop = lineHeight; - } - else { - ctx.fillStyle = this.selectionColor; - } - if (this.direction === 'rtl') { - drawStart = this.width - drawStart - drawWidth; - } - ctx.fillRect( - drawStart, - boundaries.top + boundaries.topOffset + extraTop, - drawWidth, - drawHeight); - boundaries.topOffset += realLineHeight; - } - }, - - /** - * High level function to know the height of the cursor. - * the currentChar is the one that precedes the cursor - * Returns fontSize of char at the current cursor - * Unused from the library, is for the end user - * @return {Number} Character font size - */ - getCurrentCharFontSize: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fontSize'); - }, - - /** - * High level function to know the color of the cursor. - * the currentChar is the one that precedes the cursor - * Returns color (fill) of char at the current cursor - * if the text object has a pattern or gradient for filler, it will return that. - * Unused by the library, is for the end user - * @return {String | fabric.Gradient | fabric.Pattern} Character color (fill) - */ - getCurrentCharColor: function() { - var cp = this._getCurrentCharIndex(); - return this.getValueOfPropertyAt(cp.l, cp.c, 'fill'); - }, - - /** - * Returns the cursor position for the getCurrent.. functions - * @private - */ - _getCurrentCharIndex: function() { - var cursorPosition = this.get2DCursorLocation(this.selectionStart, true), - charIndex = cursorPosition.charIndex > 0 ? cursorPosition.charIndex - 1 : 0; - return { l: cursorPosition.lineIndex, c: charIndex }; - } - }); - - /** - * Returns fabric.IText instance from an object representation - * @static - * @memberOf fabric.IText - * @param {Object} object Object to create an instance from - * @param {function} [callback] invoked with new instance as argument - */ - fabric.IText.fromObject = function(object, callback) { - parseDecoration(object); - if (object.styles) { - for (var i in object.styles) { - for (var j in object.styles[i]) { - parseDecoration(object.styles[i][j]); - } - } - } - fabric.Object._fromObject('IText', object, callback, 'text'); - }; -})(); - - -(function() { - - var clone = fabric.util.object.clone; - - fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes all the interactive behavior of IText - */ - initBehavior: function() { - this.initAddedHandler(); - this.initRemovedHandler(); - this.initCursorSelectionHandlers(); - this.initDoubleClickSimulation(); - this.mouseMoveHandler = this.mouseMoveHandler.bind(this); - }, - - onDeselect: function() { - this.isEditing && this.exitEditing(); - this.selected = false; - }, - - /** - * Initializes "added" event handler - */ - initAddedHandler: function() { - var _this = this; - this.on('added', function() { - var canvas = _this.canvas; - if (canvas) { - if (!canvas._hasITextHandlers) { - canvas._hasITextHandlers = true; - _this._initCanvasHandlers(canvas); - } - canvas._iTextInstances = canvas._iTextInstances || []; - canvas._iTextInstances.push(_this); - } - }); - }, - - initRemovedHandler: function() { - var _this = this; - this.on('removed', function() { - var canvas = _this.canvas; - if (canvas) { - canvas._iTextInstances = canvas._iTextInstances || []; - fabric.util.removeFromArray(canvas._iTextInstances, _this); - if (canvas._iTextInstances.length === 0) { - canvas._hasITextHandlers = false; - _this._removeCanvasHandlers(canvas); - } - } - }); - }, - - /** - * register canvas event to manage exiting on other instances - * @private - */ - _initCanvasHandlers: function(canvas) { - canvas._mouseUpITextHandler = function() { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.__isMousedown = false; - }); - } - }; - canvas.on('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * remove canvas event to manage exiting on other instances - * @private - */ - _removeCanvasHandlers: function(canvas) { - canvas.off('mouse:up', canvas._mouseUpITextHandler); - }, - - /** - * @private - */ - _tick: function() { - this._currentTickState = this._animateCursor(this, 1, this.cursorDuration, '_onTickComplete'); - }, - - /** - * @private - */ - _animateCursor: function(obj, targetOpacity, duration, completeMethod) { - - var tickState; - - tickState = { - isAborted: false, - abort: function() { - this.isAborted = true; - }, - }; - - obj.animate('_currentCursorOpacity', targetOpacity, { - duration: duration, - onComplete: function() { - if (!tickState.isAborted) { - obj[completeMethod](); - } - }, - onChange: function() { - // we do not want to animate a selection, only cursor - if (obj.canvas && obj.selectionStart === obj.selectionEnd) { - obj.renderCursorOrSelection(); - } - }, - abort: function() { - return tickState.isAborted; - } - }); - return tickState; - }, - - /** - * @private - */ - _onTickComplete: function() { - - var _this = this; - - if (this._cursorTimeout1) { - clearTimeout(this._cursorTimeout1); - } - this._cursorTimeout1 = setTimeout(function() { - _this._currentTickCompleteState = _this._animateCursor(_this, 0, this.cursorDuration / 2, '_tick'); - }, 100); - }, - - /** - * Initializes delayed cursor - */ - initDelayedCursor: function(restart) { - var _this = this, - delay = restart ? 0 : this.cursorDelay; - - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this._cursorTimeout2 = setTimeout(function() { - _this._tick(); - }, delay); - }, - - /** - * Aborts cursor animation and clears all timeouts - */ - abortCursorAnimation: function() { - var shouldClear = this._currentTickState || this._currentTickCompleteState, - canvas = this.canvas; - this._currentTickState && this._currentTickState.abort(); - this._currentTickCompleteState && this._currentTickCompleteState.abort(); - - clearTimeout(this._cursorTimeout1); - clearTimeout(this._cursorTimeout2); - - this._currentCursorOpacity = 0; - // to clear just itext area we need to transform the context - // it may not be worth it - if (shouldClear && canvas) { - canvas.clearContext(canvas.contextTop || canvas.contextContainer); - } - - }, - - /** - * Selects entire text - * @return {fabric.IText} thisArg - * @chainable - */ - selectAll: function() { - this.selectionStart = 0; - this.selectionEnd = this._text.length; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Returns selected text - * @return {String} - */ - getSelectedText: function() { - return this._text.slice(this.selectionStart, this.selectionEnd).join(''); - }, - - /** - * Find new selection index representing start of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - // remove space before cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index--; - } - } - while (/\S/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current word according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findWordBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - // remove space after cursor first - if (this._reSpace.test(this._text[index])) { - while (this._reSpace.test(this._text[index])) { - offset++; - index++; - } - } - while (/\S/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Find new selection index representing start of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryLeft: function(startFrom) { - var offset = 0, index = startFrom - 1; - - while (!/\n/.test(this._text[index]) && index > -1) { - offset++; - index--; - } - - return startFrom - offset; - }, - - /** - * Find new selection index representing end of current line according to current selection index - * @param {Number} startFrom Current selection index - * @return {Number} New selection index - */ - findLineBoundaryRight: function(startFrom) { - var offset = 0, index = startFrom; - - while (!/\n/.test(this._text[index]) && index < this._text.length) { - offset++; - index++; - } - - return startFrom + offset; - }, - - /** - * Finds index corresponding to beginning or end of a word - * @param {Number} selectionStart Index of a character - * @param {Number} direction 1 or -1 - * @return {Number} Index of the beginning or end of a word - */ - searchWordBoundary: function(selectionStart, direction) { - var text = this._text, - index = this._reSpace.test(text[selectionStart]) ? selectionStart - 1 : selectionStart, - _char = text[index], - // wrong - reNonWord = fabric.reNonWord; - - while (!reNonWord.test(_char) && index > 0 && index < text.length) { - index += direction; - _char = text[index]; - } - if (reNonWord.test(_char)) { - index += direction === 1 ? 0 : 1; - } - return index; - }, - - /** - * Selects a word based on the index - * @param {Number} selectionStart Index of a character - */ - selectWord: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.searchWordBoundary(selectionStart, -1), /* search backwards */ - newSelectionEnd = this.searchWordBoundary(selectionStart, 1); /* search forward */ - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - }, - - /** - * Selects a line based on the index - * @param {Number} selectionStart Index of a character - * @return {fabric.IText} thisArg - * @chainable - */ - selectLine: function(selectionStart) { - selectionStart = selectionStart || this.selectionStart; - var newSelectionStart = this.findLineBoundaryLeft(selectionStart), - newSelectionEnd = this.findLineBoundaryRight(selectionStart); - - this.selectionStart = newSelectionStart; - this.selectionEnd = newSelectionEnd; - this._fireSelectionChanged(); - this._updateTextarea(); - return this; - }, - - /** - * Enters editing state - * @return {fabric.IText} thisArg - * @chainable - */ - enterEditing: function(e) { - if (this.isEditing || !this.editable) { - return; - } - - if (this.canvas) { - this.canvas.calcOffset(); - this.exitEditingOnOthers(this.canvas); - } - - this.isEditing = true; - - this.initHiddenTextarea(e); - this.hiddenTextarea.focus(); - this.hiddenTextarea.value = this.text; - this._updateTextarea(); - this._saveEditingProps(); - this._setEditingProps(); - this._textBeforeEdit = this.text; - - this._tick(); - this.fire('editing:entered'); - this._fireSelectionChanged(); - if (!this.canvas) { - return this; - } - this.canvas.fire('text:editing:entered', { target: this }); - this.initMouseMoveHandler(); - this.canvas.requestRenderAll(); - return this; - }, - - exitEditingOnOthers: function(canvas) { - if (canvas._iTextInstances) { - canvas._iTextInstances.forEach(function(obj) { - obj.selected = false; - if (obj.isEditing) { - obj.exitEditing(); - } - }); - } - }, - - /** - * Initializes "mousemove" event handler - */ - initMouseMoveHandler: function() { - this.canvas.on('mouse:move', this.mouseMoveHandler); - }, - - /** - * @private - */ - mouseMoveHandler: function(options) { - if (!this.__isMousedown || !this.isEditing) { - return; - } - - var newSelectionStart = this.getSelectionStartFromPointer(options.e), - currentStart = this.selectionStart, - currentEnd = this.selectionEnd; - if ( - (newSelectionStart !== this.__selectionStartOnMouseDown || currentStart === currentEnd) - && - (currentStart === newSelectionStart || currentEnd === newSelectionStart) - ) { - return; - } - if (newSelectionStart > this.__selectionStartOnMouseDown) { - this.selectionStart = this.__selectionStartOnMouseDown; - this.selectionEnd = newSelectionStart; - } - else { - this.selectionStart = newSelectionStart; - this.selectionEnd = this.__selectionStartOnMouseDown; - } - if (this.selectionStart !== currentStart || this.selectionEnd !== currentEnd) { - this.restartCursorIfNeeded(); - this._fireSelectionChanged(); - this._updateTextarea(); - this.renderCursorOrSelection(); - } - }, - - /** - * @private - */ - _setEditingProps: function() { - this.hoverCursor = 'text'; - - if (this.canvas) { - this.canvas.defaultCursor = this.canvas.moveCursor = 'text'; - } - - this.borderColor = this.editingBorderColor; - this.hasControls = this.selectable = false; - this.lockMovementX = this.lockMovementY = true; - }, - - /** - * convert from textarea to grapheme indexes - */ - fromStringToGraphemeSelection: function(start, end, text) { - var smallerTextStart = text.slice(0, start), - graphemeStart = fabric.util.string.graphemeSplit(smallerTextStart).length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = text.slice(start, end), - graphemeEnd = fabric.util.string.graphemeSplit(smallerTextEnd).length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * convert from fabric to textarea values - */ - fromGraphemeToStringSelection: function(start, end, _text) { - var smallerTextStart = _text.slice(0, start), - graphemeStart = smallerTextStart.join('').length; - if (start === end) { - return { selectionStart: graphemeStart, selectionEnd: graphemeStart }; - } - var smallerTextEnd = _text.slice(start, end), - graphemeEnd = smallerTextEnd.join('').length; - return { selectionStart: graphemeStart, selectionEnd: graphemeStart + graphemeEnd }; - }, - - /** - * @private - */ - _updateTextarea: function() { - this.cursorOffsetCache = { }; - if (!this.hiddenTextarea) { - return; - } - if (!this.inCompositionMode) { - var newSelection = this.fromGraphemeToStringSelection(this.selectionStart, this.selectionEnd, this._text); - this.hiddenTextarea.selectionStart = newSelection.selectionStart; - this.hiddenTextarea.selectionEnd = newSelection.selectionEnd; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateFromTextArea: function() { - if (!this.hiddenTextarea) { - return; - } - this.cursorOffsetCache = { }; - this.text = this.hiddenTextarea.value; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - var newSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, this.hiddenTextarea.selectionEnd, this.hiddenTextarea.value); - this.selectionEnd = this.selectionStart = newSelection.selectionEnd; - if (!this.inCompositionMode) { - this.selectionStart = newSelection.selectionStart; - } - this.updateTextareaPosition(); - }, - - /** - * @private - */ - updateTextareaPosition: function() { - if (this.selectionStart === this.selectionEnd) { - var style = this._calcTextareaPosition(); - this.hiddenTextarea.style.left = style.left; - this.hiddenTextarea.style.top = style.top; - } - }, - - /** - * @private - * @return {Object} style contains style for hiddenTextarea - */ - _calcTextareaPosition: function() { - if (!this.canvas) { - return { x: 1, y: 1 }; - } - var desiredPosition = this.inCompositionMode ? this.compositionStart : this.selectionStart, - boundaries = this._getCursorBoundaries(desiredPosition), - cursorLocation = this.get2DCursorLocation(desiredPosition), - lineIndex = cursorLocation.lineIndex, - charIndex = cursorLocation.charIndex, - charHeight = this.getValueOfPropertyAt(lineIndex, charIndex, 'fontSize') * this.lineHeight, - leftOffset = boundaries.leftOffset, - m = this.calcTransformMatrix(), - p = { - x: boundaries.left + leftOffset, - y: boundaries.top + boundaries.topOffset + charHeight - }, - retinaScaling = this.canvas.getRetinaScaling(), - upperCanvas = this.canvas.upperCanvasEl, - upperCanvasWidth = upperCanvas.width / retinaScaling, - upperCanvasHeight = upperCanvas.height / retinaScaling, - maxWidth = upperCanvasWidth - charHeight, - maxHeight = upperCanvasHeight - charHeight, - scaleX = upperCanvas.clientWidth / upperCanvasWidth, - scaleY = upperCanvas.clientHeight / upperCanvasHeight; - - p = fabric.util.transformPoint(p, m); - p = fabric.util.transformPoint(p, this.canvas.viewportTransform); - p.x *= scaleX; - p.y *= scaleY; - if (p.x < 0) { - p.x = 0; - } - if (p.x > maxWidth) { - p.x = maxWidth; - } - if (p.y < 0) { - p.y = 0; - } - if (p.y > maxHeight) { - p.y = maxHeight; - } - - // add canvas offset on document - p.x += this.canvas._offset.left; - p.y += this.canvas._offset.top; - - return { left: p.x + 'px', top: p.y + 'px', fontSize: charHeight + 'px', charHeight: charHeight }; - }, - - /** - * @private - */ - _saveEditingProps: function() { - this._savedProps = { - hasControls: this.hasControls, - borderColor: this.borderColor, - lockMovementX: this.lockMovementX, - lockMovementY: this.lockMovementY, - hoverCursor: this.hoverCursor, - selectable: this.selectable, - defaultCursor: this.canvas && this.canvas.defaultCursor, - moveCursor: this.canvas && this.canvas.moveCursor - }; - }, - - /** - * @private - */ - _restoreEditingProps: function() { - if (!this._savedProps) { - return; - } - - this.hoverCursor = this._savedProps.hoverCursor; - this.hasControls = this._savedProps.hasControls; - this.borderColor = this._savedProps.borderColor; - this.selectable = this._savedProps.selectable; - this.lockMovementX = this._savedProps.lockMovementX; - this.lockMovementY = this._savedProps.lockMovementY; - - if (this.canvas) { - this.canvas.defaultCursor = this._savedProps.defaultCursor; - this.canvas.moveCursor = this._savedProps.moveCursor; - } - }, - - /** - * Exits from editing state - * @return {fabric.IText} thisArg - * @chainable - */ - exitEditing: function() { - var isTextChanged = (this._textBeforeEdit !== this.text); - var hiddenTextarea = this.hiddenTextarea; - this.selected = false; - this.isEditing = false; - - this.selectionEnd = this.selectionStart; - - if (hiddenTextarea) { - hiddenTextarea.blur && hiddenTextarea.blur(); - hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea); - } - this.hiddenTextarea = null; - this.abortCursorAnimation(); - this._restoreEditingProps(); - this._currentCursorOpacity = 0; - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this.fire('editing:exited'); - isTextChanged && this.fire('modified'); - if (this.canvas) { - this.canvas.off('mouse:move', this.mouseMoveHandler); - this.canvas.fire('text:editing:exited', { target: this }); - isTextChanged && this.canvas.fire('object:modified', { target: this }); - } - return this; - }, - - /** - * @private - */ - _removeExtraneousStyles: function() { - for (var prop in this.styles) { - if (!this._textLines[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * remove and reflow a style block from start to end. - * @param {Number} start linear start position for removal (included in removal) - * @param {Number} end linear end position for removal ( excluded from removal ) - */ - removeStyleFromTo: function(start, end) { - var cursorStart = this.get2DCursorLocation(start, true), - cursorEnd = this.get2DCursorLocation(end, true), - lineStart = cursorStart.lineIndex, - charStart = cursorStart.charIndex, - lineEnd = cursorEnd.lineIndex, - charEnd = cursorEnd.charIndex, - i, styleObj; - if (lineStart !== lineEnd) { - // step1 remove the trailing of lineStart - if (this.styles[lineStart]) { - for (i = charStart; i < this._unwrappedTextLines[lineStart].length; i++) { - delete this.styles[lineStart][i]; - } - } - // step2 move the trailing of lineEnd to lineStart if needed - if (this.styles[lineEnd]) { - for (i = charEnd; i < this._unwrappedTextLines[lineEnd].length; i++) { - styleObj = this.styles[lineEnd][i]; - if (styleObj) { - this.styles[lineStart] || (this.styles[lineStart] = { }); - this.styles[lineStart][charStart + i - charEnd] = styleObj; - } - } - } - // step3 detects lines will be completely removed. - for (i = lineStart + 1; i <= lineEnd; i++) { - delete this.styles[i]; - } - // step4 shift remaining lines. - this.shiftLineStyles(lineEnd, lineStart - lineEnd); - } - else { - // remove and shift left on the same line - if (this.styles[lineStart]) { - styleObj = this.styles[lineStart]; - var diff = charEnd - charStart, numericChar, _char; - for (i = charStart; i < charEnd; i++) { - delete styleObj[i]; - } - for (_char in this.styles[lineStart]) { - numericChar = parseInt(_char, 10); - if (numericChar >= charEnd) { - styleObj[numericChar - diff] = styleObj[_char]; - delete styleObj[_char]; - } - } - } - } - }, - - /** - * Shifts line styles up or down - * @param {Number} lineIndex Index of a line - * @param {Number} offset Can any number? - */ - shiftLineStyles: function(lineIndex, offset) { - // shift all line styles by offset upward or downward - // do not clone deep. we need new array, not new style objects - var clonedStyles = clone(this.styles); - for (var line in this.styles) { - var numericLine = parseInt(line, 10); - if (numericLine > lineIndex) { - this.styles[numericLine + offset] = clonedStyles[numericLine]; - if (!clonedStyles[numericLine - offset]) { - delete this.styles[numericLine]; - } - } - } - }, - - restartCursorIfNeeded: function() { - if (!this._currentTickState || this._currentTickState.isAborted - || !this._currentTickCompleteState || this._currentTickCompleteState.isAborted - ) { - this.initDelayedCursor(); - } - }, - - /** - * Handle insertion of more consecutive style lines for when one or more - * newlines gets added to the text. Since current style needs to be shifted - * first we shift the current style of the number lines needed, then we add - * new lines from the last to the first. - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} qty number of lines to add - * @param {Array} copiedStyle Array of objects styles - */ - insertNewlineStyleObject: function(lineIndex, charIndex, qty, copiedStyle) { - var currentCharStyle, - newLineStyles = {}, - somethingAdded = false, - isEndOfLine = this._unwrappedTextLines[lineIndex].length === charIndex; - - qty || (qty = 1); - this.shiftLineStyles(lineIndex, qty); - if (this.styles[lineIndex]) { - currentCharStyle = this.styles[lineIndex][charIndex === 0 ? charIndex : charIndex - 1]; - } - // we clone styles of all chars - // after cursor onto the current line - for (var index in this.styles[lineIndex]) { - var numIndex = parseInt(index, 10); - if (numIndex >= charIndex) { - somethingAdded = true; - newLineStyles[numIndex - charIndex] = this.styles[lineIndex][index]; - // remove lines from the previous line since they're on a new line now - if (!(isEndOfLine && charIndex === 0)) { - delete this.styles[lineIndex][index]; - } - } - } - var styleCarriedOver = false; - if (somethingAdded && !isEndOfLine) { - // if is end of line, the extra style we copied - // is probably not something we want - this.styles[lineIndex + qty] = newLineStyles; - styleCarriedOver = true; - } - if (styleCarriedOver) { - // skip the last line of since we already prepared it. - qty--; - } - // for the all the lines or all the other lines - // we clone current char style onto the next (otherwise empty) line - while (qty > 0) { - if (copiedStyle && copiedStyle[qty - 1]) { - this.styles[lineIndex + qty] = { 0: clone(copiedStyle[qty - 1]) }; - } - else if (currentCharStyle) { - this.styles[lineIndex + qty] = { 0: clone(currentCharStyle) }; - } - else { - delete this.styles[lineIndex + qty]; - } - qty--; - } - this._forceClearCache = true; - }, - - /** - * Inserts style object for a given line/char index - * @param {Number} lineIndex Index of a line - * @param {Number} charIndex Index of a char - * @param {Number} quantity number Style object to insert, if given - * @param {Array} copiedStyle array of style objects - */ - insertCharStyleObject: function(lineIndex, charIndex, quantity, copiedStyle) { - if (!this.styles) { - this.styles = {}; - } - var currentLineStyles = this.styles[lineIndex], - currentLineStylesCloned = currentLineStyles ? clone(currentLineStyles) : {}; - - quantity || (quantity = 1); - // shift all char styles by quantity forward - // 0,1,2,3 -> (charIndex=2) -> 0,1,3,4 -> (insert 2) -> 0,1,2,3,4 - for (var index in currentLineStylesCloned) { - var numericIndex = parseInt(index, 10); - if (numericIndex >= charIndex) { - currentLineStyles[numericIndex + quantity] = currentLineStylesCloned[numericIndex]; - // only delete the style if there was nothing moved there - if (!currentLineStylesCloned[numericIndex - quantity]) { - delete currentLineStyles[numericIndex]; - } - } - } - this._forceClearCache = true; - if (copiedStyle) { - while (quantity--) { - if (!Object.keys(copiedStyle[quantity]).length) { - continue; - } - if (!this.styles[lineIndex]) { - this.styles[lineIndex] = {}; - } - this.styles[lineIndex][charIndex + quantity] = clone(copiedStyle[quantity]); - } - return; - } - if (!currentLineStyles) { - return; - } - var newStyle = currentLineStyles[charIndex ? charIndex - 1 : 1]; - while (newStyle && quantity--) { - this.styles[lineIndex][charIndex + quantity] = clone(newStyle); - } - }, - - /** - * Inserts style object(s) - * @param {Array} insertedText Characters at the location where style is inserted - * @param {Number} start cursor index for inserting style - * @param {Array} [copiedStyle] array of style objects to insert. - */ - insertNewStyleBlock: function(insertedText, start, copiedStyle) { - var cursorLoc = this.get2DCursorLocation(start, true), - addedLines = [0], linesLength = 0; - // get an array of how many char per lines are being added. - for (var i = 0; i < insertedText.length; i++) { - if (insertedText[i] === '\n') { - linesLength++; - addedLines[linesLength] = 0; - } - else { - addedLines[linesLength]++; - } - } - // for the first line copy the style from the current char position. - if (addedLines[0] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex, cursorLoc.charIndex, addedLines[0], copiedStyle); - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[0] + 1); - } - linesLength && this.insertNewlineStyleObject( - cursorLoc.lineIndex, cursorLoc.charIndex + addedLines[0], linesLength); - for (var i = 1; i < linesLength; i++) { - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - else if (copiedStyle) { - // this test is required in order to close #6841 - // when a pasted buffer begins with a newline then - // this.styles[cursorLoc.lineIndex + i] and copiedStyle[0] - // may be undefined for some reason - if (this.styles[cursorLoc.lineIndex + i] && copiedStyle[0]) { - this.styles[cursorLoc.lineIndex + i][0] = copiedStyle[0]; - } - } - copiedStyle = copiedStyle && copiedStyle.slice(addedLines[i] + 1); - } - // we use i outside the loop to get it like linesLength - if (addedLines[i] > 0) { - this.insertCharStyleObject(cursorLoc.lineIndex + i, 0, addedLines[i], copiedStyle); - } - }, - - /** - * Set the selectionStart and selectionEnd according to the new position of cursor - * mimic the key - mouse navigation when shift is pressed. - */ - setSelectionStartEndWithShift: function(start, end, newSelection) { - if (newSelection <= start) { - if (end === start) { - this._selectionDirection = 'left'; - } - else if (this._selectionDirection === 'right') { - this._selectionDirection = 'left'; - this.selectionEnd = start; - } - this.selectionStart = newSelection; - } - else if (newSelection > start && newSelection < end) { - if (this._selectionDirection === 'right') { - this.selectionEnd = newSelection; - } - else { - this.selectionStart = newSelection; - } - } - else { - // newSelection is > selection start and end - if (end === start) { - this._selectionDirection = 'right'; - } - else if (this._selectionDirection === 'left') { - this._selectionDirection = 'right'; - this.selectionStart = end; - } - this.selectionEnd = newSelection; - } - }, - - setSelectionInBoundaries: function() { - var length = this.text.length; - if (this.selectionStart > length) { - this.selectionStart = length; - } - else if (this.selectionStart < 0) { - this.selectionStart = 0; - } - if (this.selectionEnd > length) { - this.selectionEnd = length; - } - else if (this.selectionEnd < 0) { - this.selectionEnd = 0; - } - } - }); -})(); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - /** - * Initializes "dbclick" event handler - */ - initDoubleClickSimulation: function() { - - // for double click - this.__lastClickTime = +new Date(); - - // for triple click - this.__lastLastClickTime = +new Date(); - - this.__lastPointer = { }; - - this.on('mousedown', this.onMouseDown); - }, - - /** - * Default event handler to simulate triple click - * @private - */ - onMouseDown: function(options) { - if (!this.canvas) { - return; - } - this.__newClickTime = +new Date(); - var newPointer = options.pointer; - if (this.isTripleClick(newPointer)) { - this.fire('tripleclick', options); - this._stopEvent(options.e); - } - this.__lastLastClickTime = this.__lastClickTime; - this.__lastClickTime = this.__newClickTime; - this.__lastPointer = newPointer; - this.__lastIsEditing = this.isEditing; - this.__lastSelected = this.selected; - }, - - isTripleClick: function(newPointer) { - return this.__newClickTime - this.__lastClickTime < 500 && - this.__lastClickTime - this.__lastLastClickTime < 500 && - this.__lastPointer.x === newPointer.x && - this.__lastPointer.y === newPointer.y; - }, - - /** - * @private - */ - _stopEvent: function(e) { - e.preventDefault && e.preventDefault(); - e.stopPropagation && e.stopPropagation(); - }, - - /** - * Initializes event handlers related to cursor or selection - */ - initCursorSelectionHandlers: function() { - this.initMousedownHandler(); - this.initMouseupHandler(); - this.initClicks(); - }, - - /** - * Default handler for double click, select a word - */ - doubleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectWord(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Default handler for triple click, select a line - */ - tripleClickHandler: function(options) { - if (!this.isEditing) { - return; - } - this.selectLine(this.getSelectionStartFromPointer(options.e)); - }, - - /** - * Initializes double and triple click event handlers - */ - initClicks: function() { - this.on('mousedblclick', this.doubleClickHandler); - this.on('tripleclick', this.tripleClickHandler); - }, - - /** - * Default event handler for the basic functionalities needed on _mouseDown - * can be overridden to do something different. - * Scope of this implementation is: find the click position, set selectionStart - * find selectionEnd, initialize the drawing of either cursor or selection area - * initializing a mousedDown on a text area will cancel fabricjs knowledge of - * current compositionMode. It will be set to false. - */ - _mouseDownHandler: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - - this.__isMousedown = true; - - if (this.selected) { - this.inCompositionMode = false; - this.setCursorByClick(options.e); - } - - if (this.isEditing) { - this.__selectionStartOnMouseDown = this.selectionStart; - if (this.selectionStart === this.selectionEnd) { - this.abortCursorAnimation(); - } - this.renderCursorOrSelection(); - } - }, - - /** - * Default event handler for the basic functionalities needed on mousedown:before - * can be overridden to do something different. - * Scope of this implementation is: verify the object is already selected when mousing down - */ - _mouseDownHandlerBefore: function(options) { - if (!this.canvas || !this.editable || (options.e.button && options.e.button !== 1)) { - return; - } - // we want to avoid that an object that was selected and then becomes unselectable, - // may trigger editing mode in some way. - this.selected = this === this.canvas._activeObject; - }, - - /** - * Initializes "mousedown" event handler - */ - initMousedownHandler: function() { - this.on('mousedown', this._mouseDownHandler); - this.on('mousedown:before', this._mouseDownHandlerBefore); - }, - - /** - * Initializes "mouseup" event handler - */ - initMouseupHandler: function() { - this.on('mouseup', this.mouseUpHandler); - }, - - /** - * standard handler for mouse up, overridable - * @private - */ - mouseUpHandler: function(options) { - this.__isMousedown = false; - if (!this.editable || this.group || - (options.transform && options.transform.actionPerformed) || - (options.e.button && options.e.button !== 1)) { - return; - } - - if (this.canvas) { - var currentActive = this.canvas._activeObject; - if (currentActive && currentActive !== this) { - // avoid running this logic when there is an active object - // this because is possible with shift click and fast clicks, - // to rapidly deselect and reselect this object and trigger an enterEdit - return; - } - } - - if (this.__lastSelected && !this.__corner) { - this.selected = false; - this.__lastSelected = false; - this.enterEditing(options.e); - if (this.selectionStart === this.selectionEnd) { - this.initDelayedCursor(true); - } - else { - this.renderCursorOrSelection(); - } - } - else { - this.selected = true; - } - }, - - /** - * Changes cursor location in a text depending on passed pointer (x/y) object - * @param {Event} e Event object - */ - setCursorByClick: function(e) { - var newSelection = this.getSelectionStartFromPointer(e), - start = this.selectionStart, end = this.selectionEnd; - if (e.shiftKey) { - this.setSelectionStartEndWithShift(start, end, newSelection); - } - else { - this.selectionStart = newSelection; - this.selectionEnd = newSelection; - } - if (this.isEditing) { - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Returns index of a character corresponding to where an object was clicked - * @param {Event} e Event object - * @return {Number} Index of a character - */ - getSelectionStartFromPointer: function(e) { - var mouseOffset = this.getLocalPointer(e), - prevWidth = 0, - width = 0, - height = 0, - charIndex = 0, - lineIndex = 0, - lineLeftOffset, - line; - for (var i = 0, len = this._textLines.length; i < len; i++) { - if (height <= mouseOffset.y) { - height += this.getHeightOfLine(i) * this.scaleY; - lineIndex = i; - if (i > 0) { - charIndex += this._textLines[i - 1].length + this.missingNewlineOffset(i - 1); - } - } - else { - break; - } - } - lineLeftOffset = this._getLineLeftOffset(lineIndex); - width = lineLeftOffset * this.scaleX; - line = this._textLines[lineIndex]; - // handling of RTL: in order to get things work correctly, - // we assume RTL writing is mirrored compared to LTR writing. - // so in position detection we mirror the X offset, and when is time - // of rendering it, we mirror it again. - if (this.direction === 'rtl') { - mouseOffset.x = this.width * this.scaleX - mouseOffset.x + width; - } - for (var j = 0, jlen = line.length; j < jlen; j++) { - prevWidth = width; - // i removed something about flipX here, check. - width += this.__charBounds[lineIndex][j].kernedWidth * this.scaleX; - if (width <= mouseOffset.x) { - charIndex++; - } - else { - break; - } - } - return this._getNewSelectionStartFromOffset(mouseOffset, prevWidth, width, charIndex, jlen); - }, - - /** - * @private - */ - _getNewSelectionStartFromOffset: function(mouseOffset, prevWidth, width, index, jlen) { - // we need Math.abs because when width is after the last char, the offset is given as 1, while is 0 - var distanceBtwLastCharAndCursor = mouseOffset.x - prevWidth, - distanceBtwNextCharAndCursor = width - mouseOffset.x, - offset = distanceBtwNextCharAndCursor > distanceBtwLastCharAndCursor || - distanceBtwNextCharAndCursor < 0 ? 0 : 1, - newSelectionStart = index + offset; - // if object is horizontally flipped, mirror cursor location from the end - if (this.flipX) { - newSelectionStart = jlen - newSelectionStart; - } - - if (newSelectionStart > this._text.length) { - newSelectionStart = this._text.length; - } - - return newSelectionStart; - } -}); - - -fabric.util.object.extend(fabric.IText.prototype, /** @lends fabric.IText.prototype */ { - - /** - * Initializes hidden textarea (needed to bring up keyboard in iOS) - */ - initHiddenTextarea: function() { - this.hiddenTextarea = fabric.document.createElement('textarea'); - this.hiddenTextarea.setAttribute('autocapitalize', 'off'); - this.hiddenTextarea.setAttribute('autocorrect', 'off'); - this.hiddenTextarea.setAttribute('autocomplete', 'off'); - this.hiddenTextarea.setAttribute('spellcheck', 'false'); - this.hiddenTextarea.setAttribute('data-fabric-hiddentextarea', ''); - this.hiddenTextarea.setAttribute('wrap', 'off'); - var style = this._calcTextareaPosition(); - // line-height: 1px; was removed from the style to fix this: - // https://bugs.chromium.org/p/chromium/issues/detail?id=870966 - this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + style.top + - '; left: ' + style.left + '; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px;' + - ' paddingーtop: ' + style.fontSize + ';'; - - if (this.hiddenTextareaContainer) { - this.hiddenTextareaContainer.appendChild(this.hiddenTextarea); - } - else { - fabric.document.body.appendChild(this.hiddenTextarea); - } - - fabric.util.addListener(this.hiddenTextarea, 'keydown', this.onKeyDown.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'keyup', this.onKeyUp.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'input', this.onInput.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'copy', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'cut', this.copy.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'paste', this.paste.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionstart', this.onCompositionStart.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionupdate', this.onCompositionUpdate.bind(this)); - fabric.util.addListener(this.hiddenTextarea, 'compositionend', this.onCompositionEnd.bind(this)); - - if (!this._clickHandlerInitialized && this.canvas) { - fabric.util.addListener(this.canvas.upperCanvasEl, 'click', this.onClick.bind(this)); - this._clickHandlerInitialized = true; - } - }, - - /** - * For functionalities on keyDown - * Map a special key to a function of the instance/prototype - * If you need different behaviour for ESC or TAB or arrows, you have to change - * this map setting the name of a function that you build on the fabric.Itext or - * your prototype. - * the map change will affect all Instances unless you need for only some text Instances - * in that case you have to clone this object and assign your Instance. - * this.keysMap = fabric.util.object.clone(this.keysMap); - * The function must be in fabric.Itext.prototype.myFunction And will receive event as args[0] - */ - keysMap: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorRight', - 36: 'moveCursorLeft', - 37: 'moveCursorLeft', - 38: 'moveCursorUp', - 39: 'moveCursorRight', - 40: 'moveCursorDown', - }, - - keysMapRtl: { - 9: 'exitEditing', - 27: 'exitEditing', - 33: 'moveCursorUp', - 34: 'moveCursorDown', - 35: 'moveCursorLeft', - 36: 'moveCursorRight', - 37: 'moveCursorRight', - 38: 'moveCursorUp', - 39: 'moveCursorLeft', - 40: 'moveCursorDown', - }, - - /** - * For functionalities on keyUp + ctrl || cmd - */ - ctrlKeysMapUp: { - 67: 'copy', - 88: 'cut' - }, - - /** - * For functionalities on keyDown + ctrl || cmd - */ - ctrlKeysMapDown: { - 65: 'selectAll' - }, - - onClick: function() { - // No need to trigger click event here, focus is enough to have the keyboard appear on Android - this.hiddenTextarea && this.hiddenTextarea.focus(); - }, - - /** - * Handles keydown event - * only used for arrows and combination of modifier keys. - * @param {Event} e Event object - */ - onKeyDown: function(e) { - if (!this.isEditing) { - return; - } - var keyMap = this.direction === 'rtl' ? this.keysMapRtl : this.keysMap; - if (e.keyCode in keyMap) { - this[keyMap[e.keyCode]](e); - } - else if ((e.keyCode in this.ctrlKeysMapDown) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapDown[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - if (e.keyCode >= 33 && e.keyCode <= 40) { - // if i press an arrow key just update selection - this.inCompositionMode = false; - this.clearContextTop(); - this.renderCursorOrSelection(); - } - else { - this.canvas && this.canvas.requestRenderAll(); - } - }, - - /** - * Handles keyup event - * We handle KeyUp because ie11 and edge have difficulties copy/pasting - * if a copy/cut event fired, keyup is dismissed - * @param {Event} e Event object - */ - onKeyUp: function(e) { - if (!this.isEditing || this._copyDone || this.inCompositionMode) { - this._copyDone = false; - return; - } - if ((e.keyCode in this.ctrlKeysMapUp) && (e.ctrlKey || e.metaKey)) { - this[this.ctrlKeysMapUp[e.keyCode]](e); - } - else { - return; - } - e.stopImmediatePropagation(); - e.preventDefault(); - this.canvas && this.canvas.requestRenderAll(); - }, - - /** - * Handles onInput event - * @param {Event} e Event object - */ - onInput: function(e) { - var fromPaste = this.fromPaste; - this.fromPaste = false; - e && e.stopPropagation(); - if (!this.isEditing) { - return; - } - // decisions about style changes. - var nextText = this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText, - charCount = this._text.length, - nextCharCount = nextText.length, - removedText, insertedText, - charDiff = nextCharCount - charCount, - selectionStart = this.selectionStart, selectionEnd = this.selectionEnd, - selection = selectionStart !== selectionEnd, - copiedStyle, removeFrom, removeTo; - if (this.hiddenTextarea.value === '') { - this.styles = { }; - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - return; - } - - var textareaSelection = this.fromStringToGraphemeSelection( - this.hiddenTextarea.selectionStart, - this.hiddenTextarea.selectionEnd, - this.hiddenTextarea.value - ); - var backDelete = selectionStart > textareaSelection.selectionStart; - - if (selection) { - removedText = this._text.slice(selectionStart, selectionEnd); - charDiff += selectionEnd - selectionStart; - } - else if (nextCharCount < charCount) { - if (backDelete) { - removedText = this._text.slice(selectionEnd + charDiff, selectionEnd); - } - else { - removedText = this._text.slice(selectionStart, selectionStart - charDiff); - } - } - insertedText = nextText.slice(textareaSelection.selectionEnd - charDiff, textareaSelection.selectionEnd); - if (removedText && removedText.length) { - if (insertedText.length) { - // let's copy some style before deleting. - // we want to copy the style before the cursor OR the style at the cursor if selection - // is bigger than 0. - copiedStyle = this.getSelectionStyles(selectionStart, selectionStart + 1, false); - // now duplicate the style one for each inserted text. - copiedStyle = insertedText.map(function() { - // this return an array of references, but that is fine since we are - // copying the style later. - return copiedStyle[0]; - }); - } - if (selection) { - removeFrom = selectionStart; - removeTo = selectionEnd; - } - else if (backDelete) { - // detect differences between forwardDelete and backDelete - removeFrom = selectionEnd - removedText.length; - removeTo = selectionEnd; - } - else { - removeFrom = selectionEnd; - removeTo = selectionEnd + removedText.length; - } - this.removeStyleFromTo(removeFrom, removeTo); - } - if (insertedText.length) { - if (fromPaste && insertedText.join('') === fabric.copiedText && !fabric.disableStyleCopyPaste) { - copiedStyle = fabric.copiedTextStyle; - } - this.insertNewStyleBlock(insertedText, selectionStart, copiedStyle); - } - this.updateFromTextArea(); - this.fire('changed'); - if (this.canvas) { - this.canvas.fire('text:changed', { target: this }); - this.canvas.requestRenderAll(); - } - }, - /** - * Composition start - */ - onCompositionStart: function() { - this.inCompositionMode = true; - }, - - /** - * Composition end - */ - onCompositionEnd: function() { - this.inCompositionMode = false; - }, - - // /** - // * Composition update - // */ - onCompositionUpdate: function(e) { - this.compositionStart = e.target.selectionStart; - this.compositionEnd = e.target.selectionEnd; - this.updateTextareaPosition(); - }, - - /** - * Copies selected text - * @param {Event} e Event object - */ - copy: function() { - if (this.selectionStart === this.selectionEnd) { - //do not cut-copy if no selection - return; - } - - fabric.copiedText = this.getSelectedText(); - if (!fabric.disableStyleCopyPaste) { - fabric.copiedTextStyle = this.getSelectionStyles(this.selectionStart, this.selectionEnd, true); - } - else { - fabric.copiedTextStyle = null; - } - this._copyDone = true; - }, - - /** - * Pastes text - * @param {Event} e Event object - */ - paste: function() { - this.fromPaste = true; - }, - - /** - * @private - * @param {Event} e Event object - * @return {Object} Clipboard data object - */ - _getClipboardData: function(e) { - return (e && e.clipboardData) || fabric.window.clipboardData; - }, - - /** - * Finds the width in pixels before the cursor on the same line - * @private - * @param {Number} lineIndex - * @param {Number} charIndex - * @return {Number} widthBeforeCursor width before cursor - */ - _getWidthBeforeCursor: function(lineIndex, charIndex) { - var widthBeforeCursor = this._getLineLeftOffset(lineIndex), bound; - - if (charIndex > 0) { - bound = this.__charBounds[lineIndex][charIndex - 1]; - widthBeforeCursor += bound.left + bound.width; - } - return widthBeforeCursor; - }, - - /** - * Gets start offset of a selection - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getDownCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - // if on last line, down cursor goes to end of line - if (lineIndex === this._textLines.length - 1 || e.metaKey || e.keyCode === 34) { - // move to the end of a text - return this._text.length - selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex + 1, widthBeforeCursor), - textAfterCursor = this._textLines[lineIndex].slice(charIndex); - return textAfterCursor.length + indexOnOtherLine + 1 + this.missingNewlineOffset(lineIndex); - }, - - /** - * private - * Helps finding if the offset should be counted from Start or End - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - _getSelectionForOffset: function(e, isRight) { - if (e.shiftKey && this.selectionStart !== this.selectionEnd && isRight) { - return this.selectionEnd; - } - else { - return this.selectionStart; - } - }, - - /** - * @param {Event} e Event object - * @param {Boolean} isRight - * @return {Number} - */ - getUpCursorOffset: function(e, isRight) { - var selectionProp = this._getSelectionForOffset(e, isRight), - cursorLocation = this.get2DCursorLocation(selectionProp), - lineIndex = cursorLocation.lineIndex; - if (lineIndex === 0 || e.metaKey || e.keyCode === 33) { - // if on first line, up cursor goes to start of line - return -selectionProp; - } - var charIndex = cursorLocation.charIndex, - widthBeforeCursor = this._getWidthBeforeCursor(lineIndex, charIndex), - indexOnOtherLine = this._getIndexOnLine(lineIndex - 1, widthBeforeCursor), - textBeforeCursor = this._textLines[lineIndex].slice(0, charIndex), - missingNewlineOffset = this.missingNewlineOffset(lineIndex - 1); - // return a negative offset - return -this._textLines[lineIndex - 1].length - + indexOnOtherLine - textBeforeCursor.length + (1 - missingNewlineOffset); - }, - - /** - * for a given width it founds the matching character. - * @private - */ - _getIndexOnLine: function(lineIndex, width) { - - var line = this._textLines[lineIndex], - lineLeftOffset = this._getLineLeftOffset(lineIndex), - widthOfCharsOnLine = lineLeftOffset, - indexOnLine = 0, charWidth, foundMatch; - - for (var j = 0, jlen = line.length; j < jlen; j++) { - charWidth = this.__charBounds[lineIndex][j].width; - widthOfCharsOnLine += charWidth; - if (widthOfCharsOnLine > width) { - foundMatch = true; - var leftEdge = widthOfCharsOnLine - charWidth, - rightEdge = widthOfCharsOnLine, - offsetFromLeftEdge = Math.abs(leftEdge - width), - offsetFromRightEdge = Math.abs(rightEdge - width); - - indexOnLine = offsetFromRightEdge < offsetFromLeftEdge ? j : (j - 1); - break; - } - } - - // reached end - if (!foundMatch) { - indexOnLine = line.length - 1; - } - - return indexOnLine; - }, - - - /** - * Moves cursor down - * @param {Event} e Event object - */ - moveCursorDown: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorUpOrDown('Down', e); - }, - - /** - * Moves cursor up - * @param {Event} e Event object - */ - moveCursorUp: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorUpOrDown('Up', e); - }, - - /** - * Moves cursor up or down, fires the events - * @param {String} direction 'Up' or 'Down' - * @param {Event} e Event object - */ - _moveCursorUpOrDown: function(direction, e) { - // getUpCursorOffset - // getDownCursorOffset - var action = 'get' + direction + 'CursorOffset', - offset = this[action](e, this._selectionDirection === 'right'); - if (e.shiftKey) { - this.moveCursorWithShift(offset); - } - else { - this.moveCursorWithoutShift(offset); - } - if (offset !== 0) { - this.setSelectionInBoundaries(); - this.abortCursorAnimation(); - this._currentCursorOpacity = 1; - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor with shift - * @param {Number} offset - */ - moveCursorWithShift: function(offset) { - var newSelection = this._selectionDirection === 'left' - ? this.selectionStart + offset - : this.selectionEnd + offset; - this.setSelectionStartEndWithShift(this.selectionStart, this.selectionEnd, newSelection); - return offset !== 0; - }, - - /** - * Moves cursor up without shift - * @param {Number} offset - */ - moveCursorWithoutShift: function(offset) { - if (offset < 0) { - this.selectionStart += offset; - this.selectionEnd = this.selectionStart; - } - else { - this.selectionEnd += offset; - this.selectionStart = this.selectionEnd; - } - return offset !== 0; - }, - - /** - * Moves cursor left - * @param {Event} e Event object - */ - moveCursorLeft: function(e) { - if (this.selectionStart === 0 && this.selectionEnd === 0) { - return; - } - this._moveCursorLeftOrRight('Left', e); - }, - - /** - * @private - * @return {Boolean} true if a change happened - */ - _move: function(e, prop, direction) { - var newValue; - if (e.altKey) { - newValue = this['findWordBoundary' + direction](this[prop]); - } - else if (e.metaKey || e.keyCode === 35 || e.keyCode === 36 ) { - newValue = this['findLineBoundary' + direction](this[prop]); - } - else { - this[prop] += direction === 'Left' ? -1 : 1; - return true; - } - if (typeof newValue !== undefined && this[prop] !== newValue) { - this[prop] = newValue; - return true; - } - }, - - /** - * @private - */ - _moveLeft: function(e, prop) { - return this._move(e, prop, 'Left'); - }, - - /** - * @private - */ - _moveRight: function(e, prop) { - return this._move(e, prop, 'Right'); - }, - - /** - * Moves cursor left without keeping selection - * @param {Event} e - */ - moveCursorLeftWithoutShift: function(e) { - var change = true; - this._selectionDirection = 'left'; - - // only move cursor when there is no selection, - // otherwise we discard it, and leave cursor on same place - if (this.selectionEnd === this.selectionStart && this.selectionStart !== 0) { - change = this._moveLeft(e, 'selectionStart'); - - } - this.selectionEnd = this.selectionStart; - return change; - }, - - /** - * Moves cursor left while keeping selection - * @param {Event} e - */ - moveCursorLeftWithShift: function(e) { - if (this._selectionDirection === 'right' && this.selectionStart !== this.selectionEnd) { - return this._moveLeft(e, 'selectionEnd'); - } - else if (this.selectionStart !== 0){ - this._selectionDirection = 'left'; - return this._moveLeft(e, 'selectionStart'); - } - }, - - /** - * Moves cursor right - * @param {Event} e Event object - */ - moveCursorRight: function(e) { - if (this.selectionStart >= this._text.length && this.selectionEnd >= this._text.length) { - return; - } - this._moveCursorLeftOrRight('Right', e); - }, - - /** - * Moves cursor right or Left, fires event - * @param {String} direction 'Left', 'Right' - * @param {Event} e Event object - */ - _moveCursorLeftOrRight: function(direction, e) { - var actionName = 'moveCursor' + direction + 'With'; - this._currentCursorOpacity = 1; - - if (e.shiftKey) { - actionName += 'Shift'; - } - else { - actionName += 'outShift'; - } - if (this[actionName](e)) { - this.abortCursorAnimation(); - this.initDelayedCursor(); - this._fireSelectionChanged(); - this._updateTextarea(); - } - }, - - /** - * Moves cursor right while keeping selection - * @param {Event} e - */ - moveCursorRightWithShift: function(e) { - if (this._selectionDirection === 'left' && this.selectionStart !== this.selectionEnd) { - return this._moveRight(e, 'selectionStart'); - } - else if (this.selectionEnd !== this._text.length) { - this._selectionDirection = 'right'; - return this._moveRight(e, 'selectionEnd'); - } - }, - - /** - * Moves cursor right without keeping selection - * @param {Event} e Event object - */ - moveCursorRightWithoutShift: function(e) { - var changed = true; - this._selectionDirection = 'right'; - - if (this.selectionStart === this.selectionEnd) { - changed = this._moveRight(e, 'selectionStart'); - this.selectionEnd = this.selectionStart; - } - else { - this.selectionStart = this.selectionEnd; - } - return changed; - }, - - /** - * Removes characters from start/end - * start/end ar per grapheme position in _text array. - * - * @param {Number} start - * @param {Number} end default to start + 1 - */ - removeChars: function(start, end) { - if (typeof end === 'undefined') { - end = start + 1; - } - this.removeStyleFromTo(start, end); - this._text.splice(start, end - start); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - - /** - * insert characters at start position, before start position. - * start equal 1 it means the text get inserted between actual grapheme 0 and 1 - * if style array is provided, it must be as the same length of text in graphemes - * if end is provided and is bigger than start, old text is replaced. - * start/end ar per grapheme position in _text array. - * - * @param {String} text text to insert - * @param {Array} style array of style objects - * @param {Number} start - * @param {Number} end default to start + 1 - */ - insertChars: function(text, style, start, end) { - if (typeof end === 'undefined') { - end = start; - } - if (end > start) { - this.removeStyleFromTo(start, end); - } - var graphemes = fabric.util.string.graphemeSplit(text); - this.insertNewStyleBlock(graphemes, start, style); - this._text = [].concat(this._text.slice(0, start), graphemes, this._text.slice(end)); - this.text = this._text.join(''); - this.set('dirty', true); - if (this._shouldClearDimensionCache()) { - this.initDimensions(); - this.setCoords(); - } - this._removeExtraneousStyles(); - }, - -}); - - -/* _TO_SVG_START_ */ -(function() { - var toFixed = fabric.util.toFixed, - multipleSpacesRegex = / +/g; - - fabric.util.object.extend(fabric.Text.prototype, /** @lends fabric.Text.prototype */ { - - /** - * Returns SVG representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - _toSVG: function() { - var offsets = this._getSVGLeftTopOffsets(), - textAndBg = this._getSVGTextAndBg(offsets.textTop, offsets.textLeft); - return this._wrapSVGTextAndBg(textAndBg); - }, - - /** - * Returns svg representation of an instance - * @param {Function} [reviver] Method for further parsing of svg representation. - * @return {String} svg representation of an instance - */ - toSVG: function(reviver) { - return this._createBaseSVGMarkup( - this._toSVG(), - { reviver: reviver, noStyle: true, withShadow: true } - ); - }, - - /** - * @private - */ - _getSVGLeftTopOffsets: function() { - return { - textLeft: -this.width / 2, - textTop: -this.height / 2, - lineTop: this.getHeightOfLine(0) - }; - }, - - /** - * @private - */ - _wrapSVGTextAndBg: function(textAndBg) { - var noShadow = true, - textDecoration = this.getSvgTextDecoration(this); - return [ - textAndBg.textBgRects.join(''), - '\t\t', - textAndBg.textSpans.join(''), - '\n' - ]; - }, - - /** - * @private - * @param {Number} textTopOffset Text top offset - * @param {Number} textLeftOffset Text left offset - * @return {Object} - */ - _getSVGTextAndBg: function(textTopOffset, textLeftOffset) { - var textSpans = [], - textBgRects = [], - height = textTopOffset, lineOffset; - // bounding-box background - this._setSVGBg(textBgRects); - - // text and text-background - for (var i = 0, len = this._textLines.length; i < len; i++) { - lineOffset = this._getLineLeftOffset(i); - if (this.textBackgroundColor || this.styleHas('textBackgroundColor', i)) { - this._setSVGTextLineBg(textBgRects, i, textLeftOffset + lineOffset, height); - } - this._setSVGTextLineText(textSpans, i, textLeftOffset + lineOffset, height); - height += this.getHeightOfLine(i); - } - - return { - textSpans: textSpans, - textBgRects: textBgRects - }; - }, - - /** - * @private - */ - _createTextCharSpan: function(_char, styleDecl, left, top) { - var shouldUseWhitespace = _char !== _char.trim() || _char.match(multipleSpacesRegex), - styleProps = this.getSvgSpanStyles(styleDecl, shouldUseWhitespace), - fillStyles = styleProps ? 'style="' + styleProps + '"' : '', - dy = styleDecl.deltaY, dySpan = '', - NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - if (dy) { - dySpan = ' dy="' + toFixed(dy, NUM_FRACTION_DIGITS) + '" '; - } - return [ - '', - fabric.util.string.escapeXml(_char), - '' - ].join(''); - }, - - _setSVGTextLineText: function(textSpans, lineIndex, textLeftOffset, textTopOffset) { - // set proper line offset - var lineHeight = this.getHeightOfLine(lineIndex), - isJustify = this.textAlign.indexOf('justify') !== -1, - actualStyle, - nextStyle, - charsToRender = '', - charBox, style, - boxWidth = 0, - line = this._textLines[lineIndex], - timeToRender; - - textTopOffset += lineHeight * (1 - this._fontSizeFraction) / this.lineHeight; - for (var i = 0, len = line.length - 1; i <= len; i++) { - timeToRender = i === len || this.charSpacing; - charsToRender += line[i]; - charBox = this.__charBounds[lineIndex][i]; - if (boxWidth === 0) { - textLeftOffset += charBox.kernedWidth - charBox.width; - boxWidth += charBox.width; - } - else { - boxWidth += charBox.kernedWidth; - } - if (isJustify && !timeToRender) { - if (this._reSpaceAndTab.test(line[i])) { - timeToRender = true; - } - } - if (!timeToRender) { - // if we have charSpacing, we render char by char - actualStyle = actualStyle || this.getCompleteStyleDeclaration(lineIndex, i); - nextStyle = this.getCompleteStyleDeclaration(lineIndex, i + 1); - timeToRender = this._hasStyleChangedForSvg(actualStyle, nextStyle); - } - if (timeToRender) { - style = this._getStyleDeclaration(lineIndex, i) || { }; - textSpans.push(this._createTextCharSpan(charsToRender, style, textLeftOffset, textTopOffset)); - charsToRender = ''; - actualStyle = nextStyle; - textLeftOffset += boxWidth; - boxWidth = 0; - } - } - }, - - _pushTextBgRect: function(textBgRects, color, left, top, width, height) { - var NUM_FRACTION_DIGITS = fabric.Object.NUM_FRACTION_DIGITS; - textBgRects.push( - '\t\t\n'); - }, - - _setSVGTextLineBg: function(textBgRects, i, leftOffset, textTopOffset) { - var line = this._textLines[i], - heightOfLine = this.getHeightOfLine(i) / this.lineHeight, - boxWidth = 0, - boxStart = 0, - charBox, currentColor, - lastColor = this.getValueOfPropertyAt(i, 0, 'textBackgroundColor'); - for (var j = 0, jlen = line.length; j < jlen; j++) { - charBox = this.__charBounds[i][j]; - currentColor = this.getValueOfPropertyAt(i, j, 'textBackgroundColor'); - if (currentColor !== lastColor) { - lastColor && this._pushTextBgRect(textBgRects, lastColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - boxStart = charBox.left; - boxWidth = charBox.width; - lastColor = currentColor; - } - else { - boxWidth += charBox.kernedWidth; - } - } - currentColor && this._pushTextBgRect(textBgRects, currentColor, leftOffset + boxStart, - textTopOffset, boxWidth, heightOfLine); - }, - - /** - * Adobe Illustrator (at least CS5) is unable to render rgba()-based fill values - * we work around it by "moving" alpha channel into opacity attribute and setting fill's alpha to 1 - * - * @private - * @param {*} value - * @return {String} - */ - _getFillAttributes: function(value) { - var fillColor = (value && typeof value === 'string') ? new fabric.Color(value) : ''; - if (!fillColor || !fillColor.getSource() || fillColor.getAlpha() === 1) { - return 'fill="' + value + '"'; - } - return 'opacity="' + fillColor.getAlpha() + '" fill="' + fillColor.setAlpha(1).toRgb() + '"'; - }, - - /** - * @private - */ - _getSVGLineTopOffset: function(lineIndex) { - var lineTopOffset = 0, lastHeight = 0; - for (var j = 0; j < lineIndex; j++) { - lineTopOffset += this.getHeightOfLine(j); - } - lastHeight = this.getHeightOfLine(j); - return { - lineTop: lineTopOffset, - offset: (this._fontSizeMult - this._fontSizeFraction) * lastHeight / (this.lineHeight * this._fontSizeMult) - }; - }, - - /** - * Returns styles-string for svg-export - * @param {Boolean} skipShadow a boolean to skip shadow filter output - * @return {String} - */ - getSvgStyles: function(skipShadow) { - var svgStyle = fabric.Object.prototype.getSvgStyles.call(this, skipShadow); - return svgStyle + ' white-space: pre;'; - }, - }); -})(); -/* _TO_SVG_END_ */ - - -(function(global) { - - 'use strict'; - - var fabric = global.fabric || (global.fabric = {}); - - /** - * Textbox class, based on IText, allows the user to resize the text rectangle - * and wraps lines automatically. Textboxes have their Y scaling locked, the - * user can only change width. Height is adjusted automatically based on the - * wrapping of lines. - * @class fabric.Textbox - * @extends fabric.IText - * @mixes fabric.Observable - * @return {fabric.Textbox} thisArg - * @see {@link fabric.Textbox#initialize} for constructor definition - */ - fabric.Textbox = fabric.util.createClass(fabric.IText, fabric.Observable, { - - /** - * Type of an object - * @type String - * @default - */ - type: 'textbox', - - /** - * Minimum width of textbox, in pixels. - * @type Number - * @default - */ - minWidth: 20, - - /** - * Minimum calculated width of a textbox, in pixels. - * fixed to 2 so that an empty textbox cannot go to 0 - * and is still selectable without text. - * @type Number - * @default - */ - dynamicMinWidth: 2, - - /** - * Cached array of text wrapping. - * @type Array - */ - __cachedLines: null, - - /** - * Override standard Object class values - */ - lockScalingFlip: true, - - /** - * Override standard Object class values - * Textbox needs this on false - */ - noScaleCache: false, - - /** - * Properties which when set cause object to change dimensions - * @type Object - * @private - */ - _dimensionAffectingProps: fabric.Text.prototype._dimensionAffectingProps.concat('width'), - - /** - * Use this regular expression to split strings in breakable lines - * @private - */ - _wordJoiners: /[ \t\r]/, - - /** - * Use this boolean property in order to split strings that have no white space concept. - * this is a cheap way to help with chinese/japanese - * @type Boolean - * @since 2.6.0 - */ - splitByGrapheme: false, - - /** - * Unlike superclass's version of this function, Textbox does not update - * its width. - * @private - * @override - */ - initDimensions: function() { - if (this.__skipDimension) { - return; - } - this.isEditing && this.initDelayedCursor(); - this.clearContextTop(); - this._clearCache(); - // clear dynamicMinWidth as it will be different after we re-wrap line - this.dynamicMinWidth = 0; - // wrap lines - this._styleMap = this._generateStyleMap(this._splitText()); - // if after wrapping, the width is smaller than dynamicMinWidth, change the width and re-wrap - if (this.dynamicMinWidth > this.width) { - this._set('width', this.dynamicMinWidth); - } - if (this.textAlign.indexOf('justify') !== -1) { - // once text is measured we need to make space fatter to make justified text. - this.enlargeSpaces(); - } - // clear cache and re-calculate height - this.height = this.calcTextHeight(); - this.saveState({ propertySet: '_dimensionAffectingProps' }); - }, - - /** - * Generate an object that translates the style object so that it is - * broken up by visual lines (new lines and automatic wrapping). - * The original text styles object is broken up by actual lines (new lines only), - * which is only sufficient for Text / IText - * @private - */ - _generateStyleMap: function(textInfo) { - var realLineCount = 0, - realLineCharCount = 0, - charCount = 0, - map = {}; - - for (var i = 0; i < textInfo.graphemeLines.length; i++) { - if (textInfo.graphemeText[charCount] === '\n' && i > 0) { - realLineCharCount = 0; - charCount++; - realLineCount++; - } - else if (!this.splitByGrapheme && this._reSpaceAndTab.test(textInfo.graphemeText[charCount]) && i > 0) { - // this case deals with space's that are removed from end of lines when wrapping - realLineCharCount++; - charCount++; - } - - map[i] = { line: realLineCount, offset: realLineCharCount }; - - charCount += textInfo.graphemeLines[i].length; - realLineCharCount += textInfo.graphemeLines[i].length; - } - - return map; - }, - - /** - * Returns true if object has a style property or has it on a specified line - * @param {Number} lineIndex - * @return {Boolean} - */ - styleHas: function(property, lineIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (map) { - lineIndex = map.line; - } - } - return fabric.Text.prototype.styleHas.call(this, property, lineIndex); - }, - - /** - * Returns true if object has no styling or no styling in a line - * @param {Number} lineIndex , lineIndex is on wrapped lines. - * @return {Boolean} - */ - isEmptyStyles: function(lineIndex) { - if (!this.styles) { - return true; - } - var offset = 0, nextLineIndex = lineIndex + 1, nextOffset, obj, shouldLimit = false, - map = this._styleMap[lineIndex], mapNextLine = this._styleMap[lineIndex + 1]; - if (map) { - lineIndex = map.line; - offset = map.offset; - } - if (mapNextLine) { - nextLineIndex = mapNextLine.line; - shouldLimit = nextLineIndex === lineIndex; - nextOffset = mapNextLine.offset; - } - obj = typeof lineIndex === 'undefined' ? this.styles : { line: this.styles[lineIndex] }; - for (var p1 in obj) { - for (var p2 in obj[p1]) { - if (p2 >= offset && (!shouldLimit || p2 < nextOffset)) { - // eslint-disable-next-line no-unused-vars - for (var p3 in obj[p1][p2]) { - return false; - } - } - } - } - return true; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _getStyleDeclaration: function(lineIndex, charIndex) { - if (this._styleMap && !this.isWrapping) { - var map = this._styleMap[lineIndex]; - if (!map) { - return null; - } - lineIndex = map.line; - charIndex = map.offset + charIndex; - } - return this.callSuper('_getStyleDeclaration', lineIndex, charIndex); - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @param {Object} style - * @private - */ - _setStyleDeclaration: function(lineIndex, charIndex, style) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - - this.styles[lineIndex][charIndex] = style; - }, - - /** - * @param {Number} lineIndex - * @param {Number} charIndex - * @private - */ - _deleteStyleDeclaration: function(lineIndex, charIndex) { - var map = this._styleMap[lineIndex]; - lineIndex = map.line; - charIndex = map.offset + charIndex; - delete this.styles[lineIndex][charIndex]; - }, - - /** - * probably broken need a fix - * Returns the real style line that correspond to the wrapped lineIndex line - * Used just to verify if the line does exist or not. - * @param {Number} lineIndex - * @returns {Boolean} if the line exists or not - * @private - */ - _getLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - return !!this.styles[map.line]; - }, - - /** - * Set the line style to an empty object so that is initialized - * @param {Number} lineIndex - * @param {Object} style - * @private - */ - _setLineStyle: function(lineIndex) { - var map = this._styleMap[lineIndex]; - this.styles[map.line] = {}; - }, - - /** - * Wraps text using the 'width' property of Textbox. First this function - * splits text on newlines, so we preserve newlines entered by the user. - * Then it wraps each line using the width of the Textbox by calling - * _wrapLine(). - * @param {Array} lines The string array of text that is split into lines - * @param {Number} desiredWidth width you want to wrap to - * @returns {Array} Array of lines - */ - _wrapText: function(lines, desiredWidth) { - var wrapped = [], i; - this.isWrapping = true; - for (i = 0; i < lines.length; i++) { - wrapped = wrapped.concat(this._wrapLine(lines[i], i, desiredWidth)); - } - this.isWrapping = false; - return wrapped; - }, - - /** - * Helper function to measure a string of text, given its lineIndex and charIndex offset - * it gets called when charBounds are not available yet. - * @param {CanvasRenderingContext2D} ctx - * @param {String} text - * @param {number} lineIndex - * @param {number} charOffset - * @returns {number} - * @private - */ - _measureWord: function(word, lineIndex, charOffset) { - var width = 0, prevGrapheme, skipLeft = true; - charOffset = charOffset || 0; - for (var i = 0, len = word.length; i < len; i++) { - var box = this._getGraphemeBox(word[i], lineIndex, i + charOffset, prevGrapheme, skipLeft); - width += box.kernedWidth; - prevGrapheme = word[i]; - } - return width; - }, - - /** - * Wraps a line of text using the width of the Textbox and a context. - * @param {Array} line The grapheme array that represent the line - * @param {Number} lineIndex - * @param {Number} desiredWidth width you want to wrap the line to - * @param {Number} reservedSpace space to remove from wrapping for custom functionalities - * @returns {Array} Array of line(s) into which the given text is wrapped - * to. - */ - _wrapLine: function(_line, lineIndex, desiredWidth, reservedSpace) { - var lineWidth = 0, - splitByGrapheme = this.splitByGrapheme, - graphemeLines = [], - line = [], - // spaces in different languages? - words = splitByGrapheme ? fabric.util.string.graphemeSplit(_line) : _line.split(this._wordJoiners), - word = '', - offset = 0, - infix = splitByGrapheme ? '' : ' ', - wordWidth = 0, - infixWidth = 0, - largestWordWidth = 0, - lineJustStarted = true, - additionalSpace = this._getWidthOfCharSpacing(), - reservedSpace = reservedSpace || 0; - // fix a difference between split and graphemeSplit - if (words.length === 0) { - words.push([]); - } - desiredWidth -= reservedSpace; - for (var i = 0; i < words.length; i++) { - // if using splitByGrapheme words are already in graphemes. - word = splitByGrapheme ? words[i] : fabric.util.string.graphemeSplit(words[i]); - wordWidth = this._measureWord(word, lineIndex, offset); - offset += word.length; - - lineWidth += infixWidth + wordWidth - additionalSpace; - if (lineWidth > desiredWidth && !lineJustStarted) { - graphemeLines.push(line); - line = []; - lineWidth = wordWidth; - lineJustStarted = true; - } - else { - lineWidth += additionalSpace; - } - - if (!lineJustStarted && !splitByGrapheme) { - line.push(infix); - } - line = line.concat(word); - - infixWidth = splitByGrapheme ? 0 : this._measureWord([infix], lineIndex, offset); - offset++; - lineJustStarted = false; - // keep track of largest word - if (wordWidth > largestWordWidth) { - largestWordWidth = wordWidth; - } - } - - i && graphemeLines.push(line); - - if (largestWordWidth + reservedSpace > this.dynamicMinWidth) { - this.dynamicMinWidth = largestWordWidth - additionalSpace + reservedSpace; - } - return graphemeLines; - }, - - /** - * Detect if the text line is ended with an hard break - * text and itext do not have wrapping, return false - * @param {Number} lineIndex text to split - * @return {Boolean} - */ - isEndOfWrapping: function(lineIndex) { - if (!this._styleMap[lineIndex + 1]) { - // is last line, return true; - return true; - } - if (this._styleMap[lineIndex + 1].line !== this._styleMap[lineIndex].line) { - // this is last line before a line break, return true; - return true; - } - return false; - }, - - /** - * Detect if a line has a linebreak and so we need to account for it when moving - * and counting style. - * @return Number - */ - missingNewlineOffset: function(lineIndex) { - if (this.splitByGrapheme) { - return this.isEndOfWrapping(lineIndex) ? 1 : 0; - } - return 1; - }, - - /** - * Gets lines of text to render in the Textbox. This function calculates - * text wrapping on the fly every time it is called. - * @param {String} text text to split - * @returns {Array} Array of lines in the Textbox. - * @override - */ - _splitTextIntoLines: function(text) { - var newText = fabric.Text.prototype._splitTextIntoLines.call(this, text), - graphemeLines = this._wrapText(newText.lines, this.width), - lines = new Array(graphemeLines.length); - for (var i = 0; i < graphemeLines.length; i++) { - lines[i] = graphemeLines[i].join(''); - } - newText.lines = lines; - newText.graphemeLines = graphemeLines; - return newText; - }, - - getMinWidth: function() { - return Math.max(this.minWidth, this.dynamicMinWidth); - }, - - _removeExtraneousStyles: function() { - var linesToKeep = {}; - for (var prop in this._styleMap) { - if (this._textLines[prop]) { - linesToKeep[this._styleMap[prop].line] = 1; - } - } - for (var prop in this.styles) { - if (!linesToKeep[prop]) { - delete this.styles[prop]; - } - } - }, - - /** - * Returns object representation of an instance - * @method toObject - * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output - * @return {Object} object representation of an instance - */ - toObject: function(propertiesToInclude) { - return this.callSuper('toObject', ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)); - } - }); - - /** - * Returns fabric.Textbox instance from an object representation - * @static - * @memberOf fabric.Textbox - * @param {Object} object Object to create an instance from - * @param {Function} [callback] Callback to invoke when an fabric.Textbox instance is created - */ - fabric.Textbox.fromObject = function(object, callback) { - return fabric.Object._fromObject('Textbox', object, callback, 'text'); - }; -})(typeof exports !== 'undefined' ? exports : this); - - -(function() { - - var controlsUtils = fabric.controlsUtils, - scaleSkewStyleHandler = controlsUtils.scaleSkewCursorStyleHandler, - scaleStyleHandler = controlsUtils.scaleCursorStyleHandler, - scalingEqually = controlsUtils.scalingEqually, - scalingYOrSkewingX = controlsUtils.scalingYOrSkewingX, - scalingXOrSkewingY = controlsUtils.scalingXOrSkewingY, - scaleOrSkewActionName = controlsUtils.scaleOrSkewActionName, - objectControls = fabric.Object.prototype.controls; - - objectControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingXOrSkewingY, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mb = new fabric.Control({ - x: 0, - y: 0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.mt = new fabric.Control({ - x: 0, - y: -0.5, - cursorStyleHandler: scaleSkewStyleHandler, - actionHandler: scalingYOrSkewingX, - getActionName: scaleOrSkewActionName, - }); - - objectControls.tl = new fabric.Control({ - x: -0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.tr = new fabric.Control({ - x: 0.5, - y: -0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.bl = new fabric.Control({ - x: -0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.br = new fabric.Control({ - x: 0.5, - y: 0.5, - cursorStyleHandler: scaleStyleHandler, - actionHandler: scalingEqually - }); - - objectControls.mtr = new fabric.Control({ - x: 0, - y: -0.5, - actionHandler: controlsUtils.rotationWithSnapping, - cursorStyleHandler: controlsUtils.rotationStyleHandler, - offsetY: -40, - withConnection: true, - actionName: 'rotate', - }); - - if (fabric.Textbox) { - // this is breaking the prototype inheritance, no time / ideas to fix it. - // is important to document that if you want to have all objects to have a - // specific custom control, you have to add it to Object prototype and to Textbox - // prototype. The controls are shared as references. So changes to control `tr` - // can still apply to all objects if needed. - var textBoxControls = fabric.Textbox.prototype.controls = { }; - - textBoxControls.mtr = objectControls.mtr; - textBoxControls.tr = objectControls.tr; - textBoxControls.br = objectControls.br; - textBoxControls.tl = objectControls.tl; - textBoxControls.bl = objectControls.bl; - textBoxControls.mt = objectControls.mt; - textBoxControls.mb = objectControls.mb; - - textBoxControls.mr = new fabric.Control({ - x: 0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - - textBoxControls.ml = new fabric.Control({ - x: -0.5, - y: 0, - actionHandler: controlsUtils.changeWidth, - cursorStyleHandler: scaleSkewStyleHandler, - actionName: 'resizing', - }); - } -})(); - diff --git a/web/static/js9_old/js/fabric-v5.2.1.min.js b/web/static/js9_old/js/fabric-v5.2.1.min.js deleted file mode 100644 index 38f1c3d..0000000 --- a/web/static/js9_old/js/fabric-v5.2.1.min.js +++ /dev/null @@ -1 +0,0 @@ -var fabric=fabric||{version:"5.2.1"};if("undefined"!=typeof exports?exports.fabric=fabric:"function"==typeof define&&define.amd&&define([],function(){return fabric}),"undefined"!=typeof document&&"undefined"!=typeof window)document instanceof("undefined"!=typeof HTMLDocument?HTMLDocument:Document)?fabric.document=document:fabric.document=document.implementation.createHTMLDocument(""),fabric.window=window;else{var jsdom=require("jsdom"),virtualWindow=new jsdom.JSDOM(decodeURIComponent("%3C!DOCTYPE%20html%3E%3Chtml%3E%3Chead%3E%3C%2Fhead%3E%3Cbody%3E%3C%2Fbody%3E%3C%2Fhtml%3E"),{features:{FetchExternalResources:["img"]},resources:"usable"}).window;fabric.document=virtualWindow.document,fabric.jsdomImplForWrapper=require("jsdom/lib/jsdom/living/generated/utils").implForWrapper,fabric.nodeCanvas=require("jsdom/lib/jsdom/utils").Canvas,fabric.window=virtualWindow,DOMParser=fabric.window.DOMParser}function resizeCanvasIfNeeded(t){var e=t.targetCanvas,i=e.width,r=e.height,n=t.destinationWidth,s=t.destinationHeight;i===n&&r===s||(e.width=n,e.height=s)}function copyGLTo2DDrawImage(t,e){var i=t.canvas,r=e.targetCanvas,n=r.getContext("2d");n.translate(0,r.height),n.scale(1,-1);var s=i.height-r.height;n.drawImage(i,0,s,r.width,r.height,0,0,r.width,r.height)}function copyGLTo2DPutImageData(t,e){var i=e.targetCanvas.getContext("2d"),r=e.destinationWidth,n=e.destinationHeight,s=r*n*4,o=new Uint8Array(this.imageBuffer,0,s),a=new Uint8ClampedArray(this.imageBuffer,0,s);t.readPixels(0,0,r,n,t.RGBA,t.UNSIGNED_BYTE,o);var c=new ImageData(a,r,n);i.putImageData(c,0,0)}fabric.isTouchSupported="ontouchstart"in fabric.window||"ontouchstart"in fabric.document||fabric.window&&fabric.window.navigator&&0_)for(var C=1,S=d.length;Ct[i-2].x?1:n.x===t[i-2].x?0:-1,c=n.y>t[i-2].y?1:n.y===t[i-2].y?0:-1),r.push(["L",n.x+a*e,n.y+c*e]),r},fabric.util.getPathSegmentsInfo=l,fabric.util.getBoundsOfCurve=function(t,e,i,r,n,s,o,a){var c;if(fabric.cachesBoundsOfCurve&&(c=D.call(arguments),fabric.boundsOfCurveCache[c]))return fabric.boundsOfCurveCache[c];var h,l,u,f,d,g,p,v,m=Math.sqrt,b=Math.min,y=Math.max,_=Math.abs,x=[],C=[[],[]];l=6*t-12*i+6*n,h=-3*t+9*i-9*n+3*o,u=3*i-3*t;for(var S=0;S<2;++S)if(0/g,">")},graphemeSplit:function(t){var e,i=0,r=[];for(i=0;it.x&&this.y>t.y},gte:function(t){return this.x>=t.x&&this.y>=t.y},lerp:function(t,e){return void 0===e&&(e=.5),e=Math.max(Math.min(1,e),0),new i(this.x+(t.x-this.x)*e,this.y+(t.y-this.y)*e)},distanceFrom:function(t){var e=this.x-t.x,i=this.y-t.y;return Math.sqrt(e*e+i*i)},midPointFrom:function(t){return this.lerp(t)},min:function(t){return new i(Math.min(this.x,t.x),Math.min(this.y,t.y))},max:function(t){return new i(Math.max(this.x,t.x),Math.max(this.y,t.y))},toString:function(){return this.x+","+this.y},setXY:function(t,e){return this.x=t,this.y=e,this},setX:function(t){return this.x=t,this},setY:function(t){return this.y=t,this},setFromPoint:function(t){return this.x=t.x,this.y=t.y,this},swap:function(t){var e=this.x,i=this.y;this.x=t.x,this.y=t.y,t.x=e,t.y=i},clone:function(){return new i(this.x,this.y)}}}("undefined"!=typeof exports?exports:this),function(t){"use strict";var f=t.fabric||(t.fabric={});function d(t){this.status=t,this.points=[]}f.Intersection?f.warn("fabric.Intersection is already defined"):(f.Intersection=d,f.Intersection.prototype={constructor:d,appendPoint:function(t){return this.points.push(t),this},appendPoints:function(t){return this.points=this.points.concat(t),this}},f.Intersection.intersectLineLine=function(t,e,i,r){var n,s=(r.x-i.x)*(t.y-i.y)-(r.y-i.y)*(t.x-i.x),o=(e.x-t.x)*(t.y-i.y)-(e.y-t.y)*(t.x-i.x),a=(r.y-i.y)*(e.x-t.x)-(r.x-i.x)*(e.y-t.y);if(0!==a){var c=s/a,h=o/a;0<=c&&c<=1&&0<=h&&h<=1?(n=new d("Intersection")).appendPoint(new f.Point(t.x+c*(e.x-t.x),t.y+c*(e.y-t.y))):n=new d}else n=new d(0===s||0===o?"Coincident":"Parallel");return n},f.Intersection.intersectLinePolygon=function(t,e,i){var r,n,s,o,a=new d,c=i.length;for(o=0;o=c&&(h.x-=c),h.x<=-c&&(h.x+=c),h.y>=c&&(h.y-=c),h.y<=c&&(h.y+=c),h.x-=o.offsetX,h.y-=o.offsetY,h}function y(t){return t.flipX!==t.flipY}function _(t,e,i,r,n){if(0!==t[e]){var s=n/t._getTransformedDimensions()[r]*t[i];t.set(i,s)}}function x(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(0,s.skewY),a=P(e,e.originX,e.originY,i,r),c=Math.abs(2*a.x)-o.x,h=s.skewX;c<2?n=0:(n=v(Math.atan2(c/s.scaleX,o.y/s.scaleY)),e.originX===f&&e.originY===p&&(n=-n),e.originX===g&&e.originY===d&&(n=-n),y(s)&&(n=-n));var l=h!==n;if(l){var u=s._getTransformedDimensions().y;s.set("skewX",n),_(s,"skewY","scaleY","y",u)}return l}function C(t,e,i,r){var n,s=e.target,o=s._getTransformedDimensions(s.skewX,0),a=P(e,e.originX,e.originY,i,r),c=Math.abs(2*a.y)-o.y,h=s.skewY;c<2?n=0:(n=v(Math.atan2(c/s.scaleY,o.x/s.scaleX)),e.originX===f&&e.originY===p&&(n=-n),e.originX===g&&e.originY===d&&(n=-n),y(s)&&(n=-n));var l=h!==n;if(l){var u=s._getTransformedDimensions().x;s.set("skewY",n),_(s,"skewX","scaleX","x",u)}return l}function E(t,e,i,r,n){n=n||{};var s,o,a,c,h,l,u=e.target,f=u.lockScalingX,d=u.lockScalingY,g=n.by,p=w(t,u),v=k(u,g,p),m=e.gestureScale;if(v)return!1;if(m)o=e.scaleX*m,a=e.scaleY*m;else{if(s=P(e,e.originX,e.originY,i,r),h="y"!==g?T(s.x):1,l="x"!==g?T(s.y):1,e.signX||(e.signX=h),e.signY||(e.signY=l),u.lockScalingFlip&&(e.signX!==h||e.signY!==l))return!1;if(c=u._getTransformedDimensions(),p&&!g){var b=Math.abs(s.x)+Math.abs(s.y),y=e.original,_=b/(Math.abs(c.x*y.scaleX/u.scaleX)+Math.abs(c.y*y.scaleY/u.scaleY));o=y.scaleX*_,a=y.scaleY*_}else o=Math.abs(s.x*u.scaleX/c.x),a=Math.abs(s.y*u.scaleY/c.y);O(e)&&(o*=2,a*=2),e.signX!==h&&"y"!==g&&(e.originX=S[e.originX],o*=-1,e.signX=h),e.signY!==l&&"x"!==g&&(e.originY=S[e.originY],a*=-1,e.signY=l)}var x=u.scaleX,C=u.scaleY;return g?("x"===g&&u.set("scaleX",o),"y"===g&&u.set("scaleY",a)):(!f&&u.set("scaleX",o),!d&&u.set("scaleY",a)),x!==u.scaleX||C!==u.scaleY}n.scaleCursorStyleHandler=function(t,e,i){var r=w(t,i),n="";if(0!==e.x&&0===e.y?n="x":0===e.x&&0!==e.y&&(n="y"),k(i,n,r))return"not-allowed";var s=a(i,e);return o[s]+"-resize"},n.skewCursorStyleHandler=function(t,e,i){var r="not-allowed";if(0!==e.x&&i.lockSkewingY)return r;if(0!==e.y&&i.lockSkewingX)return r;var n=a(i,e)%4;return s[n]+"-resize"},n.scaleSkewCursorStyleHandler=function(t,e,i){return t[i.canvas.altActionKey]?n.skewCursorStyleHandler(t,e,i):n.scaleCursorStyleHandler(t,e,i)},n.rotationWithSnapping=b("rotating",m(function(t,e,i,r){var n=e,s=n.target,o=s.translateToOriginPoint(s.getCenterPoint(),n.originX,n.originY);if(s.lockRotation)return!1;var a,c=Math.atan2(n.ey-o.y,n.ex-o.x),h=Math.atan2(r-o.y,i-o.x),l=v(h-c+n.theta);if(0o.r2,h=this.gradientTransform?this.gradientTransform.concat():fabric.iMatrix.concat(),l=-this.offsetX,u=-this.offsetY,f=!!e.additionalTransform,d="pixels"===this.gradientUnits?"userSpaceOnUse":"objectBoundingBox";if(a.sort(function(t,e){return t.offset-e.offset}),"objectBoundingBox"===d?(l/=t.width,u/=t.height):(l+=t.width/2,u+=t.height/2),"path"===t.type&&"percentage"!==this.gradientUnits&&(l-=t.pathOffset.x,u-=t.pathOffset.y),h[4]-=l,h[5]-=u,s='id="SVGID_'+this.id+'" gradientUnits="'+d+'"',s+=' gradientTransform="'+(f?e.additionalTransform+" ":"")+fabric.util.matrixToSVG(h)+'" ',"linear"===this.type?n=["\n']:"radial"===this.type&&(n=["\n']),"radial"===this.type){if(c)for((a=a.concat()).reverse(),i=0,r=a.length;i\n')}return n.push("linear"===this.type?"\n":"\n"),n.join("")},toLive:function(t){var e,i,r,n=fabric.util.object.clone(this.coords);if(this.type){for("linear"===this.type?e=t.createLinearGradient(n.x1,n.y1,n.x2,n.y2):"radial"===this.type&&(e=t.createRadialGradient(n.x1,n.y1,n.r1,n.x2,n.y2,n.r2)),i=0,r=this.colorStops.length;i\n\n\n'},setOptions:function(t){for(var e in t)this[e]=t[e]},toLive:function(t){var e=this.source;if(!e)return"";if(void 0!==e.src){if(!e.complete)return"";if(0===e.naturalWidth||0===e.naturalHeight)return""}return t.createPattern(e,this.repeat)}})}(),function(t){"use strict";var o=t.fabric||(t.fabric={}),a=o.util.toFixed;o.Shadow?o.warn("fabric.Shadow is already defined."):(o.Shadow=o.util.createClass({color:"rgb(0,0,0)",blur:0,offsetX:0,offsetY:0,affectStroke:!1,includeDefaultValues:!0,nonScaling:!1,initialize:function(t){for(var e in"string"==typeof t&&(t=this._parseShadow(t)),t)this[e]=t[e];this.id=o.Object.__uid++},_parseShadow:function(t){var e=t.trim(),i=o.Shadow.reOffsetsAndBlur.exec(e)||[];return{color:(e.replace(o.Shadow.reOffsetsAndBlur,"")||"rgb(0,0,0)").trim(),offsetX:parseFloat(i[1],10)||0,offsetY:parseFloat(i[2],10)||0,blur:parseFloat(i[3],10)||0}},toString:function(){return[this.offsetX,this.offsetY,this.blur,this.color].join("px ")},toSVG:function(t){var e=40,i=40,r=o.Object.NUM_FRACTION_DIGITS,n=o.util.rotateVector({x:this.offsetX,y:this.offsetY},o.util.degreesToRadians(-t.angle)),s=new o.Color(this.color);return t.width&&t.height&&(e=100*a((Math.abs(n.x)+this.blur)/t.width,r)+20,i=100*a((Math.abs(n.y)+this.blur)/t.height,r)+20),t.flipX&&(n.x*=-1),t.flipY&&(n.y*=-1),'\n\t\n\t\n\t\n\t\n\t\n\t\t\n\t\t\n\t\n\n'},toObject:function(){if(this.includeDefaultValues)return{color:this.color,blur:this.blur,offsetX:this.offsetX,offsetY:this.offsetY,affectStroke:this.affectStroke,nonScaling:this.nonScaling};var e={},i=o.Shadow.prototype;return["color","blur","offsetX","offsetY","affectStroke","nonScaling"].forEach(function(t){this[t]!==i[t]&&(e[t]=this[t])},this),e}}),o.Shadow.reOffsetsAndBlur=/(?:\s|^)(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(-?\d+(?:\.\d*)?(?:px)?(?:\s?|$))?(\d+(?:\.\d*)?(?:px)?)?(?:\s?|$)(?:$|\s)/)}("undefined"!=typeof exports?exports:this),function(){"use strict";if(fabric.StaticCanvas)fabric.warn("fabric.StaticCanvas is already defined.");else{var n=fabric.util.object.extend,t=fabric.util.getElementOffset,h=fabric.util.removeFromArray,a=fabric.util.toFixed,s=fabric.util.transformPoint,o=fabric.util.invertTransform,i=fabric.util.getNodeCanvas,r=fabric.util.createCanvasElement,e=new Error("Could not initialize `canvas` element");fabric.StaticCanvas=fabric.util.createClass(fabric.CommonMethods,{initialize:function(t,e){e||(e={}),this.renderAndResetBound=this.renderAndReset.bind(this),this.requestRenderAllBound=this.requestRenderAll.bind(this),this._initStatic(t,e)},backgroundColor:"",backgroundImage:null,overlayColor:"",overlayImage:null,includeDefaultValues:!0,stateful:!1,renderOnAddRemove:!0,controlsAboveOverlay:!1,allowTouchScrolling:!1,imageSmoothingEnabled:!0,viewportTransform:fabric.iMatrix.concat(),backgroundVpt:!0,overlayVpt:!0,enableRetinaScaling:!0,vptCoords:{},skipOffscreen:!0,clipPath:void 0,_initStatic:function(t,e){var i=this.requestRenderAllBound;this._objects=[],this._createLowerCanvas(t),this._initOptions(e),this.interactive||this._initRetinaScaling(),e.overlayImage&&this.setOverlayImage(e.overlayImage,i),e.backgroundImage&&this.setBackgroundImage(e.backgroundImage,i),e.backgroundColor&&this.setBackgroundColor(e.backgroundColor,i),e.overlayColor&&this.setOverlayColor(e.overlayColor,i),this.calcOffset()},_isRetinaScaling:function(){return 1\n'),this._setSVGBgOverlayColor(i,"background"),this._setSVGBgOverlayImage(i,"backgroundImage",e),this._setSVGObjects(i,e),this.clipPath&&i.push("
    \n"),this._setSVGBgOverlayColor(i,"overlay"),this._setSVGBgOverlayImage(i,"overlayImage",e),i.push(""),i.join("")},_setSVGPreamble:function(t,e){e.suppressPreamble||t.push('\n','\n')},_setSVGHeader:function(t,e){var i,r=e.width||this.width,n=e.height||this.height,s='viewBox="0 0 '+this.width+" "+this.height+'" ',o=fabric.Object.NUM_FRACTION_DIGITS;e.viewBox?s='viewBox="'+e.viewBox.x+" "+e.viewBox.y+" "+e.viewBox.width+" "+e.viewBox.height+'" ':this.svgViewportTransformation&&(i=this.viewportTransform,s='viewBox="'+a(-i[4]/i[0],o)+" "+a(-i[5]/i[3],o)+" "+a(this.width/i[0],o)+" "+a(this.height/i[3],o)+'" '),t.push("\n',"Created with Fabric.js ",fabric.version,"\n","\n",this.createSVGFontFacesMarkup(),this.createSVGRefElementsMarkup(),this.createSVGClipPathMarkup(e),"\n")},createSVGClipPathMarkup:function(t){var e=this.clipPath;return e?(e.clipPathId="CLIPPATH_"+fabric.Object.__uid++,'\n'+this.clipPath.toClipPathSVG(t.reviver)+"\n"):""},createSVGRefElementsMarkup:function(){var s=this;return["background","overlay"].map(function(t){var e=s[t+"Color"];if(e&&e.toLive){var i=s[t+"Vpt"],r=s.viewportTransform,n={width:s.width/(i?r[0]:1),height:s.height/(i?r[3]:1)};return e.toSVG(n,{additionalTransform:i?fabric.util.matrixToSVG(r):""})}}).join("")},createSVGFontFacesMarkup:function(){var t,e,i,r,n,s,o,a,c="",h={},l=fabric.fontPaths,u=[];for(this._objects.forEach(function t(e){u.push(e),e._objects&&e._objects.forEach(t)}),o=0,a=u.length;o',"\n",c,"","\n"].join("")),c},_setSVGObjects:function(t,e){var i,r,n,s=this._objects;for(r=0,n=s.length;r
    \n")}else t.push('\n")},sendToBack:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(e=(r=n._objects).length;e--;)i=r[e],h(this._objects,i),this._objects.unshift(i);else h(this._objects,t),this._objects.unshift(t);return this.renderOnAddRemove&&this.requestRenderAll(),this},bringToFront:function(t){if(!t)return this;var e,i,r,n=this._activeObject;if(t===n&&"activeSelection"===t.type)for(r=n._objects,e=0;e"}}),n(fabric.StaticCanvas.prototype,fabric.Observable),n(fabric.StaticCanvas.prototype,fabric.Collection),n(fabric.StaticCanvas.prototype,fabric.DataURLExporter),n(fabric.StaticCanvas,{EMPTY_JSON:'{"objects": [], "background": "white"}',supports:function(t){var e=r();if(!e||!e.getContext)return null;var i=e.getContext("2d");if(!i)return null;switch(t){case"setLineDash":return void 0!==i.setLineDash;default:return null}}}),fabric.StaticCanvas.prototype.toJSON=fabric.StaticCanvas.prototype.toObject,fabric.isLikelyNode&&(fabric.StaticCanvas.prototype.createPNGStream=function(){var t=i(this.lowerCanvasEl);return t&&t.createPNGStream()},fabric.StaticCanvas.prototype.createJPEGStream=function(t){var e=i(this.lowerCanvasEl);return e&&e.createJPEGStream(t)})}}(),fabric.BaseBrush=fabric.util.createClass({color:"rgb(0, 0, 0)",width:1,shadow:null,strokeLineCap:"round",strokeLineJoin:"round",strokeMiterLimit:10,strokeDashArray:null,limitedToCanvasSize:!1,_setBrushStyles:function(t){t.strokeStyle=this.color,t.lineWidth=this.width,t.lineCap=this.strokeLineCap,t.miterLimit=this.strokeMiterLimit,t.lineJoin=this.strokeLineJoin,t.setLineDash(this.strokeDashArray||[])},_saveAndTransform:function(t){var e=this.canvas.viewportTransform;t.save(),t.transform(e[0],e[1],e[2],e[3],e[4],e[5])},_setShadow:function(){if(this.shadow){var t=this.canvas,e=this.shadow,i=t.contextTop,r=t.getZoom();t&&t._isRetinaScaling()&&(r*=fabric.devicePixelRatio),i.shadowColor=e.color,i.shadowBlur=e.blur*r,i.shadowOffsetX=e.offsetX*r,i.shadowOffsetY=e.offsetY*r}},needsFullRender:function(){return new fabric.Color(this.color).getAlpha()<1||!!this.shadow},_resetShadow:function(){var t=this.canvas.contextTop;t.shadowColor="",t.shadowBlur=t.shadowOffsetX=t.shadowOffsetY=0},_isOutSideCanvas:function(t){return t.x<0||t.x>this.canvas.getWidth()||t.y<0||t.y>this.canvas.getHeight()}}),fabric.PencilBrush=fabric.util.createClass(fabric.BaseBrush,{decimate:.4,drawStraightLine:!1,straightLineKey:"shiftKey",initialize:function(t){this.canvas=t,this._points=[]},needsFullRender:function(){return this.callSuper("needsFullRender")||this._hasStraightLine},_drawSegment:function(t,e,i){var r=e.midPointFrom(i);return t.quadraticCurveTo(e.x,e.y,r.x,r.y),r},onMouseDown:function(t,e){this.canvas._isMainEvent(e.e)&&(this.drawStraightLine=e.e[this.straightLineKey],this._prepareForDrawing(t),this._captureDrawingPath(t),this._render())},onMouseMove:function(t,e){if(this.canvas._isMainEvent(e.e)&&(this.drawStraightLine=e.e[this.straightLineKey],(!0!==this.limitedToCanvasSize||!this._isOutSideCanvas(t))&&this._captureDrawingPath(t)&&1"},getObjectScaling:function(){if(!this.group)return{scaleX:this.scaleX,scaleY:this.scaleY};var t=x.util.qrDecompose(this.calcTransformMatrix());return{scaleX:Math.abs(t.scaleX),scaleY:Math.abs(t.scaleY)}},getTotalObjectScaling:function(){var t=this.getObjectScaling(),e=t.scaleX,i=t.scaleY;if(this.canvas){var r=this.canvas.getZoom(),n=this.canvas.getRetinaScaling();e*=r*n,i*=r*n}return{scaleX:e,scaleY:i}},getObjectOpacity:function(){var t=this.opacity;return this.group&&(t*=this.group.getObjectOpacity()),t},_set:function(t,e){var i="scaleX"===t||"scaleY"===t,r=this[t]!==e,n=!1;return i&&(e=this._constrainScale(e)),"scaleX"===t&&e<0?(this.flipX=!this.flipX,e*=-1):"scaleY"===t&&e<0?(this.flipY=!this.flipY,e*=-1):"shadow"!==t||!e||e instanceof x.Shadow?"dirty"===t&&this.group&&this.group.set("dirty",e):e=new x.Shadow(e),this[t]=e,r&&(n=this.group&&this.group.isOnACache(),-1=t.x&&n.left+n.width<=e.x&&n.top>=t.y&&n.top+n.height<=e.y},containsPoint:function(t,e,i,r){var n=this._getCoords(i,r),s=(e=e||this._getImageLines(n),this._findCrossPoints(t,e));return 0!==s&&s%2==1},isOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.getCoords(!0,t).some(function(t){return t.x<=i.x&&t.x>=e.x&&t.y<=i.y&&t.y>=e.y})||(!!this.intersectsWithRect(e,i,!0,t)||this._containsCenterOfCanvas(e,i,t))},_containsCenterOfCanvas:function(t,e,i){var r={x:(t.x+e.x)/2,y:(t.y+e.y)/2};return!!this.containsPoint(r,null,!0,i)},isPartiallyOnScreen:function(t){if(!this.canvas)return!1;var e=this.canvas.vptCoords.tl,i=this.canvas.vptCoords.br;return!!this.intersectsWithRect(e,i,!0,t)||this.getCoords(!0,t).every(function(t){return(t.x>=i.x||t.x<=e.x)&&(t.y>=i.y||t.y<=e.y)})&&this._containsCenterOfCanvas(e,i,t)},_getImageLines:function(t){return{topline:{o:t.tl,d:t.tr},rightline:{o:t.tr,d:t.br},bottomline:{o:t.br,d:t.bl},leftline:{o:t.bl,d:t.tl}}},_findCrossPoints:function(t,e){var i,r,n,s=0;for(var o in e)if(!((n=e[o]).o.y=t.y&&n.d.y>=t.y||(n.o.x===n.d.x&&n.o.x>=t.x?r=n.o.x:(0,i=(n.d.y-n.o.y)/(n.d.x-n.o.x),r=-(t.y-0*t.x-(n.o.y-i*n.o.x))/(0-i)),r>=t.x&&(s+=1),2!==s)))break;return s},getBoundingRect:function(t,e){var i=this.getCoords(t,e);return h.makeBoundingBoxFromPoints(i)},getScaledWidth:function(){return this._getTransformedDimensions().x},getScaledHeight:function(){return this._getTransformedDimensions().y},_constrainScale:function(t){return Math.abs(t)
    \n')}},toSVG:function(t){return this._createBaseSVGMarkup(this._toSVG(t),{reviver:t})},toClipPathSVG:function(t){return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(t),{reviver:t})},_createBaseClipPathSVGMarkup:function(t,e){var i=(e=e||{}).reviver,r=e.additionalTransform||"",n=[this.getSvgTransform(!0,r),this.getSvgCommons()].join(""),s=t.indexOf("COMMON_PARTS");return t[s]=n,i?i(t.join("")):t.join("")},_createBaseSVGMarkup:function(t,e){var i,r,n=(e=e||{}).noStyle,s=e.reviver,o=n?"":'style="'+this.getSvgStyles()+'" ',a=e.withShadow?'style="'+this.getSvgFilter()+'" ':"",c=this.clipPath,h=this.strokeUniform?'vector-effect="non-scaling-stroke" ':"",l=c&&c.absolutePositioned,u=this.stroke,f=this.fill,d=this.shadow,g=[],p=t.indexOf("COMMON_PARTS"),v=e.additionalTransform;return c&&(c.clipPathId="CLIPPATH_"+fabric.Object.__uid++,r='\n'+c.toClipPathSVG(s)+"\n"),l&&g.push("\n"),g.push("\n"),i=[o,h,n?"":this.addPaintOrder()," ",v?'transform="'+v+'" ':""].join(""),t[p]=i,f&&f.toLive&&g.push(f.toSVG(this)),u&&u.toLive&&g.push(u.toSVG(this)),d&&g.push(d.toSVG(this)),c&&g.push(r),g.push(t.join("")),g.push("\n"),l&&g.push("\n"),s?s(g.join("")):g.join("")},addPaintOrder:function(){return"fill"!==this.paintFirst?' paint-order="'+this.paintFirst+'" ':""}})}(),function(){var n=fabric.util.object.extend,r="stateProperties";function s(e,t,i){var r={};i.forEach(function(t){r[t]=e[t]}),n(e[t],r,!0)}fabric.util.object.extend(fabric.Object.prototype,{hasStateChanged:function(t){var e="_"+(t=t||r);return Object.keys(this[e]).length\n']}}),s.Line.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("x1 y1 x2 y2".split(" ")),s.Line.fromElement=function(t,e,i){i=i||{};var r=s.parseAttributes(t,s.Line.ATTRIBUTE_NAMES),n=[r.x1||0,r.y1||0,r.x2||0,r.y2||0];e(new s.Line(n,o(r,i)))},s.Line.fromObject=function(t,e){var i=r(t,!0);i.points=[t.x1,t.y1,t.x2,t.y2],s.Object._fromObject("Line",i,function(t){delete t.points,e&&e(t)},"points")})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var s=t.fabric||(t.fabric={}),o=s.util.degreesToRadians;s.Circle?s.warn("fabric.Circle is already defined."):(s.Circle=s.util.createClass(s.Object,{type:"circle",radius:0,startAngle:0,endAngle:360,cacheProperties:s.Object.prototype.cacheProperties.concat("radius","startAngle","endAngle"),_set:function(t,e){return this.callSuper("_set",t,e),"radius"===t&&this.setRadius(e),this},toObject:function(t){return this.callSuper("toObject",["radius","startAngle","endAngle"].concat(t))},_toSVG:function(){var t,e=(this.endAngle-this.startAngle)%360;if(0===e)t=["\n'];else{var i=o(this.startAngle),r=o(this.endAngle),n=this.radius;t=['\n"]}return t},_render:function(t){t.beginPath(),t.arc(0,0,this.radius,o(this.startAngle),o(this.endAngle),!1),this._renderPaintInOrder(t)},getRadiusX:function(){return this.get("radius")*this.get("scaleX")},getRadiusY:function(){return this.get("radius")*this.get("scaleY")},setRadius:function(t){return this.radius=t,this.set("width",2*t).set("height",2*t)}}),s.Circle.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("cx cy r".split(" ")),s.Circle.fromElement=function(t,e){var i,r=s.parseAttributes(t,s.Circle.ATTRIBUTE_NAMES);if(!("radius"in(i=r)&&0<=i.radius))throw new Error("value of `r` attribute is required and can not be negative");r.left=(r.left||0)-r.radius,r.top=(r.top||0)-r.radius,e(new s.Circle(r))},s.Circle.fromObject=function(t,e){s.Object._fromObject("Circle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var i=t.fabric||(t.fabric={});i.Triangle?i.warn("fabric.Triangle is already defined"):(i.Triangle=i.util.createClass(i.Object,{type:"triangle",width:100,height:100,_render:function(t){var e=this.width/2,i=this.height/2;t.beginPath(),t.moveTo(-e,i),t.lineTo(0,-i),t.lineTo(e,i),t.closePath(),this._renderPaintInOrder(t)},_toSVG:function(){var t=this.width/2,e=this.height/2;return["']}}),i.Triangle.fromObject=function(t,e){return i.Object._fromObject("Triangle",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var r=t.fabric||(t.fabric={}),e=2*Math.PI;r.Ellipse?r.warn("fabric.Ellipse is already defined."):(r.Ellipse=r.util.createClass(r.Object,{type:"ellipse",rx:0,ry:0,cacheProperties:r.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this.set("rx",t&&t.rx||0),this.set("ry",t&&t.ry||0)},_set:function(t,e){switch(this.callSuper("_set",t,e),t){case"rx":this.rx=e,this.set("width",2*e);break;case"ry":this.ry=e,this.set("height",2*e)}return this},getRx:function(){return this.get("rx")*this.get("scaleX")},getRy:function(){return this.get("ry")*this.get("scaleY")},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']},_render:function(t){t.beginPath(),t.save(),t.transform(1,0,0,this.ry/this.rx,0,0),t.arc(0,0,this.rx,0,e,!1),t.restore(),this._renderPaintInOrder(t)}}),r.Ellipse.ATTRIBUTE_NAMES=r.SHARED_ATTRIBUTES.concat("cx cy rx ry".split(" ")),r.Ellipse.fromElement=function(t,e){var i=r.parseAttributes(t,r.Ellipse.ATTRIBUTE_NAMES);i.left=(i.left||0)-i.rx,i.top=(i.top||0)-i.ry,e(new r.Ellipse(i))},r.Ellipse.fromObject=function(t,e){r.Object._fromObject("Ellipse",t,e)})}("undefined"!=typeof exports?exports:this),function(t){"use strict";var s=t.fabric||(t.fabric={}),o=s.util.object.extend;s.Rect?s.warn("fabric.Rect is already defined"):(s.Rect=s.util.createClass(s.Object,{stateProperties:s.Object.prototype.stateProperties.concat("rx","ry"),type:"rect",rx:0,ry:0,cacheProperties:s.Object.prototype.cacheProperties.concat("rx","ry"),initialize:function(t){this.callSuper("initialize",t),this._initRxRy()},_initRxRy:function(){this.rx&&!this.ry?this.ry=this.rx:this.ry&&!this.rx&&(this.rx=this.ry)},_render:function(t){var e=this.rx?Math.min(this.rx,this.width/2):0,i=this.ry?Math.min(this.ry,this.height/2):0,r=this.width,n=this.height,s=-this.width/2,o=-this.height/2,a=0!==e||0!==i,c=.4477152502;t.beginPath(),t.moveTo(s+e,o),t.lineTo(s+r-e,o),a&&t.bezierCurveTo(s+r-c*e,o,s+r,o+c*i,s+r,o+i),t.lineTo(s+r,o+n-i),a&&t.bezierCurveTo(s+r,o+n-c*i,s+r-c*e,o+n,s+r-e,o+n),t.lineTo(s+e,o+n),a&&t.bezierCurveTo(s+c*e,o+n,s,o+n-c*i,s,o+n-i),t.lineTo(s,o+i),a&&t.bezierCurveTo(s,o+c*i,s+c*e,o,s+e,o),t.closePath(),this._renderPaintInOrder(t)},toObject:function(t){return this.callSuper("toObject",["rx","ry"].concat(t))},_toSVG:function(){return["\n']}}),s.Rect.ATTRIBUTE_NAMES=s.SHARED_ATTRIBUTES.concat("x y rx ry width height".split(" ")),s.Rect.fromElement=function(t,e,i){if(!t)return e(null);i=i||{};var r=s.parseAttributes(t,s.Rect.ATTRIBUTE_NAMES);r.left=r.left||0,r.top=r.top||0,r.height=r.height||0,r.width=r.width||0;var n=new s.Rect(o(i?s.util.object.clone(i):{},r));n.visible=n.visible&&0\n']},commonRender:function(t){var e,i=this.points.length,r=this.pathOffset.x,n=this.pathOffset.y;if(!i||isNaN(this.points[i-1].y))return!1;t.beginPath(),t.moveTo(this.points[0].x-r,this.points[0].y-n);for(var s=0;s"},toObject:function(t){return n(this.callSuper("toObject",t),{path:this.path.map(function(t){return t.slice()})})},toDatalessObject:function(t){var e=this.toObject(["sourcePath"].concat(t));return e.sourcePath&&delete e.path,e},_toSVG:function(){return["\n"]},_getOffsetTransform:function(){var t=f.Object.NUM_FRACTION_DIGITS;return" translate("+e(-this.pathOffset.x,t)+", "+e(-this.pathOffset.y,t)+")"},toClipPathSVG:function(t){var e=this._getOffsetTransform();return"\t"+this._createBaseClipPathSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},toSVG:function(t){var e=this._getOffsetTransform();return this._createBaseSVGMarkup(this._toSVG(),{reviver:t,additionalTransform:e})},complexity:function(){return this.path.length},_calcDimensions:function(){for(var t,e,i=[],r=[],n=0,s=0,o=0,a=0,c=0,h=this.path.length;c"},addWithUpdate:function(t){var e=!!this.group;return this._restoreObjectsState(),h.util.resetObjectTransform(this),t&&(e&&h.util.removeTransformFromObject(t,this.group.calcTransformMatrix()),this._objects.push(t),t.group=this,t._set("canvas",this.canvas)),this._calcBounds(),this._updateObjectsCoords(),this.dirty=!0,e?this.group.addWithUpdate():this.setCoords(),this},removeWithUpdate:function(t){return this._restoreObjectsState(),h.util.resetObjectTransform(this),this.remove(t),this._calcBounds(),this._updateObjectsCoords(),this.setCoords(),this.dirty=!0,this},_onObjectAdded:function(t){this.dirty=!0,t.group=this,t._set("canvas",this.canvas)},_onObjectRemoved:function(t){this.dirty=!0,delete t.group},_set:function(t,e){var i=this._objects.length;if(this.useSetOnGroup)for(;i--;)this._objects[i].setOnGroup(t,e);if("canvas"===t)for(;i--;)this._objects[i]._set(t,e);h.Object.prototype._set.call(this,t,e)},toObject:function(r){var n=this.includeDefaultValues,t=this._objects.filter(function(t){return!t.excludeFromExport}).map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toObject(r);return t.includeDefaultValues=e,i}),e=h.Object.prototype.toObject.call(this,r);return e.objects=t,e},toDatalessObject:function(r){var t,e=this.sourcePath;if(e)t=e;else{var n=this.includeDefaultValues;t=this._objects.map(function(t){var e=t.includeDefaultValues;t.includeDefaultValues=n;var i=t.toDatalessObject(r);return t.includeDefaultValues=e,i})}var i=h.Object.prototype.toDatalessObject.call(this,r);return i.objects=t,i},render:function(t){this._transformDone=!0,this.callSuper("render",t),this._transformDone=!1},shouldCache:function(){var t=h.Object.prototype.shouldCache.call(this);if(t)for(var e=0,i=this._objects.length;e\n"],i=0,r=this._objects.length;i\n"),e},getSvgStyles:function(){var t=void 0!==this.opacity&&1!==this.opacity?"opacity: "+this.opacity+";":"",e=this.visible?"":" visibility: hidden;";return[t,this.getSvgFilter(),e].join("")},toClipPathSVG:function(t){for(var e=[],i=0,r=this._objects.length;i"},shouldCache:function(){return!1},isOnACache:function(){return!1},_renderControls:function(t,e,i){t.save(),t.globalAlpha=this.isMoving?this.borderOpacityWhenMoving:1,this.callSuper("_renderControls",t,e),void 0===(i=i||{}).hasControls&&(i.hasControls=!1),i.forActiveSelection=!0;for(var r=0,n=this._objects.length;r\n','\t\n',"\n"),o=' clip-path="url(#imageCrop_'+c+')" '}if(this.imageSmoothing||(a='" image-rendering="optimizeSpeed'),i.push("\t\n"),this.stroke||this.strokeDashArray){var h=this.fill;this.fill=null,t=["\t\n'],this.fill=h}return e="fill"!==this.paintFirst?e.concat(t,i):e.concat(i,t)},getSrc:function(t){var e=t?this._element:this._originalElement;return e?e.toDataURL?e.toDataURL():this.srcFromAttribute?e.getAttribute("src"):e.src:this.src||""},setSrc:function(t,i,r){return fabric.util.loadImage(t,function(t,e){this.setElement(t,r),this._setWidthHeight(),i&&i(this,e)},this,r&&r.crossOrigin),this},toString:function(){return'#'},applyResizeFilters:function(){var t=this.resizeFilter,e=this.minimumScaleTrigger,i=this.getTotalObjectScaling(),r=i.scaleX,n=i.scaleY,s=this._filteredEl||this._originalElement;if(this.group&&this.set("dirty",!0),!t||e=t;for(var a=["highp","mediump","lowp"],c=0;c<3;c++)if(void 0,i="precision "+a[c]+" float;\nvoid main(){}",r=(e=s).createShader(e.FRAGMENT_SHADER),e.shaderSource(r,i),e.compileShader(r),e.getShaderParameter(r,e.COMPILE_STATUS)){fabric.webGlPrecision=a[c];break}}return this.isSupported=o},(fabric.WebglFilterBackend=t).prototype={tileSize:2048,resources:{},setupGLContext:function(t,e){this.dispose(),this.createWebGLCanvas(t,e),this.aPosition=new Float32Array([0,0,0,1,1,0,1,1]),this.chooseFastestCopyGLTo2DMethod(t,e)},chooseFastestCopyGLTo2DMethod:function(t,e){var i,r=void 0!==window.performance;try{new ImageData(1,1),i=!0}catch(t){i=!1}var n="undefined"!=typeof ArrayBuffer,s="undefined"!=typeof Uint8ClampedArray;if(r&&i&&n&&s){var o=fabric.util.createCanvasElement(),a=new ArrayBuffer(t*e*4);if(fabric.forceGLPutImageData)return this.imageBuffer=a,void(this.copyGLTo2D=copyGLTo2DPutImageData);var c,h,l={imageBuffer:a,destinationWidth:t,destinationHeight:e,targetCanvas:o};o.width=t,o.height=e,c=window.performance.now(),copyGLTo2DDrawImage.call(l,this.gl,l),h=window.performance.now()-c,c=window.performance.now(),copyGLTo2DPutImageData.call(l,this.gl,l),window.performance.now()-c 0.0) {\n"+this.fragmentSource[t]+"}\n}"},retrieveShader:function(t){var e,i=this.type+"_"+this.mode;return t.programCache.hasOwnProperty(i)||(e=this.buildSource(this.mode),t.programCache[i]=this.createProgram(t.context,e)),t.programCache[i]},applyTo2d:function(t){var e,i,r,n,s,o,a,c=t.imageData.data,h=c.length,l=1-this.alpha;e=(a=new f.Color(this.color).getSource())[0]*this.alpha,i=a[1]*this.alpha,r=a[2]*this.alpha;for(var u=0;u'},_getCacheCanvasDimensions:function(){var t=this.callSuper("_getCacheCanvasDimensions"),e=this.fontSize;return t.width+=e*t.zoomX,t.height+=e*t.zoomY,t},_render:function(t){var e=this.path;e&&!e.isNotVisible()&&e._render(t),this._setTextStyles(t),this._renderTextLinesBackground(t),this._renderTextDecoration(t,"underline"),this._renderText(t),this._renderTextDecoration(t,"overline"),this._renderTextDecoration(t,"linethrough")},_renderText:function(t){"stroke"===this.paintFirst?(this._renderTextStroke(t),this._renderTextFill(t)):(this._renderTextFill(t),this._renderTextStroke(t))},_setTextStyles:function(t,e,i){if(t.textBaseline="alphabetical",this.path)switch(this.pathAlign){case"center":t.textBaseline="middle";break;case"ascender":t.textBaseline="top";break;case"descender":t.textBaseline="bottom"}t.font=this._getFontDeclaration(e,i)},calcTextWidth:function(){for(var t=this.getLineWidth(0),e=1,i=this._textLines.length;ethis.__selectionStartOnMouseDown?(this.selectionStart=this.__selectionStartOnMouseDown,this.selectionEnd=e):(this.selectionStart=e,this.selectionEnd=this.__selectionStartOnMouseDown),this.selectionStart===i&&this.selectionEnd===r||(this.restartCursorIfNeeded(),this._fireSelectionChanged(),this._updateTextarea(),this.renderCursorOrSelection()))}},_setEditingProps:function(){this.hoverCursor="text",this.canvas&&(this.canvas.defaultCursor=this.canvas.moveCursor="text"),this.borderColor=this.editingBorderColor,this.hasControls=this.selectable=!1,this.lockMovementX=this.lockMovementY=!0},fromStringToGraphemeSelection:function(t,e,i){var r=i.slice(0,t),n=fabric.util.string.graphemeSplit(r).length;if(t===e)return{selectionStart:n,selectionEnd:n};var s=i.slice(t,e);return{selectionStart:n,selectionEnd:n+fabric.util.string.graphemeSplit(s).length}},fromGraphemeToStringSelection:function(t,e,i){var r=i.slice(0,t).join("").length;return t===e?{selectionStart:r,selectionEnd:r}:{selectionStart:r,selectionEnd:r+i.slice(t,e).join("").length}},_updateTextarea:function(){if(this.cursorOffsetCache={},this.hiddenTextarea){if(!this.inCompositionMode){var t=this.fromGraphemeToStringSelection(this.selectionStart,this.selectionEnd,this._text);this.hiddenTextarea.selectionStart=t.selectionStart,this.hiddenTextarea.selectionEnd=t.selectionEnd}this.updateTextareaPosition()}},updateFromTextArea:function(){if(this.hiddenTextarea){this.cursorOffsetCache={},this.text=this.hiddenTextarea.value,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords());var t=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value);this.selectionEnd=this.selectionStart=t.selectionEnd,this.inCompositionMode||(this.selectionStart=t.selectionStart),this.updateTextareaPosition()}},updateTextareaPosition:function(){if(this.selectionStart===this.selectionEnd){var t=this._calcTextareaPosition();this.hiddenTextarea.style.left=t.left,this.hiddenTextarea.style.top=t.top}},_calcTextareaPosition:function(){if(!this.canvas)return{x:1,y:1};var t=this.inCompositionMode?this.compositionStart:this.selectionStart,e=this._getCursorBoundaries(t),i=this.get2DCursorLocation(t),r=i.lineIndex,n=i.charIndex,s=this.getValueOfPropertyAt(r,n,"fontSize")*this.lineHeight,o=e.leftOffset,a=this.calcTransformMatrix(),c={x:e.left+o,y:e.top+e.topOffset+s},h=this.canvas.getRetinaScaling(),l=this.canvas.upperCanvasEl,u=l.width/h,f=l.height/h,d=u-s,g=f-s,p=l.clientWidth/u,v=l.clientHeight/f;return c=fabric.util.transformPoint(c,a),(c=fabric.util.transformPoint(c,this.canvas.viewportTransform)).x*=p,c.y*=v,c.x<0&&(c.x=0),c.x>d&&(c.x=d),c.y<0&&(c.y=0),c.y>g&&(c.y=g),c.x+=this.canvas._offset.left,c.y+=this.canvas._offset.top,{left:c.x+"px",top:c.y+"px",fontSize:s+"px",charHeight:s}},_saveEditingProps:function(){this._savedProps={hasControls:this.hasControls,borderColor:this.borderColor,lockMovementX:this.lockMovementX,lockMovementY:this.lockMovementY,hoverCursor:this.hoverCursor,selectable:this.selectable,defaultCursor:this.canvas&&this.canvas.defaultCursor,moveCursor:this.canvas&&this.canvas.moveCursor}},_restoreEditingProps:function(){this._savedProps&&(this.hoverCursor=this._savedProps.hoverCursor,this.hasControls=this._savedProps.hasControls,this.borderColor=this._savedProps.borderColor,this.selectable=this._savedProps.selectable,this.lockMovementX=this._savedProps.lockMovementX,this.lockMovementY=this._savedProps.lockMovementY,this.canvas&&(this.canvas.defaultCursor=this._savedProps.defaultCursor,this.canvas.moveCursor=this._savedProps.moveCursor))},exitEditing:function(){var t=this._textBeforeEdit!==this.text,e=this.hiddenTextarea;return this.selected=!1,this.isEditing=!1,this.selectionEnd=this.selectionStart,e&&(e.blur&&e.blur(),e.parentNode&&e.parentNode.removeChild(e)),this.hiddenTextarea=null,this.abortCursorAnimation(),this._restoreEditingProps(),this._currentCursorOpacity=0,this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this.fire("editing:exited"),t&&this.fire("modified"),this.canvas&&(this.canvas.off("mouse:move",this.mouseMoveHandler),this.canvas.fire("text:editing:exited",{target:this}),t&&this.canvas.fire("object:modified",{target:this})),this},_removeExtraneousStyles:function(){for(var t in this.styles)this._textLines[t]||delete this.styles[t]},removeStyleFromTo:function(t,e){var i,r,n=this.get2DCursorLocation(t,!0),s=this.get2DCursorLocation(e,!0),o=n.lineIndex,a=n.charIndex,c=s.lineIndex,h=s.charIndex;if(o!==c){if(this.styles[o])for(i=a;it?this.selectionStart=t:this.selectionStart<0&&(this.selectionStart=0),this.selectionEnd>t?this.selectionEnd=t:this.selectionEnd<0&&(this.selectionEnd=0)}})}(),fabric.util.object.extend(fabric.IText.prototype,{initDoubleClickSimulation:function(){this.__lastClickTime=+new Date,this.__lastLastClickTime=+new Date,this.__lastPointer={},this.on("mousedown",this.onMouseDown)},onMouseDown:function(t){if(this.canvas){this.__newClickTime=+new Date;var e=t.pointer;this.isTripleClick(e)&&(this.fire("tripleclick",t),this._stopEvent(t.e)),this.__lastLastClickTime=this.__lastClickTime,this.__lastClickTime=this.__newClickTime,this.__lastPointer=e,this.__lastIsEditing=this.isEditing,this.__lastSelected=this.selected}},isTripleClick:function(t){return this.__newClickTime-this.__lastClickTime<500&&this.__lastClickTime-this.__lastLastClickTime<500&&this.__lastPointer.x===t.x&&this.__lastPointer.y===t.y},_stopEvent:function(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation()},initCursorSelectionHandlers:function(){this.initMousedownHandler(),this.initMouseupHandler(),this.initClicks()},doubleClickHandler:function(t){this.isEditing&&this.selectWord(this.getSelectionStartFromPointer(t.e))},tripleClickHandler:function(t){this.isEditing&&this.selectLine(this.getSelectionStartFromPointer(t.e))},initClicks:function(){this.on("mousedblclick",this.doubleClickHandler),this.on("tripleclick",this.tripleClickHandler)},_mouseDownHandler:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.__isMousedown=!0,this.selected&&(this.inCompositionMode=!1,this.setCursorByClick(t.e)),this.isEditing&&(this.__selectionStartOnMouseDown=this.selectionStart,this.selectionStart===this.selectionEnd&&this.abortCursorAnimation(),this.renderCursorOrSelection()))},_mouseDownHandlerBefore:function(t){!this.canvas||!this.editable||t.e.button&&1!==t.e.button||(this.selected=this===this.canvas._activeObject)},initMousedownHandler:function(){this.on("mousedown",this._mouseDownHandler),this.on("mousedown:before",this._mouseDownHandlerBefore)},initMouseupHandler:function(){this.on("mouseup",this.mouseUpHandler)},mouseUpHandler:function(t){if(this.__isMousedown=!1,!(!this.editable||this.group||t.transform&&t.transform.actionPerformed||t.e.button&&1!==t.e.button)){if(this.canvas){var e=this.canvas._activeObject;if(e&&e!==this)return}this.__lastSelected&&!this.__corner?(this.selected=!1,this.__lastSelected=!1,this.enterEditing(t.e),this.selectionStart===this.selectionEnd?this.initDelayedCursor(!0):this.renderCursorOrSelection()):this.selected=!0}},setCursorByClick:function(t){var e=this.getSelectionStartFromPointer(t),i=this.selectionStart,r=this.selectionEnd;t.shiftKey?this.setSelectionStartEndWithShift(i,r,e):(this.selectionStart=e,this.selectionEnd=e),this.isEditing&&(this._fireSelectionChanged(),this._updateTextarea())},getSelectionStartFromPointer:function(t){for(var e,i=this.getLocalPointer(t),r=0,n=0,s=0,o=0,a=0,c=0,h=this._textLines.length;cthis._text.length&&(a=this._text.length),a}}),fabric.util.object.extend(fabric.IText.prototype,{initHiddenTextarea:function(){this.hiddenTextarea=fabric.document.createElement("textarea"),this.hiddenTextarea.setAttribute("autocapitalize","off"),this.hiddenTextarea.setAttribute("autocorrect","off"),this.hiddenTextarea.setAttribute("autocomplete","off"),this.hiddenTextarea.setAttribute("spellcheck","false"),this.hiddenTextarea.setAttribute("data-fabric-hiddentextarea",""),this.hiddenTextarea.setAttribute("wrap","off");var t=this._calcTextareaPosition();this.hiddenTextarea.style.cssText="position: absolute; top: "+t.top+"; left: "+t.left+"; z-index: -999; opacity: 0; width: 1px; height: 1px; font-size: 1px; paddingーtop: "+t.fontSize+";",this.hiddenTextareaContainer?this.hiddenTextareaContainer.appendChild(this.hiddenTextarea):fabric.document.body.appendChild(this.hiddenTextarea),fabric.util.addListener(this.hiddenTextarea,"keydown",this.onKeyDown.bind(this)),fabric.util.addListener(this.hiddenTextarea,"keyup",this.onKeyUp.bind(this)),fabric.util.addListener(this.hiddenTextarea,"input",this.onInput.bind(this)),fabric.util.addListener(this.hiddenTextarea,"copy",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"cut",this.copy.bind(this)),fabric.util.addListener(this.hiddenTextarea,"paste",this.paste.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionstart",this.onCompositionStart.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionupdate",this.onCompositionUpdate.bind(this)),fabric.util.addListener(this.hiddenTextarea,"compositionend",this.onCompositionEnd.bind(this)),!this._clickHandlerInitialized&&this.canvas&&(fabric.util.addListener(this.canvas.upperCanvasEl,"click",this.onClick.bind(this)),this._clickHandlerInitialized=!0)},keysMap:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorRight",36:"moveCursorLeft",37:"moveCursorLeft",38:"moveCursorUp",39:"moveCursorRight",40:"moveCursorDown"},keysMapRtl:{9:"exitEditing",27:"exitEditing",33:"moveCursorUp",34:"moveCursorDown",35:"moveCursorLeft",36:"moveCursorRight",37:"moveCursorRight",38:"moveCursorUp",39:"moveCursorLeft",40:"moveCursorDown"},ctrlKeysMapUp:{67:"copy",88:"cut"},ctrlKeysMapDown:{65:"selectAll"},onClick:function(){this.hiddenTextarea&&this.hiddenTextarea.focus()},onKeyDown:function(t){if(this.isEditing){var e="rtl"===this.direction?this.keysMapRtl:this.keysMap;if(t.keyCode in e)this[e[t.keyCode]](t);else{if(!(t.keyCode in this.ctrlKeysMapDown&&(t.ctrlKey||t.metaKey)))return;this[this.ctrlKeysMapDown[t.keyCode]](t)}t.stopImmediatePropagation(),t.preventDefault(),33<=t.keyCode&&t.keyCode<=40?(this.inCompositionMode=!1,this.clearContextTop(),this.renderCursorOrSelection()):this.canvas&&this.canvas.requestRenderAll()}},onKeyUp:function(t){!this.isEditing||this._copyDone||this.inCompositionMode?this._copyDone=!1:t.keyCode in this.ctrlKeysMapUp&&(t.ctrlKey||t.metaKey)&&(this[this.ctrlKeysMapUp[t.keyCode]](t),t.stopImmediatePropagation(),t.preventDefault(),this.canvas&&this.canvas.requestRenderAll())},onInput:function(t){var e=this.fromPaste;if(this.fromPaste=!1,t&&t.stopPropagation(),this.isEditing){var i,r,n,s,o,a=this._splitTextIntoLines(this.hiddenTextarea.value).graphemeText,c=this._text.length,h=a.length,l=h-c,u=this.selectionStart,f=this.selectionEnd,d=u!==f;if(""===this.hiddenTextarea.value)return this.styles={},this.updateFromTextArea(),this.fire("changed"),void(this.canvas&&(this.canvas.fire("text:changed",{target:this}),this.canvas.requestRenderAll()));var g=this.fromStringToGraphemeSelection(this.hiddenTextarea.selectionStart,this.hiddenTextarea.selectionEnd,this.hiddenTextarea.value),p=u>g.selectionStart;d?(i=this._text.slice(u,f),l+=f-u):h=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorUpOrDown("Down",t)},moveCursorUp:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorUpOrDown("Up",t)},_moveCursorUpOrDown:function(t,e){var i=this["get"+t+"CursorOffset"](e,"right"===this._selectionDirection);e.shiftKey?this.moveCursorWithShift(i):this.moveCursorWithoutShift(i),0!==i&&(this.setSelectionInBoundaries(),this.abortCursorAnimation(),this._currentCursorOpacity=1,this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorWithShift:function(t){var e="left"===this._selectionDirection?this.selectionStart+t:this.selectionEnd+t;return this.setSelectionStartEndWithShift(this.selectionStart,this.selectionEnd,e),0!==t},moveCursorWithoutShift:function(t){return t<0?(this.selectionStart+=t,this.selectionEnd=this.selectionStart):(this.selectionEnd+=t,this.selectionStart=this.selectionEnd),0!==t},moveCursorLeft:function(t){0===this.selectionStart&&0===this.selectionEnd||this._moveCursorLeftOrRight("Left",t)},_move:function(t,e,i){var r;if(t.altKey)r=this["findWordBoundary"+i](this[e]);else{if(!t.metaKey&&35!==t.keyCode&&36!==t.keyCode)return this[e]+="Left"===i?-1:1,!0;r=this["findLineBoundary"+i](this[e])}if(void 0!==typeof r&&this[e]!==r)return this[e]=r,!0},_moveLeft:function(t,e){return this._move(t,e,"Left")},_moveRight:function(t,e){return this._move(t,e,"Right")},moveCursorLeftWithoutShift:function(t){var e=!0;return this._selectionDirection="left",this.selectionEnd===this.selectionStart&&0!==this.selectionStart&&(e=this._moveLeft(t,"selectionStart")),this.selectionEnd=this.selectionStart,e},moveCursorLeftWithShift:function(t){return"right"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveLeft(t,"selectionEnd"):0!==this.selectionStart?(this._selectionDirection="left",this._moveLeft(t,"selectionStart")):void 0},moveCursorRight:function(t){this.selectionStart>=this._text.length&&this.selectionEnd>=this._text.length||this._moveCursorLeftOrRight("Right",t)},_moveCursorLeftOrRight:function(t,e){var i="moveCursor"+t+"With";this._currentCursorOpacity=1,e.shiftKey?i+="Shift":i+="outShift",this[i](e)&&(this.abortCursorAnimation(),this.initDelayedCursor(),this._fireSelectionChanged(),this._updateTextarea())},moveCursorRightWithShift:function(t){return"left"===this._selectionDirection&&this.selectionStart!==this.selectionEnd?this._moveRight(t,"selectionStart"):this.selectionEnd!==this._text.length?(this._selectionDirection="right",this._moveRight(t,"selectionEnd")):void 0},moveCursorRightWithoutShift:function(t){var e=!0;return this._selectionDirection="right",this.selectionStart===this.selectionEnd?(e=this._moveRight(t,"selectionStart"),this.selectionEnd=this.selectionStart):this.selectionStart=this.selectionEnd,e},removeChars:function(t,e){void 0===e&&(e=t+1),this.removeStyleFromTo(t,e),this._text.splice(t,e-t),this.text=this._text.join(""),this.set("dirty",!0),this._shouldClearDimensionCache()&&(this.initDimensions(),this.setCoords()),this._removeExtraneousStyles()},insertChars:function(t,e,i,r){void 0===r&&(r=i),i",t.textSpans.join(""),"\n"]},_getSVGTextAndBg:function(t,e){var i,r=[],n=[],s=t;this._setSVGBg(n);for(var o=0,a=this._textLines.length;o",fabric.util.string.escapeXml(t),""].join("")},_setSVGTextLineText:function(t,e,i,r){var n,s,o,a,c,h=this.getHeightOfLine(e),l=-1!==this.textAlign.indexOf("justify"),u="",f=0,d=this._textLines[e];r+=h*(1-this._fontSizeFraction)/this.lineHeight;for(var g=0,p=d.length-1;g<=p;g++)c=g===p||this.charSpacing,u+=d[g],o=this.__charBounds[e][g],0===f?(i+=o.kernedWidth-o.width,f+=o.width):f+=o.kernedWidth,l&&!c&&this._reSpaceAndTab.test(d[g])&&(c=!0),c||(n=n||this.getCompleteStyleDeclaration(e,g),s=this.getCompleteStyleDeclaration(e,g+1),c=this._hasStyleChangedForSvg(n,s)),c&&(a=this._getStyleDeclaration(e,g)||{},t.push(this._createTextCharSpan(u,a,i,r)),u="",n=s,i+=f,f=0)},_pushTextBgRect:function(t,e,i,r,n,s){var o=fabric.Object.NUM_FRACTION_DIGITS;t.push("\t\t\n')},_setSVGTextLineBg:function(t,e,i,r){for(var n,s,o=this._textLines[e],a=this.getHeightOfLine(e)/this.lineHeight,c=0,h=0,l=this.getValueOfPropertyAt(e,0,"textBackgroundColor"),u=0,f=o.length;uthis.width&&this._set("width",this.dynamicMinWidth),-1!==this.textAlign.indexOf("justify")&&this.enlargeSpaces(),this.height=this.calcTextHeight(),this.saveState({propertySet:"_dimensionAffectingProps"}))},_generateStyleMap:function(t){for(var e=0,i=0,r=0,n={},s=0;sthis.dynamicMinWidth&&(this.dynamicMinWidth=g-v+r),o},isEndOfWrapping:function(t){return!this._styleMap[t+1]||this._styleMap[t+1].line!==this._styleMap[t].line},missingNewlineOffset:function(t){return this.splitByGrapheme?this.isEndOfWrapping(t)?1:0:1},_splitTextIntoLines:function(t){for(var e=b.Text.prototype._splitTextIntoLines.call(this,t),i=this._wrapText(e.lines,this.width),r=new Array(i.length),n=0;n
    \ -
    "); - - $(div).bind("plotselected", function (event, ranges) { zoomStackIn (plot, event, ranges, options.zoomFunc); }); - $(div).find(".zoomout").click(function () { zoomStackOut(plot, options.zoomFunc); }); - - $(div).find(".zoomout").css("visibility", "hidden"); - - enabled = 0; - } - } - - function zoomOptions(plot, opts) { - // zoomStack can be true or it can be an object containing options - if ( opts && opts.zoomStack ) { - if( typeof opts.zoomStack === "object" ){ - options.zoomStack = opts.zoomStack.enabled; - options.zoomFunc = opts.zoomStack.func; - } else { - options.zoomStack = opts.zoomStack; - } - } - if( options.zoomStack ){ - enabled = 1; - plot.hooks.drawOverlay.push(zoomStack); - } - } - - function init(plot) { - plot.hooks.processOptions.push(zoomOptions); - } - - $.plot.plugins.push({ init: init, options: options, name: "zoomStack", version: 0.1 }); -}($)); - diff --git a/web/static/js9_old/js/flot-zoom.min.js b/web/static/js9_old/js/flot-zoom.min.js deleted file mode 100644 index 922995c..0000000 --- a/web/static/js9_old/js/flot-zoom.min.js +++ /dev/null @@ -1,7 +0,0 @@ -var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.findInternal=function(a,c,b){a instanceof String&&(a=String(a));for(var e=a.length,f=0;f
    \t\t
    "),a(b).bind("plotselected", -function(b,e){b=f.zoomFunc;var c=d.getAxes(),h=d.getPlaceholder(),g={};g.xmin=c.xaxis.min;g.xmax=c.xaxis.max;g.ymin=c.yaxis.min;g.ymax=c.yaxis.max;d.stack.push(g);c.xaxis.options.min=e.xaxis.from;c.xaxis.options.max=e.xaxis.to;c.yaxis.options.min=e.yaxis.from;c.yaxis.options.max=e.yaxis.to;d.clearSelection(!0);d.setupGrid();d.draw();a(h).find(".zoomout").css("visibility","visible");void 0!==b&&b(d,g)}),a(b).find(".zoomout").click(function(){var b=f.zoomFunc,c=d.stack.pop(),e=d.getPlaceholder();0=== -d.stack.length&&a(e).find(".zoomout").css("visibility","hidden");d.getAxes().xaxis.options.min=c.xmin;d.getAxes().xaxis.options.max=c.xmax;d.getAxes().yaxis.options.min=c.ymin;d.getAxes().yaxis.options.max=c.ymax;d.clearSelection(!0);d.setupGrid();d.draw();void 0!==b&&b(d,c)}),a(b).find(".zoomout").css("visibility","hidden"),e=0)}function b(a,b){b&&b.zoomStack&&("object"===typeof b.zoomStack?(f.zoomStack=b.zoomStack.enabled,f.zoomFunc=b.zoomStack.func):f.zoomStack=b.zoomStack);f.zoomStack&&(e=1,a.hooks.drawOverlay.push(c))} -var e=0,f={zoomStack:0,zoomFunc:void 0};a.plot.plugins.push({init:function(a){a.hooks.processOptions.push(b)},options:f,name:"zoomStack",version:.1})})($); diff --git a/web/static/js9_old/js/gaussblur-orig.js b/web/static/js9_old/js/gaussblur-orig.js deleted file mode 100644 index d5c0606..0000000 --- a/web/static/js9_old/js/gaussblur-orig.js +++ /dev/null @@ -1,60 +0,0 @@ -// blog.ivank.net/fastest-gaussian-blur.html -// and http://elynxsdk.free.fr/ext-docs/Blur/Fast_box_blur.pdf -var gaussBlur = (function(){ - -function gaussBlur (scl, tcl, w, h, r) { - var bxs = boxesForGauss(r, 3); - boxBlur (scl, tcl, w, h, (bxs[0]-1)/2); - boxBlur (tcl, scl, w, h, (bxs[1]-1)/2); - boxBlur (scl, tcl, w, h, (bxs[2]-1)/2); -} - -function boxesForGauss(sigma, n) // standard deviation, number of boxes -{ - var wIdeal = Math.sqrt((12*sigma*sigma/n)+1); // Ideal averaging filter width - var wl = Math.floor(wIdeal); if(wl%2==0) wl--; - var wu = wl+2; - - var mIdeal = (12*sigma*sigma - n*wl*wl - 4*n*wl - 3*n)/(-4*wl - 4); - var m = Math.round(mIdeal); - // var sigmaActual = Math.sqrt( (m*wl*wl + (n-m)*wu*wu - n)/12 ); - - var sizes = []; for(var i=0; ik;k++)c.push(k= 0 && scy < sh && scx >= 0 && scx < sw){ - scy = Math.min(sh-1, Math.max(0, sy + cy - halfSide)); - scx = Math.min(sw-1, Math.max(0, sx + cx - halfSide)); - srcOff = (scy * sw + scx)*4; - wt = weights[cy * side + cx]; - r += src[srcOff] * wt; - g += src[srcOff+1] * wt; - b += src[srcOff+2] * wt; - a += src[srcOff+3] * wt; - // } - } - } - dst[dstOff] = r; - dst[dstOff+1] = g; - dst[dstOff+2] = b; - dst[dstOff+3] = a + alphaFac*(255-a); - } - } - return pixels; - } - - function convolveFloat32(ctx, pixels, weights, opaque){ - var x, y, sx, sy, scx, scy, dstOff, cx, cy, srcOff, wt, r, g, b, a; - var side = Math.round(Math.sqrt(weights.length)); - var halfSide = Math.floor(side/2); - - var src = pixels.data; - var sw = pixels.width; - var sh = pixels.height; - - var w = sw; - var h = sh; - var output = { - width: w, height: h, data: new Float32Array(w*h*4) - }; - var dst = output.data; - var alphaFac = opaque ? 1 : 0; - for (y = 0; y < h; y++){ - for (x = 0; x < w; x++){ - sy = y; - sx = x; - dstOff = (y * w + x) * 4; - r = 0; g = 0; b = 0; a = 0; - for (cy = 0; cy < side; cy++){ - for (cx = 0; cx < side; cx++){ - scy = Math.min(sh-1, Math.max(0, sy + cy - halfSide)); - scx = Math.min(sw-1, Math.max(0, sx + cx - halfSide)); - srcOff = (scy*sw + scx)*4; - wt = weights[cy*side + cx]; - r += src[srcOff] * wt; - g += src[srcOff+1] * wt; - b += src[srcOff+2] * wt; - a += src[srcOff+3] * wt; - } - } - dst[dstOff] = r; - dst[dstOff+1] = g; - dst[dstOff+2] = b; - dst[dstOff+3] = a + alphaFac*(255-a); - } - } - return output.data; - } - - function luminance(ctx, imageData){ - var i, v; - var data = imageData.data; - for(i = 0; i < data.length; i += 4){ - // CIE luminance for the RGB - // Human eye is bad at seeing red and blue, so de-emphasize them. - v = 0.2126*data[i] + 0.7152*data[i+1] + 0.0722*data[i+2]; - data[i] = data[i+1] = data[i+2] = v; - } - return imageData; - } - - function greyscale(ctx, imageData){ - var i, v; - var data = imageData.data; - for(i = 0; i < data.length; i += 4){ - v = 0.299*data[i] + 0.587*data[i+1] + 0.114*data[i+2]; - data[i] = data[i+1] = data[i+2] = v; - } - return imageData; - } - - function greyscaleAvg(ctx, imageData){ - var i, v; - var data = imageData.data; - for(i = 0; i < data.length; i += 4){ - v = (data[i] + data[i+1] + data[i+2])/3; - data[i] = data[i+1] = data[i+2] = v; - } - return imageData; - } - - function duotone(ctx, imageData, which) { - var i, r; - var data = imageData.data; - switch(which){ - case "r": - which = 0; - break; - case "g": - which = 1; - break; - case "b": - which = 2; - break; - default: - which = 0; - break; - } - for(i = 0; i < data.length; i += 4) { - // average the other two colors for this pixel - r = (data[i] + data[i+1] + data[i+2] - data[i+which])/2; - data[i+which] = r; - } - return imageData; - } - - function noise(ctx, imageData, lower, upper){ - var i, radius, mod; - var data = imageData.data; - if(arguments.length < 3){ - lower = -30; - upper = 30; - } else if( arguments.length === 3 ){ - upper = lower; - lower = -lower; - } - radius = upper - lower; - for(i = 0; i < data.length; i += 4){ - mod = Math.floor((Math.random() * radius) - upper); - data[i] += mod; - data[i+1] += mod; - data[i+2] += mod; - } - return imageData; - } - - function invert(ctx, imageData){ - var i; - var data = imageData.data; - for(i = 0; i < data.length; i += 4){ - data[i] = 255 - data[i]; - data[i+1] = 255 - data[i+1]; - data[i+2] = 255 - data[i+2]; - } - return imageData; - } - - function pixelate(ctx, imageData, radius){ - var r, g, b, idx, odx, ody; - var x, y, nx, ny, delta, ioff; - var width = imageData.width; - var height = imageData.height; - var data = imageData.data; - if(arguments.length < 3){ - radius = 2; - } - if( radius <= 0 ){ - return imageData; - } - delta = (2 * radius); - for(y = radius; y < height - radius; y += delta){ - for(x = radius; x < width - radius; x += delta){ - idx = ((width * y) + x) * 4; - r = data[idx]; - g = data[idx + 1]; - b = data[idx + 2]; - for(ny = -radius; ny < radius; ++ny){ - ody = (width*(y + ny)); - for(nx = -radius; nx < radius; ++nx){ - odx = (ody + (x + nx)) * 4; - data[odx] = r; - data[odx+1] = g; - data[odx+2] = b; - } - } - } - } - ioff = height % delta ? height % delta : delta; - for(y = height - ioff; y < height; y++){ - ody = width * y; - for(x = 0; x < width; x++){ - odx = (x + ody) * 4; - data[odx] = 0; - data[odx+1] = 0; - data[odx+2] = 0; - } - } - ioff = width % delta ? width % delta : delta; - for(y = 0; y < height; y++){ - ody = width * y; - for(x = width - ioff; x < width; x++){ - odx = (x + ody) * 4; - data[odx] = 0; - data[odx+1] = 0; - data[odx+2] = 0; - } - } - return imageData; - } - - function gamma(ctx, imageData, amount){ - var i; - var data = imageData.data; - if(arguments.length < 3){ - amount = 0.2; - } - for(i = 0; i < data.length; i += 4){ - data[i] = 255 * Math.pow(data[i] / 255, amount); - data[i+1] = 255 * Math.pow(data[i+1] / 255, amount); - data[i+2] = 255 * Math.pow(data[i+2] / 255, amount); - } - return imageData; - } - - function brighten(ctx, imageData, a){ - var i; - var data = imageData.data; - if(arguments.length < 3){ - a = 10; - } - for(i = 0; i < data.length; i += 4){ - data[i] += a; - data[i+1] += a; - data[i+2] += a; - } - return imageData; - } - - function sepia(ctx, imageData, adjust){ - var i, r, g, b; - var data = imageData.data; - if( adjust === undefined ){ - adjust = 100; - } - adjust /= 100; - for(i = 0; i < data.length; i += 4){ - r = data[i]; - g = data[i+1]; - b = data[i+2]; -// data[i] = (r * 0.393) + (g * 0.769) + (b * 0.189); -// data[i+1] = (r * 0.349) + (g * 0.686) + (b * 0.168); -// data[i+2] = (r * 0.272) + (g * 0.534) + (b * 0.131); - // Caman.js - // All three color channels have special conversion factors that - // define what sepia is. Here we adjust each channel individually, - // with the twist that you can partially apply the sepia filter. - data[i] = Math.min(255, (r * (1 - (0.607 * adjust))) + (g * (0.769 * adjust)) + (b * (0.189 * adjust))); - data[i+1] = Math.min(255, (r * (0.349 * adjust)) + (g * (1 - (0.314 * adjust))) + (b * (0.168 * adjust))); - data[i+2] = Math.min(255, (r * (0.272 * adjust)) + (g * (0.534 * adjust)) + (b * (1- (0.869 * adjust)))); - } - return imageData; - } - - function contrast(ctx, imageData, amount){ - var i; - var data = imageData.data; - if(arguments.length < 3){ - amount = 2; - } - if(amount < -100){ - amount = -100; - } else if(amount > 100){ - amount = 100; - } - for(i = 0; i < data.length; i += 4){ - data[i] = ((((data[i] / 255) - 0.5) * amount) + 0.5) * 255; - data[i+1] = ((((data[i+1] / 255) - 0.5) * amount) + 0.5) * 255; - data[i+2] = ((((data[i+2] / 255) - 0.5) * amount) + 0.5) * 255; - } - return imageData; - } - - function threshold(ctx, imageData, thresh, low, high){ - var i, r, g, b, val; - var data = imageData.data; - if(arguments.length < 3){ - thresh = 10; - low = 0; - high = 255; - } else if(arguments.length < 5){ - low = 0; - high = 255; - } - for(i = 0; i < data.length-1; i += 4){ - r = data[i]; - g = data[i+1]; - b = data[i+2]; - val = (0.2126*r + 0.7152*g + 0.0722*b >= thresh) ? high : low; - data[i] = data[i+1] = data[i+2] = val; - } - return imageData; - } - - function medianFilter(ctx, imageData){ - return convolve(ctx, imageData, - [1,0,0,0,1,0,1,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,0,0,1], - true, true); - } - - function sobel(ctx, imageData, colorize){ - var i, v, h; - var vertical, horizontal; - var data = imageData.data; - imageData = greyscaleAvg(ctx, imageData); - horizontal = convolveFloat32(ctx, imageData, - [ -1, 0, 1, -2, 0, 2, -1, 0, 1 ]); - vertical = convolveFloat32(ctx, imageData, - [ -1, -2, -1, 0, 0, 0, 1, 2, 1 ]); - if(colorize){ - for (i=0; i total){ - swap = true; - } - } - } - } - return imageData; - } - - function solarize(ctx, imageData, threshold){ - var i, r, g, b, intensity; - var data = imageData.data; - if(arguments.length < 3){ - threshold = 50; - } - for(i = 0; i < data.length; ++i){ - r = data[i]; - g = data[i+1]; - b = data[i+2]; - intensity = (r + g + b)/3.0; - if(intensity < threshold){ - data[i] = 255 - r; - data[i+1] = 255 - g; - data[i+2] = 255 - b; - } - } - return imageData; - } - -// function blur(ctx, imageData){ -// return convolve(ctx, imageData, -// [ 1, 2, 1, 2, 1, 2, 1, 2, 1 ], -// true, true); -// } - // JSManipulate.js - function blur(ctx, imageData, amount){ - var width = imageData.width; - var width4 = width << 2; - var height = imageData.height; - var data = imageData.data; - var q, qq, qqq, b0, b1, b2, b3, bigB, index, indexLast; - var pixel, ppixel, pppixel, ppppixel; - var c = 0; - if( amount === undefined ){ - amount = 30; - } - amount /= 10; - if (amount < 0.0) { - amount = 0.0; - } - if (amount >= 2.5) { - q = 0.98711 * amount - 0.96330; - } else if (amount >= 0.5) { - q = 3.97156 - 4.14554 * Math.sqrt(1.0 - 0.26891 * amount); - } else { - q = 2 * amount * (3.97156 - 4.14554 * Math.sqrt(1.0 - 0.26891 * 0.5)); - } - qq = q * q; - qqq = qq * q; - b0 = 1.57825 + (2.44413 * q) + (1.4281 * qq ) + (0.422205 * qqq); - b1 = ((2.44413 * q) + (2.85619 * qq) + (1.26661 * qqq)) / b0; - b2 = (-((1.4281 * qq) + (1.26661 * qqq))) / b0; - b3 = (0.422205 * qqq) / b0; - bigB = 1.0 - (b1 + b2 + b3); - for (c = 0; c < 3; c++) { - for (var y = 0; y < height; y++) { - index = y * width4 + c; - indexLast = y * width4 + ((width - 1) << 2) + c; - pixel = data[index]; - ppixel = pixel; - pppixel = ppixel; - ppppixel = pppixel; - for (; index <= indexLast; index += 4) { - pixel = bigB * data[index] + b1 * ppixel + b2 * pppixel + b3 * ppppixel; - data[index] = pixel; - ppppixel = pppixel; - pppixel = ppixel; - ppixel = pixel; - } - index = y * width4 + ((width - 1) << 2) + c; - indexLast = y * width4 + c; - pixel = data[index]; - ppixel = pixel; - pppixel = ppixel; - ppppixel = pppixel; - for (; index >= indexLast; index -= 4) { - pixel = bigB * data[index] + b1 * ppixel + b2 * pppixel + b3 * ppppixel; - data[index] = pixel; - ppppixel = pppixel; - pppixel = ppixel; - ppixel = pixel; - } - } - } - for (c = 0; c < 3; c++) { - for (var x = 0; x < width; x++) { - index = (x << 2) + c; - indexLast = (height - 1) * width4 + (x << 2) + c; - pixel = data[index]; - ppixel = pixel; - pppixel = ppixel; - ppppixel = pppixel; - for (; index <= indexLast; index += width4) { - pixel = bigB * data[index] + b1 * ppixel + b2 * pppixel + b3 * ppppixel; - data[index] = pixel; - ppppixel = pppixel; - pppixel = ppixel; - ppixel = pixel; - } - index = (height - 1) * width4 + (x << 2) + c; - indexLast = (x << 2) + c; - pixel = data[index]; - ppixel = pixel; - pppixel = ppixel; - ppppixel = pppixel; - for (; index >= indexLast; index -= width4) { - pixel = bigB * data[index] + b1 * ppixel + b2 * pppixel + b3 * ppppixel; - data[index] = pixel; - ppppixel = pppixel; - pppixel = ppixel; - ppixel = pixel; - } - } - } - } - - - function edgeDetect(ctx, imageData){ - return convolve(ctx, imageData, - [ -1, -1, -1, -1, 8, -1, -1, -1, -1 ]); - } - - function sharpen(ctx, imageData, amount){ - if(arguments.length < 3){ - amount = 20; - } - return convolve(ctx, imageData, - [ 0, -1, 0, -1, amount, -1, 0, -1, 0 ], - true, true); - } - - function emboss(ctx, imageData, amount){ - if(arguments.length < 3){ - amount = 95; - } - return convolve(ctx, imageData, - [ -18, -9, 9, -9, 100 - amount, 9, 0, 9, 18 ], - true, true); - } - - function lighten(ctx, imageData, amount){ - if(arguments.length < 3 || amount < 0){ - amount = 12/9; - } - return convolve(ctx, imageData, [ 0, 0, 0, 0, amount, 0, 0, 0, 0 ]); - } - - function darken(ctx, imageData, amount){ - if(arguments.length < 3 || amount > 1){ - amount = 6/9; - } - return convolve(ctx, imageData, [ 0, 0, 0, 0, amount, 0, 0, 0, 0 ]); - } - - return { - convolve : convolve, - luminance : luminance, - greyscale : greyscale, - greyscaleAvg : greyscaleAvg, - brighten : brighten, - noise : noise, - duotone : duotone, - invert : invert, - pixelate : pixelate, - sobel : sobel, - medianFilter : medianFilter, - sepia : sepia, - contrast : contrast, - threshold : threshold, - gamma : gamma, - gaussBlur5 : gaussBlur5, - posterize : posterize, - scatter : scatter, - solarize : solarize, - sharpen : sharpen, - edgeDetect : edgeDetect, - blur : blur, - emboss : emboss, - lighten : lighten, - darken : darken - }; -}()); diff --git a/web/static/js9_old/js/imagefilters.min.js b/web/static/js9_old/js/imagefilters.min.js deleted file mode 100644 index cdb9742..0000000 --- a/web/static/js9_old/js/imagefilters.min.js +++ /dev/null @@ -1,15 +0,0 @@ -var ImageFilters; -ImageFilters=function(){function D(c){var d;var a=c.reduce(function(a,c){return a+c});for(d=0;darguments.length&&(a=10);for(b=0;barguments.length?(a=-30,b=30):3===arguments.length&&(b=a,a=-a);var g=b-a;for(e=0;earguments.length&&(a=2);if(0>=a)return d;var q=2*a;for(e=a;earguments.length&&(a=2);-100> -a?a=-100:100arguments.length?(a=10,b=0,e=255):5>arguments.length&&(b=0,e=255);for(f=0;f=a?e:b;g[f]=g[f+1]=g[f+2]=h}return d},gamma:function(c,d,a){var b,e=d.data;3>arguments.length&&(a=.2);for(b=0;barguments.length&&(a=40);for(b=0;256>b;++b)barguments.length&&(a=5);if(0>=a)return d;var m=2*a;var q=(a-1)*a;for(e=a;eq&&(n=!0)}}return d},solarize:function(c,d,a){var b,e=d.data;3>arguments.length&&(a=50);for(b=0;barguments.length&&(a=20);return v(c,d,[0,-1,0,-1,a,-1,0,-1,0],!0,!0)},edgeDetect:function(c,d){return v(c,d,[-1,-1,-1,-1,8,-1,-1,-1,-1])},blur:function(c,d,a){c=d.width;var b=c<<2,e=d.height;d=d.data;var f,g,h,k,m;void 0===a&& -(a=30);a/=10;0>a&&(a=0);a=2.5<=a?.98711*a-.9633:.5<=a?3.97156-4.14554*Math.sqrt(1-.26891*a):2*a*(3.97156-4.14554*Math.sqrt(.865545));var q=a*a;var n=q*a;var p=1.57825+2.44413*a+1.4281*q+.422205*n;a=(2.44413*a+2.85619*q+1.26661*n)/p;q=-(1.4281*q+1.26661*n)/p;n=.422205*n/p;p=1-(a+q+n);for(m=0;3>m;m++)for(var r=0;r=t;l-=4)f=p*d[l]+a*g+q*h+n*k,d[l]=f, -k=h,h=g,g=f}for(m=0;3>m;m++)for(r=0;r=t;l-=b)f=p*d[l]+a*g+q*h+n*k,d[l]=f,k=h,h=g,g=f}},emboss:function(c,d,a){3>arguments.length&&(a=95);return v(c,d,[-18,-9,9,-9,100-a,9,0,9,18],!0,!0)},lighten:function(c,d,a){if(3>arguments.length||0>a)a=12/9;return v(c,d,[0,0,0,0,a,0,0,0,0])},darken:function(c,d,a){if(3>arguments.length||1 elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = Object.create( null ); - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - JS9 - - -
    -
    -
    -
    -
    -
    - -

    - - diff --git a/web/static/js9_old/js9.js b/web/static/js9_old/js9.js deleted file mode 100644 index 9a84380..0000000 --- a/web/static/js9_old/js9.js +++ /dev/null @@ -1,28462 +0,0 @@ -/* - * - * JS9: astronomical image display everywhere (December 10, 2012) - * - * Principals: Eric Mandel, Alexey Vikhlinin - * Organization: Center for Astrophysics | Harvard & Smithsonian, Cambridge MA - * Contact: emandel@cfa.harvard.edu - * - * Copyright (c) 2012 - 2022 Smithsonian Astrophysical Observatory - * - */ - -/*global JS9Prefs, JS9Inline, $, jQuery, fabric, io, sprintf, Astroem, dhtmlwindow, saveAs, Spinner, ResizeSensor, Jupyter, gaussBlur, ImageFilters, Plotly, tinycolor, regSelect */ - -"use strict"; - -// ensure Emscripten's Module object is available so we can pass properties -// (e.g. wasmBinary) in js9prefs.js and during JS9.init() -// (use var to add to global scope because it's how Emscripten does it) -var Module; -if( typeof Module !== "object" ){ Module = {}; } - -// generate and expose JS9 module -// (use var to add to global scope for backward compatibility with previous ES5) -var JS9 = (function(){ - -// module header -const JS9 = {}; -JS9.NAME = "JS9"; // The name of this namespace -JS9.VERSION = "3.8"; // The version of this namespace -JS9.COPYRIGHT = "Copyright (c) 2012-2022 Smithsonian Institution"; -JS9.ABOUT = `JS9 ${JS9.VERSION}: astronomical image display everywhere\nEric Mandel, Alexey Vikhlinin\n${JS9.COPYRIGHT}`; - -// internal defaults (not usually changed by users) -JS9.DEFID = "JS9"; // default JS9 display id -JS9.WIDTH = 512; // width of js9 canvas -JS9.HEIGHT = 512; // height of js9 canvas -JS9.ANON = "Anonymous"; // name to use for images with no name -JS9.PREFSFILE = "js9Prefs.json";// prefs file to load -JS9.WORKERFILE = "js9worker.js";// js9 web worker file to load -JS9.ZINDEX = 0; // z-index of image canvas: on bottom of js9 -JS9.SHAPEZINDEX = 4; // base z-index of shape layers layers -JS9.MESSZINDEX = 80; // z-index of messages: above graphics -JS9.BTNZINDEX = 90; // z-index of buttons on top of plugin canvases -JS9.MENUZINDEX = 1000; // z-index of menus: always on top! -JS9.COLORSIZE = 1024; // size of contrast/biased color array -JS9.SCALESIZE = 16384; // size of scaled color array -JS9.INVSIZE = 1024; // size of inverse array -JS9.HISTSIZE = 16384; // size of histogram equalization array -JS9.INSTALLDIR=""; // prefix to get to js9 install directory -JS9.TOROOT=""; // prefix to get to data file from install -JS9.PLUGINS=""; // regexp list of plugins -JS9.LIGHTWIN = "dhtml"; // light window type: choice of dhtml -JS9.ANTIALIAS = false; // use anti-aliasing? -JS9.SCALEIREG = true; // scale interactive regions by zoom factor? -JS9.NOMOVE = 3; // number of pixels before we recognize movement -JS9.DBLCLICK0 = 5; // < millisec => same event -JS9.DBLCLICK = 300; // < millisec => double-click -JS9.TIMEOUT = 250; // millisec before assuming light window is up -JS9.SPINOUT = 250; // millisec before assuming spinner is up -JS9.WORKEROUT = 2000; // millisec before restarting worker socket -JS9.SUPERMENU = /^SUPERMENU_/; // base of supermenu id -JS9.RESIZEDIST = 20; // size of rectangle defining resize handle -JS9.RESIZEFUDGE = 5; // fudge for webkit resize problems -JS9.RAWID0 = "raw0"; // default raw id -JS9.RAWIDX = "alt"; // default "alternate" raw id -JS9.IDFMT = " (%s)"; // format for light window id -JS9.MINZOOM = 0.125; // min zoom using scroll wheel -JS9.MAXZOOM = 32.0; // max zoom using scroll wheel -JS9.ADDZOOM = 0.1; // add/subtract amount per mouse wheel click -JS9.MODZOOM = 2; // skip factor with wheel to avoid pileup -JS9.DIRZOOM = 1; // sign (+/-) determines zoom direction -JS9.CHROMEFILEWARNING = true; // whether to alert chrome users about file URI -JS9.CLIPBOARDERROR = "the local clipboard (which only holds data copied from within JS9) does not contain any content. Were you trying to paste something copied outside JS9?"; -JS9.CLIPBOARDERROR2 = "the local clipboard (which only holds data copied from within JS9) does not contain any regions"; -JS9.URLEXP = /^(https?|ftp):\/\//; // url to determine a web page -JS9.WCSEXP = /^(fk4|fk5|icrs|galactic|ecliptic|image|physical|linear)$/; -JS9.REGSIZE = 0; // 0 -> cdelt, 1 -> ang sep (regions use #0) - -// https://hacks.mozilla.org/2013/04/detecting-touch-its-the-why-not-the-how/ -JS9.TOUCHSUPPORTED = ({}.hasOwnProperty.call(window, "ontouchstart") || (navigator.maxTouchPoints > 0) || (navigator.msMaxTouchPoints > 0)); -// modified from: -// http://stackoverflow.com/questions/2400935/browser-detection-in-javascript -// https://stackoverflow.com/questions/58019463/how-to-detect-device-name-in-safari-on-ios-13-while-it-doesnt-show-the-correct -JS9.BROWSER = (function(){ - const P = navigator.platform; - const N = navigator.appName; - const ua = navigator.userAgent; - const tem = ua.match(/version\/([.\d]+)/i); - let M = ua.match(/(opera|chrome|safari|firefox)\/?\s*(\.?\d+(\.\d+)*)/i); - if( M && tem !== null ){ M[2] = tem[1]; } - M = M? [M[1], M[2], P]: [N, navigator.appVersion,"-?", P]; - M.push(/Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(ua) || - (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)); - return M; -}()); -// convenience to allow plugins to deal with HiDPI ratio blurring -// http://stackoverflow.com/questions/15661339/how-do-i-fix-blurry-text-in-my-html5-canvas -JS9.PIXEL_RATIO = (function(){ - const ctx = document.createElement("canvas").getContext("2d"), - dpr = window.devicePixelRatio || 1, - bsr = ctx.webkitBackingStorePixelRatio || - ctx.mozBackingStorePixelRatio || - ctx.msBackingStorePixelRatio || - ctx.oBackingStorePixelRatio || - ctx.backingStorePixelRatio || 1; - - return dpr / bsr; -}()); - -// global options -JS9.globalOpts = { - helperType: "none", // one of: sock.io, get, post, none - helperPort: 2718, // default port for node.js helper - requireHelper: false, // throw error if helper is not available? - allinoneHelper: false, // allow allinone to use helper? - processQueryParams: true, // process query parameters from url? - quietReturn: false, // should API return empty string or "OK"? - useWasm: true, // use WebAssembly if available? - transforms: ["flip", "rot90", "rotate"], // order for processing transforms - rotateRelative: false, // is setRotate() relative or absolute? - clickToFocus: false, // how to change focus on the display - winType: "light", // plugin window: "light" or "new" - sortPreloads: true, // sort preloads into original order after load? - defcolor: "#00FF00", // graphics color when all else fails - fits2fits: "never", // convert to repfile? always|never|size>x Mb - requireFits2Fits: false, // throw error if fits2fits can't be run? - localAccess: true, // access files locally, when available? - prependJS9Dir: true, // prepend $JS9_DIR to relative fitsFile paths? - dataDir: null, // path to FITS data (def: use incoming path) - alerts: true, // set to false to turn off alerts - valposTarget: null, // target element for valpos updates - valposWidth: "medium", // small, medium, large - valposDCoords: false, // show display coords in valpos? - internalValPos: true, // a fancy info plugin can turns this off - internalContrastBias: true, // a fancy colorbar plugin can turns this off - containContrastBias: false, // contrast/bias only when mouse is in display? - arrowIncrement: 1, // how much to move a region using arrow keys - wcsCrosshair: false, // enable wcs crosshair matching? - localLoadFormat: "image", // current format when loading local files - remoteLoadMethod: "proxy", // proxy or cors when loading remote file - csvIncludeWCS: true, // does Get/SaveRegions(csv) include wcs info? - regWhichDefault: "auto", // "auto" => selected or all, "all" is all - regIncludeJSON: true, // does SaveRegions(reg) include the json info? - regIncludeComments: true, // does SaveRegions(reg) include the comments? - regListDCoords: false, // ListRegions(reg) list preserved disp coords? - regSaveDCoords: false, // SaveRegions(reg) save preserved disp coords? - regExpandDCoords: false, // ExpandMacro(reg) use preserved disp coords? - regCopyDCoords: true, // CopyRegions(reg) copy preserved disp coords? - regArrowCrosshair: true, // does move with arrow keys display crosshair? - regSaveWCS: "", // def wcs for saving regions - regSaveFormat: "reg", // def format for saving regions (reg,cvs,svg) - regSaveWhich1: "all", // def 'which' for saving regions (all,selected) - regSaveWhich2: "selected", // def 'which' for saving in configure dialog - regMenuCreate: true, // menu select a region creates it immediately - regMenuSelection: "circle", // region selected during last menu select - regToClipboard: false, // copy all region changes to pseudo-clipboard? - regGroupConflict: "skip", // group conflicts: error or skip - regConfigAddParens: true, // does the reg configure gui try to add parens? - regSyncTextColor: true, // sync region text color with main color? - regDisplay: "lightwin", // "lightwin" or "display" - reConfigSize: "medium", // "small", "medium" - htimeout: 10000, // connection timeout for the helper connect - lhtimeout: 10000, // connection timeout for local helper connect - ehtimeout: 500, // connection timeout for Electron connect - ehretries: 20, // connection retries Electron connect - xtimeout: 600000, // connection timeout for fetch data requests - extlist: "EVENTS STDEVT", // list of binary table extensions - imopts: "IMOPTS", // basename of FITS param containing json opts - imcmap: "IMCMAP", // basename of FITS param containing cmaps - table: {xdim: 4096, ydim: 4096, bin: 1, bitpix: 32},// image section size to extract from table - image: {xdim: 4096, ydim: 4096, bin: 1},// image section size (unlimited=0) - binMode: "s", // "s" (sum) or "a" (avg) pixels when binning - reprojSwitches: "", // Montage reproject switches - reprojectLimits: false, // internal: check for reprojection limits? - rotationCenter: "file", // "current" display center or "file" (CRPIX1,2) - runOnCR: true, // Run forms such as binning when pressed? - clearImageMemory: "heap", // rm vfile: always|never|auto|noExt|noCube|size>x Mb heap=>free heap - helperProtocol: location.protocol, // http: or https: - reloadRefresh: false, // reload an image will refresh (or redisplay)? - reloadRefreshReg: true, // reloading regions file removes previous? - nextImageMask: false, // does nextImage() show active image masks? - panMouseThreshold: 1, // pixels mouse must move before we pan - panzoomRefreshLimit: 500, // # of shapes before avoiding refresh - panWithinDisplay: false, // keep panned image within the display? - pannerDirections: true, // display direction vectors in panner? - magnifierRegions: true, // display regions in magnifier? - editRegions: true, // double-click to edit regions? - svgBorder: true, // border around the display when saving to svg? - unremoveReg: 100, // how many removed regions to save - resetEmptyShapeId: false, // reset nshape counter if all shapes removed? - maxMemory: 2000000000, // max heap memory to allocate for a fits image - loadURL: "params/load.html",// location of param html file - corsURL: "params/loadcors.html", // location of param html file - proxyURL: "params/loadproxy.html", // location of param html file - loadProxy: false, // do we allow proxy load requests to server? - imsectionURL: "params/imsection.html", // location of param html file - postMessage: false, // allow communication through iframes? - localStorage: true, // use localStorage for session params? - waitType: "spinner", // "spinner" or "mouse" - spinColor: "#FF0000", // color of spinner - spinOpacity: 0.35, // opacity of spinner - resize: true, // allow resize of display? - resizeHandle: true, // add resize handle to display? - resizeRedisplay: true, // redisplay image while resizing? - logoDisplay: false, // show JS9 logo on each display? - logo: "images/js9logo.png", // show JS9 logo on each display? - lightWinPos: "center=1", // "left=n,top=m" offset from left,top of window - lightWinClose: "ask", // ask, close, move images when closing lightwin - fallbackDisplay: true, // displayMessage fallback to display window? - refreshDragDrop: true, // refresh on drag/drag and open file? - reduceMosaic: "js9", // "js9" or "shrink" ("js9" seems to be faster) - internalRegcnts: true, // make internal regcnts analysis available? - reduceRegcnts: true, // reduce image when doing counts in regions? - plot3d: {cube:"*:*:all", mode:"avg", areaunits:"pixels", color: "green"}, // plot3d options: avg/sum, pixels/arcsecs - imexamLineHeight: 1, // "height" of line region section - copyWcsPosFormat: "$ra $dec $sys", // format for copy wcs pos to clipboard - floatPrecision: 6, // precision for floatToString() - mouseActions: ["display value/position", "change contrast/bias", "pan the image"],// 0,1,2 mousepress - touchActions: ["display value/position", "change contrast/bias", "pan the image"],// 1,2,3 fingers - keyboardActions: { - a: "add last region selected in regions menu", - b: "toggle selected region: source/background", - c: "toggle crosshair", - d: "send selected region to back", - e: "toggle selected region: include/exclude", - "M-e": "edit selected region(s)", - i: "refresh image", - I: "display full image", - "M-i": "display selected cutouts", - "M-k": "toggle keyboard actions plugin", - l: "toggle active shape layers", - "M-l": "new JS9 light window", - m: "pan to mouse position", - "M-m": "toggle mouse/touch plugin", - "M-o": "open local file", - P: "paste regions from local clipboard", - p: "paste regions to current position", - "M-,": "toggle preferences plugin", - "M-p": "toggle preferences plugin", - r: "copy region(s) to clipboard", - s: "select region", - S: "select all regions", - "M-s": "toggle shape layers plugin", - u: "undo remove of region(s)", - U: "unselect all regions", - x: "flip image around x axis", - y: "flip image around y axis", - "9": "rotate image by 90 degrees", - "/": "copy wcs position to clipboard", - "?": "copy value and position to clipboard", - "0": "reset zoom", - "=": "zoom in", - "+": "zoom in", - "-": "zoom out", - "^": "raise region layer to top", - ">": "display next image", - "<": "display previous image", - "delete": "remove selected region", - "leftArrow": "move region/position left", - "upArrow": "move region/position up", - "rightArrow": "move region/position right", - "downArrow": "move region/position down" - }, // keyboard actions - mousetouchZoom: false, // use mouse wheel, pinch to zoom? - mousetouchLimit: true, // limit zoom-out to size of image? - metaClickPan: true, // metaKey + click pans to mouse position? - // statusBar: "$mag; $scale($scaleclipping); $img(images/voyager/color_$colormap.png) $colormap; $wcssys; $image", // status display - statusBar: "$colorbar; $colormap; $mag; $scale ($scalemin,$scalemax); $wcssys; $image0", // status display - toolbarTooltips: false, // display tooltips on toolbar? - updateTitlebar: true, // update titlebar when image changes? - centerDivs: ["JS9Menubar"], // divs which take part in JS9.Display.center() - resizeDivs: ["JS9Menubar", "JS9Colorbar", "JS9Toolbar", "JS9Statusbar"], // divs which take part in JS9.Display.resize() - pinchWait: 8, // number of events to wait before testing pinch - pinchThresh: 6, // threshold for pinch test - xeqPlugins: true, // execute plugin callbacks? - extendedPlugins: true, // enable extended plugin support? - intensivePlugins: false, // enable intensive plugin support? - dynamicSelect: "click", // dynamic plugins: "click", "move", or false - dynamicHighlight: true, // highlight dynamic selection - corsProxy: "https://js9.si.edu/cgi-bin/CORS-proxy.cgi", // CORS proxy - simbadProxy:"https://js9.si.edu/cgi-bin/simbad-proxy.cgi", // simbad proxy - cgiProxy: "https://js9.si.edu/cgi-bin/FITS-proxy.cgi", // CGI proxy - catalogs: {ras: ["RA", "_RAJ2000", "RAJ2000"], // cols to search for .. - decs: ["Dec", "_DEJ2000", "DEJ2000"],// when loading catalogs - shape: "circle", // object shape - color: "yellow", // object color - width: 7, // box object width - height: 7, // box object height - radius: 3.5, // circle object radius - r1: 5.0, // ellipse object r1 - r2: 3.5, // ellipse object r2 - wcssys: "ICRS", // wcs system - skip: "#\n", // skip # and blank lines - save: true, // save cat cols in shapes - tooltip: "$data.ra $data.dec"}, // tooltip format - topColormaps: ["grey", "heat", "cool", "turbo", "viridis", "magma", "sls", "red", "green", "blue"], // toplevel colormaps - infoBox: ["file", "object", "wcsfov", "wcscen", "wcspos", "impos", "physpos", "value", "regions", "progress"], - infoBoxResize: true, // is size based on wcs? - menuBar: ["file", "edit", "view", "zoom", "scale", "color", "region", "wcs", "analysis", "help"], - menubarStyle: "classic", // mac or classic - menuPosition: "right-5 bottom-5", // where menus pop up - menuClickEvent: "mouseup", // "click" or "mouseup" - menuSelected: "check", // selected option icon - menuImages: true, // show pngs in menu? - userMenus: false, // add user menus? - userMenuDivider: "   ", // divide before user menu - imagesFileSubmenu: 5, // how many images trigger a submenu? - toolBar: ["annulus", "box", "circle", "ellipse", "line", "polygon", "text", "zoom+", "zoom-", "zoom1", "zoomtofit"], - syncOps: ["alignment","colormap","contrastbias","flip","pan","regions","rotate", "rot90","scale","wcs","zoom"], // which ops are sync'ed? - syncReciprocate: true, // default value for reciprocal sync'ing - syncWCS: true, // default value for using WCS to sync - hiddenPluginDivs: [], // which static plugin divs start hidden - separate: {layout: "auto", leftMargin: 10, topMargin: 10}, // separate a display - imageTemplates: ".fits,.fts,.png,.jpg,.jpeg,.fz,.ftz,.gz", // templates for local images - wcsUnits: {FK4:"sexagesimal", FK5:"sexagesimal", ICRS:"sexagesimal", - galactic:"degrees", ecliptic:"degrees", linear:"degrees", - physical:"pixels", image:"pixels"}, // def units for wcs sys - wcsSetUpdatesDef: true, // does setWCSUnits() update the default? - wcsHlength: 256000, // hlength passed to astroem wcsninit() - regTemplates: ".reg", // templates for local region file input - sessionTemplates: ".ses,.js9ses",// templates for local session file input - colormapTemplates: ".cmap", // templates for local colormap file input - catalogTemplates: ".cat,.tab", // templates for local catalog file input - localTemplates: ".fits,.fts", // templates for local file access - controlsMatchRegion: false, // true, false, "corner" or "border" - internalColorPicker: true, // use HTML5 color picker, if available? - newWindowWidth: 530, // width of LoadWindow("new") - newWindowHeight: 625, // height of LoadWindow("new") - debug: 0 // debug level -}; - -// favorites are used in dialog boxes and control boxes -JS9.favorites = { - scales: ["linear", "log", "histeq"], - colormaps: ["cool", "heat", "viridis", "magma"], - regions: ["annulus", "box", "circle", "ellipse"], - wcs: ["FK5", "ICRS", "galactic:Galactic", "physical", "image"] -// you can specify a display string using a colon-separated string or array: -// wcs: ["FK5:fk5", ["ICRS","icrs"], "galactic", "physical", "image"] -}; - -// desktop (i.e. Electron.js) defaults -// always wrap access in if( window.electron ){} -JS9.desktopOpts = { - currentPath: true, // files relative to current dir? - sessionPath: true // session files relative to session file? -}; - -// image param defaults -JS9.imageOpts = { - inherit: false, // inherit props from previous image? - contrast: 1.0, // default color contrast - bias: 0.5, // default color bias - invert: false, // default colormap invert - exp: 1000, // default exp value for scaling - colormap: "grey", // default color map - overlay: true, // display png/jpeg overlay? - scale: "linear", // default scale algorithm - scaleclipping: "dataminmax", // "dataminmax", "zscale", or "user" (when scalemin, scalemax is supplied) - scalemin: Number.NaN, // default scale min is undefined - scalemax: Number.NaN, // default scale max is undefined - flip: "none", // default flip state - rot90: 0, // default 90 deg rotation state - rotate: 0, // default rotation state - zscalecontrast: 0.25, // default from ds9 - zscalesamples: 600, // default from ds9 - zscaleline: 120, // default from ds9 - wcssys: "native", // default WCS sys - lcs: "physical", // default logical coordinate system - valpos: true, // whether to display value/position - sigma: "none", // gauss blur sigma or none - opacity: 1.0, // opacity between 0 and 1 - alpha: 255, // alpha for image (but use opacity!) - nancolor: "#000000", // 6-digit #hex color for NaN values - nocolor: {red:0,green:0,blue:0,alpha:0} , // static color map no color - // xcen: 0, // default x center pos to pan to - // ycen: 0, // default y center pos to pan to - zoom: 1, // default zoom factor - zooms: 6, // how many zooms in each direction? - topZooms: 2, // how many zooms are at top level? - wcsalign: true, // align image using wcs after reproj? - rotationMode: "relative", // default: relative or absolute? - crosshair: false, // enable crosshair? - disable: [], // list of disabled core services - ltvbug: false, // add 0.5/ltm to image LTV values? - listonchange: false, // whether to list after a reg change - whichonchange: "selected" // which to list ("all" or "selected") -}; - -// allows regions opts (in Regions.opts) to be overridden via js9prefs.js -JS9.regionOpts = {}; -// allows catalog opts (in Catalogs.opts) to be overridden via js9prefs.js -JS9.catalogOpts = {}; -// allows crosshair opts (in Crosshair.opts) to be overridden via js9prefs.js -JS9.crosshairOpts = {}; -// allows grid opts (in Grid.opts) to be overridden via js9prefs.js -JS9.gridOpts = {}; -// allows emscripten opts (in Module) to be overridden via js9prefs.js -JS9.emscriptenOpts = {}; -// allows fabric opts (in Fabric.opts) to be overridden via js9prefs.js -JS9.fabricOpts = {}; -// socket.io options -JS9.socketioOpts = { - reconnection: true, - reconnectionDelay: 1000, - reconnectionDelayMax : 10000, - reconnectionAttempts: 100, - timeout: JS9.globalOpts.htimeout -}; -// defaults for blending -JS9.blendOpts = { - active: true, - mode: "screen", - opacity: 1.0 -}; - -// defaults for masking -JS9.maskOpts = { - active: false, - mode: "overlay", // "overlay", "mask", "opacity" - opacity: 1, // overlay opacity - vopacity: 0, // mask opacity - value: 0, // mask value - syncops: ["flip", "pan", "rot90", "zoom"], - invert: false -}; - -// defaults for analysis (macro expansion) -JS9.analOpts = { - // if this pattern is matched in stderr, throw a real error - epattern: /^(ERROR:[^\n]*)\n/, - // location of datapath's param html file - dpathURL: "params/datapath.html", - // location of filepath's param html file - fpathURL: "params/filepath.html" -}; - -// light window opts -JS9.lightOpts = { - nclick: 0, - dhtml: { - topid: "#dhtmlwindowholder", - top: ".dhtmlwindow", - drag: ".drag-contentarea", - dragBar: ".drag-handle", - format: "width=%spx,height=%spx,resize=%s,scrolling=0", - textWin: "width=830px,height=400px,resize=1,scrolling=1", - // NB: dimensions are tied to .JS9Plot CSS params - plotWin: "width=830px,height=420px,resize=1,scrolling=1", - dpathWin: "width=830px,height=175px,resize=1,scrolling=1", - lcloseWin:"width=512px,height=190px,resize=1,scrolling=1", - paramWin: "width=830px,height=235px,resize=1,scrolling=1", - regWin0: "width=640px,height=130px,resize=1,scrolling=1", - regWin1: "width=640px,height=200px,resize=1,scrolling=1", - regWin: "width=640px,height=470px,resize=1,scrolling=1", - imageWin: "width=512px,height=598px,resize=1,scrolling=1", - lineWin: "width=400px,height=60px,resize=1,scrolling=1" - }, - lcloseURL: "params/lightclose.html" -}; - -// colors for text messages -JS9.textColorOpts = { - regions: "#00FF00", - info: "#00FF00", - inimage: "#000000" -}; - -// help pages -JS9.helpOpts = { - user: { - heading: "JS9Help", - type: "help", url:"user.html", - title: "User Manual" - }, - install: { - heading: "JS9Help", - type: "help", url:"install.html", - title: "Installing JS9" - }, - webpage: { - heading: "JS9Help", - type: "help", url:"webpage.html", - title: "Adding JS9 to a Web Page" - }, - yourdata: { - heading: "JS9Help", - type: "help", url:"yourdata.html", - title: "Adding Data to a Web Page" - }, - localtasks: { - heading: "JS9Help", - type: "help", url:"localtasks.html", - title: "Adding Local Analysis Tasks and Plugins" - }, - helper: { - heading: "JS9Help", - type: "help", url:"helper.html", - title: "Adding Server-side Analysis Tasks" - }, - serverside: { - heading: "JS9Help", - type: "help", url:"serverside.html", - title: "Server-side Analysis with JS9" - }, - publicapi: { - heading: "JS9Help", - type: "help", url:"publicapi.html", - title: "The JS9 Public API" - }, - extmsg: { - heading: "JS9Help", - type: "help", url:"extmsg.html", - title: "External Messaging" - }, - desktop: { - heading: "JS9Help", - type: "help", url:"desktop.html", - title: "JS9 on the Desktop" - }, - python: { - heading: "JS9Help", - type: "help", url:"python.html", - title: "JS9 with Python and Jupyter" - }, - archives: { - heading: "JS9Help", - type: "help", url:"archives.html", - title: "Accessing Data Archives" - }, - preferences: { - heading: "JS9Help", - type: "help", url:"preferences.html", - title: "Setting Site Preferences" - }, - regions: { - heading: "JS9Help", - type: "help", url:"regions.html", - title: "Regions Format" - }, - changelog: { - heading: "JS9Help", - type: "help", url:"changelog.html", - title: "ChangeLog" - }, - repfile: { - heading: "JS9Help", - type: "help", url:"repfile.html", - title: "Dealing with Large Files" - }, - memory: { - heading: "JS9Help", - type: "help", url:"memory.html", - title: "Dealing with Memory Limitations" - }, - issues: { - heading: "JS9Help", - type: "help", url:"knownissues.html", - title: "Known Issues" - }, - security: { - heading: "JS9Help", - type: "help", url:"securityissues.html", - title: "Security Issues" - } -}; - -// containers for groups of JS9 objects -JS9.images = []; // array of current images -JS9.displays = []; // array of current display canvases -JS9.colormaps = []; // array of current colormaps -JS9.commands = []; // array of commands -JS9.plugins = []; // array of defined plugins -JS9.preloads = []; // array of images to preload -JS9.auxFiles = []; // array of auxiliary files -JS9.supermenus = []; // array containing supermenu instances -JS9.preloadwaiting = []; // array of images currently being preloaded -JS9.publics = {}; // object containing defined public API calls -JS9.helper = {}; // only one helper per page, please -JS9.fits = {}; // object holding FITS access routines -JS9.userOpts = {}; // object to hold localStorage opts -JS9.tmp = {}; // global temp area -// misc params -// list of scales in mkScaledCells -JS9.scales = ["linear", "log", "histeq", "power", "sqrt", "squared", "asinh", "sinh"]; - -// list of known wcs systems -JS9.wcssyss = ["FK4", "FK5", "ICRS", "galactic", "ecliptic", - "physical", "image", "native"]; - -// list of known wcs units -JS9.wcsunitss = ["degrees", "sexagesimal", "pixels"]; - -// list of known regions -JS9.regions = ["annulus", "box", "circle", "cross", "ellipse", "line", "point", - "polygon", "text"]; - -// known bugs and work-arounds -JS9.bugs = {}; -// sometimes hiding the menu does not refresh the image properly -// JS9.bugs.hide_menu = true; -// turned off: 6/30/16 -JS9.bugs.hide_menu = false; -// firefox does not repaint as needed (last checked FF 24.0 on 10/20/13) -if( (JS9.BROWSER[0] === "Firefox") && JS9.BROWSER[2].search(/Linux/) >=0 ){ - JS9.bugs.firefox_linux = true; -} -// webkit resize is not quite up to par -// if( (JS9.BROWSER[0] === "Chrome") || (JS9.BROWSER[0] === "Safari") ){ -// only safari seems to need the extra border (4/18/20) -if( (JS9.BROWSER[0] === "Safari") ){ - JS9.bugs.webkit_resize = true; -} - -// wasm broken in ios 11.2.2, 11.2.5 and on, fixed in 11.3beta1 (1/22/2018) -// see: https://github.com/kripken/emscripten/issues/6042 -if( /iPad|iPhone|iPod/.test(navigator.platform) && - /11_2_(?:[2-9])/.test(navigator.userAgent) ){ - JS9.globalOpts.useWasm = false; -} -// iOS and presumably android has severe memory limits (05/2017) -// also force user to turn on crosshair, since it works with one finger -// also, iOS requires wider region dialog boxes to fit the buttons -if( JS9.BROWSER[3] ){ - JS9.globalOpts.maxMemory = Math.min(JS9.globalOpts.maxMemory, 350000000); - JS9.globalOpts.table.xdim = 2048; - JS9.globalOpts.table.ydim = 2048; - JS9.globalOpts.image.xdim = 2048; - JS9.globalOpts.image.ydim = 2048; - JS9.imageOpts.crosshair = false; - JS9.globalOpts.reproj = {xdim: 2048, ydim: 2048}; - JS9.lightOpts.dhtml.regWin0="width=660px,height=130px,resize=1,scrolling=1"; - JS9.lightOpts.dhtml.regWin1="width=660px,height=200px,resize=1,scrolling=1"; - JS9.lightOpts.dhtml.regWin="width=660px,height=470px,resize=1,scrolling=1"; -} -// Jupyter doesn't seem to be able to load wasm (7/4/2018) -if( {}.hasOwnProperty.call(window, "Jupyter") ){ - JS9.globalOpts.useWasm = false; -} -// JS9 desktop app using Electron.js -if( window.electron ){ - // Emscripten mount point for local file system, based on hostname - if( window.electron.hostFS ){ - JS9.hostFS = window.electron.hostFS; - } - // if multiple instances are running, turn off localStorage - if( window.electron.multiElectron ){ - JS9.globalOpts.localStorage = false; - } - // once recommended by Electron, they removed this by 8.0.0 - // still seems worthwhile, but let's put it here instead of passing it in - if( typeof window.eval === "function" ){ - window.eval = function(){ - throw new Error('For security reasons, Desktop JS9 does not support window.eval()'); - } - } - // cmdlineOpts are opts used by the app to specify the command line - if( window.electron.cmdlineOpts ){ - try{ JS9.cmdlineOpts = JSON.parse(window.electron.cmdlineOpts); } - catch(e){ delete JS9.cmdlineOpts; } - } -} - -// --------------------------------------------------------------------- -// JS9 Image object to manage images -// --------------------------------------------------------------------- - -JS9.Image = function(file, params, func){ - let i, card, pars, nzoom, display, txeq, tval; - let localOpts = null; - let nhist = 0; - let ncomm = 0; - // called with current image context - const mkscale = (opts) => { - // do zscale, if necessary - opts = opts || {}; - if( JS9.isNull(opts.scaleclipping) ){ - if( this.params.scaleclipping === "zscale" ){ - this.zscale(true); - } else if( this.params.scaleclipping === "zmax" ){ - this.zscale("zmax"); - } - } else { - if( opts.scaleclipping === "zscale" ){ - this.zscale(true); - } else if( opts.scaleclipping === "zmax" ){ - this.zscale("zmax"); - } - } - if( JS9.notNull(opts.scalemin) ){ - this.params.scalemin = opts.scalemin; - } - if( JS9.notNull(opts.scalemax) ){ - this.params.scalemax = opts.scalemax; - } - }; - // called with current image context - const finishUp = (func) => { - let i, s, topts, tkey, id, pre, waiting, plen, im; - const imopts = JS9.globalOpts.imopts; - const imcmap = JS9.globalOpts.imcmap; - const oalerts = JS9.globalOpts.alerts; - const rregexp = /(annulus|box|circle|ellipse|line|polygon|point|text) *\(/; - // add to list of images - JS9.images.push(this); - // clear previous messages - this.display.clearMessage(); - // if flip, rotate, rot90 opts were supplied, set transform - if( localOpts ){ - if( JS9.notNull(localOpts.flip) || - JS9.notNull(localOpts.rotate) || - JS9.notNull(localOpts.rot90) ){ - this.setTransform(); - } - } - // display image, 2D graphics, etc. - this.displayImage("all", localOpts); - // notify the helper - this.notifyHelper(); - // show regions layer - this.showShapeLayer("regions", true, {local: true}); - if( localOpts ){ - // pan, if necessary - if( (JS9.notNull(localOpts.x) && JS9.notNull(localOpts.y)) || - (JS9.notNull(localOpts.px) && JS9.notNull(localOpts.py)) || - (JS9.notNull(localOpts.ra) && JS9.notNull(localOpts.dec)) || - (JS9.notNull(localOpts.wcs)) ){ - this.setPan(localOpts); - } - // add regions, if necessary - if( localOpts.regions ){ - if( localOpts.regions.match(rregexp) ){ - this.addShapes("regions", localOpts.regions); - } else { - JS9.LoadRegions(localOpts.regions, {display:this.display}); - } - } - } - // no alerts while processing imopts or cmaps - JS9.globalOpts.alerts = false; - // looks for imcmap (json-formatted colormap object) in FITS header - if( this.raw && this.raw.header && this.raw.header[imcmap] ){ - // try to convert to object and set as image params - try{ topts = JSON.parse(this.raw.header[imcmap]); } - catch(e){ topts = null; } - if( topts ){ - try{ JS9.AddColormap(topts); } - catch(e){ /* empty */ } - } - } - // look for multi-line colormap (imcmap1, imcmap2, ...) in FITS header - tkey = `${imcmap}1`; - if( this.raw && this.raw.header && this.raw.header[tkey] ){ - // gather up the json string - for(i=1, s=""; i<100; i++){ - tkey = imcmap + String(i); - if( this.raw.header[tkey] ){ - s += this.raw.header[tkey]; - } else { - break; - } - } - // try to convert to object and set as image params - if( s ){ - try{ topts = JSON.parse(s); } - catch(e){ topts = null; } - if( topts ){ - try{ JS9.AddColormap(topts); } - catch(e){ /* empty */ } - } - } - } - // looks for imopts (json-formatted image param object) in FITS header - if( this.raw && this.raw.header && this.raw.header[imopts] ){ - // try to convert to object and set as image params - try{ topts = JSON.parse(this.raw.header[imopts]); } - catch(e){ topts = null; } - if( topts ){ - try{ this.setParam("all", topts); } - catch(e){ /* empty */ } - } - } - // look for multi-line imopts (imopts1, imopts2, ...) in FITS header - tkey = `${imopts}1`; - if( this.raw && this.raw.header && this.raw.header[tkey] ){ - // gather up the json string - for(i=1, s=""; i<100; i++){ - tkey = imopts + String(i); - if( this.raw.header[tkey] ){ - s += this.raw.header[tkey]; - } else { - break; - } - } - // try to convert to object and set as image params - if( s ){ - try{ topts = JSON.parse(s); } - catch(e){ topts = null; } - if( topts ){ - try{ this.setParam("all", topts); } - catch(e){ /* empty */ } - } - } - } - // restore alerts - JS9.globalOpts.alerts = oalerts; - // plugin callbacks - this.xeqPlugins("image", "onimageload"); - // load is complete - this.setStatus("load","complete"); - // done loading, reset wait cursor - JS9.waiting(false); - // everything else is done so call onload func, if necessary - if( func ){ - try{ JS9.xeqByName(func, window, this); } - catch(e){ JS9.error("in image onload callback", e, false); } - } - // might need to finish processing of preloads - if( JS9.preloadwaiting && JS9.preloadwaiting.length ){ - plen = JS9.preloadwaiting.length; - id = this.proxyURL || this.file; - // flag that this preload is loaded - for(i=0, waiting=0; i { - let ai = 0, bi = 0; - for(i=0; i 0 ){ - this.displayExtension("all"); - } - }; - // params can be an object containing local params, or the display string - if( params ){ - if( typeof params === "object" ){ - localOpts = params; - if( localOpts.display ){ - display = localOpts.display; - } - } else { - display = params; - } - } - // make sure we have a valid display - if( !display ){ - if( JS9.displays.length > 0 ){ - display = JS9.displays[0].id; - } else { - display = JS9.DEFID; - } - } - // save url, if available - // it's an image - this.type = "image"; - // set the display - this.display = JS9.lookupDisplay(display); - // initialize image params - this.params = {}; - // region stack for saving removed regions - this.regstack = []; - // image-specific scratch space - this.tmp = {}; - // current groups for each layer - this.groups = {}; - // xeq callback for region changes? - this.params.xeqonchange = true; - // copy image parameters - this.params = $.extend(true, this.params, JS9.imageOpts, localOpts); - // inherit properties, if necessary - if( this.display.image ){ - this.params.inherit = this.display.image.params.inherit; - if( this.params.inherit ){ - this.params = $.extend(true, - this.params, this.display.image.params); - } - } - // (turn off plugin call, since we are not fully loaded) - txeq = JS9.globalOpts.xeqPlugins; - // save overlay (setting colormap turns it off) - tval = this.params.overlay; - JS9.globalOpts.xeqPlugins = false; - this.setColormap(this.params.colormap); - this.params.overlay = tval; - JS9.globalOpts.xeqPlugins = txeq; - // do we display? - this.displayMode = true; - // initialize click state - this.clickState = 0; - // initialize click in region - this.clickInRegion = false; - this.clickInLayer = null; - // no helper queried yet - this.queried = false; - // is this a proxy image? - if( localOpts && localOpts.proxyFile ){ - this.proxyFile = localOpts.proxyFile; - } - // is there a proxy parent? - if( localOpts && localOpts.proxyParent ){ - this.proxyParent = localOpts.proxyParent; - } - if( localOpts && localOpts.proxyURL ){ - this.proxyURL = localOpts.proxyURL; - } - // was a "parent" FITS file specified? - if( localOpts && localOpts.parentFile ){ - this.parentFile = localOpts.parentFile; - } - // was "parent" info specified? - if( localOpts && localOpts.parent ){ - this.parent = localOpts.parent; - // convert card string to header - if( this.parent.cardstr && this.parent.ncard ){ - this.parent.raw = {header: {}, history:[], comments: []}; - for(i=0; i { - let ss; - if( (this.png.image.width !== this.raw.width) || - (this.png.image.height !== this.raw.height) ){ - ss = sprintf("rgb dims [%s,%s] don't match image [%s,%s]", - this.png.image.width, - this.png.image.height, - this.raw.width, - this.raw.height); - JS9.error(ss); - } - // store png data in an offscreen canvas - this.mkOffScreenCanvas(); - // finish up - finishUp(func); - }).on("error", () => { - // done loading, reset wait cursor - JS9.waiting(false); - JS9.error(`could not load image: ${this.id}`); - }); - // set src to download the display file - this.png.image.src = this.rgbFile; - } else { - // finish up - finishUp(func); - } - break; - default: - JS9.error(`unknown specification type for Load: ${typeof file}`); - break; - } -}; - -// return the image data in a relatively standard format -JS9.Image.prototype.getImageData = function(dflag){ - let data = null; - const {xdim, ydim} = this.fileDimensions(); - const atob64 = (a) => { - let i; - let s = ''; - const bytes = new Uint8Array(a.buffer); - const len = bytes.byteLength; - for(i=0; i=0; i--){ - tim = JS9.images[i]; - if( this.display === tim.display ){ - // display image, 2D graphics, etc. - tim.displayImage("all"); - tim.refreshLayers(); - // signal we're done - iscurrent = JS9.images.length; - break; - } - } - for(i=JS9.images.length-1; i>iscurrent; i--){ - tim = JS9.images[i]; - if( this.display === tim.display ){ - // display image, 2D graphics, etc. - tim.displayImage("all"); - tim.refreshLayers(); - break; - } - } - } -}; - -// make offscreen canvas to hold RGB data from the png file -JS9.Image.prototype.mkOffScreenCanvas = function(){ - // sanity check - if( !this.png || !this.png.image ){ return this; } - // offscreen object holds canvas into which we draw to get RGB values - // no need for jquery here, we only manipulate this via the canvas API - this.offscreen = {}; - this.offscreen.canvas = document.createElement("canvas"); - this.offscreen.canvas.setAttribute("width", this.png.image.width); - this.offscreen.canvas.setAttribute("height", this.png.image.height); - this.offscreen.context = this.offscreen.canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - this.offscreen.context.imageSmoothingEnabled = false; - } - // draw the png to the offscreen canvas - this.offscreen.context.drawImage(this.png.image, 0, 0); - // read the RGBA data from offscreen - try{ - this.offscreen.img = this.offscreen.context.getImageData(0, 0, - this.png.image.width, this.png.image.height); - } catch(e){ - if( JS9.CHROMEFILEWARNING && - (JS9.BROWSER[0] === "Chrome") && (document.domain === "") ){ - alert("When using the file:// URI, Chrome must be run with the --allow-file-access-from-files switch to permit JS9 to access data."); - } else { - alert("could not read off-screen image data [same-origin policy violation?]"); - } - } - // allow chaining - return this; -}; - -JS9.Image.prototype.useOffScreenCanvas = function(){ - return this.offscreen && (this.rgbFile || this.params.overlay); -}; - -// initialize keywords for various logical coordinate systems -JS9.Image.prototype.initLCS = function(iheader){ - let i, tval, rrot, frot, a, sina, cosa; - const arr = [[0,0,0], [0,0,0], [0,0,0]]; - // header usually is raw header - const header = iheader || this.raw.header; - const cx = header.CRPIX1 || 1; - const cy = header.CRPIX2 || 1; - // seed rotation matrix and its inverse, if necessary - if( header.LCSROTA2 && header.CROTA2 ){ - // screen rotation angle is reversed from FITS convention - a = -header.CROTA2 * Math.PI / 180.0; - sina = Math.sin(a); - cosa = Math.cos(a); - frot = [[0,0,0], [0,0,0], [0,0,0]]; - frot[0][0] = cosa; - frot[0][1] = -sina; - frot[0][2] = 0; - frot[1][0] = sina; - frot[1][1] = cosa; - frot[1][2] = 0; - rrot = JS9.invertMatrix3(frot); - if( !rrot ){ - frot = null; - } - } - // physical coords - arr[0][0] = JS9.defNull(header.LTM1_1, 1.0); - arr[1][0] = header.LTM2_1 || 0.0; - arr[0][1] = header.LTM1_2 || 0.0; - arr[1][1] = JS9.defNull(header.LTM2_2, 1.0); - arr[2][0] = header.LTV1 || 0.0; - arr[2][1] = header.LTV2 || 0.0; - if( this.imtab === "image" && this.params.ltvbug ){ - // There seems to be a tiny misalignment between wcs->image and - // physical->image when ltv is involved. No idea why, but the fix is: - // (set default to false after implementing rot90/flip 10/6/2019 ... - // on the fear this is doing more harm than good) - if( JS9.notNull(header.LTV1) ){ - for(i=0; i<2; i++){ - tval = Math.abs(arr[0][i]); - if( tval > 0 && tval < 1 ){ arr[2][0] += tval * 0.5; } - } - } - if( JS9.notNull(header.LTV2) ){ - for(i=0; i<2; i++){ - tval = Math.abs(arr[1][i]); - if( tval > 0 && tval < 1 ){ arr[2][1] += tval * 0.5; } - } - } - } - this.lcs.physical = {forward: $.extend(true, [], arr), - reverse: JS9.invertMatrix3(arr)}; - if( this.lcs.physical.reverse ){ - if( frot ){ - this.lcs.physical.frot = $.extend(true, [], frot); - this.lcs.physical.rrot = $.extend(true, [], rrot); - // zero-index center - this.lcs.physical.cx = cx - arr[2][0] - 1; - this.lcs.physical.cy = cy - arr[2][1] - 1; - } - } else { - delete this.lcs.physical; - } - // detector coordinates - arr[0][0] = JS9.defNull(header.DTM1_1, 1.0); - arr[1][0] = header.DTM2_1 || 0.0; - arr[0][1] = header.DTM1_2 || 0.0; - arr[1][1] = JS9.defNull(header.DTM2_2, 1.0); - arr[2][0] = header.DTV1 || 0.0; - arr[2][1] = header.DTV2 || 0.0; - this.lcs.detector = {forward: $.extend(true, [], arr), - reverse: JS9.invertMatrix3(arr)}; - if( this.lcs.detector.reverse ){ - if( frot ){ - this.lcs.detector.frot = $.extend(true, [], frot); - this.lcs.detector.rrot = $.extend(true, [], rrot); - // zero-index center - this.lcs.detector.cx = cx - arr[2][0] - 1; - this.lcs.detector.cy = cy - arr[2][1] - 1; - } - } else { - delete this.lcs.detector; - } - // amplifier coordinates - arr[0][0] = JS9.defNull(header.ATM1_1, 1.0); - arr[1][0] = header.ATM2_1 || 0.0; - arr[0][1] = header.ATM1_2 || 0.0; - arr[1][1] = JS9.defNull(header.ATM2_2, 1.0); - arr[2][0] = header.ATV1 || 0.0; - arr[2][1] = header.ATV2 || 0.0; - this.lcs.amplifier = {forward: $.extend(true, [], arr), - reverse: JS9.invertMatrix3(arr)}; - if( this.lcs.amplifier.reverse ){ - if( frot ){ - this.lcs.amplifier.frot = $.extend(true, [], frot); - this.lcs.amplifier.rrot = $.extend(true, [], rrot); - // zero-index center - this.lcs.amplifier.cx = cx - arr[2][0] - 1; - this.lcs.amplifier.cy = cy - arr[2][1] - 1; - } - } else { - delete this.lcs.amplifier; - } - // reset lcs to image, if necessary - if( this.params && !this.lcs[this.params.lcs] ){ - this.params.lcs = "image"; - } - // set current, if not already done - if( this.params && !this.params.wcssys0 ){ - this.setWCSSys("physical"); - this.params.wcssys0 = this.params.lcs; - } - // save original physical - if( this.lcs.physical && !this.lcs.ophysical ){ - this.lcs.ophysical = $.extend(true, {}, this.lcs.physical); - } - // allow chaining - return this; -}; - -// read input object and convert to image data -JS9.Image.prototype.mkRawDataFromHDU = function(obj, opts){ - let i, s, ui, clen, hdu, pars, card, got, rlen, rmvfile, done, frheap; - let oraw, owidth, oheight, obitpix, owcssys, owcsunits; - let header, x1, y1, bin; - let nhist = 0; - let ncomm = 0; - opts = opts || {}; - if( $.isArray(obj) || JS9.isTypedArray(obj) || obj instanceof ArrayBuffer ){ - // flatten if necessary - if( $.isArray(obj[0]) ){ - obj = obj.reduce( (a, b) => { return a.concat(b); }); - } - // javascript array or typed array - hdu = {image: obj}; - } else if( typeof obj === "object" ){ - // fits object - hdu = obj; - } else { - JS9.error("unknown or missing input for HDU creation"); - } - // allow image to be passed in data property - if( hdu.data && !hdu.image ){ - hdu.image = hdu.data; - } - // better have the image ... - if( !hdu.image ){ - JS9.error(`data missing from JS9 FITS object: ${JSON.stringify(hdu)}`); - } - // quick check for 1D images (in case naxis is defined) - if( hdu.naxis < 2 ){ - JS9.error("can't image a FITS file with less than 2 dimensions"); - } - // save old essential values, if possible (for use as defaults) - // free previous WCS, if possible - if( this.raw ){ - oraw = this.raw; - owidth = this.raw.width; - oheight = this.raw.height; - obitpix = this.raw.bitpix; - owcssys = this.params.wcssys; - owcsunits = this.params.wcsunits; - this.freeWCS(); - } - // initialize raws array? - this.raws = this.raws || []; - rlen = this.raws.length; - if( !rlen ){ - // create object to hold raw data and add to raws array - this.raws.push({from: "hdu"}); - // assign this object to the high-level raw data object - this.raw = this.raws[rlen]; - // ignore rawid, this is the default raw data - this.raw.id = JS9.RAWID0; - } else { - opts.rawid = opts.rawid || JS9.RAWIDX; - // reuse raw object with the same id, after re-initializing it - got = 0; - for(i=0; i { return a.concat(b); }); - } - // make the raw data: note in the case of a typed array coming from - // the Emscripten heap, this is a copy, so we can free the heap immediately - // (done below iff clearImageMemory contains the "heap" directive). - // I didn't realize new XXXArray(typedArray) makes a copy, but see: - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray - switch(this.raw.bitpix){ - case 8: - this.raw.data = new Uint8Array(hdu.image); - break; - case 16: - this.raw.data = new Int16Array(hdu.image); - break; - case -16: - this.raw.data = new Uint16Array(hdu.image); - break; - case 32: - this.raw.data = new Int32Array(hdu.image); - break; - case -32: - this.raw.data = new Float32Array(hdu.image); - break; - case -64: - this.raw.data = new Float64Array(hdu.image); - break; - default: - JS9.error(`unsupported bitpix: ${this.raw.bitpix}`); - break; - } - // array of cards - this.raw.card = hdu.card; - // cfitsio returns these: - this.raw.cardstr = hdu.cardstr; - this.raw.ncard = hdu.ncard; - // look for header - if( hdu.head ){ - this.raw.header = hdu.head; - } else if( this.raw.card ){ - this.raw.header = {}; - // make up header from array of raw cards - clen = this.raw.card.length; - for(i=0; i 0) ){ - this.file = this.file.replace(/\[.*\]/, ""); - this.file += `[${opts.extnum}]`; - } - if( hdu.fits ){ - if( opts.extname ){ - hdu.fits.extname = opts.extname; - } - if( opts.extnum && (opts.extnum > 0) ){ - hdu.fits.extnum = opts.extnum; - } - } - } else if( hdu.fits ){ - if( hdu.fits.extname ){ - this.file = this.file.replace(/\[.*\]/, ""); - this.file += `[${hdu.fits.extname}]`; - } else if( hdu.fits.extnum && (hdu.fits.extnum > 0) ){ - this.file = this.file.replace(/\[.*\]/, ""); - this.file += `[${hdu.fits.extnum}]`; - } - } else if( this.raw.header ){ - if( this.raw.header.EXTNAME ){ - this.file = this.file.replace(/\[.*\]/, ""); - this.file += `[${this.raw.header.EXTNAME}]`; - } - } - } - // last chance: get it from the file - if( !this.id ){ - // save id in case we have to change it for uniqueness - this.id0 = (this.parentFile||this.file).split("/").reverse()[0]; - // get a unique id for this image - this.id = JS9.getImageID(this.id0, this.display.id, this); - } - // is this a proxy image? - if( opts.proxyFile ){ - this.proxyFile = opts.proxyFile; - } - // save filter, if necessary - this.raw.filter = opts.filter || ""; - this.raw.columns = opts.columns || ""; - // image or table? - if( hdu.imtab ){ - this.imtab = hdu.imtab; - } else { - this.imtab = hdu.table ? "table" : "image"; - } - // also associate imtab with this raw layer - this.raw.imtab = this.imtab; - // min and max data values - if( hdu.dmin !== undefined && hdu.dmax !== undefined ){ - // data min and max in object - this.dataminmax(hdu.dmin, hdu.dmax); - } else { - // calculate data min and max - this.dataminmax(); - } - // object, telescope, instrument names - this.object = this.raw.header.OBJECT; - this.telescope = this.raw.header.TELESCOP; - this.instrument = this.raw.header.INSTRUME; - // see if binning was passed to us in opts, e.g. from external imsection - // (internally, it's ordinarily in hdu or hdu.table) - if( opts.binstr ){ - try{ s = opts.binstr.split(/\s+/); - if( s && s.length === 2 ){ - if( (this.imtab === "table") && hdu.table ){ - hdu.table.bin = parseFloat(s[0]); - hdu.table.binMode = s[1]; - } else { - hdu.bin = parseFloat(s[0]); - hdu.binMode = s[1]; - } - } - } - catch(ignore){ /* empty */ } - } - // reset binning properties, as necessary - if( (this.imtab === "table") && hdu.table ){ - this.binning.bin = hdu.table.bin || 1; - } else if( hdu.bin ){ - this.binning.bin = hdu.bin > 0 ? hdu.bin : 1 / Math.abs(hdu.bin); - } else { - this.binning.bin = 1; - } - // make sure obin matches bin for previous load of data - if( !oraw ){ - this.binning.obin = this.binning.bin; - } - // reset the wcssys and wcsunits to previous, if necessary - if( owcssys ){ - this.setWCSSys(owcssys); - } - if( owcsunits ){ - this.setWCSUnits(owcsunits); - } - // init WCS, if necessary - if( oraw && oraw.header.CTYPE1 && oraw.header.CTYPE2 && - this.raw.header.CTYPE1 && this.raw.header.CTYPE2 && - (oraw.header.CTYPE1 !== this.raw.header.CTYPE1 || - oraw.header.CTYPE2 !== this.raw.header.CTYPE2) ){ - this.initWCS(); - } - // save offscreen data if necessary - if( JS9.notNull(hdu.offscreen) ){ - this.png = {image: hdu.offscreen}; - this.mkOffScreenCanvas(); - } - // re-init wcs - this.initWCS(); - // init the logical coordinate system, if possible - this.initLCS(); - // get hdu info, if possible - try{ - if( opts.hdus ){ - this.hdus = opts.hdus; - } else if( this.parentFile && - JS9.helper.connected && JS9.helper.js9helper ){ - obj = { - id: this.expandMacro("$id"), - cmd: this.expandMacro("js9Xeq listhdus $filename"), - image: this.file, - fits: this.parentFile, - rtype: "text" - }; - JS9.helper.send("listhdus", obj, (obj) => { - if( obj.stderr ){ - return; - } - if( obj.errcode ){ - return; - } - if( obj.stdout ){ - try{ this.hdus = JSON.parse(obj.stdout); } - catch(e) { this.hdus = null; } - } - }); - } else if( this.raw.hdu && this.raw.hdu.fits ){ - s = JS9.listhdu(this.raw.hdu.fits.vfile); - if( s ){ - try{ this.hdus = JSON.parse(s); } - catch(e) { this.hdus = null; } - } - } - } - catch(ignore){ /* empty */ } - // can we remove the virtual file? - if( this.raw.hdu && this.raw.hdu.fits && this.raw.hdu.fits.vfile ){ - s = JS9.globalOpts.clearImageMemory; - if( s === false ){ - s = ["never"]; - } else if( s === true ){ - s = ["always"]; - } else { - s = s.toLowerCase().split(/[,>]/); - } - rmvfile = false; - frheap = false; - // all conditions must be met ... - for(i=0, done=false; i s[i+1]*1000000 ){ - rmvfile = true; - } else { - rmvfile = false; - done = true; - } - } else { - rmvfile = false; - done = true; - } - break; - default: - break; - } - } - // remove virtual file and/or heap space - if( rmvfile ){ - if( JS9.DEBUG > 2 ){ - JS9.log("removing underlying FITS vfile for %s: %s", - this.id, this.raw.hdu.fits.vfile); - } - JS9.cleanupFITSFile(this.raw, true); - } else if( frheap ){ - if( JS9.DEBUG > 2 ){ - JS9.log("freeing heap space for %s: %s", - this.id, this.raw.hdu.fits.vfile); - } - JS9.cleanupFITSFile(this.raw, false); - } - } - // plugin callbacks - this.xeqPlugins("image", "onrawdata"); - // allow chaining - return this; -}; - -// store section information -JS9.Image.prototype.mkSection = function(...args){ - let s, xtra; - const sect = this.rgb.sect; - const getWidth = (zoom) => { - let len; - let canvas = this.display.canvas; - if( this.params.transformAngle ){ - len = Math.max(canvas.width, canvas.height); - return Math.min(this.raw.width * zoom, len); - } else { - return Math.min(this.raw.width * zoom, canvas.width); - } - }; - const getHeight = (zoom) => { - let len; - let canvas = this.display.canvas; - if( this.params.transformAngle ){ - len = Math.max(canvas.width, canvas.height); - return Math.min(this.raw.height * zoom, len); - } else { - return Math.min(this.raw.height * zoom, canvas.height); - } - }; - // save zoom in case we are about to change it (regions have to be scaled) - sect.ozoom = sect.zoom; - // process args - switch(args.length){ - case 0: - // no args: init to display central part of image - sect.xcen = Math.floor(this.raw.width/2); - sect.ycen = Math.floor(this.raw.height/2); - sect.width = getWidth(1); - sect.height = getHeight(1); - break; - case 1: - if( !JS9.isNumber(args[0]) ){ - JS9.error(`invalid input for generating section: ${args[0]}`); - } - sect.zoom = parseFloat(args[0]); - sect.width = getWidth(sect.zoom); - sect.height = getHeight(sect.zoom); - break; - case 2: - // two args: x, y - if( !JS9.isNumber(args[0]) || !JS9.isNumber(args[1]) ){ - JS9.error(`invalid input for generating section: ${args[0]} ${args[1]}`); - } - sect.xcen = parseFloat(args[0]); - sect.ycen = parseFloat(args[1]); - // reset width and height if there was a section offset - if( JS9.notNull(sect.ix) ){ - sect.width = getWidth(sect.zoom); - } - if( JS9.notNull(sect.iy) ){ - sect.height = getHeight(sect.zoom); - } - break; - case 3: - // three args: x, y, zoom - if( !JS9.isNumber(args[0]) || - !JS9.isNumber(args[1]) || - !JS9.isNumber(args[2]) ){ - JS9.error(`invalid input for generating section: ${args[0]} ${args[1]} ${args[2]}`); - } - sect.xcen = parseFloat(args[0]); - sect.ycen = parseFloat(args[1]); - sect.zoom = parseFloat(args[2]); - sect.width = getWidth(sect.zoom); - sect.height = getHeight(sect.zoom); - break; - default: - break; - } - // assume no offset when displaying section - delete sect.ix; - delete sect.iy; - // calculate section limits from center and dimensions - sect.x0 = sect.xcen - (sect.width/(2*sect.zoom)); - sect.y0 = sect.ycen - (sect.height/(2*sect.zoom)); - sect.x1 = sect.xcen + (sect.width/(2*sect.zoom)); - sect.y1 = sect.ycen + (sect.height/(2*sect.zoom)); - // make sure we're within bounds while maintaining section dimensions - if( sect.x0 < 0 ){ - if( JS9.globalOpts.panWithinDisplay ){ - sect.x1 -= sect.x0; - } else { - sect.ix = sect.x0 * sect.zoom; - } - sect.x0 = 0; - } - if( sect.y0 < 0 ){ - if( JS9.globalOpts.panWithinDisplay ){ - sect.y1 -= sect.y0; - } else { - sect.iy = sect.y0 * sect.zoom; - } - sect.y0 = 0; - } - if( sect.x1 > this.raw.width ){ - if( JS9.globalOpts.panWithinDisplay ){ - sect.x0 -= (sect.x1 - this.raw.width); - } else { - sect.ix = (sect.x1 - this.raw.width) * sect.zoom; - } - sect.x1 = this.raw.width; - } - if( sect.y1 > this.raw.height ){ - if( JS9.globalOpts.panWithinDisplay ){ - sect.y0 -= (sect.y1 - this.raw.height); - } else { - sect.iy = (sect.y1 - this.raw.height) * sect.zoom; - } - sect.y1 = this.raw.height; - } - // for offset images, maybe display more of the image - if( sect.ix > 0 && sect.x0 > 0 ){ - xtra = Math.min(sect.ix, sect.x0); - sect.x0 -= xtra; - sect.ix += xtra * sect.zoom; - } - if( sect.ix < 0 && sect.x1 < this.raw.width ){ - xtra = Math.min(this.raw.width - sect.x1, Math.abs(sect.ix)); - sect.x1 += xtra; - sect.ix -= xtra * sect.zoom; - } - if( sect.iy > 0 && sect.y0 > 0 ){ - xtra = Math.min(sect.iy, sect.y0); - sect.y0 -= xtra; - sect.iy += xtra * sect.zoom; - } - if( sect.iy < 0 && sect.y1 < this.raw.height ){ - xtra = Math.min(this.raw.height - sect.y1, Math.abs(sect.iy)); - sect.y1 += xtra; - sect.iy -= xtra * sect.zoom; - } - // final check: make sure we're within bounds - sect.x0 = Math.max(0, sect.x0); - sect.x1 = Math.min(this.raw.width, sect.x1); - sect.y0 = Math.max(0, sect.y0); - sect.y1 = Math.min(this.raw.height, sect.y1); - // final integer dimensions - sect.x0 = Math.floor(sect.x0); - sect.y0 = Math.floor(sect.y0); - sect.x1 = Math.floor(sect.x1); - sect.y1 = Math.floor(sect.y1); - // final section limits: derive new width and height - sect.width = Math.ceil((sect.x1 - sect.x0) * sect.zoom); - sect.height = Math.ceil((sect.y1 - sect.y0) * sect.zoom); - // sanity check - if( sect.width <= 0 || sect.height <= 0 ){ - s = sprintf("invalid image section: %s,%s [%s,%s, %s,%s, %s]", - sect.width, sect.height, - sect.x0, sect.y0, sect.x1, sect.y1, - sect.zoom); - JS9.error(s); - } - // put zoom back into params - this.params.zoom = sect.zoom; - // allow chaining - return this; -}; - -// create colormap index array from data values and specified data min/max -// from: tksao1.0/frame/frametruecolor.C -JS9.Image.prototype.mkColorData = function(){ - let i, dd, idata, odata; - const ss = JS9.SCALESIZE; - const length = ss - 1; - const dmin = this.params.scalemin; - const dmax = this.params.scalemax; - const dlen = this.raw.width * this.raw.height; - const diff = dmax - dmin; - const dval = length / diff; - // skip if colormap is static - if( this.cmapObj.type === "static" ){ - return this; - } - // allocate array - if( !this.colorData || this.colorData.length < dlen ){ - this.colorData = new Int32Array(dlen); - } - // Important note 7/13/2020: - // Chrome 83.0.4103.116 was taking either 4ms ... or 2+ seconds to do - // this loop on a 2048x2048 int image (casa.fits in js9debug.html). - // Replacing this.raw.data and this.colorData with local variables seems - // to fix this slowdown. omg ... - idata = this.raw.data; - odata = this.colorData; - // for each raw value, calculate lookup offset into scaled array - for(i=0; i= dmax ){ - odata[i] = ss - 1; - } else { - odata[i] = Math.floor(((dd - dmin) * dval) + 0.5); - } - } - // allow chaining - return this; -}; - -// generate colorcells array from current colormap -// from: tksao1.0/colorbar/colorbar.C -JS9.Image.prototype.calcContrastBias = function(i){ - let r, result; - let bias = this.params.bias; - const cs = JS9.COLORSIZE; - const contrast = this.params.contrast; - // check for (close to) default - if( ((bias - 0.5) < 0.0001) && ((contrast - 1.0) < 0.0001) ){ - return i; - } - // map i to range of 0 to 1.0 - // shift by bias (if invert, bias = 1 - bias) - // multiply by contrast - // shift to center of region - // expand back to number of dynamic colors - if( this.params.invert ){ - bias = 1 - bias; - } - r = Math.floor((((i / cs) - bias) * contrast + 0.5) * cs); - if( r < 0 ){ - result = 0; - } else if( r >= cs ){ - result = cs - 1; - } else { - result = r; - } - return result; -}; - -// generate colorcells array from current colormap -// from: tksao1.0/colorbar/colorbartruecolor.C -JS9.Image.prototype.mkColorCells = function(){ - let i, j, idx; - const cs = JS9.COLORSIZE; - // skip if colormap is static - if( this.cmapObj.type === "static" ){ - return this; - } - // allocate array for color cells - if( !this.colorCells ){ - this.colorCells = []; - } - // fill in colorcells - for(i=0; i { - let i, k, int1, int2; - const hex_alphabets = "0123456789ABCDEF"; - const value = []; - //Remove the "#" char - if there is one. - if(hex.charAt(0) === "#"){ - hex = hex.slice(1); - } - hex = hex.toUpperCase(); - for(i=0, k=0; i<6; i+=2, k++){ - int1 = hex_alphabets.indexOf(hex.charAt(i)); - int2 = hex_alphabets.indexOf(hex.charAt(i+1)); - value[k] = (int1 * 16) + int2; - } - return value; - }; - // sanity check - if( !this.colorCells ){ return this; } - // skip if colormap is static - if( this.cmapObj.type === "static" ){ return this; } - // allocate array for scaled cells - if( !this.psColors ){ - this.psColors = []; - // value for NaN - this.psColors[NaN] = hex2num(this.params.nancolor); - } - // and the inverse array for colorbar ticks - if( !this.psInverse ){ - this.psInverse = []; - // value for NaN - this.psInverse[NaN] = 0; - } - // delta for scaling - dd = this.params.scalemax - this.params.scalemin; - low = this.params.scalemin; - // apply the appropriate scale algorithm - switch(this.params.scale){ - case "linear": - // scaled cells - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= cs ){ - ll = cs - 1; - } - this.psColors[ii] = this.colorCells[ll]; - } - // inverse - for(ii=0; ii= dmin) && (data[ii] <= dmax) ){ - jj = Math.floor((data[ii] - dmin) / diff * hh + 0.5); - if( jj < hh ){ - pdf[jj] += 1; - } - } - } - // get average - for(ii=0; ii= avg) && (color < hh) ){ - bin -= avg; - color++; - } - } - dval = (hh - 1) /hh; - while( ii < hh ){ - this.hist[ii++] = dval; - } - } - // scaled cells - for(ii=0; ii vv ){ - break; - } - } - aa = jj / hh; - this.psInverse[ii] = aa * diff + dmin; - } - break; - default: - JS9.error(`unknown scale '${this.params.scale}'`); - } - // allow chaining - return this; -}; - -// create RGB image from scaled colorCells -// sort of from: tksao1.0/frame/truecolor.c, but not really -JS9.Image.prototype.mkRGBImage = function(){ - let rgb, sect, img, xrgb, yrgb, wrgb, hrgb, rgbimg, ctx; - let inc, zinc, xIn, yIn, xOut, yOut, xOutIdx, yOutIdx, yZoom, xZoom, cobj; - let idx, odx, odxmax, ridx, gidx, bidx, mim, mimg; - let yLen, zx, zy, zyLen, mopacity, cmopacity, val; - let alpha, alpha1, alpha2, alphafloor, alphafloorvalue, curalpha; - let domask = false; - let doalphafloor = false; - let rthis = null; - let gthis = null; - let bthis = null; - let dorgb = false; - let mimmask = false; - let mimopacity = false; - let mimoverlay = false; - let cached = []; - // sanity check - if( !this.rgb ){ return this; } - // image handles for RGB mode - if( this.display.rgb.active && - ((this === this.display.rgb.rim) || - (this === this.display.rgb.gim) || - (this === this.display.rgb.bim)) ){ - dorgb = true; - if( this.display.rgb.rim ){ - rthis = this.display.rgb.rim; - } - if( this.display.rgb.gim ){ - gthis = this.display.rgb.gim; - } - if( this.display.rgb.bim ){ - bthis = this.display.rgb.bim; - } - } - ctx = this.display.context; - rgb = this.rgb; - sect = rgb.sect; - // supply your own mkRGBImage call (black-magic, used by smart-x) - if( this.MakeRGBImage && typeof this.MakeRGBImage === "function" ){ - if( this.MakeRGBImage() ){ - return this; - } - } - // backward-compatibility with v1.7 - if( this.MakePrimaryImage && typeof this.MakePrimaryImage === "function" ){ - if( this.MakePrimaryImage() ){ - return this; - } - } - // if we have an RGB file or image overlay, use offsreen RGB colors - if( this.useOffScreenCanvas() ){ - wrgb = sect.width / sect.zoom; - hrgb = sect.height / sect.zoom; - xrgb = sect.x0; - yrgb = (this.offscreen.canvas.height - 1) - (sect.y0 + hrgb); - rgbimg = this.offscreen.context.getImageData(xrgb, yrgb, wrgb, hrgb); - if( sect.zoom === 1 ){ - // for unzoomed data, we can grab the RGB pixels directly - rgb.img = rgbimg; - } else { - // for zoomed data, we have to replicate each RGB pixel - rgb.img = ctx.createImageData(sect.width, sect.height); - img = rgb.img; - odx = 0; - for(yIn=0, yOut=0; yIn mask value - if( JS9.notNull(this.params.opacity) ){ - alpha2 = this.params.opacity * 255; - } else { - alpha2 = 255; - } - // reverse mask alphas, if necessary - if( this.mask.invert ){ - alpha = alpha1; - alpha1 = alpha2; - alpha2 = alpha; - } - } else if( this.mask.mode === "opacity" ){ - // opacity mode: alpha = mask value 0 to 1 * 255 - mimopacity = true; - } else if( this.mask.mode === "overlay" ){ - // overlay mode: non-zero mask value is blended with image value - mimoverlay = true; - mimg = mim.rgb.img; - if( JS9.isNull(this.mask.opacity) ){ - this.mask.opacity = 1; - } - } - } else if( JS9.notNull(this.params.flooropacity) && !dorgb && !domask ){ - // flooropacity: image pixels <= floor value use floor opacity - // can't do this with rgb mode because we have 3 different data values - alphafloor = this.params.flooropacity * 255; - alphafloorvalue = this.params.floorvalue; - doalphafloor = true; - } - // index into scaled data using previously calc'ed data value to get RGB - // reverse y lines - odx = 0; - inc = Math.max(1, Math.floor(1/sect.zoom)); - zinc = sect.zoom * inc; - for(yIn=Math.floor(sect.y1-1), yOut=0; yIn>=sect.y0; yIn -= inc, yOut++){ - yLen = yIn * this.raw.width; - yOutIdx = yOut * zinc; - for(xIn=Math.floor(sect.x0), xOut=0; xIn this.mask.value ){ - alpha = alpha2; - } else { - alpha = alpha1; - } - } else if( mimopacity ){ - // opacity mode: masked value is the opacity - alpha = mim.raw.data[yLen +xIn] * 255; - } - if( dorgb ){ - // rgb mode: up to three indexes - ridx = rthis ? rthis.colorData[yLen + xIn] : 0; - gidx = gthis ? gthis.colorData[yLen + xIn] : 0; - bidx = bthis ? bthis.colorData[yLen + xIn] : 0; - if( JS9.isNull(ridx) || JS9.isNull(gidx) || JS9.isNull(bidx) ){ - this.display.rgb.active = false; - JS9.error("RGB images are incompatible. Turning off RGB mode.", "", false); - this.mkRGBImage(); - return this; - } - } else if( !this.staticObj ){ - // ordinary case: one index - idx = this.colorData[yLen + xIn]; - } - // current alpha to use in most cases - curalpha = alpha; - // use alpha min when data val is below threshold? - if( doalphafloor && this.raw.data[yLen + xIn] <= alphafloorvalue ){ - curalpha = alphafloor; - } - xOutIdx = xOut * zinc; - for(yZoom=0; yZoom { - let context, canvas; - if( !this.offscreenRGB ){ - canvas = document.createElement("canvas"); - context = canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - context.imageSmoothingEnabled = false; - } - this.offscreenRGB = {canvas, context}; - } - this.offscreenRGB.canvas.width= img.width; - this.offscreenRGB.canvas.height = img.height; - this.offscreenRGB.context.putImageData(img, 0, 0); - return this.offscreenRGB.canvas; - }; - // opts is optional - opts = opts || {}; - // reproject: if reproj wcs header exists, save it for alignment - if( this.rawDataLayer() === "reproject" && opts.wcsim ){ - this.wcsim = opts.wcsim; - this.wcsim.isawcsim = true; - } - // get display offsets - this.calcDisplayOffsets(true); - // save context - ctx.save(); - // do we need to apply blend mode parameters - if( opts.opacity !== undefined ){ ctx.globalAlpha = opts.opacity; } - if( opts.blend !== undefined ){ ctx.globalCompositeOperation = opts.blend; } - // do we need to apply the canvas transform? - if( this.params.transform ){ - // this is the transform matrix - m = this.params.transform; - // translate origin to center of display - w2 = this.display.width / 2; - h2 = this.display.height / 2; - ctx.translate(w2, h2); - // set new transform - ctx.transform(m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]); - // translate back to 0, 0 - ctx.translate(-w2, -h2); - } - // display image - ctx.drawImage(img2canvas(rgb.img), this.ix, this.iy); - // restore original context - ctx.restore(); - // allow chaining - return this; -}; - -// display image, with pre and post processing based on comma-separated string -// of options: -// colors: generate colorData -// scaled: generate colorCells and scaledCells -// rgb: generate RGB image (happens automatically for any of the above) -// display: displlay image (always done) -// plugins: execute plugin callbacks -// all: colors,scaled,rgb,display,plugins -JS9.Image.prototype.displayImage = function(imode, opts){ - let i, im, bopts, obj; - let nblend = 0; - const allmode = "colors,scaled,rgb,display,plugins"; - const blends = []; - const mode = {}; - // eslint-disable-next-line no-unused-vars - const modeFunc = (element, index, array) => { - const el = element.trim(); - mode[el] = true; - // each step implies the next ones - switch(el){ - case "colors": - mode.scaled = true; - mode.rgb = true; - break; - case "scaled": - mode.rgb = true; - break; - } - }; - // special checks for displayMode setting - if( imode === false ){ - this.displayMode = false; - return this; - } - if( imode === true ){ - this.displayMode = true; - imode = "all"; - } - // if displayMode is false, just return - if( !this.displayMode ){ - return this; - } - // did we just pass the opts params? - if( typeof imode === "object" ){ - opts = imode; - imode = null; - } - if( !imode ){ - imode = "rgb"; - } else if( imode === "all" ){ - imode = allmode; - mode.notify = true; - } else if( imode === "rgbonly" ){ - imode = "rgb,nodisplay"; - mode.notify = true; - } else if( imode === "display" ){ - mode.notify = true; - } - // get mode as elements in an object - imode.split(",").forEach(modeFunc); - // by default display the image again (unless nodisplay is set) - mode.display = true; - // and always call plugins - mode.plugins = true; - // if we have an RGB file or image overlay, skip some steps - if( this.useOffScreenCanvas() ){ - mode.colors = false; - mode.scaled = false; - } - // opts are optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse displayImage opts: ${opts}`, e); } - } - // do we need to blend? - if( this.display.blendMode && (opts.blendMode !== false) ){ - for(i=0; i=0; i--){ - im = blends[i]; - im.mkRGBImage(); - } - } - } - // if we explicitly don't display, return here; - if( mode.nodisplay ){ - return this; - } - // display image on screen - if( mode.display ){ - // clear image - this.display.context.clear(); - if( nblend ){ - // pre-calculate image offsets in case of zoom changed for an image - // which acts as wcsim for another blended image ... in case the - // blended image gets loaded before the wcs image ... messy! - for(i=blends.length-1; i>=0; i--){ - blends[i].calcDisplayOffsets(false); - } - for(i=blends.length-1; i>=0; i--){ - im = blends[i]; - // display the image using blend characteristics - bopts = {wcsim: opts.wcsim, - blend: im.blend.mode, opacity: im.blend.opacity}; - im.putImage(bopts); - if( im === this ){ - // display layers for this image - im.displayShapeLayers(); - } - } - } else { - // display the image - this.putImage(opts); - // display layers for this image - this.displayShapeLayers(); - } - // mark this image as being in this display - this.display.image = this; - // now this is the displayed image, we can add delayed shapes - while( this.delayedShapes && this.delayedShapes.length ){ - this.tmp.syncRunning = true; - obj = this.delayedShapes.shift(); - switch(obj.mode){ - case "add": - this.addShapes(obj.layer, obj.shape, obj.opts); - break; - case "change": - this.changeShapes(obj.layer, obj.shape, obj.opts); - break; - } - delete this.tmp.syncRunning; - } - delete this.delayedShapes; - } - // post-processing - // plugin callbacks - this.xeqPlugins("image", "onimagedisplay"); - // allow chaining - return this; -}; - -// refresh data for an existing image -// input obj is a fits object, array, typed array, etc. -JS9.Image.prototype.refreshImage = function(obj, opts){ - let s, arr, ozoom, ora, odec, olpos, ipos, func; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse refreshImage opts: ${opts}`, e); } - } - // no obj or obj is a string, this is a load with refresh turned on - if( !obj || typeof obj === "string" ){ - if( opts.onrefresh ){ - opts.onload = opts.onrefresh; - delete opts.onrefresh; - } - opts.refresh = this; - // for file:// uri, we can use the FITS pathname, where possible - if( !document.domain ){ - s = obj || this.fitsFile || this.file; - } else { - // else use the url path relative to the web page - s = obj || this.file; - } - JS9.Load(s, opts, {display: this.display}); - return; - } - // check for refresh func - opts.rawid = opts.rawid || JS9.RAWID0; - // allow explicit specification of a func, for backward-compatibility - if( typeof opts === "function" ){ - func = opts; - opts = {onrefresh: func}; - } - if( !opts.onrefresh && JS9.imageOpts.onrefresh ){ - // use global onrefresh, if possible - opts.onrefresh = JS9.imageOpts.onrefresh; - } - // save section center if it's not to be reset - if( !opts.resetSection ){ - // always save logical coords - olpos = this.imageToLogicalPos({x: this.rgb.sect.xcen, - y: this.rgb.sect.ycen}); - // save wcs pos, if available - if( this.validWCS() ){ - s = JS9.pix2wcs(this.raw.wcs, - this.rgb.sect.xcen, this.rgb.sect.ycen); - arr = s.trim().split(/\s+/); - ora = JS9.saostrtod(arr[0]); - if( JS9.isHMS(this.params.wcssys) ){ - ora *= 15.0; - } - odec = JS9.saostrtod(arr[1]); - } - } - ozoom = this.rgb.sect.zoom; - // save old binning - this.binning.obin = this.binning.bin; - // generate new data - this.mkRawDataFromHDU(obj, opts); - // reset or restore section? - if( opts.resetSection ){ - // reset section - this.mkSection(); - this.mkSection(ozoom); - } else { - // try to restore section using saved coords - if( this.validWCS() && JS9.notNull(ora) && JS9.notNull(odec) ){ - arr = JS9.wcs2pix(this.raw.wcs, ora, odec).trim().split(/ +/); - ipos = {x: parseFloat(arr[0]), y: parseFloat(arr[1])}; - } else { - ipos = this.logicalToImagePos({x: olpos.x, y: olpos.y}); - } - // but if the image position off the new image ... - if( ipos.x > 0 && ipos.x < this.raw.width && - ipos.y > 0 && ipos.y < this.raw.height ){ - this.mkSection(ipos.x, ipos.y, ozoom); - } else { - // ... just reset the section - this.mkSection(); - this.mkSection(ozoom); - } - } - // display new image data with old section - this.displayImage("colors", opts); - // redo flip and rot - this.reFlipRot(); - // notify the helper - this.notifyHelper(); - // update shape layers if necessary - if( opts.refreshRegions || - opts.resetSection || - (this.binning.obin !== this.binning.bin) ){ - this.refreshLayers(); - // update region values - this.updateShapes("regions", "all", "binning"); - } - // plugin callbacks - this.xeqPlugins("image", "onimagerefresh"); - // all done - JS9.waiting(false); - // everything else is done so call refresh func, if necessary - if( opts.onrefresh ){ - try{ JS9.xeqByName(opts.onrefresh, window, this); } - catch(e){ JS9.error("in image refresh callback", e); } - } - // allow chaining - return this; -}; - -// fileDimensions: get dimensions of "original" file -// this is the hackiest routine in the JS9 module -// why is it so hard??? -JS9.Image.prototype.fileDimensions = function(){ - let xdim, ydim; - if( this.parent && this.parent.raw.header.XTENSION !== "BINTABLE" ){ - if( this.parent.raw.header.TABDIM1 ){ - xdim = this.parent.raw.header.TABDIM1; - } else { - xdim = this.parent.raw.header.NAXIS1; - } - if( this.parent.raw.header.TABDIM2 ){ - ydim = this.parent.raw.header.TABDIM2; - } else { - ydim = this.parent.raw.header.NAXIS2; - } - } else { - if( this.raw.header.TABDIM1 ){ - xdim = this.raw.header.TABDIM1; - } else { - xdim = this.raw.header.NAXIS1; - } - if( this.raw.header.TABDIM2 ){ - ydim = this.raw.header.TABDIM2; - } else { - ydim = this.raw.header.NAXIS2; - } - } - return {xdim, ydim}; -}; - -/* - maybePhysicalToImage: the second hackiest routine in the JS9 module! - The physical position defined by LTM/LTV is not always the file position, - For example, if the file foo.fits was created from another file: - funimage somefile.fits'[*,*,2]' foo.fits - its LTM/LTV keywords will referring to the parent, instead of itself. - In such a case, we want to convert physical position to the image position - of the physical file. - This situation is signalled by the presence of a parent lcs object. - This routine is used to display sections and the binning.js plugin. -*/ -JS9.Image.prototype.maybePhysicalToImage = function(pos){ - let lpos, ipos, npos; - if( this.imtab === "image" && - this.parent && this.parent.lcs && pos.x && pos.y ){ - lpos = {x: pos.x, y: pos.y}; - // call is used because this.parent is not an image object - ipos = JS9.Image.prototype.logicalToImagePos.call(this.parent, lpos, - "ophysical"); - npos = {x: Math.floor(ipos.x+0.5), y: Math.floor(ipos.y+0.5)}; - } - return npos; -}; - -// extract and display a section of an image, with table filtering -JS9.Image.prototype.displaySection = function(opts, func){ - let s, oproxy, hdu, from, obj, oreg, nim, topts; - let ipos, lpos, npos, tbin, arr, sect; - const getval3 = (val1, val2, val3) => { - let res; - if( !JS9.isNull(val1) ){ - res = val1; - } else if( !JS9.isNull(val2) ){ - res = val2; - } - return res || val3; - }; - // convert region to section (cen and dim) - const reg2sect = (xreg) => { - let i, xdim, ydim, xcen, ycen, npos; - let xx = 0; - let yy = 0; - let minx = 1000000; - let maxx = 0; - let miny = 1000000; - let maxy = 0; - const shape = xreg.shape; - // use physical coords object, if possible - if( !this.parentFile && xreg.lcs ){ - xreg = xreg.lcs - xcen = xreg.x; - ycen = xreg.y; - // beware of problems with physical coords not tied to the file - npos = this.maybePhysicalToImage({x: xcen, y: ycen}); - if( npos ){ - xcen = npos.x; - ycen = npos.y; - } - } else { - xcen = xreg.x; - ycen = xreg.y; - } - switch( shape ){ - case "annulus": - xdim = xreg.radii[xreg.radii.length-1]*2; - ydim = xreg.radii[xreg.radii.length-1]*2; - break; - case "box": - xdim = xreg.width; - ydim = xreg.height; - break; - case "circle": - xdim = xreg.radius*2; - ydim = xreg.radius*2; - break; - case "cross": - xdim = xreg.width; - ydim = xreg.height; - break; - case "ellipse": - xdim = xreg.r1*2; - ydim = xreg.r2*2; - break; - case "polygon": - case "line": - for ( i=0; i < xreg.pts.length; i++ ) { - xx += xreg.pts[i].x; - yy += xreg.pts[i].y; - if ( xreg.pts[i].x > maxx ) { maxx = xreg.pts[i].x; } - if ( xreg.pts[i].x < minx ) { minx = xreg.pts[i].x; } - if ( xreg.pts[i].y > maxy ) { maxy = xreg.pts[i].y; } - if ( xreg.pts[i].y < miny ) { miny = xreg.pts[i].y; } - } - xreg.x = xx/xreg.pts.length; - xreg.y = yy/xreg.pts.length; - if( xreg.shape === "line" && xreg.pts.length === 2 ){ - xdim = Math.sqrt(((xreg.pts[0].x - xreg.pts[1].x) * - (xreg.pts[0].x - xreg.pts[1].x)) + - ((xreg.pts[0].y - xreg.pts[1].y) * - (xreg.pts[0].y - xreg.pts[1].y))); - ydim = 1; - } else { - xdim = maxx - minx; - ydim = maxy - miny; - } - break; - case "text": - xdim = 10; - ydim = 10; - break; - default: - break; - } - return({xcen: xcen, ycen: ycen, xdim: xdim, ydim: ydim}); - }; - // main display routine - const disp = (hdu, opts) => { - let tim, did, arr; - let ss = ""; - // make a copy of opts so we can change it - topts = $.extend(true, {}, opts || {}); - if( JS9.isNull(topts.refreshRegions) ){ - topts.refreshRegions = true; - } - if( JS9.isNull(topts.resetSection) ){ - topts.resetSection = true; - } - // start the waiting! - if( topts.waiting !== false ){ - JS9.waiting(true, this.display); - } - // the id might have changed if we changed extensions - if( hdu.fits.extname ){ - ss = `[${hdu.fits.extname}]`; - } else if( hdu.fits.extnum && hdu.fits.extnum > 0 ){ - ss = `[${hdu.fits.extnum}]`; - } else if( this.parent ){ - if( this.parent.extname ){ - ss = `[${this.parent.extname}]`; - } else if( this.parent.extnum && this.parent.extnum > 0 ){ - ss = `[${this.parent.extnum}]`; - } - } - // change id and file if extension changed - if( ss ){ - if( !topts.id ){ - topts.id = this.id.replace(/\[.*\]/,"") + ss; - } - // NB: this was removed in v2.3 ... why? ... added back in v2.5 - if( !topts.file ){ - topts.file = this.file.replace(/\[.*\]/,"") + ss; - } - } - if( topts.separate ){ - // display section as a separate image in the specified display - delete topts.xcen; - delete topts.ycen; - if( typeof topts.separate === "string" ){ - arr = topts.separate.split(":"); - switch(arr.length){ - case 1: - did = arr[0]; - break; - default: - did = arr[0]; - topts.id = arr[1]; - break; - } - // make sure we can find the display - topts.display = JS9.lookupDisplay(did); - } else { - topts.display = this.display; - } - // lame attempt to get to original parentFile - if( from === "parentFile" && this.fitsFile ){ - tim = JS9.lookupImage(this.fitsFile); - if( tim && tim.parentFile ){ - topts.parentFile = tim.parentFile; - } else { - topts.parentFile = this.fitsFile; - } - } - // save current regions (before displaying new image) - oreg = this.listRegions("all", {mode: 1, - includedcoords: true, - ignoreignore: true, - saveediting: true, - savewcsconfig: true, - sortids: false, - saveid: true}); - // func to perform when image is loaded - func = topts.ondisplaysection || topts.onrefresh || func; - // set up new and display new image - nim = new JS9.Image(hdu, topts, func); - // reset obin to be bin, since new images have no previous bin - nim.binning.obin = nim.binning.bin; - // add regions to new image - if( oreg && topts.refreshRegions !== false ){ - nim.addShapes("regions", oreg, {restoreid: true}); - } - // redo flip and rot - this.reFlipRot(); - // set status of new image - nim.setStatus("displaySection", "complete"); - } else if( typeof topts.refresh === "string" ){ - // refresh the image in the specified display - delete topts.xcen; - delete topts.ycen; - arr = topts.refresh.split(":"); - switch(arr.length){ - case 1: - did = arr[0]; - break; - default: - did = arr[0]; - topts.id = arr[1]; - break; - } - // make sure we can find the display - topts.display = JS9.lookupDisplay(did); - if( topts.display.image ){ - topts.rawid = this.raw.id; - // func to perform when image is refreshed - topts.onrefresh = topts.ondisplaysection || - topts.onrefresh || func; - // refresh the image with the new hdu - topts.display.image.refreshImage(hdu, topts); - } else { - // no image in the specified display, so make a new one - // lame attempt to get to original parentFile - if( from === "parentFile" && this.fitsFile ){ - tim = JS9.lookupImage(this.fitsFile); - if( tim && tim.parentFile ){ - topts.parentFile = tim.parentFile; - } else { - topts.parentFile = this.fitsFile; - } - } - // save current regions (before displaying new image) - oreg = this.listRegions("all", {mode: 1, - includedcoords: true, - ignoreignore: true, - saveediting: true, - savewcsconfig: true, - sortids: false, - saveid: true}); - // func to perform when image is loaded - func = topts.ondisplaysection || topts.onrefresh || func; - // set up new and display new image - nim = new JS9.Image(hdu, topts, func); - // reset obin to be bin, since new images have no previous bin - nim.binning.obin = nim.binning.bin; - // add regions to new image - if( oreg ){ - nim.addShapes("regions", oreg, {restoreid: true}); - } - // redo flip and rot - this.reFlipRot(); - } - } else { - // this is the default behavior for displaySection: - // refresh the image in the current display - topts.rawid = this.raw.id; - // func to perform when image is refreshed - topts.onrefresh = topts.ondisplaysection || topts.onrefresh || func; - // refresh the current image with the new hdu - this.refreshImage(hdu, topts); - } - // set status of old image - this.setStatus("displaySection", "complete"); - // done waiting - JS9.waiting(false); - }; - // sanity check - if( !this.raw || !this.raw.hdu || !this.raw.hdu.fits ){ - JS9.error("invalid image for displaySection"); - } - // opts is optional - opts = opts || {}; - // special case: if opts is "full", display full image - if( opts === "full" ){ - const {xdim, ydim} = this.fileDimensions(); - opts = {xdim: xdim, ydim: ydim, xcen: 0, ycen: 0}; - } else if( opts === "selected" ){ - this._selectShapes("regions", "selected", null, (obj) => { - topts = reg2sect(obj.pub); - topts.from = "virtualFile"; - topts.separate = true; - topts.refreshRegions = false; - topts.resetSection = true; - this.displaySection(topts, func); - }); - return; - } else if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse displaySection opts: ${opts}`, e); } - } - // cube column - opts.cubecol = opts.cubecol || ""; - if( opts.cubecol ){ - // string containing filename and indication that this is a cube - s = this.file - .split("/") - .reverse()[0] - .replace(/\[.*\]/,"") - .replace(".fits", `_cube_${opts.cubecol}.fits`) - .replace(/\.ftz$/, `_cube_${opts.cubecol}.fits`) - .replace(/\.gz$/, "") - .replace(/\.bz2$/, "") - .replace(/:/g, "_"); - // name of virtual file we will create - if( !opts.file ){ - opts.file = s; - } - // and its id - if( !opts.id ){ - opts.id = s; - } - // unless explicitly set to false, separate is set to true - if( opts.separate !== false ){ - opts.separate = true; - } - } - if( opts.separate ){ - // if we are generating a separate image, copy the hdu - hdu = $.extend(true, {}, this.raw.hdu); - } else { - // if we are replacing the current image, use the hdu directly - hdu = this.raw.hdu; - } - // from where do we extract the section? - from = opts.from; - if( !from ){ - if( this.parentFile && JS9.helper.connected && JS9.helper.js9helper ){ - // we will be processing a parent file to get the section - from = "parentFile"; - } else { - // we will be processing a virtual file to get the section - from = "virtualFile"; - } - } - // get previous values to use as defaults - if( this.imtab === "table" && hdu.table ){ - // tables are easy: all the previous values should be present - sect = hdu.table; - } else { - sect = {}; - // start with bin from hdu - sect.bin = hdu.bin || 1; - // images are a bit more difficult - // hack: if a parent file was used to make this image, - // calculate binning from its LTM/TLV parameters - if( from === "parentFile" && - this.raw.header && JS9.notNull(this.raw.header.LTM1_1) ){ - sect.bin = 1 / Math.abs(this.raw.header.LTM1_1); - } - // get image center from raw data - ipos = {x: this.raw.width / 2, y: this.raw.height / 2}; - // convert to physical (file) coords - lpos = this.imageToLogicalPos(ipos); - // sect.xcen = Math.floor(lpos.x + 0.5); - // sect.ycen = Math.floor(lpos.y + 0.5); - sect.xcen = Math.floor(lpos.x + 0.5*(sect.bin-1)); - sect.ycen = Math.floor(lpos.y + 0.5*(sect.bin-1)); - npos = this.maybePhysicalToImage({x: sect.xcen, y: sect.ycen}); - if( npos ){ - sect.xcen = npos.x; - sect.ycen = npos.y; - } - sect.xdim = Math.floor(hdu.naxis1 * sect.bin); - sect.ydim = Math.floor(hdu.naxis2 * sect.bin); - sect.filter = this.raw.filter || ""; - sect.columns = this.raw.columns || ""; - } - // allow binning relative to current, e.g., *2, /4, +1, -3 - if( typeof opts.bin === "string" ){ - // save and remove mode flag - if( opts.bin.match(/[as]$/) ){ - opts.binMode = opts.bin.slice(-1); - opts.bin = opts.bin.slice(0, -1); - } - // temp binning value - tbin = sect.bin || this.binning.bin; - switch( opts.bin.charAt(0) ){ - case "*": - case "x": - case "X": - opts.bin = tbin * parseFloat(opts.bin.slice(1)); - break; - case "/": - opts.bin = tbin / parseFloat(opts.bin.slice(1)); - break; - case "i": - case "I": - opts.bin = tbin * 2; - break; - case "o": - case "O": - opts.bin = tbin / 2; - break; - default: - if( JS9.isNumber(opts.bin) ){ - opts.bin = parseFloat(opts.bin); - } else { - JS9.error(`invalid bin for displaySection: ${opts.bin}`); - } - break; - } - } - // now we can make sure opts has sensible defaults - opts.xcen = getval3(opts.xcen, sect.xcen, 0); - opts.ycen = getval3(opts.ycen, sect.ycen, 0); - switch(this.imtab){ - case "table": - opts.xdim = getval3(opts.xdim, sect.xdim, JS9.fits.options.table.xdim); - opts.ydim = getval3(opts.ydim, sect.ydim, JS9.fits.options.table.ydim); - opts.bin = getval3(opts.bin, sect.bin, JS9.fits.options.table.bin); - break; - default: - opts.xdim = getval3(opts.xdim, sect.xdim, JS9.fits.options.image.xdim); - opts.ydim = getval3(opts.ydim, sect.ydim, JS9.fits.options.image.ydim); - opts.bin = getval3(opts.bin, sect.bin, JS9.fits.options.image.bin); - break; - } - opts.binMode = getval3(opts.binMode, sect.binMode, JS9.globalOpts.binMode); - // final checks on binning - // handle string bin, possibly containing explicit binMode - if( typeof opts.bin === "string" ){ - if( opts.bin.match(/[as]$/) ){ - opts.binMode = opts.bin.slice(-1); - } - opts.bin = parseFloat(opts.bin); - } - // sanity check: we need a bin - if( !opts.bin ){ - opts.bin = 1; - } - // sanity check: fractional bin must be 1/n for images - if( this.imtab === "image" && opts.bin > 0 && opts.bin < 1 ){ - opts.bin = 1.0 / Math.floor((1.0 / opts.bin) + 0.5); - } - // filter - opts.filter = getval3(opts.filter, sect.filter, ""); - // save the filter, if necessary - this.raw.filter = opts.filter || ""; - // columns - opts.columns = getval3(opts.columns, sect.columns, ""); - // save the columns, if necessary - this.raw.columns = opts.columns || ""; - // start the waiting! - if( opts.waiting !== false ){ - JS9.waiting(true, this.display); - } - // set status - this.setStatus("displaySection", "processing"); - // ... start a timeout to allow the wait spinner to get started - window.setTimeout(() => { - // get image section - switch(from){ - case "parentFile": - oproxy = this.proxyFile; - // parentFile: image sect. from external parent file of cur file - // arr is for runAnalysis, remove opts for later processing - arr = []; - arr.push({name: "xcen", value: opts.xcen}); - delete opts.xcen; - arr.push({name: "ycen", value: opts.ycen}); - delete opts.ycen; - arr.push({name: "xdim", value: opts.xdim}); - arr.push({name: "ydim", value: opts.ydim}); - // load entire image section - if( opts.xdim !== undefined ){ opts.xdim = 0; } - if( opts.ydim !== undefined ){ opts.ydim = 0; } - // recombine bin and binMode, if necessary - if( opts.binMode ){ - opts.bin = `${opts.bin}${opts.binMode}`; - delete opts.binMode; - } - arr.push({name: "bin", value: opts.bin}); - delete opts.bin; - s = `${opts.filter||""}@@${opts.cols||""}`; - arr.push({name: "filter", value: s}); - // hack: pass filter and columns along to reach binning plugin - // delete opts.filter; - // get image section from external file - arr.push({name: "slice", value: opts.slice||""}); - delete opts.slice; - obj = {id: this.expandMacro("$id"), - image: this.file, - fits: this.parentFile, - rtype: "text"}; - obj.cmd = `js9Xeq imsection ${this.parentFile}`; - // if we are changing the extension, replace the old extension - // with the new one - if( opts.extension ){ - obj.cmd = obj.cmd.replace(/\[.*\]/,""); - obj.cmd += `[${opts.extension}]`; - delete opts.extension; - } - obj.cmd += this.expandMacro(" $xdim@$xcen,$ydim@$ycen,$bin $filter $slice", arr); - JS9.helper.send("imsection", obj, (r) => { - let obj, jobj, rarr, f, pf; - if( typeof r === "object" ){ - // with socketio, we get an object - obj = r; - } else { - // with cgi, we just get a text string - if( r.search(JS9.analOpts.epattern) >=0 ){ - obj = {stderr: r}; - } else { - obj = {stdout: r}; - } - } - if( obj.stderr ){ - JS9.error(obj.stderr); - return; - } - if( obj.errcode ){ - JS9.error(`in displaySection: ${obj.errcode}`); - return; - } - // output is file and possibly parentFile - rarr = obj.stdout.split(/\n/); - // file - f = JS9.cleanPath(rarr[0]); - // relative path: add install dir prefix - if( f.charAt(0) !== "/" ){ - f = JS9.InstallDir(f); - } - // this is the proxy file (meaning: delete it on close) - opts.proxyFile = f; - // remove oproxy file if not the same as the current file - if( oproxy && (oproxy !== opts.proxyFile) ){ - this.removeProxyFile(oproxy); - } - // json fits info - if( rarr[1] ){ - try{ - jobj = JSON.parse(rarr[1]); - } - catch(ignore){ - JS9.log("couldn't parse imsection as JSON: %s", f); - jobj = null; - } - if( jobj ){ - opts.extname = jobj.extname; - opts.extnum = jobj.extnum; - opts.hdus = jobj.hdus; - opts.binstr = jobj.binstr; - opts.parent = jobj; - } - } - // look for parentFile (path relative to helper, not install) - if( rarr[2] ){ - pf = JS9.cleanPath(rarr[2]); - opts.parentFile = pf; - } - // retrieve and display newly created image section file - JS9.fetchURL(f, f, opts, (result) => { - // cleanup previous FITS file support, if necessary - // do this before we handle the new FITS file, or else - // we end up with a memory leak in the emscripten heap! - JS9.cleanupFITSFile(this.raw, true); - // start the waiting! - if( opts.waiting !== false ){ - JS9.waiting(true, this.display); - } - // process the newly retrieved data as FITS - JS9.fits.handleFITSFile(result, opts, disp); - }); - }); - break; - case "virtualFile": - // cleanup previous FITS file support, if necessary - // do this before we handle the new FITS file, or else - // we end up with a memory leak in the emscripten heap! - JS9.cleanupFITSFile(this.raw, false); - // extract image section from current virtual file - JS9.getFITSImage(hdu.fits, hdu, opts, (hdu) => { - disp(hdu, opts); - }); - break; - default: - JS9.error("image section cannot be extracted from this data file"); - break; - } - }, JS9.SPINOUT); -}; - -// display the specified extension of a multi-extension FITS file -JS9.Image.prototype.displayExtension = function(extid, opts, func){ - let i, s, got, extname, im, id; - const dispnext = (i) => { - let hdu; - const topts = $.extend(true, {}, opts); - // hdus are loaded as separate images - topts.separate = true; - // all done, call the supplied func, if any - if( i === this.hdus.length ){ - if( func ){ - try{ JS9.xeqByName(func, window, this); } - catch(e){ JS9.error("in displayExtension callback", e, false); } - } - return; - } - // next hdu - hdu = this.hdus[i]; - if( hdu.type === "image" && hdu.naxis >= 2 ){ - // load next hdu and recurse when done - this.displayExtension(hdu.hdu, topts, () => { dispnext(i+1); }); - } else { - dispnext(i+1); - } - }; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse displayExtension opts: ${opts}`, e); } - } - opts.waiting = false; - // only makes sense if we have hdus - if( !this.hdus ){ - JS9.error("no FITS HDUs found for displayExtension()"); - } - // sanity check - if( JS9.isNull(extid) ){ - JS9.error("missing extname/extnum for displayExtension()"); - } - // display all extensions? - if( extid === "all" ){ - // load all image extensions, in order, as separate images - // we start with the first and let the call recurse - dispnext(0); - return; - } - // extname specified? - if( typeof extid === "string" ){ - opts.extension = extid; - extname = extid.toLowerCase(); - for(i=0, got=0; i 0 ){ - if( this.display.id === im.display.id ){ - got++; - break; - } - } - } - } - if( got ){ - im.displayImage("display", opts); - im.display.clearMessage(); - if( func ){ - try{ JS9.xeqByName(func, window, this); } - catch(e){ JS9.error("in displayExtension callback", e, false); } - } - return; - } - } - // cleanup previous FITS file support, if necessary - // do this before we handle the new FITS file, or else - // we end up with a memory leak in the emscripten heap! - if( !opts.separate ){ - JS9.cleanupFITSFile(this.raw, false); - } - // process the FITS file by going to the extname/extnum - this.displaySection(opts, func); - // allow chaining - return this; -}; - -// display the specified slice of a 3D or 4d FITS cube -JS9.Image.prototype.displaySlice = function(slice, opts, func){ - let i, topts, tim; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse displaySlice opts: ${opts}`, e); } - } - opts.waiting = false; - // sanity check - if( JS9.isNull(slice) ){ - JS9.error("missing slice for displaySlice()"); - } - if( this.raw.header.NAXIS !== 3 ){ - JS9.error("3D image required for displaySlice()"); - } - if( slice === "all" ){ - // load and display the slices separately - // ignore the fact that we already are displaying a slice of the image, - // since we don't actually know which slice is being displayed ... - for(i=1; i<=this.raw.header.NAXIS3; i++){ - topts = $.extend(true, {}, opts, {separate: true}); - this.displaySlice(i, topts, func); - } - } else { - // slicename or slicenum specified? - if( JS9.isNumber(slice) ){ - opts.slice = `*:*:${slice}`; - } else { - opts.slice = slice; - } - // processing for separate images - if( opts.separate ){ - // make new id based on slice - opts.id = sprintf("%s_%s", - this.id - .replace(/_?([0-9])+:x:x/, "") - .replace(/_?x:([0-9])+:x/, "") - .replace(/_?x:x:([0-9])+/, ""), - opts.slice.replace(/\*/g, "x")); - // look for existing id and just redisplay, if possible - for(i=0; i 0 ){ - tim.displayImage("display", {display: tim}); - return this; - } - } - } - } - // cleanup previous FITS file heap before handling the new FITS file, - // or we end up with a memory leak in the emscripten heap - JS9.cleanupFITSFile(this.raw, false); - // process the FITS file by going to the slice - this.displaySection(opts, func); - } - // allow chaining - return this; -}; - -// convert current image to array -JS9.Image.prototype.toArray = function(opts){ - let i, j, k, bpe, idx, le, header, npad, arr, buf, _dbuf; - let dbuf, sect, xlen, blen, datalen, darr; - // opts is optional - opts = opts || {}; - // always perform the header keyword fix - opts.simple = true; - // make a copy of the header, in case we have to change it - header = $.extend(true, {}, this.raw.header); - // are we processing a section of the image? - if( JS9.notNull(opts.sect) ){ - // image section - sect = opts.sect; - // header parameters that need to change - header.NAXIS1 = sect.x1 - sect.x0; - header.NAXIS2 = sect.y1 - sect.y0; - if( JS9.notNull(header.CRPIX1) ){ - header.CRPIX1 = header.CRPIX1 - sect.x0; - } - if( JS9.notNull(header.CRPIX2) ){ - header.CRPIX2 = header.CRPIX2 - sect.y0; - } - if( JS9.notNull(header.LTV1) ){ - header.LTV1 = header.LTV1 - sect.x0; - } - if( JS9.notNull(header.LTV2) ){ - header.LTV2 = header.LTV2 - sect.y0; - } - // extract image section - // length of a date element - blen = Math.abs(this.raw.bitpix/8); - // length of a row of data - xlen = (sect.x1 - sect.x0) * blen; - // total data length of the section - datalen = xlen * (sect.y1 - sect.y0); - // make an array of the required length - darr = new ArrayBuffer(datalen); - // make a vew that we can work with - dbuf = new Uint8Array(darr); - // copy the section into the new array, one row at a time - for(i=sect.y0, j=0; i 0; - if( le ){ - idx = header.length; - bpe = Math.abs(this.raw.bitpix)/8; - _dbuf = new Uint8Array(dbuf); - // swap bytes to big-endian - for(i=0; i<_dbuf.byteLength; i+= bpe){ - for(j=i+bpe-1, k=0; k= 0 ){ - return; - } - // default is to pan to center - if( args.length === 0 ){ - panx = this.raw.width / 2; - pany = this.raw.height / 2; - } - // one string arg is a json specification - // (two string args is panx, pany in string format) - if( args.length === 1 && typeof panx === "string" ){ - if( panx === "mouse" && this.ipos ){ - panx = this.ipos.x; - pany = this.ipos.y; - } else { - try{ panx = JSON.parse(panx); } - catch(e){ JS9.error(`can't parse setPan JSON: ${panx}`, e); } - } - } - if( typeof panx === "object" ){ - obj = panx; - // passing an object supports image, physical, wcs coordinates - if( JS9.notNull(obj.x) && JS9.notNull(obj.y) ){ - // image coords - panx = obj.x; - pany = obj.y; - } - if( JS9.notNull(obj.px) && JS9.notNull(obj.py) ){ - // physical coords - pos = this.logicalToImagePos({x: obj.px, y: obj.py}); - panx = pos.x; - pany = pos.y; - } - if( typeof obj.wcs === "string" ){ - // wcs string: ra dec [wcssys] - arr = obj.wcs.trim().split(/ +/); - obj.ra = arr[0]; - obj.dec = arr[1]; - if( arr.length >= 3 ){ - obj.wcssys = arr[2]; - } - } - if( this.validWCS() && JS9.notNull(obj.ra) && JS9.notNull(obj.dec) ){ - // wcs coords - // use supplied wcs, if necessary - if( obj.wcssys ){ - owcssys = this.getWCSSys(); - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - this.setWCSSys(obj.wcssys, false); - } - // convert wcs supplied as strings - if( typeof obj.ra === "string" ){ - obj.ra = JS9.saostrtod(obj.ra); - if( JS9.isHMS(this.params.wcssys) ){ - obj.ra *= 15.0; - } - } - if( typeof obj.dec === "string" ){ - obj.dec = JS9.saostrtod(obj.dec); - } - // convert to image coords - arr = JS9.wcs2pix(this.raw.wcs, obj.ra, obj.dec) - .trim().split(/ +/); - panx = parseFloat(arr[0]); - pany = parseFloat(arr[1]); - // restore original wcssys - if( owcssys ){ - this.setWCSSys(owcssys, false); - JS9.globalOpts.xeqPlugins = txeq; - } - } - } - // generate section from new image coords - if( !JS9.isNumber(panx) || !JS9.isNumber(pany) ){ - JS9.error(`invalid input for setPan: ${panx} ${pany}`); - } - if( this.wcsAlign() || this.isawcsim ){ - oval = JS9.globalOpts.panWithinDisplay; - JS9.globalOpts.panWithinDisplay = true; - } - this.mkSection(panx, pany); - // set pan for aligned images, if necessary - if( this.wcsAlign() || this.isawcsim ){ - for(i=0; i x1 ){ x1 = pts[i].x; } - if( JS9.isNull(y0) || pts[i].y < y0 ){ y0 = pts[i].y; } - if( JS9.isNull(y1) || pts[i].y > y1 ){ y1 = pts[i].y; } - } - w = x1 - x0; - h = y1 - y0; - } else { - w = this.raw.width; - h = this.raw.height; - } - nzoom = Math.min(this.display.width/w, this.display.height/h); - // a little rounding makes the zoom nicer - nzoom = Math.round((nzoom + 0.0000001) * 1000000) / 1000000; - break; - default: - nzoom = parseFloat(zval); - break; - } - break; - case "number": - nzoom = zval; - break; - default: - return; - } - return nzoom; -}; - -// set zoom of RGB image -JS9.Image.prototype.setZoom = function(zval){ - let i, nzoom, im, ipos, oval; - // is this core service disabled? - if( $.inArray("zoom", this.params.disable) >= 0 ){ - return; - } - nzoom = this.parseZoom(zval); - if( !nzoom ){ - JS9.error(`invalid input for setZoom: ${zval}`); - } - if( this.wcsAlign() || this.isawcsim ){ - oval = JS9.globalOpts.panWithinDisplay; - JS9.globalOpts.panWithinDisplay = true; - } - // remake section - this.mkSection(nzoom); - // set zoom for aligned images, if necessary - if( this.wcsAlign() || this.isawcsim ){ - for(i=0; i 0 ){ nobj.flip = "x"; } - if( wcsinfo.cdelt2 < 0 ){ nobj.flip = (nobj.flip|| "") + "y"; } - // only galactic and ecliptic use the algorithm below, others are trivial - switch(wcssys){ - case "galactic": - case "ecliptic": - break; - default: - if( wcsinfo.crot ){ - nobj.angle = -wcsinfo.crot; - } - return nobj; - } - // algorithm for galactic and ecliptic ... from AV (via trello) - // turn off plugin callbacks - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - // set wcssys to be the same wcssys the north pole coords are in - this.setWCSSys(pole[wcssys].wcssys, false); - // get center of image in that coord system - cx = this.raw.width/2; - cy = this.raw.height/2; - arr = JS9.pix2wcs(this.raw.wcs, cx, cy).trim().split(/\s+/); - // convert strings to float (degrees) - ra = JS9.saostrtod(arr[0]); - // ra hours to degrees, if necessary - if( JS9.isHMS() ){ ra *= 15.0; } - dec = JS9.saostrtod(arr[1]); - // angular distance between north pole and image center - nobj.angle = JS9.angdist(ra, dec, pole[wcssys].ra, pole[wcssys].dec); - // remove any header-based rotation - if( JS9.notNull(this.raw.wcsinfo.crot) ){ - nobj.angle -= this.raw.wcsinfo.crot; - } - // reset to the current coord system - this.setWCSSys(wcssys, false); - // restore plugin callbacks - JS9.globalOpts.xeqPlugins = txeq; - // return info - return nobj; -}; - -// get transform -JS9.Image.prototype.getTransform = function(){ - return this.params.transform; -}; - -// set transform (basis for setFlip, setRot90, setRotate) -JS9.Image.prototype.setTransform = function(...args){ - let a, i, sina, cosa, m3, transform; - let angle = 0; - let scale = 1; - let [arg1] = args; - if( !this || !this.raw || !this.raw.header ){ - JS9.error("invalid image for setTransform"); - } - // reset -> we're done - if( arg1 === "reset" ){ - delete this.params.transform; - delete this.params.transformInverse; - delete this.params.transformAngle; - delete this.params.transformScale; - return; - } - // start with the identity matrix - transform = [[1,0,0], [0,1,0], [0,0,1]]; - // for each transform ... - for(i=0; i { - let i, arr; - let nx = 0; - let ny = 0; - let nflip = ""; - arr = (flip + (this.params.flip||"")).split(""); - for(i=0; i { - if( JS9.globalOpts.rotateRelative ){ - rot += this.params.rotate||0; - } - while( rot < 0 ){ rot += 360; } - while( rot >= 360 ){ rot -= 360; } - return rot; - } - // sanity checks - if( JS9.isNull(rot) ){ return this; } - // reset - if( rot === "reset" ){ - this.params.rotate = 0; - return this.setRotate(0); - } - // north is up in current wcs system: calculate rotation angle - if( typeof rot === "string" && rot.match(/north/i) ){ - nobj = this.getNorthIsUp(); - rot = nobj.angle; - if( JS9.notNull(nobj.flip) ){ this.setParam("flip", nobj.flip); } - } - if( typeof rot === "string" ){ - rot = parseFloat(rot); - } - if( !JS9.isNumber(rot) ){ - JS9.error(`invalid rotation for setRotate: ${rot}`); - } - if( !this || !this.raw || !this.raw.header ){ - JS9.error("invalid image for setRotate"); - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse setRotate opts: ${opts}`, e); } - } - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("setRotate", [rot]); - // save normalized value - this.params.rotate = normRot(rot); - // update the transform - this.setTransform(); - // non-rectangular canvas: redo section to ensure coverage of display - if( this.params.transformAngle && - this.display.canvas.width !== this.display.canvas.height ){ - this.mkSection(this.getZoom()); - } - // redisplay using these data - this.displayImage("all", opts); - // refresh shape layers - this.refreshLayers(); - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetrotate"); - } - // allow chaining - return this; -}; - -// get 90-degree rotatation state -JS9.Image.prototype.getRot90 = function(){ - return this.params.rot90; -}; - -// rotate image by multiples of 90 degrees using canvas transform -JS9.Image.prototype.setRot90 = function(...args){ - let [rot, opts] = args; - const normRot = (rot) => { - rot += this.params.rot90||0; - while( rot < 0 ){ rot += 360; } - while( rot >= 360 ){ rot -= 360; } - if( rot === 270 ){ - rot = -90; - } - return rot; - } - // sanity checks - if( JS9.isNull(rot) ){ return this; } - // reset - if( rot === "reset" ){ - this.params.rot90 = 0; - return this.setRot90(0); - } - if( typeof rot === "string" ){ - rot = parseFloat(rot); - } - if( !this || !this.raw || !this.raw.header ){ - JS9.error("invalid image for setRot90"); - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse setRot90 opts: ${opts}`, e); } - } - // only 90 degree rotations - switch(rot){ - case 0: - rot = 0; - break; - case 1: - rot = 90; - break; - case -1: - rot = -90; - break; - case 90: - break; - case -90: - break; - default: - JS9.error(`invalid setRot90 rotation value: ${rot} (use: +/1, +/90)`); - break; - } - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("setRot90", [rot]); - // save normalized value - this.params.rot90 = normRot(rot); - // update the transform - this.setTransform(); - // non-rectangular canvas: redo section to ensure coverage of display - if( this.params.transformAngle && - this.display.canvas.width !== this.display.canvas.height ){ - this.mkSection(this.getZoom()); - } - // redisplay using these data - this.displayImage("all", opts); - // refresh shape layers - this.refreshLayers(); - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetrot90"); - } - // allow chaining - return this; -}; - -// redo the current flip and rot90 in cases where the underyling data changed -// (e.g. displaySection, refreshImage) -JS9.Image.prototype.reFlipRot = function(){ - let i, flips, nrot; - let flip = this.params.flip; - let rot90 = this.params.rot90; - let rot = this.params.rotate; - if( flip !== "none" ){ - this.params.flip = "none"; - flips = flip.split(""); - for(i=0; i= 0 ){ - return; - } - // do we update the default? - if( JS9.isNull(updatedef) ){ - updatedef = JS9.globalOpts.wcsSetUpdatesDef; - } - if( wcssys === "image" ){ - this.params.wcssys = "image"; - this.params.wcsunits = "pixels"; - JS9.wcsunits.image = "pixels"; - } else if( wcssys === "physical" ){ - this.params.wcssys = "physical"; - this.params.wcsunits = "pixels"; - if( updatedef ){ - JS9.globalOpts.wcsUnits.physical = "pixels"; - } - } else if( this.validWCS() ){ - // native: original wcs from file - if( wcssys === "native" ){ - wcssys = this.params.wcssys0; - } - // set wcs system - s = JS9.wcssys(this.raw.wcs, wcssys); - if( s ){ - // store new wcs system param - this.params.wcssys = s.trim(); - // get units associated with this wcs system - u = JS9.globalOpts.wcsUnits[this.params.wcssys] || "sexagesimal"; - // set the units - this.setWCSUnits(u, updatedef); - } - } - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetwcssys"); - } - // allow chaining - return this; -}; - -// init wcs -JS9.Image.prototype.initWCS = function(header){ - let alt, key, varr, s, bufsize, buf; - const hlen = JS9.globalOpts.wcsHlength; - const awcs = /(WCSNAME|WCSAXES|CRVAL[0-9]|CRPIX[0-9]|PC[0-9]_[0-9]|CDELT[0-9]|CD[0-9]_[0-9]|CTYPE[0-9]|CUNIT[0-9]|CRVAL[0-9]|PV[0-9]_[0-9]|PS[0-9]_[0-9]|RADESYS|LONPOLE|LATPOLE)([A-Z])/; - if( !this.raw.header ){ - return this; - } - // usually it's the raw header - header = header || this.raw.header; - // clean up old wcs - this.freeWCS(); - // init object to hold alt wcs objects - this.raw.altwcs = {}; - // set up the default wcs, using the original header params - alt = "default"; - this.raw.altwcs[alt] = {}; - this.raw.altwcs[alt].header = header; - // look for wcs alternates - // see: http://www.atnf.csiro.au/people/mcalabre/WCS/wcs.pdf - for( key of Object.keys(header) ){ - // is it an alt wcs keyword? - varr = key.match(awcs); - if( varr && varr.length ){ - // this is the A-Z version - alt = varr[2]; - // init the alt wcs object, if necessary - if( !this.raw.altwcs[alt] ){ - this.raw.altwcs[alt] = {}; - // start with original header - this.raw.altwcs[alt].header = $.extend({}, header); - } - // wcslib seems to want "RADECSYS", not "RADESYS" - if( varr[1] === "RADESYS" ){ - varr[1] = "RADECSYS"; - } - // overwrite standard keyword in header with the alt value - this.raw.altwcs[alt].header[varr[1]] = header[varr[0]]; - } - } - // init all of the wcs's we found - for( key of Object.keys(this.raw.altwcs) ){ - // loop through alt wcs objects - s = JS9.raw2FITS(this.raw.altwcs[key].header); - // too large headers blow Emscripten's stack space - // this.raw.altwcs[key].wcs = JS9.initwcs(s, hlen); - // so we have to copy the header to the heap: - // allocate space for the string in the emscripten heap - bufsize = s.length + 1; - try{ buf = JS9.vmalloc(bufsize); } - catch(e){ JS9.error(`can't malloc for wcsinit: ${bufsize}`, e); } - // copy the string to the heap - try{ JS9.vstrcpy(s, buf); } - catch(e){ JS9.error(`can't copy for wcsinit: ${bufsize}`, e); } - // call the wcsinit routine, passing the heap pointer - this.raw.altwcs[key].wcs = JS9.initwcs(buf, hlen); - // free heap space - JS9.vfree(buf); - // get info about the wcs - if( this.raw.altwcs[key].wcs > 0 ){ - try{ this.raw.altwcs[key].wcsinfo = - JSON.parse(JS9.wcsinfo(this.raw.altwcs[key].wcs)); } - catch(ignore){ /* empty */ } - } - } - // set current wcs to the default - this.setWCS("default"); - // allow chaining - return this; -}; - -// close and free wcs resources -JS9.Image.prototype.freeWCS = function(raw){ - let key; - // raw defaults to ... default raw - raw = raw || this.raw; - if( raw.altwcs ){ - // free all wcs structures - for( key of Object.keys(raw.altwcs) ){ - // loop through alt wcs objects - if( raw.altwcs[key].wcs > 0 ){ - JS9.freewcs(raw.altwcs[key].wcs); - raw.altwcs[key].wcs = null; - } - } - } -}; - -// get name of current wcs (from among the alternates) -JS9.Image.prototype.getWCS = function(){ - let key, obj; - // loop through wcs objects, looking for a match - for( key of Object.keys(this.raw.altwcs) ){ - if( this.raw.wcs === this.raw.altwcs[key].wcs ){ - obj = $.extend(true, {}, this.raw.altwcs[key].wcsinfo); - obj.version = key; - obj.wcsname = this.raw.altwcs[key].header.WCSNAME; - return obj; - } - } - return null; -}; - -// set wcs to default or one of the alternative versions -JS9.Image.prototype.setWCS = function(version){ - let key, wcsname, wcssys; - version = version || "default"; - // sanity check - if( !this.raw || !this.raw.altwcs ){ return this; } - // loop through wcs objects, looking for a match - for( key of Object.keys(this.raw.altwcs) ){ - wcsname = this.raw.altwcs[key].header.WCSNAME; - if( (version === key) || (version === wcsname) ){ - // make sure its a valid wcs - if( this.raw.altwcs[key].wcs <= 0 ){ - JS9.error("invalid WCS for version: %s", version); - } - // set this wcs up as the current one - this.raw.wcs = this.raw.altwcs[key].wcs; - // get info about the wcs - this.raw.wcsinfo = this.raw.altwcs[key].wcsinfo; - // look for a good wcssys - if( this.raw.wcsinfo && this.raw.wcsinfo.radecsys ){ - wcssys = this.raw.wcsinfo.radecsys; - } else { - if( this.params.wcssys !== "native" ){ - wcssys = this.params.wcssys.trim(); - } else { - wcssys = this.params.lcs; - } - } - // set the wcs system - this.setWCSSys(wcssys); - // this is also the default - if( !this.params.wcssys0 ){ - this.params.wcssys0 = wcssys; - } - // set the wcs units - this.setWCSUnits(this.params.wcsunits); - // all done - return this; - } - } - // didn't find it - JS9.error(`could not find WCS version: ${version}`); -}; - -// is a valid WCS open and active -JS9.Image.prototype.validWCS = function(){ - return this.raw && this.raw.wcs && this.raw.wcs > 0; -}; - -// get the WCS units for this image -JS9.Image.prototype.getWCSUnits = function(){ - if( this.params.wcsunits ){ - return this.params.wcsunits; - } - return "pixels"; -}; - -// set the WCS units for this image -JS9.Image.prototype.setWCSUnits = function(wcsunits, updatedef){ - let s, ws; - // is this core service disabled? - if( $.inArray("wcs", this.params.disable) >= 0 ){ - return; - } - // do we update the default? - if( JS9.isNull(updatedef) ){ - updatedef = JS9.globalOpts.wcsSetUpdatesDef; - } - if( wcsunits === "pixels" ){ - if( JS9.isWCSSys(this.params.wcssys) ){ - this.params.wcssys = "physical"; - } - this.params.wcsunits = "pixels"; - if( updatedef ){ - JS9.globalOpts.wcsUnits[this.params.wcssys] = "pixels"; - } - } else if( this.validWCS() ){ - if( JS9.notWCS(this.params.wcssys) ){ - ws = JS9.imageOpts.wcssys; - this.setWCSSys(ws); - } - s = JS9.wcsunits(this.raw.wcs, wcsunits); - if( s ){ - this.params.wcsunits = s.trim(); - if( updatedef ){ - JS9.globalOpts.wcsUnits[this.params.wcssys] = - this.params.wcsunits; - } - } - } - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetwcsunits"); - } - // allow chaining - return this; -}; - -// notify the helper a new image was displayed -JS9.Image.prototype.notifyHelper = function(){ - let basedir, image1, image2; - const imexp = new RegExp(`^${JS9.ANON}[0-9]*`); - const installexp = JS9.INSTALLDIR ? new RegExp(`^${JS9.INSTALLDIR}`) : null; - // notify the helper - if( JS9.helper.connected && !this.file.match(imexp) ){ - switch(JS9.helper.type){ - case "get": - case "post": - // get pageid from CGI helper (socket.io does this when connecting) - if( !JS9.helper.pageid ){ - JS9.helper.send("pageid", null, (s) => { - if( s && s.trim().match(/^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$/) ){ - JS9.helper.pageid = s; - JS9.helper.js9helper = "js9helper"; - } - }); - break; - } - } - // get helper info about this image - // but also try removing part of path which gets to install dir - image1 = this.file; - if( image1.charAt(0) !== "/" && installexp ){ - image2 = this.file.replace(installexp, ""); - } - JS9.helper.send("image", {"image": image1, "image2": image2}, (res) => { - let rstr, r, s, cc, regexp; - if( typeof res === "object" ){ - // from node.js, we get an object with stdout and stderr - rstr = res.stdout; - // log stderr but keep going - if( res.stderr && JS9.DEBUG > 1 ){ - JS9.log(res.stderr); - } - } else { - // with cgi, we just get stdout - rstr = res; - } - // unless we have no stdout - if( !rstr ){ - return; - } - // returns: [file, path, wcs] - // split args, dealing with spaces inside brackets - r = rstr.trim().match(/(?:[^\s[]+|\[[^\]]*\])+/g); - s = r[1]; - if( s !== "?" ){ - if( !JS9.globalOpts.dataDir ){ - this.fitsFile = s; - // prepend base of png path if fits file has no path - // is this a bad "feature" in tpos?? probably ... - if( !this.fitsFile.includes("/") ){ - basedir = this.file.match( /.*\// ); - // but don't add installdir as part of prefix - // (fitsFile path is relative to the js9 directory) - if( basedir && basedir.length ){ - regexp = new RegExp(`^${JS9.INSTALLDIR}`); - basedir = basedir[0].replace(regexp, ""); - this.fitsFile = basedir + this.fitsFile; - } - } - // prepend JS9_DIR on files if fits is not absolute - if( JS9.globalOpts.prependJS9Dir ){ - if( this.fitsFile && - !this.fitsFile.match(/^\${JS9_DIR}/) && - this.fitsFile.charAt(0) !== "/" ){ - this.fitsFile = `\${JS9_DIR}/${this.fitsFile}`; - } - if( this.parentFile && - !this.parentFile.match(/^\${JS9_DIR}/) && - this.parentFile.charAt(0) !== "/" ){ - this.parentFile = `\${JS9_DIR}/${this.parentFile}`; - } - } - } else { - cc = s.lastIndexOf("/") + 1; - this.fitsFile = `${JS9.globalOpts.dataDir}/${s.slice(cc)}`; - } - if( JS9.DEBUG > 1 ){ - JS9.log("JS9 fitsFile: %s %s", this.file, this.fitsFile); - } - } - if( this.fitsFile ){ - this.fitsFile = JS9.cleanPath(this.fitsFile); - } - if( this.parentFile ){ - this.parentFile = JS9.cleanPath(this.parentFile); - } - // first time through, query the helper for info - if( !this.queried ){ - this.queryHelper("all"); - this.queried = true; - } - }); - } - // allow chaining - return this; -}; - -// ask helper for various types of information -JS9.Image.prototype.queryHelper = function(which){ - const what = which || "all"; - // query the helper - if( JS9.helper.connected ){ - if( (what === "all") || (what === "getAnalysis") ){ - // only retrieve analysis tasks once per image - if( !this.analysisPackages ){ - JS9.helper.send("getAnalysis", {"fits": this.fitsFile}, (s) => { - if( s ){ - try{ this.analysisPackages = JSON.parse(s); } - catch(e){ JS9.log("can't get analysis", e); } - } - }); - } - } - } - // allow chaining - return this; -}; - -// expand macros for this image -JS9.Image.prototype.expandMacro = function(s, opts){ - let cmd, olen; - // sanity check - if( !s ){ return; } - // process each $ token - // eslint-disable-next-line no-unused-vars - cmd = s.replace(/\${?([a-zA-Z][a-zA-Z0-9_()]+)}?/g, (m, t, o) => { - let i, r, owcssys, pos; - // called in image context - const savewcs = (wcssys) => { - const owcs = this.params.wcssys; - if( wcssys ){ - switch(wcssys){ - case "wcs": - if( JS9.notWCS(owcs) ){ - this.params.wcssys = this.params.wcssys0; - } - break; - case "physical": - case "image": - this.params.wcssys = wcssys; - break; - default: - break; - } - } - return owcs; - }; - const restorewcs = (wcssys) => { - if( wcssys ){ - this.params.wcssys = wcssys; - } - }; - const withext = (r) => { - let e; - // for tables, we might need to add the binning filter - if( this.imtab === "table" ){ - if( this.raw.hdu && this.raw.hdu.table.filter && - !r.match(this.raw.hdu.table.filter) ){ - if( r.match(/\]\[/) ){ - r = `${r.slice(0,-1)}&&${this.raw.hdu.table.filter}]`; - } else { - r += `[${this.raw.hdu.table.filter}]`; - } - } - } else if( this.imtab === "image" ){ - // for images, we might need to add/replace extension info - e = this.file.match(/\[.*\]/); - if( e ){ - if( r.match(/\[.*\]/) ){ - r = r.replace(/\[.*\]/, e); - } else { - r += e; - } - } else if( this.raw && this.raw.hdu && - this.raw.hdu.slice ){ - // current slice of 3D cube - e = this.raw.hdu.slice - .replace(/:/g, ",").replace(/([0-9][0-9]*)/, "$1:$1"); - r += `[${e}]`; - } else if( this.raw && this.raw.header && - this.raw.header.NAXIS > 2 ){ - // first slice of 3D cube - r += `[*,*,1:1]`; - } - } - return r; - }; - const u = t.split("("); - if( u[1] ){ - u[1] = u[1].replace(/\)$/, ""); - } - switch(u[0]){ - case "id": - r = this.display.divjq.attr("id"); - break; - case "image0": - r = this.id.replace(/\[EVENTS\]/i, ""); - break; - case "image": - r = this.id; - break; - case "filename": - // for cubes, process all slices if (all) is specified - if( u[1] == "all" && this.fitsFile && - this.raw && this.raw.header && this.raw.header.NAXIS === 3 ){ - r = this.fitsFile; - } else if( this.parentFile && (u[1] !== "this") ){ - // if a filter is defined, add it - if( this.raw && this.raw.filter ){ - r = this.parentFile; - // assume parent is a table with EVENTS - if( !r.match(/\[.*\]/) ){ r += '[EVENTS]'; } - r += `[${this.raw.filter}]`; - } else { - r = withext(this.parentFile); - } - } else if( this.fitsFile ){ - r = withext(this.fitsFile); - } else { - JS9.error(`no FITS file for ${this.id}`); - } - break; - case "fits": - if( !this.fitsFile ){ - JS9.error(`no FITS file for ${this.id}`); - } - r = withext(this.fitsFile); - break; - case "parent": - if( !this.parentFile ){ - JS9.error(`no parent FITS file for ${this.id}`); - } - r = this.parentFile; - break; - case "ext": - if( this.fitsFile ){ - r = this.fitsFile.match(/\[.*\]/); - if( r === null ){ - r = ""; - } - } else { - JS9.error(`no FITS file for ${this.id}`); - } - break; - case "imcenter": - pos = this.displayToLogicalPos({x: this.display.width/2, - y: this.display.height/2}); - r = `${pos.x},${pos.y}`; - break; - case "wcscenter": - pos = this.displayToImagePos({x: this.display.width/2, - y: this.display.height/2}); - r = JS9.pix2wcs(this.raw.wcs, pos.x, pos.y).replace(/\s+/g, ","); - break; - case "sregions": - owcssys = savewcs(u[1]); - r = this.listRegions("source", - {mode:0, includedcoords:JS9.globalOpts.regExpandDCoords}) - .replace(/\s+/g,""); - restorewcs(owcssys); - break; - case "bregions": - owcssys = savewcs(u[1]); - r = this.listRegions("background", - {mode:0, includedcoords:JS9.globalOpts.regExpandDCoords}) - .replace(/\s+/g,""); - restorewcs(owcssys); - break; - case "regions": - owcssys = savewcs(u[1]); - r = this.listRegions("all", - {mode:0, includedcoords:JS9.globalOpts.regExpandDCoords}) - .replace(/\s+/g,""); - restorewcs(owcssys); - break; - case "mag": - // hack for statusbar - if( this.params.zoom ){ - r = sprintf("%s%", 100 * this.params.zoom); - } else { - r = "?"; - } - break; - default: - // look for keyword in the serialized opts array - if( opts ){ - olen = opts.length; - for(i=0; i { - if( !s1 || !s2 ){ - return false; - } - return String(s1).toUpperCase() === String(s2).toUpperCase(); - }; - // sanity check - if( !atask.title || !atask.name ){ return false; } - // is this task hidden? - if( atask.hidden ){ - return false; - } - // file validators - if( atask.files ){ - if( atask.files.match(/^fits$/) && - !this.fitsFile ){ - return false; - } - if( atask.files.match(/^table$/) ){ - if( this.imtab !== "table" ){ - return false; - } - } - if( atask.files.match(/^image$/) ){ - if( this.imtab !== "image" ){ - return false; - } - } - // header params: fitsHeader(pname,pvalue) - parr = atask.files.match(parexp); - if( parr ){ - s = this.raw.header[parr[1].toUpperCase()]; - if( !seq(s, parr[2]) ){ - return false; - } - } - // win vars: winVar(name,value) - parr = atask.files.match(winexp); - if( parr ){ - s = JS9.varByName(parr[1], window); - if( !seq(s, parr[2]) ){ - return false; - } - } - // js9 vars: js9Var(name,value) - parr = atask.files.match(js9exp); - if( parr ){ - s = JS9.varByName(parr[1], JS9); - if( !seq(s, parr[2]) ){ - return false; - } - } - // im vars: imVar(name,value) - parr = atask.files.match(imexp); - if( parr ){ - s = JS9.varByName(parr[1], this); - if( !seq(s, parr[2]) ){ - return false; - } - } - } // end of file validators - return true; -}; - -// return object containing analysis task definitions -JS9.Image.prototype.getAnalysis = function(){ - let i, j, t, tasks; - const obj = []; - // sanity check - if( !this.analysisPackages ){ return obj; } - // return validated tasks - for(j=0; j { - // shouldn't happen - if( !JS9.helper ){ - JS9.error(s, t); - } - switch(JS9.helper.type){ - case 'nodejs': - case 'socket.io': - // when socket.io is long-polling, throwing an error prevent the - // polling from completing, leading to a timeout error and disaster. - // to allow the polling to complete, throw the error after a delay - if( JS9.helper.socket && - JS9.helper.socket.io.engine.transport.name === "polling"){ - window.setTimeout(() => { - JS9.error(s, t); - }, 0); - } else { - JS9.error(s, t); - } - break; - default: - JS9.error(s, t); - break; - } - }; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse runAnalysis opts: ${opts}`, e); } - } - // func can be passed, or it can be global - func = func || JS9.globalOpts.analysisFunc; - // sanity check - if( !JS9.helper.connected || !this.analysisPackages ){ return; } - // get analysis task - a = this.lookupAnalysis(name); - if( !a ){ - JS9.error(`could not find analysis task: ${name}`); - return; - } - // get command line using macro expansion - if( a.action ){ - obj.cmd = this.expandMacro(a.action, opts); - } - // macro expand the strings in the keys array - if( a.keys ){ - obj.keys = {}; - for(i=0; i { - let s, robj, f, pf, xobj, files; - // return type can be string or object - if( typeof r === "object" ){ - // object from node.js - robj = r; - } else { - // string from cgi - if( r.search(JS9.analOpts.epattern) >=0 ){ - robj = {stderr: r}; - } else { - robj = {stdout: r}; - } - } - robj.errcode = robj.errcode || 0; - // if a processing func was supplied, call it and don't display - if( func ){ - func.call(this, robj.stdout, robj.stderr, robj.errcode, a); - } else { - // handle errors before we start - if( robj.stderr ){ - s = robj.stderr; - // if its only a warning, log it - if( (s.search(/WARNING:/i) >= 0) && (s.search(/ERROR:/i) < 0) ){ - JS9.log(s); - } else { - // otherwise, throw an error - analError(s, JS9.analOpts.epattern); - return; - } - } else if( robj.errcode ){ - s = `ERROR: running ${a.name} [${robj.errcode}]`; - // not sure what this means, so just log it if stdout exists - if( robj.stdout ){ - JS9.log(s); - } else { - // otherwise, throw an error - analError(s, JS9.analOpts.epattern); - return; - } - } - // display according to type - switch(a.rtype){ - case "text": - case undefined: - this.displayAnalysis("text", robj.stdout, - {divid: JS9.globalOpts.analysisDiv}); - break; - case "plot": - this.displayAnalysis("plot", robj.stdout, - {divid: JS9.globalOpts.analysisDiv}); - break; - case "alert": - if( robj.stdout ){ - alert(robj.stdout); - } - break; - case "fits": - // output is file and possibly parentFile - files = robj.stdout.split(/\s+/); - if( files && files[0] ){ - // file - f = JS9.cleanPath(files[0]); - // relative path: add install dir prefix - if( f.charAt(0) !== "/" ){ - f = JS9.InstallDir(f); - } - // which is a proxy file (meaning: delete it on close) - xobj = {proxyFile: f}; - // look for parentFile (relative to helper, not install) - if( files[1] ){ - pf = JS9.cleanPath(files[1]); - xobj.parentFile = pf; - xobj.proxyParent = pf; - } - // don't convert this FITS file into another FITS file! - xobj.fits2fits = false; - // don't fix the path for desktop - xobj.fixpath = false; - // load new file - JS9.Load(f, xobj, {display: this.display}); - } - break; - case "regions": - // output is region file (or region string), optional opts - files = robj.stdout.split(/\s+/); - if( files && files[0] ){ - // see if a json opts was returned - if( files.length > 1 ){ - try{ ropts = JSON.parse(files[1]); } - catch(e){ ropts = null; } - } - ropts = ropts || {}; - if( typeof ropts.remove === "boolean" ){ - ropts.remove = "all"; - } - if( ropts.type === "string" ){ - // region string was passed directly - if( ropts.remove ){ - this.removeShapes("regions", ropts.remove); - } - this.addShapes("regions", files[0], opts); - } else { - // region file was passed, we have to fetch it - f = JS9.cleanPath(files[0]); - // relative path: add install dir prefix - if( f.charAt(0) !== "/" ){ - f = JS9.InstallDir(f); - } - // load new region file - obj = {responseType: "text"}; - JS9.fetchURL(null, f, obj, (regions, opts) => { - if( ropts.remove ){ - this.removeShapes("regions", ropts.remove); - } - this.addShapes("regions", regions, opts); - }); - } - } - break; - case "catalog": - // output is catalog file - files = robj.stdout.split(/\s+/); - if( files && files[0] ){ - f = JS9.cleanPath(files[0]); - // load new catalog file - obj = {responseType: "text"}; - JS9.fetchURL(null, f, obj, (catalog, opts) => { - this.loadCatalog(null, catalog, opts); - }); - } - break; - case "none": - break; - default: - JS9.error(`unknown analysis result type: ${a.rtype}`); - break; - } - } - // set status - this.setStatus("runAnalysis", "complete"); - // done waiting - JS9.waiting(false); - }); - // allow chaining - return this; -}; - -// display analysis results (text or plot) -JS9.Image.prototype.displayAnalysis = function(type, s, opts){ - let i, r, id, did, hstr, pobj, divjq, title, titlefile, winFormat; - let divid, plot, pdata, popts, gim, gdiv, nscale; - const a = JS9.lightOpts[JS9.LIGHTWIN]; - const flotConfig = () => { - let s; - let winformat = "width=368px,height=110px,resize=1,scrolling=1"; - const title = JS9.Plot.opts.title; - // sanity check - if( !divjq || !plot ){ return; } - // call this once window is loaded - $(JS9.lightOpts[JS9.LIGHTWIN].topid) - .arrive("#plotConfigForm", {onceOnly: true}, () => { - JS9.Plot.initConfigForm.call(this, plot, pobj); - }); - if( JS9.allinone ){ - s = JS9.allinone.plotConfigHTML; - plot.winid = this.displayAnalysis("params", s, {title, winformat}); - } else { - s = JS9.InstallDir(JS9.Plot.opts.configURL); - plot.winid = this.displayAnalysis("params", s, {title, winformat}); - } - }; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse displayAnalysis opts: ${opts}`, e); } - } - // window format ... - winFormat = opts.winformat; - // ... or target div - if( opts.divid && $(`#${opts.divid}`).length > 0 ){ - divid = $(`#${opts.divid}`); - } - // make up title, if necessary - title = opts.title || ""; - if( this && !title ){ - titlefile = (this.fitsFile || this.id || ""); - titlefile = titlefile.split("/").reverse()[0]; - title = `AnalysisResults: ${titlefile}`; - // add display to title - title += sprintf(JS9.IDFMT, this.display.id); - } - // unique id for light window - id = `Analysis_${JS9.uniqueID()}`; - // process the type of analysis results - switch(type){ - case "text": - s = s || ""; - hstr = "

    "; - hstr += `
    ${s}
    `; - hstr += ""; - // populate div or create the light window to hold the text - if( divid ){ - // existing div - divid.html(hstr); - // Electron does not support search so we implement our own ... - if( window.electron ){ - JS9.searchbar(divid[0]); - } - } else { - // display light window - winFormat = winFormat || a.textWin; - did = JS9.lightWin(id, "inline", hstr, title, winFormat); - // Electron does not support search so we implement our own ... - if( window.electron ){ - JS9.searchbar(did); - } - } - break; - case "plot": - // convert results to js object - if( s && typeof s === "string" ){ - try{ pobj = JSON.parse(s); } - catch(e){ JS9.error(`can't plot return data: ${s}`, e); } - } else if( typeof s === "object" ){ - pobj = s; - } - // sanity check - if( !pobj ){ return; } - // initialize scale - pobj.curscale = {x: "linear", y: "linear"}; - // create an outer div and an inner plot for the light window open call - hstr = `
    `; - // populate div or create the light window to hold the plot - if( divid ){ - divid.html(hstr); - } else { - winFormat = winFormat || a.plotWin; - did = JS9.lightWin(id, "inline", hstr, title, winFormat); - } - // find the inner plot div which now is inside the light window - divjq = $(`#${id} #${id}Plot`); - // when using a div (instead of a lightwin), set the div size - if( divid ){ - divjq.css("width", divid.css("width")); - divjq.css("height", divid.css("height")); - divjq.css("margin", 0); - } - // flot data - if( pobj.data ){ - switch( JS9.globalOpts.plotLibrary ){ - case "plotly": - popts = $.extend(true, {}, JS9.Plot.opts, pobj.opts); - if( pobj.label ){ - popts.title = pobj.label; - } - pdata = {x: [], y: [], type: "scatter"}; - // flot data format: [[x1,y1], [x2,y2], ..] - // or: [[x1,y1,yerr1], [x2,y2,yerr2], ..] - if( pobj.data[0].length >= 3 ){ - // look for flot yerr properties - pdata.error_y = {type: 'data', array: [], visible: true}; - if( pobj.points && pobj.points.yerr ){ - if( pobj.points.yerr.color ){ - pdata.error_y.color = pobj.points.yerr.color; - } - } - } - for(i=0; i { - JS9.Plot.annotate(divjq, plt, pobj); - }; - } - pobj.color = pobj.color || popts.color; - // log scale? - if( pobj.xscale === "log" ){ - popts.xaxis = popts.xaxis || {}; - popts.xaxis.transform = JS9.Plot.logfunc; - popts.xaxis.inverseTransform = JS9.Plot.expfunc; - pobj.curscale.x = "log"; - } - if( pobj.yscale === "log" ){ - popts.yaxis = popts.yaxis || {}; - popts.yaxis.transform = JS9.Plot.logfunc; - popts.yaxis.inverseTransform = JS9.Plot.expfunc; - pobj.curscale.y = "log"; - } - try{ plot = $.plot(divjq, [pobj], popts); } - catch(e){ JS9.error("can't plot data (flot)", e); } - // annotate, if necessary - if( JS9.Plot.opts.annotate && pobj.annotations ){ - JS9.Plot.annotate(divjq, plot, pobj); - } - break; - } - // add key handlers - divjq.css("outline", "none"); - divjq.attr("tabindex", 0); - divjq.on("keydown", (evt) => { - const c = JS9.eventToCharStr(evt); - switch(c){ - case "c": - flotConfig(); - break; - case "x": - case "y": - nscale = pobj.curscale[c] !== "linear" ? "linear" : "log"; - JS9.Plot.rescale(divjq, plot, pobj, c, nscale); - break; - default: - break; - } - }); - // add the plot config gear - gim = $(``); - gim.on("click", flotConfig); - gdiv = $("
    "); - gdiv.append(gim); - divjq.append(gdiv); - } - break; - case "params": - case "regions": - case "textline": - if( divid ){ - if( JS9.allinone ){ - divid.html(s); - } else { - $.ajax({ - url: s, - cache: false, // required for v3 socket.io - dataType: "text", - success: (data) => { divid.html(data); } - }); - } - } else { - if( type === "params" ){ - winFormat = winFormat || a.paramWin; - } else if( type === "regions" ){ - if( JS9.globalOpts.regConfigSize === "small" ){ - winFormat = winFormat || a.regWin0; - } else { - winFormat = winFormat || a.regWin; - } - } else { - winFormat = winFormat || a.dpathWin; - } - r = JS9.allinone?"inline":"ajax"; - did = JS9.lightWin(id, r, s, title, winFormat); - } - break; - default: - break; - } - return did; -}; - -// save image as a FITS file -JS9.Image.prototype.saveFITS = function(fname, opts){ - let arr, blob, s, sect; - if( {}.hasOwnProperty.call(window, "saveAs") ){ - if( fname ){ - fname = fname - .replace(/\s+/g, "_") - .replace(/(png|jpg|jpeg|fz)$/i, "fits"); - if( !fname.match(/.fits$/) ){ - fname += ".fits"; - } - } else { - fname = "js9.fits"; - } - opts = opts || {}; - if( typeof opts === "string" ){ - try{ s = JSON.parse(opts); } - catch(e){ s = null; } - if( s ){ opts = s; } - } - // what do we save? - if( opts === "display" || opts.source === "display" ){ - // save currently displayed section - sect = this.rgb.sect; - arr = this.toArray({notab: true, twoaxes: true, sect: sect}); - } else if( opts === "virtual" || opts.source === "virtual" ){ - if( this.raw.hdu && this.raw.hdu.fits && this.raw.hdu.fits.vfile ){ - arr = JS9.vread(this.raw.hdu.fits.vfile, "binary"); - } else { - JS9.error("no virtual file available to save"); - } - } else { - // save entire image: first convert to array (with two axes) - arr = this.toArray({notab: true, twoaxes: true}); - } - // convert array to blob - blob = new Blob([arr], {type: "application/octet-binary"}); - // save to disk - JS9.saveAs(blob, fname); - } else { - JS9.error("no saveAs() available to save FITS file"); - } - return fname; -}; - -// save image as an img file of specified type (e.g., image/png, image/jpeg) -JS9.Image.prototype.saveIMG = function(fname, type, opts){ - let key, img, ctx, canvas, width, height, quality; - if( {}.hasOwnProperty.call(window, "saveAs") ){ - // opts can be opts object or json string or quality value - if( typeof opts === "number" ){ - quality = opts; - opts = null; - } else if( typeof opts === "string" ){ - if( JS9.isNumber(opts) ){ - quality = parseFloat(opts); - opts = null; - } else { - try{ opts = JSON.parse(opts); } - catch(e){ opts = null; } - } - if( opts ){ - quality = opts.quality; - } - } - // opts is optional - opts = opts || {}; - // filename is optional - fname = fname || "js9.png"; - // save as specified type - type = type || "image/png"; - // convenience params - width = this.display.width; - height = this.display.height; - // create off-screen canvas, into which we write all canvases - img = document.createElement("canvas"); - img.setAttribute("width", width); - img.setAttribute("height", height); - ctx = img.getContext("2d"); - // source can be image or display - if( opts.source === "image" ){ - // image: save RGB image for this image, which will be different - // from the display, e.g., when blend mode is turned on - ctx.putImageData(this.rgb.img, 0, 0); - } else { - // display: save RGB image as seen on the display, - // e.g. a composite blended image - ctx.drawImage(this.display.canvas, 0, 0); - } - // add graphics layers, unless explicitly specified not to - if( opts.layers !== false ){ - for( key of Object.keys(this.layers) ){ - // each layer canvas - if( this.layers[key].dlayer.dtype === "main" && - this.layers[key].show ){ - canvas = this.layers[key].dlayer.canvasjq[0]; - ctx.drawImage(canvas, 0, 0, width, height); - } - } - } - // sanity check on quality - if( JS9.notNull(quality) ){ - if( quality < 0 || quality > 1 ){ - quality = 0.95; - } - } - img.toBlob( (blob) => { - JS9.saveAs(blob, fname); - }, type, quality); - } else { - JS9.error("no saveAs() available for saving image"); - } - return fname; -}; - -// save image as a PNG file -JS9.Image.prototype.savePNG = function(fname, opts){ - fname = fname || "js9.png"; - if( !fname.match(/\.png$/) ){ - fname += ".png"; - } - return this.saveIMG(fname, "image/png", opts); -}; - -// save image as a JPEG file -JS9.Image.prototype.saveJPEG = function(fname, opts){ - fname = fname || "js9.jpg"; - if( !fname.match(/\.jpg$/) && !fname.match(/\.jpeg$/) ){ - fname += ".jpg"; - } - return this.saveIMG(fname, "image/jpeg", opts); -}; - -// update (and display) pixel and wcs values (connected to info plugin) -JS9.Image.prototype.updateValpos = function(ipos, disp){ - let val, vstr, vstr1, vstr2, vstr3, val3, i, c, d, p, s; - let cd1, cd2, v1, v2, units, sect; - let obj = null; - const sep1 = "\t "; - const sep2 = "\t\t "; - const sp = "    "; - const tf = (fval) => { - return JS9.floatFormattedString(fval, this.params.precision, 3); - }; - const tr = (fval, length) => { - length = length || 3; - return fval.toFixed(length); - }; - const ti = (ival, length) => { - let r = ""; - let prefix = ""; - length = length || 3; - if( ival < 0 ){ - ival = Math.abs(ival); - prefix = "-"; - } - r = r + ival; - while (r.length < length) { - r = `0${r}`; - } - return prefix + r; - }; - // only do processing if valpos is turned on - if( this.params.valpos ){ - // default is to display - if( disp === undefined ){ - disp = true; - } - // if a cached valpos object exists, use it - // this is unset and reset in the mousemove callback - if( this.valpos ){ - if( disp ){ - this.display.displayMessage("info", this.valpos, - JS9.globalOpts.valposTarget); - } - return this.valpos; - } - // get image coordinates - i = {x: ipos.x, y: ipos.y, sys: "image"}; - // get logical coordinates - p = this.imageToLogicalPos(ipos); - // get display coordinates - d = this.imageToDisplayPos(ipos); - d.sys = "display"; - // get pixel coordinates in current logical coordinate system; - if( this.params.wcssys === "image" ){ - c = i; - } else { - c = p; - } - // get image value: here we need 0-indexed display positions, - // so subtract the 0.5 of the image pixel - val = this.raw.data[Math.floor(ipos.y - 0.5) * this.raw.width + - Math.floor(ipos.x - 0.5)]; - // fix the significant digits in the value - switch(this.raw.bitpix){ - case 8: - case 16: - case -16: - case 32: - val3 = ti(val); - break; - case -32: - case -64: - val3 = tf(val); - break; - default: - val3 = ti(val); - break; - } - // create the valpos string - vstr1 = val3; - vstr2 = `${tr(c.x, 3)} ${tr(c.y, 3)} (${c.sys})`; - if( JS9.globalOpts.valposDCoords && c.sys === "image" ){ - vstr2 += `${sp}${tr(d.x, 3)} ${tr(d.y, 3)} (${d.sys})`; - } - vstr = vstr1 + sp + vstr2; - // object containing all information - obj = {ix: i.x, iy: i.y, ipos: tr(i.x, 2) + sep2 + tr(i.y, 2), - isys: "image", - px: p.x, py: p.y, ppos: tr(p.x, 2) + sep2 + tr(p.y, 2), - psys: "physical", - dx: d.x, dy: d.y, dpos: tr(d.x, 2) + sep2 + tr(d.y, 2), - dsys: "display", - cx: c.x, cy: c.y, cpos: tr(c.x, 2) + sep2 + tr(c.y, 2), - csys: c.sys, - ra: "", dec: "", wcspos: "", wcssys: "", - racen: "", deccen: "", - wcsfov: "", wcspix: "", - val: val, val3: val3, - id: this.id, file: this.file, object: this.object||""}; - if( this.telescope || this.instrument ){ - if( obj.object ){ obj.object += " "; } - obj.object += "("; - if( this.telescope ){ - obj.object += this.telescope; - if( this.instrument ){ - obj.object += ", "; - } - } - if( this.instrument ){ - obj.object += this.instrument; - } - obj.object += ")"; - } - // add wcs, if necessary - if( this.validWCS() && JS9.isWCSSys(this.params.wcssys) ){ - s = JS9.pix2wcs(this.raw.wcs, ipos.x, ipos.y).trim().split(/\s+/); - vstr3 = `${s[0]} ${s[1]} (${s[2]||"wcs"})`; - vstr = vstr1 + sp + vstr3 + sp + vstr2; - // update object with wcs - obj.ra = s[0]; - obj.dec = s[1]; - obj.wcspos = s[0] + sep1 + s[1]; - obj.wcssys = s[2]; - if( this.raw.wcsinfo ){ - cd1 = Math.abs(this.raw.wcsinfo.cdelt1); - cd2 = Math.abs(this.raw.wcsinfo.cdelt2); - v1 = 1/60; - if( this.raw.header.CUNIT1 ){ - units = this.raw.header.CUNIT1; - } - if( !units || units.match(/^deg/i) ){ - if( (cd1 >= 1) || (cd2 >= 1) ){ - units = "deg"; - } else if( (cd1 >= v1) || (cd2 >= v1) ){ - units = "'"; - cd1 *= 60; - cd2 *= 60; - } else { - units = '"'; - cd1 *= 3600; - cd2 *= 3600; - } - } - sect = this.rgb.sect; - v1 = ((sect.x1 - sect.x0) * cd1).toFixed(0); - v2 = ((sect.y1 - sect.y0) * cd2).toFixed(0); - obj.wcsfov = `${v1}${units} × ${v2}${units}`; - v1 = tr(cd1 / sect.zoom, 3); - obj.wcspix = `${v1}${units}/pix`; - obj.wcsfovpix = `${obj.wcsfov} (${obj.wcspix})`; - s = JS9.pix2wcs(this.raw.wcs, - (sect.x1 + sect.x0)/2, (sect.y1 + sect.y0)/2) - .trim().split(/\s+/); - obj.racen = s[0]; - obj.deccen = s[1]; - obj.wcscen = s[0] + sep1 + s[1]; - } - } - obj.vstrsmall = vstr1 + sp + vstr2; - obj.vstr = vstr; - obj.vstrmedium = vstr; - obj.vstrlarge = vstr + sp + this.file; - if( disp ){ - this.display.displayMessage("info", obj, - JS9.globalOpts.valposTarget); - } - } - return obj; -}; - -// toggle display of value/position -JS9.Image.prototype.toggleValpos = function(){ - this.params.valpos = !this.params.valpos; - if( !this.params.valpos ){ - this.display.clearMessage(); - } -}; - -// get color map name -JS9.Image.prototype.getColormap = function(){ - if( this.cmapObj ){ - return {colormap: this.cmapObj.name, - contrast: this.params.contrast, - bias: this.params.bias}; - } -}; - -// set color map -// calling sequences: -// setColormap(name); -// setColormap(name, contrast, bias); -// setColormap(name, staticOpts); -// setColormap(contrast, bias); -// setColormap(staticOpts); -// setColormap("rgb"); -// setColormap("invert"); -// setColormap("reset"); -JS9.Image.prototype.setColormap = function(...args){ - let [arg, arg2, arg3] = args; - let arr; - const setCmap = (arg) => { - if( this.cmapObj ){ - // unset rgb mode, if necessary - switch(this.cmapObj.name){ - case "red": - if( this.display.rgb.rim === this ){ - this.display.rgb.rim = null; - } - break; - case "green": - if( this.display.rgb.gim === this ){ - this.display.rgb.gim = null; - } - break; - case "blue": - if( this.display.rgb.bim === this ){ - this.display.rgb.bim = null; - } - break; - } - } - // remove previous static colormap - delete this.staticObj; - // add the new colormap - this.cmapObj = JS9.lookupColormap(arg); - this.params.colormap = this.cmapObj.name; - // for static colormaps, copy the static object (we might edit it) - if( this.cmapObj.type === "static" ){ - this.staticObj = $.extend(true, {}, this.cmapObj); - } - // set rgb mode, if necessary - switch(arg){ - case "red": - this.display.rgb.rim = this; - break; - case "green": - this.display.rgb.gim = this; - break; - case "blue": - this.display.rgb.bim = this; - break; - default: - break; - } - // new colormap, turn off image overlay - this.params.overlay = false; - }; - const setContrastBias = (arg1, arg2) => { - arg1 = parseFloat(arg1); - if( !Number.isNaN(arg1) ){ - this.params.contrast = arg1; - } - arg2 = parseFloat(arg2); - if( !Number.isNaN(arg2) ){ - this.params.bias = arg2; - } - }; - const setStatic = (a) => { - let i, j, color, dval; - for(i=0; i 0 && dval <= 1 ){ - dval = dval * 255; - } - color.alpha = dval; - } - break; - case 3: - // min and max - color.min = parseFloat(a[i][1]); - if( Number.isNaN(color.min) ){ - color.min = -Infinity; - } - color.max = parseFloat(a[i][2]); - if( Number.isNaN(color.max) ){ - color.max = Infinity; - } - break; - default: - break; - } - break; - } - } - } - // new colormap, turn off image overlay - this.params.overlay = false; - } - // is this core service disabled? - // (only if the colormap has been set at least once!) - if( $.inArray("colormap", this.params.disable) >= 0 && this.cmapObj ){ - return; - } - switch(args.length){ - case 1: - switch(arg){ - case "rgb": - this.display.rgb.active = !this.display.rgb.active; - break; - case "overlay": - if( this.offscreen ){ - this.params.overlay = !this.params.overlay; - } - break; - case "invert": - this.params.invert = !this.params.invert; - break; - case "reset": - this.params.invert = JS9.imageOpts.invert; - this.params.contrast = JS9.imageOpts.contrast; - this.params.bias = JS9.imageOpts.bias; - break; - default: - if( this.cmapObj && this.cmapObj.type === "static" ){ - if( $.isArray(arg) ){ - setStatic(arg); - } else if( typeof arg === "string" && arg.charAt(0) === '[' ){ - try{ - arr = JSON.parse(arg); - setStatic(arr); - } - catch(e){ - JS9.error(`can't parse JSON in setColormap: ${arg}`, e); - } - } else { - setCmap(arg); - } - } else if( typeof arg === "string" ){ - setCmap(arg); - } - break; - } - break; - case 2: - if( JS9.isNumber(arg) && JS9.isNumber(arg2) ){ - setContrastBias(arg, arg2); - } else if( this.cmapObj && this.cmapObj.type === "static" ){ - setCmap(arg); - setStatic(arg2); - } - break; - case 3: - setCmap(arg); - setContrastBias(arg2, arg3); - break; - default: - break; - } - this.displayImage("colors"); - // hack: delete filterRGBImage from stash to avoid restore during reproject - this.xeqStashDiscard("filterRGBImage"); - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetcolormap"); - } - return this; -}; - -// get scale factor -JS9.Image.prototype.getScale = function(){ - if( this.params.scale ){ - return {scale: this.params.scale, - scalemin: this.params.scalemin, - scalemax: this.params.scalemax, - scaleclipping: this.params.scaleclipping}; - } -}; - -// set scale factor -JS9.Image.prototype.setScale = function(...args){ - let [s0, s1, s2] = args; - const newscale = (s) => { - if( JS9.scales.includes(s) ){ - this.params.scale = s; - } else if( s === "dataminmax" ){ - this.params.scaleclipping = "dataminmax"; - this.params.scalemin = this.raw.dmin; - this.params.scalemax = this.raw.dmax; - } else if( s === "zscale" ){ - if( (this.params.z1 === undefined) || - (this.params.z2 === undefined) ){ - this.zscale(false); - } - this.params.scaleclipping = "zscale"; - this.params.scalemin = this.params.z1; - this.params.scalemax = this.params.z2; - } else if( s === "zmax" ){ - if( (this.params.z1 === undefined) ){ - this.zscale(false); - } - this.params.scaleclipping = "zmax"; - this.params.scalemin = this.params.z1; - this.params.scalemax = this.raw.dmax; - } else if( s === "user" ){ - this.params.scaleclipping = "user"; - } else { - JS9.error(`unknown scale: ${s}`); - } - }; - // is this core service disabled? - if( $.inArray("scale", this.params.disable) >= 0 ){ - return; - } - if( args.length ){ - switch(args.length){ - case 1: - newscale(s0); - break; - case 2: - this.params.scalemin = parseFloat(s0); - this.params.scalemax = parseFloat(s1); - this.params.scaleclipping = "user"; - break; - default: - newscale(s0); - if( (s0 !== "zscale") && (s0 !== "zmax") ){ - this.params.scalemin = parseFloat(s1); - this.params.scalemax = parseFloat(s2); - this.params.scaleclipping = "user"; - } - break; - } - this.params.precision = - JS9.floatPrecision(this.params.scalemin, this.params.scalemax); - this.displayImage("colors"); - } - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetscale"); - } - return this; -}; - -// get opacity factor -JS9.Image.prototype.getOpacity = function(){ - let obj = {}; - if( JS9.notNull(this.params.opacity) ){ - obj.opacity = this.params.opacity; - } else { - obj.opacity = 1; - } - if( JS9.notNull(this.params.flooropacity) ){ - obj.flooropacity = this.params.flooropacity; - obj.floorvalue = this.params.floorvalue; - } - return obj; -}; - -// set opacity factor: -// set default opacity for all pixels -// setOpacity(0.9) -// set opacity floor: for pixel values <= 1st arg assign 2nd arg as opacity -// setOpacity(5, 0.2) -// set default opacity, for pixel values <= 2nd arg, assign 3rd arg as opacity -// setOpacity(0.9, 5, 0.2) -// reset default opacity to 1 -// setOpacity("reset") -// remove opacity floor -// setOpacity("resetfloor") -// reset default opacity to 1, remove opacity floor -// setOpacity("resetall") -JS9.Image.prototype.setOpacity = function(...args){ - let [a1, a2, a3] = args; - // is this core service disabled? - if( $.inArray("opacity", this.params.disable) >= 0 ){ - return; - } - if( args.length ){ - switch(args.length){ - case 1: - if( typeof a1 === "string" ){ - if( a1.toLowerCase() === "reset" ){ - this.params.opacity = 1; - } else if( a1.toLowerCase() === "resetfloor" ){ - delete this.params.floorvalue; - delete this.params.flooropacity; - } else if( a1.toLowerCase() === "resetall" ){ - this.params.opacity = 1; - delete this.params.floorvalue; - delete this.params.flooropacity; - } - } else if( JS9.isNumber(a1) ){ - this.params.opacity = parseFloat(a1); - } - break; - case 2: - if( JS9.isNumber(a1) && JS9.isNumber(a2) ){ - this.params.floorvalue = parseFloat(a1); - this.params.flooropacity = parseFloat(a2); - } - break; - case 3: - if( JS9.isNumber(a1) ){ - this.params.opacity = parseFloat(a1); - } - if( JS9.isNumber(a2) && JS9.isNumber(a3) ){ - this.params.floorvalue = parseFloat(a2); - this.params.flooropacity = parseFloat(a3); - } - break; - default: - break; - } - // if we just set opacity (not reset), it must mean we want to use it, - // so turn off opacity masking, if necessary - if( typeof a1 === "number" || - (typeof a1 === "string" && !a1.match(/reset/)) ){ - if( this.mask.active && this.mask.im ){ - this.mask.active = false; - } - } - this.displayImage("colors"); - } - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onsetopacity"); - } - return this; -}; - -// get an image param value -JS9.Image.prototype.getParam = function(param){ - // sanity check - if( !param ){ return null; } - // return param object - if( param === "all" ){ - return this.params; - } - // return value - return this.params[param]; -}; - -// set an image param value -JS9.Image.prototype.setParam = function(param, value){ - let i, idx, ovalue, obj; - const getval = (s) => { - if( s === "true" ){ - return true; - } - if( s === "false" ){ - return false; - } - if( !JS9.isNumber(s) ){ - return s; - } - return parseFloat(s); - }; - // sanity check - if( !param ){ return null; } - // convert strings to values - value = getval(value); - // merge in new params - if( param === "all" && typeof value === "object" ){ - $.extend(true, this.params, value); - // call core methods as needed - if( value.colormap || value.contrast || value.bias ){ - obj = this.getColormap(); - value.colormap = value.colormap || obj.colormap; - value.contrast = value.contrast || obj.contrast; - value.bias = value.bias || obj.bias; - this.setColormap(value.colormap, value.contrast, value.bias); - } - if( value.scale || value.scalemin || value.scalemax ){ - obj = this.getScale(); - value.scale = value.scale || obj.scale; - value.scalemin = value.scalemin || obj.scalemin; - value.scalemax = value.scalemax || obj.scalemax; - this.setScale(value.scale, value.scalemin, value.scalemax); - } - if( value.flip ){ - this.setFlip("reset"); - this.setFlip(value.flip); - } - if( value.rot90 ){ - this.setRot90("reset"); - this.setRot90(value.rot90); - } - if( value.rotate ){ - this.setRotate("reset"); - this.setRotate(value.rotate); - } - if( value.invert ){ - this.params.invert = value.invert; - this.displayImage("colors"); - } - if( value.zoom ){ - this.setZoom(value.zoom); - } - if( value.wcssys ){ - this.setWCSSys(value.wcssys); - } - if( value.wcsunits ){ - this.setWCSUnits(value.wcsunits); - } - return this.params; - } else if( param === "disable" ){ - if( !$.isArray(value) ){ - value = [value]; - } - for(i=0; i= 0 ){ - this.params.disable.splice(idx, 1); - } - } - return this.params.disable; - } - // save old value - ovalue = this.params[param]; - // set new value - this.params[param] = value; - // call core methods as needed - switch(param){ - case "colormap": - this.setColormap(value); - break; - case "invert": - this.displayImage("colors"); - break; - case "contrast": - obj = this.getColormap(); - this.setColormap(obj.colormap, value, obj.bias); - break; - case "bias": - obj = this.getColormap(); - this.setColormap(obj.colormap, obj.contrast, value); - break; - case "overlay": - this.displayImage("colors"); - break; - case "flip": - this.setFlip("reset"); - this.setFlip(value); - break; - case "rot90": - this.setRot90("reset"); - this.setRot90(value); - break; - case "rotate": - this.setRotate("reset"); - this.setRotate(value); - break; - case "scale": - this.setScale(value); - break; - case "scalemin": - obj = this.getScale(); - this.setScale("user", value, obj.scalemax); - break; - case "scalemax": - obj = this.getScale(); - this.setScale("user", obj.scalemin, value); - break; - case "scaleclipping": - obj = this.getScale(); - this.setScale(value, obj.scalemin, obj.scalemax); - break; - case "wcssys": - this.setWCSSys(value); - break; - case "wcsunits": - this.setWCSUnits(value); - break; - case "zoom": - this.setZoom(value); - break; - } - // return old value - return ovalue; -}; - -// copy params from one image to another -JS9.Image.prototype.copyParams = function(params, images, opts){ - let i, j, im, param, val; - let xims = []; - // sanity check - if( !params ){ return; } - // opts is optional - opts = opts || {}; - if( typeof params === "string" && params.charAt(0) === '[' ){ - try{ params = JSON.parse(params); } - catch(e){ JS9.error(`can't parse JSON in copyParams: ${params}`, e); } - } - if( !$.isArray(params) ){ params = [params]; } - // do regions first to avoid problems with changes to the current image - i = $.inArray("regions", params); - if( i >= 0 ){ - params.splice(i, 1); - params.unshift("regions"); - } - // default is all images - images = images || JS9.images; - if( typeof images === "string" && images.charAt(0) === '[' ){ - try{ images = JSON.parse(images); } - catch(e){ JS9.error(`can't parse JSON in copyParams: ${images}`, e); } - } - if( !$.isArray(images) ){ images = [images]; } - // for each image - for(i=0; i 0 ){ - // integer data: BLANK header value specifies data value to ignore - if( raw.header.BLANK !== undefined ){ - blankval = raw.header.BLANK; - for(i=0; i raw.dmax ){ raw.dmax = val; } - } - } - } else { - for(i=0; i raw.dmax ){ raw.dmax = val; } - } - } - } else { - // float data: ignore NaN, infinity - for(i=0; i raw.dmax ){ raw.dmax = val; } - } - } - } - } - // re-set scaling values, if necessary - if( reminscale ){ params.scalemin = raw.dmin; } - if( remaxscale ){ params.scalemax = raw.dmax; } - // set new precision - params.precision = JS9.floatPrecision(params.scalemin, params.scalemax); - // allow chaining - return this; -}; - -// the zscale calculation -JS9.Image.prototype.zscale = function(setvals){ - let s, rawdata, bufsize, buf, vals; - // sanity check - if( !JS9.zscale || !this.raw || !this.raw.data ){ return this; } - rawdata = this.raw.data; - // allocate space for the image in the emscripten heap - bufsize = rawdata.length * rawdata.BYTES_PER_ELEMENT; - try{ buf = JS9.vmalloc(bufsize); } - catch(e){ JS9.error(`image too large for zscale malloc: ${bufsize}`, e); } - // copy the raw image data to the heap - // try{ JS9.vheap.set(new Uint8Array(rawdata.buffer), buf); } - try{ JS9.vmemcpy(new Uint8Array(rawdata.buffer), buf); } - catch(e){ JS9.error(`can't copy image to zscale heap: ${bufsize}`, e); } - // call the zscale routine - s = JS9.zscale(buf, - this.raw.width, - this.raw.height, - this.raw.bitpix, - this.params.zscalecontrast, - this.params.zscalesamples, - this.params.zscaleline); - // free emscripten heap space - JS9.vfree(buf); - // clean up return values - vals = s.trim().split(/\s+/); - // save z1 and z2 - this.params.z1 = parseFloat(vals[0]); - this.params.z2 = parseFloat(vals[1]); - // make z1 and z2 the scale clip values, if necessary - if( setvals === "zmax" ){ - this.params.scalemin = this.params.z1; - this.params.scalemax = this.raw.dmax; - } else if( setvals ){ - this.params.scalemin = this.params.z1; - this.params.scalemax = this.params.z2; - } - this.params.precision = - JS9.floatPrecision(this.params.scalemin, this.params.scalemax); - // allow chaining - return this; -}; - -// background-subtracted counts in regions -// eslint-disable-next-line no-unused-vars -JS9.Image.prototype.countsInRegions = function(...args){ - let i, s, vfile, bvfile, sect, ext, filter, bin, opts, cmdswitches; - let sregions = "field"; - let bregions = ""; - const getreg = (arg, def) => { - let ii, rarr, reg, narg; - const regrexp= /(annulus|box|circle|ellipse|line|polygon|point|text) *\(/; - // if we have no region, we're done - if( !arg ){ - return def; - } - if( typeof arg === "string" ){ - narg = this.expandMacro(arg); - // if we have no region, we're done - if( !narg ){ - return def; - } - // if its a known region, we're done - if( narg.match(regrexp) ){ - return narg; - } - } - // look for a region specifier - rarr = this.getShapes("regions", arg); - // no region are returned: this is an error - if( !rarr || !rarr.length ){ - JS9.error(`no regions found: ${arg}`); - } - // compose a region string from the returned regions - narg = ""; - for(ii=0; ii 1 ){ - if( this.imtab === "table" ){ - // for tables, regcnts has a -b switch - cmdswitches += ` -b ${bin}`; - } else { - // for images, make a temporary binned file - bvfile = `bin${bin}_${vfile.split("/").reverse()[0]}`; - sect = `0@0,0@0,${bin}`; - JS9.imsection(vfile, bvfile, sect, ""); - vfile = bvfile; - } - } - } - // could take a while ... - JS9.waiting(true, this.display); - // call low-level regcnts - s = JS9.regcnts(vfile, sregions, bregions, cmdswitches); - // all done waiting - JS9.waiting(false); - // remove binned file, if necessary - if( bvfile ){ - JS9.vunlink(bvfile); - } - // check for regions or cfitio errors - if( s.match(/^ERROR/) || s.match(/FITSIO status/) ){ - JS9.error(s); - } - // display in a lightwin, if necessary - if( opts.lightwin ){ - // display counts in a light window - this.displayAnalysis("text", s, {divid: JS9.globalOpts.analysisDiv}); - } - // return results, including errors - return s; -}; - -// radial profile plot -// eslint-disable-next-line no-unused-vars -JS9.Image.prototype.radialProfile = function(...args){ - let i, s, xlabel, ylabel, obj, cobj, pobj, res, el, opts; - let color, errorbars, errorcolor; - const carr = []; - const swobj = {cmdswitches: "-G -j -r"}; - // make up arg list, add required radial profile switches to opts - for(i=0; i res.radius2 ){ - JS9.error("radial profile source region must be an annulus"); - } - el = [(res.radius1 + res.radius2)/2, res.surfBrightness, res.surfError]; - pobj.data.push(el); - } - // display results - return this.displayAnalysis("plot", pobj, - {divid: JS9.globalOpts.analysisDiv}); -}; - -// plot of a 3D cube a region -// eslint-disable-next-line no-unused-vars -JS9.Image.prototype.plot3d = function(src, bkg, opts){ - let i, j, s, arr, jobj, el, pobj, color, mode, divid, xlabel, ylabel; - let index3, xoff, xdelt; - const counts=[]; - if( !this.raw.header || this.raw.header.NAXIS !== 3 ){ - JS9.error("plot3d requires a data cube with 3 dimensions"); - } - // opts is optional - opts = $.extend(true, {}, opts, JS9.globalOpts.plot3d); - // slice - opts.cube = opts.cube || "*:*:all"; - // make sure 'all' is specified - arr = opts.cube.split(":"); - for(i=0; i return name of current raw - if( !args.length ){ - return this.raw.id; - } - // opts is optional - opts = opts || {}; - // opts is a string with second arg a func: generate opts object - // opts is a string, no func: switch to a different raw data layer - // opts is a string + "remove": remove specified layer - if( typeof opts === "string" ){ - if( typeof func === "function" ){ - // change: rawDataLayer(id, func) to rawDataLater(obj, func) - opts = {rawid: opts}; - } else { - id = opts; - mode = func; - // look for raw layer with the specified id - for(i=0; i= 0 ){ - this.raws[cur] = nraw; - } else { - this.raws.push(nraw); - } - // assign this nraw to the high-level raw data object - this.raw = nraw; - // renew bitpix, if necessary - if( this.raw.header.bitpix ){ - this.raw.bitpix = this.raw.header.bitpix; - } - // re-calculate min and max, if necesary - if( opts.dataminmax !== false ){ - this.dataminmax(); - } - // re-init coordinate systems, if necessary - if( opts.updatewcs ){ - // init WCS, if possible - this.initWCS(); - // init the logical coordinate system, if possible - this.initLCS(); - } - // reset pan, if necessary - if( opts.resetpan ){ - this.setPan(); - } - // refresh shape layers - this.refreshLayers(); - // redisplay using these data - this.displayImage("all", opts); - // redo flip and rot - this.reFlipRot(); - } - return true; -}; - -// perform a gaussian blur on the raw data -// creates a new raw data layer ("gaussBlur") -JS9.Image.prototype.gaussBlurData = function(sigma, opts){ - if( sigma === undefined ){ - JS9.error("missing sigma value for gaussBlurData"); - } - // save value - this.params.sigma = sigma; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse gaussBlur opts: ${opts}`, e); } - } - // the blurred image will be floating point - if( this.raw.bitpix === -64 ){ - opts.bitpix = -64; - } else { - opts.bitpix = -32; - } - // use origin of current - opts.oraw = "current0"; - // nraw should be a floating point copy of oraw - opts.alwaysCopy = true; - // new layer - opts.rawid = opts.rawid || "gaussBlur"; - // pass the options - opts.sigma = sigma; - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("gaussBlurData", [sigma], opts.rawid); - // call routine to generate (or modify) the new layer - this.rawDataLayer(opts, (oraw, nraw) => { - let tdata; - // nraw contains a floating point copy of oraw - // make a temporary copy of nraw data for calculations - switch(nraw.bitpix){ - case -32: - tdata = new Float32Array(nraw.data); - break; - case -64: - tdata = new Float64Array(nraw.data); - break; - default: - JS9.error(`invalid temp bitpix for gaussBlur: ${nraw.bitpix}`); - break; - } - // the heart of the matter! - gaussBlur(tdata, nraw.data, nraw.width, nraw.height, sigma); - return true; - }); - // allow chaining - return this; -}; - -// perform arithmetic operations on the raw data -// creates a new raw data layer ("imarith") -JS9.Image.prototype.imarithData = function(...args){ - let im; - let [op, arg1, opts] = args; - // no args means return the available ops - if( !args.length ){ - return ["add", "sub", "mul", "div", "min", "max", "reset"]; - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse imarith opts: ${opts}`, e); } - } - opts.rawid = opts.rawid || "imarith"; - // special case: reset by deleting the layer - if( (op === "reset") || (op === "remove") ){ - this.rawDataLayer(opts.rawid, "remove"); - return; - } - // sanity check - if( op === undefined || arg1 === undefined ){ - JS9.error("missing arg(s) for image arithmetic"); - } - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("imarithData", args.slice(), opts.rawid); - // operation: add, sub, mul, div ... - switch(op){ - case "add": - case "sub": - case "mul": - case "div": - case "min": - case "max": - opts.op = op; - break; - default: - JS9.error(`invalid operator for image arithmetic: ${op}`); - break; - } - // arg1: can be an image object or a numeric value - if( typeof arg1 === "object" ){ - if( (this.raw.width !== arg1.raw.width) || - (this.raw.height !== arg1.raw.height) ){ - JS9.error("images must be the same size for image arithmetic"); - } - opts.argtype = "image"; - opts.argval = arg1; - } else if( JS9.isNumber(arg1) ){ - opts.argtype = "value"; - opts.argval = arg1; - } else { - // lookup the image by name - im = JS9.lookupImage(arg1); - if( !im ){ - JS9.error(`imarith arg1 must be an image or a constant: ${arg1}`); - } - opts.argval = im; - opts.argtype = "image"; - } - // check for invalid args - if( (opts.op === "div") && - (opts.argtype === "value") && (opts.argval === 0) ){ - JS9.error("imarith can't divide by zero (nor can anyone else)"); - } - // choose a decent bitpix - if( !opts.bitpix ){ - switch(opts.argtype){ - case "image": - if( (this.raw.bitpix > 0) && (opts.argval.raw.bitpix > 0) ){ - opts.bitpix = Math.max(this.raw.bitpix, opts.argval.raw.bitpix); - } else if( (this.raw.bitpix < 0) && (opts.argval.raw.bitpix < 0) ){ - opts.bitpix = Math.min(this.raw.bitpix, opts.argval.raw.bitpix); - } else if( (this.raw.bitpix < 0) && (opts.argval.raw.bitpix > 0) ){ - opts.bitpix = this.raw.bitpix; - } else { - opts.bitpix = opts.argval.raw.bitpix; - } - break; - case "value": - if( this.raw.bitpix === -64 ){ - opts.bitpix = -64; - } else { - opts.bitpix = -32; - } - break; - } - } - // nraw should be a opts.bitpix copy of oraw - opts.alwaysCopy = true; - // use current - opts.oraw = "current"; - // call routine to generate (or modify) the new layer - this.rawDataLayer(opts, (oraw, nraw, opts) => { - let i, val; - switch(opts.argtype){ - case "image": - val = opts.argval.raw.data; - switch(opts.op){ - case "add": - for(i=0; i { - let i, oi, oj, ni, nj, nlen, oU8, nU8, ooff, noff, blankval; - const bpp = oraw.data.BYTES_PER_ELEMENT; - if( nraw.xoff === undefined ){ - nraw.xoff = 0; - } - if( nraw.yoff === undefined ){ - nraw.yoff = 0; - } - nraw.xoff += opts.x; - nraw.yoff += opts.y; - if( !opts.fill || opts.fill === "clear" ){ - if( nraw.bitpix > 0 ){ - blankval = opts.blank || nraw.header.BLANK || 0; - nraw.header.BLANK = blankval; - } else { - blankval = NaN; - } - if( typeof nraw.data.fill === "function" ){ - nraw.data.fill(blankval); - } else { - for(i=0; i= oraw.height) ){ - continue; - } - oi = 0; - ni = oi + nraw.xoff; - nlen = oraw.width; - if( ni < 0 ){ - oi -= ni; - nlen += ni; - ni = 0; - } - if( (ni + nlen) > oraw.width ){ - nlen -= (ni + nlen) - oraw.width; - } - if( nlen <= 0 ){ - return false; - } - ooff = (oj * oraw.width + oi) * bpp; - oU8 = new Uint8Array(oraw.data.buffer, ooff, nlen * bpp); - noff = (nj * oraw.width + ni) * bpp; - nU8 = new Uint8Array(nraw.data.buffer, noff, nlen * bpp); - nU8.set(oU8); - } - return true; - }); - // allow chaining - return this; -}; - -// rotate image by changing WCS info and calling reprojectData -// creates a new raw data layer ("rotate") -// angle is in degrees (since CROTA2 is in degrees) -JS9.Image.prototype.rotateData = function(...args){ - let raw, oheader, nheader, arad, sinrot, cosrot, pos, arr; - let ocdelt1 = 0.0; - let ocdelt2 = 0.0; - let [angle, opts] = args; - // sanity checks - if( !this.raws || !this.raws[0] ){ - JS9.error("no raw data for reprojection"); - } - // go back to original data for reprojection - raw = this.raws[0]; - if( !raw.header || !raw.wcsinfo ){ - JS9.error("no WCS info available for reprojection"); - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse rotate opts: ${opts}`, e); } - } - // save stash name - opts.stash = "rotateData"; - // but make sure we can set the id - opts.rawid = "rotate"; - // rotate raw data - opts.oraw = JS9.RAWID0; - // maintain current section, unless specified otherwise - if( opts.resetSection !== true ){ - opts.resetSection = false; - } - // old and new header - oheader = raw.header; - nheader = $.extend(true, {}, oheader); - // rotate around current center or file center (i.e., CRPIX1,2) - opts.center = opts.center || JS9.globalOpts.rotationCenter; - if( opts.center !== "file" && this.validWCS() ){ - pos = this.getPan(); - arr = JS9.pix2wcs(this.raw.wcs, pos.x, pos.y).trim().split(/\s+/); - if( arr && arr.length > 1 ){ - nheader.CRPIX1 = pos.x; - nheader.CRPIX2 = pos.y; - nheader.CRVAL1 = JS9.saostrtod(arr[0]); - if( JS9.isHMS(this.params.wcssys) ){ - nheader.CRVAL1 *= 15.0; - } - nheader.CRVAL2 = JS9.saostrtod(arr[1]); - } - } - // normalized values from wcslib - if( raw.wcsinfo ){ - ocdelt1 = raw.wcsinfo.cdelt1 || 0; - ocdelt2 = raw.wcsinfo.cdelt2 || 0; - } - // string directives instead of a numeric angle - if( typeof angle === "string" ){ - switch(angle.toLowerCase()){ - case "northisup": - case "northup": - angle = 0; - if( ocdelt1 > 0 ){ ocdelt1 = -ocdelt1; } - if( ocdelt2 < 0 ){ ocdelt2 = -ocdelt2; } - break; - default: - angle = parseInt(angle, 10); - break; - } - } - // new header same as old, but with a changed angle - // make up new WCS keywords - // use CD matrix if possible, else set CROTA2 - if( JS9.notNull(oheader.CD1_1) ){ - arad = -(angle * Math.PI / 180.0); - sinrot = Math.sin(arad); - cosrot = Math.cos(arad); - nheader.CD1_1 = oheader.CD1_1 * cosrot + oheader.CD1_2 * sinrot; - nheader.CD1_2 = oheader.CD1_1 * -sinrot + oheader.CD1_2 * cosrot; - nheader.CD2_1 = oheader.CD2_1 * cosrot + oheader.CD2_2 * sinrot; - nheader.CD2_2 = oheader.CD2_1 * -sinrot + oheader.CD2_2 * cosrot; - } else { - nheader.CROTA2 = angle; - nheader.CDELT1 = ocdelt1; - nheader.CDELT2 = ocdelt2; - } - // flag that we will use CROTA2 to modify LTM matrix - // needed because Montage does not know about LTM - opts.lcsUseRota2 = true; - // save ptype if possible - if( raw.wcsinfo ){ - nheader.ptype = raw.wcsinfo.ptype; - } - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("rotateData", args.slice(), opts.rawid); - // rotate by reprojecting the data - return this.reprojectData(nheader, opts); -}; - -// low-level reprojection: creates reprojected file, but does not display it -// instead, it returns the name of the reprojected FITS file (emscripten vfile) -// this is the basis for reprojectData, but can be used in other routines which -// require a reprojection -JS9.Image.prototype.reproject = function(wcsim, opts){ - let awvfile, awvfile2, wvfile, owvfile; - let wcsheader, wcsstr, oheader, nheader, theader; - let arr, ivfile, ovfile, rstr, key; - let tab, tx1, tx2, ty1, ty2, s; - let n, raw, avfile, earr, cmdswitches; - let i, tid, traw, maxx, maxy, maxpix; - let rcomplete = false; - const twcs = {}; - const wcsexp = /SIMPLE|BITPIX|NAXIS|NAXIS[1-4]|AMDX|AMDY|CD[1-2]_[1-2]|CDELT[1-4]|CNPIX[1-4]|CO1_[1-9][0-9]|CO2_[1-9][0-9]|CROTA[1-4]|CRPIX[1-4]|CRVAL[1-4]|CTYPE[1-4]|CUNIT[1-4]|DATE|DATE_OBS|DC-FLAG|DEC|DETSEC|DETSIZE|EPOCH|EQUINOX|EQUINOX[a-z]|IMAGEH|IMAGEW|LATPOLE|LONGPOLE|MJD-OBS|PC00[1-4]00[1-4]|PC[1-4]_[1-4]|PIXSCALE|PIXSCAL[1-2]|PLTDECH|PLTDECM|PLTDECS|PLTDECSN|PLTRAH|PLTRAM|PLTRAS|PPO|PROJP[1-9]|PROJR0|PV[1-3]_[1-3]|PV[1-4]_[1-4]|RA|RADECSYS|SECPIX|SECPIX|SECPIX[1-2]|UT|UTMID|VELOCITY|VSOURCE|WCSAXES|WCSDEP|WCSDIM|WCSNAME|XPIXSIZE|YPIXSIZE|ZSOURCE|LTM|LTV/; - const ptypeexp = /TAN|SIN|ZEA|STG|ARC/; - const addwcsinfo = (header, wcsinfo) => { - let theader; - if( !wcsinfo ){ return header; } - theader = $.extend(true, {}, header); - if( JS9.isNull(theader.CRVAL1) && !JS9.isNull(wcsinfo.crval1) ){ - theader.CRVAL1 = wcsinfo.crval1; - } - if( JS9.isNull(theader.CRVAL2) && !JS9.isNull(wcsinfo.crval2) ){ - theader.CRVAL2 = wcsinfo.crval2; - } - if( JS9.isNull(theader.CRPIX1) && !JS9.isNull(wcsinfo.crpix1) ){ - theader.CRPIX1 = wcsinfo.crpix1; - } - if( JS9.isNull(theader.CRPIX2) && !JS9.isNull(wcsinfo.crpix2) ){ - theader.CRPIX2 = wcsinfo.crpix2; - } - if( JS9.isNull(theader.CDELT1) && !JS9.isNull(wcsinfo.cdelt1) ){ - theader.CDELT1 = wcsinfo.cdelt1; - } - if( JS9.isNull(theader.CDELT2) && !JS9.isNull(wcsinfo.cdelt2) ){ - theader.CDELT2 = wcsinfo.cdelt2; - } - if( JS9.isNull(theader.CROTA2) && !JS9.isNull(wcsinfo.crot) ){ - theader.CROTA2 = wcsinfo.crot; - } - return theader; - }; - // sanity checks - if( !JS9.reproject || !wcsim || this === wcsim ){ return; } - if( !this.raws || !this.raws[0] ){ - JS9.error("no raw data for reprojection"); - } - // go back to original data for reprojection - raw = this.raws[0]; - if( !raw.header || !raw.wcsinfo ){ - JS9.error("no WCS info available for reprojection"); - } - // opts is optional - opts = opts || {}; - // make copy of input header, removing wcs keywords - oheader = $.extend(true, {}, raw.header); - for( key of Object.keys(oheader) ){ - if( wcsexp.test(key) ){ - delete oheader[key]; - } - } - if( typeof wcsim === "object" ){ - // get wcs keywords from new header - if( wcsim.raw && wcsim.raw.header ){ - nheader = wcsim.raw.header; - } else if( wcsim.BITPIX && wcsim.NAXIS1 && wcsim.NAXIS2 ){ - // assume its a WCS header - nheader = wcsim; - } else { - JS9.error("invalid wcs object input to reproject()"); - } - for( key of Object.keys(nheader) ){ - if( wcsexp.test(key) ){ - twcs[key] = nheader[key]; - } - } - // combine new wcs keywords + old header keywords - wcsheader = $.extend(true, {}, twcs, oheader); - // sanity check on result - if( !wcsheader.NAXIS || !wcsheader.NAXIS1 || !wcsheader.NAXIS2 ){ - // JS9.error("invalid FITS image header"); - return; - } - // restrict size of reprojection - wcsheader.NAXIS1 = Math.min(wcsheader.NAXIS1, - JS9.globalOpts.image.xdim); - wcsheader.NAXIS2 = Math.min(wcsheader.NAXIS2, - JS9.globalOpts.image.ydim); - // convert reprojection header to a string - wcsstr = JS9.raw2FITS(wcsheader, {addcr: true}); - // create vfile text file containing reprojection WCS - wvfile = `wcs_${JS9.uniqueID()}.txt`; - JS9.vfile(wvfile, wcsstr); - // check limits on reprojection, if necessary - if( JS9.globalOpts.reprojectLimits ){ - // reprojection limits - maxx = JS9.globalOpts.image.xdim; - maxy = JS9.globalOpts.image.ydim; - // check max image dimension - maxpix = JS9.globalOpts.image.xdim * JS9.globalOpts.image.ydim; - // keep within the limits of current memory constraints, or die - if( (raw.header.NAXIS1 * raw.header.NAXIS2) > maxpix ){ - JS9.error(`the max reproject size is ${maxx} * ${maxy}. You can use the Bin/Filter/Section plugin to extract a section, then save it as FITS and reproject the smaller image.`); - } - } - } else { - wvfile = wcsim; - } - // check input and reproj WCS to make sure we can run fast mProjectPP - // if not, try to make an alternate WCS header amenable to mProjectPP - try{ - // try to change input WCS to a sys usable by mProjectPP - if( !ptypeexp.test(raw.wcsinfo.ptype) ){ - theader = addwcsinfo(raw.header, raw.wcsinfo); - owvfile = `owcs_${JS9.uniqueID()}.txt`; - JS9.vfile(owvfile, JS9.raw2FITS(theader, {addcr: true})); - awvfile = `awcs_${JS9.uniqueID()}.txt`; - rstr = JS9.tanhdr(owvfile, awvfile, ""); - if( JS9.DEBUG > 1 ){ - JS9.log("tanhdr (input): %s %s -> %s", - owvfile, awvfile, rstr); - } - JS9.vunlink(owvfile); - if( rstr.search(/\[struct stat="OK"/) >= 0 ){ - // add command switch to use this alternate wcs - opts.cmdswitches = opts.cmdswitches || ""; - opts.cmdswitches += ` -i ${awvfile}`; - } - } - // try to change reproject WCS to a sys usable by mProjectPP - if( (wcsim.raw && !ptypeexp.test(wcsim.raw.wcsinfo.ptype)) || - (wcsim.ptype && !ptypeexp.test(wcsim.ptype)) ){ - theader = addwcsinfo(nheader, wcsim.raw.wcsinfo); - owvfile = `owcs_${JS9.uniqueID()}.txt`; - JS9.vfile(owvfile, JS9.raw2FITS(theader, {addcr: true})); - awvfile2 = `awcs_${JS9.uniqueID()}.txt`; - rstr = JS9.tanhdr(owvfile, awvfile2, ""); - if( JS9.DEBUG > 1 ){ - JS9.log("tanhdr (reproj): %s %s -> %s", - owvfile, awvfile2, rstr); - } - JS9.vunlink(owvfile); - if( rstr.search(/\[struct stat="OK"/) >= 0 ){ - // delete old wcs file and use this alternate wcsfile - JS9.vunlink(wvfile); - wvfile = awvfile2; - } - } - } - catch(ignore){ /* empty */ } - // get reference to existing raw data file (or create one) - if( raw.hdu && raw.hdu.fits.vfile ){ - // input file name - ivfile = raw.hdu.fits.vfile; - // add extension name or number - if( raw.hdu.fits.extname ){ - ivfile += `[${raw.hdu.fits.extname}]`; - } else if( raw.hdu.fits.extnum && - (raw.hdu.fits.extnum > 0) ){ - ivfile += `[${raw.hdu.fits.extnum}]`; - } - } else { - // input file name - arr = this.toArray(); - ivfile = this.id.replace(/\.png$/, "_png" + ".fits"); - JS9.vfile(ivfile, arr); - } - // output file name - s = this.id - .replace(/\[.*\]/, "") - .replace(/\.png$/i, ".fits") - .replace(/\.fz$/i, "") - .replace(/\.gz$/i, ""); - ovfile = `reproj_${JS9.uniqueID()}_${s}`; - // remove previous vfile for this reprojection layer, if possible - tid = opts.rawid || "reproject"; - for(i=0; i= 0 ){ - avfile = `${ovfile.substring(0, n)}_area${ovfile.substring(n)}`; - } - // optional command line args - cmdswitches = opts.cmdswitches || ""; - // no area file, but add global switches for reproject processing - cmdswitches += ` -a 0 ${JS9.globalOpts.reprojSwitches}`; - // call reproject - rstr = JS9.reproject(ivfile, ovfile, wvfile, cmdswitches); - if( JS9.DEBUG > 1 ){ - JS9.log("reproject: %s %s %s [%s] -> %s", - ivfile, ovfile, wvfile, cmdswitches, rstr); - } - // delete unneeded files ... - JS9.vunlink(avfile); - JS9.vunlink(wvfile); - if( awvfile ){ - JS9.vunlink(awvfile); - } - if( arr ){ - JS9.vunlink(ivfile); - } - // ... then error check - if( rstr.search(/\[struct stat="OK"/) < 0 ){ - // signal this we completed the reproject attempt - rcomplete = true; - earr = rstr.match(/msg="(.*)"/); - if( earr && earr[1] ){ - JS9.error(`${earr[1]} (from mProjectPP)`); - } else { - JS9.error(rstr); - } - } - } - catch(e){ - // avoid double error reporting - if( !rcomplete ){ - // delete unneeded files ... - JS9.vunlink(avfile); - JS9.vunlink(wvfile); - // call error handler - if( rstr ){ - JS9.error(rstr); - } else { - JS9.error("WCS reproject failed", e); - } - } else { - return; - } - } - // return output file name - return ovfile; -}; - -// high-level routine to reproject image using WCS info -// creates a new raw data layer ("reproject") -JS9.Image.prototype.reprojectData = function(...args){ - let i, im, ovfile; - let [wcsim, opts] = args; - // sanity check - if( !wcsim || !JS9.reproject ){ return; } - // is this a string containing an image name or WCS values? - if( typeof wcsim === "string" ){ - if( wcsim === "all" ){ - for(i=0; i { - let topts, reprojHandler; - const defaultReprojHandler = (hdu) => { - // plugin callbacks - this.xeqPlugins("image", "onreprojectdata"); - topts = topts || {}; - topts.refreshRegions = true; - // reset section, unless specified otherwise - if( opts.resetSection !== false ){ - topts.resetSection = true; - } - // pass on the lcs flag - if( opts.lcsUseRota2 ){ - topts.lcsUseRota2 = true; - } - // refresh the image - this.refreshImage(hdu, topts); - // set status - this.setStatus("reprojectData", "complete"); - // might have to re-execute calls in the stash - this.xeqStashCall(this.xeqstash, [opts.stash, "reprojectData"]); - // execute onreproject function - if( typeof opts.onreproject === "function" ){ - try{ JS9.xeqByName(opts.onreproject, window, this); } - catch(e){ JS9.error("in onreproject callback", e, false); } - } - }; - // opts is optional - opts = opts || {}; - // handler - reprojHandler = opts.reprojHandler || defaultReprojHandler; - // call the low-level reproject routine, returning reprojected file - ovfile = this.reproject(wcsim, opts); - if( ovfile ){ - // refresh image using the reprojected file ... - topts = $.extend(true, {}, JS9.fits.options, opts); - // ... in a new raw data layer - topts.rawid = topts.rawid || "reproject"; - // save pointer to original wcs image - if( wcsim.raw && wcsim.raw.header ){ - topts.wcsim = wcsim; - } - // process the FITS file - try{ JS9.handleFITSFile(ovfile, topts, reprojHandler); } - catch(e){ JS9.error("can't process reprojected FITS file", e); } - } - }, JS9.SPINOUT); - // allow chaining - return this; -}; - -// apply image processing filters to the current RGB image -JS9.Image.prototype.filterRGBImage = function(...args){ - let [filter] = args; - // no arg: return list of filters - if( !filter ){ - return Object.keys(JS9.ImageFilters); - } - // pre-processing and special processing - switch(filter){ - case "reset": - // special case: reset to original RGB data, contrast/bias - this.setColormap("reset"); - return this; - case "median": - // alias used in filters plugin - filter = "medianFilter"; - break; - case "edge": - // alias used in filters plugin - filter = "edgeDetect"; - break; - default: - break; - } - // sanity check - if( !JS9.ImageFilters[filter] ){ - JS9.error(`JS9 image filter '${filter}' not available`); - } - // save this routine so it can be reconstituted in a restored session - this.xeqStashSave("filterRGBImage", args.slice()); - // remove filter name arg - args.shift(); - // add display context and RGB img arg - args.unshift(this.display.context, this.rgb.img); - // try to run the filter to generate a new RGB image - try{ JS9.ImageFilters[filter](...args); } - catch(e){ JS9.error(`JS9 image filter '${filter}' failed`, e); } - // display new RGB image - this.displayImage("display"); - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - this.xeqPlugins("image", "onfilterrgbimage"); - } - // allow chaining - return this; -}; - -// move image to a different display -// maybe this should be refactored using more useful routines ... -// ... and should (some of) this code be in the Fabric section?? -JS9.Image.prototype.moveToDisplay = function(dname){ - let i, im, key, layer, dlayer; - let got = 0; - const odisplay = this.display; - const ndisplay = JS9.lookupDisplay(dname); - // sanity check - if( !dname || !ndisplay ){ - JS9.error(`could not find display: ${dname}`); - } - // clear old display first - this.display.clearMessage(); - this.display.context.clear(); - // plugin callbacks - this.xeqPlugins("image", "onimageclear"); - // make sure the main layers in the old display are in the new display - for( key of Object.keys(odisplay.layers) ){ - if( (odisplay.layers[key].dtype === "main") && - !ndisplay.layers[key] ){ - ndisplay.newShapeLayer(key, odisplay.layers[key].opts); - } - } - // turn off display of layers in new display - // don't want them showing on the new image ... - if( ndisplay.image ){ - for( key of Object.keys(ndisplay.layers) ){ - if( ndisplay.layers[key].dtype === "main" ){ - ndisplay.image.showShapeLayer(key, false, {local: true}); - } - } - } - // re-assign each "main" layer from old display to new by: - // saving the graphics, reassigning the canvas, restoring the graphics - for( key of Object.keys(this.layers) ){ - layer = this.layers[key]; - dlayer = ndisplay.layers[key]; - if( dlayer ){ - this.showShapeLayer(key, false, {local: true}); - layer.dlayer = dlayer; - layer.divjq = dlayer.divjq; - layer.canvasjq = dlayer.canvasjq; - layer.canvas = dlayer.canvas; - } else { - delete this.layers[key]; - } - } - // move "main" display from old to new - this.display = ndisplay; - // avoid erroneous save of previous layers - this.display.image = this; - // reset section to ensure proper display size - this.mkSection(); - // and redisplay - this.displayImage("all"); - // show shape layers in new display - for( key of Object.keys(this.layers) ){ - this.showShapeLayer(key, true, {local: true}); - } - // move rgb contribution, if necessary - if( odisplay.rgb.rim === this ){ - odisplay.rgb.rim = null; - ndisplay.rgb.rim = this; - } - if( odisplay.rgb.gim === this ){ - odisplay.rgb.gim = null; - ndisplay.rgb.gim = this; - } - if( odisplay.rgb.bim === this ){ - odisplay.rgb.bim = null; - ndisplay.rgb.bim = this; - } - // old display has no image - odisplay.image = null; - // ensure proper positions for graphics - this.refreshLayers(); - // display a different image in old display, if possible - for(i=0; i= 0 ){ - JS9.displays.splice(i, 1); - } - odisplay.winid.close(); - } - // allow chaining - return this; -}; - -// save session to a json file -// NB: save is an image method, load is a display method -JS9.Image.prototype.saveSession = function(file, opts){ - let i, obj, str, blob, layer, dlayer, tobj, key, im, lpos, ipos; - const saveim = (im) => { - let regexp; - // object holding session keys - const obj = {}; - // filename - if( window.electron ){ - // remove current directory to make it relative - // this allows the session file (and data files) to be moved - // to a machine with a different directory structure, and - // also allows web and desktop sessions to be shared - regexp = new RegExp(`^${window.electron.currentDir}/`); - obj.file = im.file.replace(regexp, ""); - } else { - obj.file = im.file; - } - // display size info - obj.dwidth = im.display.width; - obj.dheight = im.display.height; - // image params - obj.params = $.extend(true, {}, im.params); - // temp values: explicitly save some of them - obj.tmp = {}; - if( im.tmp.gridStatus === "active" ){ - obj.tmp.gridStatus = "active"; - } - // get center of displayed image in physical coords - lpos = im.imageToLogicalPos({x:im.rgb.sect.xcen, - y:im.rgb.sect.ycen}); - ipos = im.maybePhysicalToImage(lpos); - if( ipos ){ - lpos = ipos; - } - // save section info - obj.sect = {}; - obj.sect.xcen = lpos.x; - obj.sect.ycen = lpos.y; - obj.sect.xdim = im.raw.width; - obj.sect.ydim = im.raw.height; - obj.sect.zoom = im.rgb.sect.zoom; - // layers - obj.layers = []; - for( key of Object.keys(im.layers) ){ - // save each main layer so it can be reconstituted - layer = im.layers[key]; - dlayer = layer.dlayer; - // only save layers on main display - // don't save crosshair or grid - if( dlayer.dtype === "main" && - key !== "crosshair" && - key !== "grid" ){ - tobj = {}; - tobj.name = key; - tobj.json = dlayer.canvas.toJSON(dlayer.el); - tobj.dopts = $.extend(true, {}, dlayer.opts); - if( layer.catalog ){ - tobj.catalog = layer.catalog; - } - if( layer.starbase ){ - tobj.starbase = JSON.stringify(layer.starbase); - } - obj.layers.push(tobj); - } - dlayer.canvas.forEachObject((obj) => { - // look for winid's: they cause circular json errors - if( obj.params && obj.params.winid ){ - if( $(obj.params.winid).is(":visible") ){ - JS9.error("please close your region dialog box(es) to avoid a JSON circular reference error when saving this session"); - } else { - obj.params.winid = null; - } - } - }); - } - // save blend state - obj.blend = im.blend; - // save routines which must be executed when restoring session - obj.xeqstash = im.xeqstash; - // save wcsim reference, if necessary - if( im.wcsim && im.wcsim.id ){ - obj.wcsim = im.wcsim.id; - } - // remove old display info - delete obj.params.display; - // remove rot90 and flip, as we will recreate them - obj.params.rot90 = 0; - obj.params.flip = "none"; - // we didn't save the crosshair - obj.params.crosshair = false; - return obj; - }; - if( !{}.hasOwnProperty.call(window, "saveAs") ){ - JS9.error("no saveAs() available to save session"); - } - // filename for saving - file = file || "js9.ses"; - // make sure we have the right extension - if( !file.match(/\.ses$/) ){ - file += ".ses"; - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse session opts: ${opts}`, e); } - } - // change the cursor to show the waiting status - JS9.waiting(true, this.display); - // object we will save - obj = {}; - // list of images to save - obj.images = []; - // which images to save? - if( opts.mode === "display" ){ - // save all images in this display - for(i=0; i= 1 && - this.xeqstash[len-1] && - this.xeqstash[len-1].args[0] === -args[0] ){ - this.xeqstash.pop(); - return this; - } - break; - case "setFlip": - // two flips in the same direction cancel one another - len = this.xeqstash.length; - if( len >= 1 && - this.xeqstash[len-1] && - this.xeqstash[len-1].args[0] === args[0] ){ - this.xeqstash.pop(); - return this; - } - break; - default: - for(i=0; i { - let context = xeq.context || "image"; - try{ - switch(context){ - case "image": - this[func](...xeq.args); - break; - case "display": - this.display[func](...xeq.args); - break; - default: - this[func](...xeq.args); - break; - } - } - catch(e){ - JS9.error(`error executing stash: ${func}`, e, false); - } - }; - xeqstash = xeqstash || this.xeqstash; - if( $.isArray(xeqstash) ){ - for(i=0; i= 0 ){ - continue; - } - doxeq(key, xeq); - } - } else { - // backward compatibility: pre 3.1 used an object, not an array - for( key of Object.keys(xeqstash) ){ - if( $.inArray(key, exclArr) >= 0 ){ - continue; - } - xeq = xeqstash[key]; - doxeq(key, xeq); - } - } -}; - -// remove a stash routine -JS9.Image.prototype.xeqStashDiscard = function(xid){ - let i, key; - // sanity check - if( !this.xeqstash ){ return; } - if( $.isArray(this.xeqstash) ){ - for(i=this.xeqstash.length-1; i>=0; i--){ - if( xid === this.xeqstash[i].func || xid === this.xeqstash[i].id ){ - this.xeqstash.splice(i,1); - } - } - } else { - // pre 3.1 used an object - for( key of Object.keys(this.xeqstash) ){ - if( xid === key || xid === this.xeqstash[key].id ){ - delete this.xeqstash[key]; - } - } - } -}; - -// execute plugins of various types (using type-specific values) -JS9.Image.prototype.xeqPlugins = function(xtype, xname, xval){ - let pname, pinst, popts, parr, evt; - const xtrig = (name, obj) => { - const s = `JS9:${name}`; - $(document).trigger(s, obj); - }; - // sanity check - if( !xtype || !xname || !JS9.globalOpts.xeqPlugins ){ return; } - // array of plugin instances - parr = this.display.pluginInstances || {}; - // look for plugin callbacks to execute - for( pname of Object.keys(parr) ){ - pinst = parr[pname]; - popts = pinst.plugin.opts; - if( pinst.isActive(xname) && typeof popts[xname] === "function" ){ - this.callingPlugin = xname; - switch(xtype){ - case "image": - // used for: onimage[load,close,refresh,display] - try{ - popts[xname].call(pinst, this); - xtrig(xname, {im: this}); - } - catch(e){ pinst.errLog(xname, e); } - break; - case "region": - case "shape": - // used for: on[layer]change - // xval: pub - try{ - popts[xname].call(pinst, this, xval); - xtrig(xname, {im: this, xreg: xval}); - } - catch(e){ pinst.errLog(xname, e); } - break; - case "keydown": - case "keypress": - // used for: onkeydown, onkeypress (deprecated) - // xval: evt - evt = xval.originalEvent || xval; - try{ - popts[xname].call(pinst, this, this.ipos, evt); - xtrig(xname, {im: this, ipos: this.ipos, evt: evt}); - } - catch(e){ pinst.errLog(xname, e); } - break; - case "mouse": - // used for: onmouse[down,move,over,out] - // xval: evt - if( !this.clickInRegion || popts[`${xname}_inRegion`] ){ - evt = xval.originalEvent || xval; - try{ - popts[xname].call(pinst, this, this.ipos, evt); - xtrig(xname, {im: this, ipos: this.ipos, evt: evt}); - } - catch(e){ pinst.errLog(xname, e); } - } - break; - } - delete this.callingPlugin; - } - } - // allow chaining - return this; -}; - -// upload virtual file to proxy server -JS9.Image.prototype.uploadFITSFile = function(){ - let vfile, vdata; - const upcb = (r) => { - delete JS9.worker.uploadActive; - window.setTimeout(() => { JS9.progress(false); }, 1000); - if( r.stderr ){ - JS9.error(r.stderr); - } else if( r.stdout ){ - // set FITS filename and proxy filename - this.fitsFile = r.stdout.trim(); - this.proxyFile = this.fitsFile; - if( JS9.globalOpts.prependJS9Dir && - !this.fitsFile.match(/^\${JS9_DIR}/) && - this.fitsFile.charAt(0) !== "/" ){ - this.fitsFile = `\${JS9_DIR}/${this.fitsFile}`; - } - // re-query for analysis - this.queryHelper("all"); - } - }; - // sanity check - if( !JS9.worker ){ return; } - // only supported when using socket.io ... - if( JS9.helper.type !== "nodejs" && JS9.helper.type !== "socket.io" ){ - return; - } - // ... and only when we have a virtual file to upload - if( !this.raw.hdu || !this.raw.hdu.fits || !this.raw.hdu.fits.vfile ){ - return; - } - // only one upload at a time - if( JS9.worker.uploadActive ){ - JS9.error("only one upload allowed at a time"); - } - // this is the file to upload - vfile = this.raw.hdu.fits.vfile; - // ask the remote server if we can upload - JS9.helper.send("quotacheck", null, (robj) => { - // check quota, only errors matter - if( robj.stderr || robj.errcode ){ - JS9.error(robj.stderr || `from quotacheck: ${robj.errcode}`); - } - vdata = JS9.vread(vfile, "binary"); - JS9.worker.socketio(() => { - JS9.worker.uploadActive = true; - JS9.progress(true, this.display); - JS9.worker.send("uploadFITS", [vfile, vdata], upcb, [vdata.buffer]); - }); - }); - return this; -}; - -// remove proxy file from a remote server -JS9.Image.prototype.removeProxyFile = function(s){ - let t, reset, file, regexp; - const func = (r) => { - if( reset ){ - if( r && r.stdout.trim() === "OK" ){ - this.proxyFile = null; - this.proxyParent = null; - this.fitsFile = null; - this.analysisPackages = null; - this.queryHelper("all"); - } - } - }; - // arg can be a boolean, which means remove proxyFile and reset - if( typeof s === "boolean" ){ - reset = s; - } else if( typeof s === "string" ){ - // specify file to remove in the working directory - // check for attempt to break out of the working dir using abs path - if( s.match(/^\//) ){ - return; - } - // remove possible install dir prefix and then ... - // check attempt to break out of the working dir using ".." - regexp = new RegExp(`^${JS9.INSTALLDIR}`); - t = s.replace(regexp, ""); - if( t.match(/\.\./) ){ - return; - } - file = s; - } else { - // default is to remove the proxy file - if( !this.proxyFile ){ - return; - } - file = this.proxyFile; - // also remove the proxyParent file, if necessary - if( this.proxyParent ){ - file = `${file} ${this.proxyParent}`; - } - } - // sanity check - if( !file ){ return; } - // ask to remove proxy file, and process result - JS9.Send('removeproxy', {'cmd': `js9Xeq removeproxy ${file}`}, func); -}; - -// convert table to a shape array for the given image -JS9.Image.prototype.starbaseToShapes = function(starbase, opts){ - let i, j, k, shape, pos, siz, reg, data, header, delims, sizefunc; - let xcol, ycol, ra, dec, owcssys, wcssys, tcol, tregexp; - const global = JS9.globalOpts.catalogs; - const xcols = JS9.globalOpts.catalogs.ras; - const ycols = JS9.globalOpts.catalogs.decs; - const regs = []; - const getpos = (ra, dec) => { - let arr; - arr = JS9.wcs2pix(this.raw.wcs, ra, dec).trim().split(/ +/); - if( arr && arr.length ){ - return {x: parseFloat(arr[0]), y: parseFloat(arr[1])}; - } - return null; - }; - const getcol = (starbase, header, cols, defcol) => { - let i, j, col; - if( defcol !== undefined ){ - col = defcol; - } else { - // look for an exact match - col = -1; - for(j=0; j= 0 ){ - break; - } - } - // no exact match, look for an approx match - if( col < 0 ){ - tcol = cols[0]; - tregexp = new RegExp(`^${tcol}`, "i"); - for(i=0; i { - return { width: opts.width || global.width || 7, - height: opts.height || global.height || 7 }; - }; - break; - case "circle": - // eslint-disable-next-line no-unused-vars - sizefunc = () => { - return { radius: opts.radius || global.radius || 3.5}; - }; - break; - case "ellipse": - // eslint-disable-next-line no-unused-vars - sizefunc = () => { - return { r1: opts.r1 || global.r1 || 3.5, - r2: opts.r2 || global.r2 || 3.5 }; - }; - break; - default: - // eslint-disable-next-line no-unused-vars - sizefunc = () => { - return { width: opts.width || 7, height: opts.height || 7 }; - }; - break; - } - // save original wcs system - owcssys = this.getWCSSys(); - // set wcs system for catalogs - if( opts.wcssys ){ - wcssys = opts.wcssys; - } else if( global.wcssys ){ - wcssys = global.wcssys; - } else { - // umm ... - wcssys = "ICRS"; - } - // set wcssys for this catalog - this.setWCSSys(wcssys, false); - // convert each catalog object in the table into a JS9 shape - for(i=0, j=0; i { - const delims = " \t-.:hdmsr'\""; - const obj = {}; - obj.val = JS9.saostrtod(s); - obj.delim = String.fromCharCode(JS9.saodtype()); - if( (obj.delim !== "\0") && (delims.includes(obj.delim)) ){ - // valid delim means we converted to a float - return obj; - } else if( JS9.isNumber(s) ){ - // no delim, but its a number, so must be an int - return obj; - } - // everything else is a string - obj.val = s; - return obj; - }; - // special case: 1 non-string arg is the catalog, not the layer - if( args.length === 1 && typeof layer !== "string" ){ - catalog = layer; - layer = null; - } - // special case: 2 non-string args: file and obj, not the layer - if( args.length === 2 && typeof layer !== "string" ){ - opts = catalog; - catalog = layer; - layer = null; - } - // sanity check - if( !catalog ){ return; } - if( global.tooltip ){ - lopts.tooltip = global.tooltip; - } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse catalog opts: ${opts}`, e); } - } - // default color, if none specified - opts.color = opts.color || global.color || "#00FF00"; - // wcs system - opts.wcssys = opts.wcssys || global.wcssys; - // update the WCS strings when adding a catalog shape - opts.updateWCS = true; - // starbase opts - topts = {convFuncs: {def: defconv}, - units: opts.units || global.units, - skip: opts.skip || global.skip}; - // generate starbase table - try{ starbase = new JS9.Starbase(catalog, topts); } - catch(e){ JS9.error("could not parse catalog. Is it in tab-separated column format?"); } - // sanity check - if( !starbase || !starbase.data || !starbase.data.length ){ - JS9.error("no objects found in catalog"); - } - // generate new catalog shapes - shapes = this.starbaseToShapes(starbase, opts); - if( shapes.length ){ - // layer name - layer = layer || `catalog_${JS9.uniqueID()}` ; - // create a new layer, if necessary - this.display.newShapeLayer(layer, lopts); - // delete any old shapes - this.removeShapes(layer); - // save the original catalog before adding shapes - this.layers[layer].catalog = catalog; - this.layers[layer].starbase = starbase; - // add them to the catalog layer - this.addShapes(layer, shapes, opts); - } else { - JS9.error("no catalog objects found"); - } - // allow chaining - return this; -}; - -// save catalog as a file -JS9.Image.prototype.saveCatalog = function(fname, which){ - let layer, cat, blob; - layer = which || this.activeShapeLayer(); - if( !this.layers[layer] || !this.layers[layer].catalog ){ - if( layer && layer !== "undefined" ){ - JS9.error(`no catalog available: ${layer}`); - } else { - JS9.error("no active catalog available"); - } - } - cat = this.layers[layer].catalog; - blob = new Blob([cat], {type: "text/plain;charset=utf-8"}); - fname = fname || `${layer}.cat`; - if( !fname.match(/\.cat$/) ){ - fname += ".cat"; - } - if( {}.hasOwnProperty.call(window, "saveAs") ){ - JS9.saveAs(blob, fname); - } else { - JS9.error("no saveAs() available to save catalog"); - } - return fname; -}; - -// convert ra, dec from one wcs to another -JS9.Image.prototype.wcs2wcs = function(from, to, ra, dec){ - let owcssys, ounits, nwcs, arr, x, y, s, v0; - // save current wcs and units - owcssys = this.getWCSSys(); - ounits = this.getWCSUnits(); - // to, from default to current wcs - from = from || owcssys; - to = to || owcssys; - // convert ra, dec from string input to float degrees, if necessary - if( typeof ra === "string" ){ - v0 = JS9.strtoscaled(ra); - if( JS9.isHMS(from, v0.dtype) ){ - v0.dval *= 15.0; - } - ra = v0.dval; - } - if( typeof dec === "string" ){ - v0 = JS9.strtoscaled(dec); - dec = v0.dval; - } - // temporarily set the wcs to what we are converting from - nwcs = this.setWCSSys(from, false).getWCSSys(); - // make sure change was successful - if( from !== "native" ){ - if( nwcs !== from ){ - JS9.error(`unknown or invalid wcs: ${from}`); - } - } - // convert input ra, dec into image pixels in this wcs - arr = JS9.wcs2pix(this.raw.wcs, ra, dec).trim().split(/ +/); - x = parseFloat(arr[0]); - y = parseFloat(arr[1]); - // set wcs back to the target wcs - this.setWCSSys(to, false); - // convert image pixels from input ra, dec into target wcs - this.setWCSUnits("degrees", false); - s = JS9.pix2wcs(this.raw.wcs, x, y).trim(); - // reset wcs to original - this.setWCSUnits(ounits, false); - if( owcssys !== to ){ - this.setWCSSys(owcssys, false); - } - // return result - return s; -}; - -// convert wcs, physical or image image length to image length, -// using current wcs and string delimiters to determine what input type -JS9.Image.prototype.wcs2imlen = function(s){ - let v, wcsinfo, iscale; - let dpp = 1; - // sanity check - if( !s ){ return; } - v = JS9.strtoscaled(s); - wcsinfo = this.raw.wcsinfo || {cdelt1: 1, cdelt2: 1}; - // oh dear, this is cheating ... - if( wcsinfo.cdelt1 !== undefined ){ - dpp = wcsinfo.cdelt1; - } else if( wcsinfo.cdelt2 !== undefined ){ - dpp = wcsinfo.cdelt2; - } - switch(this.params.wcssys){ - case "image": - break; - case "physical": - // use LTM1_1 or LTM1_2 value stored for logical to image transforms - if( this.lcs && this.lcs.physical ){ - iscale = Math.sqrt(Math.pow(this.lcs.physical.forward[0][0],2) + - Math.pow(this.lcs.physical.forward[0][1],2)); - v.dval = Math.abs(v.dval * iscale); - } - break; - default: - // cheap conversion of wcs len to image len - if( v.dtype && (v.dtype !== ".") && (v.dtype !== "\0") ){ - v.dval = Math.abs(v.dval / dpp); - } - break; - } - return v.dval; -}; - -// --------------------------------------------------------------------- -// JS9 Colormap support -// --------------------------------------------------------------------- - -JS9.Colormap = function(...args){ - let [name, a1, a2, a3] = args; - let i, got; - // sanity check - if( !name ){ return; } - // type of colormap is based on number and type of args - this.name = name; - switch(args.length){ - case 2: - if( $.isArray(a1[0]) && typeof a1[0][0] === "number" ){ - // array of rgb values - // JS9.Colormap("sls", [[0, 0, 0], [0.043442, 0, 0.052883], ...]); - this.type = "lut"; - this.colors = a1; - } else { - // array of static colors and min, max values - // JS9.Colormap("s1", [["red",1,1], ["cyan",2,3], ["blue",4,99]]); - this.type = "static"; - this.colors = JS9.parseStaticColors(a1); - } - break; - case 4: - // three arrays of vertices - // JS9.Colormap("grey", [[0,0],[1,1]], [[0,0],[1,1]], [[0,0],[1,1]])); - this.type = "sao"; - this.vertices = [a1, a2, a3]; - break; - default: - JS9.error("colormap requires a colormap name and 1 or 3 array args"); - break; - } - // flag whether this was a core or user-defined colormap - if( !JS9.inited ){ - this.source = "core"; - } else { - this.source = "user"; - } - // replace or append - for(i=0; i 1 ){ - JS9.log("JS9 colormap: %s", this.name); - } -}; - -JS9.Colormap.prototype.mkColorCell = function(ii){ - let m, x, i, j, val, vertex, len, size, index; - const count = JS9.COLORSIZE; - const umax = 255; - const rgb = [0, 0, 0]; - switch(this.type){ - // from: tksao1.0/colormap/sao.C - case "sao": - x = ii / count; - // for each of red, green, blue ... - for(j=0; j<3; j++){ - // look for the first vertex with x value larger than our x value - vertex = this.vertices[j]; - len = vertex.length; - for(i=0; i x ){ - break; - } - } - // if first vertex x value is greater than ours, use it - if( i === 0 ){ - val = vertex[0][1]; - // if last vertex xvalue is less than ours, use it - } else if( i === len ){ - val = vertex[len-1][1]; - // interpolate between two vertices - } else { - m = (vertex[i][1] - vertex[i-1][1]) / - (vertex[i][0] - vertex[i-1][0]); - if( m ){ - // point slope form - val = m * (x - vertex[i-1][0]) + vertex[i-1][1]; - } else { - val = vertex[i][1]; - } - } - // assign value to the correct color in the result array - rgb[j] = val * umax; - } - break; - // from: tksao1.0/colormap/lut.C - case "lut": - size = this.colors.length; - // index into the evenly spaced RGB values - index = Math.floor(ii*size/count); - if( index < 0 ){ - rgb[0] = this.colors[0][0] * umax; - rgb[1] = this.colors[0][1] * umax; - rgb[2] = this.colors[0][2] * umax; - } else if( index < size ){ - rgb[0] = this.colors[index][0] * umax; - rgb[1] = this.colors[index][1] * umax; - rgb[2] = this.colors[index][2] * umax; - } else { - rgb[0] = this.colors[size-1][0] * umax; - rgb[1] = this.colors[size-1][1] * umax; - rgb[2] = this.colors[size-1][2] * umax; - } - break; - case "static": - break; - default: - JS9.error("unknown colormap type"); - break; - } - // return the news - return rgb; -}; - -// --------------------------------------------------------------------- -// JS9 display object for the screen display -// --------------------------------------------------------------------- - -JS9.Display = function(el){ - // pass jQuery element, DOM element, or id - if( el instanceof jQuery ){ - this.divjq = el; - } else if( typeof el === "object" ){ - this.divjq = $(el); - } else { - this.divjq = $(`#${el}`); - } - // make sure div has some id - if( !this.divjq.attr("id") ){ - this.divjq.attr("id", JS9.DEFID); - } - // save id - this.id = this.divjq.attr("id"); - // display-specific scratch space - this.tmp = {}; - // display RGB mode - this.rgb = { - active: false, - rim: null, - gim: null, - bim: null - }; - // add class - this.divjq.addClass("JS9"); - // set width and height on div - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = JS9.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = JS9.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // save original width and height - this.width0 = this.width; - this.height0 = this.height; - // set tabindex so we can sense keyboard events - // (this invocation senses keydown when no is image loaded) - this.divjq.attr("tabindex", 0); - // create DOM canvas element - this.canvas = document.createElement("canvas"); - // jquery version for event handling and DOM manipulation - this.canvasjq = $(this.canvas) - .addClass("JS9Image") - .attr("id", `${this.id}Image`) - .attr("width", this.width) - .attr("height", this.height) - .css("z-index", JS9.ZINDEX); - // add container to the high-level div - this.displayConjq = $("
    ") - .addClass("JS9Container") - .attr("id", `${this.id}DisplayConjq`) - .css("z-index", JS9.ZINDEX) - // set tabindex so we can sense keyboard events - // (this invocation senses keydown after image is loaded) - .attr("tabindex", "0") - .append(this.canvasjq) - .appendTo(this.divjq); - if( !JS9.allinone ){ - this.iconjq = $("
    ") - .addClass("JS9Logo") - .css("display", "none") - .css("z-index", JS9.ZINDEX+1) - .appendTo(this.divjq); - this.iconimgjs = $("") - .addClass("JS9Logo") - .attr("src", JS9.InstallDir(JS9.globalOpts.logo)) - .attr("alt", "js9") - .attr("title", "js9") - .appendTo(this.iconjq); - if( JS9.globalOpts.logoDisplay ){ - this.iconjq.css("display", "block"); - } - } - // add resize capability, if necessary - if( JS9.globalOpts.resizeHandle && - {}.hasOwnProperty.call(window, "ResizeSensor") ){ - this.divjq - .css("resize", "both") - .css("overflow", "hidden"); - if( JS9.bugs.webkit_resize ){ - this.owidth = parseInt(this.divjq.css("width"), 10); - this.oheight = parseInt(this.divjq.css("height"), 10); - this.divjq - .css("width", this.width + JS9.RESIZEFUDGE) - .css("height", this.height + JS9.RESIZEFUDGE); - } - this.resizeSensor = new ResizeSensor(this.divjq, () => { - let nwidth = this.divjq.width(); - let nheight = this.divjq.height(); - if( JS9.bugs.webkit_resize ){ - nwidth -= JS9.RESIZEFUDGE; - nheight -= JS9.RESIZEFUDGE; - } - this.resize(nwidth, nheight); - }); - } - // drawing context - this.context = this.canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - this.context.imageSmoothingEnabled = false; - } - // add the display tooltip - this.tooltip = $("
    ") - .attr("id", `tooltip_${this.id}`) - .addClass("JS9Tooltip") - .appendTo(this.divjq); - // no image loaded into this canvas - this.image = null; - // no plugin instances yet - this.pluginInstances = {}; - // no layers yet - this.layers = {}; - // init message layer - this.initMessages(); - // blend mode is false to start - this.blendMode = false; - // display-based mouse/touch actions initially from global - this.mouseActions = JS9.globalOpts.mouseActions.slice(0); - this.touchActions = JS9.globalOpts.touchActions.slice(0); - // add event handlers - this.divjq.on("mouseenter", this, (evt) => { - return JS9.mouseEnterCB(evt); - }); - this.divjq.on("mouseover", this, (evt) => { - return JS9.mouseOverCB(evt); - }); - this.divjq.on("mousedown touchstart", this, (evt) => { - return JS9.mouseDownCB(evt); - }); - this.divjq.on("mousemove touchmove", this, (evt) => { - return JS9.mouseMoveCB(evt); - }); - this.divjq.on("mouseup touchend", this, (evt) => { - return JS9.mouseUpCB(evt); - }); - this.divjq.on("mouseout", this, (evt) => { - return JS9.mouseOutCB(evt); - }); - this.divjq.on("keypress", this, (evt) => { - return JS9.keyPressCB(evt); - }); - this.divjq.on("keydown", this, (evt) => { - return JS9.keyDownCB(evt); - }); - this.divjq.on("keyup", this, (evt) => { - return JS9.keyUpCB(evt); - }); - this.divjq.on("wheel", this, (evt) => { - return JS9.wheelCB(evt); - }); - // set up drag and drop, if available - this.divjq.on("dragenter", this, (evt) => { - return JS9.dragenterCB(this.id, evt); - }); - this.divjq.on("dragover", this, (evt) => { - return JS9.dragoverCB(this.id, evt); - }); - this.divjq.on("dragexit", this, (evt) => { - return JS9.dragexitCB(this.id, evt); - }); - this.divjq.on("drop", this, (evt) => { - return JS9.dragdropCB(this.id, evt); - }); - // no context menus on the display - this.divjq.on("contextmenu", this, () => { - return false; - }); - // add local file open support - this.addFileDialog("Load", JS9.globalOpts.imageTemplates); - this.addFileDialog("RefreshImage", JS9.globalOpts.imageTemplates); - this.addFileDialog("LoadRegions", JS9.globalOpts.regTemplates); - this.addFileDialog("LoadSession", JS9.globalOpts.sessionTemplates); - this.addFileDialog("LoadColormap", JS9.globalOpts.colormapTemplates); - this.addFileDialog("LoadCatalog", JS9.globalOpts.catalogTemplates); - // add to list of displays - JS9.displays.push(this); - // set focus - this.displayConjq.focus(); - // debugging - if( JS9.DEBUG ){ - JS9.log("JS9 display: %s", this.id); - } -}; - -// add support for file dialog box which executes JS9 routine on file blobs -JS9.Display.prototype.addFileDialog = function(funcName, template){ - let jdiv, jinput, id; - // sanity check - if( !funcName || !JS9.publics[funcName] ){ return; } - id = `openLocal${funcName}-${this.id}`; - // outer div - // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file - // recommends opacity over visibility, but it breaks the menubar in ios - jdiv = $("
    ") - .addClass("JS9Hidden") - .appendTo(this.divjq); - // inner file input element - jinput = $("") - .attr("type", "file") - .attr("id", id) - .attr("multiple", true) - .appendTo(jdiv); - // add accept template, if possible - if( template ){ - jinput.attr("accept", template); - } - // add callback for when input changes - jinput.on("change", (e) => { - let i, opts; - const el = e.currentTarget; - if( el.files.length ){ - switch(funcName){ - case "Load": - case "RefreshImage": - opts = {localAccess: true}; - JS9.waiting(true, this); - break; - default: - break; - } - } - for(i=0; i") - .addClass("JS9Container") - .css("z-index", JS9.MESSZINDEX) - .appendTo(this.divjq); - this.infoArea = $("
    ") - .addClass("JS9Message") - .appendTo(this.messageContainer); - this.regionsArea = $("
    ") - .addClass("JS9Message") - .appendTo(this.messageContainer); - this.progressArea = $("
    ") - .addClass("JS9Progress") - .addClass("JS9Message") - .appendTo(this.messageContainer); - this.progressBar = $("") - .addClass("JS9ProgressBar") - .attr("value", 0) - .attr("max", 100) - .attr("name", "progress") - .appendTo(this.progressArea); - // make it draggable, if possible - try{ - this.messageContainer.draggable({ - // eslint-disable-next-line no-unused-vars - start(event, ui) { - this.oicb = JS9.globalOpts.internalContrastBias; - JS9.globalOpts.internalContrastBias = false; - }, - // eslint-disable-next-line no-unused-vars - stop(event, ui) { - JS9.globalOpts.internalContrastBias = this.oicb; - } - }); - } - catch(ignore){ /* empty */ } - // allow chaining - return this; -}; - -// display a plugin in a light window or a new window -JS9.Display.prototype.displayPlugin = function(plugin){ - let i, a, w, h, p, r, s, title, name, did, oid, iid, odiv, pdiv, pinst, win; - if( typeof plugin === "string" ){ - for(i=0; i") - .attr("id", oid) - .css("display", "none") - .appendTo($(this.divjq)); - $("
    ") - .addClass(plugin.name) - .attr("id", iid) - .attr("data-js9id", this.divjq.attr("id")) - .css("height", "100%") - .css("width", "100%") - .appendTo(odiv); - } - // window not created: create and show it - // create the window - w = plugin.opts.winDims[0] || JS9.WIDTH; - h = plugin.opts.winDims[1] || JS9.HEIGHT; - if( plugin.opts.winResize ){ - r = "1"; - } else { - r = "0"; - } - // light window param string - s = sprintf(a.format, w, h, r); - // add the title, if explicitly called for and if not already added - if( plugin.opts.toolbarHTML && - plugin.opts.toolbarHTML.search(/\$title/) >= 0 ){ - title = ""; - } else { - title = plugin.opts.winTitle || ""; - } - // add display to title - title += sprintf(JS9.IDFMT, this.id); - // create the light window - win = JS9.lightWin(did, "div", oid, title, s); - // find inner div in the light window - pdiv = $(`#${did} #${iid}`); - // create the plugin inside the inner div - pinst = JS9.instantiatePlugin(pdiv, plugin, win); - pinst.winHandle.onclose = () => { - // just hide the window - pinst.winHandle.hide(); - pinst.status = "inactive"; - if( plugin.opts.onpluginclose ){ - try{ - plugin.opts.onpluginclose.call(pinst, this.image); - } - catch(e){ - JS9.log("onplugincloseCB: %s [%s]\n%s", - plugin.name, e.message, JS9.strace(e)); - } - } - return false; - }; - pinst.status = "active"; - if( plugin.opts.onplugindisplay ){ - try{ - plugin.opts.onplugindisplay.call(pinst, this.image); - } - catch(e){ - JS9.log("onplugindisplayCB: %s [%s]\n%s", - plugin.name, e.message, JS9.strace(e)); - } - } - } else if( pinst.status === "inactive" ){ - // window created but hidden: show it - if( pinst.winHandle ){ - pinst.winHandle.show(); - pinst.status = "active"; - if( plugin.opts.onplugindisplay ){ - try{ - plugin.opts.onplugindisplay.call(pinst, this.image); - } - catch(e){ - JS9.log("onplugindisplayCB: %s [%s]\n%s", - plugin.name, e.message, JS9.strace(e)); - } - } - } - } else if( pinst.status === "active" ){ - // window created and showing: hide it - if( pinst.winHandle ){ - pinst.winHandle.hide(); - pinst.status = "inactive"; - if( plugin.opts.onpluginclose ){ - try{ - plugin.opts.onpluginclose.call(pinst, this.image); - } - catch(e){ - JS9.log("onplugincloseCB: %s [%s]\n%s", - plugin.name, e.message, JS9.strace(e)); - } - } - } - } - break; - case "new": - JS9.error("external window support for plugins not yet implemented"); - break; - } -}; - -// display the general file-loading form for this display -JS9.Display.prototype.displayLoadForm = function(opts){ - let html, did, method; - const format = JS9.globalOpts.localLoadFormat; - if( JS9.globalOpts.remoteLoadMethod === "proxy" && !JS9.proxyAvailable() ){ - JS9.globalOpts.remoteLoadMethod = "cgiproxy"; - } - method = JS9.globalOpts.remoteLoadMethod; - // opts is optional, defaults to displaying local and remote - opts = opts || {local:true, remote:true}; - // options for creating window - if( JS9.isNull(opts.title) ){ - opts.title = ""; - if( opts.local ){ - opts.title = "Open "; - } - if( opts.remote ){ - if( opts.title ){ - opts.title += "or "; - } - opts.title += "Retrieve "; - } - opts.title += "an Image "; - if( opts.local ){ - opts.title += "or Auxiliary File"; - } - } - opts.winformat = opts.winformat || - "width=640px,height=300px,resize=1,scrolling=1"; - // from where do we get the html? - if( JS9.allinone ){ - html = JS9.allinone.loadHTML; - } else { - html = JS9.InstallDir(JS9.globalOpts.loadURL); - } - // call this once window is loaded to init form values - $(JS9.lightOpts[JS9.LIGHTWIN].topid) - .arrive(".loadForm", {onceOnly: true}, (el) => { - const localfile = $(el).data("localfile") || this.tmp.localfile; - const remotefile = $(el).data("remotefile") || this.tmp.remotefile; - if( opts.local ){ - $(did).find(".localfile").removeClass("nodisplay"); - $(did).find(".localdoc").removeClass("nodisplay"); - if( localfile ){ - $(did).find(`input[name="localfile"]`).val(localfile); - } - $(did).find(`input[value=${format}]`).click(); - } - if( opts.remote ){ - $(did).find(".remotefile").removeClass("nodisplay"); - $(did).find(".remotedoc").removeClass("nodisplay"); - if( remotefile ){ - $(did).find(`input[name="remotefile"]`).val(remotefile); - } - if( !JS9.proxyAvailable() ){ - $(did).find(`input[value="proxy"]`).prop("disabled", true); - } - $(did).find(`input[value=${method}]`).click(); - } - }); - // create the window - did = JS9.Image.prototype.displayAnalysis.call(null, "params", html, opts); - // save display id - $(did).data("dispid", this.id); -}; - -// resize a display -JS9.Display.prototype.resize = function(width, height, opts){ - let i, div, im, key, layer, nwidth, nheight, nleft, ntop, pinst, owidth; - const repos = (o) => { - o.left += nleft; - o.top += ntop; - o.setCoords(); - }; - // sanity check - if( !JS9.globalOpts.resize ){ - JS9.error("display resize not enabled"); - } - // no args => return current size - if( !width && !height ){ - return {width: this.width, height: this.height}; - } - // 'full' or 'reset' or 'image' - if( width === "full" ){ - opts = height; - if( window.innerWidth ){ - width = window.innerWidth; - } - if( window.innerHeight ){ - // including menubar, if available - height = window.innerHeight; - // divs we take into account when centering - for(i=0; i= 0 && - (JS9.isNull(opts.resizeMenubar) || opts.resizeMenubar) ){ - pinst = this.pluginInstances.JS9Menubar; - if( pinst ){ - $(`#${this.id}Menubar`).css("width", nwidth); - } - } - // change the toolbar width, unless explicitly told not to - if( $.inArray("JS9Toolbar", JS9.globalOpts.resizeDivs) >= 0 && - (JS9.isNull(opts.resizeToolbar) || opts.resizeToolbar) ){ - pinst = this.pluginInstances.JS9Toolbar; - if( pinst ){ - // set new value for width - pinst.divjq.attr("data-width", `${String(nwidth)}px`); - // re-init toolbar for this size - JS9.Toolbar.init.call(pinst); - } - } - // change the colorbar width, unless explicitly told not to - if( $.inArray("JS9Colorbar", JS9.globalOpts.resizeDivs) >= 0 && - (JS9.isNull(opts.resizeColorbar) || opts.resizeColorbar) ){ - pinst = this.pluginInstances.JS9Colorbar; - if( pinst ){ - // set new value for width - pinst.divjq.attr("data-width", `${String(nwidth)}px`); - // re-init colorbar for this size - JS9.Colorbar.init.call(pinst); - } - } - // change the statusbar width, unless explicitly told not to - if( $.inArray("JS9Statusbar", JS9.globalOpts.resizeDivs) >= 0 && - (JS9.isNull(opts.resizeStatusbar) || opts.resizeStatusbar) ){ - pinst = this.pluginInstances.JS9Statusbar; - if( pinst ){ - $(`#${this.id}Statusbar`).css("width", nwidth); - // resize colorbar, if necessary - if( pinst.statusBar && - pinst.statusBar.match(/\$colorbar/) && - opts.resizeStatusbarColorbar !== false ){ - pinst.colorwidth = Math.max(pinst.colorwidth + width - owidth, - JS9.Statusbar.COLORWIDTH); - JS9.Statusbar.display.call(pinst, this.image, {reinit: true}); - } - } - } - // change size of shape canvases - for( key of Object.keys(this.layers) ){ - layer = this.layers[key]; - if( layer.dtype === "main" ){ - layer.divjq.css("width", nwidth); - layer.divjq.css("height", nheight); - layer.canvasjq.attr("width", nwidth); - layer.canvasjq.attr("height", nheight); - layer.canvas.setWidth(nwidth); - layer.canvas.setHeight(nheight); - layer.canvas.calcOffset(); - } - } - // change position of shapes on currently displayed layers - // save resize parameters for undisplayed layers - for(i=0; i= this.divjq.width()) && - (pos.y + JS9.RESIZEDIST >= this.divjq.height()) ){ - return true; - } - } - return false; -}; - -// scroll the display to the center of the viewport -// http://stackoverflow.com/questions/18150090/jquery-scroll-element-to-the-middle-of-the-screen-instead-of-to-the-top-with-a -JS9.Display.prototype.center = function(){ - const el = this.divjq; - let i, div, tel, voffset, hoffset; - let elVOffset = el.offset().top; - let elHeight = el.height(); - const windowHeight = $(window).height(); - const elHOffset = el.offset().left; - const elWidth = el.width(); - const windowWidth = $(window).width(); - const speed = 250; - // divs we take into account when getting total height - for(i=0; i 0 ){ - j = $.inArray(odisp, JS9.displays); - if( j >= 0 ){ - JS9.displays.splice(j, 1); - } - el.remove(); - } - } - } - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - if( this.image ){ - this.image.xeqPlugins("image", "ongatherdisplay"); - } - } -}; - -// separate images in this display into new displays -JS9.Display.prototype.separate = function(opts){ - let arr, d0, d1, el; - let nsep = 0; - let row = 0; - let col = 0; - let myid = 1; - const sep = {}; - const saveims = {}; - const rexp = /_sep[0-9][0-9]*/; - const sepopts = JS9.globalOpts.separate; - const menuStr = "
    "; - const toolStr = "
    "; - const js9Str = "
    "; - const colorStr = "
    "; - const statusStr = "
    "; - const winoptsStr = "width=%s,height=%s,top=%s,left=%s,resize=1,scolling=1"; - const LIT_FUDGE = 5; - const COLORBAR_FUDGE = 7; - const DHTML_HEIGHT = 30 + 13; // height of dhtml lightwin extras; - const initopts = (display, fromID, opts) => { - // sanity check - if( !fromID ){ - JS9.error("can't init separation ops: no 'from' id"); - } - sep.layout = opts.layout || JS9.globalOpts.separate.layout || "auto"; - sep.leftMargin = opts.leftMargin || sepopts.leftMargin || 0; - sep.topMargin = opts.topMargin || sepopts.topMargin || 0; - // check if we want to do a grid ... and if we can - if( sep.layout === "auto" && - display.divjq.closest(".JS9GridContainer").length > 0 ){ - sep.layout = "grid"; - } - if( sep.layout === "grid" ){ - if( CSS.supports("display", "grid") ){ - el = display.divjq.closest(".JS9GridContainer"); - if( el.length > 0 ){ - sep.container = el; - } - } else { - sep.layout = "auto"; - } - } - switch(sep.layout){ - case "auto": - col = 1; - row = 0; - break; - case "horizontal": - col = 1; - row = 0; - break; - case "vertical": - col = 0; - row = 1; - break; - default: - col = 1; - row = 0; - break; - } - sep.topExtra = DHTML_HEIGHT; - sep.leftExtra = 0; - sep.js9 = $(`#${fromID}`); - sep.menubar = $(`#${fromID}Menubar`); - if( sep.menubar.length > 0 ){ - sep.menubar.isactive = sep.menubar.closest(".JS9PluginContainer").css("visibility") === "visible"; - } - sep.toolbar = $(`#${fromID}Toolbar`); - if( sep.toolbar.length > 0 ){ - sep.toolbar.isactive = sep.toolbar.closest(".JS9PluginContainer").css("visibility") === "visible"; - } - sep.statusbar = $(`#${fromID}Statusbar`); - if( sep.statusbar.length > 0 ){ - sep.statusbar.isactive = sep.statusbar.closest(".JS9PluginContainer").css("visibility") === "visible"; - } - sep.colorbar = $(`#${fromID}Colorbar`); - if( sep.colorbar.length > 0 && !sep.statusbar.length ){ - sep.colorbar.isactive = sep.colorbar.closest(".JS9PluginContainer").css("visibility") === "visible"; - } - if( sep.js9.length > 0 ){ - // hack: height of the dhtml drag handle and status area - sep.width = sep.js9.width(); - sep.height = sep.js9.height(); - sep.top = sep.js9.offset().top - $(window).scrollTop() - LIT_FUDGE; - sep.left = sep.js9.offset().left - $(document).scrollLeft(); - if( sep.menubar.isactive ){ - sep.height += sep.menubar.height(); - sep.top -= sep.menubar.height(); - } - if( sep.toolbar.isactive ){ - sep.height += sep.toolbar.height(); - sep.top -= sep.toolbar.height(); - } - if( sep.statusbar.isactive ){ - sep.height += sep.statusbar.height(); - sep.top -= sep.statusbar.height(); - } else if( sep.colorbar.isactive ){ - sep.height += sep.colorbar.height(); - sep.top -= sep.colorbar.height(); - sep.top += COLORBAR_FUDGE; - } - } - }; - const getopts = (fromID, toID) => { - let html, winopts; - if( fromID ){ - if( sep.js9.length > 0 ){ - html = ""; - if( sep.menubar.isactive ){ - html += sprintf(menuStr, toID, sep.js9.width()); - } - if( sep.toolbar.isactive ){ - html += sprintf(toolStr, toID, sep.js9.width()); - } - html += sprintf(js9Str, toID, sep.js9.width(),sep.js9.height()); - if( sep.statusbar.isactive ){ - html += sprintf(statusStr, toID, sep.js9.width()); - } else if( sep.colorbar.isactive ){ - html += sprintf(colorStr, toID, sep.js9.width()); - } - } - if( sep.layout === "auto" ){ - if( (sep.left + (sep.width * (col+0.5))) > window.innerWidth ){ - row++; - col = 0; - } - } - winopts = sprintf(winoptsStr, - sep.width, - sep.height, - sep.top + ((sep.height + sep.topMargin + sep.topExtra) * row), - sep.left + ((sep.width + sep.leftMargin + sep.leftExtra) * col)); - // move to next column - if( sep.layout === "auto" || sep.layout === "horizontal" ){ - col++; - } else if( sep.layout === "vertical" ){ - row++; - } - } - // return info for this column; - return {id: toID, html: html, winopts: winopts}; - }; - const separateim = (arr) => { - let im, xopts, id; - const n = nsep++; - if( arr.length > n ){ - if( typeof arr[n] === "number" ){ - im = JS9.images[arr[n]]; - } else { - im = arr[n]; - } - // look for images in this display - if( im && im.display === this ){ - // display this image so it's the current one we move - im.displayImage("all"); - // init params - if( d0 === undefined ){ - d0 = im.display.id; - initopts(im.display, d0, opts); - // if leave first image in place is false, decrement - // nsep so it gets separated on the next iteration - if( opts.firstinplace === false ){ - nsep--; - } - separateim(arr); - } else { - // create a new window for this image - if( typeof opts.idbase === "string" ){ - id = opts.idbase + myid++; - d1 = id; - } else { - d1 = `${d0.replace(rexp, "")}_sep${JS9.uniqueID()}`; - } - saveims[d1] = im; - xopts = getopts(d0, d1); - // replace id, if idbase was supplied in opts - if( id ){ - xopts.id = id; - } - if( sep.layout === "grid" ){ - // a div hold the html for this separated display, - // and is appended to grid container - $("
    ") - .prop("id", xopts.id + "GridItem") - .addClass("JS9GridItem") - .append($(xopts.html)) - .appendTo(sep.container); - // create the new JS9 display, with associated plugins - JS9.AddDivs(xopts.id); - // move this image - saveims[xopts.id].moveToDisplay(xopts.id); - // process next image - separateim(arr); - } else { - // create a light wndow - // code to run when new window exists - $(JS9.lightOpts[JS9.LIGHTWIN].topid) - .arrive(`#${d1}`, {onceOnly: true}, (el) => { - id = $(el).attr("id"); - // FF (at least) needs this 0ms delay - window.setTimeout(() => { - // move this image - saveims[id].moveToDisplay(id); - // process next image - separateim(arr); - }, 0); - }); - // load new window, code above gets run when window exists - JS9.LoadWindow(null, {id: xopts.id}, "light", - xopts.html, xopts.winopts); - } - } - } else { - // this image is in a different display, so process next image - separateim(arr); - } - } else { - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - if( this.image ){ - this.image.xeqPlugins("image", "onseparatedisplay"); - } - } - } - }; - // opts are optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse separate opts: ${opts}`, e); } - } - // array of images to use - arr = opts.images || JS9.images; - // start separating the images - separateim(arr); -}; - -// display the next image from the JS9 images list which is in this display -JS9.Display.prototype.nextImage = function(inc){ - let i, idx, nidx, im, dpos, npos; - let ims = []; - let masks = []; - inc = inc || 1; - if( !this.image ){ - return this; - } - dpos = this.image.pos; - // make list of image masks for this display - if( !JS9.globalOpts.nextImageMask ){ - for(i=0; i= 0 ){ - continue; - } - // candidate image - ims.push(im); - } - // if there is only one image, we're done - if( ims.length <= 1 ){ - return this; - } - // get index into images array for the currently displayed image - for(idx=0; idx= ims.length ){ - nidx -= ims.length; - } - // wrap if necessary - while( nidx < 0 ){ - nidx += ims.length; - } - // display if we are not back to where we started - if( idx !== nidx ){ - // display image, 2D graphics, etc. - im = ims[nidx]; - im.displayImage("all"); -// already done in displayImage() -// im.refreshLayers(); - im.display.clearMessage(); - if( dpos ){ - npos = im.displayToImagePos(dpos); - im.valpos = null; - im.valpos = im.updateValpos(npos, true); - } - } - // allow chaining - return this; -}; - -// load session from a json file -// NB: save is an image method, load is a display method -JS9.Display.prototype.loadSession = function(file, opts){ - let obj, left; - const objs = {}; - const finish = (im) => { - let i, dlayer, layer, lname, obj; - const dorender = () => { - // update layer's shape counter - const objs = dlayer.canvas.getObjects(); - if( objs && typeof objs.length !== "undefined" ){ - im.layers[dlayer.layerName].nshape = objs.length + 1; - } - // update objects for parents and children - JS9.Fabric.updateChildren(dlayer, null, "objects"); - // change shape positions if the displays sizes differ - im.refreshLayers(); - }; - // see: http://fabricjs.com/v5-breaking-changes - const reviver = (data, instance) => { - // detect that version is less than 5 - // change radians to degrees (for circles) - if (parseInt(data.version.slice(0, 1), 10) < 5) { - if( instance.startAngle ) instance.startAngle *= 180 / Math.PI; - if( instance.endAngle ) instance.endAngle *= 180 / Math.PI; - } - }; - obj = objs[im.file] || {}; - // reconstitute blend state - if( obj.blend ){ - im.blend = $.extend(true, {}, obj.blend); - } - // reconstitute tmp values - if( obj.tmp ){ - im.tmp = $.extend(true, {}, obj.tmp); - } - // reconstitute wcsim state - if( obj.wcsim ){ - im.wcsim = JS9.lookupImage(obj.wcsim); - } - // reconstitute layers - if( obj.layers && obj.layers.length ){ - for(i=0; i= 0 && - lname === "regions" ){ - continue; - } - // skip crosshair and grid - if( lname === "crosshair" || lname === "grid" ){ - continue; - } - // make sure layer exists in the display - dlayer = this.newShapeLayer(lname, layer.dopts); - // add a layer instance to this image (no objects yet) - im.addShapes(lname, []); - // load the session objects into the layer and render - dlayer.canvas.loadFromJSON(layer.json, dorender, reviver); - // restore catalog and starbase, if necessary - if( layer.catalog ){ - im.layers[lname].catalog = layer.catalog; - } - if( layer.starbase ){ - try{im.layers[lname].starbase = JSON.parse(layer.starbase);} - catch(ignore){ /* empty */ } - } - } - } - // if coordinate grid was active, display it - if( im.tmp && im.tmp.gridStatus === "active" ){ - im.displayCoordGrid(true); - } - // if all images are loaded, sort them to the original load order - if( JS9.notNull(left) ){ - left = left - 1; - if( left === 0 ){ - JS9.images.sort((a, b) => { - let ai = 0, bi = 0; - if( objs[a.file] ){ ai = objs[a.file].i; } - if( objs[b.file] ){ bi = objs[b.file].i; } - return ai - bi; - }); - } - } - // re-execute from the xeq stash - if( obj.xeqstash ){ - im.xeqStashCall(obj.xeqstash); - } - // plugin callbacks - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("image", "onsessionload"); - } - // execute onsessionload callback, if necessary - if( typeof opts.onsessionload === "function" ){ - try{ JS9.xeqByName(opts.onsessionload, window, im); } - catch(e){ JS9.error("in onsessionload callback", e, false); } - } - }; - const loadit = (imobj) => { - let pname; - // sanity check - if( !imobj.file ){ - JS9.error("session does not contain a filename"); - } - // save copy of object so we can edit it - obj = $.extend(true, {}, imobj); - // some param info needs to be deleted - delete obj.params.display; - // unset crosshair (we don't save it or load it) - obj.params.crosshair = false; - // include an onload callback to load the layers - obj.params.onload = finish; - // get pathname of image file - pname = obj.file; - // add section info - if( obj.sect ){ - obj.params.xcen = obj.sect.xcen; - obj.params.ycen = obj.sect.ycen; - obj.params.xdim = obj.sect.xdim; - obj.params.ydim = obj.sect.ydim; - obj.params.zoom = obj.sect.zoom; - delete obj.sect; - } - // desktop only: are session file paths relative to the session path? - if( window.electron && - JS9.desktopOpts.sessionPath && - opts.sessionPath && - obj.file.charAt(0) !== "/" && - !obj.file.match(JS9.URLEXP) ){ - pname = JS9.fixPath(opts.sessionPath + obj.file, opts); - } - // save for finish - objs[pname] = obj; - // load the image - JS9.Load(pname, obj.params, {display: this.id}); - }; - const loadem = (jobj) => { - let i, key, cmap, xobj; - // restore (and remove) globals - if( jobj.globalOpts ){ - $.extend(true, JS9.globalOpts, jobj.globalOpts); - delete jobj.globalOpts; - } - // load colormaps - if( jobj.cmaps ){ - for(i=0; i= 0 ){ - xobj = {toplevel: true}; - } else { - xobj = {toplevel: false}; - } - JS9.AddColormap(cmap, xobj); - } - } - // load images - if( jobj.images ){ - left = jobj.images.length; - for(i=0; i { - loadem(jobj); - }, - error: (jqXHR, textStatus, errorThrown) => { - JS9.error(`could not load session: ${file}`, errorThrown); - } - }); - } - // allow chaining - return this; -}; - -// dummy routines to display/clear message, overwritten in info plugin -// eslint-disable-next-line no-unused-vars -JS9.Display.prototype.displayMessage = function(type, message, target){ - return; -}; -// eslint-disable-next-line no-unused-vars -JS9.Display.prototype.clearMessage = function(which){ - return; -}; - -// create a mosaic from a multi-extension FITS file or a number of images -JS9.Display.prototype.createMosaic = function(ims, opts){ - let i, im, bin, carr; - const im0 = this.image; - const line1 = "| fname|"; - const line2 = "| char|"; - // remove temp files - const cleanup = () => { - let i; - for(i=0; i { - let earr; - // check for Montage error - if( rstr.search(/\[struct stat="OK"/) < 0 ){ - // no longer waiting - JS9.waiting(false); - // first remove temp files - cleanup(); - // signal this we completed the reproject attempt - earr = rstr.match(/msg="(.*)"/); - if( earr && earr[1] ){ - JS9.error(`${earr[1]} (from ${prog})`); - } else { - JS9.error(rstr || `unknown ${prog} failure`); - } - } - }; - // display mosaic as a new image - const disp = (hdu, opts) => { - let topts, nim; - opts = opts || {}; - topts = $.extend(true, {}, opts); - // start the waiting! - if( opts.waiting !== false ){ - JS9.waiting(true, this); - } - // make sure we use the current display - topts.display = this.id; - // set up new and display new image - nim = new JS9.Image(hdu, topts); - // set status of both old and new image - im0.setStatus("createMosaic", "complete"); - nim.setStatus("createMosaic", "complete"); - // done waiting - JS9.waiting(false); - // everything else is done so call onmosaic func, if necessary - if( opts.onmosaic ){ - try{ JS9.xeqByName(opts.onmosaic, window, nim); } - catch(e){ JS9.error("in create mosaic callback", e, false); } - } - }; - // write comforting messages to the console while we wait and wait - const log = (...args) => { - let s; - if( opts.verbose || JS9.DEBUG > 1 ){ - s = sprintf(...args); - // eslint-disable-next-line no-console - JS9.log(s); - } - }; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse createMosaic opts: ${opts}`, e); } - } - // reduce can be taken from the global value - opts.reduce = opts.reduce || JS9.globalOpts.reduceMosaic; - // same for reduction dims - opts.dim = opts.dim || - Math.max(JS9.globalOpts.image.xdim, JS9.globalOpts.image.ydim); - // ims can be: array of ims or a single im or null (use displayed image) - // each im can itself be an im object or the image string id - if( !ims ){ - // use currently display image, if possible - if( this.image ){ - ims = [this.image]; - } else { - ims = []; - } - } else if( typeof ims === "string" ){ - if( ims === "current" ){ - // use the currently loaded image - if( this.image ){ - ims = [this.image]; - } else { - ims = []; - } - } else if( ims === "all" ){ - // use all images in this display - ims = []; - for(i=0; i { - let s, t, v, sw, naxis, rstr, inbuf, ext; - let vfile, ivfile, ovfile, bvfile, sect, topts; - let inlst, intbl, inhdr, inarr, binlst, bintbl; - let outlst, outtbl, outhdr, areafile, outfile; - const id = JS9.uniqueID(); - const imsw = "-C"; // skip naxis[3,4]: they write garbage into the table - const mktmp = (suffix) => { - return `mosaic_${id}_${suffix}`; - }; - // temps files get unique names - inlst = mktmp("in.lst"); - intbl = mktmp("in.tbl"); - inhdr = mktmp("in.hdr"); - binlst = mktmp("bin.lst"); - bintbl = mktmp("bin.tbl"); - outlst = mktmp("out.lst"); - outtbl = mktmp("out.tbl"); - outhdr = mktmp("out.hdr"); - // output file name comes from the first image name - outfile = ims[0].id - .replace(/\[.*\]/, "") - .replace(/\.fz$/i, "") - .replace(/\.gz$/i, "") - .replace(/\.fits$/i, "_mosaic.fits"); - // Montage temp areafile comes from the output file name - areafile = outfile.replace(/\.fits$/, "_area.fits"); - // init cleanup array to make sure temp files get deleted - carr = [inlst, intbl, inhdr, binlst, bintbl, - outlst, outtbl, outhdr, areafile]; - // generate input list from array of ims - s = `${line1}\n${line2}\n`; - for(i=0; i %s", vfile, ext, ovfile); - rstr = JS9.reproject(vfile, ovfile, outhdr, sw); - // check for errors - chkerr("mProjectPP", rstr); - } - } - // save output list in file - JS9.vfile(outlst, s); - // call the Mosaic/mImgtbl routine - rstr = JS9.imgtbl(outlst, ".", outtbl, ""); - // check for errors - chkerr("mImgtbl", rstr); - // make sure input table has FITS files - if( !JS9.vsize(outtbl) ){ - JS9.error("no FITS files were added to output table for mosaic"); - } - // make the mosaic - log("create mosaic: %s", outfile); - rstr = JS9.madd(outtbl, outhdr, outfile, ""); - // check for errors - chkerr("mAdd", rstr); - // cleanup temp files - cleanup(); - // construct options - topts = $.extend(true, {}, JS9.fits.options, opts); - // we want the full image - topts.image = {xdim: 0, ydim: 0}; - topts.file = outfile; - // process the newly retrieved data as FITS - JS9.fits.handleFITSFile(outfile, topts, disp); - }, JS9.SPINOUT); - // allow chaining - return this; -}; - -// swap images in the images stack for this display -// used by the sortable routine to switch images in a stack -// for moving an element of an array: -// https://stackoverflow.com/questions/5306680/move-an-array-element-from-one-array-position-to-another -JS9.Display.prototype.moveImageInStack = function(from, to){ - let i, j, nfrom, nto; - for(i=0, j=0; i 1 ){ - JS9.log("JS9 command: %s", this.name); - } -}; - -// get the display tied to this command (as well as the current image). -JS9.Command.prototype.getDisplayInfo = function(display){ - if( display && display.id ){ - this.display = display; - this.image = display.image; - } - // allow chaining - return this; -}; - -// return "get" or "set" to specify which command to run -JS9.Command.prototype.getWhich = function(args){ - let which; - if( this.get && !this.set ){ - which = "get"; - } else if( this.set && !this.get ){ - which = "set"; - } else if( this.which ){ - which = this.which(args); - } else if( args.length === 0 ){ - which = "get"; - } else { - which = "set"; - } - return which; -}; - -// --------------------------------------------------------------------- -// JS9 helper to manage connection to back-end services -// --------------------------------------------------------------------- - -JS9.Helper = function(){ - // reset protocol for file: - if( JS9.globalOpts.helperProtocol === "file:" ){ - JS9.globalOpts.helperProtocol = "http:"; - } - // reset helper timeout for local access - if( !document.domain || document.domain === "localhost" ){ - JS9.globalOpts.htimeout = JS9.globalOpts.lhtimeout; - } - // add suffix, if necessary - if( !JS9.globalOpts.helperProtocol.match(/\/\/$/) ){ - JS9.globalOpts.helperProtocol += "//"; - } - // assume the worst - this.connected = false; - this.helper = false; - // set up initial type of helper connection - if( JS9.allinone && !JS9.globalOpts.allinoneHelper ){ - this.type = "none"; - } else { - this.type = JS9.globalOpts.helperType || "sock.io"; - } - // no page id yet - this.pageid = null; - // make the connection - this.connect(); -}; - -// get back-end helper connection info -JS9.Helper.prototype.connectinfo = function(){ - let s; - // no connection configured - if( JS9.helper.connected === null ){ - return "notConfigured"; - } - // connection configured and established - if( JS9.helper.connected ){ - s = `connected ${JS9.helper.type} ${JS9.helper.url}`; - if( JS9.helper.pageid ){ - s += `

    ${JS9.helper.pageid}`; - } - return s; - } - // connection configured but not established - return `notConnected ${JS9.helper.type}`; -}; - -// connect to back-end helper -JS9.Helper.prototype.connect = function(type){ - let sockbase, sockfile; - const tries = JS9.globalOpts.ehretries; - const delay = JS9.globalOpts.ehtimeout; - const failedHelper = (textStatus, errorThrown) => { - this.connected = false; - this.helper = false; - this.ready = true; - $(document).trigger("JS9:helperReady", - {type: "socket.io", status: "error"}); - textStatus = textStatus || "timeout"; - if( !errorThrown || errorThrown === "timeout" ){ - errorThrown = "or connection refused"; - } - if( errorThrown === textStatus ){ - textStatus = ""; - } - if( errorThrown === "error" ){ - errorThrown = "is the helper running?"; - } - // throw error if needed - if( JS9.globalOpts.requireHelper ){ - JS9.error(`helper connect error: ${textStatus} (${errorThrown})`); - } else if( JS9.DEBUG ){ - JS9.log(`JS9 helper connect error: ${textStatus} (${errorThrown})`); - } - }; - const connectHelper = (url) => { - // connect to helper - $.ajax({ - url: url, - dataType: "script", - timeout: JS9.globalOpts.htimeout, - cache: true, - success: () => { - // if there is no io object, we didn't really succeed - // can happen, for example, in the Jupyter environment - if( typeof io === "undefined" ){ - failedHelper("socket io object is undefined", null); - return; - } - // connect to the helper - this.socket = io.connect(this.url, JS9.socketioOpts); - // on-event processing - this.socket.on("connect", () => { - let ii, d, p; - this.connected = true; - this.helper = true; - d = []; - for(ii=0; ii { - this.pageid = obj.pageid; - this.js9helper = obj.js9helper; - JS9.globalOpts.dataPathModify = obj.dataPathModify; - this.ready = true; - $(document).trigger("JS9:helperReady", - {type: "socket.io", status: "OK"}); - if( JS9.DEBUG ){ - JS9.log(`JS9 helper: connect: ${this.type}`); - } - }); - $(document).trigger("JS9:connected", - {type: "socket.io", status: "OK"}); - }); - this.socket.on("connect_error", () => { - this.connected = false; - this.helper = false; - if( JS9.DEBUG > 1 ){ - JS9.log("JS9 helper: connect error"); - } - }); - this.socket.on("connect_timeout", () => { - this.connected = false; - this.helper = false; - if( JS9.DEBUG > 1 ){ - JS9.log("JS9 helper: connect timeout"); - } - }); - this.socket.on("disconnect", (reason) => { - this.connected = false; - this.helper = false; - if( JS9.DEBUG > 1 ){ - JS9.log(`JS9 helper: disconnect: ${reason}`); - } - // https://github.com/socketio/socket.io-client/blob/master/docs/API.md#event-disconnect - if( reason === "io server disconnect" ){ - // the disconnection was initiated by the server, - // you need to reconnect manually - if( JS9.DEBUG > 1 ){ - JS9.log("JS9 helper: manual reconnect"); - } - this.socket.connect(); - } - // else the socket will automatically try to reconnect - }); - this.socket.on("reconnect", () => { - this.connected = true; - this.helper = true; - if( JS9.DEBUG > 1 ){ - JS9.log("JS9 helper: reconnect"); - } - }); - this.socket.on("msg", JS9.msgHandler); - }, - error: (jqXHR, textStatus, errorThrown) => { - failedHelper(textStatus, errorThrown); - } - }); - }; - // make an "alive" request of the helper (jsonp to avoid CORS rejection) - const waitForHelper = (eurl, hurl, tries) => { - $.ajax({ - url: eurl, - dataType: "jsonp", - success: () => { - connectHelper(hurl); - }, - error: () => { - if( --tries > 0 ){ - window.setTimeout(() => { - waitForHelper(eurl, hurl, tries); - }, delay); - } else { - failedHelper(); - } - } - }); - }; - // might be establishing a new type - if( type ){ - this.type = type; - } - // close off previous socket connection, if necessary - if( this.socket ){ - try{this.socket.disconnect();} - catch(e){JS9.log("warning: can't disconnect from socket");} - this.socket = null; - } - // base of helper url is either specified, same as current domain, or local - if( JS9.globalOpts.helperURL ){ - if( JS9.globalOpts.helperURL.search(/:\/\//) >=0 ){ - this.url = JS9.globalOpts.helperURL; - } else { - this.url = JS9.globalOpts.helperProtocol + JS9.globalOpts.helperURL; - } - } else if( document.domain ){ - if( location.origin ){ - this.url = location.origin; - } else { - this.url = JS9.globalOpts.helperProtocol + document.domain; - } - } else { - this.url = `${JS9.globalOpts.helperProtocol}localhost`; - } - // save base of url - this.baseurl = this.url; - // try to establish connection, based on connection type - switch(this.type){ - case "none": - this.connected = null; - this.ready = true; - // signal JS9 helper is ready - $(document).trigger("JS9:helperReady", {type: "none", status: "OK"}); - break; - case "get": - case "post": - // sanity check - if( !JS9.globalOpts.helperCGI ){ - JS9.error("cgi script name missing for helper"); - } - this.url += `/${JS9.globalOpts.helperCGI}`; - this.connected = true; - this.helper = true; - if( JS9.DEBUG ){ - JS9.log(`JS9 helper: connect: ${this.type}`); - } - this.ready = true; - $(document).trigger("JS9:helperReady", {type: "get", status: "OK"}); - break; - case "sock.io": - case "nodejs": - if( !JS9.globalOpts.helperPort ){ - JS9.error("port missing for helper"); - } - // ignore port on url, add our own - this.url = `${this.url.replace(/:[0-9][0-9]*$/, "")}:${JS9.globalOpts.helperPort}`; - // which version of socket.io? - sockbase = "socket.io"; - // use min version for production, as per migration docs - if( JS9.DEBUG <= 2 ){ - sockfile = "socket.io.min.js"; - } else { - sockfile = "socket.io.js"; - } - // full url of the socket.io.js file - this.sockurl = `${this.url}/${sockbase}/${sockfile}`; - // make sure helper is running and then connect - if( window.electron ){ - this.aliveurl = `${this.url}/alive`; - waitForHelper(this.aliveurl, this.sockurl, tries); - } else { - connectHelper(this.sockurl); - } - break; - default: - JS9.error(`unknown helper type: ${this.type}`); - break; - } -}; - -// send request to back-end helper -JS9.Helper.prototype.send = function(key, obj, cb){ - // sanity check - if( !this.connected ){ return null; } - // add cookie value - // add dataPath, if available (but always look in the helper directory) - if( obj && (typeof obj === "object") ){ - // wrap this in a try to catch CORS errors - try{ obj.cookie = document.cookie; } - catch(e){ delete obj.cookie; } - if( JS9.globalOpts.dataPath && !obj.dataPath ){ - obj.dataPath = `${JS9.globalOpts.dataPath}:.`; - } - } else { - obj = {dataPath: "."}; - } - // add path which gets us to the js9 root - if( JS9.TOROOT ){ - obj.dataPath += `:${JS9.TOROOT}`; - } - // tell server how to get to root (for datapath) - // send message, based on connection type - switch(this.type){ - case "get": - case "post": - obj.key = key; - if( JS9.helper.pageid ){ - obj.pageid = JS9.helper.pageid; - } - if( JS9.DEBUG ){ - JS9.log("JS9 cgi helper [%s, %s]: %s", - this.type, JSON.stringify(obj), this.url); - } - $.ajax({ - url: this.url, - type: this.type.toUpperCase(), - data: obj, - dataType: "text", - success: (data) => { - if( typeof data === "string" && - data.search(JS9.analOpts.epattern) >=0 ){ - JS9.log(data); - } - if( cb ){ - cb(data); - } - }, - error: (jqXHR, textStatus, errorThrown) => { - if( JS9.DEBUG ){ - JS9.log(`JS9 helper: ${this.type} failure: ${textStatus} ${errorThrown}`); - } - } - }); - break; - case "sock.io": - case "nodejs": - JS9.helper.socket.emit(key, obj, cb); - break; - } - // allow chaining - return this; -}; - -// --------------------------------------------------------------------- -// JS9 web worker support to off-load CPU intensive tasks -// --------------------------------------------------------------------- - -// create new web worker -JS9.WebWorker = function(url){ - const finishup = () => { - this.worker.onmessage = JS9.WebWorker.prototype.msgHandler.bind(this); - this.handlers = []; - }; - if( url.match(JS9.URLEXP) ){ - // avoid cross-origin problems if the webworker is being retrieved - // from somewhere other than the local host - // this leaks a small bit of memory (no revokeObjectURL call) - JS9.fetchURL(null, url, null, (blob) => { - this.worker = new Worker(URL.createObjectURL(blob)); - finishup(); - }); - } else { - // ordinary retrieval of a local file - this.worker = new Worker(url); - finishup(); - } -}; - -// handle (known) messages from web worker -JS9.WebWorker.prototype.msgHandler = function(msg){ - let i, handler; - const h = JS9.helper; - const obj = msg.data; - switch(obj.cmd){ - case "progress": - JS9.progress(obj.result.value, obj.result.max); - break; - case "initsocketio": - if( obj.result === "OK" ){ - this.sockinit = true; - for(i=0; i 1 ){ - JS9.log(`JS9 worker socketio: ${obj.cmd}`); - } - break; - case "disconnect": - delete JS9.worker.uploadActive; - JS9.progress(false); - obj.result = obj.result || "JS9 worker socket was disconnected"; - // need a slight delay here, not sure why - window.setTimeout(() => { - JS9.worker.send("initsocketio", [h.url, h.pageid], - () => { - if( obj.alert ){ - alert(obj.result); - } else if( JS9.DEBUG > 1 ){ - JS9.log(obj.result); - } - }); - }, JS9.WORKEROUT); - break; - case "error": - delete JS9.worker.uploadActive; - JS9.progress(false); - JS9.error(obj.result||"in web worker"); - break; - default: - break; - } -}; - -// send a message to a web worker -JS9.WebWorker.prototype.send = function(cmd, args, func, xfer){ - const id = cmd + JS9.uniqueID(); - const obj = {id, cmd, args}; - // push context - if( func ){ - args = args || []; - this.handlers.push({id, cmd, args, func}); - } - // send message, possibly with transferred data - if( xfer ){ - this.worker.postMessage(obj, xfer); - } else { - this.worker.postMessage(obj); - } -}; - -// initialize worker socketio connection, then call handler -JS9.WebWorker.prototype.socketio = function(handler){ - const h = JS9.helper; - JS9.worker.send("initsocketio", [h.url, h.pageid], (s) => { - if( s === "OK" ){ - if( handler ){ handler(); } - } else { - JS9.error(`can't init socket.io for JS9 worker: ${s}`); - } - }); -}; - -// terminate a web worker -JS9.WebWorker.prototype.terminate = function(){ - this.worker.terminate(); -}; - -// --------------------------------------------------------------------- -// Graphics support using fabric.js -// -// Fabric object defines graphical primitives -// --------------------------------------------------------------------- - -// quick way to separate fabric versions -fabric.major_version = parseFloat(fabric.version.split(".")[0]); -fabric.minor_version = parseFloat(fabric.version.split(".")[1]); -fabric.patch_version = parseFloat(fabric.version.split(".")[2]); - -// fabric sub-object to hold fabric routines -JS9.Fabric = {}; - -// extra fabric elements to save when switching between images - -JS9.Fabric.elements = ["cornerSize", "cornerColor", "cornerStyle", - "borderColor", - "transparentCorners", "selectionLineWidth", - "centeredScaling", "hasControls", "hasRotatingPoint", - "lockMovementX", "lockMovementY", "lockRotation", - "lockScalingX", "lockScalingY", "lockUniScaling", - "selectable", "hasBorders", "params", "pub"]; - -// global options for all shapes -JS9.Fabric.opts = { - // default fabric.js options - originX: "center", - originY: "center", - strokeWidth: 2, - selectionLineWidth: 2, - borderColor: "#00EEFF", - cornerColor: "#00EEFF", - cornerSize: fabric.isTouchSupported ? 10 : 6, - cornerStyle: "circle", - hasControls: true, - hasRotatingPoint: true, - hasBorders: true, - transparentCorners: false, - centeredScaling: true, - strokeUniform: true, - selectable: true, - // minimizes the jump when first changing the region size - padding: 0, - canvas: { - selection: true - }, - fill: "transparent", - objectCaching: false -}; - -// rescale the width of shapes in the shape layers -JS9.Fabric.rescaleStrokeWidth = function(scale, sw1){ - const tscale = ((this.scaleX + this.scaleY) / 2); - // fabric 3.6.3+ supports strokeUniform, including for groups - if( fabric.major_version >= 4 || - (fabric.major_version === 3 && - fabric.minor_version === 6 && - fabric.patch_version >= 3) ){ - return; - } - // fabric 2+ supports strokeUniform, but not for groups - // still, it fixes the different strokeWidth problem for rectangular boxes - if( fabric.major_version >= 2 && this.params && - this.params.shape !== "annulus" && this.params.shape !== "cross" ){ - return; - } - scale = scale || 1; - scale *= tscale; - if( !sw1 && this.params ){ - sw1 = this.params.sw1; - } - if( !sw1 ){ - return; - } - if( this.type === "group" ){ - this.forEachObject( (obj) => { - obj.rescaleBorder(scale, sw1); - }); - } else { - this.set("strokeWidth", sw1 / scale); - } -}; - -// ensure the circle scales the same in X and Y -JS9.Fabric.rescaleEvenly = function(){ - let lastscale; - if( !this.params || (this.scaleX === this.scaleY) ){ - return; - } - switch(this.params.shape){ - case "annulus": - case "circle": - lastscale = this.params.lastscale || 1; - if( this.scaleX !== lastscale ){ - this.scaleY = this.scaleX; - } else if( this.scaleY !== lastscale ){ - this.scaleX = this.scaleY; - } - this.params.lastscale = this.scaleX; - break; - } -}; - -// add to fabric object prototype -fabric.Object.prototype.rescaleBorder = JS9.Fabric.rescaleStrokeWidth; -fabric.Object.prototype.rescaleEvenly = JS9.Fabric.rescaleEvenly; - -// --------------------------------------------------------------------- -// Shape prototype additions to JS9 Display class -// --------------------------------------------------------------------- - -// create a new shape layer in the display -// call using display context -JS9.Fabric.newShapeLayer = function(layerName, layerOpts, divjq){ - let id, dlayer; - const display = this; - const shupdate = (obj, s) => { - let i, o, objs; - let im = dlayer.display.image; - let ao = dlayer.canvas.getActiveObject(); - let opts = {}; - // sanity check - if( !im ){ return; } - if( obj.params ){ - if( ao.type === "activeSelection" ){ - opts.group = ao; - } - im._updateShape(layerName, obj, opts, s); - } else if( (obj.type === "activeSelection") || - (obj.type === "group" && !obj.params) ){ - objs = obj.getObjects(); - for(i=0; i { - // sanity check - if( !display.image ){ return; } - // update multiselect dialog box for this image, if necessary - dlayer.display.image._updateMultiDialogs(setmode); - } - const seloff = (dlayer, obj) => { - // reset currently selected - dlayer.params.sel = null; - // reset currently selected layer - if( dlayer.display.image ){ - dlayer.display.image.layer = null; - } - // selection cleared processing - // remove anchors from previously selected polygon - if( obj ){ - switch(obj.type){ - case "polyline": - case "polygon": - JS9.Fabric.removePolygonAnchors(dlayer, obj); - // renderAll() throws an error, might be related to: - // http://fabricjs.com/v2-breaking-changes-2 - // dlayer.canvas.renderAll(); - break; - } - // region updates - shupdate(obj, "unselect"); - // update multi-select dialog - seldialog(-1); - } - }; - // eslint-disable-next-line no-unused-vars - const selmultioff = (dlayer, opts) => { - let i, obj, aobjects; - aobjects = dlayer.canvas.getActiveObjects(); - for(i=0; i { - // turn off previous selection, if necessary - if( dlayer.params.sel && obj.params && (dlayer.params.sel !== obj) ){ - seloff(dlayer, dlayer.params.sel); - } - // set currently selected layer - if( dlayer.display.image ){ - dlayer.display.image.layer = layerName; - } - // new selection processing - if( obj ){ - // add anchors to selected polygon - switch(obj.type){ - case "polyline": - case "polygon": - JS9.Fabric.addPolygonAnchors(dlayer, obj); - dlayer.canvas.renderAll(); - break; - } - // set currently selected shape - if( obj.polyparams ){ - dlayer.params.sel = obj.polyparams.polygon; - } else if( obj.params ){ - dlayer.params.sel = obj; - } - // region updates - shupdate(obj, "select"); - // update multi-select dialog - seldialog(1); - } - }; - // eslint-disable-next-line no-unused-vars - const selmultion = (dlayer, opts, activeObject) => { - let i, j, obj, parent, child, objs; - // turn off previous selection, if necessary - if( dlayer.params.sel && (dlayer.params.sel !== activeObject) ){ - seloff(dlayer, dlayer.params.sel); - } - // get current active object if necessary - activeObject = activeObject || dlayer.canvas.getActiveObject(); - // and the associated objects - objs = dlayer.canvas.getActiveObjects(); - for(i=0; i") - .addClass("JS9Container") - .css("z-index", 0) - .appendTo(divjq); - // create canvas element and append to container - dlayer.canvasjq = $("") - .addClass("JS9Layer") - .attr("id", id) - .attr("width", divjq.css("width")) - .attr("height", divjq.css("height")) - .appendTo(dlayer.divjq); - if( JS9.bugs.webkit_resize && dlayer.dtype === "main" ){ - dlayer.canvasjq - .attr("width", display.width) - .attr("height", display.height); - } - // new fabric canvas associated with this HTML canvas - dlayer.canvas = new fabric.Canvas(dlayer.canvasjq[0]); - // don't render on add or remove of objects (do it manually) - dlayer.canvas.renderOnAddRemove = false; - // preserve stacking (required in v1.6.6 to interact with polygon points) - dlayer.canvas.preserveObjectStacking = true; - // movable: short-hand for allowing objects to move (not resize) - if( dlayer.opts.movable ){ - dlayer.opts.lockMovementX = false; - dlayer.opts.lockMovementY = false; - dlayer.opts.selectable = true; - dlayer.opts.evented = true; - } else if( dlayer.opts.movable === false ){ - dlayer.opts.lockMovementX = true; - dlayer.opts.lockMovementY = true; - dlayer.opts.selectable = false; - dlayer.opts.evented = false; - } - // deprecated - if( (dlayer.opts.changeable === undefined) && - (dlayer.opts.fixinplace !== undefined) ){ - dlayer.opts.changeable = !dlayer.opts.fixinplace; - } - // locked: opposite alias of changeable - if( (dlayer.opts.changeable === undefined) && - (dlayer.opts.locked !== undefined) ){ - dlayer.opts.changeable = !dlayer.opts.locked; - } - // changeable: short-hand for allowing objects to move and resize - if( dlayer.opts.changeable ){ - dlayer.opts.hasControls = true; - dlayer.opts.hasRotatingPoint = true; - dlayer.opts.hasBorders = true; - dlayer.opts.lockMovementX = false; - dlayer.opts.lockMovementY = false; - dlayer.opts.lockRotation = false; - dlayer.opts.lockScalingX = false; - dlayer.opts.lockScalingY = false; - dlayer.opts.lockUniScaling = false; - dlayer.opts.selectable = true; - dlayer.opts.evented = true; - dlayer.opts.usekeyboard = true; - } else if( dlayer.opts.changeable === false ){ - dlayer.opts.hasControls = false; - dlayer.opts.hasRotatingPoint = false; - dlayer.opts.hasBorders = false; - dlayer.opts.lockMovementX = true; - dlayer.opts.lockMovementY = true; - dlayer.opts.lockRotation = true; - dlayer.opts.lockScalingX = true; - dlayer.opts.lockScalingY = true; - dlayer.opts.lockUniScaling = true; - dlayer.opts.selectable = false; - dlayer.opts.evented = false; - dlayer.opts.usekeyboard = false; - } - // short-hand for allowing group and individual selections - if( dlayer.opts.selectable ){ - dlayer.opts.canvas.selection = true; - } - // are mouse callbacks defined in the opts object? - if( dlayer.opts.onmousedown || dlayer.opts.onmouseup || - dlayer.opts.onmousemove || dlayer.opts.tooltip || - dlayer.opts.onmouseover || dlayer.opts.onmouseout ){ - dlayer.opts.evented = true; - if( dlayer.opts.onmousedown ){ - dlayer.canvas.on("mouse:down", (opts) => { - if( dlayer.display.image && opts.target ){ - let target = opts.target; - // nb: target might be a polygon anchor => no params - let params = target.params; - // set click state but ignore unchangeable regions - if( !params || (params && params.changeable !== false) ){ - // on main window, set region click - if( dlayer.dtype === "main" ){ - dlayer.display.image.clickInRegion = true; - dlayer.display.image.clickInLayer = layerName; - } - dlayer.opts.onmousedown.call(dlayer.canvas, - dlayer.display.image, - target.pub, - opts.e, target); - } - } else { - // only allow fabric selection if we have special key down - dlayer.canvas._selection = dlayer.canvas.selection; - if( dlayer.canvas.selection ){ - dlayer.canvas.selection = JS9.specialKey(opts.e); - } - } - }); - } else { - dlayer.canvas.on("mouse:down", (opts) => { - // only allow fabric selection if we have special key down - dlayer.canvas._selection = dlayer.canvas.selection; - if( dlayer.canvas.selection ){ - dlayer.canvas.selection = JS9.specialKey(opts.e); - } - }); - } - if( dlayer.opts.onmouseup ){ - dlayer.canvas.on("mouse:up", (opts) => { - if( dlayer.display.image && opts.target ){ - dlayer.opts.onmouseup.call(dlayer.canvas, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - // restore original selection state - dlayer.canvas.selection = dlayer.canvas._selection || - dlayer.canvas.selection; - }); - } else { - dlayer.canvas.on("mouse:up", () => { - // restore original selection state - dlayer.canvas.selection = dlayer.canvas._selection || - dlayer.canvas.selection; - }); - } - if( dlayer.opts.onmousemove ){ - dlayer.canvas.on("mouse:move", (opts) => { - if( dlayer.display.image && opts.target ){ - dlayer.opts.onmousemove.call(dlayer.canvas, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - } - if( dlayer.opts.onmouseover ){ - dlayer.canvas.on("mouse:over", (opts) => { - if( dlayer.display.image && opts.target ){ - dlayer.opts.onmouseover.call(dlayer.canvas, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - } - if( dlayer.opts.onmouseout ){ - dlayer.canvas.on("mouse:out", (opts) => { - if( dlayer.display.image && opts.target ){ - dlayer.opts.onmouseout.call(dlayer.canvas, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - } - if( dlayer.opts.onmousedblclick ){ - dlayer.canvas.on("mouse:dblclick", (opts) => { - if( dlayer.display.image && opts.target ){ - dlayer.opts.onmousedblclick.call(dlayer.canvas, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - } - if( dlayer.opts.tooltip ){ - dlayer.canvas.on("mouse:over", (opts) => { - if( dlayer.display.image && opts.target ){ - JS9.tooltip(opts.target.left+opts.target.width+2, - opts.target.top+opts.target.height+2, - dlayer.opts.tooltip, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - dlayer.canvas.on("mouse:out", (opts) => { - if( dlayer.display.image && opts.target ){ - JS9.tooltip(opts.target.left, opts.target.top, - null, - dlayer.display.image, - opts.target.pub, - opts.e, opts.target); - } - }); - } - } else { - dlayer.canvas.on("mouse:down", (opts) => { - // only allow fabric selection if we have special key down - dlayer.canvas._selection = dlayer.canvas.selection; - if( dlayer.canvas.selection ){ - dlayer.canvas.selection = JS9.specialKey(opts.e); - } - }); - dlayer.canvas.on("mouse:up", () => { - // restore original selection state - dlayer.canvas.selection = dlayer.canvas._selection || - dlayer.canvas.selection; - }); - } - // object modified - dlayer.canvas.on("object:modified", (opts) => { - let o, i, olen, myWidth, myHeight; - const objs = []; - // sanity check - if( !opts.target ){ return; } - o = opts.target; - // update deltas to connected parents - JS9.Fabric.updateChildren(dlayer, o, "deltas"); - // might have to sort overlapping shapes by size - if( dlayer.opts.sortOverlapping ){ - o.setCoords(); - // find objects which intersect with this one - dlayer.canvas.forEachObject( (obj) => { - if( obj === o ){ - return; - } - if( o.intersectsWithObject(obj) ){ - myWidth = obj.getScaledWidth(); - myHeight = obj.getScaledHeight(); - objs.push({obj: obj, siz: myWidth * myHeight}); - } - }); - // any intersecting shapes? - if( !objs.length ){ - return; - } - myWidth = o.getScaledWidth(); - myHeight = o.getScaledHeight(); - // add current shape to array - objs.push({obj: o, siz: myWidth * myHeight}); - // sort in order of increasing size - objs.sort((a, b) => { - // using <= instead of < preserves order for = - if( a.siz <= b.siz ){ - return -1; - } else { - return 1; - } - }); - // re-order so smaller objects are in front - olen = objs.length; - for(i=0; i { - let o; - // sanity check - if( !opts.target ){ return; } - o = opts.target; - o.rescaleEvenly(); - o.rescaleBorder(); - JS9.Fabric.updateChildren(dlayer, o, "scaling"); - if( (o.type === "activeSelection") || (o.type === "group") ){ - shupdate(o, "scaling"); - } - }); - dlayer.canvas.on("object:moving", (opts) => { - let o; - // sanity check - if( !opts.target ){ return; } - o = opts.target; - JS9.Fabric.updateChildren(dlayer, o, "moving"); - if( (o.type === "activeSelection") || (o.type === "group") ){ - shupdate(o, "moving"); - } - }); - dlayer.canvas.on("object:rotating", (opts) => { - let o; - // sanity check - if( !opts.target ){ return; } - o = opts.target; - JS9.Fabric.updateChildren(dlayer, o, "rotating"); - if( (o.type === "activeSelection") || (o.type === "group") ){ - shupdate(o, "rotating"); - } - }); - // selection created: add anchors to polygon - dlayer.canvas.on("selection:created", (opts) => { - let obj; - if( JS9.globalOpts.skipSelectionProcessing ){ return; } - if( opts.target ){ - // fabric v4 - obj = opts.target; - if( obj.type === "activeSelection" || - (obj.type === "group" && !obj.params) ){ - selmultion(dlayer, opts, obj); - } else { - selon(dlayer, obj); - } - } else if( opts.selected && opts.selected.length ){ - // fabric v5 - if( opts.selected.length === 1 ){ - obj = opts.selected[0]; - selon(dlayer, obj); - } else { - selmultion(dlayer, opts); - } - } - }); - // selection updated (adding a region to the current selection): - // add anchors to polygon - dlayer.canvas.on("selection:updated", (opts) => { - let obj; - if( JS9.globalOpts.skipSelectionProcessing ){ return; } - if( opts.target ){ - // fabric v4 - obj = opts.target; - if( obj.type === "activeSelection" || - (obj.type === "group" && !obj.params) ){ - selmultion(dlayer, opts, obj); - } else { - selon(dlayer, obj); - } - } else if( opts.selected && opts.selected.length ){ - // fabric v5 - if( opts.selected.length === 1 ){ - obj = opts.selected[0]; - selon(dlayer, obj); - } else { - selmultion(dlayer, opts); - } - } - }); - // selection cleared - // v5: why does this work differently from the selection: events above??? - // (i.e. still utilizes obj.target instead of obj.selected) - dlayer.canvas.on("before:selection:cleared", (opts) => { - let obj; - if( JS9.globalOpts.skipSelectionProcessing ){ return; } - // sanity check - if( !opts.target ){ return; } - obj = opts.target; - if( obj.type === "activeSelection" || - (obj.type === "group" && !obj.params) ){ - selmultioff(dlayer, opts); - } else { - seloff(dlayer, obj); - } - }); - // if canvas moves (e.g. light window), calcOffset must be called ... - // there is no good cross-browser way to track an element changing, - // (advice is to set a timer!) so we just check when the mouse enters the - // div, because this is when the user will interact with some shape - // only do this if we are in a light window - if( dlayer.divjq.closest(JS9.lightOpts[JS9.LIGHTWIN].drag).length ){ - if( fabric.isTouchSupported ){ - dlayer.divjq.on("touchstart", () => {dlayer.canvas.calcOffset();}); - } else { - dlayer.divjq.on("mouseenter", () => {dlayer.canvas.calcOffset();}); - } - } - return dlayer; -}; - -// --------------------------------------------------------------------------- -// Shape prototype additions to JS9 Image class -// --------------------------------------------------------------------------- - -// showShapeLayer: if mode is true, layer is displayed, otherwise hidden -// also an internal call which uses {local: true} to maybe hide/show layers -// call using image context -JS9.Fabric.showShapeLayer = function(layerName, mode, opts){ - let jobj, xkey, layer, dlayer, canvas, objects, olen, obj; - let left = 0; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return; } - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse showShapeLayer opts: ${opts}`, e); } - } - canvas = layer.canvas; - dlayer = this.display.layers[layerName]; - // no args: return show mode - if( JS9.isNull(mode) ){ - return layer.show; - } - if( mode === true || mode === "true" ){ - // restore and show layer - if( !opts.local ){ - layer.show = true; - // for non-internal show/hide, exit if we are not displaying image - if( this !== this.display.image ){ - return; - } - } - // restore selection property - if( layer.show ){ - canvas.selection = layer.opts.canvas.selection; - } - if( layer.json && layer.show ){ - canvas.loadFromJSON(layer.json, () => { - let key, tdlayer, obj; - // update objects for parents and children - JS9.Fabric.updateChildren(layer.dlayer, null, "objects"); - // translate these shapes if we resized while hidden - if( this.resize ){ - canvas.getObjects().forEach( (o) => { - o.left += this.resize.left; - o.top += this.resize.top; - o.setCoords(); - }); - canvas.calcOffset(); - } - layer.zindex = Math.abs(layer.zindex); - dlayer.divjq.css("z-index", layer.zindex); - // unselect selected objects in lower-zindex groups - for( key of Object.keys(this.layers) ){ - if( (layerName !== key) && this.layers[key].show ){ - tdlayer = this.display.layers[key]; - if( tdlayer.divjq.css("z-index") < layer.zindex ){ - obj = tdlayer.canvas.getActiveObject(); - if( obj ){ - JS9.Fabric.removePolygonAnchors(tdlayer, - obj); - if( tdlayer.canvas.getActiveObject() ){ - tdlayer.canvas.discardActiveObject(); - } - } - } - } - } - this.restoreSelection(layerName); - }); - } - // remove resize object if we have no more hidden layers - for( xkey of Object.keys(this.layers) ){ - if( this.layers[xkey].json ){ - left++; - } - } - if( !left ){ - this.resize = null; - } - // plugin callbacks - this.xeqPlugins("shape", "onshapelayershow", layerName); - } else { - // for non-internal show/hide, exit if we are not displaying image - if( !opts.local ){ - if( this !== this.display.image ){ - layer.show = false; - return; - } - } - // save and hide layer - if( layer.show ){ - // can't use forEachObject, which loops in ascending order, - // because removing anchors changes the array destructively - objects = canvas.getObjects(); - olen = objects.length; - while( olen-- ){ - obj = objects[olen]; - if( obj.params ){ - if( obj.params.winid ){ - obj.params.winid.close(); - obj.params.winid = null; - } - if( obj.params.anchors ){ - JS9.Fabric.removePolygonAnchors(layer.dlayer, obj); - } - } - } - jobj = canvas.toJSON(layer.dlayer.el); - layer.json = JSON.stringify(jobj); - this.saveSelection(layerName); - canvas.selection = false; - // push towards the bottom of the pile - if( dlayer ){ - layer.zindex = -Math.abs(layer.zindex); - dlayer.divjq.css("z-index", layer.zindex); - } - canvas.clear(); - } - if( !opts.local ){ - layer.show = false; - } - // plugin callbacks - this.xeqPlugins("shape", "onshapelayerhide", layerName); - } - return this; -}; - -// display all layers for the current image (save previous) -// call using image context -JS9.Fabric.displayShapeLayers = function(){ - let key; - // if prev and cur are the same, just exit - if( this === this.display.image ){ - return; - } - // this.display.image still points to the previously loaded image - // save old layers - if( this.display.image && this.display.image.layers ){ - for( key of Object.keys(this.display.image.layers) ){ - this.display.image.showShapeLayer(key, false, {local: true}); - } - } - // "this" points to the current image: display new layers - if( this.layers ){ - for( key of Object.keys(this.layers) ){ - this.showShapeLayer(key, true, {local: true}); - } - } -}; - -// toggle display of active layers for the current image (save previous) -// call using image context -JS9.Fabric.toggleShapeLayers = function(){ - let key, layer; - if( this.toggleLayers ){ - // toggleLayers => we are currently hidden, so display them - for( key of Object.keys(this.layers) ){ - layer = this.layers[key]; - if( layer && this.toggleLayers[key] ){ - this.showShapeLayer(key, true); - } - } - delete this.toggleLayers; - } else { - // no toggleLayers => we are currently displayed, so hide them - this.toggleLayers = {}; - for( key of Object.keys(this.layers) ){ - if( key === "crosshair" ){ - continue; - } - layer = this.layers[key]; - if( layer && layer.show && layer.dlayer.dtype === "main" ){ - this.toggleLayers[key] = true; - this.showShapeLayer(key, false); - } - } - } -}; - -// retrieve (and initialize, if necessary) a shape layer -// call using image context -// eslint-disable-next-line no-unused-vars -JS9.Fabric.getShapeLayer = function(layerName, opts){ - let dlayer, layer; - // sanity check - if( !layerName ){ return null; } - layer = this.layers[layerName]; - // create new layer, if necessary - if( !layer ){ - // check for display layer, which is required - dlayer = this.display.layers[layerName]; - if( !dlayer ){ - return null; - } - // make a new image display layer - this.layers[layerName] = {}; - // create new layer for this image - layer = this.layers[layerName]; - // assume we show this layer - layer.show = true; - // no shapes yet - layer.nshape = 0; - // backlink to display layer - layer.dlayer = dlayer; - // convenient link back to opts - layer.opts = layer.dlayer.opts; - // convenient link back to canvas - layer.canvas = layer.dlayer.canvas; - // recalculate offset -- why is this necessary?? - layer.canvas.calcOffset(); - } - // return layer - return layer; -}; - -// use zindex to make specified shape layer the active layer -// call using image context -JS9.Fabric.activeShapeLayer = function(s){ - let i, j, a, key, layer, tlayer, ozindex, tzindex, rtn; - if( !s ){ - // no args: return layer with highest zindex - for( key of Object.keys(this.layers) ){ - tlayer = this.layers[key]; - if( tlayer.dlayer.dtype === "main" ){ - if( (tzindex === undefined) || (tlayer.zindex > tzindex) ){ - tzindex = tlayer.zindex; - a = key; - } - } - } - // return highest zindex layer - rtn = a; - } else if( $.isArray(s) ){ - // non-public internal call: array of layers was specified - // set zindex for layers in decreasing order - for(i=0, j=this.zlayer-1; i { - let tkey, ctags, color; - tagcolors = tagcolors || {}; - // look through the color keys for exact match - for( tkey of Object.keys(tagcolors) ){ - ctags = tkey.split("_"); - // see if all elements match - if( $(tags).not(ctags).length === 0 && - $(ctags).not(tags).length === 0 ){ - color = tagcolors[tkey]; - break; - } - } - // look through color keys for subset match - if( !color ){ - for( tkey of Object.keys(tagcolors) ){ - ctags = tkey.split("_"); - if( $(tags).not(ctags).length === 0 ){ - color = tagcolors[tkey]; - break; - } - } - } - // look through color keys for superset match - if( !color ){ - for( tkey of Object.keys(tagcolors) ){ - ctags = tkey.split("_"); - if( $(ctags).not(tags).length === 0 ){ - color = tagcolors[tkey]; - break; - } - } - } - // final attempt: use existing object's color or a default color - color = color || (obj && obj.get("stroke")) || - tagcolors.defcolor || JS9.globalOpts.defcolor || "#000000"; - return color; - }; - // opts is optional - opts = opts || {}; - // remove means nothing else matters - if( opts.remove ){ - return {remove: opts.remove}; - } - // remove dangerous options (e.g., passed in JS9.GetRegions() object) - parent = opts.parent || (obj && obj.params && obj.params.parent); - delete opts.parent; - if( !opts.restoreid ){ - delete opts.id; - } - delete opts.restoreid; - // initialize tags - nparams.tags = []; - // pre-processing special keys - if( opts.tags ){ - if( typeof opts.tags === "string" ){ - tags = opts.tags.toLowerCase().split(","); - // modes: source, background, include, exclude, etc - for(i=0; i= 3 ){ - opts.wcssys = arr[2]; - } - } - // ra and dec are in degrees, using the current wcs - if( this.validWCS() && JS9.notNull(opts.ra) && JS9.notNull(opts.dec) ){ - // make sure we have the right wcssys - if( opts.wcssys ){ - // from passed-in opts - owcssys = this.getWCSSys(); - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - this.setWCSSys(opts.wcssys, false); - } else if( opts._wcssys ){ - // local override from parseRegions - owcssys = this.getWCSSys(); - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - this.setWCSSys(opts._wcssys, false); - // no longer needed or wanted - delete opts._wcssys; - } - // convert wcs supplied as strings - if( typeof opts.ra === "string" ){ - opts.ra = JS9.saostrtod(opts.ra); - if( JS9.isHMS(this.params.wcssys) ){ - opts.ra *= 15.0; - } - } - if( typeof opts.dec === "string" ){ - opts.dec = JS9.saostrtod(opts.dec); - } - // convert to image coords - arr = JS9.wcs2pix(this.raw.wcs, opts.ra, opts.dec).trim().split(/ +/); - // restore original wcssys - if( owcssys ){ - this.setWCSSys(owcssys, false); - JS9.globalOpts.xeqPlugins = txeq; - } - // convert to display coords - pos = this.imageToDisplayPos({x: parseFloat(arr[0]), - y: parseFloat(arr[1])}); - nopts.left = pos.x; - nopts.top = pos.y; - } - // look for primitives - if( (opts.left !== undefined) ){ - nopts.left = opts.left; - } - if( (opts.top !== undefined) ){ - nopts.top = opts.top; - } - // last gasp to get left and top (unless explicitly told not to) - if( nopts.left === undefined && opts.noLeftTop !== true ){ - if( obj && (obj.left !== undefined) ){ - nopts.left = obj.left; - } else { - nopts.left = this.display.canvasjq.attr("width") / 2 - 1; - } - } - if( nopts.top === undefined && opts.noLeftTop !== true ){ - if( obj && (obj.top !== undefined) ){ - nopts.top = obj.top; - } else { - // why is this fudge needed? - nopts.top = this.display.canvasjq.attr("height") / 2 - 1 + YFUDGE; - } - } - // relative movement requires opts left/top or an existing object - if( opts.deltax ){ - nopts.left += opts.deltax; - } - if( opts.deltay ){ - nopts.top -= opts.deltay; - } - // set scaling based on zoom factor - if( this.display.layers[layerName].dtype === "main" && - !opts.preservedcoords ){ - zoom = this.rgb.sect.zoom; - } else { - zoom = 1; - } - // look for reset directives (empty strings) - if( opts.strokeDashes === "" || opts.strokeDashArray === "" ){ - opts.strokeDashArray = []; - } - if( opts.strokeWidth === "" ){ - opts.strokeWidth = JS9.Fabric.opts.strokeWidth; - } - // shape-specific processing - switch(opts.shape){ - case "annulus": - nparams.radii = []; - if( opts.radii !== undefined ){ - if( typeof opts.radii === "string" ){ - nparams.radii = opts.radii.replace(/ /g, "").split(","); - for(i=0, j=0; i { - switch(item){ - case "top": - case "left": - case "width": - case "height": - case "radii": - case "radius": - case "rx": - case "ry": - case "angle": - case "panzoom": - case "iradius": - case "oradius": - case "nannuli": - case "aradius1": - case "aradius2": - case "configURL": - case "sortOverlapping": - case "tagcolors": - case "pts": - case "ptshape": - case "ptsize": - case "linepoints": - case "polypoints": - case "responseType": - case "display": - case "tags": - case "r1": - case "r2": - case "x": - case "y": - case "dx": - case "dy": - case "px": - case "py": - case "ra": - case "dec": - case "shape": - case "parent": - case "rtn": - case "_wcssys": - case "file": - case "savefile": - case "savewhich": - case "saveformat": - case "saveselection": - case "savewcs": - case "sortids": - case "send": - case "listonchange": - case "multitext": - return false; - case "text": - if( opts.shape === "text" ){ - return false; - } - return true; - case "editing": - return opts.editing; - default: - return true; - } - }); -}; - -// if shape is not text but text is specified in the opts, -// make a text shape as a child of this shape -// call using image context -JS9.Fabric._handleChildText = function(layerName, s, opts){ - let i, t, dpos, npos, topts, yoff, child; - const textht = 12; - // region layer only, for now - if( layerName !== "regions" ){ - return; - } - // opts are optional - opts = opts || {}; - if( (s.params.shape !== "text") && opts.text && - (!s.params.children || !s.params.children.length) ){ - yoff = (s.height * s.scaleX / 2) - textht; - // default position for text (might be overridden by textOpts) - if( Math.abs(s.angle) < 0.000001 ){ - dpos = {x: s.left, y: s.top - yoff}; - } else { - dpos = JS9.rotatePoint({x: s.left, y: s.top - yoff}, - s.angle, {x: s.left, y: s.top}); - } - npos = this.displayToImagePos(dpos); - topts = {x: npos.x, y: npos.y, angle: -s.angle, - color: s.stroke, text: opts.text, tags: s.params.tags, - parent: "TBD", rtn: "object"}; - if( opts.textOpts ){ - topts = $.extend(true, {}, topts, opts.textOpts); - } - // create the child shape - t = this.addShapes(layerName, "text", topts); - // parent object keeps track of relationship between parent and child - t.params.parent = {id: s.params.id, - obj: s, - dleft: s.left - t.left, - dtop: s.top - t.top, - lastscalex: s.scaleX, - lastscaley: s.scaleY, - lastangle: s.angle, - textheight: textht}; - // updateShape was skipped in addShapes because parent was TBD - // we can now updateShape with parent info ... - this._updateShape(layerName, t, null, "child", t.params); - // since strokeWidth changes with zoom, we need to save the opts - // and restore it on export - if( opts.strokeWidth !== undefined ){ - t.params.parent.strokeWidth = opts.strokeWidth; - } - // text might be moved off default position already - if( (npos.x !== topts.x) || (npos.y !== topts.y) ){ - t.params.parent.moved = true; - } - // flag if text RA and Dec were passed in textOpts - if( opts.textOpts && - opts.textOpts.ra !== undefined && - opts.textOpts.dec !== undefined ){ - t.params.hasTextOpts = true; - } - // parent has another child - s.params.children.push({id: t.params.id, obj: t}); - // update the parent - this._updateShape(layerName, s, null, "addchild", s.params); - } else if( s.params.children && s.params.children.length > 0 && - (JS9.notNull(opts.text) || - JS9.notNull(opts.textOpts) || - JS9.notNull(opts.color)) ){ - // process parameters passed to existing text children - for(i=0; i 0 ){ - this.changeShapes(layerName, child.params.id, topts); - } - } - } -}; - -// add shapes to a layer -// call using image context -JS9.Fabric.addShapes = function(layerName, shape, myopts){ - let i, sobj, sarr, carr, ns, s, bopts, opts, layer, canvas, dlayer; - let zoom, ttop, tleft, tangle, w2, h2, key; - let params = {}; - let rarr = [], parr = []; - const objs = []; - const grp = {}; - // is this core service disabled? - if( $.inArray("regions", this.params.disable) >= 0 && - layerName === "regions" ){ - return; - } - // optional myopts can be an object or a string - myopts = myopts || {}; - // opts can be an object or json - if( typeof myopts === "string" ){ - try{ myopts = JSON.parse(myopts); } - catch(e){ JS9.error(`can't parse shape opts: ${myopts}`, e); } - } - // delay adding the region, if this image is not the one being displayed - if( this.display.image !== this ){ - this.delayedShapes = this.delayedShapes || []; - this.delayedShapes.push({layer: layerName, shape: shape, - mode: "add", opts: myopts}); - return; - } - // remove old regions, if necessary (ie we are reloading the file) - if( myopts.file && JS9.globalOpts.reloadRefreshReg ){ - try{ this.removeShapes("regions", myopts.file); } - catch(e){ /* empty */ } - } - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer || !layer.show ){ return; } - canvas = layer.canvas; - // figure out the first arg - if( typeof shape === "string" ){ - // look for a region string - s = this.parseRegions(shape, myopts); - if( typeof s === "string" ){ - // nope, normal shape string - sarr = [{shape: s}]; - } else { - // parsed array of shape objects from regions string - sarr = s; - } - } else if( $.isArray(shape) ){ - sarr = shape; - } else if( typeof shape === "object" ){ - sarr = [shape]; - } else { - return; - } - // once a shape has been added, we can set the zindex to process events - if( JS9.isNull(layer.zindex) || Number.isNaN(layer.zindex) ){ - if( this.display.layers[layerName].dtype === "main" ){ - switch(layerName){ - case JS9.Crosshair.LAYERNAME: - case JS9.Grid.LAYERNAME: - // these should never cover any other interactive layer - layer.zindex = 1; - break; - default: - // otherwise this layer goes to the top - layer.zindex = this.zlayer++; - break; - } - } else { - // layer is not in main display - layer.zindex = JS9.SHAPEZINDEX; - } - dlayer = this.display.layers[layerName]; - dlayer.divjq.css("z-index", layer.zindex); - // we can now call the shape layer create plugin callbacks - this.xeqPlugins("shape", "onshapelayercreate", layerName); - } - // baseline opts - bopts = $.extend(true, {}, JS9.Fabric.opts, layer.opts, myopts); - // process each shape object - for(ns=0; ns= 0 ){ - opts.centeredScaling = false; - } - // create the shape - switch(sobj.shape){ - case "annulus": - // save shape - params.shape = "annulus"; - // save group position - ttop = opts.top; - tleft = opts.left; - // individual radii in the group are at 0,0 - opts.top = 0; - opts.left = 0; - rarr = []; - if( params.radii ){ - for(i=0; i { - let groupid; - // ordinary shapes - if( o.params ){ - // but not child shapes - if( !o.params.parent ){ - JS9.tmp.regSelect.all.push(o.params.id); - } - } else if( o.type === "group" ){ - // groups - groupid = this.lookupGroup(o); - if( groupid ){ - JS9.tmp.regSelect.all.push(groupid); - } - } - }); - try{ - regSelect.parse(selection); - } - catch(e){ - JS9.error(`parsing selection filter: ${selection}`, e); - } - if( opts.saveselection && selection ){ - switch(selection.trim()){ - case "all": - case "saved": - case "selected": - break; - default: - this.layers[layerName].selection = selection; - break; - } - } - selection = JS9.tmp.regSelect.ids; - delete JS9.tmp.regSelect; - return selection; -}; - -// select one of more shapes by id or tag and execute a callback -// call using image context -JS9.Fabric._selectShapes = function(layerName, selection, opts, cb){ - let i, j, objects, olen, aobjects, alen, groups; - let id, ginfo, canvas, ocolor, tag, obj; - const used = []; - const xcb = (obj, ginfo) => { - if( $.inArray(obj, used) < 0 ){ - cb.call(this, obj, ginfo); - used.push(obj); - } - } - const getshapes = (objects) => { - let got, obj, olen; - // sanity check - if( !objects ){ return []; } - // get objects, including objects inside groups, which themselves - // can be within groups ... (hence the do/while loop) - olen = objects.length; - do{ - got = 0; - while( olen-- ){ - obj = objects[olen]; - // replace group with objects inside the group - if( obj.type === "group" && !obj.params ){ - objects.splice(olen, 1, ...obj.getObjects()); - got++; - } - } - olen = objects.length; - } while( got ); - return objects; - }; - const getgroups = (canvas, objects) => { - let i, j, obj, grp, olen, mlen, ao; - let mygroups = []; - let groups = []; - olen = objects.length; - // look for all possible groups - for(i=0; i { - let i, tobj; - for(i=0; i { - // but no text children - if( o.params && !o.params.parent ){ - xcb(o, ginfo); - } - }); - } else { - // dangerous case: pass the group object - // you'd better know what you are doing! - xcb(obj, ginfo); - } - } else { - // for some types of selections, we do need to - // look inside the group - obj.forEachObject((o) => { - if( o.params && id === o.params.file ){ - xcb(o, ginfo); - } - }); - } - // that's the entirety of processing we do on a group - continue; - } - // make sure its a valid region - if( !obj.params ){ continue; } - // convenience variables - ocolor = obj.stroke.toLowerCase(); - // no text children unless explicity specified - if( obj.params.parent && id !== "child" && id !== "All" ){ - continue; - } - // children should always have a parent - if( id === "child" && !obj.params.parent ){ - continue; - } - // set group info - ginfo.group = groups[olen]; - // try to match this id in various ways - if( id.toLowerCase() === "all" ){ - // all - xcb(obj, ginfo); - } else if( (id.toLowerCase() === ocolor) || - (JS9.colorToHex(id).toLowerCase() === ocolor) ){ - // color - xcb(obj, ginfo); - } else if( id === obj.params.shape ){ - // shape - xcb(obj, ginfo); - } else if( id === obj.params.file ){ - // origin filename - xcb(obj, ginfo); - } else if( typeof obj.params.data === "object" && - id === obj.params.data.syncid ){ - // sync id (see sync plugin) - xcb(obj, ginfo); - } else if( id === "child" && obj.params.parent ){ - // all - xcb(obj, ginfo); - } else if( id === "dcoords" && obj.params.preservedcoords ){ - // all - xcb(obj, ginfo); - } else if( id === "nodcoords" && !obj.params.preservedcoords ){ - // all - xcb(obj, ginfo); - } else if( id === "parent" && - obj.params.children && - obj.params.children.length ){ - // all - xcb(obj, ginfo); - } else if( $.inArray(id, JS9.wcssyss) >= 0 && - obj.params.wcsconfig && - obj.params.wcsconfig.wcssys === id ){ - // original wcs - xcb(obj, ginfo); - } else if( obj.params.tags ){ - // tags - for(i=0; i remove selection for this layer - if( shape === "reset" ){ - // remove last selection - delete layer.selection; - // change selection to none? - if( opts.activateselection !== false ){ - // deselect current active object, if necessary - if( canvas.getActiveObject() ){ - canvas.discardActiveObject(); - } - // re-display so we don't see the old group - canvas.renderAll(); - } - return this; - } - // collect the specified shapes - this._selectShapes(layerName, shape, opts, (obj) => { - // only select once, don't select shapes in groups - if( $.inArray(obj, arr) < 0 && (!obj.params || !obj.params.groupid) ){ - arr.push(obj); - } - }); - if( arr.length ){ - // deselect current active object, if necessary - if( canvas.getActiveObject() ){ - canvas.discardActiveObject(); - } - if( arr.length === 1 ){ - // select 1 shape - selection = arr[0]; - } else { - // create a group selection of 2+ shapes - selection = new fabric.ActiveSelection(arr, { - canvas: canvas - }); - } - // make this the active selection - canvas.setActiveObject(selection); - // display the new group - canvas.renderAll(); - } - return this; -}; - -// remove shapes from a group selection -// call using image context -// eslint-disable-next-line no-unused-vars -JS9.Fabric.unselectShapes = function(layerName, shape, opts){ - let layer, unshape, selection; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer || !this.layers[layerName] ){ return; } - // default is to unselect everything - if( !shape || shape === "all" || shape === "selected" ){ - return this.selectShapes(layerName, "reset"); - } - selection = this.layers[layerName].selection || "selected"; - unshape = `${selection} && !(${shape})`; - return this.selectShapes(layerName, unshape, opts); -}; - -// update public object in shapes -// call using image context -JS9.Fabric.updateShapes = function(layerName, shape, mode, opts){ - // process the specified shapes - this._selectShapes(layerName, shape, null, (obj, ginfo) => { - this._updateShape(layerName, obj, ginfo, mode, opts); - }); - return this; -}; - -// update multi-selection dialog boxes -// call using image context -JS9.Fabric._updateMultiDialogs = function(setmode){ - // update multiselect dialog box for this image, if necessary - $("form[class*='regionsConfigForm']").each((index, element) => { - const multi = $(element).data("multi"); - const winid = $(element).data("winid"); - const im = $(element).data("im"); - if( multi && winid && im === this ){ - if( im.tmp.updateMulti !== false ){ - im.initRegionsForm(null, {winid, multi, setmode}); - } - } - }); -}; - -// primitive to update one shape -// call using image context -JS9.Fabric._updateShape = function(layerName, obj, ginfo, mode, opts){ - let i, s, scalex, scaley, px, py, tval1, tval2, angstr; - let bin, zoom, tstr, dpos, gpos, ipos, npos, objs, olen, radius, oangle; - let opos, dist, txeq, owcssys, imforce, agroup, apos; - const pub = {}; - const layer = this.layers[layerName]; - const moderexp = /^(child||export|unexport|move|mouseout)$/; - const tr = (x) => { return x.toFixed(2); }; - const tr4 = (x) => { return x.toFixed(4); }; - const updatewcs = (wcs, layer, pub, regstr, angstr, opts, obj) => { - let i, s, v0, v1; - // get ra and dec of central position - s = JS9.pix2wcs(wcs, pub.x, pub.y).trim().split(/\s+/); - obj.rastr = s[0]; - obj.decstr = s[1]; - obj.wcssys = s[2]; - v0 = JS9.strtoscaled(s[0]); - if( JS9.isHMS(s[2], v0.dtype) ){ - v0.dval *= 15.0; - } - v1 = JS9.strtoscaled(s[1]); - obj.ra = v0.dval; - obj.dec = v1.dval; - // generate WCS strings iff updateWCS is true - if( (opts.updateWCS !== false) && - (opts.updateWCS || layer.opts.updateWCS) ){ - obj.wcsstr = JS9.reg2wcs(wcs, regstr, JS9.REGSIZE) - .replace(/;$/, ""); - // add angle to line, if possible - if( pub.shape === "line" && angstr ){ - obj.wcsstr = obj.wcsstr.replace(/} *$/, angstr + "}"); - } - // wcs size args - s = obj.wcsstr.replace(/.*\(/,"").replace(/\).*/,"").split(","); - for(i=0; i { - let xname; - const xeq = (onchange) => { - try{ - this.params.xeqonchange = false; - JS9.xeqByName(onchange, window, this, pub); - } - catch(e){ - JS9.log("error in onchange: %s [%s]\n%s", - this.id, e.message, JS9.strace(e)); - } - finally{ - this.params.xeqonchange = true; - } - }; - if( !obj.params.parent && !mode.match(moderexp) ){ - // when xeqonchange is set on a layer - if( this.params.xeqonchange && layer.show ){ - if( layer.opts.onchange ){ - xeq(layer.opts.onchange); - } else if( layerName === "regions" && - JS9.Regions.opts.onchange ){ - // if onchange was set after region layer was set up - xeq(JS9.Regions.opts.onchange); - } - } - // plugin callbacks: these have the form on[layer]change, - // e.g. onregionschange - xname = `on${layerName}change`; - this.xeqPlugins("shape", xname, pub); - } - }; - // sanity check - if( !obj || !obj.params ){ return; } - // convenience variables - ginfo = ginfo || {}; - opts = opts || {}; - mode = mode || "update"; - // set scaling based on zoom factor - if( this.display.layers[layerName].dtype === "main" && - !obj.params.preservedcoords ){ - zoom = this.rgb.sect.zoom; - } else { - zoom = 1; - } - // fill in the blanks - pub.mode = mode; - pub.id = obj.params.id; - pub.groupid = obj.params.groupid; - pub.shape = obj.params.shape; - pub.layer = layerName; - pub.color = obj.color || obj.stroke; - pub.tags = obj.params.tags; - pub.sticky = obj.params.sticky; - pub.preservedcoords = obj.params.preservedcoords; - if( obj.params.ignore ){ - pub.ignore = true; - } - if( obj.params.parent ){ - pub.parent = obj.params.parent.obj.params.id; - } else { - pub.parent = null; - } - if( obj.params.children && obj.params.children.length ){ - // for now, just output the first one (cf. listRegions) - pub.child = obj.params.children[0].id; - } else { - pub.child = null; - } - dpos = obj.getCenterPoint(); - gpos = {x: 0, y: 0}; - if( ginfo.group ){ - // in a group, the display pos is relative to group pos, - // so we need to add them together - gpos = ginfo.group.getCenterPoint(); - dpos = {x: gpos.x + (dpos.x * ginfo.group.scaleX), - y: gpos.y + (dpos.y * ginfo.group.scaleY)}; - // also need to rotate the position by the group angle - if( ginfo.group.angle ){ - dpos = JS9.rotatePoint(dpos, ginfo.group.angle, gpos); - } - // is the group contained in an active selection?? - if( ginfo.group.type !== "activeSelection" ){ - agroup = layer.canvas.getActiveObject(); - if( agroup && agroup.type === "activeSelection" ){ - objs = agroup.getObjects(); - olen = objs.length; - for(i=0; i= 360 ){ - pub.angle -= 360; - } - // the parts of the obj.scale[XY] values related to size (not zoom, binning) - scalex = obj.scaleX / zoom; - scaley = obj.scaleY / zoom; - if( ginfo.group ){ - scalex *= ginfo.group.scaleX; - scaley *= ginfo.group.scaleY; - } - switch(pub.shape){ - case "annulus": - pub.shape = "annulus"; - pub.radii = []; - if( pub.imsys !== "image" ){ - pub.lcs.radii = []; - } - pub.imstr = `annulus(${tr(px)},${tr(py)},`; - tstr = `annulus ${pub.x} ${pub.y} `; - objs = obj.getObjects(); - olen = objs.length; - for(i=0; i 0 ){ - pub.imstr += ","; - tstr += " "; - } - // get current point - npos = this.displayToImagePos( - {x: gpos.x + obj.left + obj.points[i].x * obj.scaleX, - y: gpos.y + obj.top + obj.points[i].y * obj.scaleY} - ); - // add rotation - npos = JS9.rotatePoint(npos, oangle, {x: pub.x, y: pub.y}); - if( pub.imsys === "image" ){ - pub.imstr += `${tr(npos.x)},${tr(npos.y)}`; - } else { - const {x, y} = this.imageToLogicalPos(npos); - pub.imstr += `${tr(x)},${tr(y)}`; - pub.lcs.pts.push({x, y}); - } - tstr += `${npos.x} ${npos.y}`; - pub.pts.push(npos); - if( pub.shape === "line" ){ - if( i === 0 ){ - dist = 0; - } else { - opos = pub.pts[i-1]; - dist += Math.sqrt(((npos.x - opos.x) * (npos.x - opos.x)) + - ((npos.y - opos.y) * (npos.y - opos.y))); - } - } - } - if( pub.shape === "line" && JS9.notNull(dist) ){ - pub.imstr += `) {"size":${tr(dist)},"units":"pixels"`; - // if only two points, add angle between them - if( pub.pts.length === 2 ){ - tval1 = Math.atan2(pub.pts[1].y - pub.pts[0].y, - pub.pts[1].x - pub.pts[0].x) * 180 / Math.PI; - while( tval1 < 0 ){ tval1 += 360; } - angstr = `,"posang":${tr4(tval1)},"posunits":"degrees"`; - pub.imstr += angstr; - } - pub.imstr += "}"; - } else { - pub.imstr += ")"; - } - // points already have the angle incorporated into them - pub.angle = 0; - break; - case "text": - pub.imstr = `text(${tr(px)},${tr(py)},"${obj.text}",${tr4(pub.angle)})`; - tstr = `text ${pub.x} ${pub.y} "${obj.text}"` + ` ${pub.angle * Math.PI / 180.0}`; - pub.text = obj.text; - break; - default: - break; - } - // wcs processing - if( this.validWCS() ){ - updatewcs(this.raw.wcs, layer, pub, tstr, angstr, opts, pub); - if( mode !== "export" && - obj.params.wcsconfig && obj.params.wcsconfig.wcssys ){ - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - owcssys = this.getWCSSys(); - if( JS9.notWCS(obj.params.wcsconfig.wcssys) ){ - pub.wcsconfig = $.extend(true, {}, obj.params.wcsconfig); - } else { - this.setWCSSys(obj.params.wcsconfig.wcssys, false); - updatewcs(this.raw.wcs, layer, pub, tstr, angstr, opts, - obj.params.wcsconfig); - pub.wcsconfig = $.extend(true, {}, obj.params.wcsconfig); - } - this.setWCSSys(owcssys, false); - JS9.globalOpts.xeqPlugins = txeq; - } - } - // generic "data" property, optionally supplied when the shape is created - pub.data = obj.params.data; - // save the pub object - obj.set("pub", pub); - // update dialog box, if necessary - if( obj.params.winid ){ - if( $(obj.params.winid).is(":visible") ){ - this.initRegionsForm(obj); - } else { - obj.params.winid = null; - } - } - // stop here if no callbacks were requested - if( opts.nocb ){ - return pub; - } - // callbacks for regions - xplugins(); - // post processing: - // copy to clipboard, if necessary - if( layerName === "regions" && JS9.globalOpts.regToClipboard ){ - switch(mode){ - case "update": - i = pub.parent || pub.id; - break; - default: - i = null; - break; - } - if( JS9.notNull(i) ){ - // ignore any problems - try{ s = this.listRegions(i, {mode: 1, includedcoords: true}); } - catch(e){ s = null; } - if( s ){ JS9.clipboard = s; } - } - } - // update multi dialog boxes, if necessary - if( layerName === "regions" && mode === "wcs" ){ - this._updateMultiDialogs(true); - } - // and return it - return pub; -}; - -// lookup a group, either by name or by object -// groupObj = this.lookupGroup(groupID) -// groupID = this.lookupGroup(groupObj) -JS9.Fabric.lookupGroup = function(group, layerName){ - let i, j, objs, obj, sobjs, sobj, layer, canvas; - layerName = layerName||"regions"; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return null; } - canvas = this.layers[layerName].canvas; - if( typeof group === "string" ){ - objs = canvas.getObjects(); - for(i=0; i 0 ){ - this.display.displayMessage("regions", grpstr); - } - return grpstr.replace(/;\s*/g, "\n").replace(/\n\n$/, "\n"); -}; - -// create a quasi-permanent group from selected shapes -// call using image context -// eslint-disable-next-line no-unused-vars -JS9.Fabric.groupShapes = function(layerName, shape, opts){ - let i, s, layer, dlayer, canvas, obj, id, skip, dupid; - const objs = []; - const pubs = []; - const getid = (opts) => { - let i = 1; - let id = opts.groupid || `group_${i}`; - while( this.lookupGroup(id) ){ - i = i+1; - id = id.replace(/_[0-9][0-9]*$/, "") + `_${i}`; - } - return id; - }; - // get layer - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return 0; } - // dlayer - dlayer = layer.dlayer; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse groupShapes opts: ${opts}`, e); } - } - // convenience variable - canvas = layer.canvas; - // id for this group - id = getid(opts); - // collect the specified shapes - this._selectShapes(layerName, shape, opts, (obj) => { - if( $.inArray(obj, objs) < 0 ){ - // so far, so goodx - skip = false; - // look for conflicts - if( obj.params.groupid ){ - switch(JS9.globalOpts.regGroupConflict){ - case "skip": - // save id of the conflicting group - dupid = obj.params.groupid; - // flag to skip adding to new group - skip = true; - break; - case "error": - default: - s = sprintf("%s can only be a member of one group [%s,%s]", - layerName === "regions" ? "regions" : "shapes", - obj.params.id, obj.params.groupid); - JS9.error(s); - break; - } - } - // save for group, if necessary - if( !skip ){ - obj.params.groupid = id; - if( $.inArray("groupid", obj.params.exports) < 0 ){ - obj.params.exports.push("groupid"); - } - // save object - objs.push(obj); - pubs.push(obj.pub); - // save children (i.e., text) - // (but not pub, since don't call ongroupcreate on text) - if( obj.params && obj.params.children.length ){ - for(i=0; i= 0 ){ - shape.params.exports.splice(idx, 1); - } - } - } - } - } - // remove id from groups - if( this.groups[layerName] ){ - idx = $.inArray(groupid, this.groups[layerName]); - if( idx >= 0 ){ - this.groups[layerName].splice(idx, 1); - } - } - - return this; -}; - -// remove the active shape -// eslint-disable-next-line no-unused-vars -JS9.Fabric.removeShapes = function(layerName, shape, opts){ - let i, layer, canvas, ao; - let undoao = false; - const lopts = {mode: 1, includedcoords: true, sortids: false}; - const arr = []; - const grp = []; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return; } - canvas = layer.canvas; - // opts is optional - opts = opts || {}; - // list active objects - if( canvas.getActiveObject() ){ - ao = canvas.getActiveObjects(); - } - // save regions for unremove? - if( layerName === "regions" && JS9.globalOpts.unremoveReg ){ - this.regstack.push(this.listRegions(shape, lopts, layerName)); - if( this.regstack.length > JS9.globalOpts.unremoveReg ){ - this.regstack = this.regstack.slice(0,JS9.globalOpts.unremoveReg); - } - } - // process the specified shapes - this._selectShapes(layerName, shape, opts, (obj, ginfo) => { - let i, child, parent; - if( (obj.params.removable !== false || opts.overrideRemovable) && - (!obj.params.sticky || opts.sticky !== false) ){ - if( layer.dlayer.dtype === "main" ){ - this._updateShape(layerName, obj, ginfo, "remove"); - } - // clear any dialog box - if( obj.params.winid ){ - obj.params.winid.close(); - obj.params.winid = null; - } - // unlink parent - if( obj.params.parent ){ - parent = obj.params.parent.obj; - for(i=parent.params.children.length-1; i>=0; i--){ - if( obj === parent.params.children[i].obj ){ - parent.params.children.splice(i,1); - break; - } - } - } - // mark children for removal - for(i=0; i= 0 ){ - undoao = true; - } - // mark for removal - arr.push(obj); - } - }); - // discard active object if we are deleting one of its shapes - // do before delete, as per: http://fabricjs.com/v2-breaking-changes-2 - if( undoao ){ - canvas.discardActiveObject(); - } - // remove groups - for(i=0; i { - // public part of the shape - myshape = obj.pub || {}; - // might need shape object itself - if( opts.includeObj ){ - myshape.obj = obj; - } - shapes.push(myshape); - }); - // sort shapes by id to maintain original order of creation - if( opts.sortids !== false ){ - shapes.sort((a, b) => { return (a.id||0) - (b.id||0); }); - } - return shapes; -}; - -// change the specified shape(s) -// call using image context -JS9.Fabric.changeShapes = function(layerName, shape, opts){ - let i, s, sobj, bopts, layer, canvas, ao, aos, rlen, maxr, zoom, exports; - let topts, xopts; - const orad = [], cpts = []; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer || !opts ){ return; } - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse shape opts: ${opts}`, e); } - } - // delay changing the region, if this image is not the one being displayed - if( this.display.image !== this ){ - this.delayedShapes = this.delayedShapes || []; - this.delayedShapes.push({layer: layerName, shape: shape, - mode: "change", opts: opts}); - return; - } - canvas = layer.canvas; - // active object - ao = canvas.getActiveObject(); - if( ao && ao.type === "activeSelection" ){ - // save and temporarily remove a selected group - // fabric.js doesn't deal with this very well - aos = canvas.getActiveObjects() - canvas.discardActiveObject(); - canvas.renderAll(); - ao = null; - } - // this selection is usually saved - if( JS9.isNull(opts.saveselection) ){ opts.saveselection = true; } - // process the specified shapes - this._selectShapes(layerName, shape, opts, (obj, ginfo) => { - // set scaling based on zoom factor - if( this.display.layers[layerName].dtype === "main" && - !obj.params.preservedcoords ){ - zoom = this.rgb.sect.zoom; - } else { - zoom = 1; - } - // combine the objects parameters with the new options - // clearing some of the old ones first to avoid conflicts - if( opts.radii ){ - obj.params.radii = []; - } - if( opts.tags ){ - obj.params.tags = []; - } - if( opts.locked !== undefined ){ - delete obj.params.changeable; - } - // combine new opts with old opts - bopts = $.extend(true, {}, obj.params, opts); - // parse options and generate new obj and params - sobj = this._parseShapeOptions(layerName, bopts, obj); - // remove means remove specified shapes or all shapes - if( sobj.remove ){ - if( sobj.remove === true || sobj.remove === "true" ){ - sobj.remove = "all"; - } - if( sobj.remove !== false && sobj.remove !== "false" ){ - this.removeShapes(layerName, sobj.remove || "all"); - return; - } - } - // get new option names to export when saving regions - exports = this._exportShapeOptions(opts).filter( (item) => { - return !{}.hasOwnProperty.call(obj.params.exports, item); - }); - sobj.params.exports = obj.params.exports.concat(exports); - // if stroke (color) is defined, we probably need to convert it to hex - if( sobj.opts.stroke ){ - sobj.opts.color = sobj.opts.stroke; - sobj.opts.stroke = JS9.colorToHex(sobj.opts.stroke); - } - // shape-specific pre-processing - switch(obj.params.shape){ - case "text": - // can't use stroke, use fill instead - if( sobj.opts.stroke ){ - sobj.opts.fill = sobj.opts.stroke; - } - sobj.opts.strokeWidth = 0; - break; - case "line": - case "polygon": - // if we are changing the points, reset the fabric angle - // otherwise, it's applied to points which know nothing about it - if( sobj.opts.points && sobj.opts.points.length ){ - obj.angle = 0; - } - break; - } - // change the shape - obj.set(sobj.opts); - // reestablish params object - obj.params = $.extend(false, {}, obj.params, sobj.params); - // if strokeWidth is specified, we change params.sw1, - // which will be used by the rescaleBorder routine below - if( sobj.opts.strokeWidth ){ - obj.params.sw1 = sobj.opts.strokeWidth; - } - // shape-specific post-processing - // mainly: change of size => remove size-based scaling factor - switch(obj.params.shape){ - case "annulus": - if( opts.radii && opts.radii.length ){ - // remove existing annuli - // can't remove inside the forEachObject loop - obj.forEachObject( (tobj) => { orad.push(tobj); }); - // so do it outside the loop - rlen = orad.length; - for(i=0; i { - xopts = $.extend(true, {}, topts); - if( cpts[idx] ){ xopts.points = cpts[idx]; } - tobj.set(xopts); - }); - break; - case "ellipse": - if( opts.r1 ){ - obj.rx = obj.params.r1; - obj.scaleX = zoom; - // this sets the width of the control box - // why is it not done automatically??? - obj.width = obj.rx * 2; - } - if( opts.r2 ){ - obj.ry = obj.params.r2; - obj.scaleY = zoom; - // this sets the height of the control box - // why is it not done automatically??? - obj.height = obj.ry * 2; - } - break; - case "line": - case "polygon": - if( (opts.points && opts.points.length) || - (opts.pts && opts.pts.length) ){ - obj.scaleX = zoom; - obj.scaleY = zoom; - } - if( ao === obj ){ - JS9.Fabric.removePolygonAnchors(layer.dlayer, obj); - JS9.Fabric.addPolygonAnchors(layer.dlayer, obj); - } - // reset the center point - JS9.resetPolygonCenter(obj); - break; - case "text": - if( opts.text ){ - obj.params.text = opts.text; - } - break; - } - // make sure border width is correct - obj.rescaleBorder(); - // non-changeable shapes go to back - if( obj.params.changeable === false ){ - canvas.sendToBack(obj); - } - // send region to front or back of set of overlapping regions - switch(sobj.opts.send){ - case "front": - canvas.bringToFront(obj); - if( ao === obj ){ - canvas.discardActiveObject(); - } - break; - case "back": - canvas.sendToBack(obj); - if( ao === obj ){ - canvas.discardActiveObject(); - } - break; - default: - break; - } - // update children - JS9.Fabric.updateChildren(layer.dlayer, obj, "moving"); - JS9.Fabric.updateChildren(layer.dlayer, obj, "scaling"); - JS9.Fabric.updateChildren(layer.dlayer, obj, "rotating"); - // update child's parent deltas - JS9.Fabric.updateChildren(layer.dlayer, obj, "deltas"); - // and reset coords - obj.setCoords(); - // might need to make a text shape as a child of this shape - this._handleChildText(layerName, obj, opts); - // update the shape info and make callbacks - this._updateShape(layerName, obj, ginfo, "update"); - // callback if necessary - if( opts.onchangeshapes && obj.pub ){ - try{ JS9.xeqByName(opts.onchangeshapes, this, this, obj.pub); } - catch(e){ JS9.error("in onchangeshapes callback", e, false); } - } - }); - // reconstitute the selected group, if necessary - if( aos ){ - this.selectShapes(layerName, aos); - } - // redraw (unless explicitly specified otherwise) - if( (opts.redraw === undefined) || opts.redraw ){ - canvas.renderAll(); - } - return this; -}; - -// update shape layer after a change in panning, zooming, binning -// uses ListRegions to recreate regions, very stable but slow for many shapes -// call using image context -JS9.Fabric.refreshShapes = function(layerName){ - let regstr, owcssys, txeq, opts; - // sanity check - if( !layerName ){ return; } - // convenience variables - opts = { - mode:1, - sticky:false, - ignoreignore:true, - saveediting:true, - savewcsconfig:true, - sortids: false, - saveid:true - }; - // temporarily turn off plugin execution to avoid firing regions callbacks - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - // temporarily change wcs system to be independent of image coords - // (in case we copied regions from one image to another) - owcssys = this.getWCSSys(); - if( owcssys === "image" ){ - // get a wcs sys independent of image coords - if( this.validWCS() ){ - this.setWCSSys("native", false); - } else { - this.setWCSSys("physical", false); - } - } - // special optimization when panning an image with the mouse, - // to deal with slow panning a large number of regions - if( this.tmp.panzoomRefresh && this.tmp.panzoomRefresh[layerName] ){ - if( !this.tmp.panzoomRefresh[layerName].regstr ){ - // save current regions - regstr = this.listRegions("all", opts, layerName); - this.tmp.panzoomRefresh[layerName] = {regstr:regstr, refresh:false}; - // remove current regions (including unremovable ones) - this.removeShapes(layerName, "all", {overrideRemovable: true, - sticky: false}); - } else { - if( this.tmp.panzoomRefresh[layerName].refresh ){ - regstr = this.tmp.panzoomRefresh[layerName].regstr; - // add back regions in current configuration - this.addShapes(layerName, regstr, {restoreid: true}); - } - } - } else { - // get current regions (i.e., before update to current configuration) - regstr = this.listRegions("all", opts, layerName); - if( regstr ){ - // save selection (remove shapes destroys it) - this.saveSelection(layerName); - // remove current regions (including unremovable ones) - this.removeShapes(layerName, "all", {overrideRemovable: true, - sticky: false}); - // add back regions in current configuration - this.addShapes(layerName, regstr, {restoreid: true, - sortids: false}); - // restore selection - this.restoreSelection(layerName); - } - } - // restore wcs system, if necessary - if( owcssys === "image" ){ - this.setWCSSys(owcssys, false); - // update shapes to use the original coord system - this.updateShapes(layerName, "all", "refresh"); - } - // restore plugin execution - JS9.globalOpts.xeqPlugins = txeq; - return this; -}; - -// copy one or more shapes to another image -// call using image context -JS9.Fabric.copyShapes = function(layerName, to, which){ - let i, im, s, opts, layer; - const ims = []; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return; } - if( typeof to === "object" ){ - ims.push(to); - } else if( to === "all" ){ - for(i=0; i (Math.PI * 2) ){ - angle -= Math.PI * 2; - } - pos.x = Math.cos(angle) * local.x - Math.sin(angle) * local.y; - pos.y = Math.sin(angle) * local.x + Math.cos(angle) * local.y; - //Get the list of points from the polygon - points = obj.points; - //The algorithm is simple, iterate through the list of points - //and select a pair which forms a side of the polygon. - //For this side, pick a main point. Find the direction vector - //with respect to this main point, and find the position vector - //from this main point to the drag position. - //Dot product of position vector and direction vector give us - //the projection of the point on the current side. - //A simple bounds checking to ensure the projection is on - //the side, then a distance calculation. - //If the distance found is less than the current minimum difference - //update diff, newX and newY. - for(i=0; i p2.x ? p1.x : p2.x); - maxY = (p1.y > p2.y ? p1.y : p2.y); - //Select p2 as the main point. - //Find the direction vector and normalize it. - dir = {x: p1.x - p2.x, y: p1.y - p2.y}; - m = Math.sqrt(dir.x*dir.x + dir.y*dir.y); - if( m !== 0 ){ - dir.x = dir.x/m; - dir.y = dir.y/m; - } - //Find the position vector - pVec = {x: pos.x - p2.x, y: pos.y - p2.y}; - //Dot product - dot = pVec.x * dir.x + pVec.y * dir.y; - //Find the projection along the current side - p = {x: p2.x + dir.x * dot, y: p2.y + dir.y * dot}; - //Bounds checking to ensure projection remains - //between the point pair. - if( p.x < minX ){ - p.x = minX; - } else if( p.x > maxX ){ - p.x = maxX; - } - if( p.y < minY ){ - p.y = minY; - } else if( p.y > maxY ){ - p.y = maxY; - } - //Distance calculation. - d = (p.x-pos.x) * (p.x-pos.x) + (p.y-pos.y) * (p.y-pos.y); - //Minimum comparison. - if( d < diff ){ - diff = d; - newpt.x = p.x; - newpt.y = p.y; - if( i === points.length ){ - newpt.i = 0; - } else { - newpt.i = i; - } - } - } - // get canvas - layer = this.getShapeLayer(layerName); - // remove anchors - JS9.Fabric.removePolygonAnchors(layer.dlayer, obj); - // add the new point into the points array - points.splice(newpt.i+1, 0, {x: newpt.x, y: newpt.y}); - - // making this the active object will recreate the anchors - switch(obj.type){ - case "polyline": - case "polygon": - JS9.Fabric.addPolygonAnchors(layer.dlayer, obj); - layer.dlayer.canvas.renderAll(); - break; - } - // set currently selected shape - if( obj.polyparams ){ - layer.dlayer.params.sel = obj.polyparams.polygon; - } else if( obj.params ){ - layer.dlayer.params.sel = obj; - } -}; - -// remove the specified point -// call using image context -JS9.Fabric._removePolygonPoint = function(layerName, obj){ - let layer, polygon, points, pt; - // sanity check - if( !obj || !obj.polyparams ){ return; } - // get info on this point - polygon = obj.polyparams.polygon; - points = polygon.points; - // maintain minimum number of points - if( (polygon.type === "polygon") && (points.length <= 3) ){ - return; - } else if( (polygon.type === "polyline") && (points.length <= 2) ){ - return; - } - pt = obj.polyparams.point; - // delete to stop an executing movePoint callback - delete obj.polyparams.point; - // get layer - layer = this.getShapeLayer(layerName); - // remove anchors - JS9.Fabric.removePolygonAnchors(layer.dlayer, polygon); - // add the new point into the points array - points.splice(pt, 1); - // reset the center point - JS9.resetPolygonCenter(polygon); - // making this the active object will recreate the anchors - layer.canvas.setActiveObject(polygon); -}; - -// add anchors to a polygon -// don't need to call using image context -JS9.Fabric.addPolygonAnchors = function(dlayer, obj){ - let i, a; - let pos = {}; - const canvas = dlayer.canvas; - const movePoint = (obj) => { - let anchor, poly, pt, points, im; - // anchor changed location to obj.transform.target in v4.5.1 - if( obj.target && obj.target.polyparams ){ - anchor = obj.target; - } else if( obj.transform && - obj.transform.target && obj.transform.target.polyparams ){ - anchor = obj.transform.target; - } - // sanity check - if( !anchor ){ return; } - // this is the polygon associated with this anchor - poly = anchor.polyparams.polygon; - // if the polygon is not changeable, just return - if( poly.params.changeable === false ){ - return; - } - // these are the points in the polygon - points = poly.get("points"); - // this is the point id associated with this anchor - pt = anchor.polyparams.point; - // if pt is not valid, just return - if( pt === undefined || points[pt] === undefined ){ - return; - } - // new point for this anchor relative to center - // NB: anchor was rotated onto the vertex - if( poly.angle ){ - pos = JS9.rotatePoint({x: anchor.left, y: anchor.top}, -poly.angle, - {x: poly.left, y: poly.top}); - } else { - pos.x = anchor.left; - pos.y = anchor.top; - } - // move the polygon point to the anchor (in unscaled coords) - points[pt].x = (pos.x - poly.left) / poly.scaleX; - points[pt].y = (pos.y - poly.top) / poly.scaleY; - // reset the center point - JS9.resetPolygonCenter(poly); - // update the shape info - if( dlayer.display.image ){ - im = dlayer.display.image; - im._updateShape(poly.params.layerName, poly, null, "update"); - if( im.params.listonchange || poly.params.listonchange ){ - im.listRegions(poly, {mode: 2}); - } - } - // redraw - canvas.renderAll(); - }; - const moveAnchors = (obj) => { - let ii; - let tpos = {}; - // change anchor positions - for(ii=0; ii { - moveAnchors(obj); - }); - obj.on("rotating", () => { - moveAnchors(obj); - }); - obj.on("scaling", () => { - moveAnchors(obj); - }); - obj.setCoords(); -}; - -// remove anchors from a polygon -// don't need to call using image context -JS9.Fabric.removePolygonAnchors = function(dlayer, shape){ - let i; - const canvas = dlayer.canvas; - if( shape && shape.params && shape.params.anchors ){ - // need to be able to remove anchors when locking a polygon - // if( shape.params.changeable === false ){ - // return; - // } - // remove all anchors - for(i=0; i { return b.radius - a.radius; }); - // add circle for edit - for(i=0; i { - if( o.params && o.params.shape === "circle" ){ - circles.push(o); - } - }); - // will hold new radii - opts.radii = []; - // ids of circles - ids = [...this.editAnnulus.ids]; - // for each id, find the circle object and get its radius - // (what we're looking for is likely at the end of the stack) - for(j=circles.length-1; j>=0; j--){ - cid = circles[j].params.id; - for(i=ids.length-1; i>=0; i--){ - id = ids[i]; - if( cid === id ){ - // if pub.radius is epsilon, change back to 0 - if( circles[j].pub.radius === epsilon ){ - circles[j].pub.radius = 0; - } - opts.radii.push(circles[j].pub.radius); - ids.splice(i, 1); - break; - } - } - if( !ids.length ){ - break; - } - } - opts.radii.sort((a, b) => { return a - b; }); - } - // change the annulus - this.changeShapes(layerName, this.editAnnulus.annulus, opts); - // remove the edit circles - this.removeShapes(layerName, this.editAnnulus.ids); - // remove current edit parameters - delete this.editAnnulus; -}; - -// update child regions -// don't need to call using image context -JS9.Fabric.updateChildren = function(dlayer, shape, type){ - let i, o, p, child, nangle, npos, pangle, objects, olen, got; - let tdleft, tdtop; - let x = {}; - // region layer only, for now - if( dlayer.layerName !== "regions" ){ - return; - } - // re-init objects within for parents and children - if( type === "objects" ){ - // get list of top-level objects, replacing groups with their objects - objects = dlayer.canvas.getObjects().reverse(); - olen = objects.length; - do{ - got = 0; - while( olen-- ){ - o = objects[olen]; - // replace group with objects inside the group - if( o.type === "group" && !o.params ){ - objects.splice(olen, 1, ...o.getObjects()); - got++; - } - } - olen = objects.length; - } while( got ); - // first get a list of parents and children - objects.forEach( (o) => { - if( o.params ){ - if( o.params.parent || o.params.children.length ){ - x[o.params.id] = o; - } - } - }); - // then re-assign obj pointers to parents and children - objects.forEach( (o) => { - if( o.params ){ - if( o.params.parent ){ - o.params.parent.obj = x[o.params.parent.id]; - } - for(i=0; i= 360 ){ - pangle -= 360; - } - nangle = pangle - p.lastangle; - npos = JS9.rotatePoint({x: child.left,y: child.top}, - nangle, - {x: shape.left, y: shape.top}); - child.left = npos.x; - child.top = npos.y; - p.dleft = shape.left - child.left; - p.dtop = shape.top - child.top; - child.angle = child.angle + nangle; - while( child.angle < 0 ){ - child.angle += 360; - } - while( child.angle >= 360 ){ - child.angle -= 360; - } - p.lastangle = pangle; - break; - case "scaling": - p.dleft = p.dleft * (shape.scaleX / p.lastscalex); - p.dtop = (p.dtop - p.textheight) * - (shape.scaleY / p.lastscaley) + p.textheight; - p.lastscalex = shape.scaleX; - p.lastscaley = shape.scaleY; - p.moved = true; - child.left = shape.left - p.dleft; - child.top = shape.top - p.dtop; - break; - } - child.setCoords(); - if( dlayer.display.image ){ - dlayer.display.image.updateShapes(dlayer.layerName, child, - "updatechild"); - } - } -}; - -// reset center of a polygon -// don't need to call using image context -JS9.resetPolygonCenter = function(poly){ - let i, ndx, ndy, dobj, calcDim, dx, dy; - let tpos = {}; - // deltas to center - dobj = poly._calcDimensions(); - dx = (dobj.left + (dobj.width / 2)) * poly.scaleX; - dy = (dobj.top + (dobj.height / 2)) * poly.scaleY; - // new center - if( poly.angle ){ - tpos = JS9.rotatePoint( - {x: poly.left + dx, y: poly.top + dy}, - poly.angle, - {x: poly.left, y: poly.top} - ); - } else { - tpos.x = poly.left + dx; - tpos.y = poly.top + dy; - } - - // move points relative to new center - // required by polygon changes starting in fabric 1.5.x - ndx = dx / poly.scaleX; - ndy = dy / poly.scaleY; - for(i=0; i

    `; - // add layers - for( key of Object.keys(this.layers) ){ - layer = this.layers[key]; - // output (showing) layers attached to the main display - if( layer.dlayer.dtype === "main" && layer.show ){ - html += `${divstr}${layer.dlayer.canvas.toSVG()}
    `; - } - } - // add colorbar, if necessary - if( (opts.colorbar === undefined) || opts.colorbar ){ - pinst = this.display.pluginInstances.JS9Colorbar; - if( pinst && pinst.isActive() ){ - // separate from main display - yoff += 2; - // colorbar canvas - dataURL = pinst.colorbarjq[0].toDataURL("image/png"); - yoff += this.display.height; - divstr = sprintf(divtmpl, xoff, yoff); - html += `${divstr}
    `; - if( pinst.textjq && pinst.textjq[0] ){ - // colorbar text/tickmarks canvas - dataURL = pinst.textjq[0].toDataURL("image/png"); - yoff += pinst.colorbarjq.height() + 1; - divstr = sprintf(divtmpl, xoff, yoff); - // need to rescale the text ... argh!!! - html += `${divstr}
    `; - } - } - } - // finish up - html += ""; - // this is needed since v9 ... why??? - if( window.electron ){ - winurl = "data:text/html," + html; - } - // make a new window containing a blank URL - win = window.open(winurl, this.id, winopts); - if( !win ){ - JS9.error("could not create print window (check your pop-up blockers)"); - return; - } - // open DOM for writing - if( win.document ){ - // open it (not strictly necessary but ...) - win.document.open(); - // overwrite the doc with our html - win.document.write(html); - // must close! - win.document.close(); - } else { - JS9.error("no method available for drawing image into print window"); - } -}; - -// incorporate these graphics routines into JS9 -JS9.Fabric.initGraphics = function(){ - // display methods - JS9.Display.prototype.newShapeLayer = JS9.Fabric.newShapeLayer; - // image shape methods - JS9.Image.prototype._selectShapes = JS9.Fabric._selectShapes; - JS9.Image.prototype._updateShape = JS9.Fabric._updateShape; - JS9.Image.prototype._parseShapes = JS9.Fabric._parseShapes; - JS9.Image.prototype._parseShapeOptions = JS9.Fabric._parseShapeOptions; - JS9.Image.prototype._exportShapeOptions = JS9.Fabric._exportShapeOptions; - JS9.Image.prototype._handleChildText = JS9.Fabric._handleChildText; - JS9.Image.prototype._addPolygonPoint = JS9.Fabric._addPolygonPoint; - JS9.Image.prototype._removePolygonPoint = JS9.Fabric._removePolygonPoint; - JS9.Image.prototype._ungroupAnnulus = JS9.Fabric._ungroupAnnulus; - JS9.Image.prototype._regroupAnnulus = JS9.Fabric._regroupAnnulus; - JS9.Image.prototype._updateMultiDialogs = JS9.Fabric._updateMultiDialogs; - JS9.Image.prototype.addShapes = JS9.Fabric.addShapes; - JS9.Image.prototype.updateShapes = JS9.Fabric.updateShapes; - JS9.Image.prototype.getShapes = JS9.Fabric.getShapes; - JS9.Image.prototype.changeShapes = JS9.Fabric.changeShapes; - JS9.Image.prototype.removeShapes = JS9.Fabric.removeShapes; - JS9.Image.prototype.refreshShapes = JS9.Fabric.refreshShapes; - JS9.Image.prototype.copyShapes = JS9.Fabric.copyShapes; - JS9.Image.prototype.selectShapes = JS9.Fabric.selectShapes; - JS9.Image.prototype.unselectShapes = JS9.Fabric.unselectShapes; - JS9.Image.prototype.groupShapes = JS9.Fabric.groupShapes; - JS9.Image.prototype.ungroupShapes = JS9.Fabric.ungroupShapes; - JS9.Image.prototype.listGroups = JS9.Fabric.listGroups; - JS9.Image.prototype.lookupGroup = JS9.Fabric.lookupGroup; - JS9.Image.prototype.saveSelection = JS9.Fabric.saveSelection; - JS9.Image.prototype.restoreSelection = JS9.Fabric.restoreSelection; - // shape layer methods - JS9.Image.prototype.getShapeLayer = JS9.Fabric.getShapeLayer; - JS9.Image.prototype.showShapeLayer = JS9.Fabric.showShapeLayer; - JS9.Image.prototype.activeShapeLayer = JS9.Fabric.activeShapeLayer; - JS9.Image.prototype.displayShapeLayers = JS9.Fabric.displayShapeLayers; - JS9.Image.prototype.toggleShapeLayers = JS9.Fabric.toggleShapeLayers; - // print method which know about shapes - JS9.Image.prototype.print = JS9.Fabric.print; -}; - -// initialize graphics to use Fabric -JS9.Fabric.initGraphics(); - -/* - * mouse/touch module (May 19, 2016) - */ - -// create our namespace, and specify some meta-information and params -JS9.MouseTouch = {}; -JS9.MouseTouch.CLASS = "JS9"; // class of plugin -JS9.MouseTouch.NAME = "MouseTouch"; // name of this plugin -JS9.MouseTouch.WIDTH = 512; // width of light window -JS9.MouseTouch.HEIGHT = 220; // height of light window -JS9.MouseTouch.BASE = JS9.MouseTouch.CLASS + JS9.MouseTouch.NAME; - -JS9.MouseTouch.mouseText = []; -JS9.MouseTouch.mouseText[0] = "Move mouse, no buttons pressed:"; -JS9.MouseTouch.mouseText[1] = "Move mouse, primary button pressed:"; -JS9.MouseTouch.mouseText[2] = "Move mouse, secondary button pressed:"; - -JS9.MouseTouch.touchText = []; -JS9.MouseTouch.touchText[0] = "Touch move, with one finger:"; -JS9.MouseTouch.touchText[1] = "Touch move, with two fingers:"; -JS9.MouseTouch.touchText[2] = "Touch move, with three fingers:"; - -JS9.MouseTouch.textHTML="
    %s
    "; - -JS9.MouseTouch.actionHTML="
    %s
    "; - -// get an id based on the action -JS9.MouseTouch.actionid = function(cname, aname){ - return (`${cname}_${aname}`).replace(/[^A-Za-z0-9_]/g, "_"); -}; - -// add to the text descriptions -JS9.MouseTouch.addText = function(container, text){ - let s, divjq; - // create the html for this action - s = sprintf(JS9.MouseTouch.textHTML, text); - // add text html to the text container - divjq = $("
    ") - .addClass(`${JS9.MouseTouch.BASE}Text`) - .html(s) - .appendTo(container); - return divjq; -}; - -// add to the sortable action list -JS9.MouseTouch.addAction = function(container, cname, aname){ - let s, id, divjq; - id = JS9.MouseTouch.actionid(cname, aname); - // create the html for this action - s = sprintf(JS9.MouseTouch.actionHTML, aname); - // add action html to the action container - divjq = $("
    ") - .addClass(`${JS9.MouseTouch.BASE}Action`) - .attr("id", id) - .html(s) - .appendTo(container); - return divjq; -}; - -// display value/position -// eslint-disable-next-line no-unused-vars -JS9.MouseTouch.isPinch = function(im, evt){ - let i, display, dist, pinc, pdec; - const npinch = JS9.globalOpts.pinchWait; - const pthresh = JS9.globalOpts.pinchThresh; - // sanity check - if( !im ){ return -1; } - display = im.display; - if( !JS9.globalOpts.mousetouchZoom || (im.pos.touches.length !== 2) ){ - return -1; - } - switch(display.ispinch ){ - case -1: - case 1: - return display.ispinch; - } - dist = Math.sqrt(((im.pos.touches[0].x - im.pos.touches[1].x) * - (im.pos.touches[0].x - im.pos.touches[1].x)) + - ((im.pos.touches[0].y - im.pos.touches[1].y) * - (im.pos.touches[0].y - im.pos.touches[1].y))); - if( !display.dist0 ){ - display.dist0 = dist; - } - display.deltas.push(Math.floor(dist - display.dist0)); - if( display.deltas.length >= npinch ){ - for(i=1, pinc=0, pdec=0; i display.deltas[i-1] ){ - pinc++; - } else if( display.deltas[i] < display.deltas[i-1] ){ - pdec++; - } - } - if( (pinc >= pthresh) || (pdec >= pthresh) ){ - display.ispinch = 1; - } else { - display.ispinch = -1; - } - display.lastzoom = 0; - return display.ispinch; - } - // not sure yet - return 0; -}; - -// --------------------------------------------------------------------- -// -// MouseTouch.Actions: callbacks when on mouse or touch movement -// -// for mouse: no click, primary click, secondary click -// for touch: 1, 2, or 3 fingers down -// -// the mouseActions and touchActions arrays in JS9.globalOpts determine -// the initial mapping of mouse/touch configuration to callback, e.g.: -// -// JS9.globalOpts.mouseActions = ["display value/position", "change contrast/bias", "pan the image"]; -// -// You can add your own to the Actions object, with titles in mouseText ... -// They are transferred to the display object. -// -// --------------------------------------------------------------------- -JS9.MouseTouch.Actions = {}; - -// display value/position -// eslint-disable-next-line no-unused-vars -JS9.MouseTouch.Actions["display value/position"] = function(im, ipos, evt){ - // special key: do nothing - if( JS9.specialKey(evt) ){ - return; - } - // display pixel and wcs values - if( JS9.globalOpts.internalValPos && im && ipos ){ - if( (ipos.x > 0) && (ipos.y > 0) && - (ipos.x <= im.raw.width) && (ipos.y <= im.raw.height) ){ - im.valpos = im.updateValpos(ipos, true); - } - } -}; - -// change contrast/bias -JS9.MouseTouch.Actions["change contrast/bias"] = function(im, ipos, evt){ - let x, y, pos, display; - // skip contrast/bias change? - if( !JS9.globalOpts.internalContrastBias || !im || !ipos ){ - return; - } - // skip if colormap is static - if( im.cmapObj.type === "static" ){ - return; - } - // convenience variables - display = im.display; - // make sure we moved the mouse a bit - if( im.pos0 && im.pos ){ - if( ((Math.abs(im.pos0.x-im.pos.x) < JS9.NOMOVE) && - (Math.abs(im.pos0.y-im.pos.y) < JS9.NOMOVE)) ){ - return; - } - } - // inside a region or with special key: no contrast/bias - if( im.clickInRegion || JS9.specialKey(evt) ){ - return; - } - // if we have an RGB file or image overlay, no contrast/bias - if( im.useOffScreenCanvas() ){ - return; - } - // get canvas position - pos = JS9.eventToDisplayPos(evt, im.posOffset); - // contrast/bias change - x = Math.floor(pos.x + 0.5); - y = Math.floor(pos.y + 0.5); - // values only from within display window? - if( JS9.globalOpts.containContrastBias ){ - if( (x < 0) || (y < 0) || - (x >= display.canvas.width) || (y >= display.canvas.height) ){ - return; - } - } - im.params.bias = x / display.canvas.width; - im.params.contrast = y / display.canvas.height * 10.0; - // work-around for FF bug, not fixed as of 8/8/2012 - // https://bugzilla.mozilla.org/show_bug.cgi?id=732621 - if( JS9.bugs.firefox_linux ){ - window.setTimeout(() => { - im.displayImage("scaled", {blendMode: false}); - }, 0); - } else { - im.displayImage("scaled", {blendMode: false}); - } - // hack: delete filterRGBImage from stash to avoid restore during reproject - im.xeqStashDiscard("filterRGBImage"); - // extended plugins - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("image", "onchangecontrastbias"); - } -}; - -// stop action for contrast/bias: redisplay image -// eslint-disable-next-line no-unused-vars -JS9.MouseTouch.Actions["change contrast/bias"].stop = function(im, ipos, evt){ - // if blendMode is on, we have to redisplay - if( im.display.blendMode ){ - im.displayImage("rgb"); - } -}; - -// zoom the image -JS9.MouseTouch.Actions["wheel zoom"] = function(im, evt){ - let ozoom, nzoom, maxzoom, key; - let floor = JS9.globalOpts.panzoomRefreshLimit; - let got = 0; - const delta = evt.originalEvent.deltaY * Math.sign(JS9.DIRZOOM); - // sanity check - if( !im ){ return; } - // is scroll to zoom turned on? - if( !JS9.globalOpts.mousetouchZoom ){ - return; - } - // prevent pileup - im.tmp.wheelzooms = im.tmp.wheelzooms || 0; - if( im.tmp.wheelzooms++ % JS9.MODZOOM !== 0 ){ - return; - } - // current zoom - ozoom = im.getZoom(); - // scroll by the delta - if( delta < 0 ){ - nzoom = Math.min(JS9.MAXZOOM, ozoom + JS9.ADDZOOM); - } else { - nzoom = Math.max(JS9.MINZOOM, ozoom - JS9.ADDZOOM); - } - // stop zooming once full image is in the screen? - if( JS9.globalOpts.mousetouchLimit ){ - maxzoom = Math.min(im.display.width/im.raw.width, - im.display.height/im.raw.height); - if( maxzoom > nzoom && ozoom > nzoom ){ - return; - } - } - // a little rounding makes the zoom nicer - nzoom = Math.round((nzoom + 0.00001) * 100) / 100; - // see if any layers have many regions, thus requiring optimization - for( key of Object.keys(im.layers) ){ - if( im.layers[key].show && im.layers[key].opts.panzoom ){ - if( im.layers[key].canvas.size() > floor ){ - im.tmp.panzoomRefresh = im.tmp.panzoomRefresh || {}; - im.tmp.panzoomRefresh[key] = {}; - got++; - } - } - } - // timeout to refresh layers - if( im.tmp.panzoomTimeout ){ - clearTimeout(im.tmp.panzoomTimeout); - delete im.tmp.panzoomTimeout; - } - if( got || im.tmp.panzoomRefresh ){ - im.tmp.panzoomTimeout = setTimeout(() => { - im.refreshLayers(im.tmp.panzoomRefresh); - delete im.tmp.panzoomRefresh; - }, JS9.TIMEOUT); - } - // zoom the image - im.setZoom(nzoom); -}; - -// pan the image -// eslint-disable-next-line no-unused-vars -JS9.MouseTouch.Actions["pan the image"] = function(im, ipos, evt){ - let dx, dy, temp, sect, pos, key; - let thresh = JS9.globalOpts.panMouseThreshold; - let floor = JS9.globalOpts.panzoomRefreshLimit; - // sanity check - if( !im ){ return; } - sect = im.rgb.sect; - // how much would we pan by? - dx = ((im.pos0.x - im.pos.x) / sect.zoom); - dy = ((im.pos0.y - im.pos.y) / sect.zoom); - // pan the image (but avoid a redisplay, if we haven't moved much) - if( Math.abs(dx) >= thresh || Math.abs(dy) >= thresh ){ - // flips will change the pan direction - if( im.params.flip === "x" ){ - dx = -dx; - } else if( im.params.flip === "y" ){ - dy = -dy; - } else if( im.params.flip === "xy" ){ - dx = -dx; - dy = -dy; - } - // rotations will change the pan direction - if( im.params.rot90 === 90 ){ - temp = dx; - dx = -dy; - dy = temp; - } else if( im.params.rot90 === 180 ){ - dx = -dx; - dy = -dy; - } else if( im.params.rot90 === -90 ){ - temp = dx; - dx = dy; - dy = -temp; - } - pos = {x: sect.xcen + dx, y: sect.ycen - dy}; - // rotations will change the pan position - if( im.params.rotate ){ - pos = JS9.rotatePoint(pos, - -im.params.rotate, - {x: sect.xcen, y: sect.ycen}); - } - // see if any layers have many regions, thus requiring optimization - for( key of Object.keys(im.layers) ){ - if( im.layers[key].show && im.layers[key].opts.panzoom ){ - if( im.layers[key].canvas.size() > floor ){ - im.tmp.panzoomRefresh = im.tmp.panzoomRefresh || {}; - im.tmp.panzoomRefresh[key] = {}; - } - } - } - im.setPan(pos); - // reset initial position - im.pos0 = im.pos; - } -}; - -// pinch zoom -// eslint-disable-next-line no-unused-vars -JS9.MouseTouch.Actions.pinch = function(im, ipos, evt){ - let display, dist, nzoom; - // sanity check - if( !im ){ return; } - // is scroll to zoom turned on? - display = im.display; - // get current distance - dist = Math.sqrt(((im.pos.touches[0].x - im.pos.touches[1].x) * - (im.pos.touches[0].x - im.pos.touches[1].x)) + - ((im.pos.touches[0].y - im.pos.touches[1].y) * - (im.pos.touches[0].y - im.pos.touches[1].y))); - nzoom = display.zoom0 * dist / display.dist0; - // a little rounding makes the zoom nicer - nzoom = Math.max(JS9.MINZOOM, Math.min(JS9.MAXZOOM, Math.round((nzoom + 0.00001) * 100) / 100)); - // zoom the image - if( nzoom !== display.lastzoom ){ - im.setZoom(nzoom); - } - display.lastzoom = nzoom; -}; - -// start of mouse/touch action processing -JS9.MouseTouch.Actions.start = function(im, ipos, evt){ - let display, action; - if( im ){ - display = im.display; - display.ispinch = 0; - display.dist0 = 0; - display.zoom0 = im.rgb.sect.zoom; - display.deltas = []; - } - action = JS9.MouseTouch.getAction(im, evt); - // call the start mouse/touch action, if necessary - if( JS9.MouseTouch.Actions[action] && - JS9.MouseTouch.Actions[action].start ){ - JS9.MouseTouch.Actions[action].start(im, im.ipos, evt); - } -}; - -// end of mouse/touch action processing -JS9.MouseTouch.Actions.stop = function(im, ipos, evt){ - const action = JS9.MouseTouch.getAction(im, evt); - // call the stop mouse/touch action, if necessary - if( JS9.MouseTouch.Actions[action] && - JS9.MouseTouch.Actions[action].stop ){ - JS9.MouseTouch.Actions[action].stop(im, im.ipos, evt); - } - return; -}; - -// get action associated with the current clickState -JS9.MouseTouch.getAction = function(im, evt){ - let action, display; - // sanity check - if( !im ){ return action; } - display = im.display; - switch(im.clickState){ - // mouse move actions - case 0: - action = display.mouseActions[0]; - break; - case 1: - action = display.mouseActions[1]; - break; - case 2: - action = display.mouseActions[2]; - break; - // touch event actions - case -1: - action = display.touchActions[0]; - break; - case -2: - switch( JS9.MouseTouch.isPinch(im, evt) ){ - case -1: - action = display.touchActions[1]; - break; - case 0: - // do nothing, no idea if its a pinch yet - break; - case 1: - action = "pinch"; - break; - } - break; - case -3: - action = display.touchActions[2]; - break; - default: - break; - } - return action; -}; - -// execute the mouse/touch action routine -JS9.MouseTouch.action = function(im, evt, action){ - action = action || JS9.MouseTouch.getAction(im, evt); - // call the mouse/touch action - if( action && JS9.MouseTouch.Actions[action] ){ - JS9.MouseTouch.Actions[action](im, im.ipos, evt); - } -}; - -// change zoom mode for this display -JS9.MouseTouch.mousetouchzoom = function(id, target){ - const display = JS9.lookupDisplay(id); - const mode = target.checked; - // change global blink mode - if( display ){ - JS9.globalOpts.mousetouchZoom = mode; - } -}; - -// constructor: add HTML elements to the plugin -JS9.MouseTouch.init = function(){ - let i, s; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id of the div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // create container to hold action container and header - // clean main container - this.divjq.html(""); - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // main container - this.mousetouchContainer = $("
    ") - .addClass(`${JS9.MouseTouch.BASE}Container`) - .attr("id", `${this.id}MouseTouchContainer`) - .appendTo(this.divjq); - s = sprintf("
    Drag an action to reconfigure JS9 mouse/touch events:

    ", `${JS9.MouseTouch.BASE}Header`); - this.mousetouchHeadContainer = $("") - .addClass(`${JS9.MouseTouch.BASE}Container`) - .attr("id", `${this.id}MouseTouchHeadContainer`) - .html(s) - .appendTo(this.mousetouchContainer); - this.mousetouchTextContainer = $("") - .addClass(`${JS9.MouseTouch.BASE}Container`) - .attr("id", `${this.id}MouseTouchTextContainer`) - .appendTo(this.mousetouchContainer); - this.mousetouchActionContainer = $("") - .addClass(`${JS9.MouseTouch.BASE}Container`) - .attr("id", `${this.id}MouseTouchActionContainer`) - .appendTo(this.mousetouchContainer); - if( JS9.TOUCHSUPPORTED ){ - // container to hold text descriptions - this.mousetouchTouchTextContainer = $("

    ") - .addClass(`${JS9.MouseTouch.BASE}TextContainer`) - .attr("id", `${this.id}TouchTextContainer`) - .html("") - .appendTo(this.mousetouchTextContainer); - for(i=0; i") - .addClass(`${JS9.MouseTouch.BASE}ActionContainer`) - .attr("id", `${this.id}TouchContainer`) - .html("") - .appendTo(this.mousetouchActionContainer); - // add touch actions, if necessary - for(i=0; i { - this.oidx = ui.item.index(); - }, - stop: (event, ui) => { - const nidx = ui.item.index(); - const oarr = this.display.touchActions.splice(this.oidx, 1)[0]; - // JS9 action list reflects the sort - this.display.touchActions.splice(nidx, 0, oarr); - delete this.oidx; - } - }); - } - if( !/iPad|iPhone|iPod/.test(navigator.platform) ){ - // container to hold text descriptions - this.mousetouchMouseTextContainer = $("
    ") - .addClass(`${JS9.MouseTouch.BASE}TextContainer`) - .attr("id", `${this.id}MouseTextContainer`) - .appendTo(this.mousetouchTextContainer); - for(i=0; i< 3; i++){ - JS9.MouseTouch.addText.call(this, - this.mousetouchMouseTextContainer, - JS9.MouseTouch.mouseText[i]); - } - for(i=3; i") - .addClass(`${JS9.MouseTouch.BASE}ActionContainer`) - .attr("id", `${this.id}MouseContainer`) - .html("") - .appendTo(this.mousetouchActionContainer); - // add mouse actions, if necessary - for(i=0; i { - this.oidx = ui.item.index(); - }, - stop: (event, ui) => { - const nidx = ui.item.index(); - const oarr = this.display.mouseActions.splice(this.oidx, 1)[0]; - // JS9 action list reflects the sort - this.display.mouseActions.splice(nidx, 0, oarr); - delete this.oidx; - } - }); - } - // add the footer, containing buttons - s = sprintf("

    Use mouse wheel or pinch to zoom:          
    ", `${JS9.MouseTouch.BASE}Footer`, this.display.id); - this.mousetouchFootContainer = $("") - .addClass(`${JS9.MouseTouch.BASE}Container`) - .attr("id", `${this.id}MouseTouchFootContainer`) - .html(s) - .appendTo(this.mousetouchContainer); - // set initial value of scroll - if( JS9.globalOpts.mousetouchZoom ){ - this.mousetouchContainer.find("input").attr("checked", true); - } -}; - - -// --------------------------------------------------------------------- -// Regions object defines high level calls for Regions plugin -// --------------------------------------------------------------------- - -JS9.Regions = {}; -JS9.Regions.CLASS = "JS9"; -JS9.Regions.NAME = "Regions"; - -// defaults for new regions -JS9.Regions.opts = { - // update WCS strings - updateWCS: true, - // pan and zoom enabled - panzoom: true, - tags: "source,include", - strokeWidth: 2, - // annuli: inner and outer radius, number of annuli - iradius: 15, - oradius: 30, - nannuli: 1, - // box - width: 60, - height: 60, - // circle - radius: 30, - // ellipse: - // use r1, r2 to avoid confusion with rad1, rad2 for rounding in boxes! - r1: 30, - r2: 20, - // point - ptshape: "box", - ptsize: 2, - // line - linepoints: [{x: -30, y: 30}, {x:30, y:-30}], - // polygon in display coords - // points: [{x: -30, y: 30}, {x:30, y:30}, {x:30, y:-30}, {x:-30, y: -30}], - polypoints: [{x: -30, y: 30}, {x:30, y:30}, {x:0, y:-30}], - // text - // fontFamily: "Helvetica, sans-serif", - fontFamily: "Helvetica", - fontSize: 14, - fontStyle: "normal", - fontWeight: 300, - textAlign: "left", - // angles (box, ellipse) - angle: 0, - // anchor radii - aradius1: 4, - aradius2: 8, - // region configuration url - configURL: "./params/regionsconfig.html", - // region save url - saveURL: "./params/regionssave.html", - // should overlapping shapes be sorted (smallest on top)? - sortOverlapping: true, - // title for region config dialog box - title: "Edit region", - // no centered scaling for these regions - noCenteredScaling: ["box", "line"], - // colors for tags - // these should be ordered from more specific to less specific - tagcolors: { - include_source: "#00FF00", - exclude_source: "#FF0000", - include_background: "#FFD700", - exclude_background: "#FF8C00", - source: "#00FF00", - background: "#FFD700", - defcolor: "#00FF00" - }, - // mouse double-click processing - onmousedblclick(im, xreg, evt, target){ - let params = target.params; - if( (params && !params.winid && !params.ignore ) || - (!params && target.type === "activeSelection") || - (!params && target.type === "group") ){ - if( JS9.globalOpts.editRegions ){ - im.displayRegionsForm(target); - } - } - return; - }, - // mouse down processing - onmousedown(im, xreg, evt, target){ - let poly; - // nb: target might be a polygon anchor => no params - let params = target.params; - if( JS9.specialKey(evt) ){ - if( params ){ - im._regroupAnnulus(params.layerName, evt); - } - if( target.type === "polygon" || target.type === "polyline" ){ - // add polygon point - im._addPolygonPoint(params.layerName, target, evt); - im._updateShape(params.layerName, target, null, "update"); - } else if( target.polyparams && target.polyparams.polygon ){ - // remove polygon point - poly = target.polyparams.polygon; - im._removePolygonPoint(poly.params.layerName, target); - im._updateShape(poly.params.layerName, poly, null, "update"); - } else if( params && params.shape === "annulus" ){ - im._ungroupAnnulus(params.layerName, target); - } - } - }, - // mouse up processing - onmouseup(){ - let i; - let objs = []; - // one active object - if( this.getActiveObject() ){ - objs.push(this.getActiveObject()); - } - objs.push(this.getActiveObjects()); - // re-select polygon which was just processed - for(i=0; i { - let i, tim; - let objs = []; - if( dlayer.display.image ){ - tim = dlayer.display.image; - // one active object - // group of active objects - objs.push(dlayer.canvas.getActiveObjects()); - // process all active objects - for(i=0; i { - const multi = $(element).data("multi"); - const winid = $(element).data("winid"); - const im = $(element).data("im"); - if( multi && winid && im === this ){ - opts.winid = winid; - im.initRegionsForm(null, opts); - got++; - } - }); - // change title to reflect multi-select, if necessary - title = title.replace(/regions?/, "selected regions"); - // all done if we reinit'ed an existing window - if( got ){ return; } - } - // call this once window is loaded - $(JS9.lightOpts[JS9.LIGHTWIN].topid) - .arrive(".regionsConfigForm", {onceOnly: true}, () => { - opts.firsttime = true; - if( shape && shape.params ){ - this.updateShapes("regions", shape, "wcsconfig"); - } - this.initRegionsForm(shape, opts); - }); - // bring up display window - opts.winid = this.displayAnalysis("regions", s, {title, winformat}); - // save winid, if possible - if( shape && shape.params ){ - shape.params.winid = opts.winid; - } -}; - -// initialize the region config form -// call using image context -JS9.Regions.initConfigForm = function(obj, opts){ - let i, key, val, el, el2, wcssys, twcssys, mover, mout, p1, p2, cmode; - let s, s2, s3, s4, winid, wid, form, otitle, fav, arr, ao, grp, o, objs; - let multi = false; - const wcsinfo = this.raw.wcsinfo || {cdelt1: 1, cdelt2: 1}; - const defobj = { - type: "multi", - pub: {shape: "multi", wcsconfig: {}}, - params: {} - }; - const fmt= (val) => { - if( val === undefined ){ - return undefined; - } - if( (typeof val === "number") && (val % 1 !== 0) ){ - val = Math.round((val + 0.00001) * 10000) / 10000; - } - return(String(val)); - }; - const replaceNewline = (s) => { - const nl = String.fromCharCode(13, 10); - if( typeof s === "string" ){ - return s.replace(/\\n/g, nl); - } - return s; - }; - // which wcssys do we use? edit version, if available - if( obj && obj.pub ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcssys ){ - wcssys = obj.pub.wcsconfig.wcssys; - } else { - wcssys = this.params.wcssys; - } - } else { - wcssys = this.params.wcssys; - // fake obj: makes the checks easier, avoid if( obj ... ) everywhere - obj = defobj; - } - cmode = obj.params.changeable === false; - // opts is optional - opts = opts || {}; - // where to we get winid? - if( obj.params.winid ){ - winid = obj.params.winid; - } else if( opts.winid ){ - winid = opts.winid; - } - // window id is required - if( !winid ){ - return; - } - // find the form, based on winid - wid = $(winid).attr("id"); - // leave trailing space! - form = `#${wid} .regionsConfigForm `; - // valid form is required - if( !$(form).length ){ - return; - } - // if the form is already a multi-select form, keep it that way - if( $(form).data("multi") ){ - multi = true; - } else { - multi = opts.multi; - } - // remove the nodisplay class from shape's div - $(`${form}.${obj.pub.shape}`).each((index, element) => { - $(element).removeClass("nodisplay"); - }); - // fill in form values based on current values in the shape object - $(`${form}.val`).each((index, element) => { - val = ""; - key = $(element).attr("name"); - // key-specific pre-processing - switch(key){ - case "x": - case "y": - if( obj.pub.lcs && obj.pub.lcs[key] !== undefined ){ - val = fmt(obj.pub.lcs[key]); - } else if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - case "radii": - if( obj.pub.radii ){ - if( JS9.notWCS(wcssys) || - !obj.pub.wcsconfig || - !obj.pub.wcsconfig.wcsstr ){ - val = obj.pub.imstr - .replace(/^annulus\(/,"").replace(/\)$/,"") - .split(",").slice(2).join(","); - } else { - val = obj.pub.wcsconfig.wcsstr - .replace(/^annulus\(/,"").replace(/\)$/,"") - .split(",").slice(2).join(","); - } - } - break; - case "pts": - if( obj.pub.pts ){ - obj.pub.pts.forEach( (p) => { - if( val ){ - val += ", "; - } - val += `${p.x.toFixed(2)}, ${p.y.toFixed(2)}`; - }); - } else if( obj.pub.imstr ){ - // use the flat points list instead of the pts object array - val = obj.pub.imstr.replace(/^.*\(/, "").replace(/\)$/, ""); - } - break; - case "linelength": - if( obj.pub.pts && obj.pub.pts.length === 2 ){ - p1 = obj.pub.pts[0]; - p2 = obj.pub.pts[1]; - val = fmt(Math.sqrt((p2.x - p1.x) * (p2.x - p1.x) + - (p2.y - p1.y) * (p2.y - p1.y))); - switch(wcssys){ - case "image": - case "physical": - break; - default: - val *= Math.abs(wcsinfo.cdelt1); - val *= Math.abs(wcsinfo.cdelt2); - break; - } - val = fmt(val); - this.tmp.linelength = val; - } - break; - case "lineangle": - if( obj.pub.pts && obj.pub.pts.length === 2 ){ - p1 = obj.pub.pts[0]; - p2 = obj.pub.pts[1]; - val = Math.atan2(p2.y - p1.y, p2.x - p1.x) * 180 / Math.PI; - while( val < 0 ){ val += 360; } - val = fmt(val); - this.tmp.lineangle = val; - } - break; - case "fontFamily": - if( obj.getFontFamily ){ - val = obj.getFontFamily(); - } - break; - case "fontSize": - if( obj.getFontSize ){ - val = obj.getFontSize(); - } - break; - case "fontStyle": - if( obj.getFontStyle ){ - val = obj.getFontStyle(); - } - break; - case "fontWeight": - if( obj.getFontWeight ){ - val = obj.getFontWeight(); - } - break; - case "colorPicker": - if( obj.pub.color !== undefined ){ - val = JS9.colorToHex(obj.pub.color); - } else { - val = $(form).data("colorpicker") || JS9.globalOpts.defcolor; - } - break; - case "color": - // multi: don't set color to avoid applying it to new selections - if( !multi ){ - if( obj.pub.color !== undefined ){ - val = fmt(obj.pub.color); - } else if( $(form).data("colorpicker") ){ - val = $(form).data("colorpicker"); - } - } - break; - case "strokeWidth": - if( obj.params.sw1 ){ - val = obj.params.sw1; - } else { - val = $(form).data("strokewidth") || ""; - } - break; - case "strokeDashes": - if( obj.strokeDashArray ){ - val = obj.strokeDashArray.join(" "); - if( val.match(/NaN/) ){ - val = ""; - } - } else { - val = $(form).data("strokedashes") || ""; - } - break; - case "regstr": - if( JS9.notWCS(wcssys) || - !obj.pub.wcsconfig || - !obj.pub.wcsconfig.wcsstr ){ - val = `${obj.pub.imsys};${obj.pub.imstr}`; - } else { - val = `${obj.pub.wcsconfig.wcssys};${obj.pub.wcsconfig.wcsstr}`; - } - break; - case "xpos": - switch(wcssys){ - case "image": - if( obj.pub.preservedcoords && obj.pub.dx !== undefined ){ - val = sprintf("d%.1f", obj.pub.dx); - } else if( obj.pub.x !== undefined ){ - val = sprintf("%.1f", obj.pub.x); - } - break; - case "physical": - if( obj.pub.lcs ){ - val = sprintf("%.1f", obj.pub.lcs.x); - } else if( obj.pub.x !== undefined ){ - val = sprintf("%.1f", obj.pub.x); - } - break; - default: - if( obj.pub.wcsconfig && JS9.notNull(obj.pub.wcsconfig.ra) ){ - val = sprintf("%.6f", obj.pub.wcsconfig.ra); - } else if( obj.pub.x !== undefined ){ - val = sprintf("%.1f", obj.pub.x); - } - break; - } - $(`${form}[name='${key}']`).prop("readonly", cmode); - break; - case "ypos": - switch(wcssys){ - case "image": - if( obj.pub.preservedcoords && obj.pub.dy !== undefined ){ - val = sprintf("d%.1f", obj.pub.dy); - } else if( obj.pub.y !== undefined ){ - val = sprintf("%.1f", obj.pub.y); - } - break; - case "physical": - if( obj.pub.lcs ){ - val = sprintf("%.1f", obj.pub.lcs.y); - } else if( obj.pub.y !== undefined ){ - val = sprintf("%.1f", obj.pub.y); - } - break; - default: - if( obj.pub.wcsconfig && JS9.notNull(obj.pub.wcsconfig.dec) ){ - val = sprintf("%.6f", obj.pub.wcsconfig.dec); - } else if( obj.pub.y !== undefined ){ - val = sprintf("%.1f", obj.pub.y); - } - break; - } - $(`${form}[name='${key}']`).prop("readonly", cmode); - break; - case "radius": - case "oradius": - case "length": - case "width": - case "r1": - switch(wcssys){ - case "image": - if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - case "physical": - if( obj.pub.lcs && obj.pub.lcs[key] !== undefined ){ - val = fmt(obj.pub.lcs[key]); - } - break; - default: - if( obj.pub.wcsconfig && - JS9.notNull(obj.pub.wcsconfig.wcssizestr) ){ - val = fmt(obj.pub.wcsconfig.wcssizestr[0]); - } else if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - } - $(`${form}[name='${key}']`).prop("readonly", cmode); - break; - case "height": - case "r2": - switch(wcssys){ - case "image": - if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - case "physical": - if( obj.pub.lcs && obj.pub.lcs[key] !== undefined ){ - val = fmt(obj.pub.lcs[key]); - } - break; - default: - if( obj.pub.wcsconfig && - JS9.notNull(obj.pub.wcsconfig.wcssizestr) ){ - val = fmt(obj.pub.wcsconfig.wcssizestr[1]); - } else if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - } - $(`${form}[name='${key}']`).prop("readonly", cmode); - break; - case "wcssys": - case "savewcs": - // add all wcs sys options - el = $(form).find(`[name='${key}']`); - if( !el.find("option").length ){ - for(i=0; i${JS9.wcssyss[i]}`); - } - } - if( key === "savewcs" ){ - twcssys = JS9.globalOpts.regSaveWCS || wcssys; - } else { - twcssys = wcssys; - } - el.find("option").each((index, element) => { - if( twcssys === element.value ){ - val = element.value; - } - }); - break; - case "wcsunits": - if( obj.pub.wcsunits ){ - val = obj.pub.wcsunits; - } - break; - case "childtext": - if( obj.params.children && obj.params.children.length > 0 ){ - val = replaceNewline(obj.params.children[0].obj.text); - } - break; - case "text": - if( obj.pub[key] !== undefined ){ - val = replaceNewline(fmt(obj.pub[key])); - } - break; - case "id": - if( multi ){ - val = "selected"; - } else if( obj.pub.id !== undefined ){ - val = String(obj.pub.id); - // set width of text input to be width of string - $(element).css("width", `${val.length}ch`); - } - break; - case "tags": - if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - case "savefile": - val = $(form).data("savefile") || - this.tmp.saveregionsFile || - "js9.reg"; - if( window.electron && !val.match(/.*\//) ){ - val = `${window.electron.currentDir}/${val}`; - } - break; - case "selectfilter": - val = $(form).data("selectfilter"); - break; - case "selectshape": - case "selectcolor": - case "selecttag": - case "selectwcs": - case "selectgroup": - JS9.Regions.regionsConfigSetSelectMenu(this, $(form), key); - break; - default: - if( obj.pub[key] !== undefined ){ - val = fmt(obj.pub[key]); - } - break; - } - $(element).val(val); - }); - // display or hide options - if( multi || !this.raw.wcs || this.raw.wcs < 0 ){ - $(form).find("[name='wcssys']").hide(); - } - // edit-able parameters - // child text display for shapes, editable if no existing children yet - if( obj.type !== "text" && obj.params.children ){ - $(`${form}.childtext`).removeClass("nodisplay"); - } - // init options, if necessary - if( opts.firsttime ){ - // desktop: display file browser - if( window.electron ){ - $(form).find(".rsavebrowse, .rconfigbrowse") - .removeClass("nodisplay"); - } - // multi "cur" works off selected, not current, regions - if( multi ){ - $(form).find("label[for='savecur']") - .text("sel"); - $(form).find("input[id='savecur']") - .data("tooltip", "save selected regions"); - $(form).find("[id='selectreg']") - .prop("checked", true); - } else { - $(form).find(".checkboxes").removeClass("nodisplay"); - } - // add wcs button options - if( JS9.favorites.wcs && JS9.favorites.wcs.length ){ - // display wcs buttons - el = $(form).find(".rwcsbuttons").removeClass("nodisplay"); - // add buttons to button container, if necessary - el2 = el.find(".rwcsbuttoncontainer"); - if( el2.length && !el2.find(".rwcsbutton").length ){ - // add radio buttons for each favorite wcs - for(i=0; i - - - `); - } - // init the radio buttons - $(form).find('.rwcsbuttons').find(`[value='${wcssys}']`) - .prop('checked', true); - } - } - // alternate colorpicker - if( !JS9.globalOpts.internalColorPicker || - !$.fn.spectrum.inputTypeColorSupport() ){ - el = $(form).find(`input[name='colorPicker']`) - el.spectrum({showButtons: false, - showInput: false, - preferredFormat: "hex6"}); - // when the color is changed via the colorpicker - el.on('move.spectrum', (evt, tinycolor) => { - let color = tinycolor.toHexString(); - $(form).find("input[name='color']").val(color); - $(form).data("colorpicker", color); - }); - } - } - // checkboxes - if( obj.params.listonchange === undefined ){ - obj.params.listonchange = false; - } - if( obj.params.listonchange ){ - $(`${form}[name='listonchange']`).prop("checked", true); - } else { - $(`${form}[name='listonchange']`).prop("checked", false); - } - if( obj.params.changeable !== false ){ - $(`${form}[name='locked']`).prop("checked", false); - } else { - $(`${form}[name='locked']`).prop("checked", true); - } - if( obj.params.sticky ){ - $(`${form}[name='sticky']`).prop("checked", true); - } else { - $(`${form}[name='sticky']`).prop("checked", false); - } - // save regions processing - $(`${form}[id='includejson']`) - .prop("checked", JS9.globalOpts.regIncludeJSON); - $(`${form}[id='includecomments']`) - .prop("checked", JS9.globalOpts.regIncludeComments); - $(`${form}[id='savedcoords']`) - .prop("checked", JS9.globalOpts.regSaveDCoords); - $(`${form}[id='includewcs']`) - .prop("checked", JS9.globalOpts.csvIncludeWCS); - // unset all save format radio buttons - $(form).find(`input[name='saveformat']`) - .prop("checked", false); - // set save format based on global value - $(form).find(`input[value='${JS9.globalOpts.regSaveFormat}']`) - .prop("checked", true); - // unset all save wcs radio buttons - $(form).find(`input[name='rwcsbutton']`) - .prop("checked", false); - // set save wcs based on global value - $(form).find(`input[value='${JS9.globalOpts.regSaveWCS||wcssys}']`) - .prop("checked", true); - // set which regions get saved - if( opts.type === "save" ){ - s = `save${JS9.globalOpts.regSaveWhich1}`; - } else { - s = `save${JS9.globalOpts.regSaveWhich2}`; - } - $(`${form}[id='${s}']`).prop("checked", true); - // triggering the savefile will cause format to be updated - // and focus to be set - if( opts.type === "save" ){ - $(form).find(`input[name='savefile']`).trigger("change"); - } - // style menus - $(form).find(`input[name='strokeMenu']`).prop("selectedIndex", 0); - $(form).find(`input[name='dashesMenu']`).prop("selectedIndex", 0); - // shape specific processing - if( multi ){ - $(form).find(".regid").hide(); - $(form).find(".edit").hide(); - $(form).find(".childtext").hide(); - $(form).find(".multi").removeClass("nodisplay"); - if( opts.setmode <= 0 ){ - $(form).find(`[name='multitext']`).val(""); - $(form).find(`input[name="color"]`).val(""); - $(form).find(`input[name="strokeWidth"]`).val(""); - $(form).find(`input[name="strokeDashes"]`).val(""); - $(form).data("strokewidth", ""); - $(form).data("strokedashes", ""); - if( opts.setmode < 0 ){ - $(form).find(`[name='selectfilter']`).val(""); - $(form).data("selectfilter", ""); - } - } else { - ao = this.layers.regions.canvas.getActiveObject(); - if( ao && ao.type === "group" && !ao.params ){ - objs = ao.getObjects(); - if( objs && objs.length && objs[0] && objs[0].params ){ - grp = objs[0].params.groupid; - } - if( grp ){ - $(form).find(`[name='selectfilter']`).val(grp); - $(form).data('selectfilter', grp); - s = this.listGroups(grp); - s2 = s.substring(s.indexOf("\n")+1); - $(form).find(`[name='multitext']`).val(s2); - } else { - $(form).find(`[name='multitext']`).val(""); - } - } else if( ao ){ - ao = this.layers.regions.canvas.getActiveObjects(); - for(i=0, s=[], s2=""; i { - $(form).find(`input[name='savefile']`).focus(); - }); - } - // add tooltip callbacks (not mobile: ios buttons stop working!) - if( !$(form).data("tooltipInit") ){ - $(form).data("tooltipInit", true); - $(".rconfigcol_R, .rsavecol_R").on(mover, (e) => { - const target = e.currentTarget; - const tooltip = $(target) - .find("input, textarea, span") - .data("tooltip"); - const el = $(target) - .closest(JS9.lightOpts[JS9.LIGHTWIN].top) - .find(JS9.lightOpts[JS9.LIGHTWIN].dragBar); - if( tooltip && el.length ){ - // change title: see dhtmlwindow.js load() @line 130 - otitle = $(el)[0].childNodes[0].nodeValue.replace(/:.*/,""); - $(el)[0].childNodes[0].nodeValue = `${otitle}: ${tooltip}`; - } - }); - $(".rconfigcol_R, .rsavecol_R").on(mout, (e) => { - const target = e.currentTarget; - const el = $(target) - .closest(JS9.lightOpts[JS9.LIGHTWIN].top) - .find(JS9.lightOpts[JS9.LIGHTWIN].dragBar); - if( el.length ){ - otitle = $(el)[0].childNodes[0].nodeValue.replace(/:.*/,""); - $(el)[0].childNodes[0].nodeValue = otitle; - } - }); - } -}; - -// process the config form to change the specified shape -// call using image context -JS9.Regions.processConfigForm = function(form, obj, arr){ - let i, key, nkey, val, nval, nopts, multi, layer, wcssys; - let cpos, p1, p2, d, x, y, ang, sel; - let bin = 1; - const defobj = { - type: "multi", - pub: {shape: "multi"}, - params: {} - }; - const alen = arr.length; - const opts = {}; - const wcsinfo = this.raw.wcsinfo || {cdelt1: 1, cdelt2: 1}; - const fmt= (val) => { - if( val === undefined ){ - return undefined; - } - if( (typeof val === "number") && (val % 1 !== 0) ){ - val = Math.round((val + 0.00001) * 10000) / 10000; - } - return(String(val)); - }; - const fmtcheck = (val1, val2) => { - if( multi ){ - return true; - } - if( val1 === undefined ){ - return false; - } - return fmt(val1) !== fmt(val2); - }; - const newval = (obj, key, val) => { - // let v1, v2; - // special keys having no public or param equivalents - if( key === "remove" ){ - return val === "selected"; - } - if( key === "childtext" ){ - if( obj.params.children && obj.params.children.length > 0 ){ - if( obj.params.children[0].obj && - obj.params.children[0].obj.params ){ - return val !== obj.params.children[0].obj.params.text; - } - return false; - } - return val !== obj.params.text; - } - if( key === "strokeWidth" ){ - if( obj.params && obj.params.sw1 ){ - return val !== obj.params.sw1; - } else { - return true; - } - } - if( key === "strokeDashes" ){ - if( obj.strokeDashArray){ - return JSON.stringify(obj.strokeDashArray) !== - JSON.stringify(val); - } - if( $.isArray(val) ){ - switch(val.length){ - case 0: - return false; - case 1: - return val[0] !== ""; - case 2: - default: - return val[0] !== "" && val[1] !== ""; - } - } else { - return val !== ""; - } - } - if( key !== "tags" && val === "" ){ - return false; - } - if( key === "misc" && val !== "" ){ - return true; - } - if( key === "radii" && obj.params.radii ){ - // https://stackoverflow.com/questions/1773069/using-jquery-to-compare-two-arrays-of-javascript-objects - // v1 = val.split(",").map((item) => {return parseFloat(item)}); - // v2 = obj.params.radii; - // return $(v1).not(v2).length !== 0 || $(v2).not(v1).length !== 0; - // always return true or else annuli won't change other properties - return true; - } - if( key === "angle" ){ - return obj.angle !== -parseFloat(val); - } - if( key === "ix" ){ - if( obj.pub.preservedcoords && - val.charAt(0).toLowerCase() === "d" ){ - return fmtcheck(obj.pub.dx, JS9.saostrtod(val.substring(1))); - } else { - return fmtcheck(obj.pub.x, JS9.saostrtod(val)); - } - } - if( key === "iy" ){ - if( obj.pub.preservedcoords && - val.charAt(0).toLowerCase() === "d" ){ - return fmtcheck(obj.pub.dy, JS9.saostrtod(val.substring(1))); - } else { - return fmtcheck(obj.pub.y, JS9.saostrtod(val)); - } - } - if( key === "px" && obj.pub.lcs ){ - return fmtcheck(obj.pub.lcs.x.toFixed(1), val); - } - if( key === "py" && obj.pub.lcs ){ - return fmtcheck(obj.pub.lcs.y.toFixed(1), val); - } - if( key === "ra" ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcsposstr ){ - return fmtcheck(JS9.saostrtod(obj.pub.wcsconfig.wcsposstr[0]), - JS9.saostrtod(val)); - } else if( obj.pub.wcsposstr ){ - return fmtcheck(JS9.saostrtod(obj.pub.wcsposstr[0]), - JS9.saostrtod(val)); - } - return false; - } - if( key === "dec" ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcsposstr ){ - return fmtcheck(JS9.saostrtod(obj.pub.wcsconfig.wcsposstr[1]), - JS9.saostrtod(val)); - } else if( obj.pub.wcsposstr ){ - return fmtcheck(JS9.saostrtod(obj.pub.wcsposstr[1]), - JS9.saostrtod(val)); - } - } - if( key === "sticky" ){ - if( multi ){ - return false; - } else { - return fmtcheck(obj.pub.sticky||false, val); - } - } - if( key === "locked" ){ - if( multi ){ - return false; - } else { - if( obj.params.changeable !== false ){ - return val === false; - } else { - return val === true; - } - } - } - if( key === "listonchange" ){ - if( multi ){ - return false; - } - } - if( obj.pub.lcs && obj.pub.lcs[key] !== undefined ){ - if( fmtcheck(obj.pub.lcs[key], val) ){ - return true; - } - // don't look further or we end up checking image x, y - return false; - } - if( fmtcheck(obj.pub[key], val) ){ - return true; - } - if( fmtcheck(obj.params[key], val) ){ - return true; - } - if( fmtcheck(obj[key], val) ){ - return true; - } - return false; - }; - const getval = (s) => { - if( s === "true" ){ - return true; - } - if( s === "false" ){ - return false; - } - if( !JS9.isNumber(s) ){ - return s; - } - return parseFloat(s); - }; - const replaceNewline = (s) => { - const nl = String.fromCharCode(13, 10); - if( typeof s === "string" ){ - return s.replace(/\\n/g, nl); - } - return s; - }; - // set physical to image conversion, if possible - if( this.lcs && this.lcs.physical ){ - bin = Math.sqrt(Math.pow(this.lcs.physical.forward[0][0],2) + - Math.pow(this.lcs.physical.forward[0][1],2)); - } - // which wcssys do we use? edit version, if available - if( obj && obj.pub ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcssys ){ - wcssys = obj.pub.wcsconfig.wcssys; - } else { - wcssys = this.params.wcssys; - } - } else { - wcssys = this.params.wcssys; - // fake obj: makes the checks easier, avoid if( obj ... ) everywhere - obj = defobj; - } - // multi selection or single region - multi = $(form).data("multi"); - // layer or regions - layer = obj.pub.layer || "regions"; - // process array of keyword/values - for(i=0; i parseInt(s, 10) ); - } - } - } - break; - case "strokeWidth": - if( val === "" ){ - opts[key] = ""; - } else { - if( JS9.isNumber(val) ){ - nval = parseInt(val, 10); - if( nval <= 0 ){ - opts[key] = ""; - } else if( (multi && val) || - (!multi && newval(obj, key, nval)) ){ - opts[key] = getval(nval); - } - } - } - break; - case "color": - if( val === "" ){ - opts[key] = ""; - } else if( newval(obj, key, val) ){ - opts[key] = getval(val); - } - break; - case "tags": - if( multi ){ - if( val ){ - if( val === '""' || val === "''" ){ - opts[key] = ""; - } else { - opts[key] = getval(val); - } - } - } else if( newval(obj, key, val) ){ - opts[key] = getval(val); - } - - break; - case "childtext": - if( obj.type !== "text" ){ - if( newval(obj, key, val) ){ - opts.text = replaceNewline(val); - } - } - break; - case "ix": - if( newval(obj, key, val) ){ - if( obj.pub.preservedcoords && - val.charAt(0).toLowerCase() === "d" ){ - opts.dx = getval(val.substring(1)); - if( opts.dy === undefined && obj.pub.dy !== undefined ){ - opts.dy = obj.pub.dy; - } - } else { - opts.x = getval(val); - if( opts.y === undefined && obj.pub.y !== undefined ){ - opts.y = obj.pub.y; - } - } - } - break; - case "iy": - if( newval(obj, key, val) ){ - if( obj.pub.preservedcoords && - val.charAt(0).toLowerCase() === "d" ){ - opts.dy = getval(val.substring(1)); - if( opts.dx === undefined && obj.pub.dx !== undefined ){ - opts.dx = obj.pub.dx; - } - } else { - opts.y = getval(val); - if( opts.x === undefined && obj.pub.x !== undefined ){ - opts.x = obj.pub.x; - } - } - } - break; - case "px": - if( newval(obj, key, val) ){ - opts.px = getval(val); - if( opts.py === undefined && obj.pub.lcs ){ - opts.py = obj.pub.lcs.y; - } - } - break; - case "py": - if( newval(obj, key, val) ){ - opts.py = getval(val); - if( opts.px === undefined && obj.pub.lcs ){ - opts.px = obj.pub.lcs.x; - } - } - break; - case "ra": - if( newval(obj, key, val) ){ - opts.ra = val; - if( opts.dec === undefined ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcsposstr ){ - opts.dec = obj.pub.wcsconfig.wcsposstr[1]; - } else if( obj.pub.wcsposstr ){ - opts.dec = obj.pub.wcsposstr[1]; - } - } - } - break; - case "dec": - if( newval(obj, key, val) ){ - opts.dec = val; - if( opts.ra === undefined ){ - if( obj.pub.wcsconfig && obj.pub.wcsconfig.wcsposstr ){ - opts.ra = obj.pub.wcsconfig.wcsposstr[0]; - } else if( obj.pub.wcsposstr ){ - opts.ra = obj.pub.wcsposstr[0]; - } - } - if( opts.wcssys === undefined ){ - opts.wcssys = wcssys; - } - } - break; - case "wcssys": - break; - case "radius": - case "length": - case "width": - case "r1": - switch(wcssys){ - case "image": - if( newval(obj, key, val) ){ - opts[key] = getval(val); - } - break; - case "physical": - if( newval(obj, key, val) ){ - opts[key] = getval(val) * bin; - } - break; - default: - nval = JS9.strtoscaled(val); - val = Math.abs(nval.dval / wcsinfo.cdelt1); - nkey = key.replace("wcs", ""); - if( newval(obj, nkey, val) ){ - opts[nkey] = getval(val); - } - break; - } - break; - case "height": - case "r2": - switch(wcssys){ - case "image": - if( newval(obj, key, val) ){ - opts[key] = getval(val); - } - break; - case "physical": - if( newval(obj, key, val) ){ - opts[key] = getval(val) * bin; - } - break; - default: - nval = JS9.strtoscaled(val); - val = Math.abs(nval.dval / wcsinfo.cdelt2); - nkey = key.replace("wcs", ""); - if( newval(obj, nkey, val) ){ - opts[nkey] = getval(val); - } - break; - } - break; - case "radii": - if( newval(obj, key, val) ){ - opts[key] = val; - } - break; - case "linelength": - if( obj.pub.pts && obj.pub.pts.length === 2 ){ - if( JS9.isNumber(val) && val !== this.tmp.linelength ){ - val = parseFloat(val); - switch(wcssys){ - case "image": - case "physical": - break; - default: - if( wcsinfo.cdelt1 !== undefined ){ - val /= Math.abs(wcsinfo.cdelt1); - } else if( wcsinfo.cdelt2 !== undefined ){ - val /= Math.abs(wcsinfo.cdelt2); - } - break; - } - if( opts.pts ){ - p1 = opts.pts[0]; - p2 = opts.pts[1]; - } else { - p1 = obj.pub.pts[0]; - p2 = obj.pub.pts[1]; - } - if( $.inArray("line", - JS9.Regions.opts.noCenteredScaling) >= 0 ){ - // leave p1 fixed - // https://math.stackexchange.com/questions/175896/finding-a-point-along-a-line-a-certain-distance-away-from-another-point - d = Math.sqrt((p1.x - p2.x) * (p1.x - p2.x) + - (p1.y - p2.y) * (p1.y - p2.y) ); - x = p1.x - (val * (p1.x - p2.x))/d; - y = p1.y - (val * (p1.y - p2.y))/d; - opts.pts = [p1, {x, y}]; - } else { - // leave center fixed - cpos = {x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 }; - ang = parseFloat(this.tmp.lineangle)||0; - p1.x = cpos.x - val/2; - p1.y = cpos.y; - p2.x = cpos.x + val/2; - p2.y = cpos.y; - opts.pts = [JS9.rotatePoint(p1, ang, cpos), - JS9.rotatePoint(p2, ang, cpos)]; - } - } - } - break; - case "lineangle": - if( obj.pub.pts && obj.pub.pts.length === 2 ){ - if( JS9.isNumber(val) && val !== this.tmp.lineangle ){ - ang = parseFloat(val) - parseFloat(this.tmp.lineangle)||0; - if( opts.pts ){ - p1 = opts.pts[0]; - p2 = opts.pts[1]; - } else { - p1 = obj.pub.pts[0]; - p2 = obj.pub.pts[1]; - } - if( $.inArray("line", - JS9.Regions.opts.noCenteredScaling) >= 0 ){ - // leave p1 fixed - opts.pts = [p1, JS9.rotatePoint(p2, ang, p1)]; - } else { - // leave center fixed - cpos = {x: (p1.x + p2.x) / 2, y: (p1.y + p2.y) / 2 }; - opts.pts = [JS9.rotatePoint(p1, ang, cpos), - JS9.rotatePoint(p2, ang, cpos)]; - } - } - } - break; - case "remove": - if( newval(obj, key, val) ){ - if( multi ){ - opts[key] = "selected"; - } else if( obj.pub.id !== undefined ){ - opts[key] = obj.pub.id; - } - } - break; - case "locked": - if( newval(obj, key, !getval(val)) ){ - opts.changeable = !getval(val); - } - break; - case "misc": - if( val.trim() ){ - try{ nopts = JSON.parse(val); $.extend(opts, nopts); } - catch(e){ JS9.error(`invalid json: ${val}`);} - } - break; - default: - if( newval(obj, key, val) ){ - opts[key] = getval(val); - } - break; - } - } - // change the shape(s), if necessary - if( Object.keys(opts).length > 0 ){ - if( multi ){ - sel = $(form).find(`[name='selectfilter']`).val() || "selected"; - this.changeShapes(layer, sel, opts); - } else { - sel = $(form).find(`[name='id']`).val() || obj; - this.changeShapes(layer, sel, opts); - } - this.initRegionsForm(obj, {multi}); - } -}; - -// convenience routine used in regionsConfig.html -JS9.Regions.regionsConfigSetSelectFilter = function(el, def) { - let i, s, curval, lastval, nval, nfilter; - let arr = []; - let defarr = []; - let grparr = []; - const form = el.closest('form'); - const filter = form.find(`[name='selectfilter']`); - const im = form.data('im'); - const withparens = (s) => { - let t; - if( !s ){ return ""; } - t = s.trim(); - if( t.charAt(0) === "(" && t.charAt(t.length-1) === ")" ){ - return t; - } else { - return `(${t})`; - } - }; - // sanity check - if( !im ){ return; } - // groups - grparr = im.listGroups("all", {includeregions:false}).split("\n"); - // new value from menu - nval = el.val().trim(); - // cur value from filter select - curval = filter.val().trim(); - // handle "saved" specially - if( def === "other" && nval === "saved" ){ - // compose and set the new filter selection - s = im.layers.regions.selection || ""; - if( s ){ - if( curval ){ - s = `${withparens(s)} && ${withparens(curval)}`; - } - } - filter.val(`${s}`); - // reset the menu - el.prop('selectedIndex', 0); - return; - } - if( curval ){ - arr = curval.split(/\s+/); - } - if( arr.length ){ - lastval = arr[arr.length-1]; - if( !nval.match(/[&|]/) && !lastval.match(/[&|!]/) ){ - // get array of possible values - switch(def){ - case "regions": - defarr = JS9.regions; - break; - case "colors": - break; - case "tags": - break; - case "wcssys": - defarr = JS9.wcssyss; - break; - case "groups": - defarr = grparr; - break; - case "ops": - defarr = ["!", "&&", "||"]; - break; - } - if( $.inArray(lastval, defarr) >= 0 ){ - // if new and last val is of the same type, use || for union - // (intersection of same types, but non-identical, is null) - nval = `|| ${nval}`; - } else if( $.inArray(lastval, grparr) >= 0 || - $.inArray(nval, grparr) >= 0 ){ - // if either is a group, use || for union - // (intersection of non-identical groups is null) - nval = `|| ${nval}`; - } else { - // use && for intersection, e.g., color && shape - nval = `&& ${nval}`; - } - } - } - // this is the new filter - nfilter = `${curval} ${nval}`; - // futz w/parens: split by ||, add parens around segments containing && - // if you used the menus to choose these: - // circle blue || box red - // then instead of this: - // circle && blue || box && red - // we should end up with this: - // (circle && blue) || (box && red) - if( JS9.globalOpts.regConfigAddParens ){ - arr = nfilter.split("||"); - if( arr.length >= 2 ){ - for(i=0; i 0 ){ - arr[i] = withparens(s); - } else { - arr[i] = s; - } - } - } - nfilter = arr.join(' || ').replace(/ */g, " "); - } - // compose and set the new filter selection - filter.val(nfilter); - // reset the menu - el.prop('selectedIndex', 0); -}; - -// convenience routine used in regionsConfig.html -JS9.Regions.regionsConfigSetSelectMenu = function(im, form, key) { - let i, j, s, el, objs, gots, arr; - const initmenu = (el) => { - let i; - // remove all but the header (0th option) - for(i=el.options.length-1; i>=1; i--) { - el.remove(i); - } - }; - if( !key.match(/^select/) ){ - key = `select${key}`; - } - el = form.find(`[name='${key}']`); - // reinit: clear menu - initmenu(el[0]); - // current objects - objs = im.getShapes("regions", "all"); - // add items - switch(key){ - case "selectshape": - for(i=0, gots=[]; i${s}`); - gots.push(s); - } - } - break; - case "selectcolor": - for(i=0, gots=[]; i${s}`); - gots.push(s); - } - } - break; - case "selecttag": - for(i=0, gots=[]; i${s[j]}`); - gots.push(s[j]); - } - } - } - break; - case "selectwcs": - for(i=0, gots=[]; i${s}`); - gots.push(s); - } - } - } - break; - case "selectgroup": - s = im.listGroups("all", {includeregions:false}); - if( s ){ - arr = s.split("\n"); - for(i=0; i${arr[i]}`); - } - } - break; - } -}; - -// convenience routine used in regionsConfig.html -JS9.Regions.regionsConfigSetSelectOrGroup = function(im, form, key, update){ - let obj, group, canvas; - let el1 = form.find(`[name="selectfilter"]`); - let el2 = form.find(`[name="multitext"]`); - let selection = el1.val().trim(); - // sanity check - if( !im ){ return; } - // convenience variables - canvas = im.layers.regions.canvas; - // default is to allow update of multi-selection dialog - // sometimes we definitely don't want that to happen, so ... - if( update === false ){ im.tmp.updateMulti = false; } - // default is to select - if( !selection ){ - el1.val(""); - el2.val(""); - form.data("selectfilter", ""); - if( canvas.getActiveObject() ){ - canvas.discardActiveObject(); - } - canvas.renderAll() - key = "clear"; - } - if( !key ){ - key = im.lookupGroup(selection) ? "group" : "select"; - } - switch(key){ - case "select": - form.data("selectfilter", selection); - im.selectShapes("regions", selection, {transparentgroup: false}); - break; - case "group": - form.data("selectfilter", selection); - group = im.groupShapes("regions", selection); - el1.val(group); - el2.val(im.listGroups(group)) - obj = im.lookupGroup(group); - if( obj ){ - canvas.setActiveObject(obj); - canvas.renderAll(); - JS9.Regions.regionsConfigSetSelectMenu(im, form, "selectgroup"); - } - break; - case "ungroup": - im.ungroupShapes("regions", selection); - el1.val(""); - el2.val(""); - form.data("selectfilter", ""); - if( canvas.getActiveObject() ){ - canvas.discardActiveObject(); - } - JS9.Regions.regionsConfigSetSelectMenu(im, form, "selectgroup"); - break; - case "clear": - form.find(`input[name="color"]`).val(""); - form.find(`input[name="strokeWidth"]`).val(""); - form.find(`input[name="strokeDashes"]`).val(""); - form.data("strokewidth", ""); - form.data("strokedashes", ""); - break; - default: - break; - } - delete im.tmp.updateMulti; -}; - -// paste a region from clipboard -// call using image context -JS9.Regions.pasteFromClipboard = function(curpos){ - let i, s, nobj, xpos, ypos, oval; - let objs = []; - let xcen = 0, ycen = 0; - const rregexp = /(annulus|box|circle|cross|ellipse|line|polygon|point|text) *\(/; - // sanity check - if( !this ){ return; } - // get string from clipboard - s = JS9.CopyFromClipboard().trim(); - // see if we have anything at all - if( !s ){ - JS9.error(JS9.CLIPBOARDERROR); - } - // see if we have region(s) - if( s.match(rregexp) ){ - // we don't update the clipboard for these operations - oval = JS9.globalOpts.regToClipboard; - JS9.globalOpts.regToClipboard = false; - // add regions (don't update clipboard) - objs = this.addShapes("regions", s, {rtn: "objs"}); - // place regions in the position specified by the mouse, if necessary - if( curpos ){ - // number of regions - nobj = objs.length; - // get centroid - for(i=0; i { - let i, s, key, child, ra, dec; - const nexports = {}; - const params = obj.params; - const children = params.children; - const exports = params.exports; - for(i=0; i 0) && (children[0].obj.text) ){ - child = children[0].obj; - // create a text child - nexports.text = child.text; - // get options for text child but ... - nexports.textOpts = getExports(child); - // try to minimize exported properties - if( obj.angle !== child.angle ){ - // child has an explicit angle different from parent - nexports.textOpts.angle = -child.angle; - if( (obj.params.shape === "circle") || - (obj.params.shape === "annulus") ){ - child.params.hasTextOpts = true; - } - } else if( child.angle !== 0 ){ - // parent is circle/annulus and child has an angle - if( (obj.params.shape === "circle") || - (obj.params.shape === "annulus") ){ - nexports.textOpts.angle = -child.angle; - child.params.hasTextOpts = true; - } - } - if( child.params.parent.moved || child.params.hasTextOpts ){ - // wcs, then physical coords are preferred ... - if( child.pub.ra && child.pub.dec ){ - // convert child ra, dec to target wcs, if necessary - if( owcssys && wcssys && owcssys !== wcssys ){ - s = this.wcs2wcs(owcssys, wcssys, - child.pub.ra, child.pub.dec); - s = s.trim().split(/\s+/); - ra = JS9.saostrtod(s[0]); - if( JS9.isHMS(wcssys) ){ - ra *= 15.0; - } - dec = JS9.saostrtod(s[1]); - } else { - ra = child.pub.ra; - dec = child.pub.dec; - } - nexports.textOpts.ra = ra; - nexports.textOpts.dec = dec; - } else if( child.pub.lcs ){ - nexports.textOpts.px = child.pub.lcs.x; - nexports.textOpts.py = child.pub.lcs.y; - } else { - // ... image coords will are only good for this image - nexports.textOpts.x = child.pub.x; - nexports.textOpts.y = child.pub.y; - } - } - if( nexports.textOpts.color === obj.stroke ){ - delete nexports.textOpts.color; - } - if( nexports.textOpts.text ){ - delete nexports.textOpts.text; - } - if( !Object.keys(nexports.textOpts).length ){ - delete nexports.textOpts; - } - } - return nexports; - }; - // opts is optional - opts = opts || {}; - // opts can be an object or json - if( typeof opts === "string" ){ - try{ opts = JSON.parse(opts); } - catch(e){ JS9.error(`can't parse listRegions opts: ${opts}`, e); } - } - // pass sortids from opts to topts (used by getShapes) - if( JS9.notNull(opts.sortids) ) topts.sortids = opts.sortids; - // default is to display, including non-source tags - mode = opts.mode; - if( JS9.isNull(mode) ){ - mode = 3; - } - // default is to list the regions layer - layerName = layerName || "regions"; - layer = this.getShapeLayer(layerName); - // sanity check - if( !layer ){ return; } - // set user-specified wcs, if necessary - if( opts.wcssys || opts.wcsunits ){ - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - if( opts.wcssys ){ - owcssys = this.getWCSSys(); - this.setWCSSys(opts.wcssys, false); - wcssys = this.getWCSSys(); - } - if( opts.wcsunits ){ - owcsunits = this.getWCSUnits(); - this.setWCSUnits(opts.wcsunits, false); - } - // update wcs values - this.updateShapes(layerName, which, "export"); - } - // include dcoord shapes? - if( JS9.isNull(opts.includedcoords) ){ - opts.includedcoords = JS9.globalOpts.regListDCoords; - } - // get specified regions into an array - pubs = this.getShapes(layerName, which, topts); - // loop through shapes - rlen = pubs.length; - // display tags if at least one is not standard "source,include" - if( mode ){ - for(i=0; i 0 ){ regstr += ","; } - regstr += `"${key}":`; - switch(typeof val){ - case "string": - regstr += `"${val}"`; - break; - case "object": - try{ regstr += JSON.stringify(val); } - catch(e){ JS9.error(`can't parse: ${val}`, e); } - break; - default: - regstr += `${val}`; - break; - } - } - } - regstr += `})`; - lasttype = "image"; - continue; - } - // init tags - tagjoin = region.tags.join(","); - if( tagjoin.includes("exclude") ){ - iestr = "-"; - } else { - iestr = ""; - } - // add exported properties - exports = getExports(obj, region); - // add id, if necessary - if( opts.saveid ){ - exports.id = region.id; - } else { - delete exports.id; - } - // save wcsconfig, if necessary - if( opts.savewcsconfig && region.wcsconfig && - Object.keys(region.wcsconfig).length > 0 ){ - exports.wcsconfig = $.extend(true, {}, region.wcsconfig); - } else { - delete exports.wcsconfig; - } - // add color, if necessary - if( region.color && !tagcolors.includes(region.color) ){ - exports.color = region.color; - } - // display tags? - if( dotags ){ - tagstr = ` # ${tagjoin}`; - } - // save editing? - if( !opts.saveediting ){ - delete exports.editing; - } - // use wcs string, if available - if( region.wcsstr && JS9.isWCSSys(this.params.wcssys) ){ - if( lasttype !== "wcs" ){ - if( lasttype !== "none" ){ - regstr += sepstr; - } - // use region wcs sys, if possible - // (current wcssys might be different!) - if( region.wcssys ){ - regstr += region.wcssys; - } else { - regstr += this.params.wcssys; - } - lasttype = "wcs"; - } - regstr += (sepstr + iestr + region.wcsstr); - } else if( region.imstr ){ - // else use image string, if available - if( lasttype !== region.imsys ){ - if( lasttype !== "none" ){ - regstr += sepstr; - } - regstr += region.imsys; - lasttype = region.imsys; - } - regstr += (sepstr + iestr + region.imstr); - } - // odd modes output the exports - if( opts.includejson !== false && - ((mode % 2) === 1) && - (Object.keys(exports).length > 0) ){ - // line region: remove size/distance info - if( region.shape === "line" ){ - regstr = regstr.replace(/ *{[^{}]*}$/,""); - } - regstr += ` ${JSON.stringify(exports)}`; - } - if( tagstr ){ - regstr += tagstr; - } - } - // remove comments, if necessary - if( opts.includecomments === false ){ - regstr = regstr.replace(/ *#[^;]*/g, ""); - } - // restore original wcs, if necessary - if( owcssys || owcsunits ){ - if( owcssys ){ - this.setWCSSys(owcssys, false); - } - if( owcsunits ){ - this.setWCSUnits(owcsunits, false); - } - // restore wcs values - this.updateShapes(layerName, which, "export"); - JS9.globalOpts.xeqPlugins = txeq; - } - // display the region string, if necessary - if( mode > 1 ){ - this.display.displayMessage("regions", regstr); - } - // always return the region string - return regstr; -}; - -// copy one or more regions to another image -// call using image context -JS9.Regions.copyRegions = function(to, which){ - return this.copyShapes("regions", to, which); -}; - -// parse a string containing a subset of DS9/Funtools regions -// call using image context -JS9.Regions.parseRegions = function(s, opts){ - let i, j, k, lines, obj, robj, txeq; - let owcssys, owcsunits, wcssys, iswcs, liswcs, pos, alen; - const regions = []; - const regrexp = /^-?(annulus|box|circle|cross|ellipse|line|polygon|point|text)$/; - const wcsrexp = /^(fk4|fk5|icrs|galactic|ecliptic|image|physical|linear)$/; - const imrexp = /^(image|physical)$/; - const unrexp = /[dr:]/; - const parrexp = /\(\s*([^)]+?)\s*\)/; - const seprexp = /\n|;/; - const optsrexp = /(\{.*\})/; - const argsrexp = /\s*,\s*/; - const charrexp = /(\(|\{|#|;|\n)/; - const comrexp = /#(?![a-zA-Z0-9]{6}['"])/; - // convert "0" to false and "1" to true - const tf = (s) => { - if( s === "0" || s.toLowerCase() === "false" ){return false;} - return true; - }; - // ds9 compatibility: get properties from comment string - const ds9properties = (s) => { - let xarr, key, key2, val, nobj; - const xobj = {}; - const rexp = /([a-zA-Z][a-zA-Z0-9_]*)\s*=\s*(\d+(\s*\d+)*|[^ '"{]+|['"{][^'"}]*['"}])/g; - const ds9opts = { - color(v) {return {color: v};}, - dash(v) {if(v){return {strokeDashArray: [3,1]};}}, - dashlist(v) { - let i, arr; - if( v ){ - arr = v.split(" "); - for(i=0; i= 1 ){ obj.fontFamily = arr[0]; } - if( len >= 2 ){ obj.fontSize = parseFloat(arr[1]); } - if( len >= 3 ){ obj.fontStyle = arr[2]; } - if( len >= 4 ){ obj.fontWeight = arr[3]; } - return obj; - }, - highlite(v) {return {hasControls: tf(v), hasBorders: tf(v), hasRotatingPoint: tf(v)};}, - move(v) {return {movable: tf(v)};}, - rotate(v) {return {rotatable: tf(v)};}, - resize(v) {return {resizable: tf(v)};}, - changeable(v) {return {changeable: tf(v)};}, - select(v) {return {selectable: tf(v)};}, - text(v) {return {text: v};}, - tag(v) {return {tags: v};}, - width(v) {return {strokeWidth: parseFloat(v)};} - }; - // opts is optional - opts = opts || {}; - // loop through DS9 region properties, converting to js9 props - while( (xarr = rexp.exec(s)) !== null ){ - key = xarr[1].toLowerCase(); - val = xarr[2].replace(/^['"{]|['"}]$/g, ""); - if( {}.hasOwnProperty.call(ds9opts, key) && - typeof ds9opts[key] === "function" ){ - nobj = ds9opts[key](val) || {}; - for( key2 of Object.keys(nobj) ){ - if( key2 === "tags" && {}.hasOwnProperty.call(xobj, key2) ){ - xobj[key2] += `,${nobj[key2]}`; - } else { - xobj[key2] = nobj[key2]; - } - } - } else { - xobj[key] = val; - } - } - // save the remaining comment - s = s.replace(rexp, ""); - if( s ){ - xobj._comment = s.trim(); - } - return xobj; - }; - // parse region line into cmd (shape or wcs), args, opts, comment - const regparse1 = (s) => { - let t, tarr, ds9props; - const tobj = {}; - // initialize the return object - tobj.opts = {}; - tobj.args = []; - tobj.isregion = 0; - // look for a command - if( s.includes("(") ){ - tobj.cmd = s.split("(")[0].trim().toLowerCase(); - } else if( s.includes("{") ){ - tobj.cmd = s.split("{")[0].trim().toLowerCase(); - } else if( s.includes("#") ){ - tobj.cmd = s.split("#")[0].trim().toLowerCase(); - } else { - tobj.cmd = s.trim().toLowerCase(); - } - // got regions? - if( tobj.cmd ){ - tobj.isregion = (tobj.cmd.search(regrexp) >=0); - } - // split on comment (ignore color specifications starting with "#") - t = s.trim().split(comrexp); - // look for json opts after the arg list - tarr = optsrexp.exec(t[0]); - if( tarr && tarr[0] ){ - // convert to object - try{ tobj.opts = JSON.parse(tarr[0].trim()); } - catch(e){ JS9.error(`can't parse opts: ${tarr[0]}`, e); } - } - // look for comments - tobj.comment = t[1]; - if( tobj.comment ){ - ds9props = ds9properties(tobj.comment.trim()); - if( ds9props._comment !== undefined ){ - tobj.comment = ds9props._comment; - delete ds9props._comment; - } - } - // merge with ds9 opts - if( ds9props ){ - tobj.opts = $.extend({}, ds9props, tobj.opts); - } - // separate the region args into an array - tarr = parrexp.exec(s); - if( tarr && tarr[0].match(optsrexp) ){ - // no region args, all properties passed in json - tobj.args = []; - } else if( tarr && tarr[1] ){ - // region args, without json opts - tobj.args = tarr[1].split(argsrexp); - } - // look for - sign signifying an exclude region - if( tobj.isregion && tobj.cmd.startsWith("-") ){ - tobj.cmd = tobj.cmd.slice(1); - if( tobj.comment ){ - if( !tobj.comment.match(/exclude/) ){ - tobj.comment += ",exclude"; - } - } else { - tobj.comment = "exclude"; - } - } - return tobj; - }; - const getipos = (ix, iy) => { - let vt, sarr, v1, v2; - let obj = {}; - // special handling for display coords - if( ix.charAt(0).toLowerCase() === "d" && - iy.charAt(0).toLowerCase() === "d" ){ - obj.dx = parseFloat(ix.substring(1)); - obj.dy = parseFloat(iy.substring(1)); - return obj; - } - // convert strings to numbers, along with unit delimiters - v1 = JS9.strtoscaled(ix); - v2 = JS9.strtoscaled(iy); - // local override of wcs if: - // a. we used sexagesimal units or appended d,r - // b. we are not currently using wcs - if( ((v1.dtype.match(unrexp)) || (v2.dtype.match(unrexp))) && - !iswcs && !owcssys.match(imrexp) ){ - liswcs = true; - wcssys = owcssys; - } - if( iswcs || liswcs ){ - // arg1 coords are hms, but ecliptic, galactic are deg - if( JS9.isHMS(wcssys, v1.dtype) ){ - v1.dval *= 15.0; - } - // convert to degrees, if necessary - if( v1.dtype === "r" ){ v1.dval = v1.dval * 180 / Math.PI; } - if( v2.dtype === "r" ){ v2.dval = v2.dval * 180 / Math.PI; } - // get image coordinates - sarr = JS9.wcs2pix(this.raw.wcs, v1.dval, v2.dval).split(/ +/); - obj.x = parseFloat(sarr[0]); - obj.y = parseFloat(sarr[1]); - return obj; - } else if( wcssys === "physical" ){ - vt = this.logicalToImagePos({x: v1.dval, y: v2.dval}); - obj.x = vt.x; - obj.y = vt.y; - return obj; - } - // image coords - obj.x = v1.dval; - obj.y = v2.dval; - return obj; - }; - // get image length - const getilen = (len, which) => { - let cstr, iscale; - const v = JS9.strtoscaled(len); - const wcsinfo = this.raw.wcsinfo || {cdelt1: 1, cdelt2: 1}; - // local override of wcs if: - // a. we are not currently using wcs - // b. we used sexagesimal units or appended d,r - if( v.dtype.match(unrexp) && !iswcs && !owcssys.match(imrexp) ){ - liswcs = true; - wcssys = owcssys; - } - if( iswcs || liswcs ){ - // convert to degrees, if necessary - if( v.dtype === "r" ){ v.dval = v.dval * 180 / Math.PI; } - // angular separation is not implemented - // region wcs size is always based on cdelt - if( JS9.REGSIZE !== 0 ){ - JS9.error("region size based on ang sep is not implemented"); - } - // wcs-based size - cstr = `cdelt${which}`; - v.dval = Math.abs(v.dval / wcsinfo[cstr]); - } else if( wcssys === "physical" ){ - // use the LTM1_1 value stored for logical to image transforms - if( this.lcs && this.lcs.physical ){ - iscale = Math.sqrt(Math.pow(this.lcs.physical.forward[0][0],2)+ - Math.pow(this.lcs.physical.forward[0][1],2)); - v.dval = Math.abs(v.dval * iscale); - } - } - return v.dval; - }; - // get image angle - const getang = (a) => { - const v = JS9.strtoscaled(a); - return v.dval; - }; - // get cleaned-up string - const getstr = (s) => { - const t = s.replace(/^['"]/, "").replace(/["']$/, ""); - return t; - }; - // sanity check - s = s.trim(); - if( !s.match(charrexp) ){ - return s; - } - // save original wcs - owcssys = this.getWCSSys(); - owcsunits = this.getWCSUnits(); - // this is the default wcs for regions - wcssys = "physical"; - // do we have a real wcs? - iswcs = JS9.isWCSSys(wcssys); - // get individual "lines" (new-line or semi-colon separated) - lines = s.split(seprexp); - // for each region or cmd - for(i=0; i= 2 && - obj.shape !== "line" && - obj.shape !== "polygon" ){ - // get image position - $.extend(obj, getipos(robj.args[0], robj.args[1])); - } - // if textOpts has ra, dec, save the wcssys, it may be - // different by the time textOpts gets processed - if( obj.textOpts && - obj.textOpts.ra !== undefined && - obj.textOpts.dec !== undefined ){ - obj.textOpts._wcssys = wcssys; - } - // region args are optional - switch(robj.cmd){ - case "annulus": - if( alen > 0 ){ - obj.radii = []; - for(j=2; j= 3 ){ - obj.width = getilen(robj.args[2], 1); - } - if( alen >= 4 ){ - obj.height = getilen(robj.args[3], 2); - } - if( alen >= 5 ){ - obj.angle = getang(robj.args[4]); - } - break; - case "circle": - if( alen >= 3 ){ - obj.radius = getilen(robj.args[2], 1); - } - break; - case "ellipse": - if( alen >= 3 ){ - obj.r1 = getilen(robj.args[2], 1); - } - if( alen >= 4 ){ - obj.r2 = getilen(robj.args[3], 2); - } - if( alen >= 5 ){ - obj.angle = getang(robj.args[4]); - } - break; - case "line": - case "polygon": - if( alen > 0 ){ - obj.pts = []; - for(j=0, k=0; j= 3 ){ - obj.text = getstr(robj.args[2]); - } - if( alen >= 4 ){ - obj.angle = getang(robj.args[3]); - } - break; - default: - break; - } - // comment contains the tags - if( robj.comment ){ - obj.tags = robj.comment; - } - // save this region - regions.push(obj); - } else { - // if its a wcs command - if( robj.cmd.match(wcsrexp) ){ - // reset the wcs system - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - this.setWCSSys(robj.cmd, false); - JS9.globalOpts.xeqPlugins = txeq; - // get new wcssys - wcssys = this.getWCSSys(); - // is this a real wcs? - iswcs = JS9.isWCSSys(wcssys); - } else if( robj.cmd === "remove" || robj.cmd === "delete" ){ - regions.push({remove: true}); - } - } - } - } - // restore original wcs - txeq = JS9.globalOpts.xeqPlugins; - JS9.globalOpts.xeqPlugins = false; - this.setWCSSys(owcssys, false); - this.setWCSUnits(owcsunits); - JS9.globalOpts.xeqPlugins = txeq; - // return the generated object - return regions; -}; - -// save regions to a file -JS9.Regions.saveRegions = function(fname, which, layer){ - let i, s, t, header, regstr, format, blob, opts, arr, rid; - // see if default type is implicit in the output file - if( fname ){ - arr = fname.match(/\.([^.]*)$/); - if( arr && arr[1] && arr[1].match(/^(reg|svg|csv)$/) ){ - format = arr[1]; - } - } - // layer can be a layer name or an object describing layer, output type - if( typeof layer === "object" ){ - opts = layer; - layer = null; - } else if( layer && typeof layer === "string" ){ - try{ opts = JSON.parse(layer); } - catch(e){ opts = null; } - if( opts ){ layer = null; } - } - // see if parameters are in the opts object - if( opts ){ - // layer name - if( JS9.notNull(opts.layer) ){ - layer = opts.layer; - } - // old style 'type' property is now ... - if( JS9.notNull(opts.type) ){ - format = opts.type ; - } - // ... format - if( JS9.notNull(opts.format) ){ - format = opts.format ; - } - } - // make sure we have an opts - opts = opts || {}; - // last chance ... use defaults - layer = layer || "regions"; - format = format || "reg"; - // and make a sanity check - if( !this.layers[layer] ){ - JS9.error(`can't find layer for saveRegions: ${layer}`); - } - // construct final output file name, if necessary - if( !fname ){ - if( layer !== "regions" ){ - fname = `js9_${layer}.${format}`; - } else { - fname = `js9.${format}`; - } - } - // generate the specified output - switch(format){ - case "svg": - // convert layer to svg - try{ - // add border box, if necessary - if( JS9.globalOpts.svgBorder ){ - rid = this.addShapes(layer, "box", - {left: this.rgb.img.width/2, - top: this.rgb.img.height/2, - width: this.rgb.img.width, - height: this.rgb.img.height, - color: "black", - strokeWidth: 1, - tags: "SVGBorder" - }); - } - // convert canvas to SVG - s = this.layers[layer].dlayer.canvas.toSVG(); - // remove border box, if necessary - if( JS9.globalOpts.svgBorder ){ - this.removeShapes(layer, rid); - } - } - catch(e){ JS9.error(`can't convert layer to SVG: ${layer}`);} - break; - case "csv": - // convert layer to region string - try{ - opts.mode = 1; - opts.file = fname; - // when saving csv, we might want to include the wcs info - if( JS9.isNull(opts.includewcs) ){ - opts.includewcs = JS9.globalOpts.csvIncludeWCS; - } - // when saving reg, we might want to exclude the dcoord shapes - if( JS9.isNull(opts.savedcoords) ){ - opts.includedcoords = JS9.globalOpts.regSaveDCoords; - } - // list of regions - regstr = this.listRegions(which, opts, layer); - // convert to csv - arr = regstr.split(";"); - for(i=0, s=""; ii.trim()); - } - if( !$.isArray(remtags) ){ - remtags = remtags.split(",").map(i=>i.trim()); - } - s = this.getShapes("regions", which); - // for each shape ... - for(i=0; i background, include <-> exclude -// e.g. im.toggleRegionTags("selected", "source", "background"); -// call using image context -JS9.Regions.toggleRegionTags = function(which, x1, x2){ - let i, j, s, tags, xnew; - which = which || "all"; - s = this.getShapes("regions", which); - for(i=0; i { - let i, x, y; - if( !ann.text ){ - return null; - } - x = ann.x || 0; - if( ann.y.toUpperCase() === "%Y" ){ - for(i=1; i x ){ - y = Math.max(data[i-1][1], data[i][1], data[i+1][1]); - break; - } - } - } else { - y = ann.y; - } - return {x, y}; - }; - switch( JS9.globalOpts.plotLibrary ){ - case "flot": - yTextOffset = -25; - divjq.find(".plotAnnotation").remove(); - for(i=0; i divjq.width()) ){ - continue; - } - ahtml = sprintf("
    %s
    ", - ao.left, ao.top+yTextOffset, - ac, `↓${ann.text}`); - divjq.append(ahtml); - } - break; - case "plotly": - yTextOffset = -30; - for(i=0; i { - if( val === undefined ){ - return undefined; - } - if( (typeof val === "number") && (val % 1 !== 0) ){ - val = Math.round((val + 0.001) * 100) / 100; - } - return(String(val)); - }; - // sanity check - if( !plot || !pobj ){ return; } - // convenience variables - winid = plot.winid; - wid = $(winid).attr("id"); - form = `#${wid} #plotConfigForm `; - // flot support only for now ... - if( JS9.globalOpts.plotLibrary !== "flot" ){ return; } - // fill in the values from the plot - $(`${form}.val`).each((index, element) => { - val = ""; - key = $(element).attr("name"); - // key-specific pre-processing - switch(key){ - case "xscale": - if( JS9.notNull(pobj.curscale.x) ){ - val = fmt(pobj.curscale.x); - } - break; - case "xmin": - if( JS9.notNull(plot.getAxes().xaxis.options.min) ){ - val = fmt(plot.getAxes().xaxis.options.min); - } - break; - case "xmax": - if( JS9.notNull(plot.getAxes().xaxis.options.max) ){ - val = fmt(plot.getAxes().xaxis.options.max); - } - break; - case "yscale": - if( JS9.notNull(pobj.curscale.y) ){ - val = fmt(pobj.curscale.y); - } - break; - case "ymin": - if( JS9.notNull(plot.getAxes().yaxis.options.min) ){ - val = fmt(plot.getAxes().yaxis.options.min); - } - break; - case "ymax": - if( JS9.notNull(plot.getAxes().yaxis.options.max) ){ - val = fmt(plot.getAxes().yaxis.options.max); - } - break; - default: - break; - } - $(element).val(val); - }); - // save the image for later processing - $(form).data("im", this); - // save the plot object for later processing - $(form).data("plot", plot); - // save the plot opts object for later processing - $(form).data("pobj", pobj); - // save the window id for later processing - $(form).data("winid", winid); - // add tooltip callbacks (not mobile: ios buttons stop working!) - if( !$(form).data("tooltipInit") ){ - $(form).data("tooltipInit", true); - if( JS9.BROWSER[3] ){ - mover = "touchstart"; - mout = "touchend"; - } else { - mover = "mouseover"; - mout = "mouseout"; - } - $(".plotcol_P").on(mover, (e) => { - let title; - const target = e.currentTarget; - const tooltip = $(target).find("input").data("tooltip"); - const el = $(target) - .closest(JS9.lightOpts[JS9.LIGHTWIN].top) - .find(JS9.lightOpts[JS9.LIGHTWIN].dragBar); - if( tooltip && el.length ){ - // change title: see dhtmlwindow.js load() @line 130 - title = `${JS9.Plot.opts.title}: ${tooltip}`; - $(el)[0].childNodes[0].nodeValue = title; - } - }); - $(".plotcol_P").on(mout, (e) => { - const target = e.currentTarget; - const el = $(target) - .closest(JS9.lightOpts[JS9.LIGHTWIN].top) - .find(JS9.lightOpts[JS9.LIGHTWIN].dragBar); - if( el.length ){ - $(el)[0].childNodes[0].nodeValue = JS9.Plot.opts.title; - } - }); - } -}; - -// process the plot config form: called with the image context -// eslint-disable-next-line no-unused-vars -JS9.Plot.processConfigForm = function(form, plot, pobj, arr){ - let i, key, val; - const alen = arr.length; - // sanity check - switch( JS9.globalOpts.plotLibrary ){ - case "flot": - break; - case "plotly": - return; - } - // process array of keyword/values - for(i=0; i we were way off scale - try{ s = JS9.wcs2pix(cim.raw.wcs, ra, dec); } - catch(e){ s = null; } - if( s ){ - arr = s.trim().split(/\s+/); - x = parseFloat(arr[0]); - y = parseFloat(arr[1]); - // if image pos is within the image boundaries ... - if( x > 0 && x < w && y > 0 && y < h ){ - // draw the crosshair, centered on the image pos - hopts = {pts: [{x: 0, y: y}, {x: w, y: y}], - redraw:false}; - cim.changeShapes(layername, cim.crosshair.h, hopts); - vopts = {pts: [{x: x, y: 0}, {x: x, y: h}], - redraw: true}; - cim.changeShapes(layername, cim.crosshair.v, vopts); - cim.crosshair.visible = true; - } - } - } - } - } -}; - -// hide: move the crosshair out of the display -// eslint-disable-next-line no-unused-vars -JS9.Crosshair.hide = function(im, ipos, evt){ - const layername = JS9.Crosshair.LAYERNAME; - const opts = JS9.Crosshair.opts.hiddenPts; - // sanity check - if( !im ){ return; } - // if the crosshair is visible ... - if( (im.crosshair && im.crosshair.visible) || - im.tmp.arrowCrosshairVisible ){ - // move it off the display - im.changeShapes(layername, im.crosshair.h, opts); - im.changeShapes(layername, im.crosshair.v, opts); - im.crosshair.visible = false; - delete im.tmp.arrowCrosshairVisible; - } -}; - -// image load: create the cross hair for this image -JS9.Crosshair.create = function(im){ - const opts = JS9.Crosshair.opts.hiddenPts; - const layername = JS9.Crosshair.LAYERNAME; - // sanity check - if( !im ){ return; } - if( !im.crosshair ){ - // create the crosshair object for this image - im.crosshair = {}; - // create the crosshair, but don't display it yet - im.crosshair.h = im.addShapes(layername, "line", opts); - im.crosshair.v = im.addShapes(layername, "line", opts); - im.crosshair.visible = false; - } -}; - -// mark key actions which use the shift key -JS9.Crosshair.keyaction = function(im, ipos, evt){ - if( im && evt && evt.shiftKey ){ - im.tmp.shiftKey = true; - } -}; - -// unmark key action-based shift key use -JS9.Crosshair.keyup = function(im, ipos, evt){ - // remove shiftKey marker, if necessary - if( im && im.tmp.shiftKey && evt && !evt.shiftKey ){ - delete im.tmp.shiftKey; - } -}; - -// init: create the shape layer for this display -JS9.Crosshair.init = function(){ - let i; - const layername = JS9.Crosshair.LAYERNAME; - // init the crosshair shape layer, but only once per display - for(i=0; i 1 ){ - tscale = 10; - } else if( trange > 0.1 ){ - tscale = 100; - } else if( trange > 0.01 ){ - tscale = 1000; - } else if( trange > 0.001 ){ - tscale = 10000; - } else if( trange > 0.0001 ){ - tscale = 100000; - } else { - tscale = 1000000; - } - out0 = Math.floor(in0 * tscale) / tscale; - out1 = Math.ceil(in1 * tscale) / tscale; - outinc = Math.ceil(((out1 - out0) / n) * tscale) / tscale; - return {lo: out0, hi: out1, inc: outinc}; -}; - -// generate label value -JS9.Grid.getLabel = function(opts, v, which){ - let i, t, idx, arr; - let doall = false; - switch(opts.wcsunits){ - case "sexagesimal": - if( (which === "ra") && - ((opts.wcssys !== "galactic") && (opts.wcssys !== "ecliptic")) ){ - v /= 15.0; - } - t = JS9.saodtostr(v, ":", opts.sexaPrec); - arr = t.split(":"); - if( opts.last[which] ){ - t = ""; - for(i=0; i= -opts.margin && x <= raw.width + opts.margin && - y >= -opts.margin && y <= raw.height + opts.margin ){ - t += String(`${x + 1},${y}${1}, `); - n++; - if( lineloc === 0 ){ - lineloc = 1; - if( dec < xdeclim ){ - inc = xdecinc; - } - } else if( lineloc === 1 ){ - if( dec > xdeclim ){ - lineloc = 2; - inc = xdecinc0; - } - } - } else { - if( lineloc === 1 ){ - lineloc = 2; - dec = dec - inc; - inc = xdecinc0; - } - } - } - } - if( n > 1 ){ - s += t.replace(/,\s+$/, ") "); - s += ` {"color": "${opts.lineColor}"};`; - } - } - // lines of constant Dec - for(dec=dec0; dec<=dec1; dec=dec+decinc){ - t = "line("; - inc = xrainc0; - lineloc = 0; - n = 0; - for(ra=ra0; ra<=ra1; ra=ra+inc){ - arr = JS9.wcs2pix(raw.wcs, ra, dec).trim().split(/ +/); - if( arr && arr.length ){ - x = parseFloat(arr[0]); - y = parseFloat(arr[1]); - if( x >= -opts.margin && x <= raw.width + opts.margin && - y >= -opts.margin && y <= raw.height + opts.margin ){ - t += String(`${x + 1},${y}${1}, `); - n++; - if( lineloc === 0 ){ - lineloc = 1; - if( ra < xralim ){ - inc = xrainc; - } - } else if( lineloc === 1 ){ - if( ra > xralim ){ - lineloc = 2; - inc = xrainc0; - } - } - } else { - if( lineloc === 1 ){ - lineloc = 2; - ra = ra - inc; - inc = xrainc0; - } - } - } - } - if( n > 1 ){ - s += t.replace(/,\s+$/, ") "); - s += ` {"color": "${opts.lineColor}"};`; - } - } - // dec labels along constant ra line - decoffx = opts.labelDecOffx / this.rgb.sect.zoom; - decoffy = opts.labelDecOffy / this.rgb.sect.zoom; - decskip = 0; - lastra = ra0; - for(ra=ra0, got=0; ra<=ra1; ra=ra+rainc){ - for(dec=dec0; dec<=dec1; dec=dec+decinc){ - arr = JS9.wcs2pix(raw.wcs, ra, dec).trim().split(/ +/); - if( arr && arr.length ){ - x = parseFloat(arr[0]); - y = parseFloat(arr[1]); - dpos = this.imageToDisplayPos({x, y}); - if( dpos.x > (this.ix+opts.labelMargin) && dpos.x < (this.rgb.img.width+this.ix-opts.labelMargin) && - dpos.y > (this.iy+opts.labelMargin) && dpos.y < (this.rgb.img.height+this.iy-opts.labelMargin)){ - if( decskip >= opts.decSkip ){ - s += sprintf('text(%s,%s,%s,%s) {"color":"%s", "fontFamily":"%s", "fontSize":%s, "fontStyle":"%s", "fontWeight":"%s", "originX":"left", "originY":"top"};', - x + decoffx, y + decoffy, - JS9.Grid.getLabel.call(this, opts, dec, "dec"), - opts.decAngle, - opts.labelColor, - opts.labelFontFamily, - opts.labelFontSize, - opts.labelFontStyle, - opts.labelFontWeight); - got++; - } else { - if( ra !== lastra ){ - decskip++; - } - lastra = ra; - } - } - } - } - if( got ){ - break; - } - } - // ra labels along constant dec line - raoffx = opts.labelRAOffx / this.rgb.sect.zoom; - raoffy = opts.labelRAOffy / this.rgb.sect.zoom; - raskip = 0; - lastdec = dec0; - for(dec=dec0, got=0; dec<=dec1; dec=dec+decinc){ - for(ra=ra0; ra<=ra1; ra=ra+rainc){ - arr = JS9.wcs2pix(raw.wcs, ra, dec).trim().split(/ +/); - if( arr && arr.length ){ - x = parseFloat(arr[0]); - y = parseFloat(arr[1]); - dpos = this.imageToDisplayPos({x, y}); - if( dpos.x > (this.ix+opts.labelMargin) && dpos.x < (this.rgb.img.width+this.ix-opts.labelMargin) && - dpos.y > (this.iy+opts.labelMargin) && dpos.y < (this.rgb.img.height+this.iy-opts.labelMargin)){ - if( raskip >= opts.raSkip ){ - s += sprintf('text(%s,%s,%s,%s) {"color":"%s", "fontFamily":"%s", "fontSize":%s, "fontStyle":"%s", "fontWeight":"%s", "originX":"left", "originY":"top"};', - x + raoffx, y + raoffy, - JS9.Grid.getLabel.call(this, opts, ra, "ra"), - opts.raAngle, - opts.labelColor, - opts.labelFontFamily, - opts.labelFontSize, - opts.labelFontStyle, - opts.labelFontWeight); - got++; - } else { - if( dec !== lastdec ){ - raskip++; - } - lastdec = dec; - } - } - } - } - if( got ){ - break; - } - } - // add the grid shapes - this.addShapes(JS9.Grid.LAYERNAME, s, opts); - // grid is complete and active - this.tmp.gridStatus = "active"; -}; - -// toggle grid on/off -JS9.Grid.toggle = function(im){ - // sanity check - if( !im ){ return; } - // toggle display - switch(im.tmp.gridStatus){ - case undefined: - case null: - case "inactive": - // start afresh - im.displayCoordGrid(true); - break; - case "active": - // clear the grid - im.displayCoordGrid(false); - break; - case "processing": - default: - break; - } -}; - -// display grid, as needed -JS9.Grid.regrid = function(im){ - if( im ){ - // ignore if grid is not active or the image is not loaded - if( im.tmp.gridStatus !== "active" || im.status.load !== "complete" ){ - return; - } - // redraw the grid - im.displayCoordGrid(true); - } -}; - -// plugin init: load our grid methods -// eslint-disable-next-line no-unused-vars -JS9.Grid.init = function(opts){ - let dlayer; - opts = $.extend(true, {}, JS9.Catalogs.opts, JS9.Grid.opts, opts); - // init the display shape layer - dlayer = this.display.newShapeLayer(JS9.Grid.LAYERNAME, opts); - // mouse up: no-op - dlayer.canvas.on("mouse:up", () => { - return false; - }); -}; - -// add to image prototypes -JS9.Image.prototype.displayCoordGrid = JS9.Grid.display; - -// check if an object is an image handle -JS9.isImage = function(s){ - if( typeof s === "object" && - JS9.notNull(s.id) && - JS9.notNull(s.raw) && - JS9.notNull(s.rgb) && - JS9.notNull(s.params) && - JS9.notNull(s.display) ){ - return true; - } if( typeof s === "string" && JS9.lookupImage(s) ){ - return true; - } - return false; -}; - -// --------------------------------------------------------------------- -// Dysel: callbacks when a display is selected dynamically -// --------------------------------------------------------------------- - -JS9.Dysel = {}; -JS9.Dysel.CLASS = "JS9"; -JS9.Dysel.NAME = "Dysel"; - -JS9.Dysel.display = null; -JS9.Dysel.plugins = []; - -// plugin init: no op -// eslint-disable-next-line no-unused-vars -JS9.Dysel.init = function(opts){ - return; -}; - -// unhighlight current selection -JS9.Dysel.unhighlightSelection = function(){ - if( JS9.bugs.webkit_resize ){ - $(".JS9").find(".JS9Image").removeClass("JS9Highlight"); - } else { - $(".JS9").removeClass("JS9Highlight"); - } -}; - -// highlight display when dynamic selection is made -JS9.Dysel.highlightSelection = function(im){ - let disp; - // sanity check - if( !im || !JS9.Dysel.retrievePlugins().length ){ return; } - // optimization: no processing if we only have one display - if( JS9.displays.length === 1 ){ return; } - // unhighlight all - JS9.Dysel.unhighlightSelection(); - // the display to highlight - disp = im.display; - // highlight selected - if( JS9.bugs.webkit_resize ){ - $(disp.divjq).find(".JS9Image").addClass("JS9Highlight"); - } else { - $(disp.divjq).addClass("JS9Highlight"); - } -}; - -// add to dynamic selection array -JS9.Dysel.addPlugins = function(plugin){ - JS9.Dysel.plugins.push(plugin); -}; - -// get dynamic selection array -JS9.Dysel.retrievePlugins = function(){ - return JS9.Dysel.plugins; -}; - -// return current dynamically selected display -JS9.Dysel.getDisplay = function(which){ - if( !JS9.Dysel.retrievePlugins().length ){ - return null; - } - if( which === "previous" ){ - return JS9.Dysel.odisplay; - } - return JS9.Dysel.display; -}; - -// return the display object associated with the current dynamic selection -// or else a default value -JS9.Dysel.getDisplayOr = function(def){ - if( def === "previous" ){ - return JS9.Dysel.getDisplay(def); - } - return JS9.Dysel.getDisplay() || def; -}; - -// set current dynamically selected display -JS9.Dysel.select = function(display){ - // sanity check - if( !display || !JS9.Dysel.retrievePlugins().length ){ return; } - // save old display - JS9.Dysel.odisplay = JS9.Dysel.display; - // set new display - JS9.Dysel.display = display; - if( display.image ){ - JS9.Dysel.highlightSelection(display.image); - // plugin callbacks for selected display - display.image.xeqPlugins("image", "ondynamicselect", null); - } -}; - -// imageload: select the display -JS9.Dysel.imageload = function(im){ - if( im ){ - JS9.Dysel.select(im.display); - } -}; - -// imageclose: select another display, if necessary -JS9.Dysel.imageclose = function(im){ - let i, got, disp; - if( im ){ - disp = JS9.Dysel.getDisplay(); - if( !disp || disp.image !== im ){ - return; - } - // if this the last image in this display? - for(i=0, got=0; i>> 0; - - // 3. If len is 0, return false. - if (len === 0) { - return false; - } - - // 4. Let n be ? ToInteger(fromIndex). - // (If fromIndex is undefined, this step produces the value 0.) - var n = fromIndex | 0; - - // 5. If n ≥ 0, then - // a. Let k be n. - // 6. Else n < 0, - // a. Let k be len + n. - // b. If k < 0, let k be 0. - var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0); - - function sameValueZero(x, y) { - return x === y || (typeof x === "number" && typeof y === "number" && isNaN(x) && isNaN(y)); - } - - // 7. Repeat, while k < len - while (k < len) { - // a. Let elementK be the result of ? Get(O, ! ToString(k)). - // b. If SameValueZero(searchElement, elementK) is true, return true. - // c. Increase k by 1. - if (sameValueZero(o[k], searchElement)) { - return true; - } - k++; - } - - // 8. Return false - return false; - } - }); -} - -// make a copy of the raw data -// used by setFlip and setRot90 -JS9.getRawCopy = function(oraw, bitpix){ - // make copy - let nraw = $.extend(true, {}, oraw); - nraw.bitpix = bitpix || oraw.bitpix; - switch(nraw.bitpix){ - case 8: - nraw.data = new Uint8Array(oraw.data); - break; - case 16: - nraw.data = new Int16Array(oraw.data); - break; - case -16: - nraw.data = new Uint16Array(oraw.data); - break; - case 32: - nraw.data = new Int32Array(oraw.data); - break; - case -32: - nraw.data = new Float32Array(oraw.data); - break; - case -64: - nraw.data = new Float64Array(oraw.data); - break; - default: - JS9.error(`unsupported bitpix: ${nraw.bitpix}`); - break; - } - return nraw; -}; - -// extract line from raw data -// used by setFlip and setRot90 -JS9.getRawLine = function(oraw, ooff, nraw, noff){ - let obuf, nbuf; - switch(oraw.bitpix){ - case 8: - obuf = new Uint8Array(oraw.data.buffer, ooff, oraw.width); - nbuf = new Uint8Array(nraw.data.buffer, noff, oraw.width); - break; - case 16: - case -16: - obuf = new Uint16Array(oraw.data.buffer, ooff, oraw.width); - nbuf = new Uint16Array(nraw.data.buffer, noff, oraw.width); - break; - case 32: - obuf = new Uint32Array(oraw.data.buffer, ooff, oraw.width); - nbuf = new Uint32Array(nraw.data.buffer, noff, oraw.width); - break; - case -32: - obuf = new Float32Array(oraw.data.buffer, ooff, oraw.width); - nbuf = new Float32Array(nraw.data.buffer, noff, oraw.width); - break; - case -64: - obuf = new Float64Array(oraw.data.buffer, ooff, oraw.width); - nbuf = new Float64Array(nraw.data.buffer, noff, oraw.width); - break; - default: - JS9.error(`unsupported bitpix: ${oraw.bitpix}`); - break; - } - return [obuf, nbuf]; -}; - -// https://www.html5rocks.com/en/tutorials/webgl/typed_arrays/ -JS9.memcpy = function(dst, dstOffset, src, srcOffset, length){ - var dstU8 = new Uint8Array(dst, dstOffset, length); - var srcU8 = new Uint8Array(src, srcOffset, length); - dstU8.set(srcU8); -}; - -// set explicit focus for IPython/Jupyter support -JS9.jupyterFocus = function(el, el2){ - let eljq; - if( {}.hasOwnProperty.call(window, "Jupyter") ){ - if( el instanceof jQuery ){ - eljq = el; - } else { - eljq = $(el); - } - el2 = el2 || "input, textarea"; - eljq.find(el2).each((index, element) => { - Jupyter.keyboard_manager.register_events($(element)); - }); - } -}; - -// return a unique value for a given image id by appending to the id -JS9.getImageID = function(imid, dispid, myim){ - let i, im, s; - let ids = 0; - let idmax = 1; - const imlen = JS9.images.length; - const rexp = /.*<([0-9][0-9]*)>$/; - const rexp2 = /<[0-9][0-9]*>/; - imid = JS9.cleanPath(imid.replace(rexp2, ""), "id"); - for(i=0; i= 0 ){ - s = im.id.replace(rexp, "$1"); - idmax = Math.max(idmax, parseInt(s, 10)); - } - ids++; - } - } - } - if( ids ){ - return `${imid}<${String(idmax+1)}>`; - } - return imid; -}; - -// return a unique value for ids -JS9.uniqueID = (function(){ - let id = 1; // initial value - return function(){ - return id++; - }; -}()); - -// change cursor to waiting/not waiting -JS9.waiting = function(mode, display){ - let el, opts, tdisp; - switch(mode){ - case true: - if( {}.hasOwnProperty.call(window, "Spinner") && - (JS9.globalOpts.waitType === "spinner") ){ - if( display ){ - if( typeof display === "object" ){ - el = display.divjq[0]; - } else if( typeof display === "string" ){ - tdisp = JS9.lookupDisplay(display); - if( tdisp ){ - el = tdisp.divjq[0]; - } - } - } - if( !el ){ - el = $("body").get(0); - } - if( !JS9.spinner ){ - JS9.spinner = {}; - opts = {color: JS9.globalOpts.spinColor, - opacity: JS9.globalOpts.spinOpacity}; - JS9.spinner.spinner = new Spinner(opts); - } - JS9.spinner.spinner.spin(el); - } else { - $("body").addClass("waiting"); - } - break; - case false: - if( {}.hasOwnProperty.call(window, "Spinner") && - (JS9.globalOpts.waitType === "spinner") ){ - if( JS9.spinner ){ - JS9.spinner.spinner.stop(); - } - } else { - $("body").removeClass("waiting"); - } - break; - } -}; - -// display a progress bar -JS9.progress = function(arg1, arg2){ - if( (typeof arg1 === "boolean") || (typeof arg1 === "string") ){ - switch(arg1){ - case true: - case "indeterminate": - if( arg2 ){ - JS9.progress.display = arg2; - JS9.progress.display.displayMessage("progress", arg1); - } - break; - case false: - case "": - if( JS9.progress.display ){ - JS9.progress.display.clearMessage("progress"); - delete JS9.progress.display; - } - break; - } - } else if( typeof arg1 === "number" ){ - if( JS9.progress.display ){ - JS9.progress.display.displayMessage("progress", [arg1, arg2]); - } - } -}; - -// msg coming from socket.io or postMessage -JS9.msgHandler = function(msg, cb){ - let i, s, obj, tdisp, res, dobj; - let args = []; - const cmd = msg.cmd; - const id = msg.id; - const oalerts = JS9.globalOpts.alerts; - const rstr = JS9.globalOpts.quietReturn ? "" : "OK"; - const getDisplayObject = (id, args) => { - if( id ){ - // bash sends a string, not an object - if( args.length > 0 ){ - s = args[args.length-1]; - if( typeof s === "string" ){ - try{ obj = JSON.parse(s); } - catch(e){ obj = null; } - } else if( typeof s === "object" ){ - obj = s; - } - // is this the display object? see JS9.parsePublicArgs - if( obj && - (typeof obj === "object") && - {}.hasOwnProperty.call(obj, "display") && - (Object.keys(obj).length === 1) ){ - // remove the current display object - args.pop(); - // return the new one - return obj; - } else { - return {display: id}; - } - } else { - return {display: id}; - } - } - return null; - }; - // turn off alerts - if( cb ){ - JS9.globalOpts.alerts = false; - } - // look for a public API call - if( JS9.publics[cmd] ){ - // check for non-array first arg - if( !$.isArray(msg.args) ){ - msg.args = [msg.args]; - } - // change empty quoted strings to empty strings - for(i=0; i { - rval.close(); - }) - .on("touchend", (e) => { - const curtime = (new Date()).getTime(); - const lasttime = $(e.currentTarget).data("lasttime"); - if( lasttime && - (curtime - lasttime) > JS9.DBLCLICK0 && - (curtime - lasttime) < JS9.DBLCLICK ){ - rval.close(); - } - $(e.currentTarget).data("lasttime", curtime); - }); - // if ios user failed to close the window via the close button, - // give a hint (once per session only!) - $(`#${id} ${JS9.lightOpts[JS9.LIGHTWIN].dragBar}`) - .on("touchend", () => { - // skip check if we are dragging - if( !dhtmlwindow.distancex && !dhtmlwindow.distancey ){ - if( JS9.lightOpts.nclick >= 2 ){ - alert("trouble closing this window? double-tap the window handle"); - JS9.lightOpts.nclick = -1; - } else { - if( JS9.lightOpts.nclick >= 0 ){ - JS9.lightOpts.nclick++; - } - } - } else { - if( JS9.lightOpts.nclick > 0 ){ - JS9.lightOpts.nclick = 0; - } - } - }); - break; - default: - break; - } - return rval; -}; - -// wrapper for new func to avoid jslint errors -JS9.checkNew = function(obj){ - if( !obj ){ - JS9.error("internal failure in a JS9 constructor"); - } -}; - -// desperate attempt to regularize the control/meta key -JS9.specialKey = function(e){ - return (e.metaKey || e.ctrlKey); -}; - -// desperate attempt to regularize the stracktrace message -JS9.strace = function(e){ - let s = ""; - if( JS9.DEBUG > 1 ){ - s = e.stack || e.stacktrace || ""; - } - return s; -}; - -// try to make a nice string from a float -// ints remain ints, floats get truncated at 6 significant digits -JS9.floatToString = function(fval){ - if( typeof fval === "number" ){ - return sprintf("%g", - parseFloat(fval.toFixed(JS9.globalOpts.floatPrecision))); - } else if( typeof fval === "string" ){ - return fval; - } else { - return String(fval); - } -}; - -// figure out precision from range of values (used by colorbar) -// from: /tksao1.0/colorbar/colorbarbase.C -JS9.floatPrecision = function(fval1, fval2){ - let prec; - let aa = Math.floor(Math.log10(Math.abs(fval1))); - let bb = Math.floor(Math.log10(Math.abs(fval2))); -// not sure why prec is set to 1 in the else clause so ... -// if( aa !== bb ){ -// prec = aa > bb ? aa : bb; -// } else { -// prec = 1; -// } - prec = Math.max(aa, bb); - return prec; -}; - -// convert float value to a string with decent precision -// from: /tksao1.0/colorbar/colorbarbase.C -JS9.floatFormattedString = function(fval, prec, jj){ - let fmt; - let s = ""; - if( fval === undefined ){ - return s; - } - if( prec < -2 ){ - fmt = `%.${String(2+jj)}e`; - s = sprintf(fmt, fval); - } else if( prec < 0 ){ - s = fval.toFixed(Math.abs(prec)+3+jj); - } else if( prec < 2 ){ - fmt = `%.${String(prec+jj)}f`; - s = sprintf(fmt, fval); - } else if( prec < 5 ){ - s = fval.toFixed(0+jj); - } else { - fmt = `%.${String(2+jj)}e`; - s = sprintf(fmt, fval); - } - return s; -}; - -// get center of bounding box surrounding a polygon -JS9.centerPolygon = function(points){ - let i, plen, minx, maxx, miny, maxy; - // sanity check - if( !points || !points.length ){ return; } - plen = points.length; - for(i=0; i maxx) ){ - maxx = points[i].x; - } - if( (miny === undefined) || (points[i].y < miny) ){ - miny = points[i].y; - } - if( (maxy === undefined) || (points[i].y > maxy) ){ - maxy = points[i].y; - } - } - return {x: (minx + maxx) / 2.0, y: (miny + maxy) / 2.0}; -}; - -// calculate centroid for a polygon -// wont work for self-intersecting polygons but it's all I do right now! -// adapted from: http://en.wikipedia.org/wiki/Centroid -JS9.centroidPolygon = function(points, doaverage){ - let i, plen, factor, area, cx, cy; - let parta = 0; - let partx = 0; - let party = 0; - let totx = 0; - let toty = 0; - const pts = []; - // sanity check - if( !points || !points.length ){ return; } - // get points - plen = points.length; - // just average the points? - if( doaverage ){ - for(i=0; i 0 ){ - did = im.display.id; - if( !display || - (typeof display === "string" && display === did) || - (typeof display === "object" && display.id === did) ){ - return im; - } - } - } - } - return null; -}; - -// return the display for the specified id -// id can be a display object or an id from a display object -JS9.lookupDisplay = function(id, mustExist){ - let i; - const regexp = new RegExp(`[-_]?(${JS9.PLUGINS})$`); - // default is the id must exist - if( mustExist === undefined ){ - mustExist = true; - } - // lookup id - if( id && (id.toString().search(JS9.SUPERMENU) < 0) ){ - // look for whole id - for(i=0; i { - let blob; - if( xhr.readyState === 4 ){ - if( xhr.status === 200 || xhr.status === 0 ){ - // delete fetch status so JS9.error() does not process it - delete JS9.fetchURL.status; - if( xhr.responseType === "blob" ){ - blob = new Blob([xhr.response]); - // discard path (or scheme) up to slashes - // remove trailing ? params - if( name.match("://") ){ - blob.name = name.split("/").reverse()[0] - .replace(/\?.*$/, ""); - } else { - blob.name = name; - } - // hack for Google Drive's lack of a filename - if( blob.name === "uc" ){ - blob.name = `google_${JS9.uniqueID()}.fits`; - } - if( handler ){ - handler(blob, opts); - } else { - JS9.Load(blob, opts); - } - } else { - if( opts.display ){ - handler(xhr.response, opts, {display: opts.display}); - } else { - handler(xhr.response, opts); - } - } - } else if( xhr.status === 404 ){ - JS9.error(`could not find ${url}`); - } else { - JS9.error(`can't load: ${url} ${xhr.statusText} ${xhr.status}`); - } - } - }; - xhr.onerror = () => { - JS9.error(`cannot load: ${url} ... please check the url/pathname`); - }; - xhr.ontimeout = () => { - JS9.error(`timeout awaiting response from server: ${url}`); - }; - // hack: set fetch status for JS9.error() to sense and pass on - // this will be picked up by getStatus("load") - JS9.fetchURL.status = "processing"; - // fetch the data! - try{ xhr.send(); } - catch(e){ JS9.error(`request to load ${url} failed`, e); } -}; - -// JS9 wrapper around saveAs: -// deal with pathnames in Electron desktop app -JS9.saveAs = function(blob, pathname){ - let dirmatch, dirname, basename; - if( window.electron ){ - dirmatch = pathname.match(/.*\//); - // if a directory was specified ... - if( dirmatch && dirmatch[0] ){ - // ... change save directory in Electron before save - dirname = dirmatch[0]; - JS9.SaveDir(dirname, {onceOnly: true}); - } - // get basename - basename = pathname.split('/').reverse()[0]; - // wait a bit for ipc to finish, then save - window.setTimeout(() => { - // save basename in current save directory - try{ saveAs(blob, basename); } - catch(e){ JS9.error("could not saveAs", e); } - }, JS9.TIMEOUT); - } else { - // non-Electron (or no path): just save filename - try{ saveAs(blob, pathname); } - catch(e){ JS9.error("could not saveAs", e); } - } -} - -// configure or return the fits library -JS9.fitsLibrary = function(s){ - let t; - if( !s ){ - return JS9.fits.name; - } - t = s.toLowerCase(); - switch(t){ - case "astroem": - case "cfitsio": - JS9.fits = Astroem; - // set up default options - JS9.fits.options = JS9.fits.options || {}; - JS9.fits.options.handler = JS9.NewFitsImage; - JS9.fits.options.error = JS9.error; - if( JS9.userOpts.fits ){ - JS9.fits.options.extlist = JS9.userOpts.fits.extlist; - JS9.fits.options.table = { - xdim: JS9.userOpts.fits.xdim, - ydim: JS9.userOpts.fits.ydim, - bin: JS9.userOpts.fits.bin || 1 - }; - JS9.fits.options.image = { - xdim: JS9.userOpts.fits.ixdim || JS9.userOpts.fits.xmax, - ydim: JS9.userOpts.fits.iydim || JS9.userOpts.fits.ymax, - bin: JS9.userOpts.fits.ibin || 1 - }; - } else { - JS9.fits.options.extlist = JS9.globalOpts.extlist; - JS9.fits.options.table = {bin: (JS9.globalOpts.table.bin || 1)}; - // NB: dims are deprecated 11/27/16 - if( JS9.notNull(JS9.globalOpts.table.xdim) ){ - JS9.fits.options.table.xdim = JS9.globalOpts.table.xdim; - } else if( JS9.notNull(JS9.globalOpts.dims) ){ - JS9.fits.options.table.xdim = JS9.globalOpts.dims[0]; - } - if( JS9.notNull(JS9.globalOpts.table.ydim) ){ - JS9.fits.options.table.ydim = JS9.globalOpts.table.ydim; - } else if( JS9.notNull(JS9.globalOpts.dims) ){ - JS9.fits.options.table.ydim = JS9.globalOpts.dims[1]; - } - JS9.fits.options.image = {bin: (JS9.globalOpts.image.bin || 1)}; - if( JS9.notNull(JS9.globalOpts.image.xdim) ){ - JS9.fits.options.image.xdim = JS9.globalOpts.image.xdim; - } else if( JS9.notNull(JS9.globalOpts.xmax) ){ - JS9.fits.options.image.xdim = JS9.globalOpts.xmax; - } - if( JS9.notNull(JS9.globalOpts.image.ydim) ){ - JS9.fits.options.image.ydim = JS9.globalOpts.image.ydim; - } else if( JS9.notNull(JS9.globalOpts.ymax) ){ - JS9.fits.options.image.ydim = JS9.globalOpts.ymax; - } - } - if( JS9.fits.maxFITSMemory && JS9.globalOpts.maxMemory ){ - JS9.fits.maxFITSMemory(JS9.globalOpts.maxMemory); - } - break; - default: - JS9.error(`unknown fits library: ${s}`); - break; - } - // common code - JS9.fits.ready = true; - JS9.fits.name = t; - JS9.fits.options.error = JS9.error; - JS9.fits.options.waiting = JS9.waiting; - return t; -}; - -// check for 'real' FITS handling routine and call it. This routine can: -// read a blob as a FITS file -// open an existing virtual FITS file (e.g. created by Montage reprojection) -JS9.handleFITSFile = function(file, opts, handler){ - if( JS9.fits.handleFITSFile ){ - JS9.fits.handleFITSFile(file, opts, handler); - } else { - JS9.error("no FITS module available to process FITS file"); - } -}; - -// cleanup FITS file by deleting vfile, etc -JS9.cleanupFITSFile = function(raw, mode){ - let rexp; - if( JS9.hostFS ){ - rexp = new RegExp(`^${JS9.hostFS}`); - } - if( JS9.fits.cleanupFITSFile && raw && raw.hdu && raw.hdu.fits ){ - // don't delete real local file - if( rexp && raw.hdu.fits.vfile && raw.hdu.fits.vfile.match(rexp) ){ - mode = false; - } - JS9.fits.cleanupFITSFile(raw.hdu.fits, mode); - return true; - } - // just return if no available cleanup routine or no raw data file - return false; -}; - -// load an image (jpeg, png, etc) -JS9.handleImageFile = function(file, options, handler){ - const reader = new FileReader(); - options = $.extend(true, {}, JS9.fits.options, options); - handler = handler || JS9.Load; - reader.onload = (ev) => { - let data, grey, hdu; - const img = new Image(); - img.onload = () => { - let x, y, v, header; - let i = 0; - const canvas = document.createElement("canvas"); - const ctx = canvas.getContext("2d"); - const h = img.height; - const w = img.width; - canvas.width = w; - canvas.height = h; - ctx.drawImage(img, 0, 0); - data = ctx.getImageData(0, 0, w, h).data; - grey = new Float32Array(h*w); - for ( y = 0; y < h; y++ ) { - for ( x = 0; x < w; x++ ) { - // NTSC - v = 0.299 * data[i] + 0.587 * data[i+1] + 0.114 * data[i+2]; - grey[(h - y) * w + x] = v; - i += 4; - } - } - header = {SIMPLE: true, - BITPIX: -32, - NAXIS: 2, - NAXIS1: w, - NAXIS2: h}; - hdu = {filename: file.name, - naxis: 2, axis: [0, w, h], bitpix: -32, bin: 1, - head: header, data: grey, offscreen: img}; - hdu.dmin = Number.MAX_VALUE; - hdu.dmax = Number.MIN_VALUE; - for(i=0; i< h*w; i++){ - if( !Number.isNaN(hdu.data[i]) && - Number.isFinite(hdu.data[i]) ){ - hdu.dmin = Math.min(hdu.dmin, hdu.data[i]); - hdu.dmax = Math.max(hdu.dmax, hdu.data[i]); - } - } - options.source = "img"; - handler(hdu, options); - }; - img.src = ev.target.result; - }; - reader.readAsDataURL(file); -}; - -// check for 'real' FITS handling routine and call it -JS9.getFITSImage = function(fits, hdu, options, handler){ - if( JS9.fits.getFITSImage ){ - JS9.fits.getFITSImage(fits, hdu, options, handler); - } else { - JS9.error("no FITS module available to process FITS image"); - } -}; - -// run fits2fits converter, if necessary -JS9.fits2fits = function(display, file, opts, func){ - let i, s, xdim, ydim, bin, bmode, obj, xcond; - const xopts = {}; - opts = opts || {}; - if( JS9.notNull(opts.fits2fits) ){ - xcond = opts.fits2fits; - } else { - xcond = JS9.globalOpts.fits2fits; - } - if( xcond === true ){ - xcond = "always"; - } else if( xcond === false ){ - xcond = "never"; - } - // if never, we are done - if( xcond.match(/never/i) ){ - return false; - } - // make sure we are set up to run the converter - // requires a connected helper via a socket.io connection - if( !JS9.helper.connected || - (JS9.helper.type !== "nodejs" && JS9.helper.type !== "socket.io") ){ - if( xcond === "always" && JS9.globalOpts.requireFits2Fits ){ - JS9.error("can't run fits2fits without connected JS9 helper"); - } - return false; - } - // if the helper program does not exist, we might want to throw an error - if( !JS9.helper.js9helper ){ - if( JS9.globalOpts.requireFits2Fits ){ - JS9.error("js9helper not found for fits2fits processing"); - } else { - return false; - } - } - // requires a tmp workdir - if( !JS9.globalOpts.workDir ){ - if( JS9.globalOpts.requireFits2Fits ){ - JS9.error("can't run fits2fits without a workdir"); - } - return false; - } - xdim = - opts.xdim || - JS9.fits.options.image.xdim || - JS9.fits.options.table.xdim; - ydim = - opts.ydim || - JS9.fits.options.image.ydim || - JS9.fits.options.table.ydim; - bin = - opts.bin || - JS9.fits.options.image.bin || - JS9.fits.options.table.bin; - bmode = opts.binMode || JS9.globalOpts.binMode; - bmode = bmode === "a" ? "a" : ""; - // handle string bin, possibly containing explicit binMode - if( typeof bin === "string" ){ - if( bin.match(/[as]$/) ){ - bmode = bin.slice(-1); - } - bin = parseInt(bin, 10); - } - bin = Math.max(1, bin || 1); - if( JS9.notNull(opts.xcen) && JS9.notNull(opts.ycen) ){ - xopts.sect = `${xdim}@${opts.xcen},${ydim}@${opts.ycen},${bin}${bmode}`; - } else { - xopts.sect = `${xdim},${ydim},${bin}${bmode}`; - } - s = xcond.toLowerCase().split(/[>,]/); - for(i=0; i { - let robj, rarr, f, pf, nopts; - // return type can be string or object - if( typeof r === "object" ){ - // object from node.js - robj = r; - } else { - // string from cgi - if( r.search(JS9.analOpts.epattern) >=0 ){ - robj = {stderr: r}; - } else { - robj = {stdout: r}; - } - } - if( robj.stderr ){ - JS9.error(robj.stderr, JS9.analOpts.epattern); - } - if( robj.stdout ){ - // look for error condition, which we might throw or swallow - if( robj.stdout.match(/^ERROR:/) ){ - if( JS9.globalOpts.requireFits2Fits ){ - JS9.error(robj.stdout); - } else { - robj.stdout = xopts.fits; - } - } - // output is file and possibly parentFile - rarr = robj.stdout.split(/\n/); - // file - f = JS9.cleanPath(rarr[0]); - if( f === xopts.fits ){ - // same file (imsection not run) - nopts = $.extend(true, {}, opts); - } else { - // new file using imsection - // relative path: add install dir prefix - if( f.charAt(0) !== "/" ){ - f = JS9.InstallDir(f); - } - nopts = $.extend(true, {}, opts); - // but remove already-used section properties from opts - delete nopts.xcen; - delete nopts.ycen; - delete nopts.bin; - // but load entire image section - if( nopts.xdim !== undefined ){ nopts.xdim = 0; } - if( nopts.ydim !== undefined ){ nopts.ydim = 0; } - // save source - nopts.source = "fits2fits"; - // it's a proxy file (i.e., delete it on close) - nopts.proxyFile = f; - // json fits info - if( rarr[1] ){ - try{ obj = JSON.parse(rarr[1]); } - catch(ignore){ /* empty */ } - if( obj ){ - nopts.extname = obj.extname; - nopts.extnum = obj.extnum; - nopts.hdus = obj.hdus; - nopts.parent = obj; - } - } - // look for parentFile (relative to helper, not install) - if( rarr[2] ){ - pf = JS9.cleanPath(rarr[2]); - nopts.parentFile = pf; - // now add extension info, if possible - if( nopts.extname ){ - nopts.parentFile = nopts.parentFile - .replace(/\[.*\]/, ""); - nopts.parentFile += `[${nopts.extname}]`; - } else if( nopts.extnum && (nopts.extnum > 0) ){ - nopts.parentFile = nopts.parentFile - .replace(/\[.*\]/, ""); - nopts.parentFile.file += `[${nopts.extnum}]`; - } - } - // add onload, if necessary - if( func ){ - nopts.onload = func; - } - } - // no recursion! - nopts.fits2fits = false; - // load new file - JS9.Load(f, nopts, {display}); - } - }); - return true; -}; - -// return the specified colormap object (or default) -JS9.lookupColormap = function(name, mustExist){ - let i; - // default is the id must exist - if( mustExist === undefined ){ - mustExist = true; - } - if( !name ){ - name = JS9.imageOpts.colormap; - } - if( name ){ - for(i=0; i", - "47": "?" - }; - // allow direct specification of keycode as a number - if( typeof evt === "number" ){ - c = evt; - } else { - // otherwise its the event - c = evt.which || evt.keyCode; - } - s = String(c); - // normalize keyCode - if( {}.hasOwnProperty.call(_to_ascii, s) ){ - c = _to_ascii[s]; - } - if( !evt.shiftKey && (c >= 65 && c <= 90) ){ - c = String.fromCharCode(c + 32); - } else if( !evt.shiftKey && {}.hasOwnProperty.call(_specialKeys, c) ){ - c = _specialKeys[c]; - } else if( evt.shiftKey && {}.hasOwnProperty.call(_shiftUps, c) ){ - //get shifted keyCode value - c = _shiftUps[c]; - } else { - c = String.fromCharCode(c); - } - // check for special key - if( JS9.specialKey(evt) ){ - c = `M-${c}`; - } - return c; -}; - -// get position of mouse in a canvas -// http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas -JS9.eventToDisplayPos = function(evt, offset){ - // from http://www.quirksmode.org/js/events_properties.html - let i, targ, pageX, pageY, leftOff, upOff, touches, pos; - const XFUDGE = 1; - const YFUDGE = 1; - if( !evt ){ - evt = window.event; - } - if( evt.target ){ - targ = evt.target; - } else if( evt.srcElement ){ - targ = evt.srcElement; - } - if( targ.nodeType === 3 ){ // defeat Safari bug - targ = targ.parentNode; - } - // offset() returns the position of the element relative to the document - offset = offset || $(targ).offset(); - // pageX, pageY: mouse positions relative to the document - // changed touch events: take position from first finger - if( evt.originalEvent ){ - if( evt.originalEvent.touches && - evt.originalEvent.touches.length ){ - touches = evt.originalEvent.touches; - pageX = touches[0].pageX; - pageY = touches[0].pageY; - } else if( evt.originalEvent.changedTouches && - evt.originalEvent.changedTouches.length ){ - touches = evt.originalEvent.changedTouches; - pageX = touches[0].pageX; - pageY = touches[0].pageY; - } else { - pageX = evt.pageX; - pageY = evt.pageY; - } - } else { - // mouse events - pageX = evt.pageX; - pageY = evt.pageY; - } - // position is (evt pos relative to page - pos of element relative to page) - // FUDGE added after visual inspection of line512 at zoom 32 - // I tried to place the mouse, and have the magnifier be in the right place - // Linux, FF & Chrome: x=1, y=1 (5/28/14) - leftOff = offset.left + XFUDGE; - upOff = offset.top + YFUDGE; - // display position - pos = {x: Math.floor(pageX - leftOff), y: Math.floor(pageY - upOff)}; - // touch positions, if necessary - if( touches && touches.length ){ - pos.touches = [{x: pos.x, y: pos.y}]; - for(i=1; i { - let v = []; - let cosb = Math.cos ( b ); - v[0] = Math.cos ( a ) * cosb; - v[1] = Math.sin ( a ) * cosb; - v[2] = Math.sin ( b ); - return v; - }; - // modified from P.T. Wallace (acquired via email 6/29/2020) - const slaDpav = (v1, v2) => { - let x0, y0, z0, w, x1, y1, z1, s, c; - /* Unit vector to point 1. */ - x0 = v1 [ 0 ]; - y0 = v1 [ 1 ]; - z0 = v1 [ 2 ]; - w = Math.sqrt ( x0 * x0 + y0 * y0 + z0 * z0 ); - if( w != 0.0 ) { x0 /= w; y0 /= w; z0 /= w; } - /* Vector to point 2. */ - x1 = v2 [ 0 ]; - y1 = v2 [ 1 ]; - z1 = v2 [ 2 ]; - /* Position angle. */ - s = y1 * x0 - x1 * y0; - c = z1 * ( x0 * x0 + y0 * y0 ) - z0 * ( x1 * x0 + y1 * y0 ); - return ( s != 0.0 || c != 0.0 ) ? Math.atan2 ( s, c ) : 0.0; - }; - const d2r = (x) => { return x * Math.PI / 180; }; - const r2d = (x) => { return x * 180 / Math.PI; }; - a = slaDcs2c(d2r(ra1), d2r(dec1)); - b = slaDcs2c(d2r(ra2), d2r(dec2)); - dist = slaDpav(a, b); - // negation required to be in line with our conventions - dist = -dist; - return r2d(dist); -}; - -// http://stackoverflow.com/questions/13695317/rotate-a-point-around-another-point -// angle is input in degrees -JS9.rotatePoint = function(point, angle, cen) -{ - let cosA, sinA; - cen = cen || {x: 0.0, y: 0.0}; - angle = Math.PI * angle / 180.0; - cosA = Math.cos(angle); - sinA = Math.sin(angle); - return { - x: (cosA * (point.x - cen.x) - sinA * (point.y - cen.y) + cen.x), - y: (sinA * (point.x - cen.x) + cosA * (point.y - cen.y) + cen.y) - }; -}; - -// multiply two matrices -// https://stackoverflow.com/questions/27205018/multiply-2-matrices-in-javascript -JS9.matrixMultiply = function(a, b){ - let r, c, i, m; - const aNumRows = a.length, aNumCols = a[0].length; - // eslint-disable-next-line no-unused-vars - const bNumRows = b.length, bNumCols = b[0].length; - m = new Array(aNumRows); // initialize array of rows - for(r = 0; r < aNumRows; ++r){ - m[r] = new Array(bNumCols); // initialize the current row - for(c = 0; c < bNumCols; ++c){ - m[r][c] = 0; // initialize the current cell - for(i = 0; i < aNumCols; ++i){ - m[r][c] += a[r][i] * b[i][c]; - } - } - } - return m; -}; - -// invert a 3x3 matrix -JS9.invertMatrix3 = function(xin){ - let i, j, det_1; - let pos = 0.0; - let neg = 0.0; - let temp = xin[0][0] * xin[1][1]; - const prec = 1.0e-15; - const xout = [[0,0,0], [0,0,0], [0,0,0]]; - const accum = () => { - if( temp >= 0.0 ){ - pos += temp; - } else { - neg += temp; - } - }; - // sanity check for NaN - for(i=0; i<3; i++){ - for(j=0; j<2; j++){ - if( (xin[i][j] === undefined) || Number.isNaN(xin[i][j]) ){ - return null; - } - } - } - accum(); - temp = -xin[0][1] * xin[1][0]; - accum(); - det_1 = pos + neg; - // Is the submatrix A singular? - if( (det_1 === 0.0) || (Math.abs(det_1 / (pos - neg)) < prec) ){ - // Matrix M has no inverse - return null; - } - // Calculate inverse(A) = adj(A) / det(A) - det_1 = 1.0 / det_1; - xout[0][0] = xin[1][1] * det_1; - xout[1][0] = - xin[1][0] * det_1; - xout[0][1] = - xin[0][1] * det_1; - xout[1][1] = xin[0][0] * det_1; - // Calculate -C * inverse(A) - xout[2][0] = - (xin[2][0] * xout[0][0] + xin[2][1] * xout[1][0]); - xout[2][1] = - (xin[2][0] * xout[0][1] + xin[2][1] * xout[1][1]); - return xout; -}; - -// is this a string representation of a number? -// https://stackoverflow.com/questions/175739/built-in-way-in-javascript-to-check-if-a-string-is-a-valid-number -// NB: don't use Number.XXX routines, they don't work .. "2016-5" returns true -JS9.isNumber = function(s){ - return !isNaN(parseFloat(s)) && isFinite(s); -}; - -// check if a variable is neither undefined nor null -JS9.notNull = function(s){ - return s !== undefined && s !== null; -}; - -// check if a variable is either undefined or null -JS9.isNull = function(s){ - return s === undefined || s === null; -}; - -// use a default if a variable is either undefined or null -JS9.defNull = function(s, def){ - return JS9.notNull(s) ? s : def; -}; - -// check if a wcs system is a world coordinate system (fk5, etc) -JS9.isWCSSys = function(s){ - return s !== "image" && s !== "physical"; -}; - -// check if a wcs system is not a world coordinate system (fk5, etc) -JS9.notWCS = function(s){ - return s === "image" || s === "physical"; -}; - -// was last parsed string in units of hours/min/sec (using specified wcssys)? -JS9.isHMS = function(wcssys, dtype){ - dtype = dtype || String.fromCharCode(JS9.saodtype()); - return (dtype === ":" || dtype === "h") && - wcssys !== "galactic" && - wcssys !== "ecliptic"; -}; - -// is this a HEALPix image? -JS9.ishealpix = function(im){ - return im && - im.imtab === "table" && - im.raw && im.raw.header && - im.raw.header.CTYPE1 && im.raw.header.CTYPE1.match(/--HPX/i); -}; - -// is the proxy server available for LoadProxy() call? -JS9.proxyAvailable = function(){ - return JS9.globalOpts.loadProxy && - !JS9.allinone && - JS9.globalOpts.helperType !== "none" && - JS9.globalOpts.workDir; -} - -// parse a FITS card and return name and value -JS9.cardpars = function(card){ - let value; - let name = card.slice(0, 8).trim(); - if( name === "HISTORY" ){ return [name, card.slice(9).trim()]; } - if( name === "COMMENT" ){ return [name, card.slice(9).trim()]; } - if( card[8] !== "=" ){ return undefined; } - value = card.slice(10).replace(/'/g, " ").replace(/ \/.*/, "").trim(); - if( value === "T" ){ - value = true; - } else if( value === "F" ){ - value = false; - } else if( JS9.isNumber(value) ){ - value = parseFloat(value); - } - return [name, value]; -}; - -// convert obj to FITS-style string -JS9.raw2FITS = function(raw, opts){ - let i, s, obj, key, val, card, ncard, header, left; - let hasend = false; - let t = ""; - const gots = {}; - const rexp = /^(NAXIS|CRPIX|CRVAL|CTYPE|CUNIT|CDELT)[34567]/; - const fixparam = (card, name, val, comm) => { - let s, oval, regexp; - let ncard = card; - if( name === "XTENSION" && !val ){ - ncard = sprintf("%s = %20s / %-47s", - "SIMPLE", - "T", - "file does conform to FITS standard"); - - } else { - // eslint-disable-next-line no-useless-escape - regexp = new RegExp(`${name} *= *(-?[-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?) *`); - if( card ){ - s = card.replace(regexp, "$1"); - oval = parseFloat(s); - } else { - oval = undefined; - } - if( oval !== val ){ - ncard = sprintf("%-8s= %20s / %-47s", name, val, comm||""); - } - } - gots[name] = true; - return ncard; - }; - // sanity check - if( !raw ){ return t; } - // opts is optional - opts = opts || {}; - // backward compatibility: orig. version used boolean to specify addcr - if( typeof opts === "boolean" ){ - opts = {addcr: opts}; - } - // raw.card and raw.cardstr contain comments: use them if possible - if( raw.card || raw.cardstr ){ - header = raw.header || {}; - if( raw.card ){ - ncard = raw.card.length; - } else { - ncard = raw.ncard; - } - for(i=0; i 0 ){ - for(i=0; i#%d: name: %s type: %s", - obj.hdu, s, obj.type); - switch(obj.type){ - case "image": - t += sprintf(" bitpix: %d naxis: %d", obj.bitpix, obj.naxis); - if( obj.naxes.length ){ - t += " axes: ["; - for(j=0; jrows: %d%scols: [", obj.rows, s); - for(j=0; j { - let searchVal = value; - text.unmark({ - done: () => { - text.mark(searchVal, { - caseSensitive: bar.opts.matchcase, - diacritics: bar.opts.diacritics, - accuracy: bar.opts.matchwords ? "exactly" : "partially", - wildcards: bar.opts.matchwildcards ? "enabled" : "disabled", - done: () => { - bar.results = text.find("mark"); - bar.currentIndex = 0; - jumpTo(); - } - }); - } - }); - }; - const btnColor = (which) => { - const s = which.prop("data-btn"); - if( bar.opts[s] ){ - which.removeClass("JS9SearchButton-false"); - which.addClass("JS9SearchButton-true"); - } else { - which.removeClass("JS9SearchButton-true"); - which.addClass("JS9SearchButton-false"); - } - }; - const jumpTo = () => { - let cur, pos; - if( bar.results.length ){ - cur = bar.results.eq(bar.currentIndex); - bar.results.removeClass(currentClass); - if( cur.length ){ - cur.addClass(currentClass); - pos = cur.position().top; - if( pos < 0 || pos > div.height() ){ - pos = pos + div.scrollTop() - offsetTop; - div.scrollTop(pos); - } - } - } - }; - textid = textid || ".JS9AnalysisText"; - // make sure we have text - if( jel.is(textid) ){ - text = jel; - } else { - text = jel.find(textid); - if( !text.length ){ - return; - } - } - // light window or div? - div = jel.find(JS9.lightOpts[JS9.LIGHTWIN].drag); - if( !div.length ){ - // just a div - div = jel; - } - // does the searchbar already exist? - bar = div.find(".JS9Searchbar"); - if( bar.length ){ - // make it visiable and return - bar.css("display", "block"); - return; - } - // make a new searchbar - bar = $("
    ") - .addClass("JS9Searchbar") - .appendTo(div); - // add options - bar.opts = { - matchcase: false, - matchdiacritics: false, - matchwords: false, - matchwildcards: false, - }; - // search text box - srch = $("") - .addClass("JS9SearchInput") - .appendTo(bar); - // event fires with each keystroke - srch.on("input", () => { - search(srch.val()); - }); - // placeholder hints - if( bar.opts.matchwildcards ){ - srch.prop("placeholder", "sea*rch template?"); - } else { - srch.prop("placeholder", "search term(s)"); - } - // find next occurence - next = $("
    %s
    "; - -// get an id based on the action -JS9.Keyboard.actionid = function(cname, aname){ - return (`${cname}_${aname}`).replace(/[^A-Za-z0-9_]/g, "_"); -}; - -// add to the action list -JS9.Keyboard.addAction = function(container, cname, aname){ - let s, id, divjq; - id = JS9.Keyboard.actionid(cname, aname); - // create the html for this action - s = sprintf(JS9.Keyboard.actionHTML, aname, cname, aname); - // add action html to the action container - divjq = $("
    ") - .attr("id", id) - .html(s) - .appendTo(container); - divjq.find('.JS9KeyboardButton').on("click", (evt) => { - const action = evt.currentTarget.value; - const im = this.display.image; - if( im && action && JS9.Keyboard.Actions[action] ){ - JS9.Keyboard.Actions[action](im, im.ipos, evt); - } - }); - return divjq; -}; - -// common code for arrow key processing -JS9.Keyboard.arrowKey = function(im, evt, inc, active){ - let cpos; - // change display and image position, redisplay magnifier - im.pos.x += inc.x; - im.pos.y += inc.y; - im.ipos = im.displayToImagePos(im.pos); - if( {}.hasOwnProperty.call(JS9, "MouseTouch") ){ - im.valpos = null; - JS9.MouseTouch.Actions["display value/position"](im, im.ipos, evt); - } - if( {}.hasOwnProperty.call(JS9, "Magnifier") && !active ){ - JS9.Magnifier.display(im, im.ipos); - } - if( JS9.globalOpts.regArrowCrosshair && - {}.hasOwnProperty.call(JS9, "Crosshair") ){ - im.tmp.arrowCrosshair = true; - im.tmp.arrowCrosshairVisible = true; - if( active ){ - if( active.pub ){ - if( active.pub.shape === "polygon" && - active.pub.pts && active.pub.pts.length > 1 ){ - cpos = JS9.centroidPolygon(active.pub.pts); - } else { - cpos = {x: active.pub.x, y: active.pub.y}; - } - JS9.Crosshair.display(im, cpos, evt); - } - } else { - JS9.Crosshair.display(im, im.ipos, evt); - } - delete im.tmp.arrowCrosshair; - } -}; - -// --------------------------------------------------------------------- -// -// Keyboard.Actions: callbacks when on key press -// -// the keyboardActions array is in JS9.globalOpts determine -// the initial mapping of keyboard configuration to callback, e.g.: -// -// JS9.globalOpts.keyboardActions = {'?': 'copy valpos to clipboard', -// '/': 'copy wcs coords to clipboard', -// ... -// }; -// -// You can add your own to the Keyboard.Actions object and use them in the -// globalOpts.keyboardActions object -// -// --------------------------------------------------------------------- -JS9.Keyboard.Actions = {}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["open local file"] = function(im, ipos, evt){ - let display; - if( im ){ - display = im.display; - } else if( evt && typeof evt.data === "object" ){ - display = evt.data; - } - if( display ){ - if( window.isElectron && typeof evt.data === "object" ){ - display.displayLoadForm(); - } else { - JS9.OpenFileMenu({display}); - } - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["close image"] = function(im, ipos, evt){ - if( im ){ - im.closeImage(); - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["new JS9 light window"] = function(im, ipos, evt){ - let opts; - let display; - if( im ){ - display = im.display; - } else if( evt && typeof evt.data === "object" ){ - display = evt.data; - } - if( display ){ - opts = {clone: display.id}; - } - JS9.LoadWindow(null, opts, "light"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy wcs position to clipboard"] = function(im, ipos, evt){ - let s, arr, opts; - // sanity check - if( !im || !im.raw.wcs || !ipos ){ - return; - } - // get wcs coords of current position - s = JS9.pix2wcs(im.raw.wcs, ipos.x, ipos.y).trim(); - if( JS9.globalOpts.copyWcsPosFormat ){ - arr = s.split(/\s+/); - opts = [{name: "ra", value: arr[0]}, - {name: "dec", value: arr[1]}, - {name: "sys", value: arr[2]}]; - s = im.expandMacro(JS9.globalOpts.copyWcsPosFormat, opts); - } - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy physical position to clipboard"] = function(im, ipos, evt){ - let phys, s; - // sanity check - if( !im || !ipos ){ - return; - } - // get physical coords from image coords - phys = im.imageToLogicalPos(ipos); - s = sprintf("%f %f", phys.x, phys.y); - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy pixel value to clipboard"] = function(im, ipos, evt){ - let s, val, prec; - // sanity check - if( !im || !ipos ){ - return; - } - // value at current position - val = im.raw.data[Math.floor(ipos.y-0.5) * im.raw.width + - Math.floor(ipos.x-0.5)]; - prec = JS9.floatPrecision(im.params.scalemin, im.params.scalemax); - s = JS9.floatFormattedString(val, prec, 3); - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy value and position to clipboard"] = function(im, ipos, evt){ - let s, key, ovalpos; - // sanity check - if( !im || !ipos ){ - return; - } - // set valpos in case its turned off - ovalpos = im.setParam("valpos", true); - // get current valpos - s = im.updateValpos(ipos, false); - // restore original valpos - im.setParam("valpos", ovalpos); - // process valpos string - key = `vstr${ JS9.globalOpts.valposWidth}`; - if( s && s[key]){ - // reformat from html to text - s = s[key].replace(/ /g, " "); - } else { - // use blank space (otherwise, nothing is copied) - s = " "; - } - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["edit selected region(s)"] = function(im, ipos, evt){ - let layer, ao; - // sanity check - if( !im ){ - return; - } - layer = im.layers.regions; - if( layer ){ - ao = layer.canvas.getActiveObject(); - if( ao && ao.type !== "activeSelection" ){ - // no active selection, edit this region - im.displayRegionsForm(ao); - } else { - // active selection or no regions: multi - im.displayRegionsForm(null, {multi: true}); - } - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["add last region selected in regions menu"] = function(im, ipos, evt){ - let opts = {ireg: true}; - let key = JS9.globalOpts.regMenuSelected || "circle"; - // sanity check - if( !im ){ - return; - } - opts.x = ipos.x; - opts.y = ipos.y; - return im.addShapes("regions", key, opts); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["toggle selected region: source/background"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return im.toggleRegionTags("selected", "source", "background"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["toggle selected region: include/exclude"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return im.toggleRegionTags("selected", "include", "exclude"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["tag selected region as 'source'"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return JS9.Keyboard.editregion(im, "source", "background"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["tag selected region as 'background'"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return JS9.Keyboard.editregion(im, "background", "source"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["tag selected region as 'include'"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return JS9.Keyboard.editregion(im, "include", "exclude"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["tag selected region as 'exclude'"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - return JS9.Keyboard.editregion(im, "exclude", "include"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["toggle full screen mode"] = function(im, ipos, evt){ - let display; - if( im ){ - display = im.display; - } else if( evt && typeof evt.data === "object" ){ - display = evt.data; - } - if( display ){ - if( (display.width === display.width0) && - (display.height === display.height0) ){ - display.resize("full", {center: true}); - } else { - display.resize("reset"); - } - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["reset zoom"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.setZoom("1"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["zoom in"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.setZoom("*2"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["zoom out"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.setZoom("/2"); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["display next image"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.display.nextImage(1); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["display previous image"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.display.nextImage(-1); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["open a local FITS file"] = function(im, ipos, evt){ - let display; - if( im ){ - display = im.display; - } else if( evt && typeof evt.data === "object" ){ - display = evt.data; - } - if( display ){ - JS9.OpenFileMenu({display}); - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["save image as a FITS file"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.saveFITS(); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["save image as a PNG file"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.savePNG(); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["save regions as a text file"] = function(im, ipos, evt){ - // sanity check - if( !im ){ - return; - } - im.saveRegions(); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["move region/position up"] = function(im, ipos, evt){ - let canvas, layerName, active; - let inc = JS9.globalOpts.arrowIncrement; - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - layerName = im.layer || "regions"; - canvas = im.display.layers[layerName].canvas; - active = canvas.getActiveObject(); - if( active && !active.lockMovementY ) { - im.changeShapes(layerName, "selected", {deltay: inc}); - } - JS9.Keyboard.arrowKey(im, evt, {x: 0, y: inc * -1}, active); - canvas.fire("mouse:up"); - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("keydown", "onarrowkey", evt); - } -}; - -JS9.Keyboard.Actions["move region/position down"] = function(im, ipos, evt){ - let canvas, layerName, active; - let inc = -JS9.globalOpts.arrowIncrement; - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - layerName = im.layer || "regions"; - canvas = im.display.layers[layerName].canvas; - active = canvas.getActiveObject(); - if( active && !active.lockMovementY ) { - im.changeShapes(layerName, "selected", {deltay: inc}); - } - JS9.Keyboard.arrowKey(im, evt, {x: 0, y: inc * -1}, active); - canvas.fire("mouse:up"); - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("keydown", "onarrowkey", evt); - } -}; - -JS9.Keyboard.Actions["move region/position left"] = function(im, ipos, evt){ - let canvas, layerName, active; - let inc = -JS9.globalOpts.arrowIncrement; - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - layerName = im.layer || "regions"; - canvas = im.display.layers[layerName].canvas; - active = canvas.getActiveObject(); - if( active && !active.lockMovementX ) { - im.changeShapes(layerName, "selected", {deltax: inc}); - } - JS9.Keyboard.arrowKey(im, evt, {x: inc, y: 0}, active); - canvas.fire("mouse:up"); - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("keydown", "onarrowkey", evt); - } -}; - -JS9.Keyboard.Actions["move region/position right"] = function(im, ipos, evt){ - let canvas, layerName, active; - let inc = JS9.globalOpts.arrowIncrement; - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - layerName = im.layer || "regions"; - canvas = im.display.layers[layerName].canvas; - active = canvas.getActiveObject(); - if( active && !active.lockMovementX ) { - im.changeShapes(layerName, "selected", {deltax: inc}); - } - JS9.Keyboard.arrowKey(im, evt, {x: inc, y: 0}, active); - canvas.fire("mouse:up"); - if( JS9.globalOpts.extendedPlugins ){ - im.xeqPlugins("keydown", "onarrowkey", evt); - } -}; -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["remove selected region"] = function(im, ipos, evt){ - let canvas, layerName; - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - layerName = im.layer || "regions"; - canvas = im.display.layers[layerName].canvas; - im.removeShapes(layerName, "selected"); - im.display.clearMessage(layerName); - canvas.fire("mouse:up"); -}; - -JS9.Keyboard.Actions["raise region layer to top"] = function(im, ipos, evt){ - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - im.activeShapeLayer("regions"); -}; - -JS9.Keyboard.Actions["toggle active shape layers"] = function(im, ipos, evt){ - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - im.toggleShapeLayers(); -}; - -JS9.Keyboard.Actions["send selected region to back"] = function(im, ipos, evt){ - if( evt ){ - evt.preventDefault(); - } - // sanity check - if( !im ){ return; } - im.changeShapes("regions", "selected", {send: "back"}); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy region(s) to clipboard"] = function(im, ipos, evt){ - let s; - // sanity check - if( !im ){ return; } - // get selected or all region(s) - s = im.listRegions(null, {mode: 1}); - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy selected region(s) to clipboard"] = function(im, ipos, evt){ - let s; - // sanity check - if( !im ){ return; } - // get selected region(s) - s = im.listRegions("selected", {mode: 1}); - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["copy all regions to clipboard"] = function(im, ipos, evt){ - let s; - // sanity check - if( !im ){ return; } - // get all regions - s = im.listRegions("all", {mode: 1}); - // copy to clipboard - JS9.CopyToClipboard(s, im); - return s; -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["paste regions from local clipboard"] = function(im, ipos, evt){ - return JS9.Regions.pasteFromClipboard.call(im, false); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["paste regions to current position"] = function(im, ipos, evt){ - return JS9.Regions.pasteFromClipboard.call(im, true); -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["undo remove of region(s)"] = function(im, ipos, evt){ - if( im ){ - im.unremoveRegions(); - } -}; - -// eslint-disable-next-line no-unused-vars -JS9.Keyboard.Actions["select region"] = function(im, ipos, evt){ - let i, layer, canvas, obj, objs; - // sanity check - if( !im ){ return; } - layer = im.layer || "regions"; - canvas = im.layers[layer].canvas; - objs = canvas.getObjects(); - for(i=0; i") - .addClass(`${JS9.Keyboard.BASE}Container`) - .attr("id", `${this.id}KeyboardContainer`) - .appendTo(this.divjq); - s = `
    Keys and their actions (or click the buttons):

    `; - this.keyboardHeadContainer = $("

    ") - .addClass(`${JS9.Keyboard.BASE}Container`) - .attr("id", `${this.id}KeyboardHeadContainer`) - .html(s) - .appendTo(this.keyboardContainer); - // container to hold keyboard actions - this.keyboardActionContainer = $("
    ") - .addClass(`${JS9.Keyboard.BASE}ActionContainer`) - .attr("id", `${this.id}ActionContainer`) - .html("") - .appendTo(this.keyboardContainer); - // add actions - for( key of Object.keys(JS9.globalOpts.keyboardActions) ){ - s = JS9.globalOpts.keyboardActions[key]; - JS9.Keyboard.addAction.call(this, this.keyboardActionContainer, key, s); - } - }; - -JS9.RegisterPlugin(JS9.Keyboard.CLASS, JS9.Keyboard.NAME, - JS9.Keyboard.init, - {menuItem: "Keyboard Actions", - onplugindisplay: JS9.Keyboard.init, - help: "help/keyboard.html", - winTitle: "Keyboard Actions", - winResize: true, - winDims: [JS9.Keyboard.WIDTH,JS9.Keyboard.HEIGHT]}); diff --git a/web/static/js9_old/plugins/core/layers.css b/web/static/js9_old/plugins/core/layers.css deleted file mode 100644 index be0f4da..0000000 --- a/web/static/js9_old/plugins/core/layers.css +++ /dev/null @@ -1,39 +0,0 @@ -div.JS9LayersContainer { - padding: 2px; -} - -div.JS9LayersHeader { - border: 0px solid black; - background: #E9E9E9; - padding: 0px; - margin-left: 15px; - margin-top: 5px; - margin-right: 5px; - margin-bottom: 0px; -} - -div.JS9LayersLayer { - margin: 5px; - background: #E9E9E9; - overflow: auto; -} - -div.JS9LayersLayerInactive { - padding: 10px; - border: 1px solid black; -} - -div.JS9LayersLayerActive { - padding: 9px; - border: 2px solid #00F000; -} - -span.JS9LayersSpan { - float: right; - margin-right: 10px; -} - -span.JS9NoLayers { - margin-left: 15px; -} - diff --git a/web/static/js9_old/plugins/core/layers.js b/web/static/js9_old/plugins/core/layers.js deleted file mode 100644 index b994b1e..0000000 --- a/web/static/js9_old/plugins/core/layers.js +++ /dev/null @@ -1,290 +0,0 @@ -/* - * shape layer plugin (October 7, 2016) - */ - -/*global $, JS9, sprintf */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Layers = {}; -JS9.Layers.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Layers.NAME = "Layers"; // name of this plugin (2nd part of div class) -JS9.Layers.WIDTH = 460; // width of light window -JS9.Layers.HEIGHT = 250; // height of light window -JS9.Layers.BASE = JS9.Layers.CLASS + JS9.Layers.NAME; // CSS base class name - -JS9.Layers.headerHTML='Shape layers can be hidden or made visible below. The topmost visible layer in the stack is active: it responds to mouse and touch events. Move a layer to the top of the stack to make it active.'; - -JS9.Layers.layerHTML="$visible  $save  $color   $layer  "; - -JS9.Layers.nolayersHTML='

    [Layers will appear here as they are created]'; - -JS9.Layers.visibleHTML='visible'; - -JS9.Layers.saveBothHTML=''; - -JS9.Layers.saveRegionsHTML=''; - -JS9.Layers.colorHTML=''; - -JS9.Layers.layerNameHTML='%s'; - -// get an id based on the file image id and layer -JS9.Layers.imid = function(im, layer){ - const id = `${im.display.id}_${im.id}_${layer}_`; - return `${id.replace(/[^A-Za-z0-9_]/g, "_")}Layer`; -}; - -// get a class unique between displays -JS9.Layers.dispclass = function(im){ - const id = `${JS9.Layers.BASE}_${im.display.id}`; - return id.replace(/[^A-Za-z0-9_]/g, "_"); -}; - -// change the active image -JS9.Layers.activeLayer = function(im, pinst){ - let i, s, id, dcls, order; - if( im ){ - order = pinst.layersLayerContainer.sortable("toArray"); - if( (order.length === 1) && !order[0] ){ - return; - } - for(i=0; i 1 ){ - l = `${layer} layer [zindex: ${zindex}]`; - } else { - l = `${layer} layer`; - } - opts.push({name: "layer", value: sprintf(JS9.Layers.layerNameHTML, l)}); - // create the html for this layer - s = JS9.Image.prototype.expandMacro.call(im, JS9.Layers.layerHTML, opts); - // add layer html to the layer container - divjq = $("

    ") - .addClass(cls) - .addClass(dcls) - .attr("id", id) - .attr("layer", layer) - .prop("imid", imid) - .html(s); - if( !this.nlayer ){ - divjq.appendTo(this.layersLayerContainer); - } else { - this.layersLayerContainer.find(`.${cls}`).each((idx, item) => { - let tlayer, tzindex; - const jqitem = $(item); - if( !added ){ - tlayer = jqitem.attr("layer"); - if( tlayer ){ - tzindex = parseInt(im.display.layers[tlayer].divjq - .css("z-index"), 10); - if( Math.abs(zindex) > Math.abs(tzindex) ){ - divjq.insertBefore(jqitem); - added = true; - } - } - } - }); - if( !added ){ - divjq.appendTo(this.layersLayerContainer); - } - } - // set of unset visibility buton - divjq.find(".JS9LayersVisibleCheck").prop("checked", !!im.layers[layer].show); - // another layer was added - this.nlayer++; -}; - -// init when a different image is displayed -JS9.Layers.display = function(){ - if( this.lastimage !== this.display.image ){ - JS9.Layers.init.call(this); - } -}; - -// clear when an image closes -JS9.Layers.close = function(){ - // ensure plugin display is reset - JS9.Layers.init.call(this, {mode: "clear"}); -}; - -// constructor: add HTML elements to the plugin -JS9.Layers.init = function(opts){ - let key, im; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // opts is optional - opts = opts || {}; - // create container to hold layer container and header - // clean main container - this.divjq.html(""); - // no layers yet - this.nlayer = 0; - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // main container - this.layersContainer = $("
    ") - .addClass(`${JS9.Layers.BASE}Container`) - .attr("id", `${this.id}LayersContainer`) - .css("overflow", "auto") - .appendTo(this.divjq); - // header - this.layersHeader = $("
    ") - .addClass(`${JS9.Layers.BASE}Header`) - .attr("id", `${this.display.id}Header`) - .html(JS9.Layers.headerHTML) - .appendTo(this.layersContainer); - // container to hold layers - this.layersLayerContainer = $("
    ") - .addClass(`${JS9.Layers.BASE}LayerContainer`) - .attr("id", `${this.id}LayersLayerContainer`) - .html(JS9.Layers.nolayersHTML) - .appendTo(this.layersContainer); - // done if we are only clearing - if( opts.mode === "clear" ){ - return; - } - // add current shape layers - if( this.display.image ){ - im = this.display.image; - for( key of Object.keys(im.layers) ){ - if( key === "crosshair" || key === "grid" ){ - continue; - } - JS9.Layers.addLayer.call(this, im, key); - } - this.lastimage = im; - } - // the layers within the layer container will be sortable - // the top one responds to events - this.layersLayerContainer.sortable({ - // eslint-disable-next-line no-unused-vars - start: (event, ui) => { - return; - }, - // eslint-disable-next-line no-unused-vars - stop: (event, ui) => { - JS9.Layers.activeLayer(im, this); - return; - } - }); - // set initial active layer - JS9.Layers.activeLayer(im, this); -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.Layers.CLASS, JS9.Layers.NAME, JS9.Layers.init, - {menuItem: "Shape Layers", - onplugindisplay: JS9.Layers.init, - onshapelayercreate: JS9.Layers.init, - onshapelayershow: JS9.Layers.init, - onshapelayeractive: JS9.Layers.init, - onshapelayerhide: JS9.Layers.init, - onimageload: JS9.Layers.init, - onimagedisplay: JS9.Layers.display, - onimageclose: JS9.Layers.close, - help: "help/layers.html", - winTitle: "Shape Layers", - winResize: true, - winDims: [JS9.Layers.WIDTH, JS9.Layers.HEIGHT]}); diff --git a/web/static/js9_old/plugins/core/magnifier.js b/web/static/js9_old/plugins/core/magnifier.js deleted file mode 100644 index 190cc7e..0000000 --- a/web/static/js9_old/plugins/core/magnifier.js +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Magnifier plugin - */ - -/*global $, JS9, fabric */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Magnifier = {}; -JS9.Magnifier.CLASS = "JS9"; -JS9.Magnifier.NAME = "Magnifier"; -JS9.Magnifier.WIDTH = JS9.WIDTH/2; // width of light window -JS9.Magnifier.HEIGHT = JS9.HEIGHT/2; // height of light window -JS9.Magnifier.SWIDTH = 250; // width of div -JS9.Magnifier.SHEIGHT = 250; // height of div - -// defaults for magnifier -JS9.Magnifier.opts = { - // override fabric defaults - originX: "left", - originY: "top", - hasControls: false, - hasRotatingPoint: false, - hasBorders: false, - selectable: false, - // initial magnifier zoom - zoom: 4, - // canvas options - canvas: { - selection: false - }, - // magnifier box colors - tagcolors: { - defcolor: "#00FF00" - } -}; - -// call a JS9 routine from a button in the magnifier plugin toolbar -// the plugin instantiation saves the display id in the toolbar div -JS9.Magnifier.bcall = function(...args){ - let dispid, im; - let [which, cmd, arg1] = args; - // the button plugintoolbar div has data containing the id of the display - dispid = $(which).closest("div[class^=JS9PluginToolbar]").data("displayid"); - if( dispid ){ - im = JS9.getImage(dispid); - } else { - JS9.error(`can't find display for cmd: ${cmd}`); - } - if( !im ){ - JS9.error(`can't find image for cmd: ${cmd}`); - } - switch(cmd){ - case "zoomMagnifier": - if( args.length < 3 ){ - JS9.error(`missing arg(s) for cmd: ${cmd}`); - } - try{ - JS9.Magnifier.zoom(im, arg1); - } catch(e){ - JS9.error("error calling zoomMagnifier()", e); - } - break; - default: - break; - } -}; - -// html used by the magnifier plugin -JS9.Magnifier.HTML = -`${"" + -"" + -"" + -"` + -``; - -// JS9 Magnifier constructor -JS9.Magnifier.init = function(width, height){ - // set width and height on div - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = width || JS9.Magnifier.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = height || JS9.Magnifier.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // create DOM canvas element - this.canvas = document.createElement("canvas"); - // jquery version for event handling and DOM manipulation - this.canvasjq = $(this.canvas); - // set class - this.canvasjq.addClass("JS9Magnifier"); - // required so graphical layers will be on top: - this.canvasjq.css("z-index", JS9.ZINDEX); - // how do we allow users to set the size of the canvas?? - // it doesn't go into the CSS and we have no canvas on the Web page ... - this.canvasjq.attr("width", this.width); - this.canvasjq.attr("height", this.height); - // drawing context - this.context = this.canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - this.context.imageSmoothingEnabled = false; - } - // add container with canvas to the high-level div - this.containerjq = $("
    ") - .addClass("JS9Container") - .append(this.canvasjq) - .appendTo(this.divjq); - // add magnifier graphics layer to the display - // the magnifier will be appended to the div of the plugin - this.display.newShapeLayer("magnifier", JS9.Magnifier.opts, this.divjq); -}; - -// display the magnified image on the magnifier canvas -JS9.Magnifier.display = function(im, ipos){ - let pos, tval, magDisp, zoom; - let canvas, sx, sy, sw, sh, dx, dy, dw, dh; - // sanity check - // only display if we have a magnifier present - if(!im || !im.display.pluginInstances.JS9Magnifier || - (im.display.pluginInstances.JS9Magnifier.status !== "active")){ - return; - } - // don't display if a mouse button is pressed while moving, or - // if two or more touch buttons are pressed while moving - if( (im.clickState > 0) || (im.clickState < -1) ){ - return; - } - // image init: add magnifier object to image, if necessary - if( !im.magnifier ){ - im.magnifier = {zoom: JS9.Magnifier.opts.zoom, posx: 0, posy: 0}; - } - magDisp = im.display.pluginInstances.JS9Magnifier; - canvas = im.display.canvas; - zoom = im.magnifier.zoom; - sw = Math.floor(magDisp.width / zoom); - sh = Math.floor(magDisp.height / zoom); - if( ipos ){ - pos = im.imageToDisplayPos(ipos); - sx = pos.x - (sw/2); - sy = pos.y - (sh/2); - im.magnifier.posx = sx; - im.magnifier.posy = sy; - } else { - sx = im.magnifier.posx; - sy = im.magnifier.posy; - } - // default destination parameters - dx = 0; - dy = 0; - dw = magDisp.canvas.width; - dh = magDisp.canvas.height; - // adjust for boundaries - if( sx < 0 ){ - sw += sx; - dx -= (sx * zoom); - dw += (sx * zoom); - sx = 0; - } - tval = (sx + sw) - canvas.width; - if( tval > 0 ){ - sw -= tval; - dw = sw * zoom; - } - if( sy < 0 ){ - sh += sy; - dy -= (sy * zoom); - dh += (sy * zoom); - sy = 0; - } - tval = sy + sh- canvas.height; - if( tval > 0 ){ - sh -= tval; - dh = sh * zoom; - } - // display magnifier image - magDisp.context.clear(); - magDisp.context.drawImage(canvas, sx, sy, sw, sh, dx, dy, dw, dh); - // overlay regions by drawing the fabric.js canvas into the magnifier - if( JS9.globalOpts.magnifierRegions && - im.display.layers && im.display.layers.regions ){ - // get underlying html canvas - canvas = im.display.layers.regions.canvas.getElement(); - sx *= fabric.devicePixelRatio; - sy *= fabric.devicePixelRatio; - sw *= fabric.devicePixelRatio; - sh *= fabric.devicePixelRatio; - // write it into the magnifier display - magDisp.context.drawImage(canvas, sx, sy, sw, sh, dx, dy, dw, dh); - } - // stuff we only do once - if( !im.magnifier.boxid ){ - // add the center point to the magnifier, if necessary - im.magnifier.boxid = im.addShapes("magnifier", "box"); - // make background black, which looks better at the edge - $(magDisp.canvas).css("background-color", "black"); - } - // center point size and position, based on zoom - // (subtract 1 to center the box on the pixel 2/4/2020) - if( im.magnifier.ozoom !== zoom ){ - im.changeShapes("magnifier", im.magnifier.boxid, - {left: magDisp.width/2-1, top: magDisp.height/2-1, - width: zoom, height: zoom}); - im.magnifier.ozoom = im.magnifier.zoom; - } -}; - -// display the magnified image on the magnifier canvas -// this routine is called when regions change ... it delays the mag display -// until the main display can be redrawn with the changed regions. Initially, -// this routine explicitly called the fabric.js renderAll() routine so that -// the changed regions would be drawn on the canvas. This did not work when -// removing groups (artifacts were left on the screen). For related problems -// and warnings associated with working with groups, see: -// http://fabricjs.com/v2-breaking-changes-2 -JS9.Magnifier.display2 = function(im, ipos){ - window.setTimeout(() => { - JS9.Magnifier.display(im, ipos); - }, 0); -}; - -// zoom the rectangle inside the magnifier (RGB) image -// part of magnifier plugin -JS9.Magnifier.zoom = function(im, zval){ - let magnifier, ozoom, nzoom; - // sanity check - if( !im || !im.magnifier ){ - return; - } - magnifier = im.magnifier; - // get old zoom - ozoom = magnifier.zoom; - // determine new zoom - switch(zval.charAt(0)){ - case "x": - case "*": - nzoom = ozoom * parseFloat(zval.slice(1)); - break; - case "/": - nzoom = ozoom / parseFloat(zval.slice(1)); - break; - default: - nzoom = parseFloat(zval); - break; - } - // sanity check - if( !nzoom || (nzoom < 1) ){ - nzoom = 1; - } - // save old value, set new value - magnifier.ozoom = magnifier.zoom; - magnifier.zoom = nzoom; - // redisplay - JS9.Magnifier.display(im); -}; - -// clear the magnifier -JS9.Magnifier.clear = function(im){ - const magnifier = im.display.pluginInstances.JS9Magnifier; - if( magnifier && (im === im.display.image) ){ - magnifier.context.clear(); - im.removeShapes("magnifier", "all"); - im.magnifier.boxid = null; - im.magnifier.ozoom = 0; - // restore original background color - $(magnifier.canvas).css("background-color", "#E9E9E9"); - } - return im; -}; - -// add plugin to JS9 -JS9.RegisterPlugin(JS9.Magnifier.CLASS, JS9.Magnifier.NAME, JS9.Magnifier.init, - {menuItem: "Magnifier", - help: "help/magnifier.html", - dynamicSelect: true, - toolbarSeparate: false, - toolbarHTML: JS9.Magnifier.HTML, - onplugindisplay: JS9.Magnifier.display, - onregionsmove: JS9.Magnifier.display, - onregionschange: JS9.Magnifier.display2, - onmousemove: JS9.Magnifier.display, - onimagedisplay: JS9.Magnifier.display, - onimageclose: JS9.Magnifier.clear, - onimageclear: JS9.Magnifier.clear, - winTitle: "Magnifier", - winDims: [JS9.Magnifier.WIDTH, JS9.Magnifier.HEIGHT], - divArgs: [JS9.Magnifier.SWIDTH, JS9.Magnifier.SHEIGHT]}); diff --git a/web/static/js9_old/plugins/core/mef.css b/web/static/js9_old/plugins/core/mef.css deleted file mode 100644 index 585a16b..0000000 --- a/web/static/js9_old/plugins/core/mef.css +++ /dev/null @@ -1,42 +0,0 @@ -.JS9MefContainer { - padding: 10px; - overflow: auto; -} - -.JS9MefExtension { - margin: 5px; - background: #E9E9E9; - overflow: auto; - font-size: 10pt; -} - -.JS9MefHeader { - margin: 5px; - background: #E9E9E9; -} - -.JS9MefInput { - margin: 5px; - background: #E9E9E9; -} - -.JS9MefExtensionInactive { - padding: 0px; - border: 1px solid black; -} - -.JS9MefExtensionActive { - padding: 0px; - border: 2px solid #00F000; -} - -span.JS9MefStrike{ - font-weight:bold; /*set line weight here*/ - color:red; - text-decoration:line-through; -} - -span.JS9MefStrike>span { - font-weight:normal; - color: black; -} \ No newline at end of file diff --git a/web/static/js9_old/plugins/core/mef.js b/web/static/js9_old/plugins/core/mef.js deleted file mode 100644 index 7339036..0000000 --- a/web/static/js9_old/plugins/core/mef.js +++ /dev/null @@ -1,191 +0,0 @@ -/* - * Multi-Extension FITS module (March 31, 2016) - */ - -/*global $, JS9 */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Mef = {}; -JS9.Mef.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Mef.NAME = "Mef"; // name of this plugin (2nd part of div class) -JS9.Mef.WIDTH = 800; // width of light window -JS9.Mef.HEIGHT = 240; // height of light window -JS9.Mef.BASE = JS9.Mef.CLASS + JS9.Mef.NAME; // CSS base class name - -// change global separate mode for this display -JS9.Mef.xseparate = function(id, target){ - const display = JS9.lookupDisplay(id); - const separate = target.checked; - // change separate mode for this instance - if( display ){ - display.pluginInstances[JS9.Mef.BASE].separate = separate; - } -}; - -// load all images -// eslint-disable-next-line no-unused-vars -JS9.Mef.xall = function(id, target){ - const display = JS9.lookupDisplay(id); - // display all image extensions - if( display && display.image ){ - display.pluginInstances[JS9.Mef.BASE].separate = true; - display.image.displayExtension("all"); - } -}; - -// get an MefExtension id based on the file image id -JS9.Mef.imid = function(im, i, noext){ - let id = `${im.display.id}_${im.id}`; - if( noext ){ - id = id.replace(/\[[a-zA-Z0-9][a-zA-Z0-9_]*\]/g,""); - } - return `${id.replace(/[^A-Za-z0-9_]/g, "_")}_MefExtension_${i}`; -}; - -// change the active extension -JS9.Mef.activeExtension = function(im, i){ - let clas, classbase; - if( im ){ - classbase = `${im.display.id}_${JS9.Mef.BASE}`; - $(`.${classbase }Extension`) - .removeClass(`${JS9.Mef.BASE}ExtensionActive`) - .addClass(`${JS9.Mef.BASE}ExtensionInactive`); - clas = JS9.Mef.imid(im, i, true); - $(`.${clas}` ) - .removeClass(`${JS9.Mef.BASE}ExtensionInactive`) - .addClass(`${JS9.Mef.BASE}ExtensionActive`); - } -}; - -// re-init when a different image is displayed -JS9.Mef.display = function(){ - if( this.lastimage !== this.display.image ){ - JS9.Mef.init.call(this); - } -}; - -// clear when an image closes -JS9.Mef.close = function(){ - // ensure plugin display is reset - JS9.Mef.init.call(this, {mode: "clear"}); -}; - -// constructor: add HTML elements to the plugin -JS9.Mef.init = function(opts){ - let i, im, id, clas, obj, s, sid, div, htmlString, classbase; - const addExt = (o, s, k) => { - let c, j; - let got = ""; - let doit = true; - switch(o.type){ - case "image": - // look for 2D image - if( o.naxes.length < 2 ){ - doit = false; - } - break; - case "table": - case "ascii": - // look for x and y columns - for(j=0; j  ${s}`; - } else { - htmlString = `
      ${s}
    `; - } - id = JS9.Mef.imid(im, k); - clas = JS9.Mef.imid(im, k, true); - classbase = `${im.display.id}_${JS9.Mef.BASE}`; - div = $("
    ") - .addClass(clas) - .addClass(`${classbase }Extension`) - .addClass(`${JS9.Mef.BASE }Extension`) - .addClass(`${JS9.Mef.BASE}ExtensionInactive`) - .attr("id", id) - .html(htmlString) - .appendTo(this.mefContainer); - if( doit ){ - div.on("mousedown touchstart", () => { - im.displayExtension(o.hdu, {separate: this.separate}); - JS9.Mef.activeExtension(im, o.hdu); - }); - } - }; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // opts is optional - opts = opts || {}; - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // clean main container - this.divjq.html(""); - // add mef container to main - this.mefContainer = $("
    ") - .addClass(`${JS9.Mef.BASE}Container`) - .attr("id", `${this.id}MefContainer`) - .appendTo(this.divjq); - // separate mode - if( this.separate === undefined ){ - this.separate = false; - } - im = this.display.image; - if( !im || (opts.mode === "clear") ){ - this.mefContainer.html("

    FITS HDU extensions will be displayed here.
    "); - return; - } - if( !im.hdus ){ - this.mefContainer.html("

    No FITS HDU extensions are present in this image.
    "); - return; - } - this.lastimage = im; - // reset main container - s = `
    Click on a FITS HDU extension to display it:`; - // add the checkbox for displaying each extension separately - sid = JS9.Mef.imid(im, "Separate"); - s += `   as a separate image
    `; - this.mefContainer.html(s); - // add a formatted string for each extension - for(i=0; i= 0 && !key.match(/^super_/) ){ - if( mode !== "all" && this.selectedDisplay ){ - // make sure display still exists - if( $.inArray(this.selectedDisplay, JS9.displays) >= 0 ){ - return [this.selectedDisplay]; - } - this.selectedDislay = null; - } - d = this.divjq.data("displays") || "*"; - s = d.split(","); - if( s[0] === "*" ){ - for(i=0; i= 0) || (disp === "all") ){ - if( JS9.bugs.webkit_resize ){ - $(".JS9").find(".JS9Image").removeClass("JS9Highlight"); - } else { - $(".JS9").removeClass("JS9Highlight"); - } - if( (disp === supermenu.selectedDisplay) || (disp === "all") ){ - // unselect - supermenu.selectedDisplay = null; - } else { - // select - supermenu.selectedDisplay = disp; - if( JS9.bugs.webkit_resize ){ - $(disp.divjq).find(".JS9Image").addClass("JS9Highlight"); - } else { - $(disp.divjq).addClass("JS9Highlight"); - } - } - } - } -}; - -// reset: invalidate the reverse key map when preferences change -// eslint-disable-next-line no-unused-vars -JS9.Menubar.reset = function(im){ - JS9.Menubar.rkeyMap = null; -}; - -// create the standard menus and user-defined menus -// each consists of a contextMenu() call and a "mousedown" callback -// to display the menu -JS9.Menubar.createMenus = function(){ - // eslint-disable-next-line no-unused-vars - const mypos = (opt, x, y) => { - let pos; - if( !{}.hasOwnProperty.call(window, "Jupyter") ){ - opt.$menu.position({ - my: 'left top', - at: JS9.globalOpts.menuPosition || "left bottom", - of: opt.$trigger, - collision: "fit" - }); - } else { - // Jupyter gets the wrong position when using $trigger ... - pos = opt.$trigger.offset(); - opt.$menu.css({"left": pos.left+20, "top": pos.top+10}); - } - }; - const onhide = () => { - const tdisp = this.display; - if( JS9.bugs.hide_menu && tdisp.image ){ - tdisp.image.displayImage("rgb"); - } - }; - const xname = (name, xact) => { - let key, hstr, tact; - let obj = {name: name}; - const gkeyActions = JS9.globalOpts.keyboardActions || {}; - const act = JS9.Menubar.keyMap[name]; - if( !JS9.Menubar.rkeyMap ){ - JS9.Menubar.rkeyMap = {}; - for( key of Object.keys(gkeyActions) ){ - JS9.Menubar.rkeyMap[gkeyActions[key]] = key; - } - JS9.Menubar.keyActions = $.extend(true, {}, gkeyActions); - } - if( JS9.notNull(act) && JS9.Menubar.rkeyMap ){ - key = JS9.Menubar.rkeyMap[act]; - if( key ){ - hstr = `${name}    ${key}`; - obj = {name: hstr, isHtmlName: true}; - } - } else if( xact && JS9.Menubar.rkeyMap ){ - for( tact of Object.keys(JS9.Menubar.rkeyMap) ){ - if( tact === xact ){ - key = JS9.Menubar.rkeyMap[tact]; - if( key ){ - hstr = `${name}    ${key}`; - obj = {name: hstr, isHtmlName: true}; - } - } - } - } - return obj; - }; - const xeqUserMenu = (evt) => { - const menu = evt.data; - evt.preventDefault(); - $(`#${menu.name}UserMenu${this.id}`).contextMenu(); - }; - const addUserMenu = (menu) => { - if( !menu || !menu.name || !menu.title || !menu.options ){ - return; - } - // define contextMenu actions - $.contextMenu({ - selector: `#${menu.name }UserMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, opt, hstr, obj; - const items = {}; - for(i=0; i${opt.name}` + `  ${obj.name}
    `; - items[opt.name] = {name: hstr, isHtmlName: true}; - } else { - items[opt.name] = obj; - } - } - return { - callback: (key, kopt) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let i, s, args, hstr; - const udisp = val; - for(i=0; i${opt.name}` + `  ${opt.name}
    `; - } else if( menu.updateTitle === "image" ){ - hstr = `
    ${opt.name}
    `; - } - $(kopt.selector).html(hstr); - } else if( typeof menu.updateTitle === "function" ){ - try{ - s = menu.updateTitle(udisp.image, - menu.name, - opt.name); - } - catch(e){ s = (opt.name || menu.name); } - $(kopt.selector).text(s); - } else if( menu.updateTitle && opt.name ){ - $(kopt.selector).text(opt.name); - } - } - } else { - JS9.error(`unknown func for user menubar: ${opt.cmd}`); - } - } - }); - }, - items: items - }; - } - }); - }; - const addUserMenus = () => { - let i, menu; - if( JS9.globalOpts.userMenuBar ){ - for(i=0; i { - evt.preventDefault(); - $(`#fileMenu${this.id}`).contextMenu(); - }); - $.contextMenu({ - selector: `#fileMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - // 'click' prevents long menus from executing a random menu option - // it has to be put into the first context menu that is registered - itemClickEvent: JS9.globalOpts.menuClickEvent || "click", - build: () => { - let i, m, im, name, s1, arr, cdisp, got, iobj, cel; - let plugin, pname, pinst; - let lastxclass=""; - let n = 0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const tim = tdisp.image; - const imlen = JS9.images.length; - // the number of images in this display ... - for(i=0, got=0; i= JS9.globalOpts.imagesFileSubmenu ){ - items.filetitle = { - name: "Files and Displays:", - disabled: true - }; - } - // .. because images can be in top-level menu or a submenu - if( got && got < JS9.globalOpts.imagesFileSubmenu ){ - items.imagestitle = { - name: "Images:", - disabled: true - }; - iobj = items; - } else if( got ){ - items.images = { - name: "images ...", - items: { - imagestitle: { - name: "display this image:", - disabled: true - } - } - }; - iobj = items.images.items; - } - // add images from this display - for(i=0; i 0 && - tdisp !== JS9.displays[i] ){ - s1 = `moveto_${JS9.displays[i].id}`; - items.moveto.items[s1] = xname(JS9.displays[i].id); - } - } - items.moveto.items.moveto_newdisp = xname("a new display"); - } else { - items.moveto.disabled = true; - } - items.separates = { - name: "separate ...", - items: { - } - }; - if( !JS9.images.length ){ - items.separates.disabled = true; - } - items.separates.items.separate = xname("separate these images"); - if( !tim ){ - items.separates.items.separate.disabled = true; - } - items.separates.items.gather = xname("gather all images here"); - if( tim && JS9.images.length === 1 ){ - items.separates.items.gather.disabled = true; - } - items.saveas = { - name: "save ...", - items: { - saveastitle: { - name: "save all data as:", - disabled: true - }, - savefitsentire: xname("FITS"), - saveastitle2: { - name: "save displayed data as:", - disabled: true - }, - savefits: xname("FITS"), - savejpeg: xname("JPEG"), - savepng: xname("PNG"), - saveastitle3: { - name: "save memory file as:", - disabled: true - }, - savefitsvirtual: xname("FITS") - } - }; - if( !tim ){ - items.saveas.disabled = true; - } else if( !tim.raw.hdu || !tim.raw.hdu.fits || !tim.raw.hdu.fits.vfile ){ - items.saveas.items.savefitsvirtual.disabled = true; - } - items.closes = { - name: "close ...", - items: { - closestitle: { - name: "close:", - disabled: true - } - } - }; - if( !tim ){ - items.closes.disabled = true; - } - items.closes.items.close = xname("this image"); - items.closes.items.closeall = xname("all images"); - items.closes.items.free = xname("this image's memory"); - items.closes.items.removeproxy = xname("proxy file"); - if( !tim || !tim.raw || !tim.raw.hdu || !tim.raw.hdu.fits ){ - items.closes.items.free.disabled = true; - } - if( !tim || !tim.proxyFile ){ - items.closes.items.removeproxy.disabled = true; - } - items.catalogs = { - name: "catalog ...", - items: { - } - }; - if( !tim ){ - items.catalogs.disabled = true; - } - items.catalogs.items.loadcatalog = xname("load ..."); - items.catalogs.items.savecatalog = xname("save active"); - items.createmosaic = { - name: "mosaic ...", - items: { - createmosaictitle: { - name: "create a mosaic using:", - disabled: true - }, - mosaiccurrent: xname("images in the current file"), - mosaicdisplay: xname("images in this display") - } - }; - if( !tim ){ - items.createmosaic.disabled = true; - } - items.sessions = { - name: "session ...", - items: { - } - }; - items.sessions.items.loadsession = xname("load ..."); - items.sessions.items.savesession = { - name: "save ...", - items: { - savesessiontitle: { - name: "include these images:", - disabled: true - }, - savecurrent: xname("the current image"), - savedisplay: xname("all images in this display") - } - }; - items.windows = { - name: "window ...", - items: { - windowstitle: { - name: "create a new:", - disabled: true - } - } - }; - items.windows.items.lite = xname("light window"); - items.windows.items.xnew = xname("separate window"); - if( window.electron ){ - items.windows.items.xnew.disabled = true; - } - if( window.electron ){ - items.electronHelper = xname("connect to JS9 helper"); - if( JS9.helper.connected ){ - items.electronHelper.disabled = true; - } - } - // super menu - if( this.issuper ){ - arr = JS9.Menubar.getDisplays.call(this, "all"); - items.supermenu = { - name: "supermenu ...", - items: { - supertitle: { - name: "target this display:", - disabled: true - } - } - }; - for(i=0, m=0; i 0 && cel.find(".JS9GridItem").length > 1) ){ - items.removedisplay = xname("remove this display"); - } - items[`sep${n++}`] = "------"; - items.print = xname("print ..."); - if( !tim ){ - items.print.disabled = true; - } - if( window.electron ){ - items.windowPrint = xname("print window ..."); - items.windowPDF = xname("save window to pdf"); - if( window.electron.app ){ - items.saveScript = xname("export messaging script"); - } - } - // plugins - for(i=0; i { - let uplugin; - JS9.Menubar.getDisplays.call(this, "any", key) - .forEach((val) => { - let j, s, t, kid, unew, uim; - const udisp = val; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - if( udisp ){ - uim = udisp.image; - } - switch(key){ - case "refresh": - if( uim && uim.raw.hdu && uim.raw.hdu.fits ){ - uim.refreshImage(); - } - break; - case "full": - if( uim && uim.raw.hdu && uim.raw.hdu.fits ){ - uim.displaySection("full"); - } - break; - case "cutout": - if( uim && uim.raw.hdu && uim.raw.hdu.fits ){ - uim.displaySection("selected"); - } - break; - case "free": - if( uim && uim.raw.hdu && uim.raw.hdu.fits ){ - JS9.cleanupFITSFile(uim.raw.hdu.fits, true); - } - break; - case "close": - if( uim ){ - uim.closeImage(); - } - break; - case "closeall": - if( udisp ){ - // close all images in this display - JS9.CloseDisplay(udisp.id); - } - break; - case "removeproxy": - if( uim ){ - uim.removeProxyFile(); - } - break; - case "removedisplay": - if( udisp ){ - // remove this display - JS9.RemoveDisplay(udisp.id); - } - break; - case "savecurrent": - if( udisp && uim ){ - JS9.SaveSession({mode: "image"}, - {display: udisp}); - } - break; - case "savedisplay": - if( udisp ){ - JS9.SaveSession({mode: "display"}, - {display: udisp}); - } - break; - case "loadsession": - if( udisp ){ - JS9.OpenSessionMenu({display: udisp}); - } - break; - case "loadcatalog": - if( udisp ){ - JS9.OpenCatalogsMenu({display: udisp}); - } - break; - case "savecatalog": - if( uim ){ - uim.saveCatalog(); - } - break; - case "mosaiccurrent": - if( udisp && uim ){ - JS9.CreateMosaic("current", {display: udisp}); - } - break; - case "mosaicdisplay": - if( udisp ){ - JS9.CreateMosaic("all", {display: udisp}); - } - break; - case "header": - if( uim ){ - if( uim.raw.header ){ - uim.displayAnalysis("text", - JS9.raw2FITS(uim.raw, {addcr: true}), - {title: `FITS Header: ${uim.id}`}); - } else { - JS9.error(`no FITS header for ${uim.id}`); - } - } - break; - case "hdus": - if( uim ){ - if( uim.hdus ){ - uim.displayAnalysis("text", - JS9.hdus2Str(uim.hdus), - {title: `FITS HDUs: ${uim.id}`, - winformat: "width=800px,height=200px,resize=1,scrolling=1"}); - } else { - JS9.error(`no FITS header for ${uim.id}`); - } - } - break; - case "lite": - JS9.LoadWindow(null, {clone: udisp.id}, "light"); - break; - case "xnew": - JS9.LoadWindow(null, null, "new"); - break; - case "electronHelper": - // Electron.js: send message to main - if( window.electron ){ - try{ - window.electron.sendMsg("startHelper"); - } - catch(e){ /* empty */ } - } - break; - case "pageid": - s = `

    pageid: ${JS9.helper.pageid||"none"}

    `; - t = "JS9 page id"; - // add display to title - t += sprintf(JS9.IDFMT, udisp.id); - JS9.lightWin(`fileid${JS9.uniqueID()}`, - "inline", s, t, - JS9.lightOpts[JS9.LIGHTWIN].lineWin); - break; - case "openboth": - if( udisp ){ - udisp.displayLoadForm(); - } - break; - case "openlocal": - if( udisp ){ - JS9.OpenFileMenu({display: udisp}); - } - break; - case "openremote": - if( udisp ){ - udisp.displayLoadForm({remote: true}); - } - break; - case "savefits": - case "savefitsvirtual": - case "savefitsentire": - if( uim ){ - s = uim.id.replace(/\.png/i, ".fits") - .replace(/\[.*\]/,"") - .replace(/\.gz$/i, "") - .replace(/\.bz2$/i, "") - .replace(/\s+/g, "_"); - if( key === "savefits" ){ - uim.saveFITS(s, "display"); - } else if( key === "savefitsvirtual" ){ - if( uim.raw.hdu && - uim.raw.hdu.fits && - uim.raw.hdu.fits.vfile ){ - s = uim.raw.hdu.fits.vfile - .replace(/^bz::/, "") - .replace(/^gz::/, ""); - uim.saveFITS(s, "virtual"); - } else { - JS9.error("no memory file available"); - } - } else { - uim.saveFITS(s); - } - } - break; - case "savepng": - if( uim ){ - s = uim.id.replace(/\.fit[s]?/i, ".png") - .replace(/\[.*\]/,"") - .replace(/\.gz$/i, "") - .replace(/\.bz2$/i, "") - .replace(/\s+/g, "_"); - uim.savePNG(s); - } - break; - case "savejpeg": - if( uim ){ - s = uim.id.replace(/\.fit[s]?/i, ".jpeg") - .replace(/\.png$/i, ".jpeg") - .replace(/\.gz$/i, "") - .replace(/\[.*\]/,""); - uim.saveJPEG(s); - } - break; - case "print": - if( uim ){ - uim.print(); - } - break; - case "windowPrint": - if( window.electron ){ - JS9.WindowPrint(); - } - break; - case "windowPDF": - if( window.electron ){ - JS9.WindowToPDF(); - } - break; - case "saveScript": - if( window.electron && window.electron.app ){ - JS9.SaveScript(); - } - break; - case "separate": - if( udisp ){ - udisp.separate(); - } - break; - case "gather": - if( udisp ){ - if( (this.id.search(JS9.SUPERMENU) >= 0) && - !this.selectedDisplay ){ - JS9.error("gather requires a selected display"); - } - udisp.gather(); - } - break; - default: - // maybe its a supermenu request - if( key.match(/^super_/) ){ - unew = key.replace(/^super_/,""); - JS9.Menubar.onclick.call(this, unew); - return; - } - // maybe it's a moveto request - if( key.match(/^moveto_/) ){ - unew = key.replace(/^moveto_/,""); - if( unew === "newdisp" ){ - // separate the current image - udisp.separate({images:[uim], - firstinplace:false}); - } else { - // move current image to specified display - uim.moveToDisplay(unew); - } - return; - } - // maybe it's a plugin - for(j=0; j { - evt.preventDefault(); - $(`#editMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#editMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let n=0; - const items = {}; - // plugins - items.edittitle1 = { - name: "Regions:", - disabled: true - }; - items.configReg = xname("edit"); - items.copyReg = xname("copy"); - items.pastePos = xname("paste to current pos"); - items.pasteReg = xname("paste to original pos"); - items.undoRemove = xname("undo remove"); - // deepscan-disable-next-line UNUSED_VAR_ASSIGN - items[`sep${n++}`] = "------"; - items.edittitle2 = { - name: "Position/Value:", - disabled: true - }; - items.copyWCSPos = xname("copy wcs pos"); - items.copyValPos = xname("copy value/pos"); - return { - callback: (key) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let s, ulayer, uao; - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - switch(key){ - case "configReg": - if( uim ){ - ulayer = uim.layers.regions; - if( ulayer ){ - uao = ulayer.canvas.getActiveObject(); - if( uao && uao.type !== "activeSelection" ){ - // no active selection, edit this region - uim.displayRegionsForm(uao); - } else { - // active selection or no regions: multi - uim.displayRegionsForm(null, - {multi: true}); - } - } - } - break; - case "copyReg": - if( uim ){ - s = uim.listRegions(null, {mode: 1}); - JS9.CopyToClipboard(s); - } - break; - case "pasteReg": - if( uim ){ - JS9.Regions.pasteFromClipboard.call(uim); - } - break; - case "pastePos": - if( uim ){ - JS9.Regions.pasteFromClipboard.call(uim, - true); - } - break; - case "undoRemove": - if( uim ){ - uim.unremoveRegions(); - } - break; - case "copyWCSPos": - if( {}.hasOwnProperty.call(JS9, "Keyboard") ){ - JS9.Keyboard.Actions["copy wcs position to clipboard"](uim, uim.ipos); - } - break; - case "copyValPos": - if( {}.hasOwnProperty.call(JS9, "Keyboard") ){ - JS9.Keyboard.Actions["copy value and position to clipboard"](uim, uim.ipos); - } - break; - default: - break; - } - }); - }, - items: items - }; - } - }); - // ViewMac menu: make button open the contextMenu - $(`#viewMacMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#viewMacMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#viewMacMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, menu; - const items = {}; - items.edittitle1 = { - name: "View:", - disabled: true - }; - for(i=0; i { - switch(key){ - default: - $(`#${key}Menu${this.id}`).contextMenu(); - break; - } - }, - items: items - }; - } - }); - // View menu: make button open the contextMenu - $(`#viewMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#viewMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#viewMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, key; - let plugin, pname, pinst; - let lastxclass=""; - let n = 0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const tim = tdisp.image; - const editValposColor = (disp, obj) => { - delete tdisp.tmp.editingMenu; - if( obj.valposcolor ){ - JS9.textColorOpts.info = obj.valposcolor; - if( disp && disp.image ){ - disp.image.updateValpos(disp.image.ipos, true); - } - } - } - const keyValposColor = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - editValposColor(vdisp, obj); - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - const editResize = (disp, obj) => { - let v1, v2, arr; - delete tdisp.tmp.editingMenu; - if( obj.resize ){ - arr = obj.resize.split(/[\s,/]+/); - switch(arr.length){ - case 0: - break; - case 1: - if( tim ){ - v1 = tim.wcs2imlen(arr[0]); - disp.resize(v1, v1); - } else if( JS9.isNumber(arr[0]) ){ - v1 = parseInt(arr[0], 10); - disp.resize(v1, v1); - } - break; - default: - if( tim && tim.wcs ){ - v1 = tim.wcs2imlen(arr[0]); - v2 = tim.wcs2imlen(arr[1]); - disp.resize(v1, v2); - } else if( JS9.isNumber(arr[0]) && - JS9.isNumber(arr[1]) ){ - v1 = parseInt(arr[0], 10); - v2 = parseInt(arr[1], 10); - disp.resize(v1, v2); - } - break; - } - } - }; - const keyResize = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - editResize(vdisp, obj); - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - // plugins - items[`sep${n++}`] = {name: "Plugins:"}; - items[`sep${n-1}`].disabled = true; - for(i=0; i 1 ){ - items.vdisps.items.rawlayer.items.whichrawtitle = { - name: "current raw data:" - }; - for(i=0; i { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let ii, uplugin, s; - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - switch(key){ - case "valpos": - if( uim ){ - uim.toggleValpos(); - } - break; - case "valposdisp": - JS9.globalOpts.valposDCoords = - !JS9.globalOpts.valposDCoords; - break; - case "xhair": - if( uim ){ - uim.toggleCrosshair(); - } - break; - case "xhairwcs": - if( uim ){ - uim.toggleWCSCrosshair(); - } - break; - case "toolbar": - s = !JS9.GetToolbar("showTooltips"); - JS9.SetToolbar("showTooltips", s); - break; - case "logo": - JS9.globalOpts.logoDisplay = - !JS9.globalOpts.logoDisplay; - s = JS9.globalOpts.logoDisplay ? "block" : "none"; - for(ii=0; ii { - const udisp = this.display; - const obj = {}; - if( udisp ){ - obj.resize = sprintf("%d %d", - udisp.width, udisp.height); - obj.valposcolor = JS9.textColorOpts.info; - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - } - }, - hide: (opt) => { - let obj; - const udisp = this.display; - if( udisp ){ - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - obj = $.contextMenu.getInputValues(opt); - editResize(udisp, obj); - } - } - } - }, - items: items - }; - } - }); - // Zoom menu: make button open the contextMenu - $(`#zoomMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#zoomMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#zoomMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, zoom, zoomp, name, name2, nim, s1; - let plugin, pname, pinst; - let lastxclass=""; - let n = 0; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const tim = tdisp.image; - const editZoom = (im, obj) => { - delete tdisp.tmp.editingMenu; - // allow numbers or strings - if( !Number.isNaN(obj.zoom) ){ - im.setZoom(obj.zoom); - } - }; - const editRotate = (im, obj) => { - delete tdisp.tmp.editingMenu2; - // allow numbers or strings - if( !Number.isNaN(obj.rotate) ){ - im.setRotate(obj.rotate); - } - }; - const keyZoom = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - if( vim ){ - editZoom(vim, obj); - } - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - const keyRotate = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - if( vim ){ - editRotate(vim, obj); - } - break; - default: - vdisp.tmp.editingMenu2 = true; - break; - } - }); - }; - const items = {}; - items.zoomtitle = { - name: "Zoom Factors:", - disabled: true - }; - for(i=JS9.imageOpts.topZooms; i>=1; i--){ - zoom = Math.pow(2,-i); - zoomp = Math.pow(2,i); - name = `zoom${zoom}`; - name2 = `zoom 1/${zoomp}`; - items[name] = xname(name2); - if( tim && (tim.rgb.sect.zoom === zoom) ){ - items[name].icon = JS9.globalOpts.menuSelected; - } - } - for(i=0; i<=JS9.imageOpts.topZooms; i++){ - zoom = Math.pow(2,i); - name = `zoom${zoom}`; - name2 = `zoom ${zoom}`; - items[name] = xname(name2); - if( tim && (tim.rgb.sect.zoom === zoom) ){ - items[name].icon = JS9.globalOpts.menuSelected; - } - } - items.morezooms = { - name: "more zooms ...", - items: { - morezoomstitle: { - name: "Zoom Factors:", - disabled: true - } - } - }; - for(i=JS9.imageOpts.zooms; i>JS9.imageOpts.topZooms; i--){ - zoom = Math.pow(2,-i); - zoomp = Math.pow(2,i); - name = `zoom${zoom}`; - name2 = `zoom 1/${zoomp}`; - items.morezooms.items[name] = xname(name2); - if( tim && (tim.rgb.sect.zoom === zoom) ){ - items.morezooms.items[name].icon = JS9.globalOpts.menuSelected; - } - } - for(i=JS9.imageOpts.topZooms+1; i<=JS9.imageOpts.zooms; i++){ - zoom = Math.pow(2,i); - name = `zoom${zoom}`; - name2 = `zoom ${zoom}`; - items.morezooms.items[name] = xname(name2); - if( tim && (tim.rgb.sect.zoom === zoom) ){ - items.morezooms.items[name].icon = JS9.globalOpts.menuSelected; - } - } - items.zoom = { - events: {keyup: keyZoom}, - name: "numeric zoom:", - type: "text" - }; - items[`sep${n++}`] = "------"; - items.zoomiotitle = { - name: "Zoom In/Out:", - disabled: true - }; - items.zoomIn = xname("zoom in"); - items.zoomOut = xname("zoom out"); - items.zoomToFit = xname("zoom to fit"); - items[`sep${n++}`] = "------"; - items.panzoomtitle = { - name: "Pand and Zoom:", - disabled: true - }; - items.center = xname("pan to center"); - items.alignpanzoom = { - name: "align pan/zoom ...", - items: { - alignpanzoomtitle: { - name: "to this image:", - disabled: true - } - } - }; - for(i=0, nim=0; i { - let ii, uplugin; - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - if( uim ){ - switch(key){ - case "zoomIn": - uim.setZoom("x2"); - break; - case "zoomOut": - uim.setZoom("/2"); - break; - case "zoomToFit": - uim.setZoom("tofit"); - break; - case "center": - uim.setPan(); - break; - case "reset": - uim.setZoom("1"); - uim.setPan(); - break; - case "flipX": - uim.setFlip("x"); - break; - case "flipY": - uim.setFlip("y"); - break; - case "rot90_90": - uim.setRot90(90); - break; - case "rot90_270": - uim.setRot90(-90); - break; - case "northisup": - uim.setRot90("reset"); - uim.setRotate("northisup"); - break; - case "resetall": - uim.setFlip("reset"); - uim.setRot90("reset"); - uim.setRotate("reset"); - break; - default: - // maybe it's a plugin - for(ii=0; ii { - const udisp = this.display; - const uim = udisp.image; - const obj = {}; - if( uim ){ - obj.zoom = - JS9.floatToString(uim.rgb.sect.zoom); - obj.rotate = - JS9.floatToString(uim.params.rotate||0); - } - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - obj = $.contextMenu.getInputValues(opt); - editZoom(uim, obj); - } - if( udisp.tmp.editingMenu2 ){ - obj = $.contextMenu.getInputValues(opt); - editRotate(uim, obj); - } - } - } - }, - items: items - }; - } - }); - // Scale menu: make button open the contextMenu - $(`#scaleMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#scaleMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#scaleMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, s1, s2; - let plugin, pname, pinst; - let lastxclass=""; - let n = 0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const editScale = (im, obj) => { - let dval1 = im.params.scalemin; - let dval2 = im.params.scalemax; - delete tdisp.tmp.editingMenu; - if( JS9.isNumber(obj.scalemin) ){ - dval1 = parseFloat(obj.scalemin); - } - if( JS9.isNumber(obj.scalemax) ){ - dval2 = parseFloat(obj.scalemax); - } - im.setScale(dval1, dval2); - im.displayImage("colors"); - }; - const keyScale = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - if( vim ){ - editScale(vim, obj); - } - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - items.scaletitle = {name: "Scaling Algorithms:", - disabled: true}; - for(i=0; i { - let ii, uplugin; - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - if( uim ){ - switch(key){ - default: - // maybe it's a plugin - for(ii=0; ii { - const udisp = this.display; - const uim = udisp.image; - const obj = {}; - if( uim ){ - obj.scalemin = - JS9.floatToString(uim.params.scalemin); - obj.scalemax = - JS9.floatToString(uim.params.scalemax); - } - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - obj = $.contextMenu.getInputValues(opt); - editScale(uim, obj); - } - } - } - }, - items: items - }; - } - }); - // Color menu: make button open the contextMenu - $(`#colorMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#colorMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#colorMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, s1, s2, hstr, img; - let plugin, pname, pinst; - let lastxclass=""; - let n = 0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const editColor = (im, obj) => { - delete tdisp.tmp.editingMenu; - if( obj.contrast && !Number.isNaN(obj.contrast) ){ - im.params.contrast = parseFloat(obj.contrast); - } - if( obj.bias && !Number.isNaN(obj.bias) ){ - im.params.bias = parseFloat(obj.bias); - } - if( obj.opacity.match(/reset/) || obj.opacity.trim() === "" ){ - im.setOpacity("reset"); - } else if( !Number.isNaN(obj.opacity) ){ - im.setOpacity(parseFloat(obj.opacity)); - } - im.displayImage("colors"); - }; - const keyColor = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - editColor(vim, obj); - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - items.cmaptitle = { - name: "Colormaps:", - disabled: true - }; - for(i=0; i` + `  ${s2}
    `; - items[s1] = {name: hstr, isHtmlName: true}; - } else { - items[s1] = xname(s2); - } - if( tdisp.image && (tdisp.image.cmapObj.name === s1) ){ - items[s1].icon = JS9.globalOpts.menuSelected; - } - } - items.morecmaps = { - name: "more colormaps ...", - items: { - morecmapstitle: { - name: "Colormaps:", - disabled: true - } - } - }; - for(i=0; i` + `  ${s2}
    `; - items.morecmaps.items[s1] = {name: hstr, isHtmlName: true}; - } else { - items.morecmaps.items[s1] = xname(s2); - } - if( tdisp.image && (tdisp.image.cmapObj.name === s1) ){ - items.morecmaps.items[s1].icon = JS9.globalOpts.menuSelected; - } - } - } - items[`sep${n++}`] = "------"; - items.imfilter = xname("image filters ..."); - items[`sep${n++}`] = "------"; - items.contrast = { - events: {keyup: keyColor}, - name: "contrast:", - type: "text" - }; - items.bias = { - events: {keyup: keyColor}, - name: "bias:", - type: "text" - }; - items.reset = xname("reset contrast & bias"); - items[`sep${n++}`] = "------"; - items.opacity = { - events: {keyup: keyColor}, - name: "opacity:", - type: "text" - }; - items[`sep${n++}`] = "------"; - items.loadcmap = xname("load ..."); - items.savecmap = xname("save"); - items[`sep${n++}`] = "------"; - items.invert = xname("invert"); - if( tdisp.image && tdisp.image.params.invert ){ - items.invert.icon = JS9.globalOpts.menuSelected; - } - items.rgb = xname("rgb mode"); - if( tdisp.rgb.active ){ - items.rgb.icon = JS9.globalOpts.menuSelected; - } - if( tdisp.image && tdisp.image.offscreen && !tdisp.image.rgbFile ){ - items.overlay = xname("image overlay"); - if( tdisp.image.params.overlay ){ - items.overlay.icon = JS9.globalOpts.menuSelected; - } - } - items[`sep${n++}`] = "------"; - // plugins - for(i=0; i { - let ii, uplugin; - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - switch(key){ - case "loadcmap": - JS9.OpenColormapMenu({display: udisp}); - break; - case "savecmap": - JS9.SaveColormap({display: udisp}); - break; - case "imfilter": - JS9.DisplayPlugin("JS9Filters", {display: udisp}); - break; - default: - // maybe it's a plugin - for(ii=0; ii { - const udisp = this.display; - const uim = udisp.image; - const obj = {}; - if( uim ){ - obj.contrast = - JS9.floatToString(uim.params.contrast); - obj.bias = - JS9.floatToString(uim.params.bias); - obj.opacity = - JS9.floatToString(uim.params.opacity); - obj.sigma = - JS9.floatToString(uim.params.sigma); - } - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - obj = $.contextMenu.getInputValues(opt); - editColor(uim, obj); - } - } - } - }, - items: items - }; - } - }); - // Region menu: make button open the contextMenu - $(`#regionMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#regionMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#regionMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, s1, reg, img, key; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const tim = tdisp.image; - const items = {}; - const getregval = (key, val) => { - switch(key){ - case "color": - // lookup color - if( val.charAt(0) !== "#" && JS9.colorToHex(val) === val ){ - return null; - } - break; - case "strokeWidth": - // number - if( !JS9.isNumber(val) ){ - return null; - } - val = parseFloat(val); - break; - case "strokeDashArray": - // space or comma-separated list of numbers - val = val.split(/[\s,]+/); - if( !val || !val.length ){ - return null; - } - if( val.length < 2 ){ - val[1] = "0"; - } - if( !JS9.isNumber(val[0]) || !JS9.isNumber(val[1]) ){ - return null; - } - val[0] = parseFloat(val[0]); - val[1] = parseFloat(val[1]); - break; - default: - // text - break; - } - return val; - }; - const editRegions = (im, obj, which) => { - let key, val; - const opts = {}; - obj = obj || {}; - if( which ){ - key = which.substring(3); - val = obj[which]; - if( key && val && im.tmp[`editingReg${which}`] ){ - delete im.tmp[`editingReg${which}`]; - val = getregval(key, val); - if( val ){ - opts[key] = val; - im.changeShapes("regions", "selected", opts); - } - } - } else { - for( which of Object.keys(obj) ){ - key = which.substring(3); - val = obj[which]; - if( key && val && im.tmp[`editingReg${which}`] ){ - delete im.tmp[`editingReg${which}`]; - val = getregval(key, val); - if( val ){ - opts[key] = val; - } - } - } - if( Object.keys(opts).length ){ - im.changeShapes("regions", "selected", opts); - } - } - }; - items.regiontitle = { - name: "Regions:", - disabled: true - }; - if( JS9.globalOpts.menuImages ){ - for(i=0; i` + `  ${reg}
    `, - isHtmlName: true}; - } - } else { - for(i=0; i 1) ){ - for(i=0; i { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let uid, ulayer, uao, uopts; - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - if( uim ){ - switch(key){ - case "loadRegions": - JS9.OpenRegionsMenu({display: udisp}); - break; - case "listRegions": - uim.listRegions(null, {mode: 2}); - break; - case "createRegions": - JS9.globalOpts.regMenuCreate = - !JS9.globalOpts.regMenuCreate; - break; - case "removeRegions": - uim.removeShapes("regions", null); - udisp.clearMessage("regions"); - break; - case "saveRegions": - ulayer = uim.layers.regions; - if( ulayer ){ - uao = ulayer.canvas.getActiveObject(); - uopts = {type: "save"}; - if( uao && uao.type !== "activeSelection" ){ - uim.displayRegionsForm(uao, uopts); - } else { - uim.displayRegionsForm(null, uopts); - } - } - break; - case "selectRegions": - if( {}.hasOwnProperty.call(JS9, "Keyboard") ){ - JS9.Keyboard.Actions["select all regions"](uim, uim.ipos); - } - break; - case "unselectRegions": - if( {}.hasOwnProperty.call(JS9, "Keyboard") ){ - JS9.Keyboard.Actions["unselect all regions"](uim, uim.ipos); - } - break; - case "selectedRegions": - ulayer = uim.layers.regions; - if( ulayer ){ - uao = ulayer.canvas.getActiveObject(); - if( uao && uao.type !== "activeSelection" ){ - // no active selection, edit this region - uim.displayRegionsForm(uao); - } else { - // active selection or no regions: multi - uim.displayRegionsForm(null, - {multi: true}); - } - } - break; - case "xeqonchange": - uim.params.xeqonchange = !uim.params.xeqonchange; - break; - case "listonchange": - uim.params.listonchange = !uim.params.listonchange; - break; - default: - // maybe it's a copyto request - if( key.match(/^copyto_/) ){ - uid = key.replace(/^copyto_/,""); - uim.copyRegions(uid); - return; - } - // otherwise it's new region - JS9.globalOpts.regMenuSelected = key; - if( JS9.globalOpts.regMenuCreate ){ - uim.addShapes("regions", key, {ireg: true}); - } - break; - } - } - }); - }, - events: { - show: (opt) => { - const obj = {color: ""}; - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - // if a key was pressed, do the edit - obj = $.contextMenu.getInputValues(opt); - editRegions(uim, obj); - } - } - }, - items: items - }; - } - }); - // WCS menu: make button open the contextMenu - $(`#wcsMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#wcsMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#wcsMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, s1, s2, key, altwcs, sys, units; - let n=0, nwcs=0, got=0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const tim = tdisp.image; - const editRotate = (im, obj) => { - delete tdisp.tmp.editingMenu; - if( JS9.isNumber(obj.rot) ){ - im.rotateData(parseFloat(obj.rot)); - } - }; - const keyRotate = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - if( vim ){ - editRotate(vim, obj); - } - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - items.wcssystitle = { - name: "WCS Systems:", - disabled: true - }; - if( !tim || (tim && tim.validWCS()) ){ - sys = JS9.wcssyss; - } else { - sys = ["image", "physical"]; - } - for(i=0; i { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let file, s; - const rexp = new RegExp(key); - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - if( uim ){ - // maybe it's an alt wcs request - if( key.match(/^altwcs_/) ){ - s = key.replace(/^altwcs_/,""); - uim.setWCS(s); - return; - } - // maybe it's a wcs reprojection request - if( key.match(/^reproject_/) ){ - if( key === "reproject_wcsalign" ){ - uim.params.wcsalign = !uim.params.wcsalign; - uim.displayImage("display"); - } else if( key === "reproject_northup" ){ - uim.rotateData("northisup"); - } else if( key === "reproject_revert" ){ - if( uim.raw.id !== JS9.RAWID0 ){ - for(i=0; i=0 ){ - uim.setWCSSys(key); - uim.updateShapes("regions", "all", "wcs"); - } else if( JS9.wcsunitss.join("@").search(rexp)>=0){ - uim.setWCSUnits(key); - uim.updateShapes("regions", "all", "wcs"); - } else { - JS9.error(`unknown wcs sys/units: ${key}`); - } - } - }); - }, - events: { - show: (opt) => { - const udisp = this.display; - const uim = udisp.image; - const obj = {}; - if( uim ){ - obj.rot = ""; - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - } - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - obj = $.contextMenu.getInputValues(opt); - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - editRotate(uim, obj); - } - } - } - }, - items: items - }; - } - }); - // Analysis menu: make button open the contextMenu - $(`#analysisMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#analysisMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#analysisMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let i, j, s, apackages, atasks; - let plugin, pinst, pname; - let lastxclass=""; - let n = 0; - let ntask = 0; - const items = {}; - const tdisp = JS9.Menubar.getDisplays.call(this)[0]; - const im = tdisp.image; - const editAnalysis = (im, obj) => { - delete tdisp.tmp.editingMenu; - obj.sigma = obj.sigma || "0"; - if( obj.sigma === "none" ){ - obj.sigma = "0"; - } - try{ im.params.sigma = parseFloat(obj.sigma); } - catch(e){ im.params.sigma = 0; } - im.gaussBlurData(im.params.sigma); - }; - const keyAnalysis = (e) => { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - const obj = $.contextMenu.getInputValues(e.data); - const keycode = e.which || e.keyCode; - const vdisp = val; - const vim = vdisp.image; - // make sure display is still valid - if( $.inArray(vdisp, JS9.displays) < 0 ){ - return; - } - switch( keycode ){ - case 9: - case 13: - editAnalysis(vim, obj); - break; - default: - vdisp.tmp.editingMenu = true; - break; - } - }); - }; - for(i=0; i 0 ){ - items[`sep${n++}`] = "------"; - } - items[`sep${n++}`] = - {name: `${plugin.xclass} Plugins:`}; - items[`sep${n-1}`].disabled = true; - } - lastxclass = plugin.xclass; - items[pname] = { - name: plugin.opts.menuItem - }; - if( pinst && (pinst.status === "active") ){ - items[pname].icon = JS9.globalOpts.menuSelected; - } - n++; - } - } - } - // no server side analysis for all-in-one configuration - if( !JS9.allinone ){ - if( n > 0 ){ - items[`sep${n++}`] = "------"; - } - items.localtitle = { - name: "Client-side Analysis:", - disabled: true - }; - items.grid = xname("Coordinate Grid"); - if( !im || !im.raw.wcs || im.raw.wcs <=0 ){ - items.grid.disabled = true; - } else { - if( im.displayCoordGrid() ){ items.grid.icon = JS9.globalOpts.menuSelected; } - } - items.regcnts = xname("Counts in Regions"); - items.radprof = xname("Radial Profile"); - if( !JS9.globalOpts.internalRegcnts || - !im || !im.raw || !im.raw.hdu || !im.raw.hdu.vfile ){ - items.regcnts.disabled = true; - items.radprof.disabled = true; - } - if( im && im.raw && im.raw.header.NAXIS === 3 ){ - items.cnts3d = xname("3D Counts in Regions"); - items.plot3d = xname("3D Plot using Regions"); - if( !JS9.globalOpts.internalRegcnts || - !im.raw.hdu || !im.raw.hdu.vfile ){ - items.cnts3d.disabled = true; - items.plot3d.disabled = true; - } - } - items.sigma = { - events: {keyup: keyAnalysis}, - name: "Blur, equivalent sigma:", - type: "text" - }; - items[`sep${n++}`] = "------"; - items.remotetitle = { - name: "Server-side Analysis:", - disabled: true - }; - if( im && im.analysisPackages ){ - apackages = im.analysisPackages; - // m = 0; - for(j=0; j { - JS9.Menubar.getDisplays.call(this).forEach((val) => { - let a, s, did, ii, tplugin; - const udisp = val; - const uim = udisp.image; - // make sure display is still valid - if( $.inArray(udisp, JS9.displays) < 0 ){ - return; - } - // first look for a plugin -- no image rquired - for(ii=0; ii { - $('#dataPath').val(JS9.globalOpts.dataPath); - }); - did = uim.displayAnalysis("textline", - JS9.InstallDir(JS9.analOpts.dpathURL), - {title: "Data path for analysis"}); - // save display id - $(did).data("dispid", udisp.id); - $(did).data("imid", uim.id); - break; - case "fpath": - // call this once window is loaded - $(JS9.lightOpts[JS9.LIGHTWIN].topid) - .arrive("#filePathForm", - {onceOnly: true}, () => { - $('#filePath').val(uim.file); - }); - did = uim.displayAnalysis("textline", - JS9.InstallDir(JS9.analOpts.fpathURL), - {title: "File path for this image"}); - // save display id - $(did).data("dispid", udisp.id); - $(did).data("imid", uim.id); - break; - case "grid": - uim.displayCoordGrid(!uim.displayCoordGrid()); - break; - case "upload": - uim.uploadFITSFile(); - break; - default: - // look for analysis routine - a = uim.lookupAnalysis(key); - if( a ){ - // load param url to run analysis task - // param url is relative to js9 install dir - if( a.purl ){ - did = uim.displayAnalysis("params", - JS9.InstallDir(a.purl), - {title: `${a.title}: ${uim.fitsFile}`, - winformat: a.pwin}); - // save info for running the task - $(did).data("dispid", udisp.id) - .data("aname", a.name); - } else { - // else run task directly - uim.runAnalysis(a.name); - } - } - return; - } - } - }); - }, - events: { - show:(opt) => { - const udisp = this.display; - const uim = udisp.image; - const obj = {}; - if( uim ){ - obj.sigma = JS9.floatToString(uim.params.sigma); - } - $.contextMenu.setInputValues(opt, obj); - JS9.jupyterFocus(".context-menu-item"); - }, - hide: (opt) => { - let obj; - const udisp = this.display; - const uim = udisp.image; - if( uim ){ - // if a key was pressed, do the edit - if( udisp.tmp.editingMenu ){ - obj = $.contextMenu.getInputValues(opt); - editAnalysis(uim, obj); - } - } - } - }, - items: items - }; - } - }); - // Help menu: make button open the contextMenu - $(`#helpMenu${this.id}`).on("mousedown", (evt) => { - evt.preventDefault(); - $(`#helpMenu${this.id}`).contextMenu(); - }); - // define contextMenu actions - $.contextMenu({ - selector: `#helpMenu${this.id}`, - zIndex: JS9.MENUZINDEX, - events: { hide: onhide }, - position: mypos, - build: () => { - let t, key, val; - let n = 1; - let last = ""; - const items = {}; - items.js9help = { - name: "General help ...", - items: { - helptitle: { - name: "General help:", - disabled: true - } - } - }; - // first, internal js9 pages - for( key of Object.keys(JS9.helpOpts) ){ - val = JS9.helpOpts[key]; - if( val.heading === "JS9Help" ){ - last = val.type; - items.js9help.items[key] = { - name: val.title - }; - } - } - items[`sep${n++}`] = "------"; - items.pluginhelp = { - name: "JS9 plugins ...", - items: { - helptitle: { - name: "JS9 plugins:", - disabled: true - } - } - }; - // second, the JS9 core plugins - for( key of Object.keys(JS9.helpOpts) ){ - val = JS9.helpOpts[key]; - if( val.heading === "JS9" ){ - last = val.type; - items.pluginhelp.items[key] = { - name: val.title.replace(/ \.\.\./, "") - }; - } - } - // last, the others - for( key of Object.keys(JS9.helpOpts) ){ - val = JS9.helpOpts[key]; - if( val.heading === "JS9Help" || val.heading === "JS9" ){ - continue; - } - if( (last !== "") && (val.type !== last) ){ - items[`sep${n++}`] = "------"; - if( val.heading ){ - t = `${val.heading } plugins`; - items[`sep${n++}`] = { - name: `${t} ...`, - items: { - title: { - name: `${t}:`, - disabled: true - } - } - }; - } - } - last = val.type; - items[`sep${n-1}`].items[key] = {name: val.title}; - } - items[`sep${n++}`] = "------"; - items.about = xname("About"); - return { - callback: (key) => { - switch(key){ - case "about": - alert(JS9.ABOUT); - break; - default: - JS9.DisplayHelp(key); - break; - } - }, - items: items - }; - } - }); - // user-defined menus - addUserMenus(); -}; - -// initialize the menu -JS9.Menubar.init = function(width, height){ - let i, j, m, ss, tt, menu, html; - this.issuper = this.id.search(JS9.SUPERMENU) >= 0; - // save object in super array, if necessary - if( this.issuper ){ - JS9.supermenus.push(this); - } - this.style = this.divjq.attr("data-style") || - JS9.globalOpts.menubarStyle || - "classic"; - this.style = this.style.toLowerCase(); - // set width and height on div - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = width || JS9.Menubar.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - this.buttonClass = this.divjq.attr("data-buttonClass") || "JS9Button" ; - this.containerClass = "JS9MenubarContainer"; - // special handling of some known button classes - if( this.buttonClass.match(/-flat/) ){ - this.containerClass += "-flat"; - } else if( this.buttonClass.match(/-border/) ){ - this.containerClass += "-border"; - } - this.backgroundColor = this.divjq.attr("data-backgroundColor"); - if( !this.height ){ - this.height = height || JS9.MENUHEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // look for usermenu directive, either for this element or globally - this.usermenus = this.divjq.attr("data-usermenus") === "true" || - JS9.globalOpts.userMenus; - // generate html for this menubar - html = ""; - for(j=0; j${tt} `; - } - } - } else { - if( this.style === "classic" ){ - html += ``; - } else { - switch(ss){ - case "file": - case "edit": - html += ``; - break; - case "help": - html += ``; - break; - default: - if( !this.macmenus ){ - html += `${"`; - this.macmenus = []; - } - if( tt === "View" ){ - tt = "Plugins"; - } - html += ``; - this.macmenus.push({name: ss, title: tt}); - break; - } - } - } - break; - } - } - } - // close mac-style span on View menu - if( this.macmenus ){ - html += ""; - } - // user-defined menus - if( this.usermenus && JS9.globalOpts.userMenuBar ){ - html += JS9.globalOpts.userMenuDivider || ""; - for(j=0; j${menu.title}` + `
    `; - } else { - m = menu.title; - } - html += ``; - } - } - // hidden menus - html += ""; - html += ""; - html += ""; - // link back the menubar in the display - this.display.menubar = this; - // define menubar - this.html = html.replace(/@@ID@@/g,this.id); - // add container to the high-level div - this.menuConjq = $("
    ") - .addClass(this.containerClass) - .attr("width", this.width) - .attr("height", this.height) - .html(this.html) - .appendTo(this.divjq); - // menubar background color - if( this.backgroundColor ){ - this.menuConjq.css("background", this.backgroundColor); - } - // create the standard menus - JS9.Menubar.createMenus.call(this); -}; - -JS9.RegisterPlugin("JS9", "Menubar", JS9.Menubar.init, - {onupdateprefs: JS9.Menubar.reset, - dynamicSelect: true, - winDims: [JS9.Menubar.WIDTH, JS9.Menubar.HEIGHT]}); - diff --git a/web/static/js9_old/plugins/core/mousetouch.css b/web/static/js9_old/plugins/core/mousetouch.css deleted file mode 100644 index 1bfba25..0000000 --- a/web/static/js9_old/plugins/core/mousetouch.css +++ /dev/null @@ -1,30 +0,0 @@ -div.JS9MouseTouchContainer { - padding: 2px; -} - -div.JS9MouseTouchText { - margin: 5px; - padding: 6px 6px 6px 10px; - background: #E9E9E9; - overflow: auto; - border: 1px solid transparent; -} - -div.JS9MouseTouchAction { - margin: 5px; - padding: 6px; - background: #E9E9E9; - overflow: auto; - border: 1px solid black; -} - -div.JS9MouseTouchHeader, div.JS9MouseTouchFooter { - background: #E9E9E9; - text-align: center; - padding: 0px; - margin-left: 15px; - margin-top: 5px; - margin-right: 5px; - margin-bottom: 0px; - border: 1px solid transparent; -} diff --git a/web/static/js9_old/plugins/core/panner.js b/web/static/js9_old/plugins/core/panner.js deleted file mode 100644 index e1c8202..0000000 --- a/web/static/js9_old/plugins/core/panner.js +++ /dev/null @@ -1,614 +0,0 @@ -/* - * Panner plugin - */ - -/*global $, JS9 */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Panner = {}; -JS9.Panner.CLASS = "JS9"; -JS9.Panner.NAME = "Panner"; -JS9.Panner.WIDTH = 320; // width of light window -JS9.Panner.HEIGHT = 320; // height of light window -JS9.Panner.SWIDTH = 250; // width of div -JS9.Panner.SHEIGHT = 250; // height of div -JS9.Panner.VSIZE = 30; -JS9.Panner.NORTH = { - color: "#00FF00", text: "N", fontSize: 12, fontFamily: "Helvetica", - strokeWidth: 1, strokeDashArray: [2,1] -}; -JS9.Panner.EAST = { - color: "#FFFF00", text: "E", fontSize: 12, fontFamily: "Helvetica", - strokeWidth: 1, strokeDashArray: [2,1] -}; - -// defaults for panner -JS9.Panner.opts = { - // override fabric defaults - hasControls: false, - hasRotatingPoint: false, - hasBorders: false, - // initial panner zoom - zoom: 4, - // canvas options - canvas: { - selection: true - }, - // panner box colors - tagcolors: { - defcolor: "#00FF00" - } -}; - -// call a JS9 routine from a button in the panner plugin toolbar -// the plugin instantiation saves the display id in the toolbar div -JS9.Panner.bcall = function(...args){ - let dispid, pinst, im; - let [which, cmd, arg1] = args; - // the button plugintoolbar div has data containing the id of the display - dispid = $(which).closest("div[class^=JS9PluginToolbar]").data("displayid"); - if( dispid ){ - im = JS9.getImage(JS9.getDynamicDisplayOr(dispid)); - pinst = im.display.pluginInstances.JS9Panner; - } else { - JS9.error(`can't find display for cmd: ${cmd}`); - } - if( !im ){ - JS9.error(`can't find image for cmd: ${cmd}`); - } - switch(cmd){ - case "zoomPanner": - if( args.length < 3 ){ - JS9.error(`missing arg(s) for cmd: ${cmd}`); - } - try{ - JS9.Panner.zoom.call(pinst, im, arg1); - } catch(e){ - JS9.error("error calling zoomPanner()", e); - } - break; - case "panImage": - try{ - im.setPan(); - } catch(e){ - JS9.error("error calling setPan()", e); - } - break; - default: - break; - } -}; - -// html used by the panner plugin -JS9.Panner.HTML = -"" + -"" + -"" + -"" + -"" + -""; - -// JS9 Panner constructor -JS9.Panner.init = function(width, height){ - // set width and height on div - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = width || JS9.Panner.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = height || JS9.Panner.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // create DOM canvas element - this.canvas = document.createElement("canvas"); - // jquery version for event handling and DOM manipulation - this.canvasjq = $(this.canvas); - // set class - this.canvasjq.addClass("JS9Panner"); - // required so graphical layers will be on top: - this.canvasjq.css("z-index", JS9.ZINDEX); - // how do we allow users to set the size of the canvas?? - // it doesn't go into the CSS and we have no canvas on the Web page ... - this.canvasjq.attr("width", this.width); - this.canvasjq.attr("height", this.height); - // drawing context - this.context = this.canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - this.context.imageSmoothingEnabled = false; - this.context.webkitImageSmoothingEnabled = false; - this.context.msImageSmoothingEnabled = false; - } - // add container with canvas to the high-level div - this.containerjq = $("
    ") - .addClass("JS9Container") - .append(this.canvasjq) - .appendTo(this.divjq); - // display current image in panner - if( this.display.image ){ - JS9.Panner.disp.call(this, this.display.image); - } -}; - -// create panner (RGB) image from scaled colorCells -// sort of from: tksao1.0/frame/truecolor.c, but not really -// part of panner plugin -JS9.Panner.create = function(im){ - let panDisp, panner, sect, img; - let x0, y0, xblock, yblock; - let i, j, ii, jj, kk; - let ioff, ooff; - let width, height; - let pos, ix, iy; - let dlayer; - // sanity checks - if( !im || !im.raw || - (!im.useOffScreenCanvas() && !im.colorData) || - !im.display.pluginInstances.JS9Panner ){ - return null; - } - // add panner object to image, if necessary - if( !im.panner ){ - im.panner = {}; - } - // init zoom factor, if necessary - if( !im.panner.zoom ){ - im.panner.zoom = 1; - } - // convenience variables - panDisp = im.display.pluginInstances.JS9Panner; - panner = im.panner; - sect = im.rgb.sect; - // size image - width = Math.min(im.raw.width, panDisp.width); - height = Math.min(im.raw.height, panDisp.height); - // block RGB image to fit into panner window - panner.xblock = im.raw.width / width; - panner.yblock = im.raw.height / height; - if( panner.xblock > panner.yblock ){ - height = Math.floor(height / panner.xblock * panner.yblock + 0.5); - panner.yblock = panner.xblock; - } else if( panner.yblock > panner.xblock ){ - width = Math.floor(width / panner.yblock * panner.xblock + 0.5); - panner.xblock = panner.yblock; - } - // create an RGB image the same size as the raw data - img = im.display.context.createImageData(width,height); - // calculate block factors and starting points based on zoom and block - if( panner.zoom === 1 ){ - xblock = panner.xblock; - yblock = panner.yblock; - x0 = 0; - y0 = 0; - } else { - xblock = panner.xblock / panner.zoom; - yblock = panner.yblock / panner.zoom; - // x0, y0 is the corner of the section of the image we can display in - // the panner (we can't display the whole image if we are zoomed). - x0 = Math.max(0, ((sect.x0 + sect.x1) - (width * xblock)) / 2); - y0 = Math.max(0, ((sect.y0 + sect.y1) - (height * yblock)) / 2); - } - // save lower limits for display - panner.x0 = x0; - panner.y0 = y0; - // save as panner image - panner.img = img; - panner.ix = 0; - panner.iy = 0; - if( im.useOffScreenCanvas() ){ - // for a static RGB file, access the RGB data directly - for(j=0; j { - let im, disp, panDisp; - disp = JS9.getDynamicDisplayOr(this.display); - if( disp && disp.image ){ - im = disp.image; - } else { - im = this.display.image; - } - if( im ){ - panDisp = im.display.pluginInstances.JS9Panner; - pos = opts.target.getCenterPoint(); - // flips will change the pan position - if( im.params.flip === "x" ){ - pos.x = panDisp.width - pos.x; - } else if( im.params.flip === "y" ){ - pos.y = panDisp.height - pos.y; - } else if( im.params.flip === "xy" ){ - pos.x = panDisp.width - pos.x; - pos.y = panDisp.height - pos.y; - } - // rotations will change the pan position - if( im.params.rot90 ){ - pos = JS9.rotatePoint(pos, - im.params.rot90, - {x:panDisp.width/2, y:panDisp.height/2}); - } - // rotations will change the pan position - if( im.params.rotate ){ - pos = JS9.rotatePoint(pos, - im.params.rotate, - {x:panDisp.width/2, y:panDisp.height/2}); - } - ix = ((pos.x - im.panner.ix) * - im.panner.xblock / im.panner.zoom) + im.panner.x0; - iy = ((dlayer.canvas.height - (pos.y + im.panner.iy)) * - im.panner.yblock / im.panner.zoom) + im.panner.y0; - // pan the image - try{ - // avoid triggering a re-pan - panDisp.status = "inactive"; - // pan image - im.setPan(ix, iy); - } - catch(e){JS9.log("couldn't pan image", e);} - finally{panDisp.status = "active";} - } - }); - return im; -}; - -// display the image on the panner canvas -JS9.Panner.disp = function(im){ - let panDisp, panner, sect, tblkx, tblky; - let obj, nx, ny, nwidth, nheight, cenx, ceny, pos; - let npos1, npos2, nobj, nobjt; - let epos1, epos2, eobj, eobjt; - let angle, xflip, yflip, wcsinfo, w2, h2, m, ctx; - const img2canvas = (im, img) => { - let context, canvas; - let panner = im.display.pluginInstances.JS9Panner; - if( !panner.offscreenRGB ){ - canvas = document.createElement("canvas"); - context = canvas.getContext("2d"); - // turn off anti-aliasing - if( !JS9.ANTIALIAS ){ - context.imageSmoothingEnabled = false; - } - panner.offscreenRGB = {canvas, context}; - } - panner.offscreenRGB.canvas.width = img.width; - panner.offscreenRGB.canvas.height = img.height; - panner.offscreenRGB.context.putImageData(img, 0, 0); - return panner.offscreenRGB.canvas; - }; - // sanity check - // only display if we have an image and panner present - if( !im || - !im.display.pluginInstances.JS9Panner || - im.display.pluginInstances.JS9Panner.status !== "active" ){ - return; - } - // always remake make panner image (might be zooming, for example) - if( !JS9.Panner.create.call(this, im) ){ - return; - } - // convenience variables - wcsinfo = im.raw.wcsinfo || {cdelt1: 1, cdelt2: 1, crot: 0}; - panner = im.panner; - panDisp = im.display.pluginInstances.JS9Panner; - sect = im.rgb.sect; - cenx = panDisp.width/2; - ceny = panDisp.height/2; - ctx = panDisp.context; - // we're done if there is no panner image - if( !panner.img ){ - return; - } - // offsets into display - if( panner.img.width < panDisp.width ){ - panner.ix = Math.floor((panDisp.width - panner.img.width)/2); - } - if( panner.img.height < panDisp.height ){ - panner.iy = Math.floor((panDisp.height - panner.img.height)/2); - } - // clear first - JS9.Panner.clear.call(this, im); - // save context - ctx.save(); - // do we need to apply the canvas transform? - if( im.params.transform ){ - // this is the transform matrix - m = im.params.transform; - // translate origin to center of display - w2 = panDisp.width / 2; - h2 = panDisp.height / 2; - ctx.translate(w2, h2); - // set new transform - ctx.transform(m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1]); - // translate back to 0, 0 - ctx.translate(-w2, -h2); - } - // draw the image into the context - // ctx.putImageData(panner.img, panner.ix, panner.iy); - ctx.drawImage(img2canvas(im, panner.img), panner.ix, panner.iy); - // restore original context - ctx.restore(); - // display panner rectangle - // convenience variables - tblkx = panner.zoom / panner.xblock; - tblky = panner.zoom / panner.yblock; - // size of rectangle - nwidth = im.display.width * tblkx / sect.zoom; - nheight = im.display.height * tblky / sect.zoom; - // position of the rectangle - nx = (sect.x0 - panner.x0) * tblkx + panner.ix; - ny = panDisp.height - ((sect.y1 - panner.y0) * tblky + panner.iy); - // adjust for section offset - if( im.display.width !== sect.width ){ - nx -= (im.display.width - sect.width) * tblkx / sect.zoom / 2; - } - if( im.display.height !== sect.height ){ - ny -= (im.display.height - sect.height) * tblky / sect.zoom / 2; - } - // convert to center pos - nx += nwidth / 2; - ny += nheight / 2; - // flips will change the pan position - if( im.params.flip === "x" ){ - nx = panDisp.width - nx; - } else if( im.params.flip === "y" ){ - ny = panDisp.height - ny; - } else if( im.params.flip === "xy" ){ - nx = panDisp.width - nx; - ny = panDisp.height - ny; - } - // rotations will change the pan position - if( im.params.rot90 ){ - pos = JS9.rotatePoint({x: nx, y: ny}, - - im.params.rot90, - {x:panDisp.width/2, y:panDisp.height/2}); - nx = pos.x; - ny = pos.y; - } - // rotations will change the pan position - if( im.params.rotate ){ - pos = JS9.rotatePoint({x: nx, y: ny}, - - im.params.rotate, - {x:panDisp.width/2, y:panDisp.height/2}); - nx = pos.x; - ny = pos.y; - } - // hide rectangle if it covers the full panner - if( nwidth >= panDisp.width ){ - nx = panDisp.width / 2; - nwidth = panDisp.width + 10; - } - if( nheight >= panDisp.height ){ - ny = panDisp.height / 2; - nheight = panDisp.height + 10; - } - // object containing position and size parameters: - obj = {left: nx, top: ny, width: nwidth, height: nheight}; - // create the box - if( !im.panner.boxid ){ - im.panner.boxid = im.addShapes("panner", "box", obj); - } else { - im.changeShapes("panner", im.panner.boxid, obj); - } - // clear direction vectors - if( im.panner.northid ){ - im.removeShapes("panner", im.panner.northid); - im.removeShapes("panner", im.panner.northidt); - } - if( im.panner.eastid ){ - im.removeShapes("panner", im.panner.eastid); - im.removeShapes("panner", im.panner.eastidt); - } - // done if we are not displaying the directions vectors or no wcs - if( !JS9.globalOpts.pannerDirections || !im.raw.wcs || im.raw.wcs <= 0 ){ - return im; - } - // get north is up info - nobj = im.getNorthIsUp(); - // angle - angle = nobj.angle; - // take existing rotation into account - if( JS9.notNull(im.params.rot90) ){ - angle -= im.params.rot90; - } - // take existing rotation into account - if( JS9.notNull(im.params.rotate) ){ - angle -= im.params.rotate; - } - // flip - xflip = nobj.xflip ? -1 : 1; - yflip = nobj.yflip ? -1 : 1; - switch(im.params.flip){ - case "x": - xflip *= -1; - break; - case "y": - yflip *= -1; - break; - case "xy": - xflip *= -1; - yflip *= -1; - break; - default: - break; - } - // this is the line pointing north - npos1 = {x: cenx, y: ceny}; - if( wcsinfo.cdelt2 >= 0 ){ - npos2 = {x: cenx, y: ceny - JS9.Panner.VSIZE * yflip}; - } else { - npos2 = {x: cenx, y: ceny + JS9.Panner.VSIZE * yflip}; - } - npos2 = JS9.rotatePoint(npos2, angle, npos1); - nobj = {color: JS9.Panner.NORTH.color, - strokeWidth: JS9.Panner.NORTH.strokeWidth, - strokeDashArray: JS9.Panner.NORTH.strokeDashArray, - points: [npos1, npos2], - changeable: false, - // hack around fabric.js problems - originX: "left", originY: "top", noLeftTop: true}; - im.panner.northid = im.addShapes("panner", "line", nobj); - // this is the text 'N' - nobjt = {color: JS9.Panner.NORTH.color, - text: JS9.Panner.NORTH.text, - fontSize: JS9.Panner.NORTH.fontSize, - fontFamily: JS9.Panner.NORTH.fontFamily, - changeable: false, - left: npos2.x, top: npos2.y}; - im.panner.northidt = im.addShapes("panner", "text", nobjt); - // this is the line pointing east - epos1 = {x: cenx, y: ceny}; - if( wcsinfo.cdelt1 < 0 ){ - epos2 = {x: cenx - JS9.Panner.VSIZE * xflip, y: ceny}; - } else { - epos2 = {x: cenx + JS9.Panner.VSIZE * xflip, y: ceny}; - } - epos2 = JS9.rotatePoint(epos2, angle, epos1); - eobj = {color: JS9.Panner.EAST.color, - strokeWidth: JS9.Panner.EAST.strokeWidth, - strokeDashArray: JS9.Panner.EAST.strokeDashArray, - changeable: false, - points: [epos1, epos2], - // hack around fabric.js problems - originX: "left", originY: "top", noLeftTop: true}; - im.panner.eastid = im.addShapes("panner", "line", eobj); - // this is the text 'E' - eobjt = {color: JS9.Panner.EAST.color, - text: JS9.Panner.EAST.text, - fontSize: JS9.Panner.EAST.fontSize, - fontFamily: JS9.Panner.EAST.fontFamily, - changeable: false, - left: epos2.x, top: epos2.y}; - im.panner.eastidt = im.addShapes("panner", "text", eobjt); - return im; -}; - -// zoom the rectangle inside the panner (RGB) image -JS9.Panner.zoom = function(im, zval){ - let panner, ozoom, nzoom; - // sanity check - if( !im || !im.panner || !im.display.pluginInstances.JS9Panner ){ - return; - } - panner = im.panner; - // get old zoom - ozoom = panner.zoom; - // determine new zoom - switch(zval.charAt(0)){ - case "*": - case "x": - case "X": - nzoom = Math.min(Math.min(this.width, this.height), - ozoom * parseFloat(zval.slice(1))); - break; - case "/": - nzoom = Math.max(1, ozoom / parseFloat(zval.slice(1))); - break; - default: - nzoom = parseFloat(zval); - break; - } - // sanity check - if( !nzoom || (nzoom < 1) ){ - nzoom = 1; - } - panner.zoom = nzoom; - // redisplay the panner - JS9.Panner.disp.call(this, im); - return im; -}; - -// dynamic selection change -JS9.Panner.dysel = function(im){ - let panner; - if( im ){ - panner = im.display.pluginInstances.JS9Panner; - if( panner && panner.isDynamic ){ - JS9.Panner.disp.call(this, im); - } - } -}; - -// clear the panner -JS9.Panner.clear = function(im){ - let panner, display; - if( im ){ - display = JS9.getDynamicDisplayOr(this.display); - panner = im.display.pluginInstances.JS9Panner; - if( panner && (im.display === display) ){ - panner.context.clear(); - im.removeShapes("panner", "all"); - im.panner.boxid = null; - } - return im; - } -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.Panner.CLASS, JS9.Panner.NAME, JS9.Panner.init, - {menuItem: "Panner", - help: "help/panner.html", - dynamicSelect: true, - toolbarSeparate: false, - toolbarHTML: JS9.Panner.HTML, - ondynamicselect: JS9.Panner.dysel, - onplugindisplay: JS9.Panner.disp, - onimagedisplay: JS9.Panner.disp, - onimageclose: JS9.Panner.clear, - onimageclear: JS9.Panner.clear, - onupdateprefs: JS9.Panner.disp, - onsetwcssys: JS9.Panner.disp, - winTitle: "Panner", - winDims: [JS9.Panner.WIDTH, JS9.Panner.HEIGHT], - divArgs: [JS9.Panner.SWIDTH, JS9.Panner.SHEIGHT]}); diff --git a/web/static/js9_old/plugins/core/prefs.js b/web/static/js9_old/plugins/core/prefs.js deleted file mode 100644 index 1d83af1..0000000 --- a/web/static/js9_old/plugins/core/prefs.js +++ /dev/null @@ -1,1094 +0,0 @@ -/* - * preferences plugin (14 April 2015) - */ - -/*global $, JS9, ddtabcontent */ - -"use strict"; - -// To specify the JS9 display instance to link to a given PREFS div, -// use the HTML5 dataset syntax: -//
    - -// create our namespace, and specify some meta-information and params -JS9.Prefs = {}; -JS9.Prefs.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Prefs.NAME = "Preferences"; // name of this plugin (2nd part of div class) -JS9.Prefs.WIDTH = 800; // default width of window -JS9.Prefs.HEIGHT = 400; // default height of window - -JS9.Prefs.imagesSchema = { - "title": "Image Preferences", - "description": "Preferences for each displayed image", - "properties": { - "colormap": { - "type": "string", - "helper": "default color map" - }, - "contrast": { - "type": "number", - "helper": "default color contrast" - }, - "bias": { - "type": "number", - "helper": "default color bias" - }, - "scale": { - "type": "string", - "helper": "default scale algorithm" - }, - "scaleclipping": { - "type": "string", - "helper": "'dataminmax' or 'zscale'" - }, - "zscalecontrast": { - "type": "number", - "helper": "default from ds9" - }, - "zscalesamples": { - "type": "number", - "helper": "default from ds9" - }, - "zscaleline": { - "type": "number", - "helper": "default from ds9" - }, - "exp": { - "type": "number", - "helper": "default exp value for scaling" - }, - "wcssys": { - "type": "string", - "helper": "current WCS system" - }, - "wcsunits": { - "type": "string", - "helper": "current WCS units" - }, - "lcs": { - "type": "string", - "helper": "default logical coordinate system" - }, - "opacity": { - "type": "number", - "helper": "opacity for images (0.0 to 1.0)" - }, - "zoom": { - "type": "number", - "helper": "default zoom factor" - }, - "zooms": { - "type": "number", - "helper": "how many zooms in each direction?" - }, - "nancolor": { - "type": "string", - "helper": "6-digit #hex color for NaN values" - }, - "overlay": { - "type": "boolean", - "helper": "display png/jpeg overlay?" - }, - "listonchange": { - "type": "boolean", - "helper": "list after a region change?" - }, - "whichonchange": { - "type": "string", - "helper": "list 'all' or 'selected'?" - }, - "valpos": { - "type": "boolean", - "helper": "display value/position?" - }, - "inherit": { - "type": "boolean", - "helper": "new images inherit current params?" - }, - "invert": { - "type": "boolean", - "helper": "by default, invert colormap?" - }, - "disable": { - "type": "mobject", - "helper": "array of core funcs to disable" - } - } -}; - -JS9.Prefs.regionsSchema = { - "title": "Region Preferences", - "description": "Preferences for each displayed region", - "type": "object", - "properties": { - "iradius": { - "type": "number", - "helper": "annulus: initial inner radius" - }, - "oradius": { - "type": "number", - "helper": "annulus: initial outer radius" - }, - "nannuli": { - "type": "number", - "helper": "annulus: initial number of annuli" - }, - "width": { - "type": "number", - "helper": "box: initial width" - }, - "height": { - "type": "number", - "helper": "box: initial height" - }, - "radius": { - "type": "number", - "helper": "circle: initial radius" - }, - "r1": { - "type": "number", - "helper": "ellipse: initial radius1" - }, - "r2": { - "type": "number", - "helper": "ellipse: initial radius2" - }, - "angle": { - "type": "number", - "helper": "box, ellipse: initial angle in degrees" - }, - "polypoints": { - "type": "mobject", - "helper": "polygon: x,y relative positions" - }, - "linepoints": { - "type": "mobject", - "helper": "line: x,y relative positions" - }, - "ptshape": { - "type": "string", - "helper": "point shape: box, circle, ellipse" - }, - "ptsize": { - "type": "number", - "helper": "point: size" - }, - "tags": { - "type": "string", - "helper": "initial tags for a region" - }, - "strokeWidth": { - "type": "number", - "helper": "region stroke width" - }, - "fontFamily": { - "type": "string", - "helper": "region font" - }, - "fontSize": { - "type": "string", - "helper": "region font size" - }, - "fontStyle": { - "type": "string", - "helper": "region font style" - }, - "fontWeight": { - "type": "string", - "helper": "region font weight" - }, - "textAlign": { - "type": "string", - "helper": "text alignment" - } - } -}; - -JS9.Prefs.gridSchema = { - "title": "Grid Preferences", - "description": "Preferences for wcs coordinate grids", - "type": "object", - "properties": { - "strokeWidth": { - "type": "number", - "helper": "grid stroke width" - }, - "lineColor": { - "type": "string", - "helper": "color of grid lines" - }, - "raLines": { - "type": "number", - "helper": "approx. number of RA grid lines" - }, - "raAngle": { - "type": "number", - "helper": "rotation for RA label" - }, - "raSkip": { - "type": "number", - "helper": "number of RA lines to skip" - }, - "decLines": { - "type": "number", - "helper": "approx. number of Dec grid lines" - }, - "decAngle": { - "type": "number", - "helper": "rotation for Dec label" - }, - "decSkip": { - "type": "number", - "helper": "number of Dec lines to skip" - }, - "labelColor": { - "type": "string", - "helper": "color of text labels" - }, - "labelFontFamily": { - "type": "string", - "helper": "label font" - }, - "labelFontSize": { - "type": "string", - "helper": "label font size" - }, - "labelFontStyle": { - "type": "string", - "helper": "label font style" - }, - "labelFontWeight": { - "type": "string", - "helper": "label font weight" - }, - "labelRAOffx": { - "type": "number", - "helper": "x offset of RA labels" - }, - "labelRAOffy": { - "type": "number", - "helper": "y offset of RA labels" - }, - "labelDecOffx": { - "type": "number", - "helper": "x offset of Dec labels" - }, - "labelDecOffy": { - "type": "number", - "helper": "y offset of Dec labels" - }, - "degPrec": { - "type": "number", - "helper": "precision for degree labels" - }, - "sexaPrec": { - "type": "number", - "helper": "precision for sexagesimal labels" - }, - "reduceDims": { - "type": "boolean", - "helper": "reduce lines of smaller image dim?" - }, - "stride": { - "type": "number", - "helper": "fineness of grid lines" - }, - "margin": { - "type": "number", - "helper": "edge margin for displaying a grid line" - }, - "labelMargin": { - "type": "number", - "helper": "edge margin for displaying a label" - }, - "cover": { - "type": "string", - "helper": "grid lines cover: display or image" - } - } -}; - -// schema for each source -JS9.Prefs.fitsSchema = { - "title": "FITS Preferences", - "description": "Preferences for processing FITS files", - "properties": { - "extlist": { - "type": "string", - "helper": "default binary table extensions" - }, - "xdim": { - "type": "string", - "helper": "x dim of image section from table" - }, - "ydim": { - "type": "string", - "helper": "y dim of image section from table" - }, - "bin": { - "type": "string", - "helper": "bin factor for tables" - }, - "ixdim": { - "type": "string", - "helper": "x dim of image section from image" - }, - "iydim": { - "type": "string", - "helper": "y dim of image section from table" - }, - "ibin": { - "type": "string", - "helper": "bin factor for images" - }, - "binMode": { - "type": "string", - "helper": "'s' for summing, 'a' for averaging" - }, - "clear": { - "type": "string", - "helper": "clear image's virtual file memory" - } - } -}; - -// catalogs schema -JS9.Prefs.catalogsSchema = { - "title": "Catalogs Preferences", - "description": "Preferences for loading tab-delimited catalogs", - "properties": { - "ras": { - "type": "mobject", - "helper": "RA patterns to look for in table" - }, - "decs": { - "type": "mobject", - "helper": "Dec patterns to look for in table" - }, - "wcssys": { - "type": "string", - "helper": "wcs system of catalog" - }, - "shape": { - "type": "string", - "helper": "shape of objects" - }, - "color": { - "type": "string", - "helper": "color of objects" - }, - "width": { - "type": "number", - "helper": "width of box objects" - }, - "height": { - "type": "number", - "helper": "height of box objects" - }, - "radius": { - "type": "number", - "helper": "radius of circle objects" - }, - "r1": { - "type": "number", - "helper": "r1 of ellipse objects" - }, - "r2": { - "type": "number", - "helper": "r2 of ellipse objects" - }, - "tooltip": { - "type": "string", - "helper": "tooltip format for objects" - }, - "skip": { - "type": "string", - "helper": "comment character in table" - } - } -}; - -// global schema for the page -JS9.Prefs.globalsSchema = { - "title": "Global Preferences", - "description": "Global preferences for all JS9 displays", - "properties": { - "topColormaps": { - "type": "mobject", - "helper": "array of top-level colormaps" - }, - "infoBox": { - "type": "mobject", - "helper": "array of infoBox items to display" - }, - "statusBar": { - "type": "string", - "helper": "format of statusbar display" - }, - "toolBar": { - "type": "mobject", - "helper": "array of toolbar tools to display" - }, - "separate": { - "type": "mobject", - "helper": "options when separating images" - }, - "mouseActions": { - "type": "mobject", - "helper": "array of mouse actions" - }, - "touchActions": { - "type": "mobject", - "helper": "array of touch actions" - }, - "keyboardActions": { - "type": "mobject", - "helper": "object containing keyboard actions" - }, - "centerDivs": { - "type": "mobject", - "helper": "divs used when centering" - }, - "resizeDivs": { - "type": "mobject", - "helper": "divs used when resizing" - }, - "plot3d": { - "type": "mobject", - "helper": "options for 3D data cube plot" - }, - "syncOps": { - "type": "mobject", - "helper": "ops to sync between images" - }, - "wcsUnits": { - "type": "mobject", - "helper": "default units for WCS systems" - }, - "copyWcsPosFormat": { - "type": "string", - "helper": "format string using: $ra $dec $sys" - }, - "fallbackDisplay": { - "type": "string", - "helper": "can messages fallback to display win?" - }, - "lightWinClose": { - "type": "string", - "helper": "ask,close,move when closing lightwin" - }, - "fits2fits": { - "type": "string", - "helper": "make rep file?: true,false,size>N" - }, - "dynamicSelect": { - "type": "string", - "helper": "select display: click, move, false" - }, - "panRefreshLimit": { - "type": "number", - "helper": "# of shapes to minimze refresh during pan" - }, - "regDisplay": { - "type": "string", - "helper": "show regions in 'lightwin' or 'display'" - }, - "regMenuCreate": { - "type": "boolean", - "helper": "region menu selections create regions?" - }, - "regSyncTextColor": { - "type": "boolean", - "helper": "sync region text color with main color?" - }, - "regToClipboard": { - "type": "boolean", - "helper": "region mods to pseudo-clipboard?" - }, - "regListDCoords": { - "type": "boolean", - "helper": "list regions preserving dcoords? " - }, - "metaClickPan": { - "type": "boolean", - "helper": "meta-click pans to mouse position?" - }, - "mousetouchZoom": { - "type": "boolean", - "helper": "scroll/pinch to zoom?" - }, - "mousetouchLimit": { - "type": "boolean", - "helper": "limit zoom-out to the size of the image?" - }, - "clickToFocus": { - "type": "boolean", - "helper": "click display to focus?" - }, - "valposDCoords": { - "type": "boolean", - "helper": "valpos shows display coords?" - }, - "toolbarTooltips": { - "type": "boolean", - "helper": "show tooltips in Toolbar plugin?" - }, - "updateTitlebar": { - "type": "boolean", - "helper": "update titlebar with image id?" - }, - "logoDisplay": { - "type": "boolean", - "helper": "show JS9 logo?" - }, - "reloadRefresh": { - "type": "boolean", - "helper": "does a reload refresh the data?" - }, - "reloadRefreshReg": { - "type": "boolean", - "helper": "reloading regions file removes prev?" - }, - "syncReciprocate": { - "type": "boolean", - "helper": "reciprocal image sync'ing?" - }, - "syncWCS": { - "type": "boolean", - "helper": "sync using wcs (e.g. pan)?" - }, - "nextImageMask": { - "type": "boolean", - "helper": "nextImage() show image masks?" - }, - "panWithinDisplay": { - "type": "boolean", - "helper": "keep panned image within the display?" - }, - "pannerDirections": { - "type": "boolean", - "helper": "show direction vectors in panner?" - }, - "magnifierRegions": { - "type": "boolean", - "helper": "show regions in magnifier?" - }, - "xeqPlugins": { - "type": "boolean", - "helper": "execute plugin callbacks?" - }, - "extendedPlugins": { - "type": "boolean", - "helper": "execute extended plugins?" - }, - "intensivePlugins": { - "type": "boolean", - "helper": "execute intensive plugins?" - }, - "svgBorder": { - "type": "boolean", - "helper": "add border when exporting SVG?" - } - } -}; - -// favorites schema for the page -JS9.Prefs.favoritesSchema = { - "title": "Favorites Preferences", - "description": "Favorites for all JS9 displays", - "properties": { - "scales": { - "type": "mobject", - "helper": "array of favorite scales" - }, - "colormaps": { - "type": "mobject", - "helper": "array of favorite colormaps" - }, - "regions": { - "type": "mobject", - "helper": "array of favorite regions" - }, - "wcs": { - "type": "mobject", - "helper": "array of favorite wcs systems" - } - } -}; - -// scheme for desktop apps only -JS9.Prefs.desktopSchema = { - "title": "Desktop App Preferences", - "description": "Desktop app preferences will take effect on restart", - "properties": { - "webpage": { - type: "string", - "helper": "web page to display" - }, - "width": { - type: "number", - "helper": "width of desktop window" - }, - "height": { - type: "number", - "helper": "height of desktop window" - }, - "hostfs": { - type: "boolean", - "helper": "utilize host file system?" - }, - "debug": { - type: "boolean", - "helper": "display Chrome debugger at startup?" - } - } -}; - -// source object for preferences -JS9.Prefs.sources = [ - {name: "globals", schema: JS9.Prefs.globalsSchema}, - {name: "images", schema: JS9.Prefs.imagesSchema}, - {name: "fits", schema: JS9.Prefs.fitsSchema}, - {name: "regions", schema: JS9.Prefs.regionsSchema}, - {name: "grid", schema: JS9.Prefs.gridSchema}, - {name: "catalogs", schema: JS9.Prefs.catalogsSchema}, - {name: "favorites", schema: JS9.Prefs.favoritesSchema}, - {name: "desktop", schema: JS9.Prefs.desktopSchema} -]; - -// init preference plugin -JS9.Prefs.init = function(){ - let i, s, obj, key, props, sources, source, id, pid, html, prompt; - // create the div containing one tab for each of the sources - sources = JS9.Prefs.sources; - pid = `${this.id}prefsTabs`; - html = "
    "; - html += `
    \n`; - html += "
      "; - // create a tab for each source - for(i=0; i${source.name}\n`; - } - html += "
    "; - html += "

    \n"; - // create each param form (displayed by clicking each tab) - for(i=0; i`; - html += `

    `; - html += `
    ${source.schema.description}

    `; - props = source.schema.properties || {}; - for( key of Object.keys(props) ){ - obj = props[key]; - prompt = obj.prompt || `${key}:`; - switch(obj.type){ - case "boolean": - if( source.data[key] ){ - s = "checked"; - } else { - s = ""; - } - html += `

    ${prompt}${obj.helper}
    `; - break; - default: - if( typeof source.data[key] === "object" ){ - if( obj.type === "mobject" ){ - s = JSON.stringify(source.data[key], null, 2); - } else { - s = JSON.stringify(source.data[key]); - } - } else if( JS9.isNull(source.data[key]) ){ - s = ""; - } else { - s = source.data[key]; - } - if( obj.type === "mobject" ){ - html += `
    ${prompt}${obj.helper}
    `; - } else { - html += `
    ${prompt}${obj.helper}
    `; - } - break; - } - } - if( !JS9.cmdlineOpts ){ - html += ``; - } - // manage stored preferences - if( {}.hasOwnProperty.call(window, "localStorage") && - JS9.globalOpts.localStorage ){ - html += ``; - html += ``; - html += ""; - } - // light windows get a close button - if( this.winType === "light" ){ - html += ``; - } - html += "
    "; - html += "
    "; - } - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // set the html for this div - this.divjq.html(html); - // for each source, set data values which we will need in button callbacks - for(i=0; i {return {"name": e.name, "value": "false"};}).get()); - JS9.Prefs.processForm(source, arr2, display, winid); - return false; -}; - -// action for Save in Form -JS9.Prefs.saveForm = function(){ - let props, key; - const form = $(this).closest("form"); - const source = form.data("source"); - const opts = {cmd: "desktop", mode: "save"}; - const saveobj = {}; - JS9.Prefs.applyForm.call(this); - // desktop handled specially - if( source.name === "desktop" ){ - if( window.electron ){ - window.setTimeout(() => { - try{ - opts.cmdlineOpts = JS9.cmdlineOpts; - window.electron.sendMsg(opts); - } - catch(e){ JS9.error("could not save desktop form", e); } - }, JS9.TIMEOUT); - } else { - JS9.error("desktop save is only available for the JS9 desktop app"); - } - return false; - } - try{ - // only save props in the schema: e.g., don't save all of globalOpts - props = source.schema.properties || {}; - for( key of Object.keys(props) ){ - saveobj[key] = source.data[key]; - } - localStorage.setItem(source.name, JSON.stringify(saveobj, null, 2)); - JS9.userOpts[source.name] = localStorage.getItem(source.name); - } - catch(e){ JS9.error(`could not save prefs: ${source.name}`); } - return false; -}; - -// action for Show in Form -JS9.Prefs.showForm = function(){ - let s, t; - const form = $(this).closest("form"); - const source = form.data("source"); - // desktop handled specially - if( source.name === "desktop" ){ - if( JS9.cmdlineOpts ){ - s = JSON.stringify(JS9.cmdlineOpts, null, 4); - t = `
    ${s}
    `; - } else { - t = `

    No saved prefs: ${source.name}
    `; - } - } else { - try{ s = localStorage.getItem(source.name); } - catch(e){ /* empty */ } - if( s && (s !== "null") ){ - t = `
    ${s}
    `; - } else { - t = `

    No saved prefs: ${source.name}
    `; - } - } - JS9.lightWin(`savedPrefs${JS9.uniqueID()}`, "inline", t, - `Saved prefs: ${source.name}`, - JS9.lightOpts[JS9.LIGHTWIN].textWin); - return false; -}; - -// action for Delete in Form -JS9.Prefs.deleteForm = function(){ - const form = $(this).closest("form"); - const source = form.data("source"); - const opts = {cmd: "desktop", mode: "remove"}; - // desktop handled specially - if( source.name === "desktop" ){ - if( window.electron ){ - window.setTimeout(() => { - try{ window.electron.sendMsg(opts); } - catch(e){ JS9.error("could not save desktop form", e); } - }, JS9.TIMEOUT); - } else { - JS9.error("desktop save is only available for the JS9 desktop app"); - } - return false; - } - try{ localStorage.removeItem(source.name); - delete JS9.userOpts[source.name]; } - catch(e){ /* empty */ } - return false; -}; - -// process new preferences in the preference form -// eslint-disable-next-line no-unused-vars -JS9.Prefs.processForm = function(source, arr, display, winid){ - let i, j, s, key, val, obj, rlayer; - const len = arr.length; - // source-specific pre-processing - switch( source.name ){ - case "images": - obj = JS9.imageOpts; - break; - case "regions": - obj = JS9.Regions.opts; - break; - case "grid": - obj = JS9.Grid.opts; - break; - case "fits": - obj = JS9.fits.options; - break; - case "catalogs": - obj = JS9.globalOpts.catalogs; - break; - case "globals": - obj = JS9.globalOpts; - break; - case "favorites": - obj = JS9.favorites; - break; - case "desktop": - obj = JS9.cmdlineOpts; - break; - default: - JS9.error(`unknown source for preferences: ${source.name}`); - break; - } - for(i=0; i%s'; - -JS9.ScaleLimits.limitsHTML=''; - -JS9.ScaleLimits.axesHTML=''; - -JS9.ScaleLimits.plotHTML='
    Pixel Distribution: %s
    '; - -JS9.ScaleLimits.loHTML='Low:  '; - -JS9.ScaleLimits.hiHTML='High:  '; - -// change scale -JS9.ScaleLimits.xsetscale = function(did, id, target){ - const im = JS9.lookupImage(id, did); - if( im ){ - im.setScale(target.value); - } -}; - -// change low clipping limit -JS9.ScaleLimits.xsetlo = function(did, id, target){ - let val; - const im = JS9.lookupImage(id, did); - if( im ){ - val = parseFloat(target.value); - im.setScale(val, im.params.scalemax); - } -}; - -// change high clipping limit -JS9.ScaleLimits.xsethi = function(did, id, target){ - let val; - const im = JS9.lookupImage(id, did); - if( im ){ - val = parseFloat(target.value); - im.setScale(im.params.scalemin, val); - } -}; - -// other ways to determine limits -JS9.ScaleLimits.xsetlims = function(did, id, target){ - const im = JS9.lookupImage(id, did); - if( im ){ - switch(target.value){ - case "dataminmax": - im.setScale("dataminmax", im.raw.dmin, im.raw.dmax); - break; - case "zscale_z1_z2": - im.setScale("zscale", im.params.z1, im.params.z2); - break; - case "zscale_z1_datamax": - im.setScale("zmax", im.params.z1, im.raw.dmax); - break; - default: - break; - } - } -}; - -// log10 scaling -JS9.ScaleLimits.log10 = function(v){ - return v <= 0 ? null : Math.log(v) / Math.LN10; -}; - -// other ways to determine limits -JS9.ScaleLimits.xaxes = function(did, id, target){ - let plugin; - const im = JS9.lookupImage(id, did); - if( im ){ - // get current plugin instance - plugin = im.display.pluginInstances[JS9.ScaleLimits.BASE]; - // sanity check - if( !plugin || !plugin.plot ){ - return; - } - // change the scale for the specified axis - switch(target.value){ - case "xlinear": - plugin.xscale = "linear"; - JS9.ScaleLimits.doplot.call(plugin, im); - break; - case "xlog": - plugin.xscale = "log"; - JS9.ScaleLimits.doplot.call(plugin, im); - break; - case "ylinear": - plugin.yscale = "linear"; - JS9.ScaleLimits.doplot.call(plugin, im); - break; - case "ylog": - plugin.yscale = "log"; - JS9.ScaleLimits.doplot.call(plugin, im); - break; - default: - break; - } - } - // reset top-level - $(target).val("Plot Axes").prop("selected", true); -}; - -JS9.ScaleLimits.getPixelDist = function(im, ndist){ - let i, idx; - const dist = []; - const dmin = im.raw.dmin; - const drange = im.raw.dmax - im.raw.dmin; - const imlen = im.raw.width * im.raw.height; - for(i=0; i= 0 && idx < ndist ){ - dist[idx] += 1; - } - } - return dist; -}; - -JS9.ScaleLimits.to10E = function(i){ - const superscripts = ["⁰", "¹", "²", "³", "⁴", "⁵", "⁶", "⁷", "⁸", "⁹"]; - if( JS9.ScaleLimits.AXISFANCY && i >= 0 && i <= 9 ){ - return `10${superscripts[i]}`; - } - return `10E${String(i)}`; -}; - -JS9.ScaleLimits.doplot = function(im){ - let i, j, s, el, xmin, xmax; - let dist, distmin, distmax, ntick, tickinc; - const dmin = im.raw.dmin; - const drange = im.raw.dmax - im.raw.dmin; - const pobj = $.extend(true, {}, JS9.ScaleLimits.dataOpts); - const popts = $.extend(true, {}, JS9.ScaleLimits.plotOpts); - const gettickinc = (datarange) => { - let tickinc; - if( datarange < 10 ){ - tickinc = 1; - } else if( datarange < 50 ){ - tickinc = 5; - } else if( datarange < 250 ){ - tickinc = 10; - } else if( datarange < 500 ){ - tickinc = 50; - } else if( datarange < 2500 ){ - tickinc = 100; - } else if( datarange < 5000 ){ - tickinc = 500; - } else if( datarange < 25000 ){ - tickinc = 1000; - } else if( datarange < 50000 ){ - tickinc = 5000; - } else if( datarange < 250000 ){ - tickinc = 10000; - } else if( datarange < 500000 ){ - tickinc = 50000; - } else if( datarange < 2500000 ){ - tickinc = 100000; - } else if( datarange < 5000000 ){ - tickinc = 500000; - } else if( datarange < 25000000 ){ - tickinc = 1000000; - } else { - tickinc = 10000000; - } - return tickinc; - }; - const annotate = (plot, x, color) => { - const ctx = plot.getCanvas().getContext("2d"); - const size = JS9.ScaleLimits.CARET; - const o = plot.pointOffset({x: x, y: 0}); - ctx.beginPath(); - ctx.moveTo(o.left, o.top); - ctx.lineTo(o.left - size, o.top - (size*2)); - ctx.lineTo(o.left + size, o.top - (size*2)); - ctx.lineTo(o.left, o.top); - ctx.fillStyle = color; - ctx.fill(); - }; - // flag we have just started - this.plotComplete = false; - // plot options - if( this.plotColor ){ - pobj.color = this.plotColor; - } - // pixel distribution - dist = JS9.ScaleLimits.getPixelDist(im, this.ndist); - // convert to flot data - for(i=0; i distmax ){ - distmax = dist[i]; - } - } - ntick = JS9.ScaleLimits.log10(distmax - distmin + 1); - for(i=0; i { - let start = ranges.xaxis.from; - let end = ranges.xaxis.to; - if( this.xscale === "log" ){ - start = Math.pow(10, start); - end = Math.pow(10, end); - } - start = start * drange / this.ndist + dmin; - end = end * drange / this.ndist + dmin; - im.setScale("user", start, end); - }); - el.off("plothover"); - el.on("plothover", (event, pos) => { - let ctx, text, s, x, y, w, h, xval; - let px = pos.x; - // sanity checks - if( !this.plot || !this.plotComplete ){ - return; - } - if( this.xscale === "log" ){ - px = Math.pow(10, px); - } - xval = px * drange / this.ndist + dmin; - if( !Number.isFinite(xval) ){ - return; - } - s = JS9.floatToString(xval); - // display x value in upper right corner of plot - ctx = this.plot.getCanvas().getContext("2d"); - ctx.save(); - ctx.textBaseline = 'top'; - ctx.font = `${JS9.ScaleLimits.XTEXTHEIGHT }px ${JS9.ScaleLimits.XTEXTFONT}`; - ctx.fillStyle = JS9.ScaleLimits.XTEXTCOLOR || "black"; - text = ctx.measureText(s); - w = Math.max(this.lastTextWidth, text.width + 2); - h = JS9.ScaleLimits.XTEXTHEIGHT + 2; - x = this.plotWidth * JS9.ScaleLimits.XTEXTFRAC; - y = this.plotHeight * JS9.ScaleLimits.YTEXTFRAC; - ctx.clearRect(x, y, w, h); - ctx.fillText(s, x, y); - ctx.restore(); - this.lastTextWidth = w; - }); - this.timeout = window.setTimeout( () => { - this.plot = $.plot(el, [pobj], popts); - this.timeout = null; - annotate(this.plot, xmin, this.xlocolor); - annotate(this.plot, xmax, this.xhicolor); - this.plotComplete = true; - }, JS9.ScaleLimits.TIMEOUT); -}; - -// re-init when a different image is displayed -JS9.ScaleLimits.display = function(){ - if( this.lastimage !== this.display.image ){ - JS9.ScaleLimits.init.call(this); - } -}; - -// clear when an image closes -JS9.ScaleLimits.close = function(){ - // ensure plugin display is reset - JS9.ScaleLimits.init.call(this, {mode: "clear"}); -}; - -// constructor: add HTML elements to the plugin -JS9.ScaleLimits.init = function(opts){ - let s, im, mopts, imid, dispid; - const getScales = () => { - let i; - let res = ""; - for(i=0; i${JS9.scales[i]}`; - } - return res; - }; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // opts is optional - opts = opts || {}; - // set width and height of plugin itself - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = JS9.ScaleLimits.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = JS9.ScaleLimits.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // set width and height of plot - this.plotWidth = this.plotWidth || this.divjq.attr("data-plotWidth"); - if( !this.plotWidth ){ - this.plotWidth = this.width - JS9.ScaleLimits.WIDTHOFFSET; - } - this.plotHeight = this.plotHeight || this.divjq.attr("data-plotHeight"); - if( !this.plotHeight ){ - this.plotHeight = this.height - JS9.ScaleLimits.HEIGHTOFFSET; - } - // initial scaling - this.xscale = this.xscale || this.divjq.attr("data-xscale"); - if( !this.xscale ){ - this.xscale = JS9.ScaleLimits.XSCALE; - } - this.yscale = this.yscale || this.divjq.attr("data-yscale"); - if( !this.yscale ){ - this.yscale = JS9.ScaleLimits.YSCALE; - } - // plot colors - this.plotColor = this.plotColor || this.divjq.attr("data-plotColor"); - if( !this.plotColor ){ - this.plotColor = JS9.ScaleLimits.PLOTCOLOR; - } - // plot color - this.xlocolor = this.xlocolor || this.divjq.attr("data-xlocolor"); - if( !this.xlocolor ){ - this.xlocolor = JS9.ScaleLimits.XLOCOLOR; - } - // plot color - this.xhicolor = this.xhicolor || this.divjq.attr("data-xhicolor"); - if( !this.xhicolor ){ - this.xhicolor = JS9.ScaleLimits.XHICOLOR; - } - // set number of distribution points - this.ndist = this.divjq.attr("data-ndist"); - if( !this.ndist ){ - this.ndist = JS9.ScaleLimits.NDIST; - } - // clear out html - this.divjq.html(""); - this.lastTextWidth = 0; - // set up new html - this.scalelimsContainer = $("
    ") - .addClass(`${JS9.ScaleLimits.BASE}Container`) - .attr("id", `${this.id}Container`) - .attr("width", this.width) - .attr("height", this.height) - .appendTo(this.divjq); - // do we have an image? - im = this.display.image; - if( im && (opts.mode !== "clear") ){ - // convenience variables - imid = im.id; - dispid = im.display.id; - mopts = []; - mopts.push({name: "header", - value: JS9.ScaleLimits.headerHTML}); - mopts.push({name: "scales", - value: sprintf(JS9.ScaleLimits.scalesHTML, - dispid, imid, getScales())}); - mopts.push({name: "limits", - value: sprintf(JS9.ScaleLimits.limitsHTML, - dispid, imid)}); - mopts.push({name: "axes", - value: sprintf(JS9.ScaleLimits.axesHTML, - dispid, imid)}); - mopts.push({name: "plot", - value: sprintf(JS9.ScaleLimits.plotHTML, - imid, this.plotWidth, this.plotHeight)}); - mopts.push({name: "lo", - value: sprintf(JS9.ScaleLimits.loHTML, - JS9.floatToString(im.params.scalemin), - dispid, imid)}); - mopts.push({name: "hi", - value: sprintf(JS9.ScaleLimits.hiHTML, - JS9.floatToString(im.params.scalemax), - dispid, imid)}); - s = im.expandMacro(JS9.ScaleLimits.scalelimsHTML, mopts); - this.lastimage = im; - } else { - s = "

    Scale parameters will appear here.
    "; - } - this.scalelimsContainer.html(s); - // set up initial plot, if possible - if( im ){ - JS9.ScaleLimits.doplot.call(this, im); - } -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.ScaleLimits.CLASS, JS9.ScaleLimits.NAME, - JS9.ScaleLimits.init, - {menu: "scale", - menuItem: "Scale Controls ...", - onplugindisplay: JS9.ScaleLimits.init, - onsetscale: JS9.ScaleLimits.init, - onimagedisplay: JS9.ScaleLimits.display, - onimageclose: JS9.ScaleLimits.close, - help: "help/scalecontrols.html", - winTitle: "Scale Controls", - winDims: [JS9.ScaleLimits.WIDTH, JS9.ScaleLimits.HEIGHT]}); diff --git a/web/static/js9_old/plugins/core/separate.css b/web/static/js9_old/plugins/core/separate.css deleted file mode 100644 index 4311d03..0000000 --- a/web/static/js9_old/plugins/core/separate.css +++ /dev/null @@ -1,54 +0,0 @@ -div.JS9SeparateContainer { - padding: 2px; -} - -div.JS9SeparateImage { - margin: 5px; - background: #E9E9E9; - overflow: auto; -} - -div.JS9SeparateImageInactive { - padding: 10px; - border: 1px solid black; -} - -div.JS9SeparateImageActive { - padding: 9px; - border: 2px solid #00F000; -} - -div.JS9SeparateHeader { - border: 0px solid black; - background: #E9E9E9; - padding: 0px; - margin-left: 15px; - margin-top: 5px; - margin-right: 5px; - margin-bottom: 0px; -} - -input.separateButton1 { - position: relative; - width: 120px; - left: 10px; -} - -input.separateButton2 { - position: relative; - width: 90px; - left: 30px; -} - -select.separateLayoutSelect { - margin-right: 5px; -} - -#separateFile { - float: right; -} - -#separateNoFile { - margin-left: 15px; -} - diff --git a/web/static/js9_old/plugins/core/separate.js b/web/static/js9_old/plugins/core/separate.js deleted file mode 100644 index 26424da..0000000 --- a/web/static/js9_old/plugins/core/separate.js +++ /dev/null @@ -1,302 +0,0 @@ -/* - * image separate/gather plugin (July 26, 2018) - */ - -/*global $, JS9, sprintf */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Separate = {}; -JS9.Separate.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Separate.NAME = "Separate"; // name of this plugin (2nd part of div class) -JS9.Separate.WIDTH = 512; // width of light window -JS9.Separate.HEIGHT = 336; // height of light window -JS9.Separate.BASE = JS9.Separate.CLASS + JS9.Separate.NAME; // CSS base class name - -JS9.Separate.topHTML='$separate

    $gather'; - -JS9.Separate.separateHTML='separate selected images or separate all images into different displays. The topmost (selected) image remains in place, and the presence or absence of its menubar, toolbar, and colorbar will be replicated in the new displays:

    ;

    '; - -JS9.Separate.gatherHTML='gather selected images or gather all images into this display:

    '; - -JS9.Separate.imageHTML="$active  $imfile"; - -JS9.Separate.activeHTML='select'; - -JS9.Separate.imfileHTML='%s'; - -JS9.Separate.nofileHTML='

    [Images will appear here as they are loaded]'; - -// change active state -JS9.Separate.xactive = function(id){ - const im = JS9.lookupImage(id); - const active = this.checked; - if( im ){ - im.tmp.separateMode = active; - } -}; - -// change active state -JS9.Separate.xlayout = function(id){ - let plugin; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(id)); - if( !display ){ return; } - plugin = display.pluginInstances.JS9Separate; - if( plugin && this.selectedIndex >= 0 ){ - plugin.separateLayout = this.options[this.selectedIndex].value; - } -}; - -// separate images -JS9.Separate.separate = function(id, which){ - let i, im, plugin, arr; - const opts = {}; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(id)); - if( !display ){ return; } - plugin = display.pluginInstances.JS9Separate; - if( plugin && plugin.separateLayout ){ - opts.layout = plugin.separateLayout; - } - switch(which){ - case "selected": - arr = []; - for(i=0; i") - .addClass(cls) - .addClass(dcls) - .attr("id", id) - .prop("imid", imid) - .html(s) - .appendTo(this.separateImageContainer); - divjq.on("mousedown touchstart", () => { - im.displayImage(); - JS9.Separate.activeImage(im); - }); - // one more div in the stack - this.separateDivs++; - // check the selected box, if necessary - divjq.find('.separateActiveCheck') - .prop('checked', im.tmp.separateMode === true); - //make it the current one - JS9.Separate.activeImage(im); -}; - -// remove an image from the list of available images -JS9.Separate.removeImage = function(im){ - let id; - if( im ){ - id = JS9.Separate.imid(im); - $(`#${id}`).remove(); - this.separateDivs--; - if( this.separateDivs === 0 ){ - this.separateImageContainer.html(JS9.Separate.nofileHTML); - } - delete im.tmp.separateMode; - return true; - } - return false; -}; - -// constructor: add HTML elements to the plugin -JS9.Separate.init = function(){ - let i, s, im, display, dispid; - const opts = []; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // create container to hold image container and header - // clean main container - this.divjq.html(""); - // no images/divs loaded yet - this.separateDivs = 0; - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // main container - this.separateContainer = $("

    ") - .addClass(`${JS9.Separate.BASE}Container`) - .attr("id", `${this.id}SeparateContainer`) - .css("overflow", "auto") - .appendTo(this.divjq); - dispid = this.display.id; - opts.push({name: "separate", value: sprintf(JS9.Separate.separateHTML, - dispid, dispid, dispid)}); - opts.push({name: "gather", value: sprintf(JS9.Separate.gatherHTML, - dispid, dispid)}); - s = JS9.Image.prototype.expandMacro.call(null, JS9.Separate.topHTML, - opts); - // header - this.separateHeader = $("
    ") - .addClass(`${JS9.Separate.BASE}Header`) - .attr("id", `${dispid}Header`) - .html(s) - .appendTo(this.separateContainer); - // container to hold images - this.separateImageContainer = $("
    ") - .addClass(`${JS9.Separate.BASE}ImageContainer`) - .attr("id", `${this.id}SeparateImageContainer`) - .html(JS9.Separate.nofileHTML) - .appendTo(this.separateContainer); - display = JS9.getDynamicDisplayOr(this.display); - // add currently loaded images - for(i=0; i { - this.oidx = ui.item.index(); - }, - stop: (event, ui) => { - const nidx = ui.item.index(); - // change JS9 image array to reflect the change - this.display.moveImageInStack(this.oidx, nidx); - // redisplay in case something changed - if( this.display.image ){ - this.display.image.displayImage(); - } - delete this.oidx; - } - }); -}; - -// callback when an image is loaded -JS9.Separate.imageload = function(im){ - const display = JS9.getDynamicDisplayOr(this.display); - if( im && im.display === display ){ - JS9.Separate.addImage.call(this, im); - } -}; - -// callback when image is displayed -JS9.Separate.imagedisplay = function(im){ - JS9.Separate.activeImage.call(this, im); -}; - -// callback when image is displayed -JS9.Separate.imageclose = function(im){ - JS9.Separate.removeImage.call(this, im); -}; - -// callback when image is displayed -JS9.Separate.reinit = function(im){ - if( im ){ - JS9.Separate.init.call(this); - } -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.Separate.CLASS, JS9.Separate.NAME, JS9.Separate.init, - {menuItem: "Separate/Gather", - dynamicSelect: true, - onplugindisplay: JS9.Separate.init, - ondynamicselect: JS9.Separate.reinit, - ongatherdisplay: JS9.Separate.reinit, - onimageload: JS9.Separate.imageload, - onimagedisplay: JS9.Separate.imagedisplay, - onimageclose: JS9.Separate.imageclose, - help: "help/separate.html", - winTitle: "Separate/Gather Images", - winResize: true, - winDims: [JS9.Separate.WIDTH, JS9.Separate.HEIGHT]}); - diff --git a/web/static/js9_old/plugins/core/statusbar.css b/web/static/js9_old/plugins/core/statusbar.css deleted file mode 100644 index 3c81149..0000000 --- a/web/static/js9_old/plugins/core/statusbar.css +++ /dev/null @@ -1,67 +0,0 @@ -/* overflow scrolling technique: https://stackoverflow.com/questions/9672176/prevent-floated-divs-from-wrapping-to-new-line */ -/* this doesn't work on Linux Electron: it puts up arrows that get in the way */ -.JS9Statusbar { - /* overflow-y: scroll; */ -} - -.JS9StatusbarContainer { - background-color: #E9E9E9; - padding-left: 4px; - height: 100%; - font: normal 12px Arial; - overflow: auto; -} - -.JS9StatusbarItem { - border-radius: 4px; - display:inline-block; - vertical-align:middle; - text-align:center; - white-space:nowrap; - background-color: #E9E9E9; - color: black; - margin-top: 4px; - margin-bottom: 4px; - padding: 4px; - float: left; -} - -.JS9StatusbarItem[name*="JS9Colorbar"] { - margin-top: 0px; - padding-right: 0px; - padding-left: 0px; -} - -img.JS9StatusbarImage { - white-space:nowrap; -} - -img.JS9StatusbarImageItem[name*="zoom_"]{ - height: 12px; - width: 12px; -} - -img.JS9StatusbarImageOption[name*="color_"]{ - height: 12px; - width: 100px; -} - -.JS9StatusbarItemNoHighlight { - border: 1px solid #E9E9E9; -} - -.JS9StatusbarItemHighlight { - border: 1px solid #B0B0B0; -} - -.JS9StatusbarItemHighlight2 { - border: 1px solid #777777 -} - -.JS9StatusbarPluginItem .JS9ColorbarCanvas { - border: 0px solid black; -} - -.JS9StatusbarPluginItem { - vertical-align: middle; -} diff --git a/web/static/js9_old/plugins/core/statusbar.js b/web/static/js9_old/plugins/core/statusbar.js deleted file mode 100644 index 05b61e5..0000000 --- a/web/static/js9_old/plugins/core/statusbar.js +++ /dev/null @@ -1,252 +0,0 @@ -/* - * status plugin (February 20, 2020) - */ - -/*global $, JS9 */ - -"use strict"; - -// create our namespace, and specify some meta-information and params -JS9.Statusbar = {}; -JS9.Statusbar.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Statusbar.NAME = "Statusbar"; // name of this plugin (2nd part of div class) -JS9.Statusbar.WIDTH = 512; // width of light window -JS9.Statusbar.HEIGHT = 32; // height of light window -JS9.Statusbar.COLORWIDTH = 120; // width of colorbar, if present -JS9.Statusbar.COLORHEIGHT = 14; // height of colorbar, if present -JS9.Statusbar.BASE = JS9.Statusbar.CLASS + JS9.Statusbar.NAME; - -// mouse over: highlight a bit -JS9.Statusbar.mover = function(target){ - $(target).removeClass("JS9StatusbarItemNoHighlight JS9StatusbarItemHighlight2"); - $(target).addClass("JS9StatusbarItemHighlight"); -}; - -// mouse out: no highlight -JS9.Statusbar.mout = function(target){ - $(target).removeClass("JS9StatusbarItemHighlight JS9StatusbarItemHighlight2"); - $(target).addClass("JS9StatusbarItemNoHighlight"); -}; - -// mouse down: hightlight fully -JS9.Statusbar.mdown = function(target){ - // unhighlight - $(target).removeClass("JS9StatusbarItemNoHighlight JS9StatusbarItemHighlight"); - $(target).addClass("JS9StatusbarItemHighlight2"); -}; - -// mouse up: xeq action, hightlight a bit -JS9.Statusbar.mup = function(target, id){ - let s, arr; - $(target).removeClass("JS9StatusbarItemNoHighlight JS9StatusbarItemHighlight2"); - $(target).addClass("JS9StatusbarItemHighlight"); - // look at the html for this element - s = $(target).attr("name"); - if( s ){ - // is there a hint about what sort of menu status it contains? - arr = s.match(/file|image|edit|view|zoom|rot|flip|scale|color|regions|wcs|analysis|mag/i); - } - // bring up a control plugin, if possible - if( arr && arr[0] ){ - switch(arr[0]){ - case "file": - case "image": - JS9.DisplayPlugin("FITSBinning", {display: id}); - break; - case "edit": - break; - case "view": - break; - case "flip": - case "rot": - case "mag": - case "zoom": - JS9.DisplayPlugin("JS9PanZoom", {display: id}); - break; - case "scale": - JS9.DisplayPlugin("JS9Scale", {display: id}); - break; - case "color": - JS9.DisplayPlugin("JS9Color", {display: id}); - break; - case "regions": - break; - case "wcs": - break; - case "analysis": - break; - } - } -} - -// redraw status on display -JS9.Statusbar.display = function(im, opts){ - let i, s, t, oarr, arr, elements, index, pinst, statusbar; - let html = ""; - let delim = /;/; - // opts is optional - opts = opts || {}; - if( im && JS9.globalOpts.statusBar ){ - statusbar = JS9.globalOpts.statusBar; - // remove colorbar if colorbar plugin is instantiated - pinst = im.display.pluginInstances.JS9Colorbar; - if( pinst && pinst.isActive() && !this.mycolorbar ){ - statusbar = statusbar.replace(/\$colorbar;? */, ""); - } - // escape brackets and parens before macro expansion, then unescape - s = statusbar - .replace(/\(/g, " __OP__ ") - .replace(/\)/g, " __CP__ ") - .replace(/\[/g, " __OB__ ") - .replace(/\]/g, " __CB__ "); - s = im.expandMacro(s) - .replace(/ __OP__ /g, "(") - .replace(/ __CP__ /g, ")") - .replace(/ __OB__ /g, "[") - .replace(/ __CB__ /g, "]"); - if( this.statusBar !== statusbar || opts.reinit ){ - // original statusbar items - oarr = statusbar.split(delim); - // current values of items in the status bar - arr = s.split(delim); - for(i=0; i${arr[i]}
    ` - .replace(/\$img\(([^()]+)\)/g, "") - .replace(/\$colorbar/g, `
    `) - .replace(/__dummy__/, oarr[i].replace(/\s+/, "_")); - html += t; - } - // set statusbar - this.statusContainer.html(html); - // colorbar plugin: run AddDivs, remove colorbar from resize list - if( statusbar.match(/\$colorbar/) ){ - JS9.AddDivs({display: im}); - this.mycolorbar = this.display.pluginInstances.JS9Colorbar; - index = JS9.globalOpts.resizeDivs.indexOf("JS9Colorbar"); - if( index >= 0 ){ - JS9.globalOpts.resizeDivs.splice(index, 1); - } - } - // save the format to detect future changes - this.statusBar = statusbar; - } else { - // elements associated with items in statusbar - elements = this.divjq.find(`.JS9StatusbarItem`); - arr = s.split(delim); - // for each element ... - for(i=0; i") - .addClass(`${JS9.Statusbar.BASE}Container`) - .attr("id", `${this.id}Container`) - .attr("width", this.width) - .attr("height", this.height) - .appendTo(this.divjq); - // display current status, if necessary - if( this.display.image ){ - JS9.Statusbar.display.call(this, this.display.image); - } -}; - -// callback when image is (re-)displayed -JS9.Statusbar.imagedisplay = function(im){ - if( im ){ - JS9.Statusbar.display.call(this, im); - } -}; - -// callback when image is cleared or closed -// eslint-disable-next-line no-unused-vars -JS9.Statusbar.imageclear = function(im){ - JS9.Statusbar.display.call(this, null); -}; - -// dynamic change -JS9.Statusbar.dynamic = function(im){ - let status; - if( im ){ - status = im.display.pluginInstances.JS9Statusbar; - if( status && status.isDynamic ){ - JS9.Statusbar.imagedisplay.call(this, im); - } - } -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.Statusbar.CLASS, JS9.Statusbar.NAME, JS9.Statusbar.init, - {menuItem: "Statusbar", - dynamicSelect: true, - ondynamicselect: JS9.Statusbar.dynamic, - onimagedisplay: JS9.Statusbar.imagedisplay, - onimageclear: JS9.Statusbar.imageclear, - onimageclose: JS9.Statusbar.imageclear, - onsetwcssys: JS9.Statusbar.imagedisplay, - onsetwcsunits: JS9.Statusbar.imagedisplay, - help: "help/statusbar.html", - winTitle: "Statusbar", - winDims: [JS9.Statusbar.WIDTH, JS9.Statusbar.HEIGHT]}); diff --git a/web/static/js9_old/plugins/core/sync.js b/web/static/js9_old/plugins/core/sync.js deleted file mode 100644 index 339116e..0000000 --- a/web/static/js9_old/plugins/core/sync.js +++ /dev/null @@ -1,625 +0,0 @@ -/* - * image sync plugin (September 2, 2018) - * whenever an operation is performed on this image, sync the target images - */ - -/*global JS9, $ */ - -"use strict"; - -JS9.Sync = {}; -JS9.Sync.CLASS = "JS9"; // class of plugins (1st part of div class) -JS9.Sync.NAME = "Sync"; // name of this plugin (2nd part of div class) - -// process ops input to [un]sync -// called in image context -JS9.Sync.getOps = function(ops){ - let i, j, op; - const xops = []; - // default from above ... - ops = ops || JS9.globalOpts.syncOps; - if( !$.isArray(ops) ){ - try{ ops = JSON.parse(ops); } - catch(e){ ops = [ops]; } - } - for(i=0, j=0; i=0; i--){ - // remove if it was specified for removal - if( $.inArray(tims[i], xims) >= 0 ){ - tims.splice(i, 1); - } - } - // remove empty target image array - if( !tims.length ){ - delete this.syncs[op]; - - } - } - } - // remove empty sink object from image - if( !Object.keys(this.syncs).length ){ - delete this.syncs; - } - // reciprocal sync'ing between all images? - if( opts.reciprocate ){ - JS9.Sync.reciprocating = true; - opts.reciprocate = false; - for(i=0, xim=this; i { - // check for a target region with the same syncid as the current region - if( !r1.data || !r1.data.syncid ){ return false; } - if( !r2.data || !r2.data.syncid ){ return false; } - return r1.data.syncid === r2.data.syncid; - }; - const calcFlip = (flip) => { - let i, arr; - let nx = 0; - let ny = 0; - let nflip = ""; - arr = flip.split(""); - for(i=0; i  %s'; - -JS9.SyncUI.syncwcsHTML='  %s'; - -JS9.SyncUI.footerHTML='
    $cancel  $sync    $once    $unsync
    '; - -JS9.SyncUI.cancelHTML=''; - -JS9.SyncUI.syncHTML=''; - -JS9.SyncUI.onceHTML=''; - -JS9.SyncUI.unsyncHTML=''; - - -JS9.SyncUI.getImsOpsOpts = function(el){ - const container = el.closest(".JS9SyncUIContainer"); - const ops = []; - const ims = []; - const opts = {}; - if( container.length ){ - // gather all selected images - container.find(".JS9SyncUIImCheck").each((index, element) => { - let name = $(element).prop("name"); - let checked = $(element).prop("checked"); - if( checked ){ - ims.push(name); - } - }); - // gather all selected ops - container.find(".JS9SyncUIOpCheck").each((index, element) => { - let name = $(element).prop("name"); - let checked = $(element).prop("checked"); - if( checked ){ - ops.push(name); - } - }); - // get opts - container.find(".JS9SyncUIOptsCheck").each((index, element) => { - let name = $(element).prop("name"); - let checked = $(element).prop("checked"); - opts[name] = checked; - }); - } - return {ims, ops, opts}; -}; - -// cancel -// eslint-disable-next-line no-unused-vars -JS9.SyncUI.xcancel = function(did, target){ - let plugin; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display ){ - plugin = display.pluginInstances.JS9SyncUI; - if( plugin && plugin.winHandle ){ - plugin.winHandle.close(); - } - } -}; - -// sync -JS9.SyncUI.xsync = function(did, target){ - let im; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display.image ){ - im = display.image; - // get ims and opts - const {ims, ops, opts} = JS9.SyncUI.getImsOpsOpts($(target)); - // sync images, if necessary - if( ims.length && ops.length ){ - im.syncImages(ops, ims, opts); - } - JS9.SyncUI.setCheckboxes(im); - } -}; - -// sync once -JS9.SyncUI.xonce = function(did, target){ - let im; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display.image ){ - im = display.image; - // get ims and opts - const {ims, ops} = JS9.SyncUI.getImsOpsOpts($(target)); - // copy params, if necessary - if( ims.length && ops.length ){ - im.copyParams(ops, ims); - JS9.SyncUI.setCheckboxes(im); - } - } -}; - -// unsync -JS9.SyncUI.xunsync = function(did, target){ - let im; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display.image ){ - im = display.image; - // get ims and opts - const {ims, ops, opts} = JS9.SyncUI.getImsOpsOpts($(target)); - // unsync images, if necessary - if( ims.length && ops.length ){ - im.unsyncImages(ops, ims, opts); - } - JS9.SyncUI.setCheckboxes(im); - } -}; - -JS9.SyncUI.xrecip = function(did, target){ - let pinst; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display ){ - pinst = display.pluginInstances.JS9SyncUI; - pinst.syncReciprocate = $(target).is(':checked'); - } -}; - -JS9.SyncUI.xsyncwcs = function(did, target){ - let pinst; - const display = JS9.getDynamicDisplayOr(JS9.lookupDisplay(did)); - if( display ){ - pinst = display.pluginInstances.JS9SyncUI; - pinst.syncWCS = $(target).is(':checked'); - } -}; - -// get a SyncImage id based on the file image id -JS9.SyncUI.imid = function(im){ - const id = `${im.display.id}_${im.id}`; - return `${id.replace(/[^A-Za-z0-9_]/g, "_")}SyncImage`; -}; - -// set checkbox for sync'ed options -JS9.SyncUI.setCheckboxes = function(im){ - let i, j, id, op, syncops, pinst; - // sanity check - if( !im ){ - return - } - // get current instance of this plugin - pinst = im.display.pluginInstances.JS9SyncUI; - // first turn all checkboxes off - pinst.syncContainer.find(".JS9SyncUIOpCheck").prop("checked", false); - pinst.syncContainer.find(".JS9SyncUIImCheck").prop("checked", false); - pinst.syncContainer.find(".JS9SyncUIOptsCheck").prop("checked", false); - // then turn on currently syn'ed options - syncops = JS9.globalOpts.syncOps; - // for each sync'ed op in this image ... - if( im.syncs ){ - for(i=0; i${s}`; -}; - -// add an image to the list of available images -JS9.SyncUI.addImage = function(im){ - let s, id, imid; - const opts = []; - const cls = `${JS9.SyncUI.BASE}ImageRow`; - if( !im ){ - return; - } - // convenience variables - imid = im.id; - // unique id - id = JS9.SyncUI.imid(im); - // value to pass to the macro expander - opts.push({name: "imid", value: im.id}); - opts.push({name: "imactive", value: sprintf(JS9.SyncUI.imactiveHTML, imid)}); - opts.push({name: "imfile", value: sprintf(JS9.SyncUI.imfileHTML, imid)}); - // create the html for this image - s = im.expandMacro(JS9.SyncUI.imageHTML, opts); - // one more div in the stack - this.syncImageDivs++; - // return image html to add to the image container - return `
    ${s}
    `; -}; - -// remove an image from the list of available images -JS9.SyncUI.removeImage = function(im){ - let id; - if( im ){ - id = JS9.SyncUI.imid(im); - $(`#${id}`).remove(); - this.syncImageDivs--; - if( !this.syncImageDivs ){ - this.syncImageContainer.html(""); - } - return true; - } - return false; -}; - -// constructor: add HTML elements to the plugin -JS9.SyncUI.init = function(){ - let i, j, s, im, op, dispid, imhead, ophead, opts, nrow, idx, syncops, html; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // sanity check since we are always active - if( !this.divjq || !this.divjq.is(":visible") ){ - return; - } - // clean main container - this.divjq.html(""); - // no images/divs loaded yet - this.syncOpDivs = 0; - this.syncImageDivs = 0; - // allow scrolling on the plugin - this.divjq.addClass("JS9PluginScrolling"); - // init reciprocate - if( JS9.isNull(this.syncReciprocate) ){ - this.syncReciprocate = JS9.globalOpts.syncReciprocate; - } - // init syncwcs - if( JS9.isNull(this.syncWCS) ){ - this.syncWCS = JS9.globalOpts.syncWCS; - } - // convenience variables - dispid = this.display.id; - if( this.display.image ){ - this.lastim = this.display.image; - imhead = sprintf(JS9.SyncUI.HEADER, - `Images that can be synced with ${this.lastim.id}`); - } else { - this.lastim = null; - imhead = sprintf(JS9.SyncUI.HEADER, - `Images that can be synced`); - } - // main container - this.syncContainer = $("
    ") - .addClass(`${JS9.SyncUI.BASE}Container`) - .attr("id", `${this.id}SyncContainer`) - .css("overflow", "auto") - .appendTo(this.divjq); - s = JS9.Image.prototype.expandMacro.call(null, JS9.SyncUI.headerHTML); - // header - this.syncHeader = $("
    ") - .addClass(`${JS9.SyncUI.BASE}Header`) - .attr("id", `${dispid}Header`) - .html(s) - .appendTo(this.syncContainer); - // container to hold images - this.syncImageContainer = $("
    ") - .addClass(`${JS9.SyncUI.BASE}ImageContainer`) - .attr("id", `${this.id}SyncImageContainer`) - .html(imhead) - .appendTo(this.syncContainer); - // add images - html = ""; - for(i=0; i") - .addClass(`${JS9.SyncUI.BASE}OpContainer`) - .attr("id", `${this.id}SyncOpContainer`) - .html(sprintf(JS9.SyncUI.HEADER, "Operations that can be synced")) - .appendTo(this.syncContainer); - syncops = JS9.globalOpts.syncOps; - nrow = Math.floor((syncops.length + JS9.SyncUI.NCOL - 1) / JS9.SyncUI.NCOL); - for(j=0; j`; - for(i=0; i") - .addClass(`${JS9.SyncUI.BASE}OptsContainer`) - .attr("id", `${this.id}SyncOptsContainer`) - .html(ophead) - .appendTo(this.syncContainer); - opts = []; - opts.push({name: "reciprocate", value: sprintf(JS9.SyncUI.reciprocalHTML, JS9.SyncUI.COLWIDTH * 0, "reciprocate", dispid, "reciprocal sync")}); - opts.push({name: "syncwcs", value: sprintf(JS9.SyncUI.syncwcsHTML, JS9.SyncUI.COLWIDTH * 1, "syncwcs", dispid, "sync using wcs")}); - s = JS9.Image.prototype.expandMacro.call(null, JS9.SyncUI.optsHTML, opts); - // footer - this.syncOpts = $("
    ") - .attr("id", `${dispid}Opts`) - .html(s) - .appendTo(this.syncOptsContainer); - // footer containing run buttons - opts = []; - opts.push({name: "cancel", value: sprintf(JS9.SyncUI.cancelHTML, dispid, - this.winHandle ? "" : 'style="display:none;"')}); - opts.push({name: "sync", value: sprintf(JS9.SyncUI.syncHTML, dispid)}); - opts.push({name: "once", value: sprintf(JS9.SyncUI.onceHTML, dispid)}); - opts.push({name: "unsync", value: sprintf(JS9.SyncUI.unsyncHTML, dispid)}); - s = JS9.Image.prototype.expandMacro.call(null, JS9.SyncUI.footerHTML, opts); - // footer - this.syncFooter = $("
    ") - .addClass(`${JS9.SyncUI.BASE}Footer`) - .attr("id", `${dispid}Footer`) - .html(s) - .appendTo(this.syncContainer); - // initialize sync values for this image - if( this.display.image ){ - JS9.SyncUI.setCheckboxes(this.display.image); - } -}; - -// callback when plugin is redisplayed -// eslint-disable-next-line no-unused-vars -JS9.SyncUI.reinit = function(im){ - JS9.SyncUI.init.call(this); -}; - -// callback when an image is loaded -JS9.SyncUI.imageload = function(im){ - if( !im ){ return; } - JS9.SyncUI.init.call(this); -}; - -// callback when an image is displayed -JS9.SyncUI.imagedisplay = function(im){ - if( im && im !== this.lastim ){ - JS9.SyncUI.init.call(this); - } -}; - -// clean up an image when its closed -JS9.SyncUI.imageclose = function(im){ - let i; - if( !im ){ return; } - // remove this image from all other image sync lists - for(i=0; i this.width ){ - x = offset.left - w - 20; - } - this.tooltip.css({left: x, top: y, display: "inline-block"}); - } else { - this.tooltip.html("").css({left: -9999, display: "none"}); - } - return; -}; - -// add a tool to the toolbar -JS9.Toolbar.addTool = function(tool){ - let div, btn, img; - // special processing: no args means return current list of tools - if( !tool ){ - return JS9.Toolbar.tools; - } - // special processing: add "break" between section - if( tool === "$break" ){ - $("
    ").appendTo(this.activeToolbar); - return; - } - // sanity check on a real tool - if( !tool.name || !tool.cmd ){ - JS9.error(`invalid input to JS9.toolbar: ${JSON.stringify(tool)}`); - } - // enclosing div - div = $("
    ") - .addClass(`${JS9.Toolbar.BASE}ButtonDiv`) - .appendTo(this.activeToolbar); - // create the button - if( tool.image ){ - // relative path: add install dir prefix - img = tool.image; - if( JS9.inline && JS9.inline[img] ){ - // inline version is available - img = JS9.inline[img]; - } else if( img.charAt(0) !== "/" ){ - // external version - img = JS9.InstallDir(img); - } - btn = $("") - .addClass(`${JS9.Toolbar.BASE}ImageButton`) - .attr("type", "image") - .attr("src", img) - .attr("width", JS9.Toolbar.IMAGEWIDTH) - .attr("height", JS9.Toolbar.IMAGEHEIGHT) - .attr("alt", tool.name) - .appendTo(div); - } else { - btn = $("") - .addClass(`${JS9.Toolbar.BASE}ButtonButton`) - .attr("type", "button") - .attr("value", tool.name) - .appendTo(div); - } - // set up the callback to the JS9 public access routine - btn.on("click", () => { - let args; - const display = this.display; - // special processing for commands - switch(tool.cmd){ - default: - if( typeof JS9.publics[tool.cmd] === "function" ){ - // clone the array and any objects it contains - args = JSON.parse(JSON.stringify(tool.args||[])); - args.push({display: display}); - JS9.publics[tool.cmd](...args); - } else { - JS9.error(`unknown JS9 func for toolbar: ${tool.cmd}`); - } - break; - } - }); - // tool tip is optional - if( JS9.globalOpts.toolbarTooltips ){ - btn.on("mouseover", (e) => { - JS9.Toolbar.tooltip.call(this, tool, tool.tip||tool.name, e); - }); - btn.on("mouseout", (e) => { - JS9.Toolbar.tooltip.call(this, tool, null, e); - }); - } - // return something possible useful - tool.btn = btn; - return tool; -}; - -// constructor: add HTML elements to the plugin -JS9.Toolbar.init = function(width, height){ - let i, j, tool, name; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id of the div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = width || JS9.Toolbar.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = height || JS9.Toolbar.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // clean plugin container - this.divjq.html(""); - // toolbar container - this.toolbarContainer = $("
    ") - .addClass(`${JS9.Toolbar.BASE}Container`) - .attr("id", `${this.id}Container`) - .appendTo(this.divjq); - // toolbar - this.activeToolbar = $("
    ") - .addClass(`${JS9.Toolbar.BASE}Div`) - .attr("id", `${this.id}Toolbar`) - .css("width", this.width) - .css("height", this.height) - .css("min-height", JS9.Toolbar.TOOLBARHEIGHT) - .appendTo(this.toolbarContainer); - // add a tooltip - this.tooltip = $("
    ") - .attr("id", `tooltip_${this.id}`) - .addClass("JS9ToolbarTooltip") - .appendTo(this.divjq); - // add tools from globalOpts to the list - for(j=0; j { - let i, display, pinst; - for(i=0; i%s'; - -JS9.PanZoom.zoomHTML = ''; - -JS9.PanZoom.flipHTML = ''; - -JS9.PanZoom.rot90HTML = ''; - -JS9.PanZoom.rotateHTML = ''; - -JS9.PanZoom.pantoHTML = ''; - -JS9.PanZoom.pos1HTML = ''; - -JS9.PanZoom.pos2HTML = ''; - -JS9.PanZoom.sysHTML = ''; - -JS9.PanZoom.unitsHTML = ''; - -// change pan via menu -JS9.PanZoom.xsetpan = function(did, id, target){ - const im = JS9.lookupImage(id, did); - if( im ){ - switch(target.value){ - case "center": - im.setPan(); - break; - default: - break; - } - } -}; - -// change zoom via menu -JS9.PanZoom.xsetzoom = function(did, id, target){ - let arr, arr2, zval, zoom; - const im = JS9.lookupImage(id, did); - if( im ){ - switch(target.value){ - case "in": - case "out": - case "to fit": - zoom = im.parseZoom(target.value); - if( JS9.isNumber(zoom) ){ - im.setZoom(zoom); - } - break; - default: - // format: "zoom" zoom - arr = target.value.split(/\s+/); - if( arr.length === 2 ){ - // format zoom or 1/zoom - arr2 = arr[1].split("/"); - if( arr2.length === 1 ){ - zval = parseFloat(arr2[0]); - } else { - zval = 1 / parseFloat(arr2[1]); - } - im.setZoom(zval); - } - break; - } - } -}; - -// change flip via menu -JS9.PanZoom.xsetflip = function(did, id, target){ - const im = JS9.lookupImage(id, did); - if( im ){ - switch(target.value){ - case "x axis": - im.setFlip("x"); - break; - case "y axis": - im.setFlip("y"); - break; - case "reset": - im.setFlip("reset"); - break; - default: - break; - } - } -}; - -// change rotation by 90 degrees via menu -JS9.PanZoom.xsetrot90 = function(did, id, target){ - const im = JS9.lookupImage(id, did); - if( im ){ - switch(target.value){ - case "90 left": - im.setRot90(90); - break; - case "90 right": - im.setRot90(-90); - break; - case "reset rotate": - im.setRot90("reset"); - im.setRotate("reset"); - break; - case "align: north is up": - im.setRot90("reset"); - im.setRotate("northisup"); - break; - case "reset flip/rot90/rotate": - im.setFlip("reset"); - im.setRot90("reset"); - im.setRotate("reset"); - break; - default: - break; - } - } - return false; -}; - -// change rotation by degrees via text box -JS9.PanZoom.xsetrot = function(did, id, target, evt){ - let rot, pinst; - const im = JS9.lookupImage(id, did); - if( im ){ - if( evt.keyCode !== 13 ){ return; } - rot = $(target).val().trim(); - if( rot ){ - if( rot === "reset" ){ - im.setRotate("reset"); - im.setRot90("reset"); - return; - } - pinst = im.display.pluginInstances.JS9PanZoom; - // do this before setting rotation - if( pinst ){ - pinst.rot = rot; - } - im.setRotate(rot); - // do this after setting rotation - if( pinst ){ - pinst.divjq.find(`input[name="rotate"]`).focus().caretToEnd(); - } - } - } -}; - -// pan to the position specified in the pos1,pos2 input elements -JS9.PanZoom.xpanto = function(did, id, target){ - let owcssys, arr, p1, p2, s1, s2, wcssys, pel, phys; - const im = JS9.lookupImage(id, did); - if( im ){ - pel = $(target).parent(); - wcssys = pel.find("[name='wcssys']").val(); - s1 = pel.find("[name='pos1']").val(); - s2 = pel.find("[name='pos2']").val(); - if( s1 && s2 && wcssys ){ - owcssys = im.getWCSSys(); - im.setWCSSys(wcssys); - p1 = JS9.saostrtod(s1); - if( JS9.isHMS(wcssys) ){ - p1 *= 15.0; - } - p2 = JS9.saostrtod(s2); - switch(wcssys){ - case "image": - break; - case "physical": - phys = im.logicalToImagePos({x: p1, y: p2}); - p1 = phys.x; - p2 = phys.y; - break; - default: - if( im.validWCS() ){ - arr = JS9.wcs2pix(im.raw.wcs, p1, p2).trim().split(/\s+/); - p1 = parseFloat(arr[0]); - p2 = parseFloat(arr[1]); - } - } - im.setPan(p1, p2); - im.setWCSSys(owcssys); - } - } -}; - -// change the wcs system -JS9.PanZoom.xsetwcssys = function(did, id, target){ - let owcssys, owcsunits, pel, pos1, pos2; - const nwcssys = target.value; - const im = JS9.lookupImage(id, did); - if( im ){ - owcssys = im.getWCSSys(); - owcsunits = im.getWCSUnits(); - im.setWCSSys(nwcssys); - im.tmp.wcssysPanZoom = nwcssys; - pos1 = JS9.PanZoom.getPos(im, "x"); - pos2 = JS9.PanZoom.getPos(im, "y"); - pel = $(target).parent(); - pel.find("[name='pos1']").val(pos1); - pel.find("[name='pos2']").val(pos2); - if( im.getWCSUnits() !== (im.tmp.wcsunitsPanZoom||owcsunits) ){ - JS9.PanZoom.xsetwcsunits(did, id, {value: im.getWCSUnits()}); - } - im.setWCSSys(owcssys); - im.setWCSUnits(owcsunits); - } -} - -// change the wcs units -JS9.PanZoom.xsetwcsunits = function(did, id, target){ - let owcssys, owcsunits, pel, pos1, pos2; - const nwcsunits = target.value; - const im = JS9.lookupImage(id, did); - if( im ){ - owcsunits = im.getWCSUnits(); - owcssys = im.getWCSSys(); - im.setWCSUnits(nwcsunits); - im.tmp.wcsunitsPanZoom = nwcsunits; - pos1 = JS9.PanZoom.getPos(im, "x"); - pos2 = JS9.PanZoom.getPos(im, "y"); - pel = $(target).parent(); - pel.find("[name='pos1']").val(pos1); - pel.find("[name='pos2']").val(pos2); - if( im.getWCSSys() !== (im.tmp.wcssysPanZoom||owcssys) ){ - JS9.PanZoom.xsetwcssys(did, id, {value: im.getWCSSys()}); - } - im.setWCSSys(owcssys); - im.setWCSUnits(owcsunits); - } -} - -// get position string based on wcssys -JS9.PanZoom.getPos = function(im, which){ - let s, res, phys, ipos, owcssys, owcsunits, wcssys, wcsunits; - if( im ){ - ipos = im.getPan(); - owcssys = im.getWCSSys(); - owcsunits = im.getWCSUnits(); - wcssys = im.tmp.wcssysPanZoom || owcssys; - wcsunits = im.tmp.wcsunitsPanZoom || owcsunits; - if( owcssys !== wcssys ){ - im.setWCSSys(wcssys); - } - if( owcsunits !== wcsunits ){ - im.setWCSUnits(wcsunits); - } - switch(wcssys){ - case "image": - res = String(ipos[which]); - break; - case "physical": - phys = im.imageToLogicalPos(ipos); - res = String(phys[which]); - break; - default: - if( im.validWCS() ){ - s = JS9.pix2wcs(im.raw.wcs, ipos.x, ipos.y) - .trim().split(/\s+/); - res = which === "x" ? s[0] : s[1]; - } else { - res = String(ipos[which]); - } - break; - } - if( owcssys !== wcssys ){ - im.setWCSSys(owcssys); - } - if( owcsunits !== wcsunits ){ - im.setWCSUnits(owcsunits); - } - } - return res; -}; - -// re-init (avoiding recursion) -JS9.PanZoom.reinit = function(){ - if( !this.inProcess ){ - this.inProcess = true; - JS9.PanZoom.init.call(this); - this.inProcess = false; - } -}; - -// re-init when a different image is displayed -JS9.PanZoom.display = function(){ - if( this.lastimage !== this.display.image ){ - this.inProcess = true; - JS9.PanZoom.init.call(this); - this.inProcess = false; - } -}; - -// clear when an image closes -JS9.PanZoom.close = function(){ - // ensure plugin display is reset - JS9.PanZoom.init.call(this, {mode: "clear"}); -}; - -// constructor: add HTML elements to the plugin -JS9.PanZoom.init = function(opts){ - let s, t, im, mopts, imid, dispid; - const getPanOptions = () => { - let res = ""; - res += ``; - return res; - }; - const getZoomOptions = () => { - let i, zoom, name; - let res = ""; - res += ``; - res += ``; - res += ``; - res += ``; - for(i=JS9.imageOpts.zooms; i>0; i--){ - zoom = Math.pow(2,i); - name = `zoom 1/${zoom}`; - res += ``; - } - for(i=0; i<=JS9.imageOpts.zooms; i++){ - zoom = Math.pow(2,i); - name = `zoom ${zoom}`; - res += ``; - } - return res; - }; - const getFlipOptions = () => { - let res = ""; - res += ``; - res += ``; - res += ``; - return res; - }; - const getRot90Options = () => { - let res = ""; - res += ``; - res += ``; - res += ``; - res += ``; - res += ``; - res += ``; - return res; - }; - const getRotOptions = (im) => { - let res = 0; - if( im ){ - if( JS9.globalOpts.rotateRelative && - this.rot && this.rot !== "reset" ){ - res = this.rot; - } else { - res = im.getRotate() || "0"; - } - } - return res; - }; - const getSysOptions = (im) => { - let i, sys, wcssys; - let res = ""; - if( im ){ - wcssys = im.tmp.wcssysPanZoom || im.getWCSSys(); - if( im.validWCS() ){ - sys = JS9.wcssyss; - } else { - sys = ["image", "physical"]; - } - for(i=0; i${sys[i]}`; - } else { - res += ``; - } - } - } - return res; - }; - const getUnitsOptions = (im) => { - let i, units, wcsunits; - let res = ""; - if( im ){ - wcsunits = im.tmp.wcsunitsPanZoom || im.getWCSUnits(); - if( im.validWCS() ){ - units = ["degrees", "sexagesimal", "pixels"]; - } else { - units = ["pixels"]; - } - for(i=0; i${units[i]}`; - } else { - res += ``; - } - } - } - return res; - }; - const getPos = (im, which) => { - return JS9.PanZoom.getPos(im, which); - }; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // - // opts is optional - opts = opts || {}; - // set width and height of plugin itself - this.width = this.divjq.attr("data-width"); - if( !this.width ){ - this.width = JS9.PanZoom.WIDTH; - } - this.divjq.css("width", this.width); - this.width = parseInt(this.divjq.css("width"), 10); - this.height = this.divjq.attr("data-height"); - if( !this.height ){ - this.height = JS9.PanZoom.HEIGHT; - } - this.divjq.css("height", this.height); - this.height = parseInt(this.divjq.css("height"), 10); - // clear out html - this.divjq.html(""); - this.lastTextWidth = 0; - // set up new html - this.panzoomContainer = $("
    ") - .addClass(`${JS9.PanZoom.BASE}Container`) - .attr("id", `${this.id}Container`) - .attr("width", this.width) - .attr("height", this.height) - .appendTo(this.divjq); - // do we have an image? - im = this.display.image; - if( im && (opts.mode !== "clear") ){ - // convenience variables - imid = im.id; - dispid = im.display.id; - mopts = []; - t = sprintf(JS9.PanZoom.panHTML, dispid, imid, getPanOptions()); - mopts.push({name: "pan", value: t}); - t = sprintf(JS9.PanZoom.zoomHTML, dispid, imid, getZoomOptions()); - mopts.push({name: "zoom", value: t}); - t = sprintf(JS9.PanZoom.flipHTML, dispid, imid, getFlipOptions()); - mopts.push({name: "flip", value: t}); - t = sprintf(JS9.PanZoom.rot90HTML, dispid, imid, getRot90Options()); - mopts.push({name: "rot90", value: t}); - t = sprintf(JS9.PanZoom.rotateHTML, dispid, imid, getRotOptions(im)); - mopts.push({name: "rotate", value: t}); - t = sprintf(JS9.PanZoom.pantoHTML, dispid, imid); - mopts.push({name: "panto", value: t}); - t = sprintf(JS9.PanZoom.pos1HTML, getPos(im, "x")); - mopts.push({name: "pos1", value: t}); - t = sprintf(JS9.PanZoom.pos2HTML, getPos(im, "y")); - mopts.push({name: "pos2", value: t}); - t = sprintf(JS9.PanZoom.sysHTML, dispid, imid, getSysOptions(im)); - mopts.push({name: "wcssys", value: t}); - t = sprintf(JS9.PanZoom.unitsHTML, dispid, imid, getUnitsOptions(im)); - mopts.push({name: "wcsunits", value: t}); - s = im.expandMacro(JS9.PanZoom.panzoomHTML, mopts); - this.lastimage = im; - } else { - s = "

    Pan/Zoom parameters will appear here.
    "; - } - this.panzoomContainer.html(s); - if( im ){ - // init run on cr, if necessary - if( JS9.globalOpts.runOnCR ){ - this.panzoomContainer.find("[name='pos1']") - .data("enterfunc", "panto"); - this.panzoomContainer.find("[name='pos2']") - .data("enterfunc", "panto"); - } - } -}; - -// add this plugin into JS9 -JS9.RegisterPlugin(JS9.PanZoom.CLASS, JS9.PanZoom.NAME, - JS9.PanZoom.init, - {menu: "zoom", - menuItem: "Pan/Zoom Controls ...", - onplugindisplay: JS9.PanZoom.init, - onsetpan: JS9.PanZoom.reinit, - onsetzoom: JS9.PanZoom.reinit, - onsetwcssys: JS9.PanZoom.reinit, - onsetwcsunits: JS9.PanZoom.reinit, - onimagedisplay: JS9.PanZoom.display, - onimageclose: JS9.PanZoom.close, - help: "help/zoomcontrols.html", - winTitle: "Pan/Zoom Controls", - winDims: [JS9.PanZoom.WIDTH, JS9.PanZoom.HEIGHT]}); diff --git a/web/static/js9_old/plugins/fitsy/README b/web/static/js9_old/plugins/fitsy/README deleted file mode 100644 index 9f871f2..0000000 --- a/web/static/js9_old/plugins/fitsy/README +++ /dev/null @@ -1 +0,0 @@ -original source: https://github.com/jbroll/fitsy.js diff --git a/web/static/js9_old/plugins/fitsy/binning.html b/web/static/js9_old/plugins/fitsy/binning.html deleted file mode 100644 index 4370097..0000000 --- a/web/static/js9_old/plugins/fitsy/binning.html +++ /dev/null @@ -1,134 +0,0 @@ - - - - - -Plugin: FITSBinning - - - -
    -

    -

    FITS Image Sections, with Binning and Filtering

    - -The rows in a FITS binary table must be binned before being displayed -as an image. By default, JS9 uses a bin factor of 1 to extract the -central 2048 x 2048 section of the data for display. This default is -controlled by the JS9.globalOpts.table object properties, which can be -set in your js9Prefs.js file. - -

    -Also by default, the central 2048 x 2048 section of a FITS image is displayed -at bin 1. This default is controlled by the JS9.globalOpts.image object -properties, which can be set in your js9Prefs.js file. - -

    -The Bin/Filter/Section plugin allows you to extract sections -from FITS binary tables and images, with options to choose the image -center, image dimensions, and bin factor. For tables, the plugin also -allows you to filter rows of the table by means of arithmetic and -boolean operations on the table columns. - -

    -The Bin/Filter/Section plugin works with both FITS representation -files and with ordinary in-memory FITS files. If the displayed FITS -file is a representation file (i.e., it has a parent file, a JS9 -helper is connected, etc.), the plugin will ask the JS9 helper to -extract the image section from the parent. Otherwise, it extracts the -section from the in-memory FITS file. This behavior is meant to be -transparent to the user. - -

    -When extracting an image section, you can set one or more of the -following options: -

      -
    • center: the file (physical) coordinates around which to -perform the section extraction (0,0 can be used to specify the file center). -
    • size: the size of the image to extract (before binning (or blocking) is -performed). -
    • bin (tables) or block (images): determines how table events are binned or how physical pixels are combined into -a single image pixel, after the section is extracted. -
    • mode:summing or averging of the binned (blocked) pixels -
    • filter:for tables only: row/event filter to apply when extracting the section. -
    • separate: if true, display as a separate image (default is to update the current image). -
    -

    -For example, if a table has FITS (tlmin, tlmax) dimensions 4096 x 4096, then: -

      -
    • center: 2048, 2048; dimensions: 4096, 4096; bin: 4 will bin the entire file by 4 to produce a 1024 x 1024 image. -
    • center: 1024, 1024; dimensions: 1024, 1024, bin: 2 will bin the upper left 1024 x 1024 section of the image by 2 to produce a 512 x 512 image. -
    -Specifying 0,0 for the center will cause the section to be extracted from the -center of the image. - -

    -Although the binning parameter is usually input as an real value, there are -other options available: -

      -
    • x[n]|X[n]|*[n]: multiply the current bin by n (e.g., "x2") -
    • /[n]: divide the current bin by n (e.g., "/2") -
    • +[n]: add n to the current bin (e.g., "+2") -
    • -[n]: subtract n from the current bin (e.g., "-2") -
    • in|In: multiply the current bin by 2 -
    • out|Out: divide the current bin by 2 -
    • [n]a: bin by n, averaging the binned pixels -
    • [n]s: bin by n, summing the binned pixels -
    -Note that the JS9.globalOpts.binMode property specifies the -default action for whether the binned pixels are summed together (if -binMode is "s") or averaged (if binMode is "a"). This action is overridden -by the last two bin directives listed above or by the mode input option. - -

    -Table filtering allows you to select rows from an FITS binary table -(e.g., an X-ray event list) by checking each row against an expression -involving the columns in the table. When a table is filtered, only -valid rows satisfying these expressions are used to make the image. - -

    -A filter expression consists of an arithmetic or logical operation -involving one or more column values from a table. Columns can be -compared to other columns or to numeric constants. Standard JavaScript -math functions can be applied to columns. JavaScript (or C) semantics -are used when constructing expressions, with the usual precedence and -associativity rules holding sway: -

    -  Operator                                Associativity
    -  --------                                -------------
    -  ()                                      left to right
    -  !  (bitwise not) - (unary minus)        right to left
    -  *  /                                    left to right
    -  +  -                                    left to right
    -  < <= > >=                               left to right
    -  == !=                                   left to right
    -  &  (bitwise and)                        left to right
    -  ^  (bitwise exclusive or)               left to right
    -  |  (bitwise inclusive or)               left to right
    -  && (logical and)                        left to right
    -  || (logical or)                         left to right
    -  =                                       right to left
    -
    -For example, if energy and pha are columns in a table, -then the following are valid expressions: -
    -  pha > 1
    -  energy == pha
    -  pha > 1 && energy ≤ 2
    -  max(pha,energy)≥2.5
    -
    - -

    -NB: when using cfitsio (the default, instead of the deprecated -fitsy.js), table filtering follows cfitsio conventions, which is -documented -here. - -

    -Once the desired parameters have been set, pressing the Run -button will filter, bin and display the data. - -

    - - - diff --git a/web/static/js9_old/plugins/fitsy/binning.js b/web/static/js9_old/plugins/fitsy/binning.js deleted file mode 100644 index 91a912f..0000000 --- a/web/static/js9_old/plugins/fitsy/binning.js +++ /dev/null @@ -1,352 +0,0 @@ -/*globals $, JS9 */ - -"use strict"; - -(function() { - - function reBinImage(div, display) { - let opts, npos; - let im = JS9.GetImage({display: display}); - let form = $(div).find(".js9BinningForm")[0]; - // sanity check - if( !im || !im.raw ) { return; } - // initialize opts - opts = {xcen:0, ycen:0, xdim:0, ydim:0, bin:1, filter:"", - columns:"", cubecol:""}; - // get opts from form - if( JS9.isNumber(form.xcen.value) ){ - opts.xcen = parseFloat(form.xcen.value); - } - if( JS9.isNumber(form.ycen.value) ){ - opts.ycen = parseFloat(form.ycen.value); - } - npos = im.maybePhysicalToImage({x: opts.xcen, y: opts.ycen}); - if( npos ){ - opts.xcen = npos.x; - opts.ycen = npos.y; - } - if( JS9.isNumber(form.xdim.value) ){ - opts.xdim = Math.floor(parseFloat(form.xdim.value)); - } - if( JS9.isNumber(form.ydim.value) ){ - opts.ydim = Math.floor(parseFloat(form.ydim.value)); - } - if( JS9.isNumber(form.bin.value) ){ - opts.bin = parseFloat(form.bin.value); - } else { - opts.bin = form.bin.value; - } - if( JS9.isNumber(form.bitpix.value) ){ - opts.bitpix = parseInt(form.bitpix.value, 10); - } - opts.filter = form.filter.value; - opts.columns = form.columns.value; - opts.cubecol = form.cubecol.value; - // if columns changed, we have to reset the center to 0 - if( im.raw.hdu.table && im.raw.hdu.table.columns !== opts.columns ){ - opts. xcen = 0; - opts. ycen = 0; - } - opts.separate = $(form.separate).prop("checked"); - if( opts.cubecol ) opts.separate = true; - opts.binMode = $('input[name="binmode"]:checked').val(); - im.displaySection(opts); - } - - function centerBinImage(xdim, ydim, div, display) { - let im = JS9.GetImage({display: display}); - let form = $(div).find(".js9BinningForm")[0]; - let fdims = im.fileDimensions(); - form.xcen.value = 0; - form.ycen.value = 0; - if( xdim > 0 ){ - form.xdim.value = xdim; - } else { - form.xdim.value = fdims.xdim; - } - if( ydim > 0 ){ - form.ydim.value = ydim; - } else { - form.ydim.value = fdims.ydim; - } - reBinImage(div, display); - } - - function getBinParams(div, display) { - let im, ipos, lpos, form, hdu, bin; - if ( !display ) { - if( this ){ - display = this.display; - } else { - display = JS9.displays[0]; - } - } - im = JS9.GetImage({display: display}); - if ( im ) { - form = $(div).find(".js9BinningForm")[0]; - - if ( im.raw.hdu !== undefined ) { - hdu = im.raw.hdu; - hdu.bin = hdu.bin || 1; - hdu.binMode = hdu.binMode || JS9.globalOpts.binMode || "s"; - form.rebin.disabled = false; - if( hdu.table !== undefined && !JS9.ishealpix(im) ) { - // get current center - ipos = im.getPan(); - // convert to physial (file) coords - lpos = im.imageToLogicalPos({x: ipos.ox, y: ipos.oy}); - form.xcen.value = String(Math.floor(lpos.x + 0.5)); - form.ycen.value = String(Math.floor(lpos.y + 0.5)); - form.bin.value = String(hdu.table.bin); - form.xdim.value = String(Math.floor(hdu.table.xdim)); - form.ydim.value = String(Math.floor(hdu.table.ydim)); - form.filter.value = hdu.table.filter || ""; - form.bitpix.value = hdu.table.bitpix || JS9.globalOpts.table.bitpix; - form.columns.value = hdu.table.columns || ""; - form.cubecol.value = ""; - form.bin.disabled = false; - form.xcen.disabled = false; - form.ycen.disabled = false; - form.xdim.disabled = false; - form.ydim.disabled = false; - // form.binmode.disabled = false; - form.filter.disabled = false; - form.bitpix.disabled = false; - form.columns.disabled = false; - form.cubecol.disabled = false; - } else { - hdu.bin = hdu.bin || 1; - bin = hdu.bin > 0 ? hdu.bin : 1 / Math.abs(hdu.bin); - // hack: if a parent file was used to make this image, - // calculate binning from its LTM/TLV parameters - if( im.parentFile && im.raw.header && - im.raw.header.LTM1_1 !== undefined ){ - bin = 1.0 / Math.abs(im.raw.header.LTM1_1); - } - // get image center from raw data - // ipos = {x: im.raw.width / 2, y: im.raw.height / 2}; - // get current center - ipos = im.getPan(); - // convert to physial (file) coords - lpos = im.imageToLogicalPos({x: ipos.ox, y: ipos.oy}); - // form.xcen.value = String(Math.floor(lpos.x + 0.5)); - // form.ycen.value = String(Math.floor(lpos.y + 0.5)); - form.xcen.value = String(Math.floor(lpos.x + 0.5*(bin-1))); - form.ycen.value = String(Math.floor(lpos.y + 0.5*(bin-1))); - form.bin.value = String(hdu.bin); - form.xdim.value = String(Math.floor(hdu.naxis1 * bin)); - form.ydim.value = String(Math.floor(hdu.naxis2 * bin)); - form.filter.value = ""; - form.bitpix.value = im.raw.header.BITPIX; - form.columns.value = ""; - form.cubecol.value = ""; - form.bin.disabled = false; - form.xcen.disabled = false; - form.ycen.disabled = false; - form.xdim.disabled = false; - form.ydim.disabled = false; - form.binmode.disabled = false; - form.filter.disabled = true; - form.filter.style.backgroundColor="#E0E0E0"; - form.bitpix.disabled = true; - form.bitpix.style.backgroundColor="#E0E0E0"; - form.columns.disabled = true; - form.columns.style.backgroundColor="#E0E0E0"; - form.cubecol.disabled = true; - form.cubecol.style.backgroundColor="#E0E0E0"; - } - // cube support makes no sense using a parentFile - if( im.parentFile && - JS9.helper.connected && JS9.helper.js9helper ){ - form.cubecol.value = ""; - form.cubecol.disabled = true; - form.cubecol.style.backgroundColor="#E0E0E0"; - } - // average or sum - if( hdu.binMode === "a" ){ - $('input:radio[class="avg-pixels"]').prop('checked',true); - } else { - $('input:radio[class="sum-pixels"]').prop('checked',true); - } - } else { - form.rebin.disabled = true; - } - } - } - - function binningInit() { - let i, s, cols, el, smode; - let that = this; - let elhdu = " "; - let binblock = "Block"; - let binblocked = "blocked"; - let html = ""; - let div = this.div; - let display = this.display; - let win = this.winHandle; - let disclose = win ? "" : 'style="display:none;"'; - let im = JS9.GetImage({display: this.display}); - - if( !im || (im && !im.raw.hdu) ){ - div.innerHTML = '

    FITS image sections, with binning and filtering
    '; - return; - } - if( im.imtab === "table" ){ - binblock = "Bin"; - binblocked = "binned"; - if( !JS9.ishealpix(im) ){ - elhdu = '  -   -   - ${elhdu} - - Center: - - -  center position of section - - Size: - - -  width, height of section - - ${binblock}: - - -  apply ${binblock.toLowerCase()} factor to ${im.imtab} - `; - - if( im.imtab === "image" || JS9.ishealpix(im) ){ - html += ` - Mode: - sum - average -  sum or avg ${binblocked} pixels? - `; - html += ` - Bitpix: - -  image bitpix - `; - } else { - html += ` - Mode: - sum - -  binned tables are summed - `; - html += ` - Bitpix: - -  bitpix when binning table - `; - } - html += ` Filter: - -  event/row filter when binning table - - - BinCols: - -  alternate binning cols for table - - - CubeCol: - -  table→cube: col[:min:max][:binsiz] - - - Separate: - - -  display as separate image? - - -   -   -   - - -   - - - - - `; - $(div).html(html); - - // button and checkbox actions - $(div).find(".js9-binning-full").on("click", function () { centerBinImage(0, 0, div, display); }); - $(div).find(".js9-binning-rebin").on("click", function () { reBinImage(div, display); }); - $(div).find(".js9-binning-close").on("click", function () { if( win ){ win.close(); } }); - $(div).find(".js9-binning-sep").change(function() { that.sep = $(this).prop("checked"); }); - $(div).find(".js9-binning-sep").prop("checked", !!that.sep); - $(div).find(".js9-binning-cubecol").on("input", function () { - // cubes are generated as separate displays - // but resetting the cubecol should reset the separate mode - smode = $(this).val() ? true : !!that.sep; - $(div).find(".js9-binning-sep").prop("checked", smode); - }); - - if( im.imtab === "table" && im.hdus && im.hdus.length ){ - for(i=0; iList columns`); - for(i=0; i${s}`); - } - el.prop('selectedIndex', 0); - el.on("change", function () { - s = $(this).val().replace(/:.*/, ""); - JS9.CopyToClipboard(s, im); - el.prop('selectedIndex', 0); - }); - } - } - - // set up to rebin when is pressed, if necessary - if( JS9.globalOpts.runOnCR ){ - $(div).find(".js9BinningForm").data("enterfunc", "rebin"); - } - - // get current params - getBinParams.call(null, div, display); - } - - JS9.RegisterPlugin("FITS", "Binning", binningInit, { - menu: "view", - - winTitle: "Image Sections, with Binning and Filtering", - winResize: true, - - menuItem: "Bin/Filter/Section", - - onplugindisplay: binningInit, - onimageload: binningInit, - onimagedisplay: binningInit, - onsetpan: binningInit, - onsetzoom: binningInit, - - help: "fitsy/binning.html", - - winDims: [570, 375] - }); -}()); diff --git a/web/static/js9_old/plugins/fitsy/bzip2.js b/web/static/js9_old/plugins/fitsy/bzip2.js deleted file mode 100644 index f23d923..0000000 --- a/web/static/js9_old/plugins/fitsy/bzip2.js +++ /dev/null @@ -1,283 +0,0 @@ -/* - bzip2.js - a small bzip2 decompression implementation - - Copyright 2011 by antimatter15 (antimatter15@gmail.com) - - Based on micro-bunzip by Rob Landley (rob@landley.net). - - Copyright (c) 2011 by antimatter15 (antimatter15@gmail.com). - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, - DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, - TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH - THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -var bzip2 = {}; - -bzip2.array = function(bytes){ - var bit = 0, byte = 0; - var BITMASK = [0, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF ]; - return function(n){ - var result = 0; - while(n > 0){ - var left = 8 - bit; - if(n >= left){ - result <<= left; - result |= (BITMASK[left] & bytes[byte++]); - bit = 0; - n -= left; - }else{ - result <<= n; - result |= ((bytes[byte] & (BITMASK[n] << (8 - n - bit))) >> (8 - n - bit)); - bit += n; - n = 0; - } - } - return result - } -} - -bzip2.simple = function(bits){ - var size = bzip2.header(bits); - var all = [], chunk = [] - do{ - all = all.concat(all, chunk); - chunk = bzip2.decompress(bits, size); - }while(chunk != -1); - return all; -} - -bzip2.header = function(bits){ - if(bits(8*3) != 4348520) throw "No magic number found"; - var i = bits(8) - 48; - if(i < 1 || i > 9) throw "Not a BZIP archive"; - return i; -}; - - -//takes a function for reading the block data (starting with 0x314159265359) -//a block size (0-9) (optional, defaults to 9) -//a length at which to stop decompressing and return the output -bzip2.decompress = function(bits, size, len){ - var MAX_HUFCODE_BITS = 20; - var MAX_SYMBOLS = 258; - var SYMBOL_RUNA = 0; - var SYMBOL_RUNB = 1; - var GROUP_SIZE = 50; - - var bufsize = 100000 * size; - for(var h = '', i = 0; i < 6; i++) h += bits(8).toString(16); - if(h == "177245385090") return -1; //last block - if(h != "314159265359") throw "eek not valid bzip data"; - bits(32); //ignore CRC codes - if(bits(1)) throw "unsupported obsolete version"; - var origPtr = bits(24); - if(origPtr > bufsize) throw "Initial position larger than buffer size"; - var t = bits(16); - var symToByte = new Uint8Array(256), - symTotal = 0; - for (i = 0; i < 16; i++) { - if(t & (1 << (15 - i))) { - var k = bits(16); - for(j = 0; j < 16; j++){ - if(k & (1 << (15 - j))){ - symToByte[symTotal++] = (16 * i) + j; - } - } - } - } - - var groupCount = bits(3); - if(groupCount < 2 || groupCount > 6) throw "another error"; - var nSelectors = bits(15); - if(nSelectors == 0) throw "meh"; - var mtfSymbol = []; //TODO: possibly replace JS array with typed arrays - for(var i = 0; i < groupCount; i++) mtfSymbol[i] = i; - var selectors = new Uint8Array(32768); - - for(var i = 0; i < nSelectors; i++){ - for(var j = 0; bits(1); j++) if(j >= groupCount) throw "whoops another error"; - var uc = mtfSymbol[j]; - mtfSymbol.splice(j, 1); //this is a probably inefficient MTF transform - mtfSymbol.splice(0, 0, uc); - selectors[i] = uc; - } - - var symCount = symTotal + 2; - var groups = []; - for(var j = 0; j < groupCount; j++){ - var length = new Uint8Array(MAX_SYMBOLS), - temp = new Uint8Array(MAX_HUFCODE_BITS+1); - t = bits(5); //lengths - for(var i = 0; i < symCount; i++){ - while(true){ - if (t < 1 || t > MAX_HUFCODE_BITS) throw "I gave up a while ago on writing error messages"; - if(!bits(1)) break; - if(!bits(1)) t++; - else t--; - } - length[i] = t; - } - var minLen, maxLen; - minLen = maxLen = length[0]; - for(var i = 1; i < symCount; i++){ - if(length[i] > maxLen) maxLen = length[i]; - else if(length[i] < minLen) minLen = length[i]; - } - var hufGroup; - hufGroup = groups[j] = {}; - hufGroup.permute = new Uint32Array(MAX_SYMBOLS); - hufGroup.limit = new Uint32Array(MAX_HUFCODE_BITS + 1); - hufGroup.base = new Uint32Array(MAX_HUFCODE_BITS + 1); - hufGroup.minLen = minLen; - hufGroup.maxLen = maxLen; - var base = hufGroup.base.subarray(1); - var limit = hufGroup.limit.subarray(1); - var pp = 0; - for(var i = minLen; i <= maxLen; i++) - for(var t = 0; t < symCount; t++) - if(length[t] == i) hufGroup.permute[pp++] = t; - for(i = minLen; i <= maxLen; i++) temp[i] = limit[i] = 0; - for(i = 0; i < symCount; i++) temp[length[i]]++; - pp = t = 0; - for(i = minLen; i < maxLen; i++) { - pp += temp[i]; - limit[i] = pp - 1; - pp <<= 1; - base[i+1] = pp - (t += temp[i]); - } - limit[maxLen]=pp+temp[maxLen]-1; - base[minLen]=0; - } - var byteCount = new Uint32Array(256); - for(var i = 0; i < 256; i++) mtfSymbol[i] = i; - var runPos, count, symCount, selector; - runPos = count = symCount = selector = 0; - var buf = new Uint32Array(bufsize); - while(true){ - if(!(symCount--)){ - symCount = GROUP_SIZE - 1; - if(selector >= nSelectors) throw "meow i'm a kitty, that's an error"; - hufGroup = groups[selectors[selector++]]; - base = hufGroup.base.subarray(1); - limit = hufGroup.limit.subarray(1); - } - i = hufGroup.minLen; - j = bits(i); - while(true){ - if(i > hufGroup.maxLen) throw "rawr i'm a dinosaur"; - if(j <= limit[i]) break; - i++; - j = (j << 1) | bits(1); - } - j -= base[i]; - if(j < 0 || j >= MAX_SYMBOLS) throw "moo i'm a cow"; - var nextSym = hufGroup.permute[j]; - if (nextSym == SYMBOL_RUNA || nextSym == SYMBOL_RUNB) { - if(!runPos){ - runPos = 1; - t = 0; - } - if(nextSym == SYMBOL_RUNA) t += runPos; - else t += 2 * runPos; - runPos <<= 1; - continue; - } - if(runPos){ - runPos = 0; - if(count + t >= bufsize) throw "Boom."; - uc = symToByte[mtfSymbol[0]]; - byteCount[uc] += t; - while(t--) buf[count++] = uc; - } - if(nextSym > symTotal) break; - if(count >= bufsize) throw "I can't think of anything. Error"; - i = nextSym -1; - uc = mtfSymbol[i]; - mtfSymbol.splice(i, 1); - mtfSymbol.splice(0, 0, uc); - uc = symToByte[uc]; - byteCount[uc]++; - buf[count++] = uc; - } - if(origPtr < 0 || origPtr >= count) throw "I'm a monkey and I'm throwing something at someone, namely you"; - var j = 0; - for(var i = 0; i < 256; i++){ - k = j + byteCount[i]; - byteCount[i] = j; - j = k; - } - for(var i = 0; i < count; i++){ - uc = buf[i] & 0xff; - buf[byteCount[uc]] |= (i << 8); - byteCount[uc]++; - } - var pos = 0, current = 0, run = 0; - if(count) { - pos = buf[origPtr]; - current = (pos & 0xff); - pos >>= 8; - run = -1; - } - count = count; - - var maxindex = 10000000; - var output = []; - var bindex = maxindex + 1; - var outbuf; - - var copies, previous, outbyte; - if(!len) len = Infinity; - while(count){ - count--; - previous = current; - pos = buf[pos]; - current = pos & 0xff; - pos >>= 8; - if(run++ == 3){ - copies = current; - outbyte = previous; - current = -1; - }else{ - copies = 1; - outbyte = current; - } - while(copies--){ - if ( bindex >= maxindex ) { - if ( outbuf !== undefined ) { - output.push(outbuf); - } - outbuf = new Uint8Array(maxindex); - bindex = 0; - } - - outbuf[bindex++] = outbyte; - - if(!--len) { - outbuf = outbuf.subarray(0, bindex); - output.push(outbuf); - return output; - } - } - if(current != previous) run = 0; - - } - - outbuf = outbuf.subarray(0, bindex); - output.push(outbuf); - return output; -} diff --git a/web/static/js9_old/plugins/fitsy/fitsy.js b/web/static/js9_old/plugins/fitsy/fitsy.js deleted file mode 100644 index 59191e9..0000000 --- a/web/static/js9_old/plugins/fitsy/fitsy.js +++ /dev/null @@ -1,1247 +0,0 @@ -/*jslint evil: true, white: true, vars: true, plusplus: true, nomen: true, unparam: true, regexp: true, bitwise: true */ -/*jshint node: true, -W099: true, laxbreak:true, laxcomma:true, multistr:true, smarttabs:true */ -/*global $, alert, XMLHttpRequest - , Uint8Array, Int8Array, Uint16Array, Int16Array, Int32Array, Uint32Array, Float32Array, Float64Array, DataView, ArrayBuffer - , FileReader, Blob, Image, window, document - , Zee, Astroem, Module, pako, LZMA, bzip2 - */ - -"use strict"; - -var Fitsy; -if( Fitsy && (typeof Fitsy !== "object" || Fitsy.NAME) ){ - throw new Error("Namespace 'Fitsy' already exists"); -} - -// Create our namespace, and specify some meta-information -Fitsy = {}; -Fitsy.NAME = "Fitsy"; // The name of this namespace -Fitsy.VERSION = "1.0"; // The version of this namespace - -Fitsy.clone = function (obj) { - var copy, i, len, attr; - - // Handle the 3 simple types, and null or undefined - if (null === obj || "object" !== typeof obj) { return obj; } - - // Handle Date - if (obj instanceof Date) { - copy = new Date(); - copy.setTime(obj.getTime()); - return copy; - } - - // Handle Array - if (obj instanceof Array) { - copy = []; - for ( i = 0, len = obj.length; i < len; i++ ) { - copy[i] = Fitsy.clone(obj[i]); - } - return copy; - } - - // Handle Object - if (obj instanceof Object) { - copy = {}; - for ( attr in obj ) { - if ( obj.hasOwnProperty(attr) ) { copy[attr] = Fitsy.clone(obj[attr]); } - } - return copy; - } - - throw new Error("Unable to copy obj! Its type isn't supported."); -}; - -Fitsy.strrepeat = function (pattern, count) { - if ( count < 1 ) { return ''; } - var result = ''; - while ( count > 1 ) { - if (count & 1) { result += pattern; } - - count >>= 1; - pattern += pattern; - } - return result + pattern; -}; - -// ArrayBuffer slice not yet available everywhere ... but it should be -if (!ArrayBuffer.prototype.slice) { - ArrayBuffer.prototype.slice = function(start, end) { - var i, result, resultArray; - var that = new Uint8Array(this); - if(end === undefined){ - end = that.length; - } - result = new ArrayBuffer(end - start); - resultArray = new Uint8Array(result); - for(i = 0; i < resultArray.length; i++){ - resultArray[i] = that[i + start]; - } - return result; - }; -} - -// hostEndian: 'true' means little-endian (for use in typed array calls) -Fitsy.hostEndian = (function(){ - return new Int8Array(new Int32Array([1]).buffer)[0] === 1; -}()); - -// copy memory from one arraybuffer to another -Fitsy.memcpy = function(dst, dstOffset, src, srcOffset, length) { - var dstU8 = new Uint8Array(dst, dstOffset, length); - var srcU8 = new Uint8Array(src, srcOffset, length); - dstU8.set(srcU8); -}; - -// getDataSlice -- get a slice of data from a File reader or an Arraybuffer -// memory optimization leads to not slicing arrays, but marking the limits -Fitsy.getDataSlice = function(fits, dtype, lo, hi, func, err){ - var chunk, totalget, totalgot, maxget, get, got, left, ptr, heapptr; - var args = Array.prototype.slice.call(arguments, 6); - switch(fits.ftype){ - case "file": - if( func ){ - fits.read.onloadend = function(){ - // convert to binary string, if necessary - if( dtype === "asString" ){ - fits.result = Fitsy.getBinaryString(fits.read.result); - } else { - fits.result = fits.read.result; - } - func.apply(null, args); - }; - } - if( err ){ - fits.read.onerror = function(){ err.apply(null, args); }; - } - if( lo || hi ){ - chunk = Fitsy.getFileSlice(fits.file, lo, hi); - } else { - chunk = fits.file; - } - // always readAsArraybuffer because readAsBinaryString is not in IE11 - // binary string will be made, if necessary, after load is done - fits.read.readAsArrayBuffer(chunk); - break; - case "array": - if( dtype === "asString" ){ - // for a binary string, a slice is OK (assumed to be small) - if( lo || hi ){ - chunk = fits.file.slice(lo, hi); - } else { - // shouldn't happen! - chunk = fits.file; - } - // mimick readAsBinaryString conversion - fits.result = Fitsy.getBinaryString(chunk); - } else { - // we pass along the whole array - fits.result = fits.file; - if( lo && hi ){ - // avoid a new array.slice, it uses extra memory needlessly - // instead just mark the limits and let func use these limits - fits.rlo = lo; - fits.rhi = hi; - } else { - delete fits.rlo; - delete fits.rhi; - } - } - if( func ){ - func.apply(null, args); - } - break; - case "gzarray": - // seek to desired location - if( lo !== fits.gz.here ){ - Astroem.gzseek(fits.gz.fd, lo, 0); - fits.gz.here = lo; - } - // total number of bytes to retrieve - totalget = hi - lo; - // allocate space for retrieved data - try{ chunk = new Uint8Array(totalget); } - catch(e){ Fitsy.error("can't allocate enough memory to slice this FITS file", e); } - // max we will retrieve at any one time (minimize precious heap space) - maxget = Math.min(totalget, Fitsy.options.gzheapsize); - // allocate space on emscripten heap - ptr = Module._malloc(maxget); - // pointer into heap space to pass into routine - heapptr= new Uint8Array(Module.HEAPU8.buffer, ptr, maxget); - // this is how much we have left to retrieve - left = totalget; - // nothing retrieved yet - totalgot = 0; - // processing loop ... - while( left ){ - // how much to retrieve on this iteration - get = Math.min(left, maxget); - // try to uncompress that amount - got = Astroem.gzread(fits.gz.fd, heapptr.byteOffset, get); - // if we got anything ... - if( got > 0 ){ - // copy new data in output buffer - Fitsy.memcpy(chunk.buffer, totalgot, - Module.HEAPU8.buffer, ptr, got); - totalgot += got; - left -= got; - } else { - // we're done - left = 0; - } - } - // free up heap space - Module._free(heapptr.byteOffset); - // mark where we are in the gzip file - fits.gz.here = lo + totalgot; - // see if we got anything - if( totalgot > 0 ){ - // convert to string - if( dtype === "asString" ){ - fits.result = Fitsy.getBinaryString(chunk); - } else { - // return raw data buffer - fits.result = chunk.buffer; - } - } else { - // handle eof - fits.eof = true; - } - // call handler - if( func ){ - func.apply(null, args); - } - break; - } -}; - -// convert arraybuffer into binary string -// akin to file.readAsBinaryString for ArrayBuffers -// but also used as a replacement for readAsBinaryString (it's not in IE11) -Fitsy.getBinaryString = function(buf){ - var s = String.fromCharCode.apply(null, new Uint8Array(buf)); - return s; -}; - -// generate a table column filter from a funtools-style expression -Fitsy.tableFilter = function(hdu, filter){ - var ft1=filter; - // convert ranges: - // pi = 100:200 -> (pi >= 100 && pi <= 200) - ft1 = ft1.replace(/([a-zA-Z][a-zA-Z0-9_]*) *= *([\-]?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+\-]?[0-9]+)?) *: *([\-]?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+\-]?[0-9]+)?)/g, "($1 >= $2 && $1 <= $3)"); - // pi = 100: -> pi >= 100 - ft1 = ft1.replace(/([a-zA-Z][a-zA-Z0-9_]*) *= *([\-]?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+\-]?[0-9]+)?) *:/g, "$1 >= $2"); - // pi = :100 -> pi <= 100 - ft1 = ft1.replace(/([a-zA-Z][a-zA-Z0-9_]*) *= *:([\-]?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+\-]?[0-9]+)?)/g, "$1 <= $2"); - // lookup columns and return generated filter string - return ft1.replace(/([ (&|+\-\/*%<>=]|^)?([a-zA-Z][a-zA-Z0-9_]*)([ )&|+\-\/*%<>=]|$)/g, function (m, delim1, key, delim2) { - var s = key; - var t = key.toUpperCase(); - delim1 = delim1 || ""; - delim2 = delim2 || ""; - if ( hdu.table[s] !== undefined ) { - s = delim1 + "view.get" + hdu.table[s].type + "(vstart + i * {{table.width}} + " + hdu.table[s].offs + ")" + delim2; - } else if ( hdu.table[t] !== undefined ) { - s = delim1 + "view.get" + hdu.table[t].type + "(vstart + i * {{table.width}} + " + hdu.table[t].offs + ")" + delim2; - } else { - // couldn't find column -- that's bad - Fitsy.error("the requested column '" + key + "' is missing from this FITS table"); - } - return s; - }); -}; - -// there are different versions of file slicing ... with different syntax -Fitsy.getFileSlice = function(file, start, end){ - var blob; - if( file.slice ){ - blob = file.slice(start, end); - } else if( file.mozSlice ){ - blob = file.mozSlice(start, end); - } else if( file.webkitSlice ){ - blob = file.webkitSlice(start, end); - } - return blob; -}; - -// return true if its a number (int or float) -Fitsy.isNumber = function(s) { - return !isNaN(parseFloat(s)) && isFinite(s); -}; - -Fitsy.xtypeof = function(obj) { - return Object.prototype.toString.call(obj).slice(8, -1); -}; - -// http://stackoverflow.com/questions/3885817/how-to-check-if-a-number-is-float-or-integer -Fitsy.isFloat = function(n) { - return n === +n && n !== (n|0); -}; - -Fitsy.cardpars = function(card){ - var name, value; - if ( card[8] !== "=" ){ - return undefined; - } - name = card.slice(0, 8).trim(); - value = card.slice(10).replace(/\'/g, " ").replace(/\/.*/, "").trim(); - if( value === "T" ){ - value = true; - } else if( value === "F" ){ - value = false; - } else if( Fitsy.isNumber(value) ){ - value = parseFloat(value); - } - - return [name, value]; -}; - -Fitsy.readImageHDUDataConverter = function(fits, hdu, options, handler){ - var dv, getfunc, setfunc, tval, i, off, scale, zero, memerr; - var rstart = 0; - var littleEndian; - hdu.dmin = Number.MAX_VALUE; - hdu.dmax = Number.MIN_VALUE; - hdu.filename = fits.name; - - switch(fits.ftype){ - case "array": - if( fits.rlo ){ - // mark offsets into ArrayBuffer where this slice starts - rstart = fits.rlo; - } - break; - } - - switch( hdu.bitpix ) { - case 8: - getfunc = DataView.prototype.getUint8; - setfunc = DataView.prototype.setUint8; - try{ hdu.filedata = new Uint8Array(fits.result, rstart); } - catch(e){memerr = true;} - break; - case -16: - getfunc = DataView.prototype.getUint16; - setfunc = DataView.prototype.setUint16; - try{hdu.filedata = new Uint16Array(fits.result, rstart);} - catch(e){memerr = true;} - break; - case 16: - if ( hdu.bzero && hdu.bzero === 32768 ) { - getfunc = DataView.prototype.getInt16; - setfunc = DataView.prototype.setUint16; - try{hdu.filedata = new Uint16Array(fits.result, rstart);} - catch(e){memerr = true;} - hdu.bitpix = -16; - } else { - getfunc = DataView.prototype.getInt16; - setfunc = DataView.prototype.setInt16; - try{hdu.filedata = new Int16Array(fits.result, rstart);} - catch(e){memerr = true;} - } - break; - case 32: - getfunc = DataView.prototype.getInt32; - setfunc = DataView.prototype.setInt32; - try{hdu.filedata = new Int32Array(fits.result, rstart);} - catch(e){memerr = true;} - break; - case -32: - getfunc = DataView.prototype.getFloat32; - setfunc = DataView.prototype.setFloat32; - try{hdu.filedata = new Float32Array(fits.result, rstart);} - catch(e){memerr = true;} - break; - case -64: - getfunc = DataView.prototype.getFloat64; - setfunc = DataView.prototype.setFloat64; - try{hdu.filedata = new Float64Array(fits.result, rstart);} - catch(e){memerr = true;} - break; - default: - Fitsy.error("unsupported FITS BITPIX value: " + hdu.bitpix); - break; - } - // process memory allocation errors - if( memerr ){ - Fitsy.error("can't allocate enough memory for this FITS image"); - } - // this is where the caller (e.g. JS9) sees the data - hdu.image = hdu.filedata; - - zero = hdu.bzero || 0; - scale = hdu.bscale || 1; - - // Convert raw bytes to image data using the appropriate data view - // - dv = new DataView(fits.result); - littleEndian = hdu.converted ? Fitsy.hostEndian : false; - for(i=0, off=rstart; i < hdu.datapixls; i++, off += hdu.pixlbytes) { - tval = getfunc.call(dv, off, littleEndian) * scale + zero; - if ( !isNaN(tval) ) { - hdu.dmin = Math.min(hdu.dmin, tval); - hdu.dmax = Math.max(hdu.dmax, tval); - } - if( !hdu.converted ){ - setfunc.call(dv, off, tval, Fitsy.hostEndian); - } - } - hdu.converted = true; - - handler(hdu, options); -}; - -Fitsy.readImageHDUData = function(fits, hdu, options, handler) { - // fits.read.onloadend = function() { Fitsy.readImageHDUDataConverter(fits, hdu, options, handler); }; - // fits.read.readAsArrayBuffer(Fitsy.getFileSlice(fits.file, hdu.dataseek, hdu.dataseek + hdu.databloks*2880)); - Fitsy.getDataSlice(fits, "asArray", - hdu.dataseek, hdu.dataseek + hdu.databloks*2880, - Fitsy.readImageHDUDataConverter, Fitsy.readError, - fits, hdu, options, handler); - -}; - -var TableTFORM = { - L: { type: "UChar", size: 1 } - , X: { type: "BITS", size: 1 } - , B: { type: "UChar", size: 1 } - , I: { type: "Int16", size: 2 } - , J: { type: "Int32", size: 4 } - , K: { type: "Int64", size: 8 } - , A: { type: "Char", size: 1 } - , E: { type: "Float32", size: 4 } - , D: { type: "Float64", size: 8 } - , C: { type: "Complex64", size: 8 } - , M: { type: "Complex128", size:16 } - , P: { type: "Pointer32", size: 8 } - , Q: { type: "Pointer64", size:16 } -}; - -Fitsy.readError = function(e) { - Fitsy.error("an error occurred while reading the FITS file. (Often this is due to the browser running out of memory.)", e); -}; - -// signal waiting or done waiting -Fitsy.waiting = function(mode){ - if( Fitsy.options.waiting ){ - Fitsy.options.waiting(mode); - } -}; - -// error handler -Fitsy.error = function(s, e) { - Fitsy.waiting(false); - if( Fitsy.options.error ){ - Fitsy.options.error(s, e); - } else { - throw new Error(s); - } -}; - -Fitsy.readForDeCompress = function(fits) { - - var data = new Uint8Array(fits.result); - - if ( data[0] === 0xfd && data[1] === 0x37 && data[2] === 0x7a && data[3] === 0x58 ) { // lzip - if ( window.LZMA !== undefined ) { - - LZMA.decompress(data, function(result) { - fits.file = new Blob([result]); - - // fits.read.onloadend = function(){ Fitsy.readHeaderBlock(fits); }; - // fits.read.onerror = function(){ Fitsy.readError(fits); }; - // fits.read.readAsBinaryString(Fitsy.getFileSlice(fits.file, 0, 2880)); - Fitsy.getDataSlice(fits, "asString", 0, 2880, - Fitsy.readHeaderBlock, Fitsy.readError, - fits); - - - }); - - return; - } - - Fitsy.error("lzip support not available"); - } else if ( data[0] === 0x42 && data[1] === 0x5a ) { // bzip2 - if ( window.bzip2 !== undefined ) { - data = bzip2.simple(bzip2.array(data)); - fits.file = new Blob(data); - } else { - Fitsy.error("bzip2 support not available"); - } - } else if ( data[0] === 0x1f && data[1] === 0x8B ) { // gzip - // we are done with these ... so tell garbage collector - delete fits.file; - delete fits.hdu; - fits.hdu = []; - if ( window.hasOwnProperty("Astroem") ) { - if( data.buffer.byteLength > Fitsy.options.gzfilesize ) { - // new gzip array object - fits.ftype = "gzarray"; - fits.gz = {}; - // temp file in the emscripten file system mapped to the data - fits.gz.arrfile = Astroem.arrfile(fits.name, data); - // open the gzip'ed file - fits.gz.fd = Astroem.gzopen(fits.gz.arrfile.path, "rb"); - // reset file position - fits.gz.here = 0; - // don't know file size, we'll rely on eof - fits.size = -1; - fits.eof = false; - } else { - data = Astroem.decompress(data); - // fits.file = new Blob([data]); - fits.ftype = "array"; - fits.file = data.buffer; - fits.size = fits.file.byteLength; - } - } else if ( window.hasOwnProperty("Zee") ) { - data = Zee.decompress(data); - // fits.file = new Blob([data]); - fits.ftype = "array"; - fits.file = data.buffer; - fits.size = fits.file.byteLength; - } else if ( window.hasOwnProperty("pako") ) { - data = pako.inflate(data); - // fits.file = new Blob([data]); - fits.ftype = "array"; - fits.file = data.buffer; - fits.size = fits.file.byteLength; - } else { - Fitsy.error("gzip support not available"); - } - } else { - - Fitsy.error("not a recognized FITS file (compressed or otherwise): " + fits.name); - - } - - // fits.read.onloadend = function(){ Fitsy.readHeaderBlock(fits); }; - // fits.read.onerror = function(){ Fitsy.readError(fits); }; - // fits.read.readAsBinaryString(Fitsy.getFileSlice(fits.file, 0, 2880)); - Fitsy.getDataSlice(fits, "asString", 0, 2880, - Fitsy.readHeaderBlock, Fitsy.readError, - fits); -}; - -Fitsy.readHeaderBlock = function(fits) { - var i, off, card, pars; - var end = 0; - - // if we hit EOF on last read (usually a gzip'ed file), call the handler - if( fits.eof ){ - // call handler - Fitsy.waiting(false); - fits.handler(fits); - } - - if( !fits.hdu[fits.nhdu] ){ - fits.hdu[fits.nhdu] = {}; - } - var hdu = fits.hdu[fits.nhdu]; - if ( ! hdu.card ) { - // Mark offset in file where header starts. - hdu.headseek = fits.here; - hdu.card = []; - hdu.head = {}; - hdu.ncard = 0; - - hdu.fits = fits; - hdu.nth = fits.nhdu; - - if ( fits.here === 0 && fits.result.slice(0, 6) !== "SIMPLE" ) { - // fits.read.onloadend=function(){ Fitsy.readForDeCompress(fits); }; - // fits.read.readAsArrayBuffer(fits.file); - - // read entire compressed file and ready it for decompression - Fitsy.waiting(true); - // OMG: a delay is required to ensure cursor gets set to waiting - setTimeout(function() { - Fitsy.getDataSlice(fits, "asArray", null, null, - Fitsy.readForDeCompress, Fitsy.readError, - fits); - }, Fitsy.options.wtimeout); - - return; - } - } - if ( fits.here === 0 ) { - if ( fits.result.slice(0, 6) !== "SIMPLE" ) { - return; - } - } else { - if ( hdu.ncard === 0 && fits.result.slice(0, 8) !== "XTENSION" ) { - return; - } - } - - // Read the block advance the file pointer. - fits.here += 2880; - for ( off=0; off < 2880; hdu.ncard++, off += 80 ) { - card = fits.result.slice(off, off+80); - hdu.card[hdu.ncard] = card; - if ( card.slice(0, 8) === "END " ) { - end = 1; - break; - } - pars = Fitsy.cardpars(card); - if ( pars !== undefined ) { - hdu.head[pars[0]] = pars[1]; - } - } - if ( end ) { - hdu.axis = []; - hdu.dataseek = fits.here; // Mark offset in file where data starts. - hdu.naxis = hdu.head.NAXIS; - hdu.bitpix = hdu.head.BITPIX; - hdu.bscale = hdu.head.BSCALE; - hdu.bzero = hdu.head.BZERO; - hdu.pixlbytes = Math.abs(hdu.bitpix)/8; - - if ( hdu.naxis !== 0 ) { - hdu.datapixls = 1; - } else { - hdu.datapixls = 0; - } - - for(i=1; i <= hdu.naxis; i++){ - hdu.axis[i] = hdu.head["NAXIS" + i]; - hdu.datapixls *= hdu.axis[i]; - } - hdu.databytes = hdu.datapixls * hdu.pixlbytes; - hdu.databloks = ((hdu.databytes+(2880-1))/2880) | 0; // |0 is truncate. - fits.here += hdu.databloks * 2880; - fits.nhdu++; - - hdu.type = "image"; - - hdu.filehead = hdu.head; - hdu.filecard = hdu.card; - - if ( hdu.head.XTENSION === "BINTABLE" - || hdu.head.XTENSION === "A3DTABLE" - || hdu.head.XTENSION === "3DTABLE" ) { - - hdu.type = "table"; - - hdu.table = {}; - - hdu.width = hdu.axis[1]; - hdu.length = hdu.axis[2]; - - var form, rept, type, size, width, offs = 0; - - for ( i = 1; i <= hdu.head.TFIELDS; i++ ) { - form = hdu.head["TFORM"+i].match(/([0-9]*)([LXBIJKAEDCMPQ])/); - - rept = form[1] === "" ? 1 : +form[1]; - type = TableTFORM[form[2]].type; - size = TableTFORM[form[2]].size; - width = rept * size; - - hdu.table[hdu.head["TTYPE"+i]] = { - type: type - , size: size, width: width , rept: rept, offs: offs - , unit: hdu.head["TUNIT"+i], disp: hdu.head["TDISP"+i] - , zero: hdu.head["TZERO"+i], scale: hdu.head["TSCAL"+i] - - , min: hdu.head["TDMIN"+i] || hdu.head["TLMIN"+i] - , max: hdu.head["TDMAX"+i] || hdu.head["TLMAX"+i] - , ith: i - }; - offs += width; - } - } - } - if ( (fits.here >= fits.size) && (fits.size !== -1) ) { // EOF? hand the fits file to the handler function - Fitsy.waiting(false); - fits.handler(fits); - } else { // Or, read the next header block - // fits.read.readAsBinaryString(Fitsy.getFileSlice(fits.file, - // fits.here, - // fits.here+2880)); - Fitsy.getDataSlice(fits, "asString", fits.here, fits.here + 2880, - Fitsy.readHeaderBlock, Fitsy.readError, - fits); - } -}; - -Fitsy.fitsopen = function(file, handler) { - var fits = {}; - fits.hdu = []; - fits.read = new FileReader(); - fits.handler = handler; // User callback to complete delivery of FITS data. - if( !file ){ - Fitsy.readError(null); - } - fits.name = file.name; - fits.size = file.size; - fits.file = file; - fits.ftype = "file"; - fits.nhdu = 0; - fits.here = 0; - - // fits.read.onloadend = function(){ Fitsy.readHeaderBlock(fits); }; - // fits.read.readAsBinaryString(Fitsy.getFileSlice(fits.file, 0, 2880)); - Fitsy.getDataSlice(fits, "asString", 0, 2880, - Fitsy.readHeaderBlock, Fitsy.readError, - fits); -}; - - -Fitsy.template = function (str, data) { - - return str.replace(/\{\{([a-zA-Z0-9_.]+)(%([sfd])(\.([0-9]+))?)?\}\}/g, - function (m,key, x, type, y, prec) { - var i, val = data; - - key = key.split("."); - - for ( i = 0; i < key.length; i++ ) { - if ( val.hasOwnProperty(key[i]) ) { val = val[key[i]]; - } else { return ""; } - } - - switch ( type ) { - case "s": break; - case "f": val = val.toFixed(prec); break; - case "d": val = val.toFixed(0); break; - } - - return val; - } - ); -}; - -Fitsy.BinTableTemplate = " \n\ - return function (view, vstart, image, length) { \n\ - var i, x, y; \n\ - \n\ - var xoff = ((-( {{table.x.range}}/2 + ({{table.cx}}-{{table.x.range}}/2 )) {{BinText}}) | 0)\n\ - + (( {{image.nx}}/2 ) | 0); \n\ - var yoff = ((-( {{table.y.range}}/2 + ({{table.cy}}-{{table.x.range}}/2 )) {{BinText}}) | 0)\n\ - + (( {{image.ny}}/2 ) | 0); \n\ - \n\ - for (i = 0; i < length; i++) { \n\ - if( {{FilterText}} ){ \n\ - x = view.get{{table.x.type}}(vstart + i * {{table.width}} + {{table.x.offs}}); \n\ - y = view.get{{table.y.type}}(vstart + i * {{table.width}} + {{table.y.offs}}); \n\ - \n\ - x = (((x - {{table.x.min}}) {{BinText}}) | 0) + xoff; \n\ - y = (((y - {{table.y.min}}) {{BinText}}) | 0) + yoff; \n\ - \n\ - if (x >= 0 && x < {{image.nx}} && y >= 0 && y < {{image.ny}}) { \n\ - image.data[y * {{image.width}} + x] += 1; \n\ - } \n\ - } \n\ - } \n\ -}"; - -Fitsy.readTableHDUDataBinner = function (fits, hdu, nev, options, handler) { - var i, binner, BinText, FilterTemplate; - var FilterText = "true"; - var vstart = 0; - var opttable = options.table || Fitsy.options.table; - - if( !hdu.nev ){ - - hdu.filename = fits.name; - - if( hdu.image && (hdu.image.length >= (opttable.nx * opttable.ny)) ){ - for(i=0; i 0 ) { - if ( hdu.head.SIMPLE || hdu.head.XTENSION === "IMAGE" ) { - Fitsy.readImageHDUData(fits, hdu, options, handler); - break; - } - if ( hdu.table && hdu.head.EXTNAME === events ) { - Fitsy.readTableHDUData(fits, hdu, options, handler); - break; - } - } - } -}; - -Fitsy.handleFITSFile = function(file, options, handler) { // Read the headers. - - if ( options === undefined ) { options = Fitsy.options; } - if ( handler === undefined ) { handler = Fitsy.handler; } - - Fitsy.fitsopen(file, function (fits) { Fitsy.defaultDispatchFITS(fits, options, handler); }); -}; - - -// set default handler for data handler -// -Fitsy.datahandler = function(handler) { Fitsy.handler = handler; }; -Fitsy.dataoptions = function(options) { Fitsy.options = options; }; - -Fitsy.dragenter = function(id, e) { e.stopPropagation(); e.preventDefault(); }; -Fitsy.dragover = function(id, e) { e.stopPropagation(); e.preventDefault(); }; -Fitsy.dragexit = function(id, e) { e.stopPropagation(); e.preventDefault(); }; -Fitsy.dragdrop = function(id, e) { e.stopPropagation(); e.preventDefault(); - - Fitsy.onFile(e.target.files || e.dataTransfer.files, { display: id }); -}; - - -Fitsy.onFile = function(files, options, handler) { - var i; - - for ( i = 0; i < files.length; i++ ) { - if ( files[i].type !== "image/fits" && files[i].type.indexOf("image/") !== -1 ) { - Fitsy.handleImageFile(files[i], options, handler); - } else { - try{ Fitsy.handleFITSFile(files[i], options, handler); } - catch(e){ Fitsy.error("could not load FITS file: " + - files[i].name); } - } - } -}; - - -Fitsy.options = { - maxev: 20480, - gzfilesize: 100 * 1024 * 1024, - gzheapsize: 4 * 1024 * 1024, - xtimeout: 10000, - wtimeout: 100, - table: { nx: 1024, ny: 1024, bin: 1 - , xcol: [ "X", "x" ] - , ycol: [ "Y", "y" ] } -}; - -Fitsy.fetchURL = function(name, url, options, handler) { - var xhr = new XMLHttpRequest(); - - if ( url === undefined ) { - url = name; - name = /([^\\\/]+)$/.exec(url)[1]; - } - options = options || Fitsy.options; - - xhr.open('GET', url, true); - xhr.responseType = 'blob'; - - xhr.onload = function(e) { - var blob; - if ( this.readyState === 4 ) { - if ( this.status === 200 || this.status === 0 ) { - blob = new Blob([this.response]); - blob.name = name; - - if ( options.messages ) { options.messages(""); } - - Fitsy.onFile([blob], options, handler); - } else if( this.status === 404 ) { - Fitsy.error("could not find " + url); - } else { - Fitsy.error("can't load " + url + " (" + this.status + ")"); - } - } - }; - - xhr.onerror = function(e) { - Fitsy.error("can't load " + url); - }; - - xhr.onreadystatechange=function() { - // any response from the server will do - if( xhr.xtimeout ){ - clearTimeout(xhr.xtimeout); - delete xhr.xtimeout; - } - }; - - if ( options.messages ){ - xhr.addEventListener("progress", function(e) { options.messages("progress " + e.loaded.toString()); }); - xhr.addEventListener("error" , function(e) { options.messages("error loading FITS file"); }); - xhr.addEventListener("abort" , function(e) { options.messages("abort while loading FITS file"); }); - } - - try{ xhr.send(); } - catch(e){ Fitsy.error("request to load " + url + " failed", e); } - - // set a timeout to catch when Mac ignores the connect request entirely - xhr.xtimeout=setTimeout(function(){ - Fitsy.error("timeout while waiting for response from server; " + - url + " might not exist"); - }, Fitsy.options.xtimeout); -}; - -Fitsy.handleImageFile = function (file, options, handler) { - if ( options === undefined ) { options = Fitsy.options; } - if ( handler === undefined ) { handler = Fitsy.handler; } - - var reader = new FileReader(); - reader.onload = function ( ev ) { - var img = new Image(); - img.src = ev.target.result; - img.onload = function() { - var x, y, i = 0, brightness; - - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - var h = img.height; - var w = img.width; - - canvas.width = w; - canvas.height = h; - - ctx.drawImage(img, 0, 0); - - var data = ctx.getImageData(0, 0, w, h).data; - var gray = new Float32Array(h*w); - - for ( y = 0; y < h; y++ ) { - for ( x = 0; x < w; x++ ) { - brightness = 0.299 * data[i] + 0.587 * data[i + 1] + 0.114 * data[i + 2]; // NTSC - - gray[(h-y)*w+x] = brightness; - i += 4; - } - } - - var hdu = { head: {}, name: file.name - , filedata: gray, image: gray, naxis: 2, axis: [0, w, h], bitpix: -32 }; - - hdu.dmin = Number.MAX_VALUE; - hdu.dmax = Number.MIN_VALUE; - - for ( i = 0; i < h*w; i++ ) { - hdu.dmin = Math.min(hdu.dmin, hdu.image[i]); - hdu.dmax = Math.max(hdu.dmax, hdu.image[i]); - } - - handler(hdu, options); - }; - }; - reader.readAsDataURL(file); -}; - diff --git a/web/static/js9_old/plugins/fitsy/lzma_worker.js b/web/static/js9_old/plugins/fitsy/lzma_worker.js deleted file mode 100644 index 0720dd3..0000000 --- a/web/static/js9_old/plugins/fitsy/lzma_worker.js +++ /dev/null @@ -1,3934 +0,0 @@ -var LZMA = (function () { - var action_compress = 1, - action_decompress = 2, - action_progress = 3; - - function update_progress(percent, callback_num) { - ///TODO: Calculate ETA. - postMessage({ - action: action_progress, - callback_num: callback_num, - result: percent - }); - } - - var $moduleName, $moduleBase; - - var _, - N8000000000000000_longLit = [0, -9223372036854775808], - N1_longLit = [4294967295, -4294967296], - P0_longLit = [0, 0], - P1_longLit = [1, 0], - P4_longLit = [4, 0], - P1000_longLit = [4096, 0], - Pffffff_longLit = [16777215, 0], - P1000000_longLit = [16777216, 0], - Pff000000_longLit = [4278190080, 0], - Pffffffff_longLit = [4294967295, 0], - P7fffffffffffffff_longLit = [4294967295, 9223372032559808512]; - - function getClass_18() { - return Ljava_lang_Object_2_classLit; - } - - function Object_0() { - } - - _ = Object_0.prototype = {}; - _.getClass$ = getClass_18; - _.typeMarker$ = nullMethod; - _.typeId$ = 1; - function getClass_22() { - return Ljava_lang_Throwable_2_classLit; - } - - function Throwable() { - } - - _ = Throwable.prototype = new Object_0(); - _.getClass$ = getClass_22; - _.typeId$ = 3; - _.detailMessage = null; - function getClass_13() { - return Ljava_lang_Exception_2_classLit; - } - - function Exception() { - } - - _ = Exception.prototype = new Throwable(); - _.getClass$ = getClass_13; - _.typeId$ = 4; - function $RuntimeException(this$static, message) { - this$static.detailMessage = message; - return this$static; - } - - function getClass_19() { - return Ljava_lang_RuntimeException_2_classLit; - } - - function RuntimeException() { - } - - _ = RuntimeException.prototype = new Exception(); - _.getClass$ = getClass_19; - _.typeId$ = 5; - function $JavaScriptException(this$static, e) { - return this$static; - } - - function getClass_0() { - return Lcom_google_gwt_core_client_JavaScriptException_2_classLit; - } - - function JavaScriptException() { - } - - _ = JavaScriptException.prototype = new RuntimeException(); - _.getClass$ = getClass_0; - _.typeId$ = 6; - function $append(a, x) { - a[a.explicitLength++] = x; - } - - function $appendNonNull(a, x) { - a[a.explicitLength++] = x; - } - - function $toString(a) { - var s_0, s; - s_0 = (s = a.join('') , a.length = a.explicitLength = 0 , s); - a[a.explicitLength++] = s_0; - return s_0; - } - - function createFromSeed(seedType, length_0) { - var array = new Array(length_0); - if (seedType > 0) { - var value = [null, 0, false, [0, 0]][seedType]; - for (var i = 0; i < length_0; ++i) { - array[i] = value; - } - } - return array; - } - - function getClass_2() { - return this.arrayClass$; - } - - function initDim(arrayClass, typeId, queryId, length_0, seedType) { - var result; - result = createFromSeed(seedType, length_0); - $clinit_4(); - wrapArray(result, expandoNames_0, expandoValues_0); - result.arrayClass$ = arrayClass; - result.typeId$ = typeId; - result.queryId$ = queryId; - return result; - } - - function initValues(arrayClass, typeId, queryId, array) { - $clinit_4(); - wrapArray(array, expandoNames_0, expandoValues_0); - array.arrayClass$ = arrayClass; - array.typeId$ = typeId; - array.queryId$ = queryId; - return array; - } - - function setCheck(array, index, value) { - if (value != null) { - if (array.queryId$ > 0 && !canCastUnsafe(value.typeId$, array.queryId$)) { - throw new ArrayStoreException(); - } - if (array.queryId$ < 0 && (value.typeMarker$ == nullMethod || value.typeId$ == 2)) { - throw new ArrayStoreException(); - } - } - return array[index] = value; - } - - function Array_0() { - } - - _ = Array_0.prototype = new Object_0(); - _.getClass$ = getClass_2; - _.typeId$ = 0; - _.arrayClass$ = null; - _.length = 0; - _.queryId$ = 0; - function $clinit_4() { - $clinit_4 = nullMethod; - expandoNames_0 = []; - expandoValues_0 = []; - initExpandos(new Array_0(), expandoNames_0, expandoValues_0); - } - - function initExpandos(protoType, expandoNames, expandoValues) { - var i = 0, value; - for (var name_0 in protoType) { - if (value = protoType[name_0]) { - expandoNames[i] = name_0; - expandoValues[i] = value; - ++i; - } - } - } - - function wrapArray(array, expandoNames, expandoValues) { - $clinit_4(); - for (var i = 0, c = expandoNames.length; i < c; ++i) { - array[expandoNames[i]] = expandoValues[i]; - } - } - - var expandoNames_0, expandoValues_0; - function canCast(srcId, dstId) { - return srcId && !!typeIdArray[srcId][dstId]; - } - - function canCastUnsafe(srcId, dstId) { - return srcId && typeIdArray[srcId][dstId]; - } - - function dynamicCast(src, dstId) { - if (src != null && !canCastUnsafe(src.typeId$, dstId)) { - throw new ClassCastException(); - } - return src; - } - - function instanceOf(src, dstId) { - return src != null && canCast(src.typeId$, dstId); - } - - function round_int(x) { - return ~~Math.max(Math.min(x, 2147483647), -2147483648); - } - - var typeIdArray = [ - {}, - {}, - {1:1}, - {2:1}, - {2:1}, - {2:1}, - {2:1}, - {2:1, 10:1}, - {2:1}, - {2:1}, - {2:1}, - {2:1}, - {2:1}, - {2:1, 11:1}, - {2:1}, - {2:1}, - {2:1}, - {4:1}, - {5:1}, - {6:1}, - {7:1}, - {8:1}, - {9:1} - ]; - - function caught(e) { - if (e != null && canCast(e.typeId$, 2)) { - return e; - } - return $JavaScriptException(new JavaScriptException(), e); - } - - function add(a, b) { - var newHigh, newLow; - newHigh = a[1] + b[1]; - newLow = a[0] + b[0]; - return create(newLow, newHigh); - } - - function addTimes(accum, a, b) { - if (a == 0) { - return accum; - } - if (b == 0) { - return accum; - } - return add(accum, create(a * b, 0)); - } - - function and(a, b) { - return makeFromBits(~~Math.max(Math.min(a[1] / 4294967296, 2147483647), -2147483648) & ~~Math.max(Math.min(b[1] / 4294967296, 2147483647), -2147483648), lowBits_0(a) & lowBits_0(b)); - } - - function compare(a, b) { - var nega, negb; - if (a[0] == b[0] && a[1] == b[1]) { - return 0; - } - nega = a[1] < 0; - negb = b[1] < 0; - if (nega && !negb) { - return -1; - } - if (!nega && negb) { - return 1; - } - if (sub(a, b)[1] < 0) { - return -1; - } - else { - return 1; - } - } - - function create(valueLow, valueHigh) { - var diffHigh, diffLow; - valueHigh %= 1.8446744073709552E19; - valueLow %= 1.8446744073709552E19; - diffHigh = valueHigh % 4294967296; - diffLow = Math.floor(valueLow / 4294967296) * 4294967296; - valueHigh = valueHigh - diffHigh + diffLow; - valueLow = valueLow - diffLow + diffHigh; - while (valueLow < 0) { - valueLow += 4294967296; - valueHigh -= 4294967296; - } - while (valueLow > 4294967295) { - valueLow -= 4294967296; - valueHigh += 4294967296; - } - valueHigh = valueHigh % 1.8446744073709552E19; - while (valueHigh > 9223372032559808512) { - valueHigh -= 1.8446744073709552E19; - } - while (valueHigh < -9223372036854775808) { - valueHigh += 1.8446744073709552E19; - } - return [valueLow, valueHigh]; - } - - function div(a, b) { - var approx, deltaRem, deltaResult, halfa, rem, result; - if (b[0] == 0 && b[1] == 0) { - throw $ArithmeticException(new ArithmeticException(), '/ by zero'); - } - if (a[0] == 0 && a[1] == 0) { - return $clinit_10() , ZERO; - } - if (eq(a, ($clinit_10() , MIN_VALUE))) { - if (eq(b, ONE) || eq(b, NEG_ONE)) { - return MIN_VALUE; - } - halfa = shr(a, 1); - approx = shl(div(halfa, b), 1); - rem = sub(a, mul(b, approx)); - return add(approx, div(rem, b)); - } - if (eq(b, MIN_VALUE)) { - return ZERO; - } - if (a[1] < 0) { - if (b[1] < 0) { - return div(neg(a), neg(b)); - } else { - return neg(div(neg(a), b)); - } - } - if (b[1] < 0) { - return neg(div(a, neg(b))); - } - result = ZERO; - rem = a; - while (compare(rem, b) >= 0) { - deltaResult = fromDouble(Math.floor(toDoubleRoundDown(rem) / toDoubleRoundUp(b))); - if (deltaResult[0] == 0 && deltaResult[1] == 0) { - deltaResult = ONE; - } - deltaRem = mul(deltaResult, b); - result = add(result, deltaResult); - rem = sub(rem, deltaRem); - } - return result; - } - - function eq(a, b) { - return a[0] == b[0] && a[1] == b[1]; - } - - function fromDouble(value) { - if (isNaN(value)) { - return $clinit_10() , ZERO; - } - if (value < -9223372036854775808) { - return $clinit_10() , MIN_VALUE; - } - if (value >= 9223372036854775807) { - return $clinit_10() , MAX_VALUE; - } - if (value > 0) { - return create(Math.floor(value), 0); - } else { - return create(Math.ceil(value), 0); - } - } - - function fromInt(value) { - var rebase, result; - if (value > -129 && value < 128) { - rebase = value + 128; - result = ($clinit_9() , boxedValues)[rebase]; - if (result == null) { - result = boxedValues[rebase] = internalFromInt(value); - } - return result; - } - return internalFromInt(value); - } - - function internalFromInt(value) { - if (value >= 0) { - return [value, 0]; - } else { - return [value + 4294967296, -4294967296]; - } - } - - function lowBits_0(a) { - if (a[0] >= 2147483648) { - return ~~Math.max(Math.min(a[0] - 4294967296, 2147483647), -2147483648); - } else { - return ~~Math.max(Math.min(a[0], 2147483647), -2147483648); - } - } - - function makeFromBits(highBits, lowBits) { - var high, low; - high = highBits * 4294967296; - low = lowBits; - if (lowBits < 0) { - low += 4294967296; - } - return [low, high]; - } - - function mul(a, b) { - var a1, a2, a3, a4, b1, b2, b3, b4, res; - if (a[0] == 0 && a[1] == 0) { - return $clinit_10() , ZERO; - } - if (b[0] == 0 && b[1] == 0) { - return $clinit_10() , ZERO; - } - if (eq(a, ($clinit_10() , MIN_VALUE))) { - return multByMinValue(b); - } - if (eq(b, MIN_VALUE)) { - return multByMinValue(a); - } - if (a[1] < 0) { - if (b[1] < 0) { - return mul(neg(a), neg(b)); - } else { - return neg(mul(neg(a), b)); - } - } - if (b[1] < 0) { - return neg(mul(a, neg(b))); - } - if (compare(a, TWO_PWR_24) < 0 && compare(b, TWO_PWR_24) < 0) { - return create((a[1] + a[0]) * (b[1] + b[0]), 0); - } - a3 = a[1] % 281474976710656; - a4 = a[1] - a3; - a1 = a[0] % 65536; - a2 = a[0] - a1; - b3 = b[1] % 281474976710656; - b4 = b[1] - b3; - b1 = b[0] % 65536; - b2 = b[0] - b1; - res = ZERO; - res = addTimes(res, a4, b1); - res = addTimes(res, a3, b2); - res = addTimes(res, a3, b1); - res = addTimes(res, a2, b3); - res = addTimes(res, a2, b2); - res = addTimes(res, a2, b1); - res = addTimes(res, a1, b4); - res = addTimes(res, a1, b3); - res = addTimes(res, a1, b2); - res = addTimes(res, a1, b1); - return res; - } - - function multByMinValue(a) { - if ((lowBits_0(a) & 1) == 1) { - return $clinit_10() , MIN_VALUE; - } else { - return $clinit_10() , ZERO; - } - } - - function neg(a) { - var newHigh, newLow; - if (eq(a, ($clinit_10() , MIN_VALUE))) { - return MIN_VALUE; - } - newHigh = -a[1]; - newLow = -a[0]; - if (newLow > 4294967295) { - newLow -= 4294967296; - newHigh += 4294967296; - } - if (newLow < 0) { - newLow += 4294967296; - newHigh -= 4294967296; - } - return [newLow, newHigh]; - } - - function pwrAsDouble(n) { - if (n <= 30) { - return 1 << n; - } else { - return pwrAsDouble(30) * pwrAsDouble(n - 30); - } - } - - function shl(a, n) { - var diff, newHigh, newLow, twoToN; - n &= 63; - if (eq(a, ($clinit_10() , MIN_VALUE))) { - if (n == 0) { - return a; - } else { - return ZERO; - } - } - if (a[1] < 0) { - return neg(shl(neg(a), n)); - } - twoToN = pwrAsDouble(n); - newHigh = a[1] * twoToN % 1.8446744073709552E19; - newLow = a[0] * twoToN; - diff = newLow - newLow % 4294967296; - newHigh += diff; - newLow -= diff; - if (newHigh >= 9223372036854775807) { - newHigh -= 1.8446744073709552E19; - } - return [newLow, newHigh]; - } - - function shr(a, n) { - var newHigh, newLow, shiftFact; - n &= 63; - shiftFact = pwrAsDouble(n); - newHigh = a[1] / shiftFact; - newLow = Math.floor(a[0] / shiftFact); - return create(newLow, newHigh); - } - - function shru(a, n) { - var sr; - n &= 63; - sr = shr(a, n); - if (a[1] < 0) { - sr = add(sr, shl(($clinit_10() , TWO), 63 - n)); - } - return sr; - } - - function sub(a, b) { - var newHigh, newLow; - newHigh = a[1] - b[1]; - newLow = a[0] - b[0]; - return create(newLow, newHigh); - } - - function toDoubleRoundDown(a) { - var diff, magnitute, toSubtract; - magnitute = round_int(Math.log(a[1]) / ($clinit_10() , LN_2)); - if (magnitute <= 48) { - return a[1] + a[0]; - } else { - diff = magnitute - 48; - toSubtract = (1 << diff) - 1; - return a[1] + (a[0] - toSubtract); - } - } - - function toDoubleRoundUp(a) { - var diff, magnitute, toAdd; - magnitute = round_int(Math.log(a[1]) / ($clinit_10() , LN_2)); - if (magnitute <= 48) { - return a[1] + a[0]; - } else { - diff = magnitute - 48; - toAdd = (1 << diff) - 1; - return a[1] + (a[0] + toAdd); - } - } - - function toString_0(a) { - var digits, rem, remDivTenPower, res, tenPowerLong, zeroesNeeded; - if (a[0] == 0 && a[1] == 0) { - return '0'; - } - if (eq(a, ($clinit_10() , MIN_VALUE))) { - return '-9223372036854775808'; - } - if (a[1] < 0) { - return '-' + toString_0(neg(a)); - } - rem = a; - res = ''; - while (!(rem[0] == 0 && rem[1] == 0)) { - tenPowerLong = fromInt(1000000000); - remDivTenPower = div(rem, tenPowerLong); - digits = '' + lowBits_0(sub(rem, mul(remDivTenPower, tenPowerLong))); - rem = remDivTenPower; - if (!(rem[0] == 0 && rem[1] == 0)) { - zeroesNeeded = 9 - digits.length; - for (; zeroesNeeded > 0; --zeroesNeeded) { - digits = '0' + digits; - } - } - res = digits + res; - } - return res; - } - - function $clinit_9() { - $clinit_9 = nullMethod; - boxedValues = initDim(_3_3D_classLit, 0, 9, 256, 0); - } - - var boxedValues; - function $clinit_10() { - $clinit_10 = nullMethod; - LN_2 = Math.log(2); - MAX_VALUE = P7fffffffffffffff_longLit; - MIN_VALUE = N8000000000000000_longLit; - NEG_ONE = fromInt(-1); - ONE = fromInt(1); - TWO = fromInt(2); - TWO_PWR_24 = P1000000_longLit; - ZERO = fromInt(0); - } - - var LN_2, MAX_VALUE, MIN_VALUE, NEG_ONE, ONE, TWO, TWO_PWR_24, ZERO; - function getClass_6() { - return Ljava_io_InputStream_2_classLit; - } - - function InputStream() { - } - - _ = InputStream.prototype = new Object_0(); - _.getClass$ = getClass_6; - _.typeId$ = 0; - function $ByteArrayInputStream(this$static, buf) { - $ByteArrayInputStream_0(this$static, buf, 0, buf.length); - return this$static; - } - - function $ByteArrayInputStream_0(this$static, buf, off, len) { - this$static.buf = buf; - this$static.pos = off; - this$static.count = off + len; - if (this$static.count > buf.length) - this$static.count = buf.length; - return this$static; - } - - function $read(this$static) { - if (this$static.pos >= this$static.count) - return -1; - return this$static.buf[this$static.pos++] & 255; - } - - function $read_0(this$static, buf, off, len) { - if (this$static.pos >= this$static.count) - return -1; - len = min(len, this$static.count - this$static.pos); - arraycopy(this$static.buf, this$static.pos, buf, off, len); - this$static.pos += len; - return len; - } - - function getClass_3() { - return Ljava_io_ByteArrayInputStream_2_classLit; - } - - function ByteArrayInputStream() { - } - - _ = ByteArrayInputStream.prototype = new InputStream(); - _.getClass$ = getClass_3; - _.typeId$ = 0; - _.buf = null; - _.count = 0; - _.pos = 0; - function getClass_7() { - return Ljava_io_OutputStream_2_classLit; - } - - function OutputStream() { - } - - _ = OutputStream.prototype = new Object_0(); - _.getClass$ = getClass_7; - _.typeId$ = 0; - function $ByteArrayOutputStream(this$static) { - this$static.buf = initDim(_3B_classLit, 0, -1, 32, 1); - return this$static; - } - - function $ensureCapacity(this$static, len) { - var newbuf; - if (len <= this$static.buf.length) - return; - len = max(len, this$static.buf.length * 2); - newbuf = initDim(_3B_classLit, 0, -1, len, 1); - arraycopy(this$static.buf, 0, newbuf, 0, this$static.buf.length); - this$static.buf = newbuf; - } - - function $toByteArray(this$static) { - var data; - data = initDim(_3B_classLit, 0, -1, this$static.count, 1); - arraycopy(this$static.buf, 0, data, 0, this$static.count); - return data; - } - - function $write(this$static, b) { - $ensureCapacity(this$static, this$static.count + 1); - this$static.buf[this$static.count++] = b << 24 >> 24; - } - - function $write_0(this$static, buf, off, len) { - $ensureCapacity(this$static, this$static.count + len); - arraycopy(buf, off, this$static.buf, this$static.count, len); - this$static.count += len; - } - - function getClass_4() { - return Ljava_io_ByteArrayOutputStream_2_classLit; - } - - function ByteArrayOutputStream() { - } - - _ = ByteArrayOutputStream.prototype = new OutputStream(); - _.getClass$ = getClass_4; - _.typeId$ = 0; - _.buf = null; - _.count = 0; - function $IOException(this$static, message) { - this$static.detailMessage = message; - return this$static; - } - - function getClass_5() { - return Ljava_io_IOException_2_classLit; - } - - function IOException() { - } - - _ = IOException.prototype = new Exception(); - _.getClass$ = getClass_5; - _.typeId$ = 7; - function $ArithmeticException(this$static, explanation) { - this$static.detailMessage = explanation; - return this$static; - } - - function getClass_8() { - return Ljava_lang_ArithmeticException_2_classLit; - } - - function ArithmeticException() { - } - - _ = ArithmeticException.prototype = new RuntimeException(); - _.getClass$ = getClass_8; - _.typeId$ = 8; - function $ArrayStoreException(this$static, message) { - this$static.detailMessage = message; - return this$static; - } - - function getClass_9() { - return Ljava_lang_ArrayStoreException_2_classLit; - } - - function ArrayStoreException() { - } - - _ = ArrayStoreException.prototype = new RuntimeException(); - _.getClass$ = getClass_9; - _.typeId$ = 9; - function createForArray(packageName, className) { - var clazz; - clazz = new Class(); - clazz.typeName = packageName + className; - return clazz; - } - - function createForClass(packageName, className) { - var clazz; - clazz = new Class(); - clazz.typeName = packageName + className; - return clazz; - } - - function createForEnum(packageName, className) { - var clazz; - clazz = new Class(); - clazz.typeName = packageName + className; - return clazz; - } - - function getClass_11() { - return Ljava_lang_Class_2_classLit; - } - - function Class() { - } - - _ = Class.prototype = new Object_0(); - _.getClass$ = getClass_11; - _.typeId$ = 0; - _.typeName = null; - function getClass_10() { - return Ljava_lang_ClassCastException_2_classLit; - } - - function ClassCastException() { - } - - _ = ClassCastException.prototype = new RuntimeException(); - _.getClass$ = getClass_10; - _.typeId$ = 12; - function getClass_12() { - return Ljava_lang_Enum_2_classLit; - } - - function Enum() { - } - - _ = Enum.prototype = new Object_0(); - _.getClass$ = getClass_12; - _.typeId$ = 0; - function $IllegalArgumentException(this$static, message) { - this$static.detailMessage = message; - return this$static; - } - - function getClass_14() { - return Ljava_lang_IllegalArgumentException_2_classLit; - } - - function IllegalArgumentException() { - } - - _ = IllegalArgumentException.prototype = new RuntimeException(); - _.getClass$ = getClass_14; - _.typeId$ = 13; - function getClass_15() { - return Ljava_lang_IllegalStateException_2_classLit; - } - - function IllegalStateException() { - } - - _ = IllegalStateException.prototype = new RuntimeException(); - _.getClass$ = getClass_15; - _.typeId$ = 14; - function getClass_16() { - return Ljava_lang_IndexOutOfBoundsException_2_classLit; - } - - function IndexOutOfBoundsException() { - } - - _ = IndexOutOfBoundsException.prototype = new RuntimeException(); - _.getClass$ = getClass_16; - _.typeId$ = 15; - function max(x, y) { - return x > y?x:y; - } - - function min(x, y) { - return x < y?x:y; - } - - function getClass_17() { - return Ljava_lang_NullPointerException_2_classLit; - } - - function NullPointerException() { - } - - _ = NullPointerException.prototype = new RuntimeException(); - _.getClass$ = getClass_17; - _.typeId$ = 16; - function $equals(this$static, other) { - if (other == null) { - return false; - } - return String(this$static) == other; - } - - function $getChars(this$static, srcBegin, srcEnd, dst, dstBegin) { - var srcIdx; - for (srcIdx = srcBegin; srcIdx < srcEnd; ++srcIdx) { - dst[dstBegin++] = this$static.charCodeAt(srcIdx); - } - } - - function getClass_21() { - return Ljava_lang_String_2_classLit; - } - - _ = String.prototype; - _.getClass$ = getClass_21; - _.typeId$ = 2; - function $StringBuilder(this$static) { - var array; - this$static.data = (array = [] , array.explicitLength = 0 , array); - return this$static; - } - - function getClass_20() { - return Ljava_lang_StringBuilder_2_classLit; - } - - function StringBuilder() { - } - - _ = StringBuilder.prototype = new Object_0(); - _.getClass$ = getClass_20; - _.typeId$ = 0; - function arraycopy(src, srcOfs, dest, destOfs, len) { - var destArray, destEnd, destTypeName, destlen, i, srcArray, srcTypeName, srclen; - - if (src == null || dest == null) { - throw new NullPointerException(); - } - - srcTypeName = (src.typeMarker$ == nullMethod || src.typeId$ == 2 ? src.getClass$() : Lcom_google_gwt_core_client_JavaScriptObject_2_classLit).typeName; - destTypeName = (dest.typeMarker$ == nullMethod || dest.typeId$ == 2 ? dest.getClass$() : Lcom_google_gwt_core_client_JavaScriptObject_2_classLit).typeName; - - if (srcTypeName.charCodeAt(0) != 91 || destTypeName.charCodeAt(0) != 91) { - throw $ArrayStoreException(new ArrayStoreException(), 'Must be array types'); - } - if (srcTypeName.charCodeAt(1) != destTypeName.charCodeAt(1)) { - throw $ArrayStoreException(new ArrayStoreException(), 'Array types must match'); - } - - srclen = src.length; - destlen = dest.length; - if (srcOfs < 0 || destOfs < 0 || len < 0 || srcOfs + len > srclen || destOfs + len > destlen) { - throw new IndexOutOfBoundsException(); - } - if ((srcTypeName.charCodeAt(1) == 76 || srcTypeName.charCodeAt(1) == 91) && !$equals(srcTypeName, destTypeName)) { - srcArray = dynamicCast(src, 3); - destArray = dynamicCast(dest, 3); - if ((src == null ? null : src) === (dest == null ? null : dest) && srcOfs < destOfs) { - srcOfs += len; - for (destEnd = destOfs + len; destEnd-- > destOfs;) { - setCheck(destArray, destEnd, srcArray[--srcOfs]); - } - } else { - for (destEnd = destOfs + len; destOfs < destEnd;) { - setCheck(destArray, destOfs++, srcArray[srcOfs++]); - } - } - } else { - for (i = 0; i < len; ++i) { - dest[destOfs + i] = src[srcOfs + i] - } - } - } - - - function $configure(this$static, encoder) { - if (!$SetDictionarySize_0(encoder, 1 << this$static.dictionarySize)) - throw $RuntimeException(new RuntimeException(), 'unexpected failure'); - if (!$SetNumFastBytes(encoder, this$static.fb)) - throw $RuntimeException(new RuntimeException(), 'unexpected failure'); - if (!$SetMatchFinder(encoder, this$static.matchFinder)) - throw $RuntimeException(new RuntimeException(), 'unexpected failure'); - if (!$SetLcLpPb_0(encoder, this$static.lc, this$static.lp, this$static.pb)) - throw $RuntimeException(new RuntimeException(), 'unexpected failure'); - } - - function getClass_23() { - return Lorg_dellroad_lzma_client_CompressionMode_2_classLit; - } - - function CompressionMode() { - } - - _ = CompressionMode.prototype = new Enum(); - _.getClass$ = getClass_23; - _.typeId$ = 0; - _.dictionarySize = 0; - _.fb = 0; - _.lc = 0; - _.lp = 0; - _.matchFinder = 0; - _.pb = 0; - - function $execute(this$static) { - var $e0; - try { - return $processChunk(this$static.chunker); - } - catch ($e0) { - $e0 = caught($e0); - if (instanceOf($e0, 10)) { - return false; - } else { - throw $e0; - } - } - } - - function $init(this$static, input, output, length_0, mode) { - var encoder, i; - if (!mode) - throw $IllegalArgumentException(new IllegalArgumentException(), 'null mode'); - if (compare(length_0, N1_longLit) < 0) - throw $IllegalArgumentException(new IllegalArgumentException(), 'invalid length ' + toString_0(length_0)); - this$static.length_0 = length_0; - encoder = $Encoder(new Encoder()); - $configure(mode, encoder); - encoder._writeEndMark = true; - $WriteCoderProperties(encoder, output); - for (i = 0; i < 64; i += 8) - $write(output, lowBits_0(shr(length_0, i)) & 255); - this$static.chunker = (encoder._needReleaseMFStream = false , (encoder._inStream = input , encoder._finished = false , $Create_2(encoder) , encoder._rangeEncoder.Stream = output , $Init_4(encoder) , $FillDistancesPrices(encoder) , $FillAlignPrices(encoder) , encoder._lenEncoder._tableSize = encoder._numFastBytes + 1 - 2 , $UpdateTables(encoder._lenEncoder, 1 << encoder._posStateBits) , encoder._repMatchLenEncoder._tableSize = encoder._numFastBytes + 1 - 2 , $UpdateTables(encoder._repMatchLenEncoder, 1 << encoder._posStateBits) , encoder.nowPos64 = P0_longLit , undefined) , $Chunker_0(new Chunker(), encoder)); - } - - function getClass_26() { - return Lorg_dellroad_lzma_client_LZMACompressor_2_classLit; - } - - function LZMACompressor() { - } - - _ = LZMACompressor.prototype = new Object_0(); - _.getClass$ = getClass_26; - _.typeId$ = 0; - _.chunker = null; - - function $LZMAByteArrayCompressor(this$static, data, mode) { - var $e0; - this$static.output = $ByteArrayOutputStream(new ByteArrayOutputStream()); - try { - $init(this$static, $ByteArrayInputStream(new ByteArrayInputStream(), data), this$static.output, fromInt(data.length), mode); - } catch ($e0) { - $e0 = caught($e0); - if (instanceOf($e0, 10)) { - throw $RuntimeException(new RuntimeException(), 'impossible exception'); - } else { - throw $e0; - } - } - return this$static; - } - - function getClass_24() { - return Lorg_dellroad_lzma_client_LZMAByteArrayCompressor_2_classLit; - } - - function LZMAByteArrayCompressor() { - } - - _ = LZMAByteArrayCompressor.prototype = new LZMACompressor(); - _.getClass$ = getClass_24; - _.typeId$ = 0; - _.output = null; - function $execute_0(this$static) { - var $e0, e; - try { - return $processChunk(this$static.chunker); - } - catch ($e0) { - $e0 = caught($e0); - if (instanceOf($e0, 10)) { - e = $e0; - this$static.exception = e; - return false; - } else { - throw $e0; - } - } - } - - function $init_0(this$static, input, output) { - var decoder, - hex_length = "", - i, - properties, - r, - tmp_length; - - properties = initDim(_3B_classLit, 0, -1, 5, 1); - for (i = 0; i < properties.length; ++i) { - r = $read(input); - if (r == -1) - throw $IOException(new IOException(), 'truncated input'); - properties[i] = r << 24 >> 24; - } - decoder = $Decoder(new Decoder()); - if (!$SetDecoderProperties(decoder, properties)) - throw $IOException(new IOException(), 'corrupted input'); - - for (i = 0; i < 64; i += 8) { - r = $read(input); - if (r == -1) - throw $IOException(new IOException(), 'truncated input'); - r = r.toString(16); - if (r.length == 1) r = "0" + r; - hex_length = r + "" + hex_length; - } - - /// Was the length set in the header (if it was compressed from a stream, the length is all f's). - if (/^0+$|^f+$/i.test(hex_length)) { - /// The length is unknown, so set to -1. - this$static.length_0 = N1_longLit; - } else { - ///NOTE: If there is a problem with the decoder because of the length, you can always set the length to -1 (N1_longLit) which means unknown. - tmp_length = parseInt(hex_length, 16); - /// If the length is too long to handle, just set it to unknown. - if (tmp_length > 4294967295) { - this$static.length_0 = N1_longLit; - } else { - this$static.length_0 = fromDouble(tmp_length); - } - } - - this$static.chunker = $CodeInChunks(decoder, input, output, this$static.length_0); - } - - function getClass_27() { - return Lorg_dellroad_lzma_client_LZMADecompressor_2_classLit; - } - - function LZMADecompressor() { - } - - _ = LZMADecompressor.prototype = new Object_0(); - _.getClass$ = getClass_27; - _.typeId$ = 0; - _.chunker = null; - _.exception = null; - _.length_0 = P0_longLit; - function $LZMAByteArrayDecompressor(this$static, data) { - this$static.output = $ByteArrayOutputStream(new ByteArrayOutputStream()); - $init_0(this$static, $ByteArrayInputStream(new ByteArrayInputStream(), data), this$static.output); - return this$static; - } - - function getClass_25() { - return Lorg_dellroad_lzma_client_LZMAByteArrayDecompressor_2_classLit; - } - - function LZMAByteArrayDecompressor() { - } - - _ = LZMAByteArrayDecompressor.prototype = new LZMADecompressor(); - _.getClass$ = getClass_25; - _.typeId$ = 0; - _.output = null; - function $Create_4(this$static, keepSizeBefore, keepSizeAfter, keepSizeReserv) { - var blockSize; - this$static._keepSizeBefore = keepSizeBefore; - this$static._keepSizeAfter = keepSizeAfter; - blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv; - if (this$static._bufferBase == null || this$static._blockSize != blockSize) { - this$static._bufferBase = null; - this$static._blockSize = blockSize; - this$static._bufferBase = initDim(_3B_classLit, 0, -1, this$static._blockSize, 1); - } - this$static._pointerToLastSafePosition = this$static._blockSize - keepSizeAfter; - } - - function $GetIndexByte(this$static, index) { - return this$static._bufferBase[this$static._bufferOffset + this$static._pos + index]; - } - - function $GetMatchLen(this$static, index, distance, limit) { - var i, pby; - if (this$static._streamEndWasReached) { - if (this$static._pos + index + limit > this$static._streamPos) { - limit = this$static._streamPos - (this$static._pos + index); - } - } - ++distance; - pby = this$static._bufferOffset + this$static._pos + index; - for (i = 0; i < limit && this$static._bufferBase[pby + i] == this$static._bufferBase[pby + i - distance]; ++i) { - } - return i; - } - - function $GetNumAvailableBytes(this$static) { - return this$static._streamPos - this$static._pos; - } - - function $MoveBlock(this$static) { - var i, numBytes, offset; - offset = this$static._bufferOffset + this$static._pos - this$static._keepSizeBefore; - if (offset > 0) { - --offset; - } - numBytes = this$static._bufferOffset + this$static._streamPos - offset; - for (i = 0; i < numBytes; ++i) { - this$static._bufferBase[i] = this$static._bufferBase[offset + i]; - } - this$static._bufferOffset -= offset; - } - - function $MovePos_1(this$static) { - var pointerToPostion; - ++this$static._pos; - if (this$static._pos > this$static._posLimit) { - pointerToPostion = this$static._bufferOffset + this$static._pos; - if (pointerToPostion > this$static._pointerToLastSafePosition) { - $MoveBlock(this$static); - } - $ReadBlock(this$static); - } - } - - function $ReadBlock(this$static) { - var numReadBytes, pointerToPostion, size; - if (this$static._streamEndWasReached) - return; - while (true) { - size = -this$static._bufferOffset + this$static._blockSize - this$static._streamPos; - if (size == 0) - return; - numReadBytes = $read_0(this$static._stream, this$static._bufferBase, this$static._bufferOffset + this$static._streamPos, size); - if (numReadBytes == -1) { - this$static._posLimit = this$static._streamPos; - pointerToPostion = this$static._bufferOffset + this$static._posLimit; - if (pointerToPostion > this$static._pointerToLastSafePosition) { - this$static._posLimit = this$static._pointerToLastSafePosition - this$static._bufferOffset; - } - this$static._streamEndWasReached = true; - return; - } - this$static._streamPos += numReadBytes; - if (this$static._streamPos >= this$static._pos + this$static._keepSizeAfter) { - this$static._posLimit = this$static._streamPos - this$static._keepSizeAfter; - } - } - } - - function $ReduceOffsets(this$static, subValue) { - this$static._bufferOffset += subValue; - this$static._posLimit -= subValue; - this$static._pos -= subValue; - this$static._streamPos -= subValue; - } - - function getClass_40() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_InWindow_2_classLit; - } - - function InWindow() { - } - - _ = InWindow.prototype = new Object_0(); - _.getClass$ = getClass_40; - _.typeId$ = 0; - _._blockSize = 0; - _._bufferBase = null; - _._bufferOffset = 0; - _._keepSizeAfter = 0; - _._keepSizeBefore = 0; - _._pointerToLastSafePosition = 0; - _._pos = 0; - _._posLimit = 0; - _._stream = null; - _._streamEndWasReached = false; - _._streamPos = 0; - function $clinit_60() { - $clinit_60 = nullMethod; - var i, j, r; - CrcTable = initDim(_3I_classLit, 0, -1, 256, 1); - for (i = 0; i < 256; ++i) { - r = i; - for (j = 0; j < 8; ++j) - if ((r & 1) != 0) { - r = r >>> 1 ^ -306674912; - } else { - r >>>= 1; - } - CrcTable[i] = r; - } - } - - function $Create_3(this$static, historySize, keepAddBufferBefore, matchMaxLen, keepAddBufferAfter) { - var cyclicBufferSize, hs, windowReservSize; - if (historySize > 1073741567) { - return false; - } - - this$static._cutValue = 16 + (matchMaxLen >> 1); - windowReservSize = ~~((historySize + keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2) + 256; - $Create_4(this$static, historySize + keepAddBufferBefore, matchMaxLen + keepAddBufferAfter, windowReservSize); - this$static._matchMaxLen = matchMaxLen; - cyclicBufferSize = historySize + 1; - if (this$static._cyclicBufferSize != cyclicBufferSize) { - this$static._son = initDim(_3I_classLit, 0, -1, (this$static._cyclicBufferSize = cyclicBufferSize) * 2, 1); - } - - hs = 65536; - if (this$static.HASH_ARRAY) { - hs = historySize - 1; - hs |= hs >> 1; - hs |= hs >> 2; - hs |= hs >> 4; - hs |= hs >> 8; - hs >>= 1; - hs |= 65535; - if (hs > 16777216) - hs >>= 1; - this$static._hashMask = hs; - ++hs; - hs += this$static.kFixHashSize; - } - - if (hs != this$static._hashSizeSum) { - this$static._hash = initDim(_3I_classLit, 0, -1, this$static._hashSizeSum = hs, 1); - } - return true; - } - - function $GetMatches(this$static, distances) { - var count, cur, curMatch, curMatch2, curMatch3, cyclicPos, delta, hash2Value, hash3Value, hashValue, len, len0, len1, lenLimit, matchMinPos, maxLen, offset, pby1, ptr0, ptr1, temp; - if (this$static._pos + this$static._matchMaxLen <= this$static._streamPos) { - lenLimit = this$static._matchMaxLen; - } else { - lenLimit = this$static._streamPos - this$static._pos; - if (lenLimit < this$static.kMinMatchCheck) { - $MovePos_0(this$static); - return 0; - } - } - offset = 0; - matchMinPos = this$static._pos > this$static._cyclicBufferSize?this$static._pos - this$static._cyclicBufferSize:0; - cur = this$static._bufferOffset + this$static._pos; - maxLen = 1; - hash2Value = 0; - hash3Value = 0; - if (this$static.HASH_ARRAY) { - temp = CrcTable[this$static._bufferBase[cur] & 255] ^ this$static._bufferBase[cur + 1] & 255; - hash2Value = temp & 1023; - temp ^= (this$static._bufferBase[cur + 2] & 255) << 8; - hash3Value = temp & 65535; - hashValue = (temp ^ CrcTable[this$static._bufferBase[cur + 3] & 255] << 5) & this$static._hashMask; - } else { - hashValue = this$static._bufferBase[cur] & 255 ^ (this$static._bufferBase[cur + 1] & 255) << 8; - } - - curMatch = this$static._hash[this$static.kFixHashSize + hashValue]; - if (this$static.HASH_ARRAY) { - curMatch2 = this$static._hash[hash2Value]; - curMatch3 = this$static._hash[1024 + hash3Value]; - this$static._hash[hash2Value] = this$static._pos; - this$static._hash[1024 + hash3Value] = this$static._pos; - if (curMatch2 > matchMinPos) { - if (this$static._bufferBase[this$static._bufferOffset + curMatch2] == this$static._bufferBase[cur]) { - distances[offset++] = maxLen = 2; - distances[offset++] = this$static._pos - curMatch2 - 1; - } - } - if (curMatch3 > matchMinPos) { - if (this$static._bufferBase[this$static._bufferOffset + curMatch3] == this$static._bufferBase[cur]) { - if (curMatch3 == curMatch2) { - offset -= 2; - } - distances[offset++] = maxLen = 3; - distances[offset++] = this$static._pos - curMatch3 - 1; - curMatch2 = curMatch3; - } - } - if (offset != 0 && curMatch2 == curMatch) { - offset -= 2; - maxLen = 1; - } - } - this$static._hash[this$static.kFixHashSize + hashValue] = this$static._pos; - ptr0 = (this$static._cyclicBufferPos << 1) + 1; - ptr1 = this$static._cyclicBufferPos << 1; - len0 = len1 = this$static.kNumHashDirectBytes; - if (this$static.kNumHashDirectBytes != 0) { - if (curMatch > matchMinPos) { - if (this$static._bufferBase[this$static._bufferOffset + curMatch + this$static.kNumHashDirectBytes] != this$static._bufferBase[cur + this$static.kNumHashDirectBytes]) { - distances[offset++] = maxLen = this$static.kNumHashDirectBytes; - distances[offset++] = this$static._pos - curMatch - 1; - } - } - } - count = this$static._cutValue; - while (true) { - if (curMatch <= matchMinPos || count-- == 0) { - this$static._son[ptr0] = this$static._son[ptr1] = 0; - break; - } - delta = this$static._pos - curMatch; - cyclicPos = (delta <= this$static._cyclicBufferPos?this$static._cyclicBufferPos - delta:this$static._cyclicBufferPos - delta + this$static._cyclicBufferSize) << 1; - pby1 = this$static._bufferOffset + curMatch; - len = len0 < len1?len0:len1; - if (this$static._bufferBase[pby1 + len] == this$static._bufferBase[cur + len]) { - while (++len != lenLimit) { - if (this$static._bufferBase[pby1 + len] != this$static._bufferBase[cur + len]) { - break; - } - } - if (maxLen < len) { - distances[offset++] = maxLen = len; - distances[offset++] = delta - 1; - if (len == lenLimit) { - this$static._son[ptr1] = this$static._son[cyclicPos]; - this$static._son[ptr0] = this$static._son[cyclicPos + 1]; - break; - } - } - } - if ((this$static._bufferBase[pby1 + len] & 255) < (this$static._bufferBase[cur + len] & 255)) { - this$static._son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = this$static._son[ptr1]; - len1 = len; - } else { - this$static._son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = this$static._son[ptr0]; - len0 = len; - } - } - $MovePos_0(this$static); - return offset; - } - - function $Init_5(this$static) { - var i; - this$static._bufferOffset = 0; - this$static._pos = 0; - this$static._streamPos = 0; - this$static._streamEndWasReached = false; - $ReadBlock(this$static); - for (i = 0; i < this$static._hashSizeSum; ++i) { - this$static._hash[i] = 0; - } - this$static._cyclicBufferPos = 0; - $ReduceOffsets(this$static, -1); - } - - function $MovePos_0(this$static) { - var subValue; - if (++this$static._cyclicBufferPos >= this$static._cyclicBufferSize) { - this$static._cyclicBufferPos = 0; - } - $MovePos_1(this$static); - if (this$static._pos == 1073741823) { - subValue = this$static._pos - this$static._cyclicBufferSize; - $NormalizeLinks(this$static._son, this$static._cyclicBufferSize * 2, subValue); - $NormalizeLinks(this$static._hash, this$static._hashSizeSum, subValue); - $ReduceOffsets(this$static, subValue); - } - } - - function $NormalizeLinks(items, numItems, subValue) { - var i, value; - for (i = 0; i < numItems; ++i) { - value = items[i]; - if (value <= subValue) { - value = 0; - } else { - value -= subValue; - } - items[i] = value; - } - } - - function $SetType(this$static, numHashBytes) { - this$static.HASH_ARRAY = numHashBytes > 2; - if (this$static.HASH_ARRAY) { - this$static.kNumHashDirectBytes = 0; - this$static.kMinMatchCheck = 4; - this$static.kFixHashSize = 66560; - } else { - this$static.kNumHashDirectBytes = 2; - this$static.kMinMatchCheck = 3; - this$static.kFixHashSize = 0; - } - } - - function $Skip(this$static, num) { - var count, cur, curMatch, cyclicPos, delta, hash2Value, hash3Value, hashValue, len, len0, len1, lenLimit, matchMinPos, pby1, ptr0, ptr1, temp; - do { - if (this$static._pos + this$static._matchMaxLen <= this$static._streamPos) { - lenLimit = this$static._matchMaxLen; - } else { - lenLimit = this$static._streamPos - this$static._pos; - if (lenLimit < this$static.kMinMatchCheck) { - $MovePos_0(this$static); - continue; - } - } - matchMinPos = this$static._pos > this$static._cyclicBufferSize?this$static._pos - this$static._cyclicBufferSize:0; - cur = this$static._bufferOffset + this$static._pos; - if (this$static.HASH_ARRAY) { - temp = CrcTable[this$static._bufferBase[cur] & 255] ^ this$static._bufferBase[cur + 1] & 255; - hash2Value = temp & 1023; - this$static._hash[hash2Value] = this$static._pos; - temp ^= (this$static._bufferBase[cur + 2] & 255) << 8; - hash3Value = temp & 65535; - this$static._hash[1024 + hash3Value] = this$static._pos; - hashValue = (temp ^ CrcTable[this$static._bufferBase[cur + 3] & 255] << 5) & this$static._hashMask; - } else { - hashValue = this$static._bufferBase[cur] & 255 ^ (this$static._bufferBase[cur + 1] & 255) << 8; - } - curMatch = this$static._hash[this$static.kFixHashSize + hashValue]; - this$static._hash[this$static.kFixHashSize + hashValue] = this$static._pos; - ptr0 = (this$static._cyclicBufferPos << 1) + 1; - ptr1 = this$static._cyclicBufferPos << 1; - len0 = len1 = this$static.kNumHashDirectBytes; - count = this$static._cutValue; - while (true) { - if (curMatch <= matchMinPos || count-- == 0) { - this$static._son[ptr0] = this$static._son[ptr1] = 0; - break; - } - delta = this$static._pos - curMatch; - cyclicPos = (delta <= this$static._cyclicBufferPos?this$static._cyclicBufferPos - delta:this$static._cyclicBufferPos - delta + this$static._cyclicBufferSize) << 1; - pby1 = this$static._bufferOffset + curMatch; - len = len0 < len1?len0:len1; - if (this$static._bufferBase[pby1 + len] == this$static._bufferBase[cur + len]) { - while (++len != lenLimit) { - if (this$static._bufferBase[pby1 + len] != this$static._bufferBase[cur + len]) { - break; - } - } - if (len == lenLimit) { - this$static._son[ptr1] = this$static._son[cyclicPos]; - this$static._son[ptr0] = this$static._son[cyclicPos + 1]; - break; - } - } - if ((this$static._bufferBase[pby1 + len] & 255) < (this$static._bufferBase[cur + len] & 255)) { - this$static._son[ptr1] = curMatch; - ptr1 = cyclicPos + 1; - curMatch = this$static._son[ptr1]; - len1 = len; - } else { - this$static._son[ptr0] = curMatch; - ptr0 = cyclicPos; - curMatch = this$static._son[ptr0]; - len0 = len; - } - } - $MovePos_0(this$static); - } - while (--num != 0); - } - - function getClass_39() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_BinTree_2_classLit; - } - - function BinTree() { - } - - _ = BinTree.prototype = new InWindow(); - _.getClass$ = getClass_39; - _.typeId$ = 0; - _.HASH_ARRAY = true; - _._cutValue = 255; - _._cyclicBufferPos = 0; - _._cyclicBufferSize = 0; - _._hash = null; - _._hashMask = 0; - _._hashSizeSum = 0; - _._matchMaxLen = 0; - _._son = null; - _.kFixHashSize = 66560; - _.kMinMatchCheck = 4; - _.kNumHashDirectBytes = 0; - var CrcTable; - function $CopyBlock(this$static, distance, len) { - var pos; - pos = this$static._pos - distance - 1; - if (pos < 0) { - pos += this$static._windowSize; - } - for (; len != 0; --len) { - if (pos >= this$static._windowSize) { - pos = 0; - } - this$static._buffer[this$static._pos++] = this$static._buffer[pos++]; - if (this$static._pos >= this$static._windowSize) { - $Flush_0(this$static); - } - } - } - - function $Create_5(this$static, windowSize) { - if (this$static._buffer == null || this$static._windowSize != windowSize) { - this$static._buffer = initDim(_3B_classLit, 0, -1, windowSize, 1); - } - this$static._windowSize = windowSize; - this$static._pos = 0; - this$static._streamPos = 0; - } - - function $Flush_0(this$static) { - var size; - size = this$static._pos - this$static._streamPos; - if (size == 0) { - return; - } - $write_0(this$static._stream, this$static._buffer, this$static._streamPos, size); - if (this$static._pos >= this$static._windowSize) { - this$static._pos = 0; - } - this$static._streamPos = this$static._pos; - } - - function $GetByte(this$static, distance) { - var pos; - pos = this$static._pos - distance - 1; - if (pos < 0) { - pos += this$static._windowSize; - } - return this$static._buffer[pos]; - } - - function $Init_7(this$static, solid) { - if (!solid) { - this$static._streamPos = 0; - this$static._pos = 0; - } - } - - function $PutByte(this$static, b) { - this$static._buffer[this$static._pos++] = b; - if (this$static._pos >= this$static._windowSize) { - $Flush_0(this$static); - } - } - - function $ReleaseStream(this$static) { - $Flush_0(this$static); - this$static._stream = null; - } - - function $SetStream_0(this$static, stream) { - $Flush_0(this$static); - this$static._stream = null; - this$static._stream = stream; - } - - function getClass_41() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_OutWindow_2_classLit; - } - - function OutWindow() { - } - - _ = OutWindow.prototype = new Object_0(); - _.getClass$ = getClass_41; - _.typeId$ = 0; - _._buffer = null; - _._pos = 0; - _._stream = null; - _._streamPos = 0; - _._windowSize = 0; - function GetLenToPosState(len) { - len -= 2; - if (len < 4) { - return len; - } - return 3; - } - - function StateUpdateChar(index) { - if (index < 4) { - return 0; - } - if (index < 10) { - return index - 3; - } - return index - 6; - } - - function $Chunker_0(this$static, encoder) { - this$static.encoder = encoder; - this$static.decoder = null; - this$static.alive = true; - return this$static; - } - - function $Chunker(this$static, decoder) { - this$static.decoder = decoder; - this$static.encoder = null; - this$static.alive = true; - return this$static; - } - - function $processChunk(this$static) { - var exception; - if (!this$static.alive) { - throw new IllegalStateException(); - } - exception = true; - try { - if (this$static.encoder) { - $processEncoderChunk(this$static); - } else { - $processDecoderChunk(this$static); - } - exception = false; - return this$static.alive; - } finally { - if (exception) { - this$static.alive = false; - } - } - } - - function $processDecoderChunk(this$static) { - var result; - result = $CodeOneChunk(this$static.decoder); - if (result == -1) { - throw $IOException(new IOException(), 'corrupted input'); - } - this$static.inBytesProcessed = N1_longLit; - this$static.outBytesProcessed = this$static.decoder.nowPos64; - if (result == 1 || compare(this$static.decoder.outSize, P0_longLit) >= 0 && compare(this$static.decoder.nowPos64, this$static.decoder.outSize) >= 0) { - $CodeFinish(this$static.decoder); - this$static.alive = false; - } - } - - function $processEncoderChunk(this$static) { - $CodeOneBlock(this$static.encoder, this$static.encoder.processedInSize, this$static.encoder.processedOutSize, this$static.encoder.finished); - this$static.inBytesProcessed = this$static.encoder.processedInSize[0]; - if (this$static.encoder.finished[0]) { - $ReleaseStreams(this$static.encoder); - this$static.alive = false; - } - } - - function getClass_28() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Chunker_2_classLit; - } - - function Chunker() { - } - - _ = Chunker.prototype = new Object_0(); - _.getClass$ = getClass_28; - _.typeId$ = 0; - _.alive = false; - _.decoder = null; - _.encoder = null; - function $CodeFinish(this$static) { - $Flush_0(this$static.m_OutWindow); - $ReleaseStream(this$static.m_OutWindow); - this$static.m_RangeDecoder.Stream = null; - } - - function $CodeInChunks(this$static, inStream, outStream, outSize) { - this$static.m_RangeDecoder.Stream = inStream; - $SetStream_0(this$static.m_OutWindow, outStream); - $Init_1(this$static); - this$static.state = 0; - this$static.rep0 = 0; - this$static.rep1 = 0; - this$static.rep2 = 0; - this$static.rep3 = 0; - this$static.outSize = outSize; - this$static.nowPos64 = P0_longLit; - this$static.prevByte = 0; - return $Chunker(new Chunker(), this$static); - } - - function $CodeOneChunk(this$static) { - var decoder2, distance, len, numDirectBits, posSlot, posState; - posState = lowBits_0(this$static.nowPos64) & this$static.m_PosStateMask; - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsMatchDecoders, (this$static.state << 4) + posState) == 0) { - decoder2 = $GetDecoder(this$static.m_LiteralDecoder, lowBits_0(this$static.nowPos64), this$static.prevByte); - if (this$static.state < 7) { - this$static.prevByte = $DecodeNormal(decoder2, this$static.m_RangeDecoder); - } - else { - this$static.prevByte = $DecodeWithMatchByte(decoder2, this$static.m_RangeDecoder, $GetByte(this$static.m_OutWindow, this$static.rep0)); - } - $PutByte(this$static.m_OutWindow, this$static.prevByte); - this$static.state = StateUpdateChar(this$static.state); - this$static.nowPos64 = add(this$static.nowPos64, P1_longLit); - } else { - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsRepDecoders, this$static.state) == 1) { - len = 0; - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsRepG0Decoders, this$static.state) == 0) { - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsRep0LongDecoders, (this$static.state << 4) + posState) == 0) { - this$static.state = this$static.state < 7?9:11; - len = 1; - } - } else { - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsRepG1Decoders, this$static.state) == 0) { - distance = this$static.rep1; - } else { - if ($DecodeBit(this$static.m_RangeDecoder, this$static.m_IsRepG2Decoders, this$static.state) == 0) { - distance = this$static.rep2; - } else { - distance = this$static.rep3; - this$static.rep3 = this$static.rep2; - } - this$static.rep2 = this$static.rep1; - } - this$static.rep1 = this$static.rep0; - this$static.rep0 = distance; - } - if (len == 0) { - len = $Decode(this$static.m_RepLenDecoder, this$static.m_RangeDecoder, posState) + 2; - this$static.state = this$static.state < 7?8:11; - } - } else { - this$static.rep3 = this$static.rep2; - this$static.rep2 = this$static.rep1; - this$static.rep1 = this$static.rep0; - len = 2 + $Decode(this$static.m_LenDecoder, this$static.m_RangeDecoder, posState); - this$static.state = this$static.state < 7?7:10; - posSlot = $Decode_0(this$static.m_PosSlotDecoder[GetLenToPosState(len)], this$static.m_RangeDecoder); - if (posSlot >= 4) { - numDirectBits = (posSlot >> 1) - 1; - this$static.rep0 = (2 | posSlot & 1) << numDirectBits; - if (posSlot < 14) { - this$static.rep0 += ReverseDecode(this$static.m_PosDecoders, this$static.rep0 - posSlot - 1, this$static.m_RangeDecoder, numDirectBits); - } else { - this$static.rep0 += $DecodeDirectBits(this$static.m_RangeDecoder, numDirectBits - 4) << 4; - this$static.rep0 += $ReverseDecode(this$static.m_PosAlignDecoder, this$static.m_RangeDecoder); - if (this$static.rep0 < 0) { - if (this$static.rep0 == -1) { - return 1; - } - return -1; - } - } - } else - this$static.rep0 = posSlot; - } - if (compare(fromInt(this$static.rep0), this$static.nowPos64) >= 0 || this$static.rep0 >= this$static.m_DictionarySizeCheck) { - return -1; - } - $CopyBlock(this$static.m_OutWindow, this$static.rep0, len); - this$static.nowPos64 = add(this$static.nowPos64, fromInt(len)); - this$static.prevByte = $GetByte(this$static.m_OutWindow, 0); - } - return 0; - } - - function $Decoder(this$static) { - var i; - this$static.m_OutWindow = new OutWindow(); - this$static.m_RangeDecoder = new Decoder_0(); - this$static.m_IsMatchDecoders = initDim(_3S_classLit, 0, -1, 192, 1); - this$static.m_IsRepDecoders = initDim(_3S_classLit, 0, -1, 12, 1); - this$static.m_IsRepG0Decoders = initDim(_3S_classLit, 0, -1, 12, 1); - this$static.m_IsRepG1Decoders = initDim(_3S_classLit, 0, -1, 12, 1); - this$static.m_IsRepG2Decoders = initDim(_3S_classLit, 0, -1, 12, 1); - this$static.m_IsRep0LongDecoders = initDim(_3S_classLit, 0, -1, 192, 1); - this$static.m_PosSlotDecoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit, 0, 7, 4, 0); - this$static.m_PosDecoders = initDim(_3S_classLit, 0, -1, 114, 1); - this$static.m_PosAlignDecoder = $BitTreeDecoder(new BitTreeDecoder(), 4); - this$static.m_LenDecoder = $Decoder$LenDecoder(new Decoder$LenDecoder()); - this$static.m_RepLenDecoder = $Decoder$LenDecoder(new Decoder$LenDecoder()); - this$static.m_LiteralDecoder = new Decoder$LiteralDecoder(); - for (i = 0; i < 4; ++i) { - this$static.m_PosSlotDecoder[i] = $BitTreeDecoder(new BitTreeDecoder(), 6); - } - return this$static; - } - - function $Init_1(this$static) { - var i; - $Init_7(this$static.m_OutWindow, false); - InitBitModels(this$static.m_IsMatchDecoders); - InitBitModels(this$static.m_IsRep0LongDecoders); - InitBitModels(this$static.m_IsRepDecoders); - InitBitModels(this$static.m_IsRepG0Decoders); - InitBitModels(this$static.m_IsRepG1Decoders); - InitBitModels(this$static.m_IsRepG2Decoders); - InitBitModels(this$static.m_PosDecoders); - $Init_0(this$static.m_LiteralDecoder); - for (i = 0; i < 4; ++i) { - InitBitModels(this$static.m_PosSlotDecoder[i].Models); - } - $Init(this$static.m_LenDecoder); - $Init(this$static.m_RepLenDecoder); - InitBitModels(this$static.m_PosAlignDecoder.Models); - $Init_8(this$static.m_RangeDecoder); - } - - function $SetDecoderProperties(this$static, properties) { - var dictionarySize, i, lc, lp, pb, remainder, val; - if (properties.length < 5) - return false; - val = properties[0] & 255; - lc = val % 9; - remainder = ~~(val / 9); - lp = remainder % 5; - pb = ~~(remainder / 5); - dictionarySize = 0; - for (i = 0; i < 4; ++i) { - dictionarySize += (properties[1 + i] & 255) << i * 8; - } - if (!$SetLcLpPb(this$static, lc, lp, pb)) { - return false; - } - return $SetDictionarySize(this$static, dictionarySize); - } - - function $SetDictionarySize(this$static, dictionarySize) { - if (dictionarySize < 0) { - return false; - } - if (this$static.m_DictionarySize != dictionarySize) { - this$static.m_DictionarySize = dictionarySize; - this$static.m_DictionarySizeCheck = max(this$static.m_DictionarySize, 1); - $Create_5(this$static.m_OutWindow, max(this$static.m_DictionarySizeCheck, 4096)); - } - return true; - } - - function $SetLcLpPb(this$static, lc, lp, pb) { - var numPosStates; - if (lc > 8 || lp > 4 || pb > 4) { - return false; - } - $Create_0(this$static.m_LiteralDecoder, lp, lc); - numPosStates = 1 << pb; - $Create(this$static.m_LenDecoder, numPosStates); - $Create(this$static.m_RepLenDecoder, numPosStates); - this$static.m_PosStateMask = numPosStates - 1; - return true; - } - - function getClass_32() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder_2_classLit; - } - - function Decoder() { - } - - _ = Decoder.prototype = new Object_0(); - _.getClass$ = getClass_32; - _.typeId$ = 0; - _.m_DictionarySize = -1; - _.m_DictionarySizeCheck = -1; - _.m_PosStateMask = 0; - _.nowPos64 = P0_longLit; - _.outSize = P0_longLit; - _.prevByte = 0; - _.rep0 = 0; - _.rep1 = 0; - _.rep2 = 0; - _.rep3 = 0; - _.state = 0; - function $Create(this$static, numPosStates) { - for (; this$static.m_NumPosStates < numPosStates; ++this$static.m_NumPosStates) { - this$static.m_LowCoder[this$static.m_NumPosStates] = $BitTreeDecoder(new BitTreeDecoder(), 3); - this$static.m_MidCoder[this$static.m_NumPosStates] = $BitTreeDecoder(new BitTreeDecoder(), 3); - } - } - - function $Decode(this$static, rangeDecoder, posState) { - var symbol; - if ($DecodeBit(rangeDecoder, this$static.m_Choice, 0) == 0) { - return $Decode_0(this$static.m_LowCoder[posState], rangeDecoder); - } - symbol = 8; - if ($DecodeBit(rangeDecoder, this$static.m_Choice, 1) == 0) { - symbol += $Decode_0(this$static.m_MidCoder[posState], rangeDecoder); - } else { - symbol += 8 + $Decode_0(this$static.m_HighCoder, rangeDecoder); - } - return symbol; - } - - function $Decoder$LenDecoder(this$static) { - this$static.m_Choice = initDim(_3S_classLit, 0, -1, 2, 1); - this$static.m_LowCoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit, 0, 7, 16, 0); - this$static.m_MidCoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit, 0, 7, 16, 0); - this$static.m_HighCoder = $BitTreeDecoder(new BitTreeDecoder(), 8); - return this$static; - } - - function $Init(this$static) { - var posState; - InitBitModels(this$static.m_Choice); - for (posState = 0; posState < this$static.m_NumPosStates; ++posState) { - InitBitModels(this$static.m_LowCoder[posState].Models); - InitBitModels(this$static.m_MidCoder[posState].Models); - } - InitBitModels(this$static.m_HighCoder.Models); - } - - function getClass_29() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LenDecoder_2_classLit; - } - - function Decoder$LenDecoder() { - } - - _ = Decoder$LenDecoder.prototype = new Object_0(); - _.getClass$ = getClass_29; - _.typeId$ = 0; - _.m_NumPosStates = 0; - function $Create_0(this$static, numPosBits, numPrevBits) { - var i, numStates; - if (this$static.m_Coders != null && this$static.m_NumPrevBits == numPrevBits && this$static.m_NumPosBits == numPosBits) - return; - this$static.m_NumPosBits = numPosBits; - this$static.m_PosMask = (1 << numPosBits) - 1; - this$static.m_NumPrevBits = numPrevBits; - numStates = 1 << this$static.m_NumPrevBits + this$static.m_NumPosBits; - this$static.m_Coders = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit, 0, 4, numStates, 0); - for (i = 0; i < numStates; ++i) - this$static.m_Coders[i] = $Decoder$LiteralDecoder$Decoder2(new Decoder$LiteralDecoder$Decoder2()); - } - - function $GetDecoder(this$static, pos, prevByte) { - return this$static.m_Coders[((pos & this$static.m_PosMask) << this$static.m_NumPrevBits) + ((prevByte & 255) >>> 8 - this$static.m_NumPrevBits)]; - } - - function $Init_0(this$static) { - var i, numStates; - numStates = 1 << this$static.m_NumPrevBits + this$static.m_NumPosBits; - for (i = 0; i < numStates; ++i) { - InitBitModels(this$static.m_Coders[i].m_Decoders); - } - } - - function getClass_31() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder_2_classLit; - } - - function Decoder$LiteralDecoder() { - } - - _ = Decoder$LiteralDecoder.prototype = new Object_0(); - _.getClass$ = getClass_31; - _.typeId$ = 0; - _.m_Coders = null; - _.m_NumPosBits = 0; - _.m_NumPrevBits = 0; - _.m_PosMask = 0; - function $DecodeNormal(this$static, rangeDecoder) { - var symbol; - symbol = 1; - do { - symbol = symbol << 1 | $DecodeBit(rangeDecoder, this$static.m_Decoders, symbol); - } while (symbol < 256); - return symbol << 24 >> 24; - } - - function $DecodeWithMatchByte(this$static, rangeDecoder, matchByte) { - var bit, matchBit, symbol; - symbol = 1; - do { - matchBit = matchByte >> 7 & 1; - matchByte <<= 1; - bit = $DecodeBit(rangeDecoder, this$static.m_Decoders, (1 + matchBit << 8) + symbol); - symbol = symbol << 1 | bit; - if (matchBit != bit) { - while (symbol < 256) { - symbol = symbol << 1 | $DecodeBit(rangeDecoder, this$static.m_Decoders, symbol); - } - break; - } - } while (symbol < 256); - return symbol << 24 >> 24; - } - - function $Decoder$LiteralDecoder$Decoder2(this$static) { - this$static.m_Decoders = initDim(_3S_classLit, 0, -1, 768, 1); - return this$static; - } - - function getClass_30() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit; - } - - function Decoder$LiteralDecoder$Decoder2() { - } - - _ = Decoder$LiteralDecoder$Decoder2.prototype = new Object_0(); - _.getClass$ = getClass_30; - _.typeId$ = 17; - function $clinit_59() { - $clinit_59 = nullMethod; - var c, j, k, slotFast; - g_FastPos = initDim(_3B_classLit, 0, -1, 2048, 1); - c = 2; - g_FastPos[0] = 0; - g_FastPos[1] = 1; - for (slotFast = 2; slotFast < 22; ++slotFast) { - k = 1 << (slotFast >> 1) - 1; - for (j = 0; j < k; ++j , ++c) - g_FastPos[c] = slotFast << 24 >> 24; - } - } - - function $Backward(this$static, cur) { - var backCur, backMem, posMem, posPrev; - this$static._optimumEndIndex = cur; - posMem = this$static._optimum[cur].PosPrev; - backMem = this$static._optimum[cur].BackPrev; - do { - if (this$static._optimum[cur].Prev1IsChar) { - $MakeAsChar(this$static._optimum[posMem]); - this$static._optimum[posMem].PosPrev = posMem - 1; - if (this$static._optimum[cur].Prev2) { - this$static._optimum[posMem - 1].Prev1IsChar = false; - this$static._optimum[posMem - 1].PosPrev = this$static._optimum[cur].PosPrev2; - this$static._optimum[posMem - 1].BackPrev = this$static._optimum[cur].BackPrev2; - } - } - posPrev = posMem; - backCur = backMem; - backMem = this$static._optimum[posPrev].BackPrev; - posMem = this$static._optimum[posPrev].PosPrev; - this$static._optimum[posPrev].BackPrev = backCur; - this$static._optimum[posPrev].PosPrev = cur; - cur = posPrev; - } while (cur > 0); - this$static.backRes = this$static._optimum[0].BackPrev; - this$static._optimumCurrentIndex = this$static._optimum[0].PosPrev; - return this$static._optimumCurrentIndex; - } - - function $BaseInit(this$static) { - var i; - this$static._state = 0; - this$static._previousByte = 0; - for (i = 0; i < 4; ++i) { - this$static._repDistances[i] = 0; - } - } - - function $CodeOneBlock(this$static, inSize, outSize, finished) { - var baseVal, complexState, curByte, distance, footerBits, i, len, lenToPosState, matchByte, pos, posReduced, posSlot, posState, progressPosValuePrev, subCoder; - inSize[0] = P0_longLit; - outSize[0] = P0_longLit; - finished[0] = true; - if (this$static._inStream) { - this$static._matchFinder._stream = this$static._inStream; - $Init_5(this$static._matchFinder); - this$static._needReleaseMFStream = true; - this$static._inStream = null; - } - if (this$static._finished) { - return; - } - this$static._finished = true; - progressPosValuePrev = this$static.nowPos64; - if (eq(this$static.nowPos64, P0_longLit)) { - if ($GetNumAvailableBytes(this$static._matchFinder) == 0) { - $Flush(this$static, lowBits_0(this$static.nowPos64)); - return; - } - $ReadMatchDistances(this$static); - posState = lowBits_0(this$static.nowPos64) & this$static._posStateMask; - $Encode_3(this$static._rangeEncoder, this$static._isMatch, (this$static._state << 4) + posState, 0); - this$static._state = StateUpdateChar(this$static._state); - curByte = $GetIndexByte(this$static._matchFinder, -this$static._additionalOffset); - $Encode_1($GetSubCoder(this$static._literalEncoder, lowBits_0(this$static.nowPos64), this$static._previousByte), this$static._rangeEncoder, curByte); - this$static._previousByte = curByte; - --this$static._additionalOffset; - this$static.nowPos64 = add(this$static.nowPos64, P1_longLit); - } - if ($GetNumAvailableBytes(this$static._matchFinder) == 0) { - $Flush(this$static, lowBits_0(this$static.nowPos64)); - return; - } - while (true) { - len = $GetOptimum(this$static, lowBits_0(this$static.nowPos64)); - pos = this$static.backRes; - posState = lowBits_0(this$static.nowPos64) & this$static._posStateMask; - complexState = (this$static._state << 4) + posState; - if (len == 1 && pos == -1) { - $Encode_3(this$static._rangeEncoder, this$static._isMatch, complexState, 0); - curByte = $GetIndexByte(this$static._matchFinder, -this$static._additionalOffset); - subCoder = $GetSubCoder(this$static._literalEncoder, lowBits_0(this$static.nowPos64), this$static._previousByte); - if (this$static._state < 7) { - $Encode_1(subCoder, this$static._rangeEncoder, curByte); - } else { - matchByte = $GetIndexByte(this$static._matchFinder, -this$static._repDistances[0] - 1 - this$static._additionalOffset); - $EncodeMatched(subCoder, this$static._rangeEncoder, matchByte, curByte); - } - this$static._previousByte = curByte; - this$static._state = StateUpdateChar(this$static._state); - } else { - $Encode_3(this$static._rangeEncoder, this$static._isMatch, complexState, 1); - if (pos < 4) { - $Encode_3(this$static._rangeEncoder, this$static._isRep, this$static._state, 1); - if (pos == 0) { - $Encode_3(this$static._rangeEncoder, this$static._isRepG0, this$static._state, 0); - if (len == 1) { - $Encode_3(this$static._rangeEncoder, this$static._isRep0Long, complexState, 0); - } else { - $Encode_3(this$static._rangeEncoder, this$static._isRep0Long, complexState, 1); - } - } else { - $Encode_3(this$static._rangeEncoder, this$static._isRepG0, this$static._state, 1); - if (pos == 1) { - $Encode_3(this$static._rangeEncoder, this$static._isRepG1, this$static._state, 0); - } else { - $Encode_3(this$static._rangeEncoder, this$static._isRepG1, this$static._state, 1); - $Encode_3(this$static._rangeEncoder, this$static._isRepG2, this$static._state, pos - 2); - } - } - if (len == 1) { - this$static._state = this$static._state < 7?9:11; - } else { - $Encode_0(this$static._repMatchLenEncoder, this$static._rangeEncoder, len - 2, posState); - this$static._state = this$static._state < 7?8:11; - } - distance = this$static._repDistances[pos]; - if (pos != 0) { - for (i = pos; i >= 1; --i) { - this$static._repDistances[i] = this$static._repDistances[i - 1]; - } - this$static._repDistances[0] = distance; - } - } else { - $Encode_3(this$static._rangeEncoder, this$static._isRep, this$static._state, 0); - this$static._state = this$static._state < 7?7:10; - $Encode_0(this$static._lenEncoder, this$static._rangeEncoder, len - 2, posState); - pos -= 4; - posSlot = GetPosSlot(pos); - lenToPosState = GetLenToPosState(len); - $Encode_2(this$static._posSlotEncoder[lenToPosState], this$static._rangeEncoder, posSlot); - if (posSlot >= 4) { - footerBits = (posSlot >> 1) - 1; - baseVal = (2 | posSlot & 1) << footerBits; - posReduced = pos - baseVal; - if (posSlot < 14) { - ReverseEncode(this$static._posEncoders, baseVal - posSlot - 1, this$static._rangeEncoder, footerBits, posReduced); - } else { - $EncodeDirectBits(this$static._rangeEncoder, posReduced >> 4, footerBits - 4); - $ReverseEncode(this$static._posAlignEncoder, this$static._rangeEncoder, posReduced & 15); - ++this$static._alignPriceCount; - } - } - distance = pos; - for (i = 3; i >= 1; --i) { - this$static._repDistances[i] = this$static._repDistances[i - 1]; - } - this$static._repDistances[0] = distance; - ++this$static._matchPriceCount; - } - this$static._previousByte = $GetIndexByte(this$static._matchFinder, len - 1 - this$static._additionalOffset); - } - this$static._additionalOffset -= len; - this$static.nowPos64 = add(this$static.nowPos64, fromInt(len)); - if (this$static._additionalOffset == 0) { - if (this$static._matchPriceCount >= 128) { - $FillDistancesPrices(this$static); - } - if (this$static._alignPriceCount >= 16) { - $FillAlignPrices(this$static); - } - inSize[0] = this$static.nowPos64; - outSize[0] = $GetProcessedSizeAdd(this$static._rangeEncoder); - if ($GetNumAvailableBytes(this$static._matchFinder) == 0) { - $Flush(this$static, lowBits_0(this$static.nowPos64)); - return; - } - if (compare(sub(this$static.nowPos64, progressPosValuePrev), P1000_longLit) >= 0) { - this$static._finished = false; - finished[0] = false; - return; - } - } - } - } - - function $Create_2(this$static) { - var bt, numHashBytes; - if (!this$static._matchFinder) { - bt = ($clinit_60() , new BinTree()); - numHashBytes = 4; - if (this$static._matchFinderType == 0) { - numHashBytes = 2; - } - $SetType(bt, numHashBytes); - this$static._matchFinder = bt; - } - $Create_1(this$static._literalEncoder, this$static._numLiteralPosStateBits, this$static._numLiteralContextBits); - if (this$static._dictionarySize == this$static._dictionarySizePrev && this$static._numFastBytesPrev == this$static._numFastBytes) { - return; - } - $Create_3(this$static._matchFinder, this$static._dictionarySize, 4096, this$static._numFastBytes, 274); - this$static._dictionarySizePrev = this$static._dictionarySize; - this$static._numFastBytesPrev = this$static._numFastBytes; - } - - function $Encoder(this$static) { - var i; - $clinit_59(); - this$static._repDistances = initDim(_3I_classLit, 0, -1, 4, 1); - this$static._optimum = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit, 0, 6, 4096, 0); - this$static._rangeEncoder = ($clinit_66() , new Encoder_0()); - this$static._isMatch = initDim(_3S_classLit, 0, -1, 192, 1); - this$static._isRep = initDim(_3S_classLit, 0, -1, 12, 1); - this$static._isRepG0 = initDim(_3S_classLit, 0, -1, 12, 1); - this$static._isRepG1 = initDim(_3S_classLit, 0, -1, 12, 1); - this$static._isRepG2 = initDim(_3S_classLit, 0, -1, 12, 1); - this$static._isRep0Long = initDim(_3S_classLit, 0, -1, 192, 1); - this$static._posSlotEncoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit, 0, 8, 4, 0); - this$static._posEncoders = initDim(_3S_classLit, 0, -1, 114, 1); - this$static._posAlignEncoder = $BitTreeEncoder(new BitTreeEncoder(), 4); - this$static._lenEncoder = $Encoder$LenPriceTableEncoder(new Encoder$LenPriceTableEncoder()); - this$static._repMatchLenEncoder = $Encoder$LenPriceTableEncoder(new Encoder$LenPriceTableEncoder()); - this$static._literalEncoder = new Encoder$LiteralEncoder(); - this$static._matchDistances = initDim(_3I_classLit, 0, -1, 548, 1); - this$static._posSlotPrices = initDim(_3I_classLit, 0, -1, 256, 1); - this$static._distancesPrices = initDim(_3I_classLit, 0, -1, 512, 1); - this$static._alignPrices = initDim(_3I_classLit, 0, -1, 16, 1); - this$static.reps = initDim(_3I_classLit, 0, -1, 4, 1); - this$static.repLens = initDim(_3I_classLit, 0, -1, 4, 1); - this$static.processedInSize = initDim(_3J_classLit, 0, -1, 1, 3); - this$static.processedOutSize = initDim(_3J_classLit, 0, -1, 1, 3); - this$static.finished = initDim(_3Z_classLit, 0, -1, 1, 2); - this$static.properties = initDim(_3B_classLit, 0, -1, 5, 1); - this$static.tempPrices = initDim(_3I_classLit, 0, -1, 128, 1); - for (i = 0; i < 4096; ++i) { - this$static._optimum[i] = new Encoder$Optimal(); - } - for (i = 0; i < 4; ++i) { - this$static._posSlotEncoder[i] = $BitTreeEncoder(new BitTreeEncoder(), 6); - } - return this$static; - } - - function $FillAlignPrices(this$static) { - var i; - for (i = 0; i < 16; ++i) { - this$static._alignPrices[i] = $ReverseGetPrice(this$static._posAlignEncoder, i); - } - this$static._alignPriceCount = 0; - } - - function $FillDistancesPrices(this$static) { - var baseVal, encoder, footerBits, i, lenToPosState, posSlot, st, st2; - for (i = 4; i < 128; ++i) { - posSlot = GetPosSlot(i); - footerBits = (posSlot >> 1) - 1; - baseVal = (2 | posSlot & 1) << footerBits; - this$static.tempPrices[i] = ReverseGetPrice(this$static._posEncoders, baseVal - posSlot - 1, footerBits, i - baseVal); - } - for (lenToPosState = 0; lenToPosState < 4; ++lenToPosState) { - encoder = this$static._posSlotEncoder[lenToPosState]; - st = lenToPosState << 6; - for (posSlot = 0; posSlot < this$static._distTableSize; ++posSlot) { - this$static._posSlotPrices[st + posSlot] = $GetPrice_1(encoder, posSlot); - } - for (posSlot = 14; posSlot < this$static._distTableSize; ++posSlot) { - this$static._posSlotPrices[st + posSlot] += (posSlot >> 1) - 1 - 4 << 6; - } - st2 = lenToPosState * 128; - for (i = 0; i < 4; ++i) { - this$static._distancesPrices[st2 + i] = this$static._posSlotPrices[st + i]; - } - for (; i < 128; ++i) { - this$static._distancesPrices[st2 + i] = this$static._posSlotPrices[st + GetPosSlot(i)] + this$static.tempPrices[i]; - } - } - this$static._matchPriceCount = 0; - } - - function $Flush(this$static, nowPos) { - $ReleaseMFStream(this$static); - $WriteEndMarker(this$static, nowPos & this$static._posStateMask); - $FlushData(this$static._rangeEncoder); - } - - function $GetOptimum(this$static, position) { - var cur, curAnd1Price, curAndLenCharPrice, curAndLenPrice, curBack, curPrice, currentByte, distance, i, len, lenEnd, lenMain, lenRes, lenTest, lenTest2, lenTestTemp, matchByte, matchPrice, newLen, nextIsChar, nextMatchPrice, nextOptimum, nextRepMatchPrice, normalMatchPrice, numAvailableBytes, numAvailableBytesFull, numDistancePairs, offs, offset, opt, optimum, pos, posPrev, posState, posStateNext, price_4, repIndex, repLen, repMatchPrice, repMaxIndex, shortRepPrice, startLen, state, state2, t, price, price_0, price_1, price_2, price_3; - if (this$static._optimumEndIndex != this$static._optimumCurrentIndex) { - lenRes = this$static._optimum[this$static._optimumCurrentIndex].PosPrev - this$static._optimumCurrentIndex; - this$static.backRes = this$static._optimum[this$static._optimumCurrentIndex].BackPrev; - this$static._optimumCurrentIndex = this$static._optimum[this$static._optimumCurrentIndex].PosPrev; - return lenRes; - } - this$static._optimumCurrentIndex = this$static._optimumEndIndex = 0; - if (this$static._longestMatchWasFound) { - lenMain = this$static._longestMatchLength; - this$static._longestMatchWasFound = false; - } else { - lenMain = $ReadMatchDistances(this$static); - } - numDistancePairs = this$static._numDistancePairs; - numAvailableBytes = $GetNumAvailableBytes(this$static._matchFinder) + 1; - if (numAvailableBytes < 2) { - this$static.backRes = -1; - return 1; - } - if (numAvailableBytes > 273) { - numAvailableBytes = 273; - } - repMaxIndex = 0; - for (i = 0; i < 4; ++i) { - this$static.reps[i] = this$static._repDistances[i]; - this$static.repLens[i] = $GetMatchLen(this$static._matchFinder, -1, this$static.reps[i], 273); - if (this$static.repLens[i] > this$static.repLens[repMaxIndex]) { - repMaxIndex = i; - } - } - if (this$static.repLens[repMaxIndex] >= this$static._numFastBytes) { - this$static.backRes = repMaxIndex; - lenRes = this$static.repLens[repMaxIndex]; - $MovePos(this$static, lenRes - 1); - return lenRes; - } - if (lenMain >= this$static._numFastBytes) { - this$static.backRes = this$static._matchDistances[numDistancePairs - 1] + 4; - $MovePos(this$static, lenMain - 1); - return lenMain; - } - currentByte = $GetIndexByte(this$static._matchFinder, -1); - matchByte = $GetIndexByte(this$static._matchFinder, -this$static._repDistances[0] - 1 - 1); - if (lenMain < 2 && currentByte != matchByte && this$static.repLens[repMaxIndex] < 2) { - this$static.backRes = -1; - return 1; - } - this$static._optimum[0].State = this$static._state; - posState = position & this$static._posStateMask; - this$static._optimum[1].Price = ($clinit_66() , ProbPrices[this$static._isMatch[(this$static._state << 4) + posState] >>> 2]) + $GetPrice_0($GetSubCoder(this$static._literalEncoder, position, this$static._previousByte), this$static._state >= 7, matchByte, currentByte); - $MakeAsChar(this$static._optimum[1]); - matchPrice = ProbPrices[2048 - this$static._isMatch[(this$static._state << 4) + posState] >>> 2]; - repMatchPrice = matchPrice + ProbPrices[2048 - this$static._isRep[this$static._state] >>> 2]; - if (matchByte == currentByte) { - shortRepPrice = repMatchPrice + $GetRepLen1Price(this$static, this$static._state, posState); - if (shortRepPrice < this$static._optimum[1].Price) { - this$static._optimum[1].Price = shortRepPrice; - $MakeAsShortRep(this$static._optimum[1]); - } - } - lenEnd = lenMain >= this$static.repLens[repMaxIndex]?lenMain:this$static.repLens[repMaxIndex]; - if (lenEnd < 2) { - this$static.backRes = this$static._optimum[1].BackPrev; - return 1; - } - this$static._optimum[1].PosPrev = 0; - this$static._optimum[0].Backs0 = this$static.reps[0]; - this$static._optimum[0].Backs1 = this$static.reps[1]; - this$static._optimum[0].Backs2 = this$static.reps[2]; - this$static._optimum[0].Backs3 = this$static.reps[3]; - len = lenEnd; - do { - this$static._optimum[len--].Price = 268435455; - } while (len >= 2); - for (i = 0; i < 4; ++i) { - repLen = this$static.repLens[i]; - if (repLen < 2) { - continue; - } - price_4 = repMatchPrice + $GetPureRepPrice(this$static, i, this$static._state, posState); - do { - curAndLenPrice = price_4 + $GetPrice(this$static._repMatchLenEncoder, repLen - 2, posState); - optimum = this$static._optimum[repLen]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = i; - optimum.Prev1IsChar = false; - } - } while (--repLen >= 2); - } - normalMatchPrice = matchPrice + ProbPrices[this$static._isRep[this$static._state] >>> 2]; - len = this$static.repLens[0] >= 2?this$static.repLens[0] + 1:2; - if (len <= lenMain) { - offs = 0; - while (len > this$static._matchDistances[offs]) { - offs += 2; - } - for (;; ++len) { - distance = this$static._matchDistances[offs + 1]; - curAndLenPrice = normalMatchPrice + $GetPosLenPrice(this$static, distance, len, posState); - optimum = this$static._optimum[len]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = 0; - optimum.BackPrev = distance + 4; - optimum.Prev1IsChar = false; - } - if (len == this$static._matchDistances[offs]) { - offs += 2; - if (offs == numDistancePairs) { - break; - } - } - } - } - cur = 0; - while (true) { - ++cur; - if (cur == lenEnd) { - return $Backward(this$static, cur); - } - newLen = $ReadMatchDistances(this$static); - numDistancePairs = this$static._numDistancePairs; - if (newLen >= this$static._numFastBytes) { - this$static._longestMatchLength = newLen; - this$static._longestMatchWasFound = true; - return $Backward(this$static, cur); - } - ++position; - posPrev = this$static._optimum[cur].PosPrev; - if (this$static._optimum[cur].Prev1IsChar) { - --posPrev; - if (this$static._optimum[cur].Prev2) { - state = this$static._optimum[this$static._optimum[cur].PosPrev2].State; - if (this$static._optimum[cur].BackPrev2 < 4) { - state = (state < 7) ? 8 : 11; - } else { - state = (state < 7) ? 7 : 10; - } - } else { - state = this$static._optimum[posPrev].State; - } - state = StateUpdateChar(state); - } else { - state = this$static._optimum[posPrev].State; - } - if (posPrev == cur - 1) { - if (this$static._optimum[cur].BackPrev == 0) { - state = state < 7?9:11; - } else { - state = StateUpdateChar(state); - } - } else { - if (this$static._optimum[cur].Prev1IsChar && this$static._optimum[cur].Prev2) { - posPrev = this$static._optimum[cur].PosPrev2; - pos = this$static._optimum[cur].BackPrev2; - state = state < 7?8:11; - } else { - pos = this$static._optimum[cur].BackPrev; - if (pos < 4) { - state = state < 7?8:11; - } else { - state = state < 7?7:10; - } - } - opt = this$static._optimum[posPrev]; - if (pos < 4) { - if (pos == 0) { - this$static.reps[0] = opt.Backs0; - this$static.reps[1] = opt.Backs1; - this$static.reps[2] = opt.Backs2; - this$static.reps[3] = opt.Backs3; - } else if (pos == 1) { - this$static.reps[0] = opt.Backs1; - this$static.reps[1] = opt.Backs0; - this$static.reps[2] = opt.Backs2; - this$static.reps[3] = opt.Backs3; - } else if (pos == 2) { - this$static.reps[0] = opt.Backs2; - this$static.reps[1] = opt.Backs0; - this$static.reps[2] = opt.Backs1; - this$static.reps[3] = opt.Backs3; - } else { - this$static.reps[0] = opt.Backs3; - this$static.reps[1] = opt.Backs0; - this$static.reps[2] = opt.Backs1; - this$static.reps[3] = opt.Backs2; - } - } else { - this$static.reps[0] = pos - 4; - this$static.reps[1] = opt.Backs0; - this$static.reps[2] = opt.Backs1; - this$static.reps[3] = opt.Backs2; - } - } - this$static._optimum[cur].State = state; - this$static._optimum[cur].Backs0 = this$static.reps[0]; - this$static._optimum[cur].Backs1 = this$static.reps[1]; - this$static._optimum[cur].Backs2 = this$static.reps[2]; - this$static._optimum[cur].Backs3 = this$static.reps[3]; - curPrice = this$static._optimum[cur].Price; - currentByte = $GetIndexByte(this$static._matchFinder, -1); - matchByte = $GetIndexByte(this$static._matchFinder, -this$static.reps[0] - 1 - 1); - posState = position & this$static._posStateMask; - curAnd1Price = curPrice + ProbPrices[this$static._isMatch[(state << 4) + posState] >>> 2] + $GetPrice_0($GetSubCoder(this$static._literalEncoder, position, $GetIndexByte(this$static._matchFinder, -2)), state >= 7, matchByte, currentByte); - nextOptimum = this$static._optimum[cur + 1]; - nextIsChar = false; - if (curAnd1Price < nextOptimum.Price) { - nextOptimum.Price = curAnd1Price; - nextOptimum.PosPrev = cur; - nextOptimum.BackPrev = -1; - nextOptimum.Prev1IsChar = false; - nextIsChar = true; - } - matchPrice = curPrice + ProbPrices[2048 - this$static._isMatch[(state << 4) + posState] >>> 2]; - repMatchPrice = matchPrice + ProbPrices[2048 - this$static._isRep[state] >>> 2]; - if (matchByte == currentByte && !(nextOptimum.PosPrev < cur && nextOptimum.BackPrev == 0)) { - shortRepPrice = repMatchPrice + (ProbPrices[this$static._isRepG0[state] >>> 2] + ProbPrices[this$static._isRep0Long[(state << 4) + posState] >>> 2]); - if (shortRepPrice <= nextOptimum.Price) { - nextOptimum.Price = shortRepPrice; - nextOptimum.PosPrev = cur; - nextOptimum.BackPrev = 0; - nextOptimum.Prev1IsChar = false; - nextIsChar = true; - } - } - numAvailableBytesFull = $GetNumAvailableBytes(this$static._matchFinder) + 1; - numAvailableBytesFull = 4095 - cur < numAvailableBytesFull?4095 - cur:numAvailableBytesFull; - numAvailableBytes = numAvailableBytesFull; - if (numAvailableBytes < 2) { - continue; - } - if (numAvailableBytes > this$static._numFastBytes) { - numAvailableBytes = this$static._numFastBytes; - } - if (!nextIsChar && matchByte != currentByte) { - t = min(numAvailableBytesFull - 1, this$static._numFastBytes); - lenTest2 = $GetMatchLen(this$static._matchFinder, 0, this$static.reps[0], t); - if (lenTest2 >= 2) { - state2 = StateUpdateChar(state); - posStateNext = position + 1 & this$static._posStateMask; - nextRepMatchPrice = curAnd1Price + ProbPrices[2048 - this$static._isMatch[(state2 << 4) + posStateNext] >>> 2] + ProbPrices[2048 - this$static._isRep[state2] >>> 2]; - offset = cur + 1 + lenTest2; - while (lenEnd < offset) { - this$static._optimum[++lenEnd].Price = 268435455; - } - curAndLenPrice = nextRepMatchPrice + (price = $GetPrice(this$static._repMatchLenEncoder, lenTest2 - 2, posStateNext) , price + $GetPureRepPrice(this$static, 0, state2, posStateNext)); - optimum = this$static._optimum[offset]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = false; - } - } - } - startLen = 2; - for (repIndex = 0; repIndex < 4; ++repIndex) { - lenTest = $GetMatchLen(this$static._matchFinder, -1, this$static.reps[repIndex], numAvailableBytes); - if (lenTest < 2) { - continue; - } - lenTestTemp = lenTest; - do { - while (lenEnd < cur + lenTest) { - this$static._optimum[++lenEnd].Price = 268435455; - } - curAndLenPrice = repMatchPrice + (price_0 = $GetPrice(this$static._repMatchLenEncoder, lenTest - 2, posState) , price_0 + $GetPureRepPrice(this$static, repIndex, state, posState)); - optimum = this$static._optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = repIndex; - optimum.Prev1IsChar = false; - } - } while (--lenTest >= 2); - lenTest = lenTestTemp; - if (repIndex == 0) { - startLen = lenTest + 1; - } - if (lenTest < numAvailableBytesFull) { - t = min(numAvailableBytesFull - 1 - lenTest, this$static._numFastBytes); - lenTest2 = $GetMatchLen(this$static._matchFinder, lenTest, this$static.reps[repIndex], t); - if (lenTest2 >= 2) { - state2 = state < 7?8:11; - posStateNext = position + lenTest & this$static._posStateMask; - curAndLenCharPrice = repMatchPrice + (price_1 = $GetPrice(this$static._repMatchLenEncoder, lenTest - 2, posState) , price_1 + $GetPureRepPrice(this$static, repIndex, state, posState)) + ProbPrices[this$static._isMatch[(state2 << 4) + posStateNext] >>> 2] + $GetPrice_0($GetSubCoder(this$static._literalEncoder, position + lenTest, $GetIndexByte(this$static._matchFinder, lenTest - 1 - 1)), true, $GetIndexByte(this$static._matchFinder, lenTest - 1 - (this$static.reps[repIndex] + 1)), $GetIndexByte(this$static._matchFinder, lenTest - 1)); - state2 = StateUpdateChar(state2); - posStateNext = position + lenTest + 1 & this$static._posStateMask; - nextMatchPrice = curAndLenCharPrice + ProbPrices[2048 - this$static._isMatch[(state2 << 4) + posStateNext] >>> 2]; - nextRepMatchPrice = nextMatchPrice + ProbPrices[2048 - this$static._isRep[state2] >>> 2]; - offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) { - this$static._optimum[++lenEnd].Price = 268435455; - } - curAndLenPrice = nextRepMatchPrice + (price_2 = $GetPrice(this$static._repMatchLenEncoder, lenTest2 - 2, posStateNext) , price_2 + $GetPureRepPrice(this$static, 0, state2, posStateNext)); - optimum = this$static._optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = repIndex; - } - } - } - } - if (newLen > numAvailableBytes) { - newLen = numAvailableBytes; - for (numDistancePairs = 0; newLen > this$static._matchDistances[numDistancePairs]; numDistancePairs += 2) { - } - this$static._matchDistances[numDistancePairs] = newLen; - numDistancePairs += 2; - } - if (newLen >= startLen) { - normalMatchPrice = matchPrice + ProbPrices[this$static._isRep[state] >>> 2]; - while (lenEnd < cur + newLen) { - this$static._optimum[++lenEnd].Price = 268435455; - } - offs = 0; - while (startLen > this$static._matchDistances[offs]) { - offs += 2; - } - for (lenTest = startLen;; ++lenTest) { - curBack = this$static._matchDistances[offs + 1]; - curAndLenPrice = normalMatchPrice + $GetPosLenPrice(this$static, curBack, lenTest, posState); - optimum = this$static._optimum[cur + lenTest]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur; - optimum.BackPrev = curBack + 4; - optimum.Prev1IsChar = false; - } - if (lenTest == this$static._matchDistances[offs]) { - if (lenTest < numAvailableBytesFull) { - t = min(numAvailableBytesFull - 1 - lenTest, this$static._numFastBytes); - lenTest2 = $GetMatchLen(this$static._matchFinder, lenTest, curBack, t); - if (lenTest2 >= 2) { - state2 = state < 7?7:10; - posStateNext = position + lenTest & this$static._posStateMask; - curAndLenCharPrice = curAndLenPrice + ProbPrices[this$static._isMatch[(state2 << 4) + posStateNext] >>> 2] + $GetPrice_0($GetSubCoder(this$static._literalEncoder, position + lenTest, $GetIndexByte(this$static._matchFinder, lenTest - 1 - 1)), true, $GetIndexByte(this$static._matchFinder, lenTest - (curBack + 1) - 1), $GetIndexByte(this$static._matchFinder, lenTest - 1)); - state2 = StateUpdateChar(state2); - posStateNext = position + lenTest + 1 & this$static._posStateMask; - nextMatchPrice = curAndLenCharPrice + ProbPrices[2048 - this$static._isMatch[(state2 << 4) + posStateNext] >>> 2]; - nextRepMatchPrice = nextMatchPrice + ProbPrices[2048 - this$static._isRep[state2] >>> 2]; - offset = lenTest + 1 + lenTest2; - while (lenEnd < cur + offset) { - this$static._optimum[++lenEnd].Price = 268435455; - } - curAndLenPrice = nextRepMatchPrice + (price_3 = $GetPrice(this$static._repMatchLenEncoder, lenTest2 - 2, posStateNext) , price_3 + $GetPureRepPrice(this$static, 0, state2, posStateNext)); - optimum = this$static._optimum[cur + offset]; - if (curAndLenPrice < optimum.Price) { - optimum.Price = curAndLenPrice; - optimum.PosPrev = cur + lenTest + 1; - optimum.BackPrev = 0; - optimum.Prev1IsChar = true; - optimum.Prev2 = true; - optimum.PosPrev2 = cur; - optimum.BackPrev2 = curBack + 4; - } - } - } - offs += 2; - if (offs == numDistancePairs) - break; - } - } - } - } - } - - function $GetPosLenPrice(this$static, pos, len, posState) { - var lenToPosState, price; - lenToPosState = GetLenToPosState(len); - if (pos < 128) { - price = this$static._distancesPrices[lenToPosState * 128 + pos]; - } else { - price = this$static._posSlotPrices[(lenToPosState << 6) + GetPosSlot2(pos)] + this$static._alignPrices[pos & 15]; - } - return price + $GetPrice(this$static._lenEncoder, len - 2, posState); - } - - function $GetPureRepPrice(this$static, repIndex, state, posState) { - var price; - if (repIndex == 0) { - price = ($clinit_66() , ProbPrices[this$static._isRepG0[state] >>> 2]); - price += ProbPrices[2048 - this$static._isRep0Long[(state << 4) + posState] >>> 2]; - } else { - price = ($clinit_66() , ProbPrices[2048 - this$static._isRepG0[state] >>> 2]); - if (repIndex == 1) { - price += ProbPrices[this$static._isRepG1[state] >>> 2]; - } else { - price += ProbPrices[2048 - this$static._isRepG1[state] >>> 2]; - price += GetPrice(this$static._isRepG2[state], repIndex - 2); - } - } - return price; - } - - function $GetRepLen1Price(this$static, state, posState) { - return ($clinit_66() , ProbPrices[this$static._isRepG0[state] >>> 2]) + ProbPrices[this$static._isRep0Long[(state << 4) + posState] >>> 2]; - } - - function $Init_4(this$static) { - var i; - $BaseInit(this$static); - $Init_9(this$static._rangeEncoder); - InitBitModels_0(this$static._isMatch); - InitBitModels_0(this$static._isRep0Long); - InitBitModels_0(this$static._isRep); - InitBitModels_0(this$static._isRepG0); - InitBitModels_0(this$static._isRepG1); - InitBitModels_0(this$static._isRepG2); - InitBitModels_0(this$static._posEncoders); - $Init_3(this$static._literalEncoder); - for (i = 0; i < 4; ++i) { - InitBitModels(this$static._posSlotEncoder[i].Models); - } - $Init_2(this$static._lenEncoder, 1 << this$static._posStateBits); - $Init_2(this$static._repMatchLenEncoder, 1 << this$static._posStateBits); - InitBitModels(this$static._posAlignEncoder.Models); - this$static._longestMatchWasFound = false; - this$static._optimumEndIndex = 0; - this$static._optimumCurrentIndex = 0; - this$static._additionalOffset = 0; - } - - function $MovePos(this$static, num) { - if (num > 0) { - $Skip(this$static._matchFinder, num); - this$static._additionalOffset += num; - } - } - - function $ReadMatchDistances(this$static) { - var lenRes; - lenRes = 0; - this$static._numDistancePairs = $GetMatches(this$static._matchFinder, this$static._matchDistances); - if (this$static._numDistancePairs > 0) { - lenRes = this$static._matchDistances[this$static._numDistancePairs - 2]; - if (lenRes == this$static._numFastBytes) - lenRes += $GetMatchLen(this$static._matchFinder, lenRes - 1, this$static._matchDistances[this$static._numDistancePairs - 1], 273 - lenRes); - } - ++this$static._additionalOffset; - return lenRes; - } - - function $ReleaseMFStream(this$static) { - if (!!this$static._matchFinder && this$static._needReleaseMFStream) { - this$static._matchFinder._stream = null; - this$static._needReleaseMFStream = false; - } - } - - function $ReleaseStreams(this$static) { - $ReleaseMFStream(this$static); - this$static._rangeEncoder.Stream = null; - } - - function $SetDictionarySize_0(this$static, dictionarySize) { - var dicLogSize; - if (dictionarySize < 1 || dictionarySize > 536870912) { - return false; - } - this$static._dictionarySize = dictionarySize; - for (dicLogSize = 0; dictionarySize > 1 << dicLogSize; ++dicLogSize) { - } - this$static._distTableSize = dicLogSize * 2; - return true; - } - - function $SetLcLpPb_0(this$static, lc, lp, pb) { - if (lp < 0 || lp > 4 || lc < 0 || lc > 8 || pb < 0 || pb > 4) { - return false; - } - this$static._numLiteralPosStateBits = lp; - this$static._numLiteralContextBits = lc; - this$static._posStateBits = pb; - this$static._posStateMask = (1 << this$static._posStateBits) - 1; - return true; - } - - function $SetMatchFinder(this$static, matchFinderIndex) { - var matchFinderIndexPrev; - if (matchFinderIndex < 0 || matchFinderIndex > 2) { - return false; - } - matchFinderIndexPrev = this$static._matchFinderType; - this$static._matchFinderType = matchFinderIndex; - if (!!this$static._matchFinder && matchFinderIndexPrev != this$static._matchFinderType) { - this$static._dictionarySizePrev = -1; - this$static._matchFinder = null; - } - return true; - } - - function $SetNumFastBytes(this$static, numFastBytes) { - if (numFastBytes < 5 || numFastBytes > 273) { - return false; - } - this$static._numFastBytes = numFastBytes; - return true; - } - - function $WriteCoderProperties(this$static, outStream) { - var i; - this$static.properties[0] = (this$static._posStateBits * 5 + this$static._numLiteralPosStateBits) * 9 + this$static._numLiteralContextBits << 24 >> 24; - for (i = 0; i < 4; ++i) { - this$static.properties[1 + i] = this$static._dictionarySize >> 8 * i << 24 >> 24; - } - $write_0(outStream, this$static.properties, 0, 5); - } - - function $WriteEndMarker(this$static, posState) { - var lenToPosState; - if (!this$static._writeEndMark) { - return; - } - $Encode_3(this$static._rangeEncoder, this$static._isMatch, (this$static._state << 4) + posState, 1); - $Encode_3(this$static._rangeEncoder, this$static._isRep, this$static._state, 0); - this$static._state = this$static._state < 7?7:10; - $Encode_0(this$static._lenEncoder, this$static._rangeEncoder, 0, posState); - lenToPosState = GetLenToPosState(2); - $Encode_2(this$static._posSlotEncoder[lenToPosState], this$static._rangeEncoder, 63); - $EncodeDirectBits(this$static._rangeEncoder, 67108863, 26); - $ReverseEncode(this$static._posAlignEncoder, this$static._rangeEncoder, 15); - } - - function GetPosSlot(pos) { - if (pos < 2048) { - return g_FastPos[pos]; - } - if (pos < 2097152) { - return g_FastPos[pos >> 10] + 20; - } - return g_FastPos[pos >> 20] + 40; - } - - function GetPosSlot2(pos) { - if (pos < 131072) { - return g_FastPos[pos >> 6] + 12; - } - if (pos < 134217728) { - return g_FastPos[pos >> 16] + 32; - } - return g_FastPos[pos >> 26] + 52; - } - - function getClass_38() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder_2_classLit; - } - - function Encoder() { - } - - _ = Encoder.prototype = new Object_0(); - _.getClass$ = getClass_38; - _.typeId$ = 0; - _._additionalOffset = 0; - _._alignPriceCount = 0; - _._dictionarySize = 4194304; - _._dictionarySizePrev = -1; - _._distTableSize = 44; - _._finished = false; - _._inStream = null; - _._longestMatchLength = 0; - _._longestMatchWasFound = false; - _._matchFinder = null; - _._matchFinderType = 1; - _._matchPriceCount = 0; - _._needReleaseMFStream = false; - _._numDistancePairs = 0; - _._numFastBytes = 32; - _._numFastBytesPrev = -1; - _._numLiteralContextBits = 3; - _._numLiteralPosStateBits = 0; - _._optimumCurrentIndex = 0; - _._optimumEndIndex = 0; - _._posStateBits = 2; - _._posStateMask = 3; - _._previousByte = 0; - _._state = 0; - _._writeEndMark = false; - _.backRes = 0; - _.nowPos64 = P0_longLit; - var g_FastPos; - function $Encode(this$static, rangeEncoder, symbol, posState) { - if (symbol < 8) { - $Encode_3(rangeEncoder, this$static._choice, 0, 0); - $Encode_2(this$static._lowCoder[posState], rangeEncoder, symbol); - } else { - symbol -= 8; - $Encode_3(rangeEncoder, this$static._choice, 0, 1); - if (symbol < 8) { - $Encode_3(rangeEncoder, this$static._choice, 1, 0); - $Encode_2(this$static._midCoder[posState], rangeEncoder, symbol); - } else { - $Encode_3(rangeEncoder, this$static._choice, 1, 1); - $Encode_2(this$static._highCoder, rangeEncoder, symbol - 8); - } - } - } - - function $Encoder$LenEncoder(this$static) { - var posState; - this$static._choice = initDim(_3S_classLit, 0, -1, 2, 1); - this$static._lowCoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit, 0, 8, 16, 0); - this$static._midCoder = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit, 0, 8, 16, 0); - this$static._highCoder = $BitTreeEncoder(new BitTreeEncoder(), 8); - for (posState = 0; posState < 16; ++posState) { - this$static._lowCoder[posState] = $BitTreeEncoder(new BitTreeEncoder(), 3); - this$static._midCoder[posState] = $BitTreeEncoder(new BitTreeEncoder(), 3); - } - return this$static; - } - - function $Init_2(this$static, numPosStates) { - var posState; - InitBitModels_0(this$static._choice); - for (posState = 0; posState < numPosStates; ++posState) { - InitBitModels(this$static._lowCoder[posState].Models); - InitBitModels(this$static._midCoder[posState].Models); - } - InitBitModels(this$static._highCoder.Models); - } - - function $SetPrices(this$static, posState, numSymbols, prices, st) { - var a0, a1, b0, b1, i; - a0 = ($clinit_66() , ProbPrices[this$static._choice[0] >>> 2]); - a1 = ProbPrices[2048 - this$static._choice[0] >>> 2]; - b0 = a1 + ProbPrices[this$static._choice[1] >>> 2]; - b1 = a1 + ProbPrices[2048 - this$static._choice[1] >>> 2]; - i = 0; - for (i = 0; i < 8; ++i) { - if (i >= numSymbols) - return; - prices[st + i] = a0 + $GetPrice_1(this$static._lowCoder[posState], i); - } - for (; i < 16; ++i) { - if (i >= numSymbols) - return; - prices[st + i] = b0 + $GetPrice_1(this$static._midCoder[posState], i - 8); - } - for (; i < numSymbols; ++i) { - prices[st + i] = b1 + $GetPrice_1(this$static._highCoder, i - 8 - 8); - } - } - - function getClass_33() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenEncoder_2_classLit; - } - - function Encoder$LenEncoder() { - } - - _ = Encoder$LenEncoder.prototype = new Object_0(); - _.getClass$ = getClass_33; - _.typeId$ = 0; - function $Encode_0(this$static, rangeEncoder, symbol, posState) { - $Encode(this$static, rangeEncoder, symbol, posState); - if (--this$static._counters[posState] == 0) { - $SetPrices(this$static, posState, this$static._tableSize, this$static._prices, posState * 272); - this$static._counters[posState] = this$static._tableSize; - } - } - - function $Encoder$LenPriceTableEncoder(this$static) { - $Encoder$LenEncoder(this$static); - this$static._prices = initDim(_3I_classLit, 0, -1, 4352, 1); - this$static._counters = initDim(_3I_classLit, 0, -1, 16, 1); - return this$static; - } - - function $GetPrice(this$static, symbol, posState) { - return this$static._prices[posState * 272 + symbol]; - } - - function $UpdateTables(this$static, numPosStates) { - var posState; - for (posState = 0; posState < numPosStates; ++posState) { - $SetPrices(this$static, posState, this$static._tableSize, this$static._prices, posState * 272); - this$static._counters[posState] = this$static._tableSize; - } - } - - function getClass_34() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenPriceTableEncoder_2_classLit; - } - - function Encoder$LenPriceTableEncoder() { - } - - _ = Encoder$LenPriceTableEncoder.prototype = new Encoder$LenEncoder(); - _.getClass$ = getClass_34; - _.typeId$ = 0; - _._tableSize = 0; - function $Create_1(this$static, numPosBits, numPrevBits) { - var i, numStates; - if (this$static.m_Coders != null && this$static.m_NumPrevBits == numPrevBits && this$static.m_NumPosBits == numPosBits) { - return; - } - this$static.m_NumPosBits = numPosBits; - this$static.m_PosMask = (1 << numPosBits) - 1; - this$static.m_NumPrevBits = numPrevBits; - numStates = 1 << this$static.m_NumPrevBits + this$static.m_NumPosBits; - this$static.m_Coders = initDim(_3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit, 0, 5, numStates, 0); - for (i = 0; i < numStates; ++i) { - this$static.m_Coders[i] = $Encoder$LiteralEncoder$Encoder2(new Encoder$LiteralEncoder$Encoder2()); - } - } - - function $GetSubCoder(this$static, pos, prevByte) { - return this$static.m_Coders[((pos & this$static.m_PosMask) << this$static.m_NumPrevBits) + ((prevByte & 255) >>> 8 - this$static.m_NumPrevBits)]; - } - - function $Init_3(this$static) { - var i, numStates; - numStates = 1 << this$static.m_NumPrevBits + this$static.m_NumPosBits; - for (i = 0; i < numStates; ++i) { - InitBitModels_0(this$static.m_Coders[i].m_Encoders); - } - } - - function getClass_36() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder_2_classLit; - } - - function Encoder$LiteralEncoder() { - } - - _ = Encoder$LiteralEncoder.prototype = new Object_0(); - _.getClass$ = getClass_36; - _.typeId$ = 0; - _.m_Coders = null; - _.m_NumPosBits = 0; - _.m_NumPrevBits = 0; - _.m_PosMask = 0; - function $Encode_1(this$static, rangeEncoder, symbol) { - var bit, context, i; - context = 1; - for (i = 7; i >= 0; --i) { - bit = symbol >> i & 1; - $Encode_3(rangeEncoder, this$static.m_Encoders, context, bit); - context = context << 1 | bit; - } - } - - function $EncodeMatched(this$static, rangeEncoder, matchByte, symbol) { - var bit, context, i, matchBit, same, state; - context = 1; - same = true; - for (i = 7; i >= 0; --i) { - bit = symbol >> i & 1; - state = context; - if (same) { - matchBit = matchByte >> i & 1; - state += 1 + matchBit << 8; - same = matchBit == bit; - } - $Encode_3(rangeEncoder, this$static.m_Encoders, state, bit); - context = context << 1 | bit; - } - } - - function $Encoder$LiteralEncoder$Encoder2(this$static) { - this$static.m_Encoders = initDim(_3S_classLit, 0, -1, 768, 1); - return this$static; - } - - function $GetPrice_0(this$static, matchMode, matchByte, symbol) { - var bit, context, i, matchBit, price; - price = 0; - context = 1; - i = 7; - if (matchMode) { - for (; i >= 0; --i) { - matchBit = matchByte >> i & 1; - bit = symbol >> i & 1; - price += GetPrice(this$static.m_Encoders[(1 + matchBit << 8) + context], bit); - context = context << 1 | bit; - if (matchBit != bit) { - --i; - break; - } - } - } - for (; i >= 0; --i) { - bit = symbol >> i & 1; - price += GetPrice(this$static.m_Encoders[context], bit); - context = context << 1 | bit; - } - return price; - } - - function getClass_35() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit; - } - - function Encoder$LiteralEncoder$Encoder2() { - } - - _ = Encoder$LiteralEncoder$Encoder2.prototype = new Object_0(); - _.getClass$ = getClass_35; - _.typeId$ = 18; - function $MakeAsChar(this$static) { - this$static.BackPrev = -1; - this$static.Prev1IsChar = false; - } - - function $MakeAsShortRep(this$static) { - this$static.BackPrev = 0; - this$static.Prev1IsChar = false; - } - - function getClass_37() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit; - } - - function Encoder$Optimal() { - } - - _ = Encoder$Optimal.prototype = new Object_0(); - _.getClass$ = getClass_37; - _.typeId$ = 19; - _.BackPrev = 0; - _.BackPrev2 = 0; - _.Backs0 = 0; - _.Backs1 = 0; - _.Backs2 = 0; - _.Backs3 = 0; - _.PosPrev = 0; - _.PosPrev2 = 0; - _.Prev1IsChar = false; - _.Prev2 = false; - _.Price = 0; - _.State = 0; - function $BitTreeDecoder(this$static, numBitLevels) { - this$static.NumBitLevels = numBitLevels; - this$static.Models = initDim(_3S_classLit, 0, -1, 1 << numBitLevels, 1); - return this$static; - } - - function $Decode_0(this$static, rangeDecoder) { - var bitIndex, m; - m = 1; - for (bitIndex = this$static.NumBitLevels; bitIndex != 0; --bitIndex) { - m = (m << 1) + $DecodeBit(rangeDecoder, this$static.Models, m); - } - return m - (1 << this$static.NumBitLevels); - } - - function $ReverseDecode(this$static, rangeDecoder) { - var bit, bitIndex, m, symbol; - m = 1; - symbol = 0; - for (bitIndex = 0; bitIndex < this$static.NumBitLevels; ++bitIndex) { - bit = $DecodeBit(rangeDecoder, this$static.Models, m); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - - function ReverseDecode(Models, startIndex, rangeDecoder, NumBitLevels) { - var bit, bitIndex, m, symbol; - m = 1; - symbol = 0; - for (bitIndex = 0; bitIndex < NumBitLevels; ++bitIndex) { - bit = $DecodeBit(rangeDecoder, Models, startIndex + m); - m <<= 1; - m += bit; - symbol |= bit << bitIndex; - } - return symbol; - } - - function getClass_42() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit; - } - - function BitTreeDecoder() { - } - - _ = BitTreeDecoder.prototype = new Object_0(); - _.getClass$ = getClass_42; - _.typeId$ = 20; - _.Models = null; - _.NumBitLevels = 0; - function $BitTreeEncoder(this$static, numBitLevels) { - this$static.NumBitLevels = numBitLevels; - this$static.Models = initDim(_3S_classLit, 0, -1, 1 << numBitLevels, 1); - return this$static; - } - - function $Encode_2(this$static, rangeEncoder, symbol) { - var bit, bitIndex, m; - m = 1; - for (bitIndex = this$static.NumBitLevels; bitIndex != 0;) { - --bitIndex; - bit = symbol >>> bitIndex & 1; - $Encode_3(rangeEncoder, this$static.Models, m, bit); - m = m << 1 | bit; - } - } - - function $GetPrice_1(this$static, symbol) { - var bit, bitIndex, m, price; - price = 0; - m = 1; - for (bitIndex = this$static.NumBitLevels; bitIndex != 0;) { - --bitIndex; - bit = symbol >>> bitIndex & 1; - price += GetPrice(this$static.Models[m], bit); - m = (m << 1) + bit; - } - return price; - } - - function $ReverseEncode(this$static, rangeEncoder, symbol) { - var bit, i, m; - m = 1; - for (i = 0; i < this$static.NumBitLevels; ++i) { - bit = symbol & 1; - $Encode_3(rangeEncoder, this$static.Models, m, bit); - m = m << 1 | bit; - symbol >>= 1; - } - } - - function $ReverseGetPrice(this$static, symbol) { - var bit, i, m, price; - price = 0; - m = 1; - for (i = this$static.NumBitLevels; i != 0; --i) { - bit = symbol & 1; - symbol >>>= 1; - price += GetPrice(this$static.Models[m], bit); - m = m << 1 | bit; - } - return price; - } - - function ReverseEncode(Models, startIndex, rangeEncoder, NumBitLevels, symbol) { - var bit, i, m; - m = 1; - for (i = 0; i < NumBitLevels; ++i) { - bit = symbol & 1; - $Encode_3(rangeEncoder, Models, startIndex + m, bit); - m = m << 1 | bit; - symbol >>= 1; - } - } - - function ReverseGetPrice(Models, startIndex, NumBitLevels, symbol) { - var bit, i, m, price; - price = 0; - m = 1; - for (i = NumBitLevels; i != 0; --i) { - bit = symbol & 1; - symbol >>>= 1; - price += ($clinit_66() , ProbPrices[((Models[startIndex + m] - bit ^ -bit) & 2047) >>> 2]); - m = m << 1 | bit; - } - return price; - } - - function getClass_43() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit; - } - - function BitTreeEncoder() { - } - - _ = BitTreeEncoder.prototype = new Object_0(); - _.getClass$ = getClass_43; - _.typeId$ = 21; - _.Models = null; - _.NumBitLevels = 0; - function $DecodeBit(this$static, probs, index) { - var newBound, prob; - prob = probs[index]; - newBound = (this$static.Range >>> 11) * prob; - if ((this$static.Code ^ -2147483648) < (newBound ^ -2147483648)) { - this$static.Range = newBound; - probs[index] = prob + (2048 - prob >>> 5) << 16 >> 16; - if ((this$static.Range & -16777216) == 0) { - this$static.Code = this$static.Code << 8 | $read(this$static.Stream); - this$static.Range <<= 8; - } - return 0; - } else { - this$static.Range -= newBound; - this$static.Code -= newBound; - probs[index] = prob - (prob >>> 5) << 16 >> 16; - if ((this$static.Range & -16777216) == 0) { - this$static.Code = this$static.Code << 8 | $read(this$static.Stream); - this$static.Range <<= 8; - } - return 1; - } - } - - function $DecodeDirectBits(this$static, numTotalBits) { - var i, result, t; - result = 0; - for (i = numTotalBits; i != 0; --i) { - this$static.Range >>>= 1; - t = this$static.Code - this$static.Range >>> 31; - this$static.Code -= this$static.Range & t - 1; - result = result << 1 | 1 - t; - if ((this$static.Range & -16777216) == 0) { - this$static.Code = this$static.Code << 8 | $read(this$static.Stream); - this$static.Range <<= 8; - } - } - return result; - } - - function $Init_8(this$static) { - var i; - this$static.Code = 0; - this$static.Range = -1; - for (i = 0; i < 5; ++i) { - this$static.Code = this$static.Code << 8 | $read(this$static.Stream); - } - } - - function InitBitModels(probs) { - var i; - for (i = 0; i < probs.length; ++i) { - probs[i] = 1024; - } - } - - function getClass_44() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Decoder_2_classLit; - } - - function Decoder_0() { - } - - _ = Decoder_0.prototype = new Object_0(); - _.getClass$ = getClass_44; - _.typeId$ = 0; - _.Code = 0; - _.Range = 0; - _.Stream = null; - function $clinit_66() { - $clinit_66 = nullMethod; - var end, i, j, start; - ProbPrices = initDim(_3I_classLit, 0, -1, 512, 1); - for (i = 8; i >= 0; --i) { - start = 1 << 9 - i - 1; - end = 1 << 9 - i; - for (j = start; j < end; ++j) { - ProbPrices[j] = (i << 6) + (end - j << 6 >>> 9 - i - 1); - } - } - } - - function $Encode_3(this$static, probs, index, symbol) { - var newBound, prob; - prob = probs[index]; - newBound = (this$static.Range >>> 11) * prob; - if (symbol == 0) { - this$static.Range = newBound; - probs[index] = prob + (2048 - prob >>> 5) << 16 >> 16; - } else { - this$static.Low = add(this$static.Low, and(fromInt(newBound), Pffffffff_longLit)); - this$static.Range -= newBound; - probs[index] = prob - (prob >>> 5) << 16 >> 16; - } - if ((this$static.Range & -16777216) == 0) { - this$static.Range <<= 8; - $ShiftLow(this$static); - } - } - - function $EncodeDirectBits(this$static, v, numTotalBits) { - var i; - for (i = numTotalBits - 1; i >= 0; --i) { - this$static.Range >>>= 1; - if ((v >>> i & 1) == 1) { - this$static.Low = add(this$static.Low, fromInt(this$static.Range)); - } - if ((this$static.Range & -16777216) == 0) { - this$static.Range <<= 8; - $ShiftLow(this$static); - } - } - } - - function $FlushData(this$static) { - var i; - for (i = 0; i < 5; ++i) { - $ShiftLow(this$static); - } - } - - function $GetProcessedSizeAdd(this$static) { - return add(add(fromInt(this$static._cacheSize), this$static._position), P4_longLit); - } - - function $Init_9(this$static) { - this$static._position = P0_longLit; - this$static.Low = P0_longLit; - this$static.Range = -1; - this$static._cacheSize = 1; - this$static._cache = 0; - } - - function $ShiftLow(this$static) { - var LowHi, temp; - LowHi = lowBits_0(shru(this$static.Low, 32)); - if (LowHi != 0 || compare(this$static.Low, Pff000000_longLit) < 0) { - this$static._position = add(this$static._position, fromInt(this$static._cacheSize)); - temp = this$static._cache; - do { - $write(this$static.Stream, temp + LowHi); - temp = 255; - } while (--this$static._cacheSize != 0); - this$static._cache = lowBits_0(this$static.Low) >>> 24; - } - ++this$static._cacheSize; - this$static.Low = shl(and(this$static.Low, Pffffff_longLit), 8); - } - - function GetPrice(Prob, symbol) { - $clinit_66(); - return ProbPrices[((Prob - symbol ^ -symbol) & 2047) >>> 2]; - } - - function InitBitModels_0(probs) { - $clinit_66(); - var i; - for (i = 0; i < probs.length; ++i) { - probs[i] = 1024; - } - } - - function getClass_45() { - return Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Encoder_2_classLit; - } - - function convert_binary_arr(arr) - { - var i; - - for (i = arr.length - 1; i >= 0; i -= 1) { - if (arr[i] < 0) { - arr[i] = 256 + arr[i]; - } - } - - return arr; - } - - function Encoder_0() { - } - - _ = Encoder_0.prototype = new Object_0(); - _.getClass$ = getClass_45; - _.typeId$ = 0; - _.Low = P0_longLit; - _.Range = 0; - _.Stream = null; - _._cache = 0; - _._cacheSize = 0; - _._position = P0_longLit; - var ProbPrices; - function decode(utf) { - var buf, i, x, y, z; - buf = $StringBuilder(new StringBuilder()); - for (i = 0; i < utf.length; ++i) { - x = utf[i] & 255; - if ((x & 128) == 0) { - if (x == 0) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - $appendNonNull(buf.data, String.fromCharCode(x & 65535)); - } else if ((x & 224) == 192) { - if (i + 1 >= utf.length) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - y = utf[++i] & 255; - if ((y & 192) != 128) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - $append(buf.data, String.fromCharCode((x & 31) << 6 & 65535 | y & 63)); - } else if ((x & 240) == 224) { - if (i + 2 >= utf.length) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - y = utf[++i] & 255; - if ((y & 192) != 128) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - z = utf[++i] & 255; - if ((z & 192) != 128) { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - $appendNonNull(buf.data, String.fromCharCode(((x & 15) << 12 | (y & 63) << 6 | z & 63) & 65535)); - } else { - /// It appears that this is binary data, so it can't be converted to a string, so just send it back. - return convert_binary_arr(utf); - } - } - return $toString(buf.data); - } - - function encode(s) { - var ch, chars, data, elen, i, charArr, n; - chars = (n = s.length , charArr = initDim(_3C_classLit, 0, -1, n, 1) , $getChars(s, 0, n, charArr, 0) , charArr); - elen = 0; - for (i = 0; i < s.length; ++i) { - ch = chars[i]; - if (ch >= 1 && ch <= 127) { - ++elen; - } else if (ch == 0 || ch >= 128 && ch <= 2047) { - elen += 2; - } else { - elen += 3; - } - } - data = initDim(_3B_classLit, 0, -1, elen, 1); - elen = 0; - for (i = 0; i < s.length; ++i) { - ch = chars[i]; - if (ch >= 1 && ch <= 127) { - data[elen++] = ch << 24 >> 24; - } else if (ch == 0 || ch >= 128 && ch <= 2047) { - data[elen++] = (192 | ch >> 6 & 31) << 24 >> 24; - data[elen++] = (128 | ch & 63) << 24 >> 24; - } else { - data[elen++] = (224 | ch >> 12 & 15) << 24 >> 24; - data[elen++] = (128 | ch >> 6 & 63) << 24 >> 24; - data[elen++] = (128 | ch & 63) << 24 >> 24; - } - } - return data; - } - - function $LZMADemo(this$static) { - return this$static; - } - function toDouble(a) { - return a[1] + a[0]; - } - - function compress() { - var this$static = $LZMADemo(new LZMADemo()), - percent, - start, - /// Arguments - str = arguments[0], - mode = arguments[1], - callback_num, - on_finish, - on_progress; - - if (typeof arguments[2] === "function") { - on_finish = arguments[2]; - if (typeof arguments[3] === "function") { - on_progress = arguments[3]; - } - } else { - callback_num = arguments[2]; - } - - this$static.mode = get_mode_obj(mode); - - this$static.c = $LZMAByteArrayCompressor(new LZMAByteArrayCompressor(), encode(str), this$static.mode); - - if (on_progress) { - on_progress(0); - } else if (typeof callback_num !== "undefined") { - update_progress(0, callback_num); - } - - function do_action() { - var res; - start = (new Date).getTime(); - while ($execute(this$static.c)) { - percent = toDouble(this$static.c.chunker.inBytesProcessed) / toDouble(this$static.c.length_0); - /// If about 200 miliseconds have passed, update the progress. - if ((new Date).getTime() - start > 200) { - if (on_progress) { - on_progress(percent); - } else if (typeof callback_num !== "undefined") { - update_progress(percent, callback_num); - } - setTimeout(do_action, 0); - return false; - } - } - - if (on_progress) { - on_progress(1); - } else if (typeof callback_num !== "undefined") { - update_progress(1, callback_num); - } - - /// .slice(0) is required for Firefox 4.0 (because I think arrays are now passed by reference, which is not allowed when sending messages to or from web workers). - /// .slice(0) simply returns the entire array by value. - res = $toByteArray(this$static.c.output).slice(0); - - if (on_finish) { - on_finish(res); - } else if (typeof callback_num !== "undefined") { - postMessage({ - action: action_compress, - callback_num: callback_num, - result: res - }); - } - } - - setTimeout(do_action, 1); - } - - function decompress() { - var this$static = $LZMADemo(new LZMADemo()), - percent, - data, - start, - text, - /// Arguments - byte_arr = arguments[0], - callback_num, - on_finish, - on_progress, - sent_unknown, - has_progress; - - if (typeof arguments[1] === "function") { - on_finish = arguments[1]; - if (typeof arguments[2] === "function") { - on_progress = arguments[2]; - } - } else { - callback_num = arguments[1]; - } - - data = initValues(_3B_classLit, 0, -1, byte_arr); - - this$static.d = $LZMAByteArrayDecompressor(new LZMAByteArrayDecompressor(), data); - - if (on_progress) { - on_progress(0); - } else if (typeof callback_num !== "undefined") { - update_progress(0, callback_num); - } - - function do_action() { - var res; - - start = (new Date).getTime(); - - while ($execute_0(this$static.d)) { - if ((new Date).getTime() - start > 200) { - if (has_progress) { - percent = toDouble(this$static.d.chunker.decoder.nowPos64) / toDouble(this$static.d.length_0); - /// If about 200 miliseconds have passed, update the progress. - if (on_progress) { - on_progress(percent); - } else if (typeof callback_num !== "undefined") { - update_progress(percent, callback_num); - } - } else if (!sent_unknown) { - update_progress(-1, callback_num); - sent_unknown = true; - } - setTimeout(do_action, 0); - return false; - } - } - - if (on_progress) { - on_progress(1); - } else if (typeof callback_num !== "undefined") { - update_progress(1, callback_num); - } - - res = decode($toByteArray(this$static.d.output)); - - if (on_finish) { - on_finish(res); - } else if (typeof callback_num !== "undefined") { - postMessage({ - action: action_decompress, - callback_num: callback_num, - /// If the result is an array of integers (because it is binary), we need to use slice to make a copy of the data before it is returned from the Web Worker. - result: (typeof res !== "string" ? res.slice(0) : res) - }); - } - } - - has_progress = toDouble(this$static.d.length_0) > -1; - - setTimeout(do_action, 0); - } - - function $onModuleLoad(this$static) { - compress(this$static); - decompress(this$static); - } - - function getClass_46() { - return Lorg_dellroad_lzma_demo_client_LZMADemo_2_classLit; - } - - function LZMADemo () {} - - _ = LZMADemo.prototype = new Object_0(); - _.getClass$ = getClass_46; - _.typeId$ = 0; - _.c = null; - _.d = null; - var DEFAULT_COMPRESSION_MODE; - function init() { - !!$stats && $stats({moduleName:$moduleName, subSystem:'startup', evtGroup:'moduleStartup', millis:(new Date()).getTime(), type:'onModuleLoadStart', className:'org.dellroad.lzma.demo.client.LZMADemo'}); - } - - function gwtOnLoad(errFn, modName, modBase) { - $moduleName = modName; - $moduleBase = modBase; - if (errFn) { - try { - init(); - } - catch (e) { - errFn(modName); - } - } else { - init(); - } - } - - function nullMethod() { - } - - var Ljava_lang_Object_2_classLit = createForClass('java.lang.', 'Object'), - Ljava_lang_Throwable_2_classLit = createForClass('java.lang.', 'Throwable'), - Ljava_lang_Exception_2_classLit = createForClass('java.lang.', 'Exception'), - Ljava_lang_RuntimeException_2_classLit = createForClass('java.lang.', 'RuntimeException'), - Lcom_google_gwt_core_client_JavaScriptException_2_classLit = createForClass('com.google.gwt.core.client.', 'JavaScriptException'), - Lcom_google_gwt_core_client_JavaScriptObject_2_classLit = createForClass('com.google.gwt.core.client.', 'JavaScriptObject$'), _3_3D_classLit = createForArray('', '[[D'), - Ljava_io_InputStream_2_classLit = createForClass('java.io.', 'InputStream'), - Ljava_io_ByteArrayInputStream_2_classLit = createForClass('java.io.', 'ByteArrayInputStream'), _3B_classLit = createForArray('', '[B'), - Ljava_io_OutputStream_2_classLit = createForClass('java.io.', 'OutputStream'), - Ljava_io_ByteArrayOutputStream_2_classLit = createForClass('java.io.', 'ByteArrayOutputStream'), - Ljava_io_IOException_2_classLit = createForClass('java.io.', 'IOException'), - Ljava_lang_Enum_2_classLit = createForClass('java.lang.', 'Enum'), - Ljava_lang_ArithmeticException_2_classLit = createForClass('java.lang.', 'ArithmeticException'), - Ljava_lang_ArrayStoreException_2_classLit = createForClass('java.lang.', 'ArrayStoreException'), _3C_classLit = createForArray('', '[C'), - Ljava_lang_Class_2_classLit = createForClass('java.lang.', 'Class'), - Ljava_lang_ClassCastException_2_classLit = createForClass('java.lang.', 'ClassCastException'), - Ljava_lang_IllegalArgumentException_2_classLit = createForClass('java.lang.', 'IllegalArgumentException'), - Ljava_lang_IllegalStateException_2_classLit = createForClass('java.lang.', 'IllegalStateException'), - Ljava_lang_IndexOutOfBoundsException_2_classLit = createForClass('java.lang.', 'IndexOutOfBoundsException'), _3I_classLit = createForArray('', '[I'), - Ljava_lang_NullPointerException_2_classLit = createForClass('java.lang.', 'NullPointerException'), - Ljava_lang_String_2_classLit = createForClass('java.lang.', 'String'), - Ljava_lang_StringBuilder_2_classLit = createForClass('java.lang.', 'StringBuilder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_InWindow_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZ.', 'InWindow'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_BinTree_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZ.', 'BinTree'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZ_OutWindow_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZ.', 'OutWindow'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Chunker_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Chunker'), _3S_classLit = createForArray('', '[S'), _3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit = createForArray('[Lorg.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'BitTreeDecoder;'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Decoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LenDecoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Decoder$LenDecoder'), _3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit = createForArray('[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Decoder$LiteralDecoder$Decoder2;'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Decoder$LiteralDecoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Decoder$LiteralDecoder$Decoder2_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Decoder$LiteralDecoder$Decoder2'), _3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit = createForArray('[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$Optimal;'), _3Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit = createForArray('[Lorg.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'BitTreeEncoder;'), _3J_classLit = createForArray('', '[J'), _3Z_classLit = createForArray('', '[Z'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder'), _3Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit = createForArray('[Lorg.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$LiteralEncoder$Encoder2;'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$LiteralEncoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LiteralEncoder$Encoder2_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$LiteralEncoder$Encoder2'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenEncoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$LenEncoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$LenPriceTableEncoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$LenPriceTableEncoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_LZMA_Encoder$Optimal_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.LZMA.', 'Encoder$Optimal'), - Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeDecoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'BitTreeDecoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_BitTreeEncoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'BitTreeEncoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Decoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'Decoder'), - Lorg_dellroad_lzma_client_SevenZip_Compression_RangeCoder_Encoder_2_classLit = createForClass('org.dellroad.lzma.client.SevenZip.Compression.RangeCoder.', 'Encoder'), - Lorg_dellroad_lzma_client_CompressionMode_2_classLit = createForEnum('org.dellroad.lzma.client.', 'CompressionMode'), - Lorg_dellroad_lzma_client_LZMACompressor_2_classLit = createForClass('org.dellroad.lzma.client.', 'LZMACompressor'), - Lorg_dellroad_lzma_client_LZMAByteArrayCompressor_2_classLit = createForClass('org.dellroad.lzma.client.', 'LZMAByteArrayCompressor'), - Lorg_dellroad_lzma_client_LZMADecompressor_2_classLit = createForClass('org.dellroad.lzma.client.', 'LZMADecompressor'), - Lorg_dellroad_lzma_client_LZMAByteArrayDecompressor_2_classLit = createForClass('org.dellroad.lzma.client.', 'LZMAByteArrayDecompressor'), - Lorg_dellroad_lzma_demo_client_LZMADemo_2_classLit = createForClass('org.dellroad.lzma.demo.client.', 'LZMADemo'); - - gwtOnLoad(function() {},'lzma_demo',''); - - - var get_mode_obj = (function () { - var modes = [ - {dictionarySize: 16, fb: 64, matchFinder: 0, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 20, fb: 64, matchFinder: 0, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 19, fb: 64, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 20, fb: 64, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 21, fb: 128, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 22, fb: 128, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 23, fb: 128, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 24, fb: 255, matchFinder: 1, lc: 3, lp: 0, pb: 2}, - {dictionarySize: 25, fb: 255, matchFinder: 1, lc: 3, lp: 0, pb: 2} - ]; - - function isNumber(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - return function (mode) { - if (!isNumber(mode)) { - mode = 1; - } else { - if (mode < 1) { - mode = 1; - } else if (mode > 9) { - mode = 9; - } - } - - return modes[mode - 1]; - } - }()); - - /// Are we in a Web Worker? - /// This seems to be the most reliable way to detect this. - if (typeof onmessage !== "undefined" && (typeof window === "undefined" || typeof window.document === "undefined")) { - (function create_onmessage() { - /// Create the global onmessage function. - onmessage = function (e) { - if (e && e.data) { - if (e.data.action === action_compress) { - LZMA.compress(e.data.data, e.data.mode, e.data.callback_num); - } else if (e.data.action === action_decompress) { - LZMA.decompress(e.data.data, e.data.callback_num); - } - } - } - }()); - } - - return { - compress: compress, - decompress: decompress - }; -}()); - -/// Allow Node.js to be able to access this directly if it is included directly. -this.LZMA = LZMA; - -/// This is used by browsers that do not support web workers. -this.LZMA_WORKER = LZMA; diff --git a/web/static/js9_old/plugins/fitsy/pako_inflate.min.js b/web/static/js9_old/plugins/fitsy/pako_inflate.min.js deleted file mode 100644 index 0abc5cf..0000000 --- a/web/static/js9_old/plugins/fitsy/pako_inflate.min.js +++ /dev/null @@ -1,2 +0,0 @@ -/* pako 0.1.1 nodeca/pako */ -!function(e){if("object"==typeof exports)module.exports=e();else if("function"==typeof define&&define.amd)define(e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.pako=e()}}(function(){return function e(t,i,n){function a(r,o){if(!i[r]){if(!t[r]){var d="function"==typeof require&&require;if(!o&&d)return d(r,!0);if(s)return s(r,!0);throw new Error("Cannot find module '"+r+"'")}var f=i[r]={exports:{}};t[r][0].call(f.exports,function(e){var i=t[r][1][e];return a(i?i:e)},f,f.exports,e,t,i,n)}return i[r].exports}for(var s="function"==typeof require&&require,r=0;r=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f;var i=s.inflateInit2(this.strm,t.windowBits);if(i!==o.Z_OK)throw new Error(d[i])};l.prototype.push=function(e,t){var i,n,a=this.strm,d=this.options.chunkSize;if(this.ended)return!1;n=o.Z_NO_FLUSH,a.next_in=e,a.next_in_index=0,a.avail_in=a.next_in.length,a.next_out=new r.Buf8(d);do{if(a.avail_out=this.options.chunkSize,a.next_out_index=0,i=s.inflate(a,n),i!==o.Z_STREAM_END&&i!==o.Z_OK)return this.onEnd(i),this.ended=!0,!1;a.next_out_index&&(this.onData(r.shrinkBuf(a.next_out,a.next_out_index)),(a.avail_in>0||0===a.avail_out)&&(a.next_out=new r.Buf8(this.options.chunkSize)))}while(a.avail_in>0||0===a.avail_out);return n=t===~~t?t:t===!0?o.Z_FINISH:o.Z_NO_FLUSH,n===o.Z_FINISH?(i=s.inflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===o.Z_OK):!0},l.prototype.onData=function(e){this.chunks.push(e)},l.prototype.onEnd=function(e){e===o.Z_OK&&(this.result=r.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},i.Inflate=l,i.inflate=n,i.inflateRaw=a},{"./zlib/constants":3,"./zlib/inflate.js":6,"./zlib/messages":8,"./zlib/utils":9,"./zlib/zstream":10}],2:[function(e,t){"use strict";function i(e,t,i,n){for(var a=65535&e|0,s=e>>>16&65535|0,r=0;0!==i;){r=i>2e3?2e3:i,i-=r;do a=a+t[n++]|0,s=s+a|0;while(--r);a%=65521,s%=65521}return a|s<<16|0}t.exports=i},{}],3:[function(e,t){t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],4:[function(e,t){"use strict";function i(){for(var e,t=[],i=0;256>i;i++){e=i;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t}function n(e,t,i,n){var s=a,r=n+i;e=-1^e;for(var o=n;r>o;o++)e=e>>>8^s[255&(e^t[o])];return-1^e}var a=i();t.exports=n},{}],5:[function(e,t){"use strict";var i=30,n=12;t.exports=function(e,t){var a,s,r,o,d,f,l,c,h,u,w,b,_,k,m,x,v,g,p,y,B,E,S,Z,z;a=e.state,s=e.next_in_index,Z=e.next_in,r=s+(e.avail_in-5),o=e.next_out_index,z=e.next_out,d=o-(t-e.avail_out),f=o+(e.avail_out-257),l=a.dmax,c=a.wsize,h=a.whave,u=a.wnext,w=a.window,b=a.hold,_=a.bits,k=a.lencode,m=a.distcode,x=(1<_&&(b+=Z[s++]<<_,_+=8,b+=Z[s++]<<_,_+=8),g=k[b&x];t:for(;;){if(p=g>>>24,b>>>=p,_-=p,p=g>>>16&255,0===p)z[o++]=65535&g;else{if(!(16&p)){if(0===(64&p)){g=k[(65535&g)+(b&(1<_&&(b+=Z[s++]<<_,_+=8),y+=b&(1<>>=p,_-=p),15>_&&(b+=Z[s++]<<_,_+=8,b+=Z[s++]<<_,_+=8),g=m[b&v];i:for(;;){if(p=g>>>24,b>>>=p,_-=p,p=g>>>16&255,!(16&p)){if(0===(64&p)){g=m[(65535&g)+(b&(1<_&&(b+=Z[s++]<<_,_+=8,p>_&&(b+=Z[s++]<<_,_+=8)),B+=b&(1<l){e.msg="invalid distance too far back",a.mode=i;break e}if(b>>>=p,_-=p,p=o-d,B>p){if(p=B-p,p>h&&a.sane){e.msg="invalid distance too far back",a.mode=i;break e}if(E=0,S=w,0===u){if(E+=c-p,y>p){y-=p;do z[o++]=w[E++];while(--p);E=o-B,S=z}}else if(p>u){if(E+=c+u-p,p-=u,y>p){y-=p;do z[o++]=w[E++];while(--p);if(E=0,y>u){p=u,y-=p;do z[o++]=w[E++];while(--p);E=o-B,S=z}}}else if(E+=u-p,y>p){y-=p;do z[o++]=w[E++];while(--p);E=o-B,S=z}for(;y>2;)z[o++]=S[E++],z[o++]=S[E++],z[o++]=S[E++],y-=3;y&&(z[o++]=S[E++],y>1&&(z[o++]=S[E++]))}else{E=o-B;do z[o++]=z[E++],z[o++]=z[E++],z[o++]=z[E++],y-=3;while(y>2);y&&(z[o++]=z[E++],y>1&&(z[o++]=z[E++]))}break}}break}}while(r>s&&f>o);y=_>>3,s-=y,_-=y<<3,b&=(1<<_)-1,e.next_in_index=s,e.next_out_index=o,e.avail_in=r>s?5+(r-s):5-(s-r),e.avail_out=f>o?257+(f-o):257-(o-f),a.hold=b,a.bits=_}},{}],6:[function(e,t,i){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function a(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.next_index=0,this.lens=new m.Buf16(320),this.work=new m.Buf16(288),this.codes=new m.Buf32(kt),this.sane=0,this.back=0,this.was=0}function s(e,t,i,n,a,s,r,o){this.type=e,this.lens=t,this.lens_index=i,this.codes=n,this.table=a,this.table_index=s,this.bits=r,this.work=o}function r(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,t.wrap&&(e.adler=1&t.wrap),t.mode=L,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=new m.Buf32(kt),t.distcode=new m.Buf32(kt),t.sane=1,t.back=-1,R):N}function o(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,r(e)):N}function d(e,t){var i,n;return e&&e.state?(n=e.state,0>t?(i=0,t=-t):(i=(t>>4)+1,48>t&&(t&=15)),t&&(8>t||t>15)?N:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,o(e))):N}function f(e,t){var i,n;return e?(n=new a,e.state=n,n.window=null,i=d(e,t),i!==R&&(e.state=null),i):N}function l(e){return f(e,xt)}function c(e,t,i){var n;return e&&e.state?(n=e.state,0>t?(n.hold=0,n.bits=0,R):t>16||n.bits+t>32?N:(i&=(1<t;)e.lens[t++]=8;for(;256>t;)e.lens[t++]=9;for(;280>t;)e.lens[t++]=7;for(;288>t;)e.lens[t++]=8;for(i=9,p(new s(B,e.lens,0,288,_,0,i,e.work)),t=0;32>t;)e.lens[t++]=5;i=5,p(new s(E,e.lens,0,32,k,0,i,e.work)),vt=!1}e.lencode=_,e.lenbits=9,e.distcode=k,e.distbits=5}function u(e,t,i,n){var a,s=e.state;return null===s.window&&(s.wsize=1<=s.wsize?(m.arraySet(s.window,t,i-s.wsize,s.wsize,0),s.wnext=0,s.whave=s.wsize):(a=s.wsize-s.wnext,a>n&&(a=n),m.arraySet(s.window,t,i-n,a,s.wnext),n-=a,n?(m.arraySet(s.window,t,i-n,n,0),s.wnext=n,s.whave=s.wsize):(s.wnext+=a,s.wnext===s.wsize&&(s.wnext=0),s.whavew;){if(0===f)break e;f--,c+=a[o++]<>>8&255,i.check=v(i.check,zt,2,0),c=0,w=0,i.mode=D;break}if(i.flags=0,i.head&&(i.head.done=-1),!(1&i.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",i.mode=ht;break}if((15&c)!==U){e.msg="unknown compression method",i.mode=ht;break}if(c>>>=4,w-=4,yt=(15&c)+8,0===i.wbits)i.wbits=yt;else if(yt>i.wbits){e.msg="invalid window size",i.mode=ht;break}i.dmax=1<w;){if(0===f)break e;f--,c+=a[o++]<>8&1),512&i.flags&&(zt[0]=255&c,zt[1]=c>>>8&255,i.check=v(i.check,zt,2,0)),c=0,w=0,i.mode=C;case C:for(;32>w;){if(0===f)break e;f--,c+=a[o++]<>>8&255,zt[2]=c>>>16&255,zt[3]=c>>>24&255,i.check=v(i.check,zt,4,0)),c=0,w=0,i.mode=H;case H:for(;16>w;){if(0===f)break e;f--,c+=a[o++]<>8),512&i.flags&&(zt[0]=255&c,zt[1]=c>>>8&255,i.check=v(i.check,zt,2,0)),c=0,w=0,i.mode=K;case K:if(1024&i.flags){for(;16>w;){if(0===f)break e;f--,c+=a[o++]<>>8&255,i.check=v(i.check,zt,2,0)),c=0,w=0}else i.head&&(i.head.extra=null);i.mode=M;case M:if(1024&i.flags){if(k=i.length,k>f&&(k=f),k){if(i.head&&i.head.extra)throw yt=i.head.extra_len-i.length,"Review & implement right";512&i.flags&&(i.check=v(i.check,a,k,o)),f-=k,o+=k,i.length-=k}if(i.length)break e}i.length=0,i.mode=P;case P:if(2048&i.flags){if(0===f)break e;k=0;do yt=a[o+k++],i.head&&i.head.name&&i.lengthk);if(512&i.flags&&(i.check=v(i.check,a,k,o)),f-=k,o+=k,yt)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=j;case j:if(4096&i.flags){if(0===f)break e;k=0;do yt=a[o+k++],i.head&&i.head.comment&&i.lengthk);if(512&i.flags&&(i.check=v(i.check,a,k,o)),f-=k,o+=k,yt)break e}else i.head&&(i.head.comment=null);i.mode=q;case q:if(512&i.flags){for(;16>w;){if(0===f)break e;f--,c+=a[o++]<>9&1,i.head.done=1),e.adler=i.check=0,i.mode=G;break;case Y:for(;32>w;){if(0===f)break e;f--,c+=a[o++]<>>=7&w,w-=7&w,i.mode=ft;break}for(;3>w;){if(0===f)break e;f--,c+=a[o++]<>>=1,w-=1,3&c){case 0:i.mode=J;break;case 1:if(h(i),i.mode=it,t===z){c>>>=2,w-=2;break e}break;case 2:i.mode=$;break;case 3:e.msg="invalid block type",i.mode=ht}c>>>=2,w-=2;break;case J:for(c>>>=7&w,w-=7&w;32>w;){if(0===f)break e;f--,c+=a[o++]<>>16^65535)){e.msg="invalid stored block lengths",i.mode=ht;break}if(i.length=65535&c,c=0,w=0,i.mode=Q,t===z)break e;case Q:i.mode=V;case V:if(k=i.length){if(k>f&&(k=f),k>l&&(k=l),0===k)break e;m.arraySet(r,a,o,k,d),f-=k,o+=k,l-=k,d+=k,i.length-=k;break}i.mode=G;break;case $:for(;14>w;){if(0===f)break e;f--,c+=a[o++]<>>=5,w-=5,i.ndist=(31&c)+1,c>>>=5,w-=5,i.ncode=(15&c)+4,c>>>=4,w-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=ht;break}i.have=0,i.mode=et;case et:for(;i.havew;){if(0===f)break e;f--,c+=a[o++]<>>=3,w-=3}for(;i.have<19;)i.lens[Rt[i.have++]]=0;if(m.arraySet(i.lencode,i.codes,0,i.codes.length,0),i.lenbits=7,Et=new s(y,i.lens,0,19,i.lencode,0,i.lenbits,i.work),Bt=p(Et),i.lenbits=Et.bits,Bt){e.msg="invalid code lengths set",i.mode=ht;break}i.have=0,i.mode=tt;case tt:for(;i.have>>24,mt=Zt>>>16&255,xt=65535&Zt,!(w>=kt);){if(0===f)break e;f--,c+=a[o++]<xt)c>>>=kt,w-=kt,i.lens[i.have++]=xt;else{if(16===xt){for(St=kt+2;St>w;){if(0===f)break e;f--,c+=a[o++]<>>=kt,w-=kt,0===i.have){e.msg="invalid bit length repeat",i.mode=ht;break}yt=i.lens[i.have-1],k=3+(3&c),c>>>=2,w-=2}else if(17===xt){for(St=kt+3;St>w;){if(0===f)break e;f--,c+=a[o++]<>>=kt,w-=kt,yt=0,k=3+(7&c),c>>>=3,w-=3}else{for(St=kt+7;St>w;){if(0===f)break e;f--,c+=a[o++]<>>=kt,w-=kt,yt=0,k=11+(127&c),c>>>=7,w-=7}if(i.have+k>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=ht;break}for(;k--;)i.lens[i.have++]=yt}}if(i.mode===ht)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=ht;break}if(m.arraySet(i.lencode,i.codes,0,i.codes.length,0),i.lenbits=9,Et=new s(B,i.lens,0,i.nlen,i.lencode,0,i.lenbits,i.work),Bt=p(Et),i.lenbits=Et.bits,Bt){e.msg="invalid literal/lengths set",i.mode=ht;break}if(i.distbits=6,m.arraySet(i.distcode,i.codes,0,i.codes.length,0),Et=new s(E,i.lens,i.nlen,i.ndist,i.distcode,0,i.distbits,i.work),Bt=p(Et),i.distbits=Et.bits,Bt){e.msg="invalid distances set",i.mode=ht;break}if(i.mode=it,t===z)break e;case it:i.mode=nt;case nt:if(f>=6&&l>=258){e.next_out_index=d,e.avail_out=l,e.next_in_index=o,e.avail_in=f,i.hold=c,i.bits=w,g(e,_),d=e.next_out_index,r=e.next_out,l=e.avail_out,o=e.next_in_index,a=e.next_in,f=e.avail_in,c=i.hold,w=i.bits,i.mode===G&&(i.back=-1);break}for(i.back=0;Zt=i.lencode[c&(1<>>24,mt=Zt>>>16&255,xt=65535&Zt,!(w>=kt);){if(0===f)break e;f--,c+=a[o++]<>vt)],kt=Zt>>>24,mt=Zt>>>16&255,xt=65535&Zt,!(w>=vt+kt);){if(0===f)break e;f--,c+=a[o++]<>>=vt,w-=vt,i.back+=vt}if(c>>>=kt,w-=kt,i.back+=kt,i.length=xt,0===mt){i.mode=dt;break}if(32&mt){i.back=-1,i.mode=G;break}if(64&mt){e.msg="invalid literal/length code",i.mode=ht;break}i.extra=15&mt,i.mode=at;case at:if(i.extra){for(St=i.extra;St>w;){if(0===f)break e;f--,c+=a[o++]<>>=i.extra,w-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=st;case st:for(;Zt=i.distcode[c&(1<>>24,mt=Zt>>>16&255,xt=65535&Zt,!(w>=kt);){if(0===f)break e;f--,c+=a[o++]<>vt)],kt=Zt>>>24,mt=Zt>>>16&255,xt=65535&Zt,!(w>=vt+kt);){if(0===f)break e;f--,c+=a[o++]<>>=vt,w-=vt,i.back+=vt}if(c>>>=kt,w-=kt,i.back+=kt,64&mt){e.msg="invalid distance code",i.mode=ht;break}i.offset=xt,i.extra=15&mt,i.mode=rt;case rt:if(i.extra){for(St=i.extra;St>w;){if(0===f)break e;f--,c+=a[o++]<>>=i.extra,w-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=ht;break}i.mode=ot;case ot:if(0===l)break e;if(k=_-l,i.offset>k){if(k=i.offset-k,k>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=ht;break}k>i.wnext?(k-=i.wnext,bt=i.wsize-k):bt=i.wnext-k,k>i.length&&(k=i.length),_t=i.window}else _t=r,bt=d-i.offset,k=i.length;k>l&&(k=l),l-=k,i.length-=k;do r[d++]=_t[bt++];while(--k);0===i.length&&(i.mode=nt);break;case dt:if(0===l)break e;r[d++]=i.length,l--,i.mode=nt;break;case ft:if(i.wrap){for(;32>w;){if(0===f)break e;f--,c|=a[o++]<w;){if(0===f)break e;f--,c+=a[o++]<=Z;Z++)C[Z]=0;for(z=0;y>z;z++)C[p[e.lens_index+z]]++;for(O=E,A=n;A>=1&&0===C[A];A--);if(O>A&&(O=A),0===A)return B[e.table_index++]=20971520,B[e.table_index++]=20971520,e.bits=1,0;for(R=1;A>R&&0===C[R];R++);for(R>O&&(O=R),T=1,Z=1;n>=Z;Z++)if(T<<=1,T-=C[Z],0>T)return-1;if(T>0&&(g===r||1!==A))return-1;for(H[1]=0,Z=1;n>Z;Z++)H[Z+1]=H[Z]+C[Z];for(z=0;y>z;z++)0!==p[e.lens_index+z]&&(S[H[p[e.lens_index+z]]++]=z);switch(g){case r:L=K=S,k=19;break;case o:L=f,D-=257,K=l,M-=257,k=256;break;default:L=c,K=h,k=-1}if(U=0,z=0,Z=R,_=e.table_index,N=O,I=0,w=-1,F=1<a||g===d&&F>s)return 1;for(var P=0;;){P++,m=Z-I,S[z]k?(x=K[M+S[z]],v=L[D+S[z]]):(x=96,v=0),t=1<>I)+u]=m<<24|x<<16|v|0;while(0!==u);for(t=1<>=1;if(0!==t?(U&=t-1,U+=t):U=0,z++,0===--C[Z]){if(Z===A)break;Z=p[e.lens_index+S[z]]}if(Z>O&&(U&b)!==w){for(0===I&&(I=O),_+=R,N=Z-I,T=1<N+I&&(T-=C[N+I],!(0>=T));)N++,T<<=1;if(F+=1<a||g===d&&F>s)return 1;w=U&b,B[w]=O<<24|N<<16|_-e.table_index}}return 0!==U&&(B[_+U]=Z-I<<24|64<<16|0),e.table_index+=F,e.bits=O,0}},{"./utils":9}],8:[function(e,t){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],9:[function(e,t,i){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;i.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(var n in i)i.hasOwnProperty(n)&&(e[n]=i[n])}}return e},i.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var a={arraySet:function(e,t,i,n,a){if(t.subarray)return void e.set(t.subarray(i,i+n),a);for(var s=0;n>s;s++)e[a+s]=t[i+s]},flattenChunks:function(e){var t,i,n,a,s,r;for(n=0,t=0,i=e.length;i>t;t++)n+=e[t].length;for(r=new Uint8Array(n),a=0,t=0,i=e.length;i>t;t++)s=e[t],r.set(s,a),a+=s.length;return r}},s={arraySet:function(e,t,i,n,a){for(var s=0;n>s;s++)e[a+s]=t[i+s]},flattenChunks:function(e){return[].concat.apply([],e)}};i.setTyped=function(e){e?(i.Buf8=Uint8Array,i.Buf16=Uint16Array,i.Buf32=Int32Array,i.assign(i,a)):(i.Buf8=Array,i.Buf16=Array,i.Buf32=Array,i.assign(i,s))},i.setTyped(n)},{}],10:[function(e,t){"use strict";function i(){this.next_in=null,this.next_in_index=0,this.avail_in=0,this.total_in=0,this.next_out=null,this.next_out_index=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=i},{}]},{},[1])(1)}); \ No newline at end of file diff --git a/web/static/js9_old/plugins/help/blend.html b/web/static/js9_old/plugins/help/blend.html deleted file mode 100644 index 1db6a83..0000000 --- a/web/static/js9_old/plugins/help/blend.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -Plugin: JS9Blend - - - -
    -

    JS9 Image Blending

    - -

    -The Image Blending plugin allows you to combine selected images -using a specified blend mode and optional opacity. Blend modes are -different ways in which the colors of individual pixels are -combined between a source and background image. For example, -the multiply mode multiplies the color value of the source -pixel by the color value of the background pixel and uses the -resulting (scaled) value for the color: -

    -    x = a * b
    -
    -Multiplying white (value 1) by any other color results in the latter -color being used. Multiplying black (value 0) by any other color -results in black being used. Thus, multiply makes whites -transparent but otherwise darkens the image. - -

    -One of the most useful blend modes for astronomy is screen, which is -the opposite of multiply: white pixels are made opaque, black pixels -become transparent, and other pixels are lightened. The blend algorithm -multiplies inverses and takes the inverse of the result: -

    -    x = 1 − ((1 − a) × (1 − b))
    -
    - -

    -Standard blend modes supported by modern Web browsers are documented in - -W3C Compositing and Blending, which includes algorithms and examples -for each mode. - -

    -The Image Blending plugin allows you to toggle global image blending -on and off, so that you can switch between blending and the ordinary display -of a single image. By default, when the plugin is displayed, blending is -turned on. - -

    -Each image loaded into the display will be shown in a stack. -The currently active image will be displayed with a green border. -This is the image that responds to contrast/bias changes, region -creation, etc. It also is the image on which browser-based analysis -and server-based analysis is performed. You can click on any image -in the stack to make it the current image. - -

    -If you have two or more observations of the same object displayed, you -probably will want to align them by WCS coordinates. This can be done by -utilizing the WCS->reproject menu option, which uses the WCS of one -image to reproject the other into a new raw data layer. - -

    -Once two or more images are aligned, you can change the colormap, -contrast/bias and scaling of each of them separately and then combine -them into a single display. This is done by clicking the blend -using button to add this image to the blend list, and the choosing -its blend mode and optional opacity. You can continue to change the -colormap, scale, contrast/bias, etc. of the current image even after -blending has been turned on. - -

    -Note that some, but not all, blend modes are commutative. In particular, -the non-separable blend modes (hue, saturation, -color, and luminosity) are all order-dependent. In such -cases, you can change the stacking order simply by dragging an image -into the appropriate place on the stack. -

    - - diff --git a/web/static/js9_old/plugins/help/blink.html b/web/static/js9_old/plugins/help/blink.html deleted file mode 100644 index 3012aa2..0000000 --- a/web/static/js9_old/plugins/help/blink.html +++ /dev/null @@ -1,36 +0,0 @@ - - - - - -Plugin: JS9Blink - - - -
    -

    JS9 Image Blinking

    - -

    -The Image Blinking plugin allows you repeatedly to display a -sequence of selected images at the specified blink rate. You also can -blink selected images manually. - -

    -The Blink Images option turns on image blinking for all images -that have their own blink option set. (Thus, it is not -necessary to blink all of the loaded images.) The blink rate -menu option allows you to choose the rate of re-display, with values -ranging from 0.1 seconds to 30 seconds. The default is 1 second. You -also can click the blink manually button to display the next -image in the stack. - -

    -The blink sequence follows the order of the images listed in the image -stack. This order can be changed by moving images up and down the stack. -Note that the currently active image will be displayed with a green -border. This is the image that responds to contrast/bias changes, -region creation, etc. -

    - - diff --git a/web/static/js9_old/plugins/help/cmaps.html b/web/static/js9_old/plugins/help/cmaps.html deleted file mode 100644 index 717ea1d..0000000 --- a/web/static/js9_old/plugins/help/cmaps.html +++ /dev/null @@ -1,75 +0,0 @@ - - - - - -Plugin: JS9Cmaps - - - -
    -

    Create Colormaps

    - -

    -The Colormaps plugin allows you to create compatible colormaps -using a base color or an existing colormap. You can choose -the number of colormaps to create, the algorithm used to create the -new colormaps, and whether to apply them to existing images. - -

    -In order to give more control over colormap creation, the plugin -allows you to specify a number of slices into which the 360 -degree colorwheel will be divided, starting with the base color. -The n created colormaps are then assigned to the first n slices of -the colorwheel. For example, if you choose to create three slices and -three colormaps, each colormap will be separated from the others by -120 degrees (1/3 of the colorwheel). If you create six slices and three -colormaps, each colormap will be separated by 60 degrees (1/6 of the -colorwheel), starting from the base color. - -

    -The algorithms for generating new colormaps are: -

      -
    • equidistant: colormaps are created so that they are equidistant around the colorwheel. For example, when creating three colormaps from three slices, starting with a red base, the three colors used for the colormaps will be at 0, 120, and 240 degrees around the colorwheel (i.e. red, green, and blue). -
    • analogous: create groups of colors around the colorwheel (i.e., generally closer than equidistant). For example, red, orange, and red-orange are analogous colors. Choose three or more colormaps. -
    -There are many, many articles on the net describing colors and their -compatibility. Just search for "colorwheel", "color theory", or -"compatible colors", etc. - -

    -When the color picker is used to select a base color, new colors are -chosen from this base color to generate monochromatic colormaps. When an -existing colormap is used, each inflection point of the colormap generates -new colors, which then are combined into new colormaps. - -

    -By default, the color picker is the HTML5 color picker implemented -within the browser. These internal color pickers generally have -several nice ways to choose a color. If the browser does not support -an internal color picker (e.g. Safari 11, even though the Mac OSX -supports a great color picker!), a simplified color picker is used -instead. Note that the HTML5 color picker is a bit quirky: it remains -displayed when the page is unloaded or reloaded, even though it -becomes detached from the new page. You must always exit the HTML5 -color picker by clicking its exit button. - -

    -The generated colormaps are added to the Color menu in the more colormaps ... submenu. If you use the color picker to choose a base color, the colormaps are named "[id]_1", [id]_2", etc., where [id] is the id of the JS9 display (e.g. "JS9"). If you use an existing colormap, the new colormaps are called "[cname]_1", [cname]_2", etc., where [cname] is the name of the original colormap. - -

    -Colormaps can be assigned to images by clicking the button to the left -of the image name. The colormap assignments are made in stacking -order, which you can change by dragging an image into the appropriate -place on the stack. - -

    -Note that the parameters of each colormap plugin instance can be -controlled independently, and that each instance allows you to assign -colormaps to any image, regardless of its parent display. This means, -for example, that you can load three images into separate displays and -change their colormaps simultaneously. -

    - - diff --git a/web/static/js9_old/plugins/help/colorbar.html b/web/static/js9_old/plugins/help/colorbar.html deleted file mode 100644 index feb37be..0000000 --- a/web/static/js9_old/plugins/help/colorbar.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - -Plugin: JS9Colorbar - - - -
    -

    JS9 Colorbar

    - -The JS9 Colorbar displays the mapping of colors to pixel values -for the currently displayed image. The choice of colormap and scale -(including scale min and max values) determines the initial -distribution of colors. Moving the mouse to changing the contrast/bias -affects the mapping by expanding/compressing (contrast) and shifting -(bias) the colormap so that it covers different ranges of image values. - -

    -If you change scales (e.g., from linear to log), the colormap at first -might not appear to change. However, note that the numeric labels have -changed. This shows you how colors are now associated with a different -range of pixel values. The linear scale displays an evenly distributed -range of image values, but the log scale does not: the distribution is -a log(base10) distribution. - -

    -When printing an image using the File->print menu option, if a -colorbar is active on the page, it will be placed beneath the image. -

    - - diff --git a/web/static/js9_old/plugins/help/colorcontrols.html b/web/static/js9_old/plugins/help/colorcontrols.html deleted file mode 100644 index de84656..0000000 --- a/web/static/js9_old/plugins/help/colorcontrols.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - -Plugin: JS9Color - - - -
    -

    Color Controls

    - -

    -The Color Controls plugin provides a number of ways to set colors -on an image: -

      -
    • use the Top cmaps and Other cmaps menus to change -the colormap -
    • use the Create cmaps button to toggle the -Create Colormaps plugin, allowing you to -create new colormaps -
    • use the Image filters button to toggle the Image Filters -plugin and apply image processing techniques to the displayed image -
    • use the Contrast/bias text boxes to change the contrast and bias -
    • use the Opacity options to set the opacity in various ways -
    - -

    -Opacity can be set in various ways, depending on the option chosen in the -mode menu: - -

    -When default is selected, the opacity of each pixel is set to the -default value in the first text box (which should be between 0 and 1). The -default value is also used in the pixels option. - -

    -When floor ≤ is selected, the opacity in the first text box -is applied to image pixels whose value is less than or equal to the -specified floor value in the last text box. For image values greater than -this floor value, the default opacity is applied. - -

    -When opacity is selected, a menu of opacity image files is -displayed. These opacity images must have the same dimensions as the -displayed image. A pixel value in the opacity image specifies the -opacity of the corresponding image pixel (and therefore should take on -values between 0 and 1). - -

    -For mask mode, if the value of a pixel in the image is less than -or equal to zero, the opacity of the displayed pixel is set to the -opacity value in the text box. Otherwise, the opacity is set to -the global opacity. Thus, for example, if the opacity in -the first text box is set to 0, this mode will display only the image -pixels with corresponding non-zero mask values, i.e., image pixels -"covered" by a mask. - -

    -When overlay is selected, a menu of overlay files is -displayed. These "overlay mask" images must have the same dimensions -as the displayed image. If a mask pixel has a non-zero alpha value (in -its own display frame), its color is blended with the image pixel -using source-atop composition. Otherwise, the image pixel -color alone is used in the display. This is one way you can display a -mask overlay on top of an image. A static colormap is usually used in -conjunction with an overlay mask, since pixel values not explicitly -assigned a color are transparent. Note that, when blending a mask and -image pixel, the global opacity and the individual pixel opacity of -the mask are multiplied to get each final pixel opacity. -

    - - diff --git a/web/static/js9_old/plugins/help/console.html b/web/static/js9_old/plugins/help/console.html deleted file mode 100644 index 2951dc5..0000000 --- a/web/static/js9_old/plugins/help/console.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - - -Plugin: JS9Console - - - -
    -

    JS9 Console

    - -

    -The Console plugin provides a mechanism for executing JS9 functions by -typing commands instead of using the graphical interface or -external messaging. A number of shortcut commands have been defined, including: -

    -    analysis    list/run analysis for current image (run)
    -    colormap    set/get colormap for current image (cmap)
    -    colormaps   get list of available colormaps (cmaps)
    -    global      set/get a JS9.globalOpts parameter
    -    grid        set/get coordinate grid for current image
    -    help        get list of available commands
    -    helper      set/get helper connection
    -    image       get name of current image or display specified image
    -    images      get list of currently loaded images
    -    load        load image(s)
    -    pan         set/get pan location for current image
    -    pix2wcs     get image pixel value for specified wcs position
    -    print       print image window
    -    refresh     refresh image using specified file (def: use last file)
    -    regcnts     counts in regions for current image
    -    regions     add or list region(s) (reg, region)
    -    resize      set/get display size for current image
    -    scale       set/get scaling for current image
    -    scales      get list of available scales
    -    section     display section of current image
    -    status      get status for specified (or current) image
    -    url         display a url
    -    wcssys      set/get wcs system for current image
    -    wcsu        set/get wcs units used for current image
    -    wcssystems  get list of available wcs systems
    -    wcsunits    get list of available wcs units
    -    wcs2pix     get wcs position for specified image pixel
    -    zoom        set/get zoom for current image
    -
    -where aliases are in parentheses.For example: -
    -    js9> cmap heat
    -
    -    js9> cmap
    -    heat 1 0.5
    -
    -The real value of the Console plugin lies in the fact that you can execute -any public access routine. For example: -
    -    js9> SetColormap heat
    -
    -    js9> GetColormap
    -    {"colormap":"heat","contrast":3.75,"bias":0.736328125}
    -
    -    js9> AddRegions circle(23:23:27.9,+58:48:42.8,3") {"color":"cyan"}
    -
    -The major constraint is that all arguments must be spaceless, e.g. you -cannot put spaces into a region specification. - -

    -The Console plugin thus provides a simple way of executing routines for -which there is no graphical interface. For example, you can execute -JS9.ShiftData() directly in the Console: -

    -    js9> ShiftData -10 10
    -
    - -

    -Note that the up and down arrow keys provide a simple history mechanism -for the Console plugin. - -

    - - diff --git a/web/static/js9_old/plugins/help/cube.html b/web/static/js9_old/plugins/help/cube.html deleted file mode 100644 index 62a99cb..0000000 --- a/web/static/js9_old/plugins/help/cube.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - - -Plugin: JS9Cube - - - -
    -

    JS9 FITS Data Cubes

    - -

    -The Data Cube plugin allows you to display slices from a FITS -3D data cube. You can choose the particular slice to display using the -slider, text box, or navigation buttons. You also can blink the slices -in order using the blink and stop buttons. The default blink interval -is one second, but this can be changed with the rate menu. - -

    -By default, the slice axis is the third axis of the cube. Use the menu -at the right to specify a different slice axis. - -

    -You also can load each slice separately into JS9 with the Load All -button. Each slice will be identified by the original filename with a -<n> suffix, where n is the slice number. Loading all slices -separately allows you to blend the cube images or set up RGB mode -(on any three of them). - -

    -The underlying public access routine, JS9.DisplaySlice(), also -works on FITS 4D data cubes. This plugin will be extended to support -4D cubes if there is a need within the astronomical community. -

    - - diff --git a/web/static/js9_old/plugins/help/divs.html b/web/static/js9_old/plugins/help/divs.html deleted file mode 100644 index 4e0b0d5..0000000 --- a/web/static/js9_old/plugins/help/divs.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - -Plugin: JS9Divs - - - -
    -

    Visibility of JS9 Plugin Divs

    - -

    -JS9 plugins can be added statically to a web page by specifying a div -element with the plugin class as an attribute, e.g: -

    -  <div class="JS9Menubar"></div>
    -  <div class="JS9"></div>
    -  <div style="margin-top: 2px;">
    -  <div class="JS9Colorbar"></div>
    -
    -This plugin allows you to hide or show these in-page plugins. It works by -setting the CSS visibility property on the divs. Note that -invisible elements will still take up space on the web page. - -
    - - diff --git a/web/static/js9_old/plugins/help/filters.html b/web/static/js9_old/plugins/help/filters.html deleted file mode 100644 index 63168ea..0000000 --- a/web/static/js9_old/plugins/help/filters.html +++ /dev/null @@ -1,89 +0,0 @@ - - - - - -Plugin: JS9Filters - - - -
    -

    JS9 Image Filters

    - -The Image Filter plugin allows you to apply image processing -techniques directly to the displayed image without changing the -underlying raw data. The web has an overwhelming -amount of information about image processing. A good technical -article concerning the use of image filters with Javascript and the -HTML5 canvas is available at: - -http://www.html5rocks.com/en/tutorials/canvas/imagefilters/ - - -

    -Note that the standard JS9 colormaps, scale, contrast and bias -selections are applied to the raw data to regenerate the RGB -image. Thus, if you use an image processing technique and then change -colormap, contrast, bias, or scale, you will undo the applied image -processing. This is a good way to reset the displayed image. - -

    -Several image processing filters and convolutions are available, many of -which allow you to adjust a parameter using either a slider or by -typing a value into the text box: -

      -
    • blur(val): blur the image using a pseudo-Gaussian convolution -
    • brighten(val): add constant value to each pixel to change the brightness -
    • darken(val): darken by applying the kernel -[ 0, 0, 0, 0, val, 0, 0, 0, 0], -
    • duotone(0|1|2): remove a color by setting it to -the average of the other two, e.g. red=(green+blue)/2, where the input -values are: 0 = red, 1 = green, 2 = blue -
    • edge(): detect edges using the kernel -[ -1, -1, -1, -1, 8, -1, -1, -1, -1 ] -
    • emboss(val): produce embossing effect using the kernel -[-18, -9, 9, -9, 100 - val, 9, 0, 9, 18 ] -
    • gamma(val): apply the nonlinear gamma operation, used to code and -decode luminance values in video or still image systems: -out = pow(in, val) -
    • invert(): the RGB channels of the image are inverted -
    • lighten(val): lighten the image by applying the kernel -[ 0, 0, 0, 0, val, 0, 0, 0, 0 ], -
    • luminance():convert to greyscale using the CIE luminance: -0.2126*r + 0.7152*g + 0.0722*b -[255-r, 255-g, 255-b, a] -
    • median(): noise reduction technique that replaces each pixel with -the median of neighboring pixels -
    • noise(val): add random noise: -pixel = pixel + Math.floor((Math.random()*(val) -
    • pixelate(val):make image look coarser by creating a square tiling -effect of the specified size -
    • scatter(val): scatters the colors of a pixel in its -neighborhood, akin to viewing through brittle cracked glass -
    • sepia(val): image takes on shades of brown, like an antique -photograph -
    • sharpen(val): sharpen the image using the kernel -[ 0, -3, 0, -3, val, -3, 0, -3, 0 ] -
    • sobel(): use the Sobel operator to create an image that -emphasizes the edges -
    • solarize(val): which image is wholly or partially reversed in -tone. Dark areas appear light or light areas appear dark. -
    - -

    -Filters are cumulative: if you apply a filter and then apply a second filter, -the latter changes the current RGB color values that were modified by the -first filter. - -

    -You can undo the effects of the current filter by clicking the -undo [filter] button. This reverts the image to the colors used -in the previous filter. The undo operation is applied to the -current filter, allowing you to unwind the filters back to the -original image colors. The reset operation unsets all filters. -(You can, of course, unset all filters at once by changing the -colormap, contrast, bias, or scale.) -

    - - diff --git a/web/static/js9_old/plugins/help/imarith.html b/web/static/js9_old/plugins/help/imarith.html deleted file mode 100644 index f086a94..0000000 --- a/web/static/js9_old/plugins/help/imarith.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Plugin: JS9Imarith - - - -
    -

    JS9 Image Arithmetic

    - -

    -The Image Arithmetic plugin performs basic arithmetic -operations (addition, subtraction, multiplication, division, minimum, -maximum) between the currently displayed image and either another -image or a constant real value. - -

    -To start, choose an arithmetic operation from the first menu. -Next use the second menu to choose either a real value or another -image as the second operand. In the former case, the constant value -you enter into the text box will be applied to each pixel in the -image. In the latter case, the operation is performed between the -corresponding pixels in the two images. - -

    -Click the Run button to perform the arithmetic operation. A -new raw data layer called "imarith" will be created containing the -results of the operation. Successive runs are cumulative, so that you -can build up a more complex operation from simple ones. - -

    -Click the Reset button to delete the "imarith" raw data layer, -which will allow you to start afresh. - -

    -Note that the two images must have the same dimensions. We might be -able to remove this restriction in the future, although it is -unclear how one lines up images of different dimensions. -

    - - diff --git a/web/static/js9_old/plugins/help/info.html b/web/static/js9_old/plugins/help/info.html deleted file mode 100644 index 7024579..0000000 --- a/web/static/js9_old/plugins/help/info.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - -Plugin: JS9Info - - - -
    -

    JS9 Info Box

    - -

    -Each JS9 window usually has a value/position display in the upper -left, which shows the pixel value at the current mouse position, along -with position information (WCS and/or image, depending on the -current coordinate system.) The Info Box plugin will display this information -and more in a separate window. - -

    -The information displayed in the Info Box depends on the values -contained in the JS9.globalOpts.infoBox property, an array -which looks something like this: - -

    -    infoBox: ["file", "object", "wcsfov", "wcscen", "wcspos",
    -              "impos", "physpos", "value", "regions", "progress"]
    -
    -The entries listed above tell the Info Box plugin to display the following -information: -
      -
    • file: file name -
    • object: object name, taken from FITS header -
    • wcsfov: wcs field of view -
    • wcscen: wcs center of image -
    • wcspos: current position in wcs coordinates -
    • impos: current position in image coordinates -
    • physpos: current position in physical (file) coordinates -
    • value: pixel value -
    • regions: regions, if these are not displayed in a separate window -
    • progress: progress bar, when used -
    -Currently, the other option(s) for display are: -
      -
    • dispos: current position in display coordinates -
    -You can change the list of displayed values at run-time using the -Preferences plugin or, for site-wide configuration, by -changing the value in the js9prefs.js file. -
    - - diff --git a/web/static/js9_old/plugins/help/keyboard.html b/web/static/js9_old/plugins/help/keyboard.html deleted file mode 100644 index 862d5fc..0000000 --- a/web/static/js9_old/plugins/help/keyboard.html +++ /dev/null @@ -1,71 +0,0 @@ - - - - - -Plugin: JS9Keyboard - - - -
    -

    Keyboard Actions

    - -

    -JS9 supports the actions that get executed in response to -(case-sensitive) keypress events. The following actions are -defined in the JS9.globalOpts.keyboardActions array: -

      -
    • 0: reset zoom -
    • b: toggle selected region: source/background -
    • e: toggle selected region: include/exclude -
    • o: open a local FITS file -
    • /: copy wcs position to clipboard -
    • ?: copy value and position to clipboard -
    • =: zoom in -
    • +: zoom in -
    • -: zoom out -
    • >: display next image -
    • <: display previous image -
    • delete: remove selected region -
    • leftArrow: move selected region left -
    • upArrow: move selected region up -
    • rightArrow: move selected region right -
    • downArrow: move selected region down -
    -You can view the current mapping between keys and actions using -this Keyboard plugin. Also, you can execute individual -actions by clicking the 'key' buttons. This is especially useful for -devices without keyboards, such as iPads and iPhones. - -

    -It is possible to add new actions. To do this, first add an entry to -the JS9.Keyboard.Actions object. The property name for the new -entry should be descriptive text, like that which is found -in JS9.globalOpts.keyboardActions. The property value -will be a function having the calling sequence: -

    -  function(im, ipos, evt)
    -
    -where: -
      -
    • im: the image handle of the current image (or null) -
    • ipos: the current image position of the mouse -
    • evt: the event that triggered this action -
    -For example: -
    -  JS9.Keyboard.Actions["export image as a PNG file"] = function(im, ipos, evt){
    -    .... action implementation goes here ...
    -  };
    -
    -Once this new action property has been defined, you can map it to a -keypress event in JS9.globalOpts.keyboardActions: -
    -  JS9.globalOpts.keyboardActions["x"] = "export image as a PNG file";
    -
    -The new action will be shown in the Keyboard plugin display, and will be -executed any time the "x" key is pressed. -
    - - diff --git a/web/static/js9_old/plugins/help/layers.html b/web/static/js9_old/plugins/help/layers.html deleted file mode 100644 index 3bfe580..0000000 --- a/web/static/js9_old/plugins/help/layers.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Plugin: JS9Layers - - - -
    -

    JS9 Shape Layers

    - -

    -JS9 supports individual layers for drawing 2D graphics. The regions -layer is a special case of a shape layer, created automatically by -JS9. The Catalog Plugin creates a separate layer for each catalog. -You can define your own shape layer using the NewShapeLayer() -public routine, and then add geometric shapes to it. - -

    -For a given image, one shape layer at a time is active, -responding to mouse and touch events. Ordinarily, a shape layer -becomes the active layer when it is first created and shapes are -added to it. Thus, the first time you create a region, the regions -layer becomes active. If you then load a catalog into a catalog layer, -that layer becomes active. - -

    -The Shape Layers plugin displays the layers defined for the current -image and allows you to turn on and off the display of any layer. It -highlights the currently active layer (the topmost visible layer in -the layer stack) allows you to make a layer active by moving it to the -top of the stack. - -

    -You also can save layers to a local file. If the layer is a catalog -(i.e., a tab-delimited table loaded using LoadCatalog() or the load -catalog menu option), you will have the choice of saving the layer -either as a catalog or a region. Otherwise, you will be able to -save the layer as a region. -

    - - diff --git a/web/static/js9_old/plugins/help/magnifier.html b/web/static/js9_old/plugins/help/magnifier.html deleted file mode 100644 index dc15a6b..0000000 --- a/web/static/js9_old/plugins/help/magnifier.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - -Plugin: JS9Magnifier - - - -
    -

    JS9 Magnifier

    - -

    -The Magnifier plugin displays a blocked image of the data in an area -surrounding the mouse as it moves. The default magnification of four -can be changed using command buttons on the magnifier window. - -

    -By default, regions are displayed in the magnifier at the current -zoom. You can turn off region display by changing the value of the -JS9.globalOpts.magnifierRegions property, either by using the -Preferences plugin or, for site-wide configuration, by changing -the value in the js9prefs.js file. - -

    - - diff --git a/web/static/js9_old/plugins/help/mef.html b/web/static/js9_old/plugins/help/mef.html deleted file mode 100644 index c12a011..0000000 --- a/web/static/js9_old/plugins/help/mef.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Plugin: JS9Mef - - - -
    -

    JS9 Multi-Extension FITS Files

    - -

    -The Extensions plugin allows you to display the HDU extensions -in a multi-extension FITS file. Simply click on the desired extension -to display it. - -

    -By default, the display (including the underlying raw data) of the new -extension replaces the previous data in the same image. If, however, -the Display each extension as a separate image checkbox is -selected, each succeeding extension will be displayed as a separate -image, so that you can view two or more extensions simultaneously. In -this case, you can use the Blink extension to blink the -extensions or the File->move image to menu option to move an -extension to a existing display or new light window. In all cases, the -raw data for that extension is available for browser-based analysis. - -

    -Note that some extensions are not available for display, including images -of less than two dimensions, and binary tables not containing x and y columns. -These extensions are marked as invalid by a strike through their description. - -

    -See the FITS Primer -for information about HDUs and multi-extension FITS. -

    - - diff --git a/web/static/js9_old/plugins/help/mousetouch.html b/web/static/js9_old/plugins/help/mousetouch.html deleted file mode 100644 index 89341e0..0000000 --- a/web/static/js9_old/plugins/help/mousetouch.html +++ /dev/null @@ -1,51 +0,0 @@ - - - - - -Plugin: JS9MouseTouch - - - -
    -

    Mouse and Touch Actions

    - -JS9 supports the following configurable mouse and touch actions: -
      -
    • mouse movement with no buttons pressed -
    • mouse movement with one button pressed -
    • mouse movement with two buttons pressed -
    • touch with one finger -
    • touch with two fingers -
    • touch with three fingers -
    -The initial actions are defined by the JS9.globalOpts.mouseActions -and JS9.globalOpts.touchActions arrays. In addition, the -JS9.globalOpts.mousetouchZoom property specifies whether a mouse wheel -or touch/pinch will zoom the image. The default actions are: -
      -
    • mouseActions: ["display value/position", "change contrast/bias", "pan the image"] -
    • touchActions: ["display value/position", "change contrast/bias", "pan the image"] -
    • mousetouchZoom: false -
    -where the array elements map to an increasing numbers of -buttons/fingers. You can change the default actions of the elements -in either array in your js9Prefs.json file. For example, to make pan -and zoom the default one-touch and pinch actions respectively: -
      -
    • touchActions: ["pan the image", "display value/position", "change contrast/bias"] -
    • mousetouchZoom: true -
    -As usual, the defaults in js9Prefs.json are used by all JS9 displays in -a web page. - -

    -Users can change the action assignments using the MouseTouch -plugin, which displays the current mapping between mouse/touch gesture -and its action. Simply drag and drop an action to a different gesture -in order to change the mapping. You also can toggle the scroll/pinch -to zoom capability by clicking its button. -

    - - diff --git a/web/static/js9_old/plugins/help/panner.html b/web/static/js9_old/plugins/help/panner.html deleted file mode 100644 index dd33a6a..0000000 --- a/web/static/js9_old/plugins/help/panner.html +++ /dev/null @@ -1,31 +0,0 @@ - - - - - -Plugin: JS9Panner - - - -
    -

    JS9 Panner

    - -

    -The Panner plugin will displays the full image along with a viewport -rectangle showing the currently displayed image section in the primary -image window. The viewport can be moved around in order to pan to -different locations in the primary image. The panner also has command -button options to zoom the viewport itself. (This makes the viewport -rectangle larger at the expense of displaying only a section of the -full image. It is useful for panning in a very large image.) - -

    -The WCS orientation (North and East) are shown on the display. -You can turn off direction display by changing the value of the -JS9.globalOpts.pannerDirections property, either by using the -Preferences plugin or, for site-wide configuration, by changing -the value in the js9prefs.js file. -

    - - diff --git a/web/static/js9_old/plugins/help/plugintest.html b/web/static/js9_old/plugins/help/plugintest.html deleted file mode 100644 index b6ce75f..0000000 --- a/web/static/js9_old/plugins/help/plugintest.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - - -JS9 Test Plugin - - - -
    -

    The plugin help page

    - -

    -Not much to say ... it's a plugin test, after all! See the page source for -implementation details. -

    -See also: -Adding Local Analysis Tasks (Plugins) to JS9 -

    - - diff --git a/web/static/js9_old/plugins/help/prefs.html b/web/static/js9_old/plugins/help/prefs.html deleted file mode 100644 index c5f91c3..0000000 --- a/web/static/js9_old/plugins/help/prefs.html +++ /dev/null @@ -1,44 +0,0 @@ - - - - - -Plugin: JS9Preferences - - - -
    -

    JS9 User Preferences

    - -

    -The JS9 preferences plugin allows you to set JS9 user preferences for -JS9-enabled Web pages in the current domain. By and large, these are -the same preferences that can be found in the JS9 site preferences -file (js9Prefs.json), and of course you can set defaults in that file. -However, the preferences plugin allows you to set these preferences in -cases where you do not have access to this file, e.g. public sites -such as js9.si.edu. - -

    Due to cross-browser security limitations, preferences are -browser-specific: your Firefox preferences will be maintained -separately from your Chrome and Safari preferences. - -

    -The following types of user preferences can be set: -

      -
    • images: colormap, contrast, scale, etc. for all newly displayed images -
    • regions: region parameters (radius, width, height, etc) for all newly created regions -
    • fits: a list of binary table extensions to look for in a drag/drop operation, size of image to extract -
    • displays: settings applied to each JS9 display, these currently consist of mouse/touch actions (see the Mouse Touch plugin for more info) -
    - -

    -You can apply your preference choices to the current session using the -Apply button. To apply and save these preferences for future -sessions, use the Save button. The Show Saved and -Delete Saved buttons allow you to view and clear the currently -saved values, respectively. -

    - - diff --git a/web/static/js9_old/plugins/help/scalecontrols.html b/web/static/js9_old/plugins/help/scalecontrols.html deleted file mode 100644 index af21084..0000000 --- a/web/static/js9_old/plugins/help/scalecontrols.html +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -Plugin: JS9Scale - - - -
    -

    Scale Controls

    - -

    -The JS9/DS9 scaling algorithms convert image pixel values to RGB -values, as described in the DS9 -documentation -"How It Works". Scaling utilizes low and high -clipping values when mapping the data to RGB. These limits are -initially taken to be the high and low data values, which obviously -can be wasteful of the color distribution if a few low or high values -are far away from the bulk of the data values. - -

    -The Scale Controls plugin therefore provides a number of ways to -set the low and high clipping limits: -

      -
    • use the Limits menu to choose data min/max, IRAF zscale z1/z2 or IRAF zscale z1/max -
    • select a portion of the Pixel Distribution plot -
    • change the Low and/or High limits directly using the text boxes -
    -The Pixel Distribution plots a histogram of the distribution of -pixel values (binned into 512 bins). The current low and high clipping -values are shown as red and green carets, respectively, at the bottom -of the plot. Moving the mouse over the plot will show the pixel -value, i.e. the x coordinate. - -

    -You can select a region of the distribution by pressing the mouse and -moving it left or right. When the mouse is released, the selected low -and high pixel values will be used as the new clipping values. -(Selection does not work for mouse-less iPads, but you still -can view the distribution values and input your chosen limits into -the Low and/or High text boxes.) - -

    -The IRAF zscale algorithm is described on the -IRAF DISPLAY task help page, -which is reproduced below. Note that zscale parameters can be changed using the -the JS9 Preferences plugin. -

    -The zscale algorithm is designed to display the image values near -the median image value without the time consuming process of -computing a full image histogram. This is particularly useful for -astronomical images which generally have a very peaked histogram -corresponding to the background sky in direct imaging or the -continuum in a two dimensional spectrum. -

    -The sample of pixels, specified by values greater than zero in the -sample mask zmask or by an image section, is selected up to a -maximum of nsample pixels. If a bad pixel mask is specified by the -bpmask parameter then any pixels with mask values which are greater -than zero are not counted in the sample. Only the first pixels up -to the limit are selected where the order is by line beginning from -the first line. If no mask is specified then a grid of pixels with -even spacing along lines and columns that make up a number less -than or equal to the maximum sample size is used. -

    -If a contrast of zero is specified (or the zrange flag is used and -the image does not have a valid minimum/maximum value) then the -minimum and maximum of the sample is used for the intensity mapping -range. -

    -If the contrast is not zero the sample pixels are ranked in -brightness to form the function I(i) where i is the rank of the -pixel and I is its value. Generally the midpoint of this function -(the median) is very near the peak of the image histogram and there -is a well defined slope about the midpoint which is related to the -width of the histogram. At the ends of the I(i) function there are -a few very bright and dark pixels due to objects and defects in the -field. To determine the slope a linear function is fit with -iterative rejection; -

    -    I(i) = intercept + slope * (i - midpoint)
    -
    -If more than half of the points are rejected then there is no well -defined slope and the full range of the sample defines z1 and z2. -Otherwise the endpoints of the linear function are used (provided -they are within the original range of the sample): -
    -    z1 = I(midpoint) + (slope / contrast) * (1 - midpoint)
    -    z2 = I(midpoint) + (slope / contrast) * (npoints - midpoint)
    -
    -As can be seen, the parameter contrast may be used to adjust the -contrast produced by this algorithm. -
    - - diff --git a/web/static/js9_old/plugins/help/separate.html b/web/static/js9_old/plugins/help/separate.html deleted file mode 100644 index d9e934d..0000000 --- a/web/static/js9_old/plugins/help/separate.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -Plugin: JS9Separate - - - -
    -

    Separate and Gather Images

    - -

    -The Separate and Gather Images plugin allows you to separate -selected images or all images into independent JS9 displays. The -topmost (selected) image remains in place, and new displays are -created for the others. The presence or absence of a menubar, -toolbar, and colorbar in the topmost image will be replicated in the -new displays. - -

    -You also can gather selected images or all images into the current -display. - -

    -When separating images, the plugin allows you to choose between three layouts: -

      -
    • horizontal: one row starting to the right of the first display -
    • vertical: one column underneath the first display -
    • auto: layout horizontally so long as half of each subsequent -display is visible, then start a new row -
    - -

    -The options to separate all and gather all images can -also be found in the File menu (using the auto layout). -

    - - diff --git a/web/static/js9_old/plugins/help/statusbar.html b/web/static/js9_old/plugins/help/statusbar.html deleted file mode 100644 index 245683d..0000000 --- a/web/static/js9_old/plugins/help/statusbar.html +++ /dev/null @@ -1,104 +0,0 @@ - - - - - -Plugin: JS9Statusbar - - - -
    -

    JS9 Statusbar

    -

    -The JS9 Statusbar plugin displays user-configurable status values for -the currently displayed image such as zoom factor, scale, and/or -colormap. Configuration is done via -the JS9.globalOpts.statusbar format string, in which one or -more clickable status areas are separated by semi-colons. Each status -area consists of optional text (which can utilize html elements) and -dollar-sign-delimited "macros" that will be expanded to the -appropriate value for each image. - -

    -The macros can represent parameters values stored with each image, of -which the most important ones are: -

      -
    • colormap -
    • contrast -
    • bias -
    • flip -
    • rot90 -
    • scale -
    • scalemin -
    • scalemax -
    • scaleclipping -
    • wcssys -
    • wcsunits -
    • zoom -
    -See the JS9 Public -API SetParam call for -more information about image parameters. - -

    -In addition to image parameters, the following special parameters are available: -

      -
    • colorbar: colorbar plugin without tick marks -
    • fliprot: flip and rot90 params in "(flip,rot)" format -
    • image: image name -
    • image0: image name (without [EVENTS] bracket extension, where present) -
    • mag: percent magnification (e.g. zoom 2 is "200%") -
    • img(pngfile | jpgfile): display the specified image -
    -The png/jpg pathnames supplied to the $img macro should be relative to -the web page, as usual. The $fliprot macro returns an empty string if -neither flip or rot90 have been applied, otherwise it returns a parenthesized -string containing the non-zero value(s) (e.g. "(x)", or "(y,90)"). - -

    -For example, the current default value for the format string is: -

    -  $colorbar; $colormap; $mag $fliprot; $scale ($scalemin,$scalemax); $wcssys; $image0
    -
    -meaning to display a colorbar, followed by the colormap name, the -current magnification, flip and rot90 if applicable, then the scale (including -scale min and max), the wcs system, and the image name (without the -[EVENTS] extension, if present). Note that the colorbar is the real -JS9Colorbar plugin (with tick-marks turned off) and will change -dynamically as the colormap or contrast/bias is changed. - -Alternatively, this configuration: -
    -  $img(images/voyager/color_$colormap.png) $colormap; $mag; $scale($scalemin,$scalemax); $wcssys; $image
    -
    -will display a static image of the current colormap, along with the -other values. In this case, the image filename will include all -bracket extensions. - -

    -The following status macros have clickable actions: -

      -
    • image | image0: toggle the Binning plugin -
    • mag | zoom: toggle the Pan/Zoom plugin -
    • scale | scalemin | scalemax: toggle the Scale Controls plugin -
    -Thus, for example, clicking in an area that contains one of the $scale -macros will toggle the Scale plugin. - -

    -The status display will wrap onto the next line if necessary, and a scrollbar -will become available on the right-hand side. Thus, if a long image -filename is not displayed in the default setup, try the scrollbar ... - -

    -See -Configuring JS9 Site Preferences and -the JS9 User Preferences plugin for discussions -of how to set preferences such as JS9.globalOpts.statusbar on a site-wide -and an individual basis, respectively. - - -

    - - diff --git a/web/static/js9_old/plugins/help/syncui.html b/web/static/js9_old/plugins/help/syncui.html deleted file mode 100644 index c5e2bca..0000000 --- a/web/static/js9_old/plugins/help/syncui.html +++ /dev/null @@ -1,53 +0,0 @@ - - - - - -Plugin: JS9Sync - - - -
    -

    JS9 Sync Images

    - -

    -Synchronize two or more images, so that when an operation is performed -on one image, it also is performed on the other(s). For example, when -the colormap or scale is changed on an image, it also is changed on -the sync'ed images. Or, when a region is created, moved, resized, or -removed on an image, the same happens on the sync'ed images. You also -can synchronize once only. - -

    -The plugin displays a list of images that can be sync'ed with the -current image, as well as a list of operations that can be sync'ed, -including "colormap", "contrast/bias", "flip", "pan", "regions", -"rot90", "scale", "wcs sys/units", and "zoom". Choose one or more -images to sync and one or more operations for sync'ing and then -click Sync Repeatedly" or Sync Once. The first routine -calls JS9.SyncImages() while the second calls JS9.CopyParams() -to perform repeated or single synchronizing, respectively. You also can -Unsync operations that previously had been set up for repeated -synchronization. - -

    -Upon initialization, the displayed images and ops checkboxes will show -both images and operations sync'ed with the currently displayed -image. When you execute a new repeated synchronization, the displayed -checkboxes will be updated appropriately. Note that if you -synchronize once only, the display will not reflect this one-time -action (but will continue to reflect repeated synchronizations, if -any). This makes it clear which images and ops are repeatedly sync'ed -and thus makes it easier to unsync operations. - -

    -The following options are available: -

      -
    • reciprocal sync : images sync one another (i.e., changes go both ways) -
    • sync using wcs: use wcs header params to sync (e.g. for pan), where available -
    - -
    - - diff --git a/web/static/js9_old/plugins/help/toolbar.html b/web/static/js9_old/plugins/help/toolbar.html deleted file mode 100644 index bcb9038..0000000 --- a/web/static/js9_old/plugins/help/toolbar.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - -Plugin: JS9Toolbar - - - -
    -

    JS9 Toolbar

    -

    -The JS9 Toolbar plugin displays tool icons that can be clicked to -execute shortcut functions such as creating a region, zooming in and -out of the image, or changing the scaling algorithm. Hover the mouse -over an icon to identify the action that will be performed (non-mobile -devices only). - -

    -The display of tools supplied by JS9 is separated into two lists: -the top-level list consists of the tools that are specified in the -JS9.globalOpts.toolBar array. Other tools are displayed in a -lower list, accessible by scrolling down. In this way, your favorite -tools can be placed at the top-level, but all tools remain available. -See -Configuring JS9 Site Preferences and -the JS9 User Preferences plugin for discussions -of how to set preferences such as JS9.globalOpts.toolBar on a site-wide -and an individual basis, respectively. - -

    -New tools can be added to the toolbar at any time using the -JS9.SetToolbar() public access routine. The text properties -associated with a tool object are: -

      -
    • name: name of the tool -
    • tip: a tooltip to display when the mouse hovers over the tool -
    • image: url (relative to the install directory) containing a PNG -image file to display as the tool icon -
    • cmd: name of the JS9 public routine to execute when the tool is -clicked -
    • args: array of arguments to pass to the JS9 public routine -
    -Only the name and cmd properties are required. If no image is -specified, a button labeled by the name value will be used. - -

    -Examples of tool objects: -

    -  {
    -    "name": "linear",
    -    "tip": "linear scale",
    -    "image": "images/toolbar/dax_images/lin.png",
    -    "cmd": "SetScale",
    -    "args": ["linear"]
    -  },
    -  {
    -    "name": "histeq",
    -    "tip": "histogram equalization",
    -    "cmd": "SetScale",
    -    "args": ["histeq"]
    -  },
    -  {
    -    "name": "annulus",
    -    "tip": "annulus region",
    -    "image": "images/toolbar/dax_images/annulus.png",
    -    "cmd": "AddRegions",
    -    "args": ["annulus"]
    -  },
    -  {
    -    "name": "remove",
    -    "tip": "remove selected region",
    -    "image": "images/toolbar/dax_images/erase.png",
    -    "cmd": "RemoveRegions",
    -    "args": ["selected"]
    -  },
    -  {
    -    "name": "zoom1",
    -    "tip": "zoom 1",
    -    "image": "images/toolbar/dax_images/mag_one.png",
    -    "cmd": "SetZoom",
    -    "args": [1]
    -  },
    -  {
    -    "name": "magnifier",
    -    "tip": "toggle magnifier display",
    -    "image": "images/toolbar/dax_images/mag.png",
    -    "cmd": "DisplayPlugin",
    -    "args": ["JS9Magnifier"]
    -  }
    -
    -See the -The JS9 Public API for more -information about this routine. - -
    - - diff --git a/web/static/js9_old/plugins/help/zoomcontrols.html b/web/static/js9_old/plugins/help/zoomcontrols.html deleted file mode 100644 index c2fa22d..0000000 --- a/web/static/js9_old/plugins/help/zoomcontrols.html +++ /dev/null @@ -1,42 +0,0 @@ - - - - - -Plugin: JS9PanZoom - - - -
    -

    JS9 Pan/Zoom Controls

    - -

    -The Pan/Zoom Controls plugin allows you to pan to an image location -that can be specified using image, physical, or WCS coordinates. - -

    -The plugin initially displays the current pan location using the -current globally configured WCS system and units. Choose a different -system and/or units via the WCS system and WCS units menus and the -current pan position will be updated appropriately. Then enter a new -position in the position text boxes and click the Pan to → -button to pan the image. - -

    -The plugin also offers menus to pan, zoom, flip, and rotate the image -by 90 degree increments, along with a text box to rotate by an -arbitrary angle in degrees. Note that arbitrary rotation is performed -in terms of an absolute angle: if you rotate by 20 degrees and then do -it again, there is no change. Also, setting the rotation to 0 sets the -angle to 0. Flipping and rot90, however, are relative to the current -state of the display. - -

    -The Flip menu's reset option unsets x and/or y -flips. The Rotate menu's reset option resets both the rot90 and -rotation angle, as does specifying reset in the rotation text box. -The Rotate menu's reset flip/rot90/rotate option resets flip, rot90, and rotate. -

    - - diff --git a/web/static/js9_old/plugins/imexam/3dplot.js b/web/static/js9_old/plugins/imexam/3dplot.js deleted file mode 100644 index 5c2a631..0000000 --- a/web/static/js9_old/plugins/imexam/3dplot.js +++ /dev/null @@ -1,1490 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;ocreate, click, move, or resize a region to see 3d plot
    "); - } - - JS9.RegisterPlugin("ImExam", "3dPlot", pluginInit, { - menu: "analysis", - - menuItem: "3dPlot", - winTitle: "3dPlot", - help: "imexam/imexam.html#3dplot", - - dynamicSelect: true, - - toolbarSeparate: true, - - onregionschange: pluginUpdate, - winDims: [250, 250], - }); -}()); - -},{"./JSSurfacePlot-V1.7/javascript/ColourGradient":2,"./JSSurfacePlot-V1.7/javascript/SurfacePlot":3,"./imexam":undefined}],2:[function(require,module,exports){ -/* - * ColourGradient.js - * - * - * Copyright (c) 2011 Greg Ross - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of the project's author nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -/** - * Class that is used to define a path through RGB space. - * @author Greg Ross - * @constructor - * @param minValue the value that will return the first colour on the path in RGB space - * @param maxValue the value that will return the last colour on the path in RGB space - * @param rgbColourArray the set of colours that defines the dirctional path through RGB space. - * The length of the array must be greater than two. - */ -greg.ross.visualisation.ColourGradient = function(minValue, maxValue, rgbColourArray) -{ - function RGB2HTML(red, green, blue) - { - var decColor = red + 256 * green + 65536 * blue; - return decColor.toString(16); - } - - /** - * Return a colour from a position on the path in RGB space that is proportioal to - * the number specified in relation to the minimum and maximum values from which the - * bounds of the path are derived. - * @member greg.ross.visualisation.ColourGradient - * @param value - */ - this.getColour = function(value) - { - if ( isNaN(value) || value < minValue || value > maxValue || rgbColourArray.length == 1) - { - var colr = { - red: rgbColourArray[0].red, - green:rgbColourArray[0].green, - blue:rgbColourArray[0].blue - }; - - return colr; - } - - var scaledValue = mapValueToZeroOneInterval(value, minValue, maxValue); - - return getPointOnColourRamp(scaledValue); - } - - function getPointOnColourRamp(value) - { - var numberOfColours = rgbColourArray.length; - var scaleWidth = 1 / (numberOfColours - 1); - var index = (value / scaleWidth); - var index = parseInt(index + ""); - - index = index >= (numberOfColours - 1) ? (numberOfColours - 2): index; - - var rgb1 = rgbColourArray[index]; - var rgb2 = rgbColourArray[index + 1]; - - var closestToOrigin, furthestFromOrigin; - - if (distanceFromRgbOrigin(rgb1) > distanceFromRgbOrigin(rgb2)) - { - closestToOrigin = rgb2; - furthestFromOrigin = rgb1; - } - else - { - closestToOrigin = rgb1; - furthestFromOrigin = rgb2; - } - - var t; - - if (closestToOrigin == rgb2) - t = 1 - mapValueToZeroOneInterval(value, index * scaleWidth, (index + 1) * scaleWidth); - else - t = mapValueToZeroOneInterval(value, index * scaleWidth, (index + 1) * scaleWidth); - - var diff = [ - t * (furthestFromOrigin.red - closestToOrigin.red), - t * (furthestFromOrigin.green - closestToOrigin.green), - t * (furthestFromOrigin.blue - closestToOrigin.blue)]; - - var r = closestToOrigin.red + diff[0]; - var g = closestToOrigin.green + diff[1]; - var b = closestToOrigin.blue + diff[2]; - - r = parseInt(r); - g = parseInt(g); - b = parseInt(b); - - var colr = { - red:r, - green:g, - blue:b - }; - - return colr; - } - - function distanceFromRgbOrigin(rgb) - { - return (rgb.red * rgb.red) + (rgb.green * rgb.green) + (rgb.blue * rgb.blue); - } - - function mapValueToZeroOneInterval(value, minValue, maxValue) - { - if (minValue == maxValue) return 0; - - var factor = (value - minValue) / (maxValue - minValue); - return factor; - } -} - - -},{}],3:[function(require,module,exports){ -/* - * SurfacePlot.js - * - * - * Copyright (c) 2011 Greg Ross - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * Neither the name of the project's author nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/* - * Register the name space - * *********************** - */ -function registerNameSpace(ns){ - var nsParts = ns.split("."); - var root = window; - var n = nsParts.length; - - for (var i = 0; i < n; i++) { - if (typeof root[nsParts[i]] == "undefined") - root[nsParts[i]] = new Object(); - - root = root[nsParts[i]]; - } -} - -registerNameSpace("greg.ross.visualisation"); - -/* - * This is the main class and entry point of the tool - * and represents the Google viz API. - * *************************************************** - */ -greg.ross.visualisation.SurfacePlot = function(container){ - this.containerElement = container; -} - -greg.ross.visualisation.SurfacePlot.prototype.draw = function(data, options) { - var xPos = options.xPos; - var yPos = options.yPos; - var w = options.width; - var h = options.height; - var colourGradient = options.colourGradient; - var fillPolygons = options.fillPolygons; - var tooltips = options.tooltips; - var xTitle = options.xTitle; - var yTitle = options.yTitle; - var zTitle = options.zTitle; - var restrictXRotation = options.restrictXRotation; - - if (this.surfacePlot == undefined) - this.surfacePlot = new greg.ross.visualisation.JSSurfacePlot(xPos, yPos, w, h, colourGradient, this.containerElement, tooltips, fillPolygons, xTitle, yTitle, zTitle, restrictXRotation); - - this.surfacePlot.redraw(data); -} - -/* - * This class does most of the work. - * ********************************* - */ -greg.ross.visualisation.JSSurfacePlot = function(x, y, width, height, colourGradient, targetElement, tooltips, fillRegions, xTitle, yTitle, zTitle, restrictXRotation){ - this.targetDiv; - var id = allocateId(); - var canvas; - var canvasContext = null; - - var scale = greg.ross.visualisation.JSSurfacePlot.DEFAULT_SCALE; - - var currentZAngle = greg.ross.visualisation.JSSurfacePlot.DEFAULT_Z_ANGLE; - var currentXAngle = greg.ross.visualisation.JSSurfacePlot.DEFAULT_X_ANGLE; - - this.data = null; - var canvas_support_checked = false; - var canvas_supported = true; - var data3ds = null; - var displayValues = null; - var numXPoints; - var numYPoints; - var transformation; - var cameraPosition; - var colourGradient; - var colourGradientObject; - var renderPoints = false; - - var mouseDown1 = false; - var mouseDown3 = false; - var mousePosX = null; - var mousePosY = null; - var lastMousePos = new greg.ross.visualisation.Point(0, 0); - var mouseButton1Up = null; - var mouseButton3Up = null; - var mouseButton1Down = new greg.ross.visualisation.Point(0, 0); - var mouseButton3Down = new greg.ross.visualisation.Point(0, 0); - var closestPointToMouse = null; - var xAxisHeader = ""; - var yAxisHeader = ""; - var zAxisHeader = ""; - var xAxisTitleLabel = new greg.ross.visualisation.Tooltip(true); - var yAxisTitleLabel = new greg.ross.visualisation.Tooltip(true); - var zAxisTitleLabel = new greg.ross.visualisation.Tooltip(true); - var tTip = new greg.ross.visualisation.Tooltip(false); - - function init(){ - transformation = new greg.ross.visualisation.Th3dtran(); - - createTargetDiv(); - - if (!targetDiv) - return; - - createCanvas(); - } - - function hideTooltip(){ - tTip.hide(); - } - - function displayTooltip(e){ - var position = new greg.ross.visualisation.Point(e.x, e.y); - tTip.show(tooltips[closestPointToMouse], 200); - } - - function render(data){ - canvasContext.clearRect(0, 0, canvas.width, canvas.height); - canvasContext.fillStyle = '#000'; - canvasContext.fillRect(0, 0, canvas.width, canvas.height); - this.data = data; - - var canvasWidth = width; - var canvasHeight = height; - - var minMargin = 20; - var drawingDim = canvasWidth - minMargin * 2; - var marginX = minMargin; - var marginY = minMargin; - - transformation.init(); - transformation.rotate(currentXAngle, 0.0, currentZAngle); - transformation.scale(scale); - transformation.translate(drawingDim / 2.0 + marginX, (drawingDim / 3.0*2) + marginY, 0.0); - - cameraPosition = new greg.ross.visualisation.Point3D(drawingDim / 2.0 + marginX, drawingDim / 2.0 + marginY, -1000.0); - - if (renderPoints) { - for (i = 0; i < data3ds.length; i++) { - var point3d = data3ds[i]; - canvasContext.fillStyle = '#ff2222'; - var transformedPoint = transformation.ChangeObjectPoint(point3d); - transformedPoint.dist = distance(transformedPoint, cameraPosition); - - var x = transformedPoint.ax; - var y = transformedPoint.ay; - - canvasContext.beginPath(); - var dotSize = greg.ross.visualisation.JSSurfacePlot.DATA_DOT_SIZE; - - canvasContext.arc((x - (dotSize / 2)), (y - (dotSize / 2)), 1, 0, self.Math.PI * 2, true); - canvasContext.fill(); - } - } - - var axes = createAxes(); - var polygons = createPolygons(data3ds); - - for (i = 0; i < axes.length; i++) { - polygons[polygons.length] = axes[i]; - } - - // Sort the polygons so that the closest ones are rendered last - // and therefore are not occluded by those behind them. - // This is really Painter's algorithm. - polygons.sort(greg.ross.visualisation.PolygonComaparator); - //polygons = sort(polygons); - - canvasContext.lineWidth = 1; - canvasContext.strokeStyle = '#888'; - canvasContext.lineJoin = "round"; - - for (i = 0; i < polygons.length; i++) { - var polygon = polygons[i]; - - if (polygon.isAnAxis()) { - var p1 = polygon.getPoint(0); - var p2 = polygon.getPoint(1); - - canvasContext.beginPath(); - canvasContext.moveTo(p1.ax, p1.ay); - canvasContext.lineTo(p2.ax, p2.ay); - canvasContext.stroke(); - } - else { - var p1 = polygon.getPoint(0); - var p2 = polygon.getPoint(1); - var p3 = polygon.getPoint(2); - var p4 = polygon.getPoint(3); - - var colourValue = (p1.lz * 1.0 + p2.lz * 1.0 + p3.lz * 1.0 + p4.lz * 1.0) / 4.0; - - // if (colourValue < 0) - // colourValue *= -1; - - var rgbColour = colourGradientObject.getColour(colourValue); - var colr = "rgb(" + rgbColour.red + "," + rgbColour.green + "," + rgbColour.blue + ")"; - canvasContext.fillStyle = colr; - - canvasContext.beginPath(); - canvasContext.moveTo(p1.ax, p1.ay); - canvasContext.lineTo(p2.ax, p2.ay); - canvasContext.lineTo(p3.ax, p3.ay); - canvasContext.lineTo(p4.ax, p4.ay); - canvasContext.lineTo(p1.ax, p1.ay); - - if (fillRegions) - canvasContext.fill(); - else - canvasContext.stroke(); - } - } - - canvasContext.stroke(); - - if (supports_canvas()) - renderAxisText(axes); - } - - function renderAxisText(axes){ - var xLabelPoint = new greg.ross.visualisation.Point3D(0.0, 0.5, 0.0); - var yLabelPoint = new greg.ross.visualisation.Point3D(-0.5, 0.0, 0.0); - var zLabelPoint = new greg.ross.visualisation.Point3D(-0.5, 0.5, 0.5); - - var transformedxLabelPoint = transformation.ChangeObjectPoint(xLabelPoint); - var transformedyLabelPoint = transformation.ChangeObjectPoint(yLabelPoint); - var transformedzLabelPoint = transformation.ChangeObjectPoint(zLabelPoint); - - var xAxis = axes[0]; - var yAxis = axes[1]; - var zAxis = axes[2]; - - canvasContext.fillStyle = '#fff'; - - if (xAxis.distanceFromCamera > yAxis.distanceFromCamera) { - var xAxisLabelPosX = transformedxLabelPoint.ax; - var xAxisLabelPosY = transformedxLabelPoint.ay; - canvasContext.fillText(xTitle, xAxisLabelPosX, xAxisLabelPosY); - } - - if (xAxis.distanceFromCamera < yAxis.distanceFromCamera) { - var yAxisLabelPosX = transformedyLabelPoint.ax; - var yAxisLabelPosY = transformedyLabelPoint.ay; - canvasContext.fillText(yTitle, yAxisLabelPosX, yAxisLabelPosY); - } - - if (xAxis.distanceFromCamera < zAxis.distanceFromCamera) { - var zAxisLabelPosX = transformedzLabelPoint.ax; - var zAxisLabelPosY = transformedzLabelPoint.ay; - canvasContext.fillText(zTitle, zAxisLabelPosX, zAxisLabelPosY); - } - } - - var sort = function(array){ - var len = array.length; - - if (len < 2) { - return array; - } - - var pivot = Math.ceil(len / 2); - return merge(sort(array.slice(0, pivot)), sort(array.slice(pivot))); - } - - var merge = function(left, right){ - var result = []; - while ((left.length > 0) && (right.length > 0)) { - if (left[0].distanceFromCamera < right[0].distanceFromCamera) { - result.push(left.shift()); - } - else { - result.push(right.shift()); - } - } - - result = result.concat(left, right); - return result; - } - - - function createAxes(){ - var axisOrigin = new greg.ross.visualisation.Point3D(-0.5, 0.5, 0); - var xAxisEndPoint = new greg.ross.visualisation.Point3D(0.5, 0.5, 0); - var yAxisEndPoint = new greg.ross.visualisation.Point3D(-0.5, -0.5, 0); - var zAxisEndPoint = new greg.ross.visualisation.Point3D(-0.5, 0.5, 1); - - var transformedAxisOrigin = transformation.ChangeObjectPoint(axisOrigin); - var transformedXAxisEndPoint = transformation.ChangeObjectPoint(xAxisEndPoint); - var transformedYAxisEndPoint = transformation.ChangeObjectPoint(yAxisEndPoint); - var transformedZAxisEndPoint = transformation.ChangeObjectPoint(zAxisEndPoint); - - var axes = new Array(); - - var xAxis = new greg.ross.visualisation.Polygon(cameraPosition, true); - xAxis.addPoint(transformedAxisOrigin); - xAxis.addPoint(transformedXAxisEndPoint); - xAxis.calculateCentroid(); - xAxis.calculateDistance(); - axes[axes.length] = xAxis; - - var yAxis = new greg.ross.visualisation.Polygon(cameraPosition, true); - yAxis.addPoint(transformedAxisOrigin); - yAxis.addPoint(transformedYAxisEndPoint); - yAxis.calculateCentroid(); - yAxis.calculateDistance(); - axes[axes.length] = yAxis; - - var zAxis = new greg.ross.visualisation.Polygon(cameraPosition, true); - zAxis.addPoint(transformedAxisOrigin); - zAxis.addPoint(transformedZAxisEndPoint); - zAxis.calculateCentroid(); - zAxis.calculateDistance(); - axes[axes.length] = zAxis; - - return axes; - } - - function createPolygons(data3D){ - var i; - var j; - var polygons = new Array(); - var index = 0; - - for (i = 0; i < numXPoints - 1; i++) { - for (j = 0; j < numYPoints - 1; j++) { - var polygon = new greg.ross.visualisation.Polygon(cameraPosition, false); - - var p1 = transformation.ChangeObjectPoint(data3D[j + (i * numYPoints)]); - var p2 = transformation.ChangeObjectPoint(data3D[j + (i * numYPoints) + numYPoints]); - var p3 = transformation.ChangeObjectPoint(data3D[j + (i * numYPoints) + numYPoints + 1]); - var p4 = transformation.ChangeObjectPoint(data3D[j + (i * numYPoints) + 1]); - - polygon.addPoint(p1); - polygon.addPoint(p2); - polygon.addPoint(p3); - polygon.addPoint(p4); - polygon.calculateCentroid(); - polygon.calculateDistance(); - - polygons[index] = polygon; - index++; - } - } - - return polygons; - } - - function getDefaultColourRamp(){ - var colour1 = { - red: 0, - green: 0, - blue: 255 - }; - var colour2 = { - red: 0, - green: 255, - blue: 255 - }; - var colour3 = { - red: 0, - green: 255, - blue: 0 - }; - var colour4 = { - red: 255, - green: 255, - blue: 0 - }; - var colour5 = { - red: 255, - green: 0, - blue: 0 - }; - return [colour1, colour2, colour3, colour4, colour5]; - } - - this.redraw = function(data){ - numXPoints = data.getNumberOfRows() * 1.0; - numYPoints = data.getNumberOfColumns() * 1.0; - - var minZValue = Number.MAX_VALUE; - var maxZValue = Number.MIN_VALUE; - - for (var i = 0; i < numXPoints; i++) { - for (var j = 0; j < numYPoints; j++) { - var value = data.getFormattedValue(i, j) * 1.0; - - if (value < minZValue) - minZValue = value; - - if (value > maxZValue) - maxZValue = value; - } - } - - var cGradient; - - if (colourGradient) - cGradient = colourGradient; - else - cGradient = getDefaultColourRamp(); - - // if (minZValue < 0 && (minZValue*-1) > maxZValue) - // maxZValue = minZValue*-1; - - colourGradientObject = new greg.ross.visualisation.ColourGradient(minZValue, maxZValue, cGradient); - - var canvasWidth = width; - var canvasHeight = height; - - var minMargin = 20; - var drawingDim = canvasWidth - minMargin * 2; - var marginX = minMargin; - var marginY = minMargin; - - if (canvasWidth > canvasHeight) { - drawingDim = canvasHeight - minMargin * 2; - marginX = (canvasWidth - drawingDim) / 2; - } - else - if (canvasWidth < canvasHeight) { - drawingDim = canvasWidth - minMargin * 2; - marginY = (canvasHeight - drawingDim) / 2; - } - - var xDivision = 1 / (numXPoints - 1); - var yDivision = 1 / (numYPoints - 1); - var xPos, yPos; - var i, j; - var numPoints = numXPoints * numYPoints; - data3ds = new Array(); - var index = 0; - - // Calculate 3D points. - for (i = 0, xPos = -0.5; i < numXPoints; i++, xPos += xDivision) { - for (j = 0, yPos = 0.5; j < numYPoints; j++, yPos -= yDivision) { - var x = xPos; - var y = yPos; - - data3ds[index] = new greg.ross.visualisation.Point3D(x, y, data.getFormattedValue(i, j)); - index++; - } - } - - render(data); - } - - function allocateId(){ - var count = 0; - var name = "surfacePlot"; - - do { - count++; - } - while (document.getElementById(name + count)) - - return name + count; - } - - function createTargetDiv(){ - this.targetDiv = document.createElement("div"); - this.targetDiv.id = id; - this.targetDiv.className = "surfaceplot"; - this.targetDiv.style.background = '#ffffff' - this.targetDiv.style.position = 'absolute'; - - if (!targetElement) - document.body.appendChild(this.targetDiv); - else { - this.targetDiv.style.position = 'relative'; - targetElement.appendChild(this.targetDiv); - } - - this.targetDiv.style.left = x + "px"; - this.targetDiv.style.top = y + "px"; - } - - function getInternetExplorerVersion() // Returns the version of Internet Explorer or a -1 - // (indicating the use of another browser). - { - var rv = -1; // Return value assumes failure. - if (navigator.appName == 'Microsoft Internet Explorer') { - var ua = navigator.userAgent; - var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})"); - if (re.exec(ua) != null) - rv = parseFloat(RegExp.$1); - } - return rv; - } - - function supports_canvas(){ - if (canvas_support_checked) return canvas_supported; - - canvas_support_checked = true; - canvas_supported = !!document.createElement('canvas').getContext; - return canvas_supported; - } - - function createCanvas(){ - canvas = document.createElement("canvas"); - - if (!supports_canvas()) { - G_vmlCanvasManager.initElement(canvas); - canvas.style.width = width; - canvas.style.height = height; - } - - canvas.className = "surfacePlotCanvas"; - canvas.setAttribute("width", width); - canvas.setAttribute("height", height); - canvas.style.left = '0px'; - canvas.style.top = '0px'; - - targetDiv.appendChild(canvas); - - canvasContext = canvas.getContext("2d"); - canvasContext.font = "bold 18px sans-serif"; - canvasContext.clearRect(0, 0, canvas.width, canvas.height); - - canvasContext.fillStyle = '#000'; - - canvasContext.fillRect(0, 0, canvas.width, canvas.height); - - canvasContext.beginPath(); - canvasContext.rect(0, 0, canvas.width, canvas.height); - canvasContext.strokeStyle = '#888'; - canvasContext.stroke(); - - canvas.onmousemove = mouseIsMoving; - canvas.onmouseout = hideTooltip; - canvas.onmousedown = mouseDownd; - canvas.onmouseup = mouseUpd; - - //added by edupont - canvas.addEventListener("touchstart", mouseDownd, false); - canvas.addEventListener("touchmove", mouseIsMoving, false); - canvas.addEventListener("touchend", mouseUpd, false); - canvas.addEventListener("touchcancel", hideTooltip, false); - } - - function mouseDownd(e){ - if (isShiftPressed(e)) { - mouseDown3 = true; - mouseButton3Down = getMousePositionFromEvent(e); - } - else { - mouseDown1 = true; - mouseButton1Down = getMousePositionFromEvent(e); - } - } - - function mouseUpd(e){ - if (mouseDown1) { - mouseButton1Up = lastMousePos; - } - else - if (mouseDown3) { - mouseButton3Up = lastMousePos; - } - - mouseDown1 = false; - mouseDown3 = false; - } - - function mouseIsMoving(e){ - var currentPos = getMousePositionFromEvent(e); - - if (mouseDown1) { - hideTooltip(); - calculateRotation(currentPos); - } - else - if (mouseDown3) { - hideTooltip(); - calculateScale(currentPos); - } - else { - closestPointToMouse = null; - var closestDist = Number.MAX_VALUE; - - for (var i = 0; i < data3ds.length; i++) { - var point = data3ds[i]; - var dist = distance({ - x: point.ax, - y: point.ay - }, currentPos); - - if (dist < closestDist) { - closestDist = dist; - closestPointToMouse = i; - } - } - - if (closestDist > 16) { - hideTooltip(); - return; - } - - displayTooltip(currentPos); - } - - return false; - } - - function isShiftPressed(e){ - var shiftPressed = 0; - - if (parseInt(navigator.appVersion) > 3) { - var evt = navigator.appName == "Netscape" ? e : event; - - if (navigator.appName == "Netscape" && parseInt(navigator.appVersion) == 4) { - // NETSCAPE 4 CODE - var mString = (e.modifiers + 32).toString(2).substring(3, 6); - shiftPressed = (mString.charAt(0) == "1"); - } - else { - // NEWER BROWSERS [CROSS-PLATFORM] - shiftPressed = evt.shiftKey; - } - - if (shiftPressed) - return true; - } - - return false; - } - - function getMousePositionFromEvent(e){ - if (getInternetExplorerVersion() > -1) { - var e = window.event; - - if (e.srcElement.getAttribute('Stroked') == true) { - if (mousePosX == null || mousePosY == null) - return; - } - else { - mousePosX = e.offsetX; - mousePosY = e.offsetY; - } - } - else - if (e.layerX || e.layerX == 0) // Firefox - { - mousePosX = e.layerX; - mousePosY = e.layerY; - } - else if (e.offsetX || e.offsetX == 0) // Opera - { - mousePosX = e.offsetX; - mousePosY = e.offsetY; - } - else if (e.touches[0].pageX || e.touches[0].pageX == 0) //touch events - { - mousePosX = e.touches[0].pageX; - mousePosY = e.touches[0].pageY; - } - - var currentPos = new greg.ross.visualisation.Point(mousePosX, mousePosY); - - return currentPos; - } - - function calculateRotation(e){ - lastMousePos = new greg.ross.visualisation.Point(greg.ross.visualisation.JSSurfacePlot.DEFAULT_Z_ANGLE, greg.ross.visualisation.JSSurfacePlot.DEFAULT_X_ANGLE); - - if (mouseButton1Up == null) { - mouseButton1Up = new greg.ross.visualisation.Point(greg.ross.visualisation.JSSurfacePlot.DEFAULT_Z_ANGLE, greg.ross.visualisation.JSSurfacePlot.DEFAULT_X_ANGLE); - } - - if (mouseButton1Down != null) { - lastMousePos = new greg.ross.visualisation.Point(mouseButton1Up.x + (mouseButton1Down.x - e.x),// - mouseButton1Up.y + (mouseButton1Down.y - e.y)); - } - - currentZAngle = lastMousePos.x % 360; - currentXAngle = lastMousePos.y % 360; - - if (restrictXRotation) { - - if (currentXAngle < 0) - currentXAngle = 0; - else - if (currentXAngle > 90) - currentXAngle = 90; - - } - - closestPointToMouse = null; - render(data); - } - - function calculateScale(e){ - lastMousePos = new greg.ross.visualisation.Point(0, greg.ross.visualisation.JSSurfacePlot.DEFAULT_SCALE / greg.ross.visualisation.JSSurfacePlot.SCALE_FACTOR); - - if (mouseButton3Up == null) { - mouseButton3Up = new greg.ross.visualisation.Point(0, greg.ross.visualisation.JSSurfacePlot.DEFAULT_SCALE / greg.ross.visualisation.JSSurfacePlot.SCALE_FACTOR); - } - - if (mouseButton3Down != null) { - lastMousePos = new greg.ross.visualisation.Point(mouseButton3Up.x + (mouseButton3Down.x - e.x),// - mouseButton3Up.y + (mouseButton3Down.y - e.y)); - } - - scale = lastMousePos.y * greg.ross.visualisation.JSSurfacePlot.SCALE_FACTOR; - - if (scale < greg.ross.visualisation.JSSurfacePlot.MIN_SCALE) - scale = greg.ross.visualisation.JSSurfacePlot.MIN_SCALE + 1; - else - if (scale > greg.ross.visualisation.JSSurfacePlot.MAX_SCALE) - scale = greg.ross.visualisation.JSSurfacePlot.MAX_SCALE - 1; - - lastMousePos.y = scale / greg.ross.visualisation.JSSurfacePlot.SCALE_FACTOR; - - closestPointToMouse = null; - render(data); - } - - init(); -} - -/** - * Given two coordinates, return the Euclidean distance - * between them - */ -function distance(p1, p2){ - return Math.sqrt(((p1.x - p2.x) * - (p1.x - - p2.x)) + - ((p1.y - p2.y) * (p1.y - p2.y))); -} - -/* - * Matrix3d: This class represents a 3D matrix. - * ******************************************** - */ -greg.ross.visualisation.Matrix3d = function(){ - this.matrix = new Array(); - this.numRows = 4; - this.numCols = 4; - - this.init = function(){ - this.matrix = new Array(); - - for (var i = 0; i < this.numRows; i++) { - this.matrix[i] = new Array(); - } - } - - this.getMatrix = function(){ - return this.matrix; - } - - this.matrixReset = function(){ - for (var i = 0; i < this.numRows; i++) { - for (var j = 0; j < this.numCols; j++) { - this.matrix[i][j] = 0; - } - } - } - - this.matrixIdentity = function(){ - this.matrixReset(); - this.matrix[0][0] = this.matrix[1][1] = this.matrix[2][2] = this.matrix[3][3] = 1; - } - - this.matrixCopy = function(newM){ - var temp = new greg.ross.visualisation.Matrix3d(); - var i, j; - - for (i = 0; i < this.numRows; i++) { - for (j = 0; j < this.numCols; j++) { - temp.getMatrix()[i][j] = (this.matrix[i][0] * newM.getMatrix()[0][j]) + (this.matrix[i][1] * newM.getMatrix()[1][j]) + (this.matrix[i][2] * newM.getMatrix()[2][j]) + (this.matrix[i][3] * newM.getMatrix()[3][j]); - } - } - - for (i = 0; i < this.numRows; i++) { - this.matrix[i][0] = temp.getMatrix()[i][0]; - this.matrix[i][1] = temp.getMatrix()[i][1]; - this.matrix[i][2] = temp.getMatrix()[i][2]; - this.matrix[i][3] = temp.getMatrix()[i][3]; - } - } - - this.matrixMult = function(m1, m2){ - var temp = new greg.ross.visualisation.Matrix3d(); - var i, j; - - for (i = 0; i < this.numRows; i++) { - for (j = 0; j < this.numCols; j++) { - temp.getMatrix()[i][j] = (m2.getMatrix()[i][0] * m1.getMatrix()[0][j]) + (m2.getMatrix()[i][1] * m1.getMatrix()[1][j]) + (m2.getMatrix()[i][2] * m1.getMatrix()[2][j]) + (m2.getMatrix()[i][3] * m1.getMatrix()[3][j]); - } - } - - for (i = 0; i < this.numRows; i++) { - m1.getMatrix()[i][0] = temp.getMatrix()[i][0]; - m1.getMatrix()[i][1] = temp.getMatrix()[i][1]; - m1.getMatrix()[i][2] = temp.getMatrix()[i][2]; - m1.getMatrix()[i][3] = temp.getMatrix()[i][3]; - } - } - - this.init(); -} - -/* - * Point3D: This class represents a 3D point. - * ****************************************** - */ -greg.ross.visualisation.Point3D = function(x, y, z){ - this.displayValue = ""; - - this.lx; - this.ly; - this.lz; - this.lt; - - this.wx; - this.wy; - this.wz; - this.wt; - - this.ax; - this.ay; - this.az; - this.at; - - this.dist; - - this.initPoint = function(){ - this.lx = this.ly = this.lz = this.ax = this.ay = this.az = this.at = this.wx = this.wy = this.wz = 0; - this.lt = this.wt = 1; - } - - this.init = function(x, y, z){ - this.initPoint(); - this.lx = x; - this.ly = y; - this.lz = z; - - this.ax = this.lx; - this.ay = this.ly; - this.az = this.lz; - } - - function multiply(p){ - var Temp = new Point3D(); - Temp.lx = this.lx * p.lx; - Temp.ly = this.ly * p.ly; - Temp.lz = this.lz * p.lz; - return Temp; - } - - function getDisplayValue(){ - return displayValue; - } - - function setDisplayValue(displayValue){ - this.displayValue = displayValue; - } - - this.init(x, y, z); -} - -/* - * Polygon: This class represents a polygon on the surface plot. - * ************************************************************ - */ -greg.ross.visualisation.Polygon = function(cameraPosition, isAxis){ - this.points = new Array(); - this.cameraPosition = cameraPosition; - this.isAxis = isAxis; - this.centroid = null; - this.distanceFromCamera = null; - - this.isAnAxis = function(){ - return this.isAxis; - } - - this.addPoint = function(point){ - this.points[this.points.length] = point; - } - - this.distance = function(){ - return this.distance2(this.cameraPosition, this.centroid); - } - - this.calculateDistance = function(){ - this.distanceFromCamera = this.distance(); - } - - this.calculateCentroid = function(){ - var xCentre = 0; - var yCentre = 0; - var zCentre = 0; - - var numPoints = this.points.length * 1.0; - - for (var i = 0; i < numPoints; i++) { - xCentre += this.points[i].ax; - yCentre += this.points[i].ay; - zCentre += this.points[i].az; - } - - xCentre /= numPoints; - yCentre /= numPoints; - zCentre /= numPoints; - - this.centroid = new greg.ross.visualisation.Point3D(xCentre, yCentre, zCentre); - } - - this.distance2 = function(p1, p2){ - return ((p1.ax - p2.ax) * (p1.ax - p2.ax)) + ((p1.ay - p2.ay) * (p1.ay - p2.ay)) + ((p1.az - p2.az) * (p1.az - p2.az)); - } - - this.getPoint = function(i){ - return this.points[i]; - } -} - -/* - * PolygonComaparator: Class used to sort arrays of polygons. - * ************************************************************ - */ -greg.ross.visualisation.PolygonComaparator = function(p1, p2){ - var diff = p1.distanceFromCamera - p2.distanceFromCamera; - - if (diff == 0) - return 0; - else - if (diff < 0) - return -1; - else - if (diff > 0) - return 1; - - return 0; -} - -/* - * Th3dtran: Class for matrix manipuation. - * ************************************************************ - */ -greg.ross.visualisation.Th3dtran = function(){ - this.matrix; - this.rMat; - this.rMatrix; - this.objectMatrix; - this.local = true; - - this.init = function(){ - this.matrix = new greg.ross.visualisation.Matrix3d(); - this.rMat = new greg.ross.visualisation.Matrix3d(); - this.rMatrix = new greg.ross.visualisation.Matrix3d(); - this.objectMatrix = new greg.ross.visualisation.Matrix3d(); - - this.initMatrix(); - } - - this.initMatrix = function(){ - this.matrix.matrixIdentity(); - this.objectMatrix.matrixIdentity(); - } - - this.translate = function(x, y, z){ - this.rMat.matrixIdentity(); - this.rMat.getMatrix()[3][0] = x; - this.rMat.getMatrix()[3][1] = y; - this.rMat.getMatrix()[3][2] = z; - - if (this.local) { - this.objectMatrix.matrixCopy(this.rMat); - } - else { - this.matrix.matrixCopy(this.rMat); - } - } - - this.rotate = function(x, y, z){ - var rx = x * (Math.PI / 180.0); - var ry = y * (Math.PI / 180.0); - var rz = z * (Math.PI / 180.0); - - this.rMatrix.matrixIdentity(); - this.rMat.matrixIdentity(); - this.rMat.getMatrix()[1][1] = Math.cos(rx); - this.rMat.getMatrix()[1][2] = Math.sin(rx); - this.rMat.getMatrix()[2][1] = -(Math.sin(rx)); - this.rMat.getMatrix()[2][2] = Math.cos(rx); - this.rMatrix.matrixMult(this.rMatrix, this.rMat); - - this.rMat.matrixIdentity(); - this.rMat.getMatrix()[0][0] = Math.cos(ry); - this.rMat.getMatrix()[0][2] = -(Math.sin(ry)); - this.rMat.getMatrix()[2][0] = Math.sin(ry); - this.rMat.getMatrix()[2][2] = Math.cos(ry); - this.rMat.matrixMult(this.rMatrix, this.rMat); - - this.rMat.matrixIdentity(); - this.rMat.getMatrix()[0][0] = Math.cos(rz); - this.rMat.getMatrix()[0][1] = Math.sin(rz); - this.rMat.getMatrix()[1][0] = -(Math.sin(rz)); - this.rMat.getMatrix()[1][1] = Math.cos(rz); - this.rMat.matrixMult(this.rMatrix, this.rMat); - - if (this.local) { - this.objectMatrix.matrixCopy(this.rMatrix); - } - else { - this.matrix.matrixCopy(this.rMatrix); - } - } - - this.scale = function(scale){ - this.rMat.matrixIdentity(); - this.rMat.getMatrix()[0][0] = scale; - this.rMat.getMatrix()[1][1] = scale; - this.rMat.getMatrix()[2][2] = scale; - - if (this.local) { - this.objectMatrix.matrixCopy(this.rMat); - } - else { - this.matrix.matrixCopy(this.rMat); - } - } - - this.changeLocalObject = function(p){ - p.wx = (p.ax * this.matrix.getMatrix()[0][0] + p.ay * this.matrix.getMatrix()[1][0] + p.az * this.matrix.getMatrix()[2][0] + this.matrix.getMatrix()[3][0]); - p.wy = (p.ax * this.matrix.getMatrix()[0][1] + p.ay * this.matrix.getMatrix()[1][1] + p.az * this.matrix.getMatrix()[2][1] + this.matrix.getMatrix()[3][1]); - p.wz = (p.ax * this.matrix.getMatrix()[0][2] + p.ay * this.matrix.getMatrix()[1][2] + p.az * this.matrix.getMatrix()[2][2] + this.matrix.getMatrix()[3][2]); - - return p; - } - - this.ChangeObjectPoint = function(p){ - p.ax = (p.lx * this.objectMatrix.getMatrix()[0][0] + p.ly * this.objectMatrix.getMatrix()[1][0] + p.lz * this.objectMatrix.getMatrix()[2][0] + this.objectMatrix.getMatrix()[3][0]); - p.ay = (p.lx * this.objectMatrix.getMatrix()[0][1] + p.ly * this.objectMatrix.getMatrix()[1][1] + p.lz * this.objectMatrix.getMatrix()[2][1] + this.objectMatrix.getMatrix()[3][1]); - p.az = (p.lx * this.objectMatrix.getMatrix()[0][2] + p.ly * this.objectMatrix.getMatrix()[1][2] + p.lz * this.objectMatrix.getMatrix()[2][2] + this.objectMatrix.getMatrix()[3][2]); - - return p; - } - - this.init(); -} - -/* - * Point: A simple 2D point. - * ************************************************************ - */ -greg.ross.visualisation.Point = function(x, y){ - this.x = x; - this.y = y; -} - -/* - * This function displays tooltips and was adapted from original code by Michael Leigeber. - * See http://www.leigeber.com/ - */ -greg.ross.visualisation.Tooltip = function(useExplicitPositions){ - var top = 3; - var left = 3; - var maxw = 300; - var speed = 10; - var timer = 20; - var endalpha = 95; - var alpha = 0; - var tt, t, c, b, h; - var ie = document.all ? true : false; - - this.show = function(v, w){ - if (tt == null) { - tt = document.createElement('div'); - tt.style.color = "#fff"; - - tt.style.position = 'absolute'; - tt.style.display = 'block'; - - t = document.createElement('div'); - - t.style.display = 'block'; - t.style.height = '5px'; - t.style.marginleft = '5px'; - t.style.overflow = 'hidden'; - - c = document.createElement('div'); - - b = document.createElement('div'); - - tt.appendChild(t); - tt.appendChild(c); - tt.appendChild(b); - document.body.appendChild(tt); - - if (!ie) { - tt.style.opacity = 0; - tt.style.filter = 'alpha(opacity=0)'; - } - else - tt.style.opacity = 1; - - - } - - if (!useExplicitPositions) - document.onmousemove = this.pos; - - tt.style.display = 'block'; - c.innerHTML = '' + v + ''; - tt.style.width = w ? w + 'px' : 'auto'; - - if (!w && ie) { - t.style.display = 'none'; - b.style.display = 'none'; - tt.style.width = tt.offsetWidth; - t.style.display = 'block'; - b.style.display = 'block'; - } - - if (tt.offsetWidth > maxw) { - tt.style.width = maxw + 'px'; - } - - h = parseInt(tt.offsetHeight) + top; - - if (!ie) { - clearInterval(tt.timer); - tt.timer = setInterval(function(){ - fade(1) - }, timer); - } - } - - this.setPos = function(e){ - tt.style.top = e.y + 'px'; - tt.style.left = e.x + 'px'; - } - - this.pos = function(e){ - var u = ie ? event.clientY + document.documentElement.scrollTop : e.pageY; - var l = ie ? event.clientX + document.documentElement.scrollLeft : e.pageX; - tt.style.top = (u - h) + 'px'; - tt.style.left = (l + left) + 'px'; - } - - function fade(d){ - var a = alpha; - - if ((a != endalpha && d == 1) || (a != 0 && d == -1)) { - var i = speed; - - if (endalpha - a < speed && d == 1) { - i = endalpha - a; - } - else - if (alpha < speed && d == -1) { - i = a; - } - - alpha = a + (i * d); - tt.style.opacity = alpha * .01; - tt.style.filter = 'alpha(opacity=' + alpha + ')'; - } - else { - clearInterval(tt.timer); - - if (d == -1) { - tt.style.display = 'none'; - } - } - } - - this.hide = function(){ - if (tt == null) - return; - - if (!ie) { - clearInterval(tt.timer); - tt.timer = setInterval(function(){ - fade(-1) - }, timer); - } - else { - tt.style.display = 'none'; - } - } -} - -greg.ross.visualisation.JSSurfacePlot.DEFAULT_X_ANGLE = 47; -greg.ross.visualisation.JSSurfacePlot.DEFAULT_Z_ANGLE = 47; -greg.ross.visualisation.JSSurfacePlot.DATA_DOT_SIZE = 3; -greg.ross.visualisation.JSSurfacePlot.DEFAULT_SCALE = 350; -greg.ross.visualisation.JSSurfacePlot.MIN_SCALE = 50; -greg.ross.visualisation.JSSurfacePlot.MAX_SCALE = 1100; -greg.ross.visualisation.JSSurfacePlot.SCALE_FACTOR = 1.4; - - -},{}]},{},[1]); - - diff --git a/web/static/js9_old/plugins/imexam/4arrow.png b/web/static/js9_old/plugins/imexam/4arrow.png deleted file mode 100644 index 36b875ad531cf0a6b9f9792b856ccd9d83f6797b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1350 zcmZ{hdrVVz6vuy{2JB>DG9zD$ZZ!W#F@#rn@{BM0tJw91q`Q>!_>N-3%?H=iE&WUH%C0}q$ zZE^J23b>FZAFu-F#MT*z%jOW}t$#|JrvL|(#7mDvwWE8RCV>T@%-+9%1t5X>VQSCZ zG7eaN1vdc)EZ^)afZJHuv#n(spl*uh*FK#BD4<<)yCFKu8{H3gFmzYeCY^eW6v(kx{lpDF^m}Z z7#euVv@F*C$6hu_tHEkBkfgz8D~FBETK?2Z+F)8w+aK7$1za!Z?NVE)wT#E!9^mI6 zxP#O0^^+E?9S+4rMHrhh&5LkYjE)GCd-r?X{9O?i?~Q(4$khkDsuv9&++y3&t~oh$ z{O!tf^?lEAQT^gOrf(h@94|^|yJgo)`jt+Dw`WGWgBuo1yG|S(Fa3Px0DeD&>FhA@ zbL)nI(z8#-gFlm%zaBUyl@=R~X;js%pt^mupt?yI>K7*tY?M(cQ@fs>tjH=kzhGXs z$>&*+L-^eB61Ot(rs9rX@AcKQ6~(r~z<13xKL(g*%Lhjf^k%cKd4(`c8>DSwg}m7_ z=F4_-Z6xDzlA<-(@7#mGlUdVz#+|aq1IiYO)-s=W|JdEfhX=Pu3oLK!zxrm8|Kz;W zjs7p5R{hX2Z5cT;yy!Hvlhc`8&zHhy*g{9{qtleMno{MeVL?1DL9)0(EG{W0gcKp7 zxWo=FMDD#Pw_jc;(CO2(=_Y#t!Q%2+gh<1bUI&|t47f} zrA94LYP6~>rhqMCi&#QtJRx8n5eXE6ASRdrn#baam>D!}pg5fT{Cu|7UIY`0*!o<} z{_~0=F!r_^%QK9+LlhOER~dEc9Gaq}Ak9O>MSPV58m|?aB{W6tQEN3BG$I84mk#Pd z;`x8cTiP@_0~8aeVH6ZTD-;r~PEDH(YP8f7$B?55X-|s%4@n{i6(UG3Ur6$Tc-&z! zMF5iZD|`~P1!^P|65-(=m<@H1OkI&oltrU-ZMGU-pOc~2sX6JifkW_lT#j0qXVR+l tIc!zV3wu>s4oj=kuvg}xHx8fR@sAzXo54r#V diff --git a/web/static/js9_old/plugins/imexam/README b/web/static/js9_old/plugins/imexam/README deleted file mode 100644 index f54c5cf..0000000 --- a/web/static/js9_old/plugins/imexam/README +++ /dev/null @@ -1 +0,0 @@ -original source: https://github.com/jbroll/js9imexam diff --git a/web/static/js9_old/plugins/imexam/contour.js b/web/static/js9_old/plugins/imexam/contour.js deleted file mode 100644 index b5c5582..0000000 --- a/web/static/js9_old/plugins/imexam/contour.js +++ /dev/null @@ -1,1039 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0 && i+k < ny ) { - xdat.data[j*nx + i] += kern[k+nk/2|0] * data.data[j*nx+i+k]; - } - } - } - } - for ( j = 0; j < ny; j++ ) { - for ( i = 0; i < nx; i++ ) { - for ( k = -nk/2|0; k < nk/2|0; k++ ) { - if ( j+k >= 0 && j+k < ny ) { - ydat.data[j*nx + i] += kern[k+nk/2|0] * xdat.data[(j+k)*nx+i]; - } - } - } - } - - return ydat; - }; - -}()); - -},{"./imexam":undefined}],2:[function(require,module,exports){ -/** - * Copyright (c) 2010, Jason Davies. - * - * All rights reserved. This code is based on Bradley White's Java version, - * which is in turn based on Nicholas Yue's C++ version, which in turn is based - * on Paul D. Bourke's original Fortran version. See below for the respective - * copyright notices. - * - * See http://paulbourke.net/papers/conrec for the original - * paper by Paul D. Bourke. - * - * The vector conversion code is based on http://apptree.net/conrec.htm by - * Graham Cox. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/* - * Copyright (c) 1996-1997 Nicholas Yue - * - * This software is copyrighted by Nicholas Yue. This code is based on Paul D. - * Bourke's CONREC.F routine. - * - * The authors hereby grant permission to use, copy, and distribute this - * software and its documentation for any purpose, provided that existing - * copyright notices are retained in all copies and that this notice is - * included verbatim in any distributions. Additionally, the authors grant - * permission to modify this software and its documentation for any purpose, - * provided that such modifications are not distributed without the explicit - * consent of the authors and that existing copyright notices are retained in - * all copies. Some of the algorithms implemented by this software are - * patented, observe all applicable patent law. - * - * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY FOR - * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT - * OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY DERIVATIVES THEREOF, - * EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE IS - * PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE NO - * OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - * MODIFICATIONS. - */ - -var Conrec = (function() { - var EPSILON = 1e-20; - - var pointsEqual = function(a, b) { - var x = a.x - b.x, y = a.y - b.y; - return x * x + y * y < EPSILON; - } - - var reverseList = function(list) { - var pp = list.head; - var temp; - - while (pp) { - // swap prev/next pointers - temp = pp.next; - pp.next = pp.prev; - pp.prev = temp; - - // continue through the list - pp = temp; - } - - // swap head/tail pointers - temp = list.head; - list.head = list.tail; - list.tail = temp; - } - - var ContourBuilder = function(level) { - this.count = 0; - this.level = level; - this.s = null; - this.count = 0; - } - ContourBuilder.prototype.remove_seq = function(list) { - // if list is the first item, static ptr s is updated - if (list.prev) { - list.prev.next = list.next; - } else { - this.s = list.next; - } - - if (list.next) { - list.next.prev = list.prev; - } - --this.count; - } - ContourBuilder.prototype.addSegment = function(a, b) { - var pp; - var ss = this.s; - var ma = null; - var mb = null; - var prependA = false; - var prependB = false; - - if ( this.count++ > 100000 ) { - throw new Error("Too many calls to coutour AddSegment"); - } - - while (ss) { - if (ma == null) { - // no match for a yet - if (pointsEqual(a, ss.head.p)) { - ma = ss; - prependA = true; - } else if (pointsEqual(a, ss.tail.p)) { - ma = ss; - } - } - if (mb == null) { - // no match for b yet - if (pointsEqual(b, ss.head.p)) { - mb = ss; - prependB = true; - } else if (pointsEqual(b, ss.tail.p)) { - mb = ss; - } - } - // if we matched both no need to continue searching - if (mb != null && ma != null) { - break; - } else { - ss = ss.next; - } - } - - // c is the case selector based on which of ma and/or mb are set - var c = ((ma != null) ? 1 : 0) | ((mb != null) ? 2 : 0); - - switch(c) { - case 0: // both unmatched, add as new sequence - var aa = {p: a, prev: null}; - var bb = {p: b, next: null}; - aa.next = bb; - bb.prev = aa; - - // create sequence element and push onto head of main list. The order - // of items in this list is unimportant - ma = {head: aa, tail: bb, next: this.s, prev: null, closed: false}; - if (this.s) { - this.s.prev = ma; - } - this.s = ma; - - ++this.count; // not essential - tracks number of unmerged sequences - break; - - case 1: // a matched, b did not - thus b extends sequence ma - pp = {p: b}; - - if (prependA) { - pp.next = ma.head; - pp.prev = null; - ma.head.prev = pp; - ma.head = pp; - } else { - pp.next = null; - pp.prev = ma.tail; - ma.tail.next = pp; - ma.tail = pp; - } - break; - - case 2: // b matched, a did not - thus a extends sequence mb - pp = {p: a}; - - if (prependB) { - pp.next = mb.head; - pp.prev = null; - mb.head.prev = pp; - mb.head = pp; - } else { - pp.next = null; - pp.prev = mb.tail; - mb.tail.next = pp; - mb.tail = pp; - } - break; - - case 3: // both matched, can merge sequences - // if the sequences are the same, do nothing, as we are simply closing this path (could set a flag) - - if (ma === mb) { - pp = {p: ma.tail.p, next: ma.head, prev: null}; - ma.head.prev = pp; - ma.head = pp; - ma.closed = true; - break; - } - - // there are 4 ways the sequence pair can be joined. The current setting of prependA and - // prependB will tell us which type of join is needed. For head/head and tail/tail joins - // one sequence needs to be reversed - switch((prependA ? 1 : 0) | (prependB ? 2 : 0)) { - case 0: // tail-tail - // reverse ma and append to mb - reverseList(ma); - // fall through to head/tail case - case 1: // head-tail - // ma is appended to mb and ma discarded - mb.tail.next = ma.head; - ma.head.prev = mb.tail; - mb.tail = ma.tail; - - //discard ma sequence record - this.remove_seq(ma); - break; - - case 3: // head-head - // reverse ma and append mb to it - reverseList(ma); - // fall through to tail/head case - case 2: // tail-head - // mb is appended to ma and mb is discarded - ma.tail.next = mb.head; - mb.head.prev = ma.tail; - ma.tail = mb.tail; - - //discard mb sequence record - this.remove_seq(mb); - break; - } - } - } - - /** - * Implements CONREC. - * - * @param {function} drawContour function for drawing contour. Defaults to a - * custom "contour builder", which populates the - * contours property. - */ - var Conrec = function(drawContour) { - if (!drawContour) { - var c = this; - c.contours = {}; - /** - * drawContour - interface for implementing the user supplied method to - * render the countours. - * - * Draws a line between the start and end coordinates. - * - * @param startX - start coordinate for X - * @param startY - start coordinate for Y - * @param endX - end coordinate for X - * @param endY - end coordinate for Y - * @param contourLevel - Contour level for line. - */ - this.drawContour = function(startY, startX, endY, endX, contourLevel, k) { - var cb = c.contours[k]; - if (!cb) { - cb = c.contours[k] = new ContourBuilder(contourLevel); - } - cb.addSegment({x: startX, y: startY}, {x: endX, y: endY}); - } - this.contourList = function() { - var l = []; - var a = c.contours; - for (var k in a) { - var s = a[k].s; - var level = a[k].level; - while (s) { - var h = s.head; - var l2 = []; - l2.level = level; - l2.k = k; - while (h && h.p) { - l2.push(h.p); - h = h.next; - } - l.push(l2); - s = s.next; - } - } - l.sort(function(a, b) { return b.k - a.k }); - return l; - } - } else { - this.drawContour = drawContour; - } - this.h = new Array(5); - this.sh = new Array(5); - this.xh = new Array(5); - this.yh = new Array(5); - } - - /** - * contour is a contouring subroutine for rectangularily spaced data - * - * It emits calls to a line drawing subroutine supplied by the user which - * draws a contour map corresponding to real*4data on a randomly spaced - * rectangular grid. The coordinates emitted are in the same units given in - * the x() and y() arrays. - * - * Any number of contour levels may be specified but they must be in order of - * increasing value. - * - * - * @param {number[][]} d - matrix of data to contour - * @param {number} ilb,iub,jlb,jub - index bounds of data matrix - * - * The following two, one dimensional arrays (x and y) contain - * the horizontal and vertical coordinates of each sample points. - * @param {number[]} x - data matrix column coordinates - * @param {number[]} y - data matrix row coordinates - * @param {number} nc - number of contour levels - * @param {number[]} z - contour levels in increasing order. - */ - Conrec.prototype.contour = function(d, ilb, iub, jlb, jub, x, y, nc, z) { - var h = this.h, sh = this.sh, xh = this.xh, yh = this.yh; - var drawContour = this.drawContour; - this.contours = {}; - - /** private */ - var xsect = function(p1, p2){ - return (h[p2]*xh[p1]-h[p1]*xh[p2])/(h[p2]-h[p1]); - } - - var ysect = function(p1, p2){ - return (h[p2]*yh[p1]-h[p1]*yh[p2])/(h[p2]-h[p1]); - } - var m1; - var m2; - var m3; - var case_value; - var dmin; - var dmax; - var x1 = 0.0; - var x2 = 0.0; - var y1 = 0.0; - var y2 = 0.0; - - // The indexing of im and jm should be noted as it has to start from zero - // unlike the fortran counter part - var im = [0, 1, 1, 0]; - var jm = [0, 0, 1, 1]; - - // Note that castab is arranged differently from the FORTRAN code because - // Fortran and C/C++ arrays are transposed of each other, in this case - // it is more tricky as castab is in 3 dimensions - var castab = [ - [ - [0, 0, 8], [0, 2, 5], [7, 6, 9] - ], - [ - [0, 3, 4], [1, 3, 1], [4, 3, 0] - ], - [ - [9, 6, 7], [5, 2, 0], [8, 0, 0] - ] - ]; - - - for (var j=(jub-1);j>=jlb;j--) { - for (var i=ilb;i<=iub-1;i++) { - var temp1, temp2; - temp1 = Math.min(d.get(i, j), d.get(i, j+1)); - temp2 = Math.min(d.get(i+1, j), d.get(i+1, j+1)); - - dmin = Math.min(temp1,temp2); - temp1 = Math.max(d.get(i, j), d.get(i, j+1)); - - temp2 = Math.max(d.get(i+1, j),d.get(i+1, j+1)); - dmax = Math.max(temp1,temp2); - - if (dmax>=z[0]&&dmin<=z[nc-1]) { - for (var k=0;k=dmin&&z[k]<=dmax) { - for (var m=4;m>=0;m--) { - if (m>0) { - // The indexing of im and jm should be noted as it has to - // start from zero - h[m] = d.get(i+im[m-1], j+jm[m-1])-z[k]; - xh[m] = x[i+im[m-1]]; - yh[m] = y[j+jm[m-1]]; - } else { - h[0] = 0.25*(h[1]+h[2]+h[3]+h[4]); - xh[0]=0.5*(x[i]+x[i+1]); - yh[0]=0.5*(y[j]+y[j+1]); - } - if (h[m]>0.0) { - sh[m] = 1; - } else if (h[m]<0.0) { - sh[m] = -1; - } else - sh[m] = 0; - } - // - // Note: at this stage the relative heights of the corners and the - // centre are in the h array, and the corresponding coordinates are - // in the xh and yh arrays. The centre of the box is indexed by 0 - // and the 4 corners by 1 to 4 as shown below. - // Each triangle is then indexed by the parameter m, and the 3 - // vertices of each triangle are indexed by parameters m1,m2,and - // m3. - // It is assumed that the centre of the box is always vertex 2 - // though this isimportant only when all 3 vertices lie exactly on - // the same contour level, in which case only the side of the box - // is drawn. - // - // - // vertex 4 +-------------------+ vertex 3 - // | \ / | - // | \ m-3 / | - // | \ / | - // | \ / | - // | m=2 X m=2 | the centre is vertex 0 - // | / \ | - // | / \ | - // | / m=1 \ | - // | / \ | - // vertex 1 +-------------------+ vertex 2 - // - // - // - // Scan each triangle in the box - // - for (m=1;m<=4;m++) { - m1 = m; - m2 = 0; - if (m!=4) { - m3 = m+1; - } else { - m3 = 1; - } - case_value = castab[sh[m1]+1][sh[m2]+1][sh[m3]+1]; - if (case_value!=0) { - switch (case_value) { - case 1: // Line between vertices 1 and 2 - x1=xh[m1]; - y1=yh[m1]; - x2=xh[m2]; - y2=yh[m2]; - break; - case 2: // Line between vertices 2 and 3 - x1=xh[m2]; - y1=yh[m2]; - x2=xh[m3]; - y2=yh[m3]; - break; - case 3: // Line between vertices 3 and 1 - x1=xh[m3]; - y1=yh[m3]; - x2=xh[m1]; - y2=yh[m1]; - break; - case 4: // Line between vertex 1 and side 2-3 - x1=xh[m1]; - y1=yh[m1]; - x2=xsect(m2,m3); - y2=ysect(m2,m3); - break; - case 5: // Line between vertex 2 and side 3-1 - x1=xh[m2]; - y1=yh[m2]; - x2=xsect(m3,m1); - y2=ysect(m3,m1); - break; - case 6: // Line between vertex 3 and side 1-2 - x1=xh[m3]; - y1=yh[m3]; - x2=xsect(m1,m2); - y2=ysect(m1,m2); - break; - case 7: // Line between sides 1-2 and 2-3 - x1=xsect(m1,m2); - y1=ysect(m1,m2); - x2=xsect(m2,m3); - y2=ysect(m2,m3); - break; - case 8: // Line between sides 2-3 and 3-1 - x1=xsect(m2,m3); - y1=ysect(m2,m3); - x2=xsect(m3,m1); - y2=ysect(m3,m1); - break; - case 9: // Line between sides 3-1 and 1-2 - x1=xsect(m3,m1); - y1=ysect(m3,m1); - x2=xsect(m1,m2); - y2=ysect(m1,m2); - break; - default: - break; - } - // Put your processing code here and comment out the printf - //printf("%f %f %f %f %f\n",x1,y1,x2,y2,z[k]); - - //console.log(x1,y1,x2,y2,z[k],k); - drawContour(x1,y1,x2,y2,z[k],k); - } - } - } - } - } - } - } - } - return Conrec; -})(); -if (typeof exports !== "undefined") { - exports.Conrec = Conrec; -} - -},{}],3:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true, evil: true, regexp: true, bitwise: true */ -/*globals typed, Int8Array */ - -"use strict"; - -(function() { - - var top = 0; - var right = 1; - var bottom = 2; - var left = 3; - var none = 4; - - function contour (levels, xdim, ydim, image, draw) - { - var c; - var level; - - var used = new Uint8Array(xdim*ydim); - var ii,jj; - - - for ( c=0; c < levels.length; c++ ) { - level = levels[c]; - - for ( ii=0; ii < xdim*ydim; ii++) { - used[ii] = 0; - } - - // Search outer edges - // - // Search top - for ( jj=0, ii=0; ii < xdim-1; ii++ ) { - if ( image[jj*xdim + ii] < level && level <= image[jj*xdim + ii+1]) { - trace(xdim, ydim, level, ii , jj , top, image, used, draw); - } - } - - // Search right - for (jj=0; jj < ydim-1; jj++) { - if ( image[jj*xdim + ii] < level && level <= image[(jj+1)*xdim + ii]) { - trace(xdim, ydim, level, ii-1, jj , right, image, used, draw); - } - } - - // Search Bottom - for (ii--; ii >= 0; ii--) { - if ( image[jj*xdim + ii+1]= 0; jj--) { - if ( image[(jj+1)*xdim + ii] < level && level <= image[jj*xdim + ii] ) { - trace(xdim, ydim, level, ii , jj , left, image, used, draw); - } - } - - // Search each row of the image - for (jj=1; jj < ydim-1; jj++) { - for (ii=0; ii < xdim-1; ii++) { - if ( !used[jj*xdim + ii] && image[jj*xdim + ii] < level && level <= image[jj*xdim + ii+1]) { - trace(xdim, ydim, level, ii, jj , top, image, used, draw); - } - } - } - } - } - - function trace (xdim, ydim, level, xCell, yCell, side, image, used, draw) - { - var ii = xCell; - var jj = yCell; - var origSide = side; - - var init = 1; - var done = (ii<0 || ii>=xdim-1 || jj<0 && jj>=ydim-1); - - var flag; - var a, b, c, d; - var X, Y; - - while ( !done ) { - flag = 0; - - a = image[ jj *xdim + ii]; - b = image[ jj *xdim + ii+1]; - c = image[(jj+1)*xdim + ii+1]; - d = image[(jj+1)*xdim + ii]; - - if (init) { - init = 0; - switch (side) { - case top: - X = (level-a) / (b-a) + ii; - Y = jj; - break; - case right: - X = ii+1; - Y = (level-b) / (c-b) + jj; - break; - case bottom: - X = (level-c) / (d-c) + ii; - Y = jj+1; - break; - case left: - X = ii; - Y = (level-a) / (d-a) + jj; - break; - } - - } - else { - if ( side==top ) { used[jj*xdim + ii] = 1; } - - do { - if ( ++side == none ) { side = top; } - - switch (side) { - case top: - if (a>=level && level>b) { - flag = 1; - X = (level-a) / (b-a) + ii; - Y = jj; - jj--; - } - break; - case right: - if( b>=level && level>c ) { - flag = 1; - X = ii+1; - Y = (level-b) / (c-b) + jj; - ii++; - } - break; - case bottom: - if( c>=level && level>d ) { - flag = 1; - X = (level-d) / (c-d) + ii; - Y = jj+1; - jj++; - } - break; - case left: - if( d>=level && level>a ) { - flag = 1; - X = ii; - Y = (level-a) / (d-a) + jj; - ii--; - } - break; - } - } while ( !flag ); - - if ( ++side === none ) { side = top; } - if ( ++side === none ) { side = top; } - - if (ii==xCell && jj==yCell && side==origSide) { done = 1; } - if (ii<0 || ii>=xdim-1 || jj<0 || jj>=ydim-1) { done = 1; } - } - - draw(X+.5 ,Y+.5, level); - - if (done) { draw(0, 0, undefined); } - } - } - - module.exports = contour; -}()); - - -},{}],4:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9, imexam, alert */ - - -(function() { - "use strict"; - - var imexam = require("./imexam"); - var conrec = require("./conrec"); - var contfv = require("./contfv"); - - var binner = require("./bin"); - - - function drawContours(div, display) { - var im = JS9.GetImage({display: display}); - var form = $(div).find(".contour-form")[0]; - - var data = imexam.ndops.ndarray(im.raw.data, [im.raw.height, im.raw.width]); - - var levelString = form.level.value; - var binning = $(form).find("#binning").val(); - var smooth = $(form).find("#smooth").val(); - var quality = $(form).find("input[type=radio]:checked").val(); - - - if ( binning === "none" ) { - binning = 1; - } else { - data = binner.bin2d(data, parseInt(binning)); - } - - var level = JSON.parse("[" + levelString.trim().split(/\s+/).join(",") + "]").map(function(x) { return x*binning*binning; }); - - if ( smooth !== "none" ) { - data = binner.smooth_gaussian2d(data, parseFloat(smooth)); - } - - var contours; - - JS9.waiting(true); - setTimeout(function() { - try { - // var fudge = 0 - - // if ( binning > 1 ) { - // fudge = 1; - // } - - if ( quality === "better" ) { - var c = new conrec.Conrec(); - - try { - var xcoord = imexam.ndops.iota(0, data.shape[0]-1).map(function(x) { return x*binning+(binning-1)/2 +1.0 }) - var ycoord = imexam.ndops.iota(0, data.shape[1]-1).map(function(x) { return x*binning+(binning-1)/2 +1.0 }) - - //var xcoord = imexam.ndops.iota(1, data.shape[0]).map(function(x) { return (x-(binning-1)/2) * binning + fudge }) - //var ycoord = imexam.ndops.iota(1, data.shape[1]).map(function(x) { return (x-(binning-1)/2) * binning + fudge }) - - c.contour(data - , 0, data.shape[0]-1, 0, data.shape[1]-1 , xcoord, ycoord - , level.length, level); - } catch (e) { - alert("Too many coutour segments: Check your coutour levels.\n\nAre you trying to coutour the background levels of an image?"); - return; - } - - contours = c.contourList().map(function(contour) { - return { shape: "polygon", pts: contour }; - }); - } else { - var points = []; - contours = []; - - contours.push({ shape: "polygon", pts: points }); - - contfv(level, data.shape[0], data.shape[1], data.data - , function(x, y, level) { - if ( level === undefined ) { - points = []; - contours.push({ shape: "polygon", pts: points }); - } else { - //points.push({ x: (x+0.5-(binning-1)/2) * binning + fudge, y: (y+0.5-(binning-1)/2) * binning + fudge }); - points.push({ x: x*binning + 0.5, y: y*binning + 0.5 }); - } - }); - contours.length = contours.length-1; - } - - - JS9.NewShapeLayer("contour", JS9.Catalogs.opts, {display: im}); - JS9.RemoveShapes("contour", {display: im}); - JS9.AddShapes("contour", contours, {color: "yellow"}, {display: im}); - } - finally { - JS9.waiting(false); - } - }, 200); - } - - function getMinMax(div, display) { - var im = JS9.GetImage({display: display}); - - if ( im ) { - var form = $(div).find(".contour-form")[0]; - var data = imexam.ndops.ndarray(im.raw.data, [im.raw.width, im.raw.height]); - - form.min.value = imexam.ndops.minvalue(data).toFixed(2); - form.max.value = imexam.ndops.maxvalue(data).toFixed(2); - } - } - - function makeLevel(div, display) { - var i; - var im = JS9.GetImage({display: display}); - - if ( im ) { - var form = $(div).find(".contour-form")[0]; - - var n = Number(form.nlevel.value); - var level = imexam.ndops.ndarray(imexam.ndops.iota(1, n)); - - var min = Number(form.min.value); - var max = Number(form.max.value); - - imexam.ndops.divs(level, level, n+1); // Try n levels from min to max. - imexam.ndops.muls(level, level, max-min); - imexam.ndops.adds(level, level, min); - - var levText = []; - for ( i = 0; i < level.shape[0]; i++ ) { - levText.push(level.data[i].toFixed(2)); - } - - form.level.value = levText.join("\n"); - } - } - - function contInit() { - var im = JS9.GetImage({display: this.display}); - var div = this.div; - - div.innerHTML = '
    \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -
    Num:
    Min:
    Max:
    Levels: \ -
    \ - Binning:       \ - \ - pix \ -
    \ - Smoothing:  \ - \ - pix \ -
    \ - Quality:  \ - faster \ - better \ -
    \ -

    \ -

    '; - - var display = this.display; - - $(div).find(".drw-contour").on("mouseup", function () { drawContours(div, display); }); - $(div).find(".get-min-max").on("mouseup", function () { getMinMax(div, display); }); - $(div).find(".make-levels").on("mouseup", function () { makeLevel(div, display); }); - - - if ( im !== undefined ) { - getMinMax(div, display); - makeLevel(div, display); - } - - imexam.fixupDiv(this); - } - - JS9.RegisterPlugin("ImExam", "Contours", contInit, { - menu: "view", - - winTitle: "Contours", - menuItem: "Contours", - help: "imexam/contours.html", - - toolbarSeparate: true, - - winDims: [400, 300], - }); -}()); - - - - -},{"./bin":1,"./conrec":2,"./contfv":3,"./imexam":undefined}]},{},[4]); - - diff --git a/web/static/js9_old/plugins/imexam/contours.html b/web/static/js9_old/plugins/imexam/contours.html deleted file mode 100644 index aeed664..0000000 --- a/web/static/js9_old/plugins/imexam/contours.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - - -JS9 Contours Plugin - - - -
    - -

    - -

    Contours

    - -Contours levels can be overlaid on the displayed image. - -

    -The N entry box controls the number of contours levels to draw. - -

    -Pressing the Draw Contours button will draw contours at the image levels -currently listed in the Levels: list. - -

    -Pressing the Set Min/Max button will fill in the min and max entry boxes -from the minimum and maximum values of the image. - -

    -Pressing the Make Levels will fill in the levels list with an evenly -spaced list of level values from min to max excluding the min and max values -themselves. - -

    -The Binning option allows the image data to be binned before -the contours are computed. Contours will be computed more quickly for -binned images. However, binning will cause the positions of the contours -to be less accurate. - -

    -The Smooth option causes the image data to be smoothed by a Gaussian kernel -with the specified sigma number of pixels before the contours are computed. -This technique often is necessary to achieve good results for sparse data -(e.g. event files). However, it can affect the accuracy of the contours. - -

    -The Quality radio button chooses between one of two contouring methods. -The faster option selects contours with up to 4 points per pixel. The quality -option selects contours with up to 8 points to pixel. - -

    - - diff --git a/web/static/js9_old/plugins/imexam/encircled.js b/web/static/js9_old/plugins/imexam/encircled.js deleted file mode 100644 index b4c3ed4..0000000 --- a/web/static/js9_old/plugins/imexam/encircled.js +++ /dev/null @@ -1,71 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9 */ - -"use strict"; - - -(function() { - var imexam = require("./imexam"); - - var encen_template = " \ -
    \ - \ - \ - \ -
    ee50{ee50%.2f}
    ee80{ee80%.2f}
    \ -
    "; - - function energUpdate(im, xreg) { - var div = this.div; - - var imag = imexam.getRegionData(im, xreg); - - var backgr = imexam.imops.backgr(imag, 4).value; - var data = imexam.ndops.assign(imexam.ndops.zeros(imag.shape), imag); - - imexam.ndops.subs(data, imag, backgr); - - var qcenter = imexam.ndops.qcenter(data); - var centroid = imexam.ndops.centroid(data, qcenter); - - var encen = imexam.imops.encen(data, [centroid.ceny, centroid.cenx]); - - var stat = {}; - stat.ee80 = imexam.ndops.indexof(encen, 0.80); - stat.ee50 = imexam.ndops.indexof(encen, 0.50); - - var edata = []; - var i; - - for ( i = 0; i < encen.shape[0]; i++ ) { - edata[i] = [i, encen.get(i)]; - } - - $(div).empty(); - var plot = $.plot(div, [edata] - , { selection: { mode: "xy" } }); - - $(div).append(imexam.template(encen_template, stat)); - } - - function energInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see encircled energy
    "); - } - - JS9.RegisterPlugin("ImExam", "EncEnergy", energInit, { - menu: "analysis", - - menuItem: "Encircled Energy", - winTitle: "Encircled Energy", - help: "imexam/imexam.html#enener", - - dynamicSelect: true, - - toolbarSeparate: true, - - onregionschange: energUpdate, - winDims: [250, 250], - }); - -}()); diff --git a/web/static/js9_old/plugins/imexam/imcnts.js b/web/static/js9_old/plugins/imexam/imcnts.js deleted file mode 100644 index 4069d7a..0000000 --- a/web/static/js9_old/plugins/imexam/imcnts.js +++ /dev/null @@ -1,133 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9, imexam, Int32Array */ - -"use strict"; - - -(function() { - var imexam = require("./imexam"); - var template = imexam.template; - var mask = imexam.ndops.mask; - - function runImCnts(im, xreg) { - var i; - var div = this.div; - var text = $(div).find(".imcnts-result")[0]; - - var data = imexam.ndops.ndarray(im.raw.data, [im.raw.height, im.raw.width]); - - var regs = JS9.GetRegions({display: im}); - var mimg = imexam.ndops.zeros(data.shape, Int32Array); - - var list = mask.listRegions(regs); - mask.drawRegions(list, mimg.data, mimg.shape[0]); - - var cnts = imexam.ndops.imcnts(data, mimg, list.length+1); - - var backgr_cnts = 0, backgr_area = 0; - - var back = []; - var srce = []; - var net, regno; - - for ( i = 0; i < list.length; i++ ) { - if ( mask.hasTag(list[i], "background") ) { - regno = list[i].regno; - - backgr_cnts += cnts.cnts.get(regno); - backgr_area += cnts.area.get(regno); - - back.push({ regno: regno, cnts: cnts.cnts.get(regno), area: cnts.area.get(regno) }); - } - } - - for ( i = 0; i < list.length; i++ ) { - if ( mask.hasTag(list[i], "source") && !mask.hasTag(list[i], "exclude") ) { - regno = list[i].regno; - - if ( backgr_area > 0 ) { - net = cnts.cnts.get(regno) - (backgr_cnts * (cnts.area.get(regno)/backgr_area)); - } else { - net = cnts.cnts.get(regno); - } - - srce.push({ regno: regno, net: net, cnts: cnts.cnts.get(regno), area: cnts.area.get(regno) }); - } - } - - $(text).html("Source\n" - + "regno counts area net\n" - + "----- ------ ---- ---\n" - + srce.map(function(x, i) { return template("{regno%5d} {cnts%14.3f} {area%10.3f} {net%14.3f}", x); }).join("\n") - + "\n\nBackground\n" - + "regno counts area\n" - + "----- ------ ----\n" - + back.map(function(x, i) { return template("{regno%5d} {cnts%14.3f} {area%10.3f}", x); }).join("\n")); - } - -/* - function getRegions(div, display) { - var im = JS9.GetImage({display: display}); - - if ( im ) { - var data = imexam.ndops.ndarray(im.raw.data); - var form = $(div).find(".imcnts-form")[0]; - - form.min.value = imexam.ndops.minvalue(data).toFixed(2); - form.max.value = imexam.ndops.maxvalue(data).toFixed(2); - } - } - */ - - function imcntsInit() { - var div = this.div; - -/* - div.innerHTML = '

    \ - \ - \ - \ - \ - \ - \ -
    SourceBackground
    \ - \ -
    Results
    \ -
    \ -

    \ -

    '; - */ - - div.innerHTML = '
    \ - \ - \ - \ -
    Counts in Regions
    \ -
    \ -

    \ -

    '; - - //var display = this.display; - //$(div).find(".run-imcnts").on("mouseup", function () { runImCnts (div, display); }); - //$(div).find(".get-regions").on("mouseup", function () { getRegions(div, display); }); - - imexam.fixupDiv(this); - } - - JS9.RegisterPlugin("ImExam", "ImCnts", imcntsInit, { - menu: "analysis", - - winTitle: "ImCounts", - menuItem: "ImCounts", - help: "imexam/imcnts.html", - - toolbarSeparate: true, - - onregionschange: runImCnts, - winDims: [600, 250], - }); -}()); diff --git a/web/static/js9_old/plugins/imexam/imexam.html b/web/static/js9_old/plugins/imexam/imexam.html deleted file mode 100644 index 65744fd..0000000 --- a/web/static/js9_old/plugins/imexam/imexam.html +++ /dev/null @@ -1,126 +0,0 @@ - - - - - -JS9 Imexam Plugins - - - -
    - -

    JS9 Imexam Plugins

    - -These tasks perform various types of image analysis using a rectangular box -surrounding the selected region. That is, the actual region shape is ignored -and the analysis reflects a rectangular section of image pixels. The selected -section can be rotated for box, ellipse, and line regions. For a line region, -the width is the length of the line, while the height is set to the value of -the JS9.globalOpts.imexamLineHeight parameter (default is 1). - -

    - -

    Region Statistics

    - -A rectangular box of image pixels is selected and some statistical -values are computed from the data. - -
    -

    Notes

    - -
      -
    • Totcounts and bscounts -

      - Totcounts are the total counts in the box region, while bscounts - has the calculated background (see below) subtracted from the total. - -

    • Background and Noise -

      - The background and noise are obtained from the outer 4 pixel-wide - perimeter of the selected region. The background value is the median - value of this area and the noise value is the RMS. -

    • -
    • Centroid -

      - The centroid is obtained by locating the brightest 9 pixel box and - computing the centroid of the background subtracted data about this point. -

    • -
    • FWHM -

      - The FWHM is estimated from the image moments about the centroid, assuming - a Gaussian distribution. -

    • -
    -
    - -

    - -

    X and Y Projection Plot

    - -A rectangular box of image pixels is selected and the projection along -the region's X (width) or Y (height) axis is plotted. The sum, -average, or median of the projected pixels may be selected. - -

    - -

    Radial Profile

    - -A rectangular box of image pixels is selected and the pixels values -are plotted against their respective radii. A Gaussian is fit to the -radial profile data and the result is also plotted. The fitted -results of the 4 parameter fit are displayed with the plot. - -

    -The center pixel from which the radii are computed is determined from the -background subtracted centroid taken about the brightest 9 pixels in the data -(same centroid as is displayed in the region stats plugin). - - -

    - -

    Pixel Value Histogram

    - -A rectangular box of image pixels is selected and a histogram of the -values is plotted. The selected pixels are binned into 250 bins -between the minimum and maximum value found in the selected region. - -

    - -

    Encircled Energy

    - -A rectangular box of image pixels is selected and background subtracted. The -analysis radius is determined from the region as follows: - -
      -
    • circle: region radius
    • -
    • annulus: max annulus radius
    • -
    • box: half the average height an width
    • -
    • ellipse: average axis radius
    • -
    • polygon: half the average of the height and width of polygon bounding box
    • -
    - -The values within the analysis radius are binned in 1 pixel radial bins. The -bins are normalized by the sum of all pixels and the result is plotted. - -

    -The background is obtained as the median from the outer 4 pixel wide perimeter of the -selected region. - -

    -The center pixel from which the encircled energy is computed is determined from -the background subtracted centroid taken about the brightest 9 pixels in the -data (same centroid as is displayed in the region stats plugin). - -

    -The 50 and 80 percent encircled energy points are displayed over the plot. - -

    - -

    3d Surface Plot

    - -A rectangular box of image pixels is selected and plotted as a surface. - -
    - - diff --git a/web/static/js9_old/plugins/imexam/imexam.js b/web/static/js9_old/plugins/imexam/imexam.js deleted file mode 100644 index 6a10063..0000000 --- a/web/static/js9_old/plugins/imexam/imexam.js +++ /dev/null @@ -1,2543 +0,0 @@ -require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 17 ) { break;} - } - console.log(line); - } else { - for ( y = a.shape[0]-1; y >= 0; --y ) { - line = ""; - for ( x = 0; x < a.shape[1]; ++x ) { - line += a.get(y, x).toFixed(prec) + " "; - } - - console.log(line); - } - console.log("\n"); - } -}; - -ndops._hist = typed(function (a, width , min, max) { - var size = Math.floor((max-min) / width); - var h = new Int32Array(size+1); - - // ----- - if( !isNaN(a) ){ - var bin = Math.max(0, Math.min(size, Math.round((a-min)/width))) | 0; // | is truncate - h[bin]++; - } - // ----- - - return h; -}); - - - -ndops.hist = function(a, width, min, max) { - var hist = {}; - var reply; - - if ( min === undefined ) { - min = ndops.minvalue(a); - } - if ( max === undefined ) { - max = ndops.maxvalue(a); - } - if ( width === undefined ) { - width = Math.max(1, (max-min) / 250); - } - - hist.raw = a; - - hist.min = min; - hist.max = max; - hist.width = width; - - reply = ndops._hist(a, width, min, max); - hist.data = ndops.ndarray(reply, [reply.length]); - - return hist; -}; - -ndops.proj = function(a, axis) { - var sect; - var i; - - //var proj = ndops.ndarray(ndops._proj(a, axis, new Float32Array(a.shape[axis === 0 ? 1 : 0]), [a.shape[axis === 0 ? 1 : 0]])); - - var proj = {}; - proj.n = a.shape[axis === 1 ? 0 : 1]; - proj.x = a.shape[axis]; - - proj.sum = []; - proj.avg = []; - proj.med = []; - - var copy = ndops.assign(ndops.zeros(a.shape), a); - - for ( i = 0; i < proj.n; i++ ) { - if ( axis === 0 ) { - sect = ndops.section(copy, [[i, i+1], [0, proj.x]]); - } else { - sect = ndops.section(copy, [[0, proj.x], [i, i+1]]); - } - - proj.sum[i] = ndops.sum(sect); - proj.avg[i] = ndops.sum(sect)/proj.n; - proj.med[i] = ndops.median(sect); - } - - return proj; -}; - -ndops.qcenter = typed(function (a) { - var start = [], end = []; - var max = Number.MIN_VALUE; - var idx; - var iX = 0, iY = 0; - - start[0]++; - start[1]++; - end[0]--; - end[1]--; - - // ---- - var sum = - + a[iY-1][iX-1] - + a[iY-1][iX ] - + a[iY-1][iX+1] - + a[iY ][iX-1] - + a[iY ][iX ] - + a[iY ][iX+1] - + a[iY+1][iX-1] - + a[iY+1][iX ] - + a[iY+1][iX+1]; - - if ( max < sum ) { - max = sum; - idx = [iX, iY]; - } - // ---- - - return idx; -}); - -ndops._imcnts = typed({ consider: { c: false } }, function (c, a, b) { c[b] += a; }); - -ndops.imcnts = function (a, b, n) { - var reply = {}; - reply.cnts = ndops.ndarray(ndops._imcnts(new Float32Array(n), a, b)); - reply.area = ndops.hist(b, 1, 0, n-1).data; - - return reply; -}; - - -ndops._centroid = typed(function (a, nx, ny) { - var sum = 0; - var sumx = 0; - var sumy = 0; - var sumxx = 0; - var sumyy = 0; - - var r = nx*nx+ny*ny; - - var iX = 0, iY = 0; - - // ---- - if ( a > 0 && iX*iX + iY*iY < r ) { - sum += a; - sumx += a * iX; - sumxx += a * iX * iX; - sumy += a * iY; - sumyy += a * iY * iY; - } - - // ---- - - var reply = {}; - - reply.sum = sum; - reply.cenx = sumx/sum; - reply.ceny = sumy/sum; - - reply.rmom = ( sumxx - sumx * sumx / sum + sumyy - sumy * sumy / sum ) / sum; - - if ( reply.rmom <= 0 ) { - reply.fwhm = -1.0; - } else { - reply.fwhm = Math.sqrt(reply.rmom) * 2.354 / Math.sqrt(2.0); - } - - return reply; -}); - -ndops.centroid = function(a) { - var reply = ndops._centroid(a, a.shape[0], a.shape[1]); - - return reply; -}; - -ndops.flatten = function() { - var size = 0; - var i, n, a; - - for ( i = 0; i < arguments.length; i++ ) { - size += arguments[i].size; - } - - var reply = ndops.zeros([size]); - var off = 0; - - for ( n = 0; n < arguments.length; n++ ) { - a = arguments[n]; - - ndops.assign(ndops.ndarray(reply.data, a.shape, undefined, off), a); - - off += a.size; - } - - return reply; -}; - -ndops.median = function(a) { - var data = ndops.assign(ndops.zeros(a.shape), a); - - Array.prototype.sort.call(data.data, function(a, b) { return a-b; }); - - var reply = data.data[Math.round((data.size-1)/2.0)]; - - return reply; -}; - - -ndops.rms = typed(function (a) { - var sum = 0; - var squ = 0; - // ---- - if( !isNaN(a) ){ - sum += a; - squ += a*a; - } - // ---- - - var mean = sum/a.size; - - return Math.sqrt((squ - 2*mean*sum + a.size*mean*mean)/(a.size-1)); -}); - -ndops.rmsClipped = typed(function (a, min, max) { - var n = 0; - var sum = 0; - var squ = 0; - // ---- - if ( !isNaN(a) && (min === null || a > min) && (max === null || a < max) ) { - n++; - sum += a; - squ += a*a; - } - // ---- - - var mean = sum/n; - - return Math.sqrt((squ - 2*mean*sum + n*mean*mean)/(n-1)); -}); - -ndops.meanClipped = typed(function (a, min, max) { - var n = 0; - var sum = 0; - // ---- - if ( !isNaN(a) && (min === null || a > min) && (max === null || a < max) ) { - n++; - sum += a; - } - // ---- - - return sum/n; -}); - -imops.backgr = function(data, width) { - var back = {}; - - var pixels = ndops.flatten( - ndops.section(data, [[0, width], [0, data.shape[1]]]) - , ndops.section(data, [[data.shape[0]-width, data.shape[0]], [0, data.shape[1]]]) - , ndops.section(data, [[width, data.shape[0]-width], [0, width]]) - , ndops.section(data, [[width, data.shape[0]-width], [data.shape[1]-width, data.shape[1]]])); - - - back.noise = ndops.rms(pixels); - back.value = ndops.median(pixels); - - return back; -}; - -imops.mksection = function(x, y, w, h) { - return [[Math.floor(x-(w/2)), Math.floor(x+(w/2))], - [Math.floor(y-(h/2)), Math.floor(y+(h/2))]]; -}; - -imops._rproj = typed(function (a, cx, cy, radius, length) { - var rad = new Float32Array(length); - var val = new Float32Array(length); - var r = Math.sqrt(radius*radius); - var i = 0; - - var iX = 0, iY = 0; - - // ---- - var d = Math.sqrt((iY-cy)*(iY-cy) + (iX-cx)*(iX-cx)); - - if ( (d <= r) && !isNaN(a) ) { - rad[i] = d; - val[i] = a; - - i++; - } - // ---- - - return { rad: rad.subarray(0, i), val: val.subarray(0, i), n: i }; -}); - -function sortArrays(a, b) { - var indexed; - - indexed = Array.prototype.map.call(a, function(itm, i){ return [itm, i, b[i]]; }); - - indexed.sort(function(a, b){ return a[0]-b[0]; }); - - indexed.map(function(itm, i) { - a[i] = itm[0]; - b[i] = itm[2]; - }); -} - -imops.rproj = function(im, center) { - var radius = (im.shape[0]/2 + im.shape[1]/2) / 2; - var data = imops._rproj(im, center[1], center[0], radius, im.size); - - sortArrays(data.rad, data.val); - - return { radi: ndops.ndarray(data.rad, [data.rad.length]) - , data: ndops.ndarray(data.val, [data.rad.length]), radius: radius }; -}; - - -imops._encen = typed(function (a, cx, cy, radius) { - var reply = new Float32Array(radius); - var sum = 0; - var RSq = radius*radius; - - var tot = 0; - var i; - - var iX = 0, iY = 0; - - // ---- - var x = iX - cx; - var y = iY - cy; - - var rsq = x*x+y*y; - - if ( a > 0 && rsq < RSq ) { - reply[Math.round(Math.sqrt(rsq))] += a; - sum += a; - } - // ---- - - - for ( i = 0; i < radius; i++ ) { - tot += reply[i]; - - reply[i] = tot / sum; - } - - return reply; -}); - - - -imops.encen = function(im, center) { - var radius = Math.floor((im.shape[0]/2 + im.shape[1]/2) / 2); - - var reply = imops._encen(im, center[1], center[0], radius); - - return ndops.ndarray(reply, [reply.length]); -}; - -ndops.indexof = function(a, x) { - var i; - - for ( i = 0; i < a.shape[0]; i++ ) { - - if ( x < a.get(i) ) { break; } - } - - if ( i === 0 ) { return 0; } - if ( i === a.shape[0] ) { return a.shape[0]; } - - return i + (x - a.get(i))/(a.get(i) - a.get(i-1)); -}; - -ndops.gauss1d = function(radi, x0) { - var reply = ndops.zeros(radi.shape); - - var a = x0[0]; - var b = 0; // x0[1]; - var c = x0[1]; - var d = x0[2]; - - ndops.fill(reply, function(i) { - var x = radi.data[i]-b; - - return a * Math.pow(2.71828, - x*x / (2*c*c)) + d; - }); - - return reply; -}; - -ndops.gsfit1d = function(radi, data, x0) { - - var reply = typed.uncmin(function(x) { - var modl = ndops.gauss1d(radi, x); - - ndops.sub(modl, modl, data); - ndops.mul(modl, modl, modl); - ndops.fill(modl, function(i) { - return modl.get(i)/(radi.get(i)*radi.get(i)); - }); - - var sum = ndops.sum(modl); - - return Math.sqrt(sum/radi.shape[0]); - - }, x0, 0.000001); - - // console.log(reply.message); - - return reply.solution; -}; - -function reg2section(xreg) { - - switch ( xreg.shape ) { - - case "annulus": - xreg.width = xreg.radii[xreg.radii.length-1]*2; - xreg.height = xreg.radii[xreg.radii.length-1]*2; - - break; - - case "circle": - xreg.width = xreg.radius*2; - xreg.height = xreg.radius*2; - - break; - - case "ellipse": - xreg.width = xreg.r1*2; - xreg.height = xreg.r2*2; - - break; - - case "polygon": - case "line": - var i, xx = 0, yy = 0, minx = 1000000, maxx = 0, miny = 1000000, maxy = 0; - - for ( i = 0; i < xreg.pts.length; i++ ) { - xx += xreg.pts[i].x; - yy += xreg.pts[i].y; - - if ( xreg.pts[i].x > maxx ) { maxx = xreg.pts[i].x; } - if ( xreg.pts[i].x < minx ) { minx = xreg.pts[i].x; } - if ( xreg.pts[i].y > maxy ) { maxy = xreg.pts[i].y; } - if ( xreg.pts[i].y < miny ) { miny = xreg.pts[i].y; } - } - - xreg.x = xx/xreg.pts.length; - xreg.y = yy/xreg.pts.length; - - if( xreg.shape === "line" && xreg.pts.length === 2 ){ - xreg.width = Math.sqrt(((xreg.pts[0].x - xreg.pts[1].x) * - (xreg.pts[0].x - xreg.pts[1].x)) + - ((xreg.pts[0].y - xreg.pts[1].y) * - (xreg.pts[0].y - xreg.pts[1].y))); - xreg.height = JS9.globalOpts.imexamLineHeight || 1; - xreg.angle = Math.atan2(xreg.pts[1].y - xreg.pts[0].y, - xreg.pts[1].x - xreg.pts[0].x); - xreg.angle = xreg.angle * 180 / Math.PI; - } else { - xreg.width = maxx - minx; - xreg.height = maxy - miny; - } - break; - - case "text": - xreg.width = 10; - xreg.height = 10; - break; - - default: - break; - } - - return imops.mksection(xreg.x, xreg.y, xreg.width, xreg.height); -} - -exports.getRegionData = function (im, xreg) { - var section = reg2section(xreg); - var im_2d = ndops.ndarray(im.raw.data, [im.raw.height, im.raw.width]); - var imag; - - if ( xreg.angle && xreg.angle !== 0 ) { - imag = ndops.zeros([xreg.height, xreg.width]); - - ndops.rotate(imag, im_2d, xreg.angle/57.29577951, xreg.y, xreg.x); - } else { - imag = ndops.section(im_2d, section); - } - - return imag; -}; - -exports.convolve1d = typed(function(kernel, data, output) { - var i, j, x; - var half = Math.round(kernel.shape[0]/2.0); - - for ( i = 0; i < data.shape[0]; i++ ) { - for ( j = 0; j < kernel.shape[0]; j++ ) { - x = i+j-half; - - if ( x >= 0 && x < data.shape[0] ) { - output[i] += kernel[j] * data[x]; - } - } - } -}); - -exports.convolve2dSep = function(kernel, data, output) { - var x, y, i, xx, yy; - - var nx = data.shape[1]; - var ny = data.shape[0]; - var nk = kernel.shape[0]; - - var half = Math.floor(nk/2.0); - - // Run the kernel 1d over each row - // - for ( y = 0; y < ny; y++ ) { - for ( x = 0; x < nx; x++ ) { - output[y][x] = 0; - - for ( i = 0; i < nk; i++ ) { - xx = x+i-half; - - if ( xx > 0 && xx < nx ) { - output[y][x] += data[y][xx]*kernel[i]; - } - } - } - } - - // Run the kernel 1d over each column - // - for ( x = 0; x < nx; x++ ) { - for ( y = 0; y < ny; y++ ) { - - for ( i = 0; i < nk; i++ ) { - yy = y+i-half; - - if ( yy > 0 && yy < ny ) { - output[y][x] += data[y+i][x]*kernel[i]; - } - } - } - } -}; - - -exports.reg2section = reg2section; -exports.template = template; - -exports.ndops = ndops; -exports.typed = ndops; -exports.imops = imops; - - -},{"./mask.js":1,"./template":12,"typed-array-function":4,"typed-array-ops":5,"typed-array-rotate":8,"typed-numeric-uncmin":10}],1:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $ */ - -"use strict"; - -// source -// background -// exclude - -(function() { - var raster = require("./raster"); - - function hasTag(reg, tag) { - var i; - - for ( i = 0; i < reg.tags.length; i++ ) { - if ( reg.tags[i] === tag ) { return true; } - } - - return false; - } - exports.hasTag = hasTag; - - exports.listRegions = function (regs) { - var i, j; - var reg, regno = 1; - - var reply = []; - - for ( i = 0; i < regs.length; i++ ) { - reg = regs[i]; - - switch ( reg.shape ) { - case "annulus": - for ( j = 0; j < reg.radii.length; j++ ) { - if ( reg.radii[j] !== 0.0 ) { - reply[regno-1] = $.extend($.extend({}, reg), { regno: regno++, shape: "circle", radius: reg.radii[j] }); - } - } - break; - default: - reply[regno-1] = $.extend({ regno: regno++ }, reg); - break; - } - } - - return reply; - }; - - exports.drawRegions = function (regs, buffer, width) { - var reg, t, i; - - var type = [ "include", "exclude" ]; - - for ( t = 0; t < 2; t++ ) { - for ( i = regs.length - 1; i >= 0; i-- ) { - reg = regs[i]; - - if ( hasTag(reg, type[t]) ) { - switch ( reg.shape ) { - case "polygon": raster.drawPolygon(buffer, width, reg.pts, reg.regno); break; - case "circle": raster.drawCircle( buffer, width, reg.x, reg.y, reg.radius, reg.regno); break; - case "box": raster.drawBox( buffer, width, reg.x, reg.y, reg.width, reg.height, reg.angle, reg.regno); break; - case "ellipse": raster.drawEllipse(buffer, width, reg.x, reg.y, reg.r1, reg.r2, reg.angle, reg.regno); break; - } - } - } - } - }; -}()); - - -},{"./raster":11}],2:[function(require,module,exports){ -"use strict" - -var iota = require("iota-array") - -var arrayMethods = [ - "concat", - "join", - "slice", - "toString", - "indexOf", - "lastIndexOf", - "forEach", - "every", - "some", - "filter", - "map", - "reduce", - "reduceRight" -] - -function compare1st(a, b) { - return a[0] - b[0] -} - -function order() { - var stride = this.stride - var terms = new Array(stride.length) - var i - for(i=0; iMath.abs(this._stride1))?[1,0]:[0,1]}})") - } else if(dimension === 3) { - code.push( -"var s0=Math.abs(this._stride0),s1=Math.abs(this._stride1),s2=Math.abs(this._stride2);\ -if(s0>s1){\ -if(s1>s2){\ -return [2,1,0];\ -}else if(s0>s2){\ -return [1,2,0];\ -}else{\ -return [1,0,2];\ -}\ -}else if(s0>s2){\ -return [2,0,1];\ -}else if(s2>s1){\ -return [0,1,2];\ -}else{\ -return [0,2,1];\ -}}})") - } - } else { - code.push("ORDER})") - } - } - - //view.set(i0, ..., v): - code.push([ -"proto.set=function ",className,"_set(", args.join(","), ",v){"].join("")) - if(useGetters) { - code.push(["return this.data.set(", index_str, ",v)}"].join("")) - } else { - code.push(["return this.data[", index_str, "]=v}"].join("")) - } - - //view.get(i0, ...): - code.push(["proto.get=function ",className,"_get(", args.join(","), "){"].join("")) - if(useGetters) { - code.push(["return this.data.get(", index_str, ")}"].join("")) - } else { - code.push(["return this.data[", index_str, "]}"].join("")) - } - - //view.index: - code.push([ - "proto.index=function ", - className, - "_index(", args.join(), "){return ", - index_str, "}"].join("")) - - //view.hi(): - code.push(["proto.hi=function ",className,"_hi(",args.join(","),"){return new ", className, "(this.data,", - indices.map(function(i) { - return ["(typeof i",i,"!=='number'||i",i,"<0)?this._shape", i, ":i", i,"|0"].join("") - }).join(","), ",", - indices.map(function(i) { - return "this._stride"+i - }).join(","), ",this.offset)}"].join("")) - - //view.lo(): - var a_vars = indices.map(function(i) { return "a"+i+"=this._shape"+i }) - var c_vars = indices.map(function(i) { return "c"+i+"=this._stride"+i }) - code.push(["proto.lo=function ",className,"_lo(",args.join(","),"){var b=this.offset,d=0,", a_vars.join(","), ",", c_vars.join(",")].join("")) - for(var i=0; i=0){\ -d=i",i,"|0;\ -b+=c",i,"*d;\ -a",i,"-=d}"].join("")) - } - code.push(["return new ", className, "(this.data,", - indices.map(function(i) { - return "a"+i - }).join(","),",", - indices.map(function(i) { - return "c"+i - }).join(","), ",b)}"].join("")) - - //view.step(): - code.push(["proto.step=function ",className,"_step(",args.join(","),"){var ", - indices.map(function(i) { - return "a"+i+"=this._shape"+i - }).join(","), ",", - indices.map(function(i) { - return "b"+i+"=this._stride"+i - }).join(","),",c=this.offset,d=0,ceil=Math.ceil"].join("")) - for(var i=0; i=0){c=(c+this._stride",i,"*i",i,")|0}else{a.push(this._shape",i,");b.push(this._stride",i,")}"].join("")) - } - code.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}") - - //Add return statement - code.push(["return function construct_",className,"(data,shape,stride,offset){return new ", className,"(data,", - indices.map(function(i) { - return "shape["+i+"]" - }).join(","), ",", - indices.map(function(i) { - return "stride["+i+"]" - }).join(","), ",offset)}"].join("")) - - //Compile procedure - var procedure = new Function("CTOR_LIST", "ORDER", code.join("\n")) - return procedure(CACHED_CONSTRUCTORS[dtype], order) -} - -function arrayDType(data) { - if(data instanceof Float64Array) { - return "float64"; - } else if(data instanceof Float32Array) { - return "float32" - } else if(data instanceof Int32Array) { - return "int32" - } else if(data instanceof Uint32Array) { - return "uint32" - } else if(data instanceof Uint8Array) { - return "uint8" - } else if(data instanceof Uint16Array) { - return "uint16" - } else if(data instanceof Int16Array) { - return "int16" - } else if(data instanceof Int8Array) { - return "int8" - } else if(data instanceof Uint8ClampedArray) { - return "uint8_clamped" - } else if(data instanceof Array) { - return "array" - } - return "generic" -} - -var CACHED_CONSTRUCTORS = { - "float32":[], - "float64":[], - "int8":[], - "int16":[], - "int32":[], - "uint8":[], - "uint16":[], - "uint32":[], - "array":[], - "uint8_clamped":[], - "generic":[] -} - -;(function() { - for(var id in CACHED_CONSTRUCTORS) { - CACHED_CONSTRUCTORS[id].push(compileConstructor(id, -1)) - } -}); - -function wrappedNDArrayCtor(data, shape, stride, offset) { - if(data === undefined) { - var ctor = CACHED_CONSTRUCTORS.array[0] - return ctor([]) - } else if(typeof data === "number") { - data = [data] - } - if(shape === undefined) { - shape = [ data.length ] - } - var d = shape.length - if(stride === undefined) { - stride = new Array(d) - for(var i=d-1, sz=1; i>=0; --i) { - stride[i] = sz - sz *= shape[i] - } - } - if(offset === undefined) { - offset = 0 - for(var i=0; i=0;i-=2) { ret[i+1] = v; ret[i] = v; } - if(i===-1) { ret[0] = v; } - return ret; - } - for(i=n-1;i>=0;i--) { ret[i] = rep(s,v,k+1); } - return ret; - } - - function repeat(pattern, count) { - if (count < 1) { return ''; } - - var result = ''; - while (count > 0) { - if ( count & 1 ) { result += pattern; } - - count >>= 1; pattern += pattern; - } - return result; - } - - - - - function replaceIdentifierRefs(str, func) { - var reply = ""; - - var state = -1, match, index, first, i = 0, x; - - while ( i < str.length ) { - match = str.match(/[a-zA-Z_][a-zA-Z0-9_]*/); // Find an identifier in the string. - - if ( !match ) { break; } - - reply += str.substr(i, match.index); - - index = []; - i = match.index + match[0].length; - - x = true; - while ( x && i < str.length ) { - while ( str[i] === ' ' ) { i++; } - - switch ( str[i] ) { - case "[": - state = 1; - first = i+1; - i++; - - while ( state ) { - if ( str[i] === ']' ) { - if ( state === 1 ) { index.push(str.substring(first, i)); } - state--; - } - if ( str[i] === '[' ) { state++; } - i++; - } - break; - case "." : - first = i; - i++; - while ( str[i] === ' ' ) { i++; } - while ( str[i].match(/[ a-zA-Z0-9_]/) !== null ) { i++; } - - index.push(str.substring(first, i)); - - break; - default: - x = false; - break; - } - } - - reply += func(match[0], index); - str = str.substr(i); - i = 0; - } - - return reply + str.substr(i); - } - - - function typedArrayFunctionConstructor() { - var actuals = arguments; - var i, j; - var args; - var text; - var hash = {}; - - var body; - - if ( this.cache === undefined ) { - if ( typeof this.func === "string" ) { - text = this.func; - } else { - text = this.func.toString(); - } - this.text = text; - - var x = text.match(/function [A-Za-z0-9_]*\(([^()]*)\)[^{]*\{([\S\s]*)\}[\S\s]*/); // } - - args = x[1].split(",").map(function(s) { return s.trim(); }); - this.args = args; - - this.prep = ""; - this.post = ""; - - body = x[2].split(/\/\/ ----+/); - - if ( body.length > 1 ) { - this.prep = body[0]; - this.post = body[2]; - this.body = body[1]; - } else { - this.body = body[0]; - } - if ( this.post === "" || this.post === undefined ) { - this.post = "\nreturn " + args[0] + ";"; - } - } - args = this.args; - text = this.text; - - var opts = this.opts; - - if ( opts === undefined ) { opts = {}; } - - var type = ""; - var dime = 0; - var func; - - for ( i = 0; i < args.length; i++ ) { - if ( actuals[i] !== null && actuals[i] !== undefined && typeof actuals[i] === "object" - && (opts.consider === undefined || ( typeof opts.consider === "object" && opts.consider[args[i]] !== false )) ) { - - hash[args[i]] = actuals[i]; - - if ( !actuals[i].shape ) { - actuals[i].shape = dim(actuals[i]); - } - - dime = Math.max(actuals[i].shape.length, dime); - - if ( actuals[i].data ) { - type += " " + actuals[i].dtype + " " + actuals[i].offset + " " + " " + actuals[i].stride; - } else { - type += " O"; - } - - } else { - type += " X"; - } - } - type = dime + type; - - if ( this.cache ) { - func = this.cache[type]; - - if ( func ) { return func; } - } - - var prep = this.prep; - body = this.body; - var post = this.post; - var dims = []; - - var indicies = [ "iW", "iV", "iU", "iZ", "iY", "iX" ]; - var hasIndex = false; - - // Match each source code identifier and any associated array indexing. Extract - // the indicies and recursivly replace them also. - // - function replaceArrayRefs(text) { - - return replaceIdentifierRefs(text, function (id, indx) { - var k, offset, reply; - - if ( id === "index" ) { hasIndex = true; } - - for ( k = 0; k < indx.length; k++ ) { - indx[k] = replaceArrayRefs(indx[k]); - } - - var arg = hash[id]; - var dimen; - var joinStr, bracket, fixindx; - - - if ( arg !== undefined && typeof arg === "object" ) { - - if ( indx.length >= 1 && indx[indx.length-1].trim() === ".length" ) { - indx[0] = ".shape"; - indx[1] = indx.length-1; - indx.length = 2; - } - - if ( indx.length >= 1 && indx[0][0] === "." ) { - if ( indx.length >= 2 && indx[0].trim() === ".shape" ) { - if ( arg.data ) { - reply = id + ".shape[" + indx[1] + "]"; - } else { - reply = id + repeat("[0]", indx[1]) + ".length"; - } - } else { - reply = id + indx[0].trim(); - } - } else { - if ( arg.data ) { - dimen = arg.dimension; - - - if ( indx.length !== 0 && indx.length < arg.dimension ) { - id = id + ".data.subarray"; - bracket = "()"; - fixindx = indx.length; - } else { - id = id + ".data"; - bracket = "[]"; - fixindx = arg.dimension; - } - - joinStr = " + "; - } else { - dimen = arg.shape.length; - joinStr = "]["; - offset = ""; - bracket = "[]"; - } - - var indi = indicies.slice(6-dimen); - - if ( ( opts.loops === undefined || opts.loops === true ) && ( indx.length === 0 || dimen === indx.length ) ) { - for ( i = 0; i < dimen; i++ ) { - if ( indx[i] === undefined ) { indx[i] = indi[i]; } - if ( dims[i] === undefined ) { dims[i] = 0; } - - dims[i] = Math.max(dims[i], arg.shape[i]); - } - } - - if ( arg.data ) { - for ( i = 0; i < fixindx; i++ ) { - if ( arg.stride[i] !== 1 ) { indx[i] = "(" + indx[i] + ")*" + arg.stride[i]; } - } - - if ( arg.offset !== 0 ) { offset = arg.offset + " + "; - } else { offset = ""; } - } - - if ( indx.length ) { - reply = id + bracket[0] + offset + indx.join(joinStr) + bracket[1] + " "; - } else { - reply = id; - } - } - } else { - reply = id; - - for ( i = 0; i < indx.length; i++ ) { - if ( indx[i][0] === "." ) { - reply += indx[i].trim(); - } else { - reply += "[" + indx[i].trim() + "]"; - } - } - reply += " "; - } - - return reply; - }); - } - - body = replaceArrayRefs(body); - - var indx = indicies.slice(6-dims.length); - var indi = indicies.slice(6-dims.length).reverse(); - dims.reverse(); - - var init = "\n"; - var setp = "\n"; - - var indxZero = ""; - var indxIncr = ""; - - if ( opts.loops === undefined || opts.loops === true ) { - init += " var index = [" + rep([dims.length], 0).join(",") + "];\n"; - init += " var start = [" + rep([dims.length], 0).join(",") + "];\n"; - init += " var end = [" + rep([dims.length], 0).join(",") + "];\n\n"; - - for ( i = 0; i < dims.length; i++ ) { - - for ( j = 0; j < args.length; j++ ) { - if ( hash[args[j]] && actuals[j] !== undefined && typeof actuals[j] === "object" ) { - init += " end[" + i + "] = " + args[j] + ".shape[" + i + "];\n"; - break; - } - } - } - init += "\n"; - - for ( i = 0; i < dims.length; i++ ) { - setp += " var " + indx[i] + "start = start[" + i + "];\n"; - setp += " var " + indx[i] + "end = end[" + i + "];\n"; - - } - setp += "\n"; - for ( i = 0; i < dims.length; i++ ) { - if ( hasIndex ) { - indxZero = "index[" + (dims.length - i - 1) + "] = 0;\n"; - indxIncr = " index[" + (dims.length - i - 1) + "]++\n"; - } - - body = indxZero + "for ( var " + indi[i] + " = " + indi[i] + "start; " + indi[i] + " < " + indi[i] + "end; " + indi[i] + "++ ) {\n " + body + "\n" + indxIncr + "\n }"; - } - } - - func = "// Array optimized funciton\n"; - func += "// " + type + "\n"; - func += "return function (" + args.join(",") + ") {\n'use strict';\n\n" + init + prep + setp + body + post + "\n}"; - - if ( typed.debug ) { console.log(func); } - - if ( this.cache === undefined ) { this.cache = {}; } - - func = new Function(func)(); - this.cache[type] = func; - - return func; - } - - - function typedArrayFunctionExecute() { - var func = typedArrayFunctionConstructor.apply(this, arguments); - - var reply = func.apply(typed, arguments); - - return reply; - } - - function typed(opts, func) { - if ( func === undefined ) { - func = opts; - opts = undefined; - } - - var objst = { func: func, opts: opts }; - var reply = typedArrayFunctionExecute.bind(objst); - - reply.baked = typedArrayFunctionConstructor.bind(objst); - - return reply; - } - - var size = typed(function (a) { - var prd = 1; - // ---- - prd *= a; - // ---- - return prd; - }); - - function array(shape, DType, value) { - var reply; - var i, n; - - if ( typeof value !== "number" ) { - value = 0; - } - - if ( DType && DType.dtype ) { DType = DType.dtype; } - if ( typeof DType === "string" ) { DType = types[DType]; } - - if ( typeof DType === "function" ) { - n = size(shape); - reply = ndarray(new DType(n), shape); - - for ( i = 0; i < n; i++ ) { reply.data[i] = value; } - } else { - reply = rep(shape, value); - } - - reply.shape = shape; - - return reply; - } - - function clone (x) { - return typed.assign(typed.array(typed.dim(x), x), x); - } - - function iota(i, n) { - if ( n === undefined ) { - n = i; - i = 0; - } - var j, result = []; - for ( j = 0; j 17 ) { break;} - } - console.log(line); - } else { - for ( y = a.shape[0]-1; y >= 0; --y ) { - line = ""; - for ( x = 0; x < a.shape[1]; ++x ) { - line += a.get(y, x).toFixed(prec) + " "; - } - - console.log(line); - } - console.log("\n"); - } - } - - function section(a, sect) { - var x1 = sect[0][0]; - var x2 = sect[0][1]; - var y1 = sect[1][0]; - var y2 = sect[1][1]; - - return a.lo(y1, x1).hi(y2-y1, x2-x1); - } - - module.exports = typed; - module.exports.ndarray = ndarray; - module.exports.section = section; - module.exports.extend = extend; - module.exports.array = array; - module.exports.clone = clone; - module.exports.print = print; - module.exports.iota = iota; - module.exports.rep = rep; - module.exports.dim = dim; - - module.exports.epsilon = 2.220446049250313e-16; -}()); - - -},{"ndarray-nobuffer":2}],5:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true, evil: true, regexp: true */ -/*globals */ - -"use strict"; - -(function () { - var i; - var typed = require("typed-array-function"); - - var ops = {}, opname, op; - module.exports = ops; - - function twofourthr(ops) { // Allocate an output array as needed - var dima, dimb, shape; - - return function (a, b, c) { - if ( c === undefined ) { - dima = typed.dim(a); - dimb = typed.dim(b); - - if ( dima.length > dimb.length ) { - shape = dima; - } else { - shape = dimb; - } - c = b; b = a; a = typed.array(shape, b); - } - - return ops(a, b, c); - }; - } - function onefourtwo(ops) { // Allocate an output array as needed - return function (a, b) { - if ( b === undefined ) { b = a; a = typed.array(typed.dim(b), b); } - - return ops(a, b); - }; - } - - function twofourthr_bake(op) { - return function(a, b, c) { - if ( c === undefined ) { return twofourthr(op.baked(a, b, c)); } - - return op.baked(a, b, c); - }; - } - function onefourtwo_bake(op) { - return function(a, b) { - if ( b === undefined ) { return onefourtwo(op.baked(a, b)); } - - return op.baked(a, b); - }; - } - - - var assign_ops = { add: "+", sub: "-", mul: "*", div: "/", - mod: "%", band: "&", bor: "|", bxor: "^", - lshift: "<<", rshift: ">>", rrshift: ">>>" - }; - - for(opname in assign_ops) { - if ( assign_ops.hasOwnProperty(opname) ) { - op = assign_ops[opname]; - - ops[opname + "3"] = typed("function (a, b, c) { a = b " + op + " c; }"); - ops[opname + "_mask"] = typed("function (a, b, c, m) { if ( m ) { a = b " + op + " c; } }"); - ops[opname + "eq"] = typed("function (a, b ) { a " + op + "= b; } "); - ops[opname + "eq_mask"] = typed("function (a, b , m) { if ( m ) { a " + op + "= b; } }"); - - ops[opname] = twofourthr (ops[opname + "3"]); - ops[opname].baked = twofourthr_bake(ops[opname + "3"]); - - ops[opname + "s"] = ops[opname]; - ops[opname + "seq"] = ops[opname + "eq"]; - } - } - - var binary_ops = { and: "&&", or: "||", - eq: "===", neq: "!==", lt: "<", - gt: ">", leq: "<=", geq: ">=" }; - - for(opname in binary_ops) { - if ( binary_ops.hasOwnProperty(opname) ) { - op = binary_ops[opname]; - - ops[opname + "3"] = typed("function (a, b, c) { a = b " + op + " c; }"); - ops[opname + "_mask"] = typed("function (a, b, c, m) { if ( m ) { a = b " + op + " c; } }"); - ops[opname + "eq"] = typed("function (a, b ) { a = a " + op + " b; } "); - ops[opname + "eq_mask"] = typed("function (a, b , m) { if ( m ) { a = a " + op + " b; } }"); - - ops[opname] = twofourthr (ops[opname + "3"]); - ops[opname].baked = twofourthr_bake(ops[opname + "3"]); - - ops[opname + "s"] = ops[opname]; - ops[opname + "seq"] = ops[opname + "eq"]; - } - } - - - var unary_ops = { not: "!", bnot: "~", neg: "-", recip: "1.0/" }; - - for(opname in unary_ops) { - if ( unary_ops.hasOwnProperty(opname) ) { - op = unary_ops[opname]; - - ops[opname + "2"] = typed("function (a, b ) { a = " + op + " b; }"); - ops[opname + "_mask"] = typed("function (a, b , m) { if ( m ) { a = " + op + " b; } }"); - ops[opname + "eq"] = typed("function (a ) { a = " + op + " a; }"); - ops[opname + "eq" + "_mask"] = typed("function (a , m) { if ( m ) { a = " + op + " a; } }"); - - ops[opname] = onefourtwo (ops[opname + "2"]); - ops[opname].baked = onefourtwo_bake(ops[opname + "2"]); - } - } - - var math_unary = [ "Math.abs", "Math.exp", "Math.floor", "Math.log", "Math.round", "Math.sqrt" - , "Math.acos", "Math.asin", "Math.atan", "Math.ceil", "Math.cos", "Math.sin", "Math.tan" - , "isFinite", "isNaN" ]; - - for( i = 0; i < math_unary.length; i++ ) { - op = math_unary[i]; - - opname = op.split(".") - - if ( opname.length == 2 ) { - opname = opname[1] - } else { - opname = opname[0] - } - - ops[opname + "2"] = typed("function (a, b ) { a = " + op + "(b); }"); - ops[opname + "_mask"] = typed("function (a, b , m) { if ( m ) { a = " + op + "(b); } }"); - ops[opname + "eq"] = typed("function (a ) { a = " + op + "(a); }"); - ops[opname + "eq" + "_mask"] = typed("function (a , m) { if ( m ) { a = " + op + "(a); } }"); - - ops[opname] = onefourtwo (ops[opname + "2"]); - ops[opname].baked = onefourtwo_bake(ops[opname + "2"]); - } - - var math_comm = [ "max", "min" ]; - - for( i = 0; i < math_comm.length; i++ ) { - opname = op = math_comm[i]; - - ops[opname + "3"] = typed("function (a, b, c) { a = Math." + op + "(b, c); }"); - ops[opname + "_mask"] = typed("function (a, b, c, m) { if ( m ) { a = Math." + op + "(b, c); } }"); - - ops[opname] = twofourthr (ops[opname + "3"]); - ops[opname].baked = twofourthr_bake(ops[opname + "3"]); - - ops[opname + "s"] = ops[opname]; - ops[opname + "s" + "eq"] = ops[opname]; - } - - var math_noncomm = [ "atan2", "pow" ]; - - for( i = 0; i < math_noncomm.length; i++ ) { - opname = op = math_noncomm[i]; - - ops[opname + "3"] = typed("function (a, b, c) { a = Math." + op + "(b, c); }"); - ops[opname + "_mask"] = typed("function (a, b, c, m) { if ( m ) { a = Math." + op + "(b, c); } }"); - - ops[opname] = twofourthr (ops[opname + "3"]); - ops[opname].baked = twofourthr_bake(ops[opname + "3"]); - - ops[opname + "s"] = ops[opname]; - ops[opname + "s" + "eq"] = ops[opname]; - } - - ops.assign = typed(function (a, b) { a = b; }); - ops.equals = typed(function (a, b) { if ( a !== b ) { return false; } }); - ops.any = typed(function (a) { if ( a ) { return true; } }); - ops.all = typed(function (a) { if (!a ) { return false; } }); - ops.random = typed(function (a) { a = Math.random(); }); - ops.sum = typed(function (a) { - var sum = 0; - // ---- - sum += a; - // ---- - return sum; - }); - ops.prod = typed(function (a) { - var prd = 1; - // ---- - prd *= a; - // ---- - return prd; - }); - - ops.inf = typed(function (a) { - var inf = Infinity; - // ---- - if ( a < inf ) { inf = a; } - // ---- - return inf; - }); - ops.sup = typed(function (a) { - var sup = -Infinity; - // ---- - if ( a > sup ) { sup = a; } - // ---- - return sup; - }); - - - ops.norm2Squared = typed(function (a) { - var norm2 = 0; - // ---- - norm2 += a*a; - // ---- - return norm2; - }); - ops.norm2 = function (a) { return Math.sqrt(ops.norm2Squared(a)); }; - - //norm1 - //norminf - - //argmin - //argmax - -}()); - - -},{"typed-array-function":4}],6:[function(require,module,exports){ -"use strict" - -function interp1d(arr, x) { - var ix = Math.floor(x) - , fx = x - ix - , s0 = 0 <= ix && ix < arr.shape[0] - , s1 = 0 <= ix+1 && ix+1 < arr.shape[0] - , w0 = s0 ? +arr.get(ix) : 0.0 - , w1 = s1 ? +arr.get(ix+1) : 0.0 - return (1.0-fx)*w0 + fx*w1 -} - -function interp2d(arr, x, y) { - var ix = Math.floor(x) - , fx = x - ix - , s0 = 0 <= ix && ix < arr.shape[0] - , s1 = 0 <= ix+1 && ix+1 < arr.shape[0] - , iy = Math.floor(y) - , fy = y - iy - , t0 = 0 <= iy && iy < arr.shape[1] - , t1 = 0 <= iy+1 && iy+1 < arr.shape[1] - , w00 = s0&&t0 ? arr.get(ix ,iy ) : 0.0 - , w01 = s0&&t1 ? arr.get(ix ,iy+1) : 0.0 - , w10 = s1&&t0 ? arr.get(ix+1,iy ) : 0.0 - , w11 = s1&&t1 ? arr.get(ix+1,iy+1) : 0.0 - return (1.0-fy) * ((1.0-fx)*w00 + fx*w10) + fy * ((1.0-fx)*w01 + fx*w11) -} - -function interp3d(arr, x, y, z) { - var ix = Math.floor(x) - , fx = x - ix - , s0 = 0 <= ix && ix < arr.shape[0] - , s1 = 0 <= ix+1 && ix+1 < arr.shape[0] - , iy = Math.floor(y) - , fy = y - iy - , t0 = 0 <= iy && iy < arr.shape[1] - , t1 = 0 <= iy+1 && iy+1 < arr.shape[1] - , iz = Math.floor(z) - , fz = z - iz - , u0 = 0 <= iz && iz < arr.shape[2] - , u1 = 0 <= iz+1 && iz+1 < arr.shape[2] - , w000 = s0&&t0&&u0 ? arr.get(ix,iy,iz) : 0.0 - , w010 = s0&&t1&&u0 ? arr.get(ix,iy+1,iz) : 0.0 - , w100 = s1&&t0&&u0 ? arr.get(ix+1,iy,iz) : 0.0 - , w110 = s1&&t1&&u0 ? arr.get(ix+1,iy+1,iz) : 0.0 - , w001 = s0&&t0&&u1 ? arr.get(ix,iy,iz+1) : 0.0 - , w011 = s0&&t1&&u1 ? arr.get(ix,iy+1,iz+1) : 0.0 - , w101 = s1&&t0&&u1 ? arr.get(ix+1,iy,iz+1) : 0.0 - , w111 = s1&&t1&&u1 ? arr.get(ix+1,iy+1,iz+1) : 0.0 - return (1.0-fz) * ((1.0-fy) * ((1.0-fx)*w000 + fx*w100) + fy * ((1.0-fx)*w010 + fx*w110)) + fz * ((1.0-fy) * ((1.0-fx)*w001 + fx*w101) + fy * ((1.0-fx)*w011 + fx*w111)) -} - -function interpNd(arr) { - var d = arr.shape.length|0 - , ix = new Array(d) - , fx = new Array(d) - , s0 = new Array(d) - , s1 = new Array(d) - , i, t - for(i=0; i=1;i-=2) { - i1 = i-1; - ret += x[i]*y[i] + x[i1]*y[i1]; - } - if(i===0) { ret += x[0]*y[0]; } - - return ret; -}; - -numeric.dotMV = function dotMV(x,y) { - var i, p = x.length; - var ret = this.array([p], x.dtype), dotVV = this.dotVV; - for(i=p-1;i>=0;i--) { ret[i] = dotVV(x[i],y); } - return ret; -}; - -numeric.dotVM = function dotVM(x,y) { - var j,k,p,q,ret,woo,i0; - p = x.length; q = y[0].length; - ret = numeric.array([q], x.dtype); - for(k=q-1;k>=0;k--) { - woo = x[p-1]*y[p-1][k]; - for(j=p-2;j>=1;j-=2) { - i0 = j-1; - woo += x[j]*y[j][k] + x[i0]*y[i0][k]; - } - if(j===0) { woo += x[0]*y[0][k]; } - ret[k] = woo; - } - return ret; -}; - -numeric.dotMM = function dotMM(reply,x,y) { - var i,j,k,r=reply.shape[1],foo,bar,woo,i0; - - var p = x.length; - var q = y.length; - - for(i=p-1;i>=0;i--) { - foo = reply[i]; - bar = x[i]; - - for(k=r-1;k>=0;k--) { - woo = bar[q-1]*y[q-1][k]; - for(j=q-2;j>=1;j-=2) { - i0 = j-1; - woo += bar[j]*y[j][k] + bar[i0]*y[i0][k]; - } - if(j===0) { woo += bar[0]*y[0][k]; } - foo[k] = woo; - } - //ret[i] = foo; - } -}; - -numeric.diag = function diag(d) { - var i,i1,j,n = d.length, A = this.array([n, n], d.dtype), Ai; - for(i=n-1;i>=0;i--) { - Ai = A[i]; - i1 = i+2; - for(j=n-1;j>=i1;j-=2) { - Ai[j] = 0; - Ai[j-1] = 0; - } - if(j>i) { Ai[j] = 0; } - Ai[i] = d[i]; - for(j=i-1;j>=1;j-=2) { - Ai[j] = 0; - Ai[j-1] = 0; - } - if(j===0) { Ai[0] = 0; } - //A[i] = Ai; - } - return A; -}; -numeric.identity = function identity(n, type) { return this.diag(this.array([n],type,1)); }; - -numeric.tensorXX = function tensor(A,x,y) { - var m = x.length, n = y.length, Ai, i,j,xi; - - - for(i=m-1;i>=0;i--) { - Ai = A[i]; - xi = x[i]; - for(j=n-1;j>=3;--j) { - Ai[j] = xi * y[j]; - --j; - Ai[j] = xi * y[j]; - --j; - Ai[j] = xi * y[j]; - --j; - Ai[j] = xi * y[j]; - } - while(j>=0) { Ai[j] = xi * y[j]; --j; } - } - - //console.log(x, y, A[0], A[1]); -}; -numeric.tensorXX = typed({ loops: false }, numeric.tensorXX); -numeric.tensor = function tensor(x,y) { - - if(typeof x === "number" || typeof y === "number") { return numeric.mul(x,y); } - var s1 = numeric.dim(x); - var s2 = numeric.dim(y); - if(s1.length !== 1 || s2.length !== 1) { - throw new Error('numeric: tensor product is only defined for vectors'); - } - - return numeric.tensorXX(numeric.array([s1[0], s2[0]], x.dtype), x, y); -}; - - -numeric.dotVV = typed({ loops: false }, numeric.dotVV); -numeric.dotVM = typed({ loops: false }, numeric.dotVM); -numeric.dotMV = typed({ loops: false }, numeric.dotMV); -numeric.dotMM = typed({ loops: false }, numeric.dotMM); -numeric.diag = typed({ loops: false }, numeric.diag); - - -},{"typed-array-function":4}],10:[function(require,module,exports){ - - -var numeric = require("typed-array-function"); - numeric = numeric.extend(numeric, require("typed-array-ops")); - numeric = numeric.extend(numeric, require("typed-matrix-ops")); - -//9. Unconstrained optimization -exports.gradient = function gradient(f,x) { - var n = x.length; - var f0 = f(x); - if(isNaN(f0)) throw new Error('gradient: f(x) is a NaN!'); - var i,x0 = numeric.clone(x),f1,f2, J = Array(n); - var errest,roundoff,max = Math.max,eps = 1e-3,abs = Math.abs, min = Math.min; - var t0,t1,t2,it=0,d1,d2,N; - for(i=0;i20) { throw new Error("Numerical gradient fails"); } - x0[i] = x[i]+h; - f1 = f(x0); - x0[i] = x[i]-h; - f2 = f(x0); - x0[i] = x[i]; - if(isNaN(f1) || isNaN(f2)) { h/=16; continue; } - J[i] = (f1-f2)/(2*h); - t0 = x[i]-h; - t1 = x[i]; - t2 = x[i]+h; - d1 = (f1-f0)/h; - d2 = (f0-f2)/h; - N = max(abs(J[i]),abs(f0),abs(f1),abs(f2),abs(t0),abs(t1),abs(t2),1e-8); - errest = min(max(abs(d1-J[i]),abs(d2-J[i]),abs(d1-d2))/N,h/N); - if(errest>eps) { h/=16; } - else break; - } - } - return J; -} -exports.uncmin = function uncmin(f,x0,tol,gradient,maxit,callback,options) { - var grad = exports.gradient; - if(typeof options === "undefined") { options = {}; } - if(typeof tol === "undefined") { tol = 1e-8; } - if(typeof gradient === "undefined") { gradient = function(x) { return grad(f,x); }; } - if(typeof maxit === "undefined") maxit = 1000; - x0 = numeric.clone(x0); - var n = x0.length; - var f0 = f(x0),f1,df0; - if(isNaN(f0)) throw new Error('uncmin: f(x0) is a NaN!'); - var max = Math.max, norm2 = numeric.norm2; - tol = max(tol,numeric.epsilon); - var step,g0,g1,H1 = options.Hinv || numeric.identity(n); - var dot = numeric.dot, sub = numeric.sub, add = numeric.add, ten = numeric.tensor, div = numeric.div, mul = numeric.mul; - - var all = numeric.all, isfinite = numeric.isFinite, neg = numeric.neg; - var it=0,i,s,x1,y,Hy,Hs,ys,i0,t,nstep,t1,t2; - var msg = ""; - g0 = gradient(x0); - while(it= 0.1*t*df0 || isNaN(f1)) { - t *= 0.5; - ++it; - continue; - } - break; - } - if(t*nstep < tol) { msg = "Line search step size smaller than tol"; break; } - if(it === maxit) { msg = "maxit reached during line search"; break; } - g1 = gradient(x1); - - y = sub(g1,g0); - ys = dot(y,s); - Hy = dot(H1,y); - - H1 = sub(add(H1, - mul( - (ys+dot(y,Hy))/(ys*ys), - ten(s,s) )), - div(add(ten(Hy,s),ten(s,Hy)),ys)); - x0 = x1; - f0 = f1; - g0 = g1; - ++it; - - } - return {solution: x0, f: f0, gradient: g0, invHessian: H1, iterations:it, message: msg}; -} - -},{"typed-array-function":4,"typed-array-ops":5,"typed-matrix-ops":9}],11:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals */ - -"use strict"; - -(function() { - - // http://cogsandlevers.blogspot.com/2013/11/scanline-based-filled-polygons.html - // - function drawHLine(buffer, width, x1, x2, y, k, rop) { - - if ( x1 < 0 ) { x1 = 0; } - if ( x2 > width ) { x2 = width; } - - var ofs = x1 + y * width; // calculate the offset into the buffer - var x; - - switch ( rop ) { // draw all of the pixels - case undefined: - case "set": for (x = x1; x < x2; x++) { buffer[ofs++] = k; } break; - case "add": for (x = x1; x < x2; x++) { buffer[ofs++] += k; } break; - } - } - - function scanline(x1, y1, x2, y2, miny, edges) { - var x, y, xi; - - if (y1 > y2) { // flip the points if need be - y = y1; y1 = y2; y2 = y; - x = x1; x1 = x2; x2 = x; - } - - y1 = Math.floor(y1)+1; - y2 = Math.floor(y2); - - //if ( y2 < y1 ) { y2++ } - - x = x1; // start at the start - var dx = (x2 - x1) / (y2 - y1); // change in x over change in y will give us the gradient - var ofs = Math.round(y1 - miny); // the offset the start writing at (into the array) - - for ( y = y1; y <= y2; y++ ) { // cover all y co-ordinates in the line - - xi = Math.floor(x) + 1; - - // check if we've gone over/under the max/min - // - if ( edges[ofs].minx > xi ) { edges[ofs].minx = xi; } - if ( edges[ofs].maxx < xi ) { edges[ofs].maxx = xi; } - - x += dx; // move along the gradient - ofs ++; // move along the buffer - - } - } - - function _drawPolygon(buffer, width, points, color, rop) { - var i; - var miny = points[0].y-1; // work out the minimum and maximum y values - var maxy = points[0].y-1; - - for ( i = 1; i < points.length; i++ ) { - if ( points[i].y-1 < miny) { miny = points[i].y-1; } - if ( points[i].y-1 > maxy) { maxy = points[i].y-1; } - } - - var h = maxy - miny; // the height is the size of our edges array - var edges = []; - - for ( i = 0; i <= h+1; i++ ) { // build the array with unreasonable limits - edges.push({ minx: 1000000, maxx: -1000000 }); - } - - for ( i = 0; i < points.length-1; i++ ) { // process each line in the polygon - scanline(points[i ].x-1, points[i ].y-1 - , points[i+1].x-1, points[i+1].y-1, miny, edges); - } - scanline(points[i].x-1, points[i].y-1, points[0].x-1, points[0].y-1, miny, edges); - - // draw each horizontal line - for ( i = 0; i < edges.length; i++ ) { - drawHLine( buffer, width - , Math.floor(edges[i].minx) - , Math.floor(edges[i].maxx) - , Math.floor(i + miny), color, rop); - } - } - - function d2r(d) { return d * (Math.PI / 180); } - - function rotPoints(points, angle, about) { - var x, y, i; - var reply = []; - - angle = d2r(angle); - - var sin = Math.sin(angle); - var cos = Math.cos(angle); - - for ( i = 0; i < points.length; i++ ) { - x = about.x + (((points[i].x-about.x) * cos) - ((points[i].y-about.y) * sin)); - y = about.y + (((points[i].x-about.x) * sin) + ((points[i].y-about.y) * cos)); - - reply.push({ x: x, y: y }); - } - - return reply; - } - - function polyEllipse(x, y, w, h) { - var ex, ey, i; - var reply = []; - - for ( i = 0; i < 2 * Math.PI; i += 0.01 ) { - ex = x + w*Math.cos(i); - ey = y + h*Math.sin(i); - - reply.push({ x: ex, y: ey }); - } - - return reply; - } - - function polyBox(x, y, w, h) { - return [ { x: x-w/2, y: y-h/2 } - , { x: x-w/2, y: y+h/2 } - , { x: x+w/2, y: y+h/2 } - , { x: x+w/2, y: y-h/2 } ]; - } - - exports.drawPolygon = function (buffer, width, points, color, rop) { _drawPolygon(buffer, width, points, color, rop); }; - exports.drawCircle = function (buffer, width, x, y, rad, color, rop) { _drawPolygon(buffer, width, polyEllipse(x, y, rad, rad), color, rop); }; - exports.drawEllipse = function (buffer, width, x, y, h, w, rot, color, rop) { _drawPolygon(buffer, width, rotPoints(polyEllipse(x, y, h, w), rot, { x: x, y: y }), color, rop); }; - exports.drawBox = function (buffer, width, x, y, h, w, rot, color, rop) { _drawPolygon(buffer, width, rotPoints(polyBox (x, y, h, w), rot, { x: x, y: y }), color, rop); }; -}()); - -},{}],12:[function(require,module,exports){ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ - -"use strict"; - - - function strrep(str, n) { - var i, s = ''; - - for ( i = 0; i < n; i++ ) { s += str; } - - return s; - } - -function template(text,data) { - return text.replace(/\{([a-zA-Z0-9_.%]*)\}/g, - function(m,key){ - var type, prec, widt = 0, fmt, i; - var val = data; - - key = key.split("%"); - - if ( key.length <= 1 ) { - fmt = "%s"; - } else { - fmt = key[1]; - } - - key = key[0]; - key = key.split("."); - - for ( i = 0; i < key.length; i++ ) { - if ( val.hasOwnProperty(key[i]) ) { - val = val[key[i]]; - } else { - return ""; - } - } - - type = fmt.substring(fmt.length-1); - prec = fmt.substring(0, fmt.length-1); - - prec = prec.split("."); - - widt = prec[0] | 0; - prec = prec[1] | 0; - - switch ( type ) { - case "s": - val = val.toString(); - break; - case "f": - val = val.toFixed(prec); - break; - case "d": - val = val.toFixed(0); - break; - } - - if ( widt !== 0 && widt > val.length ) { - if ( widt > 0 ) { - val = strrep(" ", widt-val.length) + val; - } else { - val = val + strrep(" ", widt-val.length); - } - } - - return val; - } - ); -} - -module.exports = template; - -},{}]},{},[]); - diff --git a/web/static/js9_old/plugins/imexam/pixtable.js b/web/static/js9_old/plugins/imexam/pixtable.js deleted file mode 100644 index e99cd72..0000000 --- a/web/static/js9_old/plugins/imexam/pixtable.js +++ /dev/null @@ -1,116 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true, continue: true */ -/*globals $, JS9, greg */ - -"use strict"; - - -(function () { - var imexam = require("./imexam"); - -/* - $("table").delegate('td','mouseover mouseleave', function(e) { - if (e.type == 'mouseover') { - $(this).parent().addClass("hover"); - $("colgroup").eq($(this).index()).addClass("hover"); - } else { - $(this).parent().removeClass("hover"); - $("colgroup").eq($(this).index()).removeClass("hover"); - } - }); - */ - - function strrep(str, n, x) { - var i; - var rx = new RegExp(x, "g"); - - var s = ''; - for ( i = 0; i < n; i++ ) { - s += str.replace(rx, i); - } - return s; - } - - function htmlTable(x, y) { - var t = ""; - - t += strrep( "" - + strrep("", x, "%x") - + "\n", y, "%y"); - t += "
    "; - - return t; - } - - - // $(this).css({"font-size" : newFontSize, "line-height" : newFontSize/1.2 + "px"}); - - function pxtablUpdate(im, point) { - var im_2d = imexam.ndops.ndarray(im.raw.data, [im.raw.height, im.raw.width]); - var i = 0, j = 0; - var x, y; - - - var pxtabl = $(this.div).find(".pxtabl")[0]; - - pxtabl["cell" + j + "." + i].value = "col\\row"; - - j = 0; - for ( i = 1; i < 10; i++ ) { - x = point.x + i - 5; - - if ( x > 0 && x <= im.raw.width ) { - pxtabl["cell" + j + "." + i].value = x.toFixed(0); - } else { - pxtabl["cell" + j + "." + i].value = ""; - } - } - - i = 0; - for ( j = 1; j < 10; j++ ) { - y = point.y + j - 5; - - if ( y > 0 && y <= im.raw.height ) { - pxtabl["cell" + (10-j) + "." + i].value = y.toFixed(0); - } else { - pxtabl["cell" + (10-j) + "." + i].value = ""; - } - } - - for ( j = 1; j < 10; j++ ) { - for ( i = 1; i < 10; i++ ) { - x = (point.x + i - 5 - 0.5)|0; - y = (point.y + j - 5 - 0.5)|0; - - if ( x >= 0 && x < im.raw.width && y >= 0 && y < im.raw.height ) { - pxtabl["cell" + (10-j) + "." + i].value = im_2d.get(y, x).toPrecision(4); - } else { - pxtabl["cell" + (10-j) + "." + i].value = ""; - } - } - } - } - - function pxtablInit() { - imexam.fixupDiv(this); - - $(this.div).html("
    " + htmlTable(10, 10) + "
    "); - $(this.div).find(".row5").css("background", "lightblue"); - $(this.div).find(".col5").css("background", "lightblue"); - $(this.div).find(":input").css("font-size", "11"); - } - - JS9.RegisterPlugin("ImExam", "PxTabl", pxtablInit, { - menu: "view", - - menuItem: "Pixel Table", - winTitle: "Pixel Table", - winResize: true, - - toolbarSeparate: true, - - onmousemove: pxtablUpdate, - onarrowkey: pxtablUpdate, - winDims: [625, 240], - }); -}()); - diff --git a/web/static/js9_old/plugins/imexam/radproj.js b/web/static/js9_old/plugins/imexam/radproj.js deleted file mode 100644 index 5349f41..0000000 --- a/web/static/js9_old/plugins/imexam/radproj.js +++ /dev/null @@ -1,84 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9 */ - -"use strict"; - - -(function() { - var imexam = require("./imexam"); - - var rproj_template = "
    \ - \ - \ - \ - \ -
    peak {a%.2f}
    sigma {c%.2f}
    bias {d%.2f}
    \ -
    "; - - function rprojUpdate(im, xreg) { - var div = this.div; - - var imag = imexam.getRegionData(im, xreg); - - var max = imexam.ndops.maxvalue(imag); - var backgr = imexam.imops.backgr(imag, 4).value; - var data = imexam.ndops.assign(imexam.ndops.zeros(imag.shape), imag); - - imexam.ndops.subs(data, imag, backgr); - - var qcenter = imexam.ndops.qcenter(data); - var centroid = imexam.ndops.centroid(data, qcenter); - - var rproj = imexam.imops.rproj(imag, [centroid.ceny, centroid.cenx]); - - var fit = imexam.ndops.gsfit1d(rproj.radi, rproj.data, [max, centroid.fwhm/2.355, backgr]); - - var fitv = { a: fit[0], b: 0, c: fit[1], d: fit[2] }; - - var rdata = []; - var rfdat = []; - var r; - - for ( r = 0; r < rproj.radi.shape[0]; r++ ) { - rdata[r] = [rproj.radi.get(r), rproj.data.get(r)]; - } - - rproj.samp = imexam.ndops.zeros([div.offsetWidth/2]); - - imexam.ndops.fill(rproj.samp, function(r) { return rproj.radius*r/(div.offsetWidth/2); }); - - - rproj.modl = imexam.ndops.gauss1d(rproj.samp, fit); - - for ( r = 0; r < rproj.modl.shape[0]; r++ ) { - rfdat[r] = [rproj.samp.get(r), rproj.modl.get(r)]; - } - - $(div).empty(); - var plot = $.plot(div, [{ data: rdata, points: { radius: 1, show: true } }, { data: rfdat }] - , { zoomStack: true, selection: { mode: "xy" } }); - - $(div).append(imexam.template(rproj_template, fitv)); - } - - function rprojInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see radial projection
    "); - } - - JS9.RegisterPlugin("ImExam", "RadialProj", rprojInit, { - menu: "analysis", - - menuItem: "Radial Proj", - winTitle: "Radial Proj", - help: "imexam/imexam.html#r_proj", - - dynamicSelect: true, - - toolbarSeparate: true, - - onregionschange: rprojUpdate, - winDims: [250, 250], - }); - -}()); diff --git a/web/static/js9_old/plugins/imexam/reghist.js b/web/static/js9_old/plugins/imexam/reghist.js deleted file mode 100644 index 425e4df..0000000 --- a/web/static/js9_old/plugins/imexam/reghist.js +++ /dev/null @@ -1,93 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9 */ - -"use strict"; - - -(function() { - var imexam = require("./imexam"); - - var reghistemplate = "

    \ - \ - \ - \ -
    rms {rms%.2f}
    mean {mean%.2f}
    \ -
    "; - - function histStats(div, plot, range) { - var i, j = 0; - var axes = plot.getAxes(); - - var xmin = axes.xaxis.options.min; - var xmax = axes.xaxis.options.max; - var hist = $(div).data("hist"); - var data = hist.raw; - - var rms = imexam.ndops.rmsClipped( data, xmin, xmax); - var mean = imexam.ndops.meanClipped(data, xmin, xmax); - - $(div).find(".annotation").empty(); - - $(div).append(imexam.template(reghistemplate, { rms: rms, mean: mean })); - } - - function histUpdate(im, xreg) { - var div = this.div; - - var imag = imexam.getRegionData(im, xreg); - - var hist = imexam.ndops.hist(imag); - hist.sum = imexam.ndops.sum(hist.data); - - $(div).data("hist", hist); - - var n = 0; - var skip = hist.sum * 0.001; - var h = 0, i, value; - - $(div).empty(); - - var hdata = []; - - for ( i = 0; i < hist.data.shape[0]; i++ ) { - n += hist.data.get(i); - - if ( n > skip && n < hist.sum - skip ) { - value = hist.data.get(i); - - hdata[h] = [i*hist.width+hist.min, value]; - h++; - } - } - - var plot = $.plot(div, [hdata], { zoomStack: true, zoomFunc: histStats, selection: { mode: "x" } }); - - histStats(div, plot, undefined); - -// $.plot.zoomStackIn(plot, undefined, { xaxis: { from: xmin , to: xmax } -// , yaxis: { from: axes.yaxis.min , to: axes.yaxis.max } } -// , histStats); - } - - function histInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see histogram
    "); - } - - JS9.RegisterPlugin("ImExam", "Histogram", histInit, { - menu: "analysis", - - menuItem: "Histogram", - winTitle: "Histogram", - help: "imexam/imexam.html#rghist", - - dynamicSelect: true, - - toolbarSeparate: true, - toolbarHTML: " ", - - onregionschange: histUpdate, - winDims: [250, 250], - }); - -}()); diff --git a/web/static/js9_old/plugins/imexam/regstat.js b/web/static/js9_old/plugins/imexam/regstat.js deleted file mode 100644 index e3995d0..0000000 --- a/web/static/js9_old/plugins/imexam/regstat.js +++ /dev/null @@ -1,92 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9, require */ - -"use strict"; - - -(function() { - var imexam = require("./imexam"); - - // eslint-disable-next-line no-multi-str - var statTemplate = " \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ -
    position x {reg.x%.2f} y {reg.y%.2f}
    box width {reg.width%.2f} height {reg.height%.2f}
    min {min%.2f} max {max%.2f}
    totcounts {totcnts.sum%.2f}
    bscounts {bscnts.sum%.2f}
    bkgd {bkgd.value%.2f} noise {bkgd.noise%.2f}
    centroid x {bscnts.cenx%.2f} y {bscnts.ceny%.2f}
    FWHM {bscnts.fwhm%.2f} {bscnts.rms%.2f}
    "; - - function regionStats(im, xreg){ - var section = imexam.reg2section(xreg); - var imag = imexam.getRegionData(im, xreg); - - var data = imexam.ndops.assign(imexam.ndops.zeros(imag.shape), imag); - var data2 = imexam.ndops.assign(imexam.ndops.zeros(imag.shape), imag); - - var stats = {}; - - if( !im || !xreg ){ - return null; - } - - stats.reg = xreg; - stats.min = imexam.ndops.minvalue(imag); - stats.max = imexam.ndops.maxvalue(imag); - stats.bkgd = imexam.imops.backgr(imag, 4); - - // background-subtracted data - imexam.ndops.subs(data, imag, stats.bkgd.value); - stats.bscnts = imexam.ndops.centroid(data, imexam.ndops.qcenter(data)); - stats.bscnts.cenx += section[0][0]; - stats.bscnts.ceny += section[1][0]; - - // total counts - stats.totcnts = imexam.ndops.centroid(data2, imexam.ndops.qcenter(data2)); - stats.totcnts.cenx += section[0][0]; - stats.totcnts.ceny += section[1][0]; - - return stats; - } - - function statUpdate(im, xreg) { - var div = this.div; - - $(div).html(imexam.template(statTemplate, regionStats(im, xreg))); - } - - function statInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see stats
    "); - } - - // add method to JS9 Image object and to public API - JS9.Image.prototype.getRegionStats = function(xreg){ - return regionStats(this, xreg); - }; - JS9.mkPublic("GetRegionStats", "getRegionStats"); - - JS9.RegisterPlugin("ImExam", "RegionStats", statInit, { - menu: "analysis", - - winTitle: "Region Stats", - menuItem: "Region Stats", - help: "imexam/imexam.html#rgstat", - - dynamicSelect: true, - - toolbarSeparate: true, - - onregionschange: statUpdate, - winDims: [250, 250] - }); -}()); diff --git a/web/static/js9_old/plugins/imexam/rghxrg.js b/web/static/js9_old/plugins/imexam/rghxrg.js deleted file mode 100644 index f50c109..0000000 --- a/web/static/js9_old/plugins/imexam/rghxrg.js +++ /dev/null @@ -1,71 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9, Fitsy, imexam */ - - -(function() { - "use strict"; - - - function hxrgReadPixelStack(fits, n, index, deliver, data) { - var last, i; - - if ( n === 0 ) { - data = []; - } else { - data[n-1] = fits.pixel; - } - - n += 1; - - if ( n >= fits.nhdu ) { - last = data[0]; - - for ( i = 1; i < n; i++ ) { - data[i-1] = data[i]; - } - - data[n-1] = last; - - deliver(data); - - return; - } - - Fitsy.readPixel(fits, fits.hdu[n], index, function() { hxrgReadPixelStack(fits, n, index, deliver, data); }); - } - - function pixtUpdate(im, xreg) { - var hxrg = [], i; - var div = this.div; - - hxrgReadPixelStack(im.raw.hdu.fits, 0, [xreg.pos.y, xreg.pos.x], function(data) { - - for ( i = 0; i < data.length; i++ ) { - hxrg[i] = [i, data[i]]; - } - - $(div).empty(); - $.plot(div, [hxrg]); - }); - } - - function pixtInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see the pixel stack
    "); - } - - JS9.RegisterPlugin("HxRG", "PixelStack", pixtInit, { - menu: "analysis", - - menuItem: "Pixel Stack", - winTitle: "Pixel Stack", - help: "imexam/imexam.html#rghxrg", - - toolbarSeparate: true, - toolbarHTML: " ", - - onregionschange: pixtUpdate, - winDims: [250, 250], - }); - -}()); diff --git a/web/static/js9_old/plugins/imexam/xyproj.js b/web/static/js9_old/plugins/imexam/xyproj.js deleted file mode 100644 index a62b377..0000000 --- a/web/static/js9_old/plugins/imexam/xyproj.js +++ /dev/null @@ -1,119 +0,0 @@ -/*jslint white: true, vars: true, plusplus: true, nomen: true, unparam: true */ -/*globals $, JS9 */ - - - -(function() { - "use strict"; - - var imexam = require("./imexam"); - - - var projToolbar = " \ -

    \ - \ -
    "; - - - // fit \ - - function projUpdate(im, xreg) { - var div, proj, menx, chek; - - if ( im === undefined ) { - div = xreg.div; - proj = xreg.proj; - menx = xreg.menu; - chek = xreg.chek; - } else { - div = this.div; - menx = this.outerdivjq.find(".proj_menu")[0]; - chek = this.outerdivjq.find(".proj_chek")[0]; - - proj = imexam.ndops.proj(imexam.getRegionData(im, xreg), this.plugin.opts.xyproj); - - // eslint-disable-next-line no-unused-vars - $(menx).change(function (event) { - projUpdate(undefined, { div: div, proj: proj, menu: menx, chek: chek }); - }); - // eslint-disable-next-line no-unused-vars - $(chek).change(function (event) { - projUpdate(undefined, { div: div, proj: proj, menu: menx, chek: chek }); - }); - } - - - var xdata = []; - var data; - var x; - - var proj_type = menx.options[menx.selectedIndex].value; - - - $(div).empty(); - - if ( proj_type === "sum" ) { - data = proj.sum; - } - if ( proj_type === "avg" ) { - data = proj.avg; - } - if ( proj_type === "med" ) { - data = proj.med; - } - - - for ( x = 0; x < data.length; x++ ) { - xdata[x] = [x, data[x]]; - } - - $.plot(div, [xdata], { zoomStack: true, selection: { mode: "xy" } }); - } - - function projInit() { - imexam.fixupDiv(this); - $(this.div).append("

    create, click, move, or resize a region to see projection
    "); - } - - JS9.RegisterPlugin("ImExam", "XProj", projInit, { - menu: "analysis", - - menuItem: "X Projection", - winTitle: "X Projection", - help: "imexam/imexam.html#xyproj", - - dynamicSelect: true, - - toolbarSeparate: true, - toolbarHTML: projToolbar, - - onregionschange: projUpdate, - - winDims: [250, 250], - - xyproj: 0 - }); - - JS9.RegisterPlugin("ImExam", "YProj", projInit, { - menu: "analysis", - - menuItem: "Y Projection", - winTitle: "Y Projection", - help: "imexam/imexam.html#xyproj", - - dynamicSelect: true, - - toolbarSeparate: true, - toolbarHTML: projToolbar, - - onregionschange: projUpdate, - - winDims: [250, 250], - - xyproj: 1 - }); -}()); diff --git a/web/static/js9_old/plugins/plugintest.css b/web/static/js9_old/plugins/plugintest.css deleted file mode 100644 index 48fe0d9..0000000 --- a/web/static/js9_old/plugins/plugintest.css +++ /dev/null @@ -1,14 +0,0 @@ -div.PLUGINtest{ - /* relative pos top/left for container, Flanagan's JavaScript, p 357 */ - position: relative; - top: 0px; - left: 0px; - display: block; - border-width: 0px; - background: lightblue; -} - -div.PLUGINmessage{ - height: 30px; - padding: 10px; -} diff --git a/web/static/js9_old/plugins/plugintest.js b/web/static/js9_old/plugins/plugintest.js deleted file mode 100644 index a21a954..0000000 --- a/web/static/js9_old/plugins/plugintest.js +++ /dev/null @@ -1,291 +0,0 @@ -/* - * PLUGIN test module (January 26 2014) - */ - -/*jslint bitwise: true, plusplus: true, sloppy: true, vars: true, white: true, browser: true, devel: true, continue: true, unparam: true, regexp: true */ -/*global $, JS9, sprintf */ - -// To specify the JS9 display instance to link to a given PLUGIN div, -// use the HTML5 dataset syntax: -//

    - -// make a module so as not to pollute the global namespace -var PLUGIN; -if( PLUGIN && (typeof PLUGIN !== "object" || PLUGIN.CLASS) ){ - throw new Error("Namespace 'PLUGIN' already exists"); -} - -// create our namespace, and specify some meta-information and params -PLUGIN = {}; -PLUGIN.CLASS = "PLUGIN";// class of plugins (1st part of div class) -PLUGIN.NAME = "test"; // name of this plugin (2nd part of div class) -PLUGIN.NDIV = 4; // number of div message areas -PLUGIN.WIDTH = 400; // width of light window -PLUGIN.HEIGHT = 200; // height of light window (4 * (30 + 20 from css)) - -// constructor: it's here that you add HTML elements to the container div -// But you don't have to do so: you can put the HTML elements right into -// the Web page, in which case this routine can be empty. -// Obviously, you must use the contructor to add your HTML elements if you -// want to support your plugin from the View menu. -// -// The examaple below splits the difference: it allows the container div to -// be empty or filled with the inner canvas, and thus support the view menu. -PLUGIN.init = function(){ - var i; - // on entry, these elements have already been defined: - // this.div: the DOM element representing the div for this plugin - // this.divjq: the jquery object representing the div for this plugin - // this.id: the id ofthe div (or the plugin name as a default) - // this.display: the display object associated with this plugin - // this.dispMode: display mode (for internal use) - // set width and height on div - // - // create message divs - for(i=0; i") - .addClass(PLUGIN.CLASS + "message") - .attr("id", "message" + i) - .html(" ") - .appendTo(this.divjq); - } -}; - -// write a row of text in message area associated with a given plugin -PLUGIN.init.prototype.message = function(message, row) { - this.divjq.children("#message" + row).html(message); - if( JS9.DEBUG === 4 && (!message.match(/mouse/) || JS9.DEBUG >= 5) ){ - // eslint-disable-next-line no-console - console.log(message); - } -}; - -// callback when mouse is clicked (down,up) -// eslint-disable-next-line no-unused-vars -PLUGIN.click = function(im, ipos, evt){ - var t = sprintf("click: ipos=%s,%s", - ipos.x.toFixed(2), ipos.y.toFixed(2)); - this.message(t, 2); -}; - -// callback when mouse is pressed -// im: image handle -// ipos: image position; origin at 1,1 (FITS convention) -// evt: the event passed to the callback -// eslint-disable-next-line no-unused-vars -PLUGIN.mousedown = function(im, ipos, evt){ - var t = sprintf("mouseDown: ipos=%s,%s", - ipos.x.toFixed(2), ipos.y.toFixed(2)); - this.message(t, 0); -}; - -// callback when mouse is released -// eslint-disable-next-line no-unused-vars -PLUGIN.mouseup = function(im, ipos, evt){ - var t = sprintf("mouseUp: ipos=%s,%s", - ipos.x.toFixed(2), ipos.y.toFixed(2)); - this.message(t, 0); -}; - -// callback when mouse (or one-finger touch) moves (without a mouse press) -// image value: we need 0-indexed positions, so subtract 1 -// but add 0.5 before rounding since x.0 is in the middle of the pixel -// eslint-disable-next-line no-unused-vars -PLUGIN.mousemove = function(im, ipos, evt){ - var v, t; - v = im.raw.data[Math.floor(ipos.y-0.5) * im.raw.width + - Math.floor(ipos.x-0.5)]; - t = sprintf("mouseMove: ipos=%s,%s val=%s", - ipos.x.toFixed(2), ipos.y.toFixed(2), v); - this.message(t, 0); -}; - -// callback when mouse moves over the image -// eslint-disable-next-line no-unused-vars -PLUGIN.mouseover = function(im, ipos, evt){ - var t = sprintf("mouseOver: ipos=%s,%s", - ipos.x.toFixed(2), ipos.y.toFixed(2)); - this.message(t, 0); -}; - -// callback when mouse moves out of the image -// eslint-disable-next-line no-unused-vars -PLUGIN.mouseout = function(im, ipos, evt){ - var t = sprintf("mouseOut: ipos=%s,%s", - ipos.x.toFixed(2), ipos.y.toFixed(2)); - this.message(t, 0); -}; - -// callback when key is pressed -// eslint-disable-next-line no-unused-vars -PLUGIN.keydown = function(im, ipos, evt){ - var charCode = evt.which || evt.keyCode; - var charStr = JS9.eventToCharStr(evt); - var t = sprintf("keydown: %s -> %s", charCode, charStr); - this.message(t, 2); -}; - -// callback when regions move -PLUGIN.regionsmove = function(im, xreg){ - var t = sprintf("%sMove: ipos=%.2f,%.2f", xreg.shape, xreg.x, xreg.y); - // context is the calling instance - this.message(t, 1); -}; - -// callback when regions change -PLUGIN.regionschange = function(im, xreg){ - var i; - var mode = xreg.mode.substring(0,1).toUpperCase()+xreg.mode.substring(1); - var t = sprintf("%s%s: ", xreg.shape, mode); - switch(xreg.shape){ - case "annulus": - t += sprintf("ipos=%.2f,%.2f radii=", xreg.x, xreg.y); - for(i=0; i

    ZE9BqzB|3^WQb)&15)YNCZYeHTQ9b9z}+ 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%0DgN}05Ajm<#&GlJOB7MXowGOTW+Kh^MR;v&tACj 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

    FTY5f6Ow30A=HZq${}MM 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%0A3VU9XlpC~8|RM<#m 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 z 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%0D)vxf?&U9~ZOVj9=ceY}5>h~e*3fu8egcvc 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

    -

    Accessing Data Archives with JS9

    - -JS9 can display data in any astronomical archive where a query -produces a downloadable URL to a FITS file. The load proxy mechanism -is used, so accessing archives assumes that the JS9 web site has been -configured to support proxy loads. - -

    Examples of data archives that generate FITS URLS for use with JS9

    -
      -
    • NASA/HEASARC Browse: in the Browse Query Results, the D option ("Preview data products for this row") in the Services column will give FITS URLs. -
    • NASA/HEASARC SkyView: in the search results, copy the FITS URL from the Download FITS or quick look jpeg image option. -
    • The Unofficial Chandra Archive: in the search results, drag the Title url onto a JS9 display to retrieve a representation image backed by the event file (for server-side analysis) or click ObsId to get the Chandra HTTP directory for this observation. The *.evt2.fits.gz file contains the raw event data. -
    - -

    Summary: how to access data archives with JS9

    -
      -
    • visit a data archive web page in your browser -
    • execute a search for the desired observation (e.g., type in 'M87' or 'Crab Nebula' in the Chandra Archive's Name box listed above) -
    • once the link to a FITS file has been created: -
        -
      • drag and drop the FITS link onto your JS9 display -
      -
    • or: -
        -
      • copy the resulting FITS file link -
      • in JS9, select the File:open link via proxy ... menu option -
      • paste the FITS URL link into the dialog box -
      • click the Load button -
      -
    - -

    Details: using a proxy server to access data archives

    -

    -For security reasons, JavaScript contained in one web page can -access data in another web page only if both web pages have the -same origin (i.e., basically coming from the same host). This -policy is called the - -Same Origin Policy. This means that JS9 cannot load a FITS file from -an arbitrary URL without using special techniques. -

    -One such technique is to use a proxy server: the URL is not loaded -directly into JS9, but instead is copied back to the server from which -JS9 itself was loaded. The file is then retrieved by JS9 so that the -"same origin" rules are not violated. -

    -When the back-end server associated with a JS9 web page supports the -proxy service, you will see a menu option in the File menu -called open link via proxy ... -

    -Enter a FITS URL into the proxy dialog box and press the Load -button. The data file will be retrieved by the server and stored in a -directory specifically tied to the web page. (The directory and its -contents will be deleted when the page is unloaded.) JS9 then will -load the file from this directory. Note that since the file resides on -the back-end server, all back-end analysis defined on that server is -available. -

    -You also can drag and drop the link directly onto the JS9 display. -The open link via proxy ... menu option is mentioned first, -because it can sometimes require less dexterity (e.g., the archive web -page is displayed on a different desktop from JS9) and also because it -contains a visual cue regarding proxy loads: the option will be greyed -out if JS9 has not been configured to allow proxy loads. -

    -This proxy load technique can also be used FITS links from other -sources. For example, if you have a FITS file on Google Drive, iCloud, -Dropbox or even a static web page, you can generate/copy the link and -paste it into the proxy dialog box for display. (Dropbox files also -can utilize the open link via CORS ... option, which downloads -the data directly to JS9, bypassing the proxy server.) - -

    Last updated: August 6, 2021
    -

    YxT$JbbZ*X5RfF!sS2I#pqvRI#YTO_X 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