|  |  | @@ -125,33 +125,37 @@ for examples see get_bits, show_bits, skip_bits, get_vlc | 
		
	
		
			
			|  |  |  | #   define MIN_CACHE_BITS 25 | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define OPEN_READER(name, gb)                \ | 
		
	
		
			
			|  |  |  | #define OPEN_READER(name, gb)                   \ | 
		
	
		
			
			|  |  |  | unsigned int name##_index = (gb)->index;    \ | 
		
	
		
			
			|  |  |  | unsigned int av_unused name##_cache = 0 | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define CLOSE_READER(name, gb) (gb)->index = name##_index | 
		
	
		
			
			|  |  |  | #define CLOSE_READER(name, gb) (gb)->index = name##_index | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef ALT_BITSTREAM_READER_LE | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | # ifdef ALT_BITSTREAM_READER_LE | 
		
	
		
			
			|  |  |  | # ifdef LONG_BITSTREAM_READER | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) \ | 
		
	
		
			
			|  |  |  | name##_cache = AV_RL64((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07) | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \ | 
		
	
		
			
			|  |  |  | AV_RL64((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) | 
		
	
		
			
			|  |  |  | # else | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) \ | 
		
	
		
			
			|  |  |  | name##_cache = AV_RL32((gb)->buffer+(name##_index>>3)) >> (name##_index&0x07) | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \ | 
		
	
		
			
			|  |  |  | AV_RL32((gb)->buffer + (name##_index >> 3)) >> (name##_index & 7) | 
		
	
		
			
			|  |  |  | # endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define SKIP_CACHE(name, gb, num) name##_cache >>= (num) | 
		
	
		
			
			|  |  |  | # else | 
		
	
		
			
			|  |  |  | # define SKIP_CACHE(name, gb, num) name##_cache >>= (num) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | # ifdef LONG_BITSTREAM_READER | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) \ | 
		
	
		
			
			|  |  |  | name##_cache = AV_RB64((gb)->buffer+(name##_index >> 3)) >> (32 - (name##_index & 0x07)) | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \ | 
		
	
		
			
			|  |  |  | AV_RB64((gb)->buffer + (name##_index >> 3)) >> (32 - (name##_index & 7)) | 
		
	
		
			
			|  |  |  | # else | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) \ | 
		
	
		
			
			|  |  |  | name##_cache = AV_RB32((gb)->buffer+(name##_index>>3)) << (name##_index&0x07) | 
		
	
		
			
			|  |  |  | #   define UPDATE_CACHE(name, gb) name##_cache = \ | 
		
	
		
			
			|  |  |  | AV_RB32((gb)->buffer + (name##_index >> 3)) << (name##_index & 7) | 
		
	
		
			
			|  |  |  | # endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define SKIP_CACHE(name, gb, num) name##_cache <<= (num) | 
		
	
		
			
			|  |  |  | # endif | 
		
	
		
			
			|  |  |  | # define SKIP_CACHE(name, gb, num) name##_cache <<= (num) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // FIXME name? | 
		
	
		
			
			|  |  |  | #if UNCHECKED_BITSTREAM_READER | 
		
	
	
		
			
				|  |  | @@ -161,27 +165,26 @@ for examples see get_bits, show_bits, skip_bits, get_vlc | 
		
	
		
			
			|  |  |  | name##_index = FFMIN((gb)->size_in_bits_plus8, name##_index + (num)) | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define SKIP_BITS(name, gb, num) do {        \ | 
		
	
		
			
			|  |  |  | #define SKIP_BITS(name, gb, num) do {           \ | 
		
	
		
			
			|  |  |  | SKIP_CACHE(name, gb, num);              \ | 
		
	
		
			
			|  |  |  | SKIP_COUNTER(name, gb, num);            \ | 
		
	
		
			
			|  |  |  | } while (0) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | 
		
	
		
			
			|  |  |  | #   define LAST_SKIP_CACHE(name, gb, num) | 
		
	
		
			
			|  |  |  | #define LAST_SKIP_BITS(name, gb, num) SKIP_COUNTER(name, gb, num) | 
		
	
		
			
			|  |  |  | #define LAST_SKIP_CACHE(name, gb, num) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | # ifdef ALT_BITSTREAM_READER_LE | 
		
	
		
			
			|  |  |  | #ifdef ALT_BITSTREAM_READER_LE | 
		
	
		
			
			|  |  |  | #   define SHOW_UBITS(name, gb, num) zero_extend(name##_cache, num) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define SHOW_SBITS(name, gb, num) sign_extend(name##_cache, num) | 
		
	
		
			
			|  |  |  | # else | 
		
	
		
			
			|  |  |  | #else | 
		
	
		
			
			|  |  |  | #   define SHOW_UBITS(name, gb, num) NEG_USR32(name##_cache, num) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define SHOW_SBITS(name, gb, num) NEG_SSR32(name##_cache, num) | 
		
	
		
			
			|  |  |  | # endif | 
		
	
		
			
			|  |  |  | #endif | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #   define GET_CACHE(name, gb) ((uint32_t)name##_cache) | 
		
	
		
			
			|  |  |  | #define GET_CACHE(name, gb) ((uint32_t)name##_cache) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline int get_bits_count(const GetBitContext *s){ | 
		
	
		
			
			|  |  |  | static inline int get_bits_count(const GetBitContext *s) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return s->index; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -199,7 +202,8 @@ static inline void skip_bits_long(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | * @param n length in bits | 
		
	
		
			
			|  |  |  | * @author BERO | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline int get_xbits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | static inline int get_xbits(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | register int sign; | 
		
	
		
			
			|  |  |  | register int32_t cache; | 
		
	
		
			
			|  |  |  | OPEN_READER(re, s); | 
		
	
	
		
			
				|  |  | @@ -211,7 +215,8 @@ static inline int get_xbits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | return (NEG_USR32(sign ^ cache, n) ^ sign) - sign; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline int get_sbits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | static inline int get_sbits(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | register int tmp; | 
		
	
		
			
			|  |  |  | OPEN_READER(re, s); | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, s); | 
		
	
	
		
			
				|  |  | @@ -224,7 +229,8 @@ static inline int get_sbits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * Read 1-25 bits. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | register int tmp; | 
		
	
		
			
			|  |  |  | OPEN_READER(re, s); | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, s); | 
		
	
	
		
			
				|  |  | @@ -237,7 +243,8 @@ static inline unsigned int get_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * Show 1-25 bits. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | register int tmp; | 
		
	
		
			
			|  |  |  | OPEN_READER(re, s); | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, s); | 
		
	
	
		
			
				|  |  | @@ -245,7 +252,8 @@ static inline unsigned int show_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | return tmp; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline void skip_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | static inline void skip_bits(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | //Note gcc seems to optimize this to s->index+=n for the ALT_READER :)) | 
		
	
		
			
			|  |  |  | OPEN_READER(re, s); | 
		
	
		
			
			|  |  |  | UPDATE_CACHE(re, s); | 
		
	
	
		
			
				|  |  | @@ -253,7 +261,8 @@ static inline void skip_bits(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | CLOSE_READER(re, s); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits1(GetBitContext *s){ | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits1(GetBitContext *s) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | unsigned int index = s->index; | 
		
	
		
			
			|  |  |  | uint8_t result = s->buffer[index>>3]; | 
		
	
		
			
			|  |  |  | #ifdef ALT_BITSTREAM_READER_LE | 
		
	
	
		
			
				|  |  | @@ -272,19 +281,23 @@ static inline unsigned int get_bits1(GetBitContext *s){ | 
		
	
		
			
			|  |  |  | return result; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits1(GetBitContext *s){ | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits1(GetBitContext *s) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return show_bits(s, 1); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline void skip_bits1(GetBitContext *s){ | 
		
	
		
			
			|  |  |  | static inline void skip_bits1(GetBitContext *s) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | skip_bits(s, 1); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * Read 0-32 bits. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits_long(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | if (n <= MIN_CACHE_BITS) return get_bits(s, n); | 
		
	
		
			
			|  |  |  | static inline unsigned int get_bits_long(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (n <= MIN_CACHE_BITS) | 
		
	
		
			
			|  |  |  | return get_bits(s, n); | 
		
	
		
			
			|  |  |  | else { | 
		
	
		
			
			|  |  |  | #ifdef ALT_BITSTREAM_READER_LE | 
		
	
		
			
			|  |  |  | int ret = get_bits(s, 16); | 
		
	
	
		
			
				|  |  | @@ -299,15 +312,18 @@ static inline unsigned int get_bits_long(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * Read 0-32 bits as a signed integer. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline int get_sbits_long(GetBitContext *s, int n) { | 
		
	
		
			
			|  |  |  | static inline int get_sbits_long(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | return sign_extend(get_bits_long(s, n), n); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | /** | 
		
	
		
			
			|  |  |  | * Show 0-32 bits. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits_long(GetBitContext *s, int n){ | 
		
	
		
			
			|  |  |  | if (n <= MIN_CACHE_BITS) return show_bits(s, n); | 
		
	
		
			
			|  |  |  | static inline unsigned int show_bits_long(GetBitContext *s, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (n <= MIN_CACHE_BITS) | 
		
	
		
			
			|  |  |  | return show_bits(s, n); | 
		
	
		
			
			|  |  |  | else { | 
		
	
		
			
			|  |  |  | GetBitContext gb = *s; | 
		
	
		
			
			|  |  |  | return get_bits_long(&gb, n); | 
		
	
	
		
			
				|  |  | @@ -332,8 +348,8 @@ static inline int check_marker(GetBitContext *s, const char *msg) | 
		
	
		
			
			|  |  |  | * While GetBitContext stores the buffer size, for performance reasons you are | 
		
	
		
			
			|  |  |  | * responsible for checking for the buffer end yourself (take advantage of the padding)! | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static inline void init_get_bits(GetBitContext *s, | 
		
	
		
			
			|  |  |  | const uint8_t *buffer, int bit_size) | 
		
	
		
			
			|  |  |  | static inline void init_get_bits(GetBitContext *s, const uint8_t *buffer, | 
		
	
		
			
			|  |  |  | int bit_size) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int buffer_size = (bit_size+7)>>3; | 
		
	
		
			
			|  |  |  | if (buffer_size < 0 || bit_size < 0) { | 
		
	
	
		
			
				|  |  | @@ -387,7 +403,8 @@ void free_vlc(VLC *vlc); | 
		
	
		
			
			|  |  |  | * If the vlc code is invalid and max_depth>1, then the number of bits removed | 
		
	
		
			
			|  |  |  | * is undefined. | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | #define GET_VLC(code, name, gb, table, bits, max_depth) do {    \ | 
		
	
		
			
			|  |  |  | #define GET_VLC(code, name, gb, table, bits, max_depth)         \ | 
		
	
		
			
			|  |  |  | do {                                                        \ | 
		
	
		
			
			|  |  |  | int n, nb_bits;                                         \ | 
		
	
		
			
			|  |  |  | unsigned int index;                                     \ | 
		
	
		
			
			|  |  |  | \ | 
		
	
	
		
			
				|  |  | @@ -418,7 +435,8 @@ void free_vlc(VLC *vlc); | 
		
	
		
			
			|  |  |  | SKIP_BITS(name, gb, n);                                 \ | 
		
	
		
			
			|  |  |  | } while (0) | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update) do { \ | 
		
	
		
			
			|  |  |  | #define GET_RL_VLC(level, run, name, gb, table, bits, max_depth, need_update) \ | 
		
	
		
			
			|  |  |  | do {                                                                \ | 
		
	
		
			
			|  |  |  | int n, nb_bits;                                                 \ | 
		
	
		
			
			|  |  |  | unsigned int index;                                             \ | 
		
	
		
			
			|  |  |  | \ | 
		
	
	
		
			
				|  |  | @@ -452,7 +470,7 @@ void free_vlc(VLC *vlc); | 
		
	
		
			
			|  |  |  | *                  = (max_vlc_length + bits - 1) / bits | 
		
	
		
			
			|  |  |  | */ | 
		
	
		
			
			|  |  |  | static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], | 
		
	
		
			
			|  |  |  | int bits, int max_depth) | 
		
	
		
			
			|  |  |  | int bits, int max_depth) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int code; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | @@ -465,7 +483,8 @@ static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE (*table)[2], | 
		
	
		
			
			|  |  |  | return code; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline int decode012(GetBitContext *gb){ | 
		
	
		
			
			|  |  |  | static inline int decode012(GetBitContext *gb) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int n; | 
		
	
		
			
			|  |  |  | n = get_bits1(gb); | 
		
	
		
			
			|  |  |  | if (n == 0) | 
		
	
	
		
			
				|  |  | @@ -474,7 +493,8 @@ static inline int decode012(GetBitContext *gb){ | 
		
	
		
			
			|  |  |  | return get_bits1(gb) + 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline int decode210(GetBitContext *gb){ | 
		
	
		
			
			|  |  |  | static inline int decode210(GetBitContext *gb) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | if (get_bits1(gb)) | 
		
	
		
			
			|  |  |  | return 0; | 
		
	
		
			
			|  |  |  | else | 
		
	
	
		
			
				|  |  | @@ -489,7 +509,8 @@ static inline int get_bits_left(GetBitContext *gb) | 
		
	
		
			
			|  |  |  | //#define TRACE | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | #ifdef TRACE | 
		
	
		
			
			|  |  |  | static inline void print_bin(int bits, int n){ | 
		
	
		
			
			|  |  |  | static inline void print_bin(int bits, int n) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int i; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | for (i = n-1; i >= 0; i--) { | 
		
	
	
		
			
				|  |  | @@ -500,7 +521,8 @@ static inline void print_bin(int bits, int n){ | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static inline int get_bits_trace(GetBitContext *s, int n, char *file, | 
		
	
		
			
			|  |  |  | const char *func, int line){ | 
		
	
		
			
			|  |  |  | const char *func, int line) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int r = get_bits(s, n); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | print_bin(r, n); | 
		
	
	
		
			
				|  |  | @@ -510,7 +532,8 @@ static inline int get_bits_trace(GetBitContext *s, int n, char *file, | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], | 
		
	
		
			
			|  |  |  | int bits, int max_depth, char *file, | 
		
	
		
			
			|  |  |  | const char *func, int line){ | 
		
	
		
			
			|  |  |  | const char *func, int line) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int show  = show_bits(s, 24); | 
		
	
		
			
			|  |  |  | int pos   = get_bits_count(s); | 
		
	
		
			
			|  |  |  | int r     = get_vlc2(s, table, bits, max_depth); | 
		
	
	
		
			
				|  |  | @@ -524,7 +547,8 @@ static inline int get_vlc_trace(GetBitContext *s, VLC_TYPE (*table)[2], | 
		
	
		
			
			|  |  |  | return r; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | static inline int get_xbits_trace(GetBitContext *s, int n, char *file, | 
		
	
		
			
			|  |  |  | const char *func, int line){ | 
		
	
		
			
			|  |  |  | const char *func, int line) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int show = show_bits(s, n); | 
		
	
		
			
			|  |  |  | int r    = get_xbits(s, n); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
	
		
			
				|  |  | 
 |