[Unison-hackers] [unison-svn] r355 - in trunk/src: . system ubase
vouillon@seas.upenn.edu
vouillon at seas.upenn.edu
Wed Jun 17 10:42:13 EDT 2009
Author: vouillon
Date: 2009-06-17 10:42:07 -0400 (Wed, 17 Jun 2009)
New Revision: 355
Modified:
trunk/src/BUGS.txt
trunk/src/RECENTNEWS
trunk/src/copy.ml
trunk/src/mkProjectInfo.ml
trunk/src/name.ml
trunk/src/stasher.ml
trunk/src/system/system_win.ml
trunk/src/system/system_win_stubs.c
trunk/src/transport.ml
trunk/src/ubase/util.ml
trunk/src/uicommon.ml
trunk/src/uigtk2.ml
trunk/src/unicode.ml
trunk/src/unicode.mli
trunk/src/unicode_tables.ml
trunk/src/update.ml
trunk/src/uutil.ml
Log:
* Use a better file name for keeping a copy of an incorrectly
transferred file. In particular, this is now a temp filename, and
Unison will not try to propagate it next time it is run.
* In function Stasher.backup, use Fspath.findWorkingDir to find the
right file to rename or delete, possibly following symlinks.
* Uigtk2: relabelled "Restart" button to "Rescan"
* Uigtk2: performance improvements
* Don't get the home directory from environment variable HOME under
Windows (except for Cygwin binaries): we don't want the behavior of
Unison to depends on whether it is run from a Cygwin shell (where
HOME is set) or in any other way (where HOME is usually not set).
* Unicode normalization: put characters in canonical order
* Fixed recently introduced bug in Update.postCommitArchive
* Uicommon: always reparse the command line when loading a profile
(not just the first time)
Modified: trunk/src/BUGS.txt
===================================================================
--- trunk/src/BUGS.txt 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/BUGS.txt 2009-06-17 14:42:07 UTC (rev 355)
@@ -15,22 +15,6 @@
SERIOUS
=======
-[June 2006, Schmitt and Newton]
- Alan said: I realized yesterday that I had xferbycopying set to false, so I
- turned it back on. However some automatic unison synchronization
- failed last night, with the message:
- > Shortcut: copying 1148507176.26619_0.top.inrialpes.fr:2,ST from
- > local file Maildir/.Caml/cur/1148507176.26619_0.top.inrialpes.fr:2,
- > Uncaught exception Not_found
- > Fatal error: Lost connection with the server
- Ryan Newton later sent BCP a debug trace showing this happening, but it
- did not elucidate the problem. For the moment, I've (BCP) just protected
- the tryCopyMovedFile function with a call to convertUnixErrorsToTransient,
- which should help if the Not_found is being raised from there. (In the
- debug trace, we see "success" printed by this function and then the
- crash. An obvious culprit is the call to Xferhint.insert, but my reading
- of the code is that this should not fail.)
-
[June 2006, Jim]
By the way, there is a bug if you are doing a merge and
are propagating times, the times of the merged file end
@@ -39,44 +23,6 @@
the times...
==> Best to make them both equal to the time of merging
-[May 2006, Schmitt]
- In presence of path that cannot be propagated, Unison may have a fatal
- error "archives not identical".
- Here is the setting:
- replica A:
- tmp/ubug/foo
- tmp/toto/foo
- replica B:
- tmp/
- profile:
- root = /Users/schmitta/tmp
- root = ssh://beauty/tmp
- # common options
- sshargs = -C
- servercmd = bin/unison
- path = ubug/foo
- path = toto
- The run: (* message that there are no archive *)
- local beauty.local
- error ubug/foo
- path ubug/foo is not valid because ubug is not a directory in one of the replicas
- dir ----> toto [f]
- Proceed with propagating updates? [] y
- Propagating updates
- UNISON 2.19.2 started propagating changes at 17:40:47 on 30 May 2006
- [ERROR] Skipping ubug/foo
- path ubug/foo is not valid because ubug is not a directory in one of the replicas
- [BGN] Copying toto
- from /Users/schmitta/tmp
- to //beauty.local//Users/schmitta/tmp
- [END] Copying toto
- UNISON 2.19.2 finished propagating changes at 17:40:47 on 30 May 2006
- Saving synchronizer state
- Dumping archives to ~/unison.dump on both hosts
- Finished dumping archives
- Fatal error: Internal error: New archives are not identical.
- Retaining original archives. Please run Unison again to bring them up to date.
- ===> This one was recently [March 07] fixed by Jerome
[July 2002, Findler]
I get this message from unison:
@@ -104,24 +50,6 @@
===> We should use some more information to make sure the archive names are
unique enough. But what, exactly?
-[Aug 2002] OSX native filesystems are case insensitive, like Windows, but
-Unison does not currently recognize this. A workaround is to set the
-'ignorecase' preference explicitly to true.
-
-[July 2002] Unison does not understand Windows' non-Latin character set
- encodings. For some other character sets (e.g. European characters
- such as u-umlaut), only the display is affected. For character sets
- that use multi-byte encoding schemes (e.g. Japanese), Unison can
- actually get confused and synchronize incorrectly. (One case where
- this can happen is if the second byte of a two-byte character is
- actually a slash!)
- ==> This would be hard to fix, given OCaml's current poor support
- for localization. Jacques Garrigue made some suggestions (bcp
- has them in a mail message) that might be the basis for looking
- at this if someone is really motivated, but they look like real
- work.
- ==> The right think to do is to use the Windows Unicode API
-
[APril 2002, Jason Eisner] Recently I found an aliasing problem that may
endanger Unison's semantics.
--
@@ -138,12 +66,6 @@
separate information for the two names in the archive files.
[A long example is in a mailmessage in BCP's files]
-[April 2002] File times are reported incorrectly under Win32 after a
- switch to/from daylight saving time. Here is a link, to shed some
- light on why this might be happening:
- http://www.codeproject.com/datetime/dstbugs.asp
- FIXED (a difference of exactly one hour is ignored)
-
starting Unison on two non-existent local directories leads to an
assertion failure in path.ml
@@ -159,59 +81,6 @@
I use Unison on two XP Professional machines, German versions, with the
simple tcp connection.
-Andy Starrer [Aug 2002]
- After connecting to server and trying to do first original sync
- with empty client dir, the server searches a while and then shows a dialog:
- --
- Uncaught exception File "/usr/ports/net/unison/work/unison-2.9.1/path.ml,
- line 0, characters 1785-1797: Assertion failed
- --
- using an awk line & char numbering print,
- these char #s in path.ml fall on the "assert false" on line 69
- (first line of file shows char count of 0)
- --
- 66 1707 let parent path =
- 67 1725 match rtl path with
- 68 1747 RTL(_::p) -> RTL(p)
- 69 1771 | RTL [] -> assert false
- 70 1798 | LTR _ -> assert false
- --
- ===> Who is calling parent on an empty path???
-
-Another report of the same (?) bug by Ruslan Ermolov:
- Attempting to symlink ~/.unison/backup to
- another (real) directory results in the following uncaught exception:
- --
- : $ ls -ld ~/.unison/*backup
- : lrwx------ 1 ru sunbay 10 Aug 6 15:22 /home/ru/.unison/backup -> realbackup
- : drwx------ 2 ru sunbay 512 Aug 6 15:22 /home/ru/.unison/realbackup
- : $ unison -batch -backup='Name *' /tmp/replica1 /tmp/replica2
- : Contacting server...
- : Looking for changes
- : Reconciling changes
- :
- : replica1 replica2
- : deleted ----> a
- : replica1 : deleted
- : replica2 : unchanged file
- : modified at 15:22 on 6 Aug, 2002 size 0 rw-------
- : Propagating updates
- :
- :
- : UNISON started propagating changes at 15:26:04 on 06 Aug 2002
- : [BGN] Deleting a
- : from /tmp/replica2
- : Uncaught exception File "/usr/ports/net/unison/work/unison-2.9.1/path.ml", line 0, characters 1785-1797: Assertion failed
- --
- OTOH, Unison follows ~/.unison if it's symlinked, and I use this feature
- when using SSH as a transport.
-
-Jamey Leifer [July 2002]
- * [graphic ui, bug] If one of the files "has unknown type" (i.e. is a
- system file), then pressing "f" (i.e. "Retry on unsynchronised items")
- results in an error window and unison quiting. To me "Retry" implies
- less drastic behaviour. It should just report errors as normal.
-
BCP [May 2002]
The "rescan paths that failed previous sync" function misses some files.
E.g., if a directory has failed to transfer because the disk ran out of
@@ -237,50 +106,13 @@
remote myfile as usual, handling clock skew as for any other propagation.
Other file properties should probably NOT be propagated.
-Unison should report a better error message when a modified file slips
- through the fast check and is later detected during transport.
-
-I got this
- C:\CygWin\home\kmoerder>unison a ssh://moerder/a
- kmoerder at moerder's password:
- C:\CygWin\home\kmoerder>Fatal error: Error in grabbing:
- Broken pipe [read()]
-
-This should be caught and reported cleanly:
- ~/.unison> unison ~/.unison/mail
- Uncaught exception Invalid_argument("Os.string2name('/home/bcpierce/.unison/mail.prf' contains a '/')")
-
-dworley:
- Unison sometimes aborts if one of the files it is synchronizing
- changes during the run. Most of the time, it can step over the
- file correctly, but sometimes it bails out. This can be a problem
- in an environment where you cannot guarantee that the two
- filesystems are stable during the Unison run.
- ==> More information needed
-
Karl Moerder:
- The statusdepth doesn't seem to change anything (like it is being
- ignored). I set it to 2 ("statusdepth = 2" in my .prf file) and got the
- same display as the default (setting of 1). I didn't check if the
- default really acted like 1, so it could be that I need to set it to a
- higher value. I can play with it more later if you need me to.
-
-Karl Moerder:
The synchronization of modification times does not work on directories
(WinNT folders) or on read-only files. I found this when I tried to
synchronize mod times on an otherwise synchronized tree. It failed
gracefully on these. The "[click..." message is a nice touch.
==> [Nothing we can do for read-only files; need to patch ocaml for
directories...]
-
-Bob H. reported an abnormal failure during transport that apparently led to
- an immediate, dirty termination instead of a clean failure, trapped and
- properly displayed in the user interface:
- - on Windows (of course)
- - Unison was trying to propagate a file onto a file that was open
- in another application; in Windows, this causes an error
- - the error was apparently not caught in the usual way, but instead
- terminated Unison, leaving a DANGER.README file
"After I synchronized two directories I created a new profile, which
defaulted to the same directories. I synchronized again (no changes,
@@ -298,12 +130,6 @@
The "Diff" window [under Windows] sometimes shows nothing. Does this
arise from a missing "Diff" program? We should detect this case!
-"Hanrahan, Donald" <dhanrahan at logicon.com>
- Finally, I discovered that a preceeding "/" in a "defaultpath" entry
- (e.g., defaultpath=/myshare/myfolder
- vs. defaultpath=myshare/myfolder) seems to cause an unhandled
- exception (Invalid_argument <"os.string2path">) to occur.
-
---------------------------------------------------------------------------
COSMETIC
========
Modified: trunk/src/RECENTNEWS
===================================================================
--- trunk/src/RECENTNEWS 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/RECENTNEWS 2009-06-17 14:42:07 UTC (rev 355)
@@ -1,5 +1,24 @@
CHANGES FROM VERSION 2.35.-17
+* Use a better file name for keeping a copy of an incorrectly
+ transferred file. In particular, this is now a temp filename, and
+ Unison will not try to propagate it next time it is run.
+* In function Stasher.backup, use Fspath.findWorkingDir to find the
+ right file to rename or delete, possibly following symlinks.
+* Uigtk2: relabelled "Restart" button to "Rescan"
+* Uigtk2: performance improvements
+* Don't get the home directory from environment variable HOME under
+ Windows (except for Cygwin binaries): we don't want the behavior of
+ Unison to depends on whether it is run from a Cygwin shell (where
+ HOME is set) or in any other way (where HOME is usually not set).
+* Unicode normalization: put characters in canonical order
+* Fixed recently introduced bug in Update.postCommitArchive
+* Uicommon: always reparse the command line when loading a profile
+ (not just the first time)
+
+-------------------------------
+CHANGES FROM VERSION 2.35.-17
+
* Properly deals with non-conformant AppleDouble files produced by Mac
OS X; for compatibility, produce AppleDouble files with the same
structure as the one produced by Mac OS X.
Modified: trunk/src/copy.ml
===================================================================
--- trunk/src/copy.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/copy.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -123,18 +123,24 @@
(* Paranoid check: recompute the transferred file's digest to match it
with the archive's *)
-let paranoidCheck fspathTo pathTo desc fp ress =
+let paranoidCheck fspathTo pathTo realPathTo desc fp ress =
let info = Fileinfo.get false fspathTo pathTo in
let fp' = Os.fingerprint fspathTo pathTo info in
if fp' <> fp then begin
- let savepath = Path.addSuffixToFinalName pathTo "-bad" in
+ let savepath =
+ Os.tempPath ~fresh:true fspathTo
+ (match Path.deconstructRev realPathTo with
+ Some (nm, _) -> Path.addSuffixToFinalName
+ (Path.child Path.empty nm) "-bad"
+ | None -> Path.fromString "bad")
+ in
Os.rename "save temp" fspathTo pathTo fspathTo savepath;
Lwt.return (Failure (Printf.sprintf
"The file %s was incorrectly transferred (fingerprint mismatch in %s) \
-- temp file saved as %s"
(Path.toString pathTo)
(Os.reasonForFingerprintMismatch fp fp')
- (Path.toString savepath)))
+ (Fspath.toDebugString (Fspath.concat fspathTo savepath))))
end else
Lwt.return (Success info)
@@ -205,11 +211,11 @@
let localFile
fspathFrom pathFrom fspathTo pathTo realPathTo update desc ressLength ido =
- let use_id f = match ido with Some id -> f id | None -> () in
+(* let use_id f = match ido with Some id -> f id | None -> () in*)
Util.convertUnixErrorsToTransient
"copying locally"
(fun () ->
- use_id (fun id -> Uutil.showProgress id Uutil.Filesize.zero "l");
+(* use_id (fun id -> Uutil.showProgress id Uutil.Filesize.zero "l");*)
debug (fun () ->
Util.msg "Copy.localFile %s / %s to %s / %s\n"
(Fspath.toDebugString fspathFrom) (Path.toString pathFrom)
@@ -485,7 +491,7 @@
Lwt.return ()
end >>= fun () ->
setFileinfo fspathTo pathTo realPathTo update desc;
- paranoidCheck fspathTo pathTo desc fp ress
+ paranoidCheck fspathTo pathTo realPathTo desc fp ress
let reallyTransferFile
connFrom fspathFrom pathFrom fspathTo pathTo realPathTo
@@ -738,7 +744,7 @@
localFile
fspathFrom pathFrom fspathTo pathTo realPathTo
update desc (Osx.ressLength ress) (Some id);
- paranoidCheck fspathTo pathTo desc fp ress
+ paranoidCheck fspathTo pathTo realPathTo desc fp ress
| _ ->
transferFile
rootFrom pathFrom rootTo fspathTo pathTo realPathTo
Modified: trunk/src/mkProjectInfo.ml
===================================================================
--- trunk/src/mkProjectInfo.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/mkProjectInfo.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -163,3 +163,4 @@
+
Modified: trunk/src/name.ml
===================================================================
--- trunk/src/name.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/name.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -49,8 +49,11 @@
Rx.case_insensitive
(Rx.rx
"(.*[\000-\031<>:\"/\\|?*].*)|\
- ((con|prn|aux|nul|com[1-9]|lpt[1-9])(\\.[^.]*)?)|\
+ ((con|prn|aux|nul|com[1-9]|lpt[1-9])(\\..*)?)|\
(.*[. ])")
+let badWindowsFilenameRelaxedRx =
+ Rx.case_insensitive (Rx.rx "(con|prn|aux|nul|com[1-9]|lpt[1-9])(\\..*)?")
+
(* FIX: should also check for a max filename length, not sure how much *)
let badFile s = Rx.match_string badWindowsFilenameRx s
Modified: trunk/src/stasher.ml
===================================================================
--- trunk/src/stasher.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/stasher.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -366,10 +366,11 @@
(Fspath.toDebugString fspath)
(Path.toString path));
Util.convertUnixErrorsToTransient "backup" (fun () ->
+ let (workingDir,realPath) = Fspath.findWorkingDir fspath path in
let disposeIfNeeded() =
if finalDisposition = `AndRemove then
- Os.delete fspath path in
- if not (Os.exists fspath path) then
+ Os.delete workingDir realPath in
+ if not (Os.exists workingDir realPath) then
debug (fun () -> Util.msg
"File %s in %s does not exist, so no need to back up\n"
(Path.toString path) (Fspath.toDebugString fspath))
@@ -410,7 +411,7 @@
disposeIfNeeded() in
if finalDisposition = `AndRemove then
try
- Os.rename "backup" fspath path backRoot backPath
+ Os.rename "backup" workingDir realPath backRoot backPath
with Util.Transient _ ->
debug (fun () -> Util.msg "Rename failed -- copying instead\n");
byCopying()
Modified: trunk/src/system/system_win.ml
===================================================================
--- trunk/src/system/system_win.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/system/system_win.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -49,10 +49,11 @@
else
f
-let utf16 s = Unicode.to_utf_16 s
-let utf8 s = Unicode.from_utf_16 s
-let path16 = utf16
-let epath f = utf16 (extendedPath f)
+let utf8 = Unicode.from_utf_16
+let utf16 = Unicode.to_utf_16
+let path8 = Unicode.from_utf_16(*_filename*)
+let path16 = Unicode.to_utf_16(*_filename*)
+let epath f = path16 (extendedPath f)
let sys_error e =
match e with
@@ -117,7 +118,7 @@
with e -> sys_error e
let getcwd () =
try
- utf8 (getcwd_impl ())
+ path8 (getcwd_impl ())
with e -> sys_error e
let badFileRx = Rx.rx ".*[?*].*"
@@ -137,8 +138,8 @@
let d = du d in
match d.entry_read with
Dir_empty -> raise End_of_file
- | Dir_read name -> d.entry_read <- Dir_toread; utf8 name
- | Dir_toread -> utf8 (findnext d.handle)
+ | Dir_read name -> d.entry_read <- Dir_toread; path8 name
+ | Dir_toread -> path8 (findnext d.handle)
let closedir d =
let d = du d in
match d.entry_read with
Modified: trunk/src/system/system_win_stubs.c
===================================================================
--- trunk/src/system/system_win_stubs.c 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/system/system_win_stubs.c 2009-06-17 14:42:07 UTC (rev 355)
@@ -353,7 +353,7 @@
h = FindFirstFileW((LPCWSTR) String_val(name),&fileinfo);
if (h == INVALID_HANDLE_VALUE) {
DWORD err = GetLastError();
- if (err == ERROR_NO_MORE_FILES)
+ if ((err == ERROR_NO_MORE_FILES) || (err == ERROR_FILE_NOT_FOUND))
raise_end_of_file();
else {
win32_maperr(err);
Modified: trunk/src/transport.ml
===================================================================
--- trunk/src/transport.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/transport.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -175,24 +175,28 @@
let logStart () =
Abort.reset ();
- let tm = Util.localtime (Util.time()) in
+ let t = Unix.gettimeofday () in
+ let tm = Util.localtime t in
let m =
Printf.sprintf
- "%s%s started propagating changes at %02d:%02d:%02d on %02d %s %04d\n"
+ "%s%s started propagating changes at %02d:%02d:%02d.%02d on %02d %s %04d\n"
(if Prefs.read Trace.terse || Prefs.read Globals.batch then "" else "\n\n")
(String.uppercase Uutil.myNameAndVersion)
tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+ (min 99 (truncate (mod_float t 1. *. 100.)))
tm.Unix.tm_mday (Util.monthname tm.Unix.tm_mon)
(tm.Unix.tm_year+1900) in
Trace.logverbose m
let logFinish () =
- let tm = Util.localtime (Util.time()) in
+ let t = Unix.gettimeofday () in
+ let tm = Util.localtime t in
let m =
Printf.sprintf
- "%s finished propagating changes at %02d:%02d:%02d on %02d %s %04d\n%s"
+ "%s finished propagating changes at %02d:%02d:%02d.%02d on %02d %s %04d\n%s"
(String.uppercase Uutil.myNameAndVersion)
tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+ (min 99 (truncate (mod_float t 1. *. 100.)))
tm.Unix.tm_mday (Util.monthname tm.Unix.tm_mon)
(tm.Unix.tm_year+1900)
(if Prefs.read Trace.terse || Prefs.read Globals.batch then "" else "\n\n") in
Modified: trunk/src/ubase/util.ml
===================================================================
--- trunk/src/ubase/util.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/ubase/util.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -428,8 +428,12 @@
(if (osType = `Unix) || isCygwin then
safeGetenv "HOME"
else if osType = `Win32 then
+(*We don't want the behavior of Unison to depends on whether it is run
+ from a Cygwin shell (where HOME is set) or in any other way (where
+ HOME is usually not set)
try System.getenv "HOME" (* Windows 9x with Cygwin HOME set *)
with Not_found ->
+*)
try System.getenv "USERPROFILE" (* Windows NT/2K standard *)
with Not_found ->
try System.getenv "UNISON" (* Use UNISON dir if it is set *)
Modified: trunk/src/uicommon.ml
===================================================================
--- trunk/src/uicommon.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/uicommon.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -505,7 +505,8 @@
end;
(* Parse the command line. This will override settings from the profile. *)
- if !firstTime then begin
+ (* JV (6/09): always reparse the command line *)
+ if true (*!firstTime*) then begin
debug (fun() -> Util.msg "about to parse command line");
Prefs.parseCmdLine usageMsg;
end;
Modified: trunk/src/uigtk2.ml
===================================================================
--- trunk/src/uigtk2.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/uigtk2.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -147,13 +147,19 @@
let sync_action = ref None
-let gtk_sync () =
- begin match !sync_action with
- Some f -> f ()
- | None -> ()
- end;
- while Glib.Main.iteration false do () done
+let last = ref (0.)
+let gtk_sync forced =
+ let t = Unix.gettimeofday () in
+ if !last = 0. || forced || t -. !last > 0.05 then begin
+ last := t;
+ begin match !sync_action with
+ Some f -> f ()
+ | None -> ()
+ end;
+ while Glib.Main.iteration false do () done
+ end
+
(**********************************************************************
CHARACTER SET TRANSCODING
***********************************************************************)
@@ -810,7 +816,7 @@
let res = t#run () in
let pwd = passwordE#text in
t#destroy (); releaseFocus ();
- gtk_sync ();
+ gtk_sync true;
begin match res with
`DELETE_EVENT | `QUIT -> safeExit (); ""
| `OK -> pwd
@@ -1211,7 +1217,7 @@
let grAction = ref [] in
let grDiff = ref [] in
let grGo = ref [] in
- let grRestart = ref [] in
+ let grRescan = ref [] in
let grAdd gr w = gr := w#misc::!gr in
let grSet gr st = Safelist.iter (fun x -> x#set_sensitive st) !gr in
@@ -1410,13 +1416,13 @@
let v =
float row /. float (mainWindow#rows + 1) *. (upper-.lower) +. lower
in
- adj#set_value (min v (upper -. adj#page_size))
+ adj#set_value (min v (upper -. adj#page_size));
end in
let makeFirstUnfinishedVisible pRiInFocus =
let im = Array.length !theState in
let rec find i =
- if i >= im then () else
+ if i >= im then makeRowVisible im else
match pRiInFocus (!theState.(i).ri), !theState.(i).whatHappened with
true, None -> makeRowVisible i
| _ -> find (i+1) in
@@ -1463,7 +1469,7 @@
if !progressBarPulse then progressBar#pulse ();
ignore (statusContext#push (transcode m));
(* Force message to be displayed immediately *)
- gtk_sync ()
+ gtk_sync false
in
let formatStatus major minor = (Util.padto 30 (major ^ " ")) ^ minor in
@@ -1612,19 +1618,32 @@
if !current = Some i then updateDetails ();
updateButtons () in
+ let fastRedisplay i =
+ let (r1, action, r2, status, path) = columnsOf i in
+ displayStatusIcon i status;
+ if status = "failed" then begin
+ mainWindow#set_cell
+ ~text:(transcodeFilename path ^
+ " [failed: click on this line for details]") i 4
+ end
+ in
+
let totalBytesToTransfer = ref Uutil.Filesize.zero in
let totalBytesTransferred = ref Uutil.Filesize.zero in
+ let lastFrac = ref 0. in
let displayGlobalProgress v =
- progressBar#set_fraction (max 0. (min 1. (v /. 100.)));
+ if v = 0. || abs_float (v -. !lastFrac) > 1. then begin
+ lastFrac := v;
+ progressBar#set_fraction (max 0. (min 1. (v /. 100.)))
+ end;
(*
if v > 0.5 then
progressBar#set_text (Util.percent2string v)
else
progressBar#set_text "";
*)
- (* Force message to be displayed immediately *)
- gtk_sync () in
+ in
let showGlobalProgress b =
(* Concatenate the new message *)
@@ -1660,9 +1679,10 @@
else Util.percent2string (Uutil.Filesize.percentageOfTotalSize b len) in
let dbg = if Trace.enabled "progress" then dbg ^ "/" else "" in
let newstatus = dbg ^ newstatus in
- mainWindow#set_cell ~text:newstatus i 3;
+ let oldstatus = mainWindow#cell_text i 3 in
+ if oldstatus <> newstatus then mainWindow#set_cell ~text:newstatus i 3;
showGlobalProgress bytes;
- gtk_sync ();
+ gtk_sync false;
begin match item.ri.replicas with
Different (_, _, dir, _) ->
begin match !dir with
@@ -1727,7 +1747,7 @@
grSet grAction false;
grSet grDiff false;
grSet grGo false;
- grSet grRestart false;
+ grSet grRescan false;
mainWindow#clear();
detailsWindow#buffer#set_text "";
@@ -1764,7 +1784,7 @@
displayMain();
progressBarPulse := false; sync_action := None; displayGlobalProgress 0.;
grSet grGo (Array.length !theState > 0);
- grSet grRestart true;
+ grSet grRescan true;
if Prefs.read Globals.confirmBigDeletes then begin
if dangerousPaths <> [] then begin
Prefs.set Globals.batch false;
@@ -1810,7 +1830,7 @@
"Permanently ignore files with this name (in any dir)");
(*
- grAdd grRestart
+ grAdd grRescan
(ignoreMenu#add_item ~callback:
(fun () -> getLock ignoreDialog) "Edit ignore patterns");
*)
@@ -1853,7 +1873,7 @@
grSet grAction false;
grSet grDiff false;
grSet grGo false;
- grSet grRestart false;
+ grSet grRescan false;
Trace.status "Propagating changes";
Transport.logStart ();
@@ -1901,9 +1921,13 @@
fail e)
>>= (fun res ->
theSI.whatHappened <- Some (res, !textDetailed);
- redisplay i;
- makeFirstUnfinishedVisible pRiThisRound;
- gtk_sync ();
+ fastRedisplay i;
+ sync_action :=
+ Some
+ (fun () ->
+ makeFirstUnfinishedVisible pRiThisRound;
+ sync_action := None);
+ gtk_sync false;
return ())
| Some _ ->
return () (* Already processed this one (e.g. merged it) *)
@@ -1922,6 +1946,7 @@
Trace.showTimer t;
Trace.status "Updating synchronizer state";
let t = Trace.startTimer "Updating synchronizer state" in
+ gtk_sync true;
Update.commitUpdates();
Trace.showTimer t;
@@ -1946,7 +1971,7 @@
failures (if failures=""||skipped="" then "" else ", ") skipped);
displayGlobalProgress 0.;
- grSet grRestart true
+ grSet grRescan true
end in
(*********************************************************************
@@ -1971,9 +1996,22 @@
getLock synchronize) ());
(*********************************************************************
- Restart button
+ Rescan button
*********************************************************************)
- let detectCmdName = "Restart" in
+ let loadProfile p =
+ debug (fun()-> Util.msg "Loading profile %s..." p);
+ Uicommon.initPrefs p displayWaitMessage getFirstRoot getSecondRoot
+ termInteract;
+ displayNewProfileLabel p;
+ setMainWindowColumnHeaders()
+ in
+
+ let reloadProfile () =
+ match !Prefs.profileName with
+ None -> ()
+ | Some(n) -> loadProfile n in
+
+ let detectCmdName = "Rescan" in
let detectCmd () =
getLock detectUpdatesAndReconcile;
updateDetails ();
@@ -1982,11 +2020,11 @@
end
in
(* actionBar#insert_space ();*)
- grAdd grRestart
+ grAdd grRescan
(actionBar#insert_button ~text:detectCmdName
~icon:((GMisc.image ~stock:`REFRESH ())#coerce)
~tooltip:"Check for updates"
- ~callback: detectCmd ());
+ ~callback: (fun () -> reloadProfile(); detectCmd()) ());
(*********************************************************************
Buttons for <--, M, -->, Skip
@@ -2230,37 +2268,24 @@
Synchronization menu
*********************************************************************)
- let loadProfile p =
- debug (fun()-> Util.msg "Loading profile %s..." p);
- Uicommon.initPrefs p displayWaitMessage getFirstRoot getSecondRoot
- termInteract;
- displayNewProfileLabel p;
- setMainWindowColumnHeaders()
- in
-
- let reloadProfile () =
- match !Prefs.profileName with
- None -> ()
- | Some(n) -> loadProfile n in
-
grAdd grGo
(fileMenu#add_image_item ~key:GdkKeysyms._g
~image:(GMisc.image ~stock:`EXECUTE ~icon_size:`MENU () :> GObj.widget)
~callback:(fun () -> getLock synchronize)
~label:"Go" ());
- grAdd grRestart
+ grAdd grRescan
(fileMenu#add_image_item ~key:GdkKeysyms._r
~image:(GMisc.image ~stock:`REFRESH ~icon_size:`MENU () :> GObj.widget)
~callback:(fun () -> reloadProfile(); detectCmd())
~label:detectCmdName ());
- grAdd grRestart
+ grAdd grRescan
(fileMenu#add_item ~key:GdkKeysyms._a
~callback:(fun () ->
reloadProfile();
Prefs.set Globals.batch true;
detectCmd())
"Detect updates and proceed (without waiting)");
- grAdd grRestart
+ grAdd grRescan
(fileMenu#add_item ~key:GdkKeysyms._f
~callback:(
fun () ->
@@ -2282,7 +2307,7 @@
let failedindices = loop 0 [] in
let failedpaths =
Safelist.map (fun i -> !theState.(i).ri.path) failedindices in
- debug (fun()-> Util.msg "Restarting with paths = %s\n"
+ debug (fun()-> Util.msg "Rescaning with paths = %s\n"
(String.concat ", " (Safelist.map
(fun p -> "'"^(Path.toString p)^"'")
failedpaths)));
@@ -2294,7 +2319,7 @@
ignore (fileMenu#add_separator ());
- grAdd grRestart
+ grAdd grRescan
(fileMenu#add_image_item ~key:GdkKeysyms._p
~callback:(fun _ ->
match getProfile() with
@@ -2304,7 +2329,7 @@
~label:"Select a new profile from the profile dialog..." ());
let fastProf name key =
- grAdd grRestart
+ grAdd grRescan
(fileMenu#add_item ~key:key
~callback:(fun _ ->
if System.file_exists (Prefs.profilePathname name) then begin
@@ -2370,7 +2395,7 @@
grSet grAction false;
grSet grDiff false;
grSet grGo false;
- grSet grRestart false;
+ grSet grRescan false;
ignore (toplevelWindow#event#connect#delete ~callback:
(fun _ -> safeExit (); true));
@@ -2399,7 +2424,7 @@
(* Ask the Remote module to call us back at regular intervals during
long network operations. *)
let rec tick () =
- gtk_sync ();
+ gtk_sync true;
Lwt_unix.sleep 0.05 >>= tick
in
ignore_result (tick ());
Modified: trunk/src/unicode.ml
===================================================================
--- trunk/src/unicode.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/unicode.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -26,6 +26,809 @@
(****)
+let rec decode_char s i l =
+ if i = l then fail () else
+ let c = get s i in
+ if c < 0x80 then
+ cont s (i + 1) l c
+ else if c < 0xE0 then begin
+ (* 80 - 7FF *)
+ if c < 0xc2 || i + 1 >= l then fail () else
+ let c1 = get s (i + 1) in
+ if c1 land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 6 + c1 - 0x3080 in
+ cont s (i + 2) l v
+ end else if c < 0xF0 then begin
+ (* 800 - FFFF *)
+ if i + 2 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let c2 = get s (i + 2) in
+ if (c1 lor c2) land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in
+ if v < 0x800 then fail () else
+ cont s (i + 3) l v
+ end else begin
+ (* 10000 - 10FFFF *)
+ if i + 3 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let c2 = get s (i + 2) in
+ let c3 = get s (i + 3) in
+ if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in
+ if v < 0x10000 || v > 0x10ffff then fail () else
+ cont s (i + 4) l v
+ end
+
+and cont s i l v = (v, i)
+
+let encode_char s i l c =
+ if c < 0x80 then begin
+ if i >= l then fail () else begin
+ set s i c;
+ i + 1
+ end
+ end else if c < 0x800 then begin
+ if i + 1 >= l then fail () else begin
+ set s i (c lsr 6 + 0xC0);
+ set s (i + 1) (c land 0x3f + 0x80);
+ i + 2
+ end
+ end else if c < 0x10000 then begin
+ if i + 1 >= l then fail () else begin
+ set s i (c lsr 12 + 0xE0);
+ set s (i + 1) ((c lsr 6) land 0x3f + 0x80);
+ set s (i + 2) (c land 0x3f + 0x80);
+ i + 3
+ end
+ end else begin
+ if i + 1 >= l then fail () else begin
+ set s i (c lsr 18 + 0xF0);
+ set s (i + 1) ((c lsr 12) land 0x3f + 0x80);
+ set s (i + 2) ((c lsr 6) land 0x3f + 0x80);
+ set s (i + 3) (c land 0x3f + 0x80);
+ i + 4
+ end
+ end
+
+let rec prev_char s i =
+ let i = i - 1 in
+ if i < 0 then fail () else
+ if (get s i) land 0xc0 <> 0x80 then i else prev_char s i
+
+(****)
+
+let combining_property_bitmap = "\
+\x00\x00\x00\x01\x02\x03\x04\x05\
+\x00\x06\x07\x08\x09\x0A\x0B\x0C\
+\x0D\x00\x00\x00\x00\x00\x00\x0E\
+\x0F\x10\x00\x00\x00\x00\x00\x00\
+\x11\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x12\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x13\x00\x00\x14\x00\
+\xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\
+\xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\
+\xE6\xE6\xE6\xE6\xE6\xE8\xDC\xDC\
+\xDC\xDC\xE8\xD8\xDC\xDC\xDC\xDC\
+\xDC\xCA\xCA\xDC\xDC\xDC\xDC\xCA\
+\xCA\xDC\xDC\xDC\xDC\xDC\xDC\xDC\
+\xDC\xDC\xDC\xDC\x01\x01\x01\x01\
+\x01\xDC\xDC\xDC\xDC\xE6\xE6\xE6\
+\xE6\xE6\xE6\xE6\xE6\xF0\xE6\xDC\
+\xDC\xDC\xE6\xE6\xE6\xDC\xDC\x00\
+\xE6\xE6\xE6\xDC\xDC\xDC\xDC\xE6\
+\x00\x00\x00\x00\x00\xEA\xEA\xE9\
+\xEA\xEA\xE9\xE6\xE6\xE6\xE6\xE6\
+\xE6\xE6\xE6\xE6\xE6\xE6\xE6\xE6\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\xE6\xE6\xE6\xE6\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\xDC\xE6\xE6\xE6\xE6\xDC\xE6\
+\xE6\xE6\xDE\xDC\xE6\xE6\xE6\xE6\
+\xE6\xE6\x00\xDC\xDC\xDC\xDC\xDC\
+\xE6\xE6\xDC\xE6\xE6\xDE\xE4\xE6\
+\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\
+\x12\x13\x00\x14\x15\x16\x00\x17\
+\x00\x18\x19\x00\xE6\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\xE6\xE6\xE6\xE6\xE6\xE6\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x1B\x1C\x1D\x1E\x1F\
+\x20\x21\x22\xE6\xE6\xDC\xDC\xE6\
+\xE6\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x23\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\xE6\xE6\
+\xE6\xE6\xE6\xE6\xE6\x00\x00\xE6\
+\xE6\xE6\xE6\xDC\xE6\x00\x00\xE6\
+\xE6\x00\xDC\xE6\xE6\xDC\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x24\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\xE6\xDC\xE6\xE6\xDC\xE6\xE6\xDC\
+\xDC\xDC\xE6\xDC\xDC\xE6\xDC\xE6\
+\xE6\xE6\xDC\xE6\xDC\xE6\xDC\xE6\
+\xDC\xE6\xE6\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\xE6\xDC\xE6\xE6\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x54\x5B\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x07\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x09\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x09\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x67\x67\x09\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x6B\x6B\x6B\x6B\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x76\x76\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x7A\x7A\x7A\x7A\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\xDC\xDC\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\xDC\x00\xDC\
+\x00\xD8\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x81\x82\x00\x84\x00\x00\x00\
+\x00\x00\x82\x82\x82\x82\x00\x00\
+\x82\x00\xE6\xE6\x09\x00\xE6\xE6\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\xDC\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x07\
+\x00\x09\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x09\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x09\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x09\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\xE6\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\xE4\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\xDE\xE6\xDC\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\xE6\xE6\x01\x01\xE6\xE6\xE6\xE6\
+\x01\x01\x01\xE6\xE6\x00\x00\x00\
+\x00\xE6\x00\x00\x00\x01\x01\xE6\
+\xDC\xE6\x01\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\xDA\xE4\xE8\xDE\xE0\xE0\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x08\x08\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x1A\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\xE6\xE6\xE6\xE6\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00"
+
+let combining_class c =
+ if c > 0xffff then 0 else
+ let v = get combining_property_bitmap (c lsr 8) in
+ if v = 0 then 0 else
+ get combining_property_bitmap (v lsl 8 + c land 0xff)
+
+let rec find_loc s i l p =
+ if i = 0 then i else
+ let i' = prev_char s i in
+ let (v, _) = decode_char s i' l in
+ let p' = combining_class v in
+ if p' <= p then i else
+ find_loc s i' l p
+
+let rec scan s i l p =
+ if i < l then begin
+ let c = get s i in
+ if c < 0x80 then
+ scan s (i + 1) l 0
+ else if c < 0xE0 then begin
+ (* 80 - 7FF *)
+ if i + 1 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let v = c lsl 6 + c1 - 0x3080 in
+ cont s i l (i + 2) p v
+ end else if c < 0xF0 then begin
+ (* 800 - FFFF *)
+ if i + 2 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let c2 = get s (i + 2) in
+ let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in
+ cont s i l (i + 3) p v
+ end else begin
+ (* 10000 - 10FFFF *)
+ if i + 3 >= l then fail () else
+ scan s (i + 4) l 0
+ end
+ end
+
+and cont s i l j p v =
+ let p' = combining_class v in
+ if p' = 0 || p <= p' then
+ scan s j l p'
+ else begin
+ (* move char to the right location *)
+ let k = find_loc s i l p' in
+ let d = j - i in
+ let s' = String.sub s i d in
+ String.blit s k s (k + d) (i - k);
+ String.blit s' 0 s k d;
+ scan s j l p
+ end
+
+let order s =
+ scan s 0 (String.length s) 0
+
+(****)
+
let hangul_sbase = 0xAC00
let hangul_lbase = 0x1100
let hangul_vbase = 0x1161
@@ -128,7 +931,10 @@
let normalize s =
let l = String.length s in
let s' = String.create (3 * l) in
- try norm s 0 l s' 0 with Invalid -> s
+ try
+ let s' = norm s 0 l s' 0 in order s'; s'
+ with Invalid ->
+ s
(****)
@@ -152,77 +958,6 @@
(****)
-let rec decode_char s i l =
- if i = l then fail () else
- let c = get s i in
- if c < 0x80 then
- cont s (i + 1) l c
- else if c < 0xE0 then begin
- (* 80 - 7FF *)
- if c < 0xc2 || i + 1 >= l then fail () else
- let c1 = get s (i + 1) in
- if c1 land 0xc0 <> 0x80 then fail () else
- let v = c lsl 6 + c1 - 0x3080 in
- cont s (i + 2) l v
- end else if c < 0xF0 then begin
- (* 800 - FFFF *)
- if i + 2 >= l then fail () else
- let c1 = get s (i + 1) in
- let c2 = get s (i + 2) in
- if (c1 lor c2) land 0xc0 <> 0x80 then fail () else
- let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in
- if v < 0x800 then fail () else
- cont s (i + 3) l v
- end else begin
- (* 10000 - 10FFFF *)
- if i + 3 >= l then fail () else
- let c1 = get s (i + 1) in
- let c2 = get s (i + 2) in
- let c3 = get s (i + 3) in
- if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else
- let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in
- if v < 0x10000 || v > 0x10ffff then fail () else
- cont s (i + 4) l v
- end
-
-and cont s i l v = (v, i)
-
-let encode_char s i l c =
- if c < 0x80 then begin
- if i >= l then fail () else begin
- set s i c;
- i + 1
- end
- end else if c < 0x800 then begin
- if i + 1 >= l then fail () else begin
- set s i (c lsr 6 + 0xC0);
- set s (i + 1) (c land 0x3f + 0x80);
- i + 2
- end
- end else if c < 0x10000 then begin
- if i + 1 >= l then fail () else begin
- set s i (c lsr 12 + 0xE0);
- set s (i + 1) ((c lsr 6) land 0x3f + 0x80);
- set s (i + 2) (c land 0x3f + 0x80);
- i + 3
- end
- end else begin
- if i + 1 >= l then fail () else begin
- set s i (c lsr 18 + 0xF0);
- set s (i + 1) ((c lsr 12) land 0x3f + 0x80);
- set s (i + 2) ((c lsr 6) land 0x3f + 0x80);
- set s (i + 3) (c land 0x3f + 0x80);
- i + 4
- end
- end
-
-let rec prev_char s i =
- let i = i - 1 in
- if i < 0 then fail () else
- if (get s i) land 0xc0 <> 0x80 then i else prev_char s i
-
-(****)
-
let uniCharPrecompSourceTable = [|
0x00000300; 0x00540000; 0x00000301; 0x00750054;
0x00000302; 0x002000C9; 0x00000303; 0x001C00E9;
@@ -772,27 +1507,101 @@
if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else
let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in
if v < 0x10000 || v > 0x10ffff then fail () else
- cont s' j s (i + 4) l v
+ let v = v - 0x10000 in
+ set_2 s' j (v lsr 10 + 0xD800);
+ set_2 s' (j + 2) (v land 0x3FF + 0xDC00);
+ scan s' (j + 4) s (i + 4) l
end
end else
String.sub s' 0 (j + 2)
and cont s' j s i l v =
- if v < 0x10000 then begin
- set_2 s' j v;
- scan s' (j + 2) s i l
- end else begin
- let v = v - 0x10000 in
- set_2 s' j (v lsr 10 + 0xD800);
- set_2 s' (j + 2) (v land 0x3FF + 0xDC00);
- scan s' (j + 4) s i l
- end
+ set_2 s' j v;
+ scan s' (j + 2) s i l
let to_utf_16 s =
let l = String.length s in
let s' = String.make (2 * l + 2) '\000' in
scan s' 0 s 0 l
+(***)
+
+let sfm_encode =
+ [| 0x0000; 0xf001; 0xf002; 0xf003; 0xf004; 0xf005; 0xf006; 0xf007;
+ 0xf008; 0xf009; 0xf00a; 0xf00b; 0xf00c; 0xf00d; 0xf00e; 0xf00f;
+ 0xf010; 0xf011; 0xf012; 0xf013; 0xf014; 0xf015; 0xf016; 0xf017;
+ 0xf018; 0xf019; 0xf01a; 0xf01b; 0xf01c; 0xf01d; 0xf01e; 0xf01f;
+ 0x0020; 0x0021; 0xf020; 0x0023; 0x0024; 0x0025; 0x0026; 0x0027;
+ 0x0028; 0x0029; 0xf021; 0x002b; 0x002c; 0x002d; 0x002e; 0x002f;
+ 0x0030; 0x0031; 0x0032; 0x0033; 0x0034; 0x0035; 0x0036; 0x0037;
+ 0x0038; 0x0039; 0xf022; 0x003b; 0xf023; 0x003d; 0xf024; 0xf025;
+ 0x0040; 0x0041; 0x0042; 0x0043; 0x0044; 0x0045; 0x0046; 0x0047;
+ 0x0048; 0x0049; 0x004a; 0x004b; 0x004c; 0x004d; 0x004e; 0x004f;
+ 0x0050; 0x0051; 0x0052; 0x0053; 0x0054; 0x0055; 0x0056; 0x0057;
+ 0x0058; 0x0059; 0x005a; 0x005b; 0xf026; 0x005d; 0x005e; 0x005f;
+ 0x0060; 0x0061; 0x0062; 0x0063; 0x0064; 0x0065; 0x0066; 0x0067;
+ 0x0068; 0x0069; 0x006a; 0x006b; 0x006c; 0x006d; 0x006e; 0x006f;
+ 0x0070; 0x0071; 0x0072; 0x0073; 0x0074; 0x0075; 0x0076; 0x0077;
+ 0x0078; 0x0079; 0x007a; 0x007b; 0xf027; 0x007d; 0x007e; 0x007f |]
+
+let set_2 s i v =
+ set s i (v land 0xff);
+ set s (i + 1) (v lsr 8)
+
+let get_2 s i = (get s (i + 1)) lsl 8 + get s i
+
+let end_of_name s i l = let i' = i + 1 in i' = l || get s i' = 0x2f (*'/'*)
+
+let rec scan s' j s i l =
+ if i < l then begin
+ let c = get s i in
+ if c < 0x80 then
+ cont s' j s (i + 1) l
+ (if c = 0x20 && end_of_name s i l then 0xf028
+ else if c = 0x2e && end_of_name s i l then 0xf029
+ else Array.unsafe_get sfm_encode c)
+ else if c < 0xE0 then begin
+ (* 80 - 7FF *)
+ if c < 0xc2 || i + 1 >= l then fail () else
+ let c1 = get s (i + 1) in
+ if c1 land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 6 + c1 - 0x3080 in
+ cont s' j s (i + 2) l v
+ end else if c < 0xF0 then begin
+ (* 800 - FFFF *)
+ if i + 2 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let c2 = get s (i + 2) in
+ if (c1 lor c2) land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 12 + c1 lsl 6 + c2 - 0xe2080 in
+ if v < 0x800 then fail () else
+ cont s' j s (i + 3) l v
+ end else begin
+ (* 10000 - 10FFFF *)
+ if i + 3 >= l then fail () else
+ let c1 = get s (i + 1) in
+ let c2 = get s (i + 2) in
+ let c3 = get s (i + 3) in
+ if (c1 lor c2 lor c3) land 0xc0 <> 0x80 then fail () else
+ let v = c lsl 18 + c1 lsl 12 + c2 lsl 6 + c3 - 0x03c82080 in
+ if v < 0x10000 || v > 0x10ffff then fail () else
+ let v = v - 0x10000 in
+ set_2 s' j (v lsr 10 + 0xD800);
+ set_2 s' (j + 2) (v land 0x3FF + 0xDC00);
+ scan s' (j + 4) s (i + 4) l
+ end
+ end else
+ String.sub s' 0 (j + 2)
+
+and cont s' j s i l v =
+ set_2 s' j v;
+ scan s' (j + 2) s i l
+
+let to_utf_16_filename s =
+ let l = String.length s in
+ let s' = String.make (2 * l + 2) '\000' in
+ scan s' 0 s 0 l
+
(****)
let rec scan s' i' l' s i l =
@@ -832,6 +1641,66 @@
(****)
+let end_of_name s i l =
+ i + 2 = l || (i + 4 <= l && s.[i + 2] = '/' && s.[i + 3] = '\000')
+
+let sfm_decode =
+ "\x00\x01\x02\x03\x04\x05\x06\x07\
+ \x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\
+ \x10\x11\x12\x13\x14\x15\x16\x17\
+ \x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\
+ \"*:<>?\\| ."
+
+let rec scan s' i' l' s i l =
+ if i + 2 <= l then begin
+ let v = get_2 s i in
+ if v = 0 then
+ String.sub s' 0 i' (* null *)
+ else if v < 0xD800 then
+ let i' = encode_char s' i' l' v in
+ scan s' i' l' s (i + 2) l
+ else if v > 0xDFFF then begin
+ let v =
+ if v > 0xf000 && v <= 0xf029 then
+ if v = 0xf028 && end_of_name s i l then 0x20
+ else if v = 0xf029 && end_of_name s i l then 0x2e
+ else get sfm_decode (v - 0xf000)
+ else
+ v
+ in
+ let i' = encode_char s' i' l' v in
+ scan s' i' l' s (i + 2) l
+ end else if v >= 0xdc00 || i + 4 > l then
+ let i' = encode_char s' i' l' v in
+ scan s' i' l' s (i + 2) l
+(* fail () *)
+ else begin
+ let v' = get_2 s (i + 2) in
+ if v' < 0xDC00 || v' > 0XDFFF then
+ let i' = encode_char s' i' l' v in
+ scan s' i' l' s (i + 2) l
+(* fail ()*)
+ else
+ let i' =
+ encode_char s' i' l' ((v - 0xD800) lsl 10 + (v' - 0xDC00) + 0x10000)
+ in
+ scan s' i' l' s (i + 4) l
+ end
+ end else if i < l then
+ fail () (* Odd number of chars *)
+ else
+ String.sub s' 0 i'
+
+(* NOTE: we MUST have to_utf_16_filename (from_utf_16 s) = s for any
+ Windows valid filename s *)
+let from_utf_16_filename s =
+ let l = String.length s in
+ let l' = 3 * l / 2 in
+ let s' = String.create l' in
+ scan s' 0 l' s 0 l
+
+(****)
+
let rec scan s i l =
i = l ||
let c = get s i in
Modified: trunk/src/unicode.mli
===================================================================
--- trunk/src/unicode.mli 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/unicode.mli 2009-06-17 14:42:07 UTC (rev 355)
@@ -20,6 +20,14 @@
val to_utf_16 : string -> string
val from_utf_16 : string -> string
+(* Convert to and from a null-terminated little-endian UTF-16 string *)
+(* Invalid NTFS characters are mapped to characters in the unicode
+ private use area *)
+(* FIX: not correct at the moment: should deal properly with paths such as
+ //?/foo/ c:\foo\bar ... *)
+val to_utf_16_filename : string -> string
+val from_utf_16_filename : string -> string
+
(* Check wether the string contains only well-formed UTF-8 characters *)
val check_utf_8 : string -> bool
Modified: trunk/src/unicode_tables.ml
===================================================================
--- trunk/src/unicode_tables.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/unicode_tables.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -1,11 +1,12 @@
(*-*-coding: utf-8;-*-*)
let ascii_lower =
- "\000\001\002\003\004\005\006\007\008\t\n\011\012\013\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031 !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127"
+ "\000\001\002\003\004\005\006\007\b\t\n\011\012\r\014\015\016\017\018\019\020\021\022\023\024\025\026\027\028\029\030\031 !\"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\127"
let norm_repl =
- "\003aÌ\003aÌ\003aÌ\003aÌ\003aÌ\003aÌ\002æ\003ç\003eÌ\003eÌ\003eÌ\003eÌ\003iÌ\003iÌ\003iÌ\003iÌ\002ð\003nÌ\003oÌ\003oÌ\003oÌ\003oÌ\003oÌ\002ø\003uÌ\003uÌ\003uÌ\003uÌ\003yÌ\002þ\003yÌ\003aÌ\003aÌ\003ą\003cÌ\003cÌ\003cÌ\003cÌ\003dÌ\002Ä\003eÌ\003eÌ\003eÌ\003ę\003eÌ\003gÌ\003gÌ\003gÌ\003ģ\003hÌ\002ħ\003iÌ\003iÌ\003iÌ\003į\003iÌ\002ij\003jÌ\003ķ\003lÌ\003ļ\003lÌ\002Å\002Å\003nÌ\003ņ\003nÌ\002Å\003oÌ\003oÌ\003oÌ\002Å\003rÌ\003ŗ\003rÌ\003sÌ\003sÌ\003ş\003sÌ\003ţ\003tÌ\002ŧ\003uÌ\003uÌ\003uÌ\003uÌ\003uÌ\003ų\003wÌ\003yÌ\003zÌ\003zÌ\003zÌ\002É\002Æ\002Æ
\002É\002Æ\002É\002É\002Æ\002Ç\002É\002É\002Æ\002É \002É£\002É©\002ɨ\002Æ\002ɯ\002ɲ\002ɵ\003oÌ\002Æ£\002Æ¥\002ƨ\002Ê\002Æ\002Ê\003uÌ\002Ê\002Ê\002Æ´\002ƶ\002Ê\002ƹ\002ƽ\002Ç\002Ç\002Ç\003aÌ\003iÌ\003oÌ\003uÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ\005aÌÌ\005aÌÌ\004æÌ\002Ç¥\003gÌ\003kÌ\003oÌ!
¨\005ǫÌ\004ÊÌ\003jÌ\002dz\003gÌ\003nÌ\005aÌÌ\004æÌ\004øÌ\003aÌ\003aÌ\003eÌ\003eÌ\003iÌ\003iÌ\003oÌ\003oÌ\003rÌ\003rÌ\003uÌ\003uÌ\003ș\003ț\003hÌ\003aÌ\003ȩ\005oÌÌ\005oÌÌ\003oÌ\005oÌÌ\003yÌ\002Ì\002Ì\002Ì\004ÌÌ\002ʹ\001;\004¨Ì\004αÌ\002·\004εÌ\004ηÌ\004ιÌ\004οÌ\004Ï
Ì\004ÏÌ\006ιÌÌ\002α\002β\002γ\002δ\002ε\002ζ\002η\002θ\002ι\002κ\002λ\002μ\002ν\002ξ\002ο\002Ï\002Ï\002Ï\002Ï\002Ï
\002Ï\002Ï\002Ï\002Ï\004ιÌ\004Ï
Ì\006Ï
ÌÌ\004ÏÌ\004ÏÌ\002Ï£\002Ï¥\002ϧ\002Ï©\002Ï«\002Ï\002ϯ\004еÌ\004еÌ\002Ñ\004гÌ\002Ñ\002Ñ\002Ñ\004ÑÌ\002Ñ\002Ñ\002Ñ\002Ñ\004кÌ\004иÌ\004ÑÌ\002Ñ\002а\002б\002в\002г\002д\002е\002ж\002з\002и\004иÌ\002к\002л\002м\002н\002о\002п\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ
\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ¡\002Ñ£\002Ñ¥\002ѧ\002Ñ©\002Ñ«\002Ñ\002ѯ\002ѱ\002ѳ\002ѵ\004ѵÌ\002ѹ\002Ñ»\002ѽ\002Ñ¿\002Ò\002Ò!
\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò¡\002Ò£\002Ò¥\!
002Ò§\00
2Ò©\002Ò«\002Ò\002Ò¯\002Ò±\002Ò³\002Òµ\002Ò·\002Ò¹\002Ò»\002Ò½\002Ò¿\004жÌ\002Ó\002Ó\002Ó\004аÌ\004аÌ\002Ó\004еÌ\002Ó\004ÓÌ\004жÌ\004зÌ\002Ó¡\004иÌ\004иÌ\004оÌ\002Ó©\004Ó©Ì\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\002Õ¡\002Õ¢\002Õ£\002Õ¤\002Õ¥\002Õ¦\002Õ§\002Õ¨\002Õ©\002Õª\002Õ«\002Õ¬\002Õ\002Õ®\002Õ¯\002Õ°\002Õ±\002Õ²\002Õ³\002Õ´\002Õµ\002Õ¶\002Õ·\002Õ¸\002Õ¹\002Õº\002Õ»\002Õ¼\002Õ½\002Õ¾\002Õ¿\002Ö\002Ö\002Ö\002Ö\002Ö\002Ö
\002Ö\004اÙ\004اÙ\004ÙÙ\004اÙ\004ÙÙ\004ÛÙ\004ÛÙ\004ÛÙ\006ऩ\006ऱ\006ऴ\006à¤à¤¼\006à¤à¤¼\006à¤à¤¼\006à¤à¤¼\006ड़\006ढ़\006फ़\006य़\006à§à¦¾\006à§à§\006ড়\006ঢ়\006য়\006ਲ਼\006ਸ਼\006à¨à¨¼\006à¨à¨¼\006à¨à¨¼\006ਫ਼\006àà\006àା\006àà\006ଡ଼\006ଢ଼\006à®à¯\006à¯à®¾\006à¯à®¾\006à¯à¯\006à±à±\006ಿà³\006à³à³\006à³à³\006à³à³\009à³à³à³\006àµà´¾\006àµà´¾\006àµàµ\006à·à·\006à·à·\009à·à·à·\006à·à·\006!
à½à¾·\006à½à¾·\006à½à¾·\006à½à¾·\006à½à¾·\006à½à¾µ\006ཱི\006ཱུ\006ྲà¾\006ླà¾\006ཱà¾\006à¾à¾·\006à¾à¾·\006ྡྷ\006ྦྷ\006ྫྷ\006à¾à¾µ\006á¥á®\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á \003á¡\003á¢\003á£\003á¤\003á¥\003á¦\003á§\003á¨\003á©\003áª\003á«\003á¬\003á\003á®\003á¯\003á°\003á±\003á²\003á³\003á´\003áµ\003aÌ¥\003bÌ\003bÌ£\003ḇ\005çÌ\003dÌ\003dÌ£\003ḏ\003ḑ\003dÌ\005eÌÌ\005eÌÌ\003eÌ\003ḛ\005ȩÌ\003fÌ\003gÌ\003hÌ\003hÌ£\003hÌ\003ḩ\003hÌ®\003ḭ\005iÌÌ\003kÌ\003kÌ£\003ḵ\003lÌ£\005lÌ£Ì\003ḻ\003lÌ\003mÌ\003mÌ\003mÌ£\003nÌ\003nÌ£\003ṉ\003nÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\003pÌ\003pÌ\003rÌ\003rÌ£\005rÌ£Ì\003ṟ\003sÌ\003sÌ£\005sÌÌ\005sÌÌ\005sÌ£Ì\003tÌ\003tÌ£\003ṯ\003tÌ\003ṳ\003ṵ\003uÌ\005uÌÌ\005uÌÌ\003vÌ\003vÌ£\003wÌ\003wÌ\003wÌ\003wÌ\003wÌ£\003xÌ\003xÌ\003yÌ\003zÌ\00!
3zÌ£\003ẕ\003ẖ\003tÌ\003wÌ\003yÌ\004Å¿Ì\003aÌ£\003aÌ\!
005aÌÌ
\005aÌÌ\005aÌÌ\005aÌÌ\005aÌ£Ì\005aÌÌ\005aÌÌ\005aÌÌ\005aÌÌ\005aÌ£Ì\003eÌ£\003eÌ\003eÌ\005eÌÌ\005eÌÌ\005eÌÌ\005eÌÌ\005eÌ£Ì\003iÌ\003iÌ£\003oÌ£\003oÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌ£Ì\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ£\003uÌ£\003uÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ£\003yÌ\003yÌ£\003yÌ\003yÌ\004αÌ\004αÌ\006αÌÌ\006αÌÌ\006αÌÌ\006αÌÌ\006αÌÍ\006αÌÍ\004εÌ\004εÌ\006εÌÌ\006εÌÌ\006εÌÌ\006εÌÌ\004ηÌ\004ηÌ\006ηÌÌ\006ηÌÌ\006ηÌÌ\006ηÌÌ\006ηÌÍ\006ηÌÍ\004ιÌ\004ιÌ\006ιÌÌ\006ιÌÌ\006ιÌÌ\006ιÌÌ\006ιÌÍ\006ιÌÍ\004οÌ\004οÌ\006οÌÌ\006οÌÌ\006οÌÌ\006οÌÌ\004Ï
Ì\004Ï
Ì\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÍ\006Ï
ÌÍ\004ÏÌ\004ÏÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÍ\006ÏÌÍ\004αÌ\004εÌ\004ηÌ\004ιÌ\004οÌ\004Ï
Ì\004ÏÌ\006αÌÍ
\006αÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÍÍ
\008αÌÍ!
Í
\006ηÌÍ
\006ηÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÍÍ
\008ηÌÍÍ
\006ÏÌÍ
\006ÏÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÍÍ
\008ÏÌÍÍ
\004αÌ\004αÌ\006αÌÍ
\004αÍ
\006αÌÍ
\004αÍ\006αÍÍ
\004¨Í\006ηÌÍ
\004ηÍ
\006ηÌÍ
\004ηÍ\006ηÍÍ
\005᾿Ì\005᾿Ì\005᾿Í\004ιÌ\004ιÌ\006ιÌÌ\004ιÍ\006ιÌÍ\005῾Ì\005῾Ì\005῾Í\004Ï
Ì\004Ï
Ì\006Ï
ÌÌ\004ÏÌ\004ÏÌ\004Ï
Í\006Ï
ÌÍ\004¨Ì\001`\006ÏÌÍ
\004ÏÍ
\006ÏÌÍ
\004ÏÍ\006ÏÍÍ
\002´\000\003â
°\003â
±\003â
²\003â
³\003â
´\003â
µ\003â
¶\003â
·\003â
¸\003â
¹\003â
º\003â
»\003â
¼\003â
½\003â
¾\003â
¿\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â \003â¡\003â¢\003â£\003â¤\003â¥\003â¦\003â§\003â¨\003â©\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ã¡ã\006ã¤ã\006ã¦ã\006ã¨ã\006ã¯ã\006!
ã¯ã\006ã²ã\006ã²ã\006ãµã\006ãµã\006ã¸ã\006ã!
¸ã\006
ã»ã\006ã»ã\006ãã\006ãã\006ã«ã\006ãã\006ã¯ã\006ã±ã\006ã³ã\006ãµã\006ã·ã\006ã¹ã\006ã»ã\006ã½ã\006ã¿ã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ã¦ã\006ã¯ã\006ã°ã\006ã±ã\006ã²ã\006ã½ã\004×Ö´\004ײַ\004ש×\004ש×\006שּ×\006שּ×\004×Ö·\004×Ö¸\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004× Ö¼\004סּ\004×£Ö¼\004פּ\004צּ\004×§Ö¼\004רּ\004שּ\004תּ\004×Ö¹\004×Ö¿\004×Ö¿\004פֿ\003ï½\003ï½\003ï½\003ï½\003ï½
\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½"
+ "\003aÌ\003aÌ\003aÌ\003aÌ\003aÌ\003aÌ\002æ\003ç\003eÌ\003eÌ\003eÌ\003eÌ\003iÌ\003iÌ\003iÌ\003iÌ\002ð\003nÌ\003oÌ\003oÌ\003oÌ\003oÌ\003oÌ\002ø\003uÌ\003uÌ\003uÌ\003uÌ\003yÌ\002þ\003yÌ\003aÌ\003aÌ\003ą\003cÌ\003cÌ\003cÌ\003cÌ\003dÌ\002Ä\003eÌ\003eÌ\003eÌ\003ę\003eÌ\003gÌ\003gÌ\003gÌ\003ģ\003hÌ\002ħ\003iÌ\003iÌ\003iÌ\003į\003iÌ\002ij\003jÌ\003ķ\003lÌ\003ļ\003lÌ\002Å\002Å\003nÌ\003ņ\003nÌ\002Å\003oÌ\003oÌ\003oÌ\002Å\003rÌ\003ŗ\003rÌ\003sÌ\003sÌ\003ş\003sÌ\003ţ\003tÌ\002ŧ\003uÌ\003uÌ\003uÌ\003uÌ\003uÌ\003ų\003wÌ\003yÌ\003zÌ\003zÌ\003zÌ\002É\002Æ\002Æ
\002É\002Æ\002É\002É\002Æ\002Ç\002É\002É\002Æ\002É \002É£\002É©\002ɨ\002Æ\002ɯ\002ɲ\002ɵ\003oÌ\002Æ£\002Æ¥\002ƨ\002Ê\002Æ\002Ê\003uÌ\002Ê\002Ê\002Æ´\002ƶ\002Ê\002ƹ\002ƽ\002Ç\002Ç\002Ç\003aÌ\003iÌ\003oÌ\003uÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ\005aÌÌ\005aÌÌ\004æÌ\002Ç¥\003gÌ\003kÌ\003oÌ!
¨\005ǫÌ\004ÊÌ\003jÌ\002dz\003gÌ\003nÌ\005aÌÌ\004æÌ\004øÌ\003aÌ\003aÌ\003eÌ\003eÌ\003iÌ\003iÌ\003oÌ\003oÌ\003rÌ\003rÌ\003uÌ\003uÌ\003ș\003ț\003hÌ\003aÌ\003ȩ\005oÌÌ\005oÌÌ\003oÌ\005oÌÌ\003yÌ\002Ì\002Ì\002Ì\004ÌÌ\002ʹ\001;\004¨Ì\004αÌ\002·\004εÌ\004ηÌ\004ιÌ\004οÌ\004Ï
Ì\004ÏÌ\006ιÌÌ\002α\002β\002γ\002δ\002ε\002ζ\002η\002θ\002ι\002κ\002λ\002μ\002ν\002ξ\002ο\002Ï\002Ï\002Ï\002Ï\002Ï
\002Ï\002Ï\002Ï\002Ï\004ιÌ\004Ï
Ì\006Ï
ÌÌ\004ÏÌ\004ÏÌ\002Ï£\002Ï¥\002ϧ\002Ï©\002Ï«\002Ï\002ϯ\004еÌ\004еÌ\002Ñ\004гÌ\002Ñ\002Ñ\002Ñ\004ÑÌ\002Ñ\002Ñ\002Ñ\002Ñ\004кÌ\004иÌ\004ÑÌ\002Ñ\002а\002б\002в\002г\002д\002е\002ж\002з\002и\004иÌ\002к\002л\002м\002н\002о\002п\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ
\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ\002Ñ¡\002Ñ£\002Ñ¥\002ѧ\002Ñ©\002Ñ«\002Ñ\002ѯ\002ѱ\002ѳ\002ѵ\004ѵÌ\002ѹ\002Ñ»\002ѽ\002Ñ¿\002Ò\002Ò!
\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò\002Ò¡\002Ò£\002Ò¥\!
002Ò§\00
2Ò©\002Ò«\002Ò\002Ò¯\002Ò±\002Ò³\002Òµ\002Ò·\002Ò¹\002Ò»\002Ò½\002Ò¿\004жÌ\002Ó\002Ó\002Ó\004аÌ\004аÌ\002Ó\004еÌ\002Ó\004ÓÌ\004жÌ\004зÌ\002Ó¡\004иÌ\004иÌ\004оÌ\002Ó©\004Ó©Ì\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\004ÑÌ\002Õ¡\002Õ¢\002Õ£\002Õ¤\002Õ¥\002Õ¦\002Õ§\002Õ¨\002Õ©\002Õª\002Õ«\002Õ¬\002Õ\002Õ®\002Õ¯\002Õ°\002Õ±\002Õ²\002Õ³\002Õ´\002Õµ\002Õ¶\002Õ·\002Õ¸\002Õ¹\002Õº\002Õ»\002Õ¼\002Õ½\002Õ¾\002Õ¿\002Ö\002Ö\002Ö\002Ö\002Ö\002Ö
\002Ö\004اÙ\004اÙ\004ÙÙ\004اÙ\004ÙÙ\004ÛÙ\004ÛÙ\004ÛÙ\006ऩ\006ऱ\006ऴ\006à¤à¤¼\006à¤à¤¼\006à¤à¤¼\006à¤à¤¼\006ड़\006ढ़\006फ़\006य़\006à§à¦¾\006à§à§\006ড়\006ঢ়\006য়\006ਲ਼\006ਸ਼\006à¨à¨¼\006à¨à¨¼\006à¨à¨¼\006ਫ਼\006àà\006àା\006àà\006ଡ଼\006ଢ଼\006à®à¯\006à¯à®¾\006à¯à®¾\006à¯à¯\006à±à±\006ಿà³\006à³à³\006à³à³\006à³à³\009à³à³à³\006àµà´¾\006àµà´¾\006àµàµ\006à·à·\006à·à·\009à·à·à·\006à·à·\006!
à½à¾·\006à½à¾·\006à½à¾·\006à½à¾·\006à½à¾·\006à½à¾µ\006ཱི\006ཱུ\006ྲà¾\006ླà¾\006ཱà¾\006à¾à¾·\006à¾à¾·\006ྡྷ\006ྦྷ\006ྫྷ\006à¾à¾µ\006á¥á®\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á\003á \003á¡\003á¢\003á£\003á¤\003á¥\003á¦\003á§\003á¨\003á©\003áª\003á«\003á¬\003á\003á®\003á¯\003á°\003á±\003á²\003á³\003á´\003áµ\003aÌ¥\003bÌ\003bÌ£\003ḇ\005çÌ\003dÌ\003dÌ£\003ḏ\003ḑ\003dÌ\005eÌÌ\005eÌÌ\003eÌ\003ḛ\005ȩÌ\003fÌ\003gÌ\003hÌ\003hÌ£\003hÌ\003ḩ\003hÌ®\003ḭ\005iÌÌ\003kÌ\003kÌ£\003ḵ\003lÌ£\005lÌ£Ì\003ḻ\003lÌ\003mÌ\003mÌ\003mÌ£\003nÌ\003nÌ£\003ṉ\003nÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\003pÌ\003pÌ\003rÌ\003rÌ£\005rÌ£Ì\003ṟ\003sÌ\003sÌ£\005sÌÌ\005sÌÌ\005sÌ£Ì\003tÌ\003tÌ£\003ṯ\003tÌ\003ṳ\003ṵ\003uÌ\005uÌÌ\005uÌÌ\003vÌ\003vÌ£\003wÌ\003wÌ\003wÌ\003wÌ\003wÌ£\003xÌ\003xÌ\003yÌ\003zÌ\00!
3zÌ£\003ẕ\003ẖ\003tÌ\003wÌ\003yÌ\004Å¿Ì\003aÌ£\003aÌ\!
005aÌÌ
\005aÌÌ\005aÌÌ\005aÌÌ\005aÌ£Ì\005aÌÌ\005aÌÌ\005aÌÌ\005aÌÌ\005aÌ£Ì\003eÌ£\003eÌ\003eÌ\005eÌÌ\005eÌÌ\005eÌÌ\005eÌÌ\005eÌ£Ì\003iÌ\003iÌ£\003oÌ£\003oÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌ£Ì\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ\005oÌÌ£\003uÌ£\003uÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ\005uÌÌ£\003yÌ\003yÌ£\003yÌ\003yÌ\004αÌ\004αÌ\006αÌÌ\006αÌÌ\006αÌÌ\006αÌÌ\006αÌÍ\006αÌÍ\004εÌ\004εÌ\006εÌÌ\006εÌÌ\006εÌÌ\006εÌÌ\004ηÌ\004ηÌ\006ηÌÌ\006ηÌÌ\006ηÌÌ\006ηÌÌ\006ηÌÍ\006ηÌÍ\004ιÌ\004ιÌ\006ιÌÌ\006ιÌÌ\006ιÌÌ\006ιÌÌ\006ιÌÍ\006ιÌÍ\004οÌ\004οÌ\006οÌÌ\006οÌÌ\006οÌÌ\006οÌÌ\004Ï
Ì\004Ï
Ì\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÌ\006Ï
ÌÍ\006Ï
ÌÍ\004ÏÌ\004ÏÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÌ\006ÏÌÍ\006ÏÌÍ\004αÌ\004εÌ\004ηÌ\004ιÌ\004οÌ\004Ï
Ì\004ÏÌ\006αÌÍ
\006αÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÌÍ
\008αÌÍÍ
\008αÌÍ!
Í
\006ηÌÍ
\006ηÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÌÍ
\008ηÌÍÍ
\008ηÌÍÍ
\006ÏÌÍ
\006ÏÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÌÍ
\008ÏÌÍÍ
\008ÏÌÍÍ
\004αÌ\004αÌ\006αÌÍ
\004αÍ
\006αÌÍ
\004αÍ\006αÍÍ
\004¨Í\006ηÌÍ
\004ηÍ
\006ηÌÍ
\004ηÍ\006ηÍÍ
\005᾿Ì\005᾿Ì\005᾿Í\004ιÌ\004ιÌ\006ιÌÌ\004ιÍ\006ιÌÍ\005῾Ì\005῾Ì\005῾Í\004Ï
Ì\004Ï
Ì\006Ï
ÌÌ\004ÏÌ\004ÏÌ\004Ï
Í\006Ï
ÌÍ\004¨Ì\001`\006ÏÌÍ
\004ÏÍ
\006ÏÌÍ
\004ÏÍ\006ÏÍÍ
\002´\000\003â
°\003â
±\003â
²\003â
³\003â
´\003â
µ\003â
¶\003â
·\003â
¸\003â
¹\003â
º\003â
»\003â
¼\003â
½\003â
¾\003â
¿\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â\003â \003â¡\003â¢\003â£\003â¤\003â¥\003â¦\003â§\003â¨\003â©\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ã¡ã\006ã¤ã\006ã¦ã\006ã¨ã\006ã¯ã\006!
ã¯ã\006ã²ã\006ã²ã\006ãµã\006ãµã\006ã¸ã\006ã!
¸ã\006
ã»ã\006ã»ã\006ãã\006ãã\006ã«ã\006ãã\006ã¯ã\006ã±ã\006ã³ã\006ãµã\006ã·ã\006ã¹ã\006ã»ã\006ã½ã\006ã¿ã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ãã\006ã¦ã\006ã¯ã\006ã°ã\006ã±ã\006ã²ã\006ã½ã\001\001\001\001\001\001\001\001\001 \001
+\001\001\001
\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\"\001*\001:\001<\001>\001?\001\\\001|\001 \001.\004×Ö´\004ײַ\004ש×\004ש×\006שּ×\006שּ×\004×Ö·\004×Ö¸\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004×Ö¼\004× Ö¼\004סּ\004×£Ö¼\004פּ\004צּ\004×§Ö¼\004רּ\004שּ\004תּ\004×Ö¹\004×Ö¿\004×Ö¿\004פֿ\003ï½\003ï½\003ï½\003ï½\003ï½
\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½\003ï½"
let norm_prim =
- "\000\000\000\002\003\004\005\006\007\000\000\000\000\008\009\010\011\012\013\014\015\016\000\000\017\000\000\018\000\000\000\000\000\000\000\000\019\020\000\021\022\023\000\000\000\024\025\026\000\027\000\028\000\029\000\030\000\000\000\000\000\031\032\000\033\000\034\035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\037\038\039\040\041\042\043\044\045\000\000\000\046\000\000\000\000\000\000\000\000\000\000\000\000\047\048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\049\050\051\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001!
\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\052!
\053\000\000\000\000\000\000\000\000\000\000\000\000\000\054\0!
55\000\0
00\000"
+ "\000\000\000\002\003\004\005\006\007\000\000\000\000\008\009\010\011\012\013\014\015\016\000\000\017\000\000\018\000\000\000\000\000\000\000\000\019\020\000\021\022\023\000\000\000\024\025\026\000\027\000\028\000\029\000\030\000\000\000\000\000\031\032\000\033\000\034\035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\037\038\039\040\041\042\043\044\045\000\000\000\046\000\000\000\000\000\000\000\000\000\000\000\000\047\048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\049\050\051\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001!
\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\053!
\054\000\000\000\000\000\000\000\000\000\000\000\000\000\055\0!
56\000\0
00\000"
let norm_second_high =
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\000\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\000\000\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\000\002\000\002\002\!
002\002\000\002\002\002\002\002\002\002\000\002\000\002\002\002\002\002\002\000\003\000\003\003\003\003\003\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\003\003\003\003\003\003\000\000\003\003\000\003\000\003\003\000\003\003\003\000\000\003\003\003\003\000\003\003\000\003\003\003\000\000\000\003\003\000\003\003\003\003\000\003\000\000\003\000\003\000\000\003\000\003\003\003\003\003\003\000\003\000\003\003\000\000\000\003\000\000\000\000\000\000\000\003\003\000\003\003\000\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\000\004\004\004\004\004\004\004\000\004\004\004\004\004\004\004\004\004\004\004\004\004\000\004\004\000\000\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\000\000\004\004\000\000\000\000\000\000\004\004\004\004\004\004\004\!
004\004\004\004\004\004\004\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\004\004\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\004\004\004\004\004\000\004\000\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\000\005\005\005\005\005\005\005\005\005\004\004\004\004\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\005\005\004\004\004\000\000\000\000\005\005\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\000\000\000\000\000\000!
\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\005\000\005\000\000\000\005\000\000\000\000\005\005\005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\006\006\000\006\000\006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\000\006\006\006\000\000\000\006\000\000\000\006\000\000\000\000\006\006\006\006\006\000\006\006\006\000\006\006\006\006\006\006\006\000\006\006\006\006\006\006\006\000\006\006\006\006\006\006\006\006\006\006\006\006\000\000\006\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\006\006\006\006\006\006\007\007\007\007\007\0!
07\007\0
07\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\000\000\000\000\007\000\000\007\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\007\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\000\000\000\000\000\000\000\000\008\000\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0!
00\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\008\008\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\000\000\000\008\000\000\000\000\008\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\0!
00\000\000\000\000\000\000\008\000\008\008\000\009\000\000\000!
\000\000
\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\009\000\000\000\000\009\000\000\000\000\009\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\000\011\000\000\000\000\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\012\012\!
012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\00!
0\000\00
0\000\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\000\012\012\012\012\012\012\000\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\013\013\000\000\012\012\012\012\013\013\000\000\013\013\013\013\013\013\013\013\000\013\000\013\000\013\000\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\004\013\004\013\004\013\004\013\004\013\004\013\004\000\000\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\014\014\014\014\013\013\013\013\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\000\014\014\014\014\013\004\014\000\005\000\000\014\014\014\014\000\014\014\013\004\013\004\014\014\014\014\014\014\014\004\000\000\014\014\014\014\013\004\000\014\014\014\014\014\015\005\015\015\015\015\014\014\013\004\015\015\004\015\000\000\015\015\015!
\000\015\015\013\004\013\004\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\0!
15\015\0
15\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\015\000\015\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\016\000\016\000\016\000\000\000\000\000\000\016\016\000\016\016\000\016\016\000\016\016\000\016\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\017\000\017\000\017\000\000\000\000\000\000\017\017\000\017\017\000\017\017\000\017\017\000\017\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\01!
7\000\000\017\017\017\017\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\017\000\000\000\000\000\000\000\000\000\000\017\017\017\017\017\017\017\017\017\017\017\017\017\000\017\017\017\017\017\000\017\000\017\017\000\017\018\000\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\018\018\018\018\018\018\018\018\018\01!
8\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\!
000\000\
000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\001\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\000\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\000\000\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\002\000\002\002\002\002\002\002\002\002\002\000\002\000\002\002\!
002\002\000\002\002\002\002\002\002\002\000\002\000\002\002\002\002\002\002\000\003\000\003\003\003\003\003\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\002\003\003\003\003\003\003\000\000\003\003\000\003\000\003\003\000\003\003\003\000\000\003\003\003\003\000\003\003\000\003\003\003\000\000\000\003\003\000\003\003\003\003\000\003\000\000\003\000\003\000\000\003\000\003\003\003\003\003\003\000\003\000\003\003\000\000\000\003\000\000\000\000\000\000\000\003\003\000\003\003\000\003\003\000\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\003\000\004\004\004\004\004\004\004\000\004\004\004\004\004\004\004\004\004\004\004\004\004\000\004\004\000\000\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\004\000\000\004\004\000\000\000\000\000\000\004\004\004\004\004\004\004\!
004\004\004\004\004\004\004\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\004\004\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\004\004\004\004\004\004\000\004\000\004\004\004\004\004\004\004\004\005\005\005\005\005\005\005\005\005\005\005\005\000\005\005\005\005\005\005\005\005\005\004\004\004\004\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\005\005\004\004\004\000\000\000\000\005\005\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\005\000\005\000\005\000\005\000\005\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\005\006\006\006\000\000\000\000\000\000!
\000\000\000\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\005\000\005\000\000\000\005\000\000\000\000\005\005\005\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\006\006\000\006\000\006\000\006\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\006\000\000\006\006\006\000\000\000\006\000\000\000\006\000\000\000\000\006\006\006\006\006\000\006\006\006\000\006\006\006\006\006\006\006\000\006\006\006\006\006\006\006\000\006\006\006\006\006\006\006\006\006\006\006\006\000\000\006\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\006\006\006\006\006\006\007\007\007\007\007\0!
07\007\0
07\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\000\000\000\000\000\007\000\000\007\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\007\007\007\007\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\007\000\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\000\000\000\000\000\000\000\000\008\000\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0!
00\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\008\008\000\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\008\008\008\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\000\000\000\000\000\000\000\008\000\000\000\000\008\000\000\000\000\008\000\000\000\000\008\000\000\000\000\000\000\000\000\000\000\000\000\008\000\000\0!
00\000\000\000\000\000\000\008\000\008\008\000\009\000\000\000!
\000\000
\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\009\000\000\000\000\009\000\000\000\000\009\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\009\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\010\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\000\011\000\000\000\000\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\011\012\012\!
012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\00!
0\000\00
0\000\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\000\000\012\012\012\012\012\012\000\000\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\012\013\013\000\000\012\012\012\012\013\013\000\000\013\013\013\013\013\013\013\013\000\013\000\013\000\013\000\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\004\013\004\013\004\013\004\013\004\013\004\013\004\000\000\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\013\014\014\014\014\013\013\013\013\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\014\000\014\014\014\014\013\004\014\000\005\000\000\014\014\014\014\000\014\014\013\004\013\004\014\014\014\014\014\014\014\004\000\000\014\014\014\014\013\004\000\014\014\014\014\014\015\005\015\015\015\015\014\014\013\004\015\015\004\015\000\000\015\015\015!
\000\015\015\013\004\013\004\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\000\000\000\000\000\000\015\015\015\015\015\0!
15\015\0
15\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\000\015\000\015\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\016\000\016\000\016\000\000\000\000\000\000\016\016\000\016\016\000\016\016\000\016\016\000\016\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\016\000\000\017\000\017\000\017\000\000\000\000\000\000\017\017\000\017\017\000\017\017\000\017\017\000\017\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\01!
7\000\000\017\017\017\017\000\000\000\017\000\000\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\017\000\000\000\000\000\000\000\000\000\000\017\017\017\017\017\018\018\018\018\018\018\018\018\000\018\018\018\018\018\000\018\000\018\018\000\018\018\000\018\018\018\018\018\018\018\018\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\018\000\000\000\000\000"
let norm_second_low =
- "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\008\012\016\020\024\027\031\035\039\043\047\051\055\059\063\066\070\074\078\082\086\000\090\093\097\101\105\109\113\000\000\004\008\012\016\020\000\027\031\035\039\043\047\051\055\059\000\066\070\074\078\082\086\000\000\093\097\101\105\109\000\116\120\120\124\124\128\128\132\132\136\136\140\140\144\144\148\148\152\000\155\155\159\159\163\163\167\167\171\171\175\175\179\179\183\183\187\187\191\191\195\000\198\198\202\202\206\206\210\210\214\000\218\000\221\221\!
225\225\000\229\229\233\233\237\237\241\000\244\000\247\247\251\251\255\255\000\003\000\006\006\010\010\014\014\018\000\021\021\025\025\029\029\033\033\037\037\041\041\045\045\049\049\053\053\057\000\060\060\064\064\068\068\072\072\076\076\080\080\084\084\088\088\116\092\092\096\096\100\100\000\000\104\107\000\110\000\113\116\000\119\122\125\000\000\128\131\134\137\000\140\143\000\146\149\152\000\000\000\155\158\000\161\164\164\168\000\171\000\000\174\000\177\000\000\180\000\183\186\186\190\193\196\000\199\000\202\205\000\000\000\208\000\000\000\000\000\000\000\211\211\000\214\214\000\217\217\000\220\220\224\224\228\228\232\232\236\236\242\242\248\248\254\254\000\004\004\010\010\016\016\021\000\024\024\028\028\032\032\036\036\042\042\047\051\051\000\054\054\000\000\058\058\062\062\068\068\073\073\078\078\082\082\086\086\090\090\094\094\098\098\102\102\106\106\110\110\114\114\118\118\122\122\126\126\130\130\000\000\134\134\000\000\000\000\000\000\138\138\142\142\146\146\152\!
152\158\158\162\162\168\168\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\172\175\000\178\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\000\191\196\201\204\209\214\000\219\000\224\229\234\241\244\247\250\253\000\003\006\009\012\015\018\021\024\027\030\033\000\036\039\042\045\048\051\054\057\062\196\204\209\214\067\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\000\000\000\000\000\000\000\057\062\219\224\229\000\000\000\000\074\079\000\000\000\000\000\000\000\000\000\000\000\000\000\084\000\087\000\090\000\093\000\096\000\099\000\102\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\105\110\115\118\123\126\129\132\137\140\143\146\149\154\159\164\167\170\173\176\179\182\185\188\191\194\199\202\205\208\211\214\217\220\223\226\229\232\235\238\241\244\247\250\253\000\003\006\000\000\000\000\000\000!
\000\000\000\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\105\110\000\118\000\000\000\132\000\000\000\000\149\154\159\000\009\000\012\000\015\000\018\000\021\000\024\000\027\000\030\000\033\000\036\000\039\000\042\042\047\000\050\000\053\000\056\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\062\000\065\000\068\000\071\000\074\000\077\000\080\000\083\000\086\000\089\000\092\000\095\000\098\000\101\000\104\000\107\000\110\000\113\000\116\000\119\000\122\000\125\000\128\000\131\000\000\134\134\139\000\000\000\142\000\000\000\145\000\000\000\000\148\148\153\153\158\000\161\161\166\000\169\169\174\174\179\179\184\000\187\187\192\192\197\197\202\000\205\205\210\210\215\215\220\220\225\225\230\230\000\000\235\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\240\243\246\249\252\255\002\005\008\011\014\0!
17\020\0
23\026\029\032\035\038\041\044\047\050\053\056\059\062\065\068\071\074\077\080\083\086\089\092\095\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\098\103\108\113\118\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\123\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\145\000\000\152\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\159\166\173\180\187\194\201\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\215\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\229\236\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\250\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\015\022\000\000\029\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\000\000\000\000\000\000\000\000\036\000\000\043\050\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\057\064\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\071\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\078\085\092\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\099\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0!
00\000\000\000\000\000\000\000\000\000\000\106\000\000\000\000\000\000\113\120\000\127\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\151\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\165\000\172\179\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\203\000\000\000\000\210\000\000\000\000\217\000\000\000\000\224\000\000\000\000\000\000\000\000\000\000\000\000\231\000\000\0!
00\000\000\000\000\000\000\238\000\245\252\000\003\000\000\000!
\000\000
\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\024\000\000\000\000\031\000\000\000\000\038\000\000\000\000\045\000\000\000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\066\070\074\078\082\086\090\094\098\102\106\110\114\118\122\126\130\134\138\142\146\150\154\158\162\166\170\174\178\182\186\190\194\198\202\206\210\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\218\218\222\222\226\226\230\230\234\234\240\240\244\244\248\248\252\252\000\000\004\004\010\010\016\016\020\020\024\024\030\030\034\034\038\038\042\042\046\046\050\050\054\054\058\058\062\062\068\068\072\072\076\076\080\080\084\084\090\090\094\094\098\098\102\102\106\106\110\110\114\114\118\118\122\122\126\126\132\132\138\138\144\144\150\150\154\154\158\158\162\162\166\166\172\172\176\176\180\180\184\184\190\190\196\196\202\202\206\206\210\210\214\214\218\218\222\222\226\226\230\230\236\236\242\242\246\246\250\250\254\254\002\002\006\006\010\010\014\014\018\018\022\022\026\026\030\030\034\034\038\042\046\050\000\054\000\000\000\000\059\059\063\063\067\067\073\073\079\079\085\085\091\091\097\097\103\103\109\109\115\115\121\121\127\127\131\131\135\135\139\139\145\145\151\151\157\157\163\163\169\169\173\173\177\177\181\181\185\185\191\191\197\197\203\203\209\209\215\215\221\221\227\227\233\233\239\239\245\245\249\249\253\253\003\003\!
009\009\015\015\021\021\027\027\031\031\035\035\039\039\000\00!
0\000\00
0\000\000\043\048\053\060\067\074\081\088\043\048\053\060\067\074\081\088\095\100\105\112\119\126\000\000\095\100\105\112\119\126\000\000\133\138\143\150\157\164\171\178\133\138\143\150\157\164\171\178\185\190\195\202\209\216\223\230\185\190\195\202\209\216\223\230\237\242\247\254\005\012\000\000\237\242\247\254\005\012\000\000\019\024\029\036\043\050\057\064\000\024\000\036\000\050\000\064\071\076\081\088\095\102\109\116\071\076\081\088\095\102\109\116\123\196\128\204\133\209\138\214\143\219\148\224\153\229\000\000\158\165\172\181\190\199\208\217\158\165\172\181\190\199\208\217\226\233\240\249\002\011\020\029\226\233\240\249\002\011\020\029\038\045\052\061\070\079\088\097\038\045\052\061\070\079\088\097\106\111\116\123\128\000\135\140\106\111\123\196\123\000\009\000\000\147\152\159\164\000\171\176\128\204\133\209\159\183\189\195\201\206\211\234\000\000\218\223\201\206\138\214\000\230\236\242\248\253\002\067\009\014\019\024\248\253\148\224\014\031\191\036\000\000\038\045\050!
\000\057\062\143\219\153\229\045\069\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\073\077\081\085\089\093\097\101\105\109\113\117\121\125\129\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\000\000\000\000\000\000\137\141\145\149\153\1!
57\161\1
65\169\173\177\181\185\189\193\197\201\205\209\213\217\221\225\229\233\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\248\000\255\000\006\000\013\000\020\000\027\000\034\000\041\000\048\000\055\000\062\000\000\069\000\076\000\083\000\000\000\000\000\000\090\097\000\104\111\000\118\125\000\132\139\000\146\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\167\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\181\000\188\000\195\000\202\000\209\000\216\000\223\000\230\000\237\000\244\000\251\000\000\002\000\009\000\016\000\000\000\000\000\000\023\030\000\037\044\000\051\058\000\065\072\000\079\086\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\09!
3\000\000\100\107\114\121\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\000\140\000\000\000\000\000\000\000\000\000\000\145\150\155\162\169\174\179\184\189\194\199\204\209\000\214\219\224\229\234\000\239\000\244\249\000\254\003\000\008\013\018\023\028\033\038\043\048\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\053\057\061\065\069\073\077\081\085\089\09!
3\097\101\105\109\113\117\121\125\129\133\137\141\145\149\153\!
000\000\
000\000\000"
+ "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\008\012\016\020\024\027\031\035\039\043\047\051\055\059\063\066\070\074\078\082\086\000\090\093\097\101\105\109\113\000\000\004\008\012\016\020\000\027\031\035\039\043\047\051\055\059\000\066\070\074\078\082\086\000\000\093\097\101\105\109\000\116\120\120\124\124\128\128\132\132\136\136\140\140\144\144\148\148\152\000\155\155\159\159\163\163\167\167\171\171\175\175\179\179\183\183\187\187\191\191\195\000\198\198\202\202\206\206\210\210\214\000\218\000\221\221\!
225\225\000\229\229\233\233\237\237\241\000\244\000\247\247\251\251\255\255\000\003\000\006\006\010\010\014\014\018\000\021\021\025\025\029\029\033\033\037\037\041\041\045\045\049\049\053\053\057\000\060\060\064\064\068\068\072\072\076\076\080\080\084\084\088\088\116\092\092\096\096\100\100\000\000\104\107\000\110\000\113\116\000\119\122\125\000\000\128\131\134\137\000\140\143\000\146\149\152\000\000\000\155\158\000\161\164\164\168\000\171\000\000\174\000\177\000\000\180\000\183\186\186\190\193\196\000\199\000\202\205\000\000\000\208\000\000\000\000\000\000\000\211\211\000\214\214\000\217\217\000\220\220\224\224\228\228\232\232\236\236\242\242\248\248\254\254\000\004\004\010\010\016\016\021\000\024\024\028\028\032\032\036\036\042\042\047\051\051\000\054\054\000\000\058\058\062\062\068\068\073\073\078\078\082\082\086\086\090\090\094\094\098\098\102\102\106\106\110\110\114\114\118\118\122\122\126\126\130\130\000\000\134\134\000\000\000\000\000\000\138\138\142\142\146\146\152\!
152\158\158\162\162\168\168\000\000\000\000\000\000\000\000\00!
0\000\00
0\000\172\175\000\178\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\186\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\000\191\196\201\204\209\214\000\219\000\224\229\234\241\244\247\250\253\000\003\006\009\012\015\018\021\024\027\030\033\000\036\039\042\045\048\051\054\057\062\196\204\209\214\067\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\036\000\000\000\000\000\000\000\057\062\219\224\229\000\000\000\000\074\079\000\000\000\000\000\000\000\000\000\000\000\000\000\084\000\087\000\090\000\093\000\096\000\099\000\102\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\105\110\115\118\123\126\129\132\137\140\143\146\149\154\159\164\167\170\173\176\179\182\185\188\191\194\199\202\205\208\211\214\217\220\223\226\229\232\235\238\241\244\247\250\253\000\003\006\000\000\000\000\000\000!
\000\000\000\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\105\110\000\118\000\000\000\132\000\000\000\000\149\154\159\000\009\000\012\000\015\000\018\000\021\000\024\000\027\000\030\000\033\000\036\000\039\000\042\042\047\000\050\000\053\000\056\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\062\000\065\000\068\000\071\000\074\000\077\000\080\000\083\000\086\000\089\000\092\000\095\000\098\000\101\000\104\000\107\000\110\000\113\000\116\000\119\000\122\000\125\000\128\000\131\000\000\134\134\139\000\000\000\142\000\000\000\145\000\000\000\000\148\148\153\153\158\000\161\161\166\000\169\169\174\174\179\179\184\000\187\187\192\192\197\197\202\000\205\205\210\210\215\215\220\220\225\225\230\230\000\000\235\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\240\243\246\249\252\255\002\005\008\011\014\0!
17\020\0
23\026\029\032\035\038\041\044\047\050\053\056\059\062\065\068\071\074\077\080\083\086\089\092\095\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\098\103\108\113\118\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\123\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\138\000\000\000\000\000\000\000\145\000\000\152\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\159\166\173\180\187\194\201\208\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\215\222\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\229\236\000\243\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\250\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\008\015\022\000\000\029\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\000\000\000\000\000\000\000\000\036\000\000\043\050\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\057\064\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\071\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\078\085\092\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\099\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0!
00\000\000\000\000\000\000\000\000\000\000\106\000\000\000\000\000\000\113\120\000\127\134\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\151\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\165\000\172\179\189\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\000\000\000\000\000\000\000\000\000\203\000\000\000\000\210\000\000\000\000\217\000\000\000\000\224\000\000\000\000\000\000\000\000\000\000\000\000\231\000\000\0!
00\000\000\000\000\000\000\238\000\245\252\000\003\000\000\000!
\000\000
\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\024\000\000\000\000\031\000\000\000\000\038\000\000\000\000\045\000\000\000\000\000\000\000\000\000\000\000\000\052\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\059\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\066\070\074\078\082\086\090\094\098\102\106\110\114\118\122\126\130\134\138\142\146\150\154\158\162\166\170\174\178\182\186\190\194\198\202\206\210\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\000\000\000\000\000\000\000\000\000\218\218\222\222\226\226\230\230\234\234\240\240\244\244\248\248\252\252\000\000\004\004\010\010\016\016\020\020\024\024\030\030\034\034\038\038\042\042\046\046\050\050\054\054\058\058\062\062\068\068\072\072\076\076\080\080\084\084\090\090\094\094\098\098\102\102\106\106\110\110\114\114\118\118\122\122\126\126\132\132\138\138\144\144\150\150\154\154\158\158\162\162\166\166\172\172\176\176\180\180\184\184\190\190\196\196\202\202\206\206\210\210\214\214\218\218\222\222\226\226\230\230\236\236\242\242\246\246\250\250\254\254\002\002\006\006\010\010\014\014\018\018\022\022\026\026\030\030\034\034\038\042\046\050\000\054\000\000\000\000\059\059\063\063\067\067\073\073\079\079\085\085\091\091\097\097\103\103\109\109\115\115\121\121\127\127\131\131\135\135\139\139\145\145\151\151\157\157\163\163\169\169\173\173\177\177\181\181\185\185\191\191\197\197\203\203\209\209\215\215\221\221\227\227\233\233\239\239\245\245\249\249\253\253\003\003\!
009\009\015\015\021\021\027\027\031\031\035\035\039\039\000\00!
0\000\00
0\000\000\043\048\053\060\067\074\081\088\043\048\053\060\067\074\081\088\095\100\105\112\119\126\000\000\095\100\105\112\119\126\000\000\133\138\143\150\157\164\171\178\133\138\143\150\157\164\171\178\185\190\195\202\209\216\223\230\185\190\195\202\209\216\223\230\237\242\247\254\005\012\000\000\237\242\247\254\005\012\000\000\019\024\029\036\043\050\057\064\000\024\000\036\000\050\000\064\071\076\081\088\095\102\109\116\071\076\081\088\095\102\109\116\123\196\128\204\133\209\138\214\143\219\148\224\153\229\000\000\158\165\172\181\190\199\208\217\158\165\172\181\190\199\208\217\226\233\240\249\002\011\020\029\226\233\240\249\002\011\020\029\038\045\052\061\070\079\088\097\038\045\052\061\070\079\088\097\106\111\116\123\128\000\135\140\106\111\123\196\123\000\009\000\000\147\152\159\164\000\171\176\128\204\133\209\159\183\189\195\201\206\211\234\000\000\218\223\201\206\138\214\000\230\236\242\248\253\002\067\009\014\019\024\248\253\148\224\014\031\191\036\000\000\038\045\050!
\000\057\062\143\219\153\229\045\069\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\072\072\072\072\072\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\073\077\081\085\089\093\097\101\105\109\113\117\121\125\129\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000!
\000\000\000\000\000\000\000\000\000\000\137\141\145\149\153\1!
57\161\1
65\169\173\177\181\185\189\193\197\201\205\209\213\217\221\225\229\233\237\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\248\000\255\000\006\000\013\000\020\000\027\000\034\000\041\000\048\000\055\000\062\000\000\069\000\076\000\083\000\000\000\000\000\000\090\097\000\104\111\000\118\125\000\132\139\000\146\153\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\160\000\000\000\000\000\000\000\000\000\167\000\000\000\000\000\000\000\000\000\000\000\000\000\174\000\181\000\188\000\195\000\202\000\209\000\216\000\223\000\230\000\237\000\244\000\251\000\000\002\000\009\000\016\000\000\000\000\000\000\023\030\000\037\044\000\051\058\000\065\072\000\079\086\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\09!
3\000\000\100\107\114\121\000\000\000\128\000\000\135\137\139\141\143\145\147\149\151\153\155\157\159\161\163\165\167\169\171\173\175\177\179\181\183\185\187\189\191\193\195\197\199\201\203\205\207\209\211\213\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\217\000\222\000\000\000\000\000\000\000\000\000\000\227\232\237\244\251\000\005\010\015\020\025\030\035\000\040\045\050\055\060\000\065\000\070\075\000\080\085\000\090\095\100\105\110\115\120\125\130\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\00!
0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\!
000\000\
000\000\072\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\135\139\143\147\151\155\159\163\167\171\175\179\183\187\191\195\199\203\207\211\215\219\223\227\231\235\000\000\000\000\000"
Modified: trunk/src/update.ml
===================================================================
--- trunk/src/update.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/update.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -431,8 +431,10 @@
(System.fspathToDebugString ffrom)
(System.fspathToDebugString fto));
Util.convertUnixErrorsToFatal "copying archive" (fun () ->
- System.unlink fto;
begin try
+ System.unlink fto
+ with Unix.Unix_error (Unix.ENOENT, _, _) -> () end;
+ begin try
System.link ffrom fto
with Unix.Unix_error _ ->
let outFd =
Modified: trunk/src/uutil.ml
===================================================================
--- trunk/src/uutil.ml 2009-06-15 14:26:01 UTC (rev 354)
+++ trunk/src/uutil.ml 2009-06-17 14:42:07 UTC (rev 355)
@@ -137,7 +137,7 @@
if n > 0 then begin
let _ = output target buf 0 n in
l := !l + n;
- if !l > 100 * 1024 then begin
+ if !l >= 100 * 1024 then begin
notify !l;
l := 0
end;
More information about the Unison-hackers
mailing list