??xml version="1.0" encoding="utf-8" standalone="yes"?>狠狠色丁香久久综合五月,久久久久久毛片免费看,国产亚洲精品久久久久秋霞 http://www.shnenglu.com/jaxe/archive/2014/12/10/VPNSwitcher.html毛 毛 Wed, 10 Dec 2014 04:34:00 GMT http://www.shnenglu.com/jaxe/archive/2014/12/10/VPNSwitcher.html http://www.shnenglu.com/jaxe/comments/209143.html http://www.shnenglu.com/jaxe/archive/2014/12/10/VPNSwitcher.html#Feedback 0 http://www.shnenglu.com/jaxe/comments/commentRss/209143.html http://www.shnenglu.com/jaxe/services/trackbacks/209143.html Stool - Easily switch VPN server for Mac 发布
主要功能:
1.方便理大量VPN服务器和账户
2.扚wVPN服务器速度
3.方便的切换VPNq接,q自动监VPNq接状?
4.支持L2TP和PPTP.
完全免费,Ƣ迎大家使用.
下一?计划加入状态栏支持.
截图:
]]>Lua的weak table和Userdata http://www.shnenglu.com/jaxe/archive/2011/08/11/153054.html毛 毛 Thu, 11 Aug 2011 06:33:00 GMT http://www.shnenglu.com/jaxe/archive/2011/08/11/153054.html http://www.shnenglu.com/jaxe/comments/153054.html http://www.shnenglu.com/jaxe/archive/2011/08/11/153054.html#Feedback 0 http://www.shnenglu.com/jaxe/comments/commentRss/153054.html http://www.shnenglu.com/jaxe/services/trackbacks/153054.html lua 手册原文是这栯释的:A weak table is a table whose elements are weak references. A weak reference is ignored by the garbage collector. In other words, if the only references to an object are weak references, then the garbage collector will collect this object.
A weak table can have weak keys, weak values, or both. A table with weak keys allows the collection of its keys, but prevents the collection of its values. A table with both weak keys and weak values allows the collection of both keys and values. In any case, if either the key or the value is collected, the whole pair is removed from the table. The weakness of a table is controlled by the __mode field of its metatable. If the __mode field is a string containing the character 'k', the keys in the table are weak. If __mode contains 'v', the values in the table are weak.
After you use a table as a metatable, you should not change the value of its __mode field. Otherwise, the weak behavior of the tables controlled by this metatable is undefined.
在lua?像table,userdata,functionq些cd的值都是引用传?通过引用计数来判断是否收掉对?而弱引用(weak reference)会被垃圾回收器忽?weak table是它的元素是弱引用?一个元?键值对)可能键是弱引?也可能值是弱引用的,也可能都是弱引用, q个Ҏ是通过p的metatable的__mode的值来讄?特别有意思的?当弱表中一个键值对,它的键或值关?引用/指向)的那个对象被垃圾回收器回收的时?q个键值对会从p中被自动删除?q是个很重要的特?
那么p到底有什么用? 在lua的wiki中有一用userdata的例?,其中很巧妙的用Cp,原文地址
http://lua-users.org/wiki/CppBindingWithLunar q篇文章介绍了如何通过userdatal定c++对象到脚本中
fulluserdata能够讄metatable,也就能模拟出对象的效果出?对一个C++的类的对象实例来?push到脚本中,一般是创徏了一个userdata,文章中用p避免了同一个对象实?指针) push到脚本中,多次创徏userdata的问?
换句话来?如果C++对象的生存周期是靠lua的垃圑֛收来控制的话(userdata被回收时,调用元表的__gcҎ,__gcҎ中析构c++对象),一个C++对象只能有一个唯一的userdata. 在userdata的metatable中创Z个值是弱引用的p,用C++对象指针做键,每次push c++对象的时?去用指针值查p,如果?push那个userdata,没有创? 同时,当userdata是被弱引用的,当被垃圾回收掉的时?p中它所在的键值对自动被销毁了.
]]>一个利用AOI计算做的 NPC跟随?D服务器DEMO http://www.shnenglu.com/jaxe/archive/2011/08/11/153037.html毛 毛 Thu, 11 Aug 2011 03:22:00 GMT http://www.shnenglu.com/jaxe/archive/2011/08/11/153037.html http://www.shnenglu.com/jaxe/comments/153037.html http://www.shnenglu.com/jaxe/archive/2011/08/11/153037.html#Feedback 0 http://www.shnenglu.com/jaxe/comments/commentRss/153037.html http://www.shnenglu.com/jaxe/services/trackbacks/153037.html 利用AOI模块产生的enterAOI,LeaveAOI事g 触发NPCq随玩家 Z也测试下服务器实体的Ƨ拉角计?br /> 先运行RegionApp.exe 然后再运行ClientDemo WSAD 前后左右 J上K?br /> 客户端做的很?.., 支持多开...下蝲DEMO ]]> 游戏服务器的场景理计算AOIl于搞出一个靠qҎ了。。?/title> http://www.shnenglu.com/jaxe/archive/2011/06/20/148998.html毛 毛 Sun, 19 Jun 2011 17:25:00 GMT http://www.shnenglu.com/jaxe/archive/2011/06/20/148998.html http://www.shnenglu.com/jaxe/comments/148998.html http://www.shnenglu.com/jaxe/archive/2011/06/20/148998.html#Feedback 23 http://www.shnenglu.com/jaxe/comments/commentRss/148998.html http://www.shnenglu.com/jaxe/services/trackbacks/148998.html
当其他实体进出某个实体的q个范围的时候,׃触发leaveAOI或enterAOI事gQƈl护一份AOI 实体列表?br />
我们来考虑最单的实现Q假讑域R中有1000个EntityQ当某个entity位置发生变化Ӟ需要计entity的AOI事g和列表,伪代码如下:
function onEntityMove(who)
for entity in entities do
if who <> entity then
计算who和entity之间的距?br />
如果whoUd前entity在who的AOI范围内,且现在在范围?br />
触发who.onLeaveAOI(entity)
如果whoUd前entity在who的AOI范围外,且现在在范围?br />
触发who.onEnterAOI(entity)
如果whoUd前在 entity的AOI范围内,且现在在范围?nbsp;
触发entity.onLeaveAOI(who)
如果whoUd前在 entity的AOI范围外,且现在在 范围?br />
触发entity.onEntityAOI(who)
end
end
end
每次一个实体移动一ơ位|就要遍?000个实体来计算Q这 样做昄不行Q效率太低了Q?br />
那么需要引入场景管理,区域R分成n个格子,每个格子l护一个实体链表,entityUdӞ只遍历它所在的格子和周围的8个格子的实体链表Q?br />
再优化下Q可以加入AOI圆和格子的碰撞检查,9个格子中再去掉没有相交的格子。。。等{?br />
也有用四叉树来进行场景管理的?br />
q有些方案更单,直接是画格子Q按以实体ؓ中心的九个格子进行位|广播, 实体从一个格子移动到另外的格子时触发事体。。好处是计算量简单,~点是带宽占用大
我上面的Ҏ都试q了Q效率和带宽占用都不理想Q最q终于弄Z个新的方案,现在的AOI计算量是我们服务器以前计量?/40-1/80Q由于涉及到公司的保密制度,不便l说Q上几个试的抓图:
机器配置Qwin7 ,T5870 inter双核2G,2G内存
20个entity 随机q动计算一ơ所有entity AOI的时间在0.02毫秒左右Q?br />
220个实体,选择的实体AOI范围里有68个实体:
4000个实体,选择的实体的AOI区域里有465个实?br />
AOIDemo.exe 下蝲
]]> 面向服务架构(SOA)的一些思?/title> http://www.shnenglu.com/jaxe/archive/2010/12/29/137631.html毛 毛 Tue, 28 Dec 2010 16:31:00 GMT http://www.shnenglu.com/jaxe/archive/2010/12/29/137631.html http://www.shnenglu.com/jaxe/comments/137631.html http://www.shnenglu.com/jaxe/archive/2010/12/29/137631.html#Feedback 1 http://www.shnenglu.com/jaxe/comments/commentRss/137631.html http://www.shnenglu.com/jaxe/services/trackbacks/137631.html 最q在做游戏服务器引擎Q查了不有关SOA的设计方面的资料。发现JAVA世界有相当多的技术标准?br>其中比较好的是OSGi Q?a >http://www.osgi.org/About/WhatIsOSGiQ,OSGi技术是面向Java的动态模型系l。OSGi服务q_向Java提供服务Q这些服务Java成ؓ软g集成和Y件开发的首选环境。Java提供在多个^台支持品的可移植性。OSGi技术提供允许应用程序用精点{可重用和可协作的组件构建的标准化原语。这些组件能够组装进一个应用和部v中?br>参考它的思\Q结合C++语言的特点,我将一个服务器基础框架设计成了q样一U? 一个服务器应用Q由多个lgl成Q组件物理上可以是动态库Q也可以是EXE里一D实际的代码Q每个组件可以向ApplicationFramework注册多个服务Q比如日志服务,|络服务{)?br>ApplicationFramework启动Ӟ通过配置文gQ动态加载和启动lgQ读取服务的可配|属性。Framework触发IComponentActivator的OnStart() 和OnStop()事gQ在Start事g中,可以注册lg自己的服务,也可以加入一个服务监听器来监听关心的服务的注册,注销{事件?br>我随便画了几个大概的接口Q?br> ]]> vim替换^M字符(? http://www.shnenglu.com/jaxe/archive/2010/10/15/130001.html毛 毛 Fri, 15 Oct 2010 03:28:00 GMT http://www.shnenglu.com/jaxe/archive/2010/10/15/130001.html http://www.shnenglu.com/jaxe/comments/130001.html http://www.shnenglu.com/jaxe/archive/2010/10/15/130001.html#Feedback 0 http://www.shnenglu.com/jaxe/comments/commentRss/130001.html http://www.shnenglu.com/jaxe/services/trackbacks/130001.html 替换^M字符 在Linux下用vi来查看一些在Windows下创建的文本文gQ有时会发现在行有一?#8220;^M”。有几种Ҏ可以处理?/p>
1.使用dos2unix命o。一般的分发版本中都带有q个工P如果没有可以Ҏ下面的连接去下蝲Q,使用h很方? $ dos2unix myfile.txt 上面的命令会L行尾的^M?/p>
2.使用vi的替换功能。启动viQ进入命令模式,输入以下命o: :%s/^M$//g # L行尾的^M?/p>
:%s/^M//g # L所有的^M?/p>
:%s/^M/[ctrl-v]+[enter]/g # ^M替换成回车?/p>
:%s/^M/\r/g # ^M替换成回车?/p>
3.使用sed命o。和vi的用法相| $ sed -e ‘s/^M/\n/g’ myfile.txt
注意Q这里的“^M”要?#8220;CTRL-V CTRL-M”生成Q而不是直接键?#8220;^M”?
转自Q?a target=__blank>http://hi.baidu.com/mofeis/blog/item/23c7b2fb92dc97234e4aea6d.html
]]> 游戏服务器中的数据库异步操作技术和游戏数据的保存机?/title> http://www.shnenglu.com/jaxe/archive/2010/08/30/125258.html毛 毛 Mon, 30 Aug 2010 03:35:00 GMT http://www.shnenglu.com/jaxe/archive/2010/08/30/125258.html http://www.shnenglu.com/jaxe/comments/125258.html http://www.shnenglu.com/jaxe/archive/2010/08/30/125258.html#Feedback 12 http://www.shnenglu.com/jaxe/comments/commentRss/125258.html http://www.shnenglu.com/jaxe/services/trackbacks/125258.html 在游戏服务器中,处理玩家登陆需要向数据库查询玩家的账号和密码,玩家上线和下UK要对玩家的角色数据从数据库中d和保存。可以说Q相对于游戏逻辑处理来说Q数据库操作是一U相对很慢的操作Q即便你通过使用多个U程多个数据库连接来提高数据库操作的处理能力Q但是,在高q发高负载的服务器应用中Q这样仍然会是相当的负蝲瓉。设惌样一U设计方案,见下图: 在大量玩家登陆游戏服务器Ӟ׃有大量的数据库访问请求,即便是有自己实现的CACHE机制Q还是会D服务器耗尽所有的逻辑U程资源Q服务器的处理能力将降低成DBMS的处理能力?br> Z不阻塞逻辑U程Q可以采用异步数据库讉K的方式,x据库操作h提交l专门的数据库处理线E池Q然后逻辑U程不再{待数据库处理结果,l箋处理其他Q不再阻塞在q里?br> 抽象的来看,对于一个需要持久化的游戏对象来_可以考虑它有2个方法,d和保存。那么我们抽象一个DBO接口Q?br>
struct IDbo { virtual bool SaveToDB(DB * ) = 0 ; virtual bool LoadFromDB(DB * ) = 0 ; } ;
然后把设计方案改成下面这U: Ҏ数据库异步处理后Q在x现在的游戏数据的保存机制应该是怎样改进的,Z保障数据安全Q我们希望不只是玩家下线的时候才会保存玩家数据,而是希望每隔一D|间统一保存所有在U玩家的数据Q那么,可以考虑q样的思\Q假设我们有一个GAMEDB服务器,GAMEDB~存了所有在U玩家的角色数据Q每C存时_GAMEDB将所有在U玩家的数据(DBOQ的副本都统一提交lDBU程池,让它保存数据Q提交的q程很快Q提交完后,GAMEDB的逻辑U程仍能l箋处理游戏服务器的更新和读取CACHE的请求。ؓ什么要保存副本呢,DBU程的执行保存队列的q程也许很耗时Q但是队列中的数据都是GAMEDB提交DBO那个时刻的数据,q样p保证玩家的游戏数据的完整性?br> 当然Q我q里提的q只是个思\Q这里面q有很多l节没有讨论Q例如如果DBU程池正在保存九炚w时刻保存的数据,C十点钟新的保存时LQDBU程池还没保存完九点钟时ȝDBO副本队列Q这时应该怎么处理QDBO对象的划分粒度的问题QDBO队列的优先的问题等{?br> PS:q篇文章里的架构其实是一个GAMEDB服务器,里面的逻辑处理是GAMEDB的逻辑处理。你可以把这文章理解成Q一个GAMEDB服务?的实现思\。。?
]]>配置VIM实现新徏c/c++文gQ自动插入注释和文g? http://www.shnenglu.com/jaxe/archive/2010/07/29/121566.html毛 毛 Thu, 29 Jul 2010 04:26:00 GMT http://www.shnenglu.com/jaxe/archive/2010/07/29/121566.html http://www.shnenglu.com/jaxe/comments/121566.html http://www.shnenglu.com/jaxe/archive/2010/07/29/121566.html#Feedback 1 http://www.shnenglu.com/jaxe/comments/commentRss/121566.html http://www.shnenglu.com/jaxe/services/trackbacks/121566.html ~辑~/.vimrc 加入以下代码
1 autocmd BufNewFile * .[ch], * .hpp, * .cpp exec " :call SetTitle() " 2 3 " 加入注释 4 func SetComment() 5 call setline( 1 , " /*=============================================================== " ) 6 call append(line( " . " ), " * Copyright (C) " .strftime( " %Y " ). " All rights reserved. " ) 7 call append(line( " . " ) + 1 , " * " ) 8 call append(line( " . " ) + 2 , " * 文g名称Q?/span>" .expand( " %:t " )) 9 call append(line( " . " ) + 3 , " * ?nbsp;?nbsp;者:蒋浩 " ) 10 call append(line( " . " ) + 4 , " * 创徏日期Q?/span>" .strftime( " %Yq?m?d?/span>" )) 11 call append(line( " . " ) + 5 , " * ?nbsp; qͼ " ) 12 call append(line( " . " ) + 6 , " * " ) 13 call append(line( " . " ) + 7 , " * 更新日志Q?/span>" ) 14 call append(line( " . " ) + 8 , " * " ) 15 call append(line( " . " ) + 9 , " ================================================================*/ " ) 16 endfunc 17 18 " 定义函数SetTitleQ自动插入文件头 19 func SetTitle() 20 call SetComment() 21 if expand( " %:e " ) == ' hpp ' 22 call append(line( " . " ) + 10 , " #ifndef _ " .toupper(expand( " %:t:r " )). " _H " ) 23 call append(line( " . " ) + 11 , " #define _ " .toupper(expand( " %:t:r " )). " _H " ) 24 call append(line( " . " ) + 12 , " #ifdef __cplusplus " ) 25 call append(line( " . " ) + 13 , " extern \ " C\ "" ) 26 call append(line( " . " ) + 14 , " { " ) 27 call append(line( " . " ) + 15 , " #endif " ) 28 call append(line( " . " ) + 16 , "" ) 29 call append(line( " . " ) + 17 , " #ifdef __cplusplus " ) 30 call append(line( " . " ) + 18 , " } " ) 31 call append(line( " . " ) + 19 , " #endif " ) 32 call append(line( " . " ) + 20 , " #endif // " .toupper(expand( " %:t:r " )). " _H " ) 33 elseif expand( " %:e " ) == ' h ' 34 call append(line( " . " ) + 10 , " #pragma once " ) 35 elseif & filetype == ' c ' 36 call append(line( " . " ) + 10 , " #include \ "" .expand( " % :t:r " ). " .h\ "" ) 37 elseif & filetype == ' cpp ' 38 call append(line( " . " ) + 10 , " #include \ "" .expand( " % :t:r " ). " .h\ "" ) 39 endif 40 endfunc 41
]]> 多线E还是单U程Q?/title> http://www.shnenglu.com/jaxe/archive/2010/07/06/119387.html毛 毛 Mon, 05 Jul 2010 16:06:00 GMT http://www.shnenglu.com/jaxe/archive/2010/07/06/119387.html http://www.shnenglu.com/jaxe/comments/119387.html http://www.shnenglu.com/jaxe/archive/2010/07/06/119387.html#Feedback 13 http://www.shnenglu.com/jaxe/comments/commentRss/119387.html http://www.shnenglu.com/jaxe/services/trackbacks/119387.html 一个典型的游戏服务器设计中Q一般都是用的多U程Q服务器中一般运行两cȝE,N个SOCKET IOU程Q?个逻辑U程Q?br>IOU程接受客户端发来的信息Q通过消息队列发送给逻辑U程处理后,再发送消息给客户端,发送消息这里一般是IOU程处理实际发送?br> 其实我认为,如果逻辑U程都是消耗的CPUq算资源的话Q服务器完全采用单线E的方式来做?br> 首先Q我们看IO处理Q基本就是数据入队、出队,send、recv操作Q作为服务器的SOCKET处理一般都是异步SOCKETQ也是_send、recv操作只是信息copy到socket底层的发送接收缓冲区MQ不存在IO堵塞的问题?br> 然后Q我们再来看逻辑处理Q前面已l说了,采用单线E的前提是逻辑处理只是消耗CPUq算资源Q那么,不管你开几个U程Q对单核的CPU来说Q它的处理速度是q么多,q不会因ZU程开的越多,处理的快?br> 因此我们可不可以q样说呢Q在单核机器上,只消耗CPUq算的服务,多线Eƈ不比单线E能提高多少效率?br> 接下来,我们再讨Z多核的情况,你肯定要惻I我这台服务器?个双核CPUQ就只跑一个单U程的服务器不是亏死了,多线E多好,我开8个线E,p很好的利用我的机器啦。是啊,我也觉得q样很好Q不q在LINUX、UNIX下,对线E的支持q不像WINDOWS下那么好QLINUX、UNIX下一般都是用LWPQ轻量q程Q的方式来支持多U程E序的,Linux内核只提供了轻量q程的支持,限制了更高效的线E模型的实现Q但Linux着重优化了q程的调度开销Q一定程度上也I补了q一~陷。同Ӟ滥用多线E也会造成不必要的上下文切换,不必要的同步机制的引入(如pthread_mutexQ,让程序频J的在内核和用户间频J切换。另外,从开发角度来看,单线E开发比多线E环境开发更不容易出错和更加健壮?br> 在游戏服务器架构中,Z提高玩家在线人数Q实现负载均衡,现在一般都是采用分布式的多q程服务器集的方式Q我们来看看服务器集中Q每个服务进E是采用多线E的方式q是单线E的方式好呢Q我觉得Q对于有慢速IO讉K的需求的应用q程Q多U程肯定比单U程好,最典型的情况就是数据库讉Kq块Q完全可以采用N个DBU程Q一个逻辑U程的架构,而对只是消耗CPUq算资源的应用进E,量单线E就行了Q如果觉得单U程负蝲不行的话Q完全可以分成多个进E来跑。?br> 以上只是我自q一些看法,表达有限Q欢q指正。。?/p>
]]> Boost.Program_options中的一个函数式~程的例?/title> http://www.shnenglu.com/jaxe/archive/2010/07/05/119385.html毛 毛 Mon, 05 Jul 2010 15:08:00 GMT http://www.shnenglu.com/jaxe/archive/2010/07/05/119385.html http://www.shnenglu.com/jaxe/comments/119385.html http://www.shnenglu.com/jaxe/archive/2010/07/05/119385.html#Feedback 2 http://www.shnenglu.com/jaxe/comments/commentRss/119385.html http://www.shnenglu.com/jaxe/services/trackbacks/119385.html 其文档例子中有如下代码:
1 using namespace boost::program_options; 2 // 声明需要的选项 3 options_description desc( " Allowed options " ); 4 desc.add_options() 5 ( " help,h " , " produce help message " ) 6 ( " person,p " , value < string > () -> default_value( " world " ), " who " );
看第4?行,是不是感觉很怪?q种方式体现了函数式~程中最大的特点Q函数是一cd|引用资料来说,所?#8220;函数是一cd|First Class ValueQ?#8221;指的是函数和值是同等的概念,一个函数可以作为另外一个函数的参数Q也可以作ؓg用。如果函数可以作Zcdg用,那么我们可以写Z些函敎ͼ使得q些函数接受其它函数作ؓ参数q返回另外一个函数。比如定义了f和g两个函数Q用compose(f,g)的风格就可以生成另外一个函敎ͼ使得q个函数执行f(g(x))的操作,则可Ucompose为高阶函敎ͼHigher-order FunctionQ?br> program_options里的q种方式是怎么实现的呢Q通过分析boost的源代码Q我们自己来写个cM的实现看看: test.h
1 #pragma once 2 3 #include < iostream > 4 using namespace std; 5 6 class Test; 7 8 class Test_easy_init 9 { 10 public : 11 Test_easy_init(Test * owner):m_owner(owner){} 12 13 Test_easy_init & operator () ( const char * name); 14 Test_easy_init & operator () ( const char * name, int id); 15 private : 16 Test * m_owner; 17 }; 18 19 20 class Test 21 { 22 public : 23 void add( const char * name); 24 void add( const char * name, int id); 25 26 Test_easy_init add_some(); 27 28 };
test.cpp
1 #include " test.h " 2 3 Test_easy_init & Test_easy_init:: operator () ( const char * name, int id) 4 { 5 6 m_owner -> add(name,id); 7 return * this ; 8 } 9 10 11 Test_easy_init & Test_easy_init:: operator () ( const char * name) 12 { 13 14 m_owner -> add(name); 15 return * this ; 16 } 17 18 Test_easy_init Test::add_some() 19 { 20 return Test_easy_init( this ); 21 } 22 23 24 void Test::add( const char * name) 25 { 26 cout << " add: " << name << endl; 27 } 28 29 void Test::add( const char * name, int id) 30 { 31 cout << " add: " << name << " - " << id << endl; 32 }
使用方式Q?br>
1 Test t1; 2 3 t1.add_some() 4 ( " hello " , 1 ) 5 ( " no id " ) 6 ( " hello2 " , 2 );
是不是很有意思。add_some()Ҏq回一个Test_easy_initcȝ对象QTest_easy_initc重载了操作W?)Q操作符()Ҏq回Test_easy_initcd象自w的引用。?
]]>
þþۺϾɫۺ98 |
һþƵ |
ɫۺϾþɫ |
þСƵ |
þۺɫһ |
69ƷþþþAPP |
þþþĸ |
þþƷƷëƬ |
Ʒþþѿ |
Ʒһþþþþþվ |
Ʒþþþþ |
ŷսþþþþþþ |
þþWWW |
þúݺɫۺ |
þþƷavպ |
ҹƷþӰԺ |
91Ʒպþò |
þۺϹɫ88þþƷۺ
|
þùѾƷ |
þþþùɫAVѿͼƬ |
99þ99ֻѵľƷ |
ۺϾþһ |
þþþùһëƬ |
þ99Ʒþþþþ |
þþþ99ƷƬֱ |
ҹƷþӰԺ |
þþžžþƷֱ |
þ99Ʒ |
˺ݺۺϾþ88 |
þþþþþƷѿSSS |
ŷƷ˿þþĻ |
99þþþþѿ |
9999Ʒŷþþþþ |
1000Ʒþþþþþþ |
ƷŮٸaѾþ |
þþŷղa |
þ99Ʒþþôѧ |
69Ʒþþþվ |
ƷþþþþҲ |
þþƷƷƷ |
AVպƷþþþþþ |