[雑談掲示板] あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ
- あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ
- 日時: 2013/07/17 13:35
- 名前: ああ (ID: DTH1JhWe)
- 参照: http://www.dou-mori.com/bbs3/index.cgi?mode=view&no=63726
ういーwww
Re: happy?yes,happy!通信 ( No.80 )
日時: 2013/07/13 20:31
名前: ああ (ID: k9pS0/Ff)
happy?yes,happy!だってwwwwwwwwww
ちょwwwwww英語のひどさにも程があるwwwwwwww
さすが中1wwwww子供すぎるwwwwwwwww
ちょっと覚えたから自慢してみようってやつ?wwwwwwwww
happy?yes,happy!←くっそわろたwwwwwwwwwww
しかも期末264点wwwwwwww頭悪すぎwwwwwwwwww
ネットに貼り付いてるとこうなるってよーくわかるなwwwwwwww
最後に、happy?yes,happy!←小学生でも余裕でできます^^
Re: happy?yes,happy!通信 ( No.81 )
日時: 2013/07/13 21:34
名前: あきひろ (ID: 3vRaS4Dr)
参照: きちってる奴多いねww
>>80 調子のんなww
雑草君には用はねーよww
自慢って何の事ですか〜?ww
英語の酷さにも程があるってどゆこと??w
期末の問題見たことねーくせに
勝手にほざくなバーカww
「くっそわろた」だってー
マジうけるわww
君にその言葉はもったいないww
喧嘩売り乙だねww
売り方マジワロタわww
小学生でも余裕で出来ます
だってーrw
出来ない人馬鹿にしたねww
ネットに張り付いてるって?
僕はネットに張り付けませーんww
寝言どうもですw乙
しかも最後の^^のとこ
ズレてるね〜ww
ダサw
決め台詞が〜
miss ww
毎度ありがとうございました〜
Re: happy?yes,happy!通信 ( No.82 )
日時: 2013/07/13 21:51
名前: あきひろ (ID: 3vRaS4Dr)
参照: あれれ?
返事が無い……
ただの屍のようだ。
Re: happy?yes,happy!通信 ( No.87 )
日時: 2013/07/14 07:29
名前: ああ (ID: DTH1JhWe)
返信はやwwwwwさすがネットに張り付いてるやつwwwwwww
おまえ前に雑草って言われてたよね^^
なにパクってんの?wwwwww
いやいやwwwww>happy?yes,happy!←こんなの英文にもなってないからwwwwww
英語馬鹿にすんなwwwwwwwww
問題見なくても中1の期末くらい予想できるわくそ餓鬼wwwwww
できない人は頭悪いから^^
えwwwえwwwwえwwwww
みんなーwwwあきひろは^^←これがずれてると思ってるらしいよーwwwww
^^の大文字なんですけどwwwwwww調子乗ってるくせに間違ったことを首取ったように言ってるwwwwwww恥ずかしいwwwwwwwww
しかも>>82、そんなにすぐ返信できるわけないだろwwwwwwww
おまえみたいにネットに張り付いてないからwwwwwwwwww
おまえはネットに張り付いてるからたった一時間経っただけで遅いと思っちゃうんだよwwwwwww
Re: happy?yes,happy!通信 ( No.88 )
日時: 2013/07/14 07:31
名前: ああ (ID: DTH1JhWe)
こいつ晒すわwwwww
Re: happy?yes,happy!通信 ( No.92 )
日時: 2013/07/14 16:10
名前: あきひろ (ID: 3vRaS4Dr)
参照: 「ネットに張り付いてる」ってどういうこと?不愉快すぎるww
>>87
ネットに張り付いてるって
どうゆう事だよww
説明してみろよ^^
あれ?言えない感じですか?
意味が分からないのに言葉使ってる感じ?ww乙ww
馬鹿だねww
苦しゅうなり 下がってよろしいw
しかも、期末テストの問題分かるらしいww
言ってみてよww
どうせ「嘘」だろww
言えるもんなら全部言ってみろよww
言えないだろうがなwww
俺別にそんなんで恥ずかしくないんでww
勘違いwww
負けを認めろゲSめww
>>90 ありがとうございます。
>>91 調子乗りすぎw乙ww
負けを認めろゲSw
返信遅いね(君はデブだねww)
デブは返信遅ぇょwww
ダイエット頑張林檎ww
もしくは屍か…w
消えろ雑魚ww`д´
Re: happy?yes,happy!通信 ( No.93 )
日時: 2013/07/14 19:27
名前: ああ (ID: DTH1JhWe)
ねーねー、頭大丈夫?www
まだ返信返してないのに言えないってどういうこと?^^
えwwwその意味もわからないんだwwwww
そのまんまなんですけどwwwwwwおまえみたいにネットばっかやってるやつのことだよwwwww
しかもテニスの試合あるのにずいぶん返信早いね^^
帰ってきたら速攻ネットですかwwww
あとおまえ、^^←これずれてるとか言ってたよね?wwwww
反論できないんだwwwwwみんなに聞いてみれば?wwww
ぷっwwwwwまさに子供っぽい煽りだなwwwwww
問題じゃなくて難易度に決まってんだろwwwwwww頭悪すぎわろたwwwwwwww
負けを認めろ?wwwwwえ?wwwwwww
明らかにおまえ焦ってるなwwwww^^
いっとくけどおまえが消えるまでいつまでもおまえと論争するから^^
ちょwwwwww頭逝ってるよこれwwwwww
返信遅いとデブなんだってwwwwwwwww吹いたwwwwwwww
返信遅い人はみんなデブなんだwwwwwww広めとくわwwwwwwww
消えろっていうってことは、やっぱり論争負けてることを自覚してるんだよねwwwww
そんなにこわい?wwwwwww
まあずーっとおまえに粘着するけどwwwwwwwざまぁ^^
Re: happy?yes,happy!通信 ( No.94 )
日時: 2013/07/15 12:39
名前: あきひろ (ID: 3vRaS4Dr)
参照: 「ネットに張り付いてる」ってどういうこと?不愉快すぎるww
ねーねー、頭大丈夫?www
俺がネットばっかやってるなら
君もみちずれだねwww
俺が返す度に帰ってくる=
君はネット馬鹿ww
そこまでして負けたくないかwww
よっぽどの暇人だなwwww
速攻ネットって ちょwwwww
全然違うんですけどwwww
帰って来てから五時間程たってますwww
『あとおまえ、^^←これずれてるとか言ってたよねwwwww
反論できないんだwwwwwみんなに聞いてみれば?wwww
ぶっwwwwwまさに子供っぽい??だなwwwwww』
意味分かりませんのぉ〜?д?ww
皆さーん>>87 注目してください!
七行目です。
明らかに言ってますよね?www
問題分かるそうです
では、言ってみて下さいよ〜
頭悪すぎわろただってーwww
じゃあ、君は頭が良いのかな?ww
凄いね〜
問題見なくても問題分かるんだからww
それじゃあ満点取れるね?w
それほど、自信家だそうですwwww
負けを認めろの
何処が焦ってるんですかね〜??
疑問ですね〜ww
理由言ってみて下さいよ
広めとくわだってー
勝手にすれば?ww
何が言いたいか分からんww
どうしたら消えろっていう言葉が
負けを自覚してるように聞こえるのかな〜??ww
そんなにこわい?だって〜
お前の何処が怖いんだよwwww
粘着って ちょwwww
やってみろよゲSwww
ざまぁ?ざまぁって?何が???
>>87 wの数145
お疲れさんww
\さぁーここで質問ターイム/
Q何故ざまぁと言ったのですか?Q
答えられない場合はお手元の?ボタンでヘルプを表示
Re: happy?yes,happy!通信 ( No.98 )
日時: 2013/07/15 17:45
名前: ああ (ID: DTH1JhWe)
ついに認めたーwwwwwあきひろはネットに張り付いてまーす!wwwwww
負けたくないのはおまえだろwwwwwwおまえも暇なんだろ?wwwwww
暇だから毎回返してくるんだよねwwwwww
え?wwwwwテニスの試合、11時に終わったんだwwwwwwww
さすがにそれはないwwwwwww嘘キターwwwwww
皆さーん>>87 注目してください!
僕は明らかに「問題が分かる」じゃなくて「予想できる」って書いてますよねwwwwwww
こいつ日本語も読めないのかなwwwwwwww
君よりは頭いいよ^^
あきひろの口癖発見wwwww「○○だってー」っていうのが口癖のようですwwwwwww
勝手にするよ^^広めとくよ^^
レス遅い人はデブとか頭死んでるwwwwwww
こわくなくてもいいよ^^
いつまでも粘着するから^^
おまえは俺に消えてほしいんでしょ?wwwww
だからお前に粘着してざまぁって言ったんだよ馬鹿wwwww
Re: happy?yes,happy!通信 ( No.104 )
日時: 2013/07/15 19:22
名前: あきひろ (ID: 3vRaS4Dr)
参照: 「ネットに張り付いてる」ってどういうこと?不愉快すぎるww
>>95 知ってますよ
通信したことあります
>>96 Okまた通信しよう!
>>97 いろいろな人によるよ……
>>98 一言で返そう
謎wwww
>>99 なかなか面白い人ですねw
分かりました!
無視します!
馬鹿たちまぢくそコメ乙ww
>>100 初対面なのに呼び捨てされたくねーww
やはり馬鹿は馬鹿だなwww
まぁ、ああsっていう奴もそうなんだけどねww
方言知らねーのかよwwww
よく日本語話せるねwww
Q&Aとか何のこと?
外人に言ったら
ワカリマシェーン
って帰ってくるよwww
>>101 これが焦ってる証拠ですwww
哀れですね〜ww^^
Re: happy?yes,happy!通信 ( No.116 )
日時: 2013/07/16 15:02
名前: ああ (ID: DTH1JhWe)
>>104
逃げたwwwwwwww
くそごみwwwwww
反論できなくて悔しい?wwwwwww
しんどけごみwwwwwww
もっかい言うよ?wwwwwwww
ついに認めたーwwwwwあきひろはネットに張り付いてまーす!wwwwww
負けたくないのはおまえだろwwwwwwおまえも暇なんだろ?wwwwww
暇だから毎回返してくるんだよねwwwwww
え?wwwwwテニスの試合、11時に終わったんだwwwwwwww
さすがにそれはないwwwwwww嘘キターwwwwww
皆さーん>>87 注目してください!
僕は明らかに「問題が分かる」じゃなくて「予想できる」って書いてますよねwwwwwww
こいつ日本語も読めないのかなwwwwwwww
君よりは頭いいよ^^
あきひろの口癖発見wwwww「○○だってー」っていうのが口癖のようですwwwwwww
勝手にするよ^^広めとくよ^^
レス遅い人はデブとか頭死んでるwwwwwww
こわくなくてもいいよ^^
いつまでも粘着するから^^
おまえは俺に消えてほしいんでしょ?wwwww
だからお前に粘着してざまぁって言ったんだよ馬鹿wwwww
これすべてに反論しろよ^^
Re: happy?yes,happy!通信 ( No.125 )
日時: 2013/07/16 18:02
名前: あきひろ (ID: 3vRaS4Dr)
>>124 そうですか!
ある意味凄いですねww
僕もそうします!
あ、あとw
題名のように
happy?yes,happy!
は確かに英文ではありません
でも伝わればいいと思ってるんで
他人が何言おうが
あんま、関係無いんでww
コミュ乙ww
Re: happy?yes,happy!通信 ( No.130 )
日時: 2013/07/17 03:49
名前: ああ (ID: DTH1JhWe)
>>125
え?ww気づいてないの?wwww
消防っておまえのことだよwww
あと逃げんなよ^^
ついに認めたーwwwwwあきひろはネットに張り付いてまーす!wwwwww
負けたくないのはおまえだろwwwwwwおまえも暇なんだろ?wwwwww
暇だから毎回返してくるんだよねwwwwww
え?wwwwwテニスの試合、11時に終わったんだwwwwwwww
さすがにそれはないwwwwwww嘘キターwwwwww
皆さーん>>87 注目してください!
僕は明らかに「問題が分かる」じゃなくて「予想できる」って書いてますよねwwwwwww
こいつ日本語も読めないのかなwwwwwwww
君よりは頭いいよ^^
あきひろの口癖発見wwwww「○○だってー」っていうのが口癖のようですwwwwwww
勝手にするよ^^広めとくよ^^
レス遅い人はデブとか頭死んでるwwwwwww
こわくなくてもいいよ^^
いつまでも粘着するから^^
おまえは俺に消えてほしいんでしょ?wwwww
だからお前に粘着してざまぁって言ったんだよ馬鹿wwwww
これすべてに反論しろよ^^
できないのかwwさすが消防wwww
Re: happy?yes,happy!通信 ( No.131 )
日時: 2013/07/17 03:57
名前: ああ (ID: DTH1JhWe)
Re: 初心者でも仲良くしてくれる方ヽ(^0^)丿 ( No.5 )
日時: 2013/07/16 18:29
名前: あきひろ (ID: 3vRaS4Dr)
エリさん、
通信したいのは山々なんですが、
カードリッジ無くしてしまって……
いちようナムコのせときます
ナ:あきひろ
ム:クリスマス
コ:4127-4868-9990
です
よかったらいつか通信しましょう
ざまぁwwwwwwwwwwm9wwwwww
ネットに張り付いてる暇あったらソフトさがせゴミwwwwwwww
しかも日本語間違ってるwwwwwwwww
なにが いちよう だよwwwwwwww
日本語覚えてからこいwwwwwwwww
もしかしてわざとじゃないよな?wwwwwwwww
Re: happy?yes,happy!通信 ( No.132 )
日時: 2013/07/17 04:12
名前: あきひろ (ID: 3vRaS4Dr)
そこまで俺にかまってほしいのかなー??ww
え!何?俺の事そんな好きなん?ww
俺 男ですが\笑/
ストーカーはまぢ引くわー`д´
きもす乙www
『できないのかwwさすが消防wwww』
笑いwwwww
『できないのかww』
っていう文あるけどw
返信しないんでww
ドンマイ乙www
しかも『さすが』漢字にしろよバーカwww
もしかしてもしかの入力ミスっていう奴?www
だとしたら超だせぇwww
自分から荒し来てるのに
焦ってるとかwww
まぢワロタわwwww
自滅行為まぢ乙wwwwwww´`
消防ってどういう意味だよw
Re: happy?yes,happy!通信 ( No.133 )
日時: 2013/07/17 13:14
名前: ああ (ID: DTH1JhWe)
相手が構ってほしいと思ってるなら無視すればいいじゃんwwwwwwwww
スルースキル0だなwwwwwwwwww
なんで俺の性別知ってるんだよwwwwwwwwどこで知ったの?wwwwwww
おまえほんと 乙 が口癖だなwwwwwwww
乙乙うるせえよwwwwwwwきんもwwwwwww
返信できないだけだろ^^
逃げるならとっととスルーしろゴミクズwwwwwwww
みんなーーwwwwあきひろってやっぱり障害者だよーwwwwww
ドンマイ乙ってなに?wwwwwww
え?え?(・3・)えぇーwwwwwwwww
ドンマイ乙wwwwwwwこいつ完全な障害者wwwwwwww
みんなーwwwwwさすが って漢字にしないと入力ミスなんだってーwwwww
これだから障害者は^^ネットやめとけwwwwww
自滅行為とかなんとかいってるけど、
おまえさっきから俺に消えてほしいような文章ばっかり書いてるよねwwwwww
消えろ とか ストーカーまじ引くわ とかwwwwwwwww
残念消えないよ^^まえも言っただろ覚えろゴミwwwwwwww
消防は消防という用語を知らないことが多いから気にしなくていいよ^^つまり君は消防^^
随時更新していきます
名言(迷言・珍言)集 >>1
Page:1 2
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.14 )
- 日時: 2013/07/15 23:41
- 名前: (*^_^)φ+α ◆NSZmQOZImk (ID: zPUpNUPC)
- 参照: 【速報】酉消失
ヽ( ゜゚)ノoOi()
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.15 )
- 日時: 2013/07/15 23:42
- 名前: (*^_^)φ+α ◆NSZmQOZImk (ID: zPUpNUPC)
- 参照: 【速報】酉消失
ヽ( ゜゚)ノoO(あそういやここ酉ルール変わってたんだった)
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.16 )
- 日時: 2013/07/15 23:43
- 名前: (*^_^)φ+α ◆NSZmQOZImk (ID: zPUpNUPC)
- 参照: ヽ( ゜゚)ノoO(Chromeα)
ヽ( ゜゚)ノoO(悲しい参照はよそう)
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.17 )
- 日時: 2013/07/16 00:10
- 名前: Manda ◆yJgqE12nbI (ID: n1ZeCGPc)
- 参照: 【速報】 Chromeα
α
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.18 )
- 日時: 2013/07/16 07:38
- 名前: てろる ◆GWnAKYUXN2 (ID: lZRL.MZu)
面白いから上げる。
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.19 )
- 日時: 2013/07/16 15:56
- 名前: ああ (ID: DTH1JhWe)
更新あ
- Re: あきひろしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこしこスレ@あきひろの名言:返信遅いやつはデブ ( No.20 )
- 日時: 2013/07/16 17:31
- 名前: Manda ◆yJgqE12nbI (ID: n1ZeCGPc)
しこしこうへへ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.21 )
- 日時: 2013/07/16 17:33
- 名前: L ◆2chAQX/Nak (ID: FIlfPBYO)
- 参照: 両生類です(・(ェ)・) リトバス最高(・(ェ)・)
あきひろ
- >>0晒しスレ@>>0の恥ずかしい名言:いやいやwwwww>happy?yes,happy!←こんなの英文にもなってないからwwwwww ( No.22 )
- 日時: 2013/07/16 17:39
- 名前: Manda ◆yJgqE12nbI (ID: n1ZeCGPc)
- 参照: しょうぼうの相手するといんしょうさがりますよ(‥*)
ようじょ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.23 )
- 日時: 2013/07/16 17:37
- 名前: L ◆2chAQX/Nak (ID: FIlfPBYO)
- 参照: 両生類です(・(ェ)・) リトバス最高(・(ェ)・)
しょた
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.24 )
- 日時: 2013/07/16 18:52
- 名前: Nitro (ID: ???)
しょたαかわいい!!!
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.25 )
- 日時: 2013/07/16 22:30
- 名前: 有毒 ◆eXnyBmGgdA (ID: 5T4lUgOl)
うは
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.26 )
- 日時: 2013/07/16 22:42
- 名前: (*^_^)φ+α ◆NSZmQOZImk (ID: zPUpNUPC)
- 参照: ヽ( ゜゚)ノoO(Chromeα)
ヽ( ゜゚)ノoO(>>24呼んだ?)
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.27 )
- 日時: 2013/07/16 23:15
- 名前: Manda ◆yJgqE12nbI (ID: n1ZeCGPc)
うほっ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.28 )
- 日時: 2013/07/17 13:15
- 名前: ああ (ID: DTH1JhWe)
更新あ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.29 )
- 日時: 2013/07/17 13:16
- 名前: ああ (ID: DTH1JhWe)
ほりゅう
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.30 )
- 日時: 2013/07/17 13:38
- 名前: ああ (ID: DTH1JhWe)
名言集>>1あ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.31 )
- 日時: 2013/07/17 19:32
- 名前: L ◆2chAQX/Nak (ID: FIlfPBYO)
- 参照: 両生類です(・(ェ)・) リトバス最高(・(ェ)・)
あきひろぉぉぉぉぉぉぉぉぉぉ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.32 )
- 日時: 2013/07/17 20:21
- 名前: 名無し ◆V8yTrwtn.A (ID: 8YX.EuJG)
- 参照: 無し
あぁ、やっぱりあいつか。その「あきひろ」ってのは
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.33 )
- 日時: 2013/07/18 12:56
- 名前: カニみそ ◆xD8w1KIXKY (ID: i0DWQeGL)
- 参照: 紅蓮の弓矢〜〜〜
スレロックしたぞw逃げたww
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.34 )
- 日時: 2013/07/18 13:02
- 名前: ああ (ID: DTH1JhWe)
あきひろきめえwwwwwwwwwwwwwwww
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.35 )
- 日時: 2013/07/18 13:40
- 名前: てろる ◆GWnAKYUXN2 (ID: 2Dp9YrwF)
さすがに俺でも「happy? yes,happy!」はないわ〜
せめて文法は守ろうよw
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.36 )
- 日時: 2013/07/18 17:19
- 名前: L ◆2chAQX/Nak (ID: FIlfPBYO)
- 参照: 両生類です(・(ェ)・) リトバス最高(・(ェ)・)
もはやあきひろ
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.37 )
- 日時: 2013/07/18 18:51
- 名前: ああ (ID: DTH1JhWe)
あきひろ死ねよ糞ゴミ汚物
つまんね 反論しろやカス
- Re: あきひろ晒しスレ@あきひろの名言:返信遅いやつはデブ ( No.39 )
- 日時: 2013/07/18 21:39
- 名前: L ◆2chAQX/Nak (ID: FIlfPBYO)
- 参照: 両生類です(・(ェ)・) リトバス最高(・(ェ)・)
あきひろってそこまで屑なの?
Page:1 2