Compare commits

...

264 Commits

Author SHA1 Message Date
Petr Sloup
a1a8996d3f Update package version to 2.5.0 2018-12-19 13:28:27 +01:00
Petr Sloup
bea528ab64 Update dependencies 2018-12-19 13:22:41 +01:00
Petr Sloup
cde0233130 Merge pull request #230 from koumoul-dev/public_url
add public_url option
2018-12-19 13:19:07 +01:00
Alban Mouton
c99a1a5425 Merge remote-tracking branch 'klokantech/master' into public_url
# Conflicts:
#	src/main.js
#	src/server.js
2018-12-19 09:53:40 +01:00
Petr Sloup
243bdbdaa0 Update Dockerfile_light to match the baseimage version 2018-12-19 09:28:37 +01:00
Petr Sloup
0631a76a51 Merge pull request #313 from guenhter/ensure-xvfb-started
Wait for Xvfb to startup
2018-12-19 09:27:46 +01:00
guenhter
8e1071aad0 Wait for Xvfb to startup 2018-12-19 09:06:53 +01:00
Petr Sloup
e283569897 Merge pull request #333 from luzik/patch-1
new mapbox-gl-native version
2018-12-18 09:10:15 +01:00
Petr Sloup
507da8567e Merge pull request #321 from loicgasser/css-break-all
Break all on long title and item
2018-12-18 09:02:42 +01:00
luzik
9cd6feb56d new mapbox-gl-native version
According to https://github.com/mapbox/mapbox-gl-native/blob/master/platform/node/CHANGELOG.md there is no broken features.
Previous version is not buildable now.

> @mapbox/mapbox-gl-native@3.5.4 install /home/ubuntu/maps/node_modules/@mapbox/mapbox-gl-native
> node-pre-gyp install --fallback-to-build=false || make node
```
node-pre-gyp ERR! install error 
node-pre-gyp ERR! stack Error: 403 status code downloading tarball https://mapbox-node-binary.s3.amazonaws.com/@mapbox/mapbox-gl-native/v3.5.4/node-v57-linux-x64-Release.tar.gz
```
2018-12-17 15:52:05 +01:00
Gasser Loïc
059b0f11a0 Break all on long title and item 2018-10-12 10:53:14 -04:00
Petr Sloup
7acbc93ba9 Update package version to 2.4.0 2018-09-14 08:23:55 +02:00
Petr Sloup
bc3d79bfdc Update dependencies 2018-09-14 08:14:28 +02:00
Petr Sloup
58168eb0a5 Merge pull request #307 from spatialillusions/master
Add support for WMTS capabilities
2018-09-14 08:03:59 +02:00
Petr Sloup
f993b01387 Merge pull request #303 from loicgasser/update_libs
Update commander and devDeps
2018-09-14 08:00:03 +02:00
Måns Beckman
782c28cd64 Add key to WMTS xml
This should add the key to the wmts xml for hosted services
2018-09-13 17:58:13 +02:00
Måns Beckman
76a0064f0c Remove unused variables 2018-09-13 17:57:06 +02:00
Petr Sloup
55fa8bf8c1 Merge pull request #278 from amirmasud/return-204-when-no-tile-found
Return 204 when mbtiles error is 'Tile does not exist'
2018-09-13 16:26:35 +02:00
Petr Sloup
0c42fdd6b3 Merge pull request #310 from guenhter/fix-restart
Ensure that container can be restarted
2018-09-13 16:25:16 +02:00
Måns Beckman
e8b3c02546 Fix formating 2018-09-11 17:51:38 +02:00
Måns Beckman
56089c0a62 Remove base64url 2018-09-11 17:47:44 +02:00
guenhter
857ff2d8d7 Ensure that container can be restarted 2018-09-10 10:31:58 +02:00
Måns Beckman
e310fa5165 Merge branch 'master' of https://github.com/spatialillusions/tileserver-gl 2018-08-21 19:33:56 +02:00
Måns Beckman
71fab2a2a1 Add support for WMTS capabilites
https://github.com/klokantech/tileserver-gl/issues/274

Clean up wmts template with correct syntax

Update endpoint URL and change content type

After a good nights sleep I considered the structure of the endpoint link for WMTS, at the same time I cleaned up the code and added the correct content type for the response.
2018-08-21 19:33:37 +02:00
Petr Sloup
1c59e3d742 Fix typo 2018-08-21 19:33:37 +02:00
Måns Beckman
6e24f6ec8e Update endpoint URL and change content type
After a good nights sleep I considered the structure of the endpoint link for WMTS, at the same time I cleaned up the code and added the correct content type for the response.
2018-08-18 12:02:54 +02:00
Måns Beckman
5d5ed1153f Clean up wmts template with correct syntax 2018-08-17 15:48:35 +02:00
Måns Beckman
baf01a117b Add support for WMTS capabilites
https://github.com/klokantech/tileserver-gl/issues/274
2018-08-17 13:11:19 +02:00
Gasser Loïc
2cc2cc1b3b Update commander to the latest version 2018-08-08 11:44:46 -04:00
Loïc Gasser
45ed8d90ca Update commander and devDeps, invert default val and function accordingly 2018-08-03 00:05:20 -04:00
Petr Sloup
8e66736955 Fix typo 2018-06-21 19:00:10 +02:00
Masud Zare
72ea5ab05d fix corresponding test scenario 2018-05-07 15:58:32 +04:30
Masud Zare
9d642fa0b3 return 204 when mbtiles error is 'Tile does not exist' 2018-05-07 15:21:41 +04:30
Petr Sloup
1d734f9b42 Merge pull request #270 from geoadmin/fix_doc
Add silent to doc
2018-04-19 08:38:44 +02:00
loicgasser
80146ed7d9 Add silent to doc 2018-03-22 16:12:06 +00:00
Petr Sloup
a28df7ef8f Merge pull request #269 from michaill/master
Silent mode (do not log requests with status == 200)
2018-03-22 13:14:40 +01:00
Michal Illovsky
c333197a7c Skipping also 304 status codes when in silent mode 2018-03-22 09:02:09 +01:00
Michal Illovsky
45df72df51 Enable silent mode with -s option to not log successful request (status=200) 2018-03-19 13:47:17 +01:00
Petr Sloup
e737753891 Merge pull request #263 from geoadmin/nomnom_commander
Replace Nomnom with Commander
2018-03-14 15:17:29 +01:00
loicgasser
edff8ce06c Fix version and positional argument for mbtiles 2018-03-12 11:53:11 +00:00
loicgasser
df05ce3f2a Add default val in description 2018-03-08 17:55:30 +00:00
loicgasser
a74ca20375 Replace nomnom with commander 2018-03-08 16:05:58 +00:00
loicgasser
1c890b0157 Update doc 2018-03-08 16:05:46 +00:00
Petr Sloup
7a9f04a024 Update MB GL JS to v0.43.0 2018-03-01 09:26:56 +01:00
Petr Pridal
1354c7f663 Update README.md 2018-02-19 15:49:08 +01:00
Petr Sloup
da3cb1e7f5 Update ISSUE_TEMPLATE.md 2018-01-23 12:17:14 +01:00
Petr Sloup
19e821a8fe Update package version to 2.3.1 2017-12-14 09:56:41 +01:00
Petr Sloup
659289d85c Update dependencies 2017-12-14 09:56:21 +01:00
Petr Sloup
734d1f01f0 Prioritize font fallbacks and try to respect proper font style 2017-12-14 09:55:57 +01:00
Petr Sloup
c1055a9647 Update package version to 2.3.0 2017-12-01 11:13:11 +01:00
Petr Sloup
2afb460191 Merge pull request #242 from samizdis/master
Addresses issue #197, send SIGTERM through to node
2017-12-01 10:52:52 +01:00
Sam Brown
8eb736b821 Addresses issue #197, send SIGTERM through to node
Node can't be PID 1, else it can't be term'ed and xvfb won't stop nicely.  So, according to https://docs.docker.com/engine/reference/builder/#entrypoint, we need to make sure it's not the bare entrypoint.

Also we need to be sure that run.sh passes the signal through to node, see https://unix.stackexchange.com/questions/146756/forward-sigterm-to-child-in-bash
2017-11-30 12:30:40 +00:00
Petr Sloup
83e20b7a4e Merge pull request #232 from rani-pinchuk/fix-zlib-incorrect-header-check
Catch incorrect header exceptions
2017-11-13 09:39:06 +01:00
Rani Pinchuk
81f65af3a8 Fix log message when incorrect header exception is caught 2017-11-09 18:00:41 +01:00
Petr Sloup
f5ea790878 Stop Xvfb when stopping the container (#197) 2017-11-08 17:01:28 +01:00
Rani Pinchuk
a0eb5800fd Catch incorrect header exceptions 2017-11-03 16:53:45 +01:00
Petr Sloup
27eb7f0ed8 Merge pull request #229 from tschaub/handle-rejection
Handle promise rejection
2017-11-01 09:15:02 +01:00
Tim Schaub
2f9059d09e Unnecessary promise wrapping 2017-10-23 10:05:30 -06:00
Tim Schaub
e11c8f9315 Reject font listing promise on error 2017-10-23 10:01:43 -06:00
Tim Schaub
650718e0f6 Avoid swallowing rejected font listing promise 2017-10-23 10:01:43 -06:00
Tim Schaub
5ed632c229 Reject source info promise on error 2017-10-23 10:01:32 -06:00
Tim Schaub
f545076986 Avoid swallowing rejected source info promise 2017-10-23 10:01:19 -06:00
Tim Schaub
3d48485475 Reject on font loading error 2017-10-23 10:01:16 -06:00
Tim Schaub
c060dedf20 Avoid swallowing rejected font loading promise 2017-10-23 10:01:01 -06:00
Tim Schaub
cd1f5fd04a Return after rejecting, catch and log 2017-10-23 09:46:04 -06:00
Alban Mouton
dc6be5047c missing public_url in tiles urls 2017-10-18 14:49:10 +02:00
Alban Mouton
47ff33166d missing public_url in templates 2017-10-18 14:20:33 +02:00
Alban Mouton
875521c5a8 add public_url option 2017-10-18 13:51:37 +02:00
Petr Sloup
82f179b07c Minor fix for correctly serving empty responses for missing tiles 2017-10-02 13:56:32 +02:00
Petr Sloup
51d6ca0880 Merge pull request #222 from otsaloma/renderer-pool-sizes
Make raster tile renderer pool sizes configurable
2017-10-02 10:04:22 +02:00
Osmo Salomaa
89878015bb Make raster tile renderer pool sizes configurable 2017-10-01 18:40:16 +03:00
Petr Pridal
ac948b6dee Create ISSUE_TEMPLATE.md 2017-09-28 00:53:05 +02:00
Petr Sloup
440775dbbf Update README.md 2017-09-25 13:23:05 +02:00
Petr Sloup
ea408f8ec9 Increase test timeout since travis can be slow on cold start when under load 2017-09-20 08:21:34 +02:00
Petr Sloup
da646868c3 Wait longer for xvfb to start up (#197) 2017-09-20 08:05:10 +02:00
Petr Sloup
d60996e3c6 Reorganize Dockerfile instructions for faster rebuilds 2017-09-20 08:03:46 +02:00
Petr Sloup
02cf45bbd9 Clean Dockerfile by basing on node:6-stretch 2017-09-20 08:01:35 +02:00
Petr Sloup
d9f8582279 Remove node-pngquant-native dependency
- Unnecessary native dependency
- It was disabled by default
- Has issues on certain platforms
- Not optimal for production use (performance)
2017-09-15 17:06:42 +02:00
Petr Sloup
54f11a2125 Update package version to 2.2.0 2017-09-01 11:37:18 +02:00
Petr Sloup
598c8c590b Update package dependencies 2017-09-01 11:30:52 +02:00
Petr Sloup
438a18eec1 Merge pull request #207 from tschaub/handle-request-failures
Try to create the appropriate data type on http errors
2017-08-24 09:33:22 +02:00
Tim Schaub
7bdb7afcb9 Reuse the function for creating empty responses 2017-08-23 11:30:05 -04:00
Tim Schaub
2e46700cd9 Try to create the appropriate data type on http errors 2017-08-22 14:17:53 -04:00
Petr Sloup
bb09f3df64 Add --rm to docker run instruction to run it more cleanly 2017-07-28 09:54:12 +02:00
Petr Sloup
42f24c2c99 Add concept of data decorator function 2017-07-28 09:53:32 +02:00
Petr Sloup
427a0f0687 Update package version to 2.1.0 2017-07-03 09:41:27 +02:00
Petr Sloup
da5ea4b426 Update Mapbox GL JS to v0.38.0 (close #188) 2017-07-03 09:39:55 +02:00
Petr Sloup
2208ff1e24 Merge pull request #187 from aleksejleonov/debian_stretch_nodejs_repo
Use debian stretch nodejs repo
2017-07-03 09:29:29 +02:00
Oleksii Leonov
cf521058be Use debian stretch nodejs repo
Dockerfile based on debian:stretch, so better to use native stretch nodejs repo instead of jessie repo.
2017-06-30 00:54:13 +03:00
Petr Sloup
a9b38022bb Give xvfb some time to start up before starting the server in docker (#185) 2017-06-29 10:50:02 +02:00
Petr Sloup
654bdda629 Update package version to 2.0.0 2017-06-23 21:45:11 +02:00
Petr Sloup
537313840e Update node version in documentation 2017-06-23 21:44:40 +02:00
Petr Sloup
d30f8464b2 Add some packages to travis and Dockerfile 2017-06-23 21:34:59 +02:00
Petr Sloup
698c527e94 Change endpoint URLs (close #154)
- styles at /style/{id}/style.json
- rendered tiles at /style/{id}/{z}/{x}/{y}.{format}
- TileJSONs at /style/{id}.json
2017-06-22 16:37:32 +02:00
Petr Sloup
8007f1386c Add required package for travis and Dockerfile 2017-06-22 16:37:32 +02:00
Petr Sloup
4f2fdf602b Update Dockerfiles to use node v6 2017-06-22 16:37:32 +02:00
Petr Sloup
6d7397647a Update travis script to use node v6 2017-06-22 16:37:32 +02:00
Petr Sloup
8fd7a9b42b Update dependencies to get ready for node v6 2017-06-22 16:37:32 +02:00
Petr Sloup
95470143b6 Merge pull request #179 from tschaub/err
Log errors to stderr and return
2017-06-20 17:29:39 +02:00
Tim Schaub
de83021c3d Log errors to stderr and return 2017-06-20 08:09:59 -07:00
Petr Sloup
7de3d8b9c7 Update package version to 1.7.0 2017-05-10 10:32:44 +02:00
Petr Sloup
bdc3d20524 Use promises instead of async in font concatenation (remove async dependency) 2017-05-10 10:22:39 +02:00
Petr Sloup
5d93b1d4f9 Add healthcheck endpoint (close #140) 2017-05-10 08:57:51 +02:00
Petr Sloup
d30027e992 Modify all serve_* modules to return a Promise (preparation for #140) 2017-05-10 08:56:43 +02:00
Petr Sloup
c233d23523 Fix broken static maps bounds overlay (for very large areas) 2017-05-05 16:15:10 +02:00
Petr Sloup
1109c77ec2 Update package version to 1.6.0 2017-05-04 12:07:58 +02:00
Petr Sloup
88cf9b37a9 Revert mapbox-gl-native package update
It broke travis (to be further investigated)
2017-05-04 11:21:57 +02:00
Petr Sloup
2d207f792b Update package dependencies 2017-05-04 11:13:24 +02:00
Petr Sloup
d67a57861d Merge pull request #155 from tschaub/reconfigure-on-sighup
Reload configuration on SIGHUP
2017-05-04 11:02:48 +02:00
Petr Sloup
27e9dbfb4e Merge pull request #157 from tschaub/address
Enclose literal IPv6 addresses in brackets
2017-05-04 08:57:17 +02:00
Tim Schaub
a199008fa3 Enclose literal IPv6 addresses in brackets 2017-04-28 07:28:49 -07:00
Tim Schaub
e88b786073 Reload configuration on SIGHUP 2017-04-28 07:13:34 -07:00
Petr Sloup
c03b0a12f8 Merge pull request #156 from tschaub/no-callback
Remove unused callback
2017-04-28 11:04:17 +02:00
Tim Schaub
a234041cd1 Remove unused callback 2017-04-26 08:02:18 -07:00
Petr Sloup
49a779970e Merge pull request #150 from pirxpilot/no-cors
add `--cors` option to allow for optional CORS handling
2017-04-18 09:32:11 +02:00
Petr Sloup
9545c2594e Handle scale in query-based static endpoint 2017-04-14 12:05:03 +02:00
Damian Krzeminski
6c23d95feb add --cors option to allow for optional CORS handling
we are using `cors` middleware with default options which works for most
applications, but does not allow for fine tuning (whitelisting origins
etc.)

this change keeps CORS handling as default to preserve compatibility but
also allows for specying `--no-cors` option which makes it possible to
handle CORS in an independent proxy (NGINX, another node app etc.)
2017-04-12 09:43:43 -07:00
Petr Sloup
366380395e Proper error message when metadata are missing in the mbtiles (close #147) 2017-04-11 19:10:40 +02:00
Petr Sloup
8ea665297f Minor fix in style path handling (allow absolute paths) 2017-04-07 18:53:11 +02:00
Petr Sloup
f6580c0342 Improved request logging 2017-04-04 18:46:18 +02:00
Petr Sloup
34a139040c Slight docker performance optimization 2017-04-04 18:46:18 +02:00
Petr Sloup
66bea8a42b Merge pull request #142 from somthanat/master
Word correction (Forwaded -> Forwarded)
2017-04-03 15:16:40 +02:00
Petr Sloup
28790fda30 Alternative query-based static endpoint 2017-04-03 15:14:40 +02:00
Somthanat Wongsa
0b16af0084 Word correction (Forwaded -> Forwarded) 2017-03-30 20:16:03 +07:00
Petr Sloup
e1654a51de Update package version to 1.5.0 2017-03-29 15:46:30 +02:00
Petr Sloup
5372bab6c5 Update dependencies 2017-03-29 15:45:32 +02:00
Petr Sloup
6a960e8593 Remove optional dependencies from package.json to avoid warnings 2017-03-17 10:42:25 +01:00
Petr Sloup
1577cfa54a Update dependencies 2017-03-15 17:20:55 +01:00
Petr Sloup
640038a115 Add support for watermarks (close #130) 2017-03-15 17:06:26 +01:00
Petr Sloup
49a8562441 Support for proj4 string in mbtiles metadata (for static maps) (close #127) 2017-03-15 16:45:26 +01:00
Petr Sloup
1e402ed207 Add possibility to change the front page (close #128) 2017-03-15 15:50:58 +01:00
Petr Sloup
f8949c1aa9 Configurable scale factors (close #121)
Also changes default maximum from `4x` to `3x`
2017-03-15 12:09:18 +01:00
Petr Sloup
7b952ee5c0 Do not add style parameter when not needed (close #134) 2017-03-15 11:39:21 +01:00
Petr Sloup
0673c8990a Add option to disable static maps (close #129) 2017-03-14 16:12:19 +01:00
Petr Sloup
37386bfb29 Hide empty headers on index (close #125) 2017-03-14 16:02:54 +01:00
Petr Sloup
b93bc5fadc Support for handling relative subdomain patterns 2017-03-14 15:50:14 +01:00
Petr Sloup
ca7a6ac515 Update package version to 1.4.1 2017-02-03 10:05:16 +01:00
Petr Sloup
9cc3f9df6a Update dependencies 2017-02-03 10:04:55 +01:00
Petr Sloup
e6ebb918fb Add mapbox-gl-rtl-text to correctly render labels in javascript (close #112) 2017-02-03 10:01:31 +01:00
Petr Sloup
ba0f441490 Update to mapbox-gl-js v0.32.1 2017-02-03 09:54:02 +01:00
Petr Sloup
e3ac9fbb4e Remove native dependency from tileserver-gl-light (close #113) 2017-02-03 09:42:31 +01:00
Petr Sloup
2f2e4b8f42 Remap data link also for the rendered tiles 2017-02-01 14:57:38 +01:00
Petr Sloup
bfadeb799b Experimental option to remap data links from inside of the styles 2017-02-01 14:25:21 +01:00
Petr Sloup
2da1bac6c7 Update package version to 1.4.0 2017-01-25 15:36:49 +01:00
Petr Sloup
6f5a7ed704 Update mapbox-gl.js to v0.31.0 2017-01-25 15:30:58 +01:00
Petr Sloup
3722c653f1 Rename /fontstacks.json to /fonts.json for better consistency (#104) 2017-01-25 15:30:58 +01:00
Petr Sloup
6231f9f7a7 Configurable optional alias for .pbf tiles (#109) 2017-01-25 15:30:58 +01:00
Petr Sloup
1079ece860 Index footer improvements (fix typo) 2017-01-25 15:30:58 +01:00
Petr Pridal
841cb82f85 Update OSM2VectorTiles to OpenMapTiles in Usage.rst 2017-01-25 01:27:31 +01:00
Petr Sloup
5c1d396ed2 Fix incorrect parenthesis (#108) 2017-01-24 11:18:56 +01:00
Petr Sloup
4992bc4194 Fix url instrumentation when serving style to be more robust (close #108) 2017-01-23 12:58:47 +01:00
Petr Sloup
f14d8b1e57 Update sharp dependency 2017-01-20 10:20:06 +01:00
Petr Sloup
14350a4338 Update mapbox-gl-native dependency 2017-01-20 10:11:10 +01:00
Petr Sloup
01fbaad962 Check configured paths exist on startup 2017-01-19 14:20:41 +01:00
Petr Sloup
26e6d56d9b Update README.md 2017-01-19 09:24:26 +01:00
Petr Sloup
66e3a3da1b Update package version to 1.3.2 2017-01-17 21:18:49 +01:00
Petr Sloup
63482a2a39 Generate version-based identifier for data when autogenerating config 2017-01-17 21:18:12 +01:00
Petr Sloup
58ccc5477c Update package version to 1.3.1 2017-01-17 20:48:43 +01:00
Petr Sloup
bbbb38d70f Update style dependency 2017-01-17 20:48:26 +01:00
Petr Sloup
2ef0540478 Remove optional dependencies from tileserver-gl-light 2017-01-17 20:47:46 +01:00
Petr Sloup
85692e9659 Specify font family in the Inspect mode (close #106) 2017-01-17 12:09:03 +01:00
Petr Sloup
b66ae40a1e Allow layer list in inspect mode use more space (close #106) 2017-01-16 16:27:18 +01:00
Petr Sloup
88022f9297 Update package version to 1.3.0 2017-01-13 11:04:14 +01:00
Petr Sloup
b127dacc0d Slightly stricter .dockerignore 2017-01-13 11:03:12 +01:00
Petr Sloup
c162a6647d Update package version to 1.3.0-beta.3 2017-01-12 15:26:34 +01:00
Petr Sloup
b48f7edc1d Serve fontstacks.json and possibly fonts even without any style 2017-01-12 15:23:02 +01:00
Petr Sloup
6d68c93871 Fix broken requires 2017-01-12 14:05:02 +01:00
Petr Sloup
1fef895e67 Update native dependency info in documentation 2017-01-12 13:57:40 +01:00
Petr Sloup
920b6c19b6 Remove deprecated engineStrict 2017-01-12 13:54:44 +01:00
Petr Sloup
7f280feeb1 Minor dependency package name update 2017-01-12 13:48:05 +01:00
Petr Sloup
1aec8f386e Update package version to 1.3.0-beta.2 2017-01-10 16:19:58 +01:00
Petr Sloup
d05606de4d Improved font serving 2017-01-10 16:17:51 +01:00
Petr Sloup
b9930dd195 Fix interim empty tile generation for raster layers 2017-01-10 15:47:56 +01:00
Petr Sloup
4082828790 Rename button from "X-Ray" to "Inspect" (see #103) 2017-01-10 15:17:34 +01:00
Petr Sloup
473e7b6f4a Merge pull request #103 from lukasmartinelli/master
Use Mapbox GL Inspect for X-Ray View
2017-01-10 15:15:06 +01:00
Lukas Martinelli
3d993458b5 Add different inspect viewer for data 2017-01-09 14:30:20 +01:00
Lukas Martinelli
b2dcf97d9a Add Mapbox GL Inspect plugin 2017-01-09 14:28:49 +01:00
Lukas Martinelli
d4ddbec45d Upgrade to Mapbox GL v0.30 2017-01-09 14:28:42 +01:00
Petr Sloup
d32e46ba2f Allow options to be passed to the docker + document it (close #87) 2016-12-21 07:01:16 +01:00
Petr Sloup
0ec992eb21 Explicitly handle SIGINT to terminate on Ctrl+C from docker
See https://github.com/nodejs/node/issues/4182
2016-12-21 06:49:16 +01:00
Petr Sloup
7a55ac9ebb Add paragraph about native dependencies (close #90) 2016-12-20 14:53:27 +01:00
Petr Sloup
78fcb893f7 Add paragraph about running behind a proxy (#50, #85) 2016-12-20 14:41:22 +01:00
Petr Sloup
19dcd52cc8 Update documentation to reflect recent changes 2016-12-20 14:32:33 +01:00
Petr Sloup
557f83121c Fix URLs in /index.json and /rendered.json 2016-12-20 13:56:23 +01:00
Petr Sloup
2d29a21596 Do not add basename to tilejson and remove sensitive properties (see #69) 2016-12-20 13:55:36 +01:00
Petr Sloup
945e568b2b Merge pull request #93 from ArsenyN/bugfix-RemoteVectorSource
Fix: Right code for working with external vector tiles.
2016-12-20 13:21:44 +01:00
Petr Sloup
e1a996a267 Minor Dockerfile fix 2016-12-19 21:45:57 +01:00
Petr Sloup
bdfa92532e Update package version to 1.3.0-beta.1 2016-12-19 21:24:14 +01:00
Petr Sloup
e14793c54b Add engines and engineStrict to package.json (close #79) 2016-12-19 21:07:39 +01:00
Arseny Novikov
37db733e02 Fix for this comment: https://github.com/klokantech/tileserver-gl/issues/91#issuecomment-267939138
With this commit code will have right behaviour with external vector tiles.
2016-12-19 14:13:03 +03:00
Petr Sloup
1c401f41a2 Update tests and links to use the new data 2016-12-15 10:51:18 +01:00
Petr Sloup
0018ed9524 Prepare for the new tile schema and compatibility checking 2016-12-14 08:37:17 +01:00
Petr Sloup
dfb07b8286 Show layer name in data viewer (close #83) 2016-12-13 08:48:28 +01:00
Petr Sloup
c1de2a7903 Upgrade MB GL JS to v0.28.0 (close #88) 2016-12-13 08:48:12 +01:00
Petr Sloup
509d32da68 Improved font serving 2016-12-09 13:19:34 +01:00
Petr Sloup
bbc14abb4a Fix sprite and glyph loading from remote URLs 2016-12-08 18:22:11 +01:00
Petr Sloup
442baee1ce Dockerfile improvements 2016-12-08 18:18:19 +01:00
Petr Sloup
0e6c9bfeb0 Improved data name autodetection 2016-12-08 09:41:39 +01:00
Petr Sloup
d3a685e51c Fix unzip bug 2016-12-07 11:03:03 +01:00
Petr Sloup
99af9eae23 Update dependencies 2016-12-06 22:16:35 +01:00
Petr Sloup
d330a9743c Minor bugfix 2016-12-06 22:16:35 +01:00
Petr Sloup
becb46ab80 Add "Style JSON" link to the front page 2016-12-06 22:16:29 +01:00
Petr Sloup
ef3f34f778 Add geojson endpoints (close #78) 2016-12-06 21:26:30 +01:00
Petr Sloup
1aaabd2dff Experimental integration of first plugin 2016-12-06 20:11:18 +01:00
Petr Sloup
bcac161a25 Minor route pattern improvement 2016-12-05 23:21:31 +01:00
Petr Sloup
9d362a5b5e Experimental static endpoints working with raw mercator coordinates 2016-12-05 23:02:48 +01:00
Petr Sloup
21883f490f Update package version to 1.2.0 2016-12-05 16:45:27 +01:00
Petr Sloup
70515947ca Merge pull request #73 from LKajan/x-ray-points
X-Ray style: add circle symbols for point layers
2016-12-05 16:42:16 +01:00
Lauri Kajan
63090802ae fixing typo 2016-11-16 11:28:15 +02:00
Lauri Kajan
131b5e2f81 added circle symbols for point layers 2016-11-16 10:16:14 +02:00
Petr Sloup
6e085af7cc Update package version to 1.1.5 2016-10-25 12:16:07 +02:00
Petr Sloup
345d96d5e6 Fix static endpoints for (near-)whole-world queries (close #63) 2016-10-21 14:49:39 +02:00
Petr Sloup
f1c835c21d Update package version to 1.1.4 2016-10-07 15:21:58 +02:00
Petr Sloup
15ed6d74bf Fix incorrect XYZ URLs (close #58) 2016-10-07 15:21:12 +02:00
Petr Sloup
a3d8240aac Do not add scale prefix when viewing raster data tiles (close #57) 2016-10-07 11:16:22 +02:00
Petr Sloup
098f057e55 Update package version to 1.1.3 2016-09-30 09:51:20 +02:00
Petr Sloup
18ba6f5059 Ignore tiling scheme of the source for internal meta urls (#54) 2016-09-30 09:50:05 +02:00
Petr Sloup
820dbdd3dd Update package version to 1.1.2 2016-09-27 17:34:39 +02:00
Petr Sloup
acd7683f18 Update dependencies 2016-09-27 17:30:24 +02:00
Petr Sloup
09859c10c1 Serve any vector/raster mbtiles, use styles only for osm2vt (close #51, #52) 2016-09-27 17:26:05 +02:00
Petr Sloup
f201deecdc Merge pull request #48 from rastapasta/patch-1
adding info for OSX setup
2016-09-22 08:55:41 +02:00
Petr Pridal
b49521d2ed Update README.md 2016-09-01 17:53:15 +02:00
Michael Straßburger
30c9bc8979 adding info for OSX setup 2016-08-29 12:31:33 +02:00
Petr Sloup
69340bbc83 Update package version to 1.1.1 2016-08-25 12:52:51 +02:00
Petr Sloup
ff9d5a8e5d Update READMEs and descriptions 2016-08-25 12:52:32 +02:00
Petr Sloup
23c2aa54d0 Update tests 2016-08-25 11:09:01 +02:00
Petr Sloup
a8fd1b38b7 Return 404 for negative zoom levels on static endpoint 2016-08-25 11:08:19 +02:00
Petr Sloup
7c28bf2b21 Update version to 1.1.0 2016-08-25 10:49:27 +02:00
Petr Sloup
f9f26f0d65 Indicate clearly when running light version on index.html 2016-08-25 10:44:29 +02:00
Petr Sloup
de60a0a076 Disable png quantization by default for now 2016-08-25 10:23:42 +02:00
Petr Sloup
90b9af3d95 Allow max image side length to be configurable 2016-08-25 09:41:33 +02:00
Petr Sloup
78aea26318 Allow @4x requests 2016-08-25 09:38:03 +02:00
Petr Sloup
292b1b6b44 Update dependencies 2016-08-25 09:28:17 +02:00
Petr Sloup
de7f5f0366 Allow and use floating-point zoom levels in the static endpoints 2016-08-25 09:22:12 +02:00
Petr Sloup
161de17803 Update package version to 1.0.0 2016-08-24 17:05:23 +02:00
Petr Pridal
f9e5afbf49 Update index.tmpl 2016-08-24 16:29:49 +02:00
Petr Sloup
513e2dac8f Fix incorrect variable name 2016-08-24 16:28:41 +02:00
Petr Sloup
e428ab60f1 Update README.md 2016-08-24 14:22:19 +02:00
Petr Sloup
9d1a2bf995 Add note about tileserver-gl-light to docs 2016-08-24 14:20:42 +02:00
Petr Sloup
bbda49589c Add PUBLISHING.md 2016-08-24 14:20:16 +02:00
Petr Sloup
a571d5f39b Improve and rename publishing script for creating light version 2016-08-24 14:19:16 +02:00
Petr Sloup
68d997a655 Update to tileserver-gl-styles v0.3.0 2016-08-24 14:05:01 +02:00
Petr Sloup
7d2f8ab062 Add note about tileserver-gl-light to the docs 2016-08-24 13:50:47 +02:00
Petr Sloup
4c2157842c Minor fix for autodetected bounds in tilejson 2016-08-24 13:19:36 +02:00
Petr Sloup
25c87ccf23 Initial documentation (close #39) 2016-08-23 00:32:09 +02:00
Petr Sloup
97457a23f2 Update "sharp" dependency version to 0.16.0 2016-08-21 10:14:49 +02:00
Petr Sloup
e9cad399c9 New "mbtiles://{name}" reference syntax (#27) 2016-08-21 10:08:17 +02:00
Petr Sloup
ee1cb21dfd Use pngquant (close #43); rename option formatEncoding->formatQuality 2016-08-21 09:41:28 +02:00
Petr Sloup
f524f1465e Fix race condition 2016-08-20 14:29:10 +02:00
Petr Sloup
1004f4cce1 Add XYZ to the list of services (close #42) 2016-08-20 14:01:12 +02:00
Petr Sloup
b4d6490e00 Large refactoring of usage (only mbtiles, default styles, ...) (#27) 2016-08-20 13:31:11 +02:00
Petr Sloup
3cf8ce9903 Add mbtiles_data: "metaprotocol" 2016-08-20 10:28:45 +02:00
Petr Sloup
f21ee2691b Merge branch 'v2_tiles' 2016-08-19 08:28:19 +02:00
Petr Sloup
845e31b3f2 More sensible errors for non-existent mbtiles 2016-08-19 08:25:12 +02:00
Petr Sloup
c2a18d7329 Update mapbox-gl-js to v0.21.0 2016-08-10 11:40:34 +08:00
Petr Sloup
d120b46966 Update mapbox-gl-native to v3.3.2 2016-08-10 11:35:54 +08:00
Petr Sloup
afda5d00bc Merge pull request #36 from efi-the-forking-continues/master
new feature: command line option for bind address
2016-08-07 20:45:29 +08:00
Thomas Efer
b3cb047d3d set default binding to undefined
this will result in default behavior in app.listen within server.js
2016-08-07 11:34:46 +02:00
Petr Sloup
af47c9c23b Update package version to 0.9.1 2016-08-06 18:41:24 +08:00
Petr Sloup
2ab9d9e168 Print the package name on the index 2016-08-06 18:40:50 +08:00
Petr Sloup
8a7f44d4c2 Add script for building "tileserver-gl-light" package (#27) 2016-08-06 18:37:17 +08:00
Thomas Efer
aa9a469bb4 tell server to adhere to new option for network interface binding 2016-08-05 14:30:22 +02:00
Thomas Efer
53c1ef5786 Added option to specify network interface binding 2016-08-05 14:28:34 +02:00
Petr Pridal
8074cfb4c7 Documentation - the ReadTheDocs skeleton 2016-08-04 23:55:20 +02:00
44 changed files with 4286 additions and 1036 deletions

View File

@@ -1,4 +1,7 @@
.git
docs/_build
node_modules
test_data
test
light
config.json
*.mbtiles

5
.gitignore vendored
View File

@@ -1,3 +1,8 @@
docs/_build
node_modules
test_data
data
light
plugins
config.json
*.mbtiles

View File

@@ -1,6 +1,6 @@
language: node_js
node_js:
- "4"
- "6"
env:
- CXX=g++-4.8
addons:
@@ -12,12 +12,10 @@ addons:
before_install:
- sudo apt-get update -qq
- sudo apt-get install -qq libcairo2-dev libjpeg8-dev libpango1.0-dev libgif-dev build-essential g++
- sudo apt-get install -qq xvfb
- sudo apt-get install -qq xvfb libgles2-mesa-dev libgbm-dev libxxf86vm-dev
install:
- npm install
- wget -O test_data.zip https://github.com/klokantech/tileserver-gl-data/archive/v0.8.zip
- unzip -q test_data.zip -d tmp_test_data
- mkdir test_data
- mv tmp_test_data/tileserver-gl-data-*/* -t test_data
- wget -O test_data.zip https://github.com/klokantech/tileserver-gl/releases/download/v1.3.0/test_data.zip
- unzip -q test_data.zip -d test_data
script:
- xvfb-run --server-args="-screen 0 1024x768x24" npm test

View File

@@ -1,6 +1,12 @@
FROM debian:stretch
FROM node:6.15.1-stretch
MAINTAINER Petr Sloup <petr.sloup@klokantech.com>
ENV NODE_ENV="production"
VOLUME /data
WORKDIR /data
EXPOSE 80
ENTRYPOINT ["/bin/bash", "/usr/src/app/run.sh"]
RUN apt-get -qq update \
&& DEBIAN_FRONTEND=noninteractive apt-get -y install \
apt-transport-https \
@@ -9,21 +15,15 @@ RUN apt-get -qq update \
build-essential \
python \
libcairo2-dev \
libgles2-mesa-dev \
libgbm-dev \
libllvm3.9 \
libprotobuf-dev \
libxxf86vm-dev \
xvfb \
&& echo "deb https://deb.nodesource.com/node_4.x jessie main" >> /etc/apt/sources.list.d/nodejs.list \
&& echo "deb-src https://deb.nodesource.com/node_4.x jessie main" >> /etc/apt/sources.list.d/nodejs.list \
&& apt-get -qq update \
&& DEBIAN_FRONTEND=noninteractive apt-get -y --allow-unauthenticated install \
nodejs \
&& rm /etc/apt/sources.list.d/nodejs.list \
x11-utils \
&& apt-get clean
RUN mkdir -p /usr/src/app
COPY / /usr/src/app
RUN cd /usr/src/app && npm install --production
VOLUME /data
WORKDIR /data
EXPOSE 80
CMD ["/usr/src/app/run.sh"]

12
Dockerfile_light Normal file
View File

@@ -0,0 +1,12 @@
FROM node:6.15.1-stretch
MAINTAINER Petr Sloup <petr.sloup@klokantech.com>
ENV NODE_ENV="production"
EXPOSE 80
VOLUME /data
WORKDIR /data
ENTRYPOINT ["node", "/usr/src/app/", "-p", "80"]
RUN mkdir -p /usr/src/app
COPY / /usr/src/app
RUN cd /usr/src/app && npm install --production

35
Dockerfile_test Normal file
View File

@@ -0,0 +1,35 @@
# Run tests inside docker without requiring full installation of dependencies on local machine
# Simply run "docker build -f Dockerfile_test ."
# WARNING: sometimes it fails with a core dumped exception
FROM node:6-stretch
MAINTAINER Petr Sloup <petr.sloup@klokantech.com>
RUN apt-get -qq update \
&& DEBIAN_FRONTEND=noninteractive apt-get -y install \
apt-transport-https \
curl \
unzip \
build-essential \
python \
libcairo2-dev \
libgles2-mesa-dev \
libgbm-dev \
libllvm3.9 \
libprotobuf-dev \
libxxf86vm-dev \
xvfb \
&& apt-get clean
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
RUN wget -O test_data.zip https://github.com/klokantech/tileserver-gl/releases/download/v1.3.0/test_data.zip
RUN unzip -q test_data.zip -d test_data
ENV NODE_ENV="test"
COPY package.json .
RUN npm install
COPY / .
RUN xvfb-run --server-args="-screen 0 1024x768x24" npm test

21
ISSUE_TEMPLATE.md Normal file
View File

@@ -0,0 +1,21 @@
It is great you want to help us making TileServer GL project better!
This is the right place only for a software bug report or a new software feature request.
NOTE: Questions about OpenMapTiles data, OpenMapTiles Server, TileHosting and other software/products do not belong here (and will not be answered)!
The usage and installation questions belongs to https://stackoverflow.com/questions/tagged/openmaptiles
A guaranteed support and consulting from the core developers via https://openmaptiles.com/support/
Please search this GitHub repo for similar requests before posting (check also closed tickets).
When reporting a problem you have with the TileServer GL software please provide:
- Clear description of the problem: What steps will lead to reproducing the error on our computer? What is exactly wrong?
- Version of the TileServer GL software you have used
- Version and name of the operating system you use or other details of your setup
- Information about your used config / styles / vector tiles
- URL / link to the specific location in a live map demo where a bug is visible is always great
- Screenshot of the problem are cool! Drag&drop an image to the report here...
We love pull requests! If you are able to code, please send us your fix or code modification via GitHub... Thanks!

6
PUBLISHING.md Normal file
View File

@@ -0,0 +1,6 @@
# Publishing new version
- Update version in `package.json`
- `git tag vx.x.x`
- `git push --tags`
- `node publish.js` (publishes packages to npm)

View File

@@ -1,59 +1,48 @@
![tileserver-gl](https://cloud.githubusercontent.com/assets/59284/18173467/fa3aa2ca-7069-11e6-86b1-0f1266befeb6.jpeg)
# TileServer GL
[![Build Status](https://travis-ci.org/klokantech/tileserver-gl.svg?branch=master)](https://travis-ci.org/klokantech/tileserver-gl)
[![Docker Hub](https://img.shields.io/badge/docker-hub-blue.svg)](https://hub.docker.com/r/klokantech/tileserver-gl/)
Vector and raster maps with GL styles. Server side rendering by Mapbox GL Native. Map tile server for Mapbox GL JS, Android, iOS, Leaflet, OpenLayers, GIS via WMTS, etc.
## Installation
## Get Started
### Docker
- `docker run -it -v $(pwd):/data -p 8080:80 klokantech/tileserver-gl`
Make sure you have Node.js version **6** installed (running `node -v` it should output something like `v6.11.3`).
### Without docker
- Make sure you have Node v4 or higher (`nvm install 4`)
- `npm install`
- `node src/main.js`
Install `tileserver-gl` with server-side raster rendering of vector tiles with npm
## Sample data
Sample data can be downloaded at https://github.com/klokantech/tileserver-gl-data/archive/master.zip
```bash
npm install -g tileserver-gl
```
#### Usage
- unpack somewhere and `cd` to the directory
- `docker run -it -v $(pwd):/data -p 8080:80 klokantech/tileserver-gl`
- (or `node path/to/repo/src/main.js`)
Now download vector tiles from [OpenMapTiles](https://openmaptiles.org/downloads/).
## Configuration
```bash
curl -o zurich_switzerland.mbtiles https://[GET-YOUR-LINK]/extracts/zurich_switzerland.mbtiles
```
Create `config.json` file in the root directory.
The config file can contain definition of several paths where the tiles will be served.
Start `tileserver-gl` with the downloaded vector tiles.
### Example configuration file
See https://github.com/klokantech/tileserver-gl-data/blob/master/config.json
```bash
tileserver-gl zurich_switzerland.mbtiles
```
**Note**: To specify local mbtiles as source of the vector tiles inside the style, use urls with `mbtiles` protocol with path relative to the `cwd + options.paths.root + options.paths.mbtiles`. (For example `mbtiles://switzerland.mbtiles`)
Alternatively, you can use the `tileserver-gl-light` package instead, which is pure javascript (does not have any native dependencies) and can run anywhere, but does not contain rasterization on the server side made with MapBox GL Native.
## Available URLs
## Using Docker
- If you visit the server on the configured port (default 8080) you should see your maps appearing in the browser.
- Style is served at `/styles/{id}.json` (+ array at `/styles.json`)
- Sprites at `/styles/{id}/sprite[@2x].{format}`
- Fonts at `/fonts/{fontstack}/{start}-{end}.pbf`
- Rendered tiles are at `/styles/{id}/rendered/{z}/{x}/{y}[@2x].{format}`
- The optional `@2x` (or `@3x`) part can be used to render HiDPI (retina) tiles
- Available formats: `png`, `jpg` (`jpeg`), `webp`
- TileJSON at `/styles/{id}/rendered.json`
- Static images are rendered at:
- `/styles/{id}/static/{lon},{lat},{zoom}[@{bearing}[,{pitch}]]/{width}x{height}[@2x].{format}` (center-based)
- `/styles/{id}/static/{minx},{miny},{maxx},{maxy}/{width}x{height}[@2x].{format}` (area-based)
- `/styles/{id}/static/auto/{width}x{height}[@2x].{format}` (autofit path -- see below)
- The static image endpoints additionally support following query parameters:
- `path` - comma-separated `lng,lat`, pipe-separated pairs
- e.g. `5.9,45.8|5.9,47.8|10.5,47.8|10.5,45.8|5.9,45.8`
- `latlng` - indicates the `path` coordinates are in `lat,lng` order rather than the usual `lng,lat`
- `fill` - color to use as the fill (e.g. `red`, `rgba(255,255,255,0.5)`, `#0000ff`)
- `stroke` - color of the path stroke
- `width` - width of the stroke
- `padding` - "percetange" padding for fitted endpoints (area-based and path autofit)
- value of `0.1` means "add 10% size to each side to make sure the area of interest is nicely visible"
- Source data at `/data/{mbtiles}/{z}/{x}/{y}.{format}`
- TileJSON at `/data/{mbtiles}.json`
- Array of all TileJSONs at `/index.json` (`/rendered.json`; `/data.json`)
An alternative to npm to start the packed software easier is to install [Docker](http://www.docker.com/) on your computer and then run in the directory with the downloaded MBTiles the command:
```bash
docker run --rm -it -v $(pwd):/data -p 8080:80 klokantech/tileserver-gl
```
This will download and start a ready to use container on your computer and the maps are going to be available in webbrowser on localhost:8080.
On laptop you can use [Docker Kitematic](https://kitematic.com/) and search "tileserver-gl" and run it, then drop in the 'data' folder the MBTiles.
## Documentation
You can read full documentation of this project at http://tileserver.readthedocs.io/.

17
README_light.md Normal file
View File

@@ -0,0 +1,17 @@
# TileServer GL light
[![Build Status](https://travis-ci.org/klokantech/tileserver-gl.svg?branch=master)](https://travis-ci.org/klokantech/tileserver-gl)
[![Docker Hub](https://img.shields.io/badge/docker-hub-blue.svg)](https://hub.docker.com/r/klokantech/tileserver-gl/)
Vector maps with GL styles. Map tile server for Mapbox Android, iOS, GL JS, Leaflet, OpenLayers, etc. without server side rendering.
## Quickstart
Use `npm install -g tileserver-gl-light` to install the package from npm.
Then you can simply run `tileserver-gl-light zurich_switzerland.mbtiles` to start the server for the given mbtiles.
See also `tileserver-gl` which contains server side rendering.
Prepared vector tiles can be downloaded from [OSM2VectorTiles](http://osm2vectortiles.org/).
## Documentation
You can read full documentation of this project at http://tileserver.readthedocs.io/.

177
docs/Makefile Normal file
View File

@@ -0,0 +1,177 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/TileServerGL.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/TileServerGL.qhc"
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/TileServerGL"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/TileServerGL"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

258
docs/conf.py Normal file
View File

@@ -0,0 +1,258 @@
# -*- coding: utf-8 -*-
#
# TileServer GL documentation build configuration file, created by
# sphinx-quickstart on Thu Aug 4 23:48:49 2016.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = []
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix of source filenames.
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'TileServer GL'
copyright = u'2016, Klokan Technologies GmbH'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1'
# The full version, including alpha/beta/rc tags.
release = '1.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'TileServerGLdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
('index', 'TileServerGL.tex', u'TileServer GL Documentation',
u'Klokan Technologies GmbH', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'tileservergl', u'TileServer GL Documentation',
[u'Klokan Technologies GmbH'], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
('index', 'TileServerGL', u'TileServer GL Documentation',
u'Klokan Technologies GmbH', 'TileServerGL', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False

198
docs/config.rst Normal file
View File

@@ -0,0 +1,198 @@
==================
Configuration file
==================
The configuration file defines the behavior of the application. It's a regular JSON file.
Example::
{
"options": {
"paths": {
"root": "",
"fonts": "fonts",
"sprites": "sprites",
"styles": "styles",
"mbtiles": ""
},
"domains": [
"localhost:8080",
"127.0.0.1:8080"
],
"formatQuality": {
"jpeg": 80,
"webp": 90
},
"maxScaleFactor": 3,
"maxSize": 2048,
"pbfAlias": "pbf",
"serveAllFonts": false,
"serveStaticMaps": true
},
"styles": {
"basic": {
"style": "basic.json",
"tilejson": {
"type": "overlay",
"bounds": [8.44806, 47.32023, 8.62537, 47.43468]
}
},
"hybrid": {
"style": "satellite-hybrid.json",
"serve_rendered": false,
"tilejson": {
"format": "webp"
}
}
},
"data": {
"zurich-vector": {
"mbtiles": "zurich.mbtiles"
}
}
}
``options``
===========
``paths``
---------
Defines where to look for the different types of input data.
The value of ``root`` is used as prefix for all data types.
``domains``
-----------
You can use this to optionally specify on what domains the rendered tiles are accessible. This can be used for basic load-balancing or to bypass browser's limit for the number of connections per domain.
``frontPage``
-----------------
Path to the html (relative to ``root`` path) to use as a front page.
Use ``true`` (or nothing) to serve the default TileServer GL front page with list of styles and data.
Use ``false`` to disable the front page altogether (404).
``formatQuality``
-----------------
Quality of the compression of individual image formats. [0-100]
``maxScaleFactor``
-----------
Maximum scale factor to allow in raster tile and static maps requests (e.g. ``@3x`` suffix).
Also see ``maxSize`` below.
Default value is ``3``, maximum ``9``.
``maxSize``
-----------
Maximum image side length to be allowed to be rendered (including scale factor).
Be careful when changing this value since there are hardware limits that need to be considered.
Default is ``2048``.
``minRendererPoolSizes``
------------------------
Minimum amount of raster tile renderers per scale factor.
The value is an array: the first element is the minimum amount of renderers for scale factor one, the second for scale factor two and so on.
If the array has less elements than ``maxScaleFactor``, then the last element is used for all remaining scale factors as well.
Selecting renderer pool sizes is a trade-off between memory use and speed.
A reasonable value will depend on your hardware and your amount of styles and scale factors.
If you have plenty of memory, you'll want to set this equal to ``maxRendererPoolSizes`` to avoid increased latency due to renderer destruction and recreation.
If you need to conserve memory, you'll want something lower than ``maxRendererPoolSizes``, possibly allocating more renderers to scale factors that are more common.
Default is ``[8, 4, 2]``.
``maxRendererPoolSizes``
------------------------
Maximum amount of raster tile renderers per scale factor.
The value and considerations are similar to ``minRendererPoolSizes`` above.
If you have plenty of memory, try setting these equal to or slightly above your processor count, e.g. if you have four processors, try a value of ``[6]``.
If you need to conserve memory, try lower values for scale factors that are less common.
Default is ``[16, 8, 4]``.
``watermark``
-----------
Optional string to be rendered into the raster tiles (and static maps) as watermark (bottom-left corner).
Can be used for hard-coding attributions etc. (can also be specified per-style).
Not used by default.
``styles``
==========
Each item in this object defines one style (map). It can have the following options:
* ``style`` -- name of the style json file [required]
* ``serve_rendered`` -- whether to render the raster tiles for this style or not
* ``serve_data`` -- whether to allow acces to the original tiles, sprites and required glyphs
* ``tilejson`` -- properties to add to the TileJSON created for the raster data
* ``format`` and ``bounds`` can be especially useful
``data``
========
Each item specifies one data source which should be made accessible by the server. It has the following options:
* ``mbtiles`` -- name of the mbtiles file [required]
The mbtiles file does not need to be specified here unless you explicitly want to serve the raw data.
Referencing local files from style JSON
=======================================
You can link various data sources from the style JSON (for example even remote TileJSONs).
MBTiles
-------
To specify that you want to use local mbtiles, use to following syntax: ``mbtiles://switzerland.mbtiles``.
The TileServer-GL will try to find the file ``switzerland.mbtiles`` in ``root`` + ``mbtiles`` path.
For example::
"sources": {
"source1": {
"url": "mbtiles://switzerland.mbtiles",
"type": "vector"
}
}
Alternatively, you can use ``mbtiles://{zurich-vector}`` to reference existing data object from the config.
In this case, the server will look into the ``config.json`` to determine what mbtiles file to use.
For the config above, this is equivalent to ``mbtiles://zurich.mbtiles``.
Sprites
-------
If your style requires any sprites, make sure the style JSON contains proper path in the ``sprite`` property.
It can be a local path (e.g. ``my-style/sprite``) or remote http(s) location (e.g. ``https://mycdn.com/my-style/sprite``). Several possible extension are added to this path, so the following files should be present:
* ``sprite.json``
* ``sprite.png``
* ``sprite@2x.json``
* ``sprite@2x.png``
You can also use the following placeholders in the sprite path for easier use:
* ``{style}`` -- gets replaced with the name of the style file (``xxx.json``)
* ``{styleJsonFolder}`` -- gets replaced with the path to the style file
Fonts (glyphs)
--------------
Similarly to the sprites, the style JSON also needs to contain proper paths to the font glyphs (in the ``glyphs`` property) and can be both local and remote.
It should contain the following placeholders:
* ``{fontstack}`` -- name of the font and variant
* ``{range}`` -- range of the glyphs
For example ``"glyphs": "{fontstack}/{range}.pbf"`` will instruct TileServer-GL to look for the files such as ``fonts/Open Sans/0-255.pbf`` (``fonts`` come from the ``paths`` property of the ``config.json`` example above).

20
docs/deployment.rst Normal file
View File

@@ -0,0 +1,20 @@
==========
Deployment
==========
Typically - you should use nginx/lighttpd/apache on the frontend - and the tileserver-gl server is hidden behind it in production deployment.
Caching
=======
There is a plenty of options you can use to create proper caching infrastructure: Varnish, CloudFlare, ...
Securing
========
Nginx can be used to add protection via https, password, referrer, IP address restriction, access keys, etc.
Running behind a proxy or a load-balancer
=========================================
If you need to run TileServer GL behind a proxy, make sure the proxy sends ``X-Forwarded-*`` headers to the server (most importantly ``X-Forwarded-Host`` and ``X-Forwarded-Proto``) to ensures the URLs generated inside TileJSON etc. are using the desired domain and protocol.

77
docs/endpoints.rst Normal file
View File

@@ -0,0 +1,77 @@
===================
Available endpoints
===================
If you visit the server on the configured port (default 8080) you can see your maps appearing in the browser.
Styles
======
* Styles are served at ``/styles/{id}/style.json`` (+ array at ``/styles.json``)
* Sprites at ``/styles/{id}/sprite[@2x].{format}``
* Fonts at ``/fonts/{fontstack}/{start}-{end}.pbf``
Rendered tiles
==============
* Rendered tiles are served at ``/styles/{id}/{z}/{x}/{y}[@2x].{format}``
* The optional ``@2x`` (or ``@3x``, ``@4x``) part can be used to render HiDPI (retina) tiles
* Available formats: ``png``, ``jpg`` (``jpeg``), ``webp``
* TileJSON at ``/styles/{id}.json``
* The rendered tiles are not available in the ``tileserver-gl-light`` version.
WMTS Capabilities
==============
* WMTS Capabilities are served at ``/styles/{id}/wmts.xml``
Static images
=============
* Several endpoints:
* ``/styles/{id}/static/{lon},{lat},{zoom}[@{bearing}[,{pitch}]]/{width}x{height}[@2x].{format}`` (center-based)
* ``/styles/{id}/static/{minx},{miny},{maxx},{maxy}/{width}x{height}[@2x].{format}`` (area-based)
* ``/styles/{id}/static/auto/{width}x{height}[@2x].{format}`` (autofit path -- see below)
* All the static image endpoints additionally support following query parameters:
* ``path`` - comma-separated ``lng,lat``, pipe-separated pairs
* e.g. ``5.9,45.8|5.9,47.8|10.5,47.8|10.5,45.8|5.9,45.8``
* ``latlng`` - indicates the ``path`` coordinates are in ``lat,lng`` order rather than the usual ``lng,lat``
* ``fill`` - color to use as the fill (e.g. ``red``, ``rgba(255,255,255,0.5)``, ``#0000ff``)
* ``stroke`` - color of the path stroke
* ``width`` - width of the stroke
* ``padding`` - "percetange" padding for fitted endpoints (area-based and path autofit)
* value of ``0.1`` means "add 10% size to each side to make sure the area of interest is nicely visible"
* You can also use (experimental) ``/styles/{id}/static/raw/...`` endpoints with raw spherical mercator coordinates (EPSG:3857) instead of WGS84.
* The static images are not available in the ``tileserver-gl-light`` version.
Source data
===========
* Source data are served at ``/data/{mbtiles}/{z}/{x}/{y}.{format}``
* Format depends on the source file (usually ``png`` or ``pbf``)
* ``geojson`` is also available (useful for inspecting the tiles) in case the original format is ``pbf``
* TileJSON at ``/data/{mbtiles}.json``
TileJSON arrays
===============
Array of all TileJSONs is at ``/index.json`` (``/rendered.json``; ``/data.json``)
List of available fonts
=======================
Array of names of the available fonts is at ``/fonts.json``
Health check
============
Endpoint reporting health status is at ``/health`` and currently returns:
* ``503`` Starting - for a short period before everything is initialized
* ``200`` OK - when the server is running

28
docs/index.rst Normal file
View File

@@ -0,0 +1,28 @@
.. TileServer GL documentation master file, created by
sphinx-quickstart on Thu Aug 4 23:48:49 2016.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to TileServer GL's documentation!
=========================================
Contents:
.. toctree::
:maxdepth: 2
installation
usage
config
deployment
endpoints
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

58
docs/installation.rst Normal file
View File

@@ -0,0 +1,58 @@
============
Installation
============
Docker
======
When running docker image, no special installation is needed -- the docker will automatically download the image if not present.
Just run ``docker run --rm -it -v $(pwd):/data -p 8080:80 klokantech/tileserver-gl``.
Additional options (see :doc:`/usage`) can be passed to the TileServer GL by appending them to the end of this command. You can, for example, do the following:
* ``docker run ... klokantech/tileserver-gl my-tiles.mbtiles`` -- explicitly specify which mbtiles to use (if you have more in the folder)
* ``docker run ... klokantech/tileserver-gl --verbose`` -- to see the default config created automatically
npm
===
Just run ``npm install -g tileserver-gl``.
Native dependencies
-------------------
There are some native dependencies that you need to make sure are installed if you plan to run the TileServer GL natively without docker.
The precise package names you need to install may differ on various platforms.
These are required on Debian 9:
* ``build-essential``
* ``libcairo2-dev``
* ``libprotobuf-dev``
``tileserver-gl-light`` on npm
==============================
Alternatively, you can use ``tileserver-gl-light`` package instead, which is pure javascript (does not have any native dependencies) and can run anywhere, but does not contain rasterization features.
From source
===========
Make sure you have Node v6 (nvm install 6) and run::
npm install
node .
On OSX
======
Make sure to have dependencies of canvas_ package installed::
brew install pkg-config cairo libpng jpeg giflib
.. _canvas: https://www.npmjs.com/package/canvas

29
docs/usage.rst Normal file
View File

@@ -0,0 +1,29 @@
=====
Usage
=====
Getting started
======
::
Usage: main.js tileserver-gl [mbtiles] [options]
Options:
-h, --help output usage information
--mbtiles <file> MBTiles file (uses demo configuration);
ignored if the configuration file is also specified
-c, --config <file> Configuration file [config.json]
-b, --bind <address> Bind address
-p, --port <port> Port [8080]
-C|--no-cors Disable Cross-origin resource sharing headers
-V, --verbose More verbose output
-s, --silent Less verbose output
-v, --version Version info
Default styles and configuration
======
- If no configuration file is specified, the default styles (compatible with openmaptiles) are used.
- If no mbtiles file is specified (and is not found in the current working directory), an extract is downloaded directly from https://openmaptiles.org/

View File

@@ -1,7 +1,7 @@
{
"name": "tileserver-gl",
"version": "0.9.0",
"description": "Map tile server for JSON GL styles - serverside generated raster tiles",
"version": "2.5.0",
"description": "Map tile server for JSON GL styles - vector and server side generated raster tiles",
"main": "src/main.js",
"bin": "src/main.js",
"authors": [
@@ -12,31 +12,37 @@
"url": "https://github.com/klokantech/tileserver-gl.git"
},
"license": "BSD-2-Clause",
"engines": {
"node": ">=6 <7"
},
"scripts": {
"test": "mocha test/**.js"
"test": "mocha test/**.js --timeout 10000"
},
"dependencies": {
"async": "2.0.1",
"advanced-pool": "0.3.2",
"base64url": "2.0.0",
"canvas": "1.4.0",
"clone": "1.0.2",
"color": "0.11.3",
"cors": "2.7.1",
"express": "4.14.0",
"@mapbox/mapbox-gl-native": "4.0.0",
"@mapbox/mbtiles": "0.10.0",
"@mapbox/sphericalmercator": "1.1.0",
"@mapbox/vector-tile": "1.3.1",
"advanced-pool": "0.3.3",
"canvas": "1.6.13",
"clone": "2.1.2",
"color": "3.1.0",
"commander": "2.19.0",
"cors": "2.8.5",
"express": "4.16.4",
"glyph-pbf-composite": "0.0.2",
"handlebars": "4.0.5",
"mapbox-gl-native": "3.2.1",
"mbtiles": "0.9.0",
"morgan": "1.7.0",
"nomnom": "1.8.1",
"request": "2.74.0",
"sharp": "0.15.1",
"sphericalmercator": "1.0.5"
"handlebars": "4.0.12",
"http-shutdown": "^1.2.0",
"morgan": "1.9.1",
"pbf": "3.1.0",
"proj4": "2.5.0",
"request": "2.88.0",
"sharp": "0.21.1",
"tileserver-gl-styles": "1.2.0"
},
"devDependencies": {
"should": "^10.0.0",
"mocha": "^2.5.0",
"supertest": "^1.2.0"
"mocha": "^5.2.0",
"should": "^13.2.0",
"supertest": "^3.1.0"
}
}

View File

@@ -28,7 +28,7 @@ a{
color: #499DCE;
transition: color .2s;
}
a:hover{
a:hover {
color: #395D73;
}
.title {
@@ -36,8 +36,18 @@ a:hover{
font-size: 32px;
text-align:center;
margin:90px 0 0 0;
position:relative;
}
section{
.title.light:after {
content: "light";
display: block;
position: absolute;
left: 50%;
bottom: -5px;
color: #499DCE;
font-size:.8em;
}
section {
margin: 15px auto;
width: 930px;
padding: 30px 0;
@@ -60,7 +70,7 @@ section{
font-size:20px;
background:#fff;
}
.item{
.item {
background:#fff;
height: 191px;
border: 1px solid #ededed;
@@ -69,7 +79,7 @@ section{
.item:nth-child(odd) {
background-color:#fbfbfb;
}
.item img{
.item img {
position: absolute;
margin: 30px;
width: 128px;
@@ -78,7 +88,6 @@ section{
}
.details {
float:left;
width:180px;
height: 128px;
padding: 20px 30px 20px 188px;
}
@@ -113,10 +122,10 @@ section{
text-decoration: none;
font-weight: bold;
}
.btn:first-child:hover{
.btn:first-child:hover {
background: #395D73;
}
footer{
footer {
width:100%;
border-top:1px solid #ededed;
text-align:center;
@@ -124,10 +133,13 @@ footer{
padding-top:10px;
font-size:12px;
}
footer img{
footer img {
width: 118px;
height: 32px;
}
footer .t {
display:none;
}
footer p {
margin-top:0;
}
@@ -135,6 +147,10 @@ footer a {
color: #787878;
text-decoration: none;
}
.details h3, .identifier {
max-width: 550px;
word-break: break-all;
}
/* body background image */
body {
@@ -170,31 +186,34 @@ body {
.title{
margin: 25px 0 0 0;
}
.title img{
.title.light:after {
font-size:.6em;
}
.title img {
width: 200px;
}
.subtitle{
.subtitle {
font-size: 20px;
margin: 0 0 35px 0;
}
.item{
.item {
height: 245px;
}
.viewers{
.viewers {
float: left;
text-align: left;
width: 100%;
margin-left: 30px;
margin-top: 15px;
}
.viewers a{
.viewers a {
display: inline-block;
vertical-align: middle;
}
.btn{
.btn {
margin: 0 20px 0 0;
}
.btn:first-child{
.btn:first-child {
padding: 0 20px;
}
}

View File

@@ -0,0 +1,40 @@
.mapbox-gl-inspect_popup {
color: #333;
display: table;
}
.mapbox-gl-inspect_feature:not(:last-child) {
border-bottom: 1px solid #ccc;
}
.mapbox-gl-inspect_layer:before {
content: '#';
}
.mapbox-gl-inspect_layer {
display: block;
font-weight: bold;
}
.mapbox-gl-inspect_property {
display: table-row;
}
.mapbox-gl-inspect_property-value {
display: table-cell;
}
.mapbox-gl-inspect_property-name {
display: table-cell;
padding-right: 10px;
}
.mapboxgl-ctrl-inspect {
background-image: url('data:image/svg+xml;charset=utf8,<svg%20xmlns="http://www.w3.org/2000/svg"%20fill="#333333%22%20preserveAspectRatio=%22xMidYMid%20meet%22%20viewBox=%22-10%20-10%2060%2060%22%3E%3Cg%3E%3Cpath%20d=%22m15%2021.6q0-2%201.5-3.5t3.5-1.5%203.5%201.5%201.5%203.5-1.5%203.6-3.5%201.4-3.5-1.4-1.5-3.6z%20m18.4%2011.1l-6.4-6.5q1.4-2.1%201.4-4.6%200-3.4-2.5-5.8t-5.9-2.4-5.9%202.4-2.5%205.8%202.5%205.9%205.9%202.5q2.4%200%204.6-1.4l7.4%207.4q-0.9%200.6-2%200.6h-20q-1.3%200-2.3-0.9t-1.1-2.3l0.1-26.8q0-1.3%201-2.3t2.3-0.9h13.4l10%2010v19.3z%22%3E%3C/path%3E%3C/g%3E%3C/svg%3E');
}
.mapboxgl-ctrl-map {
background-image: url('data:image/svg+xml;charset=utf8,<svg%20xmlns="http://www.w3.org/2000/svg"%20fill="#333333%22%20viewBox=%22-10%20-10%2060%2060%22%20preserveAspectRatio=%22xMidYMid%20meet%22%3E%3Cg%3E%3Cpath%20d=%22m25%2031.640000000000004v-19.766666666666673l-10-3.511666666666663v19.766666666666666z%20m9.140000000000008-26.640000000000004q0.8599999999999923%200%200.8599999999999923%200.8600000000000003v25.156666666666666q0%200.625-0.625%200.783333333333335l-9.375%203.1999999999999993-10-3.5133333333333354-8.906666666666668%203.4383333333333326-0.2333333333333334%200.07833333333333314q-0.8616666666666664%200-0.8616666666666664-0.8599999999999994v-25.156666666666663q0-0.625%200.6233333333333331-0.7833333333333332l9.378333333333334-3.198333333333334%2010%203.5133333333333336%208.905000000000001-3.4383333333333344z%22%3E%3C/path%3E%3C/g%3E%3C/svg%3E');
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,550 @@
(function(){function mc(b){eval.call(null,b)}function zi(b){var h=c["_"+b];if(!h)try{h=eval("_"+b)}catch(g){}return h}function Ai(b,c,g){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":return ga[b>>0];case "i8":return ga[b>>0];case "i16":return ma[b>>1];case "i32":return W[b>>2];case "i64":return W[b>>2];case "float":return ca[b>>2];case "double":return Ac[b>>3];default:xb("invalid type for setValue: "+c)}return null}function aa(b,c,g,v){var h,n;"number"===typeof b?(h=!0,n=b):
(h=!1,n=b.length);var t="string"===typeof c?c:null;g=4==g?v:[nc,k.stackAlloc,k.staticAlloc,k.dynamicAlloc][void 0===g?2:g](Math.max(n,t?1:c.length));if(h){v=g;for(b=g+(n&-4);v<b;v+=4)W[v>>2]=0;for(b=g+n;v<b;)ga[v++>>0]=0;return g}if("i8"===t)return b.subarray||b.slice?Ca.set(b,g):Ca.set(new Uint8Array(b),g),g;v=0;for(var R,E;v<n;){var x=b[v];"function"===typeof x&&(x=k.getFunctionIndex(x));h=t||c[v];if(0===h)v++;else{"i64"==h&&(h="i32");var z=g+v,K=h,K=K||"i8";"*"===K.charAt(K.length-1)&&(K="i32");
switch(K){case "i1":ga[z>>0]=x;break;case "i8":ga[z>>0]=x;break;case "i16":ma[z>>1]=x;break;case "i32":W[z>>2]=x;break;case "i64":Wb=[x>>>0,(Xb=x,1<=+Ci(Xb)?0<Xb?(Di(+Ei(Xb/4294967296),4294967295)|0)>>>0:~~+Fi((Xb-+(~~Xb>>>0))/4294967296)>>>0:0)];W[z>>2]=Wb[0];W[z+4>>2]=Wb[1];break;case "float":ca[z>>2]=x;break;case "double":Ac[z>>3]=x;break;default:xb("invalid type for setValue: "+K)}E!==h&&(R=k.getNativeTypeSize(h),E=h);v+=R}}return g}function oc(b,h){if(0===h||!b)return"";for(var g=0,v,C=0;;){v=
Ca[b+C>>0];g|=v;if(0==v&&!h)break;C++;if(h&&C==h)break}h||(h=C);v="";if(128>g){for(;0<h;)g=String.fromCharCode.apply(String,Ca.subarray(b,b+Math.min(h,1024))),v=v?v+g:g,b+=1024,h-=1024;return v}return c.UTF8ToString(b)}function Gi(b){function h(c,g,v){g=g||Infinity;var n="",C=[],k;if("N"===b[t]){t++;"K"===b[t]&&t++;for(k=[];"E"!==b[t];)if("S"===b[t]){t++;var x=b.indexOf("_",t),K=b.substring(t,x)||0;k.push(z[K]||"?");t=x+1}else if("C"===b[t])k.push(k[k.length-1]),t+=2;else{x=parseInt(b.substr(t));
K=x.toString().length;if(!x||!K){t--;break}var P=b.substr(t+K,x);k.push(P);z.push(P);t+=K+x}t++;k=k.join("::");g--;if(0===g)return c?[k]:k}else if(("K"===b[t]||E&&"L"===b[t])&&t++,x=parseInt(b.substr(t)))K=x.toString().length,k=b.substr(t+K,x),t+=K+x;E=!1;"I"===b[t]?(t++,x=h(!0),K=h(!0,1,!0),n+=K[0]+" "+k+"<"+x.join(", ")+">"):n=k;a:for(;t<b.length&&0<g--;)if(k=b[t++],k in R)C.push(R[k]);else switch(k){case "P":C.push(h(!0,1,!0)[0]+"*");break;case "R":C.push(h(!0,1,!0)[0]+"&");break;case "L":t++;
x=b.indexOf("E",t)-t;C.push(b.substr(t,x));t+=x+2;break;case "A":x=parseInt(b.substr(t));t+=x.toString().length;if("_"!==b[t])throw"?";t++;C.push(h(!0,1,!0)[0]+" ["+x+"]");break;case "E":break a;default:n+="?"+k;break a}v||1!==C.length||"void"!==C[0]||(C=[]);return c?(n&&C.push(n+"?"),C):n+("("+C.join(", ")+")")}var g=!!c.___cxa_demangle;if(g)try{var v=nc(b.length);pc(b.substr(1),v);var C=nc(4),n=c.___cxa_demangle(v,0,0,C);if(0===Ai(C,"i32")&&n)return oc(n)}catch(Bi){}finally{v&&me(v),C&&me(C),n&&
me(n)}var t=3,R={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},z=[],E=!0,v=b;try{if("Object._main"==b||"_main"==b)return"main()";"number"===typeof b&&(b=oc(b));if("_"!==b[0]||"_"!==b[1]||"Z"!==b[2])return b;switch(b[3]){case "n":return"operator new()";case "d":return"operator delete()"}v=h()}catch(Bi){v+="?"}0<=v.indexOf("?")&&
!g&&k.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling");return v}function Hi(b){return b.replace(/__Z[\w\d_]+/g,function(b){var c=Gi(b);return b===c?b:b+" ["+c+"]"})}function Ii(){var b=Error();if(!b.stack){try{throw Error(0);}catch(h){b=h}if(!b.stack)return"(no stack trace available)"}return b.stack.toString()}function Nc(b){0<b%4096&&(b+=4096-b%4096);return b}function Ji(){var b=Math.pow(2,31);if(ha>=b)return!1;
for(;P<=ha;)if(P<b/2)P=Nc(2*P);else{var h=P;P=Nc((3*P+b)/4);if(P<=h)return!1}P=Math.max(P,16777216);if(P>=b)return!1;try{if(ArrayBuffer.transfer)z=ArrayBuffer.transfer(z,P);else{var g=ga;z=new ArrayBuffer(P)}}catch(v){return!1}if(!Ki(z))return!1;c.buffer=z;c.HEAP8=ga=new Int8Array(z);c.HEAP16=ma=new Int16Array(z);c.HEAP32=W=new Int32Array(z);c.HEAPU8=Ca=new Uint8Array(z);c.HEAPU16=Bc=new Uint16Array(z);c.HEAPU32=ne=new Uint32Array(z);c.HEAPF32=ca=new Float32Array(z);c.HEAPF64=Ac=new Float64Array(z);
ArrayBuffer.transfer||ga.set(g);return!0}function qc(b){for(;0<b.length;){var c=b.shift();if("function"==typeof c)c();else{var g=c.func;"number"===typeof g?void 0===c.arg?k.dynCall("v",g):k.dynCall("vi",g,[c.arg]):g(void 0===c.arg?null:c.arg)}}}function rc(b,c,g){if(!(0<g)){for(var h=g=0;h<b.length;++h){var C=b.charCodeAt(h);55296<=C&&57343>=C&&(C=65536+((C&1023)<<10)|b.charCodeAt(++h)&1023);127>=C?++g:g=2047>=C?g+2:65535>=C?g+3:2097151>=C?g+4:67108863>=C?g+5:g+6}g+=1}g=Array(g);var h=0,n=g.length;
if(0<n){for(var C=h,n=h+n-1,t=0;t<b.length;++t){var k=b.charCodeAt(t);55296<=k&&57343>=k&&(k=65536+((k&1023)<<10)|b.charCodeAt(++t)&1023);if(127>=k){if(h>=n)break;g[h++]=k}else{if(2047>=k){if(h+1>=n)break;g[h++]=192|k>>6}else{if(65535>=k){if(h+2>=n)break;g[h++]=224|k>>12}else{if(2097151>=k){if(h+3>=n)break;g[h++]=240|k>>18}else{if(67108863>=k){if(h+4>=n)break;g[h++]=248|k>>24}else{if(h+5>=n)break;g[h++]=252|k>>30;g[h++]=128|k>>24&63}g[h++]=128|k>>18&63}g[h++]=128|k>>12&63}g[h++]=128|k>>6&63}g[h++]=
128|k&63}}g[h]=0;b=h-C}else b=0;c&&(g.length=b);return g}function pc(b,c,g){b=rc(b,g);for(g=0;g<b.length;)ga[c+g>>0]=b[g],g+=1}function Oc(b){var c=Oc;c.called||(ha=Nc(ha),c.called=!0,c.alloc=k.dynamicAlloc,k.dynamicAlloc=function(){xb("cannot dynamically allocate, sbrk now has control")});var g=ha;return 0==b||c.alloc(b)?g:4294967295}function Yb(b){c.___errno_location&&(W[c.___errno_location()>>2]=b);return b}function Zb(b){this.name="ExitStatus";this.message="Program terminated with exit("+b+")";
this.status=b}function sc(b){function h(){if(!c.calledRun&&(c.calledRun=!0,!nd)){Sd||(Sd=!0,qc($b));qc(Li);if(c.onRuntimeInitialized)c.onRuntimeInitialized();c._main&&Td&&c.callMain(b);if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;)Cc.unshift(c.postRun.shift());qc(Cc)}}b=b||c.arguments;null===Jb&&(Jb=Date.now());if(!(0<Fd)){if(c.preRun)for("function"==typeof c.preRun&&(c.preRun=[c.preRun]);c.preRun.length;)tc.unshift(c.preRun.shift());qc(tc);0<Fd||c.calledRun||
(c.setStatus?(c.setStatus("Running..."),setTimeout(function(){setTimeout(function(){c.setStatus("")},1);h()},1)):h())}}function uc(b,h){if(!h||!c.noExitRuntime){if(!c.noExitRuntime&&(nd=!0,S=Mi,qc(Ni),c.onExit))c.onExit(b);Kb?(process.stdout.once("drain",function(){process.exit(b)}),console.log(" "),setTimeout(function(){process.exit(b)},500)):zf&&"function"===typeof quit&&quit(b);throw new Zb(b);}}function xb(b){void 0!==b?(c.print(b),c.printErr(b),b=JSON.stringify(b)):b="";nd=!0;var h="abort("+
b+") at "+Hi(Ii())+"\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";Gd&&Gd.forEach(function(c){h=c(h,b)});throw h;}var c={TOTAL_MEMORY:8388608,TOTAL_STACK:2097152,preRun:[],postRun:[],print:function(b){console.log(b)},printErr:function(b){b=Array.prototype.slice.call(arguments).join(" ");0<=b.indexOf("pre-main prep time")||console.error(b)}},Lb={},fa;for(fa in c)c.hasOwnProperty(fa)&&(Lb[fa]=c[fa]);var ac="object"===typeof window,ad="function"===typeof importScripts,
Kb="object"===typeof process&&"function"===typeof require&&!ac&&!ad,zf=!ac&&!Kb&&!ad;if(Kb){c.print||(c.print=function(b){process.stdout.write(b+"\n")});c.printErr||(c.printErr=function(b){process.stderr.write(b+"\n")});var Af=require("fs"),Hd=require("path");c.read=function(b,c){b=Hd.normalize(b);var h=Af.readFileSync(b);h||b==Hd.resolve(b)||(b=path.join(__dirname,"..","src",b),h=Af.readFileSync(b));h&&!c&&(h=h.toString());return h};c.readBinary=function(b){b=c.read(b,!0);b.buffer||(b=new Uint8Array(b));
return b};c.load=function(b){mc(read(b))};c.thisProgram||(c.thisProgram=1<process.argv.length?process.argv[1].replace(/\\/g,"/"):"unknown-program");c.arguments=process.argv.slice(2);"undefined"!==typeof module&&(module.exports=c);process.on("uncaughtException",function(b){if(!(b instanceof Zb))throw b;});c.inspect=function(){return"[Emscripten Module object]"}}else if(zf)c.print||(c.print=print),"undefined"!=typeof printErr&&(c.printErr=printErr),c.read="undefined"!=typeof read?read:function(){throw"no read() available (jsc?)";
},c.readBinary=function(b){return"function"===typeof readbuffer?new Uint8Array(readbuffer(b)):read(b,"binary")},"undefined"!=typeof scriptArgs?c.arguments=scriptArgs:"undefined"!=typeof arguments&&(c.arguments=arguments);else if(ac||ad)c.read=function(b){var c=new XMLHttpRequest;c.open("GET",b,!1);c.send(null);return c.responseText},"undefined"!=typeof arguments&&(c.arguments=arguments),"undefined"!==typeof console?(c.print||(c.print=function(b){console.log(b)}),c.printErr||(c.printErr=function(b){console.log(b)})):
c.print||(c.print=function(b){}),ad&&(c.load=importScripts),"undefined"===typeof c.setWindowTitle&&(c.setWindowTitle=function(b){document.title=b});else throw"Unknown runtime environment. Where are we?";!c.load&&c.read&&(c.load=function(b){mc(c.read(b))});c.print||(c.print=function(){});c.printErr||(c.printErr=c.print);c.arguments||(c.arguments=[]);c.thisProgram||(c.thisProgram="./this.program");c.print=c.print;c.printErr=c.printErr;c.preRun=[];c.postRun=[];for(fa in Lb)Lb.hasOwnProperty(fa)&&(c[fa]=
Lb[fa]);var k={setTempRet0:function(b){vc=b},getTempRet0:function(){return vc},stackSave:function(){return S},stackRestore:function(b){S=b},getNativeTypeSize:function(b){switch(b){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;default:return"*"===b[b.length-1]?k.QUANTUM_SIZE:"i"===b[0]?parseInt(b.substr(1))/8:0}},getNativeFieldSize:function(b){return Math.max(k.getNativeTypeSize(b),k.QUANTUM_SIZE)},STACK_ALIGN:16,
prepVararg:function(b,c){("double"===c||"i64"===c)&&b&7&&(b+=4);return b},getAlignSize:function(b,c,g){return g||"i64"!=b&&"double"!=b?b?Math.min(c||(b?k.getNativeFieldSize(b):0),k.QUANTUM_SIZE):Math.min(c,8):8},dynCall:function(b,h,g){return g&&g.length?(g.splice||(g=Array.prototype.slice.call(g)),g.splice(0,0,h),c["dynCall_"+b].apply(null,g)):c["dynCall_"+b].call(null,h)},functionPointers:[],addFunction:function(b){for(var c=0;c<k.functionPointers.length;c++)if(!k.functionPointers[c])return k.functionPointers[c]=
b,2*(1+c);throw"Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.";},removeFunction:function(b){k.functionPointers[(b-2)/2]=null},warnOnce:function(b){k.warnOnce.shown||(k.warnOnce.shown={});k.warnOnce.shown[b]||(k.warnOnce.shown[b]=1,c.printErr(b))},funcWrappers:{},getFuncWrapper:function(b,c){k.funcWrappers[c]||(k.funcWrappers[c]={});var h=k.funcWrappers[c];h[b]||(h[b]=function(){return k.dynCall(c,b,arguments)});return h[b]},getCompilerSetting:function(b){throw"You must build with -s RETAIN_COMPILER_SETTINGS=1 for Runtime.getCompilerSetting or emscripten_get_compiler_setting to work";
},stackAlloc:function(b){var c=S;S=S+b|0;S=S+15&-16;return c},staticAlloc:function(b){var c=Fa;Fa=Fa+b|0;Fa=Fa+15&-16;return c},dynamicAlloc:function(b){var c=ha;ha=ha+b|0;ha=ha+15&-16;return ha>=P&&!Ji()?(ha=c,0):c},alignMemory:function(b,c){return Math.ceil(b/(c?c:16))*(c?c:16)},makeBigInt:function(b,c,g){return g?+(b>>>0)+4294967296*+(c>>>0):+(b>>>0)+4294967296*+(c|0)},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0},nd=!1,Xb,Wb,vc,Dc;(function(){function b(b){b=b.toString().match(v).slice(1);return{arguments:b[0],
body:b[1],returnValue:b[2]}}var c={stackSave:function(){k.stackSave()},stackRestore:function(){k.stackRestore()},arrayToC:function(b){for(var c=k.stackAlloc(b.length),g=c,h=0;h<b.length;h++)ga[g++>>0]=b[h];return c},stringToC:function(b){var c=0;null!==b&&void 0!==b&&0!==b&&(c=k.stackAlloc((b.length<<2)+1),pc(b,c));return c}},g={string:c.stringToC,array:c.arrayToC};Dc=function(b,c,h,v,C){b=zi(b);var t=[],n=0;if(v)for(var x=0;x<v.length;x++){var z=g[h[x]];z?(0===n&&(n=k.stackSave()),t[x]=z(v[x])):
t[x]=v[x]}h=b.apply(null,t);"string"===c&&(h=oc(h));if(0!==n){if(C&&C.async){EmterpreterAsync.asyncFinalizers.push(function(){k.stackRestore(n)});return}k.stackRestore(n)}return h};var v=/^function\s*\(([^)]*)\)\s*{\s*([^*]*?)[\s;]*(?:return\s*(.*?)[;\s]*)?}$/,C;for(C in c)c.hasOwnProperty(C)&&b(c[C])})();c.ccall=Dc;c.UTF16ToString=function(b){for(var c=0,g="";;){var k=ma[b+2*c>>1];if(0==k)return g;++c;g+=String.fromCharCode(k)}};c.stringToUTF16=function(b,c,g){void 0===g&&(g=2147483647);if(2>g)return 0;
g-=2;var h=c;g=g<2*b.length?g/2:b.length;for(var k=0;k<g;++k){var n=b.charCodeAt(k);ma[c>>1]=n;c+=2}ma[c>>1]=0;return c-h};var ga,Ca,ma,Bc,W,ne,ca,Ac,Fa=0,S=fa=0,ha=fa=0,bd;try{bd=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get),bd(new ArrayBuffer(4))}catch(b){bd=function(b){return b.byteLength}}for(var ac=c.TOTAL_STACK||5242880,P=c.TOTAL_MEMORY||16777216,ta=65536;ta<P||ta<2*ac;)ta=16777216>ta?2*ta:ta+16777216;ta=Math.max(ta,16777216);ta!==P&&(P=
ta);var z;z=new ArrayBuffer(P);ga=new Int8Array(z);ma=new Int16Array(z);W=new Int32Array(z);Ca=new Uint8Array(z);Bc=new Uint16Array(z);ne=new Uint32Array(z);ca=new Float32Array(z);Ac=new Float64Array(z);W[0]=255;c.HEAP=void 0;c.buffer=z;c.HEAP8=ga;c.HEAP16=ma;c.HEAP32=W;c.HEAPU8=Ca;c.HEAPU16=Bc;c.HEAPU32=ne;c.HEAPF32=ca;c.HEAPF64=Ac;var tc=[],$b=[],Li=[],Ni=[],Cc=[],Sd=!1;Math.imul&&-5===Math.imul(4294967295,5)||(Math.imul=function(b,c){var g=b&65535,h=c&65535;return g*h+((b>>>16)*h+g*(c>>>16)<<16)|
0});Math.imul=Math.imul;Math.clz32||(Math.clz32=function(b){b>>>=0;for(var c=0;32>c;c++)if(b&1<<31-c)return c;return 32});Math.clz32=Math.clz32;var Ci=Math.abs,Fi=Math.ceil,Ei=Math.floor,Di=Math.min,Fd=0;c.preloadedImages={};c.preloadedAudios={};Fa=69208;$b.push();aa([24,2,0,0,152,13,1,0,64,2,0,0,165,13,1,0,8,0,0,0,0,0,0,0,64,2,0,0,198,13,1,0,16,0,0,0,0,0,0,0,64,2,0,0,12,14,1,0,16,0,0,0,0,0,0,0,64,2,0,0,232,13,1,0,48,0,0,0,0,0,0,0,64,2,0,0,46,14,1,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,
0,0,16,0,0,0,128,0,0,0,8,0,0,0,64,0,0,141,7,1,0,173,8,1,0,23,7,1,0,23,7,1,0,183,6,1,0,173,8,1,0,23,7,1,0,23,7,1,0,85,8,1,0,133,8,1,0,23,7,1,0,23,7,1,0,245,7,1,0,37,8,1,0,23,7,1,0,23,7,1,0,189,7,1,0,72,7,1,0,128,7,1,0,135,7,1,0,141,7,1,0,223,6,1,0,23,7,1,0,28,7,1,0,32,7,1,0,72,7,1,0,128,7,1,0,135,7,1,0,183,6,1,0,223,6,1,0,23,7,1,0,28,7,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,104,1,0,0,168,1,0,0,200,10,1,0,104,13,1,0,182,170,0,0,6,198,0,0,0,0,0,0,168,13,0,0,140,31,0,0,160,1,40,14,
0,0,0,0,0,0,0,0,0,0,17,0,48,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,16,0,0,0,240,93,0,0,120,90,0,0,26,0,0,0,32,6,0,0,192,8,0,0,192,10,1,0,240,10,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,2,88,0,171,0,32,0,187,0,0,0,21,34,160,2,67,34,32,1,152,34,128,2,166,34,192,2,168,34,0,3,169,34,224,2,171,34,32,3,205,34,96,0,242,34,224,1,243,34,0,2,244,34,32,2,246,34,64,2,247,34,96,2,250,34,64,1,251,34,96,1,252,34,128,1,253,34,160,1,254,34,192,1,184,41,128,0,245,41,64,0,222,42,160,0,
227,42,224,0,228,42,192,0,229,42,0,1,0,0,0,0,32,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,80,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,6,113,6,123,6,123,6,123,6,123,6,126,6,126,6,126,6,126,6,0,0,0,0,0,0,0,0,122,6,122,6,122,6,122,6,0,0,0,0,0,0,0,0,121,6,121,6,121,6,121,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134,6,134,6,134,
6,134,6,0,0,0,0,0,0,0,0,141,6,141,6,140,6,140,6,142,6,142,6,136,6,136,6,152,6,152,6,145,6,145,6,169,6,169,6,169,6,169,6,175,6,175,6,175,6,175,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,186,6,186,6,187,6,187,6,187,6,187,6,192,6,192,6,193,6,193,6,193,6,193,6,190,6,190,6,190,6,190,6,210,6,210,6,211,6,211,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199,6,199,6,198,6,198,6,200,6,200,6,0,0,203,6,203,6,197,6,
197,6,201,6,201,6,208,6,208,6,208,6,208,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,204,6,204,6,204,6,204,6,75,6,75,6,76,6,76,6,77,6,77,6,78,6,78,6,79,6,79,6,80,6,80,6,81,6,81,6,82,6,82,6,33,6,34,6,34,6,35,6,35,6,36,6,36,6,37,6,37,6,38,6,38,6,38,6,38,6,39,6,39,6,40,6,40,6,40,6,40,6,41,6,41,6,42,6,42,6,42,6,42,6,43,6,43,6,43,6,43,6,44,6,44,6,44,6,44,6,45,6,45,6,45,6,45,6,46,6,46,6,46,6,46,6,47,6,47,6,48,6,48,6,49,6,49,6,50,6,50,6,51,6,51,6,51,6,51,6,52,6,52,6,
52,6,52,6,53,6,53,6,53,6,53,6,54,6,54,6,54,6,54,6,55,6,55,6,55,6,55,6,56,6,56,6,56,6,56,6,57,6,57,6,57,6,57,6,58,6,58,6,58,6,58,6,65,6,65,6,65,6,65,6,66,6,66,6,66,6,66,6,67,6,67,6,67,6,67,6,68,6,68,6,68,6,68,6,69,6,69,6,69,6,69,6,70,6,70,6,70,6,70,6,71,6,71,6,71,6,71,6,72,6,72,6,73,6,73,6,74,6,74,6,74,6,74,6,92,6,92,6,93,6,93,6,94,6,94,6,95,6,95,6,33,17,33,19,1,21,33,23,3,25,33,29,3,31,1,35,3,37,3,41,3,45,3,49,3,53,1,57,1,59,1,61,1,63,3,65,3,69,3,73,3,77,3,81,3,85,3,89,3,93,0,0,0,0,0,0,0,0,0,0,3,
0,3,97,3,101,3,105,19,109,3,113,3,117,3,121,1,125,1,127,3,129,4,1,132,1,132,1,132,1,132,1,132,1,68,3,4,1,4,7,4,8,4,8,4,1,0,0,0,0,0,0,0,0,0,0,1,133,1,135,1,137,1,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,6,9,0,33,0,33,0,0,0,33,0,1,0,1,0,3,0,11,22,11,14,11,2,3,0,3,0,11,6,3,0,3,0,3,0,3,0,3,0,3,0,3,0,11,42,3,0,9,56,1,0,1,0,1,0,9,52,9,50,9,54,1,0,1,0,9,60,1,0,1,0,1,0,1,0,1,0,1,0,9,58,1,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,11,62,3,0,3,0,3,0,3,0,3,0,11,
66,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,9,78,11,80,3,0,3,0,11,90,3,0,9,84,11,86,1,0,1,0,1,0,9,144,9,137,9,135,9,139,9,146,1,0,9,142,11,172,1,0,3,0,3,0,11,148,3,0,9,94,9,96,78,4,86,4,94,4,102,4,126,4,134,4,142,4,150,4,158,4,166,4,172,4,180,4,188,4,196,4,204,4,212,4,218,4,226,4,234,4,242,4,245,4,253,4,5,5,13,5,21,5,29,5,25,5,33,5,41,5,49,5,54,5,62,5,70,5,78,5,82,5,90,5,98,5,106,5,114,5,122,5,118,5,126,5,131,5,139,5,145,5,153,5,161,5,169,5,177,5,185,5,193,5,201,5,206,5,214,5,217,5,225,5,233,5,241,
5,247,5,255,5,254,5,6,6,14,6,22,6,38,6,30,6,46,6,110,4,110,4,62,6,70,6,54,6,86,6,88,6,96,6,78,6,112,6,118,6,126,6,104,6,142,6,148,6,156,6,134,6,172,6,178,6,186,6,164,6,202,6,208,6,216,6,194,6,232,6,240,6,248,6,224,6,8,7,14,7,22,7,0,7,38,7,44,7,52,7,30,7,68,7,73,7,81,7,60,7,97,7,104,7,112,7,89,7,250,5,120,7,128,7,110,4,136,7,144,7,152,7,110,4,160,7,168,7,176,7,181,7,189,7,196,7,204,7,110,4,185,5,212,7,220,7,228,7,236,7,70,5,252,7,244,7,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,2,
8,185,5,10,8,0,8,18,8,185,5,14,8,185,5,24,8,32,8,40,8,70,5,70,5,48,8,56,8,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,61,8,69,8,185,5,185,5,77,8,85,8,93,8,101,8,109,8,185,5,117,8,125,8,133,8,149,8,185,5,157,8,159,8,167,8,141,8,185,5,170,8,190,8,178,8,186,8,198,8,185,5,206,8,212,8,220,8,228,8,185,5,244,8,252,8,4,9,236,8,110,4,110,4,20,9,23,9,31,9,12,9,47,9,39,9,185,5,54,9,185,5,69,9,62,9,77,9,85,9,110,4,93,9,101,9,238,4,109,9,112,9,118,
9,125,9,112,9,21,5,133,9,158,4,158,4,158,4,158,4,141,9,158,4,158,4,158,4,157,9,165,9,173,9,181,9,189,9,193,9,201,9,149,9,225,9,233,9,209,9,217,9,241,9,249,9,1,10,9,10,33,10,17,10,25,10,41,10,49,10,64,10,69,10,56,10,77,10,77,10,77,10,77,10,77,10,77,10,77,10,77,10,85,10,93,10,220,8,96,10,104,10,111,10,116,10,124,10,220,8,130,10,129,10,146,10,149,10,220,8,220,8,138,10,220,8,220,8,220,8,220,8,220,8,164,10,172,10,156,10,220,8,220,8,220,8,177,10,220,8,220,8,220,8,220,8,220,8,220,8,220,8,183,10,191,10,220,
8,199,10,206,10,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,77,10,77,10,77,10,77,10,214,10,77,10,221,10,228,10,77,10,77,10,77,10,77,10,77,10,77,10,77,10,77,10,220,8,236,10,243,10,247,10,253,10,3,11,11,11,16,11,70,5,32,11,24,11,40,11,158,4,158,4,158,4,48,11,238,4,56,11,185,5,62,11,78,11,70,11,70,11,21,5,86,11,94,11,102,11,110,4,110,11,220,8,220,8,117,11,220,8,220,8,220,8,220,8,220,8,220,8,125,11,131,11,147,11,139,11,250,5,185,5,155,11,56,8,185,5,163,11,171,11,176,11,185,5,185,5,181,11,165,5,220,
8,188,11,196,11,204,11,210,11,220,8,204,11,218,11,220,8,196,11,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,226,11,185,5,185,5,185,5,234,11,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,240,11,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,245,11,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,170,8,220,8,220,8,253,11,185,5,0,12,185,5,8,12,14,12,22,12,30,12,35,12,185,5,185,5,39,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,46,
12,185,5,53,12,59,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,67,12,185,5,185,5,185,5,75,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,77,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,84,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,91,12,185,5,185,5,185,5,98,12,106,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,111,12,185,5,185,5,119,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,123,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,126,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,129,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,135,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,143,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,148,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,153,12,185,5,185,5,185,5,158,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,166,12,173,12,177,12,185,5,185,5,185,5,184,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,170,8,110,4,198,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,190,12,220,8,206,12,77,9,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,211,12,219,12,158,4,235,12,227,12,185,5,185,5,243,12,251,12,11,13,158,4,16,13,24,13,30,13,110,4,3,13,38,13,46,13,185,5,54,13,70,13,73,13,62,13,81,13,14,6,89,13,96,13,104,13,86,6,120,13,112,13,128,13,185,5,136,13,144,13,152,13,185,5,160,13,168,13,176,13,184,13,192,13,196,13,204,13,238,4,238,4,185,5,212,13,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,220,13,227,13,158,8,110,4,110,4,110,4,
110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,
243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,
13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,
13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,185,5,185,5,185,5,251,13,185,5,185,12,2,14,7,14,185,5,185,5,185,5,15,14,185,5,185,5,169,8,110,4,37,14,21,14,29,14,185,5,185,5,45,14,53,14,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,58,14,66,14,185,
5,70,14,185,5,76,14,80,14,88,14,96,14,103,14,111,14,185,5,185,5,185,5,117,14,141,14,94,4,149,14,157,14,162,14,190,8,125,14,133,14,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,235,13,184,17,184,17,248,17,56,18,120,18,176,18,240,18,48,19,104,19,168,19,212,19,20,20,84,20,100,20,164,20,216,20,24,21,72,21,136,21,200,21,216,21,12,22,
68,22,132,22,196,22,4,23,56,23,100,23,164,23,220,23,248,23,56,24,128,10,192,10,0,11,59,11,123,11,64,10,187,11,64,10,221,11,64,10,64,10,64,10,64,10,29,12,219,1,219,1,93,12,157,12,64,10,64,10,64,10,64,10,221,12,253,12,64,10,64,10,61,13,125,13,189,13,253,13,61,14,125,14,189,14,244,14,219,1,219,1,24,15,76,15,219,1,116,15,219,1,219,1,219,1,219,1,161,15,219,1,219,1,219,1,219,1,219,1,219,1,219,1,181,15,219,1,237,15,45,16,219,1,56,16,64,10,64,10,64,10,64,10,64,10,120,16,64,10,64,10,64,10,64,10,64,10,64,10,
64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,
10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,
64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,
10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,
64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,184,16,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,64,10,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,248,16,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,7,0,
7,0,7,0,7,0,7,0,7,248,16,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,170,14,177,14,185,14,110,4,185,5,185,5,185,5,165,5,201,14,193,14,224,14,209,14,216,14,232,14,
106,11,240,14,110,4,110,4,110,4,110,4,104,13,185,5,248,14,0,15,185,5,8,15,16,15,20,15,28,15,185,5,36,15,110,4,70,5,80,5,44,15,185,5,48,15,56,15,72,15,64,15,185,5,80,15,185,5,87,15,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,78,11,170,8,76,14,110,4,110,4,110,4,110,4,103,15,95,15,106,15,114,15,190,8,122,15,110,4,130,15,138,15,146,15,110,4,110,4,185,5,162,15,170,15,154,15,186,15,193,15,178,15,201,15,209,15,110,4,225,15,217,15,185,5,228,15,236,15,244,15,252,15,4,16,110,
4,110,4,185,5,185,5,12,16,110,4,70,5,20,16,238,4,28,16,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,36,16,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,52,16,239,5,60,16,44,16,47,9,68,16,76,16,82,16,106,16,90,16,98,16,110,16,47,9,126,16,118,16,134,16,150,16,142,16,110,4,110,4,157,16,165,16,17,6,173,16,189,16,178,6,197,16,181,16,110,4,110,4,110,4,110,4,185,5,205,16,213,16,110,4,185,5,221,16,229,16,110,4,110,4,110,4,110,4,110,4,185,5,237,16,245,16,110,
4,185,5,253,16,5,17,13,17,185,5,29,17,21,17,110,4,45,17,37,17,110,4,110,4,110,4,110,4,110,4,110,4,70,5,238,4,53,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,61,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,83,17,88,17,69,17,77,17,104,17,96,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,169,8,110,4,110,4,110,4,120,17,128,17,136,17,112,17,185,5,185,5,185,5,185,5,185,5,185,5,144,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,152,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,154,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,61,17,190,8,162,17,110,4,110,4,66,14,170,17,185,5,186,17,194,17,202,17,178,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,210,17,215,17,223,17,110,4,110,4,231,17,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,239,17,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,247,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,
4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,255,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,7,18,12,18,20,18,110,
4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,220,8,220,8,220,8,220,8,220,8,220,8,220,8,125,11,220,8,28,18,220,8,35,18,43,18,49,18,220,8,55,18,220,8,220,8,63,18,110,4,110,4,110,4,110,4,110,4,220,8,220,8,126,10,71,18,110,4,110,4,110,4,110,4,87,18,94,18,99,18,105,18,113,18,121,18,129,18,91,18,137,18,145,18,153,18,158,18,112,18,87,18,94,18,90,18,105,18,166,18,88,18,169,18,91,18,177,18,185,18,193,
18,200,18,180,18,188,18,196,18,203,18,183,18,211,18,79,18,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,21,5,227,18,21,5,234,18,241,18,219,18,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,248,18,0,19,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,
4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,185,5,185,5,8,19,110,4,70,5,24,19,16,19,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,
4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,40,19,48,19,56,19,64,19,72,19,80,19,110,4,32,19,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,220,8,88,19,220,8,220,8,117,11,93,19,97,19,125,11,105,19,110,19,220,8,88,19,220,8,54,18,110,4,118,19,126,19,130,19,138,19,110,4,110,4,110,4,110,4,110,4,220,8,220,8,220,8,220,8,220,8,220,8,220,8,146,19,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,8,220,
8,220,8,220,8,220,8,220,8,220,8,220,8,127,10,154,19,220,8,220,8,220,8,117,11,220,8,220,8,162,19,110,4,88,19,220,8,170,19,220,8,178,19,127,11,110,4,110,4,186,19,194,19,202,19,110,4,126,11,110,4,232,14,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,210,19,
185,5,185,5,217,19,185,5,185,5,185,5,225,19,185,5,233,19,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,95,12,185,5,185,5,241,19,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,249,19,1,20,185,5,185,5,185,5,185,5,
185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,158,12,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,8,20,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,15,20,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,22,20,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5],"i8",4,k.GLOBAL_BASE);aa([185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,78,11,110,4,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,26,20,185,5,185,5,185,5,185,5,185,5,185,5,48,15,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,
5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,255,17,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,185,5,185,5,185,5,185,5,34,20,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,185,5,48,15,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,
110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,50,20,42,20,42,20,42,20,110,4,110,4,110,4,110,4,21,5,21,5,21,5,21,5,21,5,21,5,21,5,58,20,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,110,4,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,
243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,243,13,66,20,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,
15,0,15,0,15,0,15,0,15,0,15,0,15,0,12,0,23,0,23,0,23,0,25,0,23,0,23,0,23,0,20,0,21,0,23,0,24,0,23,0,19,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,24,0,24,0,24,0,23,0,23,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,20,0,23,0,21,0,26,0,22,0,26,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,20,0,24,0,21,0,24,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,15,0,12,0,23,0,25,0,25,0,25,0,25,0,27,0,23,0,26,0,27,0,5,0,28,0,24,0,16,0,27,0,26,0,27,0,24,0,75,3,139,3,26,0,2,0,23,0,23,0,26,
0,11,3,5,0,29,0,203,52,75,52,203,60,23,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,24,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,
0,2,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,1,0,1,0,2,0,2,0,1,0,1,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,1,0,1,0,2,0,2,0,2,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,1,0,1,0,2,0,1,0,2,0,1,0,
1,0,2,0,2,0,5,0,1,0,2,0,2,0,2,0,5,0,5,0,5,0,5,0,1,0,3,0,2,0,1,0,3,0,2,0,1,0,3,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,1,0,3,0,2,0,1,0,2,0,1,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,2,0,1,
0,1,0,2,0,2,0,1,0,2,0,1,0,1,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,5,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,26,0,26,0,26,0,26,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,
4,0,4,0,4,0,4,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,4,0,4,0,4,0,4,0,4,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,4,0,26,0,4,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,1,0,2,
0,1,0,2,0,4,0,26,0,1,0,2,0,0,0,0,0,4,0,2,0,2,0,2,0,23,0,1,0,0,0,0,0,0,0,0,0,26,0,26,0,1,0,23,0,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,2,0,1,0,1,0,1,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,24,0,1,0,2,0,1,
0,1,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,27,0,6,0,6,0,6,0,6,
0,6,0,7,0,7,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,0,0,1,0,1,0,1,0,
1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,4,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,23,0,19,0,0,0,0,0,27,0,27,0,25,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,19,0,6,0,23,0,6,0,
6,0,23,0,6,0,6,0,23,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,16,0,16,0,16,0,16,0,24,0,24,0,24,0,23,0,23,0,25,0,23,0,23,0,27,0,27,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,16,0,0,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,23,0,23,0,5,0,5,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,23,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,16,0,27,0,6,0,6,0,6,0,6,0,6,0,6,0,4,0,4,0,6,0,6,0,27,0,6,0,6,0,6,0,6,0,5,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,27,0,27,0,5,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,16,0,5,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,
0,6,0,6,0,6,0,6,0,6,0,6,0,4,0,4,0,27,0,23,0,23,0,23,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,4,0,6,0,6,0,6,0,4,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,4,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,0,0,0,0,23,0,0,0,6,0,6,0,16,0,6,0,6,0,6,
0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,6,0,6,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,6,0,6,0,6,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,6,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,8,0,8,0,6,0,8,0,8,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,25,0,25,0,203,55,203,53,203,63,203,52,203,60,75,9,27,0,25,0,0,0,0,0,0,0,0,0,5,0,6,0,8,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,0,0,0,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,0,0,0,0,8,0,8,0,0,0,0,0,8,0,8,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,6,0,6,0,5,0,5,0,5,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,
0,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,0,0,0,0,6,0,0,0,8,0,8,0,8,0,6,0,6,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,
0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,8,0,0,0,8,0,8,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,27,0,5,0,203,52,75,52,203,60,203,55,203,53,203,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,8,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
0,0,0,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,5,0,8,0,6,0,8,0,6,0,6,0,6,0,6,0,0,0,0,0,8,0,8,0,0,0,0,0,8,0,8,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,8,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,203,7,75,30,75,120,27,0,27,0,27,0,27,0,27,0,27,0,25,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,
0,0,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,8,0,8,0,6,0,8,0,8,0,0,0,0,0,0,0,8,0,8,0,8,0,0,0,8,0,8,0,8,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,5,139,5,203,5,11,6,139,5,203,5,11,6,27,0,6,0,8,0,8,
0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,5,0,6,0,6,0,6,0,8,0,8,0,8,0,8,0,0,0,6,0,6,0,6,0,0,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,0,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,8,0,8,0,0,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,5,0,8,0,6,0,8,0,8,0,8,0,8,0,8,0,0,0,6,0,8,0,8,0,0,0,8,0,8,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,5,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,203,7,75,30,75,120,203,52,75,52,203,60,203,55,203,53,203,63,27,0,5,0,5,0,5,0,5,0,5,0,5,0,0,
0,6,0,8,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,0,0,8,0,8,0,8,0,0,0,8,0,8,0,8,0,6,0,5,0,27,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,8,0,11,204,11,202,75,203,11,201,75,54,75,201,11,53,5,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,8,0,8,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,8,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,8,0,8,0,8,0,6,0,6,0,6,0,0,0,6,0,0,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,25,0,5,0,5,0,5,
0,5,0,5,0,5,0,4,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,0,0,0,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,6,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,4,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,
137,2,0,0,0,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,27,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,27,0,23,0,27,0,27,0,27,0,6,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,75,52,75,60,75,68,75,76,75,84,75,92,75,100,75,108,75,116,75,44,27,0,6,0,27,0,6,0,27,0,6,0,20,0,21,0,20,0,21,0,8,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,
0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,23,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,23,0,23,0,23,0,23,0,23,0,27,0,27,0,27,0,27,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,8,0,8,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,8,0,8,0,6,0,6,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,23,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,6,0,6,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,5,0,8,0,8,0,8,0,5,0,5,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,8,0,6,0,6,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,5,0,8,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,8,0,8,0,8,0,6,0,27,0,27,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,4,0,5,0,5,0,5,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,
0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,6,0,6,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,139,120,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,
0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,19,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,12,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,20,0,21,0,0,0,0,0,0,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,138,9,202,9,10,10,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,23,0,23,0,4,0,23,0,23,0,23,0,25,0,5,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,75,5,139,5,203,5,11,6,75,
6,139,6,203,6,11,7,75,7,139,7,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,23,0,23,0,23,0,19,0,23,0,23,0,23,0,23,0,6,0,6,0,6,0,16,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,
0,5,0,5,0,5,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,8,0,8,0,8,0,8,0,6,0,6,0,8,0,8,0,8,0,0,0,0,0,0,0,0,0,8,0,8,0,6,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,11,3,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,
27,0,27,0,27,0,27,0,27,0,27,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,8,0,8,0,6,0,0,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,4,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,7,0,0,0,5,0,5,0,5,0,5,0,5],"i8",4,k.GLOBAL_BASE+10240);aa([5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,8,0,6,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,
0,6,0,6,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,6,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,23,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,8,0,8,0,8,0,8,0,8,0,6,0,8,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,23,0,23,0,23,0,23,0,5,0,8,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,6,0,8,0,6,0,6,0,6,0,5,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,6,0,6,0,
8,0,8,0,8,0,6,0,8,0,6,0,6,0,6,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,5,0,5,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,6,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,4,0,4,0,4,0,4,0,4,0,23,0,23,0,2,0,2,0,
2,0,2,0,2,0,2,0,2,0,2,0,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,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,23,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,6,0,5,0,5,0,5,0,5,0,8,0,8,0,6,0,5,0,5,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,
4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,4,0,4,0,4,0,4,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,2,
0,2,0,2,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,26,0,26,0,26,0,0,0,0,0,2,0,2,0,2,0,0,0,2,0,2,0,1,0,1,0,1,0,1,0,3,0,26,0,26,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,
0,2,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,3,0,2,0,2,0,2,0,2,0,2,0,0,0,2,0,2,0,1,0,1,0,1,0,1,0,3,0,26,0,2,0,26,0,26,0,26,0,2,0,2,0,2,0,0,0,2,0,2,0,1,0,1,0,1,0,1,0,3,0,26,0,26,0,26,0,2,0,2,0,2,0,2,0,0,0,0,0,2,0,2,0,1,0,1,0,1,0,1,0,0,0,26,0,26,0,26,0,22,0,
23,0,23,0,23,0,24,0,20,0,21,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,24,0,23,0,22,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,12,0,16,0,16,0,16,0,16,0,16,0,0,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,203,2,4,0,0,0,0,0,203,3,11,4,75,4,139,4,203,4,11,5,24,0,24,0,24,0,20,0,21,0,4,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,12,0,16,0,16,0,16,0,16,0,16,0,19,0,19,0,19,0,19,0,19,0,19,0,23,0,23,0,28,0,29,0,20,0,28,0,28,0,29,0,20,0,28,0,23,0,23,0,23,0,23,0,23,0,23,
0,23,0,23,0,13,0,14,0,16,0,16,0,16,0,16,0,16,0,12,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,28,0,29,0,23,0,23,0,23,0,23,0,22,0,203,2,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,24,0,24,0,24,0,20,0,21,0,0,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,0,0,0,0,0,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,7,0,7,0,7,0,7,0,6,0,7,0,7,0,7,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,1,0,27,0,1,0,27,0,1,0,27,0,1,0,1,0,1,0,1,0,27,0,2,0,1,0,1,0,1,0,1,0,2,0,5,0,5,0,5,0,5,0,2,0,27,0,27,0,2,0,2,0,1,0,1,0,24,0,24,0,24,0,24,0,24,0,1,0,2,0,2,0,2,0,2,0,27,0,24,0,27,0,27,0,2,0,27,0,139,53,11,54,75,54,139,52,139,56,11,53,11,57,11,61,11,65,75,53,75,69,203,53,203,61,203,69,203,77,
139,5,27,0,27,0,1,0,27,0,27,0,27,0,27,0,1,0,27,0,27,0,2,0,1,0,1,0,1,0,2,0,2,0,1,0,1,0,1,0,2,0,27,0,1,0,27,0,27,0,24,0,1,0,1,0,1,0,1,0,1,0,27,0,27,0,138,5,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,202,7,10,8,74,8,202,17,74,30,10,152,74,120,138,5,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,202,7,10,8,74,8,202,17,74,30,10,152,74,120,74,120,74,152,138,120,1,0,2,0,202,6,202,17,138,152,202,120,75,5,27,0,27,0,0,0,0,0,0,0,0,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,24,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,27,0,27,0,24,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,
24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,20,0,21,0,20,0,21,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,20,0,21,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,203,2,11,8,75,8,139,8,203,8,11,9,75,9,139,9,203,9,11,10,75,10,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,203,2,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,11,8,75,8,139,8,203,8,11,9,75,9,139,9,203,9,11,10,75,10,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,11,8,75,8,139,8,203,8,11,9,75,9,139,9,203,9,11,10,75,10,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,27,0,27,0,27,0,27,0,
27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,20,0,21,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,
0,24,0,24,0,24,0,24,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,20,0,21,0,20,0,21,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,
24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,20,0,21,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,24,0,24,0,24,0,24,0,24,0,24,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,
0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,1,0,1,0,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,1,0,1,0,2,0,1,0,2,0,2,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,4,0,4,0,1,0,1,0,1,0,2,0,1,0,2,0,2,0,27,0,27,0,27,0,27,0,27,0,27,0,1,0,2,0,1,0,2,0,6,0,6,0,6,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,75,52,23,0,23,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,2,0,0,0,0,0,0,0,0,
0,0,0,2,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,28,0,29,0,28,0,29,0,23,0,23,0,23,0,28,0,29,0,23,0,28,0,29,
0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,19,0,23,0,23,0,19,0,23,0,28,0,29,0,23,0,23,0,28,0,29,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,23,0,23,0,23,0,23,0,23,0,4,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,19,0,19,0,23,0,23,0,23,0,23,0,19,0,23,0,20,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,27,0,138,5,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,6,0,6,0,6,0,6,0,8,0,
8,0,19,0,4,0,4,0,4,0,4,0,4,0,27,0,27,0,202,7,74,10,202,12,4,0,5,0,23,0,27,0,27,0,12,0,23,0,23,0,23,0,27,0,4,0,5,0,74,5,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,27,0,27,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,19,0,20,0,21,0,21,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,6,0,26,0,26,0,4,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,4,0,4,0,4,0,5,0,0,0,
0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,27,0,27,0,139,5,203,5,11,6,75,6,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,27,0,139,10,203,10,11,11,75,11,139,11,203,11,11,12,75,12,139,12,203,12,11,13,75,13,139,13,203,13,11,14,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,75,14,139,14,203,14,11,15,
75,15,139,15,203,15,11,16,75,16,139,16,203,16,11,17,75,17,139,17,203,17,5,0,5,0,5,0,5,0,5,0,133,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,133,5,5,0,5,0,5,7,5,0,5,0,5,0,133,120,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,6,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,121,197,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,30,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,121,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,122,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,5,5,0,69,7,5,0,197,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,7,5,0,69,120,69,10,197,12,5,0,5,0,5,0,5,0,5,0,5,0,69,15,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,6,5,6,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,133,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,7,69,10,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,5,197,5,5,6,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,197,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,30,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,6,5,0,5,0,5,0,5,0,5,0,69,30,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,4,0,4,0,6,0,6,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,5,0,6,
0,7,0,7,0,7,0,23,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,138,5,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,74,5,6,0,6,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,4,0,2,0,5,0,5,0,5,0,5,0,5,0,26,0,
26,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,4,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,4,0,26,0,26,0,1,0,2,0,1,0,2,0,5,0,1,0,2,0,1,0,2,0,2,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,2,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,2,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,6,0,5,0,5,0,5,0,6,0,5,0,5,0,5,0,5,0,6,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,6,0,6,0,8,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,203,52,75,52,203,60,203,55,203,53,203,63,27,0,27,0,25,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,8,0,8,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,5,0,23,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,8,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,4,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,8,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,8,0,8,0,8,0,5,0,5,0,5,0,5,0,5,0,6,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,6,0,8,0,8,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,23,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,27,0,5,0,8,0,6,0,8,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,5,0,6,0,6,0,6,0,5,0,5,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,5,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,4,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,6,0,6,0,8,0,8,0,23,0,23,0,5,0,4,0,4,0,8,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,26,0,4,0,4,0,4,0,4,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,5,0,5,0,5,0,8,0,8,0,6,0,8,0,8,0,6,0,8,0,8,0,23,0,8,0,6,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17],"i8",4,k.GLOBAL_BASE+20480);aa([17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,
0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,7,5,0,5,0,5,0,5,0,197,5,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,6,5,0,197,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,24,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,2,0,2,0,2,0,2,0,2,0,2,0,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,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,0,26,
0,26,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,21,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,25,0,27,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,20,0,21,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,19,0,19,0,22,0,22,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,20,0,21,0,23,0,23,0,20,0,21,0,23,0,23,0,23,0,23,0,22,0,22,0,22,0,23,0,23,0,23,0,0,0,23,0,23,0,23,0,23,0,19,0,20,0,21,0,20,0,21,0,20,0,21,0,23,0,23,0,23,0,24,0,
19,0,24,0,24,0,24,0,0,0,23,0,25,0,23,0,23,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,16,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,0,0,0,0,0,0,25,0,25,0,24,0,26,0,27,0,25,0,25,0,0,0,27,0,24,0,24,0,24,0,24,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,16,0,27,0,27,0,0,0,0,0,0,0,23,
0,23,0,23,0,25,0,23,0,23,0,23,0,20,0,21,0,23,0,24,0,23,0,19,0,23,0,23,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,23,0,23,0,24,0,24,0,24,0,23,0,26,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,20,0,24,0,21,0,24,0,20,0,21,0,23,0,20,0,21,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,4,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,11,176,11,184,75,120,75,128,75,136,75,144,75,152,75,160,75,168,75,176,75,184,139,120,139,128,139,136,139,144,139,152,139,160,139,168,
139,176,139,184,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,11,128,11,136,11,144,11,152,11,160,11,168,202,7,202,7,202,7,202,7,202,7,202,12,202,17,202,17,202,17,202,17,74,30,10,136,10,152,10,152,10,152,10,152,10,152,74,120,74,152,138,6,202,17,75,52,75,52,139,56,203,60,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,75,5,203,52,
27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,202,52,74,52,138,5,138,6,202,17,10,152,74,152,138,152,138,6,202,7,202,17,74,30,10,152,74,120,74,152,138,6,202,7,202,17,74,30,10,152,74,120,138,120,138,152,202,7,138,5,138,5,138,5,202,5,202,5,202,5,202,5,138,6,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,11,128,11,136,11,144,11,152,11,160,11,168,11,176,11,184,0,0,0,0,0,0,0,0,139,5,139,6,203,7,203,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,202,27,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,10,184,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,23,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,138,5,202,5,202,7,74,10,74,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,0,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,23,0,139,5,203,5,11,6,203,7,75,10,75,30,75,120,139,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,27,0,139,5,203,5,11,6,75,6,139,6,203,7,75,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,5,203,5,11,6,75,6,75,6,139,6,203,7,75,10,75,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,139,5,139,6,203,7,75,10,75,30,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,139,5,203,7,75,10,75,30,203,5,11,6,0,0,0,0,0,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,23,0,75,160,75,168,75,176,75,184,139,120,139,128,139,136,139,144,139,152,139,160,139,168,139,176,139,184,203,120,203,128,203,136,203,144,203,152,203,160,203,168,
203,176,203,184,203,54,75,53,203,52,139,52,203,70,75,52,203,78,139,56,203,60,75,69,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,203,94,75,52,5,0,5,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,0,0,0,0,75,30,11,128,11,136,11,144,11,152,11,160,11,168,11,176,11,184,75,120,75,128,75,136,75,144,75,152,11,3,75,3,139,3,203,3,203,7,75,10,75,30,75,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,
0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,6,0,6,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,139,5,203,17,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,139,5,203,7,75,10,5,0,5,0,5,0,5,0,5,0,6,0,6,0,0,0,0,0,0,0,0,0,139,5,139,6,203,7,75,10,75,30,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,27,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,139,
5,203,5,11,6,75,6,203,7,75,10,75,30,75,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,139,5,203,5,11,6,75,6,203,7,75,10,75,30,75,120,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,5,203,5,11,6,75,6,203,7,75,10,75,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,5,139,6,203,7,203,17,75,30,75,120,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,11,128,11,136,11,144,11,152,11,160,
11,168,11,176,11,184,75,52,203,52,139,52,139,56,0,0,75,20,203,22,75,25,203,27,75,30,75,120,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,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,6,0,8,0,6,0,8,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,203,7,75,10,203,12,75,15,203,17,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,6,0,23,0,23,0,16,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,
137,2,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,23,0,23,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,23,0,23,0,6,0,6,0,6,0,23,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,5,0,23,0,5,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,0,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,75,120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,8,0,8,0,6,0,8,0,6,0,6,0,23,0,23,0,23,0,23,0,23,0,23,0,6,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,8,0,8,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,
6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,8,0,8,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,5,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,8,0,8,0,8,0,0,0,0,0,8,0,8,0,0,0,0,0,8,0,8,0,8,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,6,0,6,0,8,0,6,0,5,0,5,0,5,0,5,0,23,0,23,0,23,0,23,0,23,0,
73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,23,0,0,0,23,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,8,0,8,0,8,0,8,0,6,0,6,0,8,0,6,0,6,0,5,0,5,0,23,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,0,0,0,0,8,0,8,0,8,0,8,0,6,0,6,0,8,0,6,0,6,0,23,0,23,0,23,0,23,0,
23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,5,0,5,0,5,0,5,0,6,0,6,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,8,0,6,0,8,0,6,0,6,0,23,0,23,0,23,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,0,0,0,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,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,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,8,0,6,0,8,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,8,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,203,7,75,10,23,0,23,0,23,0,27,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,6,0,6,0,6,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,139,5,
203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,75,30,0,0,0,0,0,0,23,0,23,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,8,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,8,0,6,0,6,0,8,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,202,52,74,53,202,52,202,52,74,52,138,52,138,56,74,15,202,17,74,6,138,6,202,6,10,7,74,7,138,7,0,0,23,0,23,0,23,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,10,6,74,6,138,6,202,6,10,7,74,7,138,7,74,6,138,6,202,6,10,7,74,7,138,7,138,5,202,5,10,6,74,6,138,6,202,6,10,7,74,7,138,7,138,5,202,5,10,6,74,6,138,6,202,5,10,6,10,6,74,6,138,6,
202,6,10,7,74,7,138,7,138,5,202,5,10,6,10,6,74,6,138,6,138,192,138,193,138,5,202,5,10,6,10,6,74,6,138,6,10,6,10,6,74,6,74,6,74,6,74,6,202,6,10,7,10,7,10,7,74,7,74,7,138,7,138,7,138,7,138,7,202,5,10,6,74,6,138,6,202,6,138,5,202,5,10,6,74,6,74,6,138,6,138,6,202,5,10,6,138,5,202,5,138,52,138,56,74,69,138,52,138,56,202,53,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,23,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,23,0,23,0,23,0,23,0,23,0,27,0,27,0,27,0,27,0,4,0,4,0,4,0,4,0,23,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,203,7,75,30,139,120,11,121,139,121,11,122,139,122,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,
8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,27,0,6,0,6,0,23,0,16,0,16,0,16,
0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,8,0,8,0,6,0,6,0,6,0,27,0,27,0,27,0,8,0,8,0,8,0,8,0,8,0,8,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,27,0,27,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,
27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,6,0,6,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,6,0,6,0,6,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,203,7,75,10,203,12,75,15,203,17,75,20,203,22,75,25,203,27,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,2,137,2,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,
0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,0,0,2,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,
2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
1,0,1,0,1,0,1,0,1,0,1,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,0,2,0,24,0,2,0,2,0,2,0,2,0,2,0,2,0,1,0,2,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,
6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,27,0,27,0,27,0,27,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,6,0,27,0,27,0,23,0,23,0,23,0,23,0,23],"i8",4,k.GLOBAL_BASE+30720);aa([6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,6,0,6,0,0,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,139,5,203,5,11,6,75,6,139,6,203,6,11,7,75,7,139,7,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,73,0,137,0,201,0,9,1,73,1,137,1,201,1,9,2,73,2,137,2,0,0,0,0,0,0,0,0,23,0,23,0,1,0,1,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,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,24,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,
0,5,0,5,0,0,0,5,0,0,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,0,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,203,2,203,2,11,3,75,3,139,3,203,3,11,4,75,4,139,4,203,4,11,5,75,5,75,5,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,26,0,26,0,26,0,26,0,26,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,
0,27,0,27,0,27,0,27,0,27,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,0,0,0,0,0,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,27,0,0,0,5,0,5,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,
0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,12,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,15,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,15,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,197,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,69,6,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,5,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,133,7,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,106,3,114,3,122,3,130,3,154,3,162,3,170,3,178,3,138,3,146,3,138,3,146,3,138,3,146,3,138,3,146,3,138,3,146,3,138,3,146,3,184,3,192,3,200,3,208,3,216,3,224,3,220,3,228,3,236,3,244,3,239,3,247,3,138,3,146,3,138,3,146,3,255,3,7,4,138,3,146,3,138,3,146,3,138,3,146,3,13,4,21,4,29,4,37,4,45,4,53,4,61,4,69,4,75,
4,83,4,91,4,99,4,107,4,115,4,121,4,129,4,137,4,145,4,153,4,161,4,173,4,169,4,181,4,31,4,31,4,197,4,205,4,189,4,213,4,215,4,223,4,231,4,239,4,240,4,248,4,0,5,8,5,240,4,16,5,21,5,8,5,240,4,29,5,37,5,239,4,42,5,50,5,231,4,55,5,138,3,63,5,67,5,75,5,76,5,84,5,92,5,239,4,100,5,108,5,231,4,239,4,138,3,248,4,231,4,138,3,138,3,114,5,138,3,138,3,120,5,128,5,138,3,138,3,132,5,140,5,138,3,144,5,151,5,138,3,159,5,167,5,174,5,54,5,138,3,138,3,182,5,190,5,198,5,206,5,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,214,5,138,3,222,5,138,3,138,3,138,3,230,5,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,238,5,138,3,138,3,138,3,246,5,246,5,252,4,252,4,138,3,252,5,4,6,222,5,26,6,12,6,12,6,34,6,41,6,18,6,138,3,138,3,138,3,49,6,57,6,138,3,138,3,138,3,59,6,67,6,75,6,138,3,82,6,90,6,138,3,98,6,138,3,138,3,106,6,109,6,55,5,117,6,1,4,125,6,138,3,132,6,138,3,137,6,138,3,138,
3,138,3,138,3,143,6,151,6,138,3,138,3,138,3,138,3,138,3,138,3,216,3,159,6,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,167,6,175,6,179,6,203,6,209,6,187,6,195,6,217,6,225,6,229,6,177,5,237,6,245,6,253,6,138,3,5,7,67,6,67,6,67,6,21,7,29,7,37,7,45,7,50,7,58,7,66,7,13,7,74,7,82,7,138,3,88,7,95,7,67,6,67,6,101,7,67,6,98,5,106,7,67,6,114,7,138,3,138,3,64,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,122,7,67,6,67,6,67,6,67,6,67,6,128,7,67,6,67,6,136,
7,144,7,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,67,6,67,6,67,6,67,6,160,7,167,7,175,7,152,7,191,7,199,7,207,7,214,7,222,7,230,7,237,7,183,7,67,6,67,6,67,6,245,7,251,7,1,8,9,8,14,8,138,3,138,3,138,3,138,3,138,3,138,3,138,3,21,8,138,3,138,3,138,3,29,8,138,3,138,3,138,3,216,3,37,8,45,8,52,8,138,3,60,8,67,6,67,6,70,6,67,6,67,6,67,6,67,6,67,6,67,6,67,8,73,8,89,8,81,8,138,3,138,3,97,8,230,5,138,3,177,3,138,3,138,3,138,3,138,3,138,3,138,3,67,6,28,8,191,3,138,3,56,8,105,8,138,3,113,8,14,8,138,3,138,
3,138,3,138,3,121,8,138,3,138,3,59,6,176,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,67,6,67,6,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,56,8,67,6,98,5,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,128,8,138,3,138,3,133,8,76,5,
138,3,138,3,146,5,67,6,58,6,138,3,138,3,141,8,138,3,138,3,138,3,149,8,156,8,12,6,164,8,138,3,138,3,171,8,179,8,138,3,186,8,193,8,138,3,213,4,198,8,138,3,238,4,138,3,206,8,214,8,240,4,138,3,218,8,239,4,226,8,138,3,138,3,138,3,138,3,138,3,138,3,138,3,233,8,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,
138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,253,8,241,8,245,8,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,5,9,137,4,137,4,137,4,137,4,13,9,17,9,25,9,33,9,37,9,45,9,137,4,137,4,137,4,49,9,57,9,122,3,65,9,73,9,138,3,138,3,138,3,81,9,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,40,14,40,14,104,14,168,14,40,14,40,14,40,14,40,14,40,14,40,14,
224,14,32,15,96,15,112,15,176,15,188,15,40,14,40,14,252,15,40,14,40,14,40,14,52,16,116,16,180,16,244,16,44,17,108,17,172,17,228,17,36,18,100,18,64,10,128,10,192,10,250,10,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,35,11,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,96,11,160,1,160,1,149,11,213,11,21,12,85,12,149,12,213,12,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,
1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,
1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,
1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,
1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,
1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,85,13,101,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,
160,1,21,13,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,160,1,21,13,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,89,9,138,3,67,6,67,6,97,9,230,5,138,3,232,4,138,3,138,3,138,3,138,3,138,3,138,3,138,3,105,9,138,3,138,3,138,3,112,9,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,120,9,31,4,31,4,31,4,31,4,31,4,31,4,31,4,128,9,132,9,31,4,31,4,31,4,31,4,148,9,140,9,31,4,156,9,31,4,31,4,164,9,170,9,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,178,9,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,239,4,173,8,186,9,193,9,1,4,196,9,138,3,138,3,213,4,204,9,138,3,210,9,1,4,215,9,248,5,138,3,
138,3,223,9,138,3,138,3,138,3,138,3,29,8,231,9,1,4,240,4,75,5,238,9,138,3,138,3,138,3,138,3,138,3,173,8,246,9,138,3,138,3,250,9,2,10,138,3,138,3,138,3,138,3,138,3,138,3,6,10,14,10,138,3,138,3,22,10,75,5,50,8,138,3,30,10,138,3,138,3,214,5,38,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,42,10,138,3,138,3,50,10,56,10,138,3,138,3,138,3,138,3,138,3,
138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,62,10,138,3,68,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,74,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,9,5,82,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,89,10,97,10,103,10,138,3,138,3,67,6,67,6,111,10,138,3,138,3,138,3,138,3,138,3,67,6,67,6,103,7,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,113,10,138,
3,120,10,138,3,116,10,138,3,123,10,138,3,131,10,135,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,216,3,143,10,216,3,150,10,157,10,165,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,173,10,181,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,
3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,31,4,31,4,31,4,31,4,31,4,31,4,189,10,31,4,197,10,197,10,204,10,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,
4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,137,4,137,4,137,4,137,4,137,4,137,4,137,4,212,10,31,4,31,4,31,4,31,4,31,4,31,4,31,4,31,4,67,6,220,10,67,6,67,6,70,6,225,10,229,10,67,8,237,10,138,3,138,3,243,10,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,67,6,104,7,251,10,67,6,67,6,67,6,70,6,67,6,67,6,48,
8,138,3,220,10,67,6,3,11,67,6,11,11,69,8,138,3,138,3,27,11,35,11,43,11,138,3,68,8,138,3,230,5,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,19,11,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,
138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,138,3,19,11,59,11,51,11,51,11,51,11,60,11,60,11,60,11,60,11,216,3,216,3,216,3,216,3,216,3,216,3,216,3,68,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,
11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,60,11,105,3,105,3,105,3,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,8,0,7,0,8,0,9,0,7,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,7,0,7,0,7,0,8,0,9,0,10,0,10,0,4,0,4,0,4,0,10,0,10,0,10,49,10,242,10,0,3,0,6,0,3,0,6,0,6,0,2,0,2,0,2,
0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,6,0,10,0,10,80,10,0,10,208,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,81,10,0,10,210,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,81,10,0,10,210,10,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,18,0,18,0,18,0,18,0,7,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,6,0,10,0,4,0,4,0,4,0,4,0,10,0,10,0,10,0,10,0,0,0,10,144,10,0,178,0,10,0,10,0,4,0,4,0,2,0,2,0,10,0,0,0,10,0,10,0,10,0,2,0,0,0,10,144,10,0,10,0,10,0,10],"i8",4,k.GLOBAL_BASE+40980);aa([10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,
0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,
0,177,0,177,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,10,0,4,0,1,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,1,0,177,0,1,0,177,0,177,0,1,0,177,
0,177,0,1,0,177,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,5,0,5,0,5,0,5,0,5,0,10,0,10,0,13,0,4,0,4,0,13,0,6,0,13,0,10,0,10,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,13,0,173,8,13,0,13,0,13,0,77,0,13,0,141,0,141,0,141,0,141,0,77,0,141,0,77,0,141,0,77,0,77,0,77,0,77,0,77,0,141,0,141,0,141,
0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,45,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,77,0,77,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,4,0,5,0,5,0,13,0,77,0,77,0,177,0,141,0,141,0,141,0,13,0,141,0,141,0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,
0,141,0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,77,0,77,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,141,0,77,0,141,0,77,0,141,0,77,0,77,0,141,0,141,0,13,0,141,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,5,0,10,0,177,0,177,0,177,0,177,0,177,0,177,0,13,0,13,0,177,0,177,0,10,0,177,0,177,0,177,0,177,0,141,0,141,0,2,0,2,0,2,0,2,0,2,0,2,
0,2,0,2,0,2,0,2,0,77,0,77,0,77,0,13,0,13,0,77,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,173,0,141,0,177,0,77,0,77,0,77,0,141,0,141,0,141,0,141,0,141,0,77,0,77,0,77,0,77,0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,77,0,141,0,77,0,141,0,77,0,77,0,141,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,13,0,13,0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,141,0,141,
0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,141,0,77,0,77,0,77,0,77,0,141,0,77,0,141,0,141,0,77,0,77,0,77,0,141,0,141,0,77,0,77,0,77,0,77,0,77,0,77,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,
0,13,0,13,0,13,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,1,0,1,0,10,0,10,0,10,0,10,0,33,0,1,0,1,0,1,0,1,0,1,0,177,0,177,0,177,0,177,0,1,0,177,0,177,0,177,0,1,0,177,0,177,0,177,0,177,0,177,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,
1,0,177,0,177,0,177,0,177,0,1,0,177,0,177,0,177,0,177,0,177,0,129,0,65,0,65,0,65,0,65,0,65,0,129,0,129,0,65,0,129,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,129,0,65,0,1,0,1,0,1,0,177,0,177,0,177,0,1,0,1,0,1,0,1,0,177,0,177,0,5,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,77,0,141,0,141,0,141,0,13,0,141,0,77,0,77,0,
141,0,141,0,77,0,77,0,13,0,77,0,77,0,77,0,141,0,77,0,77,0,77,0,77,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,
0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,
0,177,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,4,0,10,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,177,0,177,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,0,0,177,0,10,49,10,242,10,49,10,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,
0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,
0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,49,10,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,177,0,0,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,177,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,
0,10,0,10,0,10,0,10,0,10,0,10,0,74,0,10,0,10,0,42,0,177,0,177,0,177,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,
0,177,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,0,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,
0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,
0,177,0,0,0,0,0,0,0,177,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,
0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,10,0,10,0,
10,0,10,0,6,0,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,9,0,178,0,178,0,178,0,178,0,178,0,18,0,20,8,21,8,19,8,22,8,178,0,178,0,178,0,178,0,178,0,178,0,2,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,3,0,3,0,10,0,10,49,10,242,0,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,9,0,178,0,18,4,50,4,160,8,161,8,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,9,0,7,0,171,8,174,8,176,8,172,8,175,8,
6,0,4,0,4,0,4,0,4,0,4,0,10,0,10,0,10,0,10,0,10,48,10,240,10,0,10,0,10,0,10,0,10,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,3,0,3,0,10,0,10,49,10,242,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,4,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,10,16,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,
0,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,0,10,0,10,48,10,240,10,144,10,144,10,144,10,16,10,144,10,144,10,16,10,16,10,144,10,144,10,144,10,144,10,144,10,16,10,0,10,16,10,16,10,16,10,16,10,0,10,0,10,0,10,112,10,112,10,112,10,176,10,176,10,176,10,0,10,0,10,0,10,16,3,0,4,0,10,0,10,144,10,16,10,0,10,0,10,0,10,16,10,16,10,16,10,16,10,0,10,16,10,16,10,16,10,16,10,0,10,16,10,0,10,16,10,0,10,0,10,0,10,0,10,16,10,16,10,16,10,16,10,16,10,
16,10,16,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,16,10,0,10,16,10,48,10,240,10,16,10,16,10,16,10,16,10,16,10,144,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,0,10,16,10,0,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,0,10,0,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,16,10,0,10,0,10,48,10,240,10,
48,10,240,10,0,10,0,10,0,10,0,10,0,10,144,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,0,10,0,10,144,10,16,10,144,10,144,10,16,10,144,10,16,10,16,10,16,10,16,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,16,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,144,10,0,10,0,10,48,10,240,10,0,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,49,
10,242,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,
0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,
10,0,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,0,10,0,10,48,10,240,10,49,10,242,10,0,10,48,10,240,10,0,10,80,10,16,10,208,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,16,10,48,10,240,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,
0,10,0,10,0,10,16,10,0,10,16,10,16,10,16,10,0,10,0,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,144,10,16,10,16,10,48,10,240,10,0,10,0,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,113,10,50,10,241,10,178,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,144,
10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,16,10,16,10,48,10,240,10,0,10,0,10,0,10,16,10,0,10,0,10,0,10,0,10,16,10,48,10,240,10,48,10,240,10,0,10,48,10,240,10,0,10,0,10,49,10,242,10,49,10,242,10,16,10,0,10,0,10,0,10,0,10,0,10,16,10,144,10,144,10,144,10,16,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,16,10,0,10,0,10,0,10,0,10,16,10,0,10,0,10,0,10,48,10,240,10,48,10,240,10,16,10,0,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,
16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,16,10,0,10,16,10,16,10,16,10,16,10,0,10,0,10,16,10,0,10,16,10,0,10,0,10,16,10,0,10,48,10,240,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,16,10,16,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,0,10,0,10,0,10,0,10,16,10,16,10,16,10,16,10,0,10,16,10,16,10,0,10,
0,10,16,10,16,10,0,10,0,10,0,10,0,10,48,10,240,10,16,10,16,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,16,10,16,10,16,10,16,10,16,10,16,10,48,10,240,10,16,10,16,10,16,10,16,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,16,10,16,10,16,10,16,10,48,10,240,10,16,10,0,10,0,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,0,10,48,10,240,10,16,10,16,10,48,10,240,10,16,10,16,10,16,10,16,10,16,10,16,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,
16,10,16,10,16,10,16,10,16,10,16,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,16,10,0,10,144,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,
10,0,10,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,177,0,10,0,10,0,10,48,10,240,10,48,10,240,10,0,10,0,10,0,10,48,10,240,10,0,10,48,10,240,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,48,10,240,10,0,10,0,10,48,10,240,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,
0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,
0,0,0,0,0,10,0,10,0,10,0,9,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,49,10,242,10,49,10,242,10,49,10,242,10,49,10,242,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,10,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,96,0,0,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,177,0,177],"i8",4,k.GLOBAL_BASE+51244);aa([177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
177,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
177,0,1,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,10,0,10,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,10,0,13,0,13,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,
0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,6,0,10,0,6,0,0,0,10,0,6,0,10,0,10,0,10,0,10,49,10,242,10,49,10,242,10,49,10,242,4,0,10,0,10,0,3,0,3,0,10,48,10,240,10,0,0,0,10,0,4,0,4,0,10,0,0,0,0,0,0,0,0,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,
0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,178,0,0,0,10,0,10,0,4,0,4,0,4,0,10,0,10,0,10,49,10,242,10,0,3,0,6,0,3,0,6,0,6,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,6,0,10,0,10,80,10,0,10,208,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,81,10,0,10,210,10,0,10,49,10,242,10,0,10,49,10,242,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,10,
0,10,0,10,0,4,0,4,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,170,0,170,0,170,0,10,0,10,0,18,0,18,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,177,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,
2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,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,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,10,0,1,0,177,0,177,0,177,0,1,0,177,0,177,0,1,0,1,0,1,0,1,0,1,0,177,0,177,0,177,0,177,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,177,0,177,0,177,
0,1,0,1,0,1,0,1,0,177,0,65,0,129,0,1,0,1,0,129,0,177,0,177,0,1,0,1,0,1,0,1,0,65,0,65,0,65,0,65,0,129,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,65,0,65,0,65,0,65,0,65,0,129,0,1,0,129,0,1,0,129,0,129,0,1,0,1,0,97,0,129,0,129,0,129,0,129,0,129,0,65,0,65,0,65,0,65,0,97,0,65,0,65,0,65,0,65,0,65,0,129,0,65,0,65,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,65,0,129,0,65,0,129,0,129,0,129,0,
65,0,65,0,65,0,129,0,65,0,65,0,129,0,65,0,129,0,129,0,65,0,129,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,129,0,129,0,129,0,129,0,65,0,65,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,0,1,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,
10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,0,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,
177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,177,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,
177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,
0,177,0,177,0,177,0,177,0,177,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,0,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,178,0,178,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,177,0,177,0,177,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,10,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,0,0,177,0,177,0,0,
0,177,0,177,0,177,0,177,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,65,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,10,0,10,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,13,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,
0,10,0,10,0,10,0,10,0,10,0,10,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,
0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,
10,0,10,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,0,0,0,0,0,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,10,0,0,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,178,0,18,0,178,0,18,0,18,0,18,0,18,0,
18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,177,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,18,0,0,0,0,0,0,0,0,0,0,1,2,7,8,3,9,6,5,4,4,10,10,12,10,10,10,11,10,4,4,4,4,13,14,1,2,4,5,7,15,17,7,9,7,0,7,3,18,21,4,1,34,36,37,39,47,49,39,41,39,1,1,35,50,53,0,33,2,36,37,39,47,49,
39,41,39,2,2,35,50,53,1,33,34,38,38,40,48,49,40,40,40,3,3,3,50,53,1,33,34,4,37,39,47,49,74,11,74,4,4,35,18,21,2,33,34,36,5,39,47,49,39,41,76,5,5,35,50,53,3,33,34,6,6,40,48,49,40,40,77,6,6,35,18,21,3,33,34,36,37,7,47,49,7,78,7,7,7,35,50,53,4,33,34,38,38,8,48,49,8,8,8,8,8,35,50,53,4,33,34,4,37,7,47,49,7,9,7,9,9,35,18,21,4,97,98,4,101,135,111,113,135,142,135,10,135,99,18,21,2,33,34,4,37,39,47,49,39,11,39,11,11,35,18,21,2,97,98,100,5,135,111,113,135,142,135,12,135,99,114,117,3,97,98,6,6,136,112,113,136,
136,136,13,136,99,18,21,3,33,34,132,37,7,47,49,7,14,7,14,14,35,146,149,4,33,34,36,37,39,15,49,39,41,39,15,39,35,50,53,5,33,34,38,38,40,16,49,40,40,40,16,40,35,50,53,5,33,34,36,37,39,47,17,39,41,39,17,39,35,50,53,6,33,34,18,37,39,47,49,83,20,83,18,18,35,18,21,0,97,98,18,101,135,111,113,135,142,135,19,135,99,18,21,0,33,34,18,37,39,47,49,39,20,39,20,20,35,18,21,0,33,34,21,37,39,47,49,86,23,86,21,21,35,18,21,3,97,98,21,101,135,111,113,135,142,135,22,135,99,18,21,3,33,34,21,37,39,47,49,39,23,39,23,23,
35,18,21,3,0,2,17,17,0,0,0,0,0,66,1,1,0,0,0,0,0,2,4,4,19,19,0,1,0,34,52,52,3,3,0,0,0,2,4,4,19,19,0,2,1,0,2,2,0,0,0,0,1,0,1,2,19,19,0,1,1,0,2,2,0,0,0,1,33,48,6,4,3,3,48,0,33,48,6,4,5,5,48,3,33,48,6,4,5,5,48,2,33,48,6,4,3,3,48,1,0,1,2,3,4,0,1,13,14,0,98,1,1,0,0,0,0,0,98,1,1,0,48,0,4,0,98,84,84,19,48,0,3,48,66,84,84,3,48,48,3,48,66,4,4,19,48,48,4,19,0,1,1,0,0,0,0,35,0,1,1,2,64,0,1,35,0,1,1,2,64,0,0,3,0,3,54,20,64,0,1,83,64,5,54,4,64,64,0,83,64,5,54,4,64,64,1,83,64,6,6,4,64,64,3,0,1,2,5,6,7,8,0,1,9,10,
11,12,0,1,0,2,0,0,0,0,0,1,3,3,20,20,0,1,0,1,0,2,21,21,0,2,0,1,3,3,20,20,0,2,0,33,51,51,4,4,0,0,0,33,0,50,5,5,0,0,0,99,0,1,0,0,0,0,0,99,0,1,18,48,0,4,32,99,32,1,2,48,32,3,0,99,85,86,20,48,0,3,48,67,85,86,4,48,48,3,48,67,5,86,20,48,48,4,48,67,85,6,20,48,48,4,0,1,0,0,0,0,0,0,0,1,0,0,20,20,0,1,0,1,0,0,21,21,0,2,0,1,0,0,20,20,0,2,32,1,32,32,4,4,32,1,32,1,32,32,5,5,32,1,1,0,1,1,0,0,0,0,1,0,1,1,20,20,0,1,1,0,1,1,0,0,0,1,1,0,1,1,5,5,0,1,33,0,33,33,4,4,0,0,1,0,1,1,5,5,0,0,0,3,17,17,0,0,0,0,32,3,1,1,2,32,32,
2,32,3,1,1,2,32,32,1,0,3,5,5,20,0,0,1,32,3,5,5,4,32,32,1,0,3,5,5,20,0,0,2,2,0,1,1,0,0,0,0,2,0,1,1,0,0,0,1,2,0,20,20,19,0,0,1,34,0,4,4,3,0,0,0,34,0,4,4,3,0,0,1,1,0,2,2,0,0,0,0,1,0,1,3,20,20,0,1,1,0,2,2,0,0,0,1,1,0,1,3,5,5,0,1,33,0,33,3,4,4,0,0,1,0,1,3,5,5,0,0,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,1,0,0,2,2,0,0,1,2,0,1,1,2,0,1,1,3,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,3,0,0,1,2,0,0,1,2,0,1,1,2,0,1,1,3,0,2,4,6,8,10,12,14,0,1,0,0,0,0,0,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,2,3,0,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,4,4,3,3,3,0,3,0,3,3,3,3,3,3,3,3,3,3,0,0,1,0,1,0,1,0,
1,0,1,2,3,0,1,0,1,2,3,0,1,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,0,1,0,1,0,1,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3,0,1,0,1,0,1,2,3,0,1,0,1,0,1,0,1,0,0,0,45,0,3,3,44,3,45,3,4,42,4,4,13,13,13,6,6,31,31,35,35,33,33,40,40,1,1,11,11,55,55,55,0,9,29,19,22,24,26,16,44,45,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,29,0,3,3,3,0,3,44,44,45,4,4,4,4,4,4,4,4,13,13,13,13,13,13,13,6,6,6,6,6,6,6,
6,6,31,31,31,31,31,31,31,31,31,35,35,35,33,33,40,1,9,9,9,9,9,9,29,29,11,38,11,19,19,19,11,11,11,11,11,11,22,22,22,22,26,26,26,26,56,21,13,42,17,17,14,44,44,44,44,44,44,44,44,55,47,55,44,45,45,46,46,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,31,0,0,0,0,0,0,0,0,0,0,35,33,1,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,5,12,12,7,7,15,39,50,18,43,43,48,49,20,23,25,27,36,10,8,28,32,34,30,7,37,41,5,12,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,52,51,4,4,4,4,4,4,4,13,13,6,6,
31,35,1,1,1,9,9,11,11,11,24,24,26,26,26,22,31,31,35,13,13,35,31,13,3,3,55,55,45,44,44,54,54,13,35,35,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,13,40,9,29,22,24,45,45,31,44,57,0,6,33,11,85,31,1,19,0,4,4,4,31,45,86,88,87,0,0,58,60,60,64,64,61,0,82,0,84,84,0,0,65,79,83,67,67,67,68,62,80,69,70,76,59,59,72,72,75,73,73,73,74,0,0,77,0,0,0,0,0,0,71,63,78,81,66,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,
105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,
112,101,95,105,110,102,111,69,0],"i8",4,k.GLOBAL_BASE+61510);Lb=k.alignMemory(aa(12,"i8",2),8);c._memset=Oi;c._memcpy=Pi;fa=S=k.alignMemory(Fa);fa+=ac;ha=k.alignMemory(fa);c.asmGlobalArg={Math:Math,Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array,NaN:NaN,Infinity:Infinity,byteLength:bd};c.asmLibraryArg={abort:xb,assert_em:function(b,c){b||xb("Assertion failed: "+
c)},invoke_viiiii:function(b,h,g,k,C,n){try{c.dynCall_viiiii(b,h,g,k,C,n)}catch(t){if("number"!==typeof t&&"longjmp"!==t)throw t;E.setThrew(1,0)}},invoke_vi:function(b,h){try{c.dynCall_vi(b,h)}catch(g){if("number"!==typeof g&&"longjmp"!==g)throw g;E.setThrew(1,0)}},invoke_iiii:function(b,h,g,k){try{return c.dynCall_iiii(b,h,g,k)}catch(C){if("number"!==typeof C&&"longjmp"!==C)throw C;E.setThrew(1,0)}},invoke_viiiiii:function(b,h,g,k,C,n,t){try{c.dynCall_viiiiii(b,h,g,k,C,n,t)}catch(R){if("number"!==
typeof R&&"longjmp"!==R)throw R;E.setThrew(1,0)}},invoke_iii:function(b,h,g){try{return c.dynCall_iii(b,h,g)}catch(v){if("number"!==typeof v&&"longjmp"!==v)throw v;E.setThrew(1,0)}},invoke_viiii:function(b,h,g,k,C){try{c.dynCall_viiii(b,h,g,k,C)}catch(n){if("number"!==typeof n&&"longjmp"!==n)throw n;E.setThrew(1,0)}},_pthread_self:function(){return 0},_abort:function(){c.abort()},___setErrNo:Yb,_sbrk:Oc,_time:function(b){var c=Date.now()/1E3|0;b&&(W[b>>2]=c);return c},_emscripten_memcpy_big:function(b,
c,g){Ca.set(Ca.subarray(c,c+g),b);return b},_sysconf:function(b){switch(b){case 30:return 4096;case 85:return ta/4096;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;
case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;
case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return"object"===typeof navigator?navigator.hardwareConcurrency||1:1}Yb(22);return-1},STACKTOP:S,STACK_MAX:fa,tempDoublePtr:Lb,ABORT:nd};var E=function(b,c,g){function h(d,f,p,u,q){d|=0;f|=0;p|=0;u|=0;q|=0;var b=0,c=0,D=0,J=0,l=0,G=0,Pe=0,w=0,g=0,Qe=0,Id=0,m=0,k=0,y=0,B=0,n=0,Bf=0,F=0,C=0,v=0,z=0,Yh=0,Zh=0,tg=0,K=0,Cf=0,$h=0,wh=0,Ec=0,ai=0,X=0,da=0,bc=0,Df=0,ua=0,wc=
0,Re=0,va=0,ug=0,yb=0,fb=0,pb=0,Gh=0,wa=0,Xa=0,qb=0,rb=0,bi=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=0,ub=0,$a=0,Hh=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,ui=0,oa=0,lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,Ta=0,L=0,Aa=0,Bb=0,R=0,fa=0,ha=0,W=0,ga=0,Uc=0,aa=0,Ca=0,Pc=0,ma=0,xc=0,ci=0,cd=0,vg=0,Se=0,Cb=0,Te=0,dd=0,Fa=0,vi=0,Ih=0,wi=0,di=0,bh=0,xi=0,ed=0,od=0,Qc=0,fd=0,Fc=0,Vc=0,wg=0,pd=0,xg=0,Gc=0,cb=
0,Ef=0,Wc=0,cc=0,Xc=0,qd=0,rd=0,Rc=0,Hc=0,Yc=0,Na=0,ca=0,xb=0,Xb=0,qc=0,ac=0,ad=0,Ac=0,Lb=0,nc=0,nd=0,Jh=0,bd=0,ke=0,ei=0,fi=0,gi=0,Kh=0,hi=0,oe=0,pe=0,Ud=0,Wb=0,qe=0,oc=0,yi=0,Vd=0,Nc=0,Bc=0,re=0,Wd=0,ii=0,ji=0,se=0,ne=0,ki=0,li=0,te=0,mi=0,Lh=0,Xd=0,Mh=0,ni=0,oi=0,pi=0,qi=0,Ff=0,ri=0,Jd=0,Ue=0,Gf=0,si=0,rc=0,yg=0,zg=0,$b=0,Ag=0,Kb=0,Bg=0,Ve=0,Yd=0,Hf=0,Mc=0,ch=0,Cg=0,Dg=0,If=0,We=0,Jf=0,Kf=0,dh=0,Lf=0,Y=0,eh=0,Eg=0,ue=0,fh=0,Mf=0,Fg=0,Gg=0,Hg=0,Nf=0,Ig=0,Of=0,gh=0,hh=0,Pf=0,ve=0,Jg=0,Kd=0,Qf=0,
Rf=0,Kg=0,Sf=0,Xe=0,ih=0,Ye=0,Ze=0,Zd=0,Lg=0,$e=0,$d=0,Zc=0,$c=0,Nb=0,af=0,Mg=0,bf=0,cf=0,Tf=0,Ng=0,vd=0,ae=0,Uf=0,we=0,Og=0,be=0,xe=0,df=0,ef=0,ye=0,jh=0,kh=0,lh=0,Vf=0,Pg=0,ce=0,ze=0,Db=0,Oa=0,Qg=0,Wf=0,Xf=0,Ua=0,ff=0,dc=0,Ae=0,ec=0,gf=0,gd=0,mh=0,Eb=0,Yf=0,hf=0,Zf=0,Rg=0,jf=0,Hb=0,kf=0,lf=0,Sg=0,$f=0,Tg=0,mf=0,Be=0,ag=0,Ce=0,wd=0,De=0,Sc=0,Ld=0,sd=0,Ug=0,td=0,de=0,nf=0,Md=0,db=0,Nd=0,bg=0,Ee=0,Fe=0,Ge=0,of=0,Vg=0,Fb=0,He=0,yc=0,Ob=0,pf=0,fc=0,gc=0,Wg=0,Tc=0,Ic=0,xd=0,cg=0,Xg=0,qf=0,dg=0,rf=0,Qb=
0,eg=0,hc=0,Rb=0,fg=0,Sb=0,yd=0,zd=0,nb=0,Tb=0,hd=0,Ad=0,Gb=0,gg=0,hg=0,zc=0,Od=0,eb=0,ob=0,ic=0,jc=0,kc=0,Ib=0,Pd=0,Qd=0,Ie=0,Ub=0,sf=0,Jc=0,ee=0,Je=0,ig=0,tf=0,Ke=0,Va=0,la=0,jg=0,Ba=0,id=0,Vb=0,uf=0,fe=0,M=0,ge=0,kg=0,nh=0,oh=0,vf=0,wf=0,ge=A;A=A+5072|0;Db=ge+2532|0;Oa=ge;a:do if(q&&0>=(a[q>>2]|0)){if(!(0==(d|0)|0==(f|0)|-1>(p|0))&&(pi=u&255,-1>=u+-126<<24>>24<<24>>24)){if(-1==(p|0)){for(Va=f;;)if(r[Va>>1]|0)Va=Va+2|0;else break;b=Va-f>>1}else b=p;wa=d+88|0;if(3==(a[wa>>2]|0)){a[wa>>2]=0;do if(b)if(ja=
he(7*b|0)|0){Ma=ja+(b<<2)|0;Ka=Ma+(b<<1)|0;ea=d+92|0;Ra=a[ea>>2]|0;Ra&1&&(a[ea>>2]=Ra&-4|2);W=pi&1;h(d,f,b,W&255,q);if(!(0<(a[q>>2]|0))){var lc=d,jd=q,lc=lc|0,jd=jd|0,Le=0,ud=0,Bd=0,ie=0,lg=0,kd=0,mg=0,ng=0,Me=0;b:do{if(jd&&!(0<(a[jd>>2]|0))){do if(lc){Me=a[lc>>2]|0;if((Me|0)!=(lc|0)){if(!Me)break;if((a[Me>>2]|0)!=(Me|0))break}ud=a[lc+16>>2]|0;if(1>(ud|0)){a[jd>>2]=1;Le=0;break b}Bd=lc+132|0;ie=a[Bd>>2]|0;if((ud|0)==(ie|0)){Le=a[lc+80>>2]|0;break b}lg=lc+52|0;if(!((Kc(lg,lc+28|0,e[lc+72>>0]|0,ud)|
0)<<24>>24)){a[jd>>2]=7;Le=0;break b}kd=a[lg>>2]|0;mg=lc+80|0;0<(ie|0)&&(ng=a[mg>>2]|0,(kd|0)!=(ng|0)&&ld(kd|0,ng|0,ie|0)|0);Cd(kd+ie|0,e[lc+97>>0]|0,ud-ie|0)|0;a[Bd>>2]=ud;Le=a[mg>>2]=kd;break b}while(0);a[jd>>2]=27}Le=0}while(0);Ca=Le|0;xc=d+16|0;Cb=a[xc>>2]|0;ld(Ka|0,Ca|0,Cb|0)|0;var dd=d+132|0,Fa=a[dd>>2]|0,Ih=d+120|0,wi=a[Ih>>2]|0,bh=t(d,Ma,b,2,q)|0,Lc=d,I=ja,Rd=q,Lc=Lc|0,I=I|0,Rd=Rd|0,je=0,Yg=0,Ia=0,Wa=0,ph=0,Zg=0,og=0,Z=0,pg=0,Ne=0,sa=0,qh=0,mc=0,pc=0,Oc=0,Yb=0,sc=0,Td=0,Cc=0,Jb=0,Fd=0,Oe=
0,tc=0,vc=0,Dc=0,Dd=0,uc=0,zf=0,Gd=0,xh=0,rh=0,$g=0,yh=0,zh=0,sh=0,Af=0,Hd=0,Ah=0,Ed=0,Nh=0,ah=0,Oh=0,th=0,Bh=0,Ch=0,Ph=0,Qh=0,Dh=0,Rh=0,Sh=0,Eh=0,Fh=0,Th=0,Uh=0,uh=0,yf=0,Vh=0,qg=0,Wh=0,Xh=0,xf=0,rg=0,le=0;b:do if(Rd&&0>=(a[Rd>>2]|0))if(I){if(Sd(Lc,Rd)|0,1>(a[Rd>>2]|0)&&(Oe=a[Lc+228>>2]|0,vc=Lc+224|0,zf=a[vc>>2]|0,je=Oe+(12*zf|0)|0,og=Lc+20|0,1<=(a[og>>2]|0))){if(0<(zf|0))for(Fh=I,uh=Oe,qg=0;;){Ne=a[uh>>2]|0;sa=a[uh+4>>2]|0;if(-1<(Ne|0)){qh=qg+1|0;Ph=Ne;Th=Fh;for(Wh=qg;!(a[Th>>2]=Ph,Wh=Wh+1|0,(Wh|
0)>=(sa|0));)Ph=Ph+1|0,Th=Th+4|0;Vh=(sa|0)>(qh|0)?sa:qh}else{mc=qg+1|0;Qh=sa-qg+(Ne&2147483647)|0;Uh=Fh;for(Xh=qg;!(Qh=Qh+-1|0,a[Uh>>2]=Qh,Xh=Xh+1|0,(Xh|0)>=(sa|0));)Uh=Uh+4|0;Vh=(sa|0)>(mc|0)?sa:mc}uh=uh+12|0;if(uh>>>0>=je>>>0)break;else Fh=Fh+(Vh-qg<<2)|0,qg=Vh}if(0>=(a[Lc+336>>2]|0)){if(0>=(a[Lc+352>>2]|0))break;Dc=a[vc>>2]|0;Dd=Lc+8|0;if(0<(Dc|0))xf=ah=$g=0;else break;for(;;){rg=xf;xf=a[Oe+(12*$g|0)+4>>2]|0;uc=xf-rg|0;Gd=0==(a[Oe+(12*$g|0)+8>>2]|0);do if((ah|0)==(rg|0)&Gd)Ch=xf;else if(Gd){yf=
(xf|0)<(rg|0)?rg:xf;if((xf|0)>(rg|0))for(zh=rg,Oh=ah;a[I+(Oh<<2)>>2]=a[I+(zh<<2)>>2],zh=zh+1|0,(zh|0)!=(xf|0);)Oh=Oh+1|0;Ch=ah-rg+yf|0}else if(Yg=a[Oe+(12*$g|0)>>2]|0,Ia=Yg&2147483647,Wa=-1<(Yg|0),ph=uc+-1+Ia|0,0<(uc|0))for(Zg=a[Dd>>2]|0,sh=0,th=ah;;){Z=Wa?sh+Ia|0:ph-sh|0;pg=H[Zg+(Z<<1)>>1]|0;c:do if(8204==(pg&65532|0))Bh=th;else{switch(pg|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:Bh=th;break c}a[I+(th<<2)>>2]=Z;Bh=th+1|0}while(0);sh=sh+1|0;if((sh|
0)==(uc|0)){Ch=Bh;break}else th=Bh}else Ch=ah;while(0);$g=$g+1|0;if(($g|0)==(Dc|0))break b;else ah=Ch}}pc=a[vc>>2]|0;if(0<(pc|0)){Dh=xh=0;do Oc=a[Oe+(12*xh|0)+8>>2]|0,Dh=(0!=(Oc&5|0)&1)+Dh+(0!=(Oc&10|0)&1)|0,xh=xh+1|0;while((xh|0)!=(pc|0));if(0<(Dh|0))for(rh=pc,Hd=a[og>>2]|0,Sh=Dh;;){le=rh;rh=rh+-1|0;Yb=a[Oe+(12*rh|0)+8>>2]|0;Yb&10?(sc=Hd+-1|0,a[I+(sc<<2)>>2]=-1,Ah=sc,Eh=Sh+-1|0):(Ah=Hd,Eh=Sh);Jb=(Td=1<(le|0))?a[Oe+(12*(le+-2|0)|0)+4>>2]|0:0;Cc=a[Oe+(12*rh|0)+4>>2]|0;if(0<(Eh|0)&(Cc|0)>(Jb|0)){Fd=
Jb+Ah|0;yh=Cc;Nh=Ah;do yh=yh+-1|0,Nh=Nh+-1|0,a[I+(Nh<<2)>>2]=a[I+(yh<<2)>>2];while((yh|0)>(Jb|0));Ed=Fd-Cc|0}else Ed=Ah;Yb&5?(tc=Ed+-1|0,a[I+(tc<<2)>>2]=-1,Af=tc,Rh=Eh+-1|0):(Af=Ed,Rh=Eh);if(Td&0<(Rh|0))Hd=Af,Sh=Rh;else break}}}}else a[Rd>>2]=1;while(0);if(0>=(a[q>>2]|0)){a[ea>>2]=Ra;a[wa>>2]=5;rd=d+72|0;Na=e[rd>>0]|0;e[rd>>0]=0;h(d,Ma,bh,(W^1)&255,q);e[rd>>0]=Na;x(d,q);b:do if(0>=(a[q>>2]|0)&&(Kh=d+224|0,oe=a[Kh>>2]|0,qe=d+228|0,se=a[qe>>2]|0,0<(oe|0))){for(uf=Ce=Vf=0;;){vf=uf;uf=a[se+(12*Ce|0)+
4>>2]|0;ni=uf-vf|0;c:do if(2>(ni|0))ce=Vf;else for(si=a[se+(12*Ce|0)>>2]&2147483647,rc=si+ni|0,Pg=Vf,bg=si;;){Nd=bg;do{oh=Nd;Nd=Nd+1|0;if((Nd|0)>=(rc|0)){ce=Pg;break c}Hf=a[ja+(Nd<<2)>>2]|0;If=a[ja+(oh<<2)>>2]|0;Kf=Hf-If|0;if(1!=((-1<(Kf|0)?Kf:0-Kf|0)|0))break}while((e[Ka+Hf>>0]|0)==(e[Ka+If>>0]|0));Pg=Pg+1|0;bg=Nd}while(0);Ce=Ce+1|0;if((Ce|0)==(oe|0))break;else Vf=ce}if(ce){Sf=d+64|0;if(!((Kc(Sf,d+40|0,e[d+73>>0]|0,12*(ce+oe|0)|0)|0)<<24>>24))break;1==(oe|0)&&(Uf=a[Sf>>2]|0,a[Uf>>2]=a[se>>2],a[Uf+
4>>2]=a[se+4>>2],a[Uf+8>>2]=a[se+8>>2]);Og=a[Sf>>2]|0;a[qe>>2]=Og;a[Kh>>2]=(a[Kh>>2]|0)+ce;lh=ce;Gb=Og}else lh=0,Gb=se;jh=Gb+4|0;Qe=lh;for(Ug=oe;;){kh=0==(Qe|0);for(de=Ug;;){ai=(td=de+-1|0)?(a[Gb+(12*td|0)+4>>2]|0)-(a[Gb+(12*(de+-2|0)|0)+4>>2]|0)|0:a[jh>>2]|0;Cf=Gb+(12*td|0)|0;$h=a[Cf>>2]|0;wh=$h>>>31;Ec=$h&2147483647;if(2<=(ai|0))break;y=td+Qe|0;kh||(X=Gb+(12*y|0)|0,a[X>>2]=a[Cf>>2],a[X+4>>2]=a[Cf+4>>2],a[X+8>>2]=a[Cf+8>>2]);da=a[ja+(Ec<<2)>>2]|0;a[Gb+(12*y|0)>>2]=(Q[Ka+da>>0]^wh)<<31|da;if(1<(de|
0))de=td;else break b}bc=0==(wh|0);Df=ai+-1+Ec|0;J=bc?Ec:Df;l=bc?-1:1;ua=Gb+(12*td|0)+4|0;wc=Gb+(12*td|0)+8|0;ze=Qe;Ge=bc?Df:Ec;c:for(;;){for(Fe=Ge;;){if((Fe|0)==(J|0))break c;Re=a[ja+(Fe<<2)>>2]|0;va=Fe+l|0;ug=a[ja+(va<<2)>>2]|0;yb=Re-ug|0;if(1!=((-1<(yb|0)?yb:0-yb|0)|0))break;if((e[Ka+Re>>0]|0)==(e[Ka+ug>>0]|0))Fe=va;else break}fb=a[ja+(Ge<<2)>>2]|0;G=(fb|0)<(Re|0)?fb:Re;pb=ze+td|0;a[Gb+(12*pb|0)>>2]=(Q[Ka+G>>0]^wh)<<31|G;a[Gb+(12*pb|0)+4>>2]=a[ua>>2];Gh=Fe-Ge|0;a[ua>>2]=(a[ua>>2]|0)+~(-1<(Gh|0)?
Gh:0-Gh|0);Xa=a[wc>>2]|0;a[Gb+(12*pb|0)+8>>2]=Xa&10;a[wc>>2]&=(Xa|-11)^10;ze=ze+-1|0;Ge=va}B=ze+td|0;ze&&(qb=Gb+(12*B|0)|0,a[qb>>2]=a[Cf>>2],a[qb+4>>2]=a[Cf+4>>2],a[qb+8>>2]=a[Cf+8>>2]);rb=a[ja+(Ge<<2)>>2]|0;bi=a[ja+(J<<2)>>2]|0;Pe=(rb|0)<(bi|0)?rb:bi;a[Gb+(12*B|0)>>2]=(Q[Ka+Pe>>0]^wh)<<31|Pe;if(1<(de|0))Qe=ze,Ug=td;else break}}while(0);Ya=d+97|0;e[Ya>>0]=Q[Ya>>0]^1}a[d+8>>2]=f;a[xc>>2]=Cb;a[d+12>>2]=b;a[Ih>>2]=wi;sb=a[d+28>>2]|0;ld(a[d+80>>2]|0,Ka|0,((Cb|0)>(sb|0)?sb:Cb)|0)|0;a[dd>>2]=Fa;1<(a[d+
224>>2]|0)&&(a[Ih>>2]=2)}gg=ja}else a[q>>2]=7,gg=0;else h(d,f,0,u,q),gg=0;while(0);md(gg);a[wa>>2]=3;break}a[d>>2]=0;zb=d+8|0;a[zb>>2]=f;gb=d+20|0;a[gb>>2]=b;tb=d+12|0;a[tb>>2]=b;hb=d+16|0;a[hb>>2]=b;ba=d+97|0;e[ba>>0]=u;Za=pi&1;na=d+120|0;a[na>>2]=Za;T=d+136|0;a[T>>2]=1;qa=d+76|0;a[qa>>2]=0;ib=d+80|0;a[ib>>2]=0;a[d+228>>2]=0;Ab=d+336|0;a[Ab>>2]=0;a[d+340>>2]=0;Da=253<(u&255);Ea=d+98|0;e[Ea>>0]=Da&1;if(!b){Da&&(e[ba>>0]=Za,e[Ea>>0]=0);a[d+124>>2]=a[104+(Za<<2)>>2];a[d+224>>2]=0;a[T>>2]=0;a[d+104>>
2]=0;a[d+112>>2]=0;a[d>>2]=d;break}a[d+224>>2]=-1;Pa=d+60|0;Qa=a[Pa>>2]|0;U=d+140|0;a[U>>2]=0==(Qa|0)?d+144|0:Qa;jb=d+48|0;ub=d+72|0;if(!((Kc(jb,d+24|0,e[ub>>0]|0,b)|0)<<24>>24)){a[q>>2]=7;break}$a=a[jb>>2]|0;a[qa>>2]=$a;Hh=a[zb>>2]|0;xa=$a;ab=a[tb>>2]|0;vb=e[ba>>0]|0;vg=(wb=253<(vb&255))?2>((a[wa>>2]|0)+-5|0)>>>0:0;bb=d+92|0;kb=a[bb>>2]|0;ui=kb&2;kb&4&&(a[hb>>2]=0);oa=vb&255;lb=oa&1;N=lb&255;mb=(a[U>>2]|0)+4|0;if(wb)if(a[mb>>2]=lb,pa=a[d+104>>2]|0,0<(pa|0)){Ga=a[d+100>>2]|0;mf=0;for(Ad=10;;){O=mf+
1|0;ya=H[Ga+(mf<<1)>>1]|0;(O|0)==(pa|0)|55296!=(ya&64512|0)?(De=O,jg=ya):(Sa=H[Ga+(O<<1)>>1]|0,56320==(Sa&64512|0)?(De=mf+2|0,jg=(ya<<10)+-56613888+Sa|0):(De=O,jg=ya));ra=sg(d,jg)|0;ia=ra&255;Ha=ra&255;b:do if(10==Ad<<24>>24){switch(Ha|0){case 13:case 1:case 0:break;default:hd=10;break b}hd=ia}else hd=7==(Ha|0)?10:Ad;while(0);if((De|0)<(pa|0))mf=De,Ad=hd;else break}10==hd<<24>>24?(Ic=N,ee=1):(a[(a[U>>2]|0)+4>>2]=0!=hd<<24>>24&1,Ic=N,ee=0)}else Ic=N,ee=1;else a[mb>>2]=oa,Ic=10,ee=0;V=0==(ui|0);za=
d+144|0;ka=d+36|0;La=d+352|0;b:do if(0<(ab|0)){Be=mh=Wf=0;yc=-1;Tc=Ic;ob=-1;Jc=ee;c:for(;;){Ta=Be+1|0;L=H[Hh+(Be<<1)>>1]|0;(Ta|0)==(ab|0)|55296!=(L&64512|0)?(Sc=Ta,la=L):(Aa=H[Hh+(Ta<<1)>>1]|0,56320==(Aa&64512|0)?(Sc=Be+2|0,la=(L<<10)+-56613888+Aa|0):(Sc=Ta,la=L));Bb=sg(d,la)|0;R=Bb&255;fa=1<<R|mh;ha=Sc+-1|0;ga=xa+ha|0;e[ga>>0]=Bb;65535<(la|0)?(e[xa+(Sc+-2)>>0]=18,Eb=fa|262144):Eb=fa;Xf=V?Wf:((4>(la+-8294|0)>>>0|8204==(la&-4|0)|5>(la+-8234|0)>>>0)&1)+Wf|0;d:do switch(R|0){case 0:switch(Jc|0){case 1:a[(a[U>>
2]|0)+((a[T>>2]|0)+-1<<3)+4>>2]=0;ec=Eb;Fb=yc;gc=0;zc=ob;Ub=0;break d;case 2:ec=126>(ob|0)?Eb|1048576:Eb;Fb=yc;gc=0;zc=ob;Ub=3;break d;default:ec=Eb;Fb=yc;gc=0;zc=ob;Ub=Jc;break d}case 13:case 1:e:do switch(Jc|0){case 1:a[(a[U>>2]|0)+((a[T>>2]|0)+-1<<3)+4>>2]=1;jf=Eb;Je=0;break;case 2:if(126<=(ob|0)){jf=Eb;Je=3;break e}e[xa+(a[Db+(ob<<2)>>2]|0)>>0]=21;jf=Eb|2097152;Je=3;break;default:jf=Eb,Je=Jc}while(0);ec=jf;Fb=13==(R|0)?ha:yc;gc=1;zc=ob;Ub=Je;break;default:if(3>(R+-19|0)>>>0){Uc=ob+1|0;126>(Uc|
0)&&(a[Db+(Uc<<2)>>2]=ha,e[Oa+Uc>>0]=Jc);if(19!=(R|0)){ec=Eb;Fb=yc;gc=Tc;zc=Uc;Ub=3;break d}e[ga>>0]=20;ec=Eb;Fb=yc;gc=Tc;zc=Uc;Ub=2;break d}switch(R|0){case 22:aa=126>(ob|0);g=aa&2==(Jc|0)?Eb|1048576:Eb;if(-1>=(ob|0)){ec=g;Fb=yc;gc=Tc;zc=ob;Ub=Jc;break d}ig=aa?e[Oa+ob>>0]|0:Jc;ec=g;Fb=yc;gc=Tc;zc=ob+-1|0;Ub=ig;break d;case 7:break;default:ec=Eb;Fb=yc;gc=Tc;zc=ob;Ub=Jc;break d}Pc=(Sc|0)<(ab|0);if(13==(la|0)&Pc&&10==(r[Hh+(Sc<<1)>>1]|0)){ec=Eb;Fb=yc;gc=Tc;zc=ob;Ub=Jc;break d}ma=a[T>>2]|0;ci=ma+-1|
0;cd=a[U>>2]|0;a[cd+(ci<<3)>>2]=Sc;vg&1==Tc<<24>>24&&(a[cd+(ci<<3)+4>>2]=1);a[bb>>2]&4&&(a[hb>>2]=Sc,a[La>>2]=Xf);if(!Pc){ec=Eb;Fb=yc;gc=Tc;zc=ob;Ub=Jc;break d}Se=ma+1|0;a[T>>2]=Se;do if((cd|0)==(za|0)){if(!(11>(Se|0))){if(!((Kc(Pa,ka,1,160)|0)<<24>>24))break c;Te=a[Pa>>2]|0;fe=a[U>>2]=Te;kg=za;nh=fe+80|0;do a[fe>>2]=a[kg>>2],fe=fe+4|0,kg=kg+4|0;while((fe|0)<(nh|0))}}else{if(!((Kc(Pa,ka,1,Se<<4)|0)<<24>>24))break c;a[U>>2]=a[Pa>>2]}while(0);wb?(a[(a[U>>2]|0)+((a[T>>2]|0)+-1<<3)+4>>2]=lb,ec=Eb,Fb=
yc,gc=N,zc=-1,Ub=1):(a[(a[U>>2]|0)+((a[T>>2]|0)+-1<<3)+4>>2]=Q[ba>>0],ec=Eb,Fb=yc,gc=Tc,zc=-1,Ub=0);break d}while(0);if((Sc|0)<(ab|0))Wf=Xf,mh=ec,Be=Sc,yc=Fb,Tc=gc,ob=zc,Jc=Ub;else{Qg=Xf;gf=ec;He=Fb;Wg=gc;Od=zc;sf=Ub;break b}}a[q>>2]=7;break a}else gf=Qg=0,He=-1,Wg=Ic,Od=-1,sf=ee;while(0);K=(vi=125<(Od|0))?125:Od;b:do if(-1<(K|0)){ic=K;for(tf=vi?2:sf;2!=(tf|0);)if(tf=e[Oa+ic>>0]|0,0>=(ic|0)){lf=gf;break b}else ic=ic+-1|0;lf=gf|1048576}else lf=gf;while(0);a[bb>>2]&4?(a[hb>>2]|0)<(ab|0)&&(a[T>>2]=(a[T>>
2]|0)+-1):(a[(a[U>>2]|0)+((a[T>>2]|0)+-1<<3)>>2]=ab,a[La>>2]=Qg);vg&1==Wg<<24>>24&&(a[(a[U>>2]|0)+((a[T>>2]|0)+-1<<3)+4>>2]=1);wb&&(e[ba>>0]=a[(a[U>>2]|0)+4>>2]);di=a[T>>2]|0;if(0<(di|0))for(xi=a[U>>2]|0,Tg=lf,nf=0;;)if(ed=a[104+((a[xi+(nf<<3)+4>>2]&1)<<2)>>2]|Tg,nf=nf+1|0,(nf|0)==(di|0)){$f=ed;break}else Tg=ed;else $f=lf;od=d+96|0;Qc=d+124|0;a[Qc>>2]=(0==(e[od>>0]|0)|$f>>>7&1^1)^1|$f;a[d+128>>2]=He;fd=a[qa>>2]|0;Fc=a[hb>>2]|0;Vc=d+132|0;a[Vc>>2]=Fc;wg=d+52|0;if(!((Kc(wg,d+28|0,e[ub>>0]|0,Fc)|0)<<
24>>24)){a[q>>2]=7;break}pd=a[wg>>2]|0;a[ib>>2]=pd;xg=a[qa>>2]|0;w=pd;Gc=a[zb>>2]|0;cb=a[hb>>2]|0;Ef=a[Qc>>2]|0;e[Ea>>0]|0?(Wc=a[U>>2]|0,0<(a[Wc>>2]|0)?M=143:F=Ja(a[T>>2]|0,Wc,0)|0):M=143;143==(M|0)&&(F=e[ba>>0]|0);cc=d+244|0;a[cc>>2]=0;if(0<(a[q>>2]|0))break;Xc=me(Ef)|0;b:do if(2==(Xc|0)){if(1<(a[wa>>2]|0)>>>0){qd=a[T>>2]|0;if(0<(qd|0))xe=qd,yd=0;else{m=2;break}for(;;)if(yd?(Hc=Rc=a[U>>2]|0,Qd=a[Rc+(yd+-1<<3)>>2]|0):(Hc=a[U>>2]|0,Qd=0),Yc=a[Hc+(yd<<3)>>2]|0,(Yc|0)>(Qd|0)?(Cd(w+Qd|0,a[Hc+(yd<<3)+
4>>2]&255|0,Yc-Qd|0)|0,ca=a[T>>2]|0):ca=xe,yd=yd+1|0,(yd|0)>=(ca|0)){m=2;break b}else xe=ca}if(Ef&7985152){ta(d,Oa);r[Db>>1]=F&255;Ud=Oa+492|0;Wb=Oa+502|0;oc=Oa+504|0;yi=Oa+508|0;Vd=Oa+506|0;Nc=Oa+505|0;Bc=Oa+496|0;c:do{if(0<(cb|0)){Ua=F;Rb=Qb=Ob=db=gd=0;nb=F;for(Ba=eb=0;;){re=xg+db|0;Wd=e[re>>0]|0;ii=Wd&255;d:do switch(ii|0){case 15:case 12:case 14:case 11:ji=gd|262144;e[w+db>>0]=nb;ne=Ua&255;cg=2>(Wd+-11&255)?ne+2&382:(ne&127)+1|1;ki=cg&255;if(!(0==(Rb|Qb|0)&126>ki>>>0)){dc=Ua;Hb=ji;fc=Ob;hc=(0==
(Rb|0)&1)+Qb|0;Sb=Rb;Tb=nb;Ib=eb;Vb=Ba;break d}switch(Wd<<24>>24){case 15:case 12:ff=ki|128;break;default:ff=cg}li=eb+1|0;r[Db+(li<<1)>>1]=ff&255;dc=ff&255;Hb=ji;fc=db;hc=Qb;Sb=Rb;Tb=nb;Ib=li;Vb=Ba;break;case 16:te=gd|262144;e[w+db>>0]=nb;if(Rb){dc=Ua;Hb=te;fc=Ob;hc=Qb;Sb=Rb;Tb=nb;Ib=eb;Vb=Ba;break d}if(Qb){dc=Ua;Hb=te;fc=Ob;hc=Qb+-1|0;Sb=0;Tb=nb;Ib=eb;Vb=Ba;break d}if(!eb){dc=Ua;Hb=te;fc=Ob;Sb=hc=0;Tb=nb;Ib=0;Vb=Ba;break d}if(256<=(H[Db+(eb<<1)>>1]|0)){dc=Ua;Hb=te;fc=Ob;Sb=hc=0;Tb=nb;Ib=eb;Vb=Ba;
break d}mi=eb+-1|0;dc=r[Db+(mi<<1)>>1]&255;Hb=te;fc=db;Sb=hc=0;Tb=nb;Ib=mi;Vb=Ba;break;case 21:case 20:Lh=Ua&255;Xd=a[104+((Lh&1)<<2)>>2]|gd;Mh=Lh&127;e[w+db>>0]=Mh;(Mh|0)==(nb&127|0)?Yf=Xd|1024:(Zb(Oa,Ob,nb,Ua),Yf=Xd|-2147482624);qf=20==Wd<<24>>24?Lh+2&382:Mh+1|1;Xg=qf&255;if(!(0==(Rb|Qb|0)&126>(qf&254)>>>0)){e[re>>0]=9;dc=Ua;Hb=Yf;fc=Ob;hc=Qb;Sb=Rb+1|0;Tb=Ua;Ib=eb;Vb=Ba;break d}oi=Ba+1|0;(Ba|0)>=(a[cc>>2]|0)&&(a[cc>>2]=oi);qi=eb+1|0;r[Db+(qi<<1)>>1]=qf|256;Ff=a[Ud>>2]|0;e[Oa+496+(Ff<<4)+10>>0]=
10;ri=r[Oa+496+(Ff<<4)+6>>1]|0;Jd=Ff+1|0;a[Ud>>2]=Jd;r[Oa+496+(Jd<<4)+6>>1]=ri;r[Oa+496+(Jd<<4)+4>>1]=ri;e[Oa+496+(Jd<<4)+8>>0]=Xg;Ue=qf&1;a[Oa+496+(Jd<<4)+12>>2]=Ue;Gf=Ue&255;e[Oa+496+(Jd<<4)+10>>0]=Gf;e[Oa+496+(Jd<<4)+9>>0]=Gf;a[Oa+496+(Jd<<4)>>2]=0;dc=Xg;Hb=Yf|1<<ii;fc=db;hc=Qb;Sb=Rb;Tb=Ua;Ib=qi;Vb=oi;break;case 22:(Ua^nb)&127?(Zb(Oa,Ob,nb,Ua),hf=gd|-2147483648):hf=gd;if(Rb)e[re>>0]=9,Zf=hf,pf=Ob,eg=Qb,fg=Rb+-1|0,kc=eb,id=Ba;else if(Ba){jc=eb;do wf=jc,jc=jc+-1|0;while(256>(H[Db+(wf<<1)>>1]|0));
yg=(a[Ud>>2]|0)+-1|0;a[Ud>>2]=yg;e[Oa+496+(yg<<4)+10>>0]=10;Zf=hf|4194304;pf=db;fg=eg=0;kc=jc;id=Ba+-1|0}else e[re>>0]=9,Zf=hf,pf=Ob,eg=Qb,fg=0,kc=eb,id=0;zg=r[Db+(kc<<1)>>1]|0;$b=zg&255;Ag=zg&255;Kb=Zf|a[104+((Ag&1)<<2)>>2]|1024;e[w+db>>0]=Ag&127;dc=$b;Hb=Kb;fc=pf;hc=eg;Sb=fg;Tb=$b;Ib=kc;Vb=id;break;case 7:Bg=gd|128;e[Ea>>0]|0?(Ve=a[U>>2]|0,(db|0)<(a[Ve>>2]|0)?M=206:Zh=Ja(a[T>>2]|0,Ve,db)|0):M=206;206==(M|0)&&(M=0,Zh=e[ba>>0]|0);e[w+db>>0]=Zh;Yd=db+1|0;if((Yd|0)>=(cb|0)){dc=Ua;Hb=Bg;fc=Ob;hc=Qb;
Sb=Rb;Tb=nb;Ib=eb;Vb=Ba;break d}if(13==(r[Gc+(db<<1)>>1]|0)&&10==(r[Gc+(Yd<<1)>>1]|0)){dc=Ua;Hb=Bg;fc=Ob;hc=Qb;Sb=Rb;Tb=nb;Ib=eb;Vb=Ba;break d}e[Ea>>0]|0?(Mc=a[U>>2]|0,(Yd|0)<(a[Mc>>2]|0)?M=213:tg=Ja(a[T>>2]|0,Mc,Yd)|0):M=213;213==(M|0)&&(M=0,tg=e[ba>>0]|0);r[Db>>1]=tg&255;a[Ud>>2]=0;r[Wb>>1]=0;e[oc>>0]=tg;ch=tg&1;a[yi>>2]=ch;Cg=ch&255;e[Vd>>0]=Cg;e[Nc>>0]=Cg;a[Bc>>2]=0;dc=tg;Hb=Bg;fc=Ob;Sb=hc=0;Tb=tg;Vb=Ib=0;break;case 18:e[w+db>>0]=nb;dc=Ua;Hb=gd|262144;fc=Ob;hc=Qb;Sb=Rb;Tb=nb;Ib=eb;Vb=Ba;break;
default:Dg=Ua&255;(Ua^nb)&127?(Zb(Oa,Ob,nb,Ua),We=gd|-2147483648,Jf=Dg&1,Rg=Dg&128?a[112+(Jf<<2)>>2]|We:a[120+(Jf<<2)>>2]|We):Rg=gd;e[w+db>>0]=Ua;if(!((P(Oa,db)|0)<<24>>24)){c=-1;break c}dc=Ua;Hb=1<<Q[re>>0]|Rg;fc=Ob;hc=Qb;Sb=Rb;Tb=Ua;Ib=eb;Vb=Ba}while(0);db=db+1|0;if((db|0)>=(cb|0))break;else Ua=dc,gd=Hb,Ob=fc,Qb=hc,Rb=Sb,nb=Tb,eb=Ib,Ba=Vb}if(!(Hb&8380376)){kf=Hb;M=226;break}kf=a[104+((Q[ba>>0]&1)<<2)>>2]|Hb}else kf=0;M=226}while(0);226==(M|0)&&(Sg=(0==(e[od>>0]|0)|kf>>>7&1^1)^1|kf,a[Qc>>2]=Sg,c=
me(Sg)|0);m=c}else{ta(d,Db);xb=Db+492|0;Xb=Db+502|0;qc=Db+504|0;ac=Db+508|0;ad=Db+506|0;Ac=Db+505|0;Lb=Db+496|0;nc=a[T>>2]|0;c:do if(0<(nc|0)){df=nc;zd=0;d:for(;;){zd?(Jh=nd=a[U>>2]|0,Ie=a[nd+(zd+-1<<3)>>2]|0):(Jh=a[U>>2]|0,Ie=0);bd=a[Jh+(zd<<3)>>2]|0;ke=a[Jh+(zd<<3)+4>>2]|0;ei=ke&255;fi=ke&1;gi=fi&255;if((Ie|0)<(bd|0)){sd=Ie;do{e[w+sd>>0]=ei;e:do switch(e[xg+sd>>0]|0){case 18:break;case 7:hi=sd+1|0;if((hi|0)>=(cb|0))break e;if(13==(r[Gc+(sd<<1)>>1]|0)&&10==(r[Gc+(hi<<1)>>1]|0))break e;a[xb>>2]=0;
r[Xb>>1]=0;e[qc>>0]=ei;a[ac>>2]=fi;e[ad>>0]=gi;e[Ac>>0]=gi;a[Lb>>2]=0;break;default:if(!((P(Db,sd)|0)<<24>>24))break d}while(0);sd=sd+1|0}while((sd|0)<(bd|0));pe=a[T>>2]|0}else pe=df;zd=zd+1|0;if((zd|0)>=(pe|0)){D=2;break c}else df=pe}a[q>>2]=7;D=0}else D=2;while(0);m=D}}else m=Xc;while(0);if(0<(a[q>>2]|0))break;k=a[cc>>2]|0;do if(6>(k|0))a[d+248>>2]=d+252;else if(dh=k<<4,Lf=d+44|0,Y=d+68|0,(dh|0)<=(a[Lf>>2]|0))a[d+248>>2]=a[Y>>2];else if((Kc(Y,Lf,1,dh)|0)<<24>>24)a[d+248>>2]=a[Y>>2];else{a[q>>2]=
7;break a}while(0);a[cc>>2]=-1;a[na>>2]=m;b:do switch(m|0){case 0:a[Vc>>2]=0;break;case 1:a[Vc>>2]=0;break;default:c:do switch(a[wa>>2]|0){case 0:a[d+116>>2]=128;break;case 1:a[d+116>>2]=144;break;case 2:a[d+116>>2]=160;break;case 4:a[d+116>>2]=176;break;case 5:eh=d+116|0;a[eh>>2]=a[bb>>2]&1?192:208;break c;case 6:Eg=d+116|0;a[Eg>>2]=a[bb>>2]&1?224:240;break c}while(0);ue=a[T>>2]|0;2>(ue|0)?0>(a[Qc>>2]|0)?M=262:(e[Ea>>0]|0?(Mf=a[U>>2]|0,Fg=a[Mf>>2]|0,n=0<(Fg|0)?e[ba>>0]|0:Ja(ue,Mf,0)|0,Gg=n&1,v=(Fc|
0)>(Fg|0)?Ja(ue,Mf,Fc+-1|0)|0:e[ba>>0]|0,Hg=Gg):(v=fh=e[ba>>0]|0,Hg=fh&1),E(d,0,Fc,Hg,v&1)):M=262;if(262==(M|0))for(Nf=a[ib>>2]|0,e[Ea>>0]|0?(Ig=a[U>>2]|0,0<(a[Ig>>2]|0)?M=264:z=Ja(ue,Ig,0)|0):M=264,264==(M|0)&&(z=e[ba>>0]|0),Of=e[Nf>>0]|0,gh=Fc+-1|0,Ae=((z&255)<(Of&255)?Of:z)&1,xd=0,dg=Of;;){0<(xd|0)?7!=(e[fd+(xd+-1)>>0]|0)?hg=Ae:(e[Ea>>0]|0?(hh=a[U>>2]|0,(xd|0)<(a[hh>>2]|0)?M=271:Yh=Ja(a[T>>2]|0,hh,xd)|0):M=271,271==(M|0)&&(M=0,Yh=e[ba>>0]|0),hg=Yh&1):hg=Ae;Pf=xd+1|0;c:do if((Pf|0)<(Fc|0))for(ve=
Pf;;){Jg=e[Nf+ve>>0]|0;if(Jg<<24>>24!=dg<<24>>24&&!(1<<Q[fd+ve>>0]&382976)){Xe=ve;ef=1;rf=Jg;break c}Kd=ve+1|0;if((Kd|0)<(Fc|0))ve=Kd;else{Id=Kd;M=278;break}}else Id=Pf,M=278;while(0);c:do if(278==(M|0)){M=0;do if(e[Ea>>0]|0&&(Qf=a[U>>2]|0,!((Fc|0)<=(a[Qf>>2]|0)))){Xe=Id;ef=0;rf=Ja(a[T>>2]|0,Qf,gh)|0;break c}while(0);Xe=Id;ef=0;rf=e[ba>>0]|0}while(0);Rf=dg&255;Kg=rf&255;Ae=((Rf&127)>>>0<(Kg&127)>>>0?Kg:Rf)&1;if(Rf&128){Pd=xd;do ih=Nf+Pd|0,Pd=Pd+1|0,e[ih>>0]=Q[ih>>0]&127;while((Pd|0)<(Xe|0))}else E(d,
xd,Xe,hg,Ae);if(ef)xd=Xe,dg=rf;else break}Ye=a[d+344>>2]|0;if(0<(Ye|0)){a[q>>2]=Ye;break a}Ze=a[qa>>2]|0;Zd=a[ib>>2]|0;if(!(a[Qc>>2]&8248192))break b;Lg=a[Vc>>2]|0;$e=0!=(e[od>>0]|0);if(0<(Lg|0))ag=Lg;else break b;for(;;){if(0<(ag|0))Ld=ag;else break b;for(;;){$d=Ld+-1|0;Zc=e[Ze+$d>>0]|0;if(!(1<<(Zc&255)&8248192))break;$e&7==Zc<<24>>24?e[Zd+$d>>0]=0:(e[Ea>>0]|0?($c=a[U>>2]|0,(Ld|0)<=(a[$c>>2]|0)?M=298:Bf=Ja(a[T>>2]|0,$c,$d)|0):M=298,298==(M|0)&&(M=0,Bf=e[ba>>0]|0),e[Zd+$d>>0]=Bf);if(1<(Ld|0))Ld=$d;
else break b}if(1<(Ld|0))Md=$d;else break b;for(;;){Nb=Md+-1|0;af=e[Ze+Nb>>0]|0;Mg=1<<(af&255);if(Mg&382976)e[Zd+Nb>>0]=e[Zd+Md>>0]|0;else{if($e&7==af<<24>>24){M=305;break}if(Mg&384){M=308;break}}if(1<(Md|0))Md=Nb;else break b}305==(M|0)?(M=0,e[Zd+Nb>>0]=0):308==(M|0)&&(M=0,e[Ea>>0]|0?(bf=a[U>>2]|0,(Md|0)<=(a[bf>>2]|0)?M=310:C=Ja(a[T>>2]|0,bf,Nb)|0):M=310,310==(M|0)&&(M=0,C=e[ba>>0]|0),e[Zd+Nb>>0]=C);if(1<(Md|0))ag=Nb;else break}}while(0);do if(e[Ea>>0]|0&&a[bb>>2]&1&&!(2<=((a[wa>>2]|0)+-5|0)>>>0)&&
(cf=a[T>>2]|0,0<(cf|0)))for(ye=cf,wd=0;;){Tf=a[U>>2]|0;Ng=a[Tf+(wd<<3)>>2]|0;vd=Ng+-1|0;b:do if(a[Tf+(wd<<3)+4>>2]&255)if(ae=wd?a[Tf+(wd+-1<<3)>>2]|0:0,(Ng|0)>(ae|0)){for(Ee=vd;;){we=e[fd+Ee>>0]|0;if(!(we<<24>>24))break;if(1<<(we&255)&8194){be=ye;break b}if((Ee|0)>(ae|0))Ee=Ee+-1|0;else{be=ye;break b}}if((Ee|0)<(vd|0))for(of=vd;;)if(7==(e[fd+of>>0]|0))of=of+-1|0;else{Vg=of;break}else Vg=vd;S(d,Vg,4);be=a[T>>2]|0}else be=ye;else be=ye;while(0);wd=wd+1|0;if((wd|0)>=(be|0))break;else ye=be}while(0);
Ke=a[bb>>2]&2?(a[gb>>2]|0)-(a[La>>2]|0)|0:(a[gb>>2]|0)+(a[Ab>>2]|0)|0;a[gb>>2]=Ke;a[d+104>>2]=0;a[d+112>>2]=0;a[d>>2]=d;break}a[q>>2]=1}while(0);A=ge}function k(d){d|=0;var f=0,p=0,u=0,q=0,b=0,c=0,D=0,J=0,l=0,G=0,e=0,w=0,g=0,Qe=0,h=0,k=0,r=0,y=0,B=0,t=0,Bf=0,F=0,A=0,C=0,n=0,v=0,H=0,x=0,z=0,Q=0,E=0,K=0,Ec=0,R=0,X=0,da=0,bc=0,Df=0,ua=0,wc=0,Re=0,va=0,ug=0,yb=0,fb=0,pb=0,P=0,wa=0,Xa=0,qb=0,rb=0,ha=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=
0,ub=0,$a=0,fa=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,S=0,oa=0,lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,Ta=0,L=0,Aa=0,Bb=0,W=0,ga=0,aa=0,Ca=0,ma=0,Uc=0,ca=0,Fa=0,Pc=0,ta=0,xc=0,Ja=0,cd=0,vg=0,Se=0,Cb=0,Te=0,dd=0,xb=0,Xb=0,qc=0,ac=0,ad=0,bh=0,Ac=0,ed=0,od=0,Qc=0,fd=0,Fc=0,Vc=0,wg=0,pd=0,xg=0,Gc=0,cb=0,Ef=0,Wc=0,cc=0,Xc=0,qd=0,rd=0,Rc=0,Hc=0,Yc=0,Na=0,nc=0,Lb=0,bd=0,ld=0,md=0,pc=0,Zb=0,nd=0,$b=0,Cc=0,Jb=0,vc=0,Mc=0,mc=0,Wb=0,oc=0,Nc=0,Bc=0,oe=0,pe=0,Ud=0,rc=0,
qe=0,Oc=0,Yb=0,Vd=0,sc=0,tc=0,re=0,Wd=0,uc=0,Kb=0,se=0,Hd=0,Dc=0,Kc=0,te=0,Cd=0,Ed=0,Xd=0,Td=0,Fd=0,Gd=0,Dd=0,Sd=0,Ff=0,he=0,Jd=0,Ue=0,Gf=0,le=0,me=0,yg=0,zg=0,yf=0,Ag=0,sg=0,Bg=0,Ve=0,Yd=0,Hf=0,vh=0,ch=0,Cg=0,Dg=0,If=0,We=0,Jf=0,Kf=0,dh=0,Lf=0,Y=0,eh=0,Eg=0,ue=0,fh=0,Mf=0,Fg=0,Gg=0,Hg=0,Nf=0,Ig=0,Of=0,gh=0,hh=0,Pf=0,ve=0,Jg=0,Kd=0,Qf=0,Rf=0,Kg=0,Sf=0,Xe=0,ih=0,Ye=0,Ze=0,Zd=0,Lg=0,$e=0,$d=0,Zc=0,$c=0,Nb=0,af=0,Mg=0,bf=0,cf=0,Tf=0,Ng=0,vd=0,ae=0,Uf=0,we=0,Og=0,be=0,xe=0,df=0,ef=0,ye=0,jh=0,kh=0,lh=
0,Vf=0,Pg=0,ce=0,ze=0,Db=0,Oa=0,Qg=0,Wf=0,Xf=0,Ua=0,ff=0,dc=0,Ae=0,ec=0,gf=0,gd=0,mh=0,Eb=0,Yf=0,hf=0,Zf=0,Rg=0,jf=0,Hb=0,kf=0,lf=0,Sg=0,$f=0,Tg=0,mf=0,Be=0,ag=0,Ce=0,wd=0,De=0,Sc=0,Ld=0,sd=0,Ug=0,td=0,de=0,nf=0,Md=0,db=0,Nd=0,bg=0,Ee=0,Fe=0,Ge=0,of=0,Vg=0,Fb=0,He=0,yc=0,Ob=0,pf=0,fc=0,gc=0,Wg=0,Tc=0,Ic=0,xd=0,cg=0,Xg=0,qf=0,dg=0,rf=0,Qb=0,eg=0,hc=0,Rb=0,fg=0,Sb=0,yd=0,zd=0,nb=0,Tb=0,hd=0,Ad=0,Gb=0,gg=0,hg=0,zc=0,Od=0,eb=0,ob=0,ic=0,jc=0,kc=0,Ib=0,Pd=0,Qd=0,Ie=0,Ub=0,sf=0,Jc=0,ee=0,Je=0,ig=0,tf=0,
Ke=0,Va=0,la=0,jg=0,Ba=0,id=0,Vb=0,uf=0,fe=0,M=0,ge=0,kg=0,nh=0,oh=0,vf=0,wf=0,lc=0,jd=0,Le=0,ud=0,Bd=0,ie=0,lg=0,kd=0,mg=0,ng=0,Me=0,Lc=0,I=0,Rd=0,je=0,Yg=0,Ia=0,Wa=0,ph=0,Zg=0,og=0,Z=0,pg=0,Ne=0,sa=0,qh=0;do if(245>d>>>0){cb=11>d>>>0?16:d+11&-8;pe=cb>>>3;Hf=a[164]|0;Ye=Hf>>>pe;if(Ye&3)return Df=(Ye&1^1)+pe|0,ug=Df<<1,pb=696+(ug<<2)|0,ha=696+(ug+2<<2)|0,tb=a[ha>>2]|0,T=tb+8|0,Pa=a[T>>2]|0,(pb|0)==(Pa|0)?a[164]=Hf&~(1<<Df):(Pa>>>0<(a[168]|0)>>>0&&m(),Ga=Pa+12|0,(a[Ga>>2]|0)==(tb|0)?(a[Ga>>2]=pb,a[ha>>
2]=Pa):m()),za=Df<<3,a[tb+4>>2]=za|3,ga=tb+(za|4)|0,a[ga>>2]|=1,Va=T,Va|0;vg=a[166]|0;if(cb>>>0>vg>>>0){if(Ye)return Vc=2<<pe,Wc=Ye<<pe&(Vc|0-Vc),bd=(Wc&0-Wc)+-1|0,Cc=bd>>>12&16,mc=bd>>>Cc,Nc=mc>>>5&8,Oc=mc>>>Nc,uc=Oc>>>2&4,Ed=Oc>>>uc,he=Ed>>>1&2,Ag=Ed>>>he,Dg=Ag>>>1&1,Eg=(Nc|Cc|uc|he|Dg)+(Ag>>>Dg)|0,Fg=Eg<<1,Nf=696+(Fg<<2)|0,Pf=696+(Fg+2<<2)|0,Kd=a[Pf>>2]|0,Kg=Kd+8|0,Ze=a[Kg>>2]|0,(Nf|0)==(Ze|0)?(a[164]=Hf&~(1<<Eg),wd=vg):(Ze>>>0<(a[168]|0)>>>0&&m(),be=Ze+12|0,(a[be>>2]|0)==(Kd|0)?(a[be>>2]=Nf,a[Pf>>
2]=Ze,wd=a[166]|0):m()),Wf=Eg<<3,ff=Wf-cb|0,a[Kd+4>>2]=cb|3,mh=Kd+cb|0,a[Kd+(cb|4)>>2]=ff|1,a[Kd+Wf>>2]=ff,wd&&(Sc=a[169]|0,Ug=wd>>>3,Md=Ug<<1,Ee=696+(Md<<2)|0,Ge=a[164]|0,Ob=1<<Ug,Ge&Ob?(eg=696+(Md+2<<2)|0,g=a[eg>>2]|0,g>>>0<(a[168]|0)>>>0?m():(D=eg,zd=g)):(a[164]=Ge|Ob,D=696+(Md+2<<2)|0,zd=Ee),a[D>>2]=Sc,a[zd+12>>2]=Sc,a[Sc+8>>2]=zd,a[Sc+12>>2]=Ee),a[166]=ff,a[169]=mh,Va=Kg,Va|0;if(H=a[165]|0){K=(H&0-H)+-1|0;Ec=K>>>12&16;R=K>>>Ec;X=R>>>5&8;da=R>>>X;bc=da>>>2&4;ua=da>>>bc;wc=ua>>>1&2;Re=ua>>>wc;
va=Re>>>1&1;yb=a[960+((X|Ec|bc|wc|va)+(Re>>>va)<<2)>>2]|0;id=(a[yb+4>>2]&-8)-cb|0;for(Wa=lg=yb;;){if(fb=a[lg+16>>2]|0)wa=fb;else if(P=a[lg+20>>2]|0)wa=P;else break;Xa=(a[wa+4>>2]&-8)-cb|0;id=(qb=Xa>>>0<id>>>0)?Xa:id;lg=wa;Wa=qb?wa:Wa}rb=a[168]|0;Wa>>>0<rb>>>0&&m();Ya=Wa+cb|0;Wa>>>0>=Ya>>>0&&m();sb=a[Wa+24>>2]|0;zb=a[Wa+12>>2]|0;do if((zb|0)==(Wa|0)){Za=Wa+20|0;if(na=a[Za>>2]|0)Od=na,Ib=Za;else if(qa=Wa+16|0,ib=a[qa>>2]|0)Od=ib,Ib=qa;else{ic=0;break}for(;;)if(ja=Od+20|0,Ab=a[ja>>2]|0)Od=Ab,Ib=ja;else if(Da=
Od+16|0,Ea=a[Da>>2]|0)Od=Ea,Ib=Da;else break;Ib>>>0<rb>>>0?m():(a[Ib>>2]=0,ic=Od)}else gb=a[Wa+8>>2]|0,gb>>>0<rb>>>0&&m(),hb=gb+12|0,(a[hb>>2]|0)!=(Wa|0)&&m(),ba=zb+8|0,(a[ba>>2]|0)==(Wa|0)?(a[hb>>2]=zb,a[ba>>2]=gb,ic=zb):m();while(0);do if(sb){Qa=a[Wa+28>>2]|0;U=960+(Qa<<2)|0;if((Wa|0)==(a[U>>2]|0)){if(a[U>>2]=ic,!ic){a[165]&=~(1<<Qa);break}}else if(sb>>>0<(a[168]|0)>>>0&&m(),jb=sb+16|0,(a[jb>>2]|0)==(Wa|0)?a[jb>>2]=ic:a[sb+20>>2]=ic,!ic)break;Ma=a[168]|0;ic>>>0<Ma>>>0&&m();a[ic+24>>2]=sb;if(ub=
a[Wa+16>>2]|0)ub>>>0<Ma>>>0?m():(a[ic+16>>2]=ub,a[ub+24>>2]=ic);if($a=a[Wa+20>>2]|0)$a>>>0<(a[168]|0)>>>0?m():(a[ic+20>>2]=$a,a[$a+24>>2]=ic)}while(0);if(16>id>>>0)fa=id+cb|0,a[Wa+4>>2]=fa|3,xa=Wa+(fa+4)|0,a[xa>>2]|=1;else{a[Wa+4>>2]=cb|3;a[Wa+(cb|4)>>2]=id|1;a[Wa+(id+cb)>>2]=id;if(ab=a[166]|0)vb=a[169]|0,Ka=ab>>>3,wb=Ka<<1,bb=696+(wb<<2)|0,kb=a[164]|0,S=1<<Ka,kb&S?(oa=696+(wb+2<<2)|0,lb=a[oa>>2]|0,lb>>>0<(a[168]|0)>>>0?m():(b=oa,yd=lb)):(a[164]=kb|S,b=696+(wb+2<<2)|0,yd=bb),a[b>>2]=vb,a[yd+12>>2]=
vb,a[vb+8>>2]=yd,a[vb+12>>2]=bb;a[166]=id;a[169]=Ya}Va=Wa+8|0;return Va|0}}la=cb}else if(4294967231<d>>>0)la=-1;else{ea=d+11|0;N=ea&-8;if(mb=a[165]|0){pa=0-N|0;(O=ea>>>8)?16777215<N>>>0?Ke=31:(Ra=(O+1048320|0)>>>16&8,ya=O<<Ra,Sa=(ya+520192|0)>>>16&4,ra=ya<<Sa,ia=(ra+245760|0)>>>16&2,Ha=14-(Sa|Ra|ia)+(ra<<ia>>>15)|0,Ke=N>>>(Ha+7|0)&1|Ha<<1):Ke=0;V=a[960+(Ke<<2)>>2]|0;a:do if(V)for(Vb=pa,kg=0,oh=N<<(31==(Ke|0)?0:25-(Ke>>>1)|0),kd=V,ph=0;;){ka=a[kd+4>>2]&-8;La=ka-N|0;if(La>>>0<Vb>>>0)if((ka|0)==(N|0)){ge=
La;Ne=Lc=kd;sa=90;break a}else uf=La,Zg=kd;else uf=Vb,Zg=ph;Ta=a[kd+20>>2]|0;kd=a[kd+16+(oh>>>31<<2)>>2]|0;nh=0==(Ta|0)|(Ta|0)==(kd|0)?kg:Ta;if(kd)Vb=uf,kg=nh,oh<<=1,ph=Zg;else{fe=uf;mg=nh;og=Zg;sa=86;break}}else fe=pa,og=mg=0,sa=86;while(0);if(86==(sa|0)){if(0==(mg|0)&0==(og|0)){L=2<<Ke;Aa=(L|0-L)&mb;if(!Aa){la=N;break}Bb=(Aa&0-Aa)+-1|0;W=Bb>>>12&16;aa=Bb>>>W;Ca=aa>>>5&8;ma=aa>>>Ca;Uc=ma>>>2&4;ca=ma>>>Uc;Fa=ca>>>1&2;Pc=ca>>>Fa;ta=Pc>>>1&1;ng=a[960+((Ca|W|Uc|Fa|ta)+(Pc>>>ta)<<2)>>2]|0;pg=0}else ng=
mg,pg=og;ng?(ge=fe,Lc=ng,Ne=pg,sa=90):(M=fe,Z=pg)}if(90==(sa|0))for(;;)if(sa=0,xc=(a[Lc+4>>2]&-8)-N|0,J=(Ja=xc>>>0<ge>>>0)?xc:ge,Me=Ja?Lc:Ne,cd=a[Lc+16>>2]|0)ge=J,Lc=cd,Ne=Me,sa=90;else if(Lc=a[Lc+20>>2]|0)ge=J,Ne=Me,sa=90;else{M=J;Z=Me;break}if(Z&&M>>>0<((a[166]|0)-N|0)>>>0){Se=a[168]|0;Z>>>0<Se>>>0&&m();Cb=Z+N|0;Z>>>0>=Cb>>>0&&m();Te=a[Z+24>>2]|0;dd=a[Z+12>>2]|0;do if((dd|0)==(Z|0)){ac=Z+20|0;if(ad=a[ac>>2]|0)ob=ad,Qd=ac;else if(bh=Z+16|0,Ac=a[bh>>2]|0)ob=Ac,Qd=bh;else{kc=0;break}for(;;)if(ed=ob+
20|0,od=a[ed>>2]|0)ob=od,Qd=ed;else if(Qc=ob+16|0,fd=a[Qc>>2]|0)ob=fd,Qd=Qc;else break;Qd>>>0<Se>>>0?m():(a[Qd>>2]=0,kc=ob)}else xb=a[Z+8>>2]|0,xb>>>0<Se>>>0&&m(),Xb=xb+12|0,(a[Xb>>2]|0)!=(Z|0)&&m(),qc=dd+8|0,(a[qc>>2]|0)==(Z|0)?(a[Xb>>2]=dd,a[qc>>2]=xb,kc=dd):m();while(0);do if(Te){Fc=a[Z+28>>2]|0;wg=960+(Fc<<2)|0;if((Z|0)==(a[wg>>2]|0)){if(a[wg>>2]=kc,!kc){a[165]&=~(1<<Fc);break}}else if(Te>>>0<(a[168]|0)>>>0&&m(),pd=Te+16|0,(a[pd>>2]|0)==(Z|0)?a[pd>>2]=kc:a[Te+20>>2]=kc,!kc)break;xg=a[168]|0;kc>>>
0<xg>>>0&&m();a[kc+24>>2]=Te;if(Gc=a[Z+16>>2]|0)Gc>>>0<xg>>>0?m():(a[kc+16>>2]=Gc,a[Gc+24>>2]=kc);if(Ef=a[Z+20>>2]|0)Ef>>>0<(a[168]|0)>>>0?m():(a[kc+20>>2]=Ef,a[Ef+24>>2]=kc)}while(0);a:do if(16>M>>>0)cc=M+N|0,a[Z+4>>2]=cc|3,Xc=Z+(cc+4)|0,a[Xc>>2]|=1;else if(a[Z+4>>2]=N|3,a[Z+(N|4)>>2]=M|1,a[Z+(M+N)>>2]=M,qd=M>>>3,256>M>>>0)rd=qd<<1,Rc=696+(rd<<2)|0,Hc=a[164]|0,Yc=1<<qd,Hc&Yc?(Na=696+(rd+2<<2)|0,nc=a[Na>>2]|0,nc>>>0<(a[168]|0)>>>0?m():(q=Na,Tb=nc)):(a[164]=Hc|Yc,q=696+(rd+2<<2)|0,Tb=Rc),a[q>>2]=Cb,
a[Tb+12>>2]=Cb,a[Z+(N+8)>>2]=Tb,a[Z+(N+12)>>2]=Rc;else if((Lb=M>>>8)?16777215<M>>>0?Ad=31:(ld=(Lb+1048320|0)>>>16&8,md=Lb<<ld,pc=(md+520192|0)>>>16&4,Zb=md<<pc,nd=(Zb+245760|0)>>>16&2,$b=14-(pc|ld|nd)+(Zb<<nd>>>15)|0,Ad=M>>>($b+7|0)&1|$b<<1):Ad=0,Jb=960+(Ad<<2)|0,a[Z+(N+28)>>2]=Ad,a[Z+(N+20)>>2]=0,a[Z+(N+16)>>2]=0,vc=a[165]|0,Mc=1<<Ad,vc&Mc){Wb=a[Jb>>2]|0;b:do if((a[Wb+4>>2]&-8|0)==(M|0))Ie=Wb;else{gg=M<<(31==(Ad|0)?0:25-(Ad>>>1)|0);for(Jc=Wb;;){Bc=Jc+16+(gg>>>31<<2)|0;oc=a[Bc>>2]|0;if(!oc)break;
if((a[oc+4>>2]&-8|0)==(M|0)){Ie=oc;break b}else gg<<=1,Jc=oc}if(Bc>>>0<(a[168]|0)>>>0)m();else{a[Bc>>2]=Cb;a[Z+(N+24)>>2]=Jc;a[Z+(N+12)>>2]=Cb;a[Z+(N+8)>>2]=Cb;break a}}while(0);oe=Ie+8|0;Ud=a[oe>>2]|0;rc=a[168]|0;Ud>>>0>=rc>>>0&Ie>>>0>=rc>>>0?(a[Ud+12>>2]=Cb,a[oe>>2]=Cb,a[Z+(N+8)>>2]=Ud,a[Z+(N+12)>>2]=Ie,a[Z+(N+24)>>2]=0):m()}else a[165]=vc|Mc,a[Jb>>2]=Cb,a[Z+(N+24)>>2]=Jb,a[Z+(N+12)>>2]=Cb,a[Z+(N+8)>>2]=Cb;while(0);Va=Z+8|0;return Va|0}}la=N}while(0);qe=a[166]|0;if(qe>>>0>=la>>>0)return Yb=qe-la|
0,Vd=a[169]|0,15<Yb>>>0?(a[169]=Vd+la,a[166]=Yb,a[Vd+(la+4)>>2]=Yb|1,a[Vd+qe>>2]=Yb,a[Vd+4>>2]=la|3):(a[166]=0,a[169]=0,a[Vd+4>>2]=qe|3,sc=Vd+(qe+4)|0,a[sc>>2]|=1),Va=Vd+8|0,Va|0;tc=a[167]|0;if(tc>>>0>la>>>0)return re=tc-la|0,a[167]=re,Wd=a[170]|0,a[170]=Wd+la,a[Wd+(la+4)>>2]=re|1,a[Wd+4>>2]=la|3,Va=Wd+8|0,Va|0;a[282]|0||(Kb=Af(30)|0,Kb+-1&Kb?m():(a[284]=Kb,a[283]=Kb,a[285]=-1,a[286]=-1,a[287]=0,a[275]=0,se=(zf(0)|0)&-16^1431655768,a[282]=se));Hd=la+48|0;Dc=a[284]|0;Kc=la+47|0;te=Dc+Kc|0;Cd=0-Dc|
0;Xd=te&Cd;if(Xd>>>0<=la>>>0)return Va=0,Va|0;if(Td=a[274]|0)if(Fd=a[272]|0,Gd=Fd+Xd|0,Gd>>>0<=Fd>>>0|Gd>>>0>Td>>>0)return Va=0,Va|0;a:do{if(a[275]&4)Yg=0;else{Dd=a[170]|0;b:do if(Dd){for(vf=1104;;){Sd=a[vf>>2]|0;if(Sd>>>0<=Dd>>>0&&(Ff=vf+4|0,(Sd+(a[Ff>>2]|0)|0)>>>0>Dd>>>0))break;if(Jd=a[vf+8>>2]|0)vf=Jd;else{sa=174;break b}}Ve=te-(a[167]|0)&Cd;if(2147483647>Ve>>>0)if(Yd=ke(Ve|0)|0,f=(vh=(Yd|0)==((a[vf>>2]|0)+(a[Ff>>2]|0)|0))?Ve:0,vh)if(-1==(Yd|0))je=f;else{I=Yd;Ia=f;sa=194;break a}else ig=Yd,Bd=
Ve,Rd=f,sa=184;else je=0}else sa=174;while(0);do if(174==(sa|0))if(Ue=ke(0)|0,-1==(Ue|0))je=0;else if(Gf=Ue,le=a[283]|0,me=le+-1|0,ud=me&Gf?Xd-Gf+(me+Gf&0-le)|0:Xd,yg=a[272]|0,zg=yg+ud|0,ud>>>0>la>>>0&2147483647>ud>>>0)if((yf=a[274]|0)&&zg>>>0<=yg>>>0|zg>>>0>yf>>>0)je=0;else if(sg=ke(ud|0)|0,Le=(Bg=(sg|0)==(Ue|0))?ud:0,Bg){I=Ue;Ia=Le;sa=194;break a}else ig=sg,Bd=ud,Rd=Le,sa=184;else je=0;while(0);b:do if(184==(sa|0)){ch=0-Bd|0;do if(Hd>>>0>Bd>>>0&2147483647>Bd>>>0&-1!=(ig|0))if(Cg=a[284]|0,If=Kc-
Bd+Cg&0-Cg,2147483647>If>>>0)if(-1==(ke(If|0)|0)){ke(ch|0)|0;je=Rd;break b}else ie=If+Bd|0;else ie=Bd;else ie=Bd;while(0);if(-1==(ig|0))je=Rd;else{I=ig;Ia=ie;sa=194;break a}}while(0);a[275]|=4;Yg=je}sa=191}while(0);191==(sa|0)&&2147483647>Xd>>>0&&(We=ke(Xd|0)|0,Jf=ke(0)|0,We>>>0<Jf>>>0&-1!=(We|0)&-1!=(Jf|0)&&(Kf=Jf-We|0,dh=Kf>>>0>(la+40|0)>>>0))&&(I=We,Ia=dh?Kf:Yg,sa=194);if(194==(sa|0)){Lf=(a[272]|0)+Ia|0;a[272]=Lf;Lf>>>0>(a[273]|0)>>>0&&(a[273]=Lf);Y=a[170]|0;a:do if(Y){for(lc=1104;;){Ig=a[lc>>
2]|0;Of=lc+4|0;gh=a[Of>>2]|0;if((I|0)==(Ig+gh|0)){sa=204;break}if(hh=a[lc+8>>2]|0)lc=hh;else break}if(204==(sa|0)&&!(a[lc+12>>2]&8)&&Y>>>0<I>>>0&Y>>>0>=Ig>>>0)a[Of>>2]=gh+Ia,ve=(a[167]|0)+Ia|0,Jg=Y+8|0,Qf=0==(Jg&7|0)?0:0-Jg&7,Rf=ve-Qf|0,a[170]=Y+Qf,a[167]=Rf,a[Y+(Qf+4)>>2]=Rf|1,a[Y+(ve+4)>>2]=40,a[171]=a[286];else{Sf=a[168]|0;we=I>>>0<Sf>>>0?a[168]=I:Sf;Xe=I+Ia|0;for(jd=1104;;){if((a[jd>>2]|0)==(Xe|0)){sa=212;break}if(ih=a[jd+8>>2]|0)jd=ih;else{wf=1104;break}}if(212==(sa|0))if(a[jd+12>>2]&8)wf=1104;
else{a[jd>>2]=I;Zd=jd+4|0;a[Zd>>2]=(a[Zd>>2]|0)+Ia;Lg=I+8|0;$e=0==(Lg&7|0)?0:0-Lg&7;$d=I+(Ia+8)|0;Zc=0==($d&7|0)?0:0-$d&7;$c=I+(Zc+Ia)|0;l=$e+la|0;Nb=I+l|0;af=$c-(I+$e)-la|0;a[I+($e+4)>>2]=la|3;b:do if(($c|0)==(Y|0))Mg=(a[167]|0)+af|0,a[167]=Mg,a[170]=Nb,a[I+(l+4)>>2]=Mg|1;else if(($c|0)==(a[169]|0))bf=(a[166]|0)+af|0,a[166]=bf,a[169]=Nb,a[I+(l+4)>>2]=bf|1,a[I+(bf+l)>>2]=bf;else{G=Ia+4|0;cf=a[I+(Zc+G)>>2]|0;if(1==(cf&3|0)){Tf=cf&-8;Ng=cf>>>3;c:do if(256>cf>>>0)vd=a[I+((Zc|8)+Ia)>>2]|0,ae=a[I+(Ia+
12+Zc)>>2]|0,Uf=696+(Ng<<1<<2)|0,(vd|0)!=(Uf|0)&&(vd>>>0<we>>>0&&m(),(a[vd+12>>2]|0)!=($c|0)&&m()),(ae|0)==(vd|0)?a[164]&=~(1<<Ng):((ae|0)==(Uf|0)?c=ae+8|0:(ae>>>0<we>>>0&&m(),Og=ae+8|0,(a[Og>>2]|0)==($c|0)?c=Og:m()),a[vd+12>>2]=ae,a[c>>2]=vd);else{xe=a[I+((Zc|24)+Ia)>>2]|0;df=a[I+(Ia+12+Zc)>>2]|0;do if((df|0)==($c|0)){w=Zc|16;kh=I+(w+G)|0;if(lh=a[kh>>2]|0)eb=lh,Pd=kh;else if(Vf=I+(w+Ia)|0,Pg=a[Vf>>2]|0)eb=Pg,Pd=Vf;else{jc=0;break}for(;;)if(ce=eb+20|0,ze=a[ce>>2]|0)eb=ze,Pd=ce;else if(Db=eb+16|0,
Oa=a[Db>>2]|0)eb=Oa,Pd=Db;else break;Pd>>>0<we>>>0?m():(a[Pd>>2]=0,jc=eb)}else ef=a[I+((Zc|8)+Ia)>>2]|0,ef>>>0<we>>>0&&m(),ye=ef+12|0,(a[ye>>2]|0)!=($c|0)&&m(),jh=df+8|0,(a[jh>>2]|0)==($c|0)?(a[ye>>2]=df,a[jh>>2]=ef,jc=df):m();while(0);if(xe){Qg=a[I+(Ia+28+Zc)>>2]|0;Xf=960+(Qg<<2)|0;do if(($c|0)==(a[Xf>>2]|0)){if(a[Xf>>2]=jc,!jc){a[165]&=~(1<<Qg);break c}}else if(xe>>>0<(a[168]|0)>>>0&&m(),Ua=xe+16|0,(a[Ua>>2]|0)==($c|0)?a[Ua>>2]=jc:a[xe+20>>2]=jc,!jc)break c;while(0);dc=a[168]|0;jc>>>0<dc>>>0&&m();
a[jc+24>>2]=xe;e=Zc|16;if(Ae=a[I+(e+Ia)>>2]|0)Ae>>>0<dc>>>0?m():(a[jc+16>>2]=Ae,a[Ae+24>>2]=jc);if(ec=a[I+(e+G)>>2]|0)ec>>>0<(a[168]|0)>>>0?m():(a[jc+20>>2]=ec,a[ec+24>>2]=jc)}}while(0);jg=I+((Tf|Zc)+Ia)|0;Ba=Tf+af|0}else jg=$c,Ba=af;gf=jg+4|0;a[gf>>2]&=-2;a[I+(l+4)>>2]=Ba|1;a[I+(Ba+l)>>2]=Ba;gd=Ba>>>3;if(256>Ba>>>0)Eb=gd<<1,Yf=696+(Eb<<2)|0,hf=a[164]|0,Zf=1<<gd,hf&Zf?(Rg=696+(Eb+2<<2)|0,jf=a[Rg>>2]|0,jf>>>0>=(a[168]|0)>>>0?(u=Rg,nb=jf):m()):(a[164]=hf|Zf,u=696+(Eb+2<<2)|0,nb=Yf),a[u>>2]=Nb,a[nb+
12>>2]=Nb,a[I+(l+8)>>2]=nb,a[I+(l+12)>>2]=Yf;else if((Hb=Ba>>>8)?16777215<Ba>>>0?Gb=31:(kf=(Hb+1048320|0)>>>16&8,lf=Hb<<kf,Sg=(lf+520192|0)>>>16&4,$f=lf<<Sg,Tg=($f+245760|0)>>>16&2,mf=14-(Sg|kf|Tg)+($f<<Tg>>>15)|0,Gb=Ba>>>(mf+7|0)&1|mf<<1):Gb=0,Be=960+(Gb<<2)|0,a[I+(l+28)>>2]=Gb,a[I+(l+20)>>2]=0,a[I+(l+16)>>2]=0,ag=a[165]|0,Ce=1<<Gb,ag&Ce){De=a[Be>>2]|0;c:do if((a[De+4>>2]&-8|0)==(Ba|0))sf=De;else{zc=Ba<<(31==(Gb|0)?0:25-(Gb>>>1)|0);for(ee=De;;){sd=ee+16+(zc>>>31<<2)|0;Ld=a[sd>>2]|0;if(!Ld)break;
if((a[Ld+4>>2]&-8|0)==(Ba|0)){sf=Ld;break c}else zc<<=1,ee=Ld}if(sd>>>0<(a[168]|0)>>>0)m();else{a[sd>>2]=Nb;a[I+(l+24)>>2]=ee;a[I+(l+12)>>2]=Nb;a[I+(l+8)>>2]=Nb;break b}}while(0);td=sf+8|0;de=a[td>>2]|0;nf=a[168]|0;de>>>0>=nf>>>0&sf>>>0>=nf>>>0?(a[de+12>>2]=Nb,a[td>>2]=Nb,a[I+(l+8)>>2]=de,a[I+(l+12)>>2]=sf,a[I+(l+24)>>2]=0):m()}else a[165]=ag|Ce,a[Be>>2]=Nb,a[I+(l+24)>>2]=Be,a[I+(l+12)>>2]=Nb,a[I+(l+8)>>2]=Nb}while(0);Va=I+($e|8)|0;return Va|0}for(;;){db=a[wf>>2]|0;if(db>>>0<=Y>>>0&&(Nd=a[wf+4>>2]|
0,bg=db+Nd|0,bg>>>0>Y>>>0))break;wf=a[wf+8>>2]|0}Fe=db+(Nd+-39)|0;of=db+(Nd+-47+(0==(Fe&7|0)?0:0-Fe&7))|0;Vg=Y+16|0;Fb=of>>>0<Vg>>>0?Y:of;He=Fb+8|0;yc=I+8|0;pf=0==(yc&7|0)?0:0-yc&7;fc=Ia+-40-pf|0;a[170]=I+pf;a[167]=fc;a[I+(pf+4)>>2]=fc|1;a[I+(Ia+-36)>>2]=40;a[171]=a[286];gc=Fb+4|0;a[gc>>2]=27;a[He>>2]=a[276];a[He+4>>2]=a[277];a[He+8>>2]=a[278];a[He+12>>2]=a[279];a[276]=I;a[277]=Ia;a[279]=0;a[278]=He;Wg=Fb+28|0;a[Wg>>2]=7;if((Fb+32|0)>>>0<bg>>>0){Tc=Wg;do qh=Tc,Tc=Tc+4|0,a[Tc>>2]=7;while((qh+8|0)>>>
0<bg>>>0)}if((Fb|0)!=(Y|0))if(Ic=Fb-Y|0,a[gc>>2]&=-2,a[Y+4>>2]=Ic|1,a[Fb>>2]=Ic,xd=Ic>>>3,256>Ic>>>0)cg=xd<<1,Xg=696+(cg<<2)|0,qf=a[164]|0,dg=1<<xd,qf&dg?(rf=696+(cg+2<<2)|0,Qb=a[rf>>2]|0,Qb>>>0<(a[168]|0)>>>0?m():(p=rf,Sb=Qb)):(a[164]=qf|dg,p=696+(cg+2<<2)|0,Sb=Xg),a[p>>2]=Y,a[Sb+12>>2]=Y,a[Y+8>>2]=Sb,a[Y+12>>2]=Xg;else if((hc=Ic>>>8)?16777215<Ic>>>0?hd=31:(Rb=(hc+1048320|0)>>>16&8,fg=hc<<Rb,Qe=(fg+520192|0)>>>16&4,h=fg<<Qe,k=(h+245760|0)>>>16&2,r=14-(Qe|Rb|k)+(h<<k>>>15)|0,hd=Ic>>>(r+7|0)&1|r<<
1):hd=0,y=960+(hd<<2)|0,a[Y+28>>2]=hd,a[Y+20>>2]=0,a[Vg>>2]=0,B=a[165]|0,t=1<<hd,B&t){Bf=a[y>>2]|0;b:do if((a[Bf+4>>2]&-8|0)==(Ic|0))Ub=Bf;else{hg=Ic<<(31==(hd|0)?0:25-(hd>>>1)|0);for(Je=Bf;;){A=Je+16+(hg>>>31<<2)|0;F=a[A>>2]|0;if(!F)break;if((a[F+4>>2]&-8|0)==(Ic|0)){Ub=F;break b}else hg<<=1,Je=F}if(A>>>0<(a[168]|0)>>>0)m();else{a[A>>2]=Y;a[Y+24>>2]=Je;a[Y+12>>2]=Y;a[Y+8>>2]=Y;break a}}while(0);C=Ub+8|0;n=a[C>>2]|0;v=a[168]|0;n>>>0>=v>>>0&Ub>>>0>=v>>>0?(a[n+12>>2]=Y,a[C>>2]=Y,a[Y+8>>2]=n,a[Y+12>>
2]=Ub,a[Y+24>>2]=0):m()}else a[165]=B|t,a[y>>2]=Y,a[Y+24>>2]=y,a[Y+12>>2]=Y,a[Y+8>>2]=Y}}else{eh=a[168]|0;0==(eh|0)|I>>>0<eh>>>0&&(a[168]=I);a[276]=I;a[277]=Ia;a[279]=0;a[173]=a[282];a[172]=-1;tf=0;do ue=tf<<1,fh=696+(ue<<2)|0,a[696+(ue+3<<2)>>2]=fh,a[696+(ue+2<<2)>>2]=fh,tf=tf+1|0;while(32!=(tf|0));Mf=I+8|0;Gg=0==(Mf&7|0)?0:0-Mf&7;Hg=Ia+-40-Gg|0;a[170]=I+Gg;a[167]=Hg;a[I+(Gg+4)>>2]=Hg|1;a[I+(Ia+-36)>>2]=40;a[171]=a[286]}while(0);x=a[167]|0;if(x>>>0>la>>>0)return z=x-la|0,a[167]=z,Q=a[170]|0,a[170]=
Q+la,a[Q+(la+4)>>2]=z|1,a[Q+4>>2]=la|3,Va=Q+8|0,Va|0}E=ne()|0;a[E>>2]=12;Va=0;return Va|0}function n(d){d|=0;var f=0,p=0,u=0,q=0,b=0,c=0,D=0,J=0,l=0,G=0,e=0,w=0,g=0,h=0,Id=0,k=0,r=0,y=0,B=0,t=0,A=0,F=0,n=0,C=0,v=0,H=0,x=0,z=0,Q=0,E=0,K=0,R=0,Ec=0,ha=0,X=0,da=0,bc=0,P=0,ua=0,wc=0,fa=0,va=0,S=0,yb=0,fb=0,pb=0,W=0,wa=0,Xa=0,qb=0,rb=0,ga=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=0,ub=0,$a=0,aa=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,Ca=0,oa=0,
lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,Ta=0,L=0,Aa=0,Bb=0,ma=0,ca=0;if(d){b=d+-8|0;bc=a[168]|0;b>>>0<bc>>>0&&m();Ma=a[d+-4>>2]|0;ab=Ma&3;1==(ab|0)&&m();ea=Ma&-8;pa=d+(ea+-8)|0;do if(Ma&1)L=b,Aa=ea;else{G=a[b>>2]|0;if(!ab)return;q=-8-G|0;r=d+q|0;B=G+ea|0;r>>>0<bc>>>0&&m();if((r|0)==(a[169]|0)){c=d+(ea+-4)|0;D=a[c>>2]|0;if(3!=(D&3|0)){L=r;Aa=B;break}a[166]=B;a[c>>2]=D&-2;a[d+(q+4)>>2]=B|1;a[pa>>2]=B;return}ha=G>>>3;if(256>G>>>0)va=a[d+(q+8)>>2]|0,wa=a[d+(q+
12)>>2]|0,gb=696+(ha<<1<<2)|0,(va|0)!=(gb|0)&&(va>>>0<bc>>>0&&m(),(a[va+12>>2]|0)!=(r|0)&&m()),(wa|0)==(va|0)?a[164]&=~(1<<ha):((wa|0)==(gb|0)?p=wa+8|0:(wa>>>0<bc>>>0&&m(),Pa=wa+8|0,(a[Pa>>2]|0)==(r|0)?p=Pa:m()),a[va+12>>2]=wa,a[p>>2]=va),L=r,Aa=B;else{Qa=a[d+(q+24)>>2]|0;U=a[d+(q+12)>>2]|0;do if((U|0)==(r|0)){aa=d+(q+20)|0;if(xa=a[aa>>2]|0)ra=xa,za=aa;else if(vb=d+(q+16)|0,Ka=a[vb>>2]|0)ra=Ka,za=vb;else{ia=0;break}for(;;)if(wb=ra+20|0,bb=a[wb>>2]|0)ra=bb,za=wb;else if(kb=ra+16|0,Ca=a[kb>>2]|0)ra=
Ca,za=kb;else break;za>>>0<bc>>>0?m():(a[za>>2]=0,ia=ra)}else jb=a[d+(q+8)>>2]|0,jb>>>0<bc>>>0&&m(),ub=jb+12|0,(a[ub>>2]|0)!=(r|0)&&m(),$a=U+8|0,(a[$a>>2]|0)==(r|0)?(a[ub>>2]=U,a[$a>>2]=jb,ia=U):m();while(0);if(Qa){oa=a[d+(q+28)>>2]|0;lb=960+(oa<<2)|0;if((r|0)==(a[lb>>2]|0)){if(a[lb>>2]=ia,!ia){a[165]&=~(1<<oa);L=r;Aa=B;break}}else if(Qa>>>0<(a[168]|0)>>>0&&m(),N=Qa+16|0,(a[N>>2]|0)==(r|0)?a[N>>2]=ia:a[Qa+20>>2]=ia,!ia){L=r;Aa=B;break}mb=a[168]|0;ia>>>0<mb>>>0&&m();a[ia+24>>2]=Qa;if(Ga=a[d+(q+16)>>
2]|0)Ga>>>0<mb>>>0?m():(a[ia+16>>2]=Ga,a[Ga+24>>2]=ia);(O=a[d+(q+20)>>2]|0)?O>>>0<(a[168]|0)>>>0?m():(a[ia+20>>2]=O,a[O+24>>2]=ia,L=r,Aa=B):(L=r,Aa=B)}else L=r,Aa=B}}while(0);L>>>0>=pa>>>0&&m();J=d+(ea+-4)|0;l=a[J>>2]|0;l&1||m();if(l&2)a[J>>2]=l&-2,a[L+4>>2]=Aa|1,Bb=a[L+Aa>>2]=Aa;else{if((pa|0)==(a[170]|0)){e=(a[167]|0)+Aa|0;a[167]=e;a[170]=L;a[L+4>>2]=e|1;if((L|0)!=(a[169]|0))return;a[169]=0;a[166]=0;return}if((pa|0)==(a[169]|0)){w=(a[166]|0)+Aa|0;a[166]=w;a[169]=L;a[L+4>>2]=w|1;a[L+w>>2]=w;return}g=
(l&-8)+Aa|0;h=l>>>3;do if(256>l>>>0)Id=a[d+ea>>2]|0,k=a[d+(ea|4)>>2]|0,y=696+(h<<1<<2)|0,(Id|0)!=(y|0)&&(Id>>>0<(a[168]|0)>>>0&&m(),(a[Id+12>>2]|0)!=(pa|0)&&m()),(k|0)==(Id|0)?a[164]&=~(1<<h):((k|0)==(y|0)?f=k+8|0:(k>>>0<(a[168]|0)>>>0&&m(),t=k+8|0,(a[t>>2]|0)==(pa|0)?f=t:m()),a[Id+12>>2]=k,a[f>>2]=Id);else{A=a[d+(ea+16)>>2]|0;F=a[d+(ea|4)>>2]|0;do if((F|0)==(pa|0)){H=d+(ea+12)|0;if(x=a[H>>2]|0)Ha=x,ka=H;else if(z=d+(ea+8)|0,Q=a[z>>2]|0)Ha=Q,ka=z;else{V=0;break}for(;;)if(E=Ha+20|0,K=a[E>>2]|0)Ha=
K,ka=E;else if(R=Ha+16|0,Ec=a[R>>2]|0)Ha=Ec,ka=R;else break;ka>>>0<(a[168]|0)>>>0?m():(a[ka>>2]=0,V=Ha)}else n=a[d+ea>>2]|0,n>>>0<(a[168]|0)>>>0&&m(),C=n+12|0,(a[C>>2]|0)!=(pa|0)&&m(),v=F+8|0,(a[v>>2]|0)==(pa|0)?(a[C>>2]=F,a[v>>2]=n,V=F):m();while(0);if(A){X=a[d+(ea+20)>>2]|0;da=960+(X<<2)|0;if((pa|0)==(a[da>>2]|0)){if(a[da>>2]=V,!V){a[165]&=~(1<<X);break}}else if(A>>>0<(a[168]|0)>>>0&&m(),P=A+16|0,(a[P>>2]|0)==(pa|0)?a[P>>2]=V:a[A+20>>2]=V,!V)break;ua=a[168]|0;V>>>0<ua>>>0&&m();a[V+24>>2]=A;if(wc=
a[d+(ea+8)>>2]|0)wc>>>0<ua>>>0?m():(a[V+16>>2]=wc,a[wc+24>>2]=V);if(fa=a[d+(ea+12)>>2]|0)fa>>>0<(a[168]|0)>>>0?m():(a[V+20>>2]=fa,a[fa+24>>2]=V)}}while(0);a[L+4>>2]=g|1;a[L+g>>2]=g;if((L|0)==(a[169]|0)){a[166]=g;return}Bb=g}S=Bb>>>3;if(256>Bb>>>0)yb=S<<1,fb=696+(yb<<2)|0,pb=a[164]|0,W=1<<S,pb&W?(Xa=696+(yb+2<<2)|0,qb=a[Xa>>2]|0,qb>>>0<(a[168]|0)>>>0?m():(u=Xa,Ra=qb)):(a[164]=pb|W,u=696+(yb+2<<2)|0,Ra=fb),a[u>>2]=L,a[Ra+12>>2]=L,a[L+8>>2]=Ra,a[L+12>>2]=fb;else{(rb=Bb>>>8)?16777215<Bb>>>0?ya=31:(ga=
(rb+1048320|0)>>>16&8,Ya=rb<<ga,sb=(Ya+520192|0)>>>16&4,zb=Ya<<sb,tb=(zb+245760|0)>>>16&2,hb=14-(sb|ga|tb)+(zb<<tb>>>15)|0,ya=Bb>>>(hb+7|0)&1|hb<<1):ya=0;ba=960+(ya<<2)|0;a[L+28>>2]=ya;a[L+20>>2]=0;a[L+16>>2]=0;Za=a[165]|0;na=1<<ya;a:do if(Za&na){T=a[ba>>2]|0;b:do if((a[T+4>>2]&-8|0)==(Bb|0))La=T;else{Sa=Bb<<(31==(ya|0)?0:25-(ya>>>1)|0);for(Ta=T;;){ib=Ta+16+(Sa>>>31<<2)|0;qa=a[ib>>2]|0;if(!qa)break;if((a[qa+4>>2]&-8|0)==(Bb|0)){La=qa;break b}else Sa<<=1,Ta=qa}if(ib>>>0<(a[168]|0)>>>0)m();else{a[ib>>
2]=L;a[L+24>>2]=Ta;a[L+12>>2]=L;a[L+8>>2]=L;break a}}while(0);ja=La+8|0;Ab=a[ja>>2]|0;Da=a[168]|0;Ab>>>0>=Da>>>0&La>>>0>=Da>>>0?(a[Ab+12>>2]=L,a[ja>>2]=L,a[L+8>>2]=Ab,a[L+12>>2]=La,a[L+24>>2]=0):m()}else a[165]=Za|na,a[ba>>2]=L,a[L+24>>2]=ba,a[L+12>>2]=L,a[L+8>>2]=L;while(0);Ea=(a[172]|0)+-1|0;a[172]=Ea;if(!Ea){for(ca=1112;;)if(ma=a[ca>>2]|0)ca=ma+8|0;else break;a[172]=-1}}}}function t(d,f,p,u,q){d|=0;f|=0;p|=0;u|=0;q|=0;var b=0,c=0,D=0,J=0,l=0,G=0,Pe=0,w=0,g=0,h=0,m=0,k=0,t=0,y=0,B=0,n=0,C=0,F=0,
v=0,H=0,z=0,x=0,E=0,R=0,K=0,P=0,S=0,W=0,Ec=0,ga=0,X=0,da=0,bc=0,aa=0,ua=0,wc=0,ma=0,va=0,ca=0,yb=0,fb=0,pb=0,Fa=0,wa=0,Xa=0,qb=0,rb=0,ta=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=0,ub=0,$a=0,xb=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,Ja=0,oa=0,lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,za=A;A=A+16|0;oa=za+4|0;O=za;a:do{if(q&&!(0<(a[q>>2]|0))){if(d&&(Da=a[d+8>>2]|0)&&(wb=a[d+16>>2]|0,0<=(wb|p|0)&&(fb=0==
(f|0),!(fb&0<(p|0))))){do if(!fb){if(!(Da>>>0>=f>>>0&Da>>>0<(f+(p<<1)|0)>>>0)){if(Da>>>0>f>>>0)break;if((Da+(a[d+12>>2]<<1)|0)>>>0<=f>>>0)break}a[q>>2]=1;c=0;break a}while(0);if(!wb){c=ad(f,p,0,q)|0;break}qa=Sd(d,q)|0;if(0<(a[q>>2]|0)){c=0;break}ib=a[d+92>>2]|0;D=ib&1?(u&65523|4)&65535:u;g=ib&2?(D&65523|8)&65535:D;x=4>((a[d+88>>2]|0)+-3|0)>>>0?g:g&65531;ja=x&65535;Ab=0!=(ja&4|0);b:do if(ja&16){if(!Ab){wa=ja&65533;if(0<(qa|0))h=f,Ec=p,ca=qa;else{va=p;break}for(;;)if(ka=ca,ca=ca+-1|0,Xa=0==(Ca(d,ca,
oa,O)|0),qb=Da+(a[oa>>2]<<1)|0,rb=a[O>>2]|0,ya=Xa?fa(qb,rb,h,Ec,wa,q)|0:ha(qb,rb,h,Ec,x,q)|0,a[O>>2]=ya,ta=Ec-ya|0,1>=(ka|0)){va=ta;break b}else h=0==(h|0)?0:h+(ya<<1)|0,Ec=ta}Ya=a[d+76>>2]|0;sb=ja&65533;if(0<(qa|0))for(k=f,da=p,yb=qa;;)if(La=yb,yb=yb+-1|0,zb=Ca(d,yb,oa,O)|0,gb=a[oa>>2]|0,tb=Da+(gb<<1)|0,zb?(1<<Q[Ya+gb>>0]&8194?(F=k,ma=da):(0<(da|0)?(r[k>>1]=8207,C=k+2|0):C=k,F=C,ma=da+-1|0),na=ha(tb,a[O>>2]|0,F,ma,x,q)|0,a[O>>2]=na,v=0==(F|0)?0:F+(na<<1)|0,T=ma-na|0,1<<Q[Ya+(na+-1+(a[oa>>2]|0))>>
0]&8194?(m=v,X=T):(0<(T|0)?(r[v>>1]=8207,z=v+2|0):z=v,m=z,X=T+-1|0)):(hb=a[O>>2]|0,e[Ya+(gb+-1+hb)>>0]|0?(0<(da|0)?(r[k>>1]=8206,t=k+2|0):t=k,y=t,aa=da+-1|0):(y=k,aa=da),ba=fa(tb,hb,y,aa,sb,q)|0,a[O>>2]=ba,B=0==(y|0)?0:y+(ba<<1)|0,Za=aa-ba|0,e[Ya+(a[oa>>2]|0)>>0]|0?(0<(Za|0)?(r[B>>1]=8206,n=B+2|0):n=B,m=n,X=Za+-1|0):(m=B,X=Za)),1>=(La|0)){va=X;break}else k=m,da=X;else va=p}else{if(!Ab){Ea=ja&65533;if(0<(qa|0))J=f,l=p,pa=0;else{va=p;break}for(;;)if(Pa=0==(Ca(d,pa,oa,O)|0),Qa=Da+(a[oa>>2]<<1)|0,U=a[O>>
2]|0,Ra=Pa?ha(Qa,U,J,l,Ea,q)|0:fa(Qa,U,J,l,x,q)|0,a[O>>2]=Ra,jb=l-Ra|0,pa=pa+1|0,(pa|0)==(qa|0)){va=jb;break b}else J=0==(J|0)?0:J+(Ra<<1)|0,l=jb}Ma=a[d+76>>2]|0;ub=d+228|0;$a=d+84|0;xb=ja&65533;if(0<(qa|0))for(w=p,E=f,Ga=0;;){xa=Ca(d,Ga,oa,O)|0;ab=a[oa>>2]|0;vb=Da+(ab<<1)|0;Ka=a[(a[ub>>2]|0)+(12*Ga|0)+8>>2]|0;b=0>(Ka|0)?0:Ka;bb=0!=(e[$a>>0]|0);do if(xa){N=bb?0==(1<<Q[Ma+(ab+-1+(a[O>>2]|0))>>0]&8194|0)?b|4:b:b;N&1?(ia=8206,V=49):N&4?(ia=8207,V=49):(K=w,ua=E);49==(V|0)&&(V=0,0<(w|0)?(r[E>>1]=ia,bc=
E+2|0):bc=E,K=w+-1|0,ua=bc);pb=fa(vb,a[O>>2]|0,ua,K,x,q)|0;a[O>>2]=pb;wc=0==(ua|0)?0:ua+(pb<<1)|0;Fa=K-pb|0;mb=e[$a>>0]|0?0==(1<<Q[Ma+(a[oa>>2]|0)>>0]&8194|0)?N|8:N:N;if(mb&2)Ha=8206;else if(mb&8)Ha=8207;else{Pe=wc;W=Fa;break}0<(Fa|0)?(r[wc>>1]=Ha,G=wc+2|0):G=wc;Pe=G;W=Fa+-1|0}else{lb=bb?0!=(e[Ma+ab>>0]|0)|b:b;lb&1?(Sa=8206,V=35):lb&4?(Sa=8207,V=35):(H=w,P=E);35==(V|0)&&(V=0,0<(w|0)?(r[E>>1]=Sa,R=E+2|0):R=E,H=w+-1|0,P=R);kb=ha(vb,a[O>>2]|0,P,H,xb,q)|0;a[O>>2]=kb;S=0==(P|0)?0:P+(kb<<1)|0;Ja=H-kb|0;
ea=e[$a>>0]|0?0==(e[Ma+(kb+-1+(a[oa>>2]|0))>>0]|0)?lb:lb|2:lb;if(ea&2)ra=8206;else if(ea&8)ra=8207;else{Pe=S;W=Ja;break}0<(Ja|0)?(r[S>>1]=ra,ga=S+2|0):ga=S;Pe=ga;W=Ja+-1|0}while(0);Ga=Ga+1|0;if((Ga|0)==(qa|0)){va=W;break}else w=W,E=Pe}else va=p}while(0);c=ad(f,p,p-va|0,q)|0;break}a[q>>2]=1}c=0}while(0);A=za;return c|0}function z(d,f){d|=0;f|=0;var p=0,u=0,q=0,b=0,c=0,D=0,J=0,l=0,G=0,e=0,w=0,g=0,h=0,k=0,r=0,t=0,y=0,B=0,A=0,n=0,F=0,C=0,v=0,H=0,x=0,z=0,E=0,Q=0,K=0,R=0,P=0,S=0,W=0,X=0,da=0,fa=0,aa=0,
ua=0,ha=0,ga=0,va=0,ma=0,ca=0,fb=0,pb=0,Ca=0,wa=0,Xa=0,qb=0,rb=0,Fa=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=0,ub=0,$a=0,ta=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,Ja=0,oa=0,lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,Ta=0,L=0,Aa=0,G=d+f|0,ca=a[d+4>>2]|0;do if(ca&1)p=d,u=f;else{xa=a[d>>2]|0;if(!(ca&3))return;O=d+(0-xa)|0;e=xa+f|0;r=a[168]|0;O>>>0<r>>>0&&m();if((O|0)==(a[169]|0)){ya=d+(f+4)|0;w=a[ya>>2]|
0;if(3!=(w&3|0)){p=O;u=e;break}a[166]=e;a[ya>>2]=w&-2;a[d+(4-xa)>>2]=e|1;a[G>>2]=e;return}H=xa>>>3;if(256>xa>>>0)ua=a[d+(8-xa)>>2]|0,fb=a[d+(12-xa)>>2]|0,wa=696+(H<<1<<2)|0,(ua|0)!=(wa|0)&&(ua>>>0<r>>>0&&m(),(a[ua+12>>2]|0)!=(O|0)&&m()),(fb|0)==(ua|0)?a[164]&=~(1<<H):((fb|0)==(wa|0)?c=fb+8|0:(fb>>>0<r>>>0&&m(),jb=fb+8|0,(a[jb>>2]|0)==(O|0)?c=jb:m()),a[ua+12>>2]=fb,a[c>>2]=ua),p=O,u=e;else{Ma=a[d+(24-xa)>>2]|0;ub=a[d+(12-xa)>>2]|0;do if((ub|0)==(O|0)){J=16-xa|0;vb=d+(J+4)|0;if(Ka=a[vb>>2]|0)Ha=Ka,
La=vb;else if(wb=d+J|0,bb=a[wb>>2]|0)Ha=bb,La=wb;else{V=0;break}for(;;)if(kb=Ha+20|0,Ja=a[kb>>2]|0)Ha=Ja,La=kb;else if(oa=Ha+16|0,lb=a[oa>>2]|0)Ha=lb,La=oa;else break;La>>>0<r>>>0?m():(a[La>>2]=0,V=Ha)}else $a=a[d+(8-xa)>>2]|0,$a>>>0<r>>>0&&m(),ta=$a+12|0,(a[ta>>2]|0)!=(O|0)&&m(),ab=ub+8|0,(a[ab>>2]|0)==(O|0)?(a[ta>>2]=ub,a[ab>>2]=$a,V=ub):m();while(0);if(Ma){ea=a[d+(28-xa)>>2]|0;N=960+(ea<<2)|0;if((O|0)==(a[N>>2]|0)){if(a[N>>2]=V,!V){a[165]&=~(1<<ea);p=O;u=e;break}}else if(Ma>>>0<(a[168]|0)>>>0&&
m(),mb=Ma+16|0,(a[mb>>2]|0)==(O|0)?a[mb>>2]=V:a[Ma+20>>2]=V,!V){p=O;u=e;break}pa=a[168]|0;V>>>0<pa>>>0&&m();a[V+24>>2]=Ma;l=16-xa|0;if(Ga=a[d+l>>2]|0)Ga>>>0<pa>>>0?m():(a[V+16>>2]=Ga,a[Ga+24>>2]=V);(Ra=a[d+(l+4)>>2]|0)?Ra>>>0<(a[168]|0)>>>0?m():(a[V+20>>2]=Ra,a[Ra+24>>2]=V,p=O,u=e):(p=O,u=e)}else p=O,u=e}}while(0);g=a[168]|0;G>>>0<g>>>0&&m();h=d+(f+4)|0;k=a[h>>2]|0;if(k&2)a[h>>2]=k&-2,a[p+4>>2]=u|1,q=a[p+u>>2]=u;else{if((G|0)==(a[170]|0)){t=(a[167]|0)+u|0;a[167]=t;a[170]=p;a[p+4>>2]=t|1;if((p|0)!=
(a[169]|0))return;a[169]=0;a[166]=0;return}if((G|0)==(a[169]|0)){y=(a[166]|0)+u|0;a[166]=y;a[169]=p;a[p+4>>2]=y|1;a[p+y>>2]=y;return}B=(k&-8)+u|0;A=k>>>3;do if(256>k>>>0)n=a[d+(f+8)>>2]|0,F=a[d+(f+12)>>2]|0,C=696+(A<<1<<2)|0,(n|0)!=(C|0)&&(n>>>0<g>>>0&&m(),(a[n+12>>2]|0)!=(G|0)&&m()),(F|0)==(n|0)?a[164]&=~(1<<A):((F|0)==(C|0)?b=F+8|0:(F>>>0<g>>>0&&m(),v=F+8|0,(a[v>>2]|0)==(G|0)?b=v:m()),a[n+12>>2]=F,a[b>>2]=n);else{x=a[d+(f+24)>>2]|0;z=a[d+(f+12)>>2]|0;do if((z|0)==(G|0)){R=d+(f+20)|0;if(P=a[R>>2]|
0)za=P,Ta=R;else if(S=d+(f+16)|0,W=a[S>>2]|0)za=W,Ta=S;else{ka=0;break}for(;;)if(X=za+20|0,da=a[X>>2]|0)za=da,Ta=X;else if(fa=za+16|0,aa=a[fa>>2]|0)za=aa,Ta=fa;else break;Ta>>>0<g>>>0?m():(a[Ta>>2]=0,ka=za)}else E=a[d+(f+8)>>2]|0,E>>>0<g>>>0&&m(),Q=E+12|0,(a[Q>>2]|0)!=(G|0)&&m(),K=z+8|0,(a[K>>2]|0)==(G|0)?(a[Q>>2]=z,a[K>>2]=E,ka=z):m();while(0);if(x){ha=a[d+(f+28)>>2]|0;ga=960+(ha<<2)|0;if((G|0)==(a[ga>>2]|0)){if(a[ga>>2]=ka,!ka){a[165]&=~(1<<ha);break}}else if(x>>>0<(a[168]|0)>>>0&&m(),va=x+16|0,
(a[va>>2]|0)==(G|0)?a[va>>2]=ka:a[x+20>>2]=ka,!ka)break;ma=a[168]|0;ka>>>0<ma>>>0&&m();a[ka+24>>2]=x;if(pb=a[d+(f+16)>>2]|0)pb>>>0<ma>>>0?m():(a[ka+16>>2]=pb,a[pb+24>>2]=ka);if(Ca=a[d+(f+20)>>2]|0)Ca>>>0<(a[168]|0)>>>0?m():(a[ka+20>>2]=Ca,a[Ca+24>>2]=ka)}}while(0);a[p+4>>2]=B|1;a[p+B>>2]=B;if((p|0)==(a[169]|0)){a[166]=B;return}q=B}Xa=q>>>3;if(256>q>>>0)qb=Xa<<1,rb=696+(qb<<2)|0,Fa=a[164]|0,Ya=1<<Xa,Fa&Ya?(sb=696+(qb+2<<2)|0,zb=a[sb>>2]|0,zb>>>0<(a[168]|0)>>>0?m():(D=sb,Sa=zb)):(a[164]=Fa|Ya,D=696+
(qb+2<<2)|0,Sa=rb),a[D>>2]=p,a[Sa+12>>2]=p,a[p+8>>2]=Sa,a[p+12>>2]=rb;else if((gb=q>>>8)?16777215<q>>>0?ra=31:(tb=(gb+1048320|0)>>>16&8,hb=gb<<tb,ba=(hb+520192|0)>>>16&4,Za=hb<<ba,na=(Za+245760|0)>>>16&2,T=14-(ba|tb|na)+(Za<<na>>>15)|0,ra=q>>>(T+7|0)&1|T<<1):ra=0,qa=960+(ra<<2)|0,a[p+28>>2]=ra,a[p+20>>2]=0,a[p+16>>2]=0,ib=a[165]|0,ja=1<<ra,ib&ja){Ab=a[qa>>2]|0;a:do if((a[Ab+4>>2]&-8|0)==(q|0))L=Ab;else{ia=q<<(31==(ra|0)?0:25-(ra>>>1)|0);for(Aa=Ab;;){Ea=Aa+16+(ia>>>31<<2)|0;Da=a[Ea>>2]|0;if(!Da)break;
if((a[Da+4>>2]&-8|0)==(q|0)){L=Da;break a}else ia<<=1,Aa=Da}Ea>>>0<(a[168]|0)>>>0&&m();a[Ea>>2]=p;a[p+24>>2]=Aa;a[p+12>>2]=p;a[p+8>>2]=p;return}while(0);Pa=L+8|0;Qa=a[Pa>>2]|0;U=a[168]|0;Qa>>>0>=U>>>0&L>>>0>=U>>>0||m();a[Qa+12>>2]=p;a[Pa>>2]=p;a[p+8>>2]=Qa;a[p+12>>2]=L;a[p+24>>2]=0}else a[165]=ib|ja,a[qa>>2]=p,a[p+24>>2]=qa,a[p+12>>2]=p,a[p+8>>2]=p}function E(d,f,p,u,q){d|=0;f|=0;p|=0;u|=0;q|=0;var b=0,c=0,D=0,J=0,l=0,G=0,g,w,h,k,m,t,n,y,B,C;t=0;var v,F=n=0,x;x=A;A=A+32|0;g=a[d+76>>2]|0;(a[d+128>>
2]|0)>(f|0)?(e[d+98>>0]|0?(y=a[d+140>>2]|0,(a[y>>2]|0)>(f|0)?F=4:G=Ja(a[d+136>>2]|0,y,f)|0):F=4,4==(F|0)&&(G=e[d+97>>0]|0),G=G&1?2>((a[d+88>>2]|0)+-5|0)>>>0:0):G=0;a[x+12>>2]=-1;a[x+16>>2]=-1;a[x+24>>2]=f;y=e[(a[d+80>>2]|0)+f>>0]|0;e[x+28>>0]=y;y&=1;m=a[d+116>>2]|0;a[x>>2]=a[m+(y<<2)>>2];a[x+4>>2]=a[m+8+(y<<2)>>2];if(!f&&(m=a[d+104>>2]|0,0<(m|0))){y=a[d+100>>2]|0;B=m;a:for(;;){if(0>=(B|0)){c=4;F=16;break}h=B+-1|0;m=H[y+(h<<1)>>1]|0;1<(B|0)&56320==(m&64512|0)&&(w=B+-2|0,B=H[y+(w<<1)>>1]|0,55296==(B&
64512|0)&&(h=w,m=m+-56613888+(B<<10)|0));switch((sg(d,m)|0)&255|0){case 0:c=0;F=16;break a;case 13:case 1:F=17;break a;case 7:b=4;break a;default:B=h}}16==(F|0)?b=c:17==(F|0)&&(b=1);u=4==b<<24>>24?u:b}b=g+f|0;22==(e[b>>0]|0)?(c=d+244|0,y=a[c>>2]|0,-1<(y|0)?(l=a[d+248>>2]|0,a[x+8>>2]=a[l+(y<<4)>>2],t=a[l+(y<<4)+4>>2]|0,n=r[l+(y<<4)+12>>1]|0,a[x+20>>2]=a[l+(y<<4)+8>>2],a[c>>2]=y+-1,l=c):F=22):F=22;22==(F|0)&&(a[x+8>>2]=-1,n=17==(e[b>>0]|0)?(u&255)+1&65535:0,a[x+20>>2]=0,K(d,x,u,f,f),l=d+244|0,t=f);
a:do if((f|0)>(p|0))u=t,b=n;else for(b=f,h=-1,B=1,c=t,y=f,m=n;;){if(u=(b|0)<(p|0)){w=e[g+b>>0]|0;7==w<<24>>24&&(a[l>>2]=-1);if(G)if(13==w<<24>>24)w=1;else if(2==w<<24>>24){b:do if((h|0)>(b|0))k=h,w=B;else for(h=b;;){B=h+1|0;if((B|0)>=(p|0)){k=p;w=1;break b}h=e[g+B>>0]|0;switch(h<<24>>24){case 13:case 1:case 0:k=B;w=h;break b;default:h=B}}while(0);h=k;B=w;w=13==w<<24>>24?5:2}k=e[66846+(w&255)>>0]|0}else{k=p;do if(k=k+-1|0,w=e[g+k>>0]|0,(k|0)<=(f|0))break;while(0!=(1<<(w&255)&382976|0));if(20==(w&-2)<<
24>>24){u=c;b=m;break a}else k=q}w=m&65535;k=e[(k&255)+(66871+(w<<4))>>0]|0;m=k&31;k=(k&255)>>>5;C=(b|0)==(p|0)&0==k<<24>>24?1:k&255;b:do if(C<<16>>16)switch(w=e[(w<<4)+66886>>0]|0,C&65535|0){case 1:K(d,x,w,c,b);k=b;v=y;break b;case 2:k=c;v=b;break b;case 3:K(d,x,w,c,y);K(d,x,4,y,b);k=b;v=y;break b;case 4:K(d,x,w,c,y);k=y;v=b;break b;default:k=c;v=y;break b}else k=c,v=y;while(0);if(u)b=b+1|0,c=k,y=v;else{u=k;b=m;break}}while(0);G=d+16|0;if((a[G>>2]|0)==(p|0)&&(t=a[d+112>>2]|0,0<(t|0))){n=a[d+108>>
2]|0;h=0;a:for(;;){if((h|0)>=(t|0)){J=4;F=55;break}m=h+1|0;c=H[n+(h<<1)>>1]|0;(m|0)==(t|0)|55296!=(c&64512|0)||(y=H[n+(m<<1)>>1]|0,56320==(y&64512|0)&&(m=h+2|0,c=(c<<10)+-56613888+y|0));switch((sg(d,c)|0)&255|0){case 0:J=0;F=55;break a;case 13:case 1:F=56;break a;case 2:F=57;break a;case 5:D=3;break a;default:h=m}}55==(F|0)?D=J:56==(F|0)?D=1:57==(F|0)&&(D=2);q=4==D<<24>>24?q:D}J=p;do if(J=J+-1|0,D=e[g+J>>0]|0,(J|0)<=(f|0))break;while(0!=(1<<(D&255)&382976|0));20==(D&-2)<<24>>24?(a[G>>2]|0)>(p|0)?
(f=(a[l>>2]|0)+1|0,a[l>>2]=f,l=a[d+248>>2]|0,r[l+(f<<4)+12>>1]=b,a[l+(f<<4)+8>>2]=a[x+20>>2],a[l+(f<<4)+4>>2]=u,a[l+(f<<4)>>2]=a[x+8>>2]):F=65:F=65;65==(F|0)&&K(d,x,q,p,p);A=x}function x(d,f){d|=0;f|=0;var p,u,b,c,Pb,D,J,l,G,g,w,k,h,m,r,t,y,B,n=0,v;v=A;A=A+16|0;Pb=d+224|0;a:do if(-1>=(a[Pb>>2]|0)){do if(2==(a[d+120>>2]|0)){G=d+16|0;D=a[G>>2]|0;p=d+80|0;J=a[p>>2]|0;c=d+132|0;w=a[c>>2]|0;if(0<(w|0)){b=0;g=-2;l=0;do h=g,g=e[J+b>>0]|0,l=(g<<24>>24!=h<<24>>24&1)+l|0,b=b+1|0;while((b|0)!=(w|0));if((D|0)==
(w|0)&1==(l|0)){J=e[J>>0]|0;b=d+232|0;a[d+228>>2]=b;a[Pb>>2]=1;a[b>>2]=(J&255)<<31;a[d+236>>2]=D;a[d+240>>2]=0;break}else b=l}else b=0;k=(D|0)>(w|0);b=b+(k&1)|0;g=d+64|0;if(!((Kc(g,d+40|0,e[d+73>>0]|0,12*b|0)|0)<<24>>24))break a;g=a[g>>2]|0;h=t=0;m=126;for(l=0;;){u=e[J+t>>0]|0;m=(u&255)<(m&255)?u:m;h=(u&255)>(h&255)?u:h;for(B=t;;){B=B+1|0;if((B|0)>=(w|0)){u=0;break}if((e[J+B>>0]|0)!=u<<24>>24){u=1;break}}a[g+(12*l|0)>>2]=t;a[g+(12*l|0)+4>>2]=B-t;a[g+(12*l|0)+8>>2]=0;l=l+1|0;if(u)t=B;else break}k?
(a[g+(12*l|0)>>2]=w,a[g+(12*l|0)+4>>2]=D-w,D=e[d+97>>0]|0,D=(D&255)<(m&255)?D:m):D=m;a[d+228>>2]=g;a[Pb>>2]=b;if((h&255)>>>0>(D&255|1)>>>0){D=D+1<<24>>24;w=a[p>>2]|0;p=(((a[c>>2]|0)<(a[G>>2]|0))<<31>>31)+b|0;k=h+-1<<24>>24;if((k&255)>=(D&255)){h=0<(p|0);do{b:do if(h)for(u=0;;){if((Q[w+(a[g+(12*u|0)>>2]|0)>>0]|0)<(k&255))m=u+1|0;else{for(B=u;;){m=B+1|0;if((m|0)>=(p|0))break;if((Q[w+(a[g+(12*m|0)>>2]|0)>>0]|0)<(k&255))break;else B=m}if((u|0)<(B|0)){t=B;y=u;do u=g+(12*y|0)|0,a[v>>2]=a[u>>2],a[v+4>>2]=
a[u+4>>2],a[v+8>>2]=a[u+8>>2],r=g+(12*t|0)|0,a[u>>2]=a[r>>2],a[u+4>>2]=a[r+4>>2],a[u+8>>2]=a[r+8>>2],a[r>>2]=a[v>>2],a[r+4>>2]=a[v+4>>2],a[r+8>>2]=a[v+8>>2],y=y+1|0,t=t+-1|0;while((y|0)<(t|0))}if((m|0)==(p|0))break b;m=B+2|0}if((m|0)<(p|0))u=m;else break}while(0);k=k+-1<<24>>24}while((k&255)>=(D&255))}if(!(D&1)&&(c=(((a[c>>2]|0)==(a[G>>2]|0))<<31>>31)+p|0,0<(c|0))){G=0;D=c;do c=g+(12*G|0)|0,a[v>>2]=a[c>>2],a[v+4>>2]=a[c+4>>2],a[v+8>>2]=a[c+8>>2],p=g+(12*D|0)|0,a[c>>2]=a[p>>2],a[c+4>>2]=a[p+4>>2],
a[c+8>>2]=a[p+8>>2],a[p>>2]=a[v>>2],a[p+4>>2]=a[v+4>>2],a[p+8>>2]=a[v+8>>2],G=G+1|0,D=D+-1|0;while((G|0)<(D|0))}}if(0<(b|0)){c=G=0;do p=g+(12*G|0)|0,D=a[p>>2]|0,a[p>>2]=Q[J+D>>0]<<31|D,p=g+(12*G|0)+4|0,c=(a[p>>2]|0)+c|0,a[p>>2]=c,G=G+1|0;while((G|0)!=(b|0))}(l|0)<(b|0)&&(J=Q[d+97>>0]|0,b=g+(12*(0!=(J&1|0)?0:l)|0)|0,a[b>>2]|=J<<31)}else J=e[d+97>>0]|0,b=d+232|0,a[d+228>>2]=b,a[Pb>>2]=1,a[b>>2]=(J&255)<<31,a[d+236>>2]=a[d+16>>2],a[d+240>>2]=0;while(0);J=a[d+336>>2]|0;if(0<(J|0)){l=a[d+348>>2]|0;J=l+
(J<<3)|0;b=d+228|0;g=a[b>>2]|0;do G=Xb(a[Pb>>2]|0,g,a[l>>2]|0,f)|0,g=a[b>>2]|0,G=g+(12*G|0)+8|0,a[G>>2]|=a[l+4>>2],l=l+8|0;while(l>>>0<J>>>0)}if(0<(a[d+352>>2]|0)&&(l=a[d+8>>2]|0,G=a[d+16>>2]|0,J=l+(G<<1)|0,b=l,g=d+228|0,0<(G|0))){do{G=H[l>>1]|0;if(8204==(G&65532|0))n=44;else switch(G|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:n=44}44==(n|0)&&(n=0,G=Xb(a[Pb>>2]|0,a[g>>2]|0,l-b>>1,f)|0,G=(a[g>>2]|0)+(12*G|0)+8|0,a[G>>2]=(a[G>>2]|0)+-1);l=l+2|0}while(l>>>
0<J>>>0)}}while(0);A=v}function P(d,f){d|=0;f|=0;var p=0,u,b,c,Pb,D,J,l,g,k,w,h,m,t,v,n;t=g=0;var y,B,x,C,F,A,z,E,K=A=k=0,R=0;w=0;b=a[d+492>>2]|0;v=d+496+(b<<4)|0;m=a[d>>2]|0;h=a[m+76>>2]|0;y=h+f|0;F=e[y>>0]|0;a:do if(10==F<<24>>24){J=r[(a[m+8>>2]|0)+(f<<1)>>1]|0;l=d+496+(b<<4)+6|0;c=d+496+(b<<4)+4|0;u=H[c>>1]|0;D=d+484|0;n=J&65535;for(Pb=H[l>>1]|0;;){z=Pb+-1|0;if((Pb|0)<=(u|0)){w=32;break}g=a[D>>2]|0;t=g+(24*z|0)+4|0;if((a[t>>2]|0)==(n|0))break;else Pb=z}if(32==(w|0))if(J<<16>>16)if(D=n,D|=0,z=r[43702+
((55296>D>>>0?((H[43702+(D>>5<<1)>>1]|0)<<2)+(D&31)|0:65536>D>>>0?((H[43702+((56320>(D|0)?320:0)+(D>>5)<<1)>>1]|0)<<2)+(D&31)|0:1114111<D>>>0?3624:((H[43702+((H[43702+((D>>11)+2080<<1)>>1]|0)+(D>>>5&63)<<1)>>1]|0)<<2)+(D&31)|0)<<1)>>1]|0,D=((z&768?Wb(D,z)|0:D)|0)&65535,D<<16>>16==J<<16>>16)w=39;else if(z=a[m+4>>2]|0,l=n,z|=0,l|=0,55296>l>>>0?l=((H[(a[z+20>>2]|0)+(l>>5<<1)>>1]|0)<<2)+(l&31)|0:65536>l>>>0?l=((H[(a[z+20>>2]|0)+((56320>(l|0)?320:0)+(l>>5)<<1)>>1]|0)<<2)+(l&31)|0:1114111<l>>>0?l=(a[z+
32>>2]|0)+128|0:(a[z+52>>2]|0)>(l|0)?(c=a[z+20>>2]|0,l=((H[c+((H[c+((l>>11)+2080<<1)>>1]|0)+(l>>>5&63)<<1)>>1]|0)<<2)+(l&31)|0):l=a[z+56>>2]|0,1!=((H[(a[z+20>>2]|0)+(l<<1)>>1]|0)>>>8&3|0))w=39;else{b:do if(12297>D<<16>>16){switch(D<<16>>16){case 9002:break;default:break b}if(!((ma(d,12297,f)|0)<<24>>24)){p=0;break a}}else{switch(D<<16>>16){case 12297:break;default:break b}if(!((ma(d,9002,f)|0)<<24>>24)){p=0;break a}}while(0);(ma(d,D,f)|0)<<24>>24?w=39:p=0}else w=39;else{n=Q[d+496+(b<<4)+8>>0]&1;J=
r[g+(24*z|0)+12>>1]|0;n?J&2?(A=n,R=0):w=8:J&1?R=A=0:w=8;do if(8==(w|0))if(J&3)A=a[g+(24*z|0)+16>>2]|0,R=(u|0)!=(z|0);else{r[l>>1]=z;w=39;break a}while(0);J=A&255;n=g+(24*z|0)|0;e[h+(a[n>>2]|0)>>0]=J;e[(a[(a[d>>2]|0)+76>>2]|0)+f>>0]=J;Fa(d,z,a[n>>2]|0,J);b:do if(R){a[t>>2]=0-f;u=r[c>>1]|0;B=u&65535;c:do if((z|0)>(B|0))for(x=a[D>>2]|0,C=a[n>>2]|0,E=Pb+-2|0;;){if((a[x+(24*E|0)>>2]|0)!=(C|0))break c;a[x+(24*E|0)+4>>2]=0;if((E|0)>(B|0))E=E+-1|0;else break}while(0);B=H[l>>1]|0;if((Pb|0)<(B|0))for(x=a[D>>
2]|0,E=Pb;;){if((a[x+(24*E|0)>>2]|0)>=(f|0))break b;C=x+(24*E|0)+4|0;0<(a[C>>2]|0)&&(a[C>>2]=0);E=E+1|0;if((E|0)>=(B|0))break}}else for(u=r[c>>1]|0,B=z&65535;;){r[l>>1]=B;if((B&65535)<=(u&65535))break b;if((a[(a[D>>2]|0)+(24*((B&65535)+-1|0)|0)>>2]|0)==(a[n>>2]|0))B=B+-1<<16>>16;else break}while(0);if(10==J<<24>>24)w=39;else{e[d+496+(b<<4)+10>>0]=10;a[d+496+(b<<4)+12>>2]=A&255;a[v>>2]=f;l=a[(a[d>>2]|0)+80>>2]|0;p=l+f|0;c=Q[p>>0]|0;if(c&128){l=c&1;e[d+496+(b<<4)+9>>0]=l;l=1<<l;Pb=u&65535;if((Pb|0)<
(z|0)){c=a[D>>2]|0;n=Pb;do Pb=c+(24*n|0)+12|0,r[Pb>>1]=H[Pb>>1]|l,n=n+1|0;while((n|0)!=(z|0))}e[p>>0]=Q[p>>0]&127;p=a[(a[d>>2]|0)+80>>2]|0}else p=l;D=p+(a[(a[D>>2]|0)+(24*z|0)>>2]|0)|0;e[D>>0]=Q[D>>0]&127;p=1}}}else w=39;while(0);a:do if(39==(w|0)){g=Q[(a[(a[d>>2]|0)+80>>2]|0)+f>>0]|0;b:do if(g&128)k=g&1,w=k&255,3<=(F+-8&255)&&(e[y>>0]=w),e[d+496+(b<<4)+10>>0]=w,e[d+496+(b<<4)+9>>0]=w,a[d+496+(b<<4)+12>>2]=k,a[v>>2]=f,k=w,w=55;else switch(F<<24>>24){case 0:case 1:case 13:k=0!=F<<24>>24;e[d+496+(b<<
4)+10>>0]=F;e[d+496+(b<<4)+9>>0]=F;a[d+496+(b<<4)+12>>2]=k&1;a[v>>2]=f;k&=1;w=55;break b;case 2:e[d+496+(b<<4)+10>>0]=2;switch(e[d+496+(b<<4)+9>>0]|0){case 0:e[d+2528>>0]|0||(e[y>>0]=23);a[d+496+(b<<4)+12>>2]=0;a[v>>2]=f;K=0;break b;case 13:K=5;break;default:K=24}e[y>>0]=K;a[d+496+(b<<4)+12>>2]=1;a[v>>2]=f;K=1;break b;case 5:e[d+496+(b<<4)+10>>0]=5;a[d+496+(b<<4)+12>>2]=1;a[v>>2]=f;K=1;break b;case 17:k=e[d+496+(b<<4)+10>>0]|0;if(10!=k<<24>>24){w=55;break b}e[y>>0]=10;p=1;break a;default:k=e[d+496+
(b<<4)+10>>0]=F;w=55;break b}while(0);if(55==(w|0))switch(k<<24>>24){case 0:case 1:case 13:K=k;break;default:p=1;break a}g=1<<(0!=K<<24>>24&1);h=r[d+496+(b<<4)+4>>1]|0;m=r[d+496+(b<<4)+6>>1]|0;t=m&65535;if((h&65535)<(m&65535)){m=a[d+484>>2]|0;A=h&65535;do(a[m+(24*A|0)>>2]|0)<(f|0)&&(h=m+(24*A|0)+12|0,r[h>>1]=H[h>>1]|g),A=A+1|0;while((A|0)<(t|0))}p=1}while(0);return p|0}function K(d,f,p,b,c){d|=0;f|=0;p|=0;b|=0;c|=0;var u,q,D,g,l,k,h,w,m,r,n,t,v,y;h=0;u=a[f>>2]|0;q=a[f+4>>2]|0;v=d+80|0;y=a[v>>2]|0;
w=f+20|0;l=a[w>>2]&255;g=Q[(p&255)+(u+(l<<3))>>0]|0;k=g&15;a[w>>2]=k;g=e[q+(g>>>4)>>0]|0;k=e[u+(k<<3)+7>>0]|0;a:do if(g<<24>>24){do switch(g&255|0){case 1:q=a[f+8>>2]=b;break a;case 2:q=a[f+8>>2]|0;break a;case 3:ca(a[d+76>>2]|0,y,a[f+8>>2]|0,b,(Q[f+28>>0]|0)+1&255);q=b;break a;case 4:ca(a[d+76>>2]|0,y,a[f+8>>2]|0,b,(Q[f+28>>0]|0)+2&255);q=b;break a;case 5:h=f+12|0;g=a[h>>2]|0;-1<(g|0)&&S(d,g,1);a[h>>2]=-1;if(a[d+332>>2]|0&&(h=d+336|0,q=a[h>>2]|0,g=d+340|0,(q|0)>(a[g>>2]|0))){u=f+16|0;l=(a[u>>2]|
0)+1|0;if((l|0)<(b|0)){q=l;do l=y+q|0,e[l>>0]=(Q[l>>0]|0)+254&254,q=q+1|0;while((q|0)!=(b|0));l=a[h>>2]|0}else l=q;a[g>>2]=l;a[u>>2]=-1;if(5!=p<<24>>24){q=b;break a}S(d,b,1);a[g>>2]=a[h>>2];q=b;break a}a[f+16>>2]=-1;e[u+(l<<3)+7>>0]&1?(u=a[f+8>>2]|0,u=0<(u|0)?u:b):u=b;if(5!=p<<24>>24){q=u;break a}S(d,b,1);a[d+340>>2]=a[d+336>>2];q=u;break a;case 6:0<(a[d+332>>2]|0)&&(a[d+336>>2]=a[d+340>>2]);a[f+8>>2]=-1;a[f+12>>2]=-1;a[f+16>>2]=c+-1;q=b;break a;case 7:if(3==p<<24>>24&&5==(e[(a[d+76>>2]|0)+b>>0]|
0)&&6!=(a[d+88>>2]|0)){p=f+12|0;u=a[p>>2]|0;if(-1==(u|0)){a[f+16>>2]=c+-1;q=b;break a}-1<(u|0)&&(S(d,u,1),a[p>>2]=-2);S(d,b,1);q=b;break a}p=f+12|0;if(-1!=(a[p>>2]|0)){q=b;break a}q=a[p>>2]=b;break a;case 8:a[f+16>>2]=c+-1;a[f+8>>2]=-1;q=b;break a;case 9:for(p=b;;){u=p;p=p+-1|0;if(0>=(u|0))break;if(e[y+p>>0]&1){h=36;break}}36==(h|0)&&(S(d,p,4),a[d+340>>2]=a[d+336>>2]);q=a[f+8>>2]=b;break a;case 10:S(d,b,1);S(d,b,2);q=b;break a;case 11:u=d+340|0;l=d+336|0;a[l>>2]=a[u>>2];if(5!=p<<24>>24){q=b;break a}S(d,
b,4);a[u>>2]=a[l>>2];q=b;break a;case 12:l=(Q[f+28>>0]|0)+(k&255)|0;p=l&255;u=f+8|0;h=a[u>>2]|0;l&=255;if((h|0)<(b|0)){g=h;do h=y+g|0,(Q[h>>0]|0)>>>0<l>>>0&&(e[h>>0]=p),g=g+1|0;while((g|0)!=(b|0))}a[d+340>>2]=a[d+336>>2];q=a[u>>2]=b;break a;case 13:q=e[f+28>>0]|0;w=f+8|0;m=q&255;r=m+3|0;n=m+2|0;m=m+1&255;if((a[w>>2]|0)<(b|0))D=b;else{q=b;break a}for(;;){t=D+-1|0;D=e[y+t>>0]|0;if((D&255|0)==(r|0)){do D=t,t=t+-1|0,e[y+D>>0]=m,D=e[y+t>>0]|0;while((D&255|0)==(r|0));if(D<<24>>24==q<<24>>24)for(D=t;;)if(t=
D+-1|0,D=e[y+t>>0]|0,D<<24>>24==q<<24>>24)D=t;else break}e[y+t>>0]=(D&255|0)==(n|0)?q:m;if((t|0)>(a[w>>2]|0))D=t;else{q=b;break}}break;case 14:q=f+8|0;w=(Q[f+28>>0]|0)+1&255;r=a[q>>2]|0;if((r|0)<(b|0))D=r,r=b;else{q=b;break a}for(;;)if(r=r+-1|0,n=y+r|0,m=Q[n>>0]|0,m>>>0>w>>>0?(e[n>>0]=m+254,n=a[q>>2]|0):n=D,(r|0)<=(n|0)){q=b;break}else D=n;break;default:q=b;break a}while(0)}else q=b;while(0);0!=k<<24>>24|(q|0)<(b|0)&&(b=(Q[f+28>>0]|0)+(k&255)&255,(q|0)<(a[f+24>>2]|0)?ca(a[d+76>>2]|0,a[v>>2]|0,q,c,
b):(q|0)<(c|0)&&Cd(y+q|0,b|0,c-q|0)|0)}function fa(d,b,p,u,c,g){d|=0;b|=0;p|=0;u|=0;g|=0;var f,q,e,l,h,k,m,Mb;m=0;var t,n,v,A,y,B,x=0;c=(c|0)&65535;a:do switch(c&11|0){case 0:if((u|0)<(b|0)){a[g>>2]=15;f=b;break a}else f=b,q=p;for(;;){e=f+-1|0;1<(f|0)&&-9216==(r[d+(e<<1)>>1]&-1024)<<16>>16&&(l=f+-2|0,e=-10240==(r[d+(l<<1)>>1]&-1024)<<16>>16?l:e);h=e+1|0;y=(f|0)>(h|0);l=q;for(k=e;!(r[l>>1]=r[d+(k<<1)>>1]|0,k=k+1|0,(k|0)>=(f|0));)l=l+2|0;q=q+((y?f:h)-e<<1)|0;if(0>=(e|0)){f=b;break}else f=e}break;case 1:if((u|
0)<(b|0)){a[g>>2]=15;f=b;break a}else f=b,q=p;for(;;){for(h=f;;){e=h+-1|0;l=H[d+(e<<1)>>1]|0;1<(h|0)&56320==(l&64512|0)&&(y=h+-2|0,h=H[d+(y<<1)>>1]|0,55296==(h&64512|0)&&(e=y,l=l+-56613888+(h<<10)|0));if(0>=(e|0)){h=0;break}if(1<<((oc(l)|0)<<24>>24)&448)h=e;else{h=1;break}}y=e+1|0;k=(f|0)>(y|0);l=q;for(Mb=e;!(r[l>>1]=r[d+(Mb<<1)>>1]|0,Mb=Mb+1|0,(Mb|0)>=(f|0));)l=l+2|0;q=q+((k?f:y)-e<<1)|0;if(h)f=e;else{f=b;break}}break;default:if(f=0!=(c&8|0)){q=d;e=0;for(h=b;!(l=H[q>>1]|0,e=((4>(l+-8294|0)>>>0|8204==
(l&65532|0)|5>(l+-8234|0)>>>0)&1^1)+e|0,1>=(h|0));)q=q+2|0,h=h+-1|0;q=d+((1>(b|0)?1-b|0:0)<<1)|0;y=e}else q=d,y=b;if((y|0)>(u|0)){a[g>>2]=15;f=y;break a}l=0!=(c&1|0);h=0==(c&2|0);k=p;for(e=b;;){Mb=e+-1|0;v=H[q+(Mb<<1)>>1]|0;1<(e|0)&56320==(v&64512|0)?(n=e+-2|0,B=H[q+(n<<1)>>1]|0,55296==(B&64512|0)?(Mb=n,B=v+-56613888+(B<<10)|0):B=v):B=v;b:do if(l&0<(Mb|0))for(n=Mb,t=B;;){if(!(1<<((oc(t)|0)<<24>>24)&448)){v=n;n=t;break b}t=n+-1|0;v=H[q+(t<<1)>>1]|0;1<(n|0)&56320==(v&64512|0)?(A=n+-2|0,n=H[q+(A<<1)>>
1]|0,55296==(n&64512|0)?(t=A,A=v+-56613888+(n<<10)|0):A=v):A=v;if(0<(t|0))n=t,t=A;else{v=t;n=A;break}}else v=Mb,n=B;while(0);if(f)if(8204==(n&-4|0))m=k;else switch(n|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:m=k;break;default:x=38}else x=38;if(38==(x|0)){x=0;h?(m=k,B=v):(m=nc(n)|0,65536>m>>>0?(r[k>>1]=m,Mb=1):(r[k>>1]=(m>>>10)+55232,r[k+2>>1]=m&1023|56320,Mb=2),m=k+(Mb<<1)|0,B=Mb+v|0);Mb=((B|0)>(e|0)?B:e)-B|0;if((B|0)<(e|0))for(k=m;r[k>>1]=r[q+(B<<
1)>>1]|0,B=B+1|0,(B|0)!=(e|0);)k=k+2|0;m=m+(Mb<<1)|0}if(0<(v|0))k=m,e=v;else{f=y;break}}}while(0);return f|0}function ha(d,b,p,u,c,g){d|=0;b|=0;p|=0;u|=0;c|=0;g|=0;var f,q,e,l,h,k,m,Mb=0,n,t=0,v=0;a:do switch(c&10|0){case 0:if((u|0)<(b|0)){a[g>>2]=15;f=b;break a}else for(f=d,q=p,e=b;;)if(r[q>>1]=r[f>>1]|0,1<(e|0))f=f+2|0,q=q+2|0,e=e+-1|0;else{f=b;break}break;case 2:if((u|0)<(b|0)){a[g>>2]=15;f=b;break a}else f=q=0;for(;;)if(e=q+1|0,h=H[d+(q<<1)>>1]|0,(e|0)==(b|0)|55296!=(h&64512|0)?q=e:(l=H[d+(e<<
1)>>1]|0,56320==(l&64512|0)?(h=(h<<10)+-56613888+l|0,q=q+2|0):q=e),e=nc(h)|0,65536>e>>>0?(h=e,e=f+1|0):(r[p+(f+1<<1)>>1]=e&1023|56320,h=(e>>>10)+55232|0,e=f+2|0),r[p+(f<<1)>>1]=h,(q|0)<(b|0))f=e;else{f=b;break}break;case 8:q=b;f=d;e=p;h=u;b:for(;;){l=f;f=f+2|0;k=r[l>>1]|0;m=k&65535;c:do if(8204==(m&65532|0))l=e,t=h;else{switch(m|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:l=e;t=h;break c}Mb=h+-1|0;if(1>(h|0))break b;r[e>>1]=k;l=e+2|0;t=Mb}while(0);
if(1>=(q|0)){v=22;break}else q=q+-1|0,e=l,h=t}if(22==(v|0)){f=u-t|0;break a}a[g>>2]=15;if(1<(q|0))for(h=Mb;;)if(q=q+-1|0,e=H[f>>1]|0,e=(((4>(e+-8294|0)>>>0|8204==(e&65532|0)|5>(e+-8234|0)>>>0)^1)<<31>>31)+h|0,1>=(q|0)){f=e;break}else f=f+2|0,h=e;else f=Mb;f=u-f|0;break;default:q=b;f=d;e=0;h=u;b:for(;;){l=H[f>>1]|0;1==(q|0)|55296!=(l&64512|0)?(k=l,m=1):(k=H[f+2>>1]|0,56320==(k&64512|0)?(k=(l<<10)+-56613888+k|0,m=2):(k=l,m=1));f=f+(m<<1)|0;q=q-m|0;c:do if(8204==(k&-4|0))n=e,l=h;else{switch(k|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:n=
e;l=h;break c}l=h-m|0;if(0>(l|0))break b;n=nc(k)|0;65536>n>>>0?(r[p+(e<<1)>>1]=n,n=e+1|0):(r[p+(e<<1)>>1]=(n>>>10)+55232,r[p+(e+1<<1)>>1]=n&1023|56320,n=e+2|0)}while(0);if(0>=(q|0)){f=n;break a}else e=n,h=l}a[g>>2]=15;if(0<(q|0))for(h=l;;)if(e=H[f>>1]|0,e=(((4>(e+-8294|0)>>>0|8204==(e&65532|0)|5>(e+-8234|0)>>>0)^1)<<31>>31)+h|0,1<(q|0))q=q+-1|0,f=f+2|0,h=e;else{f=e;break}else f=l;f=u-f|0}while(0);return f|0}function ga(d,b){d|=0;b|=0;var f=0,c,q,e,g,h,k,l,r,n,w,t,v,A,x,C,y=0;c=d+4|0;q=a[c>>2]|0;n=
q&-8;w=d+n|0;t=a[168]|0;v=q&3;1!=(v|0)&d>>>0>=t>>>0&d>>>0<w>>>0||m();A=d+(n|4)|0;C=a[A>>2]|0;C&1||m();if(!v)return 256>b>>>0?0:n>>>0>=(b+4|0)>>>0&&(n-b|0)>>>0<=a[284]<<1>>>0?d|0:0;if(n>>>0>=b>>>0){f=n-b|0;if(15>=f>>>0)return d|0;a[c>>2]=q&1|b|2;a[d+(b+4)>>2]=f|3;a[A>>2]|=1;z(d+b|0,f);return d|0}if((w|0)==(a[170]|0)){f=(a[167]|0)+n|0;if(f>>>0<=b>>>0)return 0;f=f-b|0;a[c>>2]=q&1|b|2;a[d+(b+4)>>2]=f|1;a[170]=d+b;a[167]=f;return d|0}if((w|0)==(a[169]|0)){n=(a[166]|0)+n|0;if(n>>>0<b>>>0)return 0;f=n-b|
0;15<f>>>0?(a[c>>2]=q&1|b|2,a[d+(b+4)>>2]=f|1,a[d+n>>2]=f,c=d+(n+4)|0,a[c>>2]&=-2,c=d+b|0,q=f):(a[c>>2]=q&1|n|2,c=d+(n+4)|0,a[c>>2]|=1,q=c=0);a[166]=q;a[169]=c;return d|0}if(C&2)return 0;v=(C&-8)+n|0;if(v>>>0<b>>>0)return 0;A=v-b|0;x=C>>>3;do if(256>C>>>0)r=a[d+(n+8)>>2]|0,l=a[d+(n+12)>>2]|0,e=696+(x<<1<<2)|0,(r|0)!=(e|0)&&(r>>>0<t>>>0&&m(),(a[r+12>>2]|0)!=(w|0)&&m()),(l|0)==(r|0)?a[164]&=~(1<<x):((l|0)==(e|0)?f=l+8|0:(l>>>0<t>>>0&&m(),e=l+8|0,(a[e>>2]|0)==(w|0)?f=e:m()),a[r+12>>2]=l,a[f>>2]=r);else{r=
a[d+(n+24)>>2]|0;l=a[d+(n+12)>>2]|0;do if((l|0)==(w|0)){g=d+(n+20)|0;e=a[g>>2]|0;if(!e&&(g=d+(n+16)|0,e=a[g>>2]|0,!e)){y=0;break}for(;;)if(h=e+20|0,k=a[h>>2]|0)e=k,g=h;else if(h=e+16|0,k=a[h>>2]|0)e=k,g=h;else break;g>>>0<t>>>0?m():(a[g>>2]=0,y=e)}else e=a[d+(n+8)>>2]|0,e>>>0<t>>>0&&m(),g=e+12|0,(a[g>>2]|0)!=(w|0)&&m(),h=l+8|0,(a[h>>2]|0)==(w|0)?(a[g>>2]=l,a[h>>2]=e,y=l):m();while(0);if(r){l=a[d+(n+28)>>2]|0;e=960+(l<<2)|0;if((w|0)==(a[e>>2]|0)){if(a[e>>2]=y,!y){a[165]&=~(1<<l);break}}else if(r>>>
0<(a[168]|0)>>>0&&m(),l=r+16|0,(a[l>>2]|0)==(w|0)?a[l>>2]=y:a[r+20>>2]=y,!y)break;l=a[168]|0;y>>>0<l>>>0&&m();a[y+24>>2]=r;if(r=a[d+(n+16)>>2]|0)r>>>0<l>>>0?m():(a[y+16>>2]=r,a[r+24>>2]=y);if(r=a[d+(n+20)>>2]|0)r>>>0<(a[168]|0)>>>0?m():(a[y+20>>2]=r,a[r+24>>2]=y)}}while(0);16>A>>>0?(a[c>>2]=q&1|v|2,c=d+(v|4)|0,a[c>>2]|=1):(a[c>>2]=q&1|b|2,a[d+(b+4)>>2]=A|3,c=d+(v|4)|0,a[c>>2]|=1,z(d+b|0,A));return d|0}function W(d,b,p,c,q){d|=0;b|=0;p|=0;c|=0;q|=0;var f=0,u=0,e=0,g=0,l=0,h=0,k=0,m=0,n=0,t=0,v=0,x=
0,C=0,y=0,B=0,z=0,E=0,F=0,F=A;A=A+656|0;g=F+32|0;x=F+56|0;y=F+28|0;B=F+24|0;l=F;if(!q||0<(a[q>>2]|0))return A=F,0;if(!(0==(d|0)|-1>(b|0)||(v=0==(p|0),0>(c|0)|v&0!=(c|0)))){if(-1==(b|0)){for(z=d;;)if(r[z>>1]|0)z=z+2|0;else break;u=z-d>>1}else u=b;if(1>(u|0))return f=ad(p,c,0,q)|0,A=F,f|0;if(!v&&(d>>>0<=p>>>0&(d+(u<<1)|0)>>>0>p>>>0||p>>>0<=d>>>0&(p+(c<<1)|0)>>>0>d>>>0))return a[q>>2]=1,f=0,A=F,f|0;a[y>>2]=0;a[B>>2]=0;var K;var R=d,P=u,R=R|0,P=P|0,S=0,W=0,fa=0,ha=0,ga=0,aa=0,ma=0,ca=0,ha=P+-1|0;if(0<
(P|0)){S=P;for(aa=0;;)if(ga=r[R+(aa<<1)>>1]|0,(aa|0)<(ha|0)&1604==ga<<16>>16?(ma=(r[R+(aa+1<<1)>>1]|0)+-1570<<16>>16,6>(ma&65535)?43>>>(ma&63)&1?ca=6:W=S:ca=5):ca=5,5==(ca|0)&&(ca=0,-400==(ga&-16)<<16>>16?ca=6:W=S),6==(ca|0)&&(ca=0,W=S+-1|0),aa=aa+1|0,(aa|0)==(P|0)){fa=W;break}else S=W;K=fa|0}else K=P|0;h=K|0;if((h|0)>(c|0))return a[q>>2]=15,A=F,h|0;e=(u|0)>(h|0)?u:h;if(301>(e|0))C=300,E=x;else if(k=he(e<<1)|0)C=e,E=k;else return a[q>>2]=7,A=F,0;ld(E|0,d|0,u<<1|0)|0;(C|0)>(u|0)&&Cd(E+(u<<1)|0,0,C-
u<<1|0)|0;nd(E,u,y,B);bd(E,u,a[y>>2]|0,a[B>>2]|0);r[l>>1]=8203;r[l+2>>1]=0;a[l+4>>2]=3;a[l+8>>2]=2;a[l+12>>2]=262144;a[l+16>>2]=393216;a[l+20>>2]=0;a[g>>2]=a[l>>2];a[g+4>>2]=a[l+4>>2];a[g+8>>2]=a[l+8>>2];a[g+12>>2]=a[l+12>>2];a[g+16>>2]=a[l+16>>2];a[g+20>>2]=a[l+20>>2];var Ca;var X=E,da=u,Fa=q,ta=g,X=X|0,da=da|0,Fa=Fa|0,ta=ta|0,ua=0,Ja=0,xb=0,va=0,Xb=0,yb=0,fb=0,pb=0,qc=0,wa=0,Xa=0,qb=0,rb=0,ac=0,Ya=0,sb=0,zb=0,gb=0,tb=0,hb=0,ba=0,Za=0,na=0,T=0,qa=0,ib=0,ja=0,Ab=0,Da=0,Ea=0,Pa=0,Qa=0,U=0,jb=0,Ma=
0,ub=0,$a=0,nc=0,xa=0,ab=0,vb=0,Ka=0,wb=0,bb=0,kb=0,oc=0,oa=0,lb=0,ea=0,N=0,mb=0,pa=0,Ga=0,O=0,Ra=0,ya=0,Sa=0,ra=0,ia=0,Ha=0,V=0,za=0,ka=0,La=0,Ta=0,L=0,Aa=0,Bb=0,Yb=0,Jb=0,Kb=0,Lb=0,Ac=0,Uc=0,Wb=0,pc=0,Pc=0,Bc=0,xc=0,Zb=0,cd=0,$b=0,Cc=0,Cb=0,vc=0,dd=0,Mc=0,mc=0,Nc=0,rc=0,Oc=0,sc=0,tc=0,ed=0,od=0,Qc=0,fd=0,Fc=0,Vc=0,uc=0,pd=0,Dc=0,Gc=0,cb=0,Kc=0,Wc=0,cc=0,Xc=0,qd=0,rd=0,Rc=0,Hc=0,Yc=0,Na=0;if(qb=0<(da|0)){Wb=0;do rb=X+(Wb<<1)|0,jb=r[rb>>1]|0,ub=jb&65535,176>(jb+1200&65535)?(lb=r[1152+(ub+-64336<<
1)>>1]|0,lb<<16>>16&&(r[rb>>1]=lb)):r[rb>>1]=141>(jb+400&65535)?r[1504+(ub+-65136<<1)>>1]|0:jb,Wb=Wb+1|0;while((Wb|0)!=(da|0))}ib=da+-1|0;do if(da){ya=-2;Jb=Dd(r[X+(ib<<1)>>1]|0)|0;Pc=ib;od=sc=0;Vc=ib;for(Rc=Wc=cb=uc=0;;){U=Jb&65535;U&65280?Na=13:(Dd(r[X+(Pc<<1)>>1]|0)|0)&4?Na=13:(ra=ya,Lb=Jb,cd=Pc,ed=sc,fd=od,Gc=uc,Xc=Wc,Yc=Rc);do if(13==(Na|0)){Na=0;Ra=Pc+-1|0;Sa=ya;Dc=uc;b:for(;;)for(Ma=0>(Sa|0),Ga=Ra,pd=Dc;;){if(!Ma)break b;if(-1==(Ga|0)){Ra=-1;Sa=3E3;Dc=0;continue b}$a=Dd(r[X+(Ga<<1)>>1]|0)|
0;nc=0==($a&4);O=((nc^1)<<31>>31)+Ga|0;if(nc){Ra=O;Sa=Ga;Dc=$a;continue b}else Ga=O,pd=$a}if(0==(od&16)|0==(U&32|0))Kb=Jb,xc=Pc,tc=sc,Qc=od;else{xa=X+(Pc<<1)|0;switch(H[xa>>1]|0){case 1570:Ja=1628;Na=23;break;case 1571:Ja=1629;Na=23;break;case 1573:Ja=1630;Na=23;break;case 1575:Ja=1631;Na=23;break;default:xb=0,Bc=Pc}23==(Na|0)&&(Na=0,r[xa>>1]=-1,xb=r[X+(Vc<<1)>>1]=Ja,Bc=Vc);Kb=Dd(xb)|0;xc=Bc;tc=1;Qc=cb}0<(xc|0)?32==(r[X+(xc+-1<<1)>>1]|0)?(ab=r[X+(xc<<1)>>1]|0,4>(ab+-1587&65535)?(cc=1,Hc=Rc):(cc=Wc,
Hc=1574==ab<<16>>16?1:Rc)):(cc=Wc,Hc=Rc):xc?(cc=Wc,Hc=Rc):(vb=r[X>>1]|0,4>(vb+-1587&65535)?(cc=1,Hc=Rc):(cc=Wc,Hc=1574==vb<<16>>16?1:Rc));Ka=Kb&65535;wb=Ka&3;bb=Qc&65535;kb=pd&65535;oc=Q[67805+((kb&3)<<4)+((bb&3)<<2)+wb>>0]|0;1==(wb|0)?(Xa=wa=X+(xc<<1)|0,mb=r[wa>>1]|0,ia=oc&1):(oa=X+(xc<<1)|0,ea=r[oa>>1]|0,8>(ea+-1611&65535)?bb&2?0==(kb&1|0)|1612==(ea&-2)<<16>>16?(Xa=oa,mb=ea,ia=0):(Xa=oa,mb=ea,ia=bb>>>4&1^1|kb>>>5&1^1):(Xa=oa,mb=ea,ia=0):(Xa=oa,mb=ea,ia=oc));N=mb&65535;if(256>(N^1536)>>>0){if(8>
(mb+-1611&65535)){r[Xa>>1]=ia+65136+(Q[67869+(N+-1611)>>0]|0);ra=Sa;Lb=Kb;cd=xc;ed=tc;fd=Qc;Gc=pd;Xc=cc;Yc=Hc;break}pa=Ka>>>8;if(Ka&8){r[Xa>>1]=pa+64336+ia;ra=Sa;Lb=Kb;cd=xc;ed=tc;fd=Qc;Gc=pd;Xc=cc;Yc=Hc;break}0!=(pa|0)&0==(Ka&4|0)&&(r[Xa>>1]=pa+65136+ia)}ra=Sa;Lb=Kb;cd=xc;ed=tc;fd=Qc;Gc=pd;Xc=cc;Yc=Hc}while(0);Fc=(ac=0==(Lb&4))?fd:cb;Ac=ac?Lb:fd;Cc=ac?cd:Vc;Ya=cd+-1|0;sb=0==(cd|0);if((Ya|0)==(ra|0))if(sb)break;else{ya=-2;Jb=Gc;Pc=Ya;sc=ed;od=Ac;Vc=Cc;uc=Gc;cb=Fc;Wc=Xc;Rc=Yc;continue}if(sb)break;
ya=ra;Jb=Dd(r[X+(Ya<<1)>>1]|0)|0;Pc=Ya;sc=ed;od=Ac;Vc=Cc;uc=Gc;cb=Fc;Wc=Xc;Rc=Yc}if(ed){zb=a[ta+4>>2]|0;gb=a[ta+8>>2]|0;tb=a[ta+12>>2]|0;hb=a[ta+16>>2]|0;ba=da<<1;Za=ba+2|0;na=he(Za)|0;if(!na){a[Fa>>2]=7;ua=0;Kc=Xc;rd=Yc;break}Cd(na|0,0,Za|0)|0;if(qb){for(dd=Uc=V=0;qa=r[X+(Uc<<1)>>1]|0,-1==qa<<16>>16?(za=V+1|0,Mc=dd+-1|0):(r[na+(dd<<1)>>1]=qa,za=V,Mc=dd),Uc=Uc+1|0,(Uc|0)!=(da|0);)V=za,dd=Mc+1|0;-1<(za|0)?(T=1,Ha=za,Na=54):Na=61}else Ha=T=0,Na=54;if(54==(Na|0)){ka=Ha;for(pc=T?da:0;;)if(r[na+(pc<<1)>>
1]=0,0<(ka|0))ka=ka+-1|0,pc=pc+-1|0;else break;T?Na=61:qd=X}61==(Na|0)&&(ld(X|0,na|0,ba|0)|0,qd=X);for(;;)if(r[qd>>1]|0)qd=qd+2|0;else break;zb?tb?Xb=qd-X>>1:(fb=1,Ab=0,Na=66):(fb=0==(tb|0),Ab=1,Na=66);if(66==(Na|0)){Cd(na|0,0,Za|0)|0;if(-1<(da|0)){La=0;for(mc=Zb=da;;)if(ja=r[X+(Zb<<1)>>1]|0,Ab&-1==ja<<16>>16|fb&-2==ja<<16>>16?(Ta=La+1|0,Nc=mc+1|0):(r[na+(mc<<1)>>1]=ja,Ta=La,Nc=mc),0<(Zb|0))La=Ta,Zb=Zb+-1|0,mc=Nc+-1|0;else break;if(0<(Ta|0)){$b=0;do r[na+($b<<1)>>1]=32,$b=$b+1|0;while(($b|0)!=(Ta|
0))}qb&&ld(X|0,na|0,ba|0)|0}Xb=da}Da=0==(gb|0);Ea=0==(hb|0);pb=Da?1:0;qc=Da?Ea:1;do if(Da|Ea){Cd(na|0,0,Za|0)|0;if(qb){for(rc=Cb=Aa=0;Qa=r[X+(Cb<<1)>>1]|0,pb&-1==Qa<<16>>16|qc&-2==Qa<<16>>16?(Bb=Aa+1|0,Oc=rc+-1|0):(r[na+(rc<<1)>>1]=Qa,Bb=Aa,Oc=rc),Cb=Cb+1|0,(Cb|0)!=(da|0);)Aa=Bb,rc=Oc+1|0;-1<(Bb|0)&&(Pa=1,L=Bb,Na=78)}else L=Pa=0,Na=78;if(78==(Na|0)){Yb=L;for(vc=Pa?da:0;;)if(r[na+(vc<<1)>>1]=32,0<(Yb|0))Yb=Yb+-1|0,vc=vc+-1|0;else break;if(!Pa){yb=da;break}}ld(X|0,na|0,ba|0)|0;yb=da}else yb=Xb;while(0);
md(na);ua=yb}else ua=da;Kc=Xc;rd=Yc}else rd=Kc=ua=0;while(0);va=rd|Kc?ua|0:ua;Ca=va|0;m=Ca|0;nd(E,m,y,B);bd(E,m,a[y>>2]|0,a[B>>2]|0);t=(n=(m|0)>(c|0))?c:m;0<(t|0)&&ld(p|0,E|0,t<<1|0)|0;(E|0)!=(x|0)&&md(E);if(n)return a[q>>2]=15,A=F,m|0;f=ad(p,c,m,q)|0;A=F;return f|0}a[q>>2]=1;A=F;return 0}function aa(d,b){d|=0;b|=0;var f,c,q,g,h,k,m,l,n,t,w,v,x;v=A;A=A+64|0;f=a[d>>2]|0;l=d+(a[f+-8>>2]|0)|0;n=a[f+-4>>2]|0;a[v>>2]=b;a[v+4>>2]=d;a[v+8>>2]=16;t=v+12|0;f=v+16|0;c=v+20|0;q=v+24|0;g=v+28|0;h=v+32|0;k=v+
40|0;m=(n|0)==(b|0);w=t;x=w+40|0;do a[w>>2]=0,w=w+4|0;while((w|0)<(x|0));r[t+40>>1]=0;e[t+42>>0]=0;a:do if(m)a[v+48>>2]=1,Ed[a[(a[b>>2]|0)+20>>2]&3](b,v,l,l,1,0),t=1==(a[q>>2]|0)?l:0;else{yf[a[(a[n>>2]|0)+24>>2]&3](n,v,l,1,0);switch(a[v+36>>2]|0){case 0:t=1==(a[k>>2]|0)&1==(a[g>>2]|0)&1==(a[h>>2]|0)?a[c>>2]|0:0;break a;case 1:break;default:t=0;break a}t=1==(a[q>>2]|0)||0==(a[k>>2]|0)&1==(a[g>>2]|0)&1==(a[h>>2]|0)?a[f>>2]|0:0}while(0);A=v;return t|0}function ta(d,b){d|=0;b|=0;var f,c;a[b>>2]=d;a[b+
492>>2]=0;r[b+500>>1]=0;r[b+502>>1]=0;e[d+98>>0]|0?(c=d+140|0,f=a[c>>2]|0,f=0<(a[f>>2]|0)?e[d+97>>0]|0:Ja(a[d+136>>2]|0,f,0)|0,e[b+504>>0]=f,c=a[c>>2]|0,c=0<(a[c>>2]|0)?e[d+97>>0]|0:Ja(a[d+136>>2]|0,c,0)|0):(c=e[d+97>>0]|0,e[b+504>>0]=c);c&=1;a[b+508>>2]=c;c&=255;e[b+506>>0]=c;e[b+505>>0]=c;a[b+496>>2]=0;(f=a[d+56>>2]|0)?c=((a[d+32>>2]|0)>>>0)/24|0:(c=20,f=b+4|0);a[b+484>>2]=f;a[b+488>>2]=c;c=a[d+88>>2]|0;e[b+2528>>0]=1==(c|0)?1:6==(c|0)&1}function S(d,b,c){d|=0;b|=0;c|=0;var f=0,p,e,g=0,h,k,l,m=
0;p=d+332|0;(e=a[p>>2]|0)?(f=d+348|0,g=e,m=6):(e=he(80)|0,l=d+348|0,(a[l>>2]=e)?(a[p>>2]=10,f=l,g=10,m=6):a[d+344>>2]=7);a:do if(6==(m|0)){e=d+336|0;l=a[e>>2]|0;do if((l|0)<(g|0))h=a[f>>2]|0,k=l;else if(h=a[f>>2]|0,k=Nc(h,g<<4)|0,a[f>>2]=k)a[p>>2]<<=1,h=k,k=a[e>>2]|0;else{a[f>>2]=h;a[d+344>>2]=7;break a}while(0);a[h+(k<<3)>>2]=b;a[h+(k<<3)+4>>2]=c;a[e>>2]=(a[e>>2]|0)+1}while(0)}function Ca(d,b,c,u){d|=0;b|=0;c|=0;u|=0;var f=0,p,e=0,g;g=A;A=A+16|0;a[g>>2]=0;do if(d){p=a[d>>2]|0;if((p|0)!=(d|0)){if(!p){e=
5;break}if((a[p>>2]|0)!=(p|0)){e=5;break}}x(d,g);if(!(0<(a[g>>2]|0))){if(0<=(b|0)&&(a[d+224>>2]|0)>(b|0)){d=a[d+228>>2]|0;f=a[d+(12*b|0)>>2]|0;c&&(a[c>>2]=f&2147483647);u&&(a[u>>2]=0<(b|0)?(a[d+(12*b|0)+4>>2]|0)-(a[d+(12*(b+-1|0)|0)+4>>2]|0):a[d+4>>2]);f>>>=31;break}a[g>>2]=1}f=0}else e=5;while(0);5==(e|0)&&(a[g>>2]=27,f=0);A=g;return f|0}function ma(d,b,c){d|=0;b|=0;c|=0;var f=0,p,e,g,h,k;h=g=0;var l,m,n,t=0;p=a[d+492>>2]|0;k=d+496+(p<<4)+6|0;e=r[k>>1]|0;l=e&65535;m=d+488|0;(l|0)<(a[m>>2]|0)?(g=
e,h=a[d+484>>2]|0,t=7):(e=a[d>>2]|0,n=e+56|0,e=e+32|0,(Kc(n,e,1,48*l|0)|0)<<24>>24?(g=d+484|0,h=d+4|0,(a[g>>2]|0)==(h|0)&&ld(a[n>>2]|0,h|0,480)|0,h=a[n>>2]|0,a[g>>2]=h,a[m>>2]=((a[e>>2]|0)>>>0)/24|0,g=r[k>>1]|0,t=7):f=0);7==(t|0)&&(f=g&65535,a[h+(24*f|0)>>2]=c,a[h+(24*f|0)+4>>2]=b&65535,a[h+(24*f|0)+16>>2]=a[d+496+(p<<4)+12>>2],a[h+(24*f|0)+8>>2]=a[d+496+(p<<4)>>2],r[h+(24*f|0)+12>>1]=0,r[k>>1]=g+1<<16>>16,f=1);return f|0}function Fa(d,b,c,u){d|=0;c|=0;u|=0;var f,p,g,h,k,l,m,n,t;h=a[(a[d>>2]|0)+76>>
2]|0;b=(b|0)+1|0;k=u&255;l=d+496+(a[d+492>>2]<<4)+6|0;m=r[l>>1]|0;a:do if((b|0)<(m&65535|0))for(g=m,n=b,t=(a[d+484>>2]|0)+(24*b|0)|0;;){f=t+4|0;if(-1<(a[f>>2]|0))f=g;else{if((a[t+8>>2]|0)>(c|0))break a;p=a[t>>2]|0;if((p|0)>(c|0)){if((k|0)==(a[t+16>>2]|0))break a;e[h+p>>0]=u;g=0-(a[f>>2]|0)|0;e[h+g>>0]=u;a[f>>2]=0;Fa(d,n,p,u);Fa(d,n,g,u);f=r[l>>1]|0}else f=g}n=n+1|0;if((n|0)>=(f&65535|0))break;else g=f,t=t+24|0}while(0)}function xb(d,b,c,u){d|=0;b|=0;u|=0;var f;e[d+53>>0]=1;(a[d+4>>2]|0)==(c|0)&&(e[d+
52>>0]=1,c=d+16|0,(f=a[c>>2]|0)?(f|0)!=(b|0)?(u=d+36|0,a[u>>2]=(a[u>>2]|0)+1,e[d+54>>0]=1):(b=d+24|0,c=a[b>>2]|0,2==(c|0)?a[b>>2]=u:u=c,1==(u|0)&&1==(a[d+48>>2]|0)&&(e[d+54>>0]=1)):(a[c>>2]=b,a[d+24>>2]=u,a[d+36>>2]=1,1==(u|0)&&1==(a[d+48>>2]|0)&&(e[d+54>>0]=1)))}function Xb(d,b,c,e){d|=0;b|=0;c|=0;var f=0,p,u,g,h=0,l;a:do if(0<(d|0))for(g=u=0;;){l=g;g=a[b+(12*u|0)+4>>2]|0;p=a[b+(12*u|0)>>2]&2147483647;if((p|0)<=(c|0)&&(g-l+p|0)>(c|0)){f=u;break a}u=u+1|0;if((u|0)>=(d|0)){h=5;break}}else h=5;while(0);
5==(h|0)&&(a[(e|0)>>2]=27,f=0);return f|0}function qc(d,b,c){d|=0;b|=0;c|=0;var f,p;a:do{if(c&&!(0<(a[c>>2]|0))){do if(d){f=a[d>>2]|0;if((f|0)!=(d|0)){if(!f)break;if((a[f>>2]|0)!=(f|0))break}if(0<=(b|0)&&(a[f+16>>2]|0)>(b|0)){d=a[f+140>>2]|0;for(p=0;!((a[d+(p<<3)>>2]|0)>(b|0));)p=p+1|0;ac(f,p,0,c);f=p;break a}a[c>>2]=1;f=-1;break a}while(0);a[c>>2]=27}f=-1}while(0);return f|0}function Zb(d,b,c,u){d|=0;b|=0;c|=0;u|=0;var f;f=a[d+492>>2]|0;1<<(Q[(a[(a[d>>2]|0)+76>>2]|0)+b>>0]|0)&7864320||(r[d+496+(f<<
4)+6>>1]=r[d+496+(f<<4)+4>>1]|0,e[d+496+(f<<4)+8>>0]=u,c=((u&127)>>>0>(c&127)>>>0?u:c)&1,a[d+496+(f<<4)+12>>2]=c,c&=255,e[d+496+(f<<4)+10>>0]=c,e[d+496+(f<<4)+9>>0]=c,a[d+496+(f<<4)>>2]=b)}function Lb(d,b){d|=0;b|=0;var c,f;if(!d)return c=k(b)|0,c|0;if(4294967231<b>>>0)return c=ne()|0,a[c>>2]=12,0;if(c=ga(d+-8|0,11>b>>>0?16:b+11&-8)|0)return c+8|0;c=k(b)|0;if(!c)return 0;f=a[d+-4>>2]|0;f=(f&-8)-(0==(f&3|0)?8:4)|0;ld(c|0,d|0,(f>>>0<b>>>0?f:b)|0)|0;n(d);return c|0}function ac(d,b,c,e){d|=0;b|=0;c|=
0;e|=0;var f;a:do if(e&&0>=(a[e>>2]|0)){do if(d){f=a[d>>2]|0;if((f|0)!=(d|0)){if(!f)break;if((a[f>>2]|0)!=(f|0))break}if(0<=(b|0)&&(a[d+136>>2]|0)>(b|0)){if(!c)break a;a[c>>2]=a[(a[f+140>>2]|0)+(b<<3)>>2];break a}a[e>>2]=1;break a}while(0);a[e>>2]=27}while(0)}function Kc(d,b,c,e){d|=0;b|=0;c|=0;e|=0;var f;(f=a[d>>2]|0)?(a[b>>2]|0)<(e|0)?c<<24>>24?(c=Nc(f,e)|0)?(a[d>>2]=c,a[b>>2]=e,d=1):d=0:d=0:d=1:c<<24>>24?(c=he(e)|0,(a[d>>2]=c)?(a[b>>2]=e,d=1):d=0):d=0;return d|0}function ca(a,b,c,g,q){a|=0;b|=
0;c|=0;g|=0;q|=0;var d,f;if((c|0)<(g|0))for(d=0,f=c;c=e[a+f>>0]|0,(d=((22==c<<24>>24)<<31>>31)+d|0)||(e[b+f>>0]=q),f=f+1|0,(f|0)!=(g|0);)d=d+(20==(c&-2)<<24>>24&1)|0}function Ac(d,b,c){d|=0;b|=0;c|=0;var f,p;f=d+16|0;(p=a[f>>2]|0)?(p|0)!=(b|0)?(c=d+36|0,a[c>>2]=(a[c>>2]|0)+1,a[d+24>>2]=2,e[d+54>>0]=1):(d=d+24|0,2==(a[d>>2]|0)&&(a[d>>2]=c)):(a[f>>2]=b,a[d+24>>2]=c,a[d+36>>2]=1)}function nd(d,b,c,e){d|=0;b|=0;var f,p;for(p=0;;)if(f=(p|0)<(b|0),f&32==(r[d+(p<<1)>>1]|0))p=p+1|0;else break;if(f)for(f=
0;;)if(b=b+-1|0,32!=(r[d+(b<<1)>>1]|0)){d=f;break}else f=f+1|0;else d=0;a[(c|0)>>2]=p;a[(e|0)>>2]=d}function Ja(d,b,c){d|=0;b|=0;c|=0;var f,p;a:do if(0<(d|0))for(f=0;;){if((a[b+(f<<3)>>2]|0)>(c|0)){p=1;break a}f=f+1|0;if(!((f|0)<(d|0))){p=0;break}}else f=p=0;while(0);return a[b+((p?f:d+-1|0)<<3)+4>>2]&255|0}function Cd(d,b,c){d|=0;b|=0;c|=0;var f,p,g,h;f=d+c|0;if(20<=(c|0)){b&=255;h=d&3;p=b|b<<8|b<<16|b<<24;g=f&-4;if(h)for(h=d+4-h|0;(d|0)<(h|0);)e[d>>0]=b,d=d+1|0;for(;(d|0)<(g|0);)a[d>>2]=p,d=d+4|
0}for(;(d|0)<(f|0);)e[d>>0]=b,d=d+1|0;return d-c|0}function ld(d,b,c){d|=0;b|=0;c|=0;var f;if(4096<=(c|0))return Gd(d|0,b|0,c|0)|0;f=d|0;if((d&3)==(b&3)){for(;d&3;){if(!c)return f|0;e[d>>0]=e[b>>0]|0;d=d+1|0;b=b+1|0;c=c-1|0}for(;4<=(c|0);)a[d>>2]=a[b>>2],d=d+4|0,b=b+4|0,c=c-4|0}for(;0<(c|0);)e[d>>0]=e[b>>0]|0,d=d+1|0,b=b+1|0,c=c-1|0;return f|0}function Sd(d,b){d|=0;b|=0;var c;a:do{if(b&&!(0<(a[b>>2]|0))){do if(d){c=a[d>>2]|0;if((c|0)!=(d|0)){if(!c)break;if((a[c>>2]|0)!=(c|0))break}x(d,b);if(0<(a[b>>
2]|0)){c=-1;break a}c=a[d+224>>2]|0;break a}while(0);a[b>>2]=27}c=-1}while(0);return c|0}function ad(d,b,c,e){b|=0;c|=0;!(e|=0)||0>(c|0)|0<(a[e>>2]|0)||((c|0)<(b|0)?(r[(d|0)+(c<<1)>>1]=0,-124==(a[e>>2]|0)&&(a[e>>2]=0)):a[e>>2]=(c|0)==(b|0)?-124:15);return c|0}function bd(a,b,c,e){a|=0;c|=0;var d,f;b=(b|0)-(e|0)+-1|0;if((b|0)>(c|0)){f=b;do b=a+(c<<1)|0,e=r[b>>1]|0,d=a+(f<<1)|0,r[b>>1]=r[d>>1]|0,r[d>>1]=e,c=c+1|0,f=f+-1|0;while((c|0)<(f|0))}}function nc(a){a|=0;return Wb(a,r[43702+((55296>a>>>0?((H[43702+
(a>>5<<1)>>1]|0)<<2)+(a&31)|0:65536>a>>>0?((H[43702+((56320>(a|0)?320:0)+(a>>5)<<1)>>1]|0)<<2)+(a&31)|0:1114111<a>>>0?3624:((H[43702+((H[43702+((a>>11)+2080<<1)>>1]|0)+(a>>>5&63)<<1)>>1]|0)<<2)+(a&31)|0)<<1)>>1]|0)|0}function Wb(d,b){d|=0;var c,f,e,g;f=(b|0)<<16>>16>>13;a:do if(-4==(f|0)){for(g=0;;){if(26<=(g|0)){c=d;break a}c=a[424+(g<<2)>>2]|0;e=c&2097151;if((e|0)==(d|0))break;if((e|0)>(d|0)){c=d;break a}else g=g+1|0}c=a[424+(c>>>21<<2)>>2]&2097151}else c=f+d|0;while(0);return c|0}function Dd(a){a|=
0;var d;d=a&65535;if(178>(a+-1570&65535))return a=r[1786+(d+-1570<<1)>>1]|0,a|0;if(8205==a<<16>>16)return 3;if(3>(a+-8301&65535))return 4;if(275>(a+1200&65535))return a=Q[67877+(d+-64336)>>0]|0,a|0;if(141<=(a+400&65535))return 0;a=Q[68152+(d+-65136)>>0]|0;return a|0}function oc(a){a|=0;return(H[2142+((55296>a>>>0?((H[2142+(a>>5<<1)>>1]|0)<<2)+(a&31)|0:65536>a>>>0?((H[2142+((56320>(a|0)?320:0)+(a>>5)<<1)>>1]|0)<<2)+(a&31)|0:1114111<a>>>0?4536:((H[2142+((H[2142+((a>>11)+2080<<1)>>1]|0)+(a>>>5&63)<<
1)>>1]|0)<<2)+(a&31)|0)<<1)>>1]|0)&31|0}function sg(d,b){d|=0;b|=0;var c,f=0,e=0;(c=a[d+356>>2]|0)?(c=Dc[c&0](a[d+360>>2]|0,b)|0,23==(c|0)?e=3:f=c):e=3;3==(e|0)&&(f=a[d+4>>2]|0,f|=0,e=b|0,55296>e>>>0?e=((H[(a[f+20>>2]|0)+(e>>5<<1)>>1]|0)<<2)+(e&31)|0:65536>e>>>0?e=((H[(a[f+20>>2]|0)+((56320>(e|0)?320:0)+(e>>5)<<1)>>1]|0)<<2)+(e&31)|0:1114111<e>>>0?e=(a[f+32>>2]|0)+128|0:(a[f+52>>2]|0)>(e|0)?(c=a[f+20>>2]|0,e=((H[c+((H[c+((e>>11)+2080<<1)>>1]|0)+(e>>>5&63)<<1)>>1]|0)<<2)+(e&31)|0):e=a[f+56>>2]|0,f=
(H[(a[f+20>>2]|0)+(e<<1)>>1]|0)&31|0);return(22<f>>>0?10:f)|0}function me(a){a|=0;var d=0,b=0;a&2154498?b=3:0==(a&32|0)|0==(a&8249304|0)?d=0:b=3;3==(b|0)&&(d=0==(a&26220581|0)?1:2);return d|0}function Nc(a,b){a|=0;b|=0;var d;256==(a|0)?d=he(b)|0:b?d=Lb(a,b)|0:(n(a),d=256);return d|0}function Bc(){var d;d=A;A=A+16|0;a[d>>2]=0;var b;b=d|0;var c;if(b)if(0<(a[b>>2]|0))b=0;else if(c=he(364)|0)if(Cd(c|0,0,364)|0,a[c+4>>2]=280,e[c+72>>0]=1,e[c+73>>0]=1,1>(a[b>>2]|0))b=c;else{if(b=c|0)a[b>>2]=0,(c=a[b+48>>
2]|0)&&md(c),(c=a[b+52>>2]|0)&&md(c),(c=a[b+56>>2]|0)&&md(c),(c=a[b+60>>2]|0)&&md(c),(c=a[b+64>>2]|0)&&md(c),(c=a[b+68>>2]|0)&&md(c),(c=a[b+348>>2]|0)&&md(c),md(b);b=0}else a[b>>2]=7,b=0;else b=0;A=d;return b|0}function ne(){var d;a[152]|0?(d=(uc()|0)+60|0,d=a[d>>2]|0):d=652;return d|0}function rc(a,b,c,e,g,h){Mc(3)}function he(a){a|=0;return(a?k(a)|0:256)|0}function $b(a,b,c,e,g){Mc(0)}function md(a){a|=0;256!=(a|0)&&n(a)}function Kb(a,b,c,e){Mc(5)}function le(a){Mc(1)}"use asm";var mc=b.Int8Array,
pc=b.Int16Array,Oc=b.Int32Array,Yb=b.Uint8Array,sc=b.Uint16Array,Td=b.Uint32Array,Cc=b.Float32Array,Jb=b.Float64Array,e=new mc(g),r=new pc(g),a=new Oc(g),Q=new Yb(g),H=new sc(g);new Td(g);new Cc(g);new Jb(g);var vh=b.byteLength,A=c.STACKTOP|0,Fd=0,tc=0,Mc=c.abort,uc=c._pthread_self,m=c._abort,ke=c._sbrk,zf=c._time,Gd=c._emscripten_memcpy_big,Af=c._sysconf,yf=[$b,function(b,c,g,h,q){b|=0;c|=0;g|=0;h|=0;do if((b|0)==(a[c+8>>2]|0))(a[c+4>>2]|0)==(g|0)&&(q=c+28|0,1!=(a[q>>2]|0)&&(a[q>>2]=h));else if((b|
0)==(a[c>>2]|0)){if((a[c+16>>2]|0)!=(g|0)&&(q=c+20|0,(a[q>>2]|0)!=(g|0))){a[c+32>>2]=h;a[q>>2]=g;b=c+40|0;a[b>>2]=(a[b>>2]|0)+1;1==(a[c+36>>2]|0)&&2==(a[c+24>>2]|0)&&(e[c+54>>0]=1);a[c+44>>2]=4;break}1==(h|0)&&(a[c+32>>2]=1)}while(0)},function(b,c,g,h,q){b|=0;c|=0;g|=0;h|=0;q|=0;var d,f,p,k=0,l=0;a:do if((b|0)==(a[c+8>>2]|0))(a[c+4>>2]|0)==(g|0)&&(d=c+28|0,1!=(a[d>>2]|0)&&(a[d>>2]=h));else if((b|0)!=(a[c>>2]|0))d=a[b+8>>2]|0,yf[a[(a[d>>2]|0)+24>>2]&3](d,c,g,h,q);else{if((a[c+16>>2]|0)!=(g|0)&&(d=
c+20|0,(a[d>>2]|0)!=(g|0))){a[c+32>>2]=h;h=c+44|0;if(4==(a[h>>2]|0))break;f=c+52|0;e[f>>0]=0;p=c+53|0;e[p>>0]=0;b=a[b+8>>2]|0;Ed[a[(a[b>>2]|0)+20>>2]&3](b,c,g,g,1,q);e[p>>0]|0?e[f>>0]|0||(k=1,l=13):(k=0,l=13);do if(13==(l|0)){a[d>>2]=g;q=c+40|0;a[q>>2]=(a[q>>2]|0)+1;if(1==(a[c+36>>2]|0))if(2==(a[c+24>>2]|0)){if(e[c+54>>0]=1,k)break}else l=16;else l=16;if(16!=(l|0)||!k){a[h>>2]=4;break a}}while(0);a[h>>2]=3;break}1==(h|0)&&(a[c+32>>2]=1)}while(0)},$b],Hd=[le,function(a){},function(a){n(a|0)},function(a){},
function(a){},function(a){n(a|0)},le,le],vc=[function(a,b,c){Mc(2);return 0},function(b,c,e){b|=0;c|=0;e|=0;var d,f,g;f=A;A=A+64|0;if((b|0)==(c|0))b=1;else if(c)if(c=aa(c,32)|0){d=f;g=d+56|0;do a[d>>2]=0,d=d+4|0;while((d|0)<(g|0));a[f>>2]=c;a[f+8>>2]=b;a[f+12>>2]=-1;a[f+48>>2]=1;ti[a[(a[c>>2]|0)+28>>2]&3](c,f,a[e>>2]|0,1);1==(a[f+24>>2]|0)?(a[e>>2]=a[f+16>>2],b=1):b=0}else b=0;else b=0;A=f;return b|0}],Ed=[rc,function(b,c,e,g,h,k){c|=0;(b|0)==(a[c+8>>2]|0)&&xb(c,e|0,g|0,h|0)},function(b,c,e,g,h,k){b|=
0;c|=0;e|=0;g|=0;h|=0;k|=0;(b|0)==(a[c+8>>2]|0)?xb(c,e,g,h):(b=a[b+8>>2]|0,Ed[a[(a[b>>2]|0)+20>>2]&3](b,c,e,g,h,k))},rc],Dc=[function(a,b){Mc(4);return 0}],ti=[Kb,function(b,c,e,g){c|=0;(b|0)==(a[c+8>>2]|0)&&Ac(c,e|0,g|0)},function(b,c,e,g){b|=0;c|=0;e|=0;g|=0;(b|0)==(a[c+8>>2]|0)?Ac(c,e,g):(b=a[b+8>>2]|0,ti[a[(a[b>>2]|0)+28>>2]&3](b,c,e,g))},Kb];return{_bidi_getParagraphEndIndex:function(b){var c,d;d=A;A=A+16|0;c=d+4|0;a[c>>2]=0;a[d>>2]=0;ac(a[24]|0,b|0,d,c);A=d;return(0<(a[c>>2]|0)?0:a[d>>2]|0)|
0},___cxa_can_catch:function(b,c,e){b|=0;e|=0;var d;d=A;A=A+16|0;a[d>>2]=a[e>>2];(b=vc[a[(a[b>>2]|0)+16>>2]&1](b,c|0,d)|0)&&(a[e>>2]=a[d>>2]);A=d;return b&1|0},_free:n,___cxa_is_pointer_type:function(a){a|=0;return(a?0!=(aa(a,64)|0):0)&1|0},_memset:Cd,_malloc:k,_memcpy:ld,_bidi_getLine:function(b,c){b|=0;c|=0;var d,f,g,h;h=A;A=A+16|0;a[h>>2]=0;d=a[25]|0;d||(d=Bc()|0,a[25]=d);f=a[24]|0;var m,n,v;f|=0;g=b|0;m=c|0;n=d|0;v=h|0;var l,x,C,w;C=0;var z,E,K,R=0,P=0,y,B,S,W,F=S=0;do if(v&&0>=(a[v>>2]|0))if(f&&
(a[f>>2]|0)==(f|0))if(-1<(g|0)&(m|0)>(g|0))if(0<=(m|0)&&(a[f+16>>2]|0)>=(m|0))if(n)if(z=qc(f,g,v)|0,l=m+-1|0,(z|0)!=(qc(f,l,v)|0))a[v>>2]=1;else{a[n>>2]=0;x=f+8|0;a[n+8>>2]=(a[x>>2]|0)+(g<<1);z=m-g|0;a[n+16>>2]=z;a[n+12>>2]=z;E=n+20|0;a[E>>2]=z;e[f+98>>0]|0?(K=a[f+140>>2]|0,(a[K>>2]|0)>(g|0)?F=17:(P=a[f+136>>2]|0,R=Ja(P,K,g)|0)):F=17;17==(F|0)&&(R=e[f+97>>0]|0,P=a[f+136>>2]|0);K=n+97|0;e[K>>0]=R;a[n+136>>2]=P;a[n+228>>2]=0;a[n+124>>2]=0;a[n+88>>2]=a[f+88>>2];a[n+92>>2]=a[f+92>>2];y=n+352|0;a[y>>2]=
0;if(0<(a[f+352>>2]|0)){x=a[x>>2]|0;W=0;for(w=g;;){B=H[x+(w<<1)>>1]|0;if(8204==(B&65532|0))F=23;else switch(B|0){case 8234:case 8235:case 8236:case 8237:case 8238:case 8294:case 8295:case 8296:case 8297:F=23;break;default:S=W}23==(F|0)&&(F=0,S=W+1|0,a[y>>2]=S);w=w+1|0;if((w|0)==(m|0))break;else W=S}a[E>>2]=z-S}x=a[f+76>>2]|0;a[n+76>>2]=x+g;E=a[f+80>>2]|0;y=E+g|0;a[n+80>>2]=y;a[n+224>>2]=-1;w=a[f+120>>2]|0;a:do if(2==(w|0)){if(7==(e[x+l>>0]|0))l=n+132|0,x=a[l>>2]=z;else{for(w=z;;){if(0>=(w|0)){x=w;
break}l=w+-1|0;if(1<<Q[x+(l+g)>>0]&8248192)w=l;else{x=w;break}}for(;!(0>=(x|0));)if(l=x+-1|0,(e[E+(l+g)>>0]|0)==R<<24>>24)x=l;else break;l=n+132|0;a[l>>2]=x}do if(x){w=Q[y>>0]&1;do if((x|0)<(z|0))if((R&1|0)==(w|0))B=1;else{a[n+120>>2]=2;break a}else B=1;while(0);for(;;){if((B|0)==(x|0)){F=45;break}if((Q[E+(B+g)>>0]&1|0)==(w|0))B=B+1|0;else{F=47;break}}if(45==(F|0))C=a[n+120>>2]=w;else if(47==(F|0)){a[n+120>>2]=2;break a}}else C=R&1,a[n+120>>2]=C;while(0);switch(C|0){case 0:e[K>>0]=(R&255)+1&254;a[l>>
2]=0;break a;case 1:e[K>>0]=R&255|1;a[l>>2]=0;break a;default:break a}}else a[n+120>>2]=w,B=a[f+132>>2]|0,a[n+132>>2]=(B|0)<=(g|0)?0:(B|0)<(m|0)?B-g:z;while(0);a[n>>2]=f}else a[v>>2]=1;else a[v>>2]=1;else a[v>>2]=1;else a[v>>2]=27;while(0);if(0<(a[h>>2]|0))d=0;else{d|=0;do if(d){f=a[d>>2]|0;if((f|0)!=(d|0)){if(!f){f=0;break}if((a[f>>2]|0)!=(f|0)){f=0;break}}f=a[d+16>>2]|0}else f=0;while(0);f|=0;g=f+1|0;d=k(g<<1)|0;t(a[25]|0,d,g,10,h)|0;0<(a[h>>2]|0)?d=0:r[d+(f<<1)>>1]=0}A=h;return d|0},_ushape_arabic:function(b,
c){b|=0;c|=0;var d,f,e,g;g=A;A=A+16|0;a[g>>2]=0;d=W(b,c,0,0,g)|0;f=d+1|0;a[g>>2]=0;e=k(f<<1)|0;W(b,c,e,f,g)|0;0<(a[g>>2]|0)?(n(e),d=0):(r[e+(d<<1)>>1]=0,d=e);A=g;return d|0},_bidi_processText:function(b,c){b|=0;c|=0;var d,f;f=A;A=A+16|0;d=a[24]|0;d||(d=Bc()|0,a[24]=d);a[f>>2]=0;h(d,b,c,-2,f);if(0<(a[f>>2]|0))d=0;else{d=a[24]|0;d|=0;var e;do if(d){e=a[d>>2]|0;if((e|0)!=(d|0)){if(!e){e=0;break}if((a[e>>2]|0)!=(e|0)){e=0;break}}e=a[d+136>>2]|0}else e=0;while(0);d=e|0}A=f;return d|0},runPostSets:function(){},
_emscripten_replace_memory:function(b){if(vh(b)&16777215||16777215>=vh(b)||2147483648<vh(b))return!1;e=new mc(b);r=new pc(b);a=new Oc(b);Q=new Yb(b);H=new sc(b);new Td(b);new Cc(b);new Jb(b);g=b;return!0},stackAlloc:function(a){var b;b=A;A=A+(a|0)|0;A=A+15&-16;return b|0},stackSave:function(){return A|0},stackRestore:function(a){A=a|0},establishStackSpace:function(a,b){A=a|0},setThrew:function(a,b){Fd||(Fd=a|0)},setTempRet0:function(a){tc=a|0},getTempRet0:function(){return tc|0},dynCall_viiiii:function(a,
b,c,e,g,h){yf[(a|0)&3](b|0,c|0,e|0,g|0,h|0)},dynCall_vi:function(a,b){Hd[(a|0)&7](b|0)},dynCall_iiii:function(a,b,c,e){return vc[(a|0)&1](b|0,c|0,e|0)|0},dynCall_viiiiii:function(a,b,c,e,g,h,k){Ed[(a|0)&3](b|0,c|0,e|0,g|0,h|0,k|0)},dynCall_iii:function(a,b,c){return Dc[(a|0)&0](b|0,c|0)|0},dynCall_viiii:function(a,b,c,e,g){ti[(a|0)&3](b|0,c|0,e|0,g|0)}}}(c.asmGlobalArg,c.asmLibraryArg,z);c._bidi_getParagraphEndIndex=E._bidi_getParagraphEndIndex;c.___cxa_can_catch=E.___cxa_can_catch;var me=c._free=
E._free;c.runPostSets=E.runPostSets;c.___cxa_is_pointer_type=E.___cxa_is_pointer_type;c._bidi_getLine=E._bidi_getLine;var Oi=c._memset=E._memset,nc=c._malloc=E._malloc,Pi=c._memcpy=E._memcpy;c._ushape_arabic=E._ushape_arabic;var Ki=c._emscripten_replace_memory=E._emscripten_replace_memory;c._bidi_processText=E._bidi_processText;c.dynCall_viiiii=E.dynCall_viiiii;c.dynCall_vi=E.dynCall_vi;c.dynCall_iiii=E.dynCall_iiii;c.dynCall_viiiiii=E.dynCall_viiiiii;c.dynCall_iii=E.dynCall_iii;c.dynCall_viiii=E.dynCall_viiii;
k.stackAlloc=E.stackAlloc;k.stackSave=E.stackSave;k.stackRestore=E.stackRestore;k.establishStackSpace=E.establishStackSpace;k.setTempRet0=E.setTempRet0;k.getTempRet0=E.getTempRet0;Zb.prototype=Error();Zb.prototype.constructor=Zb;var Mi,Jb=null;c.callMain=c.callMain=function(b){function h(){for(var b=0;3>b;b++)k.push(0)}b=b||[];Sd||(Sd=!0,qc($b));var g=b.length+1,k=[aa(rc(c.thisProgram),"i8",0)];h();for(var C=0;C<g-1;C+=1)k.push(aa(rc(b[C]),"i8",0)),h();k.push(0);k=aa(k,"i32",0);try{var n=c._main(g,
k,0);uc(n,!0)}catch(t){if(!(t instanceof Zb))if("SimulateInfiniteLoop"==t)c.noExitRuntime=!0;else throw t&&"object"===typeof t&&t.stack&&c.printErr("exception thrown: "+[t,t.stack]),t;}finally{}};c.run=c.run=sc;c.exit=c.exit=uc;var Gd=[];c.abort=c.abort=xb;if(c.preInit)for("function"==typeof c.preInit&&(c.preInit=[c.preInit]);0<c.preInit.length;)c.preInit.pop()();var Td=!0;c.noInitialRun&&(Td=!1);c.noExitRuntime=!0;sc();"use strict";self.registerRTLTextPlugin({applyArabicShaping:function(b){if(!b)return b;
var h=2*(b.length+1),g=c._malloc(h);c.stringToUTF16(b,g,h);h=c.ccall("ushape_arabic","number",["number","number"],[g,b.length]);c._free(g);if(0===h)return b;b=c.UTF16ToString(h);c._free(h);return b},processBidirectionalText:function(b,h){if(!b)return[b];var g=2*(b.length+1),k=c._malloc(g);c.stringToUTF16(b,k,g);var C=c.ccall("bidi_processText","number",["number","number"],[k,b.length]);if(0===C)return c._free(k),[b];for(var g=[],n=0;n<C;n++){for(var t=c.ccall("bidi_getParagraphEndIndex","number",
["number"],[n]),z=0,E=h;z<E.length;z+=1){var x=E[z];x<t&&(!g[g.length-1]||x>g[g.length-1])&&g.push(x)}g.push(t)}for(C=0;C<h.length;C+=1)n=h[C],n>g[g.length-1]&&g.push(n);z=0;C=[];for(n=0;n<g.length;n+=1){t=g[n];z=c.ccall("bidi_getLine","number",["number","number"],[z,t]);if(0===z)return c._free(k),[];C.push(c.UTF16ToString(z));c._free(z);z=t}c._free(k);return C}})})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -5,21 +5,22 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{name}} - TileServer GL</title>
{{#is_vector}}
<link rel="stylesheet" type="text/css" href="/mapbox-gl.css{{&key_query}}" />
<script src="/mapbox-gl.js{{&key_query}}"></script>
<link rel="stylesheet" type="text/css" href="{{public_url}}mapbox-gl.css{{&key_query}}" />
<link rel="stylesheet" type="text/css" href="{{public_url}}mapbox-gl-inspect.css{{&key_query}}" />
<script src="{{public_url}}mapbox-gl.js{{&key_query}}"></script>
<script src="{{public_url}}mapbox-gl-inspect.min.js{{&key_query}}"></script>
<style>
body {background:#000;color:#ccc;}
body {background:#fff;color:#333;font-family:Arial, sans-serif;}
#map {position:absolute;top:0;left:0;right:250px;bottom:0;}
h1 {position:absolute;top:5px;right:0;width:240px;margin:0;line-height:20px;font-size:20px;}
#layerList {position:absolute;top:35px;right:0;bottom:60%;width:240px;overflow:auto;}
#layerList {position:absolute;top:35px;right:0;bottom:0;width:240px;overflow:auto;}
#layerList div div {width:15px;height:15px;display:inline-block;}
#propertyList {position:absolute;top:40%;bottom:0;right:0;width:240px;overflow:auto;color:#fff;}
</style>
{{/is_vector}}
{{^is_vector}}
<link rel="stylesheet" type="text/css" href="/mapbox.css{{&key_query}}" />
<script src="/mapbox.js{{&key_query}}"></script>
<script src="/leaflet-hash.js{{&key_query}}"></script>
<link rel="stylesheet" type="text/css" href="{{public_url}}mapbox.css{{&key_query}}" />
<script src="{{public_url}}mapbox.js{{&key_query}}"></script>
<script src="{{public_url}}leaflet-hash.js{{&key_query}}"></script>
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:100%; }
@@ -35,87 +36,37 @@
<script>
var map = new mapboxgl.Map({
container: 'map',
hash: true
});
map.addControl(new mapboxgl.Navigation());
function generateColor(str) {
var rgb = [0, 0, 0];
for (var i = 0; i < str.length; i++) {
var v = str.charCodeAt(i);
rgb[v % 3] = (rgb[i % 3] + (13*(v%13))) % 12;
}
var r = 4 + rgb[0];
var g = 4 + rgb[1];
var b = 4 + rgb[2];
r = (r * 16) + r;
g = (g * 16) + g;
b = (b * 16) + b;
return [r, g, b, 1];
};
function initLayer(data) {
var layer;
var layerList = document.getElementById('layerList');
var layers_ = [];
data['vector_layers'].forEach(function(el) {
var color = generateColor(el['id']);
var colorText = 'rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',' + color[3] + ')';
layers_.push({
id: el['id'] + Math.random(),
source: 'vector_layer_',
'source-layer': el['id'],
interactive: true,
type: 'line',
paint: {'line-color': colorText}
});
var item = document.createElement('div');
item.innerHTML = '<div style="' +
'background:rgba(' + color[0] + ',' + color[1] + ',' + color[2] + ',1);' +
'"></div> ' + el['id'];
layerList.appendChild(item);
});
map.setStyle({
hash: true,
style: {
version: 8,
sources: {
'vector_layer_': {
type: 'vector',
tiles: data['tiles'],
minzoom: data['minzoom'],
maxzoom: data['maxzoom']
url: '{{public_url}}data/{{id}}.json{{&key_query}}'
}
},
layers: layers_
layers: []
}
});
return layer;
}
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
initLayer(xhttp.response);
}
};
xhttp.responseType = 'json';
xhttp.open('GET', '/data/{{id}}.json{{&key_query}}', true);
xhttp.send();
var propertyList = document.getElementById('propertyList');
map.on('mousemove', function(e) {
propertyList.innerHTML = '';
var width = 3, height = 3;
var features = map.queryRenderedFeatures([
[e.point.x - width / 2, e.point.y - height / 2],
[e.point.x + width / 2, e.point.y + height / 2]
]);
if (features) {
var html = '';
features.forEach(function(feature) {
html += JSON.stringify(feature.properties, null, 2) + '\n';
map.addControl(new mapboxgl.NavigationControl());
var inspect = new MapboxInspect({
showInspectMap: true,
showInspectButton: false
});
propertyList.innerHTML = html;
}
map.addControl(inspect);
map.on('styledata', function() {
var layerList = document.getElementById('layerList');
layerList.innerHTML = '';
Object.keys(inspect.sources).forEach(function(sourceId) {
var layerIds = inspect.sources[sourceId];
layerIds.forEach(function(layerId) {
var item = document.createElement('div');
item.innerHTML = '<div style="' +
'background:' + inspect.assignLayerColor(layerId) + ';' +
'"></div> ' + layerId;
layerList.appendChild(item);
});
})
});
</script>
{{/is_vector}}
@@ -123,7 +74,11 @@
<h1 style="display:none;">{{name}}</h1>
<div id='map'></div>
<script>
var map = L.mapbox.map('map', '/data/{{id}}.json{{&key_query}}', { zoomControl: false });
var map = L.mapbox.map('map', '{{public_url}}data/{{id}}.json{{&key_query}}', { zoomControl: false });
map.eachLayer(function(layer) {
// do not add scale prefix even if retina display is detected
layer.scalePrefix = '.';
});
new L.Control.Zoom({ position: 'topright' }).addTo(map);
setTimeout(function() {
new L.Hash(map);

View File

@@ -3,85 +3,110 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>TileServerGL</title>
<link rel="stylesheet" type="text/css" href="/index.css{{&key_query}}" />
<title>TileServer GL - Server for vector and raster maps with GL styles</title>
<link rel="stylesheet" type="text/css" href="{{public_url}}index.css{{&key_query}}" />
<script>
function toggle_xyz(id) {
var el = document.getElementById(id);
var s = el.style;
s.display = s.display == 'none' ? 'inline-block' : 'none';
el.setSelectionRange(0, el.value.length);
return false;
}
</script>
</head>
<body>
<section>
<h1 class="title"><img src="/images/logo.png" alt="TileServerGL" /></h1>
<h2 class="subtitle">Map Layers for web and mobile applications.</h2>
<h1 class="title {{#if is_light}}light{{/if}}"><img src="{{public_url}}images/logo.png" alt="TileServer GL" /></h1>
<h2 class="subtitle">Vector {{#if is_light}}<s>and raster</s>{{else}}and raster{{/if}} maps with GL styles</h2>
{{#if styles}}
<h2 class="box-header">Styles</h2>
<div class="box">
{{#each styles}}
<div class="item">
{{#if thumbnail}}
<img src="/styles/{{@key}}/rendered/{{thumbnail}}{{&../key_query}}" alt="{{name}} preview" />
<img src="{{public_url}}styles/{{@key}}/{{thumbnail}}{{&../key_query}}" alt="{{name}} preview" />
{{else}}
<img src="/images/placeholder.png" alt="{{name}} preview" />
<img src="{{public_url}}images/placeholder.png" alt="{{name}} preview" />
{{/if}}
<div class="details">
<h3>{{name}}</h3>
<p class="identifier">identifier: {{@key}}</p>
<p class="services">
{{#if serving_rendered}}
services: <a href="/styles/{{@key}}/rendered.json{{&../key_query}}">TileJSON</a>
{{#if wmts_link}}
| <a href="{{&wmts_link}}">WMTS</a>
services:
{{#if serving_data}}
<a href="{{public_url}}styles/{{@key}}/style.json{{&../key_query}}">GL Style</a>
{{/if}}
{{#if serving_rendered}}
{{#if serving_data}}| {{/if}}<a href="{{public_url}}styles/{{@key}}.json{{&../key_query}}">TileJSON</a>
{{/if}}
{{#if serving_rendered}}
| <a href="/styles/{{@key}}/wmts.xml{{&../key_query}}">WMTS</a>
{{/if}}
{{#if xyz_link}}
| <a href="#" onclick="return toggle_xyz('xyz_style_{{@key}}');">XYZ</a>
<input id="xyz_style_{{@key}}" type="text" value="{{&xyz_link}}" style="display:none;" />
{{/if}}
</p>
</div>
<div class="viewers">
{{#if serving_data}}
{{#if serving_rendered}}
<a class="btn" href="/styles/{{@key}}/{{&../key_query}}{{viewer_hash}}">Viewer</a>
<a class="btn" href="{{public_url}}styles/{{@key}}/{{&../key_query}}{{viewer_hash}}">Viewer</a>
{{/if}}
{{/if}}
{{#if serving_rendered}}
<a class="btn" href="/styles/{{@key}}/?{{&../key_query_part}}raster{{viewer_hash}}">Raster</a>
<a class="btn" href="{{public_url}}styles/{{@key}}/?{{&../key_query_part}}raster{{viewer_hash}}">Raster</a>
{{/if}}
{{#if serving_data}}
<a class="btn" href="/styles/{{@key}}/?{{&../key_query_part}}vector{{viewer_hash}}">Vector</a>
<a class="btn" href="{{public_url}}styles/{{@key}}/?{{&../key_query_part}}vector{{viewer_hash}}">Vector</a>
{{/if}}
</div>
</div>
{{/each}}
</div>
{{/if}}
{{#if data}}
<h2 class="box-header">Data</h2>
<div class="box">
{{#each data}}
<div class="item">
{{#if thumbnail}}
<img src="/data/{{@key}}/{{thumbnail}}{{&../key_query}}" alt="{{name}} preview" />
<img src="{{public_url}}data/{{@key}}/{{thumbnail}}{{&../key_query}}" alt="{{name}} preview" />
{{else}}
<img src="/images/placeholder.png" alt="{{name}} preview" />
<img src="{{public_url}}images/placeholder.png" alt="{{name}} preview" />
{{/if}}
<div class="details">
<h3>{{name}}</h3>
<p class="identifier">identifier: {{@key}}{{#if formatted_filesize}} | size: {{formatted_filesize}}{{/if}} | type: {{#is_vector}}vector{{/is_vector}}{{^is_vector}}raster{{/is_vector}} data</p>
<p class="services">
services: <a href="/data/{{@key}}.json{{&../key_query}}">TileJSON</a>
services: <a href="{{public_url}}data/{{@key}}.json{{&../key_query}}">TileJSON</a>
{{#if wmts_link}}
| <a href="{{&wmts_link}}">WMTS</a>
{{/if}}
{{#if xyz_link}}
| <a href="#" onclick="return toggle_xyz('xyz_data_{{@key}}');">XYZ</a>
<input id="xyz_data_{{@key}}" type="text" value="{{&xyz_link}}" style="display:none;" />
{{/if}}
</p>
</div>
<div class="viewers">
{{#is_vector}}
<a class="btn" href="/data/{{@key}}/{{&../key_query}}{{viewer_hash}}">X-Ray view</a>
<a class="btn" href="{{public_url}}data/{{@key}}/{{&../key_query}}{{viewer_hash}}">Inspect</a>
{{/is_vector}}
{{^is_vector}}
<a class="btn" href="/data/{{@key}}/{{&../key_query}}{{viewer_hash}}">Raster view</a>
<a class="btn" href="{{public_url}}data/{{@key}}/{{&../key_query}}{{viewer_hash}}">View</a>
{{/is_vector}}
</div>
</div>
{{/each}}
</div>
{{/if}}
</section>
<footer>
<a href="https://www.klokantech.com/" target="_blank"><img src="/images/klokantech.png" /></a>
<a href="https://www.klokantech.com/" target="_blank"><img src="{{public_url}}images/klokantech.png" /></a>
<p>
<a href="https://github.com/klokantech/tileserver-gl" target="_blank">Powered by TileServer-GL v{{server_version}}</a> <a href="https://www.klokantech.com/" target="_blank">open-source project from Klokan Technologies GmbH.</a>
<a href="https://github.com/klokantech/tileserver-gl" target="_blank">Powered by TileServer GL ({{server_version}})</a> <a href="https://www.klokantech.com/" target="_blank">an open-source project from Klokan Technologies GmbH.</a> <img src="https://t.klokantech.com/8073932/19" class="t" />
</p>
</footer>
</body>

View File

@@ -4,11 +4,11 @@
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{{name}} - TileServer GL</title>
<link rel="stylesheet" type="text/css" href="/mapbox-gl.css{{&key_query}}" />
<script src="/mapbox-gl.js{{&key_query}}"></script>
<link rel="stylesheet" type="text/css" href="/mapbox.css{{&key_query}}" />
<script src="/mapbox.js{{&key_query}}"></script>
<script src="/leaflet-hash.js{{&key_query}}"></script>
<link rel="stylesheet" type="text/css" href="{{public_url}}mapbox-gl.css{{&key_query}}" />
<script src="{{public_url}}mapbox-gl.js{{&key_query}}"></script>
<link rel="stylesheet" type="text/css" href="{{public_url}}mapbox.css{{&key_query}}" />
<script src="{{public_url}}mapbox.js{{&key_query}}"></script>
<script src="{{public_url}}leaflet-hash.js{{&key_query}}"></script>
<style>
body { margin:0; padding:0; }
#map { position:absolute; top:0; bottom:0; width:100%; }
@@ -24,14 +24,15 @@
(q.indexOf('raster') >= 0 ? 'raster' :
(mapboxgl.supported() ? 'vector' : 'raster'));
if (preference == 'vector') {
mapboxgl.setRTLTextPlugin('{{public_url}}mapbox-gl-rtl-text.js{{&key_query}}');
var map = new mapboxgl.Map({
container: 'map',
style: '/styles/{{id}}.json{{&key_query}}',
style: '{{public_url}}styles/{{id}}/style.json{{&key_query}}',
hash: true
});
map.addControl(new mapboxgl.Navigation());
map.addControl(new mapboxgl.NavigationControl());
} else {
var map = L.mapbox.map('map', '/styles/{{id}}/rendered.json{{&key_query}}', { zoomControl: false });
var map = L.mapbox.map('map', '{{public_url}}styles/{{id}}.json{{&key_query}}', { zoomControl: false });
new L.Control.Zoom({ position: 'topright' }).addTo(map);
setTimeout(function() {
new L.Hash(map);

407
public/templates/wmts.tmpl Normal file
View File

@@ -0,0 +1,407 @@
<?xml version="1.0" encoding="UTF-8" ?>
<Capabilities xmlns="http://www.opengis.net/wmts/1.0" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:gml="http://www.opengis.net/gml" xsi:schemaLocation="http://www.opengis.net/wmts/1.0 http://schemas.opengis.net/wmts/1.0/wmtsGetCapabilities_response.xsd" version="1.0.0">
<!-- Service Identification -->
<ows:ServiceIdentification>
<ows:Title>TileServer GL</ows:Title>
<ows:ServiceType>OGC WMTS</ows:ServiceType>
<ows:ServiceTypeVersion>1.0.0</ows:ServiceTypeVersion>
</ows:ServiceIdentification>
<!-- Operations Metadata -->
<ows:OperationsMetadata>
<ows:Operation name="GetCapabilities">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:href="{{baseUrl}}/wmts/{{id}}/">
<ows:Constraint name="GetEncoding">
<ows:AllowedValues>
<ows:Value>RESTful</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:Get>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
<ows:Operation name="GetTile">
<ows:DCP>
<ows:HTTP>
<ows:Get xlink:href="{{baseUrl}}/styles/">
<ows:Constraint name="GetEncoding">
<ows:AllowedValues>
<ows:Value>RESTful</ows:Value>
</ows:AllowedValues>
</ows:Constraint>
</ows:Get>
</ows:HTTP>
</ows:DCP>
</ows:Operation>
</ows:OperationsMetadata>
<Contents>
<Layer>
<ows:Title>{{name}}</ows:Title>
<ows:Identifier>{{id}}</ows:Identifier>
<ows:WGS84BoundingBox crs="urn:ogc:def:crs:OGC:2:84">
<ows:LowerCorner>-180 -85.051128779807</ows:LowerCorner>
<ows:UpperCorner>180 85.051128779807</ows:UpperCorner>
</ows:WGS84BoundingBox>
<Style isDefault="true">
<ows:Identifier>default</ows:Identifier>
</Style>
<Format>image/png</Format>
<TileMatrixSetLink>
<TileMatrixSet>GoogleMapsCompatible</TileMatrixSet>
</TileMatrixSetLink>
<ResourceURL format="image/png" resourceType="tile" template="{{baseUrl}}/styles/{{id}}/{TileMatrix}/{TileCol}/{TileRow}.png{{key_query}}"/>
</Layer><TileMatrixSet>
<ows:Title>GoogleMapsCompatible</ows:Title>
<ows:Abstract>GoogleMapsCompatible EPSG:3857</ows:Abstract>
<ows:Identifier>GoogleMapsCompatible</ows:Identifier>
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::3857</ows:SupportedCRS>
<TileMatrix>
<ows:Identifier>0</ows:Identifier>
<ScaleDenominator>559082264.02872</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>1</MatrixWidth>
<MatrixHeight>1</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>1</ows:Identifier>
<ScaleDenominator>279541132.01436</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>2</MatrixWidth>
<MatrixHeight>2</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>2</ows:Identifier>
<ScaleDenominator>139770566.00718</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4</MatrixWidth>
<MatrixHeight>4</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>3</ows:Identifier>
<ScaleDenominator>69885283.00359</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>8</MatrixWidth>
<MatrixHeight>8</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>4</ows:Identifier>
<ScaleDenominator>34942641.501795</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>16</MatrixWidth>
<MatrixHeight>16</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>5</ows:Identifier>
<ScaleDenominator>17471320.750897</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>32</MatrixWidth>
<MatrixHeight>32</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>6</ows:Identifier>
<ScaleDenominator>8735660.3754487</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>64</MatrixWidth>
<MatrixHeight>64</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>7</ows:Identifier>
<ScaleDenominator>4367830.1877244</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>128</MatrixWidth>
<MatrixHeight>128</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>8</ows:Identifier>
<ScaleDenominator>2183915.0938622</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>256</MatrixWidth>
<MatrixHeight>256</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>9</ows:Identifier>
<ScaleDenominator>1091957.5469311</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>512</MatrixWidth>
<MatrixHeight>512</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>10</ows:Identifier>
<ScaleDenominator>545978.77346554</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>1024</MatrixWidth>
<MatrixHeight>1024</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>11</ows:Identifier>
<ScaleDenominator>272989.38673277</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>2048</MatrixWidth>
<MatrixHeight>2048</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>12</ows:Identifier>
<ScaleDenominator>136494.69336639</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4096</MatrixWidth>
<MatrixHeight>4096</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>13</ows:Identifier>
<ScaleDenominator>68247.346683193</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>8192</MatrixWidth>
<MatrixHeight>8192</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>14</ows:Identifier>
<ScaleDenominator>34123.673341597</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>16384</MatrixWidth>
<MatrixHeight>16384</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>15</ows:Identifier>
<ScaleDenominator>17061.836670798</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>32768</MatrixWidth>
<MatrixHeight>32768</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>16</ows:Identifier>
<ScaleDenominator>8530.9183353991</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>65536</MatrixWidth>
<MatrixHeight>65536</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>17</ows:Identifier>
<ScaleDenominator>4265.4591676996</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>131072</MatrixWidth>
<MatrixHeight>131072</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>18</ows:Identifier>
<ScaleDenominator>2132.7295838498</ScaleDenominator>
<TopLeftCorner>-20037508.34 20037508.34</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>262144</MatrixWidth>
<MatrixHeight>262144</MatrixHeight>
</TileMatrix></TileMatrixSet><TileMatrixSet>
<ows:Title>WGS84</ows:Title>
<ows:Abstract>WGS84 EPSG:4326</ows:Abstract>
<ows:Identifier>WGS84</ows:Identifier>
<ows:SupportedCRS>urn:ogc:def:crs:EPSG::4326</ows:SupportedCRS>
<TileMatrix>
<ows:Identifier>0</ows:Identifier>
<ScaleDenominator>279541132.01436</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>2</MatrixWidth>
<MatrixHeight>1</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>1</ows:Identifier>
<ScaleDenominator>139770566.00718</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4</MatrixWidth>
<MatrixHeight>2</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>2</ows:Identifier>
<ScaleDenominator>69885283.00359</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>8</MatrixWidth>
<MatrixHeight>4</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>3</ows:Identifier>
<ScaleDenominator>34942641.501795</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>16</MatrixWidth>
<MatrixHeight>8</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>4</ows:Identifier>
<ScaleDenominator>17471320.750897</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>32</MatrixWidth>
<MatrixHeight>16</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>5</ows:Identifier>
<ScaleDenominator>8735660.3754487</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>64</MatrixWidth>
<MatrixHeight>32</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>6</ows:Identifier>
<ScaleDenominator>4367830.1877244</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>128</MatrixWidth>
<MatrixHeight>64</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>7</ows:Identifier>
<ScaleDenominator>2183915.0938622</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>256</MatrixWidth>
<MatrixHeight>128</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>8</ows:Identifier>
<ScaleDenominator>1091957.5469311</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>512</MatrixWidth>
<MatrixHeight>256</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>9</ows:Identifier>
<ScaleDenominator>545978.77346554</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>1024</MatrixWidth>
<MatrixHeight>512</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>10</ows:Identifier>
<ScaleDenominator>272989.38673277</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>2048</MatrixWidth>
<MatrixHeight>1024</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>11</ows:Identifier>
<ScaleDenominator>136494.69336639</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>4096</MatrixWidth>
<MatrixHeight>2048</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>12</ows:Identifier>
<ScaleDenominator>68247.346683193</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>8192</MatrixWidth>
<MatrixHeight>4096</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>13</ows:Identifier>
<ScaleDenominator>34123.673341597</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>16384</MatrixWidth>
<MatrixHeight>8192</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>14</ows:Identifier>
<ScaleDenominator>17061.836670798</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>32768</MatrixWidth>
<MatrixHeight>16384</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>15</ows:Identifier>
<ScaleDenominator>8530.9183353991</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>65536</MatrixWidth>
<MatrixHeight>32768</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>16</ows:Identifier>
<ScaleDenominator>4265.4591676996</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>131072</MatrixWidth>
<MatrixHeight>65536</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>17</ows:Identifier>
<ScaleDenominator>2132.7295838498</ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>262144</MatrixWidth>
<MatrixHeight>131072</MatrixHeight>
</TileMatrix>
<TileMatrix>
<ows:Identifier>18</ows:Identifier>
<ScaleDenominator></ScaleDenominator>
<TopLeftCorner>90 -180</TopLeftCorner>
<TileWidth>256</TileWidth>
<TileHeight>256</TileHeight>
<MatrixWidth>524288</MatrixWidth>
<MatrixHeight>262144</MatrixHeight>
</TileMatrix></TileMatrixSet>
</Contents>
<ServiceMetadataURL xlink:href="{{baseUrl}}/wmts/{{id}}/"/>
</Capabilities>

46
publish.js Normal file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env node
'use strict';
/*
* This script creates `tileserver-gl-light` version
* (without native dependencies) and publishes
* `tileserver-gl` and `tileserver-gl-light` to npm.
*/
/* CREATE tileserver-gl-light */
// SYNC THE `light` FOLDER
require('child_process').execSync('rsync -av --exclude="light" --exclude=".git" --exclude="node_modules" --delete . light', {
stdio: 'inherit'
});
// PATCH `package.json`
var fs = require('fs');
var packageJson = require('./package');
packageJson.name += '-light';
packageJson.description = 'Map tile server for JSON GL styles - serving vector tiles';
delete packageJson.dependencies['canvas'];
delete packageJson.dependencies['@mapbox/mapbox-gl-native'];
delete packageJson.dependencies['sharp'];
delete packageJson.optionalDependencies;
delete packageJson.devDependencies;
var str = JSON.stringify(packageJson, undefined, 2);
fs.writeFileSync('light/package.json', str);
fs.renameSync('light/README_light.md', 'light/README.md');
fs.renameSync('light/Dockerfile_light', 'light/Dockerfile');
/* PUBLISH */
// tileserver-gl
require('child_process').execSync('npm publish .', {
stdio: 'inherit'
});
// tileserver-gl-light
require('child_process').execSync('npm publish light', {
stdio: 'inherit'
});

44
run.sh
View File

@@ -1,11 +1,37 @@
#!/bin/bash
if [ ! -f /data/config.json ]; then
echo "INFO: No config.json found! Downloading sample data..."
echo "--------------------------------------------------------------------------------"
curl -L -o sample_data.zip https://github.com/klokantech/tileserver-gl-data/archive/v0.8.0.zip
unzip -q sample_data.zip -d sample_data
mv sample_data/tileserver-gl-data-*/* -t /data
rm sample_data.zip
rm -r sample_data
_term() {
echo "Caught signal, stopping gracefully"
kill -TERM "$child" 2>/dev/null
}
trap _term SIGTERM
trap _term SIGINT
xvfbMaxStartWaitTime=5
displayNumber=99
screenNumber=0
# Delete files if they were not cleaned by last run
rm -rf /tmp/.X11-unix /tmp/.X${displayNumber}-lock ~/xvfb.pid
echo "Starting Xvfb on display ${displayNumber}"
start-stop-daemon --start --pidfile ~/xvfb.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :${displayNumber} -screen ${screenNumber} 1024x768x24 -ac +extension GLX +render -noreset
# Wait to be able to connect to the port. This will exit if it cannot in 15 minutes.
timeout ${xvfbMaxStartWaitTime} bash -c "while ! xdpyinfo -display :${displayNumber} >/dev/null; do sleep 0.5; done"
if [ $? -ne 0 ]; then
echo "Could not connect to display ${displayNumber} in ${xvfbMaxStartWaitTime} seconds time."
exit 1
fi
xvfb-run -a -e /dev/stdout --server-args="-screen 0 1024x768x24" node /usr/src/app/src/main.js -p 80 -c /data/config.json
export DISPLAY=:${displayNumber}.${screenNumber}
echo
cd /data
node /usr/src/app/ -p 80 "$@" &
child=$!
wait "$child"
start-stop-daemon --stop --retry 5 --pidfile ~/xvfb.pid # stop xvfb when exiting
rm ~/xvfb.pid

View File

@@ -2,27 +2,221 @@
'use strict';
var opts = require('nomnom')
.option('config', {
abbr: 'c',
default: 'config.json',
help: 'Configuration file'
})
.option('port', {
abbr: 'p',
default: 8080,
help: 'Port'
})
.option('version', {
abbr: 'v',
flag: true,
help: 'Version info',
callback: function() {
return 'version ' + require('../package.json').version;
}
}).parse();
var fs = require('fs'),
path = require('path'),
request = require('request');
return require('./server')({
config: opts.config,
port: opts.port
var mbtiles = require('@mapbox/mbtiles');
var packageJson = require('../package');
var args = process.argv;
if (args.length >= 3 && args[2][0] != '-') {
args.splice(2, 0, '--mbtiles');
}
var opts = require('commander')
.description('tileserver-gl startup options')
.usage('tileserver-gl [mbtiles] [options]')
.option(
'--mbtiles <file>',
'MBTiles file (uses demo configuration);\n' +
'\t ignored if the configuration file is also specified'
)
.option(
'-c, --config <file>',
'Configuration file [config.json]',
'config.json'
)
.option(
'-b, --bind <address>',
'Bind address'
)
.option(
'-p, --port <port>',
'Port [8080]',
8080,
parseInt
)
.option(
'-C|--no-cors',
'Disable Cross-origin resource sharing headers'
)
.option(
'-u|--public_url',
'Enable exposing the server on subpaths, not necessarily the root of the domain'
)
.option(
'-V, --verbose',
'More verbose output'
)
.option(
'-s, --silent',
'Less verbose output'
)
.version(
packageJson.version,
'-v, --version'
)
.parse(args);
console.log('Starting ' + packageJson.name + ' v' + packageJson.version);
var startServer = function(configPath, config) {
var publicUrl = opts.public_url;
if (publicUrl && publicUrl.lastIndexOf('/') !== publicUrl.length - 1) {
publicUrl += '/';
}
return require('./server')({
configPath: configPath,
config: config,
bind: opts.bind,
port: opts.port,
cors: opts.cors,
silent: opts.silent,
publicUrl: publicUrl
});
};
var startWithMBTiles = function(mbtilesFile) {
console.log('Automatically creating config file for ' + mbtilesFile);
mbtilesFile = path.resolve(process.cwd(), mbtilesFile);
var mbtilesStats = fs.statSync(mbtilesFile);
if (!mbtilesStats.isFile() || mbtilesStats.size === 0) {
console.log('ERROR: Not valid MBTiles file: ' + mbtilesFile);
process.exit(1);
}
var instance = new mbtiles(mbtilesFile, function(err) {
instance.getInfo(function(err, info) {
if (err || !info) {
console.log('ERROR: Metadata missing in the MBTiles.');
console.log(' Make sure ' + path.basename(mbtilesFile) +
' is valid MBTiles.');
process.exit(1);
}
var bounds = info.bounds;
var styleDir = path.resolve(__dirname, "../node_modules/tileserver-gl-styles/");
var config = {
"options": {
"paths": {
"root": styleDir,
"fonts": "fonts",
"styles": "styles",
"mbtiles": path.dirname(mbtilesFile)
}
},
"styles": {},
"data": {}
};
if (info.format == 'pbf' &&
info.name.toLowerCase().indexOf('openmaptiles') > -1) {
var omtV = (info.version || '').split('.');
config['data']['v' + omtV[0]] = {
"mbtiles": path.basename(mbtilesFile)
};
var styles = fs.readdirSync(path.resolve(styleDir, 'styles'));
for (var i = 0; i < styles.length; i++) {
var styleName = styles[i];
var styleFileRel = styleName + '/style.json';
var styleFile = path.resolve(styleDir, 'styles', styleFileRel);
if (fs.existsSync(styleFile)) {
var styleJSON = require(styleFile);
var omtVersionCompatibility =
((styleJSON || {}).metadata || {})['openmaptiles:version'] || 'x';
var m = omtVersionCompatibility.toLowerCase().split('.');
var isCompatible = !(
m[0] != 'x' && (
m[0] != omtV[0] || (
(m[1] || 'x') != 'x' && (
m[1] != omtV[1] || (
(m[2] || 'x') != 'x' &&
m[2] != omtV[2]
)
)
)
)
);
if (isCompatible) {
var styleObject = {
"style": styleFileRel,
"tilejson": {
"bounds": bounds
}
};
config['styles'][styleName] = styleObject;
} else {
console.log('Style', styleName, 'requires OpenMapTiles version',
omtVersionCompatibility, 'but mbtiles is version', info.version);
}
}
}
} else {
console.log('WARN: MBTiles not in "openmaptiles" format. ' +
'Serving raw data only...');
config['data'][(info.id || 'mbtiles')
.replace(/\//g, '_')
.replace(/\:/g, '_')
.replace(/\?/g, '_')] = {
"mbtiles": path.basename(mbtilesFile)
};
}
if (opts.verbose) {
console.log(JSON.stringify(config, undefined, 2));
} else {
console.log('Run with --verbose to see the config file here.');
}
return startServer(null, config);
});
});
};
fs.stat(path.resolve(opts.config), function(err, stats) {
if (err || !stats.isFile() || stats.size === 0) {
var mbtiles = opts.mbtiles;
if (!mbtiles) {
// try to find in the cwd
var files = fs.readdirSync(process.cwd());
for (var i=0; i < files.length; i++) {
var filename = files[i];
if (filename.endsWith('.mbtiles')) {
var mbTilesStats = fs.statSync(filename);
if (mbTilesStats.isFile() && mbTilesStats.size > 0) {
mbtiles = filename;
break;
}
}
}
if (mbtiles) {
console.log('No MBTiles specified, using ' + mbtiles);
return startWithMBTiles(mbtiles);
} else {
var url = 'https://github.com/klokantech/tileserver-gl/releases/download/v1.3.0/zurich_switzerland.mbtiles';
var filename = 'zurich_switzerland.mbtiles';
var stream = fs.createWriteStream(filename);
console.log('Downloading sample data (' + filename + ') from ' + url);
stream.on('finish', function() {
return startWithMBTiles(filename);
});
return request.get(url).pipe(stream);
}
}
if (mbtiles) {
return startWithMBTiles(mbtiles);
}
} else {
console.log('Using specified config file from ' + opts.config);
return startServer(opts.config, null);
}
});

View File

@@ -1,48 +1,84 @@
'use strict';
var fs = require('fs'),
path = require('path');
path = require('path'),
zlib = require('zlib');
var clone = require('clone'),
express = require('express'),
mbtiles = require('mbtiles');
mbtiles = require('@mapbox/mbtiles'),
pbf = require('pbf'),
VectorTile = require('@mapbox/vector-tile').VectorTile;
var tileshrinkGl;
try {
tileshrinkGl = require('tileshrink-gl');
global.addStyleParam = true;
} catch (e) {}
var utils = require('./utils');
module.exports = function(options, repo, params, id) {
module.exports = function(options, repo, params, id, styles, publicUrl) {
var app = express().disable('x-powered-by');
var mbtilesFile = path.join(options.paths.mbtiles, params.mbtiles);
var mbtilesFile = path.resolve(options.paths.mbtiles, params.mbtiles);
var tileJSON = {
'tiles': params.domains || options.domains
};
var shrinkers = {};
repo[id] = tileJSON;
var source = new mbtiles(mbtilesFile, function(err) {
var mbtilesFileStats = fs.statSync(mbtilesFile);
if (!mbtilesFileStats.isFile() || mbtilesFileStats.size == 0) {
throw Error('Not valid MBTiles file: ' + mbtilesFile);
}
var source;
var sourceInfoPromise = new Promise(function(resolve, reject) {
source = new mbtiles(mbtilesFile, function(err) {
if (err) {
reject(err);
return;
}
source.getInfo(function(err, info) {
if (err) {
reject(err);
return;
}
tileJSON['name'] = id;
tileJSON['format'] = 'pbf';
Object.assign(tileJSON, info);
tileJSON['tilejson'] = '2.0.0';
tileJSON['basename'] = id;
tileJSON['filesize'] = fs.statSync(mbtilesFile)['size'];
delete tileJSON['filesize'];
delete tileJSON['mtime'];
delete tileJSON['scheme'];
Object.assign(tileJSON, params.tilejson || {});
utils.fixTileJSONCenter(tileJSON);
if (options.dataDecoratorFunc) {
tileJSON = options.dataDecoratorFunc(id, 'tilejson', tileJSON);
}
resolve();
});
});
});
var tilePattern = '/' + id + '/:z(\\d+)/:x(\\d+)/:y(\\d+).:format([\\w]+)';
var tilePattern = '/' + id + '/:z(\\d+)/:x(\\d+)/:y(\\d+).:format([\\w.]+)';
app.get(tilePattern, function(req, res, next) {
var z = req.params.z | 0,
x = req.params.x | 0,
y = req.params.y | 0;
if (req.params.format != tileJSON.format) {
var format = req.params.format;
if (format == options.pbfAlias) {
format = 'pbf';
}
if (format != tileJSON.format &&
!(format == 'geojson' && tileJSON.format == 'pbf')) {
return res.status(404).send('Invalid format');
}
if (z < tileJSON.minzoom || 0 || x < 0 || y < 0 ||
@@ -53,21 +89,86 @@ module.exports = function(options, repo, params, id) {
source.getTile(z, x, y, function(err, data, headers) {
if (err) {
if (/does not exist/.test(err.message)) {
return res.status(404).send(err.message);
return res.status(204).send(err.message);
} else {
return res.status(500).send(err.message);
}
} else {
if (tileJSON['format'] == 'pbf') {
headers['Content-Type'] = 'application/x-protobuf';
headers['Content-Encoding'] = 'gzip';
}
delete headers['ETag']; // do not trust the tile ETag -- regenerate
res.set(headers);
if (data == null) {
return res.status(404).send('Not found');
} else {
if (tileJSON['format'] == 'pbf') {
var isGzipped = data.slice(0,2).indexOf(
new Buffer([0x1f, 0x8b])) === 0;
var style = req.query.style;
if (style && tileshrinkGl) {
if (!shrinkers[style]) {
var styleJSON = styles[style];
if (styleJSON) {
var sourceName = null;
for (var sourceName_ in styleJSON.sources) {
var source = styleJSON.sources[sourceName_];
if (source &&
source.type == 'vector' &&
source.url.endsWith('/' + id + '.json')) {
sourceName = sourceName_;
}
}
shrinkers[style] = tileshrinkGl.createPBFShrinker(styleJSON, sourceName);
}
}
if (shrinkers[style]) {
if (isGzipped) {
data = zlib.unzipSync(data);
isGzipped = false;
}
data = shrinkers[style](data, z, tileJSON.maxzoom);
//console.log(shrinkers[style].getStats());
}
}
if (options.dataDecoratorFunc) {
if (isGzipped) {
data = zlib.unzipSync(data);
isGzipped = false;
}
data = options.dataDecoratorFunc(id, 'data', data, z, x, y);
}
}
if (format == 'pbf') {
headers['Content-Type'] = 'application/x-protobuf';
} else if (format == 'geojson') {
headers['Content-Type'] = 'application/json';
if (isGzipped) {
data = zlib.unzipSync(data);
isGzipped = false;
}
var tile = new VectorTile(new pbf(data));
var geojson = {
"type": "FeatureCollection",
"features": []
};
for (var layerName in tile.layers) {
var layer = tile.layers[layerName];
for (var i = 0; i < layer.length; i++) {
var feature = layer.feature(i);
var featureGeoJSON = feature.toGeoJSON(x, y, z);
featureGeoJSON.properties.layer = layerName;
geojson.features.push(featureGeoJSON);
}
}
data = JSON.stringify(geojson);
}
delete headers['ETag']; // do not trust the tile ETag -- regenerate
headers['Content-Encoding'] = 'gzip';
res.set(headers);
if (!isGzipped) {
data = zlib.gzipSync(data);
isGzipped = true;
}
return res.status(200).send(data);
}
}
@@ -77,9 +178,13 @@ module.exports = function(options, repo, params, id) {
app.get('/' + id + '.json', function(req, res, next) {
var info = clone(tileJSON);
info.tiles = utils.getTileUrls(req, info.tiles,
'data/' + id, info.format);
'data/' + id, info.format, publicUrl, {
'pbf': options.pbfAlias
});
return res.send(info);
});
return sourceInfoPromise.then(function() {
return app;
});
};

View File

@@ -1,7 +1,9 @@
'use strict';
var clone = require('clone'),
express = require('express');
express = require('express'),
fs = require('fs'),
path = require('path');
var utils = require('./utils');
@@ -12,22 +14,53 @@ module.exports = function(options, allowedFonts) {
var fontPath = options.paths.fonts;
app.get('/:fontstack/:range([\\d]+-[\\d]+).pbf',
var existingFonts = {};
var fontListingPromise = new Promise(function(resolve, reject) {
fs.readdir(options.paths.fonts, function(err, files) {
if (err) {
reject(err);
return;
}
files.forEach(function(file) {
fs.stat(path.join(fontPath, file), function(err, stats) {
if (err) {
reject(err);
return;
}
if (stats.isDirectory() &&
fs.existsSync(path.join(fontPath, file, '0-255.pbf'))) {
existingFonts[path.basename(file)] = true;
}
});
});
resolve();
});
});
app.get('/fonts/:fontstack/:range([\\d]+-[\\d]+).pbf',
function(req, res, next) {
var fontstack = decodeURI(req.params.fontstack);
var range = req.params.range;
return utils.getFontsPbf(allowedFonts, fontPath, fontstack, range,
function(err, concated) {
if (err || concated.length === 0) {
return res.status(400).send('');
} else {
utils.getFontsPbf(options.serveAllFonts ? null : allowedFonts,
fontPath, fontstack, range, existingFonts).then(function(concated) {
res.header('Content-type', 'application/x-protobuf');
res.header('Last-Modified', lastModified);
return res.send(concated);
}, function(err) {
return res.status(400).send(err);
}
});
);
});
app.get('/fonts.json', function(req, res, next) {
res.header('Content-type', 'application/json');
return res.send(
Object.keys(options.serveAllFonts ? existingFonts : allowedFonts).sort()
);
});
return fontListingPromise.then(function() {
return app;
});
};

View File

@@ -1,9 +1,9 @@
'use strict';
var async = require('async'),
advancedPool = require('advanced-pool'),
var advancedPool = require('advanced-pool'),
fs = require('fs'),
path = require('path'),
url = require('url'),
util = require('util'),
zlib = require('zlib');
@@ -15,15 +15,15 @@ var Canvas = require('canvas'),
clone = require('clone'),
Color = require('color'),
express = require('express'),
mercator = new (require('sphericalmercator'))(),
mbgl = require('mapbox-gl-native'),
mbtiles = require('mbtiles'),
mercator = new (require('@mapbox/sphericalmercator'))(),
mbgl = require('@mapbox/mapbox-gl-native'),
mbtiles = require('@mapbox/mbtiles'),
proj4 = require('proj4'),
request = require('request');
var utils = require('./utils');
var FLOAT_PATTERN = '[+-]?(?:\\d+|\\d+\.?\\d+)';
var SCALE_PATTERN = '@[23]x';
var getScale = function(scale) {
return (scale || '@1x').slice(1, 2) | 0;
@@ -35,19 +35,112 @@ mbgl.on('message', function(e) {
}
});
module.exports = function(options, repo, params, id) {
/**
* Lookup of sharp output formats by file extension.
*/
var extensionToFormat = {
'.jpg': 'jpeg',
'.jpeg': 'jpeg',
'.png': 'png',
'.webp': 'webp'
};
/**
* Cache of response data by sharp output format and color. Entry for empty
* string is for unknown or unsupported formats.
*/
var cachedEmptyResponses = {
'': new Buffer(0)
};
/**
* Create an appropriate mbgl response for http errors.
* @param {string} format The format (a sharp format or 'pbf').
* @param {string} color The background color (or empty string for transparent).
* @param {Function} callback The mbgl callback.
*/
function createEmptyResponse(format, color, callback) {
if (!format || format === 'pbf') {
callback(null, {data: cachedEmptyResponses['']});
return;
}
if (format === 'jpg') {
format = 'jpeg';
}
if (!color) {
color = 'rgba(255,255,255,0)';
}
var cacheKey = format + ',' + color;
var data = cachedEmptyResponses[cacheKey];
if (data) {
callback(null, {data: data});
return;
}
// create an "empty" response image
var color = new Color(color);
var array = color.array();
var channels = array.length == 4 && format != 'jpeg' ? 4 : 3;
sharp(new Buffer(array), {
raw: {
width: 1,
height: 1,
channels: channels
}
}).toFormat(format).toBuffer(function(err, buffer, info) {
if (!err) {
cachedEmptyResponses[cacheKey] = buffer;
}
callback(null, {data: buffer});
});
}
module.exports = function(options, repo, params, id, publicUrl, dataResolver) {
var app = express().disable('x-powered-by');
var maxScaleFactor = Math.min(Math.floor(options.maxScaleFactor || 3), 9);
var scalePattern = '';
for (var i = 2; i <= maxScaleFactor; i++) {
scalePattern += i.toFixed();
}
scalePattern = '@[' + scalePattern + ']x';
var lastModified = new Date().toUTCString();
var rootPath = options.paths.root;
var watermark = params.watermark || options.watermark;
var styleFile = params.style;
var map = {
renderers: [],
sources: {}
};
var existingFonts = {};
var fontListingPromise = new Promise(function(resolve, reject) {
fs.readdir(options.paths.fonts, function(err, files) {
if (err) {
reject(err);
return;
}
files.forEach(function(file) {
fs.stat(path.join(options.paths.fonts, file), function(err, stats) {
if (err) {
reject(err);
return;
}
if (stats.isDirectory()) {
existingFonts[path.basename(file)] = true;
}
});
});
resolve();
});
});
var styleJSON;
var createPool = function(ratio, min, max) {
var createRenderer = function(ratio, createCallback) {
@@ -66,13 +159,18 @@ module.exports = function(options, repo, params, id) {
var parts = req.url.split('/');
var fontstack = unescape(parts[2]);
var range = parts[3].split('.')[0];
utils.getFontsPbf(null, options.paths[protocol], fontstack, range,
function(err, concated) {
callback(err, {data: concated});
utils.getFontsPbf(
null, options.paths[protocol], fontstack, range, existingFonts
).then(function(concated) {
callback(null, {data: concated});
}, function(err) {
callback(err, {data: null});
});
} else if (protocol == 'mbtiles') {
var parts = req.url.split('/');
var source = map.sources[parts[2]];
var sourceId = parts[2];
var source = map.sources[sourceId];
var sourceInfo = styleJSON.sources[sourceId];
var z = parts[3] | 0,
x = parts[4] | 0,
y = parts[5].split('.')[0] | 0,
@@ -80,22 +178,31 @@ module.exports = function(options, repo, params, id) {
source.getTile(z, x, y, function(err, data, headers) {
if (err) {
//console.log('MBTiles error, serving empty', err);
callback(null, { data: source.emptyTile });
} else {
var response = {};
createEmptyResponse(sourceInfo.format, sourceInfo.color, callback);
return;
}
var response = {};
if (headers['Last-Modified']) {
response.modified = new Date(headers['Last-Modified']);
}
if (format == 'pbf') {
try {
response.data = zlib.unzipSync(data);
}
catch (err) {
console.log("Skipping incorrect header for tile mbtiles://%s/%s/%s/%s.pbf", id, z, x, y);
}
if (options.dataDecoratorFunc) {
response.data = options.dataDecoratorFunc(
sourceId, 'data', response.data, z, x, y);
}
} else {
response.data = data;
}
callback(null, response);
}
});
} else if (protocol == 'http' || protocol == 'https') {
request({
@@ -103,12 +210,16 @@ module.exports = function(options, repo, params, id) {
encoding: null,
gzip: true
}, function(err, res, body) {
if (err) {
//console.log('HTTP tile error', err);
callback(null, { data: new Buffer(0) });
} else if (res.statusCode == 200) {
var response = {};
var parts = url.parse(req.url);
var extension = path.extname(parts.pathname).toLowerCase();
var format = extensionToFormat[extension] || '';
if (err || res.statusCode < 200 || res.statusCode >= 300) {
// console.log('HTTP error', err || res.statusCode);
createEmptyResponse(format, '', callback);
return;
}
var response = {};
if (res.headers.modified) {
response.modified = new Date(res.headers.modified);
}
@@ -120,12 +231,7 @@ module.exports = function(options, repo, params, id) {
}
response.data = body;
callback(null, response);
} else {
//console.log('HTTP error', JSON.parse(body).message);
callback(null, { data: new Buffer(0) });
}
});
}
}
@@ -143,15 +249,24 @@ module.exports = function(options, repo, params, id) {
});
};
styleJSON = clone(require(path.join(options.paths.styles, styleFile)));
styleJSON.sprite = 'sprites://' + path.basename(styleFile, '.json');
styleJSON.glyphs = 'fonts://{fontstack}/{range}.pbf';
var styleJSONPath = path.resolve(options.paths.styles, styleFile);
styleJSON = clone(require(styleJSONPath));
var httpTester = /^(http(s)?:)?\/\//;
if (styleJSON.sprite && !httpTester.test(styleJSON.sprite)) {
styleJSON.sprite = 'sprites://' +
styleJSON.sprite
.replace('{style}', path.basename(styleFile, '.json'))
.replace('{styleJsonFolder}', path.relative(options.paths.sprites, path.dirname(styleJSONPath)));
}
if (styleJSON.glyphs && !httpTester.test(styleJSON.glyphs)) {
styleJSON.glyphs = 'fonts://' + styleJSON.glyphs;
}
var tileJSON = {
'tilejson': '2.0.0',
'name': styleJSON.name,
'attribution': '',
'basename': id,
'minzoom': 0,
'maxzoom': 20,
'bounds': [-180, -85.0511, 180, 85.0511],
@@ -163,45 +278,69 @@ module.exports = function(options, repo, params, id) {
tileJSON.tiles = params.domains || options.domains;
utils.fixTileJSONCenter(tileJSON);
var dataProjWGStoInternalWGS = null;
var queue = [];
Object.keys(styleJSON.sources).forEach(function(name) {
var source = styleJSON.sources[name];
var url = source.url;
if (url.lastIndexOf('mbtiles:', 0) === 0) {
if (url && url.lastIndexOf('mbtiles:', 0) === 0) {
// found mbtiles source, replace with info from local file
delete source.url;
queue.push(function(callback) {
var mbtilesFile = url.substring('mbtiles://'.length);
map.sources[name] = new mbtiles(
path.join(options.paths.mbtiles, mbtilesFile), function(err) {
var fromData = mbtilesFile[0] == '{' &&
mbtilesFile[mbtilesFile.length - 1] == '}';
if (fromData) {
mbtilesFile = mbtilesFile.substr(1, mbtilesFile.length - 2);
var mapsTo = (params.mapping || {})[mbtilesFile];
if (mapsTo) {
mbtilesFile = mapsTo;
}
mbtilesFile = dataResolver(mbtilesFile);
if (!mbtilesFile) {
console.error('ERROR: data "' + mbtilesFile + '" not found!');
process.exit(1);
}
}
queue.push(new Promise(function(resolve, reject) {
mbtilesFile = path.resolve(options.paths.mbtiles, mbtilesFile);
var mbtilesFileStats = fs.statSync(mbtilesFile);
if (!mbtilesFileStats.isFile() || mbtilesFileStats.size == 0) {
throw Error('Not valid MBTiles file: ' + mbtilesFile);
}
map.sources[name] = new mbtiles(mbtilesFile, function(err) {
map.sources[name].getInfo(function(err, info) {
if (err) {
console.error(err);
return;
}
if (!dataProjWGStoInternalWGS && info.proj4) {
// how to do this for multiple sources with different proj4 defs?
var to3857 = proj4('EPSG:3857');
var toDataProj = proj4(info.proj4);
dataProjWGStoInternalWGS = function(xy) {
return to3857.inverse(toDataProj.forward(xy));
};
}
var type = source.type;
Object.assign(source, info);
source.type = type;
source.basename = name;
source.tiles = [
// meta url which will be detected when requested
'mbtiles://' + name + '/{z}/{x}/{y}.' + (info.format || 'pbf')
];
if (source.format == 'pbf') {
map.sources[name].emptyTile = new Buffer(0);
} else {
var color = new Color(source.color || '#fff');
var format = source.format;
if (format == 'jpg') {
format = 'jpeg';
}
sharp(new Buffer(color.rgbArray()), {
raw: {
width: 1,
height: 1,
channels: 3
}
}).toFormat(format).toBuffer(function(err, buffer, info) {
map.sources[name].emptyTile = buffer;
});
delete source.scheme;
if (options.dataDecoratorFunc) {
source = options.dataDecoratorFunc(name, 'tilejson', source);
}
if (!attributionOverride &&
source.attribution && source.attribution.length > 0) {
if (tileJSON.attribution.length > 0) {
@@ -209,33 +348,41 @@ module.exports = function(options, repo, params, id) {
}
tileJSON.attribution += source.attribution;
}
callback(null);
});
resolve();
});
});
}));
}
});
async.parallel(queue, function(err, results) {
// TODO: make pool sizes configurable
map.renderers[1] = createPool(1, 4, 16);
map.renderers[2] = createPool(2, 2, 8);
map.renderers[3] = createPool(3, 2, 4);
var renderersReadyPromise = Promise.all(queue).then(function() {
// standard and @2x tiles are much more usual -> default to larger pools
var minPoolSizes = options.minRendererPoolSizes || [8, 4, 2];
var maxPoolSizes = options.maxRendererPoolSizes || [16, 8, 4];
for (var s = 1; s <= maxScaleFactor; s++) {
var i = Math.min(minPoolSizes.length - 1, s - 1);
var j = Math.min(maxPoolSizes.length - 1, s - 1);
var minPoolSize = minPoolSizes[i];
var maxPoolSize = Math.max(minPoolSize, maxPoolSizes[j]);
map.renderers[s] = createPool(s, minPoolSize, maxPoolSize);
}
});
repo[id] = tileJSON;
var tilePattern = '/rendered/:z(\\d+)/:x(\\d+)/:y(\\d+)' +
':scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)';
var tilePattern = '/' + id + '/:z(\\d+)/:x(\\d+)/:y(\\d+)' +
':scale(' + scalePattern + ')?\.:format([\\w]+)';
var respondImage = function(z, lon, lat, bearing, pitch,
width, height, scale, format, res, next,
opt_overlay) {
if (Math.abs(lon) > 180 || Math.abs(lat) > 85.06) {
if (Math.abs(lon) > 180 || Math.abs(lat) > 85.06 ||
lon != lon || lat != lat) {
return res.status(400).send('Invalid center');
}
if (Math.min(width, height) <= 0 ||
Math.max(width, height) * scale > 2048) {
Math.max(width, height) * scale > (options.maxSize || 2048) ||
width != width || height != height) {
return res.status(400).send('Invalid size');
}
if (format == 'png' || format == 'webp') {
@@ -262,7 +409,10 @@ module.exports = function(options, repo, params, id) {
}
renderer.render(params, function(err, data) {
pool.release(renderer);
if (err) console.log(err);
if (err) {
console.error(err);
return;
}
var image = sharp(data, {
raw: {
@@ -280,18 +430,29 @@ module.exports = function(options, repo, params, id) {
if (opt_overlay) {
image.overlayWith(opt_overlay);
}
if (watermark) {
var canvas = new Canvas(scale * width, scale * height);
var ctx = canvas.getContext('2d');
ctx.scale(scale, scale);
ctx.font = '10px sans-serif';
ctx.strokeWidth = '1px';
ctx.strokeStyle = 'rgba(255,255,255,.4)';
ctx.strokeText(watermark, 5, height - 5);
ctx.fillStyle = 'rgba(0,0,0,.4)';
ctx.fillText(watermark, 5, height - 5);
image.toFormat(format);
image.overlayWith(canvas.toBuffer());
}
var formatQuality = (params.formatQuality || {})[format] ||
(options.formatQuality || {})[format];
var formatEncoding = (params.formatEncoding || {})[format] ||
(options.formatEncoding || {})[format];
if (format == 'png') {
image.compressionLevel(formatEncoding || 6)
.withoutAdaptiveFiltering();
image.png({adaptiveFiltering: false});
} else if (format == 'jpeg') {
image.quality(formatEncoding || 80);
image.jpeg({quality: formatQuality || 80});
} else if (format == 'webp') {
image.quality(formatEncoding || 90);
image.webp({quality: formatQuality || 90});
}
image.toBuffer(function(err, buffer, info) {
if (!buffer) {
@@ -334,17 +495,22 @@ module.exports = function(options, repo, params, id) {
tileSize, tileSize, scale, format, res, next);
});
var extractPathFromQuery = function(query) {
var extractPathFromQuery = function(query, transformer) {
var pathParts = (query.path || '').split('|');
var path = [];
pathParts.forEach(function(pair) {
var pairParts = pair.split(',');
if (pairParts.length == 2) {
var pair;
if (query.latlng == '1' || query.latlng == 'true') {
path.push([+(pairParts[1]), +(pairParts[0])]);
pair = [+(pairParts[1]), +(pairParts[0])];
} else {
path.push([+(pairParts[0]), +(pairParts[1])]);
pair = [+(pairParts[0]), +(pairParts[1])];
}
if (transformer) {
pair = transformer(pair);
}
path.push(pair);
}
});
return path;
@@ -361,9 +527,19 @@ module.exports = function(options, repo, params, id) {
return [px[0] * scale, px[1] * scale];
};
var center = precisePx([x, y], z);
var mapHeight = 512 * (1 << z);
var maxEdge = center[1] + h / 2;
var minEdge = center[1] - h / 2;
if (maxEdge > mapHeight) {
center[1] -= (maxEdge - mapHeight);
} else if (minEdge < 0) {
center[1] -= minEdge;
}
var canvas = new Canvas(scale * w, scale * h);
var ctx = canvas.getContext('2d');
var center = precisePx([x, y], z);
ctx.scale(scale, scale);
if (bearing) {
ctx.translate(w / 2, h / 2);
@@ -403,30 +579,34 @@ module.exports = function(options, repo, params, id) {
var minCorner = mercator.px([bbox[0], bbox[3]], z),
maxCorner = mercator.px([bbox[2], bbox[1]], z);
while ((((maxCorner[0] - minCorner[0]) * (1 + 2 * padding) > w) ||
((maxCorner[1] - minCorner[1]) * (1 + 2 * padding) > h)) && z > 0) {
z--;
minCorner[0] /= 2;
minCorner[1] /= 2;
maxCorner[0] /= 2;
maxCorner[1] /= 2;
}
var w_ = w / (1 + 2 * padding);
var h_ = h / (1 + 2 * padding);
z -= Math.max(
Math.log((maxCorner[0] - minCorner[0]) / w_),
Math.log((maxCorner[1] - minCorner[1]) / h_)
) / Math.LN2;
z = Math.max(Math.log(Math.max(w, h) / 256) / Math.LN2, Math.min(25, z));
return z;
};
if (options.serveStaticMaps !== false) {
var staticPattern =
'/static/%s/:width(\\d+)x:height(\\d+)' +
':scale(' + SCALE_PATTERN + ')?\.:format([\\w]+)';
'/' + id + '/static/:raw(raw)?/%s/:width(\\d+)x:height(\\d+)' +
':scale(' + scalePattern + ')?\.:format([\\w]+)';
var centerPattern =
util.format(':lon(%s),:lat(%s),:z(\\d+)(@:bearing(%s)(,:pitch(%s))?)?',
FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN);
util.format(':x(%s),:y(%s),:z(%s)(@:bearing(%s)(,:pitch(%s))?)?',
FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN,
FLOAT_PATTERN, FLOAT_PATTERN);
app.get(util.format(staticPattern, centerPattern), function(req, res, next) {
var z = req.params.z | 0,
x = +req.params.lon,
y = +req.params.lat,
var raw = req.params.raw;
var z = +req.params.z,
x = +req.params.x,
y = +req.params.y,
bearing = +(req.params.bearing || '0'),
pitch = +(req.params.pitch || '0'),
w = req.params.width | 0,
@@ -434,7 +614,20 @@ module.exports = function(options, repo, params, id) {
scale = getScale(req.params.scale),
format = req.params.format;
var path = extractPathFromQuery(req.query);
if (z < 0) {
return res.status(404).send('Invalid zoom');
}
var transformer = raw ?
mercator.inverse.bind(mercator) : dataProjWGStoInternalWGS;
if (transformer) {
var ll = transformer([x, y]);
x = ll[0];
y = ll[1];
}
var path = extractPathFromQuery(req.query, transformer);
var overlay = renderOverlay(z, x, y, bearing, pitch, w, h, scale,
path, req.query);
@@ -442,39 +635,75 @@ module.exports = function(options, repo, params, id) {
res, next, overlay);
});
var boundsPattern =
util.format(':minx(%s),:miny(%s),:maxx(%s),:maxy(%s)',
FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN);
app.get(util.format(staticPattern, boundsPattern), function(req, res, next) {
var serveBounds = function(req, res, next) {
var raw = req.params.raw;
var bbox = [+req.params.minx, +req.params.miny,
+req.params.maxx, +req.params.maxy];
var center = [(bbox[0] + bbox[2]) / 2, (bbox[1] + bbox[3]) / 2];
var transformer = raw ?
mercator.inverse.bind(mercator) : dataProjWGStoInternalWGS;
if (transformer) {
var minCorner = transformer(bbox.slice(0, 2));
var maxCorner = transformer(bbox.slice(2));
bbox[0] = minCorner[0];
bbox[1] = minCorner[1];
bbox[2] = maxCorner[0];
bbox[3] = maxCorner[1];
center = transformer(center);
}
var w = req.params.width | 0,
h = req.params.height | 0,
scale = getScale(req.params.scale),
format = req.params.format;
var z = calcZForBBox(bbox, w, h, req.query),
x = (bbox[0] + bbox[2]) / 2,
y = (bbox[1] + bbox[3]) / 2,
x = center[0],
y = center[1],
bearing = 0,
pitch = 0;
var path = extractPathFromQuery(req.query);
var path = extractPathFromQuery(req.query, transformer);
var overlay = renderOverlay(z, x, y, bearing, pitch, w, h, scale,
path, req.query);
return respondImage(z, x, y, bearing, pitch, w, h, scale, format,
res, next, overlay);
};
var boundsPattern =
util.format(':minx(%s),:miny(%s),:maxx(%s),:maxy(%s)',
FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN, FLOAT_PATTERN);
app.get(util.format(staticPattern, boundsPattern), serveBounds);
app.get('/' + id + '/static/', function(req, res, next) {
for (var key in req.query) {
req.query[key.toLowerCase()] = req.query[key];
}
req.params.raw = true;
req.params.format = (req.query.format || 'image/png').split('/').pop();
var bbox = (req.query.bbox || '').split(',');
req.params.minx = bbox[0];
req.params.miny = bbox[1];
req.params.maxx = bbox[2];
req.params.maxy = bbox[3];
req.params.width = req.query.width || '256';
req.params.height = req.query.height || '256';
if (req.query.scale) {
req.params.width /= req.query.scale;
req.params.height /= req.query.scale;
req.params.scale = '@' + req.query.scale;
}
return serveBounds(req, res, next);
});
var autoPattern = 'auto';
app.get(util.format(staticPattern, autoPattern), function(req, res, next) {
var path = extractPathFromQuery(req.query);
if (path.length < 2) {
return res.status(400).send('Invalid path');
}
var raw = req.params.raw;
var w = req.params.width | 0,
h = req.params.height | 0,
bearing = 0,
@@ -482,6 +711,14 @@ module.exports = function(options, repo, params, id) {
scale = getScale(req.params.scale),
format = req.params.format;
var transformer = raw ?
mercator.inverse.bind(mercator) : dataProjWGStoInternalWGS;
var path = extractPathFromQuery(req.query, transformer);
if (path.length < 2) {
return res.status(400).send('Invalid path');
}
var bbox = [Infinity, Infinity, -Infinity, -Infinity];
path.forEach(function(pair) {
bbox[0] = Math.min(bbox[0], pair[0]);
@@ -490,9 +727,14 @@ module.exports = function(options, repo, params, id) {
bbox[3] = Math.max(bbox[3], pair[1]);
});
var bbox_ = mercator.convert(bbox, '900913');
var center = mercator.inverse(
[(bbox_[0] + bbox_[2]) / 2, (bbox_[1] + bbox_[3]) / 2]
);
var z = calcZForBBox(bbox, w, h, req.query),
x = (bbox[0] + bbox[2]) / 2,
y = (bbox[1] + bbox[3]) / 2;
x = center[0],
y = center[1];
var overlay = renderOverlay(z, x, y, bearing, pitch, w, h, scale,
path, req.query);
@@ -500,13 +742,17 @@ module.exports = function(options, repo, params, id) {
return respondImage(z, x, y, bearing, pitch, w, h, scale, format,
res, next, overlay);
});
}
app.get('/rendered.json', function(req, res, next) {
app.get('/' + id + '.json', function(req, res, next) {
var info = clone(tileJSON);
info.tiles = utils.getTileUrls(req, info.tiles,
'styles/' + id + '/rendered', info.format);
'styles/' + id, info.format, publicUrl);
return res.send(info);
});
return Promise.all([fontListingPromise, renderersReadyPromise]).then(function() {
return app;
});
};

View File

@@ -6,53 +6,81 @@ var path = require('path'),
var clone = require('clone'),
express = require('express');
var utils = require('./utils');
module.exports = function(options, repo, params, id, reportTiles, reportFont) {
module.exports = function(options, repo, params, id, publicUrl, reportTiles, reportFont) {
var app = express().disable('x-powered-by');
var styleFile = path.join(options.paths.styles, params.style);
var styleFile = path.resolve(options.paths.styles, params.style);
var styleJSON = clone(require(styleFile));
Object.keys(styleJSON.sources).forEach(function(name) {
var source = styleJSON.sources[name];
var url = source.url;
if (url.lastIndexOf('mbtiles:', 0) === 0) {
var mbtiles = url.substring('mbtiles://'.length);
var identifier = reportTiles(mbtiles);
if (url && url.lastIndexOf('mbtiles:', 0) === 0) {
var mbtilesFile = url.substring('mbtiles://'.length);
var fromData = mbtilesFile[0] == '{' &&
mbtilesFile[mbtilesFile.length - 1] == '}';
if (fromData) {
mbtilesFile = mbtilesFile.substr(1, mbtilesFile.length - 2);
var mapsTo = (params.mapping || {})[mbtilesFile];
if (mapsTo) {
mbtilesFile = mapsTo;
}
}
var identifier = reportTiles(mbtilesFile, fromData);
source.url = 'local://data/' + identifier + '.json';
}
});
var findFontReferences = function(obj) {
Object.keys(obj).forEach(function(key) {
var value = obj[key];
if (key == 'text-font') {
if (value && value.length > 0) {
value.forEach(reportFont);
styleJSON.layers.forEach(function(obj) {
if (obj['type'] == 'symbol') {
var fonts = (obj['layout'] || {})['text-font'];
if (fonts && fonts.length) {
fonts.forEach(reportFont);
} else {
reportFont('Open Sans Regular');
reportFont('Arial Unicode MS Regular');
}
} else if (value && typeof value == 'object') {
findFontReferences(value);
}
});
};
styleJSON.layers.forEach(findFontReferences);
var spritePath = path.join(options.paths.sprites,
path.basename(styleFile, '.json'));
var spritePath;
var httpTester = /^(http(s)?:)?\/\//;
if (styleJSON.sprite && !httpTester.test(styleJSON.sprite)) {
spritePath = path.join(options.paths.sprites,
styleJSON.sprite
.replace('{style}', path.basename(styleFile, '.json'))
.replace('{styleJsonFolder}', path.relative(options.paths.sprites, path.dirname(styleFile)))
);
styleJSON.sprite = 'local://styles/' + id + '/sprite';
}
if (styleJSON.glyphs && !httpTester.test(styleJSON.glyphs)) {
styleJSON.glyphs = 'local://fonts/{fontstack}/{range}.pbf';
}
repo[id] = styleJSON;
app.get('/' + id + '.json', function(req, res, next) {
var fixUrl = function(url, opt_nokey) {
var query = '';
app.get('/' + id + '/style.json', function(req, res, next) {
var fixUrl = function(url, opt_nokey, opt_nostyle) {
if (!url || (typeof url !== 'string') || url.indexOf('local://') !== 0) {
return url;
}
var queryParams = [];
if (!opt_nostyle && global.addStyleParam) {
queryParams.push('style=' + id);
}
if (!opt_nokey && req.query.key) {
query = '?key=' + req.query.key;
queryParams.unshift('key=' + req.query.key);
}
var query = '';
if (queryParams.length) {
query = '?' + queryParams.join('&');
}
return url.replace(
'local://', req.protocol + '://' + req.headers.host + '/') + query;
'local://', utils.getPublicUrl(publicUrl, req)) + query;
};
var styleJSON_ = clone(styleJSON);
@@ -61,13 +89,20 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) {
source.url = fixUrl(source.url);
});
// mapbox-gl-js viewer cannot handle sprite urls with query
styleJSON_.sprite = fixUrl(styleJSON_.sprite, true);
styleJSON_.glyphs = fixUrl(styleJSON_.glyphs);
if (styleJSON_.sprite) {
styleJSON_.sprite = fixUrl(styleJSON_.sprite, true, true);
}
if (styleJSON_.glyphs) {
styleJSON_.glyphs = fixUrl(styleJSON_.glyphs, false, true);
}
return res.send(styleJSON_);
});
app.get('/' + id + '/sprite:scale(@[23]x)?\.:format([\\w]+)',
function(req, res, next) {
if (!spritePath) {
return res.status(404).send('File not found');
}
var scale = req.params.scale,
format = req.params.format;
var filename = spritePath + (scale || '') + '.' + format;
@@ -83,5 +118,5 @@ module.exports = function(options, repo, params, id, reportTiles, reportFont) {
});
});
return app;
return Promise.resolve(app);
};

View File

@@ -7,47 +7,54 @@ process.env.UV_THREADPOOL_SIZE =
var fs = require('fs'),
path = require('path');
var base64url = require('base64url'),
clone = require('clone'),
var clone = require('clone'),
cors = require('cors'),
enableShutdown = require('http-shutdown'),
express = require('express'),
handlebars = require('handlebars'),
mercator = new (require('sphericalmercator'))(),
mercator = new (require('@mapbox/sphericalmercator'))(),
morgan = require('morgan');
var packageJson = require('../package'),
serve_font = require('./serve_font'),
serve_rendered = require('./serve_rendered'),
serve_rendered = null,
serve_style = require('./serve_style'),
serve_data = require('./serve_data'),
utils = require('./utils');
module.exports = function(opts, callback) {
console.log('Starting TileServer-GL v' + packageJson.version);
var isLight = packageJson.name.slice(-6) == '-light';
if (!isLight) {
// do not require `serve_rendered` in the light package
serve_rendered = require('./serve_rendered');
}
function start(opts) {
console.log('Starting server');
var app = express().disable('x-powered-by'),
serving = {
styles: {},
rendered: {},
data: {},
fonts: { // default fonts, always expose these (if they exist)
'Open Sans Regular': true,
'Arial Unicode MS Regular': true
}
fonts: {}
};
app.enable('trust proxy');
callback = callback || function() {};
if (process.env.NODE_ENV !== 'production' &&
process.env.NODE_ENV !== 'test') {
app.use(morgan('dev'));
if (process.env.NODE_ENV == 'production') {
app.use(morgan('tiny', {
skip: function(req, res) { return opts.silent && (res.statusCode == 200 || res.statusCode == 304) }
}));
} else if (process.env.NODE_ENV !== 'test') {
app.use(morgan('dev', {
skip: function(req, res) { return opts.silent && (res.statusCode == 200 || res.statusCode == 304) }
}));
}
var configPath = path.resolve(opts.config);
var config;
var config = opts.config || null;
var configPath = null;
if (opts.configPath) {
configPath = path.resolve(opts.configPath);
try {
config = clone(require(configPath));
} catch (e) {
@@ -55,19 +62,47 @@ module.exports = function(opts, callback) {
console.log(' See README.md for instructions and sample data.');
process.exit(1);
}
}
if (!config) {
console.log('ERROR: No config file not specified!');
process.exit(1);
}
var options = config.options || {};
var paths = options.paths || {};
options.paths = paths;
paths.root = path.resolve(process.cwd(), paths.root || '');
paths.root = path.resolve(
configPath ? path.dirname(configPath) : process.cwd(),
paths.root || '');
paths.styles = path.resolve(paths.root, paths.styles || '');
paths.fonts = path.resolve(paths.root, paths.fonts || '');
paths.sprites = path.resolve(paths.root, paths.sprites || '');
paths.mbtiles = path.resolve(paths.root, paths.mbtiles || '');
var startupPromises = [];
var checkPath = function(type) {
if (!fs.existsSync(paths[type])) {
console.error('The specified path for "' + type + '" does not exist (' + paths[type] + ').');
process.exit(1);
}
};
checkPath('styles');
checkPath('fonts');
checkPath('sprites');
checkPath('mbtiles');
if (options.dataDecorator) {
try {
options.dataDecoratorFunc = require(path.resolve(paths.root, options.dataDecorator));
} catch (e) {}
}
var data = clone(config.data || {});
if (opts.cors) {
app.use(cors());
}
Object.keys(config.styles || {}).forEach(function(id) {
var item = config.styles[id];
@@ -77,16 +112,25 @@ module.exports = function(opts, callback) {
}
if (item.serve_data !== false) {
app.use('/styles/', serve_style(options, serving.styles, item, id,
function(mbtiles) {
startupPromises.push(serve_style(options, serving.styles, item, id, opts.publicUrl,
function(mbtiles, fromData) {
var dataItemId;
Object.keys(data).forEach(function(id) {
if (fromData) {
if (id == mbtiles) {
dataItemId = id;
}
} else {
if (data[id].mbtiles == mbtiles) {
dataItemId = id;
}
}
});
if (dataItemId) { // mbtiles exist in the data config
return dataItemId;
} else if (fromData) {
console.log('ERROR: data "' + mbtiles + '" not found!');
process.exit(1);
} else {
var id = mbtiles.substr(0, mbtiles.lastIndexOf('.')) || mbtiles;
while (data[id]) id += '_';
@@ -97,18 +141,38 @@ module.exports = function(opts, callback) {
}
}, function(font) {
serving.fonts[font] = true;
}).then(function(sub) {
app.use('/styles/', sub);
}));
}
if (item.serve_rendered !== false) {
app.use('/styles/' + id + '/',
serve_rendered(options, serving.rendered, item, id));
if (serve_rendered) {
startupPromises.push(
serve_rendered(options, serving.rendered, item, id, opts.publicUrl,
function(mbtiles) {
var mbtilesFile;
Object.keys(data).forEach(function(id) {
if (id == mbtiles) {
mbtilesFile = data[id].mbtiles;
}
});
return mbtilesFile;
}
).then(function(sub) {
app.use('/styles/', sub);
})
);
} else {
item.serve_rendered = false;
}
}
});
if (Object.keys(serving.styles).length > 0) {
// serve fonts only if serving some styles
app.use('/fonts/', serve_font(options, serving.fonts));
}
startupPromises.push(
serve_font(options, serving.fonts).then(function(sub) {
app.use('/', sub);
})
);
Object.keys(data).forEach(function(id) {
var item = data[id];
@@ -117,7 +181,11 @@ module.exports = function(opts, callback) {
return;
}
app.use('/data/', serve_data(options, serving.data, item, id));
startupPromises.push(
serve_data(options, serving.data, item, id, serving.styles, opts.publicUrl).then(function(sub) {
app.use('/data/', sub);
})
);
});
app.get('/styles.json', function(req, res, next) {
@@ -129,8 +197,8 @@ module.exports = function(opts, callback) {
version: styleJSON.version,
name: styleJSON.name,
id: id,
url: req.protocol + '://' + req.headers.host +
'/styles/' + id + '.json' + query
url: utils.getPublicUrl(opts.publicUrl, req) +
'/styles/' + id + '/style.json' + query
});
});
res.send(result);
@@ -139,8 +207,15 @@ module.exports = function(opts, callback) {
var addTileJSONs = function(arr, req, type) {
Object.keys(serving[type]).forEach(function(id) {
var info = clone(serving[type][id]);
info.tiles = utils.getTileUrls(req, info.tiles,
type + '/' + id, info.format);
var path = '';
if (type == 'rendered') {
path = 'styles/' + id;
} else {
path = type + '/' + id;
}
info.tiles = utils.getTileUrls(req, info.tiles, path, info.format, opts.publicUrl, {
'pbf': options.pbfAlias
});
arr.push(info);
});
return arr;
@@ -161,14 +236,26 @@ module.exports = function(opts, callback) {
app.use('/', express.static(path.join(__dirname, '../public/resources')));
var templates = path.join(__dirname, '../public/templates');
var serveTemplate = function(path, template, dataGetter) {
fs.readFile(templates + '/' + template + '.tmpl', function(err, content) {
var serveTemplate = function(urlPath, template, dataGetter) {
var templateFile = templates + '/' + template + '.tmpl';
if (template == 'index') {
if (options.frontPage === false) {
return;
} else if (options.frontPage &&
options.frontPage.constructor === String) {
templateFile = path.resolve(paths.root, options.frontPage);
}
}
startupPromises.push(new Promise(function(resolve, reject) {
fs.readFile(templateFile, function(err, content) {
if (err) {
console.log('Template not found:', err);
err = new Error('Template not found: ' + err.message);
reject(err);
return;
}
var compiled = handlebars.compile(content.toString());
app.use(path, function(req, res, next) {
app.use(urlPath, function(req, res, next) {
var data = {};
if (dataGetter) {
data = dataGetter(req);
@@ -176,13 +263,18 @@ module.exports = function(opts, callback) {
return res.status(404).send('Not found');
}
}
data['server_version'] = packageJson.version;
data['server_version'] = packageJson.name + ' v' + packageJson.version;
data['public_url'] = opts.publicUrl || '/';
data['is_light'] = isLight;
data['key_query_part'] =
req.query.key ? 'key=' + req.query.key + '&amp;' : '';
data['key_query'] = req.query.key ? '?key=' + req.query.key : '';
if (template === 'wmts') res.set('Content-Type', 'text/xml');
return res.status(200).send(compiled(data));
});
resolve();
});
}));
};
serveTemplate('/$', 'index', function(req) {
@@ -205,10 +297,10 @@ module.exports = function(opts, callback) {
Math.floor(centerPx[1] / 256) + '.png';
}
var query = req.query.key ? ('?key=' + req.query.key) : '';
style.wmts_link = 'http://wmts.maptiler.com/' +
base64url('http://' + req.headers.host +
'/styles/' + id + '/rendered.json' + query) + '/wmts';
var tiles = utils.getTileUrls(
req, style.serving_rendered.tiles,
'styles/' + id, style.serving_rendered.format, opts.publicUrl);
style.xyz_link = tiles[0];
}
});
var data = clone(serving.data || {});
@@ -229,10 +321,11 @@ module.exports = function(opts, callback) {
Math.floor(centerPx[1] / 256) + '.' + data_.format;
}
var query = req.query.key ? ('?key=' + req.query.key) : '';
data_.wmts_link = 'http://wmts.maptiler.com/' +
base64url('http://' + req.headers.host +
'/data/' + id + '.json' + query) + '/wmts';
var tiles = utils.getTileUrls(
req, data_.tiles, 'data/' + id, data_.format, opts.publicUrl, {
'pbf': options.pbfAlias
});
data_.xyz_link = tiles[0];
}
if (data_.filesize) {
var suffix = 'kB';
@@ -249,8 +342,8 @@ module.exports = function(opts, callback) {
}
});
return {
styles: styles,
data: data
styles: Object.keys(styles).length ? styles : null,
data: Object.keys(data).length ? data : null
};
});
@@ -272,6 +365,20 @@ module.exports = function(opts, callback) {
return res.redirect(301, '/styles/' + req.params.id + '/');
});
*/
serveTemplate('/styles/:id/wmts.xml', 'wmts', function(req) {
var id = req.params.id;
var wmts = clone((config.styles || {})[id]);
if (!wmts) {
return null;
}
if (wmts.hasOwnProperty("serve_rendered") && !wmts.serve_rendered) {
return null;
}
wmts.id = id;
wmts.name = (serving.styles[id] || serving.rendered[id]).name;
wmts.baseUrl = (req.get('X-Forwarded-Protocol')?req.get('X-Forwarded-Protocol'):req.protocol) + '://' + req.get('host');
return wmts;
});
serveTemplate('/data/:id/$', 'data', function(req) {
var id = req.params.id;
@@ -284,16 +391,62 @@ module.exports = function(opts, callback) {
return data;
});
var server = app.listen(process.env.PORT || opts.port, function() {
console.log('Listening at http://%s:%d/',
this.address().address, this.address().port);
return callback();
var startupComplete = false;
var startupPromise = Promise.all(startupPromises).then(function() {
console.log('Startup complete');
startupComplete = true;
});
app.get('/health', function(req, res, next) {
if (startupComplete) {
return res.status(200).send('OK');
} else {
return res.status(503).send('Starting');
}
});
setTimeout(callback, 1000);
var server = app.listen(process.env.PORT || opts.port, process.env.BIND || opts.bind, function() {
var address = this.address().address;
if (address.indexOf('::') === 0) {
address = '[' + address + ']'; // literal IPv6 address
}
console.log('Listening at http://%s:%d/', address, this.address().port);
});
// add server.shutdown() to gracefully stop serving
enableShutdown(server);
return {
app: app,
server: server
server: server,
startupPromise: startupPromise
};
}
module.exports = function(opts) {
var running = start(opts);
running.startupPromise.catch(function(err) {
console.error(err.message);
process.exit(1);
});
process.on('SIGINT', function() {
process.exit();
});
process.on('SIGHUP', function() {
console.log('Stopping server and reloading config');
running.server.shutdown(function() {
for (var key in require.cache) {
delete require.cache[key];
}
var restarted = start(opts);
running.server = restarted.server;
running.app = restarted.app;
});
});
return running;
};

View File

@@ -1,30 +1,67 @@
'use strict';
var async = require('async'),
path = require('path'),
var path = require('path'),
fs = require('fs');
var glyphCompose = require('glyph-pbf-composite');
var clone = require('clone'),
glyphCompose = require('glyph-pbf-composite');
module.exports.getTileUrls = function(req, domains, path, format) {
module.exports.getPublicUrl = function(publicUrl, req) {
return publicUrl || (req.protocol + '://' + req.headers.host + '/')
}
module.exports.getTileUrls = function(req, domains, path, format, publicUrl, aliases) {
if (domains) {
if (domains.constructor === String && domains.length > 0) {
domains = domains.split(',');
}
var host = req.headers.host;
var hostParts = host.split('.');
var relativeSubdomainsUsable = hostParts.length > 1 &&
!/^([0-9]{1,3}\.){3}[0-9]{1,3}(\:[0-9]+)?$/.test(host);
var newDomains = [];
domains.forEach(function(domain) {
if (domain.indexOf('*') !== -1) {
if (relativeSubdomainsUsable) {
var newParts = hostParts.slice(1);
newParts.unshift(domain.replace('*', hostParts[0]));
newDomains.push(newParts.join('.'));
}
} else {
newDomains.push(domain);
}
});
domains = newDomains;
}
if (!domains || domains.length == 0) {
domains = [req.headers.host];
}
var key = req.query.key;
var query = (key && key.length > 0) ? ('?key=' + key) : '';
var queryParams = [];
if (req.query.key) {
queryParams.push('key=' + req.query.key);
}
if (req.query.style) {
queryParams.push('style=' + req.query.style);
}
var query = queryParams.length > 0 ? ('?' + queryParams.join('&')) : '';
if (aliases && aliases[format]) {
format = aliases[format];
}
var uris = [];
if (!publicUrl) {
domains.forEach(function(domain) {
uris.push(req.protocol + '://' + domain + '/' + path +
'/{z}/{x}/{y}.' + format + query);
});
} else {
uris.push(publicUrl + path + '/{z}/{x}/{y}.' + format + query)
}
return uris;
};
@@ -44,35 +81,58 @@ module.exports.fixTileJSONCenter = function(tileJSON) {
}
};
module.exports.getFontsPbf = function(allowedFonts, fontPath, names, range, callback) {
var getFontPbf = function(name, range, callback) {
if (!allowedFonts || allowedFonts[name]) {
var getFontPbf = function(allowedFonts, fontPath, name, range, fallbacks) {
return new Promise(function(resolve, reject) {
if (!allowedFonts || (allowedFonts[name] && fallbacks)) {
var filename = path.join(fontPath, name, range + '.pbf');
return fs.readFile(filename, function(err, data) {
if (!fallbacks) {
fallbacks = clone(allowedFonts || {});
}
delete fallbacks[name];
fs.readFile(filename, function(err, data) {
if (err) {
return callback(new Error('Font load error: ' + name));
console.error('ERROR: Font not found:', name);
if (fallbacks && Object.keys(fallbacks).length) {
var fallbackName;
var fontStyle = name.split(' ').pop();
if (['Regular', 'Bold', 'Italic'].indexOf(fontStyle) < 0) {
fontStyle = 'Regular';
}
fallbackName = 'Noto Sans ' + fontStyle;
if (!fallbacks[fallbackName]) {
fallbackName = 'Open Sans ' + fontStyle;
if (!fallbacks[fallbackName]) {
fallbackName = Object.keys(fallbacks)[0];
}
}
console.error('ERROR: Trying to use', fallbackName, 'as a fallback');
delete fallbacks[fallbackName];
getFontPbf(null, fontPath, fallbackName, range, fallbacks).then(resolve, reject);
} else {
return callback(null, data);
reject('Font load error: ' + name);
}
} else {
resolve(data);
}
});
} else {
return callback(new Error('Font not allowed: ' + name));
}
};
var fonts = names.split(',');
var queue = [];
fonts.forEach(function(font) {
queue.push(function(callback) {
getFontPbf(font, range, callback);
});
});
return async.parallel(queue, function(err, results) {
if (err) {
callback(err, new Buffer([]));
} else {
callback(err, glyphCompose.combine(results));
reject('Font not allowed: ' + name);
}
});
};
module.exports.getFontsPbf = function(allowedFonts, fontPath, names, range, fallbacks) {
var fonts = names.split(',');
var queue = [];
fonts.forEach(function(font) {
queue.push(
getFontPbf(allowedFonts, fontPath, font, range, clone(allowedFonts || fallbacks))
);
});
return Promise.all(queue).then(function(values) {
return glyphCompose.combine(values);
});
};

View File

@@ -18,7 +18,7 @@ var testTileJSONArray = function(url) {
});
};
var testTileJSON = function(url, basename) {
var testTileJSON = function(url) {
describe(url + ' is TileJSON', function() {
it('is json', function(done) {
supertest(app)
@@ -27,11 +27,10 @@ var testTileJSON = function(url, basename) {
.expect('Content-Type', /application\/json/, done);
});
it('has valid basename and tiles', function(done) {
it('has valid tiles', function(done) {
supertest(app)
.get(url)
.expect(function(res) {
res.body.basename.should.equal(basename);
res.body.tiles.length.should.be.greaterThan(0);
}).end(done);
});
@@ -39,6 +38,14 @@ var testTileJSON = function(url, basename) {
};
describe('Metadata', function() {
describe('/health', function() {
it('returns 200', function(done) {
supertest(app)
.get('/health')
.expect(200, done);
});
});
testTileJSONArray('/index.json');
testTileJSONArray('/rendered.json');
testTileJSONArray('/data.json');
@@ -64,6 +71,6 @@ describe('Metadata', function() {
});
});
testTileJSON('/styles/bright/rendered.json', 'bright');
testTileJSON('/data/zurich-vector.json', 'zurich-vector');
testTileJSON('/styles/test-style.json');
testTileJSON('/data/openmaptiles.json');
});

View File

@@ -7,14 +7,16 @@ before(function() {
console.log('global setup');
process.chdir('test_data');
var running = require('../src/server')({
config: 'config.json',
port: 8888
configPath: 'config.json',
port: 8888,
publicUrl: '/test/'
});
global.app = running.app;
global.server = running.server;
return running.startupPromise;
});
after(function() {
console.log('global teardown');
global.server.close(function() { console.log('Done'); });
global.server.close(function() { console.log('Done'); process.exit(); });
});

View File

@@ -12,7 +12,7 @@ var testStatic = function(prefix, q, format, status, scale, type, query) {
});
};
var prefix = 'bright';
var prefix = 'test-style';
describe('Static endpoints', function() {
describe('center-based', function() {
@@ -28,6 +28,8 @@ describe('Static endpoints', function() {
testStatic(prefix, '0,0,0/300x300', 'png', 200, 2);
testStatic(prefix, '0,0,0/300x300', 'png', 200, 3);
testStatic(prefix, '0,0,1.5/256x256', 'png', 200);
testStatic(prefix, '80,40,20/600x300', 'png', 200, 3);
testStatic(prefix, '8.5,40.5,20/300x150', 'png', 200, 3);
testStatic(prefix, '-8.5,-40.5,20/300x150', 'png', 200, 3);
@@ -48,7 +50,6 @@ describe('Static endpoints', function() {
testStatic(prefix, '0,0,0/256x256', 'png', 404, 1);
testStatic(prefix, '0,0,-1/256x256', 'png', 404);
testStatic(prefix, '0,0,1.5/256x256', 'png', 404);
testStatic(prefix, '0,0,0/256.5x256.5', 'png', 404);
testStatic(prefix, '0,0,0,/256x256', 'png', 404);

View File

@@ -8,27 +8,28 @@ var testIs = function(url, type, status) {
});
};
var prefix = 'bright';
var prefix = 'test-style';
describe('Styles', function() {
describe('/styles/' + prefix + '.json is valid style', function() {
testIs('/styles/' + prefix + '.json', /application\/json/);
describe('/styles/' + prefix + '/style.json is valid style', function() {
testIs('/styles/' + prefix + '/style.json', /application\/json/);
it('contains expected properties', function(done) {
supertest(app)
.get('/styles/' + prefix + '.json')
.get('/styles/' + prefix + '/style.json')
.expect(function(res) {
res.body.version.should.equal(8);
res.body.name.should.be.String();
res.body.sources.should.be.Object();
res.body.glyphs.should.be.String();
res.body.sprite.should.be.String();
res.body.sprite.should.equal('/test/styles/test-style/sprite');
res.body.layers.should.be.Array();
}).end(done);
});
});
describe('/styles/streets.json is not served', function() {
testIs('/styles/streets.json', /./, 404);
describe('/styles/streets/style.json is not served', function() {
testIs('/styles/streets/style.json', /./, 404);
});
describe('/styles/' + prefix + '/sprite[@2x].{format}', function() {

View File

@@ -8,7 +8,7 @@ var testTile = function(prefix, z, x, y, status) {
});
};
var prefix = 'zurich-vector';
var prefix = 'openmaptiles';
describe('Vector tiles', function() {
describe('existing tiles', function() {
@@ -23,6 +23,6 @@ describe('Vector tiles', function() {
testTile(prefix, 0, 1, 0, 404);
testTile(prefix, 0, 0, 1, 404);
testTile(prefix, 14, 0, 0, 404); // non existent tile
testTile(prefix, 14, 0, 0, 204); // non existent tile
});
});

View File

@@ -1,6 +1,6 @@
var testTile = function(prefix, z, x, y, format, status, scale, type) {
if (scale) y += '@' + scale + 'x';
var path = '/styles/' + prefix + '/rendered/' + z + '/' + x + '/' + y + '.' + format;
var path = '/styles/' + prefix + '/' + z + '/' + x + '/' + y + '.' + format;
it(path + ' returns ' + status, function(done) {
var test = supertest(app).get(path);
test.expect(status);
@@ -9,7 +9,7 @@ var testTile = function(prefix, z, x, y, format, status, scale, type) {
});
};
var prefix = 'bright';
var prefix = 'test-style';
describe('Raster tiles', function() {
describe('valid requests', function() {
@@ -39,7 +39,7 @@ describe('Raster tiles', function() {
testTile(prefix, 0, 0, 0, 'pbf', 400);
testTile(prefix, 0, 0, 0, 'png', 404, 1);
testTile(prefix, 0, 0, 0, 'png', 404, 4);
testTile(prefix, 0, 0, 0, 'png', 404, 5);
//testTile('hybrid', 0, 0, 0, 'png', 404); //TODO: test this
});