From 868dcb6d5766a0aa5f6a8737da76493a3b20fc37 Mon Sep 17 00:00:00 2001 From: Aaron Turon Date: Tue, 24 Apr 2012 16:54:18 -0400 Subject: [PATCH] Add `box-cas!' and `unsafe-box*-cas!'. These primitives atomically update a box to a new value, as long as the current value is the same as a provided value. They also are future-safe. When futures are enabled, they use low-level hardware instructions to perform the change atomically. --- collects/scribblings/reference/data.scrbl | 23 +- collects/scribblings/reference/unsafe.scrbl | 4 + collects/tests/future/future.rkt | 98 +- collects/tests/racket/unsafe.rktl | 15 + src/racket/src/cstartup.inc | 998 ++++++++++---------- src/racket/src/future.h | 2 + src/racket/src/jit_ts.c | 2 + src/racket/src/jitinline.c | 76 +- src/racket/src/lightning/i386/asm.h | 1 + src/racket/src/lightning/i386/core.h | 9 +- src/racket/src/list.c | 55 ++ src/racket/src/schminc.h | 4 +- src/racket/src/schvers.h | 4 +- 13 files changed, 782 insertions(+), 509 deletions(-) diff --git a/collects/scribblings/reference/data.scrbl b/collects/scribblings/reference/data.scrbl index 96ca054b50..0badc58557 100644 --- a/collects/scribblings/reference/data.scrbl +++ b/collects/scribblings/reference/data.scrbl @@ -115,7 +115,28 @@ For any @racket[v], @racket[(unbox (box v))] returns @racket[v]. @defproc[(set-box! [box (and/c box? (not/c immutable?))] [v any/c]) void?]{ -Sets the content of @racket[box] to @racket[v].} +Sets the content of @racket[box] to @racket[v]. + +@defproc[(box-cas! [loc box?] [old any/c] [new any/c]) boolean?]{ + Atomically updates the contents of @racket[loc] to @racket[new], provided + that @racket[loc] currently contains a value that is @racket[eq?] to + @racket[old]. When Racket is compiled with support for @tech{futures}, + this uses a hardware @emph{compare and set} operation. + + If no other @tech{threads} or @tech{futures} attempt to access + @racket[loc], this is equivalent to + @racketblock[ + (and (eq? old (unbox loc)) (set-box! loc new) #t)] + + Uses of @racket[box-cas!] be performed safely in parallel with other + operations. In contrast, other atomic operations are not safe to perform in + parallel, and they therefore prevent a computation from continuing in + parallel. + + If @racket[loc] is a @tech{chaperone} or @tech{impersonator} of a box, the + @exnraise[exn:fail:contract].} + +} @; ---------------------------------------------------------------------- @include-section["hashes.scrbl"] diff --git a/collects/scribblings/reference/unsafe.scrbl b/collects/scribblings/reference/unsafe.scrbl index 85e0a36d4b..87df0298ea 100644 --- a/collects/scribblings/reference/unsafe.scrbl +++ b/collects/scribblings/reference/unsafe.scrbl @@ -213,6 +213,10 @@ Unsafe versions of @racket[unbox] and @racket[set-box!], where the @schemeidfont{box*} variants can be faster but do not work on @tech{impersonators}.} +@defproc[(unsafe-box*-cas! [loc box?] [old any/c] [new any/c]) boolean?]{ + Unsafe version of @racket[box-cas!]. Like @racket[unsafe-set-box*!], it does + not work on impersonators. +} @deftogether[( @defproc[(unsafe-vector-length [v vector?]) fixnum?] diff --git a/collects/tests/future/future.rkt b/collects/tests/future/future.rkt index 6401c83747..12a28d829b 100644 --- a/collects/tests/future/future.rkt +++ b/collects/tests/future/future.rkt @@ -748,8 +748,102 @@ We should also test deep continuations. 0 (touch (for/fold ([t (func (lambda () 0))]) ([i (in-range 10000)]) - (func (lambda () (touch t)))))) - + (func (lambda () (touch t)))))) + + ;; box-cas! tests + + ;; successful cas + (let () + (define b (box #f)) + (check-equal? (box-cas! b #f #true) #true) + (check-equal? (unbox b) #true)) + + ;; unsuccessful cas + (let () + (define b (box #f)) + (check-equal? (box-cas! b #true #f) #f) + (check-equal? (unbox b) #f)) + + ;; cas using allocated data + (let () + (define b (box '())) + (define x (cons 1 (unbox b))) + (check-equal? (box-cas! b '() x) #true) + (check-equal? (unbox b) x) + (check-equal? (box-cas! b x '()) #true) + (check-equal? (unbox b) '()) + (check-equal? (box-cas! b x '()) #f) + (check-equal? (unbox b) '())) + + ;; failure tests + (let () + (define (f x) (box-cas! x 1 2)) + (define (g x y) y) + + (define b (box 1)) + + (check-equal? (with-handlers ([exn:fail? (lambda _ 'num)]) + (touch (future (lambda () (f 2))))) + 'num) + (check-equal? (with-handlers ([exn:fail? (lambda _ 'list)]) + (touch (future (lambda () (f (list 1)))))) + 'list) + + (check-equal? (with-handlers ([exn:fail? (lambda _ 'chap)]) + (touch (future (lambda () (f (chaperone-box b g g)))))) + 'chap) + + (check-equal? (with-handlers ([exn:fail? (lambda _ 'imp)]) + (touch (future (lambda () (f (impersonate-box b g g)))))) + 'imp) + (check-equal? (unbox b) 1)) + + (let () + (define b (box 0)) + ;; inc and dec, with retry loops + (define (inc) + (let loop () + (define cur (unbox b)) + (unless (box-cas! b cur (+ cur 1)) + (loop)))) + (define (dec) + (let loop () + (define cur (unbox b)) + (unless (box-cas! b cur (- cur 1)) + (loop)))) + (define (inc-dec-loop) + (for ([i (in-range 100000000)]) + (inc) + (dec))) + (define t1 (func inc-dec-loop)) + (define t2 (func inc-dec-loop)) + (touch t1) + (touch t2) + (check-equal? (unbox b) 0)) + + (let () + (define b1 (box #true)) + (define (neg-bad) + (let loop () + (unless (box-cas! b1 #true #false) + (unless (box-cas! b1 #false #true) + (loop))))) + (define b2 (box #true)) + (define (neg-good) + (unless (box-cas! b2 #true #false) + (box-cas! b2 #false #true))) + + (check-equal? (unbox b1) #true) + (neg-bad) + (check-equal? (unbox b1) #false) + (neg-bad) + (check-equal? (unbox b1) #true) + + (check-equal? (unbox b2) #true) + (neg-good) + (check-equal? (unbox b2) #false) + (neg-good) + (check-equal? (unbox b2) #true)) ) (run-tests future) diff --git a/collects/tests/racket/unsafe.rktl b/collects/tests/racket/unsafe.rktl index 1febc780ef..317c3e44b8 100644 --- a/collects/tests/racket/unsafe.rktl +++ b/collects/tests/racket/unsafe.rktl @@ -241,6 +241,21 @@ (lambda (b v) v) (lambda (b v) v))) + (let ([b (box 0)] + [b2 (box 1)]) + ;; success + (test-tri (list #true 1) + 'unsafe-box*-cas! b 0 1 + #:pre (lambda () (set-box! b 0)) + #:post (lambda (x) (list x (unbox b))) + #:literal-ok? #f) + ;; failure + (test-tri (list #false 1) + 'unsafe-box*-cas! b2 0 7 + #:pre (lambda () (set-box! b2 1)) + #:post (lambda (x) (list x (unbox b2))) + #:literal-ok? #f)) + (for ([star (list values (add-star "vector"))]) (test-bin 5 (star 'unsafe-vector-ref) #(1 5 7) 1) (test-un 3 (star 'unsafe-vector-length) #(1 5 7)) diff --git a/src/racket/src/cstartup.inc b/src/racket/src/cstartup.inc index e0e0213692..53e3d0150f 100644 --- a/src/racket/src/cstartup.inc +++ b/src/racket/src/cstartup.inc @@ -1,15 +1,15 @@ { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,51,0,0,0,1,0,0,10,0,14,0, -21,0,25,0,38,0,42,0,49,0,54,0,61,0,66,0,69,0,74,0,83, +19,0,32,0,39,0,42,0,49,0,56,0,60,0,65,0,69,0,74,0,83, 0,87,0,93,0,107,0,121,0,124,0,130,0,134,0,136,0,147,0,149,0, 163,0,170,0,192,0,194,0,208,0,19,1,48,1,59,1,70,1,95,1,128, 1,161,1,220,1,19,2,97,2,152,2,157,2,177,2,70,3,90,3,142,3, 208,3,97,4,239,4,36,5,47,5,126,5,0,0,88,7,0,0,69,35,37, -109,105,110,45,115,116,120,29,11,11,11,66,100,101,102,105,110,101,63,97,110, -100,72,112,97,114,97,109,101,116,101,114,105,122,101,63,108,101,116,66,117,110, -108,101,115,115,64,99,111,110,100,66,108,101,116,114,101,99,64,108,101,116,42, -62,111,114,64,119,104,101,110,68,104,101,114,101,45,115,116,120,29,11,11,11, +109,105,110,45,115,116,120,29,11,11,11,64,99,111,110,100,72,112,97,114,97, +109,101,116,101,114,105,122,101,66,108,101,116,114,101,99,62,111,114,66,117,110, +108,101,115,115,66,100,101,102,105,110,101,63,97,110,100,64,108,101,116,42,63, +108,101,116,64,119,104,101,110,68,104,101,114,101,45,115,116,120,29,11,11,11, 65,113,117,111,116,101,29,94,2,15,68,35,37,107,101,114,110,101,108,11,29, 94,2,15,68,35,37,112,97,114,97,109,122,11,62,105,102,65,98,101,103,105, 110,63,115,116,120,61,115,70,108,101,116,45,118,97,108,117,101,115,61,120,73, @@ -17,61 +17,61 @@ 20,112,97,114,97,109,101,116,101,114,105,122,97,116,105,111,110,45,107,101,121, 61,118,73,100,101,102,105,110,101,45,118,97,108,117,101,115,97,36,11,8,240, 249,81,0,0,95,159,2,17,36,36,159,2,16,36,36,159,2,16,36,36,16, -20,2,3,2,2,2,4,2,2,2,5,2,2,2,6,2,2,2,7,2,2, -2,10,2,2,2,8,2,2,2,9,2,2,2,11,2,2,2,12,2,2,97, +20,2,10,2,2,2,3,2,2,2,4,2,2,2,6,2,2,2,7,2,2, +2,8,2,2,2,9,2,2,2,5,2,2,2,11,2,2,2,12,2,2,97, 37,11,8,240,249,81,0,0,93,159,2,16,36,37,16,2,2,13,161,2,2, -37,2,13,2,2,2,13,96,38,11,8,240,249,81,0,0,16,0,96,11,11, +37,2,13,2,2,2,13,96,11,11,8,240,249,81,0,0,16,0,96,38,11, 8,240,249,81,0,0,16,0,18,98,64,104,101,114,101,13,16,5,36,2,14, -2,2,11,11,8,32,8,31,8,30,8,29,27,248,22,156,4,195,249,22,149, +2,2,11,11,8,32,8,31,8,30,8,29,27,248,22,157,4,195,249,22,150, 4,80,158,39,36,251,22,83,2,18,248,22,98,199,12,249,22,73,2,19,248, -22,100,201,27,248,22,156,4,195,249,22,149,4,80,158,39,36,251,22,83,2, +22,100,201,27,248,22,157,4,195,249,22,150,4,80,158,39,36,251,22,83,2, 18,248,22,98,199,249,22,73,2,19,248,22,100,201,12,27,248,22,75,248,22, -156,4,196,28,248,22,81,193,20,14,159,37,36,37,28,248,22,81,248,22,75, -194,248,22,74,193,249,22,149,4,80,158,39,36,251,22,83,2,18,248,22,74, -199,249,22,73,2,4,248,22,75,201,11,18,100,10,13,16,5,36,2,14,2, +157,4,196,28,248,22,81,193,20,14,159,37,36,37,28,248,22,81,248,22,75, +194,248,22,74,193,249,22,150,4,80,158,39,36,251,22,83,2,18,248,22,74, +199,249,22,73,2,9,248,22,75,201,11,18,100,10,13,16,5,36,2,14,2, 2,11,11,8,32,8,31,8,30,8,29,16,4,11,11,2,20,3,1,8,101, 110,118,49,53,53,52,52,16,4,11,11,2,21,3,1,8,101,110,118,49,53, -53,52,53,27,248,22,75,248,22,156,4,196,28,248,22,81,193,20,14,159,37, -36,37,28,248,22,81,248,22,75,194,248,22,74,193,249,22,149,4,80,158,39, +53,52,53,27,248,22,75,248,22,157,4,196,28,248,22,81,193,20,14,159,37, +36,37,28,248,22,81,248,22,75,194,248,22,74,193,249,22,150,4,80,158,39, 36,250,22,83,2,22,248,22,83,249,22,83,248,22,83,2,23,248,22,74,201, -251,22,83,2,18,2,23,2,23,249,22,73,2,11,248,22,75,204,18,100,11, +251,22,83,2,18,2,23,2,23,249,22,73,2,6,248,22,75,204,18,100,11, 13,16,5,36,2,14,2,2,11,11,8,32,8,31,8,30,8,29,16,4,11, 11,2,20,3,1,8,101,110,118,49,53,53,52,55,16,4,11,11,2,21,3, -1,8,101,110,118,49,53,53,52,56,248,22,156,4,193,27,248,22,156,4,194, -249,22,73,248,22,83,248,22,74,196,248,22,75,195,27,248,22,75,248,22,156, -4,23,197,1,249,22,149,4,80,158,39,36,28,248,22,58,248,22,150,4,248, +1,8,101,110,118,49,53,53,52,56,248,22,157,4,193,27,248,22,157,4,194, +249,22,73,248,22,83,248,22,74,196,248,22,75,195,27,248,22,75,248,22,157, +4,23,197,1,249,22,150,4,80,158,39,36,28,248,22,58,248,22,151,4,248, 22,74,23,198,2,27,249,22,2,32,0,88,163,8,36,37,43,11,9,222,33, -40,248,22,156,4,248,22,98,23,200,2,250,22,83,2,24,248,22,83,249,22, +40,248,22,157,4,248,22,98,23,200,2,250,22,83,2,24,248,22,83,249,22, 83,248,22,83,248,22,74,23,204,2,250,22,84,2,25,249,22,2,22,74,23, 204,2,248,22,100,23,206,2,249,22,73,248,22,74,23,202,1,249,22,2,22, 98,23,200,1,250,22,84,2,22,249,22,2,32,0,88,163,8,36,37,47,11, -9,222,33,41,248,22,156,4,248,22,74,201,248,22,75,198,27,248,22,156,4, +9,222,33,41,248,22,157,4,248,22,74,201,248,22,75,198,27,248,22,157,4, 194,249,22,73,248,22,83,248,22,74,196,248,22,75,195,27,248,22,75,248,22, -156,4,23,197,1,249,22,149,4,80,158,39,36,250,22,84,2,24,249,22,2, -32,0,88,163,8,36,37,47,11,9,222,33,43,248,22,156,4,248,22,74,201, -248,22,75,198,27,248,22,75,248,22,156,4,196,27,248,22,156,4,248,22,74, -195,249,22,149,4,80,158,40,36,28,248,22,81,195,250,22,84,2,22,9,248, -22,75,199,250,22,83,2,6,248,22,83,248,22,74,199,250,22,84,2,10,248, -22,75,201,248,22,75,202,27,248,22,75,248,22,156,4,23,197,1,27,249,22, -1,22,87,249,22,2,22,156,4,248,22,156,4,248,22,74,199,248,22,176,4, -249,22,149,4,80,158,41,36,251,22,83,1,22,119,105,116,104,45,99,111,110, +157,4,23,197,1,249,22,150,4,80,158,39,36,250,22,84,2,24,249,22,2, +32,0,88,163,8,36,37,47,11,9,222,33,43,248,22,157,4,248,22,74,201, +248,22,75,198,27,248,22,75,248,22,157,4,196,27,248,22,157,4,248,22,74, +195,249,22,150,4,80,158,40,36,28,248,22,81,195,250,22,84,2,22,9,248, +22,75,199,250,22,83,2,11,248,22,83,248,22,74,199,250,22,84,2,10,248, +22,75,201,248,22,75,202,27,248,22,75,248,22,157,4,23,197,1,27,249,22, +1,22,87,249,22,2,22,157,4,248,22,157,4,248,22,74,199,248,22,177,4, +249,22,150,4,80,158,41,36,251,22,83,1,22,119,105,116,104,45,99,111,110, 116,105,110,117,97,116,105,111,110,45,109,97,114,107,2,26,250,22,84,1,23, 101,120,116,101,110,100,45,112,97,114,97,109,101,116,101,114,105,122,97,116,105, 111,110,21,95,1,27,99,111,110,116,105,110,117,97,116,105,111,110,45,109,97, 114,107,45,115,101,116,45,102,105,114,115,116,11,2,26,202,250,22,84,2,22, -9,248,22,75,204,27,248,22,75,248,22,156,4,196,28,248,22,81,193,20,14, -159,37,36,37,249,22,149,4,80,158,39,36,27,248,22,156,4,248,22,74,197, -28,249,22,143,9,62,61,62,248,22,150,4,248,22,98,196,250,22,83,2,22, -248,22,83,249,22,83,21,93,2,27,248,22,74,199,250,22,84,2,8,249,22, +9,248,22,75,204,27,248,22,75,248,22,157,4,196,28,248,22,81,193,20,14, +159,37,36,37,249,22,150,4,80,158,39,36,27,248,22,157,4,248,22,74,197, +28,249,22,144,9,62,61,62,248,22,151,4,248,22,98,196,250,22,83,2,22, +248,22,83,249,22,83,21,93,2,27,248,22,74,199,250,22,84,2,3,249,22, 83,2,27,249,22,83,248,22,107,203,2,27,248,22,75,202,251,22,83,2,18, -28,249,22,143,9,248,22,150,4,248,22,74,200,64,101,108,115,101,10,248,22, -74,197,250,22,84,2,22,9,248,22,75,200,249,22,73,2,8,248,22,75,202, +28,249,22,144,9,248,22,151,4,248,22,74,200,64,101,108,115,101,10,248,22, +74,197,250,22,84,2,22,9,248,22,75,200,249,22,73,2,3,248,22,75,202, 99,13,16,5,36,2,14,2,2,11,11,8,32,8,31,8,30,8,29,16,4, 11,11,2,20,3,1,8,101,110,118,49,53,53,55,48,16,4,11,11,2,21, 3,1,8,101,110,118,49,53,53,55,49,18,158,94,10,64,118,111,105,100,8, -48,27,248,22,75,248,22,156,4,196,249,22,149,4,80,158,39,36,28,248,22, -58,248,22,150,4,248,22,74,197,250,22,83,2,28,248,22,83,248,22,74,199, -248,22,98,198,27,248,22,150,4,248,22,74,197,250,22,83,2,28,248,22,83, +48,27,248,22,75,248,22,157,4,196,249,22,150,4,80,158,39,36,28,248,22, +58,248,22,151,4,248,22,74,197,250,22,83,2,28,248,22,83,248,22,74,199, +248,22,98,198,27,248,22,151,4,248,22,74,197,250,22,83,2,28,248,22,83, 248,22,74,197,250,22,84,2,25,248,22,75,199,248,22,75,202,159,36,20,113, 159,36,16,1,11,16,0,20,26,149,9,2,1,2,1,2,2,9,9,11,11, 11,10,36,80,158,36,36,20,113,159,36,16,0,16,0,38,39,36,16,0,36, @@ -83,23 +83,23 @@ 20,14,159,36,36,37,80,158,36,36,36,20,113,159,36,16,1,2,13,16,1, 33,33,10,16,5,2,7,88,163,8,36,37,53,37,9,223,0,33,34,36,20, 113,159,36,16,1,2,13,16,0,11,16,5,2,12,88,163,8,36,37,53,37, -9,223,0,33,35,36,20,113,159,36,16,1,2,13,16,0,11,16,5,2,4, +9,223,0,33,35,36,20,113,159,36,16,1,2,13,16,0,11,16,5,2,9, 88,163,8,36,37,53,37,9,223,0,33,36,36,20,113,159,36,16,1,2,13, -16,1,33,37,11,16,5,2,11,88,163,8,36,37,56,37,9,223,0,33,38, -36,20,113,159,36,16,1,2,13,16,1,33,39,11,16,5,2,6,88,163,8, +16,1,33,37,11,16,5,2,6,88,163,8,36,37,56,37,9,223,0,33,38, +36,20,113,159,36,16,1,2,13,16,1,33,39,11,16,5,2,11,88,163,8, 36,37,58,37,9,223,0,33,42,36,20,113,159,36,16,1,2,13,16,0,11, -16,5,2,9,88,163,8,36,37,53,37,9,223,0,33,44,36,20,113,159,36, +16,5,2,5,88,163,8,36,37,53,37,9,223,0,33,44,36,20,113,159,36, 16,1,2,13,16,0,11,16,5,2,10,88,163,8,36,37,54,37,9,223,0, -33,45,36,20,113,159,36,16,1,2,13,16,0,11,16,5,2,5,88,163,8, +33,45,36,20,113,159,36,16,1,2,13,16,0,11,16,5,2,4,88,163,8, 36,37,56,37,9,223,0,33,46,36,20,113,159,36,16,1,2,13,16,0,11, -16,5,2,8,88,163,8,36,37,58,37,9,223,0,33,47,36,20,113,159,36, -16,1,2,13,16,1,33,49,11,16,5,2,3,88,163,8,36,37,54,37,9, +16,5,2,3,88,163,8,36,37,58,37,9,223,0,33,47,36,20,113,159,36, +16,1,2,13,16,1,33,49,11,16,5,2,8,88,163,8,36,37,54,37,9, 223,0,33,50,36,20,113,159,36,16,1,2,13,16,0,11,16,0,94,2,16, 2,17,93,2,16,9,9,36,0}; EVAL_ONE_SIZED_STR((char *)expr, 2024); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,109,0,0,0,1,0,0,8,0,21,0, 26,0,43,0,65,0,94,0,109,0,127,0,139,0,155,0,169,0,191,0,207, 0,224,0,246,0,1,1,7,1,16,1,23,1,30,1,42,1,58,1,82,1, @@ -151,249 +151,249 @@ 97,32,114,111,111,116,32,112,97,116,104,58,32,6,11,11,80,76,84,67,79, 76,76,69,67,84,83,69,97,100,100,111,110,45,100,105,114,6,8,8,99,111, 108,108,101,99,116,115,27,20,13,159,80,159,37,52,37,250,80,159,40,53,37, -249,22,27,11,80,159,42,52,37,22,134,14,10,248,22,132,6,23,196,2,28, -248,22,128,7,23,194,2,12,86,94,248,22,151,9,23,194,1,27,20,13,159, +249,22,27,11,80,159,42,52,37,22,135,14,10,248,22,133,6,23,196,2,28, +248,22,129,7,23,194,2,12,86,94,248,22,152,9,23,194,1,27,20,13,159, 80,159,38,52,37,250,80,159,41,53,37,249,22,27,11,80,159,43,52,37,22, -134,14,10,248,22,132,6,23,197,2,28,248,22,128,7,23,194,2,12,86,94, -248,22,151,9,23,194,1,27,20,13,159,80,159,39,52,37,250,80,159,42,53, -37,249,22,27,11,80,159,44,52,37,22,134,14,10,248,22,132,6,23,198,2, -28,248,22,128,7,23,194,2,12,86,94,248,22,151,9,23,194,1,248,80,159, +135,14,10,248,22,133,6,23,197,2,28,248,22,129,7,23,194,2,12,86,94, +248,22,152,9,23,194,1,27,20,13,159,80,159,39,52,37,250,80,159,42,53, +37,249,22,27,11,80,159,44,52,37,22,135,14,10,248,22,133,6,23,198,2, +28,248,22,129,7,23,194,2,12,86,94,248,22,152,9,23,194,1,248,80,159, 40,8,32,39,197,28,248,22,81,23,195,2,9,27,248,22,74,23,196,2,27, -28,248,22,184,14,23,195,2,23,194,1,28,248,22,183,14,23,195,2,249,22, -185,14,23,196,1,250,80,159,43,39,39,248,22,136,15,2,32,11,10,250,80, -159,41,39,39,248,22,136,15,2,32,23,197,1,10,28,23,193,2,249,22,73, -248,22,187,14,249,22,185,14,23,198,1,247,22,137,15,27,248,22,75,23,200, -1,28,248,22,81,23,194,2,9,27,248,22,74,23,195,2,27,28,248,22,184, -14,23,195,2,23,194,1,28,248,22,183,14,23,195,2,249,22,185,14,23,196, -1,250,80,159,48,39,39,248,22,136,15,2,32,11,10,250,80,159,46,39,39, -248,22,136,15,2,32,23,197,1,10,28,23,193,2,249,22,73,248,22,187,14, -249,22,185,14,23,198,1,247,22,137,15,248,80,159,46,8,31,39,248,22,75, +28,248,22,185,14,23,195,2,23,194,1,28,248,22,184,14,23,195,2,249,22, +186,14,23,196,1,250,80,159,43,39,39,248,22,137,15,2,32,11,10,250,80, +159,41,39,39,248,22,137,15,2,32,23,197,1,10,28,23,193,2,249,22,73, +248,22,188,14,249,22,186,14,23,198,1,247,22,138,15,27,248,22,75,23,200, +1,28,248,22,81,23,194,2,9,27,248,22,74,23,195,2,27,28,248,22,185, +14,23,195,2,23,194,1,28,248,22,184,14,23,195,2,249,22,186,14,23,196, +1,250,80,159,48,39,39,248,22,137,15,2,32,11,10,250,80,159,46,39,39, +248,22,137,15,2,32,23,197,1,10,28,23,193,2,249,22,73,248,22,188,14, +249,22,186,14,23,198,1,247,22,138,15,248,80,159,46,8,31,39,248,22,75, 23,199,1,86,94,23,193,1,248,80,159,44,8,31,39,248,22,75,23,197,1, 86,94,23,193,1,27,248,22,75,23,198,1,28,248,22,81,23,194,2,9,27, -248,22,74,23,195,2,27,28,248,22,184,14,23,195,2,23,194,1,28,248,22, -183,14,23,195,2,249,22,185,14,23,196,1,250,80,159,46,39,39,248,22,136, -15,2,32,11,10,250,80,159,44,39,39,248,22,136,15,2,32,23,197,1,10, -28,23,193,2,249,22,73,248,22,187,14,249,22,185,14,23,198,1,247,22,137, +248,22,74,23,195,2,27,28,248,22,185,14,23,195,2,23,194,1,28,248,22, +184,14,23,195,2,249,22,186,14,23,196,1,250,80,159,46,39,39,248,22,137, +15,2,32,11,10,250,80,159,44,39,39,248,22,137,15,2,32,23,197,1,10, +28,23,193,2,249,22,73,248,22,188,14,249,22,186,14,23,198,1,247,22,138, 15,248,80,159,44,8,31,39,248,22,75,23,199,1,248,80,159,42,8,31,39, 248,22,75,196,28,248,22,81,23,195,2,9,27,248,22,74,23,196,2,27,28, -248,22,184,14,23,195,2,23,194,1,28,248,22,183,14,23,195,2,249,22,185, -14,23,196,1,250,80,159,43,39,39,248,22,136,15,2,32,11,10,250,80,159, -41,39,39,248,22,136,15,2,32,23,197,1,10,28,23,193,2,249,22,73,248, -22,187,14,249,22,185,14,23,198,1,247,22,137,15,248,80,159,41,8,30,39, +248,22,185,14,23,195,2,23,194,1,28,248,22,184,14,23,195,2,249,22,186, +14,23,196,1,250,80,159,43,39,39,248,22,137,15,2,32,11,10,250,80,159, +41,39,39,248,22,137,15,2,32,23,197,1,10,28,23,193,2,249,22,73,248, +22,188,14,249,22,186,14,23,198,1,247,22,138,15,248,80,159,41,8,30,39, 248,22,75,23,200,1,248,80,159,39,8,30,39,248,22,75,197,28,248,22,81, -23,195,2,9,27,248,22,74,23,196,2,27,28,248,22,184,14,23,195,2,23, -194,1,28,248,22,183,14,23,195,2,249,22,185,14,23,196,1,250,80,159,43, -39,39,248,22,136,15,2,32,11,10,250,80,159,41,39,39,248,22,136,15,2, -32,23,197,1,10,28,23,193,2,249,22,73,248,22,187,14,249,22,185,14,23, -198,1,247,22,137,15,248,80,159,41,8,29,39,248,22,75,23,200,1,248,80, -159,39,8,29,39,248,22,75,197,27,248,22,160,14,23,195,2,28,23,193,2, -192,86,94,23,193,1,28,248,22,133,7,23,195,2,27,248,22,182,14,195,28, -192,192,248,22,183,14,195,11,86,94,28,28,248,22,161,14,23,195,2,10,28, -248,22,160,14,23,195,2,10,28,248,22,133,7,23,195,2,28,248,22,182,14, -23,195,2,10,248,22,183,14,23,195,2,11,12,250,22,179,9,76,110,111,114, +23,195,2,9,27,248,22,74,23,196,2,27,28,248,22,185,14,23,195,2,23, +194,1,28,248,22,184,14,23,195,2,249,22,186,14,23,196,1,250,80,159,43, +39,39,248,22,137,15,2,32,11,10,250,80,159,41,39,39,248,22,137,15,2, +32,23,197,1,10,28,23,193,2,249,22,73,248,22,188,14,249,22,186,14,23, +198,1,247,22,138,15,248,80,159,41,8,29,39,248,22,75,23,200,1,248,80, +159,39,8,29,39,248,22,75,197,27,248,22,161,14,23,195,2,28,23,193,2, +192,86,94,23,193,1,28,248,22,134,7,23,195,2,27,248,22,183,14,195,28, +192,192,248,22,184,14,195,11,86,94,28,28,248,22,162,14,23,195,2,10,28, +248,22,161,14,23,195,2,10,28,248,22,134,7,23,195,2,28,248,22,183,14, +23,195,2,10,248,22,184,14,23,195,2,11,12,250,22,180,9,76,110,111,114, 109,97,108,45,112,97,116,104,45,99,97,115,101,2,33,23,197,2,28,28,248, -22,161,14,23,195,2,249,22,143,9,248,22,162,14,23,197,2,2,34,249,22, -143,9,247,22,155,8,2,34,27,28,248,22,133,7,23,196,2,23,195,2,248, -22,145,8,248,22,165,14,23,197,2,28,249,22,152,15,0,21,35,114,120,34, +22,162,14,23,195,2,249,22,144,9,248,22,163,14,23,197,2,2,34,249,22, +144,9,247,22,156,8,2,34,27,28,248,22,134,7,23,196,2,23,195,2,248, +22,146,8,248,22,166,14,23,197,2,28,249,22,153,15,0,21,35,114,120,34, 94,91,92,92,93,91,92,92,93,91,63,93,91,92,92,93,34,23,195,2,28, -248,22,133,7,195,248,22,168,14,195,194,27,248,22,172,7,23,195,1,249,22, -169,14,248,22,148,8,250,22,160,15,0,6,35,114,120,34,47,34,28,249,22, -152,15,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92, -92,93,42,36,34,23,201,2,23,199,1,250,22,160,15,0,19,35,114,120,34, +248,22,134,7,195,248,22,169,14,195,194,27,248,22,173,7,23,195,1,249,22, +170,14,248,22,149,8,250,22,161,15,0,6,35,114,120,34,47,34,28,249,22, +153,15,0,22,35,114,120,34,91,47,92,92,93,91,46,32,93,43,91,47,92, +92,93,42,36,34,23,201,2,23,199,1,250,22,161,15,0,19,35,114,120,34, 91,32,46,93,43,40,91,47,92,92,93,42,41,36,34,23,202,1,6,2,2, -92,49,80,159,44,37,38,2,34,28,248,22,133,7,194,248,22,168,14,194,193, +92,49,80,159,44,37,38,2,34,28,248,22,134,7,194,248,22,169,14,194,193, 32,56,88,163,8,36,39,53,11,70,102,111,117,110,100,45,101,120,101,99,222, 33,59,32,57,88,163,8,36,40,58,11,64,110,101,120,116,222,33,58,27,248, -22,186,14,23,196,2,28,249,22,145,9,23,195,2,23,197,1,11,28,248,22, -182,14,23,194,2,27,249,22,178,14,23,197,1,23,196,1,28,23,197,2,90, -159,39,11,89,161,39,36,11,248,22,181,14,23,197,2,86,95,23,195,1,23, -194,1,27,28,23,202,2,27,248,22,186,14,23,199,2,28,249,22,145,9,23, -195,2,23,200,2,11,28,248,22,182,14,23,194,2,250,2,56,23,205,2,23, -206,2,249,22,178,14,23,200,2,23,198,1,250,2,56,23,205,2,23,206,2, -23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,160,14,23, -196,2,27,249,22,178,14,23,198,2,23,205,2,28,28,248,22,173,14,193,10, -248,22,172,14,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,203, -2,11,27,248,22,186,14,23,200,2,28,249,22,145,9,23,195,2,23,201,1, -11,28,248,22,182,14,23,194,2,250,2,56,23,206,1,23,207,1,249,22,178, +22,187,14,23,196,2,28,249,22,146,9,23,195,2,23,197,1,11,28,248,22, +183,14,23,194,2,27,249,22,179,14,23,197,1,23,196,1,28,23,197,2,90, +159,39,11,89,161,39,36,11,248,22,182,14,23,197,2,86,95,23,195,1,23, +194,1,27,28,23,202,2,27,248,22,187,14,23,199,2,28,249,22,146,9,23, +195,2,23,200,2,11,28,248,22,183,14,23,194,2,250,2,56,23,205,2,23, +206,2,249,22,179,14,23,200,2,23,198,1,250,2,56,23,205,2,23,206,2, +23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,161,14,23, +196,2,27,249,22,179,14,23,198,2,23,205,2,28,28,248,22,174,14,193,10, +248,22,173,14,193,192,11,11,28,23,193,2,192,86,94,23,193,1,28,23,203, +2,11,27,248,22,187,14,23,200,2,28,249,22,146,9,23,195,2,23,201,1, +11,28,248,22,183,14,23,194,2,250,2,56,23,206,1,23,207,1,249,22,179, 14,23,201,1,23,198,1,250,2,56,205,206,195,192,86,94,23,194,1,28,23, -196,2,90,159,39,11,89,161,39,36,11,248,22,181,14,23,197,2,86,95,23, -195,1,23,194,1,27,28,23,201,2,27,248,22,186,14,23,199,2,28,249,22, -145,9,23,195,2,23,200,2,11,28,248,22,182,14,23,194,2,250,2,56,23, -204,2,23,205,2,249,22,178,14,23,200,2,23,198,1,250,2,56,23,204,2, +196,2,90,159,39,11,89,161,39,36,11,248,22,182,14,23,197,2,86,95,23, +195,1,23,194,1,27,28,23,201,2,27,248,22,187,14,23,199,2,28,249,22, +146,9,23,195,2,23,200,2,11,28,248,22,183,14,23,194,2,250,2,56,23, +204,2,23,205,2,249,22,179,14,23,200,2,23,198,1,250,2,56,23,204,2, 23,205,2,23,196,1,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22, -160,14,23,196,2,27,249,22,178,14,23,198,2,23,204,2,28,28,248,22,173, -14,193,10,248,22,172,14,193,192,11,11,28,23,193,2,192,86,94,23,193,1, -28,23,202,2,11,27,248,22,186,14,23,200,2,28,249,22,145,9,23,195,2, -23,201,1,11,28,248,22,182,14,23,194,2,250,2,56,23,205,1,23,206,1, -249,22,178,14,23,201,1,23,198,1,250,2,56,204,205,195,192,28,23,193,2, -90,159,39,11,89,161,39,36,11,248,22,181,14,23,199,2,86,95,23,195,1, +161,14,23,196,2,27,249,22,179,14,23,198,2,23,204,2,28,28,248,22,174, +14,193,10,248,22,173,14,193,192,11,11,28,23,193,2,192,86,94,23,193,1, +28,23,202,2,11,27,248,22,187,14,23,200,2,28,249,22,146,9,23,195,2, +23,201,1,11,28,248,22,183,14,23,194,2,250,2,56,23,205,1,23,206,1, +249,22,179,14,23,201,1,23,198,1,250,2,56,204,205,195,192,28,23,193,2, +90,159,39,11,89,161,39,36,11,248,22,182,14,23,199,2,86,95,23,195,1, 23,194,1,27,28,23,198,2,251,2,57,23,198,2,23,203,2,23,201,2,23, -202,2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,160,14,195,27, -249,22,178,14,197,200,28,28,248,22,173,14,193,10,248,22,172,14,193,192,11, +202,2,11,28,23,193,2,192,86,94,23,193,1,27,28,248,22,161,14,195,27, +249,22,179,14,197,200,28,28,248,22,174,14,193,10,248,22,173,14,193,192,11, 11,28,192,192,28,198,11,251,2,57,198,203,201,202,194,32,60,88,163,8,36, -40,58,11,2,31,222,33,61,28,248,22,81,23,197,2,11,27,248,22,185,14, -248,22,74,23,199,2,27,249,22,178,14,23,196,1,23,197,2,28,248,22,172, +40,58,11,2,31,222,33,61,28,248,22,81,23,197,2,11,27,248,22,186,14, +248,22,74,23,199,2,27,249,22,179,14,23,196,1,23,197,2,28,248,22,173, 14,23,194,2,250,2,56,198,199,195,86,94,23,193,1,27,248,22,75,23,200, -1,28,248,22,81,23,194,2,11,27,248,22,185,14,248,22,74,23,196,2,27, -249,22,178,14,23,196,1,23,200,2,28,248,22,172,14,23,194,2,250,2,56, +1,28,248,22,81,23,194,2,11,27,248,22,186,14,248,22,74,23,196,2,27, +249,22,179,14,23,196,1,23,200,2,28,248,22,173,14,23,194,2,250,2,56, 201,202,195,86,94,23,193,1,27,248,22,75,23,197,1,28,248,22,81,23,194, -2,11,27,248,22,185,14,248,22,74,195,27,249,22,178,14,23,196,1,202,28, -248,22,172,14,193,250,2,56,204,205,195,251,2,60,204,205,206,248,22,75,199, -86,95,28,28,248,22,160,14,23,195,2,10,28,248,22,133,7,23,195,2,28, -248,22,182,14,23,195,2,10,248,22,183,14,23,195,2,11,12,250,22,179,9, +2,11,27,248,22,186,14,248,22,74,195,27,249,22,179,14,23,196,1,202,28, +248,22,173,14,193,250,2,56,204,205,195,251,2,60,204,205,206,248,22,75,199, +86,95,28,28,248,22,161,14,23,195,2,10,28,248,22,134,7,23,195,2,28, +248,22,183,14,23,195,2,10,248,22,184,14,23,195,2,11,12,250,22,180,9, 2,5,6,25,25,112,97,116,104,32,111,114,32,115,116,114,105,110,103,32,40, 115,97,110,115,32,110,117,108,41,23,197,2,28,28,23,195,2,28,28,248,22, -160,14,23,196,2,10,28,248,22,133,7,23,196,2,28,248,22,182,14,23,196, -2,10,248,22,183,14,23,196,2,11,248,22,182,14,23,196,2,11,10,12,250, -22,179,9,2,5,6,29,29,35,102,32,111,114,32,114,101,108,97,116,105,118, +161,14,23,196,2,10,28,248,22,134,7,23,196,2,28,248,22,183,14,23,196, +2,10,248,22,184,14,23,196,2,11,248,22,183,14,23,196,2,11,10,12,250, +22,180,9,2,5,6,29,29,35,102,32,111,114,32,114,101,108,97,116,105,118, 101,32,112,97,116,104,32,111,114,32,115,116,114,105,110,103,23,198,2,28,28, -248,22,182,14,23,195,2,90,159,39,11,89,161,39,36,11,248,22,181,14,23, -198,2,249,22,143,9,194,2,35,11,27,248,22,153,8,6,4,4,80,65,84, +248,22,183,14,23,195,2,90,159,39,11,89,161,39,36,11,248,22,182,14,23, +198,2,249,22,144,9,194,2,35,11,27,248,22,154,8,6,4,4,80,65,84, 72,27,28,23,194,2,249,80,158,40,40,23,196,1,9,86,94,23,194,1,9, -27,28,249,22,143,9,247,22,155,8,2,34,249,22,73,248,22,169,14,5,1, -46,23,196,1,23,194,1,28,248,22,81,23,194,2,11,27,248,22,185,14,248, -22,74,23,196,2,27,249,22,178,14,23,196,1,23,201,2,28,248,22,172,14, +27,28,249,22,144,9,247,22,156,8,2,34,249,22,73,248,22,170,14,5,1, +46,23,196,1,23,194,1,28,248,22,81,23,194,2,11,27,248,22,186,14,248, +22,74,23,196,2,27,249,22,179,14,23,196,1,23,201,2,28,248,22,173,14, 23,194,2,250,2,56,202,203,195,86,94,23,193,1,27,248,22,75,23,197,1, -28,248,22,81,23,194,2,11,27,248,22,185,14,248,22,74,23,196,2,27,249, -22,178,14,23,196,1,23,204,2,28,248,22,172,14,23,194,2,250,2,56,205, +28,248,22,81,23,194,2,11,27,248,22,186,14,248,22,74,23,196,2,27,249, +22,179,14,23,196,1,23,204,2,28,248,22,173,14,23,194,2,250,2,56,205, 206,195,86,94,23,193,1,27,248,22,75,23,197,1,28,248,22,81,23,194,2, -11,27,248,22,185,14,248,22,74,195,27,249,22,178,14,23,196,1,206,28,248, -22,172,14,193,250,2,56,23,16,23,17,195,251,2,60,23,16,23,17,23,18, -248,22,75,199,27,248,22,185,14,23,196,1,28,248,22,172,14,193,250,2,56, +11,27,248,22,186,14,248,22,74,195,27,249,22,179,14,23,196,1,206,28,248, +22,173,14,193,250,2,56,23,16,23,17,195,251,2,60,23,16,23,17,23,18, +248,22,75,199,27,248,22,186,14,23,196,1,28,248,22,173,14,193,250,2,56, 198,199,195,11,250,80,159,39,39,39,196,197,11,250,80,159,39,39,39,196,11, 11,32,65,88,163,8,36,39,57,11,2,31,222,33,67,0,8,35,114,120,35, -34,92,34,34,27,249,22,148,15,23,197,2,23,198,2,28,23,193,2,86,94, +34,92,34,34,27,249,22,149,15,23,197,2,23,198,2,28,23,193,2,86,94, 23,196,1,27,248,22,98,23,195,2,27,27,248,22,107,23,197,1,27,249,22, -148,15,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27,248,22,98, +149,15,23,201,2,23,196,2,28,23,193,2,86,94,23,194,1,27,248,22,98, 23,195,2,27,250,2,65,23,203,2,23,204,1,248,22,107,23,199,1,28,249, -22,130,8,23,196,2,2,36,249,22,87,23,202,2,194,249,22,73,248,22,169, -14,28,249,22,143,9,247,22,155,8,2,34,250,22,160,15,2,66,23,200,1, -2,36,23,197,1,194,86,95,23,199,1,23,193,1,28,249,22,130,8,23,196, -2,2,36,249,22,87,23,200,2,9,249,22,73,248,22,169,14,28,249,22,143, -9,247,22,155,8,2,34,250,22,160,15,2,66,23,200,1,2,36,23,197,1, -9,28,249,22,130,8,23,196,2,2,36,249,22,87,197,194,86,94,23,196,1, -249,22,73,248,22,169,14,28,249,22,143,9,247,22,155,8,2,34,250,22,160, -15,2,66,23,200,1,2,36,23,197,1,194,86,94,23,193,1,28,249,22,130, +22,131,8,23,196,2,2,36,249,22,87,23,202,2,194,249,22,73,248,22,170, +14,28,249,22,144,9,247,22,156,8,2,34,250,22,161,15,2,66,23,200,1, +2,36,23,197,1,194,86,95,23,199,1,23,193,1,28,249,22,131,8,23,196, +2,2,36,249,22,87,23,200,2,9,249,22,73,248,22,170,14,28,249,22,144, +9,247,22,156,8,2,34,250,22,161,15,2,66,23,200,1,2,36,23,197,1, +9,28,249,22,131,8,23,196,2,2,36,249,22,87,197,194,86,94,23,196,1, +249,22,73,248,22,170,14,28,249,22,144,9,247,22,156,8,2,34,250,22,161, +15,2,66,23,200,1,2,36,23,197,1,194,86,94,23,193,1,28,249,22,131, 8,23,198,2,2,36,249,22,87,195,9,86,94,23,194,1,249,22,73,248,22, -169,14,28,249,22,143,9,247,22,155,8,2,34,250,22,160,15,2,66,23,202, -1,2,36,23,199,1,9,86,95,28,28,248,22,186,7,194,10,248,22,133,7, -194,12,250,22,179,9,2,6,6,21,21,98,121,116,101,32,115,116,114,105,110, +170,14,28,249,22,144,9,247,22,156,8,2,34,250,22,161,15,2,66,23,202, +1,2,36,23,199,1,9,86,95,28,28,248,22,187,7,194,10,248,22,134,7, +194,12,250,22,180,9,2,6,6,21,21,98,121,116,101,32,115,116,114,105,110, 103,32,111,114,32,115,116,114,105,110,103,196,28,28,248,22,82,195,249,22,4, -22,160,14,196,11,12,250,22,179,9,2,6,6,13,13,108,105,115,116,32,111, -102,32,112,97,116,104,115,197,250,2,65,197,195,28,248,22,133,7,197,248,22, -147,8,197,196,86,94,28,28,248,22,160,14,23,195,2,10,28,248,22,133,7, -23,195,2,28,248,22,182,14,23,195,2,10,248,22,183,14,23,195,2,11,12, -250,22,179,9,23,196,2,2,37,23,197,2,28,248,22,182,14,23,195,2,12, -248,22,174,12,249,22,177,11,248,22,162,7,250,22,181,7,2,38,23,200,1, -23,201,1,247,22,23,86,94,28,28,248,22,160,14,23,195,2,10,28,248,22, -133,7,23,195,2,28,248,22,182,14,23,195,2,10,248,22,183,14,23,195,2, -11,12,250,22,179,9,23,196,2,2,37,23,197,2,28,248,22,182,14,23,195, -2,12,248,22,174,12,249,22,177,11,248,22,162,7,250,22,181,7,2,38,23, -200,1,23,201,1,247,22,23,86,94,86,94,28,28,248,22,160,14,23,195,2, -10,28,248,22,133,7,23,195,2,28,248,22,182,14,23,195,2,10,248,22,183, -14,23,195,2,11,12,250,22,179,9,195,2,37,23,197,2,28,248,22,182,14, -23,195,2,12,248,22,174,12,249,22,177,11,248,22,162,7,250,22,181,7,2, +22,161,14,196,11,12,250,22,180,9,2,6,6,13,13,108,105,115,116,32,111, +102,32,112,97,116,104,115,197,250,2,65,197,195,28,248,22,134,7,197,248,22, +148,8,197,196,86,94,28,28,248,22,161,14,23,195,2,10,28,248,22,134,7, +23,195,2,28,248,22,183,14,23,195,2,10,248,22,184,14,23,195,2,11,12, +250,22,180,9,23,196,2,2,37,23,197,2,28,248,22,183,14,23,195,2,12, +248,22,175,12,249,22,178,11,248,22,163,7,250,22,182,7,2,38,23,200,1, +23,201,1,247,22,23,86,94,28,28,248,22,161,14,23,195,2,10,28,248,22, +134,7,23,195,2,28,248,22,183,14,23,195,2,10,248,22,184,14,23,195,2, +11,12,250,22,180,9,23,196,2,2,37,23,197,2,28,248,22,183,14,23,195, +2,12,248,22,175,12,249,22,178,11,248,22,163,7,250,22,182,7,2,38,23, +200,1,23,201,1,247,22,23,86,94,86,94,28,28,248,22,161,14,23,195,2, +10,28,248,22,134,7,23,195,2,28,248,22,183,14,23,195,2,10,248,22,184, +14,23,195,2,11,12,250,22,180,9,195,2,37,23,197,2,28,248,22,183,14, +23,195,2,12,248,22,175,12,249,22,178,11,248,22,163,7,250,22,182,7,2, 38,199,23,201,1,247,22,23,249,22,3,88,163,8,36,37,50,11,9,223,2, -33,70,196,28,28,248,22,0,194,249,22,44,195,37,11,12,250,22,179,9,195, -2,39,196,86,94,28,28,248,22,160,14,23,194,2,10,28,248,22,133,7,23, -194,2,28,248,22,182,14,23,194,2,10,248,22,183,14,23,194,2,11,12,250, -22,179,9,2,10,2,37,23,196,2,28,248,22,182,14,23,194,2,12,248,22, -174,12,249,22,177,11,248,22,162,7,250,22,181,7,2,38,2,10,23,200,1, -247,22,23,86,95,86,94,86,94,28,28,248,22,160,14,195,10,28,248,22,133, -7,195,28,248,22,182,14,195,10,248,22,183,14,195,11,12,250,22,179,9,2, -10,2,37,197,28,248,22,182,14,195,12,248,22,174,12,249,22,177,11,248,22, -162,7,250,22,181,7,2,38,2,10,201,247,22,23,249,22,3,32,0,88,163, +33,70,196,28,28,248,22,0,194,249,22,44,195,37,11,12,250,22,180,9,195, +2,39,196,86,94,28,28,248,22,161,14,23,194,2,10,28,248,22,134,7,23, +194,2,28,248,22,183,14,23,194,2,10,248,22,184,14,23,194,2,11,12,250, +22,180,9,2,10,2,37,23,196,2,28,248,22,183,14,23,194,2,12,248,22, +175,12,249,22,178,11,248,22,163,7,250,22,182,7,2,38,2,10,23,200,1, +247,22,23,86,95,86,94,86,94,28,28,248,22,161,14,195,10,28,248,22,134, +7,195,28,248,22,183,14,195,10,248,22,184,14,195,11,12,250,22,180,9,2, +10,2,37,197,28,248,22,183,14,195,12,248,22,175,12,249,22,178,11,248,22, +163,7,250,22,182,7,2,38,2,10,201,247,22,23,249,22,3,32,0,88,163, 8,36,37,49,11,9,222,33,73,197,28,28,248,22,0,194,249,22,44,195,37, -11,12,250,22,179,9,2,10,2,39,196,251,80,158,40,45,197,198,199,11,86, -94,28,28,248,22,160,14,23,194,2,10,28,248,22,133,7,23,194,2,28,248, -22,182,14,23,194,2,10,248,22,183,14,23,194,2,11,12,250,22,179,9,2, -12,2,37,23,196,2,28,248,22,182,14,23,194,2,12,248,22,174,12,249,22, -177,11,248,22,162,7,250,22,181,7,2,38,2,12,23,200,1,247,22,23,86, -96,86,94,28,28,248,22,160,14,195,10,28,248,22,133,7,195,28,248,22,182, -14,195,10,248,22,183,14,195,11,12,250,22,179,9,2,12,2,37,197,28,248, -22,182,14,195,12,248,22,174,12,249,22,177,11,248,22,162,7,250,22,181,7, -2,38,2,12,201,247,22,23,86,94,86,94,28,28,248,22,160,14,196,10,28, -248,22,133,7,196,28,248,22,182,14,196,10,248,22,183,14,196,11,12,250,22, -179,9,2,12,2,37,198,28,248,22,182,14,196,12,248,22,174,12,249,22,177, -11,248,22,162,7,250,22,181,7,2,38,2,12,202,247,22,23,249,22,3,32, +11,12,250,22,180,9,2,10,2,39,196,251,80,158,40,45,197,198,199,11,86, +94,28,28,248,22,161,14,23,194,2,10,28,248,22,134,7,23,194,2,28,248, +22,183,14,23,194,2,10,248,22,184,14,23,194,2,11,12,250,22,180,9,2, +12,2,37,23,196,2,28,248,22,183,14,23,194,2,12,248,22,175,12,249,22, +178,11,248,22,163,7,250,22,182,7,2,38,2,12,23,200,1,247,22,23,86, +96,86,94,28,28,248,22,161,14,195,10,28,248,22,134,7,195,28,248,22,183, +14,195,10,248,22,184,14,195,11,12,250,22,180,9,2,12,2,37,197,28,248, +22,183,14,195,12,248,22,175,12,249,22,178,11,248,22,163,7,250,22,182,7, +2,38,2,12,201,247,22,23,86,94,86,94,28,28,248,22,161,14,196,10,28, +248,22,134,7,196,28,248,22,183,14,196,10,248,22,184,14,196,11,12,250,22, +180,9,2,12,2,37,198,28,248,22,183,14,196,12,248,22,175,12,249,22,178, +11,248,22,163,7,250,22,182,7,2,38,2,12,202,247,22,23,249,22,3,32, 0,88,163,8,36,37,49,11,9,222,33,75,198,28,28,248,22,0,194,249,22, -44,195,37,11,12,250,22,179,9,2,12,2,39,196,251,80,158,40,45,197,199, -200,198,0,6,45,105,110,102,46,48,27,248,22,136,15,2,40,27,28,248,22, -183,14,23,195,2,193,20,13,159,80,159,38,52,37,250,80,159,41,53,37,249, -22,27,11,80,159,43,52,37,22,137,15,248,22,136,15,68,111,114,105,103,45, -100,105,114,27,248,22,136,15,2,32,250,80,159,42,39,39,23,196,1,23,198, -1,11,28,192,250,22,178,14,195,6,6,6,99,111,110,102,105,103,6,10,10, -108,105,110,107,115,46,114,107,116,100,11,86,94,27,247,22,135,10,28,249,22, -191,9,23,195,2,2,41,251,22,131,10,23,197,1,2,41,250,22,181,7,2, -42,28,23,202,1,80,159,46,47,38,80,159,46,50,38,248,22,169,11,23,205, -1,247,22,23,12,248,193,247,22,133,2,2,77,86,95,27,247,22,135,10,28, -249,22,191,9,23,195,2,2,41,251,22,131,10,23,197,1,2,41,250,22,181, -7,2,42,28,202,80,159,47,47,38,80,159,47,50,38,248,22,169,11,23,206, +44,195,37,11,12,250,22,180,9,2,12,2,39,196,251,80,158,40,45,197,199, +200,198,0,6,45,105,110,102,46,48,27,248,22,137,15,2,40,27,28,248,22, +184,14,23,195,2,193,20,13,159,80,159,38,52,37,250,80,159,41,53,37,249, +22,27,11,80,159,43,52,37,22,138,15,248,22,137,15,68,111,114,105,103,45, +100,105,114,27,248,22,137,15,2,32,250,80,159,42,39,39,23,196,1,23,198, +1,11,28,192,250,22,179,14,195,6,6,6,99,111,110,102,105,103,6,10,10, +108,105,110,107,115,46,114,107,116,100,11,86,94,27,247,22,136,10,28,249,22, +128,10,23,195,2,2,41,251,22,132,10,23,197,1,2,41,250,22,182,7,2, +42,28,23,202,1,80,159,46,47,38,80,159,46,50,38,248,22,170,11,23,205, +1,247,22,23,12,248,193,247,22,134,2,2,77,86,95,27,247,22,136,10,28, +249,22,128,10,23,195,2,2,41,251,22,132,10,23,197,1,2,41,250,22,182, +7,2,42,28,202,80,159,47,47,38,80,159,47,50,38,248,22,170,11,23,206, 1,247,22,23,12,28,192,28,194,86,94,20,18,159,11,80,158,39,48,247,22, -133,2,20,18,159,11,80,158,39,49,192,86,94,20,18,159,11,80,158,39,54, -247,22,133,2,20,18,159,11,80,158,39,55,192,12,248,194,247,22,133,2,20, -20,94,248,22,132,6,23,194,2,28,248,22,128,7,248,22,132,6,23,195,1, -12,248,22,176,9,6,30,30,101,120,112,101,99,116,101,100,32,97,32,115,105, -110,103,108,101,32,83,45,101,120,112,114,101,115,115,105,111,110,248,22,184,5, -193,28,248,22,82,23,194,2,28,28,249,22,184,3,38,248,22,86,23,196,2, -10,249,22,184,3,39,248,22,86,23,196,2,28,28,248,22,133,7,248,22,74, -23,195,2,10,249,22,143,9,64,114,111,111,116,248,22,74,23,196,2,28,27, -248,22,98,194,28,248,22,160,14,23,194,2,10,28,248,22,133,7,23,194,2, -28,248,22,182,14,23,194,2,10,248,22,183,14,23,194,1,11,27,248,22,81, -248,22,100,195,28,192,192,248,22,161,15,248,22,107,195,11,11,11,11,250,22, -151,2,196,197,249,22,73,197,200,28,28,248,22,81,248,22,100,23,197,2,10, -249,22,152,15,248,22,107,23,198,2,247,22,151,8,27,248,22,187,14,249,22, -185,14,248,22,98,23,200,2,23,198,1,28,248,22,58,248,22,74,23,198,2, -86,94,23,196,1,86,94,28,250,22,153,2,196,11,11,12,250,22,151,2,196, -11,9,249,22,157,2,195,88,163,8,36,38,50,11,9,224,3,2,33,85,27, -248,22,61,248,22,74,23,199,1,250,22,151,2,23,198,2,23,196,2,249,22, -73,248,22,125,23,200,1,250,22,153,2,23,203,1,23,201,1,9,12,250,22, -151,2,195,196,248,22,88,198,20,13,159,80,159,37,57,37,88,163,36,37,54, -8,240,0,72,0,0,9,225,1,0,2,33,79,27,250,22,131,15,28,23,197, +134,2,20,18,159,11,80,158,39,49,192,86,94,20,18,159,11,80,158,39,54, +247,22,134,2,20,18,159,11,80,158,39,55,192,12,248,194,247,22,134,2,20, +20,94,248,22,133,6,23,194,2,28,248,22,129,7,248,22,133,6,23,195,1, +12,248,22,177,9,6,30,30,101,120,112,101,99,116,101,100,32,97,32,115,105, +110,103,108,101,32,83,45,101,120,112,114,101,115,115,105,111,110,248,22,185,5, +193,28,248,22,82,23,194,2,28,28,249,22,185,3,38,248,22,86,23,196,2, +10,249,22,185,3,39,248,22,86,23,196,2,28,28,248,22,134,7,248,22,74, +23,195,2,10,249,22,144,9,64,114,111,111,116,248,22,74,23,196,2,28,27, +248,22,98,194,28,248,22,161,14,23,194,2,10,28,248,22,134,7,23,194,2, +28,248,22,183,14,23,194,2,10,248,22,184,14,23,194,1,11,27,248,22,81, +248,22,100,195,28,192,192,248,22,162,15,248,22,107,195,11,11,11,11,250,22, +152,2,196,197,249,22,73,197,200,28,28,248,22,81,248,22,100,23,197,2,10, +249,22,153,15,248,22,107,23,198,2,247,22,152,8,27,248,22,188,14,249,22, +186,14,248,22,98,23,200,2,23,198,1,28,248,22,58,248,22,74,23,198,2, +86,94,23,196,1,86,94,28,250,22,154,2,196,11,11,12,250,22,152,2,196, +11,9,249,22,158,2,195,88,163,8,36,38,50,11,9,224,3,2,33,85,27, +248,22,61,248,22,74,23,199,1,250,22,152,2,23,198,2,23,196,2,249,22, +73,248,22,125,23,200,1,250,22,154,2,23,203,1,23,201,1,9,12,250,22, +152,2,195,196,248,22,88,198,20,13,159,80,159,37,57,37,88,163,36,37,54, +8,240,0,72,0,0,9,225,1,0,2,33,79,27,250,22,132,15,28,23,197, 2,80,159,41,47,38,80,159,41,50,38,11,32,0,88,163,8,36,36,41,11, -9,222,33,80,28,249,22,186,3,23,195,2,28,23,196,2,80,158,40,49,80, +9,222,33,80,28,249,22,187,3,23,195,2,28,23,196,2,80,158,40,49,80, 158,40,55,20,13,159,80,159,38,57,37,20,20,94,88,163,36,37,55,8,240, 0,120,12,0,9,226,2,1,3,0,33,81,23,196,1,20,13,159,80,159,38, 52,37,26,29,80,159,8,31,53,37,249,22,27,11,80,159,8,33,52,37,22, -130,14,10,22,131,14,10,22,132,14,10,22,135,14,10,22,134,14,10,22,136, -14,10,22,133,14,10,22,137,14,10,22,138,14,10,22,139,14,10,22,140,14, -10,22,141,14,10,22,142,14,11,22,128,14,11,27,249,22,175,5,28,196,80, +131,14,10,22,132,14,10,22,133,14,10,22,136,14,10,22,135,14,10,22,137, +14,10,22,134,14,10,22,138,14,10,22,139,14,10,22,140,14,10,22,141,14, +10,22,142,14,10,22,143,14,11,22,129,14,11,27,249,22,176,5,28,196,80, 159,41,47,38,80,159,41,50,38,66,98,105,110,97,114,121,27,250,22,40,22, 31,88,163,8,36,36,44,11,9,223,4,33,82,20,20,94,88,163,36,36,43, 11,9,223,4,33,83,23,197,1,86,94,28,28,248,22,82,23,194,2,249,22, 4,32,0,88,163,8,36,37,45,11,9,222,33,84,23,195,2,11,12,248,22, -176,9,6,18,18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101, -110,116,27,247,22,133,2,27,90,159,39,11,89,161,39,36,11,248,22,181,14, +177,9,6,18,18,105,108,108,45,102,111,114,109,101,100,32,99,111,110,116,101, +110,116,27,247,22,134,2,27,90,159,39,11,89,161,39,36,11,248,22,182,14, 28,201,80,159,46,47,38,80,159,46,50,38,192,86,96,249,22,3,20,20,94, 88,163,8,36,37,54,11,9,224,2,3,33,86,23,195,1,23,197,1,249,22, -157,2,195,88,163,8,36,38,48,11,9,223,3,33,87,28,197,86,94,20,18, +158,2,195,88,163,8,36,38,48,11,9,223,3,33,87,28,197,86,94,20,18, 159,11,80,158,42,48,193,20,18,159,11,80,158,42,49,196,86,94,20,18,159, 11,80,158,42,54,193,20,18,159,11,80,158,42,55,196,193,28,193,80,158,38, 48,80,158,38,54,248,22,9,88,163,8,32,37,8,40,8,240,0,120,47,0, -9,224,1,2,33,88,0,7,35,114,120,34,47,43,34,28,248,22,133,7,23, -195,2,27,249,22,150,15,2,90,196,28,192,28,249,22,184,3,248,22,97,195, -248,22,174,3,248,22,136,7,198,249,22,7,250,22,155,7,199,36,248,22,97, -198,197,249,22,7,250,22,155,7,199,36,248,22,97,198,249,22,73,249,22,155, +9,224,1,2,33,88,0,7,35,114,120,34,47,43,34,28,248,22,134,7,23, +195,2,27,249,22,151,15,2,90,196,28,192,28,249,22,185,3,248,22,97,195, +248,22,175,3,248,22,137,7,198,249,22,7,250,22,156,7,199,36,248,22,97, +198,197,249,22,7,250,22,156,7,199,36,248,22,97,198,249,22,73,249,22,156, 7,200,248,22,99,199,199,249,22,7,196,197,90,159,39,11,89,161,39,36,11, -248,22,181,14,23,198,1,86,94,23,195,1,28,249,22,143,9,23,195,2,2, -35,249,22,7,195,199,27,249,22,73,23,197,1,23,201,1,28,248,22,133,7, -23,195,2,27,249,22,150,15,2,90,196,28,192,28,249,22,184,3,248,22,97, -195,248,22,174,3,248,22,136,7,198,249,22,7,250,22,155,7,199,36,248,22, -97,198,195,249,22,7,250,22,155,7,199,36,248,22,97,198,249,22,73,249,22, -155,7,200,248,22,99,199,197,249,22,7,196,195,90,159,39,11,89,161,39,36, -11,248,22,181,14,23,198,1,28,249,22,143,9,194,2,35,249,22,7,195,197, +248,22,182,14,23,198,1,86,94,23,195,1,28,249,22,144,9,23,195,2,2, +35,249,22,7,195,199,27,249,22,73,23,197,1,23,201,1,28,248,22,134,7, +23,195,2,27,249,22,151,15,2,90,196,28,192,28,249,22,185,3,248,22,97, +195,248,22,175,3,248,22,137,7,198,249,22,7,250,22,156,7,199,36,248,22, +97,198,195,249,22,7,250,22,156,7,199,36,248,22,97,198,249,22,73,249,22, +156,7,200,248,22,99,199,197,249,22,7,196,195,90,159,39,11,89,161,39,36, +11,248,22,182,14,23,198,1,28,249,22,144,9,194,2,35,249,22,7,195,197, 249,80,159,45,58,39,194,249,22,73,197,199,32,92,88,163,36,43,8,34,11, 65,99,108,111,111,112,222,33,97,32,93,88,163,8,36,37,55,11,2,31,222, 33,94,28,248,22,81,248,22,75,23,195,2,248,22,83,27,248,22,74,23,196, -1,28,248,22,160,14,23,194,2,248,22,164,14,23,194,1,192,250,22,84,27, -248,22,74,23,198,2,28,248,22,160,14,23,194,2,248,22,164,14,23,194,1, +1,28,248,22,161,14,23,194,2,248,22,165,14,23,194,1,192,250,22,84,27, +248,22,74,23,198,2,28,248,22,161,14,23,194,2,248,22,165,14,23,194,1, 192,2,44,27,248,22,75,23,198,1,28,248,22,81,248,22,75,23,195,2,248, -22,83,27,248,22,74,23,196,1,28,248,22,160,14,23,194,2,248,22,164,14, -23,194,1,192,250,22,84,27,248,22,74,23,198,2,28,248,22,160,14,23,194, -2,248,22,164,14,23,194,1,192,2,44,27,248,22,75,23,198,1,28,248,22, -81,248,22,75,23,195,2,248,22,83,27,248,22,74,23,196,1,28,248,22,160, -14,23,194,2,248,22,164,14,23,194,1,192,250,22,84,27,248,22,74,23,198, -2,28,248,22,160,14,23,194,2,248,22,164,14,23,194,1,192,2,44,248,2, +22,83,27,248,22,74,23,196,1,28,248,22,161,14,23,194,2,248,22,165,14, +23,194,1,192,250,22,84,27,248,22,74,23,198,2,28,248,22,161,14,23,194, +2,248,22,165,14,23,194,1,192,2,44,27,248,22,75,23,198,1,28,248,22, +81,248,22,75,23,195,2,248,22,83,27,248,22,74,23,196,1,28,248,22,161, +14,23,194,2,248,22,165,14,23,194,1,192,250,22,84,27,248,22,74,23,198, +2,28,248,22,161,14,23,194,2,248,22,165,14,23,194,1,192,2,44,248,2, 93,248,22,75,23,198,1,32,95,88,163,8,36,38,57,11,66,102,105,108,116, 101,114,222,33,96,28,248,22,81,23,195,2,9,28,248,23,194,2,248,22,74, 23,196,2,249,22,73,248,22,74,23,197,2,27,248,22,75,23,198,1,28,248, @@ -429,30 +429,30 @@ 22,75,23,196,1,27,248,22,75,23,195,1,28,248,22,81,23,194,2,9,28, 248,23,197,2,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2,249,2, 95,23,200,1,248,22,75,23,198,1,249,2,95,197,248,22,75,195,28,248,22, -81,23,199,2,86,94,23,198,1,28,23,199,2,28,196,249,22,178,14,200,198, -198,27,28,248,22,81,23,197,2,2,43,249,22,1,22,156,7,248,2,93,23, -199,2,248,23,198,1,251,22,181,7,6,40,40,99,111,108,108,101,99,116,105, +81,23,199,2,86,94,23,198,1,28,23,199,2,28,196,249,22,179,14,200,198, +198,27,28,248,22,81,23,197,2,2,43,249,22,1,22,157,7,248,2,93,23, +199,2,248,23,198,1,251,22,182,7,6,40,40,99,111,108,108,101,99,116,105, 111,110,32,110,111,116,32,102,111,117,110,100,58,32,126,115,32,105,110,32,97, 110,121,32,111,102,58,32,126,115,126,97,28,248,22,81,23,202,1,28,248,22, -160,14,23,201,2,248,22,164,14,23,201,1,23,200,1,250,22,156,7,28,248, -22,160,14,23,204,2,248,22,164,14,23,204,1,23,203,1,2,44,23,201,2, -28,248,22,81,23,200,2,9,28,248,22,160,14,248,22,74,23,201,2,249,22, +161,14,23,201,2,248,22,165,14,23,201,1,23,200,1,250,22,157,7,28,248, +22,161,14,23,204,2,248,22,165,14,23,204,1,23,203,1,2,44,23,201,2, +28,248,22,81,23,200,2,9,28,248,22,161,14,248,22,74,23,201,2,249,22, 73,248,22,74,23,202,2,27,248,22,75,23,203,2,28,248,22,81,23,194,2, -9,28,248,22,160,14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2, -27,248,22,75,23,197,1,28,248,22,81,23,194,2,9,28,248,22,160,14,248, -22,74,23,195,2,249,22,73,248,22,74,23,196,2,249,2,95,22,160,14,248, -22,75,23,198,1,249,2,95,22,160,14,248,22,75,23,196,1,27,248,22,75, -23,195,1,28,248,22,81,23,194,2,9,28,248,22,160,14,248,22,74,23,195, -2,249,22,73,248,22,74,23,196,2,249,2,95,22,160,14,248,22,75,23,198, -1,249,2,95,22,160,14,248,22,75,23,196,1,27,248,22,75,23,201,2,28, -248,22,81,23,194,2,9,28,248,22,160,14,248,22,74,23,195,2,249,22,73, +9,28,248,22,161,14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2, +27,248,22,75,23,197,1,28,248,22,81,23,194,2,9,28,248,22,161,14,248, +22,74,23,195,2,249,22,73,248,22,74,23,196,2,249,2,95,22,161,14,248, +22,75,23,198,1,249,2,95,22,161,14,248,22,75,23,196,1,27,248,22,75, +23,195,1,28,248,22,81,23,194,2,9,28,248,22,161,14,248,22,74,23,195, +2,249,22,73,248,22,74,23,196,2,249,2,95,22,161,14,248,22,75,23,198, +1,249,2,95,22,161,14,248,22,75,23,196,1,27,248,22,75,23,201,2,28, +248,22,81,23,194,2,9,28,248,22,161,14,248,22,74,23,195,2,249,22,73, 248,22,74,23,196,2,27,248,22,75,23,197,1,28,248,22,81,23,194,2,9, -28,248,22,160,14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2,249, -2,95,22,160,14,248,22,75,23,198,1,249,2,95,22,160,14,248,22,75,23, -196,1,27,248,22,75,23,195,1,28,248,22,81,23,194,2,9,28,248,22,160, -14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2,249,2,95,22,160, -14,248,22,75,23,198,1,249,2,95,22,160,14,248,22,75,23,196,1,28,249, -22,5,22,127,23,201,2,250,22,181,7,6,21,21,32,111,114,58,32,126,115, +28,248,22,161,14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2,249, +2,95,22,161,14,248,22,75,23,198,1,249,2,95,22,161,14,248,22,75,23, +196,1,27,248,22,75,23,195,1,28,248,22,81,23,194,2,9,28,248,22,161, +14,248,22,74,23,195,2,249,22,73,248,22,74,23,196,2,249,2,95,22,161, +14,248,22,75,23,198,1,249,2,95,22,161,14,248,22,75,23,196,1,28,249, +22,5,22,127,23,201,2,250,22,182,7,6,21,21,32,111,114,58,32,126,115, 32,105,110,32,97,110,121,32,111,102,58,32,126,115,23,201,1,249,22,2,22, 128,2,28,248,22,81,23,205,2,86,94,23,204,1,9,28,248,22,127,248,22, 74,23,206,2,249,22,73,248,22,74,23,207,2,27,248,22,75,23,208,1,28, @@ -470,77 +470,77 @@ 75,23,195,1,28,248,22,81,23,194,2,9,28,248,22,127,248,22,74,23,195, 2,249,22,73,248,22,74,23,196,2,249,2,95,22,127,248,22,75,23,198,1, 249,2,95,22,127,248,22,75,23,196,1,86,94,23,198,1,2,43,27,248,22, -74,23,200,2,27,28,248,22,160,14,23,195,2,249,22,178,14,23,196,1,23, -198,2,248,22,128,2,23,195,1,28,28,248,22,160,14,248,22,74,23,202,2, -248,22,173,14,23,194,2,10,27,250,22,1,22,178,14,23,197,1,23,201,2, -28,28,248,22,81,23,199,2,10,248,22,173,14,23,194,2,28,23,200,2,28, -28,248,22,172,14,249,22,178,14,195,202,10,27,28,248,22,160,14,201,248,22, -164,14,201,200,27,248,22,136,7,23,195,2,27,28,249,22,188,3,23,196,2, -40,28,249,22,139,7,6,4,4,46,114,107,116,249,22,155,7,23,199,2,249, -22,176,3,23,200,2,40,249,22,156,7,250,22,155,7,23,200,1,36,249,22, -176,3,23,201,1,40,6,3,3,46,115,115,86,95,23,195,1,23,194,1,11, -11,28,23,193,2,248,22,172,14,249,22,178,14,198,23,196,1,11,28,199,249, -22,178,14,194,201,192,254,2,92,202,203,204,205,206,248,22,75,23,16,28,23, -16,23,16,199,28,199,249,22,178,14,194,201,192,254,2,92,202,203,204,205,206, +74,23,200,2,27,28,248,22,161,14,23,195,2,249,22,179,14,23,196,1,23, +198,2,248,22,128,2,23,195,1,28,28,248,22,161,14,248,22,74,23,202,2, +248,22,174,14,23,194,2,10,27,250,22,1,22,179,14,23,197,1,23,201,2, +28,28,248,22,81,23,199,2,10,248,22,174,14,23,194,2,28,23,200,2,28, +28,248,22,173,14,249,22,179,14,195,202,10,27,28,248,22,161,14,201,248,22, +165,14,201,200,27,248,22,137,7,23,195,2,27,28,249,22,189,3,23,196,2, +40,28,249,22,140,7,6,4,4,46,114,107,116,249,22,156,7,23,199,2,249, +22,177,3,23,200,2,40,249,22,157,7,250,22,156,7,23,200,1,36,249,22, +177,3,23,201,1,40,6,3,3,46,115,115,86,95,23,195,1,23,194,1,11, +11,28,23,193,2,248,22,173,14,249,22,179,14,198,23,196,1,11,28,199,249, +22,179,14,194,201,192,254,2,92,202,203,204,205,206,248,22,75,23,16,28,23, +16,23,16,199,28,199,249,22,179,14,194,201,192,254,2,92,202,203,204,205,206, 248,22,75,23,16,23,16,254,2,92,201,202,203,204,205,248,22,75,23,15,23, 15,90,159,38,11,89,161,38,36,11,249,80,159,40,58,39,23,199,1,23,200, -1,27,248,22,61,28,248,22,160,14,195,248,22,164,14,195,194,27,247,22,141, -15,27,250,22,87,28,23,197,2,28,247,22,140,15,27,248,80,159,46,56,39, -10,27,250,22,153,2,23,197,2,23,203,2,11,28,23,193,2,192,86,94,23, -193,1,250,22,153,2,23,197,1,11,9,9,9,28,23,197,1,28,80,159,44, -50,38,27,248,80,159,46,56,39,11,27,250,22,153,2,23,197,2,23,203,1, -11,28,23,193,2,192,86,94,23,193,1,250,22,153,2,23,197,1,11,9,86, -94,23,198,1,9,9,247,22,138,15,254,2,92,199,202,203,205,23,16,199,11, -86,95,28,28,248,22,161,14,23,194,2,10,28,248,22,160,14,23,194,2,10, -28,248,22,133,7,23,194,2,28,248,22,182,14,23,194,2,10,248,22,183,14, -23,194,2,11,12,252,22,179,9,23,200,2,2,33,36,23,198,2,23,199,2, -28,28,248,22,133,7,23,195,2,10,248,22,186,7,23,195,2,86,94,23,194, -1,12,252,22,179,9,23,200,2,2,45,37,23,198,2,23,199,1,90,159,39, -11,89,161,39,36,11,248,22,181,14,23,197,2,86,94,23,195,1,86,94,28, -192,12,250,22,180,9,23,201,1,2,46,23,199,1,249,22,7,194,195,90,159, -38,11,89,161,38,36,11,86,95,28,28,248,22,161,14,23,196,2,10,28,248, -22,160,14,23,196,2,10,28,248,22,133,7,23,196,2,28,248,22,182,14,23, -196,2,10,248,22,183,14,23,196,2,11,12,252,22,179,9,2,26,2,33,36, -23,200,2,23,201,2,28,28,248,22,133,7,23,197,2,10,248,22,186,7,23, -197,2,12,252,22,179,9,2,26,2,45,37,23,200,2,23,201,2,90,159,39, -11,89,161,39,36,11,248,22,181,14,23,199,2,86,94,23,195,1,86,94,28, -192,12,250,22,180,9,2,26,2,46,23,201,2,249,22,7,194,195,27,249,22, -170,14,250,22,159,15,0,20,35,114,120,35,34,40,63,58,91,46,93,91,94, -46,93,42,124,41,36,34,248,22,166,14,23,201,1,28,248,22,133,7,23,203, -2,249,22,148,8,23,204,1,8,63,23,202,1,28,248,22,161,14,23,199,2, -248,22,162,14,23,199,1,86,94,23,198,1,247,22,163,14,28,248,22,160,14, -194,249,22,178,14,195,194,192,90,159,38,11,89,161,38,36,11,86,95,28,28, -248,22,161,14,23,196,2,10,28,248,22,160,14,23,196,2,10,28,248,22,133, -7,23,196,2,28,248,22,182,14,23,196,2,10,248,22,183,14,23,196,2,11, -12,252,22,179,9,2,27,2,33,36,23,200,2,23,201,2,28,28,248,22,133, -7,23,197,2,10,248,22,186,7,23,197,2,12,252,22,179,9,2,27,2,45, -37,23,200,2,23,201,2,90,159,39,11,89,161,39,36,11,248,22,181,14,23, -199,2,86,94,23,195,1,86,94,28,192,12,250,22,180,9,2,27,2,46,23, -201,2,249,22,7,194,195,27,249,22,170,14,249,22,134,8,250,22,160,15,0, -9,35,114,120,35,34,91,46,93,34,248,22,166,14,23,203,1,6,1,1,95, -28,248,22,133,7,23,202,2,249,22,148,8,23,203,1,8,63,23,201,1,28, -248,22,161,14,23,199,2,248,22,162,14,23,199,1,86,94,23,198,1,247,22, -163,14,28,248,22,160,14,194,249,22,178,14,195,194,192,249,247,22,164,5,194, -11,249,247,22,164,5,194,11,27,247,22,140,15,249,80,159,39,40,38,28,23, -195,2,27,248,22,153,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1, -250,22,178,14,248,22,136,15,2,48,247,22,151,8,2,49,11,27,248,80,159, -42,8,29,39,250,22,87,9,248,22,83,248,22,136,15,2,40,9,28,193,249, -22,73,195,194,192,27,247,22,140,15,249,80,159,39,40,38,28,23,195,2,27, -248,22,153,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1,250,22,178, -14,248,22,136,15,2,48,247,22,151,8,2,49,11,27,248,80,159,42,8,30, -39,250,22,87,23,203,1,248,22,83,248,22,136,15,2,40,9,28,193,249,22, -73,195,194,192,27,247,22,140,15,249,80,159,39,40,38,28,23,195,2,27,248, -22,153,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1,250,22,178,14, -248,22,136,15,2,48,247,22,151,8,2,49,11,27,248,80,159,42,8,31,39, -250,22,87,23,203,1,248,22,83,248,22,136,15,2,40,23,204,1,28,193,249, -22,73,195,194,192,86,94,249,22,186,6,247,22,160,5,195,248,22,147,6,249, -22,128,4,36,249,22,176,3,197,198,27,28,23,197,2,86,95,23,196,1,23, -195,1,23,197,1,86,94,23,197,1,27,248,22,136,15,2,32,27,250,80,159, -42,39,39,23,197,1,11,11,27,248,22,131,4,23,199,1,27,28,23,194,2, -23,194,1,86,94,23,194,1,36,27,248,22,131,4,23,202,1,27,28,23,194, -2,23,194,1,86,94,23,194,1,36,249,22,191,5,23,199,1,20,20,95,88, +1,27,248,22,61,28,248,22,161,14,195,248,22,165,14,195,194,27,247,22,142, +15,27,250,22,87,28,23,197,2,28,247,22,141,15,27,248,80,159,46,56,39, +10,27,250,22,154,2,23,197,2,23,203,2,11,28,23,193,2,192,86,94,23, +193,1,250,22,154,2,23,197,1,11,9,9,9,28,23,197,1,28,80,159,44, +50,38,27,248,80,159,46,56,39,11,27,250,22,154,2,23,197,2,23,203,1, +11,28,23,193,2,192,86,94,23,193,1,250,22,154,2,23,197,1,11,9,86, +94,23,198,1,9,9,247,22,139,15,254,2,92,199,202,203,205,23,16,199,11, +86,95,28,28,248,22,162,14,23,194,2,10,28,248,22,161,14,23,194,2,10, +28,248,22,134,7,23,194,2,28,248,22,183,14,23,194,2,10,248,22,184,14, +23,194,2,11,12,252,22,180,9,23,200,2,2,33,36,23,198,2,23,199,2, +28,28,248,22,134,7,23,195,2,10,248,22,187,7,23,195,2,86,94,23,194, +1,12,252,22,180,9,23,200,2,2,45,37,23,198,2,23,199,1,90,159,39, +11,89,161,39,36,11,248,22,182,14,23,197,2,86,94,23,195,1,86,94,28, +192,12,250,22,181,9,23,201,1,2,46,23,199,1,249,22,7,194,195,90,159, +38,11,89,161,38,36,11,86,95,28,28,248,22,162,14,23,196,2,10,28,248, +22,161,14,23,196,2,10,28,248,22,134,7,23,196,2,28,248,22,183,14,23, +196,2,10,248,22,184,14,23,196,2,11,12,252,22,180,9,2,26,2,33,36, +23,200,2,23,201,2,28,28,248,22,134,7,23,197,2,10,248,22,187,7,23, +197,2,12,252,22,180,9,2,26,2,45,37,23,200,2,23,201,2,90,159,39, +11,89,161,39,36,11,248,22,182,14,23,199,2,86,94,23,195,1,86,94,28, +192,12,250,22,181,9,2,26,2,46,23,201,2,249,22,7,194,195,27,249,22, +171,14,250,22,160,15,0,20,35,114,120,35,34,40,63,58,91,46,93,91,94, +46,93,42,124,41,36,34,248,22,167,14,23,201,1,28,248,22,134,7,23,203, +2,249,22,149,8,23,204,1,8,63,23,202,1,28,248,22,162,14,23,199,2, +248,22,163,14,23,199,1,86,94,23,198,1,247,22,164,14,28,248,22,161,14, +194,249,22,179,14,195,194,192,90,159,38,11,89,161,38,36,11,86,95,28,28, +248,22,162,14,23,196,2,10,28,248,22,161,14,23,196,2,10,28,248,22,134, +7,23,196,2,28,248,22,183,14,23,196,2,10,248,22,184,14,23,196,2,11, +12,252,22,180,9,2,27,2,33,36,23,200,2,23,201,2,28,28,248,22,134, +7,23,197,2,10,248,22,187,7,23,197,2,12,252,22,180,9,2,27,2,45, +37,23,200,2,23,201,2,90,159,39,11,89,161,39,36,11,248,22,182,14,23, +199,2,86,94,23,195,1,86,94,28,192,12,250,22,181,9,2,27,2,46,23, +201,2,249,22,7,194,195,27,249,22,171,14,249,22,135,8,250,22,161,15,0, +9,35,114,120,35,34,91,46,93,34,248,22,167,14,23,203,1,6,1,1,95, +28,248,22,134,7,23,202,2,249,22,149,8,23,203,1,8,63,23,201,1,28, +248,22,162,14,23,199,2,248,22,163,14,23,199,1,86,94,23,198,1,247,22, +164,14,28,248,22,161,14,194,249,22,179,14,195,194,192,249,247,22,165,5,194, +11,249,247,22,165,5,194,11,27,247,22,141,15,249,80,159,39,40,38,28,23, +195,2,27,248,22,154,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1, +250,22,179,14,248,22,137,15,2,48,247,22,152,8,2,49,11,27,248,80,159, +42,8,29,39,250,22,87,9,248,22,83,248,22,137,15,2,40,9,28,193,249, +22,73,195,194,192,27,247,22,141,15,249,80,159,39,40,38,28,23,195,2,27, +248,22,154,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1,250,22,179, +14,248,22,137,15,2,48,247,22,152,8,2,49,11,27,248,80,159,42,8,30, +39,250,22,87,23,203,1,248,22,83,248,22,137,15,2,40,9,28,193,249,22, +73,195,194,192,27,247,22,141,15,249,80,159,39,40,38,28,23,195,2,27,248, +22,154,8,2,47,28,192,192,2,43,2,43,27,28,23,196,1,250,22,179,14, +248,22,137,15,2,48,247,22,152,8,2,49,11,27,248,80,159,42,8,31,39, +250,22,87,23,203,1,248,22,83,248,22,137,15,2,40,23,204,1,28,193,249, +22,73,195,194,192,86,94,249,22,187,6,247,22,161,5,195,248,22,148,6,249, +22,129,4,36,249,22,177,3,197,198,27,28,23,197,2,86,95,23,196,1,23, +195,1,23,197,1,86,94,23,197,1,27,248,22,137,15,2,32,27,250,80,159, +42,39,39,23,197,1,11,11,27,248,22,132,4,23,199,1,27,28,23,194,2, +23,194,1,86,94,23,194,1,36,27,248,22,132,4,23,202,1,27,28,23,194, +2,23,194,1,86,94,23,194,1,36,249,22,128,6,23,199,1,20,20,95,88, 163,8,36,36,48,11,9,224,4,2,33,107,23,195,1,23,197,1,27,248,22, -176,5,23,195,1,248,80,159,39,8,32,39,193,159,36,20,113,159,36,16,1, +177,5,23,195,1,248,80,159,39,8,32,39,193,159,36,20,113,159,36,16,1, 11,16,0,20,26,144,9,2,1,2,1,29,11,11,11,9,9,11,11,11,10, 43,80,158,36,36,20,113,159,40,16,29,2,2,2,3,2,4,2,5,2,6, 2,7,2,8,2,9,2,10,2,11,2,12,2,13,2,14,2,15,2,16,30, @@ -563,12 +563,12 @@ 223,0,33,52,80,159,36,8,30,39,20,15,16,2,88,163,8,36,37,51,16, 2,44,8,128,128,2,31,223,0,33,53,80,159,36,8,29,39,20,15,16,2, 32,0,88,163,36,37,45,11,2,2,222,33,54,80,159,36,36,37,20,15,16, -2,249,22,135,7,7,92,7,92,80,159,36,37,37,20,15,16,2,88,163,36, +2,249,22,136,7,7,92,7,92,80,159,36,37,37,20,15,16,2,88,163,36, 37,54,38,2,4,223,0,33,55,80,159,36,38,37,20,15,16,2,20,25,96, 2,5,88,163,8,36,39,8,25,52,9,223,0,33,62,88,163,36,38,47,44, 9,223,0,33,63,88,163,36,37,46,44,9,223,0,33,64,80,159,36,39,37, -20,15,16,2,27,248,22,144,15,248,22,147,8,27,28,249,22,143,9,247,22, -155,8,2,34,6,1,1,59,6,1,1,58,250,22,181,7,6,14,14,40,91, +20,15,16,2,27,248,22,145,15,248,22,148,8,27,28,249,22,144,9,247,22, +156,8,2,34,6,1,1,59,6,1,1,58,250,22,182,7,6,14,14,40,91, 94,126,97,93,42,41,126,97,40,46,42,41,23,196,2,23,196,1,88,163,8, 36,38,48,11,2,6,223,0,33,68,80,159,36,40,37,20,15,16,2,32,0, 88,163,8,36,38,50,11,2,7,222,33,69,80,159,36,41,37,20,15,16,2, @@ -576,11 +576,11 @@ 16,2,32,0,88,163,8,36,38,46,11,2,9,222,33,72,80,159,36,43,37, 20,15,16,2,88,163,45,39,52,8,128,8,2,10,223,0,33,74,80,159,36, 44,37,20,15,16,2,88,163,45,40,53,8,128,8,2,12,223,0,33,76,80, -159,36,46,37,20,15,16,2,248,22,136,15,70,108,105,110,107,115,45,102,105, -108,101,80,159,36,47,37,20,15,16,2,247,22,133,2,80,158,36,48,20,15, +159,36,46,37,20,15,16,2,248,22,137,15,70,108,105,110,107,115,45,102,105, +108,101,80,159,36,47,37,20,15,16,2,247,22,134,2,80,158,36,48,20,15, 16,2,2,77,80,158,36,49,20,15,16,2,248,80,159,37,51,37,88,163,36, 36,49,8,240,8,0,3,0,9,223,1,33,78,80,159,36,50,37,20,15,16, -2,247,22,133,2,80,158,36,54,20,15,16,2,2,77,80,158,36,55,20,15, +2,247,22,134,2,80,158,36,54,20,15,16,2,2,77,80,158,36,55,20,15, 16,2,88,163,36,37,44,8,240,0,120,47,0,2,23,223,0,33,89,80,159, 36,56,37,20,15,16,2,88,163,36,38,56,8,240,0,0,64,0,2,24,223, 0,33,91,80,159,36,58,37,20,15,16,2,88,163,36,40,59,8,240,0,64, @@ -600,7 +600,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 10438); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,12,0,0,0,1,0,0,15,0,40,0, 57,0,75,0,97,0,120,0,140,0,162,0,169,0,176,0,183,0,0,0,179, 1,0,0,74,35,37,112,108,97,99,101,45,115,116,114,117,99,116,1,23,115, @@ -618,8 +618,8 @@ 2,6,38,11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,16,5,11, 11,11,11,11,16,5,2,3,2,7,2,8,2,4,2,2,41,41,37,12,11, 11,16,0,16,0,16,0,36,36,11,12,11,11,16,0,16,0,16,0,36,36, -16,2,20,15,16,6,253,22,185,10,2,3,11,38,36,11,248,22,83,249,22, -73,22,173,10,88,163,36,37,45,44,9,223,9,33,9,80,159,36,36,37,80, +16,2,20,15,16,6,253,22,186,10,2,3,11,38,36,11,248,22,83,249,22, +73,22,174,10,88,163,36,37,45,44,9,223,9,33,9,80,159,36,36,37,80, 159,36,37,37,80,159,36,38,37,80,159,36,39,37,80,159,36,40,37,20,15, 16,3,249,22,7,88,163,36,37,45,44,9,223,2,33,10,88,163,36,37,45, 44,9,223,2,33,11,80,159,36,41,37,80,159,36,42,37,93,29,94,65,113, @@ -627,7 +627,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 501); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,81,0,0,0,1,0,0,7,0,18,0, 45,0,51,0,64,0,73,0,80,0,102,0,124,0,150,0,158,0,170,0,185, 0,201,0,219,0,239,0,251,0,11,1,34,1,46,1,77,1,84,1,89,1, @@ -659,125 +659,125 @@ 98,109,111,100,6,2,2,46,46,6,1,1,46,64,102,105,108,101,66,112,108, 97,110,101,116,6,8,8,109,97,105,110,46,114,107,116,6,4,4,46,114,107, 116,6,0,0,67,105,103,110,111,114,101,100,249,22,14,195,80,159,38,49,38, -249,80,159,38,52,39,195,10,90,159,39,11,89,161,39,36,11,248,22,181,14, -197,86,95,23,195,1,23,193,1,28,249,22,148,15,0,11,35,114,120,34,91, -46,93,115,115,36,34,248,22,165,14,23,197,1,249,80,159,41,56,39,198,2, -25,196,27,28,23,195,2,28,249,22,143,9,23,197,2,80,158,39,50,86,94, -23,195,1,80,158,37,51,27,248,22,141,5,23,197,2,27,28,248,22,71,23, -195,2,248,22,74,23,195,1,23,194,1,28,248,22,160,14,23,194,2,90,159, -39,11,89,161,39,36,11,248,22,181,14,23,197,1,86,95,20,18,159,11,80, +249,80,159,38,52,39,195,10,90,159,39,11,89,161,39,36,11,248,22,182,14, +197,86,95,23,195,1,23,193,1,28,249,22,149,15,0,11,35,114,120,34,91, +46,93,115,115,36,34,248,22,166,14,23,197,1,249,80,159,41,56,39,198,2, +25,196,27,28,23,195,2,28,249,22,144,9,23,197,2,80,158,39,50,86,94, +23,195,1,80,158,37,51,27,248,22,142,5,23,197,2,27,28,248,22,71,23, +195,2,248,22,74,23,195,1,23,194,1,28,248,22,161,14,23,194,2,90,159, +39,11,89,161,39,36,11,248,22,182,14,23,197,1,86,95,20,18,159,11,80, 158,42,50,199,20,18,159,11,80,158,42,51,192,192,11,11,28,23,193,2,192, -86,94,23,193,1,27,247,22,165,5,28,192,192,247,22,137,15,28,24,194,2, -12,20,13,159,80,159,36,55,37,80,158,36,53,89,161,37,37,10,249,22,183, +86,94,23,193,1,27,247,22,166,5,28,192,192,247,22,138,15,28,24,194,2, +12,20,13,159,80,159,36,55,37,80,158,36,53,89,161,37,37,10,249,22,184, 4,21,94,2,26,6,19,19,112,108,97,110,101,116,47,114,101,115,111,108,118, 101,114,46,114,107,116,1,27,112,108,97,110,101,116,45,109,111,100,117,108,101, -45,110,97,109,101,45,114,101,115,111,108,118,101,114,12,250,22,178,14,23,197, -1,23,199,1,249,80,159,43,39,39,23,198,1,2,29,250,22,178,14,23,197, -1,23,199,1,249,80,159,43,39,39,23,198,1,2,29,252,22,178,14,23,199, -1,23,201,1,2,30,247,22,156,8,249,80,159,45,39,39,23,200,1,80,159, -45,36,38,252,22,178,14,23,199,1,23,201,1,2,30,247,22,156,8,249,80, -159,45,39,39,23,200,1,80,159,45,36,38,27,252,22,178,14,23,200,1,23, -202,1,2,30,247,22,156,8,249,80,159,46,39,39,23,201,1,80,159,46,36, -38,27,250,22,131,15,196,11,32,0,88,163,8,36,36,41,11,9,222,11,28, -192,249,22,73,195,194,11,27,252,22,178,14,23,200,1,23,202,1,2,30,247, -22,156,8,249,80,159,46,39,39,23,201,1,80,159,46,36,38,27,250,22,131, +45,110,97,109,101,45,114,101,115,111,108,118,101,114,12,250,22,179,14,23,197, +1,23,199,1,249,80,159,43,39,39,23,198,1,2,29,250,22,179,14,23,197, +1,23,199,1,249,80,159,43,39,39,23,198,1,2,29,252,22,179,14,23,199, +1,23,201,1,2,30,247,22,157,8,249,80,159,45,39,39,23,200,1,80,159, +45,36,38,252,22,179,14,23,199,1,23,201,1,2,30,247,22,157,8,249,80, +159,45,39,39,23,200,1,80,159,45,36,38,27,252,22,179,14,23,200,1,23, +202,1,2,30,247,22,157,8,249,80,159,46,39,39,23,201,1,80,159,46,36, +38,27,250,22,132,15,196,11,32,0,88,163,8,36,36,41,11,9,222,11,28, +192,249,22,73,195,194,11,27,252,22,179,14,23,200,1,23,202,1,2,30,247, +22,157,8,249,80,159,46,39,39,23,201,1,80,159,46,36,38,27,250,22,132, 15,196,11,32,0,88,163,8,36,36,41,11,9,222,11,28,192,249,22,73,195, -194,11,27,250,22,178,14,23,198,1,23,200,1,249,80,159,44,39,39,23,199, -1,2,29,27,250,22,131,15,196,11,32,0,88,163,8,36,36,41,11,9,222, -11,28,192,249,22,73,195,194,11,27,250,22,178,14,23,198,1,23,200,1,249, -80,159,44,39,39,23,199,1,2,29,27,250,22,131,15,196,11,32,0,88,163, +194,11,27,250,22,179,14,23,198,1,23,200,1,249,80,159,44,39,39,23,199, +1,2,29,27,250,22,132,15,196,11,32,0,88,163,8,36,36,41,11,9,222, +11,28,192,249,22,73,195,194,11,27,250,22,179,14,23,198,1,23,200,1,249, +80,159,44,39,39,23,199,1,2,29,27,250,22,132,15,196,11,32,0,88,163, 8,36,36,41,11,9,222,11,28,192,249,22,73,195,194,11,86,95,28,248,80, -159,37,38,39,23,195,2,12,250,22,179,9,2,27,6,25,25,112,97,116,104, +159,37,38,39,23,195,2,12,250,22,180,9,2,27,6,25,25,112,97,116,104, 32,111,114,32,118,97,108,105,100,45,112,97,116,104,32,115,116,114,105,110,103, 23,197,2,28,28,23,195,2,28,248,22,58,23,196,2,10,28,248,22,82,23, -196,2,28,249,22,186,3,248,22,86,23,198,2,37,28,28,248,22,58,248,22, -74,23,197,2,10,248,22,141,9,248,22,74,23,197,2,249,22,4,22,58,248, -22,75,23,198,2,11,11,11,10,12,250,22,179,9,2,27,6,71,71,35,102, +196,2,28,249,22,187,3,248,22,86,23,198,2,37,28,28,248,22,58,248,22, +74,23,197,2,10,248,22,142,9,248,22,74,23,197,2,249,22,4,22,58,248, +22,75,23,198,2,11,11,11,10,12,250,22,180,9,2,27,6,71,71,35,102, 44,32,115,121,109,98,111,108,44,32,108,105,115,116,32,40,108,101,110,103,116, 104,32,50,32,111,114,32,109,111,114,101,41,32,111,102,32,115,121,109,98,111, 108,32,111,114,32,35,102,32,102,111,108,108,111,119,101,100,32,98,121,32,115, 121,109,98,111,108,115,23,197,2,90,159,46,11,89,161,37,36,11,28,248,22, -184,14,23,205,2,23,204,2,27,247,22,165,5,28,23,193,2,249,22,185,14, -23,207,2,23,195,1,23,205,2,89,161,39,37,11,248,22,181,14,23,205,1, -86,94,23,196,1,89,161,38,40,11,28,23,205,2,27,248,22,165,14,23,197, -2,27,248,22,191,7,23,195,2,28,28,249,22,188,3,23,195,2,40,249,22, -130,8,2,25,249,22,133,8,23,198,2,249,22,176,3,23,199,2,40,11,249, -22,7,23,199,2,248,22,169,14,249,22,134,8,250,22,133,8,23,202,1,36, -249,22,176,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249, -22,7,23,197,2,11,89,161,37,42,11,28,249,22,143,9,23,199,2,23,197, -2,23,193,2,249,22,178,14,23,196,2,23,199,2,89,161,37,43,11,28,23, -198,2,28,249,22,143,9,23,200,2,23,197,1,23,193,1,86,94,23,193,1, -249,22,178,14,23,196,2,23,200,2,86,94,23,195,1,11,89,161,37,44,11, -28,249,22,143,9,23,196,2,68,114,101,108,97,116,105,118,101,86,94,23,194, -1,2,28,23,194,1,89,161,37,45,11,247,22,139,15,27,250,22,131,15,23, +185,14,23,205,2,23,204,2,27,247,22,166,5,28,23,193,2,249,22,186,14, +23,207,2,23,195,1,23,205,2,89,161,39,37,11,248,22,182,14,23,205,1, +86,94,23,196,1,89,161,38,40,11,28,23,205,2,27,248,22,166,14,23,197, +2,27,248,22,128,8,23,195,2,28,28,249,22,189,3,23,195,2,40,249,22, +131,8,2,25,249,22,134,8,23,198,2,249,22,177,3,23,199,2,40,11,249, +22,7,23,199,2,248,22,170,14,249,22,135,8,250,22,134,8,23,202,1,36, +249,22,177,3,23,203,1,40,5,3,46,115,115,249,22,7,23,199,2,11,249, +22,7,23,197,2,11,89,161,37,42,11,28,249,22,144,9,23,199,2,23,197, +2,23,193,2,249,22,179,14,23,196,2,23,199,2,89,161,37,43,11,28,23, +198,2,28,249,22,144,9,23,200,2,23,197,1,23,193,1,86,94,23,193,1, +249,22,179,14,23,196,2,23,200,2,86,94,23,195,1,11,89,161,37,44,11, +28,249,22,144,9,23,196,2,68,114,101,108,97,116,105,118,101,86,94,23,194, +1,2,28,23,194,1,89,161,37,45,11,247,22,140,15,27,250,22,132,15,23, 203,2,11,32,0,88,163,8,36,36,41,11,9,222,11,27,28,23,194,2,249, 22,73,23,203,2,23,196,1,86,94,23,194,1,11,27,28,23,203,2,28,23, -194,2,11,27,250,22,131,15,23,207,2,11,32,0,88,163,8,36,36,41,11, +194,2,11,27,250,22,132,15,23,207,2,11,32,0,88,163,8,36,36,41,11, 9,222,11,28,192,249,22,73,23,206,2,194,11,11,27,28,23,195,2,23,195, 2,23,194,2,27,88,163,36,37,50,44,62,122,111,225,15,13,9,33,46,27, 88,163,36,37,50,44,66,97,108,116,45,122,111,225,16,14,11,33,47,27,88, 163,36,37,52,45,9,225,17,15,11,33,48,27,88,163,36,37,52,45,9,225, -18,16,13,33,49,27,28,23,200,2,23,200,2,248,22,141,9,23,200,2,27, -28,23,208,2,28,23,200,2,86,94,23,201,1,23,200,2,248,22,141,9,23, +18,16,13,33,49,27,28,23,200,2,23,200,2,248,22,142,9,23,200,2,27, +28,23,208,2,28,23,200,2,86,94,23,201,1,23,200,2,248,22,142,9,23, 202,1,11,27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,8,36,37, 53,45,9,225,24,22,18,33,50,23,216,2,27,28,23,202,2,11,193,28,192, -192,28,193,28,23,202,2,28,249,22,188,3,248,22,75,196,248,22,75,23,205, +192,28,193,28,23,202,2,28,249,22,189,3,248,22,75,196,248,22,75,23,205, 2,193,11,11,11,11,86,94,23,197,1,11,28,23,193,2,86,105,23,213,1, 23,211,1,23,210,1,23,209,1,23,208,1,23,201,1,23,200,1,23,199,1, 23,198,1,23,196,1,23,195,1,23,194,1,20,13,159,80,159,57,40,37,250, -80,159,8,24,41,37,249,22,27,11,80,159,8,26,40,37,22,182,4,11,20, +80,159,8,24,41,37,249,22,27,11,80,159,8,26,40,37,22,183,4,11,20, 13,159,80,159,57,40,37,250,80,159,8,24,41,37,249,22,27,11,80,159,8, -26,40,37,22,165,5,28,248,22,160,14,23,216,2,23,215,1,86,94,23,215, -1,247,22,137,15,249,247,22,143,15,248,22,74,195,23,25,86,94,23,193,1, +26,40,37,22,166,5,28,248,22,161,14,23,216,2,23,215,1,86,94,23,215, +1,247,22,138,15,249,247,22,144,15,248,22,74,195,23,25,86,94,23,193,1, 27,28,23,195,2,28,23,197,1,27,249,22,5,88,163,8,36,37,53,45,9, 225,25,23,20,33,51,23,217,2,27,28,23,204,2,11,193,28,192,192,28,193, -28,203,28,249,22,188,3,248,22,75,196,248,22,75,206,193,11,11,11,11,86, +28,203,28,249,22,189,3,248,22,75,196,248,22,75,206,193,11,11,11,11,86, 94,23,197,1,11,28,23,193,2,86,102,23,214,1,23,211,1,23,210,1,23, 209,1,23,201,1,23,200,1,23,199,1,23,196,1,23,195,1,20,13,159,80, 159,58,40,37,250,80,159,8,25,41,37,249,22,27,11,80,159,8,27,40,37, -22,182,4,23,215,1,20,13,159,80,159,58,40,37,250,80,159,8,25,41,37, -249,22,27,11,80,159,8,27,40,37,22,165,5,28,248,22,160,14,23,217,2, -23,216,1,86,94,23,216,1,247,22,137,15,249,247,22,143,15,248,22,74,195, +22,183,4,23,215,1,20,13,159,80,159,58,40,37,250,80,159,8,25,41,37, +249,22,27,11,80,159,8,27,40,37,22,166,5,28,248,22,161,14,23,217,2, +23,216,1,86,94,23,216,1,247,22,138,15,249,247,22,144,15,248,22,74,195, 23,26,86,94,23,193,1,27,28,23,197,2,28,23,201,1,27,249,22,5,20, 20,94,88,163,8,36,37,51,44,9,225,26,24,20,33,52,23,213,1,23,218, -2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22,188, +2,27,28,23,204,2,11,193,28,192,192,28,193,28,23,204,2,28,249,22,189, 3,248,22,75,196,248,22,75,23,207,2,193,11,11,11,86,94,23,210,1,11, 86,94,23,201,1,11,28,23,193,2,86,101,23,215,1,23,213,1,23,212,1, 23,211,1,23,202,1,23,200,1,23,197,1,23,196,1,20,13,159,80,159,59, -40,37,250,80,159,8,26,41,37,249,22,27,11,80,159,8,28,40,37,22,182, +40,37,250,80,159,8,26,41,37,249,22,27,11,80,159,8,28,40,37,22,183, 4,11,20,13,159,80,159,59,40,37,250,80,159,8,26,41,37,249,22,27,11, -80,159,8,28,40,37,22,165,5,28,248,22,160,14,23,218,2,23,217,1,86, -94,23,217,1,247,22,137,15,249,247,22,163,5,248,22,74,195,23,27,86,94, +80,159,8,28,40,37,22,166,5,28,248,22,161,14,23,218,2,23,217,1,86, +94,23,217,1,247,22,138,15,249,247,22,164,5,248,22,74,195,23,27,86,94, 23,193,1,27,28,23,197,1,28,23,201,1,27,249,22,5,20,20,94,88,163, 8,36,37,51,44,9,225,27,25,22,33,53,23,215,1,23,219,1,27,28,23, -205,2,11,193,28,192,192,28,193,28,204,28,249,22,188,3,248,22,75,196,248, +205,2,11,193,28,192,192,28,193,28,204,28,249,22,189,3,248,22,75,196,248, 22,75,23,15,193,11,11,11,86,95,23,216,1,23,212,1,11,86,94,23,201, 1,11,28,23,193,2,86,95,23,213,1,23,198,1,20,13,159,80,159,8,24, -40,37,250,80,159,8,27,41,37,249,22,27,11,80,159,8,29,40,37,22,182, +40,37,250,80,159,8,27,41,37,249,22,27,11,80,159,8,29,40,37,22,183, 4,23,217,1,20,13,159,80,159,8,24,40,37,250,80,159,8,27,41,37,249, -22,27,11,80,159,8,29,40,37,22,165,5,28,248,22,160,14,23,219,2,23, -218,1,86,94,23,218,1,247,22,137,15,249,247,22,163,5,248,22,74,195,23, +22,27,11,80,159,8,29,40,37,22,166,5,28,248,22,161,14,23,219,2,23, +218,1,86,94,23,218,1,247,22,138,15,249,247,22,164,5,248,22,74,195,23, 28,86,94,23,193,1,28,28,248,22,71,23,220,2,248,22,74,23,220,2,10, 27,28,23,199,2,86,94,23,215,1,23,214,1,86,94,23,214,1,23,215,1, -28,28,248,22,71,23,221,2,248,22,141,9,248,22,172,14,23,195,2,11,12, +28,28,248,22,71,23,221,2,248,22,142,9,248,22,173,14,23,195,2,11,12, 20,13,159,80,159,8,25,40,37,250,80,159,8,28,41,37,249,22,27,11,80, -159,8,30,40,37,22,182,4,28,23,30,28,23,202,1,11,195,86,94,23,202, +159,8,30,40,37,22,183,4,28,23,30,28,23,202,1,11,195,86,94,23,202, 1,11,20,13,159,80,159,8,25,40,37,250,80,159,8,28,41,37,249,22,27, -11,80,159,8,30,40,37,22,165,5,28,248,22,160,14,23,220,2,23,219,1, -86,94,23,219,1,247,22,137,15,249,247,22,163,5,194,23,29,12,27,249,22, -163,8,80,159,39,45,38,249,22,183,3,248,22,179,3,248,22,166,2,200,8, -128,8,27,28,193,248,22,169,2,194,11,28,192,27,249,22,96,198,195,28,192, -248,22,75,193,11,11,27,249,22,183,3,248,22,179,3,248,22,166,2,198,8, -128,8,27,249,22,163,8,80,159,40,45,38,195,27,28,193,248,22,169,2,194, -11,250,22,164,8,80,159,42,45,38,197,248,22,168,2,249,22,73,249,22,73, +11,80,159,8,30,40,37,22,166,5,28,248,22,161,14,23,220,2,23,219,1, +86,94,23,219,1,247,22,138,15,249,247,22,164,5,194,23,29,12,27,249,22, +164,8,80,159,39,45,38,249,22,184,3,248,22,180,3,248,22,167,2,200,8, +128,8,27,28,193,248,22,170,2,194,11,28,192,27,249,22,96,198,195,28,192, +248,22,75,193,11,11,27,249,22,184,3,248,22,180,3,248,22,167,2,198,8, +128,8,27,249,22,164,8,80,159,40,45,38,195,27,28,193,248,22,170,2,194, +11,250,22,165,8,80,159,42,45,38,197,248,22,169,2,249,22,73,249,22,73, 204,205,28,198,198,9,0,17,35,114,120,34,94,40,46,42,63,41,47,40,46, 42,41,36,34,32,58,88,163,8,36,37,59,11,2,31,222,33,59,27,249,22, -148,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,73,248,22, -98,23,196,2,27,248,22,107,23,197,1,27,249,22,148,15,2,57,23,196,2, +149,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,73,248,22, +98,23,196,2,27,248,22,107,23,197,1,27,249,22,149,15,2,57,23,196,2, 28,23,193,2,86,94,23,194,1,249,22,73,248,22,98,23,196,2,27,248,22, -107,23,197,1,27,249,22,148,15,2,57,23,196,2,28,23,193,2,86,94,23, +107,23,197,1,27,249,22,149,15,2,57,23,196,2,28,23,193,2,86,94,23, 194,1,249,22,73,248,22,98,23,196,2,27,248,22,107,23,197,1,27,249,22, -148,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,73,248,22, +149,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,73,248,22, 98,23,196,2,248,2,58,248,22,107,23,197,1,248,22,83,194,248,22,83,194, 248,22,83,194,248,22,83,194,32,60,88,163,36,37,55,11,2,31,222,33,61, 28,248,22,81,248,22,75,23,195,2,249,22,7,9,248,22,74,195,90,159,38, @@ -786,12 +786,12 @@ 196,28,248,22,81,248,22,75,23,195,2,249,22,7,9,248,22,74,195,90,159, 38,11,89,161,38,36,11,248,2,60,248,22,75,196,249,22,7,249,22,73,248, 22,74,199,196,195,249,22,7,249,22,73,248,22,74,199,196,195,249,22,7,249, -22,73,248,22,74,199,196,195,27,27,249,22,148,15,2,57,23,197,2,28,23, +22,73,248,22,74,199,196,195,27,27,249,22,149,15,2,57,23,197,2,28,23, 193,2,86,94,23,195,1,249,22,73,248,22,98,23,196,2,27,248,22,107,23, -197,1,27,249,22,148,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1, -249,22,73,248,22,98,23,196,2,27,248,22,107,23,197,1,27,249,22,148,15, +197,1,27,249,22,149,15,2,57,23,196,2,28,23,193,2,86,94,23,194,1, +249,22,73,248,22,98,23,196,2,27,248,22,107,23,197,1,27,249,22,149,15, 2,57,23,196,2,28,23,193,2,86,94,23,194,1,249,22,73,248,22,98,23, -196,2,27,248,22,107,23,197,1,27,249,22,148,15,2,57,23,196,2,28,23, +196,2,27,248,22,107,23,197,1,27,249,22,149,15,2,57,23,196,2,28,23, 193,2,86,94,23,194,1,249,22,73,248,22,98,23,196,2,248,2,58,248,22, 107,23,197,1,248,22,83,194,248,22,83,194,248,22,83,194,248,22,83,195,28, 23,195,1,192,28,248,22,81,248,22,75,23,195,2,249,22,7,9,248,22,74, @@ -800,139 +800,139 @@ 89,161,38,36,11,28,248,22,81,248,22,75,23,197,2,249,22,7,9,248,22, 74,197,90,159,38,11,89,161,38,36,11,248,2,60,248,22,75,198,249,22,7, 249,22,73,248,22,74,201,196,195,249,22,7,249,22,73,248,22,74,202,196,195, -249,22,7,249,22,73,248,22,74,200,196,195,86,95,28,248,22,139,5,195,12, -250,22,179,9,2,21,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100, +249,22,7,249,22,73,248,22,74,200,196,195,86,95,28,248,22,140,5,195,12, +250,22,180,9,2,21,6,20,20,114,101,115,111,108,118,101,100,45,109,111,100, 117,108,101,45,112,97,116,104,197,28,24,193,2,248,24,194,1,195,86,94,23, -193,1,12,27,250,22,153,2,80,159,41,43,38,248,22,173,15,247,22,138,13, -11,27,28,23,194,2,193,86,94,23,194,1,27,247,22,133,2,86,94,250,22, -151,2,80,159,43,43,38,248,22,173,15,247,22,138,13,195,192,250,22,151,2, +193,1,12,27,250,22,154,2,80,159,41,43,38,248,22,174,15,247,22,139,13, +11,27,28,23,194,2,193,86,94,23,194,1,27,247,22,134,2,86,94,250,22, +152,2,80,159,43,43,38,248,22,174,15,247,22,139,13,195,192,250,22,152,2, 195,199,66,97,116,116,97,99,104,251,211,197,198,199,10,32,65,88,163,36,38, 47,11,76,102,108,97,116,116,101,110,45,115,117,98,45,112,97,116,104,222,33, 68,32,66,88,163,36,40,54,11,2,31,222,33,67,28,248,22,81,23,197,2, -28,248,22,81,195,192,249,22,73,194,248,22,88,197,28,249,22,145,9,248,22, +28,248,22,81,195,192,249,22,73,194,248,22,88,197,28,249,22,146,9,248,22, 74,23,199,2,2,33,28,248,22,81,23,196,2,86,95,23,196,1,23,195,1, -250,22,176,9,2,21,6,37,37,116,111,111,32,109,97,110,121,32,34,46,46, +250,22,177,9,2,21,6,37,37,116,111,111,32,109,97,110,121,32,34,46,46, 34,115,32,105,110,32,115,117,98,109,111,100,117,108,101,32,112,97,116,104,58, -32,126,46,115,250,22,84,2,32,28,249,22,145,9,23,201,2,2,34,198,28, -248,22,160,14,199,198,249,22,83,28,248,22,58,201,2,4,2,35,200,199,251, +32,126,46,115,250,22,84,2,32,28,249,22,146,9,23,201,2,2,34,198,28, +248,22,161,14,199,198,249,22,83,28,248,22,58,201,2,4,2,35,200,199,251, 2,66,196,197,248,22,75,199,248,22,75,200,251,2,66,196,197,249,22,73,248, -22,74,202,200,248,22,75,200,251,2,66,196,197,9,197,27,249,22,156,7,6, +22,74,202,200,248,22,75,200,251,2,66,196,197,9,197,27,249,22,157,7,6, 31,31,115,116,97,110,100,97,114,100,45,109,111,100,117,108,101,45,110,97,109, -101,45,114,101,115,111,108,118,101,114,58,32,196,28,193,250,22,178,9,11,195, -196,248,22,176,9,193,28,249,22,139,7,194,2,34,2,28,28,249,22,139,7, +101,45,114,101,115,111,108,118,101,114,58,32,196,28,193,250,22,179,9,11,195, +196,248,22,177,9,193,28,249,22,140,7,194,2,34,2,28,28,249,22,140,7, 194,2,33,62,117,112,192,32,71,88,163,8,36,37,50,11,67,115,115,45,62, -114,107,116,222,33,72,27,248,22,136,7,194,28,249,22,188,3,194,39,28,249, -22,139,7,6,3,3,46,115,115,249,22,155,7,197,249,22,176,3,198,39,249, -22,156,7,250,22,155,7,198,36,249,22,176,3,199,39,2,38,193,193,0,8, -35,114,120,34,91,46,93,34,28,249,22,145,9,248,22,75,23,200,2,23,197, -1,28,249,22,143,9,248,22,74,23,200,2,23,196,1,251,22,176,9,2,21, +114,107,116,222,33,72,27,248,22,137,7,194,28,249,22,189,3,194,39,28,249, +22,140,7,6,3,3,46,115,115,249,22,156,7,197,249,22,177,3,198,39,249, +22,157,7,250,22,156,7,198,36,249,22,177,3,199,39,2,38,193,193,0,8, +35,114,120,34,91,46,93,34,28,249,22,146,9,248,22,75,23,200,2,23,197, +1,28,249,22,144,9,248,22,74,23,200,2,23,196,1,251,22,177,9,2,21, 6,28,28,99,121,99,108,101,32,105,110,32,108,111,97,100,105,110,103,32,97, 116,32,126,46,115,58,32,126,46,115,23,200,1,249,22,2,22,75,248,22,88, 249,22,73,23,206,1,23,202,1,12,12,247,192,20,13,159,80,159,43,48,38, -249,22,73,249,22,73,248,22,173,15,247,22,138,13,23,201,1,23,195,1,20, +249,22,73,249,22,73,248,22,174,15,247,22,139,13,23,201,1,23,195,1,20, 13,159,80,159,43,40,37,250,80,159,46,41,37,249,22,27,11,80,159,48,40, -37,22,181,4,23,198,2,249,247,22,164,5,23,200,1,27,248,22,61,248,22, -164,14,23,201,1,28,23,202,2,28,250,22,153,2,23,200,1,23,201,1,11, -249,22,73,11,203,249,22,73,194,203,192,86,94,28,28,248,22,160,14,23,196, -2,10,248,22,149,5,23,196,2,12,28,23,197,2,250,22,178,9,11,6,15, +37,22,182,4,23,198,2,249,247,22,165,5,23,200,1,27,248,22,61,248,22, +165,14,23,201,1,28,23,202,2,28,250,22,154,2,23,200,1,23,201,1,11, +249,22,73,11,203,249,22,73,194,203,192,86,94,28,28,248,22,161,14,23,196, +2,10,248,22,150,5,23,196,2,12,28,23,197,2,250,22,179,9,11,6,15, 15,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,23,200,2,250,22, -179,9,2,21,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32,111,114, -32,112,97,116,104,23,198,2,28,28,248,22,71,23,196,2,249,22,143,9,248, -22,74,23,198,2,2,4,11,248,22,140,5,248,22,98,196,28,28,248,22,71, -23,196,2,28,249,22,143,9,248,22,74,23,198,2,2,32,28,248,22,71,248, -22,98,23,197,2,249,22,143,9,248,22,102,23,198,2,2,4,11,11,11,86, -97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,140,5,249,2,65,248, +180,9,2,21,6,19,19,109,111,100,117,108,101,45,112,97,116,104,32,111,114, +32,112,97,116,104,23,198,2,28,28,248,22,71,23,196,2,249,22,144,9,248, +22,74,23,198,2,2,4,11,248,22,141,5,248,22,98,196,28,28,248,22,71, +23,196,2,28,249,22,144,9,248,22,74,23,198,2,2,32,28,248,22,71,248, +22,98,23,197,2,249,22,144,9,248,22,102,23,198,2,2,4,11,11,11,86, +97,23,198,1,23,197,1,23,196,1,23,193,1,248,22,141,5,249,2,65,248, 22,115,23,199,2,248,22,100,23,199,1,28,28,248,22,71,23,196,2,28,249, -22,143,9,248,22,74,23,198,2,2,32,28,28,249,22,145,9,248,22,98,23, -198,2,2,34,10,249,22,145,9,248,22,98,23,198,2,2,33,28,23,196,2, -27,248,22,141,5,23,198,2,28,248,22,58,193,10,28,248,22,71,193,248,22, +22,144,9,248,22,74,23,198,2,2,32,28,28,249,22,146,9,248,22,98,23, +198,2,2,34,10,249,22,146,9,248,22,98,23,198,2,2,33,28,23,196,2, +27,248,22,142,5,23,198,2,28,248,22,58,193,10,28,248,22,71,193,248,22, 58,248,22,74,194,11,11,11,11,11,86,96,23,198,1,23,197,1,23,193,1, -27,248,22,141,5,23,198,1,248,22,140,5,249,2,65,28,248,22,71,23,197, -2,248,22,74,23,197,2,23,196,2,27,28,249,22,145,9,248,22,98,23,203, +27,248,22,142,5,23,198,1,248,22,141,5,249,2,65,28,248,22,71,23,197, +2,248,22,74,23,197,2,23,196,2,27,28,249,22,146,9,248,22,98,23,203, 2,2,33,248,22,75,200,248,22,100,200,28,248,22,71,23,198,2,249,22,87, -248,22,75,199,194,192,28,28,248,22,71,23,196,2,249,22,143,9,248,22,74, +248,22,75,199,194,192,28,28,248,22,71,23,196,2,249,22,144,9,248,22,74, 23,198,2,2,36,11,86,94,248,80,159,38,8,26,39,193,253,213,200,201,202, -203,11,80,158,43,53,28,28,248,22,71,23,196,2,28,249,22,143,9,248,22, -74,23,198,2,2,32,28,248,22,71,248,22,98,23,197,2,249,22,143,9,248, +203,11,80,158,43,53,28,28,248,22,71,23,196,2,28,249,22,144,9,248,22, +74,23,198,2,2,32,28,248,22,71,248,22,98,23,197,2,249,22,144,9,248, 22,102,23,198,2,2,36,11,11,11,86,94,248,80,159,38,8,26,39,193,253, 213,248,22,98,201,201,202,203,248,22,100,201,80,158,43,53,86,94,23,193,1, 27,88,163,8,36,37,47,11,79,115,104,111,119,45,99,111,108,108,101,99,116, 105,111,110,45,101,114,114,223,5,33,69,27,28,248,22,71,23,198,2,28,249, -22,143,9,2,32,248,22,74,23,200,2,27,248,22,98,23,199,2,28,28,249, -22,145,9,23,195,2,2,34,10,249,22,145,9,23,195,2,2,33,86,94,23, -193,1,28,23,199,2,27,248,22,141,5,23,201,2,28,248,22,71,193,248,22, -74,193,192,250,22,176,9,2,21,6,45,45,110,111,32,98,97,115,101,32,112, +22,144,9,2,32,248,22,74,23,200,2,27,248,22,98,23,199,2,28,28,249, +22,146,9,23,195,2,2,34,10,249,22,146,9,23,195,2,2,33,86,94,23, +193,1,28,23,199,2,27,248,22,142,5,23,201,2,28,248,22,71,193,248,22, +74,193,192,250,22,177,9,2,21,6,45,45,110,111,32,98,97,115,101,32,112, 97,116,104,32,102,111,114,32,114,101,108,97,116,105,118,101,32,115,117,98,109, 111,100,117,108,101,32,112,97,116,104,58,32,126,46,115,23,201,2,192,23,197, -2,23,197,2,27,28,248,22,71,23,199,2,28,249,22,143,9,2,32,248,22, -74,23,201,2,27,28,28,28,249,22,145,9,248,22,98,23,202,2,2,34,10, -249,22,145,9,248,22,98,23,202,2,2,33,23,200,2,11,27,248,22,141,5, -23,202,2,27,28,249,22,145,9,248,22,98,23,204,2,2,33,248,22,75,23, +2,23,197,2,27,28,248,22,71,23,199,2,28,249,22,144,9,2,32,248,22, +74,23,201,2,27,28,28,28,249,22,146,9,248,22,98,23,202,2,2,34,10, +249,22,146,9,248,22,98,23,202,2,2,33,23,200,2,11,27,248,22,142,5, +23,202,2,27,28,249,22,146,9,248,22,98,23,204,2,2,33,248,22,75,23, 202,1,248,22,100,23,202,1,28,248,22,71,23,195,2,249,2,65,248,22,74, 23,197,2,249,22,87,248,22,75,23,199,1,23,197,1,249,2,65,23,196,1, -23,195,1,249,2,65,2,34,28,249,22,145,9,248,22,98,23,204,2,2,33, +23,195,1,249,2,65,2,34,28,249,22,146,9,248,22,98,23,204,2,2,33, 248,22,75,23,202,1,248,22,100,23,202,1,28,248,22,71,193,248,22,75,193, 11,11,11,27,28,248,22,58,23,196,2,27,248,80,159,43,46,39,249,22,73, -23,199,2,247,22,138,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11, +23,199,2,247,22,139,15,28,23,193,2,192,86,94,23,193,1,90,159,38,11, 89,161,38,36,11,249,80,159,46,52,39,248,22,64,23,201,2,11,27,28,248, -22,81,23,195,2,2,37,249,22,156,7,23,197,2,2,38,251,80,159,49,57, +22,81,23,195,2,2,37,249,22,157,7,23,197,2,2,38,251,80,159,49,57, 39,23,204,1,28,248,22,81,23,199,2,23,199,1,86,94,23,199,1,248,22, 74,23,199,2,28,248,22,81,23,199,2,86,94,23,198,1,9,248,22,75,23, -199,1,23,197,1,28,248,22,133,7,23,196,2,86,94,23,196,1,27,248,80, +199,1,23,197,1,28,248,22,134,7,23,196,2,86,94,23,196,1,27,248,80, 159,43,8,27,39,23,202,2,27,248,80,159,44,46,39,249,22,73,23,200,2, 23,197,2,28,23,193,2,192,86,94,23,193,1,90,159,38,11,89,161,38,36, -11,249,80,159,47,52,39,23,201,2,11,250,22,1,22,178,14,23,199,1,249, +11,249,80,159,47,52,39,23,201,2,11,250,22,1,22,179,14,23,199,1,249, 22,87,249,22,2,32,0,88,163,8,36,37,44,11,9,222,33,70,23,200,1, -248,22,83,248,2,71,23,201,1,28,248,22,160,14,23,196,2,86,94,23,196, -1,248,80,159,42,8,28,39,248,22,187,14,28,248,22,184,14,23,198,2,23, -197,2,249,22,185,14,23,199,2,248,80,159,46,8,27,39,23,205,2,28,249, -22,143,9,248,22,74,23,198,2,2,26,27,248,80,159,43,46,39,249,22,73, -23,199,2,247,22,138,15,28,23,193,2,192,86,94,23,193,1,90,159,39,11, +248,22,83,248,2,71,23,201,1,28,248,22,161,14,23,196,2,86,94,23,196, +1,248,80,159,42,8,28,39,248,22,188,14,28,248,22,185,14,23,198,2,23, +197,2,249,22,186,14,23,199,2,248,80,159,46,8,27,39,23,205,2,28,249, +22,144,9,248,22,74,23,198,2,2,26,27,248,80,159,43,46,39,249,22,73, +23,199,2,247,22,139,15,28,23,193,2,192,86,94,23,193,1,90,159,39,11, 89,161,38,36,11,249,80,159,47,52,39,248,22,98,23,202,2,11,89,161,37, 38,11,28,248,22,81,248,22,100,23,201,2,28,248,22,81,23,194,2,249,22, -152,15,2,73,23,196,2,11,10,27,28,23,196,2,248,2,71,23,196,2,28, -248,22,81,23,195,2,2,37,28,249,22,152,15,2,73,23,197,2,248,2,71, -23,196,2,249,22,156,7,23,197,2,2,38,27,28,23,197,1,86,94,23,196, +153,15,2,73,23,196,2,11,10,27,28,23,196,2,248,2,71,23,196,2,28, +248,22,81,23,195,2,2,37,28,249,22,153,15,2,73,23,197,2,248,2,71, +23,196,2,249,22,157,7,23,197,2,2,38,27,28,23,197,1,86,94,23,196, 1,249,22,87,28,248,22,81,248,22,100,23,205,2,21,93,6,5,5,109,122, 108,105,98,249,22,1,22,87,249,22,2,80,159,53,8,29,39,248,22,100,23, 208,2,23,197,1,28,248,22,81,23,196,2,86,94,23,195,1,248,22,83,23, 197,1,86,94,23,196,1,23,195,1,251,80,159,51,57,39,23,206,1,248,22, -74,23,198,2,248,22,75,23,198,1,23,198,1,28,249,22,143,9,248,22,74, -23,198,2,2,35,248,80,159,42,8,28,39,248,22,187,14,249,22,185,14,248, -22,189,14,248,22,98,23,201,2,248,80,159,46,8,27,39,23,205,2,12,86, -94,28,28,248,22,160,14,23,194,2,10,248,22,158,8,23,194,2,86,94,23, -201,1,12,28,23,201,2,250,22,178,9,67,114,101,113,117,105,114,101,249,22, -181,7,6,17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126, +74,23,198,2,248,22,75,23,198,1,23,198,1,28,249,22,144,9,248,22,74, +23,198,2,2,35,248,80,159,42,8,28,39,248,22,188,14,249,22,186,14,248, +22,190,14,248,22,98,23,201,2,248,80,159,46,8,27,39,23,205,2,12,86, +94,28,28,248,22,161,14,23,194,2,10,248,22,159,8,23,194,2,86,94,23, +201,1,12,28,23,201,2,250,22,179,9,67,114,101,113,117,105,114,101,249,22, +182,7,6,17,17,98,97,100,32,109,111,100,117,108,101,32,112,97,116,104,126, 97,28,23,198,2,248,22,74,23,199,2,2,39,23,204,1,86,94,23,201,1, -250,22,179,9,2,21,249,22,181,7,6,13,13,109,111,100,117,108,101,32,112, +250,22,180,9,2,21,249,22,182,7,6,13,13,109,111,100,117,108,101,32,112, 97,116,104,126,97,28,23,198,2,248,22,74,23,199,2,2,39,23,198,2,27, -28,248,22,158,8,23,195,2,249,22,163,8,23,196,2,36,249,22,187,14,248, -22,188,14,23,197,2,11,27,28,248,22,158,8,23,196,2,249,22,163,8,23, +28,248,22,159,8,23,195,2,249,22,164,8,23,196,2,36,249,22,188,14,248, +22,189,14,23,197,2,11,27,28,248,22,159,8,23,196,2,249,22,164,8,23, 197,2,37,248,80,159,44,58,39,23,195,2,90,159,39,11,89,161,39,36,11, -28,248,22,158,8,23,199,2,250,22,7,2,40,249,22,163,8,23,203,2,38, -2,40,248,22,181,14,23,198,2,86,95,23,195,1,23,193,1,27,28,248,22, -158,8,23,200,2,249,22,163,8,23,201,2,39,249,80,159,49,56,39,23,197, -2,5,0,27,28,248,22,158,8,23,201,2,249,22,163,8,23,202,2,40,248, -22,140,5,23,200,2,27,250,22,153,2,80,159,52,43,38,248,22,173,15,247, -22,138,13,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,247,22,133, -2,86,94,250,22,151,2,80,159,54,43,38,248,22,173,15,247,22,138,13,195, -192,27,28,23,204,2,248,22,140,5,249,22,73,248,22,141,5,23,200,2,23, -207,2,23,196,2,86,95,28,23,212,1,27,250,22,153,2,23,198,2,196,11, +28,248,22,159,8,23,199,2,250,22,7,2,40,249,22,164,8,23,203,2,38, +2,40,248,22,182,14,23,198,2,86,95,23,195,1,23,193,1,27,28,248,22, +159,8,23,200,2,249,22,164,8,23,201,2,39,249,80,159,49,56,39,23,197, +2,5,0,27,28,248,22,159,8,23,201,2,249,22,164,8,23,202,2,40,248, +22,141,5,23,200,2,27,250,22,154,2,80,159,52,43,38,248,22,174,15,247, +22,139,13,11,27,28,23,194,2,23,194,1,86,94,23,194,1,27,247,22,134, +2,86,94,250,22,152,2,80,159,54,43,38,248,22,174,15,247,22,139,13,195, +192,27,28,23,204,2,248,22,141,5,249,22,73,248,22,142,5,23,200,2,23, +207,2,23,196,2,86,95,28,23,212,1,27,250,22,154,2,23,198,2,196,11, 28,23,193,1,12,86,94,27,27,28,248,22,17,80,159,55,49,38,80,159,54, 49,38,247,22,19,251,22,27,11,80,159,58,48,38,9,23,197,1,27,248,22, -173,15,247,22,138,13,86,94,249,22,3,20,20,94,88,163,8,36,37,55,11, +174,15,247,22,139,13,86,94,249,22,3,20,20,94,88,163,8,36,37,55,11, 9,226,14,13,2,3,33,74,23,195,1,23,196,2,248,28,248,22,17,80,159, 56,49,38,32,0,88,163,36,37,42,11,9,222,33,75,80,159,55,8,30,39, 20,20,95,88,163,36,36,55,8,176,64,9,230,19,15,13,12,8,7,5,2, -33,76,23,195,1,23,208,1,250,22,151,2,23,198,1,196,10,12,28,28,248, -22,158,8,23,204,1,11,28,248,22,133,7,23,206,2,10,28,248,22,58,23, -206,2,10,28,248,22,71,23,206,2,249,22,143,9,248,22,74,23,208,2,2, -26,11,249,80,159,53,47,39,28,248,22,133,7,23,208,2,249,22,73,23,209, +33,76,23,195,1,23,208,1,250,22,152,2,23,198,1,196,10,12,28,28,248, +22,159,8,23,204,1,11,28,248,22,134,7,23,206,2,10,28,248,22,58,23, +206,2,10,28,248,22,71,23,206,2,249,22,144,9,248,22,74,23,208,2,2, +26,11,249,80,159,53,47,39,28,248,22,134,7,23,208,2,249,22,73,23,209, 1,248,80,159,56,8,27,39,23,215,1,86,94,23,212,1,249,22,73,23,209, -1,247,22,138,15,252,22,160,8,23,209,1,23,208,1,23,206,1,23,204,1, +1,247,22,139,15,252,22,161,8,23,209,1,23,208,1,23,206,1,23,204,1, 23,203,1,12,192,86,96,20,18,159,11,80,158,36,53,248,80,159,37,8,25, -37,249,22,27,11,80,159,39,55,37,248,22,180,4,80,159,37,54,38,248,22, -164,5,80,159,37,37,39,248,22,129,14,80,159,37,42,39,20,18,159,11,80, +37,249,22,27,11,80,159,39,55,37,248,22,181,4,80,159,37,54,38,248,22, +165,5,80,159,37,37,39,248,22,130,14,80,159,37,42,39,20,18,159,11,80, 158,36,53,248,80,159,37,8,25,37,249,22,27,11,80,159,39,55,37,20,18, 159,11,80,158,36,53,248,80,159,37,8,25,37,249,22,27,11,80,159,39,55, 37,159,36,20,113,159,36,16,1,11,16,0,20,26,144,9,2,1,2,1,29, @@ -959,12 +959,12 @@ 80,159,36,8,27,39,20,15,16,2,88,164,8,34,37,45,8,240,0,0,10, 0,1,21,112,114,101,112,45,112,108,97,110,101,116,45,114,101,115,111,108,118, 101,114,33,37,224,1,0,33,45,80,159,36,8,26,39,20,15,16,2,248,22, -155,8,69,115,111,45,115,117,102,102,105,120,80,159,36,36,37,20,15,16,2, +156,8,69,115,111,45,115,117,102,102,105,120,80,159,36,36,37,20,15,16,2, 88,163,36,38,8,38,8,61,2,3,223,0,33,54,80,159,36,37,37,20,15, 16,2,20,27,158,32,0,88,163,8,36,37,42,11,2,9,222,192,32,0,88, 163,8,36,37,42,11,2,9,222,192,80,159,36,42,37,20,15,16,2,247,22, -136,2,80,159,36,43,37,20,15,16,2,8,128,8,80,159,36,44,37,20,15, -16,2,249,22,159,8,8,128,8,11,80,159,36,45,37,20,15,16,2,88,163, +137,2,80,159,36,43,37,20,15,16,2,8,128,8,80,159,36,44,37,20,15, +16,2,249,22,160,8,8,128,8,11,80,159,36,45,37,20,15,16,2,88,163, 8,36,37,50,8,128,8,2,13,223,0,33,55,80,159,36,46,37,20,15,16, 2,88,163,8,36,38,55,8,128,8,2,14,223,0,33,56,80,159,36,47,37, 20,15,16,2,247,22,69,80,159,36,48,37,20,15,16,2,248,22,18,74,109, @@ -984,7 +984,7 @@ EVAL_ONE_SIZED_STR((char *)expr, 7421); } { - SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,52,84,0,0,0,0,0,0,0,0,0,0, + SHARED_OK static MZCOMPILED_STRING_FAR unsigned char expr[] = {35,126,7,53,46,51,46,48,46,53,84,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,11,0,0,0,1,0,0,10,0,16,0, 29,0,44,0,58,0,78,0,90,0,104,0,118,0,170,0,0,0,98,1,0, 0,69,35,37,98,117,105,108,116,105,110,65,113,117,111,116,101,29,94,2,2, diff --git a/src/racket/src/future.h b/src/racket/src/future.h index cf6cb9b9ff..9b57969166 100644 --- a/src/racket/src/future.h +++ b/src/racket/src/future.h @@ -271,4 +271,6 @@ Scheme_Object *scheme_fsemaphore_wait(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_fsemaphore_post(int argc, Scheme_Object *argv[]); Scheme_Object *scheme_fsemaphore_try_wait(int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_box_cas(int argc, Scheme_Object *argv[]); + #endif diff --git a/src/racket/src/jit_ts.c b/src/racket/src/jit_ts.c index 8e7a9aa79d..521b9decb3 100644 --- a/src/racket/src/jit_ts.c +++ b/src/racket/src/jit_ts.c @@ -114,6 +114,7 @@ define_ts_l_s(scheme_jit_make_vector, FSRC_OTHER) # endif define_ts_ss_i(scheme_equal, FSRC_MARKS) define_ts_sss_s(extract_one_cc_mark_to_tag, FSRC_MARKS) +define_ts_iS_s(scheme_box_cas, FSRC_MARKS) #endif #ifdef JIT_APPLY_TS_PROCS @@ -179,6 +180,7 @@ define_ts_s_s(scheme_box, FSRC_OTHER) # define ts_scheme_make_complex scheme_make_complex # define ts_scheme_unbox scheme_unbox # define ts_scheme_set_box scheme_set_box +# define ts_scheme_box_cas scheme_box_cas # define ts_scheme_vector_length scheme_vector_length # define ts_scheme_flvector_length scheme_flvector_length # define ts_scheme_fxvector_length scheme_fxvector_length diff --git a/src/racket/src/jitinline.c b/src/racket/src/jitinline.c index 1bb7f87cae..21fac32428 100644 --- a/src/racket/src/jitinline.c +++ b/src/racket/src/jitinline.c @@ -2824,7 +2824,81 @@ int scheme_generate_inlined_nary(mz_jit_state *jitter, Scheme_App_Rec *app, int jit_retval(JIT_R0); return 1; } else if (!for_branch) { - if (IS_NAMED_PRIM(rator, "vector-set!") + if (IS_NAMED_PRIM(rator, "box-cas!") || (IS_NAMED_PRIM(rator, "unsafe-box*-cas!"))) { + + GC_CAN_IGNORE jit_insn *ref, *ref3, *refr, *reffalse, *reftrue; + int unsafe = 0; // unused so far + + if (IS_NAMED_PRIM(rator, "unsafe-box*-cas!")) { + unsafe = 1; + } + + // generate code to evaluate the arguments + scheme_generate_app(app, NULL, 3, jitter, 0, 0, 2); + CHECK_LIMIT(); + mz_rs_sync(); + + mz_rs_ldr(JIT_R1); + + __START_TINY_JUMPS__(1); + + if (!unsafe) { + // Fail if this isn't a pointer (0x1 is the integer tag) + ref3 = jit_bmsi_ul(jit_forward(), JIT_R1, 0x1); + // Get the type tag, fail if it isn't a box + ref = mz_beqi_t(jit_forward(), JIT_R1, scheme_box_type, JIT_R2); + // jump to here if it wasn't a pointer + mz_patch_branch(ref3); + + // call scheme_box_cas to raise the exception + // we use mz_finish_lwe because it will capture the stack + // and the ts_ version because we may be in a future + JIT_UPDATE_THREAD_RSPTR_IF_NEEDED(); + jit_movi_l(JIT_R0, 3); + mz_prepare(2); + jit_pusharg_p(JIT_RUNSTACK); + jit_pusharg_l(JIT_R0); + CHECK_LIMIT(); + (void)mz_finish_lwe(ts_scheme_box_cas, refr); /* doesn't return */ + + // jump to here if the type tag tests succeed + mz_patch_branch(ref); + } + + /* box is in JIT_R1 */ + jit_addi_l(JIT_R1, JIT_R1, (intptr_t)&SCHEME_BOX_VAL(0x0)); + mz_rs_ldxi(JIT_R0, 1); /* old val */ + mz_rs_ldxi(JIT_V1, 2); /* new val */ + +#ifdef MZ_USE_FUTURES + if (scheme_is_multiprocessor(0)) { + jit_lock_cmpxchgr_l(JIT_R1, JIT_V1); /* implicitly uses JIT_R0 */ + reffalse = (JNEm(jit_forward(), 0,0,0), _jit.x.pc); + } else +#endif + { + jit_ldr_p(JIT_R2, JIT_R1); + reffalse = jit_bner_p(jit_forward(), JIT_R2, JIT_R0); + jit_str_p(JIT_R1, JIT_V1); + } + + jit_movi_p(JIT_R0, scheme_true); + reftrue = jit_jmpi(jit_forward()); + + mz_patch_branch(reffalse); + jit_movi_p(JIT_R0, scheme_false); + + mz_patch_branch(reftrue); + + __END_TINY_JUMPS__(1); + + // pop off 3 arguments + mz_rs_inc(3); + mz_runstack_popped(jitter, 3); + + return 1; + + } else if (IS_NAMED_PRIM(rator, "vector-set!") || IS_NAMED_PRIM(rator, "unsafe-vector-set!") || IS_NAMED_PRIM(rator, "unsafe-vector*-set!") || IS_NAMED_PRIM(rator, "flvector-set!") diff --git a/src/racket/src/lightning/i386/asm.h b/src/racket/src/lightning/i386/asm.h index 6dbb46ffba..f201b8366e 100644 --- a/src/racket/src/lightning/i386/asm.h +++ b/src/racket/src/lightning/i386/asm.h @@ -459,6 +459,7 @@ typedef _uc jit_insn; /* Above variants don't seem to work */ #define CMPXCHGr(RS, RD) (_jit_B(0xF), _O_r_X(0xb1 ,_r4(RD) ,0,RS,0,0 )) +#define CMPXCHGQr(RS, RD) (_REX(0, 0, 0), _jit_B(0xF), _O_r_X(0xb1 ,_r4(RD) ,0,RS,0,0 )) #define CMPXCHGWr(RS, RD) (_d16(), _jit_B(0xF), _O_r_X(0xb1 ,_r4(RD) ,0,RS,0,0 )) #define LOCK_PREFIX(i) (_jit_B(0xf0), i) diff --git a/src/racket/src/lightning/i386/core.h b/src/racket/src/lightning/i386/core.h index 7de9cd21ef..4693041eac 100644 --- a/src/racket/src/lightning/i386/core.h +++ b/src/racket/src/lightning/i386/core.h @@ -702,8 +702,13 @@ XFORM_NONGCING static intptr_t _CHECK_TINY(intptr_t diff) { if ((diff < -128) || # define jit_sti_i(id, rs) _jit_sti_i(id, rs) #endif -# define jit_lock_cmpxchgr_i(rd, rs) LOCK_PREFIX(CMPXCHGr(rd, rs)) -# define jit_lock_cmpxchgr_s(rd, rs) LOCK_PREFIX(CMPXCHGWr(rd, rs)) +#define jit_lock_cmpxchgr_i(rd, rs) LOCK_PREFIX(CMPXCHGr(rd, rs)) +#define jit_lock_cmpxchgr_s(rd, rs) LOCK_PREFIX(CMPXCHGWr(rd, rs)) +#ifdef JIT_X86_64 +# define jit_lock_cmpxchgr_l(rd, rs) LOCK_PREFIX(CMPXCHGQr(rd, rs)) +#else +# define jit_lock_cmpxchgr_l(rd, rs) jit_lock_cmpxchgr_i(rd, rs) +#endif /* Extra */ #define jit_nop() NOP_() diff --git a/src/racket/src/list.c b/src/racket/src/list.c index 957b340166..15547dfcce 100644 --- a/src/racket/src/list.c +++ b/src/racket/src/list.c @@ -88,6 +88,7 @@ static Scheme_Object *immutable_box (int argc, Scheme_Object *argv[]); static Scheme_Object *box_p (int argc, Scheme_Object *argv[]); static Scheme_Object *unbox (int argc, Scheme_Object *argv[]); static Scheme_Object *set_box (int argc, Scheme_Object *argv[]); +Scheme_Object *scheme_box_cas (int argc, Scheme_Object *argv[]); static Scheme_Object *chaperone_box(int argc, Scheme_Object **argv); static Scheme_Object *impersonate_box(int argc, Scheme_Object **argv); @@ -448,6 +449,10 @@ scheme_init_list (Scheme_Env *env) SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant(SETBOX, p, env); + p = scheme_make_immed_prim(scheme_box_cas, "box-cas!", 3, 3); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; + scheme_add_global_constant("box-cas!", p, env); + scheme_add_global_constant("chaperone-box", scheme_make_prim_w_arity(chaperone_box, "chaperone-box", @@ -792,6 +797,11 @@ scheme_init_unsafe_list (Scheme_Env *env) p = scheme_make_immed_prim(unsafe_set_box_star, "unsafe-set-box*!", 2, 2); SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_BINARY_INLINED; scheme_add_global_constant("unsafe-set-box*!", p, env); + + p = scheme_make_prim_w_arity(scheme_box_cas, "unsafe-box*-cas!", 3, 3); + SCHEME_PRIM_PROC_FLAGS(p) |= SCHEME_PRIM_IS_NARY_INLINED; + scheme_add_global_constant("unsafe-box*-cas!", p, env); + } Scheme_Object *scheme_make_pair(Scheme_Object *car, Scheme_Object *cdr) @@ -1610,6 +1620,51 @@ Scheme_Object *scheme_unbox(Scheme_Object *obj) return (Scheme_Object *)SCHEME_BOX_VAL(obj); } +#ifndef MZ_USE_FUTURES + +Scheme_Object *scheme_box_cas(int argc, Scheme_Object *argv[]) +XFORM_SKIP_PROC +/* For cooperative threading, no atomicity required */ +{ + Scheme_Object *box = argv[0]; + Scheme_Object *ov = argv[1]; + Scheme_Object *nv = argv[2]; + + if (!SCHEME_MUTABLE_BOXP(box)) || (SCHEME_NP_CHAPERONEP(box)) { + scheme_wrong_type("cas!", "unchaperoned mutable box", 0, 1, &box); + } + + if (SCHEME_BOX_VAL(box) == ov) { + SCHEME_BOX_VAL(box) = nv; + return scheme_true; + } else { + return scheme_false; + } +} + +#else + +Scheme_Object *scheme_box_cas(int argc, Scheme_Object *argv[]) +XFORM_SKIP_PROC +{ + Scheme_Object *box = argv[0]; + Scheme_Object *ov = argv[1]; + Scheme_Object *nv = argv[2]; + + /* This procedure is used for both the safe and unsafe version, but + * the JIT elides the checking for the unsafe version. + */ + if ((!SCHEME_MUTABLE_BOXP(box)) || (SCHEME_NP_CHAPERONEP(box))) { + scheme_wrong_type("box-cas!", "unchaperoned mutable box", 0, 1, &box); + } + + return mzrt_cas((volatile size_t *)(&SCHEME_BOX_VAL(box)), + (size_t)ov, (size_t)nv) + ? scheme_true : scheme_false; +} + +#endif + static void chaperone_set_box(Scheme_Object *obj, Scheme_Object *v) { Scheme_Chaperone *px; diff --git a/src/racket/src/schminc.h b/src/racket/src/schminc.h index 0c8777d861..a1a7896b3c 100644 --- a/src/racket/src/schminc.h +++ b/src/racket/src/schminc.h @@ -14,8 +14,8 @@ #define USE_COMPILED_STARTUP 1 -#define EXPECTED_PRIM_COUNT 1046 -#define EXPECTED_UNSAFE_COUNT 78 +#define EXPECTED_PRIM_COUNT 1047 +#define EXPECTED_UNSAFE_COUNT 79 #define EXPECTED_FLFXNUM_COUNT 68 #define EXPECTED_FUTURES_COUNT 13 diff --git a/src/racket/src/schvers.h b/src/racket/src/schvers.h index c59a5d288f..a5e95e7256 100644 --- a/src/racket/src/schvers.h +++ b/src/racket/src/schvers.h @@ -13,12 +13,12 @@ consistently.) */ -#define MZSCHEME_VERSION "5.3.0.4" +#define MZSCHEME_VERSION "5.3.0.5" #define MZSCHEME_VERSION_X 5 #define MZSCHEME_VERSION_Y 3 #define MZSCHEME_VERSION_Z 0 -#define MZSCHEME_VERSION_W 4 +#define MZSCHEME_VERSION_W 5 #define MZSCHEME_VERSION_MAJOR ((MZSCHEME_VERSION_X * 100) + MZSCHEME_VERSION_Y) #define MZSCHEME_VERSION_MINOR ((MZSCHEME_VERSION_Z * 1000) + MZSCHEME_VERSION_W)