发布新日志

  • Load Generator负载生成器

    450174661 发布于 2013-07-16 09:10:12

    对场景进行设计后,接着需要对负载生成器进行管理和设置。Load Generator是运行脚本的负载引擎,在默认情况下使用本地的负载生成器来运行脚本,但是模拟用户行为也需要消耗一定的系统资源,所以在一台电脑上无法模拟大量的虚拟用户,这个时候可以通过多个Load Generator来完成大规模的性能负载;

     

     

    1、添加负载机器之前需要开启代理运行时设置;

    Load Runner-Tool- LoadRunner Agent Runtime Settings Configuration,开启代理运行时设置;弹出页面如下:只需要输入当前主机的密码即可;在电脑右下角出现雷达的图标,表示开启了代理。

     

    注意:默认选第一项后,在这里点击OK,可能开启不了小雷达,目前在我们实际的工作中已经出现了这样的问题,后来我们找到了解决的方法。开启不了小雷达,我们选择第二项,点击OK,发现会报运行时错误,报错后我们点击报错中的退出,然后进入开始-所有程序-LoadRunner-Advanced Settings,找到Agent Configuration,点击后弹出如下界面,我们勾选第二项后,点击OK,发现小雷达出现了。

     

    2、设置完成后添加负载机器:

     

     

    10.5.11.31服务器的代理服务没有开启,所以无法链接;

     

     

    3、选中目标主机,点击Connect,可以发现目标主机被链接上,目标主机中的雷达边也多了个云;

     

    4、连接上了,我们就可以对各主机进行虚拟用户分配了,只需要在Load Generators的下拉列表中选中对应的主机即可;

     

    5Load Generator中还有一个很重要的设置。就是用来设置init人数的,我们在运行脚本的时候会发现,在场景监控中,init默认不会超过50个人,也就是最大并发是50个人,我们想使用超过50个人的并发,就需要在这里进行设置了。

     

     

    点击Details,弹出如下图,找到Run-Time Quota标签页。两个值都默认为50,第一个值init最少加载多少用户开始运行脚本,第二个值指加载多少用户就停止加载,开始运行脚本,不勾选表示初始化所有用户后开始运行。不过这里的两个值,我们一般只在单并发时才进行修改,比如单并发100个用户,那么我们把两个值都设置为100。组合场景目前的加载方式我们是每秒加载两个,所以不需要修改这里

     

    6、场景运行后报错,提示  误差(81024):lr_vug:”QtWeb类型不支持”WIN32平台。

    解决方案:暂时还没找到,待后续解决;

  • 如何发现客户端软件中的内存泄漏?

    tiantian010 发布于 2008-06-12 20:29:26

       对于题目中的问题,我今儿个发表下个人见解,有不正确之处还请大侠们多多指点.

       为了定位客户端内存泄露我们首先先判定客户端操作系统是什么?windows还是Unix(Linux)?

       无论是windows还是Unix(Linux),我们都可以通过两种方式进行监控和定位:
       方式一:

       若是windows操作系统,可以通过手动查看性能计数器的状态进行问题定位,近而确认是否是内存泄漏,操作步骤如下:

       选择开始-〉控制面板-〉性能和维护-〉管理工具-〉性能查看系统各种资源的使用情况,我们还可以通过图表上面的"+"来选择要查看的计数器信息;
       若是unix或者linux系统,可以通过命令行的方式察看系统资源,操作步骤如下:

       输入vmstat(-f|-s)命令来监控系统内存使用统计,包括进程信息、memory信息、page信息、错误信息、cpu信息;输入top命令用于显示进程对系统资源的利用程度,包括cpu占用百分比信息,内存资源使用情况;还可以通过free命令察看内存信息;
       例如:输入vmstat命令后显示的信息如下:
        procs    memory             page                        faults       cpu
        r  b  w  avm   free    re  at  pi  po   fr  de   sr   in   sy   cs  us  sy id
        1  0  0 925137 928837  535 2   0   0    0   0    0   1001  2271 136  1   1 98 
        输入top命令后信息显示如下:
    System:****                                     Thu Jun 12 17:43:58 2008
    Load averages: 0.02, 0.02, 0.02
    178 processes: 166 sleeping, 11 running, 1 zombie
    Cpu states:
    CPU   LOAD   USER   NICE    SYS   IDLE  BLOCK  SWAIT   INTR   SSYS
     0    0.05   0.8%   0.0%   2.0%  97.2%   0.0%   0.0%   0.0%   0.0%
     1    0.01   0.0%   0.0%   0.0% 100.0%   0.0%   0.0%   0.0%   0.0%
     2    0.01   1.4%   0.0%   1.2%  97.4%   0.0%   0.0%   0.0%   0.0%
     3    0.02   0.0%   0.0%   0.2%  99.8%   0.0%   0.0%   0.0%   0.0%
    ---   ----  -----  -----  -----  -----  -----  -----  -----  -----
    avg   0.02   0.6%   0.0%   0.8%  98.6%   0.0%   0.0%   0.0%   0.0%

    Memory: 2898688K (1078576K) real, 9436116K (3305252K) virtual, 3714620K free Page# 1/6

    CPU TTY     PID USERNAME PRI NI   SIZE    RES STATE    TIME %WCPU  %CPU COMMAND
     0   ?    11015 root     152 20  1314M   480M run      5:55  0.80  0.79 java
     1   ?       39 root     152 20  9632K  9632K run      8:18  0.76  0.76 vxfsd
     3 pts/ta  5673 fism     178 20  7328K  5372K run      0:00  0.38  0.21 top
     0   ?    26606 1001     152 20   147M 14468K run      0:00  0.12  0.12 db2fmp
     0   ?     5656 dasusr1  168 20 12104K  1392K sleep    0:00  0.14  0.11 db2admin
     1   ?     1624 root     152 20 26128K  4044K run      0:10  0.10  0.10 vxsvc
     1   ?     1898 root     152 10  6296K  1008K run      0:00  0.10  0.10 memlogd
     3   ?     1748 root     168 20  7876K   888K sleep    5:03  0.08  0.08 db2fmcd
     0   ?      517 root     152 20  2276K   332K run      1:05  0.08  0.08 syncer
     0   ?    15888 db2inst1 154 20  5849M 14148K sleep    0:03  0.06  0.06 db2agent
     1   ?    15841 db2inst1 152 20   253M 32596K run      1:38  0.06  0.06 db2hmon
     1   ?      647 root     127 20  5132K   500K sleep    0:16  0.05  0.05 netfmt
     0   ?    15859 db2inst1 156 20  5720M 10436K sleep    0:08  0.05  0.04 db2loggr
     0   ?    11061 db2inst1 154 20  5848M 14204K sleep    8:19  0.04  0.04 db2agent
     3   ?        3 root     128 20    32K    32K sleep    1:06  0.04  0.04 statdaemon
     3   ?    29602 1001     152 20   142M  9172K run      0:00  0.04  0.04 db2fmp
     0   ?     1319 root     154 20  2752K   376K sleep    1:55  0.04  0.04 pwgrd
     0   ?     1165 root     154 20  3900K   732K sleep    0:50  0.03  0.03 sendmail:
     1   ?        0 root     127 20    32K     0K sleep    0:12  0.02  0.02 swapper
     2   ?        1 root     168 20   496K   204K sleep    0:28  0.02  0.02 init
     1   ?        2 root     128 20    32K    32K sleep    0:00  0.02  0.02 vhand
     2   ?        4 root     128 20    32K    32K sleep    0:04  0.02  0.02 unhashdaemon
     2   ?       19 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     3   ?       20 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     2   ?       21 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     3   ?       22 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     0   ?       23 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     0   ?       24 root     147 20    32K    32K sleep    0:09  0.02  0.02 lvmkd
     1   ?       32 root     148 20    32K    32K sleep    0:01  0.02  0.02 lvmdevd
     2   ?       67 root     148 20    32K    32K sleep    0:02  0.02  0.02 lvmdevd
     0   ?       69 root     148 20    32K    32K sleep    0:02  0.02  0.02 lvmdevd
     3   ?      533 root     153 20    32K    32K sleep    0:00  0.02  0.02 dmprestored
       上面的数值应该很明确了,就不用多说了吧.

       方法二:我们也可以通过比较流行的性能测试工具loadRunner进行监控客户端的内存情况:
       具体怎样通过LR工具进行设置就不详述了.要添加的监控指标包括:

       Memory\Available Mbytes;

       Pages/sec、Pages Read/sec和Page Faults/sec;

       Physical Disk


       下面主要说一说通过监控这些指标,来确定内存问题的步骤:
        1.首先查看可用内存(Memory\Available Mbytes)计数器指标。若值较小则可能有内存问题,需进一步分析。
        2.注意Pages/sec、Pages Read/sec和Page Faults/sec计数器的值。 Pages/sec和Page Faults/sec的值持续很高,很可能内存问题,若Pages Read/sec的值超过5,则可判断存在内存问题。
        3.根据Physical Disk计数器的值分析性能瓶颈。如果磁盘的Average Disk Queue Length计数器增加的同时Pages Read/sec并未降低,则可判断内存有问题。

       上面是个人拙见,还请大侠多替宝贵意见!

  • 怎样对LR结果进行分析

    tiantian010 发布于 2008-08-06 19:03:50

     

    LoadRunner测出来的数据,有哪些实际意义呢. 

       Maximum Running V-users: 30
       Total Throughput (bytes): 17,194,278
       Average Throughput (bytes/second): 65,130
       Total Hits: 514
       Average Hits per Second: 1.947

    Std. Deviation和90 Percent是代表什么东西的啊? 我怎样才能知道服务器的负载已经饱和了?怎样的状态才能说明这个软件通过压力测试?

    首先要说明的是,web测试分负载测试和压力测试,负载测试一般是根据在需求里提出的服务器和客户端的性能指标进行验证性的测试。而压力测试没有通过不通过的概念,一般是在达到这个性能指标后,想知道这个系统还有多少的扩展能力(一般指服务器,或是产品,例如:测试各家中间件产品(其实还是一个服务器))才做的。而一般做压力测试,基本上是寻求一个断点,也就是性能曲线的折点,从这点开始,各项指标急剧下降或是急剧上升。对于软件我没做过什么压力测试(但看你的指标,好像不是软件的压力测试),不知道有那些具体指标,但对于服务器基本观察以下几个指标,
    服务器响应时间,
    服务器cpu负载率,
    内存可用率,
    socket错误
    (基于测试软件的不同,指标的数量也不同)。
       至于那两个参数的意思,我也是除学lr,以前一直用的是开源工具,所以不太清楚,不过觉得基本上和压力测试没什么关系。

    在yahoo loadrunner forum中,有人给出这样的解释:90%的用户是以等于或小于此项响应时间来进行transaction的。(不好意思,原英文忘了记录,我翻译的,大概是这个意思)
    至于想查看服务器是否达到了压力极限,也就是说出现了压力瓶颈,应该结合服务器性能监测结果,最好进行各项指标曲线图合并分析一下。
    瓶颈分析可不是个简单的过程,有时所作的测试不足以分析出瓶颈,还要增补case。

    无论是压力还是负载测试,在测试之前都需要有一个性能指标。
    有了这个指标,在涉及压力测试场景的时候就可以选择是以Vuser no或者Average Response time作为目标。达到这个目标之后,看服务器的响应,看其他指标是否已经达到。
    例如,我的目标是1000个Vuser时候,某银行转帐的交易的平均响应时间不大于5秒钟。
    这样,我的虚拟用户逐渐加压的过程中,在online monitor里面可以看到响应时间也是随之增加的,到5秒的时候看,虚拟用户数长到了多少,是否到了1000,是否超过了1000,或者机器是否已经down了等等,然后观看服务器、网络等的资源时候的状况,这样就可以直接出分析报告了。

    要是调用程序员的程序,服务器资源占用情况可能是追查瓶颈的一个线索,但如果是标准中间件,那就没那么简单了,比如oracle数据库的某项参数设得不对,照样会造成数据库瓶颈,应用程序调用数据库的API写法不对,比如未使用软解析变量,也有可能导致数据库瓶颈。这些瓶颈都不会反映在cpu,内存使用量上等指标上的。
    对于这种情况,一方面需要对中间件有一定的了解,知道哪些参数有什么作用,怎么可调的,另外还可能使用中间件的专有监测工具,来分析。lr的性能计数器是不够用的。
    个人体会,查找瓶颈的难易程度,由易到难
    服务器硬件瓶颈-〉网络瓶颈-〉应用瓶颈-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库,web服务器等)
    记忆比较深刻的一次,用lr做了两天性能测试,指标上不去,后来使用oracle数据库的图形化性能检测工具才发现某个表的查询处理时间超长,原来索引创建得不合理,把表的索引改了之后,性能稍有提高,但还是上不去。再次排查,发现应用中有一个sql语句写得有问题,长而且耗时,改了之后,还是上不去.......
    经过至少四轮的排查,才大功告成,最后一个除掉的瓶颈是操作系统问题(开始没有想到它,后来看系统消息,才发现已经有错误报出)
    类似的情况很多,做性能测试需要掌握很多东西,个人认为,使用loadrunner只是性能测试第一小步,每个系统的性能测试都是一个全新的挑战。
    热爱性能测试!

     

    每次我最关心的其中几个数值!~
    Average:平均值 即完成事务的平均值
    90 Percent:90%的事务在 那个时间完成的,表上都有对应
    剩下的几个不用说了吧,大家也都知道
    接下来分析的时候需要你,把系统监视器的图也贴出来,+上你的事务处理的那张图把他们放在一起,看看你关心的东西,随着时间,点击次数,事务增长以及完成,来对比察看,系统 各个参数变化,从而分析一下


    当运行某个场景结果时,出现了下列提示信息:该怎麽解决呢?

    The following graph(s) were not created:
    1. Hit per second
    2. Throughput
    3. Transaction Summary
    4. Average Transaction Response Time

    Possible reason:
    The graph, as defined, results in no data.

     

     

  • 如何解决连接 DB2 数据源时出现的错误

    tiantian010 发布于 2008-08-06 19:08:21

    环境:(产品,平台,机型,软件版本,等)
    产品:WebSphere Application Server
    平台:UNIX; Linux
    版本:5.1.x, 6.0.x

    问题描述:
    在 WebSphere Application Server 中,当应用程序连接 DB2 数据源时出现了下面的错误信息:
    "java.lang.UnsatisfiedLinkError: SQLConnect"

    解答:
    在 WebSphere Application Server 中,如果您的应用程序连接 DB2 数据源时出现了下面的错误信息 "java.lang.UnsatisfiedLinkError: SQLConnect",请按照下面的步骤配置:

    1. 停止 WebSphere 应用程序服务器
    2. 运行 #. ./db2profile (在 <DB2INSTANCE_HOME>/sqllib下)

    3. 或者您可以直接设置操作系统的共享库路径的环境变量,使其包括 <DB2INSTANCE_HOME>/sqllib/lib 目录(例如在 AIX 上为 LIBPATH 和 LD_LIBRARY_PATH),这样才能找到在连接 DB2 数据源 时所需要的 libdb2jdbc.so 文件

    4. 重新启动应用程序服务器,执行您的程序

    注意:
    1. “#. ./db2profile”命令中一定注意最前面的一个“.”不能少

    2. 请检查您的 WebSphere Application Server 的版本是 32 位还是 64 位,如果是 32 位,要确认执行的是 32 位 DB2 实例的 db2profile 文件,如果是 64 位,要确认执行的是 64 位 DB2 实例的 db2profile 文件

    1)执行“java -fullversion”或“java -version”可以看到 JDK 是 32 位还是 64 位

    2)执行“db2level”可以看到 DB2 实例是 32 位还是 64 位,例如:


    DB21085I 实例 "DB2" 使用 "32" 位和 DB2 代码发行版 "SQL08016",级别标识为
    "02070106"。
    信息性标记为 "DB2 v8.1.6.574"、"s040616" 和"WR21340",修订包为 "6"。
    产品是在 "D:\PROGRA~1\IBM\SQLLIB" 处安装的。

    另外 #ls -l <DB2INSTANCE_HOME>/sqllib 也可以看到当前 lib 目录是指向 lib32 目录还是 lib64 目录 
     

  • LR常用的函数汇总

    tiantian010 发布于 2008-08-06 19:06:15

    事务函数:
    lr_end_sub_transaction 标记子事务的结束以便进行性能分析
    lr_end_transaction 标记 LoadRunner 事务的结束
    lr_end_transaction_instance 标记事务实例的结束以便进行性能分析
    lr_fail_trans_with_error 将打开事务的状态设置为 LR_FAIL 并发送错误消息
    lr_get_trans_instance_duration 获取事务实例的持续时间(由它的句柄指定)
    lr_get_trans_instance_wasted_time 获取事务实例浪费的时间(由它的句柄指定)
    lr_get_transaction_duration 获取事务的持续时间(按事务的名称)
    lr_get_transaction_think_time 获取事务的思考时间(按事务的名称)
    lr_get_transaction_wasted_time 获取事务浪费的时间(按事务的名称)
    lr_resume_transaction 继续收集事务数据以便进行性能分析
    lr_resume_transaction_instance 继续收集事务实例数据以便进行性能分析
    lr_set_transaction_instance_status 设置事务实例的状态
    lr_set_transaction_status 设置打开事务的状态
    lr_set_transaction_status_by_name 设置事务的状态
    lr_start_sub_transaction 标记子事务的开始
    lr_start_transaction 标记事务的开始
    lr_start_transaction_instance 启动嵌套事务(由它的父事务的句柄指定)
    lr_stop_transaction 停止事务数据的收集
    lr_stop_transaction_instance 停止事务(由它的句柄指定)数据的收集
    lr_wasted_time 消除所有打开事务浪费的时间

    命令行分析函数
    lr_get_attrib_double 检索脚本命令行中使用的 double 类型变量
    lr_get_attrib_long 检索脚本命令行中使用的 long 类型变量
    lr_get_attrib_string 检索脚本命令行中使用的字符串

    信息性函数
    lr_user_data_point 记录用户定义的数据示例
    lr_whoami 将有关 Vuser 脚本的信息返回给 Vuser 脚本
    lr_get_host_name 返回执行 Vuser 脚本的主机名
    lr_get_master_host_name 返回运行 LoadRunner Controller 的计算机名

    字符串函数
    lr_eval_string 用参数的当前值替换参数
    lr_save_string 将以 NULL 结尾的字符串保存到参数中
    lr_save_var 将变长字符串保存到参数中
    lr_save_datetime 将当前日期和时间保存到参数中
    lr _advance_param 前进到下一个可用参数
    lr_decrypt 解密已编码的字符串
    lr_eval_string_ext 检索指向包含参数数据的缓冲区的指针
    lr_eval_string_ext_free 释放由 lr_eval_string_ext 分配的指针
    lr_save_searched_string 在缓冲区中搜索字符串实例,并相对于该字符串实例,将该缓冲区的一部分保存到参数中

    消息函数
    lr_debug_message 将调试消息发送到输出窗口
    lr_error_message 将错误消息发送到输出窗口
    lr_get_debug_message 检索当前的消息类
    lr_log_message 将输出消息直接发送到 output.txt 文件,此文件位于 Vuser 脚本目录中。该函数有助于防止输出消息干扰 TCP/IP 通信。
    lr_output_message 将消息发送到输出窗口
    lr_set_debug_message 为输出消息设置消息类
    lr_vuser_status_message 生成格式化输出并将其打印到Controller Vuser状态区域。
    lr_message 将消息发送到 Vuser 日志和输出窗口
    注意:如果使用日志运行时设置修改脚本的调试级别,则 lr_message、lr_output_message 和 lr_log_message 函数的行为将不会更改,它们将继续发送消息。

    运行时函数
    lr_load_dll 加载外部 DLL
    lr_peek_events 指明可以暂停 Vuser 脚本执行的位置
    lr_think_time 暂停脚本的执行,以模拟思考时间(实际用户在操作之间暂停以进行思考的时间)
    lr_continue_on_error 指定处理错误的方法
    lr_rendezvous 在 Vuser 脚本中设置集合点
    lr_load_dll (“mydll.dll”);
     myfun ();  /*在mydll.dll中定义—可以在加载myfun.dll后立即直接调用 */
     
    同步函数
    TE_wait_cursor 等待光标出现在终端窗口的指定位置
    TE_wait_silent 等待客户端应用程序在指定秒数内处于静默状态
    TE_wait_sync 等待系统从 X-SYSTEM 或输入禁止模式返回
    TE_wait_text 等待字符串出现在指定位置
    TE_wait_sync_transaction 记录系统在最近的 X SYSTEM 模式下保持的时间
    注:同步仅适用于RTE Vuser 脚本。

  • QTP之检查点实例操作

    iseedeadpeople 发布于 2010-07-13 11:39:51

     摘要:

    '           1.检查点的作用:检查点比较指定属性的当前值与期望值,

    '   以判断当前的程序(或站点)功能是否正常。

    '           2.此样例用qtp自带的程序:flight4a.exe

    QTP:10.00.0.0   build 513

    '  作者:刘林 (QQ:994165)

    '  日期:2009-10-09

    '  角本名:checkPoint

    '   输入用户名和密码,并点击"OK"

    Dialog("Login").WinEdit("Agent Name:").Set "sdf"

    Dialog("Login").WinEdit("Password:").SetSecure "4ace9ff1d7b5cb6b84e11e17"

    Dialog("Login").WinButton("OK").Click

    '   QTP自带文本检查点,方法 -- insert ->Checkpiont -> textCheckpoint ->点击要检查的文本->按提示进行相关设置

    Dialog("Login").Dialog("Flight Reservations").Static("Agent name must be at").Check CheckPoint("Agent name must be at least 4 characters long.")

    '   QTP自带standard检查点,方法  -- insert ->Checkpiont ->standardCheckpoint->点击要检查的点->按提示进行相关设置

    Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Check CheckPoint("确定")

    '   QTP自带TextArae检查点,方法  -- insert ->Checkpiont ->TextAraeCheckpoint->框选要检查的文本->按提示进行相关设置

    Dialog("Login").Dialog("Flight Reservations").Check CheckPoint("Flight Reservations")

    Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click

    '   QTP自带Bitmap检查点,方法  -- insert ->Checkpiont ->BitmapCheckpoint->点击要检查的图片->按提示进行相关设置

    Dialog("Login").Static("Static").Check CheckPoint("Static")

    Dialog("Login").Static("Static").Check CheckPoint("Static")

    '   QTP自带database检查点,方法  -- insert ->Checkpiont ->databaseCheckpoint->用qtp自带mdb的进行设置->按提示进行相关设置

    DbTable("DbTable").Check CheckPoint("DbTable")

    '   QTP自带XMl(文件)检查点, 方法  -- insert ->Checkpiont ->XML Checkpoint (From resource )->使用QTP的一个测试结果生成的XML文件进行样式->按提示进行相关设置

    XMLFile("XMLCheckpointTest.xml").Check CheckPoint("XMLCheckpointTest.xml")

    '  ==================================== 检查点成功与否?=============================================

    '  想知道检查点是不是通过了,如何做?

    '  1.回顾一下VB知识,根据VB可知,vb对于子过程(sub)是不返回值,而函数(function)是有返回值的,

    '          1.1. sub   调用样式为      :过程名   参数

    '          1.2. function 调用样式为:变量 = 函数名( 参数)

    '   2. 所以,你可能注意到了,以上的检查点调用方法都为子过程的方式,那么,想知道检查点是不是成功,

    '       那么请用function 调用方法,因为所有的检查点方法都有sub 和function 两种方式。

    '  3.检查点的tunction 调用返回结果类型都为boolean,检查点执行成功返回:true ,否则,返回false

    ' 检查点成功与否的样例 , 注意下行行参数加了括弧.

    blWinButtonChk =Dialog("Login").WinButton("Help").Check ( CheckPoint("HelpButtonChk") )

    If  true = blWinButtonChk Then

     msgbox "检查点执行成功!"

    else

     msgbox "检查点执行失败!"

    End If

    '  ==================================== 检查点成功与否 end  ===========================================

    ' ============= 使用对象的CheckProperty过程或函数做手工做检查点 ====================================

    ' 当想去对象的某属性(attribute)作检查时,可以使用此方法

    '  如要检查一下弹出的对话框的title作检查点时,就可以用此方法,具体方法步骤:

    '  1. 先把要检查的属性所属对象添加到对象库中

    '  2. 用spy工具探测出 属性的名字和对应的值

    '  3. 使用对象的绝对描述,描述到要检查的对象上,后跟上:.checkProperty  “要检测属性的名字” ,  "要检测属性所对应的值", n(设置检查点的超时时间,毫秒)

    '  样例之 手工设置检查点,以检查对象的regexpwndtitle属性,并且检查其值是否是为:Help

    Dialog("Login").WinButton("Help").CheckProperty "regexpwndtitle", "Help"

    ' ============= 使用对象的CheckProperty过程或函数做手工做检查点  end =================================

    Dialog("Login").Close



    QTP检查点CheckPoint解析

    (2009-09-28 11:19:34)
    1)理解检查点

    QuickTest enables you to add checks to your test or component.

    检查点比较指定属性的当前值与期望值,以判断当前的程序(或站点)功能是否正常。

    当你增加了一个检查点以后,在KeyWord模式下会增加一个CheckPoint,在Expert模式下会增加一条CheckPoint语句。在运行测试时,QTP比较CheckPoint的期望值与当前值,如果结果不匹配,则检查点失败,你可以在TestResults窗口中查看到检查点的结果。

    如果你想获取checkpoint的返回值(一个布尔值,表示检查成功或失败),你必须在专家模式下将checkpoint参数两端加上括号。如

    a = browser("MyBrowser").page("MyPage").check(checkPoint("MyProperty"))

     

    2)向测试脚本中添加检查点

    可以在录制脚本的过程中添加,也可以在修改脚本的过程中添加。

    途径:菜单Insert-checkpoint、或按钮;在Keywork视图中选择一个STEP,然后选右键菜单Insert Standard Checkpoint;在Active Screan中选择任意一个object,然后选右键菜单Insert Standard Checkpoint。

     

    3) checkpoint的种类:

    可以在站点或应用程序中插入不同种类的checkpoint。

           Standard Checkpoint(标准检查点)

    检查程序或网页object的属性值,检查对象如buttons, radio buttons, combo boxes, lists,等等。

    标准检查点支持所有的add-in环境(seeSupported Checkpoints).

           Image Checkpoint(图像检查点)

    检查程序或网页中图像的值,如你可以检查图像 的源文件是否正确。

    注:你也可以给图片object插入一个标准检查点,这个标准检查点也是图像检查点。

           Bitmap Checkpoint(图片检查点)

    将程序或网页的某个区域作为一个图片,建立检查点。如,某个站点可以展示一个城市的地图,这个地图有控制地图缩放的按钮,你点击1次“zoom in”按钮后,录制下放大了的地图快照。通过建立bitmap检查点,可以检查“zoom in”功能是否正确。

           Table Checkpoint(表检查点)

    检查一个表中的信息。例如,假设被测的程序或网站包括一个table,本table中包含了所有的从New York到San Fransisco的有效航班。你可以通过Table检查点来检查第1个航班的时间是否正确。

    注意:你也可以通过为表Object插入标准检查点的方法创建表检查点。

           Text Checkpoint(文本检查点)

    检查位于程序或网站某个位置的字符串。例如,假设程序或网站显示“Flight departing from New York to San Francisco”的语句,你可以创建一个文本检查点检查"New York"是否显示于"Flight departing from"与"to San Francisco"之间。

    所有的add-in环境都支持文本检查点。

           Text Area Checkpoint

           Accessibility Checkpoint

           Page Checkpoint

           Database Checkpoint

    检查database的内容。例如,可以使用数据库检查点来检查包含航班信息的数据库的内容。

    所有环境都支持数据库检查点。

           XML Checkpoint

           下表是QTP中在不同环境下对各类检查点的支持情况。

     

    Web

    Std

    VB

    ActiveX

    Other Object

    Standard

    S

    S

    S

    S

    NA

    Image

    S

    NS

    NS

    NS

    NA

    Table

    S

    NS

    NS

    S

    NA

    Text

    S

    S

    S

    S

    NA

    Text Area

    NS

    S

    S

    S

    NA

    Bitmap

    S

    S

    S

    S

    NA

    Accessibility

    S

    NS

    NS

    NS

    NA

    XML

    S

    NS

    NS

    NS

    S (File)

    Page

    S

    NA

    NA

    NA

    NA

    Database

    NA

    NA

    NA

    NA

    S (DbTable)

    S—Supported

    NS—Not Supported

    NA—Not Applicable

     

    4)检查object的属性值

    通过向测试脚本中添加标准检查点,可以检查不同版本的程序(或站点)的object的属性的异同。

     

    在录制过程中添加检查点时,点击检查点按钮,鼠标变成手状,点击object即可。这时如果按钮CTRL键,可以将鼠标变成正常状态,进行正常操作,松开CTRL后,仍然变成手状。

     

    5)检查Table或Database。

    通过检查Table,可以检查程序中Table的内容;

    通过检查DabaBase,可以检查DataBase的内容。两种检查方法相似。

    通过Table检查点,你可以检查某个指定的值是否存在于应用程序的当前表格中。

    DataBase检查点:针对Database定义一个查询,然后创建一个检查点,用检查点来检查查询结果。

     

    创建Database检查点:

    首先基于数据库表查询的结果建立检查点。检查点可以是检查查询结果的全部或部分。QTP从数据库中获取当前数据并将它保存为期望的数据。在专家模式下,数据库检查点的脚本表达为“DbTable.Check CheckPoint”。

    当运行测试脚本时,DAtabase检查点将当前数据与录制时产生的期望数据相比较,如果数据不匹配,则表示失败。


  • LR邮件测试

    femir 发布于 2012-10-30 12:44:12

    使用loadrunner测试Foxmail邮件客户端性能

    Action()
    {

     smtp1 = 0;
     smtp_logon_ex(&smtp1, "SmtpLogon",
      "URL=smtp://smtp.cdsf.com",
      "LogonUser=xxxx@qq.com",
      "LogonPass=*****",
      "CommonName=LoadRunner User",
      LAST);

     smtp_send_mail_ex(&smtp1, "SendMail",
      "To=611111@qq.com", //收件人邮箱
      "Cc=2222222@qq.com", //抄送人
      "From=<xxxx@qq.com> SIZE=82849",
      "Subject=title_test", //邮件标题
      "ContentType=multipart/mixed;",
      MAILOPTIONS,
       "From: xxxx <xxxx@qq.com>",
       "To: 611111 <611111@qq.com>",
       "Cc: 2222222 <2222222@qq.com>",
       "Reply-To: xxxx <xxxx@qq.com>",
       "X-Priority: 3",
       "X-Has-Attach: yes",
       "X-Mailer: Foxmail 7.0.1.91[cn]",
      MAILDATA,
       "AttachRawFile=mailnote1_01.dat", //邮件正文
       "AttachRawFile=mailnote1_02.dat", //附件
      LAST);

     smtp_logout_ex(&smtp1);

     smtp_free_ex(&smtp1);

     return 0;
    }

    /*mailnote1_01.dat文件*/

    Content-Type: multipart/alternative;
     boundary="----=_002_NextPart463472784545_=----"


    ------=_002_NextPart463472784545_=----
    Content-Type: text/plain;
     charset="gb2312"
    Content-Transfer-Encoding: base64

    DQp0ZXN0IA0KDQoNCg0KsuLK1LK/ICDC7bfJDQq157uwo7oxNTggODExNyA1ODQ2//邮件正文,base64加密

    ------=_002_NextPart463472784545_=----
    Content-Type: text/html;
     charset="gb2312"
    Content-Transfer-Encoding: quoted-printable

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML><HEAD>
    <META. content=3D"text/html; charset=3Dgb2312" http-equiv=3DContent-Type>
    <STYLE>
    BLOCKQUOTE {
     MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px; MARGIN-LEFT: 2em
    }
    OL {
     MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
    }
    UL {
     MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
    }
    P {
     MARGIN-TOP: 0px; MARGIN-BOTTOM: 0px
    }
    BODY {
     LINE-HEIGHT: 1.5; FONT-FAMILY: =CE=A2=C8=ED=D1=C5=BA=DA; COLOR: #000000; =
    FONT-SIZE: 10.5pt
    }
    </STYLE>

    <META. name=3DGENERATOR content=3D"MSHTML 9.00.8112.16450"></HEAD>
    <BODY style=3D"MARGIN: 10px">
    <DIV>&nbsp;</DIV>
    <DIV>test </DIV>
    <HR style=3D"WIDTH: 210px; HEIGHT: 1px" align=3Dleft color=3D#b5c4df SIZE=
    =3D1>

    <DIV><SPAN>
    <DIV><SPAN style=3D"FONT-FAMILY: =CB=CE=CC=E5; COLOR: #000000; FONT-SIZE: =
    10.5pt">=B2=E2=CA=D4=B2=BF&nbsp;=20
    =C2=ED=B7=C9</SPAN></DIV>
    <DIV><SPAN style=3D"FONT-FAMILY: =CB=CE=CC=E5; COLOR: #000000; FONT-SIZE: =
    10.5pt">=B5=E7=BB=B0=A3=BA158=20
    8117 5846</SPAN></DIV></SPAN></DIV></BODY></HTML>

    ------=_002_NextPart463472784545_=------

    /*附件*/

    Content-Type: application/octet-stream;
     name="lordofwar_BCX5oOApAMx2.jpg"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment;
     filename="lordofwar_BCX5oOApAMx2.jpg"

    /*下面是lordofwar_BCX5oOApAMx2.jpg图片的base64加密字符*/

    /9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a
    HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy
    MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAJUAYwDASIA
    AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA
    AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3
    ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm
    p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA
    AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx
    BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK
    U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3
    uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+m+Y
    n99fzpW+6awVdPMAGAwGPbsaAN3zY/76/nSebGRneuPXNYJZPPAUj/Wjk9Pvf/Xp8x/dSjIxs/qK
    ANzzI8Z3rj1zSggjIIrClI3TZK/e/DPP+IqyLuSMxorLtyq4x2//AFUAafmIf41596QSxno6n8ax
    lZWuFHG4sp68Ywc0wsPLbYB9zI9yD/8AXoA3RLG2MOpz6GlLADJIA96wbQqJbb7pGTjH1q87farW
    TzGHADcDoetAF/zE/vD86N6+o/OsWF0ViP4vlHPTg1Dn9xk/wsSPwC//AF6AN/zUxneuPrS+Yucb
    hn61iqF37VxgxNyfXn/GlgCrPDnBIO3j1B/+vQBs+Yn95fzoMiDqwH41h+ajyscNln3YzyOv+NRZ
    L3GD/dfr70AdD5iZxuX86N65+8PzrnkbdLuOMMynB6g7if5Vbu4xb3KksTuy2RxQBreYv94fnR5i
    /wB4ce9c6eC4XJP3anbmKXZgkkAY/GgDb8xOfnXj3o8xf7w/OuelKE5TqWyc+h/yanbZlORt3gge
    o7UAbRdV+8wH1NIJYz0dT+NZc94J2ZSgXbuHJ/z6frVWNwC3TkN0P+0f/wBdAG/5iEZDrj1zR5kZ
    bbvXPpmshyPsICEdVx/3yKigYLIpUZIdSf1/z+NAG55if31/OkM0QzmRePesWKRWIIH0zjj/ABqu
    zKZMvjbznHXoaAOj8xOfnXjrzSCWM9HU/jWDfN80mMZAOcH6f4U6UkXSD5fvgHH+8P8ACgDc82P+
    +vXHWjzY/wC+vp1rBYjz5eRje3T8asTBRC7Had2MY6Z5oA1/MTON65+tHmJ/fX86wrcb5mbPKxMT
    n6AUsOHdmXaODj6YNAG2ZYx1dfzo82MjO9ceuawEIM0RJx944z6r/wDWqWEgR3Ab7uRj64P9QKAN
    ozRjrIv50ebH/wA9F/OsH5dkucFs/wCf8+1PjXYwUlTjH8mNAG350X/PRPzpTIi/edR9TWEcZJba
    QNx4pL0/6Sw4x2z9AB/I0Abvmx/31/OjzY8Z8xceuaxCyeXIDgnywR+Q/wAKrybNx2/cyCM/Vuv5
    0AdIZEBwXUH60eYn99fzrDudn2x93fj8cCnKwa3bJA5J9+SP8aANnzYzj94vPTmlEsZ6Ov51hR4E
    nJXG0H8Mf5/Ompj7THsxgSAfqaAN8yIOrqPxpPNjxneuPXNYkr7r0kH5WlHXtyKlzH5B6Y+TA9eC
    KANdZEb7rqfoadWRZHF+eh+XHFawoAG+6fpWF9pk6b3J9sVut90/SsATlGO2MA4xuXI/WgDaijVo
    kJUE7RzinmNT1VfypIDmFD3KjP5VJQAzykyPlXj2pdi/3RTqKAGiNB0UflSeWnHyrx04p9FADPKQ
    dFXj2pRGo6KB9BTqKAGeTH/cX/vkUeWuMbR+VPooAYIkHRVH4CgRIDkIufXAp9FADfLTOdq/lSeW
    n90flT6KAGeUn91fypWjVvvKD9RTqjmcpC7L1VSRQAvlJ/dX8hQIkHRVH0AqlYXzXcZjlAiukUF0
    HI5HDL6g/wD1qjkvJ10e3uQy+bIYs/Lx8xAPH40AaHkx/wBxf++RR5MX/PNP++RVZ55JLs20LBdi
    B5HIyRknAHvwT7U2SWWyimuJpfMhSMtjaA2R2/GgC7sX0H5Unlr/AHR+VVCl95O8SoJ8Z8vblPpn
    r7Z/SohqDzwafNF8guJdjqwyRwxI/NaANHy1HQCgRqD0H5VHPMIIHkPO0dPU9APzqKyuXuLMO4Hn
    LlJFB43qcH8Mj9aALHlp2VQfpR5aY+6Pyqlpty13Ck/nhwww6bMFH7j1GOmDU11cNHLDBFjzZicF
    hkKAMk/yH40AT+Wp/hH5UuxfQflVZUuUkRvtG9M/OrIAenbHvUb3rLqaQYHlMCm7v5mNwH/fOaAL
    nlp3UflR5aYxtXH0qq08k149vE4QRKrO+3Jy2cAdugz+IqWJJ0kbfKHjI+X5cMDQBN5ajsPyo8tf
    QflWdp9zLcqryXEZbdIGiAAJAYgH17D8606AGeUn90flS+WvTaMfSnUUAM8tecgc+1KY1J+6PTpT
    qKAGCNB/Cv5UpjUnJAP4U6igBgjQfwj8qPKTGNq/lT6KAGmNSc4GfpSeWoOQo/Kn0UAM8pP7q/lS
    iNR0UD8KdRQAzy0/uj8qr3rGC2Z0ADAjtVuqt/t+ysWOACOgz3oAr6XJJIshkYsQQASBxWiBisqw
    uY0mMahyZGHJwP5VqjpQANyp+lYLsy8DZjpnOa3j0NZiCK1dxt8znHzMtAGhD/qU/wB0fyqSmRMH
    jVgMAgHFPoATIoyKztTbVY4y+mrZuVQnZcFgWPoCOlefeF/iZrfijxB/ZEOj2NvKqM8sjzswUKcH
    gDnnigD1OiorcTeQn2gx+dj5vLztz7Z5qWgAoqOaaOCF5ZXVI0BZnY4Cj1Jriz46utYvJLbwno7a
    kkZ2tfzP5Vsp9mxlvwoA7ijNcj5Pj513/bdAib/nmIJWA/HcKxtR8beKvCzB/EPh6GeyJwbvTpCQ
    PqD0/HFAHo9GRWPoHiXSvEtl9q0y6WVRw6Hh4z6MO1ac/mmF/IKCXHy+Znbn3xQBJkZpc15j4u+I
    uu+D9UisrnSbC5WaPfFLHM6g84wQRW7/AGn47NuJl0HSGJGRH9uYN/6DigDsahuFLQSBVJLKQAD1
    yK8/sfirFBrH9leJdIn0a53Bd7Nvj56HPHHvzXoisGUMpBB5BHQ0AZz2TzWtuwIhvIUG1+uDjlT6
    g02a1nOjW8CxgzIYiyhuBtIJ5/Crt2LryP8ARDCJc/8ALbO3H4V5jqnxO1/S/FT+Hm0KymvfMWON
    kuWCvuxtPI460AeiywTxXv2u3jEgeMRyx5AJAOQR2zyRinTRvqFvPbSQvFG8ZXe2Ccn0APaud/tL
    x6UB/sDR8/3ft7Z/9BrMvPGXjPSVMuoeCvOgHLPZ3XmYH0xmgDto5b0QhJLYG4AxuDDYT6+uPbFQ
    NYy29vYRQoZvs8odzwCflYE898tXN+Hvip4e1ydbaV5NOumOBFdAAE+gbpn613AYEAjkHvQBQmSa
    7aJHgZIvM3PlhnA6dD3OPypIbaWzu7nyY90MqiRct0kAwQfY4Bz9a0aKAM+3t2OoNdCJoQ8e2RSR
    l2zwSB6DIz70++tpZJILi32maBiQrHAdSMFc9u3NXaKAKazzsyA2kijksWK8fTB5NVJNPlksTKEK
    3u/zlBfIDA5C+mMfLmrl6L7aPsLWwfv54Yg/ka8tvvirr2m+JjoV3olhHcidYd5nfb8xADdOnIoA
    9MaK4ivGu4Yi6TIqyxFgGBGcMOx4OCM9hS28MjanNdtCY1aJEGcZJBYk8E+o/KrFoLoRf6Y0LSZ/
    5YqQMfiTVigDM06Oa3jWKW2YNvkJkJUgAszDvnuK065zVvFdtpXirSNEkCl9Q35bP3MD5fzOR+Fd
    FmgBScUZpku/y28sqHwdu7kZ96871vxz4g0nxhaeG4dM0+8uLtVaN1kdAMk/eHOMYJoA9GyKMiqt
    kL3yc3xtzJn/AJYBgv69a5jV/G0WmePtK8Pts8q5jPnMeqOf9X9Oh/MUAdlRSL0paAEyKXOao341
    NY86ebQsAfluA2Ce3IPFeb6J8SfEmva/NotpoenLdwhzIZLlwvyttP8AD60AerZozXDajrvjrSoD
    cyeGtPvYlGXSzu2LgfQrzVnwf8QtK8XFoIle1vUGWtpjyR3KnvQB2FFGaKACqeoY+yNkkDI5HWrl
    VL8sLU7S2cjG3rQBQgO66h3ySnB+XdjH8/6VsjpWTBLIbiLcxA3YIAb9cmtYdKAA9DWM16hZ8RSf
    Mefn6/pWy33T9KwjEzudssWR1Bk6fXk0AbVvj7PHjptH8qkpkIxCg44UdPpT6AEYfKa8K+Eo/wCL
    k6t7QTf+jRXurfdNeGfCX/kpGr/9cJf/AEaKYHuY6UGlqve3AtLG4uW6QxNIfwBP9KQHlfjTVrnx
    d41tfBGnzFLEOPt8kZ5bHLD6AfqfavUdN0610vT4bGyhENvCoVEA6D/GvFvgvu1HxdqmpTndMYC5
    J9XfJr3SgBMUyWGOaF4pUV43XaysMgj3qSg0AfPviaxuvhd45gv9IZxZXAMiRsSVZc/PGfX29Miv
    ddK1GDV9LttQtW3QXEYkU/Xt+HSuD+NOnrc+DorvHz2twpB9A2VP9Pyqb4NXb3HgNYnJ/wBHupYl
    9hww/maAOW+OH/Ia0T/rm/8A6EK9mtx/o0X+4P5CvGvjh/yGNE/65v8A+hLXs1v/AMe0X+4P5UAe
    b/GnRYbvwvFqYQfaLKUKGA6o3BU+2cVr/CvUJ9Q8AWT3DFniZ4Qx6lVPH6cfhVX4s3DSeGrfRrZT
    LfalcpFDCvJbByT9BxXT+FdDTw74asdLU7jBH87ernlj+ZNAGz2rwnxSMfHq095rX+Qr3avCvFX/
    ACXqz/67Wv8AIUAe6YoxS0UAedfET4dWniCyn1LToRFq0a7sIMLcAfwsP73oaw/hH41uZp/+EY1N
    2Z0Qm1eT73y/ejP05x9CK9gI9OtfPHi2L/hGfjCtzajYrXEV0gHT5uGH86APogdKaWxUU9wltbSX
    EhxGilmPtWfY2xv7dLu/HmPMNyRH7kanoAO5x1JoA1Q2enT1pc1i6jZNY28l7ppMMsI3NEp+SRR1
    BXpnHeq2qzx32lafeR5AmnjBwxBwc5HFAHRZrxH43aWbXV9L1mEYMymJm9HQ7lP5H9K9hj0u1huY
    5olZGQn+MkHII6E1zHxT0f8AtbwNdlVzJZkXKY6/L97/AMdJoA6fRNQTVdEsr9CCLiBJOPUjn9av
    E4rzv4Naqb7wYbN2zJYzNFj/AGT8y/zP5V0HjzWW0Twhf3MJ/wBJdPIt17tI/wAo/nn8KAPF/HNx
    f6jrdz4vtyfscN+LK1YDgGMZB/Fga980TUo9Z0Sx1KIgpcwrJx2JHI/A8VyF54Lx8Iv7AC5uorYT
    Z7mYfOf1yKzvgrrZu9AutIkP72xk3IvcI3/1waAPUDXmfhOMeIvif4g8Qn5obIiytz2yBg4/DP51
    3HiXVV0Tw3qGos2PIgZl/wB7Hy/risL4Y6M+j+B7MTAi4uibqbPXc/P8sUAdfI6xxM7sFRRkk9hX
    zr4rsrvU7Cfx7HI487U2jhHZYl4jb/vpf1r1v4mavJpfgy5itm/0y+ItIAOpL8HH4ZqWXwlE/wAN
    h4aC8rZhF/66AZz/AN9UAa/hrV49e8O2Gpxkf6RCrOB2bHzD881rV5D8E9afytR8P3BxJA3nRKew
    zhx+Bx+devCgArw74cj/AIvDrX+7c/8AowV7jXh/w6/5LFrf+7c/+jBQB7fgYrwHxtaf8It8WrO9
    04eWZ5YrkKOmWbaw+h5/Ovfs15Tf6YPGfxgjliAfT9FRFnkH3TICWCe5yefoaAPVhS0gpaACqt67
    R2zMjbW459KtVVviRathQ2SOME/yoAoW1zM11GrTO2WwVNbA6Vj224TxAQlfm/uuAK2BQAN90/Su
    dLSqSOg7BSD/ACzXRN90/Ssy1hXcwmbHAYYk/wAKANCAYgTPXaP5VJTUxtGDkY4p1ACN9014Z8Jf
    +Skav/1wl/8ARor3Nj8prwf4TyAfEzUl/vwT4/CQGgD3mqmp25utKvLZfvTQPGPxUj+tWxVee7ht
    5YI5X2vO5SMYzlsE4/IGgDwj4K3Ys/F9xYykq01sUCn+8hH/ANf8q9+FfP8A400y58BfES31yyjP
    2Waf7RFjpkn95Gfrk/nXuGiazZ67pMGpWMge3nXI9VPdT6EUAaNFFITQBwXxhnWLwDNGx5lnjRfr
    nP8ASmfBuze28ApI4I+03Mky/wC7wB/6DWB8SZ5vF/ivTfCGkt5hgYy3bj7sZPHP0GfzFeq6Zp8G
    labbWFqu2C3jEaD2FAHj3xyGdX0UZIzE4yO3zLXcWnh/xZDaxrH4zZl2DHm2EbEceua4b44sP7a0
    X2ic/wDjwr2e25tYf9xf5UAeMeG9fudF+JVxbeND51++ILe8k+7ECeNo6BW9a9sFcH8TPBA8T6UL
    yzQf2paKWjx1lXqUP9Pesv4W+PTqtsNB1aY/2lACsLvwZlHY/wC0KAPUa8K8Vf8AJerP/rta/wAh
    XumeK8H8WOF+O9sc9J7UfoKAPeRRSDmloAD0rwf4jQnVPi/Y2EI3SFbeM4/3tx/SvbNS1K10rT57
    68kEdvApZ2Pp/j7V5b8PdKuPE3jG/wDHN7GVt2kYWat3ONufoF4+uaAPTdYt3udFuoYwS7RnAHfH
    al0W5jutItZEYECNVPsQMH+VXtuazRpH2e4eawnNt5h3SR7QyMfXHY/SgCzqM0cGm3MshARYmJz9
    K56W1e28LaTbzAhvtEe4cgjJJx7da3Tp7zujXk/nKhDLGE2pn1I5z+eKNS006ikSGcxrHIJBtXOW
    HT+dMB0WnRQXImiaXIUrhpXcHOOxJ9P1qxcwJc20sEozHKhRh6gjBp6BgoDMGbuQMU6kB4d8J5pP
    D/jrVvD05I8wMig92jJwf++T+ldl4iJ8QfEnRdCA3WmnKdQux23dIwf51xvj0f8ACKfFrS9dUbIJ
    yk0hHfB2Sfpiu3+HUb6imreKLhf3uq3TeUT2gQ7UH86YHc9q8N0lv+EH+NVxaN+7sr5zGvpskO5P
    ybIr3PtXkHxu0lkt9M163GyWGTyJHHb+JD+BB/OkgN34mySaidD8MQk79UvF80DtEmCxrv40WOJU
    RQqKAqgdgK8z8G6gPG3jZ/EDAmHTtPigQEY2zONz/lyK9FvruOwsLi8mIWKCJpXJ9ACTQB5j4vl1
    HxF8TrDStIit520aP7VIlw5WMyHBGSOf7tdJ9o+Iv/Ph4fH/AG8Sf4VlfCeCTUINW8U3Qzcapcts
    J/uKf8ePwr0gjIoA+eZm1PwL8ULfUdThgt/tcnmypbOWj8uQ4bGfQ819DKwZQQQQRkEd68x+NOhf
    b/DlvqkSZlsZcP6mN+D+Rwa3fhnr/wDb/gy0eR91xa/6NNnrlQMH8RigDsq+fPCunXmp/FTWIbHV
    JtNnVrh/OhRWJAkHykHjFfQdeHfDlgfjDrPutzj/AL+CgDq/FGkeObTw9cTWHiiS6ljXJiS0jjdl
    /iww70fCPxBpuo+Hzp0EEdtfWx3ToOs2T/rMnk57+9eiYyK8Q8d+HrzwL4lh8U+HwY7WSXMiL92N
    yeVP+y3P0NAHuOaKw/C3iey8VaNHqNkSP4ZYj96N+4P9K3AaACqt8m+2YYOcjoM1aqteSeXbs2FJ
    44IzQBn28LLdRnaeHz0A/PitgdKx7a533Ue6KIEnAPlYP862B0oARvumsAsckbxjJAUnj8q6BuQa
    wWZxIR5Y7465I/OgDbh/1KYxjaMY+lSVHDzCmRj5R/KpKAM/VLu7trVvsmny3czKQoRlUA9sliK8
    X0DwN488Oa/HrNrp9q8w3bo2uVw6t1Br3jFGKAOJHiDxwq4bwbCW9V1BMfyqLR4vFer+LoNQ17To
    tPsLOJ/IhjlD7pGwMnHfGfzru8CjFAGfrOi2GvaZLYajbrNbyDkEcg9iD2I9a8yg8DeMPBOoPc+F
    b6K+sXbL2c7bS31HTPuCDXrtGKAOFt/GviNUCXvgbUhMOpgkRlJ9smi6n8ceIY/Is7KDw9buPmuJ
    5RLPj/ZVeAfrXdYoxQBz/hjwjpvha1eO0VpLmU7p7qU5klb1JrddiikqpYgZ2jqfzp9FAHjvxC8J
    +KfGWswXVlpQgt4IfLQT3CBi2SScAnHavSdEvNRe2t7fUNJntZUiCu/mI6bgOxBzz9K2aq3Fz9nZ
    RsZgysRt7kchfqefyoAskZrzDxt8MZ9Q1Zdc8Nzx2d+DveMnYGYfxKR0b9K9DS/V5UUKSjqWVgeu
    Ap6f8C/SmJqW+LzBGAMoOX/vbfb/AGqAMDQNU8Ww2aQa9oJlnQYNza3EZEn1UkYNeeeJfBPjLWPG
    Nx4gtdOjh/eo8CPcJuATGM847etezRXglljj8vbvQPyfrx+lI940cjhoRhHVSQ394jB6e9AHK23i
    fxdBCq6h4LmkkA+Z7W6jIP4E1K3ibxRcKVsvBlxG54D3l3Gij64ya6Nr8CRlEfQOclsZ27fb/aoX
    UAyRt5f32K8tx0z1/SgDi/8AhCNa8S3sdz4y1OOS1Q7k0yzyIs/7RPWu9tbaC0t47e2iSKGNdqIi
    4VR6Co4rjzJZI3UI0f3hu59j06e/saYl+jwxSgfI8hjY5+4eev4j9RQBdorObU8QiUREjBJDNgqQ
    rEg/Tbj8atpNumlixgxhec9c0ATUVUmuXimWMRBtylgd+OmPaojqI/d4jJDqpyWIxuOPSgDQoNZ/
    9o/JI3lfcbacP/tFf6Z/GpUui1ysTKF3JvB3feHtxz7/AFHrQBxnxS8J3PifSrH7DEHuoLkDjqEf
    hj9BwfwrstL0+HS9MtrG3ULFbxrGoHsKct0sklxEgy8IHGRz1/LkEfhUQ1BXX5EbO1WAzjggk/li
    gC/WL4s0RfEHhm/00gF5Yj5eezjlT+Yq6l8jGBW4M2QMN09OtNgvmuSFSLDlBJy3GD7+v+FAHO/D
    fw7J4b8IQw3EWy8nYzzr3BPQfgAKp+N4fFPiLRZdK0rSRbxT8Ty3FygJX+6ACetddBqKTDiNlbcA
    FbjIzgkeuD1q8KAOZ8E2d7pHhyx0i90828lrFtaRZFdHOTnGDnnPpXT0UUAUdYs01DSLyzkh85J4
    XQpkDORjqeleU+BfC/jfwZqUjnTobixuABPCt0oOR0YZ4yK9kooAzJdQvhYiaPSZ2nJI8gyoCPQk
    5xivLPC3gzxd4e8Y/wBvXGmwTRy+aJYo7pd2HOeM8cGvZsUYHpQBWs55riDfNayWz5xsdlY/oSKL
    +wttTsJrO8hWa3mQpIjDgg1ZooA8ftPAHizwZr7Xvhe6gvLJ2y9vNLsLL/dYdD9Qa9J03UdUuDGl
    9okto5HzsJ45EX8jn9K18UUAAORVW9fZbE4Dcjg96tVVvYmmtmROWODigChBIrXUX7na2/GST/jW
    wKy4rSUXETmPaFbkkg5/QVqDpQAMMqR6isi4VLVwjDd8uflQ8/8Aj1a7HCk1jG5kJ3GQ+2QGx+go
    A1oP9RH/ALo/lUlRwNugjb1UH9KkoAKKKKACiiigAooooAKKKKACiiigAqOSFJSm9c7GDL7GpKKA
    IFtYo2VkTBTdtwf7xyaaljEihVDBQVIG44+XGP5D8qs0UAV47SOKQOgYEDGNxxjJOMfjStaxszMQ
    csysee69KnooArNZxM7OQ2WDA4Y8hsZ/9BFJ9hi3bgpU9eGI5xj+XFWqQtigCFrZG37sncCvXoD1
    FI1rEwcFciQhmGeCRjH8h+VTZ9Ko6vqsGi6Tc6jcJK8Num91hTcxHsKAJ3s4ZFZWThmLHBxyVKn9
    DS/ZlEjOHcM2Mnd1xVTTNe03WLe2nsLpJkuYjNFjPKggN9CCQCDyD1qHxRd3Fj4Y1K6tJDHNFAzI
    4AO33GQRSuO2tjTeGOSQOwywUqOex60xrKI7OGBQALgnt0rnPh/4q/4Svw6txcFBqNs5t7xF4xIP
    4gPRhhh9SOxq74m8VWfheOye7RnW6uFhO0geWpOC5z2BIz9aLq1ws72NQ2EB/hOckkhiM5bdz+PN
    S+Qu8McsV6ZPfGM/kT+dSg5paYiBbaNHV1BDKCM59Tk/rTRZwKFxGBtDKMdgxyas0hoArC1iC7fm
    /hAyxyMHIxThaIoiCgr5a7VIY8Djj6cfpXMp4vb/AIWXN4WljiWH7Gs0EozuaX7zIe33MEf7rda6
    6hO47WKv2GDy1TyxtVty4P3TjGRVkDAApaKBBRRRQAUUUUAFFFFABRRRQAUUUUAFVNQOLNj15HAq
    3VW+LC2O3Ocjp1oAzoJWN1EGXHzDkHH5+tbQ6Vj27S/aYw3mY3456CtgUADfdNYTNhifKT0z83+N
    brcKaxHnnBOZmx/v4x/KgDYg/wBSnGPlH8qkqOEkwoSckqD+lSUAFFFFABRRRQAUUUUAFFFFABRR
    RQAUUUUAFFFJxQBWu7+0sIvNu7qC3j/vTSBB+ZrEl8feFon2f21byn/pgGl/VQar+NfCvh3W7B77
    WbKWWS1ibypbeR0lHfC7Tzk9iDXhdzcaVouoLbabf6yk54eC4lDhDkcMFCjpkYPqDgHBrOUmtjSE
    VI9wufif4StUZn1OTK9hZzZPsPkrkvEfxU0PVNNeziuNd0t2w4ureJPlBzjd83Q+mQfcV5pqVxaP
    avY3M1xPH55+WaQ740YnhzyMgjIIOfXINWdJ0i3uPDmrywz+be6cEnhdyctCTtdHBOAMY6DtkHtW
    cqtkaQpJkCa5rBMznW7u7tg37tjNJG7IOrDDkY6jgt0zxT11nWJJBAdV1Ca1c7CPtLFiCOFKnOcn
    j3ByOCKoW/h/+17aS40J9lwp/fWhIwSOox3/AMkVSs55IWtIrlYkvLe4jURMNpKBxwM8MPpyOeOS
    azb6o3UUlZmg+oal4e8rV9NurmC2nYmZY2K7HIwxA7Hpn1wM9BXS/wDCV6zqtncJ/a80lnJCS8cr
    ZyjgYVuueAeQBnGeM1Rt/L/tzWfDuobUgnmlePjO1tx4+mTz9a5LT2lt7u60iRyrPHsjy2A2GyFJ
    /Mfl6U4T5lYmdPXmR6X4L1F/DPxLso3fbY67CIWJPBl5KH67ty/8CrU+NTvdyraIzDyLJpTjtubA
    /wDQa4HUNWa68IaPqUSsuo6ZKriQLjkEMvPruU/nXY+JtWt/ER1zUojmKTT7V4QRnCuiPg++XNHP
    +7H7N+1T7nrfhPUjq/hDR9RbG+5sopX/AN4qCf1zWhDfW1xcTQQ3MUk0J2yxo4LIeuGHbivmvw58
    QvF+jeCoPsVxbvY2b/Zo0aAFgMFuSfaqtprs+t+Iotaink0W4ZUN3dQMwN1OxAJAPGcMrEDAwpPe
    tnVXQ5/Yy6n1MTiqEOs6ZdX8tjBqVnLdxZElvHOrSJj1UHIrwqfxh47sEliTU/tl3fIyGHyfngYY
    QsgxgDcGUe4yRyK7DwPcLNe+HTJKWla1mbLj5mwApyTyTknrTjUUtiXTa3Mfxc5sfih/aq5DwanY
    jOeqNGqn8MbxXtgNfPHxluUtvFWqwhyZ5bO1miUZOGUuO3ToK970m9h1HSbO+t3DxXECSowOQQy5
    FOO7CeyZdoooqzMKKKKACiiigAooooAKKKKACiiigAqC6iaaFkXGTjrU9QzuY4ywxn3x/WgDOWBY
    buJTIqtuzsH/AOqtYdKyUcy3yMw+bcAcdOPxrWFAA33TXPDa5LF1Hf5etdA/Cn6VjkwsFLq7Z9Qx
    /wDZqANaH/Up6bR/KpKjgO6FCOAVBx+FSUAFFFFABRRRQAUUUUAFFFFABRRRQAUmQaDXn/xDhsL9
    EtpfFN3p10icWdvcIomz03KxUZ64yyjrSbsNK521zqdjZnFzeW8JzjEkiqc/ia5Sy+KnhLUdYn0+
    DU0Ahi8w3Ev7uJznlVLYJI78Yrx2Dd4bujeS6pYSyROrGC4tPmnQ5wVcBgQRwTuGDkY7mj400mxl
    MWv6BHu0y6PzIo4glz80fp16f/XrB1mnax0RoJ7s6zxD8Qb+ePUNMGowvpslxK1teMnMsasD5RcY
    2EZBDY9Af71YHjCGPxB4YsPE0Cp9pB+yX+w8+eo4f/gS/wAx9awvD9zFqNpdaLNhZ7giWxKjpcKD
    8oz0DqCvH8SqKn8J6rbzalPoN4BHZ6lCIETOBHMn+rP4dM9wRWc7t3NoJQ1XQq2U8XiC4ggJlN1O
    xjOCdrO6kDg56kJ0Pc8Zq98P9RSHWxpV1MYobyOW0YeXj76kgk9M7l6cevJzXI3qXGi6tJErNFNF
    JlT/AHXVsgjgnqK2/EN1Hp+vR6tYJtt5mivY1z0yRJj8DkUNJq3cdnrrsUft15oHiKSa2mMUyDJ+
    bCkg8hvXoenOeldfqjWHiuaW3v2ht9Vh+Uyr92RgT8xI657MPxrnviXbQw+IZLyzyILkLcRf7sih
    hj8zWZ4hjuNMvreQEpuhjljdDztZQf8AIqXHmSs9S1NJtsl1KTV9K10NqO+WeBsM5OXYEY5Pfjv/
    ADrT8VxW19BZatYSKLll+dB1JwMN9COPwq5ocVs+qLFrqtJ5kSv8h5KuoZZB+B6Vb0/QbK01aSxv
    pDPak7oJUbCtG5+VvoDkEdsVDlZ3e6NUotW6MyrPWNNk0bU7IeZ9ndR5G5PnR+Dg/iWpNDaaPwhq
    blpHRFKdTwA6gf0rStNAt7LxPeadfQhmWRGIzwQeDj1/+vWVBp96NPvzBIq2u5jJEHx8u/A+vQUm
    1qkJbq5DbXHlfDny95BfUZuvtGoH8zVJZlW1DY3LBDEXGT87HHBGcZAyMjnms/7VImk3GnEgxxXO
    9T/vDn/0GrVrcC1sLW4fMhe5aZg3RsY2kj/gNb8trvuzFa2XqdfNc/6DqUlzNJcgEKrTgBst+8l4
    /wB7jnn15pI9Wv7XTNG1e1Hltp8KJbyOQfmMrcgfRHXntmq8lpGlrY6fIAzPbtcSh35kLDzOT3O0
    fj+NUL3Zbxy6U8giSNo54gH3c7WIAGeeZM+ozUUerJq7JGpo99d+Ib7XbrV5Wu7l7FjFNIoLYjYY
    xx7H869k+C1/9r+HlvBtIFpcTQAnv85YY9gGFeReELO4g8Sx2s/+ru7KUwfMGHlsrhenQ8cj1P1r
    t/gbqEVqmv2UpC7blXDNJ6gAAL35zyPUe1bweuphUXuo9ropAcilrc5wooooAKKKKACiiigAoooo
    AKKKKACqt6oa2ZSe4/H9R/OrVVb12iti6nBBHWgDNgwl9GPKUYfGcn/4o1tjpWPDLKbqIPI3zN0L
    HBrYHSgAYZU/SsH7HdHP7o9PY/0rdfOw49KxxEvA2k8c/vB/hQBrQKVgRSCCFAwfpUlRW4xbxjGP
    lHH4VLQAUUUUAFFFFABRRRQAUUUUAFFITXE+KviLY6HHNFYIL+7jO1yH2wwn/bfpn/ZHPbik2luN
    Jt2RoeMPGVt4SgtmljSee5k2JCZ1iwoBJck9hwPxFeJfEHW9Z1PXRf3Fvbw6dLD5dqIVEmUPO8vj
    JbjI44HQZznA1/W9Q8Uavcahqk1tvKgRMx8sIoGQqg5444/iOSeaboviK3srN9J1WT7TpUp3MA25
    rdj/AMtEzyR6r75GOlc1Wcn8J2UoKOrJNLu7fVFOk3M6wSyyb7OeWTAilbGUZs/6uT5RnjawB4ya
    vaH4ji0a+k0bV7ULpF2DbXilTuhlBOJGHTK8gkYyBzyKwPEejTaDOJreaK5tbiM+VKoDK6MM8e//
    ANepluZfFujSXDPv1fTogs27lrqAfdc+rLwCe4weoNRpKN+ho0r2KHizSZ/DeuyRxyj5SGjmiP3l
    PzKyn8j/APrqTxBB9qs7LxHaYSO+Uu6px5Vwpw4GOnPzD2ao7bU49Q0xNE1DIeE4s7hj90H/AJZs
    e49D+FXvB4Wd7vwtfnZHeHdAzdI7hc4+m4cfUCq1Ss90S3rf7yPxJdw+I9HtNciULdgeVegfwyrj
    5vow+b8x2pLq1OoeBLK9UjfbSSWco+h3IfpgkfhWdBnQtcltL3clrMTBcjH3eeGx/snn6Zrf8LQP
    5mteHJ8g3UHmQ57yRjII/wB5fzxQ9FoLbfoZk0w1nwZYvNzNpzizkJ/555yh/Ikf8Bo8TRiXQdBu
    wch7GMH6plT/ACqppSMlxqGluwUXMRKEj+NAWUfiNw/Gte8DXPw2tMoM2t1LED3AOHA+nND0d13G
    l0ZU1W8Nxpnhq6iLRzJaLAWXggoxQHP0ArQ1K7k0zUxBLKGa3YhG7SRnllx2PfHqOKwLUrNpenIX
    yY7loyM8qpZSP/QjV7xau/xS0T/MhutpA7jeBUyheSj6lQlaPodhqExuzp2pqf3sTfZpWH8UbfMh
    /Qj8RVXSQB4W1Mnk+QpH0LA1iaffD7Ff2SkjystF33Krbl/9B/lW5oy7/CGoP1UW6EfiwrBqz1NP
    snmdyzG5uUXqzDj19v1roLnTpJNY07RYCvmPJHajPZm2oT+ZJqjodl/aHjK0tSMq86s4/wBlfmP6
    CtKzvZF8a21+qhmtnNyAx4yMt/MiutvVLyMVe8n/AFuTeKpp7zxe1vaqBJGxjUKcjjjj8AKdaaFq
    xjnuNQkW3eRTsd5V3hgOOM59RiqFsBc2OqajKSGlfy429OdxP6AVV0xVa0vGTqqFDh9oYnkAk+pH
    r7UqduW3Yir8VzsfD12dO8ZaNam5S4iVgI2VeAXYblU+nBOOxJx1qXw1dLpnjnU1/wBXLHNGwYx7
    tmJNp+XvyyHjsp9K5W9i+ym3EMhiuBDGTJE+SHJOQG698HB6gVULvb3bxXF9OlxHIQxWMMD3DZLA
    9/TvVNE30sz6zn8Z6THpN/f286zi1gEoQHHmFgxVB/tEqVx1BrnfDHxf0XWXS11IHTL4gZWQ5jb3
    Ddh9fzr58ivbmSVTb6hczFSG2SRhA2CPlyD3re8J2NrrYuL/AFRzcXJniiYSgHEcm9S/PO4MEPB4
    GKrnbMuRH0zaa/pV9fzWNtfwS3MOA8aOCclQ3HrwQeKZpniTSdY1G/sLC+inurBwlxGp5Qn+Y6jI
    7givnK58PvY6XFfWAvxqUbCCXyMuN6M6MWAG7J/dkHIAzXa+DEb4XyKniGwP23VZxFHNE6sY4l25
    ZyWGF3SDj/ZJNXGd9SXGx7dRVWzvrS/txPZ3MNxCSQJInDrkdeRWR4f8U23iG5vYIba4ga0I3eco
    G4b3TseOY249CPWquQdDRSUtMAooooAKKKKACqt8ge2KnGCRnPpVqqt8zLasVJByOQcUAUokT7RG
    xbJD4HK/061rDpWNayyi6jDTMwLYK7yf51sigAb7pHtWETImCVbaBjmMCtuTiNuccHmsX7XKQFEz
    HA7jP9KANi3GLeMDpsH8qlpqDCj6U6gAooooAKKKKACiiigAppOR6e9OrkvGdx4rNtDZ+FbGJ5pw
    3m3ckyqIBxwAecnJ5wcYPfFD0Ba6HHfEjxjrv9oTaBpFrJbqGjjeTdiScuD9wjlUAU5PBPsBz5Hf
    zuPs8c18HWJWdYrc4ji247fdJ55PJGK7rWPhdr9t4bv9S1TVI96MJfstnGZGkJ4ZnlYA9CcnBGM9
    K8xvZkaLEto8FxDlQ1q+EYE5+dP4SeuVP4ZrmkpN3Z103FKyLFtLfXyf2YrcW4d2aRmLqAOmzPyk
    thc9SWHNR+IYJtKukt7m4Nwsin7oAbhirAk8kbgcc9qdDFd248y1VrGeQrJNtfIjVTuXORlSSMgb
    snA46VlysskheaXnbtJZyzBecgDJx1PLH8KSWo7s0rLVpbezktmtpLi0kyxjfB2sedykHj8sVmWt
    1cWGoR6rpe9fIbcCVODnqp9QRwfrU1xDDdSfaU0vyLaQEoyviNQOMHH9Tk/jVtNPurR0liiHkuhk
    aFziN1yQBu6ZwOO/TvRor2KWujL2vaXaa1pg17So9scpxcW4OTbydwfbuD6VkQXBvo44Zj5V7bLh
    JF4aYA8c/wB8dc98Crulakmj3j31l++tJB5d1Zyfe2+hHqOx9qs+INEhEKapYMZdNufnR16r7exH
    +fWp5uV2exVrmj4gij8T6BFrtuqm7iIhvkTp5gHD/Rhz+JrmdL1ebTdV0+6Yl2tHQqT1aMH7v1AL
    L9DWv4EvLi01S7WSEzafex/ZrnCkh8/dIH94HHp3z6jSs/CghlleeAymQtgP8wB7Hjse+M5GelZz
    qxp3Uma06Eqi0M3x1pw03xEbi1/1chWeBh6E7lP9KbpN9FP4V1LT5XRJZriOaBCxBOFKtn0AGK7O
    +8KvrtrbQ3ZdRbQbYzEdwPoWJPIyTyMAcfjfsPh1pzxwSG3ldoo+Q5G3cc5BAHTnvz61lHExcUi5
    0HHdnk1lYRQ7JHvbc/vssoJIRRg7uOeemMVY1m6i1PxH56yIkbStIGAZsc5GeM84/WvV4fhtaW88
    l1LGr7xtKyOSEUg5wTnpxjvzVO4+GVrKEijklhBkBYNHlsngKG7YGOTkH2rT28b3Zl7NdGeb2skM
    OlNIIZPtpuC+D/cVBuB4789/4a7jQLPf4J1OTkRrZRkj1Jcf0roJfAsGP+PZnkIGJDnAJ9QO2M9f
    0qnoCNL4D1jy1eT/AEZBuVe4cZ/lWUp8z0NVFJbnlXh+/Gl+LXlf78kUkSN/dZlIBH8vxqOKcIdU
    uBtLNGIUB9Wb/BP1psWmLfX93MxkAhdBhFySTk4A6k8cD8cjHPVR6Da21kJGTAhAmkYtlVxk4JIO
    eQB0z+YrqnOKafWxlGm9e1zJ1GzNr/YmnKJXWJBJcJEu7czkEjH0454qW0v4ru3mYSWum6S+6J42
    QSSuw/urxuYggdgOpI739bin0nSrfWbuTF7qUheSEcbIxja2PUMOPofWsTWrWS41rT5beE4ul3qF
    4UHPKj0IIP5itIfDqc0782hrNLp97Zw21vbtHZopUPkF1fJz5j5AOeDgbcYAAIyxp6k10sNuFhjv
    QfuTohYPGOAMjvkn5hg+tZV1ZfZlNveJPBIjcLKNo565GODkjrj39tK4a5toharGI1RcyLCBk5A5
    yDyDjgjg9s8ip0vzJl+9blsSLFqLaeZTZXFrDEcl5ELR7hjnPp6k5HvVYIiSAGCGLJDIythC3Yo/
    VD7HitVdelutBurG0aJIkiMeyYZnZNuMYGAeCy7h65wDzWfFp9qNHudSsHnUMYo4IXIJMjZLjGPm
    AA6+4pJ9ybPqdB4L8aan4furi/aeS58tJGkWRA4+ZlBZ3yG6hPzrr9d1ux12G3uPHdhcafLGjvaQ
    oVVbqFxg7h83AYAjHJrzuKWS20PT9TjhiS+W/nikYRgbvlQgEemCeDwc9q1pNZuLu20vS7Y2k1sS
    y2ySruks8/eUMedg6gAZI2jJxitU7Gbjdnb/AAl8WXFzqa6BpqPeWUQMt1cSFUMfygBguckblA69
    +3Fdh4R03VdP8a6/9o0ySCxZmaG6LqVn3SFwAByMbmrlfAGraD4d1OKxtbS7uby/jjkm1CdVTchk
    EahFGSEywOCc+vI49jklSGJpZXVERSzM7AAAdSTVxSZnJtaEtFMjkWVVdGVkYZDKcgj60+rICiii
    gAooooAKrXpAtmLFQB3bpVmql+rNakKCTkcAc0AULV1e5QeZGfmzhVx/QVsjpWTHG/2mE+Q6gHkk
    AfyFaw6UANlOI2IOODzWOZm25MsPA7xf/WrYl/1TfQ1k/ZE2n97EG2/3+n6UAa6HKinU1PujnNOo
    AKKKKACiiigAooooAKztag1G50a7h0i7S01B4yIJ5Iw4RvUqf/r/AEPStGuT8Z6vof8AZGoaNf6+
    NOuZrbP7mTE6qeAwUckEjHv04oY0cddfEW5fwJqMWr2rWeu2EgtrqJhhHfBZSCOAG28jPQnHGK8Q
    vp7eNoblHWZ4okBJ+ZWl2gsf9rk7vTgeuDpN4h1zxTbiz1DxBPeQQRDFsuUaQDAGQAN7Y69T71yk
    kZt5SxXyVLkA4wwBzxg5wa52+Z6s6IrlWhrTzQ32itBBLvuZrpZJZnLfOAGOSSMADd9eM9TUlxpc
    V68MoeKG1a2jllcAZyBsIA9SQT2HUmo7HRtqYuGeO0kG6WZSH+QHO1SOCxP+J4BplzPZXQjjinMN
    tG8mIkyXEWQVAPfOTyfy6VL30LiiXTPNWSSa1cWunxja7yciUj+HB4Jx14wOpxwKhtbu7hSaOzc+
    WyneeqZPfa3AH1Hbir15HNexQSXZWzsoQEtbOEHIU8gevXucknn3rs/DPgpzCk15AsXzB4bbO7y+
    OGb1fpgHOOTisZ1YxVzpp0HLyOU0nwq95ax4iXznXajKCrYz1JyB0B6g8A5Hp1eg+C9SggvtMvJk
    /sy4CthCQ28lR0PQjPbgk45wMd3p2jmDIjCgvyWbk8856n/9QH1O1Z2DOmNpJUAnaTxnB/oPxPvX
    Mq1SZvUjTpqyOdsvDVvaKFtYEBLBtpbCqQMZ47fMePYc1s22i26qmQHwmNxGDnHTHYdOBxya6Uab
    CYWjl+bjDMO3OT9O1Sw2rLw6jbgHrz0/+tR7C7uznlinbRmbbaKkcYRQQM8DuP8A6/P+eaux2ixw
    sijocg4IwM5/x/SrzxEqMAEe/pnJqNEbAZ264yEJI6c9T0rdU1HY5nUlLdlI20XlsZFAJPXIySPQ
    /XGPwpU08xysxUMGJbLc9evHvnp/9erpjUqxXGT1+XgdOtIHwqgN+J6Y/P6/5FJwXUXMyrc2CXCP
    HIokVlKOGP389j+dYb+DNGFr9mt7FBGchk86VQQD6bvp9f5dMrR5AY7SQOM/eOP1/wA+lOWVQDhT
    yueR7D86rlQKTRwq/Drw5YyeZZWFvFctw0rq0pA6kYZuMjIz+lUtW8Bw6jBJB9pkCvMkkarkAAdi
    ARnn8M/hXa6q/kmK5UAmKXB4z8pGDx34JrPGqTW2om3kUOpkMaYGMEAMM++CfyqJNJ6m8XJxPJNU
    8LX+s+NorfUzELJFjSJbZsqoyUXKnkABXPIPIx3FY+oLNbvdeSjvF5pR4uQYWyMFgQRn7p/3jjmv
    ULeK3mlm1SaSTzyzeRJbNveXDjYw3fdG5GRh22Dnmq0dna6neSS2suixre4eXzEZy8wGXCOGU8cE
    YwcMM1bqOw0lzM8zl1pjG1trltJc2hOYnuBmQJgY2yqPr1yMAYFZgsLa8dP7C1II4JZLS6dUYE4y
    FJ+VvcA5PcV6Hc+FbVliisNRXyMtLeXG75PLBznyySCB0BYAnqGauZ1rwfp9ouL+3uLCVjuS7gQy
    RuOoZo/vqMdcF8dOKIyXp/XY0ktNzAu7GC4l+z30baZqS4AEgKxsfZj938ePQjpRd38mk2Oj20IK
    NFIbh5F65ztB/IH86VbDXLeLCSRatpqfe8vFwqr7D7yHH+724q2LC21uC5i0+RLYzOqQLdJsDsij
    gN/AxJbqQDkjPpolb0MZO5U1nXJIEEEYiMLSfaVQR7clkC8MOx2g4xxVSyvWtojcXJigW4zIjn5g
    rjvgZODk/r6VfttN1OKzcSWiFQDGwuFURkHORluBg4bI5HbnFYSRurSC1RGQcNCzblLZwfw6YP8A
    TNaqzRzy0Z1dl4ptbi/trhA6SWtmYDtU4XqUOeOjbT249a9I8S6n4g+IviBPDOmW8lppKosl35mV
    LqccyHjjsFGeRz048d06xjvbTYso+3xE/LGpVkOTgHPDLj0OR2zWvpWoeK9SjtfDltqptre+mSMy
    C4AUkE4GQSQASSQAMnr0qk+hLR9PeHNEg8O6DZaRaySyQ2sexWlbJPf8ueB6YrWqlpdtPZ6ZaW1z
    dPdzxRKklw4wZGAwWPuetXa2MQooooAKKKKACqt8StqxUkHI5BwatVUvyRaMR6j+dAFCEhryDc+W
    7ZbJrZHSsK0ZhdR5fI3AY3Nx+dbq9KAGy/6pvoe+KxGiJiBBX/dyMY+ua25eI2+h74rDkcNCWxx2
    G8nH4ZoA3U+4PpTqbHnYM+gp1ABRRRQAUUUUAFFJSMcdxQBg+K/FVl4V077RctG0758i3aXYZiCM
    gHB6Zrwb4g+NV8W3lt9r06KwtIo28iS4jeQmQkbijKASe2D8vHrWx8afF0Oq31totlOJLW2zLPLE
    wIL9MA+3T6se4rzG5u3EMpvJGunIEjzHkEg4UL7f54GBWE5XdkdNOFldlBoy98lna5Yq5ICDaXbP
    tkj+gFTytKt463ki3MjqpE6jewxwOP4gPpUpjXT7dlLqZnG65ZOc55EQOemOW/L61raOaJPt1wxh
    hZcovRnX2Hp7/XHrUXL5XcSd7lIl85RDE6kSeWDH5v8As/48cZ5ra0eGJ7e2EEH2m8kX9ypTYsee
    pJJwcHPJ464BzUdjpamzi1bW3ItSMw25+/KO30Xjr34x611uhq48R2Et3Isckv7mDSoEJm2Mvykg
    f6sHg8kHbkndWVSd1yxRtTgl70ja0Hwd5E0d3fut1ds3MoOVi9Qvb2JPJ/OvQrWzeKNo2gD5O4Mr
    feI5wcgdcY5q/Z6VBbblYQJI/wA7eVn5iBgEZ/wxzWlCqRtuUY29z6fXoO/41yqk5SvIupiVa0Sj
    Z2kqu0zogjAbIY5J69P55+taNrHDCSwXDP8APljk9sjI/D2qQkRkHcfLbC4B4zz0A7+tOyhDYYY7
    +1dEYqJySm5CSQl927lMY2jj+X0oO9RsI3OfTgfmak+Uc7cEdc9qjMh3ZCk5yoPp16/41drECqiq
    AAxAGARu/H+ufWkWNNzMWLMSATnH4VHM5LBBzxyR0P8A9fFPyeBuyc4OBx9f0pJoLDmIAIIJHb2q
    ukZEjZDIMYxgeuAaY80kMK7gPMbgAHIJPv2FPWYykjIJPt0z0qW0ykrDIYiVIOVJbOfXgAZ9+KnZ
    dgyq/MOfr/nr+FQ/aTvG0rgnjjPpzx1H9aoS6pBLdImwlGYor5BIfJGCO3tj/DM3SRSi2xLu8t/s
    Nw95IsMcalZscbRjOQf7pHQ9q5m+uftkEyKomuIYlupVyVLhN8TkY56oDx046cVuXcMMvySlZN48
    mZXGFdWHIPJz6j6+hrlFiu9PjlEk0s1vZOglEQzLgFQDu6kco+AcncfSsr3dmdEYpLQvzWsSXgvP
    OE9ojyOp3HzkViP+WfAwCTnCknqOTzRmbR4rXfpq2kgGd7TxvNIhZWI+9wSwwOcnno3StC7dpY1g
    vmhHz+XDdRzB1YZ+ZJNmCgGB83y4LDBBwax5DHDKNIs5s6hbr5J1O5hwoyGYlHOdoUBzl855BI4N
    aasa0LWh2sVzezvLOzWFpPuuCTn7QwwIl6kBAWyFAAJGeOlZr/Zta8SPdxLLPa3sEwj3ReWzSKBg
    rkg4XoFY4wGOM81diNudDhsLqa+nFuBdGe1eMySSkuGJRuCFI4z6cZxy3U5VEdnrSW8RkSOO9uJ2
    J3lPlXDDOFPltvwBj5iPc0tI2W4O/Nqee3FjCzx3Wlo8DBQ4jWY+YmVQ53DBIPz8ZPTiuYvdSlun
    JufPSdZQzSg5aMA846Zbgde47Z57q604S6tFpsc8Mb3QntQZhhC6SNtAf+E4dcMO5GeK5bV9MdH/
    AHsE8BVVd450K9cAgDJJwcHI5PI9Kqk3a7M572KUt5JL5jXkM11OjYbMnyEcbSAOeR2qvcxw2EZI
    SRLtnV3ji7L3RvYjt9K0EsDZ5TULK5jnt0HmOj7DtckI3P8ACRjHbp9Kp3Itl1WKe1jCW0hCBncl
    Eb3bJwOSfoTiuiJhJX2H6hr95LC0NuiWtoz+VJBDwyjqA/15x9DVL7OtnqcckCwlCA8Cy9N3cenb
    vxzU85N7BLLGAs5XMsaqAJF7OuBzjHOewpbHUJYtKkEcUMpTBaOeJZFIHXgjj8Kr0IS7n0d8JfEW
    pa5oV3HrV8t1qEE+flQDZEyjaCQACcq/0BFehA5r5U8NvqlpqEt1bXYtWztl0+2donReOnPK98Ak
    8dK+gvBPjKLxjY3E8dt9naBlRlL7s5UHI4HGcj8KuMr6MiUbao6oUUUVZAUUUUAFVr3b9mYsyqBj
    lhkD8Ks1VvlLWxVQSSRwBmgDPt2RrmLbJG3zdo8H+VbI6VlRxSG4hPkMm0jJKCtUUANl/wBW3GeD
    xWKGsjn/AFh+jDA/KtqXmJvoa58yTDO7zRkYyXOMfjQB0K/dFOpqfdFOoAKKKKACg0VWvr610+zl
    u7ydILeJdzyOcAD/AD2oAxfFfjLSfCFh9o1Gb94wzFbqRvk+meg9zxXjGr/Ei98UXDRbZpLdzsW0
    gkKW657yMPmk+nA9q0vFHxFtvEmrx2um6c0rr8kIgtlkvJs9lJUmJfpz346Vm/2PrOi3ltfazawa
    fazLJOtiknmS/IM7pG59emTyegrCcm9jopRit9zhLmSyg1i5MsKzFHVVh2EptUD3+vGO3XqDW1G9
    e7EKvaSAxFpWkKFS5cg7mIx+HTGa2LC6RrNnLsTdzMzKsgTBzxgnuAFIOflIBPykkQTTsQkpUMAC
    fLxhXZSQyleuRuY7evzL6VkbWK0VlDZ2EWo6kiiAFvstocfODzucd1z0H8WPQVLBJbMG1jWi1xeP
    /wAeWnbfvE4xJJ/s+i9Tx2wDWdbvUNXkuJCt9IrEqxA8oEHG5+2Bjp0/AYNm3kNnfGOyBvdVlYqb
    og/KT1C/3R78H6DqpO3qXFXI5xqF9qCzagrvcSnalspzISeABj7p6D17DFe1eAfBq+H4zeXS51OQ
    YeRPuQKesYPcn+JupIxmoPB3hix0ZftSKLi/xh7x165GWC9gO2B2zk5JA60XQDKGOJIxgcn5QQOw
    7dP8muV1L6LY1qXtZGv5ZMgPJTkbSfp/n8alUhWVFBUn5iQPc/hWX5jPGMTLnnAJzuPPccjr79O3
    WrwcFEbcpz0Yniri0csotErZecnaQpA6HnvzUhVFjCkHoOoye1Vnn2Ku4DcTg/MBj0HPJ6jiq3nt
    Ou2IHPIXsD2zz6Gq5khKLZpRyo54H69aQMN23dkkZOAcH0/GqcDSbTsTA4Jwf0FI8kiqyjAyT1/z
    zRz6ByE0vmMx+baAeNuMr/8AWz2pZHGcqQMdCTjHPWq0ii4CKXATuvI4xx9PxpI1dJTuG4k4wT07
    4Pr/AJ9Kjm7DsRS3RwGVGIUbQMbcDnOT/wAB6fX8G/awjBAR8yZIUc9M5we/v6/TmW4gjmJUszYO
    488jB64/H+X4R3ESMwbzNrD5QAASOp4Hpj69O1TqWrEjT/aLKUx437PlVhnBx39f8+tcnqEs8s0j
    rH5V4h5RzhZu4QnHBPZsZBHIzjPRPdzpbo4uIDG7BV8yNkPXoSpOPyGK57xDJexNHHLbp8yt5UyE
    ugOVXZJkdDuGMZxjPQHbMrs2pe6zLTU7ltl3KrxYQwzxRxgSB1yR8p4bIVgyHI3KCOuTWa7ubSC2
    S7umubOKURwT24G0fMwAYZyNuQO/3U4yCatwWaXjR3gtN93abhE8dzkhQSpUtggkAYYc9CCSFzVK
    +0j/AEnyXNrHayvjZMkhXc0g++FG1iGwAG67mAx1DV3obLlaJbq7im028sbGRWhhmVpoWgEtyEdc
    OoLkhtzDJ7jnOMgixLapbafJb3UUQHnBsz7N8VuxCguMARjtwCSAF9xBh9FMcGmWUk85HmC+uk5l
    RgCxi/uknHJ6HGRjmqMtzd2lndQ3bSXsM7p5bTR/cRZGaVWA53An7ozyMjoa0v3J5dLo0r+/tZrm
    +mgllBgnMrln2yszAYdy2QI8ABFAPQ9O2NrtgLnTJjZkMkRN3EIwQShIMkTfUYIHYgj+EVnTXosI
    vOeJp9OlTyGIIZ8OMiJuxJGSjjgn/eappdZvVllSwBmmRFa0dmCSTrjKFcj94pGQUb5xhtp4wE9d
    SGuhBb3e+M2txZRPCw+0OtwT/pLKgBeLHPKqjEDlgx4xk1Pd2dzr9qV0tby7RnwljLISbSZOsZVm
    BWI8/MDnrw2ao2d7HqcltaW2zT7eF2eMO4aS3cqFd+RuG1SQSGCkhDxgitS/uprm+0oypcR3MlqI
    5r29vViEiRFg6RkhiyyAE4ycZBAJGDsonM3ynP6pZ2mnO91Z5v448rdNHL5kCx4Cyp5nU8lMFgMs
    QVPTPLXkC6RezW0paWwu0WSGUD15Rx9ckH6n0r1HSvDtpJHplmuLX+0LZ5rpJCYCY1DuTJkbym9l
    JbKqdigDJOOM1iOO3votDLB47ULNbzzxlN26MMSAQCELbmUHnB75rS1tQi9bGCsU9slvMpG9AZIX
    HIcA/Mv8z/8Arpsxjt75J4GzbXS7lQndsPdMenTHsasaz5cN4bpMy297F5qCQ7tjHOOnTDbh+FZw
    ht1yxB3SfvFOMbOuOcZHXPp7Gqj3InGxozCTUZBOXWCeLKv8+wbcFgCex29D6cdq7v4Q68NI8YCy
    JKWd6oiAY/d3fNGfwbK/8DrgtPXy3ScSq0gkR5AMDAyQcD6EH6irciHS75JoZxhCzRmPPyISSnXn
    PU8+vrT5tbi5dD7AFLWR4X1f+3fDGm6oV2vcwK7r/dfow/BgRWvXQc2wUUUUAFNY7VJx0FOpr8Kf
    pQBR02/a/wDMYqiqpAAU5/X/AOtWhWPopZ3mdpPOJCgSA7gevAbv+QrYoAjmOIXP+yaxSuQfudM5
    C4Jrbl/1bdeh6daxCYBnKSA4/iTHP4tQBuJ90fSnU1PuinUAFFFFABVDVNG0/WrX7LqVpFdQBw/l
    yjI3Doav0UAUbHStP0mHytOsba0jPVYIlQH64HNeH/FDVr2/vdUuoFjFjbL9hRieSQdzMOe7Aj6A
    ete6ajdrYaddXjnCQRNKx9lBJ/lXzb4wuJl8L2FkSPtN9K07DvljsB/RqyqO1kbUVuzlI5mFlGix
    7y8aRhGO5HH8II+8rZJwRx8wwBnJq7jJGsszvIJdvlptIeWQAAY5/Dd15x1psi2scsrO+61jLFdo
    G9wpxgEdP8+9Ry6iyqbgEG8kUqCF+W2j9F98fkKyinubyaK1k15cmVImZHLgbVOOc8Dnk8npXUaJ
    axQ3MHlTFoZJELKkn3yuSAGHzKeh46npWD+502M2+4vcSBTKhA/i5IDdiB6g12MWsXPh2ytH0nR5
    7SW5Xa19OCZHJxkocfIMkKMAdT9aKgQ0PV9IvLWWWWy89vt1ltSeH5kZAyhl3E85IJI9cEdRzaWD
    zZTI8m0ZGecH8evHTnjtmuQ8L20TQnUgokvplBmnQkMw5I4OTx0Ocj3yK6lbgRSYVztL9ApO0ABf
    u9eo9vY5rzpJX0Ou0rXe5txYMbAyEHuM4JAP+PH/AOurUchaMIi7WJLEY9e596yopIYfleRQT83U
    EY9Rj27+gFTW+9HMWVTLZz1JySDkDvwcdqqLtsYOJdFqzDOduSB1P49f5/SpEtFVy4yTwGGc7h0y
    f89qepVQpYkHGMnt7GmyzCNeXO7+Lnj07nA/OtLRWpndlnAUMxI4POarIXzKv8PKpgHj3zVdLgjA
    Xc2/C8AZU9DnPv8A54qZ3ZoQSoMgUjA4H09qfNcLNFdHAjjyrdO2eCfTuc8/jimmR5XUlyAvQZyD
    78/X8f5u8xZpfLHzZBV9vBGR6EdeP61ZEKhAyo2FGF28j39xUWuirpbldJBlmAPXDLjIb0Ptn/Cq
    8cipMS7D7xzhuc546ckZP600ELcZ6o/3i5JyxP69B/KqsFxJGjNErgtyr7Cc8Y4I7ZA/MevM3LUS
    xdW8kivuAG4YeIAksOuR7+3vWNeMzWUSSMzBcyQO8ZwyhWDA9t3QZIHDdzmtpb6RyMqAyNyOp29z
    7D/AetZeo3Fx9oFoqmKO5RnSQbHAfj+AlSSc57g+3OR2ZcW0YWn28enWlvc3cv2WIJ9mgW4fc0xB
    ABX+6uAPmYHb2bHJ07SOPydt1e2aXSqkQkiuA6SqOAJDj5ckcE8Z6EGnXa2jys1+t3JdPwLUMu7b
    zgbEyFTnox785IzWNaNNp9zcQ2VoIVCny4kJMSKQMEAKPm4bJUEcDOTihNR3NLOSuhl3c3tyVtrU
    W9rLI0izWFwArTvkAhyuflYN1ycFu/ZbqO7uYJNmmXtxHhUbytkzMAOMlSSJF4wxAyMZx1Ets9ml
    vu1bSRZxoVhN0kZ2HJwpIPzIeBhuQM4OBnFLUrS+i8RtPI8EqXSfuLqNNnnMBgoSvG7aB0GSRlck
    c2leInJp2MS4iiUhd6fu8xzRTRFWUkM37yM4LIwDHjo4OOT80N1oIuI5B9udradCttA6MTBICTne
    FwDuyMttJzk++t4jLzQf2l9rCS48qSQL84bciFXIJIO0lSo9CRw2KS0uLsadJdAyXWnmRBEY4Nyz
    g4DFARvYsMk8LtyQSeDVLyMXKVznf7F1zXZ4Eh0y+FygMW+WD5WBTazyytjkZLBcDg9ciuk046Zo
    kK2enXCazqRZ5Yp3fdaW1w3ygKzAguzDgn5SRjqRVxtPijtP7ZmeP7MCwmuGzHLCMBSJAw+YHZld
    /IOACckVBJqCJq8sTaegjllQSajcbHW5aVOPMCqNkTjI3Io2tsJ6YO1+WyMn7zINQ8WQHT9OuNYi
    u7ee41K5a8to3JkicIiqSGyAvG4IcjpjpmuJ1u7g1vUrlYrpprWOMt9puHYyO5YYb5snOeo6AM3o
    K77xTbp/ZbXDrc7oZYv9YcmUof8AVXGOrqrMQ2fmX5hk9fNbyzhe5ZbeH9wyltpY/uyX4WRzgOFG
    OQBnI+laXuTFWJdSlh1vTxIhUXuzzZIgMESLhZOPRhtcf8CHasKCRoreC5XEvkvtII4OMMAfbp+t
    Xp1awe31W0ZJGjcxzZGVZh6j0Zf5v6UJHbvdXUFvu8i6j82ENyQRklfqMuPwFNbBsx93YxDWbmGG
    QGFoPPt9h4IO1hjI5+XP61Yjt5E0WzuTIxE7vEIsg/MoJPA5xxxx17nFZ2myn7VZmaT/AFD+QST/
    AMs2yB/6Ew/CtW2MNnBdwy8yQzh4kVMn7wyc/QkZOeM461N7SsUlzRufR3wx0qPTPAOlGK4lmF3b
    x3bByCEaRQxVcAcA+tdhXA/CW7c+EpdKlI87SryW1Zccqu7cv/oRH4V31dS2OOW4UUUUxBTX+4fp
    64p1Mlx5T7sbdpzn0oAy9JaFWbyllZnA3sWVgD/vdT+Na+ayNKI86QE5zGhQsCG25OAAWPHt1rWo
    YDZf9U30Nc80kZUheGx0yT+ldE4BUg9D15xWXcRbHxFE8ikfeBJoA1E+7Tqan3RTqACiiigAoooP
    SgDk/iFd+R4Tmt0P7y8kS3AHoTlv/HVNeBeOZHn8b2un2ymWS3RIIU4wXVMDr6uc17v410fUdQns
    LuEwyWNiTPNAX2u7DHQkY6ZHOOtfN+pefeeJ7rUZYnYliYwzFCWbkcr0YA59eOPSsJ/EdFK3LZEu
    p+FbGDQ2u7a5uEJCvCs7KA7AhZYiMcSBiCB/ED7Vl2kCk2wuAwHlO8yA4UKhxyCOpI5+ta+r6vcX
    1rBNaJI8ZmSS9TyxsNwoO0gjuwG4heOB6is2KGe/T7PYKJpZ0SCMswXcqLvfr6sRUtu2ppFajNL1
    Nrea4uxp0NzfvIZEuJeRHxnAB4465/8ArV0djf3WpXIuNUvGuC21kD5KDB7D+I+mfTp3rmmhl0+5
    FrNG8MqjEscqleSQWB+px06gCt3To5muIpiF+8FQIgOeByAoHfnJ9ayrP3Wzaik5nqGmIUgQW7cg
    Axlh0wcfoc/QYPTON+0hjVWjEAzs+cD5QQOMH8a53TnZIUAH3FwGJyWIIBb6nn+ldDYkSJ5G196n
    Kkgr8vHT8TjHt9BXnw1R111qOKPK8iKowvC+XyR6k/hxjvWpCixoGUbgELLuJyB1APrjBqGC3KMr
    lcgZ2seNmB0wPrz/AE4NTZ3xIJGG4AAk9vX6VpFHJJ3JZLn94U42DBJyO/b15pl4WjQ5lKd88cd+
    ePTNIkSRRn5pCpXG5ySARxnB6f8A1vc5V0liiPkRswU/KgwqgenPXPJ/HtV6snQoyynchRmyDz8w
    BOFPOTz36dRz07ziQshR5HfHzgqRkj1x/PgUXSBgmwKCAQeCMHjIyD347Hp7UqQN9mEe393g5xwe
    3cdM4/nUWaLurEEF64Zv3ZBBCtlmI4AGc9+uOPT14rSiuo5RsOWBG9doOf1/GsaC3ZZQ5cIBvKAH
    P17cAHPTqKY9/Zv8nmoI1/hD4wD6NzjvzmiLaKcEzYZ4yiyKU3dFPYDIx09cDj601ArTrIybsDJI
    4LMSQORj1ORjvmss3EJSZI7hUK4UszA7cH/64/PPSrfnFeFdVQBgQykEHORjH48cE8U7k8pdggt3
    Vt8aqgYptXHIyOc/Wq88VqqyRLuTzAMyo581uez9unPbFUbvU4ra2eVZVHJ4C5APUkHHcYzWNa6+
    bm1WaMArkKV3bSwyckD+WcDjrzQ520KjSk9SjrN5aQQTafaxPYRu4B8yORVnQnqz7SQfqwx3HNC3
    elyxwvFfXTOrniO7dZCGBUqSxBYKcHGeoqjf+Imm22sc6peNncJD8uMgHJAIHLKBx94+mTWNdag8
    BaG+SC5jL/voY12HoOTtPTnGdpBHuMlWbs2dCjbQ1rm8NmlxKfM1G0uEEEjtMXwgLcNnOOWb2554
    zVawkhtI2jlLtovlCFIFRiZOQUJLH93IrFwW6DIJ4OabY29uLlLi3u5IYg+GhLpcRPnqNyZYZBPU
    EdD2pn22O41Y2BaJ7Pa0bz+SxjIyOCF+ZSo644weMcAVG99By5WrMW6SNvEFzbXqWs9lEY1uRLdJ
    bMAAWHmM2O5AwA3A6kFc27rSZrh4tauPESWKonlWzaa0jiNTj93EANpGcdix6k8VaisbT+zkfSHl
    SS1UQvdajaOwWJVyDHFypIyV/ec557ZrAu7/AM64tZrFpbiSU/NqF6HklJx9w4wqL1GIz1wMgddn
    a10zjtd3Y+x1ycWUss0l1PfMgXdFuaRYCpyJkc/OuMnBUrzn5SRh9laRIG1DQ7ibXtIWAJcWJO24
    VAPubG+71U5XjKjG7NINMuLSZwbXSfMuAJBFe27gmXcRIqZZR/tBTk8nHSmx3cd5HBYNP/ZfiC3m
    YWbQweS0SM20xYyQMjcBls52c/dojPuS4dilcalZ6n4burfUvPtxbzCCGaQmQsOf3Thc7iisCrHH
    BK9FrmL28sbqI21jFLOxmLvdyQhFPdvlGe/P9K7+TWoJ11O91HT0XTWZImkdVE06sdoSW3B+Yq27
    5lIKkZHORXBy6LHNqKQ6ZcKbKdZWskZ2BYKT+7JwCH7jIHBGa3WquZ7aEnn2jQWkUu1bK6R4nKpw
    gDfIxHfacn6FvWsaG2vdN1U2Zi2yW0pkGTkKR1+qnA/nSy+faQRDeS0MhVUbOFDDgH8f88VFaXOo
    T3m+4bJh2eYR12gYVfyBFUl2JloWY4LWXVZnSdo7eTIhABzIc4wCeOM4yeOCK6AQf6XcEXbWE86m
    PBzvDYPTC8dT0PfrWFbRK862sjSCNXYttUNtXLZI7g8H24ya19OWfc+poJLtbO3LrvBYeWvJOACB
    wee3zDtUyWty4ysrHp/wYvpbrWdYkkyBd2dtcOMf8tAXVj+P9K9krzD4OLaz6ZqVykCCeG5aBJ/4
    jC2JVU/RnavT66YfCjkn8TFoooqiQpknMbD2PbNPpshwhPXAoAxNKEcV2Y3iYSbQRmM9ecnOOM+n
    TitwVjaFsUSKhONqnoAB1GMAkDp+tbIoYDZf9W30NYu9X4WGJiB1cA/j1NbUozEwPoelYrJbiPaW
    cED7xjwf50Abafdp1Nj+4Pp3p1ABRRRQAUUUUAY/iiO6n8OXlrYwebcXKeQo6BQ/ylj7AEn8PWvm
    S4sLl9fkslsJJpInBYbysjx8EMzYC5yCGyeoPoDX1ielfPfxes9Si8WPElxIdNlQXDwRARZJ4xn+
    M5BJPUA9OM1jVXU3ovdHI2dy2paheWtz5QaOCYwQoCREwXduVum7KnnPOc81BcW0Wuwpe2KmG8sU
    P2q2jO3fEpwZYh+Hzr261Hb3MlpfW91FZKI40cbdrAOCpBOe/GR/+vNZd7fPaW8llHCzTJIT58Z2
    kIwzkY55BIP/ANeojroaPa5fj1q4ubSGzvoor9LkFYZZiA6np97PB44GfTpXU+HIFng2EIVhlYZU
    Z5G05HfkZUH07DvwUUr3OmM2VUxyeZEBgbF4X8s4x9K7TwxdzWa2N9cxmK3vbloYeDtVtoPHqMEA
    e4AzgcY4iDcHY3w9RKauejxo1kW+ZSyAZAPU5wAD3wB69RWvZW8tzHFNN5jALuyp2hs5x78Dvx36
    jFZdsh2JvYNExBMW0HJPIOP73Tnt7mtWBihVEVA0g6h95J4Jz7dvfHbFcEbHTUbLiPMiFwqiLyyQ
    C/HHQ9OPXGDV2IxsiTTBSyk9Rg84B9M8Z9arLMtv5reXkuT8meSTxgZ9+Of/ANfHeIPHtlaXsdiF
    Mol3Z2AEMcDb36dcHB+mATWsVroc1rncNcOJX2kIingnIHQ5/pgiqV7r9jpEE89zJhIF+dN+SuBk
    jBwc45/GvE5/GWpavo01sS8EhCGSexIZSM4ClOG+rIT9OtYU1l4mitE85WjhmUbRcyqhZRyOuG9D
    +Wa3VKRN4HrupfE2OTR7u90q0lkkh/db512IkjHAVv7zf7Iz064ya4K/8feKV0OOymupEvZgA89w
    kcDAHow+br74HGD1zXCX9zqL20dvK9xNZ2mQgR2aKIkgttPQZ71e13VI9R07TdT8pHlZXgn3ZYh1
    6Z+qkHPtW8aVjNzSemh2Vh4y1Gbw/dpJdJeX9tkzxNtyUAIVw3dQTkkYxtB6EkZR8ZXE0xLyW0Kh
    vMVFuAe3TjgnIXkn/CsKw1NbqwjTzoLC9sX823lHy+axxlWbqOBx255wKYi2VjpqalNaQTzztujX
    H7tT9D1x3HT61EqMeq1NY1pdGddonjkRM6TROPmDA+YQEQlSxyOckAeuSa7CHxBerHGzRJIXXDsJ
    Qpz17kY7+v8AIDyK6kmu57K6mgRGkBzJuJMmGxnPbrjFdx4asMywm7luXg8wOAoJ3Dd0bPToeBjO
    O1Y1acVZnTTm5J3Rt61rNxFCnmAIG2M8bRgjawAyueuM/n7Vh3nin7DELRkeMR5jMjDJGCOP19/w
    FdPq1smpWV2sdy0gZOIpAMoxHQ9yfQDgdz0FcB4oVJE+05QM5Rz8vA3Jg/qmKzppSdmdDk1C6M0X
    V21wdZIlktEYHZER5gwSQ5BOcbs89M/SmaVrGoPfTC1vprS3jzJKblQ0cKDJI6579AMsfU81nXGo
    XNqlnDbXshkhyPIHSPkkgHvn9alvb/T/ALbayyxzNHtzcW8J8oOR0VhjjkckdQOMV2qHRo8udWTu
    7mlr9yt/IXmt9TgQoklszN5pkB6yMpbCk4zhemQORzVmCeaCy0/xFb3kFvHbSCBMIRM3rtRi0bAj
    PXGenYY4/UdWuLy9Z0d1gXKwxZ+WNOm0Dtwav6jqcl7FpulwTBo4oVWR5OQ0hO4nJGRjhfwqnT0R
    Htbndat4iuZdXtnkvba/s5IF8pmmaWKRSwG5ouAjAgErgY7ZxmtW5t/D/wC7lOmK5mTLLZOYywyv
    3152qcqec9OQCOPM4tPiifyL68ZE38TW7BkYkZ53Edv5Gt6w8N3likOo6TqkBmZtqvOiwuqkYJXc
    2x859cGsnTjumauo2rM3UELutrb3dzo5aMglg7+YOgz5eCvBJ3bOOD6ir0WnX2qRmO7hstUWGLEN
    xZSo+Cv8D/xbSMja4xnHIzxn2mpabaKltfaW810rAwXcN09v5AKhQVBONmRwQ4A47dJr2C4ntjBq
    HiFJmhfyZlg057qSJ+ThpJcFMYPRsDHWs7PYqMupnapd2upWlysbNDPA6qksm3O5wFdG3njnqfm4
    55PJNesI7WxF1bQ+Rp9xOtxpi+cJJ3K4EjswxkNyc87SAOM4rY0nTPC8scC2cFzfySRl5ZryNoYh
    jAI+RHeRsngKecHniuX8UXp8ljBZ21rYicx2qw2hheQgHJbcS+AT0J6kfhpC60sRL3upzN1cXE8z
    Xd3LsieYghCSHZe/v1pIbk2xSSVSySSB2AJVn4PGfTOK1bU2w037JNfx2s+MSbFLMATuP4n5foFN
    QXF3ai4iezW4uIwCHjkTCHPQ/QYrdMwZen1C5jgeOOSG1Z0OIbdQzO23+I/hzyeM1s+DGMWs6fBJ
    eNpY8yONY2t/MEgY4bduIUgHPzMeAQFB6DDs7SO+CyCOGMyKdxEzZVQccjpx1/L1rv8A4Y6HDrXj
    SzuEjlNppkTtLK5bM7cBQ3tuwwHqvQjNJb2HL4T2Lwj4Rg8I/wBpw2cxe0urnz4YSuPJXaBsznkA
    g49sdep6ftTQAV5FOroOYKKKKACmS/6tuAeDwafTJf8AVNzjg80AY+lyML11VNqtGpZQCQp57lj/
    AJAraFY+ikB5lVww2qcLtI785BP5VsAcUMBsv+qb6HtmsQtbqgIeAPjghMfyrblBMTY64NYJt5VB
    VkIfHUtigDfQ5UGnU1PujPpTqACiiigAooooAQjivKPiwlzaanpeoraySwoAm+UBrcPuBUEHlSWC
    9jke4FesVw3xd+1/8K41I2hjADRmfzEDAxbxu4/L8M/WpkrouDtK54rqF/HpVrNlRJo8weS1wCXt
    ZMgPEPXr0PY5rz43cssTPM6qPKWJR0LgdzW/qt40MdwsirGyBgpUcOScFhwMZ56e3PaoYdNW602x
    lxFGRsZ5Z2wVUDkD/eJ/8drGNrXZtLR2RRtb/wAi6hia1jd/LVI1d/kUjjJHQ8c8/rW9ps9xd61Z
    yJdG4uraXzpZJj+4jT+6F459D7DpjIx5p4bfUGFtIb5WTaV2bRGQfX0/KtzwPBLqfiJYxZwRsIpH
    BCnBIx97HODyB+J7VNTSLZdLWSR7Np9shjIGGC/LhGByfbj0/n9a1kgWRPNAwFOBlcFT2/LmmMiQ
    4gVFCxgjdt+XGc9cdMnP4fWq2qXkul2sXlwGV/L+ZM7sBfTHT9R16V5ySR1Sbk9DmfGHi210xAJ1
    lYjj/RyQy4zgE5GOnftjjrXk0uteIJpraRGcToZZt0h2ySBgBhsnJUgYC/73HJNd3cz3F1fyXklu
    1yQdyeYNowBlScr2J7574HSs200O0ubi41HUbpF8skynccZPQAE/c5PU555PU1vTkoLzCdOT0Rg6
    Ba6qNX/tqwsnt0liZPJDsq89QpUghM4I/LoKn1G2vr+ZxqF6trvXO2BirOP7hyxLe2Sa6KO/l1cP
    Dp0cNpYk7JL2VvlwOMDPHA9OO9YNxc6JpDEwl9SujuRZXUsrYxkA4wQABwOlX7SUnogVKEF7xjy2
    3lRy2aymeGQKVkj3DcAMYA6ZPvnrxWTcWQjyiWrhSflycgke35/nXQHW7uZ08rTk3z8x+YNhZfbB
    BI/xB7VFJfXjTlZNNDqescTbnHcjHfGM/gK1jGpFXsS5UXpcxV077UwXaN/3ti9BmrJ01FhEkbBm
    DYPG7jgcfj/nmpw8V1LtjZ0cH51kO0g+h/H1rXGjTOnlgSEyBfm2YySVYD6nOfzNTKbW5vClCWqM
    hLCK2nV9oYtghcZGOufcf4ivTvBkn26/jjeYKhTzGXfncRxkEfe4xz2A+ormLCwKJ586NKpiOQuA
    WB54zxyATzx1re8M2P2Ui+jZ3iiYysxU7otvWUL1K9mXqAfpnnqS5jV01GLNPxPo8hvp1hZo1nHl
    l0GCGA+U+x5I/I15Jql3I159kVQ2B5cm7oxyWI56EMWH5fSvZdbvjMQygskyGRXDBQHyAVDjvypG
    cqwPbv49NNKyXkEkbpLcvtuFkA+Y7gRhezfKMEZxlhjvVYdWbMKkpOmkjJjtxOg2s2xSN6BdxXP8
    QBPP5/0qtJBh1iEL+bjaY+pz0HHbj61szwTJbqQJpJklMavgKnKg5DeozgjnqOnFU1KWUhuY5/36
    yFQV+Z846jseD2/pXamckoJkFrYzyIyqIVbAciSRVOD6Z79K1I9Df7KZoFiJRTcbdxDKoYLw38Xz
    H/x3illt9VOZ4tNmhtHbKCQMQQORgtzknPsecUlmNfZliiUgvb7I45CF3Jj+HPYHn6+5p8s5bEqV
    KO5UvYgbxJb3z/JmIcFjkng557nOB69au6fHqS3dtBpWtXMSzeXHuWdlUFgeMDtxjpTbxtSa1mN7
    bSRw2sjHcsW5UkYjIL/w5Oe5GWPrWYZ1tpob22IV4jGwXHBkGCfwqUnsXeDWhDa3s1jIGVt21dux
    zwAT6Z6eo9zxzXovhbxBLd281hpwVtTcKttPPjdaqxCGNZGcYXpjAJIbGRivN2kWaUysqqHyW4OA
    Sc8fnVi0MewCAz+Y2MxFchuQeo6gkDqP5UTgpasmC1seiaoJby8msn1Q6k4AjS6W6cbY8nzVRQB5
    ig5A+meRiqGsT29zo+oyWUjJBYlLVAgIaGINjeRxgu+Me30qrBYyOsEt1IY23sYo4nHmB8lgCeik
    g+5xzjFNv79H0pGfdvutu8sdzDbnjJ9CG/MGudfEdcqdos5m0jYLOn3vNTepPJxnv+hqxpDK0oOS
    Wgt5BzzgD5gMZ9TT/tjpaxCK0lRZ33TzOv3gDtUL6KP1INGmwKb+/ib7zW0jDPbAzXTd2uzhsuhb
    t4WkvGkGxLnYAoZgEbOCDz1GOx46eleyfBjSGZZNRjlmXazBz9oVlYszZVVH8ORnc2c4G3AJNePx
    QxTS2sk0TyIIY8qiFix6AAAjqQB3/rX0N8IYFtvCKn7OEa4czrJHGAjoeAoIzyuCCDznJ6Ginq7i
    quysegr0paKK3OYKKKKACmyZ2Hb1xxmnU2T7jcZ4NAGVo7s8sxd977UBJbJHX5epzj19616xtIjl
    3PuWSNAFIUqAp68AbRj8K2aGAVj37Bbo/OwO0cbc1sVi6i7LcSYB4QdKANhMbRjpTqanKg06gAoo
    ooAKKKKACsrxHZNqXh3UbJIllee3eNUboSRgVq1XvGmW2la2jWScITGjttVmxwCcHAzSew1oz421
    TRPsjXDyzM8gbAj37i0pOWQ4H1JIOBx6isyEPcXdx54LSOvylSduR1H5V2/jbQr+DxHdWsCLeXBI
    kc2ykAHkuFXPyKDkc9cflyy/ZbG1kecq1zCgWKE5yXfqx9lHH1IrCMuh0zh1IdIOL23hVgso3Qgs
    MgAgkHHc54r0L4R2v2/XLq+lZhPFCMMpwD8xyMAew469+nTzp2SDULK/UZi3qzD27/1r2P4QWX2G
    41mMgtD54CsPbp24zxz7VliH7pdFWu0egtbzKyM4VunACkuo7ZJPPT8q5/Xw4kGEdlQA7w6hc8kd
    s7jg5x9BzmuwmKPJgwksR82RgKP6+uKqvpwmcs7MQADycnv+HrXG42Nozs7s8/NvHbM00kTxSSOx
    BdixPJJYgk7uv3sc/SuG8VXcRJhH7u3U7gByZ2OOpHQAYH4V7Jqdk7RN5WVx1AGN/rg9j+H581yN
    l8OjfXLX2okIqMAsSr0GTkY/Hv6cUoP3rs6IzXLe55xHPfXE9pZanBKNHQMnlREoHb1ODnrz6Zru
    Z9GWfR4orIBRCd3kEbFbcpyMfw5zn9cYzi7rGiWVvHi2LLIflj3Z659Pm7nPI4rDuLa6sws8d4wl
    HDspxg5yo9sdB0z0611U8TFK1jGphXU96LMe4jtHubG0udK1IajZoI4/KOwyp1AYHA6AgkcEH6Ct
    fSbddJ1V9S8RI8dzcb1S1tyGkiY7VOV7YX5QD1JPTBxYvZoRZAfaZDczL0d9oTOOCR1OcDnPPpyK
    p3ECEM9sVV5F/eSygZB3YIYcceueckc1rLFp6GcMA73kzn9Q0u91PVZb2CDypi2AoYLgA4yewJ6D
    1I47V2mkxSroazahjzowwxH8xYDJzx0OTj/dBHeqVpZXG6WZE2mPG+Mg/MOcDBP+9jvzk4yAOit1
    OpQtGAq7VIMLSMzD+H5jn8OCSTziuKrUctzvhCNNWiZukzLNLEsEEsyoq7zFhhkY4+QkjPPUH71d
    Kn2aC3WRInimT98yBCHwgzuRcfMwGcr1KgjkD5ckaGsbgumVfAVmbDI2RhSR29CPX8uw+yQX1pAJ
    EIlt5BkuNzxqTnIzx1QdudhHc1nFXepNeemhy+oacJLV3hu7WOyiJW7t/LZY2OGU7WPTqcdh6suA
    PNNS0+aO4ez2TSbXO2UR7yct8qg9AMA9c9hgA167pkt5Oq+XNHOPKczvHlgDwwVicbMbm49CMdM1
    yOo2b3GoSTQiQJEVZVkzHLHgk5GOoHQjpgD7ua0hLlkTG7izmbvRIrDR3iurzF5OUE1ijbvJQc7p
    BzsxwOmQDyO9ZekgaVqzXM1orvFJ5ZiAGMNwCBznoef681107wxRrNFAZ8xMxu41DCJFO3IC/wCs
    YEnJJJIBx1yMXVtIMsbBf3W1Tgp91A3TB/55tng9unrXRCrYidBVI26nZ3Yh8QaUklo4kuYi3lRv
    xuBCqyYPPXoRx0JyDmuLknsPt1odR06+Gq2qeViN9vmgMcBh178jB/LAqit9e2+pZu5GjZ1jilxn
    LdV49PXPH9KfbXer27kR6qyJG5kMk9wFZiGIG1iMgH8c8etdUautzilhZI6rQNM1m7ury+urWWO2
    uSXMUybUlYkEDDY+UAYyeuB36+d+NIrG311009ogAuyWONdvlupKsCOmTjPHFaM+u61cNIJ9Wkv5
    LjK7IrgsFzjOQABnhfYbR6AVmWuhNO7gtG2JAh2tnHysSAfbFOVRJChQk3oyjpmnG++/KYI8lVfY
    WBY9sDn8ga1206PTZTALyGRw3lBLdiDIOuWf+H6DnHUVBaWcsVyf7OnlDgmOQbRnBHO0E/N344PH
    5dBYaWzoSqxeU5KtJDACf+BM53L0/n2rnqVDsp0rLYrLYq7o8FvD9pDjasQIRGA+6uep4+Ynp9as
    apDFLAbqPypI8edtRvuyHIPboShxx6+tXWs3ttsUi+RBIrRvEEyFdSf3bOASFwAScYPOemKjuElN
    q32smJmXhUPy5wflx6bsYJI4x1JycU7tG02uV2ObOoyXGoOYkdI1t1SFXHYFQCRyDnk/jVQTSw38
    U8KxkyRuhAywO5ecDjP0+lFvI1vMY8uQpKlUHOAdwxU4bbbxSOw34Ux854HPXsOn5Guq551uhbgM
    v+hwz26RqZFR5gSSoLYJG05P3uABnsPWvrfQreztdEsotPz9jEKmEkscqef4ue/evl/wq0Ona5p2
    pXN6LeKGdZkkkyULqwLBgoLfdJxx19q+rIJY54VmikWSOQBkdTkMD0IPpitKTTRjWT5rkwooorUx
    CiiigApkpxExzjg84zin01/un6UAZukyFtybn2iNCFY5655HPAP93titSsvSYpYpJt8TxoQpAbPL
    c56kn0rUoYBWVfEfaOQxwo6FcfqM1qmsm9BNy6hGOVHQUAai/dFOpqDCinUAFFFFABRRRQAUhpah
    uZRFC7kDgd+lJuyuC1ZwXiW1tbbVpbuLPmXJVHwxyy9WC478dPb2rwnxK+l20OqT2stu1/JLGFaN
    twIyzNtyORwuSOM/p6B8Q9X1NTLb2cfl28SK7NgFSCOecHjnHY5WvMdT0y+s4Y5b2PAljKtvXJCt
    3+oODx0rz6TvNyPWnSapIz72NZZbi3WNFDkyx4PGDz/OvZvhH57+EnvblcGe5ZVIQYKIFXPP+0Dk
    +tePeVJLKpcBTG3lExgY7AdT7A/jXtfw2/deA7KO3JDFpSWOCH+duSPwxjvjvmrxElymFGL1O6Mz
    SxKqgADBYsCxPPOfwwRn17dKtRNug2kh+OTwPm9yPx6VnQDyZA+7c8gyCuSeMDOOpJGeT/StGLLF
    Wwr4OAF5yRkY9v8A9dc8WKSsNuEjaIq6AoBgjvx1qtb2qNGrOhX5lMeeQcZwcA8dfr0q6pU7t+Ax
    XktjkY6/pU6JklwuAONvTPf+vaq5E9SeaysYNxo1tK2/a+VUDjPIxxk9fbrXPv4MjnfdgZ6ru5GR
    9Og9B1Gc4zXexIQGYqeOOo5Pp74qIxo8qszBdhKgLx+f5VLprc1hXlE4GLwgoVhIVXOFGBuJHX04
    JGc479K0IvDVtbrIRFuEmGP8XPUYz+JGPeukMTFnZQAxOASOmOnXPPXp681K8auAVA2g9h+X+fbv
    SUEX7eRzy6XaRDgDcTjG0Dccenfj9fTFSxwpHKyncYxkBAMkY7de/X6VPql5Bp9xbo6krMcDHJXJ
    x6Z5LfX61SuLiK3sHlO8gKGWOJuWOB0J9cgg+/vUSjqXHmlr3JY9NE3nCVgytlSMdvf1GM/T8BQr
    WkIlhZvOvY43a3QOFd0xjbyRkc8E8dMng1yV/q2qXMg8iK6gs7c7pRp673kcH7qnAG0YwScemOtb
    5vrfzkFzP591HxEeY4U3cnLkAngcge2e1VBdy505dRJrCS6t9ljPHaWNs4mxHdAuXU7t7lcgkED5
    eQOcg8Y4/XpYE1wy3STGVkUmS3kPnKcY2bQMOP4lODxuXsAOqubi2a2ZrucXdqzBZDEhSGFWI+ZU
    AO84PU5OccEZxxGr2pj1dWVoJolGz/SSdo4yvIO05PfpyDwc0paNWNqEdHcLK3lu9kmk3we6Qs09
    kyeWUcjkhOAeVAyDjGeRk0+O8tmvpoRbXNrCBlBdKP8AR8nad+P4HIORjj72e5ow3EKeba3iQWZ3
    K0TxKVZJBuO8E8novf1989BZ3lxJPHFdw/aZrS1f7TfELE6EANIADw8ZVgcY+YA+gq12IkpRZk3O
    lwfapo5kcJbrat5cwyYwXdTz3XIGD6YPrTZPC8cmqTefcpG9gxilii+aViA0nCjA+7zknGVJyOla
    j2Md5ZSS2pu3/tFUhg8zciKiKWCKGGfvZxnPKgZIrXlI1iTU5BE8M88nlExuuBmIBct3VjuIJBXk
    jKkE1Tdthc0vkcUbK1+yzW9rpYXTgNztFIRKACQSxAII3BsjjoOtVrbRrOxuU+zm7TKyNsn2urZX
    5WQqTuyc9P6ivTG0+0vYLWKMywPcacIUZOqMCG5I44OOee3PTNCLw/ttY0mijkMi8xtEQkc4G4/L
    yVzkNjIBAPI6DP2kmVHlTOB0bw9qM1tb+W1ra+YBIJXVZpCSTuZVwcH3AyMHmtW90yezWV52tluU
    gKRTXEqCS5DAjDQ/xZ525zk9e+Oli0dtQtLp57dZZ7aRJUeaA5MeeQS3L5OeSuFHqeuBqOnDTJZN
    Q+2xtp8xIe4AZ3lfjKOWJIIA9RweABwTmb1YaXaQ2a3up3Nw9pNavcwL5UDhvvqn8JXnHBHJztbq
    ccZN9b6hZ27XF2rW90iEjcEUyA5+X72GGSxzjOenpUNxqUjRMdOnkFs2VaRkf943CnCnnAxgKAOe
    nAJqneXDSRFmkuIodxNsGAdnLbsvzyOuMLx8wHOONIxaZEl7pzaOGn37RiRV7ZJAPp69vxrQ0mzi
    vbkSykGKHDyoCfu9NgwOvP6Vm3O5l+VzGwyDgMxXHTnk4P6Y9Kr3Fxco1spdVRUGI0fIG3n5gP4v
    r611cra0OJSUXdo7zQdHvZL6PT7eGa6uZJ0BMEwGyMgbwGGRyCwPpjngc/UMMaQxLHGu1EUKoznA
    HSvAvgxdRw+LRY3LzSSm3Y248osse7DMCQMIcAcng5A69foACtKC0McQ/esOooorY5wooooAKiuG
    KQOynBCnmpajmQyQugOCwIoAo2urW1zOtupkMpHdMDI6/wAq0RVeG0hjKMIoxIq43BeferNADJf9
    W30NYRWfYVLPwOB8xI/8dFbsv+qb6GsL9712qBjoI1oA3k+6PpTqan3RTqACiiigAooooAKz9Zk8
    vTJiULbhs4XOM8ZPtWhWB4muRFFCrEbA29l3EFuw/U5/Cs6suWDZpSjzTSOG8R2yX9/BYRE4MgeY
    5yNkZ5Bz9QPy7VjeNtMS40I5w7BiQe/YYx6kZ577KkW7klvL+8QO29hGqqn3UTrgdSBnGOnT6Vha
    l4xvLVIXgbKLjDvnkkAkk+6gkfQHua8mL1PbdOXKoo8ylYSfKzP5oUImfvYHAxnHqfpXqfw4vPL8
    L2aGRi673C46pvIPPfjv05Oc4ryu9Ek9yPLTaw4KjHXv+Hb8DXofg28D6dBGckIY4NoJGzaNoJ9O
    cE98sa6az/dnNCDU2mesWN4k8q73G7um7Kn8SO3P+FbSPGSUAY4wSCcY56e54rjLCcWpZyisqAoh
    JySq9sdOx9PrW/aXcbKpJV/mDDPJyemBzjj19K54S7k1KfY044yXBSbdFxxjjqe469R+VXC44jUj
    cB1FYkV3DFjYNqkjhQcZBHT2yalimG3zYI1YKNu0rguM8YwOOfatlJIxcGaaFY3y7Au44O7r7elN
    ePzVBXjaehHHqcCq0UbOwllYAsv8Sg7Tx3/z0zU8cqwxYLFwAcLndnFPfcm1tijeytYxGRQWWMDd
    2CqMgkD17/hUEl9bRXRgkmUSLl1Krwq4OPoPlbn0q5JcC4EkR2OmwiQA5IPp6f5Oa4rUjm0VtxEk
    EJRi3XMUi/rtJ/OsZO2x0U4c25F4m8298RiGKXCQrhgCDJtKlcxjPLAs55/DkCsfUbi8/tJZru9g
    s7CeDIjlYoYZB8pVVAJGAu3qMbuoJFLrepPZySYgCXZCtE4UF0DJgbX6t84JyBwCRyesFnYaxbpJ
    dTG1hieQtCbzB3dSxIyS5Kn/AHsqM5wciuzqirJMfaXUaCWT7Y9tb2ccb/uGdxJtXOxNrgMCQRjI
    UbiTzW/Esd+BqKz3cqIhnETXbb4ycbkwflBVjGF45BDcmsC6v5Z5Jlu4lubTf8ltFFgStk7EVSc8
    lSSzDgCunvkmgltBLPHBPcOlvJdFiuZTuKRxrg4C5Y7j03dyONYdrE1N07jbnT7L7Gbu705Yp1DF
    xbOd0ceCeSfvHAOe2cnnBxxF6lvFGot3ubSOSQpG8zlwflDHgNyPmxyp5OPWu11ma2it7KRri4hV
    YfJxH0Vg2xyxP93r/wABriNXlku4FmuF3OsKiODkLjJAwwP3mO8+uQvrzjPSVzakrop2scktxFb3
    UqXVqrE+bbgTyJ3GUJBAHGe2O1b1vHYf2k1q5S1a1cs8M0XmIqrkofvHZ1yM5Xk7W4AGHqWk3+y4
    8+8iieOPzXjmjaaWFeu0kZ5xtzj19jjU8MvZajYp9puM3cVt9naYo0bJCzbQ+Sc8FozkHgJzVR1W
    oT02OhW0j1G2k8qaFA1r+8WHKpGWBAkKnBAbB6YKgYxjmrEojxLO8ItLm4Ty55gSYy6ZwGIPysec
    E4+YKQTkioLJLWbS498UjXOfOaA5leKX1HYqeSDwCD82D81PsLyw1mcMwuYS1u0DxSDHmEjdt2ty
    QRn2YgdSeZd1uY2uWrSwtraaeYBJo3ki8iS43LtcqGXpwV3ogAwCCT3qvJKVmurS1aOGKR45okuY
    926TcWRhnbnJDDPLEgccGo5Yp9tppLWlxJpqjyWCxE7woVkYEjgZGAT05zUUlpGZWN1dCJnTa0T3
    IWSNlAdmVlBAweg44x6gVN+xfL3HyXEk6JcJbtbXDStCyzxqrRliQULInzIeDghT0ODVV4YodOmF
    2sKXiSeVPLPNvjZx8yjjGwNucrnocqc8Gm3Nzc+SkySXl3GU2l42VSI2BwXUhhs6ck7eh7Gsq+uL
    /TLCTT76KW5/erGGzuWQEfcf0AwOuDgLjB5oSuylDpc5/XoWsr+YzbIgWTYtuqnBxnaCvU8Z+YcZ
    5GemPfutqjTt5f23y2I24IiP3uvdz3z0/levLxzvtomV7eFzIS44Jyobbyc4ChfZR16msa5tvNmv
    pFaFVB3qu4AqARnjHP3uB1zXXGOpjOVk7lWAol1G94pAADTbiR5oJB5yOh47HrWpfLFtsoZI4WYO
    zwORgsHK7t+eoAUnHGN3HFVfOVJLV22vLNgRyu2cAfKCQOQeAOCD1qW/lkeATxxGCaCQbNkYXfzw
    2SScZBx+daSbT0OeioyTuepfBqLT7bV9Qa5aL7a7RpbxpKXORuDNt4I4x83TB69q9yFeJ/Bm7D6x
    csi27LcWyDef9aPLVRgc4wd/p27Yr2ytqDvA5cWrVWLRQKK2OYKKKKACkNLSHpQBRsH3T3IJbcrD
    O5ySOvYgAfhV+qtozO0hYscNgbgBx/P86tUAMlx5TZIAwevSsdo/3efPjU8/j+lbE3ET/wC6axD5
    vllt77SMcggGgDcT7g6fhTqan3B9KdQAUUUUAFFFFACGuU8WNiOUs4ULD8p6Fck5wfpXV1xXjXlW
    GSdqglcHpz+vNc2K/hnThf4qPNbpvL0O3hnlYTPGZH/d5A5zgY5BA2/MDnOeCDiuVvXmvbsxRRKz
    OzN90KWyQSWPB5xnPr09a6XUZZZMyngRoBIqE4BC9uOpOOB1yDnFV/CenItzLfF4wsTY6DBYkDC9
    lPB9eeuK8+Ktqe23ZXL8PhCzn0JYdQl/eypIBIqfMDgBMAHjHoc5JIxTfDWlPpehvHcGJ5muJMlm
    PJBK5GecYA9uW/DsdFCSnypkhXbuztOOPfBPvx6daxryQrcXKBHjUhtzMPmxnJ4x+P58daHJuNjl
    WsrlWa6aN2tgzlFOGG0grxnOenGAfoR9TL/aMsEk0jyq6TADG7G3Octj3A6e34CnO0JZVTcUx5eS
    p4Ge3THJOKqtC3m+dtZAiYBI3EDHXpwe4+vHUYyRskmdhLqAw04ZyoJTBYA4HUdM9/8ACtm0lDxR
    sWBkwAVI/hyO549ePfNeexsZDbhl2Nyq8nDDHUfhj866OyvGCsDIXyCW+bDHpz1z0HbiqUrMidO6
    0OxjuAyMqlMZ4J5B4/UUTXaDbk7WbIXB5PU/yzWNb3KhXcKU45URj5D14xxWDqOrM7i7hkDJFhke
    NctF747j1HbkY5Fae0MIUHJm/ezvayM0JYJKCJDjlegDAdsZ/L6VxE2ovBK6ai+Z0mkBhCkiZSPL
    Krg8Da0TZ7c+lad74ht5RbzBkzJhCA4b95jdtHGCCGyAeoxyDxXIa5r9luujMGlZI/KktihTzBtb
    DZIJU4YjoQCoz2pJNyOmMLR1QWMw1nW4rR0M8FqvnSQXCAtHGDnahGD1POOwOMZ466yvrueyuJJr
    9EtY5jHK9yR5Z53IwkAydvAI+XHOSCMnyfwxqcNtHqV3PdJHdLEhjny3nld2H2EHG7p1B468VNqn
    jG7up4rqa4nWSGLygkRKKFJx0I/u+x5x9Bv7Np2FJqavex6jpd8N13qVtHc3bW6iG0tXj8tpZRuL
    HG7nBZifl5x34NMj1KYyTAySXj3IjDW1y4hkt2BIISNjzxvYseeRjI6eUHxrLcTJKyKuNxWKNPLC
    u42kR7eg4U5PPH0qzFrMlmbW68wzW6XCzbSxL7ioGD/wHIH41XJKKsTBU5a3O01/xALw28zhJY2j
    ZpAVyPORo2bAPZgpaq19qAgv4HgjhMIlKxRq/VY2dgeh4BAx7qvrXAveXV/FPZhFgiJUyyzsVETg
    EAk9t2AOev41kXGqyBFDyMGO9GAbOFJyf1P6UlQcjX29OCfY9bTUFXyIrq2V7xr1mkXaXZSNu0sM
    jPzMefqe+aYiCfWLiKGcXDPncrnDl1J3svB5J56EEdR3rzNPFty2qx3ighk27fn5BCqpIPQZ256d
    62rPWYZDZ/6ZDvtJCY5JQQ0eSOVOQGxgYyemfWonh2tQhXhPZnpul392bZrjaU8xATErOrPHux3H
    HLNgADPJPAGdS3nF05MsnmzMPLDE4xwdmCfY9euQemK5yLUXltzdLO8kgbcWkjOCCeWwwJ6Z7jgY
    GKuCVmmnnupwZC2bdFIkMpAKjeB93ALHI+6CD2rlTbdhyj1Lt3bW17JJJCrWxAjz5R2pIu3cBxgq
    23PJzk8E9KpiRdP1A3ImuDDcSbykY3rG0gOGIBDOpOdrAkqQVIyKhuSs9pHDFIkSTSYjO7JbDDBU
    98YbPbnHcCmte20jrc3cMDmKZ5IY5AG2qduRjPzNhV46ZbkcGnHUOV6FTUFNykNymoLp1nKzOESL
    fuVCCZCML5Y3cEnnAOc4NcfNqj29nGrz5VnaK25A2R56Eg/dXjGSQOo9KvC5QzyiZXRido3EAMrE
    bst3OC2c/l0rEuLi808mCZfLaVEVRIilPlzkDcvHPH1+orrpx6ETlyoy7wkzQteLsdQ8TFBhGTOP
    k9QOTn2qRpFjM+Uj8yNgoQqW835QCB7ZGenp16hJLiWNJre5yitbqgy27cQwbd17jP4AVWhiExE0
    bTBYBsmnTIUDOEO7sSMjp2roRwzvyjT5+5NvCyqNx2nAPoxPXnPTkit2G486BLQu4t5ZuAy7uSV+
    UHqpz6Zzx2FV7exS7tjAXWOKJUlnkYfcGNp7Hk5z9Bmq3hofa7g2rt+9BDw7lJCuuCDgfr2x6YqZ
    O69DSlDkkr9Tc8ISy2eoqwvJbP7HKxWWKHzig5DPtJAGFJO48Agepr6viwEHzFjgckYJr5o0K18v
    X0tbmJTBqF9bBpYmDqFEu4FGHrnB54zntivphFCKFHQcdc1pQd7nPjVaSHilpBS10HEFFFFABSHp
    S0h6UAVbMY8znjf04q3VSzB/eksT854Iq3QAybmJx7GsQCADG9m9QQTj8jW3KcRMfY1gMDtLbVAx
    94uMfzoA6BPuinU2P7g+lOoAKKKKACiiigBprjvFjuLxArZATeecY7dfoT6812VZOuaa19CkiAF4
    gxC4yWBHQfWsMRBzg7G+Hmo1E2eR3EBzJDNJ+5bOxF44wOFJ78D+7x29Lml6WbSFpVkaVldjJu42
    nAGMdCQVOD65IwKs3dlMJliRW4bd8+BtGeTt4+b19CD61cfybC2LuihcYYg529D1715Kk+p7EtUk
    itZzj+0QE2BmO4cEBCMdDgAjp7mo7wK0hMgkQIy7mRu7Y7dCP854rI1vW4Y/DclxafNNOSpLAHJb
    5doOOuGOKv6PuufD9rcOwbfEuGKglSFwc45z8p+vtTexLi0M+zwyHMMZZg2VKv2GCSB0J9fwqDUE
    VBJGrFWXbuQvxkDAwfXjJOAOntm9CAhlxJwzdAOQemdxz2z/APrqpfn5ivnYgdm2xr/Fjvk5wRkD
    HepuUtzHFsyqzSuVw2Qzx8j1x+HQGtO0eWTcU80GMAqu3r6ZzyT6cdGFVmhDRBlbcBwm4hty8A5A
    +pz6FT15q1ZwTW28sVRdhAIxgc8nIGcYwcfl3oLbVjRgu4o2ZZJVjJOSJvlPTHcc5OP5YNZt1Jsn
    a6gdfNG1tsLBg5HUqM9sE47jI5HS9LPJBavtmZVJPlycZ3N0Bzxj3/wrI1SQXVsE8hIb63xKGjUR
    vlcsGzwcdD7kY+pbUSdncxZmmigkbTraKVZX3NGZMr97duXPuTwemT1ya4/xPdTGY2sjE44heTKu
    qnsxPbp19R6V0P2h7XezW0SqZPIVmOEZVXBJJyWbheOp5wOtZWk2D6vqcs8UEhhhDAeWqs0ajIyF
    YYIGQccdcZFdVK0XdlVJNxsijomkX8lncTny4bEIUnnuAfLAwDkHrnI4C8nnqCaxb8RW9zJbR7zg
    YaWQfM4A4x6D/Oa9blshIIlvFeRTCUiaFMFM4xiMAKnzAHPcNg+3PX/hm1uoDPHGnyIGYggFTzlX
    UYKKeMexrWNZXuzllTbjaJ5tHA9w4Ib0UEDGOOBVi2uZEtJI2JMbDYwPQEcr/UfnXUf2XcWUVuY4
    8SJvEuxgocZBUn2IJHPv6Uy90Jo7meCCGWdZwojRQfkBG5WBGenpjvW3tUzBUJR1Ry8s9xNGMyDY
    55weg4698cdPaq7QlyWByOcZ711f9hTxeZJe6fdRWMbAtIITGAD/AAgE8EnHJOBgVUubCS4kleGx
    8mHy94ABUY4A98D16k5NPnSE6HMtTDsLGfULuO0t03SSHj0A9T7V3Nh4Vn02GJb9I0ZTvdndXTa/
    Hy4POCo5JwM4xmpPDejSWEc108j28DMiCTIU7wR8q5wSx54GTtz6jPfw2K6jCyBoJZXHRjgsMAfc
    weR324J4x6VzYiu9kb0KKp6sx7N7SNpbaOR5J2yqSxThegJAcAnvn8mHXrcmtYZpPMmRzLcyqkri
    XJXkfOuOMdsHGG64BBpNT0q1tP8ASIBIttvyYzIZB5nOOSWAGcZzgjBP0IHnW3h+1TWyjPDFtwwR
    zyRuA5POcY9q4G9bna9dSGG5ubm0vWG5JIXMaK0aghQ2VVgPuvjBGPlPTOT80Egt7xvtf2QwpJOx
    eHyy7MmEIGGB5JJA9CfallumuJbgKyxyqpJkCqylkXJw/BbpwDnqBmsbz3vEhhFziMkSSYyBH0JY
    5I5A565+nUawVyDO1WSOSXEMkZIbYoiQgs3+yONwyMDGccdyKhviY3Eu0zWaSKrMF3KwA2HLDIyB
    kZGMn1wKdeXE19qc0ttBDHEsjBZQQGVPlC5ZiBnbnnBPzE85GCDTrmC1kmHmNbiIiRkmTDDOOSME
    r06E9evWutJJHNJuTKrrAixyhcyxkFERUIMbgjowIIByMdt1V7h7iVDp6RNawx5kZZBgbSM5PcA8
    EKeMkkVJBDHJbpY3cZSRZWYIrBVEWM4LMflw397PWnTPaXvlGeb90hAlG4bmPIVA3fuS3TJ9qu9t
    COW5LDcYtZzMhijdeIk/5att2rn/AGcc+/PqKzLWwvJPtdxYwzzKqsrtGD0JIOcdBjr+ArpNNktJ
    7Le80ufM2ANz5pCseTx8o4wO+CfTElpftpjCOO2ZZC7XEItmIZ2PILEnJHA4XHTkVCm1c6ZQulYv
    +BPD8cniWximeSOXz4iJAGWFZlIJj6YLkJkHkZ619OA5zXzNpt2NU8aaHDfyS6hG98u6EwMkaqc5
    OOORy3A9c5r6YQYGMYrooaxbPMxuk0h9FFFdBxhRRRQAUh6UtIelAFazUqHO5WVmJG3n9atVQhil
    JRuYwFHbk8njH+fwq8OlADZQDGwPQg9axmhPlbTPFt65Erf5NbMufKbHXBrCN1IYtoYn3GKAN5Pu
    inU1Puj6U6gAooooAKKKKACkIzS0UAcb4i0sWzxXKKZAzHzMhBznI7ep7evJ9eU1iW1ntUB3KMbX
    ReGAPBHt3+teoajZR39q8Mig91JGcHGK8fvcaJdz2eoobUg7wGIZXPOGUYxj169Rwa8vE0uSV1sz
    1sJU542e6HQaY9nZtEwQmUD5WyVOMAnBGQe5HYcDOBUjOyyyIkrqItp+Vdu3d0O09MhTxznH5Uj4
    kttqKbtLsSqVCQwlVXjdyxxwOpHcZ57Vm2Orwaz4j1Ke2cLHNCjqUAzEy9MZGfVsH+VYtaXOltt3
    ZsQ+bGJFfYqbQWKYZeeTz06HnHv1zSIdxRJU2l9olyucnuSR2z1Hbj2qWCKRN05DZiXd5eM9V+8D
    3I5GQM5I7UBhceZcLK8ZA3ZXDEAnnGOnAUduDzis0hOViosr+YI7ie4XYzH98RtRVJBJXoMYHQ47
    gc1bEcpLRMQkyuMKSpYZPqeMnrgnGST0HNeNf3sW2d2gCLOzSRKSYwR85GMt22k5GTnpkVcu2cWz
    sgaKZ7pPLVsjygcntkdNwPUYwcmrS0uQ3qQtcxxmVGijVlASRQflboA2cAbe3bHHAzWVdmS7lOyV
    jsyqs7/MnHMTEnG0hSMn65pyO5viUV1ZZQCjjJIAyxxzzn6ng+1Vbix+2wLPLKttbgCSMu2XUqdu
    EVTk54HPGTz2wkzZLqctqFsyWvnWEU0t3dn/AFnksFjySAoyPvZzk9BxjPbofDFjeaPcx20kNtBO
    AGNxbIC6Lzy5JOckAEYxwR3zVZbCSbU/MeOaGG3AmYA+dcMcHHynKx8DrzjjGa6K3sI723tp7eHf
    IP8AWJLkebnJUhgcs3VgMgkEkAjFbcztZETcepPLCs8sbRrbF9xWWW1Yllyoy20BgoO5TtPGVOar
    3GwRl7uysklK4eVXKpKAOSCikocHtjryCM0Ne3Ra3lVlit3AhZoysIjkD9GYvkEgDbhuSCO3Fy8L
    WTzOlrcai85Z5beUbmZM4zhsDAJAxzjOARmm0Zp6mYLmGVbu1ubXNvHbmFczF0liyBjPQEEYyFHP
    OOCKybgR3MMYChruJVABUDcMHDbgNp4J6nkcgqwweohjmudLi0+WwjWZZPIMW1dsHydGwcgZBCsC
    DwoOeccvNpM91qds1kVe0t7eOWSITD5XLhRGTnG8lAB9eetEUVKT+Zm2n9lWc8gK3M0rsC00ZDCE
    4HC9GYAEZxxyOGpltp9tPq0kwvxKsu2R7cxlGKjkBWAC4OOCO1Ot9OlCGfdidWmM0YIyxQqDjsDt
    fj6D0q/ptybK4hh+0xMtxndEp3CQAgh1H8Jbd90dzkdTTk3rYtRVjfeS2gkhRUcGyBOYUCmN8DmM
    HghScHGeckk9RsQW9qk9u8KR+dcKUZANsUh5J244RiRyMYz+nOW+oI8KPiSFkO2EQRq67jhVUkgH
    YRuzt565qey1AvFE4MKMzsUVn3Lt+ZRycENg9cHIHbJrB3tqJrUde2MEgFxbpIQVBAdhnbnheTwd
    wyNvB4JIBGYo45LeKaaEW1zsOzaWGAu3cV2nABUbiVBySB6E1Km4zgNciGXLK8QwgkbjJ4IIyNvH
    PTmmRwzSamlsoYwSE5XciBOuRuA4B47jOMDvWbVtjRS0szKvLi+htJrC4kgktGUpGScGNRwA7dcF
    QMAnqfxqC5ltdQS4R3EUxPmoGUmQjI4bPDL7jPQDpVidbgzPF9othfSSiCQRgMoLL8owOCM4APNZ
    QtRp73G+MSkXPlSKse0/KgJI4GPmByDx25xW0VfcTsjPtpdNScIyAiYNGshKvgdmz3wTkqADxz1x
    SXEU8V025mkeMxGPzACCzqTj0xn8CM1PbxOsyTRyosgQsB8hk6HDYAG4DrgkZ7e9KU/vbyPyWTb5
    Ei87lOHbJBPOOTgHkdO1dC1MWtSS21G8/tJVs4FeWdBuVIw+CCeAGU7enTsDmn3CTXzwQXeo217f
    hsiAhY404yckAAnpxnv7VTN7PaNqMLMVtgZMgAcvtIVSeuMjOKpQAJeqX/eL5eUIbBORnHsccD3A
    9TV2sJLmZ0FtZ6lAUOoxsiMJJldSGVwAvCgeikcD+tQ6Ylrb2cbSCS7nY+ZJBboHGSPl+YkBMY6j
    Jz2qzBCkmFT92WiZpCoYCVCMkgDkNjqoJ5x2rTtrXUdWkh0rRJYoZZWMCh/3ZZgpc4kAw2VXt0z0
    rLW9kdDtGPM2d58K/CTXF9D4uuZ1fAlit4JFzNEc7CXfPJwG98MOecV6+BiszQNOOk6JZ2LeR5kU
    SrI0EQjVmxydo6ZNalehCKjGyPBq1HUm5MKKKKszCiiigApD0paQ0AVba686aWMrgpjv1zVusCW2
    H9q2NwHYK5K5X1GSB+Nbw6UANm/1L/7prA3nkl0xjp5Z5/St+UAxMD0waxFSRsqJI+n8W0cUAbif
    dFOpqcKAKdQAUUUUAFFFFABSUtFACVznizwvbeJNMZSNl9EjG2lBAw2OFbIIKkgZGPfrXSUhHFJp
    NWY4ycXdHyNqYu9Lv5bW/gnju0JK+arAsAxDMp9AVYbhxj9I/DM1zZao+oC3ka02rFMyJkR7yApb
    sOnGTyfrX1pPY2tzNHNPawyyxZ8t3jDMmeDgnpkVkeKNIt7vwte26xbCqCRPKVQQV6deOgx9Onau
    adBKLsehHHczSkjzR7t1dJYo3kDbHDBd3Bxjvzxg5OBgDPXNMgc3T+RCmbjYCpjj+UHH3xk/Kc5G
    DgfNg8ciKEiCZX8t18pSjIRuOf7qjr09MDr04NaDTxLZ7gilWYvLvRljRgcfNgZAyTjI4PUHv5sT
    qk7lqGGFA7xTtI+TI0ysWDE7uhHP8JAGfXHoYNWg86GOKGcmBwvlrEOSWwwLP0GCu7PcD03ZtpnD
    TW7KZFfbgADJDfPk84J6Ecg4H1NVrFIGWN0BWNyqtPtCkDhU5O5+M8dOcHjitHsZrcxTl0DxxztK
    0oKoCcyLgt8o+YjPoB1U9M8359Ja/kimkCoGYy43lSCDzgn7xIwCSBnn8Kc0kkE0KFJI5ZAwOVyw
    AwQoVchuo4GeB377ttOwsCihpVAI8w/NuJzuBz3DZz+IxWL2Oi76HOvoSyJf6rNfTwo7lFYICiIB
    wNrAggcn9TSXEpexknj1ArHbr5PzJthjPAOwx5KklhncuSQMkgVb1rxbZ2lnEkSCUCMiQlt6KG9M
    jDA/MOCOvHXnya+11orlmgfyndQrqYEbHJ+7lfl59P06VvSi5mc27XkdrrHjBTZsr2M6JIDi4aRZ
    lZGOWQgKAR3H+0ARg1lTeJhamaOCfyIpWjEiBs528ofXb0OOnT14461a+vJXNnDNL3eRV2DJ/vHO
    Pzq5beFNY1XfKHtwkQyT5ynA9tuc/hXT7JLdjhU/kjcvf21JO6yXMhusTMkdqmVJUDAJlHO0HGF5
    6dq6O1vLhLSSK5fe8xTbbTHfFGQfvS5yRjpyc5PbFcq3hnWtKMRVJhJcDCqRtO3qWwfmA/2sD60i
    6VrV5bCKMfJHtYRbz3yFbB9lJz2A7cUSinszSHNbWJvX+vWEEytY2Vv9oik3GeFmQSAjDEKQevIz
    14FY7a/b3JWO8F2UiBVFguFjCrzwPlGByRVE6bqsqiQQEMp3K4bYRk8jP1zSDStZS4aPLzhY/Mby
    pwyhT6tyM0RhHuE3JaKLNxPEcELzTWTyoDhzJcsJHaQ46cfTpyNpxWtpHixdJeCGC2EkxhCyRyO0
    m5VH3mxxuPYcgA964C7sb0ou5FaMKXyoGQMZOTjOfrVMzXVpKyq8sUgPzYJBJ9/WmqMWjnqVZJ2a
    PZbPxBpeqTTTRKLaKTloYuGBC8kYKjnHPTHcnpTr2Rp3gMCxRsZVEc+clCSATnoCBz6+5yBXjdne
    GKYt57xNwFIXcR9Dn6V3GmeJI0tVtvPlnd1KbzEQB9R/EeTjjqe9YVMO46oqlUjI6NzbQmEzW8Vy
    4U71eLzJDhiAWYnjpgcZJrI1GVYsvFbxR3Eg3eXwE4/njrzgfqaneSfVoPKWZAPOLzSGMEQbgcgn
    1OeByevSq8rWNnELdbOdI3OEVSFE3Ql3Kgtjpx0/nWUVqbWdjGklkYXc6xRvKy/MzIXKbiMsvo2e
    R7k/WqVo9xK0kklzO7TxDggTNIg4wxJ4xjvjr1rVuYkgaQpCTbKxKh48hHJ6kE49ssW4qE6p5EyX
    ECxi4zhZp5hI4GMfd6KPopxxj1rpTeyIcb6kV3a3traiO4VhcXO9iisfMKnHzPn2GBz+dYpT7I4k
    SYyx7cj5SDGQeM9sc9RWlqTyHeLq4cBzgyRIWR2xk7mJ3MRwcds9q9d+E3gHQtV8NnVtSja+vJSU
    Ec0ZQW4BypU/xFlKtuGRgjFaU4tmFapGnqeSWt5Hvkuo760i3rgwskhG0DAGecY7HP4ivV/hJ4Wu
    ptXh8RPeI8NsksDur7/OcnoEZQY8DknuSMcV6DpPw08KaOkfk6RDJOhDfaJctIWDBsk/7wzxgdsY
    4rrlXHIGCetbRpJO5yVcU5x5UAAGMU6iitjkCiiigAooooAKY8gTAOeTgcU+qt3jEPXiVelACrJb
    s/lK0e9DnbkZB69KsCsG4Zm1VA2CqyR/MVHyHIwPu5yfr3reHSgAYBlIPQisqWCCFigGdoBOWI/k
    K1j0rKvInkuTtVyMDBA46UAaafdFOpqAhAD1AFOoAKKKKACiiigAooooAKKKKAA1WvIEuLWWKRVZ
    GXBDDI/KrBOKr3l7bWNu1xeXENvAuN0szhFGTgZJ460mrqwJ2Z4lKZ7a5uPsUcoXGAwk+ZzgfM2T
    k9OgAHTrVeO6it5/MLhJyDtz+6YZGCEfdjryFpdZktl1X7TDKbkNliQymGRNwxz6fdGDnk+lZFpK
    I79o45DbiRVk3dd+SOCOiEcc+w4rxWrNnuQ2udRbv9jYqLdLcqd2UVV5I2glOnQknbtA4HIqO4MT
    zqctvSMq2DvwWLMQD9HH6Y9KoW1+jWuJkkTahVW4Ys+SCQD2znI7ZJHXBljWQaZ5S2oR5Y1/dBeM
    9COc4Oc4HqF65xSeo7WZctGSONriQJEmCZH3he4JBIIPB69iVHU9YryWS408REzuZlO/cxZ8HnHH
    UDHUccED0qmkjPZbmJGX3bSTlWUhVGDx2HbjLf3hVG8uWAEkJaWNyUBQEnd/d4BH3AO/UHOTSsyl
    uYWto1xKbaINMXcJwxIJI6KNpx06kngHrjNS6Z4Z0plVb+F3XlpHkUAoOy+3Xk49OBVuCzuLm6CX
    DzyRqxVcqGwhI6kg8ngfl3xjZWSO3WSDlQxEOXYqTjJ4bnnJXggdRycAVpztK0Ruzd2rmfaeHrG1
    ntYwkUsQbc8safNFn+IZOASMZB47jGTWq1oIpZWt9Hs47KLEAmeHzHClR8yjdsycncdoOTjGSK56
    bW1tmKJAYZCFADsWUn0yMdf9rjBqA+Lrm12KGYIw4RW2gjdjuTwev/1uKpczHdHVxL9oLO4X7RqL
    NDGWhRGSMD53OBngY6kkZHoanm0G6lnadJ1tGu2D3Eki8Q2yY2RqOu5uCcfTviuIvfEsFwVu5ZEj
    uldWUpAPvDncfmGOByMc+3Uy2/j658+4+3zrcszLgkHaCrHO0EkLwx6dwp7YOii7XByT0R0+owaf
    BdxWtubm4NzBJIjSwFfmB59lDYBxx196rymPTLRYI13pM8U7Mw+ZizEjP4hQAOx46VzUfjmS3muH
    JUvgK0qjadoPGTzn8OtYN94ua6tjbou/5Sgz1wHDD/D8KXJJvRF+1jGPvSNu/kt7vUmkucRxxNxI
    BgD5csFXswyp7k+nasi7e2e6ygtpJxmNnuTjIXpkAgAnuDk5XArn5dRlncNvJT5S/wDeHG0j34qa
    GOF59wmjlLEEg7vX0wM46+nTmt1TcTneIU3ZK5fmtFWOVIxbSXEnyBACfL7cbu/B65xTEtUsVlMk
    jDKqiTxDgnPzHPsMjjqSD0zUtlZebP5SOFDpl3UHCIckgenTr/WrFzJby3yTwNutbdljccqEQ5Hy
    n+8evtwKFJ7CnFb2san2h4YLSwBCxCLzoxsHD8t36nHY8H2OSYFvZLiPznupVhkBcywqQzgH5ueS
    MZXjnBIrPvdTuLM20ayB3iIWTn72GO059CMfmazZbhA6oxeR0JRY88RjOfzqFT7jc10N4fZUt5C+
    o3siMxcRImSB67mKjOOpx+XSsm4uGuVZvNfy1+ZFmYO+0YX73tkn/wDVUJaJjIZAxLoQjpg5U9AV
    7de3pUMFyQ/lt8wkXaVLYBbBI/DJH61cY21M5Tu7GnoVhNrWv2mm3TyOLiZYS8aeaQG/IHr6+h7V
    9hWNpFY2dvaW4IhgiWKMFixCqMDk9eBXg3wO8PRT6/eamyCe0t4l8hpMfJIWzyv94YPOPpX0CBiu
    iktLnBiZXko9haKKK1OYKKKKACiiigAooooAKrXZI8nB/wCWq9qs1UvASIOekynrQBUaAG/WZWIk
    DKOVVhjuASMjj0Naq8Cs4nFyvP8Ay0UdMnoa0R0oAbKQI2z0wawEfPCSIB1+8BkfjW/Lnymx1waw
    zbyCLJYknnkrigDdT7o+lOpqfdGfSnUAFFFFABRRRQAUUUUAFIehpa4b4m+LtR8G6JY6hp0EMxku
    1hlWSMt8hRjxgjByoH40AbDeNPDh+2out2KvZyiCffKFEch3YVicAE7G/I186nXPEWo+LobrWZme
    CSdr6RI5t8IeKNygQBmwB25zzWPr8moQX17Jf25gj1C4+2zx4+SSX5iqr/u729epzVE6jHm9uRpU
    VrPLbzOrW5OCrqFHGcADJ6dzSY0ehwW5HgPSbdCdksCtIOdxLMG4AxkAsR17jOOKwLya4j+0W0pO
    GOfMHBxkfMeMdDtPoenfHSJ9p+w2lrHMSUhiZfLULs+RRtXGDgZBPYY9cVgatGzuzbNzKgJRnOQC
    vPDHuG6g+h4rybe87nuQT5FYv2V4ZopY5pSSRJGGBALM74UZJ7AA/h05q/HcxTJcXBZ0gfzGdCnQ
    Z4IHfAUYPXJIGK4TTpbuz2SQzs1r5oEmFJwCR95cg5xjvjII4NdJBereQOZJJRDuw0hQKM8AsRgY
    GAMnGB2JNOVOxDmbd1cia3V5WInjTmXJRsAnHOeoGcEkep5xXM316WvNhZpFdv8AVhMK4zgg4P3s
    DBxj8MYqaS9a3G6Ty4vLPlB85jj5IChQck+rHBPfGMHPgud19C+xQ1qN7lW3KBgEHcTtwcAjHrz6
    U1EFLU211C2DrIqN80e9YzGp2rk8jOMkkgYyDheT6rIzXKBAw+Y4+WMncWIOSVXA6cDuB7A1nWU0
    75WAR7kjAk81QVQDJPbJHJbnIwD65raCSwTuYcRwo4juUCgYOSAG5wSPmJ6449azktTaLMW7s4xb
    vJIQmDtVhGR7feI5H3uh+uMVhOksLDZ98bmZSAduO3+fauii0+7uLU3E0caKjYDeWp284+UdM9yT
    kj26Ukei5hX5Gw/zruOSqnkMf4jkAkZwfl9MVcZqINXOHe2nCGVlkCg8sDwW/Cq7lYZUjVgD0LMc
    gcYwcDiu6i8NOkMhRjmUMI8ZJUh8A4AJ/wD2sfTFuvDGJ3iYpFIDyw5jGOOvpwcnqPcc10QrRe5l
    KjK3unOXagOdu8EAAZHVcDiq0FrNPN5cSlnwWx3wBk4/AGumi0sNExeMpJG2JAx+bbwM/hx9QfUc
    Nm0144pZ49rQE5yseGQ46EZBB+hHfqK1VVbGE8M3qYKRF1ZnyU/hkx39xWjGywSrHtildmDIi5Kq
    xwME8k/Tp3q5FZBVmhtjbtJ5Yly4O8FTnKZ6jaRx6YODg1r2ehN9ga4+yEoYg8DMm13IBZ8R9SB1
    znAx9AZlNBCm0U4eRPa3Vw8jys6zyW+1mAUdB0znvTZIYLgW0JZ8yMYRIMK5VQSMqvGN2BnqSO1b
    s+l2CwRRwz/aCkCK8gcfKFGSsQyMoN3zMeCemc8Yl4u+EXVttMiFJfMQgnGcd+OHU/8AfVZp66G0
    leOpgXeXtkm5Hl4if1x1X/D8DTWMTAdVC7myOrkHgVZIsbN5JrhTeMDiOF228YI+bacjGQRgkHBB
    qjBcLDJGVTcyA4DdMmui2hyc2pp6vHBaXdzbwtI0JcvAW+8oIDKfxDD8aoaTtn1JQ7rGm1nZmAI+
    VS2OfUriqk08shEjys0gwuS3PAwP0AFaWjRiaW3V1tx5swjVpOPTgnnjkDkHrzxT5bRJ9pefofUn
    wn06fT/Bkf2qwNrPNM0pYn/WqQCrAYG1cfKB/s5713YqlpSuml2avLDMwhQGSEAI3A5UDjHpV6tI
    qySOScuaTYUUUVRIUUUUAFFFFABRRRQAVVuyR5OMcyrVqq13j9zyB+9Xr3oAf5Ee4HbyDnOetSim
    LNGZTEG+cDOPapKAGTf6p/8AdNc4Ymxkr29B/IGujlGYmGM8GsVt2wruQIBn/VkfrigDbT7o+lOp
    qHKjnNOoAKKKKACiiigAopDwK4vX/id4d8O6xNpV5NO11DGzv5cRKKRGXCFugYjGBz94etAHXT3U
    EDoss0cbPnaGcAtgZOM9cAZ+lfOXxN8XazfatrGjy3EF5payg2jQoAqYKnqM7jg7Sc9c464rK1W7
    134kXsmt3N5BawRt5IUBj9lQgDaigfOzem7JJPQcjnk067keGytpdkUKbXYSYRjnJ+YclepyPTPS
    kBnJe6o9tHbOVeynBCw3Hzg4zzk8g9g3HSmG3uI7W4ht4owpt2MqFsyBAVYk44znHHpSaigjdorV
    y8YbJLHjI7juByevt+HRQR+TZaJZysTJdxTtIW9JUKL/AOgqaBneWzWq2bRvCER1jKSIm3eQoYll
    GM/KSTjrxnqKpahaRfZp47hmcDaHdIxKPOAClxwcKxB64IyehyDDohgfQtMkiDNcPAhKbiWYAMCo
    bPByrsP9rHUkYcLwyW7JEWFw+3EsahRz14BzngYYdMntXkzVme7Su4pnH3MMiySzRBRE48yRCcK2
    GAwPcE4/meazNM1KSw1BAT8ybo2DchsgghvX3Bz0x0rp7uQPbTSG1JacMu7Krng7SD35JGc55/Lm
    5rVZFed4mM5YZUAEDJB6cDkZ4+h7nHRTaa1M6ys7osLemW1WEkbgCf3PLAkZYbhknp908VNbzRCN
    45Gby16sHJwSfT+9x0GPfjNYKSvZXCSorKQSAfUdOAR6ZrXW/hWGSRNlpM44CkgtnOWYgYXOfr1G
    QOtSgZKprY6bSo55pPLsYDHIqokg8wKqx5JbDD+LgDHOcMfr1Fvp7BEM0sbI7d5A7SYxgHHTjPY5
    x7ADjNOvVnvI1jmEURQKoQZOQTkZ4yvA49/rXZosbw207SpsjfOyHGGPbjnBx3zwM9gK5J6G9+xc
    sNKtpZ4VeJXeL5k8xe+CFO37pwOnGASc5rRi0FHvJfPjIO5gz7y+/djcxGBkk4yc9Bgd8w2c5iHz
    MGkYkFtoG3OCD+Ixz6/StWG9W4bCyYdlAJwCD7/17VkmJ3Rny6aYIxP51o6AYZn3IqgHJUAHAHA/
    hx7Vi6vpjRES3saRRMB+8t28zZgZBxjO0KOR0x+APVXZbzTJEQ0bArLEz8Meh/Edj/8ArrIunii0
    iS3md3t5v+PZxkeW24Da/p3xnjIYcYFU3qXGTscjDoUN8FhltnEqYZAkx3K2FYjOOOvAOSMZwM8t
    1HQyC8/+jxQuMz+dJsOdp4ZkBwuO4OOBnNWLRoA1xO5a2sreV5JXlfEWCTgKBgk8/d5ByPpWzB5Y
    Ob65hth8zQ3Czo7YY9HUdFwxzwVx17mtI3uU3bcxE0Sw0SJSLVNRvZjiGR0/0SJ1428HLEDqo7Dv
    yKbOb03M8szvIJ4JIo4iADBO6BFGeiqR0KgAjHAIFS6nrMttK0FnItpcJIqvNIoJkTadpQgnKk45
    B6L6da32vfbhWVI3GIZInOVU9DGx7xk52t/DnFVzO5KSsZKiGK4gIkt1MxwjwplZ1AKdAPkIJBHY
    jGTxWHzHZ3dqm15bYliFVv8AVsCrKc+nHP05q7qSxQ2sRh8zy4zJhAwDD5lJQjsQc/mMVjarPbyX
    pnnZljl2s3loCzEj5s5xxuHTNbU1cyqXiipdWyxpDIsK+amA6odwZifl6ZGTg8DsAe9Zk4eKaRJe
    JATuAIPNWZrpRKz2sk3mAkglFUDsSAOAcelUM735P1rriu55853dkXNOgSaX59jtkKkTZG8njr0H
    4n863dNWKNp5rMsrxoxjLNkRhUy75x1IyBkZ/phQozEx+X7DHU/41rQlbLTr5zkPLb+VHhiVbLAH
    B+m7iperLSSifUXw48bw+L9DTzQItRtlVZ4+AG9HUDoD6dj+Ge2r5C8La5feEdWs9Utd4CD94jnG
    9M4IPPTggg9CAw6V9V6HrVpr+lQahZSBoZVBx3Q91b0I71qjkZpUUUUxBRRRQAUUUUAFFFFABVW7
    UN5Od3EqkYq1VW7I/c5x/rB1OKAHLbkXbTbzgqRt/L/CrFVxc5uzBt5AznNWBQA2T7jfQ1z3knr5
    BIHby8f410EvMTcZ4NYPmHp5svA6DB/9mNAG+n3RTqan3RmnUAFFFBOKACmu6ojMzBVUZJJwAPWq
    upapY6PYS32o3UVtaxDLyythVryj4gfEoWupWNtYy2WoeHr6J7e8EUmXfzMA4OOMKcgjOTkHpQBP
    8RfHmu6dr1ppnhu806WC8twNysryJJuYMd2dqgApjIPOeDjFeJeJNYu9d1zfeWXl3sh8qRox+8mY
    YUMegJ+XGQB054pmrW8OnzO1paCxt452iSEXPmtJLG2Cxbg446YA+b3rD1G+nvdSa6km3XLD5pAA
    N3GM4FIDZfVb1StnaLDBDHGyLDuJC568evXJx82W9cU0TDS9MSGJ0+1zrh3X5dgyTt9ie/4VVs9Q
    iiuI5JoWuOMlhgY/ugjHTpTEY3F2+oMd80LrIUcZBH94/SgYtsiSWiS52y/OmGbAJPHPpV/UNZhu
    L9b4IYHthEsEEj/d2Accdc46+9ZiMs1tcQyttxIHJAz+P61Q8oNcKJy+1uj45I+hoA9J0Fo10uS2
    mkjDRXEqsm5sKc/Lzg9Q5x/uk9ia3rtI5LKyLNtmeLLF1brnIAIHcn9TjuK8+8N3F1DLM8kpl85m
    Q5JzvCnDH/gJb8vTOeyvm2hWtGCxrbndG5JUgMAAM8cq6np6V5teFqjPYw8+ekvIoz2saHejy/IG
    cSLJhVxgYJHXGOvHf5eorNnhdbVLdkeRHbfuPU9BtGRy2M59CQD046OSMyqst0zRTEq8MbE7wwBG
    4gdGxg5ODgEYGOcG7czEu1tIXIwsUZ+/jO4fy47Fu3SlHexs2+U57UlE4kXChUYlZF4BBPTHU85P
    45rFR5I5VAYo6+h5/wAK3Vk+x3OHe4WJ1xIFODnPAByckEDr27VRvbhUmIjf5cAcFl7dSMnrzXVB
    9DiqpXuWLHUAAyylVLlWL7dx47Y9T7V3Ok6lbq224l/eyj93

  • sql联合查询语句

    whoisangle 发布于 2012-03-26 13:41:14

     

    '找到有用户名和证书的应用的app_id

    select c.app_id from t_app_certpolicy_link c intersect select b.app_id from t_app_pwdpolicy_link

    '查找应用下的账号,用户状态为使用中

    select b.account_id ,b.username from t_account b inner join t_user a on a.userstate='0'and a.user_id=b.user_id inner join t_app_account_link c  on c.app_id='2c908d55363d402901363d456ef400df' and b.account_id =c.account_id order by username

  • LoadRunner中进程运行和线程运行区别

    bob123654 发布于 2012-05-24 10:32:15

     LoadRunner controller将使用驱动程序mmdrv运行Vuser。用户可以在controller的run-time setting中选择Vuser的运行方式, 是多进程方式or多线程方式。

      如果选择以线程方式来运行虚拟用户:

      在场景设置时,“是单行脚本,还是多行脚本”会决定系统启动的进程数的多少: 假设并发用户设置为30,如果是单行30个用户,系统只需启动一个进程; 假设并发用户设置为30,如果是多行,30行,每行一个用户,系统就需要启动30个进程;

      如果选择以进程方式来运行虚拟用户:

      那么无论脚本在场景组中怎么设置,是单行多用户还是多行少用户方式,系统需要启动的进程数是一定的,就是并发用户的总数;

      进程方式和线程方式的优缺点:

       如果选择按照进程方式运行,每个用户都将启动一个mmdrv进程,多个mmdrv进程会占用大量内存及其他系统资源,这就限制了可以在任一负载生成器上 运行的并发用户数的数量,因为负载机的资源(内存及其他系统资源)是有限的。 如果选择按照线程方式运行,在默认情况下,controller为每50个用户仅启动一个mmdrv进程,而每个用户都按线程方式来运行,这些线程用户将 共享父进程的内存段,这就节省了大量内存空间,从而可以在一个负载生成器上运行更多的用户。(如果选择线程方式来运行用户,每个进程中会多出几个线程,例 如是53个,多出来的进程可能是用于维护进程之间的运行的) 选择线程方式虽然可以减少启动的mmdrv进程数,减少了内存的占用,但是也容易出现一个问题,例如,同一个测试场景,用线程并发就会出现超时失败或报错,而用进程并发就没错。为什么呢?因为线程的资源是从进程资源中分配出来的,因此同一个进程中的多个线程会有共享的内存空间,假设a线程要用资源就必须等待b线程释放,而b线程也在等待其他资源释放才能继续,这样就会出现这个问题。

      系统需要启动的mmdrv进程数与哪些因素有关:

       与在controller 的运行时设置中选择的是进程方式or线程方式来运行虚拟用户有关 进程方式:无论是单行or多行脚本,需要启动的进程数就是并发用户数; 线程方式:假设是单行脚本,每50个用户才启动一个进程;多行脚本,有几行(每行<50人)就启动几个进程,而不是每个用户启动一个进程。 如果选择了线程方式,需启动的进程数,进一步还与脚本是单行还是多行有关 单行脚本,多用户,假设少于50,只需启动一个进程,100个用户,只需启动2个进程,依此类推; 多行脚本,即使每行一个用户,也需要启动一个进程,多一行就需要多启动一个进程;不是每个用户启动一个进程,有几行(每行<50人)就需要启动几个 进程。 在启动了IP欺骗功能后,所需启动的进程数,还与选择的是按进程还是按线程来分配IP地址有关 按进程分IP:每个ip(负载生成器)就需要多启动一个进程; 按线程分IP:每个ip(负载生成器)不需要多启动一个进程。

  • was学习积累

    naroon 发布于 2010-01-19 14:14:44

        最近时间比较充裕,所以抽空学了was的基本使用,几天下来积累了些东西,却是不知道应该从哪些角度去总结我所学到的东西,如何验证!同时,我也试着抓几个方面来分析:was的适用对象、was如何模拟对网站进行压力测试?即如何去设置、分析测试过程中生成的report,哪几个方面比较重要等。

    was的适用对象:

    利用was对web网站进行性能预估,测试web服务器的性能现状是否满足需求。网站的测试可大略分成三个主要的类别:网站性能测试(performance testing)、压力测试下的网站稳定性(stability or stress testing)、网站承受能力评估(capacity planning)。

    was模拟多用户并发:

    1.并发连接数

    a.设置并发用户(settings面板-->Concurrent Connections):stress levels(thread)以及stress multiplier(sockets per thread)二者决定了访问web服务器的并发连接数。一般情况下,当并发数要求超过100时,调整stress multiplier值提高并发数量,stress level值建议不要超过100(为什么?)。

     访问服务器的并发值=(stress level)*(stress multiplier)。Stress level是全部客户端所产生的线程总数。每个线程能产生多个socket而每个socket就是一个并发的请求。例如测试网站登陆的情况下,Stress level (threads)可理解为登陆线程数,而Stress multiplier (sockets per thread)相当于每一登陆线程中的并发用户数量。

    b.也可利用多个Clients来提高并发连接数。双击【Clients】结点进入主页面,添加客户机(添加客户机的IP地址),本机WAS将通过DCOM与其他客户机协调。

    c.在设置Concurrent Connections的同时,【Users】中的数量要大于并发连接数(即=(stress level)*(stress multiplier))。如果网站提供个性化服务,要进行身份验证或使用Cookies,我们还要为WAS提供一个用户目录,WAS中的用户存储了发送给服务器的密码以及服务器发送给客户端的Cookies。

    2.设置网络带宽

    带宽限制功能够为测试环境模拟出Modem(14K,28.8K,56K),ISDN(64K,128K)以及T1(1.154M)的速度。使用带宽限制可以精确地预测出客户通过拨号网络或其他外部连接访问web服务器所感受的性能。

    3.测试运行持续时间设置

    was允许设置warmup时间,一般可设置为1分钟。在warmup期间was开始执行脚本,但不收集统计数据。warmup时间可对测试环境进行预热。

    4.设置Test Run Time

    设置测试的持续时间,测试压力测试状态下的运行是否稳定?

    分析测试report,【View-->Reports】:查看测试结果

    1.先查看Result Codes.404错误:需要查看脚本列表中是否有出现错误的页面请求;500错误:可能web服务器负载过重,导致页面请求无法响应而报错。需要根据具体code具体分析。

    2.overview:

    ========================================================

    Number of test clients: 1

    Number of hits: 22357 ------每秒点击率

    Requests per Second: 372.66 ------每秒客户端的请求次数(这个值大小越高越好)

    =============================================================

    =============================================================

    Socket Connects: 22359 Total

    Bytes Sent (in KB): 7095.35

    Bytes Sent Rate (in KB/s): 118.27

    Total Bytes Recv (in KB): 81532.56

    Bytes Recv Rate (in KB/s): 1359.02

    =============================================================

    3.分析具体页面的数据(PageData)

    接收到第一个字节的平均时间(TTFB),接收到最后一个字节的平均时间(TTLB),以及测试脚本中各个页面的命中次数。TTFB和TTLB这两个值对于计算客户端所看到的服务器性能具有重要意义。TTFB反映了从发出页面请求到接收到应答数据第一个字节的时间总和(以毫秒计),TTLB包含了TTFB,它是客户机接收到页面最后一个字节所需要的累计时间。

    Time to first byte (in milliseconds)

    ===================================================================

    Average: 42.83 Min: 1.42

    25th Percentile: 21.83

    50th Percentile: 37.19

    75th Percentile: 61.11

    Max: 412.96

    ===================================================================

     

    Time to last byte (in milliseconds)

    ===================================================================

    Average: 42.93

    Min: 1.46

    25th Percentile: 21.91

    50th Percentile: 37.34

    75th Percentile: 61.23

    Max: 412.97

    ===================================================================

  • 做好性能测试需要了解的知识汇总(转载)

    whhuang 发布于 2012-02-20 12:55:53

      性能测试

      1. 如何理解TPS?

      2. 如何理解线程调用?

      3. 如何理解响应时间?

      4. 如何理解性能建模?(可分类回答)

      5. 如何理解响应时间、TPS曲线和用户之间的关系?

      6. 在LoadRunner中为什么要设置思考时间和pacing?

      应用服务器

      1. 如何理解J2EE的系统架构?

      2. 如何理解J2EE应用服务器的容器?

      3. 如何理解内存泄露?如何定位JAVA类的应用的内存泄露?如何定位C语言编写的应用的内存泄露?

      4. 如果用纯JAVA的应用调用J2EE应用服务器的容器资源会出现什么结果?需要如何维护容器资源?(说明原理即可)

      5. 如何定位JAVA的方法调用消耗的时间?(不通过在源代码中加时间戳的方式)?

      6. 如何定位C语言中的函数调用消耗的时间?

      7. 如何监控J2EE应用服务器?(可以用一个具体的应用服务器做例子)

      数据库

      1. 如何理解数据库架构?(可以用一个数据库做例子)

      2. SQL语句在数据库中的执行分成几步,每一步都做什么?(可以用一个数据库做例子)

      3. 如何跟踪SQL的执行时间和内存的消耗?(可以用一个数据库做例子)

      4. 如何监控数据库?监控能得到什么数据?(可以用一个数据库做例子)

      5. 如何定位死锁问题?如何定位热块问题?如何监控日志切换?(可以用一个数据库做例子)

      6. 有几种手段可以改变执行计划?(可以用一个数据库做例子)

      操作系统

      1. 如何判断CPU、内存、磁盘的瓶颈?

      2. 如何理解CPU、内存、磁盘之间的关系?

      3. 如何理解paging in/paging out?

      4. 如何监控操作系统的资源?(可以用一个操作系统做例子)

      5. 如何理解内存管理和线程调度?(可以用一个操作系统做例子)

      6. 如何理解CSwitch?(可以用一个操作系统做例子)

      7. 如何理解磁盘IO?(可以用一个操作系统做例子)

      网络

      1. 如何定位数据包的传输在网络上消耗的时间?

      2. 如何理解纯路由和NAT的区别?

      性能测试工具

      1. 解释LoadRunner的工作原理。

      2. 如何理解LoadRunner里的关联?

      3. 如何理解性能压力工具?

      4. 如何理解虚拟用户?(可以用一个工具做例子)

      5. 如果理解业务到脚本的转化?(可以用一个工具做例子)

      6. 如何做到业务统计数据到场景的转化?(可以用一个工具做例子)

  • LoadRunner配置方案

    chj_0205 发布于 2010-10-09 14:57:07

    1.配置方案运行时设置

      选择“Tools”>“Options”。在“Options”对话框有“Run-Time Settings”(运行时设置)、“Timeout”(超时)、“Run-Time File Storage”(运行时文件存储)、“Path Translation Table”(路径转换表)等选项卡。

      (1)“Run-Time Settings”选项卡

      “Run-Time Settings”(运行时设置)选项卡如图2-52所示。

      ● Vuser Quota(Vuser配额):要防止系统过载,可以设置Vuser活动的配额。Vuser配额适用于所有负载生成器上的Vuser。其中,“Number of Vusers that may be initialized at one time all load generators”(一次可以初始化的Vuser数——所有负载生成器)用来设置负载生成器一次可以初始化的最大Vuser数,默认的最大数目为999。

      软件测试工具

      图2-52  运行时设置

      ● When stopping Vusers:此组合框中的选项用于控制在单击“停止”按钮时Vuser停止运行的方式。其选项依次为:

      Ø Wait for the current iteration to end before stopping(退出前等待当前迭代结束):指示LoadRunner允许Vuser在停止前完成正在运行的迭代。Vuser将移动到“正在逐步退出”状态,然后逐渐退出方案。

      Ø Wait for the current action to end before stopping(退出前等待当前操作结束):指示LoadRunner允许Vuser在停止前完成正在运行的操作。Vuser将移动到“正在逐步退出”状态,然后逐渐退出方案。

      Ø Stop immediately(立即停止):指示LoadRunner立即停止运行Vuser。Vuser将移动到“正在退出”状态,然后立即退出方案。

      ● Use random sequence with seed:勾选此复选框,表示允许LoadRunner使用随机顺序的种子数。每个种子值代表用于测试执行的一个随机值顺序。每当使用该种子值时,会将相同顺序的值分配给方案中的Vuser。该设置适用于使用Random方法从数据文件中分配值的参数化Vuser脚本。它还将影响录制的思考时间的随机百分比,如果在测试执行中发现问题,并且要使用相同的随机值顺序重复该测试,请启用该选项。

      (2)“TimeOut”选项卡

      “TimeOut”(超时)选项卡如图2-53所示。“Command Timeout”(命令超时)是各种LoadRunner命令的最长时间限制。在控制台发出命令时,可以设置负载生成器或Vuser执行该命令的最长时间。如果在超时间隔内没有完成该命令,控制台将发布一条错误消息。

      软件测试工具

      图2-53  超时设置

      ● Enable timeout checks:即启用超时检查,指示LoadRunner在控制台发出命令后监视负载生成器和Vuser的状态。如果负载生成器或Vuser在指定的超时间隔内没有完成命令,控制台将发布一条错误消息。如果禁用超时限制,LoadRunner将无限长地等待负载生成器进行连接和断开连接,并且等待执行Initialize、Run、Pause和Stop命令。

      ● Connect:在此数值框中输入LoadRunner等待连接到任何负载生成器的时间限制值。如果在该时间内连接不成功,负载生成器的状态将更改为“失败”,默认连接超时是120秒。

      ● Disconnect:在此数值框中输入LoadRunner等待从任何负载生成器断开连接的时间限制值。如果在该时间内断开连接不成功,负载生成器的状态将更改为“失败”。默认的断开连接超时是120秒。

      LoadRunner承认活动Vuser的数量会影响超时值。例如,1000个Vuser尝试初始化将比10个Vuser尝试初始化花费更长的时间。LoadRunner将基于活动Vuser的数量向指定的超时值中添加内部值。

      ● Init:在此数值框中输入Initialize命令的超时值,默认的时间限制是180秒。

      ● Run:在此数值框中输入Run命令的超时值,默认的时间限制是120秒。

      ● Pause:在此数值框中输入Pause命令的超时值,默认的时间限制是120秒。

      ● Stop:在此数值框中输入Stop命令的超时值,默认的时间限制是120秒。

      ● Update Vuser elapsed time every(更新Vuser已用时间):指定LoadRunner更新在“Vuser”对话框中的“Elapsed Time”(已用时间)列中显示的值的频率。默认每隔4秒更新一次Vuser已用时间。

      如果选择一个Vuser并单击“Init”(初始化)按钮,LoadRunner将检查该Vuser在180秒(默认的“初始化”超时时间)内是否达到了“就绪”状态;如果没有达到,控制台将发布一条消息,指出该“初始化”命令超时。

    (3)“Run-Time File Storage”选项卡

      “Run-Time File Storage”(运行时文件存储)选项卡页面如图2-54所示。

      软件测试工具

      图2-54  运行时文件存储设置

      存储的脚本和结果可以使用下列选项之一:

      ● On the current Vuser machine(在当前Vuser计算机上):指示控制台将运行时文件保存在运行Vuser脚本的计算机上。在基于NT的计算机上,这些结果将保存到由TEMP或TMP环境变量定义的目录中。在UNIX计算机上,这些结果将保存到由 TMPDIR环境变量定义的目录中。如果没有定义TMPDIR环境变量,这些结果将保存到/tmp目录。

      ● On a shared network drive(在共享网络驱动器上):指示控制台将方案结果和/或Vuser脚本保存在共享网络驱动器上。共享网络驱动器是控制台和方案中的所有负载生成器对其拥有读写权限的驱动器。如果选择将结果保存到共享网络驱动器,可能需要执行路径转换。路径转换确保远程负载生成器可以识别指定的结果目录。如果指定所有Vuser在某个共享位置上直接访问其Vuser脚本,则在运行时不会传输任何脚本文件。该替代方法在以下两种情况可能很有用:

      Ø 文件传输设备无法工作。

      Ø  Vuser脚本文件太大,因此要花费很长时间进行传输。切记,Vuser脚本文件在方案运行期间仅传输一次。

      (4)“Path Translation Table”选项卡

      “Path Translation Table(路径转换表)”选项卡如图2-55所示。

      软件测试工具

      图2-55  路径转换表

      如果指定了运行时文件存储的共享网络驱动器,可能需要执行“路径转换”,路径转换是LoadRunner用来转换远程路径名的一种机制。在典型的性能测试设备配置方案中,根据实际情况,多台负载生成器(计算机)会以不同方式映射共享网络驱动器。

      2.运行环境设置

      操作后出现“Run-Time Setting”窗口,其中有不同的标签页。下面对运行时经常需要配置的标签页进行简要的配置说明。

      (1)“General:Miscellaneous”标签页(如图2-56所示)

      此界面为运行期间针对某些特殊功能,例如出现错误时如何处理等的一些辅助设置,一般的情况下不需要改动,其中有三项供用户设置。

      软件测试工具

      图2-56  环境设置

      “Error Handing”栏设置LoadRunner在遇到错误时的处理方法,一般情况下不需要改动。此选项下有三个复选框,分别为运行期间遇到错误不同的处理方法,

      ● Continue on error:选择此项后,如果运行时出现错误,将继续执行脚本,不会因为错误出现而停止,以此来保证脚本整个运行过程的完整性。

      ● Fail open transactions on lr_error message:选择此项后,如果运行时出现错误,系统会在事先脚本中插入的lr_error_message函数中显示出错误,此项需要与一些函数进行配合使用。

      ● Generate snapshot on error:选择此项后,如果运行时出现错误,系统会根据错误的级别将错误界面形成快照记录下来,运行结束后可以打开错误窗口进行查看。

      “Multithreading”栏用于确定Vuser运行时为多线程还是多进程,默认是多线程,一般不需要修改。如果选择“Run Vuser as a process”,则场景运行时会为每个Vuser创建一个进程;如果选择“Run Vuser as a thread”,则会将每个Vuser作为一个线程来运行,在任务管理器中只看到一个mmdrv.exe,这种方式的运行效率更高,能造成更大的压力。

      “Automatic Transactions”栏默认选择的是第一项“Define any actions as a transcation”,但如果需要把脚本的每一步都当作事务,可以选择第二项“Define any step as a transcation”,这样可以省去多次添加事务的烦琐操作。

    (2)“General:Think Time”标签页(如图2-57所示)

      软件测试工具

      图2-57  思考时间设置

      ● Ignore think time(忽略录制思考时间):选择该项,VuGen在脚本回放过程中将不执行Lr_think_time()函数,这样将给服务器造成更大的压力。

      ● Replay think time(使用录制思考时间):如选中该项,依次有以下4种选择:

      Ø  As record:按照录制过程中的Think Time值回放脚本,使用lr_think_time函数中显示的参数。

      Ø  Multiply recorded think time by:按照录制过程中的Think Time值的整数倍回放脚本,这种方法可以增加或减少在回放脚本期间应用的思考时间。

      例如,如果录制思考时间为4秒,则可以指示Vuser用2乘以该值,即总共为8秒。要将思考时间减少至2秒,可以用0.5乘以录制时间。

      Ø  Use random percentage of recorded think time:指定一个最小值和一个最大值,可设置Think Time值的范围,通过指定Think Time的范围,取其中的一个随机数的值来回放脚本。

      例如,如果Think Time参数为4,并且指定最小值为该值的50%,而最大值为该值的150%,则Think Time的最小值为2(50%),而最大值为6(150%)。

      Ø  Limit think time to:限制Think Time的最大值,这样VuGen在回放脚本过程中就会把脚本中大于该限制值的Think Time值用该限制值来代替。

      (3)“NetWork:Speed Simulation”标签页(如图2-58所示)

      软件测试工具

      图2-58  网络配置

      此界面为带宽的选择:选择能够最好地模拟所测试的环境的带宽,带宽越大,给Web服务器造成的压力就越大。为了方便选择带宽的大小,提供了几种选项,自上而下依次表示:

      ● Use maximum bandwidth(使用最大带宽):此项为默认选项,一般情况下运行场景不会考虑带宽大小情况,Vuser就按照网络上的最大可用带宽来运行。

      ● Use bandwidth(使用带宽):指明Vuser要模拟的特定带宽级别。如果此软件程序运行时要考虑带宽大小情况,需要规定带宽范围或者需要特定的带宽级别,就可以选择此项进行设置,可以选择从14.4K至512K bps范围内的几个带宽级别,以便模拟调制解调器、ISDN或DSL。

      ● Use custom bandwidth(使用自定义带宽):指明Vuser进行模拟的带宽限制,以位为单位指定带宽,若选择此项用户可以自己手动添加想要的带宽大小,1K=1024。

     (4)“Internet Protocol:Preferences”标签页(如图2-59所示)

      这里仅仅对两个经常需要改动的选项进行说明。

      “Checks”栏下的Enable Image and text check”:启用Image/Text检查。默认情况下此选项是没有选中的。如果在前面设置了检查点,需要先选中该项,否则运行时LoadRunner不会执行检查这个步骤。

      软件测试工具

      图2-59  启用检查点设置

       “Advanced”栏下的“Non-critical resource error as warnings”:默认选中该项,这样一些不是特别重要的资源问题(比如一个小图片)出现错误时,LoadRunner仅仅把它们当作警告,不会当作错误,至于到底哪些资源不是特别重要,请选择“Recording Option”>“Advanced”>“Non-Resources”进行设置。

      (5)“Internet Protocol:ContentCheck”标签页(如图2-60所示)

      软件测试工具

      图2-60  错误页面处理设置

      这里的设置是为了让VuGen检测何种页面为错误页面。如果被测的Web应用没有使用自定义的错误页面,那么这里不用作更改;如果被测的Web应用使用了自定义的错误页面,那么这里需要定义,以便让VuGen在运行过程中检测服务器返回的页面是否包含预定义的字符串,进而判断该页面是否为错误页面。如果是,VuGen就停止运行,指示运行失败。

      ● “Enable ContentCheck during replay”:默认选中此项,表示VuGen在回放脚本的过程中会检查页面是否包含错误信息。

      ● “New Application”:新建一类应用程序,比如ASP.NET或者JSP等。

      ● “New Rule”:在该应用下新建规则,规则中包含字符串或者字符前缀和后缀。

      ● “Set as Default”:默认情况下,当前所作的更改只适用于当前的脚本,如果想让更改适用于本机所有脚本的话,单击该按钮即可。

      ● “Import/Export”:利用该按钮可以把定义好的规则导入和导出。

      其他的标签设置采用默认值即可,这里不再详细地介绍。

  • 性能测试结果分析

    chj_0205 发布于 2010-05-29 13:07:18

    1. 具体问题具体分析(这是由于不同的应用系统,不同的测试目的,不同的性能关注点)


    2.
    查找瓶颈时按以下顺序,由易到难。


       
    服务器硬件瓶颈-〉网络瓶颈(对局域网,可以不考虑)-〉服务器操作系统瓶颈(参数配置)-〉中间件瓶颈(参数配置,数据库web服务器等)-〉应用瓶颈(SQL语句、数据库设计、业务逻辑、算法等)
       
    注:以上过程并不是每个分析中都需要的,要根据测试目的和要求来确定分析的深度。对一些要求低的,我们分析到应用系统在将来大的负载压力(并发用户数、数据量)下,系统的硬件瓶颈在哪儿就够了。


    3
    分段排除法 很有效
    分析的信息来源:
    1
    根据场景运行过程中的错误提示信息
    2
    根据测试结果收集到的监控指标数据


    一.错误提示分析
    分析实例:
    1 Error: Failed to connect to server “10.10.10.30:8080″: [10060] Connection
      Error: timed out Error: Server “10.10.10.30″ has shut down the connection prematurely
    分析:
     A
    、应用服务死掉。
    (小用户时:程序上的问题。程序上处理数据库的问题)
     B
    、应用服务没有死
    (应用服务参数设置问题)
       
    例:在许多客户端连接Weblogic应用服务器被拒绝,而在服务器端没有错误显示,则有可能是Weblogic中的server元素的AcceptBacklog属性值设得过低。如果连接时收到connection refused消息,说明应提高该值,每次增加25
     C
    、数据库的连接
    (1
    、在应用服务的性能参数可能太小了 2、数据库启动的最大连接数(跟硬件的内存有关))


    2 Error: Page download timeout (120 seconds) has expired
    分析:可能是以下原因造成
     A
    、应用服务参数设置太大导致服务器的瓶颈
     B
    、页面中图片太多
     C
    、在程序处理表的时候检查字段太大多


    二.监控指标数据分析
    1
    .最大并发用户数:
    应用系统在当前环境(硬件环境、网络环境、软件环境(参数配置))下能承受的最大并发用户数。
       
    在方案运行中,如果出现了大于3个用
    户的业务操作失败,或出现了服务器shutdown的情况,则说明在当前环境下,系统承受不了当前并发用户的负载压力,那么最大并发用户数就是前一个没有出现这种现象的并发用户数。
       
    如果测得的最大并发用户数到达了性能要求,且各服务器资源情况良好,业务操作响应时间也达到了用户要求,那么OK。否则,再根据各服务器的资源情况和业务操作响应时间进一步分析原因所在。


    2
    .业务操作响应时间:
        
    分析方案运行情况应从平均事务响应时间图和事务性能摘要图开始。使用事务性能摘要图,可以确定在方案执行期间响应时间过长的事务。
       
    细分事务并分析每个页面组件的性能。查看过长的事务响应时间是由哪些页面组件引起的?问题是否与网络或服务器有关?
     
    如果服务器耗时过长,请使用相应的服务器图确定有问题的服务器度量并查明服务器性能下降的原因。如果网络耗时过长,请使用网络监视器图确定导致性能瓶颈的网络问题

    3.服务器资源监控指标:

    内存:
    1 UNIX
    资源监控中指标内存页交换速率(Paging rate),如果该值偶尔走高,表明当时有线程竞争内存。如果持续很高,则内存可能是瓶颈。也可能是内存访问命中率低。
    2 Windows
    资源监控中,如果Process\Private Bytes计数器和Process\Working Set计数器的值在长时间内持续升高,同时Memory\Available bytes计数器的值持续降低,则很可能存在内存泄漏。
    内存资源成为系统性能的瓶颈的征兆:
    很高的换页率(high pageout rate);
    进程进入不活动状态;
    交换区所有磁盘的活动次数可高;
    可高的全局系统CPU利用率
    内存不够出错(out of memory errors)


    处理器:
    1 UNIX
    资源监控(Windows操作系统同理)中指标CPU占用率(CPU utilization),如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。如果服务器专用于SQL Server,可接受的最大上限是80-85% 
    合理使用的范围在60%70%
    2 Windows
    资源监控中,如果System\Processor Queue Length大于2,而处理器利用率(Processor Time)一直很低,则存在着处理器阻塞。
    CPU
    资源成为系统性能的瓶颈的征兆
    很慢的响应时间(slow response time) 
    CPU
    空闲时间为零(zero percent idle CPU) 
    过高的用户占用CPU时间(high percent user CPU) 
    过高的系统占用CPU时间(high percent system CPU) 
    长时间的有很长的运行进程队列(large run queue size sustained over time)


    磁盘I/O
    1 UNIX
    资源监控(Windows操作系统同理)中指标磁盘交换率(Disk rate),如果该参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。
    2 Windows
    资源监控中,如果 Disk TimeAvg.Disk Queue Length的值很高,而Page Reads/sec页面读取操作速率很低,则可能存在磁盘瓶径。
    I/O
    资源成为系统性能的瓶颈的征兆 :
    过高的磁盘利用率(high disk utilization) 
    太长的磁盘等待队列(large disk queue length) 
    等待磁盘I/O的时间所占的百分率太高(large percentage of time waiting for disk I/O) 
    太高的物理I/O速率:large physical I/O rate(not sufficient in itself) 
    过低的缓存命中率(low buffer cache hit ratio(not sufficient in itself)) 
    太长的运行进程队列,但CPU却空闲(large run queue with idle CPU)


    4
    .数据库服务器:
    SQL Server
    数据库:
    1 SQLServer
    资源监控中指标缓存点击率(Cache Hit Ratio),该值越高越好。如果持续低于80%,应考虑增加内存。
    2
    如果Full Scans/sec(全表扫描/秒)计数器显示的值比12高,则应分析你的查询以确定是否确实需要全表扫描,以及SQL查询是否可以被优化。 
    3 Number of Deadlocks/sec(
    死锁的数量/):死锁对应用程序的可伸缩性非常有害,并且会导致恶劣的用户体验。该计数器的值必须为0
    4 Lock Requests/sec(
    锁请求/),通过优化查询来减少读取次数,可以减少该计数器的值。


    Oracle
    数据库:
    1
    如果自由内存接近于0而且库快存或数据字典快存的命中率小于0.90,那么需要增加SHARED_POOL_SIZE的大小。
    快存(共享SQL区)和数据字典快存的命中率: 
    select(sum(pins-reloads))/sum(pins) from v$librarycache; 
    select(sum(gets-getmisses))/sum(gets) from v$rowcache; 
    自由内存: select * from v$sgastat where name=’free memory’; 


    2
    如果数据的缓存命中率小于0.90,那么需要加大DB_BLOCK_BUFFERS参数的值(单位:块)。
    缓冲区高速缓存命中率:
    select name,value from v$sysstat where name in (’db block gets’,
    ‘consistent gets’,'physical reads’) ;
    Hit Ratio = 1-(physical reads / ( db block gets + consistent gets))


    3
    如果日志缓冲区申请的值较大,则应加大LOG_BUFFER参数的值。
    日志缓冲区的申请情况
    select name,value from v$sysstat where name = ‘redo log space requests’ ;


    4
    如果内存排序命中率小于0.95,则应加大SORT_AREA_SIZE以避免磁盘排序
    内存排序命中率
    select round((100*b.value)/decode((a.value+b.value), 0, 1, (a.value+b.value)), 2)from v$sysstat a, v$sysstat b where a.name=’sorts (disk)’ and b.name=’sorts (memory)’
    注:上述SQL ServerOracle数据库分析,只是一些简单、基本的分析,特别是Oracle数据库的分析和优化,是一门专门的技术,进一步的分析可查相关资料。

     

     

     性能测试的结果分析是性能测试的重中之重。在实际工作中,由于测试的结果分析比较复

    杂、需要具备很多相关的专业知识,因此常常会感觉拿到数据不知从何下手。这也是我学习性能

    测试过程中感觉比较尴尬和棘手的事,为此我在研读了《WEB性能测试实战》后特作了以下笔

    记,这里只是书中第4WEB应用程序性能分析的一

    部分,贴出来希望和大家共同讨论:

     

    一:性能分析的基础知识:

    1.几个重要的性能指标:相应时间、吞吐量、吞吐率、TPS(每秒钟处理的交易数)、点

    击率等。

     

    2.系统的瓶颈分为两类:网络的和服务器的。服务器瓶颈主要涉及:应用程序、WEB服务

    器、数据库服务器、操作系统四个方面。

     

    3.常规、粗略的性能分析方法:

       当增大系统的压力(或增加并发用户数)时,吞吐率和TPS的变化曲线呈大体一致,则系统

    基本稳定;若压力增大时,吞吐率的曲线增加到一定程度后出现变化缓慢,甚至平坦,很可能是

    网络出现带宽瓶颈,同理若点击率/TPS曲线出现变化缓慢或者平坦,说明服务器开始出现颈。

     

    4.作者提出了如下的性能分析基本原则,此原则本人十分赞同:

                ——由外而内、由表及里、层层深入

        应用此原则,分析步骤具体可以分为以下三步:

       第一步:将得到的响应时间和用户对性能的期望值比较确定是否存在瓶颈;

       第二步:比较Tn(网络响应时间)和Ts(服务器响应时间)可以确定瓶颈发生在网络还是服

    务器;

       第三步:进一步分析,确定更细组件的响应时间,直到找出发生性能瓶颈的根本原因。

     

    二:以WEB应用程序为例来看下具体的分析方法:

    1.用户事务分析:

     

    a.事务综述图(Transaction Summary ):以柱状图的形式表现了用户事务执行的成功与

    失败。通过分析成功与失败的数据可以直接判断出系统是否运行正常。若失败的事务非常多,则

    说明系统发生了瓶颈或者程序在执行过程中发生了问题。

     

    b.事务平均响应时间分析图(Average Transaction Response Time: 该图显示在

    测试场景运行期间的每一秒内事务执行所用的平均时间,还显示了测试场景运行时间内各个事务

    的最大值、最小值和平均值。通过它可以分析系统的性能走向。若所有事务响应时间基本成一条

    曲线,则说明系统性能基本稳定;否则如果平均事务响应时间逐渐变慢,说明性能有下降趋势,

    造成性能下降的原因有可能是由于内存泄漏导致。

     

    c.每秒通过事务数分析图(Transaction per SecondTPS:显示在场景运行的每一

    秒中,每个事 务通过、失败以及停止的数量。通过它可以确定系统在任何给定时刻的实际事务

    负载。若随着测试的进展,应用系统在单位时间内通过的事务数目在减少,则说明服务器出现瓶

    颈。

     

    d.每秒通过事务总数分析图(Total Transactions per Second:显示场景运行的

    每一秒中,通过、失败以及停止的事务总数。若在同等压力下,曲线接近直线,则性能基本趋于

    稳定;若在单位时间内通过的事务总量越来越少,即整体性能下降。原因可能是内存泄漏或者程

    序中的缺陷。

     

    e.事务性能摘要图(Transaction Performance Summary:显示方案中所有事务的

    最小、最大平均执行时间,可以直接判断响应时间是否符合客户要求(重点关注事务平均、最大

    执行时间)。

     

    f.事务响应时间与负载分析图(Transaction Response Time Under load:通过

    该图可以看出在任一时间点事务响应时间与用户数目的关系,从而掌握系统在用户并发方面的性

    能数据。

     

    g.事务响应时间(百分比)图(Transaction Response Time(percentile):

    图是根据测试结果进行分析而得到的综合分析图。分析该图应从整体出发,若可能事务的最大响

    应时间很长,但如果大多数事务具有可接受的响应时间,则系统的性能是符合。

     

    h.事务响应时间分布情况图(Transaction Response Time (Distribution):

    图显示了测试过程中不同响应时间的事务数量。若系统预先定义了相关事务可以接受的最小和最

    大事务响应时间,则可以使用此图确定系统性能是否在接受范围内。

          分析到这一步,只能大概判断出瓶颈可能会出在那,要具体定位瓶颈还需要更深入

    的分析。没有贴图,看起来有点费劲,如果你对这些图都比较了解,应该是比较简单的.

  • LR监控linux之详解rstatd的安装

    chj_0205 发布于 2010-05-19 14:04:38

    1.    前期准备:
     
     
    1,rstatd文件解压到要监控的机器上。
    2,打开终端,定位到rstatd文件夹下:查看文件夹中的内容如下:

    [root@localhost rpc.rstatd]# ls
    aclocal.m4    COPYING     Makefile.am    README        rstat_proc.c rup.1
    config.h.in   CVS         Makefile.in    rpc.rstatd.8 rstat.x       rup.c
    configure     INSTALL     missing        rstatd.8      rsysinfo.1    stamp-h.in
    configure.in install-sh mkinstalldirs rstat_main.c rsysinfo.c
     
     
     
    2.    执行如下步骤:
     
     
    2.1.                   执行:./configure 命令
     
     

    [root@localhost rpc.rstatd]# ./configure
    creating cache ./config.cache
    checking for a BSD compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking whether make sets ${MAKE}... yes
    checking for working aclocal... found
    checking for working autoconf... found
    checking for working automake... found
    checking for working autoheader... found
    checking for working makeinfo... found
    checking for gawk... gawk
    checking for gcc... gcc
    checking whether the C compiler (gcc ) works... yes
    checking whether the C compiler (gcc ) is a cross-compiler... no
    checking whether we are using GNU C... yes
    checking whether gcc accepts -g... yes
    checking for a BSD compatible install... /usr/bin/install -c
    checking whether ln -s works... yes
    checking whether make sets ${MAKE}... (cached) yes
    checking how to run the C preprocessor... gcc -E
    checking for sys/ioctl.h... yes
    checking for syslog.h... yes
    checking whether time.h and sys/time.h may both be included... yes
    checking whether gcc needs -traditional... no
    checking for ANSI C header files... yes
    checking return type of signal handlers... void
    updating cache ./config.cache
    creating ./config.status
    kcreating Makefile
    creating config.h
     
     
     
    2.2.                   执行:make 命令。
     
     

    [root@localhost rpc.rstatd]# make
    rm -f rstat.h
    rpcgen -h -o rstat.h rstat.x
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rup.c
    rup.c: In function 'ointopoint_v5':
    rup.c:256: warning: passing argument 6 of 'client->cl_ops->cl_call'?from incompatible pointer type
    rup.c: In function 'ointopoint_v3'?
    rup.c:292: warning: passing argument 6 of 'client->cl_ops->cl_call'?from incompatible pointer type
    rup.c: In function 'main'?
    rup.c:317: warning: return type of 'main'?is not 'int'?rm -f rstat_xdr.c
    rpcgen -c -o rstat_xdr.c rstat.x
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rstat_xdr.c
    rm -f rstat_clnt.c
    rpcgen -l -o rstat_clnt.c rstat.x
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rstat_clnt.c
    gcc -g -O2 -o rup rup.o rstat_xdr.o rstat_clnt.o 
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rsysinfo.c
    rsysinfo.c: In function 'ointopoint_v3'?
    rsysinfo.c:136: warning: passing argument 6 of 'client->cl_ops->cl_call'?from incompatible pointer type
    rsysinfo.c: In function 'main'?
    rsysinfo.c:160: warning: return type of 'main'?is not 'int'?gcc -g -O2 -o rsysinfo rsysinfo.o rstat_xdr.o rstat_clnt.o 
    rm -f rstat_svc.c
    rpcgen -m -o rstat_svc.c rstat.x
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rstat_svc.c
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rstat_proc.c
    gcc -DHAVE_CONFIG_H -I. -I. -I.     -g -O2 -c rstat_main.c
    rstat_main.c: In function 'main'?
    rstat_main.c:82: warning: return type of 'main'?is not 'int'?gcc -g -O2 -o rpc.rstatd rstat_svc.o rstat_xdr.o rstat_proc.o rstat_main.o 
    这之后可以执行:make check检查一下。
     
     
    2.3.                   执行:make install 命令。
     
     

    [root@localhost rpc.rstatd]# make install
    make[1]: Entering directory `/opt/rpc.rstatd'
    /bin/sh ./mkinstalldirs /usr/local/bin
     /usr/bin/install -c rup /usr/local/bin/rup
     /usr/bin/install -c rsysinfo /usr/local/bin/rsysinfo
    /bin/sh ./mkinstalldirs /usr/local/sbin
     /usr/bin/install -c rpc.rstatd /usr/local/sbin/rpc.rstatd
    make[1]: Nothing to be done for `install-data-am'.
    make[1]: Leaving directory `/opt/rpc.rstatd'
     
     
    2.4.                   执行:./rpc.rstatd 命令。启动rpc服务。
     
     
    注:无回显为成功。
     

    [root@localhost rpc.rstatd]# ./rpc.rstatd
     
     
     
    2.5.                   执行:rpcinfo –p 命令。检查rpc服务的状态.
     
     

    [root@localhost rpc.rstatd]# rpcinfo -p
       program vers proto   port
        100000    2   tcp    111 portmapper
        100000    2   udp    111 portmapper
        100024    1   udp    797 status
        100024    1   tcp    800 status
        100001    5   udp    900 rstatd
        100001    3   udp    900 rstatd
        100001    2   udp    900 rstatd
        100001    1   udp    900 rstatd
    [root@localhost rpc.rstatd]#
     
     
    3.    可能会出现的错误:
     
    1,若RPC服务没有成功启动。
    2,若目标主机上开启了防火墙,阻挡了RPC服务。
    在LR中添加时可能会出现如下错误:

    Monitor name :UNIX Resources. Cannot initialize the monitoring on 10.1.200.65. Error while creating the RPC client. Ensure that the machine can be connected and that it runs the rstat daemon (use rpcinfo utility for this verification). Detailed error: RPC: Failed to create RPC client.
    RPC-TCP: Failed to establish RPC server address.
    RPC-TCP: RPC Server <100001, 3, 17> is not registered on host '10.1.200.65'. (entry point: CFactory::Initialize).   [MsgId: MMSG-47190]
     

    Monitor name :UNIX Resources. Internal rpc error (error code:2). Machine: 10.1.200.65. Hint: Check that RPC on this machine is up and running. Check that rstat daemon on this machine is up and running (use rpcinfo utility for this verification). Details: RPC: RPC call failed.
    RPC-TCP: recv()/recvfrom() failed.
    RPC-TCP: Timeout reached. (entry point: Factory::CollectData). [MsgId: MMSG-47197]
  • 用LoadRunner监控AIX(UNIX)

    chj_0205 发布于 2010-05-18 21:30:51

    首先,telnet以root用户的身份登录入系统,在命令行提示符下输入:

    rup localhost

     


    如果系统的输出类似

    # rup localhost

    localhost    up 10 days, 22:03,    load average: 0.00, 0.00, 0.02

    则可以直接监控;

    如果系统的输出类似

    [oracle@was2 oracle]$ rup localhost

    rup: RPC: Program not registered

    则需要手工启动服务。

     


    vi /etc/inetd.conf

    进入编辑文件页面后,输入:

    /rstatd

    (命令解释:在打开的文档中查找“rstatd”)接下来继续输入:

    x

    (命令解释:删除当前字符,在这里为删除rstatd命令前的“#”)继续输入:

    :wq

    (命令解释:保存并退出,注意前面有个冒号)

     


    接着在命令提示符下输入:

    refresh –s inetd

    (命令解释:重新启动服务)

    这样使用loadrunner就可以监视AIX系统的性能情况了。

  • 转载-LoadRunner中Pacing的设置方法

    chj_0205 发布于 2010-05-14 21:57:39

    在 LoadRunner 的运行场景中,有一个不大起眼的设置,可能经常会被很多人忽略,它就是 Pacing 。具体设置方式为: Run-Time settings à General à Pacing ,这个设置的功能从字面上就很容易理解,即在场景的两次迭代 (iteration) 之间,加入一个时间间隔(步进)。设置方法也很简单,这里就不赘述了,我在这里想说明的是,这个设置到底有什么作用?为什么要进行这个设置?说实话,虽然我在以前做过的一些性能测试中,偶尔会对这个步进值进行一些设置,但其实对它的真正含义和作用,我还并不十分清楚。  
      前段时间,我在对X银行招聘信息系统进行性能测试的时候,发现这个值的设置对于测试的结果有着很大的影响,很遗憾当时没有深入研究这个问题,而只是简单地认为它同脚本中的 thinktime 一样只是为了更真实地模拟实际情况而已。最近在网络上看到一篇题为《调整压力测试工具》的文章,读完之后,再用之前我的测试经历加以印证,真有种豁然开朗的感觉。以下就将我的一些体会与大家分享:  
      通常我们在谈到一个软件的“性能”的时候,首先想到的就是“响应时间”和“并发用户数”这两个概念。我们看到的性能需求经常都是这样定义的:  
    “要求系统支持 100 个并发用户”  
      看到这样的性能需求,我们往往会不假思索地就在测试场景中设置 100 个用户,让它们同时执行某一个测试脚本,然后观察其操作的响应时间,我们都是这样做的,不是吗?我在实际实施性能测试的过程中,也往往都是这样做的。可惜的是,我们中的大多数人很少去更深入地思考一下其中的奥妙,包括我自己。  
      事实上,评价一个软件系统的性能,可以从两个不同的视角去看待:客户端视角和服务器视角(也有人把它叫做用户视角和系统视角),与此相对应的,又可以引出两个让初学者很容易混淆的两个概念:“并发用户数”和“每秒请求数”。“并发用户数”是从客户端视角去定义的,而“每秒请求数”则是从服务器视角去定义的。  
      因此,上面所描述的做法的局限性就是,它反映的仅仅是客户端的视角,中国自学编程网,www.zxbc.cn 。  
      对于这个世界上的很多事情,变换不同的角度去看它,往往可以有助于我们得到更正确的结论。现在,我们就转换一下角度,以服务器的视角来看看性能需求应该怎么样定义: “要求系统的事务处理能力达到 100 个 / 秒” ( 这里为了理解的方便,假定在测试脚本中的一个事务仅仅包含一次请求 )  
      面对以这样方式提出的性能需求,在 LoadRunner 中,我们又该如何去设置它的并发用户数呢?千万不要想当然地以为设置了 100 个并发用户数,它就会每秒向服务器提交 100 个请求,这是两个不同的概念,因为 LoadRunner 模拟客户端向服务器发出请求,必须等待服务器对这个请求做出响应,并且客户端收到这个响应之后,才会重新发出新的请求,而服务器对请求的处理是需要一个时间的。我们换个说法,对于每个虚拟用户来说,它对服务器发出请求的频率将依赖于服务器对这个请求的处理时间。而服务器对请求的处理时间是不可控的,如果我们想要在测试过程中维持一个稳定的每秒请求数( RPS ),只有一个方法,那就是通过增加并发用户数的数量来达到这个目的。这个方法看起来似乎没有什么问题,如果我们在测试场景中只执行一次迭代的话。然而有经验的朋友都会知道,实际情况并不是这样,我们通常会对场景设置一个持续运行时间(即多次迭代),通过多个事务 (transaction) 的取样平均值来保证测试结果的准确性。测试场景以迭代的方式进行,如果不设置步进值的话,那么对于每个虚拟用户来说,每一个发到服务器的请求得到响应之后,会马上发送下一次请求。同时,我们知道, LoadRunner 是以客户端的角度来定义“响应时间”的 ,当客户端请求发出去后, LoadRunner 就开始计算响应时间,一直到它收到服务器端的响应。这个时候问题就产生了:如果此时的服务器端的排队队列已满,服务器资源正处于忙碌的状态,那么该请求会驻留在服务器的线程中,换句话说,这个新产生的请求并不会对服务器端产生真正的负载,但很遗憾的是,该请求的计时器已经启动了,因此我们很容易就可以预见到,这个请求的响应时间会变得很长,甚至可能长到使得该请求由于超时而失败。等到测试结束后,我们查看一下结果,就会发现这样一个很不幸的现象:事务平均响应时间很长,最小响应时间与最大响应时间的差距很大,而这个时候的平均响应时间,其实也就失去了它应有的意义。也就是说,由于客户端发送的请求太快而导致影响了实际的测量结果。  [Page]
      因此,为了解决这个问题,我们可以在每两个请求之间插入一个间隔时间,这将会降低单个用户启动请求的速度。间歇会减少请求在线程中驻留的时间,从而提供更符合现实的响应时间。这就是我在文章开头所提到的 Pacing 这个值的作用。  
      最后再补充一句话:虽然性能测试通常都是从客户端活动的角度定义的,但是它们应该以服务器为中心的视角来看待。请注意这句话,理解它很重要,只有真正理解了这句话,你才会明白为什么我们一直强调做性能测试的时候要保证一个独立、干净的测试环境,以及一个稳定的网络,因为我们希望评价的是软件系统真正的性能,所以必须排除其它一切因素对系统性能造成的影响。

  • 如何在Loadrunner中监控服务器资源使用情况

    chj_0205 发布于 2010-05-14 21:48:36

    如何在Loadrunner中监控服务器资源使用情况
     
    一.监控需要进行的配置:
    LR控制台设置监控Windows服务器的资源比较容易,直接添加Measurements即可。
    但是大多情况下面服务器的操作系统是Linux或者Unix,这时想监控系统的资源使用情况就需要进行一些设置:
    1.由于LR是通过rpc.rstatd进程获得系统的性能数据,因此首先查看进程中是否存在该进程,或者能否通过运行./rpc.rstatd启动该进程,如果可以,恭喜你,你可以直接在LR的控制台添加
    Measurements;否则需要下载rstatd.tar.gz,下载地址:
    2.安装rstatd
    $ tar xvzf rstatd.tar.gz
       $cd rpc.rstatd
       $ ./configure --prefix=/usr
       $ make
       # sudo su
       # make install
    3. Add a line to the hosts.allow file within /etc/ to specify the subnet(s) allowed to make rstatd requests. For example:
              rpc.rstatd: 10.0.95.0/255.255.255.0 10.0.8.0/255.255.255.0
    Alternately, if you want to live dangerously:
    rpc.rstatd: ALL
    4.       Add rstatd entry in /etc/xinetd.d/rstatd:
                   # default: off
                    # description: An xinetd internal service which rstatd's characters back to clients.
                    
             service rstatd
                   {
                        type            = RPC
                        rpc_version     = 2-4
                       socket_type     = dgram
                        protocol        = udp
                        wait            = yes
                        user            = root
                        only_from       = 10.0.95.0/24
                        log_on_success  += USERID
                       log_on_failure  += USERID
                        server          = /usr/sbin/rpc.rstatd
                        disable         = no
    .                }
    5.       Restart xinetd:
    # /etc/rc.d/init.d/xinetd restart
    补充的udp服务
    rpc.rstatd
    查看rpc服务进程
    rpcinfo -p
    理论上info为7个进程(前面共有两次start),如果各位有
    兴趣可以自己使用rpcinfo来查看前后的服务对比。
    关于之上的那段Shell程序,偶还灭有研究过。待研究过以后,在放上来与大家一起分享。
     
    本帖后上传了两个中间文件分别为:
    1)拷贝hosts.allow到Linux服务器:/etc/hosts.allow
    2)拷贝rstatd到Linux服务器:/etc/xinetd.d/rstatd
    二.系统指标:
    1.Unix 系统指标含义:
    Average Load:上一分钟同时处于“就绪”状态的平均进程数
    Collision Rate: 每秒钟在以太网上检测到的冲突数
    Context Switches Rate: 每秒钟在进程或线程之间的切换次数
    CPU Utilization: CPU 的使用时间百分比
    Disk Rate: 磁盘传输速率
    Incoming Packages Error rate: 接收以太网数据包时每秒钟接收到的错误数
    Incoming Packages Rate:每秒钟传入的以太网数据包数
    Interrupt Rate: 每秒内的设备中断数
    Outgoing Packages Error Rate: 发送以太网数据包时每秒钟发送的错误数
    Outgoing Packages Rate:每秒钟传出的以太网数据包数
    Page-in Rate:每秒钟读入到物理内存中的页数
    Page-out Rate:每秒钟写入页面文件和从物理内存中删除的页数
    Paging Rate:每秒钟读入物理内存或写入页面文件中的页数
    Swap-in Rate: 正在交换的进程数
    Swap-out Rate: 正在交换的进程数
    System Mode CPU Utilization: 在系统模式下使用 CPU 的时间百分比
    User Mode CPU Utilization:在用户模式下使用 CPU 的时间百分比
     
    2Windows 系统指标分析:
    Memory:内存使用情况可能是系统性能中最重要的因素。如果系统“页交换”频繁,说明内存不足。“页交换”是使用称为“页面”的单位,将固定大小的代码和数据块从 RAM 移动到磁盘的过程,其目的是为了释放内存空间。尽管某些页交换使 Windows 2000 能够使用比实际更多的内存,也是可以接受的,但频繁的页交换将降低系统性能。减少页交换将显著提高系统响应速度。要监视内存不足的状况,请从以下的对象计数器开始: 
    Available Mbytes:
    可用物理内存数如果Available Mbytes的值很小(4 MB 或更小),则说明计算机上总的内存可能不足,或某程序没有释放内存。

    page/sec: 
    表明由于硬件页面错误而从磁盘取出的页面数,或由于页面错误而写入磁盘以释放工作集空间的页面数。一般如果pages/sec持续高于几百,那么您应该进一步研究页交换活动。有可能需要增加内存,以减少换页的需求(你可以把这个数字乘以4k就得到由此引起的硬盘数据流量)。Pages/sec 的值很大不一定表明内存有问题,而可能是运行使用内存映射文件的程序所致。

    page read/sec:
    页的硬故障,page/sec的子集,为了解析对内存的引用,必须读取页文件的次数。阈值为>5. 越低越好。大数值表示磁盘读而不是缓存读。 
    由于过多的页交换要使用大量的硬盘空间,因此有可能将导致将页交换内存不足与导致页交换的磁盘瓶径混淆。因此,在研究内存不足不太明显的页交换的原因时,您必须跟踪如下的磁盘使用情况计数器和内存计数器: 
    Physical Disk\ % Disk Time 
    Physical Disk\ Avg.Disk Queue Length 
    例如,包括 Page Reads/sec  % Disk Time  Avg.Disk Queue Length。如果页面读取操作速率很低,同时 % Disk Time  Avg.Disk Queue Length的值很高,则可能有磁盘瓶径。但是,如果队列长度增加的同时页面读取速率并未降低,则内存不足。 
    要确定过多的页交换对磁盘活动的影响,请将 Physical Disk\ Avg.Disk sec/Transfer  Memory\ Pages/sec 计数器的值增大数倍。如果这些计数器的计数结果超过了 0.1,那么页交换将花费百分之十以上的磁盘访问时间。如果长时间发生这种情况,那么您可能需要更多的内存。

    Page Faults/sec:
    每秒软性页面失效的数目(包括有些可以直接在内存中满足而有些需要从硬盘读取)较page/sec只表明数据不能在内存的指定工作集中立即使用。 
    Cache Bytes
    :文件系统缓存(File System Cache),默认情况下为50%的可用物理内存。如IIS5.0 运行内存不够时,它会自动整理缓存。需要关注该计数器的趋势变化 
    如果您怀疑有内存泄露,请监视 Memory\ Available Bytes  Memory\ Committed Bytes,以观察内存行为,并监视您认为可能在泄露内存的进程的 Process\Private BytesProcess\Working Set Process\Handle Count。如果您怀疑是内核模式进程导致了泄露,则还应该监视 Memory\Pool Nonpaged BytesMemory\ Pool Nonpaged Allocs  Process(process_name)\ Pool Nonpaged Bytes

    Pages per second :
    每秒钟检索的页数。该数字应少于每秒一页。
    Process 
    %Processor Time: 
    被处理器消耗的处理器时间数量。如果服务器专用于sql server,可接受的最大上限是80-85% 
    Page Faults/sec:
    将进程产生的页故障与系统产生的相比较,以判断这个进程对系统页故障产生的影响。 
    Work set: 
    处理线程最近使用的内存页,反映了每一个进程使用的内存页的数量。如果服务器有足够的空闲内存,页就会被留在工作集中,当自由内存少于一个特定的阈值时,页就会被清除出工作集。 
    Inetinfo:Private Bytes:
    此进程所分配的无法与其它进程共享的当前字节数量。如果系统性能随着时间而降低,则此计数器可以是内存泄漏的最佳指示器。
    Processor监视“处理器”和“系统”对象计数器可以提供关于处理器使用的有价值的信息,帮助您决定是否存在瓶颈。 
    %Processor Time:
    如果该值持续超过95%,表明瓶颈是CPU。可以考虑增加一个处理器或换一个更快的处理器。 
    %User Time:
    表示耗费CPU的数据库操作,如排序,执行aggregate functions等。如果该值很高,可考虑增加索引,尽量使用简单的表联接,水平分割大表格等方法来降低该值。 
    %Privileged Time
    :(CPU内核时间)是在特权模式下处理线程执行代码所花时间的百分比。如果该参数值和"Physical Disk"参数值一直很高,表明I/O有问题。可考虑更换更快的硬盘系统。另外设置Tempdb in RAM,减低"max async IO""max lazy writer IO"等措施都会降低该值。 
    此外,跟踪计算机的服务器工作队列当前长度的 Server Work Queues\ Queue Length 计数器会显示出处理器瓶颈。队列长度持续大于 4 则表示可能出现处理器拥塞。此计数器是特定时间的值,而不是一段时间的平均值。 
    % DPC Time:
    越低越好。在多处理器系统中,如果这个值大于50%并且Processor:% Processor Time非常高,加入一个网卡可能会提高性能,提供的网络已经不饱和。
    Thread 
    ContextSwitches/sec: (
    实例化inetinfo dllhost 进程如果你决定要增加线程字节池的大小,你应该监视这三个计数器(包括上面的一个)。增加线程数可能会增加上下文切换次数,这样性能不会上升反而会下降。如果十个实例的上下文切换值非常高,就应该减小线程字节池的大小。
    Physical Disk: 
    %Disk Time %:
    指所选磁盘驱动器忙于为读或写入请求提供服务所用的时间的百分比。如果三个计数器都比较大,那么硬盘不是瓶颈。如果只有%Disk Time比较大,另外两个都比较适中,硬盘可能会是瓶颈。在记录该计数器之前,请在Windows 2000 的命令行窗口中运行diskperf -yD。若数值持续超过80%,则可能是内存泄漏。 
    Avg.Disk Queue Length:
    指读取和写入请求(为所选磁盘在实例间隔中列队的)的平均数。该值应不超过磁盘数的1.5~2 倍。要提高性能,可增加磁盘。注意:一个Raid Disk实际有多个磁盘
     
    Average Disk Read/Write Queue Length:指读取(写入)请求(列队)的平均数。 
    Disk Reads(Writes)/s: 
    物理磁盘上每秒钟磁盘读、写的次数。两者相加,应小于磁盘设备最大容量。 
    Average Disksec/Read: 
    指以秒计算的在此盘上读取数据的所需平均时间。 
    Average Disk sec/Transfer:
    指以秒计算的在此盘上写入数据的所需平均时间。 
    Network Interface
     
    Bytes Total/sec :
    为发送和接收字节的速率,包括帧字符在内。判断网络连接速度是否是瓶颈,可以用该计数器的值和目前网络的带宽比较
  • loadrunner测试oracle

    chj_0205 发布于 2010-05-14 21:44:21

    说一下oracle的性能测试。 oracle的性能测试主要是模拟大量的sql语句操作,来对数据库服务器进行加压。在测试前,需要准备以下要模拟的sql语句,测试脚本,并将测试控制机、测试加压机、被测数据库服务器准备妥当。

    脚本协议选择oracle(2-Tier),将所有要模拟的sql语句放在一个sql文件内,使用sql-plus来操作数据库载入,使用 loadrunner来录制。录制好之后就是修改脚本了,首先在vdf.h文件中定义变量(static void FAR * OraBind1;),定义参数(
    static LRD_VAR_DESC UID =
    {LRD_VAR_DESC_EYECAT, 1, 10, LRD_DBTYPE_ORACLE, {1, 1, 0},
    DT_SF_STRIPPED_SPACES};)。
    为什么要在这里定义而不直接只用参数化呢?因为那样会对加压机造成很大的压力,不利于测试。这里需要根据你的脚本来变化,你在脚本中使用了多少变量,多少参数,那么你就在要这里定义多少。接下来修改脚本的,将一次性的登陆登出放在init和end中,使用lrd_assign和 lrd_ora8_bind_placeholder命令替代参数,如
    lrd_ora8_stmt(OraStm6, "SELECT COUNT(*) as counter FROM ***** WHERE ***_id="
    ":U and ( status = 0 or "
    "status is null)", 1, 0, 0);
    lrd_assign(&UID , "", "", 0, 0);
    lrd_ora8_bind_placeholder(OraStm6, &OraBind1, "U", &UID , 0, 0, 0);
    ,这样,脚本就差不多大功告成了。编译一下,没有问题就通过了^o^

    将脚本放在控制机上,就可以开始加压了,注意的是,被测数据库服务器的各个参数配置要记录下来,以便修改参数调优时能分析清晰。记录下数据库的iops,time,tps和响应时间,结果汇总出报告。

  • LoadRunner-如何选择录制协议

    chj_0205 发布于 2010-05-14 21:23:54

    正确选择协议,就要熟悉被测试应用的技术架构。以下列出一些LoadRounner支持的协议:
      一般应用:C Vuser、VB Vuser、VB scrīpt Vuser、JAVA Vuser、Javascrīpt Vuser

      电子商务:WEB(Http/Html)、FTP、LDAP、Palm、Web/WinsocketDual Protocol

      客户端/服务器:MS SQL Server、ODBC、Oracle、DB2、Sybase CTlib、Sybase DBlib、Domain Name Resolution(DNS)、Windows Socket

      分布式组件:COM/DCOM、Corba-Java、Rmi_Java

      EJB:EJB、Rmi_Java

      ERP/CRP: Oracle NCA、SAP-Web、SAPGUI、SAPGUI/SAP-Web Dual Protocol、PropleSoft_Tuxedo、Siebel Web、Siebel-DB2 CLI、Sieble-MSSQL、Sieble Oracle

      遗留系统:Terminal Emulation (RTE)

      Mail 服务:Internet Messaging(IMAP)、MS Exchange(MAPI)、POP3、SMTP

      中间件:Jacada、Tuxedo 6、Tuxedo 7

      无线系统:i-mode、voiceXML、WAP

      应用部署软件:Citrix_ICA流:Media Plays(MMS)、Real

      一段对于loadrunner协议选择的经典解答协议是数据在网络中传输的结构模式。协议不同,其数据报文的结构也有所不同。协议是有层次的,一般我们从ip层开始,往上有TCP协议层,UDP协议层,而TCP和UDP协议层上又有http协议层,ftp协议层,smtp协议层等我们在lr中看到的这些应用层的协议。其实这些高层协议都是对底层协议进行的进一步封装。举个简单例子,本来IP协议的数据报文是无序,不是可靠传输的,在其数据报文外面增加了报文序号,报文状态等数据段就构成了TCP协议层。所以我们很多网络应用,没有找到合适的协议,就用winsock来录制,那是肯定没有问题的。因为几乎所有的网络传输中都是基于tcp 协议或udp协议的,而socket正是这一级上的概念。但是由于socket协议级别太低,你录下来的东西是很难理解的,都是 socket,port,data之类的东西。所以,我们尽量用高层协议来录制,我们就能看懂了。

      话要再说回来,解决一下具体的问题。我们看到一个软件体系架构,应该怎样选择录制协议呢?说到这里,我要说一下自己对lr录制机理的理解(我没有接触过lr内核,只是凭猜测和推断)。在录制时,lr应该会对你从本机发出去的数据进行截包,并拆包。因为我们知道协议的不同就是体现在数据包的结构不同,lr应该通过对包结构的分析,判断是不是它支持的协议,对包数据的分析,来获取用户发送的东西。比如你用ftp的协议去录制一个访问网页的IE操作,那肯定是无所收获的。因为lr没有在网络截获到 ftp协议格式的包,都是http协议格式的包,它不认,当然就是一个录制为空的结果了。现在我们弄懂了这个事情,就知道该如何选择协议了。看见很多人关心lr是不是支持mysql协议。我认为要寻找的答案的思路是这样的:

      1、首先弄清mysql协议和其他数据库协议的关系,看能不能用其它数据库协议录制。但其实oracle的cs协议是oracle独有自己开发的协议,sqlserver也是一样,而mysql又与这几大产品又不是隶属关系,其脚本录制的可能性很小。

      2、mysql协议的底层是基于什么协议的,如果直接构建在tcp协议上,lr又不支持mysql协议,那只能考虑用低一点的协议录录看,即socket。如果mysql协议是构建在odbc协议上的,那么就可能用lr的odbc api来写。

      很多时候一提到不是基于浏览器的应用,很多人就会想到用WinSocket协议来录制,仿佛Form窗体都可以用Winsocket 。从道理上讲网络通讯的底层都是基于Socket的,例如TCP、UPD等,似乎所有的程序都可以用Socket协议来录制。但是事实不是这样的,因为选择的协议决定了LoadRunner如何捕获数据包。否则会多捕获很多无用的数据。因此,不是所有的程序都是适合WinSocket协议的。实际上,那些基于Socket开发的应用才真正适合Socket协议来进行录制。其他的,例如基于数据库的应用,就不太时候Socket协议,甚至可能录制不到脚本。很多C/S程序,一定要选择合适的协议。根据作者的经验,C/S的程序多数需要手工开发很多脚本,因为录制的很多回放时候或多或少都会有些问题,但是可以参考录制的结果。所以测试一个程序,一定要搞清楚开发人员用了什么技术、数据流是什么协议封装的。理论上来说我们在对一个系统做性能测试以前,要先和开发人员了解一下他们在开发过程中都用了些什么技术,数据流是用什么协议封装的,还要了解我们要测试的系统的网络结构,服务器的配置等问题;还有就是要知道系统客户端和第一服务器间的协议,这中间就涉及到一个中间件的问题。另外我们要知道协议的选择直接关系到LR会捕获到什么样的数据包。这些是进行性能测试的基础。 下面说几个测试的原则(都是自己遇到过的,呵呵,没遇到过的就不知道了):

      1、一般情况下b/s构架的只要 选择WEB(Http/Html)协议就可以了,如果有中间件的则选择中间件服务器的协议 ;

      2、C/S结构,可以根据后端数据库的类型来选择。如SybaseCTLib协议用于测试后台的数据库为Sybase的应用;MS SQL Server协议用与测试后台数据库为 SQL Server的应用;

      3、一般不是基于浏览器的,对于一些没有数据库的Windows应用,我们在测试的过程中都会选择WinSocket协议来录制,理论上来讲我们这样选择是正确的,但我们要知道在录制的时候所选择的协议就决定了LR如何捕获数据包,如果我们选择错误了,将会捕获到一些无用的数据包。

    cs结构是比较复杂的,在这里我要提醒大家,一定要搞清楚cs是client-database还是client-server-database结构的,只有这样我们才能够决定是选择WinSocket协议还是sql协议,或者说选择多个协议;当然协议的选择也是一个探索的过程,只要能够得到我们想要的结果,那就是正确的。还有一点,我们在做性能测试的时候应该是有测试重点的,呵呵。

      4、关于单协议和双协议,我只知道IE6内核的浏览器在录制脚本的时候要选择单协议,而IE7内核的浏览器在录制脚本的时候要使用双协议。


    ===================================================================================

    应用类型      协议选择

      1. Web网站       HTTP/HTML

      2. FTP服务器     FTP

      3. 邮件服务器    IMAP,POP3,SMTP

      4. C/S (第一种)客户端以ADO,OLEDB方法连接后台数据库   MS SQL Server,Oracle,Sybase,DB2,Infrmix

         C/S (第二种)客户端以ODBC方法连接后台数据库 ODBC

         C/S (第三种)没有后台数据库   Socket

      5. ERP系统    SAP Peoplesoft

      6.分布式组件   COM/DACOM EJB

      7.无线应用     WAP PALM
     

  • LoadRunner关于验证码的解决方案

    chj_0205 发布于 2010-05-11 21:27:32

    现在好多网站系统为了防范,恶意访问系统,在登陆口进行限制,使用验证码登陆。

      验证码是随机产生的,并且验证码在页面上显示为图片。此时想通过loadrunner直接获取服务器发送过来的参数,肯定是不可行的。

      在进行性能测试的时候,有两种办法进行此类系统的测试。

      1、将验证码暂时屏蔽,待完成性能测试后,在恢复。验证码屏蔽一定不会给性能测试带来影响,这是肯定的。

      2、如果要测试系统是在用的系统,屏蔽验证码会带来不安全因素,不能屏蔽验证码。遇到这个问题当然也有办法解决--添加一个页面将验证码的输出到页面,然后用loadrunner获取到。

      JSP为例:

      验证码页面(a.jsp

    <%@ page contentType="image/jpeg" import="java.awt.*,java.awt.image.*,java.util.*,javax.imageio.*" %>
    <%!
    Color getRandColor(int fc,int bc)
    {//给定范围获得随机颜色
        Random random = new Random();
        if(fc>255) fc=255;
        if(bc>255) bc=255;
        int r=fc+random.nextInt(bc-fc);
        int g=fc+random.nextInt(bc-fc);
        int b=fc+random.nextInt(bc-fc);
        return new Color(r,g,b);
    }
    %>
    <%
    //设置页面不缓存
    response.setHeader("Pragma","No-cache");
    response.setHeader("Cache-Control","no-cache");
    response.setDateHeader("Expires", 0);

    // 在内存中创建图象
    int width=60, height=20;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    // 获取图形上下文
    Graphics g = image.getGraphics();

    //生成随机类
    Random random = new Random();

    // 设定背景色
    g.setColor(getRandColor(200,250));
    g.fillRect(0, 0, width, height);

    //设定字体
    g.setFont(new Font("Times New Roman",Font.PLAIN,18));

    //画边框
    //g.setColor(new Color());
    //g.drawRect(0,0,width-1,height-1);

    // 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到
    g.setColor(getRandColor(160,200));
    for (int i=0;i<300;i++)
    {
    int x = random.nextInt(width);
    int y = random.nextInt(height);
    int xl = random.nextInt(12);
    int yl = random.nextInt(12);
    g.drawLine(x,y,x+xl,y+yl);
    }

    // 取随机产生的认证码(4位数字)
    String sRand="";
    for (int i=0;i<4;i++){
    String rand=String.valueOf(random.nextInt(10));
    sRand+=rand;
    // 将认证码显示到图象中
    g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
    g.drawString(rand,13*i+6,16);
    }

    // 将认证码存入SESSION
    session.setAttribute("rand",sRand);
    System.out.println("---:"+sRand); //sRand就是随机数 验证码 ,把它放到session中,然后合成到图片中
    // 图象生效
    g.dispose();

    //out.clear();
    request.setAttribute("gzip", "false");

    // 输出图象到页面
    ImageIO.write(image, "JPEG", response.getOutputStream());


    out.clear();
    out = pageContext.pushBody();

    %>

    <a href="c.jsp">c.jsp</a>

    <br>
    <br>
    <img src="a.jsp"/>

    <iframe. src="c.jsp"/>

      在iframe中放入的c.jsp页面就是 获取验证码的页面。

      这儿加了一个c.jsp 页面链接,主要是用在loadrunner录制脚本的时候,a.jsp 和c.jsp在B页面上加载的顺序不是有序的,因而C.JSP可能获取到的验证码为NULL。

      c.jsp

      Q<%=session.getAttribute("rand")%>Q

      在C.JSP页面上 在取得的验证码前后加上两个Q主要为了loadrunner能够捕获到这个验证码做的标记。

    下面我们看一下 loadrunner脚本:

    Action()
    {
        web_set_max_html_param_len("1024");
        web_url("b.jsp",
            "URL=http://10.10.129.99:8080/blank/b.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=",
            "Snapshot=t1.inf",
            "Mode=HTTP",
            LAST);

        web_concurrent_start(NULL);

        web_url("a.jsp",
            "URL=http://10.10.129.99:8080/blank/a.jsp",
            "Resource=1",
            "RecContentType=image/jpeg",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            LAST);
    /*
        web_url("c.jsp",
            "URL=http://10.10.129.99:8080/blank/c.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            "Snapshot=t2.inf",
            "Mode=HTTP",
            LAST);
    */
        web_concurrent_end(NULL);

    //获取C.JSP页面上的验证码

        web_reg_save_param("aaa",
            "LB/IC=Q",
            "RB/IC=Q",
            "Ord=1",
            "Search=body",
            LAST);

        web_url("c.jsp_2",
            "URL=http://10.10.129.99:8080/blank/c.jsp",
            "Resource=0",
            "RecContentType=text/html",
            "Referer=http://10.10.129.99:8080/blank/b.jsp",
            "Snapshot=t3.inf",
            "Mode=HTTP",
            LAST);

    //打印出来 也可以通过loadrunner log日志设置查看 param
        lr_log_message("-------:%s", lr_eval_string("{aaa}"));
        return 0;
    }

      运行结果

      运行的时候 要把loadrunner的浏览器给关掉,否则lr的浏览器显示一下,相当于也做了一次请求。

311/212>
Open Toolbar