比特派的官网地址是什么|ethercat soem stm32 zip
比特派的官网地址是什么|ethercat soem stm32 zip
基于STM32构建EtherCAT主站(SOEM方案)1_codesys stm32-CSDN博客
>基于STM32构建EtherCAT主站(SOEM方案)1_codesys stm32-CSDN博客
基于STM32构建EtherCAT主站(SOEM方案)1
最新推荐文章于 2023-12-30 22:00:38 发布
拉松
最新推荐文章于 2023-12-30 22:00:38 发布
阅读量1.1w
收藏
115
点赞数
11
分类专栏:
ethercat
文章标签:
EtherCAT
SOEM
STM32
主站
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cln512/article/details/110704584
版权
ethercat
专栏收录该内容
24 篇文章
94 订阅
订阅专栏
最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。
准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。
整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。
当然了,移植过程中参考了许多网上资料(不限于以下几个)。在此,谢谢这些大佬了。
lwip移植: 这部分资料参考了原子、野火的stm32教程以及stm32参考手册,把以太网相关的部分看一下就行了。 相关论文: 王惠娇同志的硕士论文《基于嵌入式平台的EtherCAT主站实现研究》 这篇文章很关键,基本上把详细的移植过程都阐述了一遍,大家可以仔细研读一下。 成功案例: 一些网友已经在stm32上移植成功了,我在此转发一下。 EasyCAT,这是一个国外大佬做的一个项目,也是基于stm32的。 阿莫电子论坛的《基于stm32和soem的EtherCAT主站代码分享》 以及github上的一些开源代码 我移植好的soem主站,基于原子的stm32f767开发板。 点击相关文字就可以转到超链接的网站
我先去吃饭啦,有空再写。
优惠劵
拉松
关注
关注
11
点赞
踩
115
收藏
觉得还不错?
一键收藏
知道了
14
评论
基于STM32构建EtherCAT主站(SOEM方案)1
最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。当然了,移植过程中参考了许多网上资料(不限于以下几个)。在
复制链接
扫一扫
专栏目录
嵌入式实时操作系统及应用开发 北航 教材_自己动手_嵌入式_嵌入式实时操作系统及应用开发_
09-29
以嵌入式软件的核心——嵌入式实时操作系统为重点,以应用为目的,全面介绍嵌入式系统。它使读者既能对嵌入式系统及开发有一个全景的把握,又能深入理解和使用嵌入式实时操作系统。同时,为了加强理论与实践的结合,还专门为该教材配套了实验系统。实验系统包括嵌入式实时操作系统和集成开发工具,提供了丰富的实验和手册。读者利用pc就可以自己动手搭建嵌人式系统的开发平台,熟悉应用开发,更好地学习和理解嵌入式系统的基础知识。
ethercat从站stm32程序和使用文档,实现了IO、AD、DA功能。
07-20
2018年暑期自己搞的项目的一部分,包括基于stm32f407的ethercat从站程序以及配套的XML文件。实现了IO、AD、DA功能。在别人已经实现的ethercat从站功能上,我根据智昂的从站板子添加了AD、DA功能。参考了别人的提供的资料,算是踩在了巨人的肩膀上吧。
14 条评论
您还未登录,请先
登录
后发表或查看评论
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7550
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
STM32+Codesys工业软件PLC解决方案
最新发布
YEYUANGEN的专栏
12-30
1037
EPEC派芬,HOLLYSYS和利时,intercontrol的PROSYD1131,赫思曼公司iFlex 系列、力士乐的RC系列,TT control 公司TTC系列 [1]控制器等PLC厂家都是使用CODESYS平台开发自己的编程软件的。并且通过实例演示,帮助您将学到的知识无缝应用到实际工程项目中。(CODESYS是Controlled Development System的缩写),在PLC程序员编程时,CODESYS为强大的IEC语言提供了一个简单的方法,系统的编辑器和。上有了很大的改善,朝。
基于STM32构建EtherCAT主站(SOEM方案)2
热门推荐
cln512的博客
12-22
1万+
基于stm32构建ethercat主站
移植 SOEM 到嵌入式平台 STM32F767
m0_68007244的博客
03-12
5980
STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码 提供配套CUBE工程。
SOEM协议栈使用1.3.1版本。
可配套NUCLEO-H743ZI开发板使用。
支持DC同步。
可配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B/A6B和欧姆龙G5系列驱动器使用
移植 SOEM 到嵌入式平台的过程就是重写 SOEM 抽象层的过程。在此之前,
先了解一下以太网口电路。
STM
STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案
YEYUANGEN的专栏
09-20
930
TwinCAT,Codesys,欧姆龙,Trio,SOEM,IGH,Acontis,KPA 等。EtherCAT_Step_Motor_V1.0,四轴步进电机驱动器,单轴驱动最大电流 3A。带步进电机加减速最大 500 转/s²,最高速度 3000 转/min,最低转速 0.001。I10-I12 为电机 4 的数字输入,触发时,对应总线的输入对象字典显示 1、2、4。4pin 端子为步进电机端子,自上到下依次为电机 1、电机 2、电机 3、电机 4。分以上时,电机基本上处于空载状态。数字输入通道导通时,
vs code 开发stm32
qq_26840085的博客
10-14
1032
环境搭建
作者在使用官方IDE开发了一段时间后,发现了很多的不足之处,遂转战VSCode + 开源 arm 工具链 + OpenOCD开发STM32的环境,该方案可跨平台使用,希望对读者有所帮助。
需安装的软件如下:
1、STM32CubeMX:通过官方该工具可快速生成带makefile的HAL库工程。下载网址如下,需要登陆方可下载。
STM32CubeMX - STMicroelectronics
2、vs code:编辑器,链接如下
Visual Studio Code - Code Edi
(转载)STM32与LAN9252构建EtherCAT从站
xiahailong90的博客
02-27
9502
EtherCAT Technology Group | 联系方式。使用SSC,可以快速地构建EtherCAT从站代码,保证从站协议栈与最新的EtherCAT协议相匹配,同时还可以生成从站设备描述文件,这是一份XML文件,需要放在TwinCAT安装路径下的目录下,在使用TwinCAT对设备进行组态时需要使用。是EtherCAT从站设计过程中很重要的一个文件,关于从站设备传输多少数据,是否启用分布式时钟,PHY(LAN9252)与MCU之间如何通信等等重要数据都在这个描述文件中定义。
基于stm32构建EtherCAT主站,采用了开源的soem方案
12-05
基于stm32构建EtherCAT主站,将soem方案移植到了stm32上。基本功能测试正常,可以驱动一部分的伺服电机,但也存在一些bug。整体移植方式应该是正确的,具体移植方式将写于CSDN博客中。
基于STM32的最精练的PLC解释器核心算法源代码
04-28
最精练的基于STM32的PLC解释器核心算法源代码!!!不仅可以用于可编程解释器,也可以用于IC设计的IP核开发、操作系统开发等。
能看懂不?绝对可以让您终生受益无穷!
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序.zip
01-21
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序,该程序使用stm32f407芯片,ucosii系统,dp83848以太网芯片实现etherCAT主站程序,并使用台达etherCAT伺服测试成功
基于SOEM的EtherCat主站程序控制汇川SV660
06-02
LAN8720,DP83848,汇川SV660,SV620,无操作系统STM32F407
lan9252与stm32的EtherCAT从站实现,ethercat主站代码stm32,C,C++
09-10
实现基于 LAN9252
ubuntu14.04、xenomai3.1、ethercat igh构建主站(1)
cln512的博客
06-22
8704
内核选用4.1.18
参考文章
https://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai3.html
https://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai.html
https://www.bilibili.com/video/BV1wg4y1z7C2?t=1399
第一步
./scripts/prepare-kernel.sh --linux=/home/vmuser/workspace/linux-4
ubuntu14.04、xenomai3.1、ethercat igh构建主站(2)
cln512的博客
06-29
7218
我是在i9 9900k的主机上编译的linux内核、xenomai以及ethercat igh。
有如下两个版本:
1.linux4.9.38+xenomai3.1+ethercat igh
2.linux3.14.44+xenomai2.6.5+ethercat igh
我分别在i5 6600和i5 4460上进行了测试。都能成功驱动台达ethercat伺服(ASD-A2-0421-E),说明主站可以正常运行。
xenomai的实时性方面,i5 4460主机的效果比i5 6600主机好很多。i5
基于stm32平台的ethercat主站 源代码 例程
07-26
基于STM32平台的EtherCAT主站的源代码例程是指用于实现EtherCAT主站功能的代码示例。EtherCAT(Ethernet for Control Automation Technology)是一种以太网通信协议,它可以实现高性能、实时性的工业控制系统。STM32是一种微控制器系列,常用于嵌入式系统和物联网设备。
在该源码例程中,主要包括以下几个方面的功能:
1. 初始化EtherCAT主站:设置STM32与EtherCAT总线之间的通信参数和初始化相关硬件资源,如CAN接口和中断。
2. EtherCAT主站通信:与其他EtherCAT设备进行通信,包括发送和接收数据报文,处理EtherCAT帧以及实现EtherCAT协议的各个功能。
3. 处理从站设备:与连接到EtherCAT总线上的从站设备进行通信,包括配置从站设备、发送和接收从站设备的数据等。
4. 实现EtherCAT主站的主要功能:根据实际需求,可以添加不同的功能模块,如数据采集、控制逻辑等。
该源代码例程可能包含多个文件,其中可能包括主函数文件、EtherCAT主站驱动文件、CAN通信文件、EtherCAT协议处理文件等。开发者可以根据具体需求进行修改和扩展。
通过使用该源代码例程,开发者可以在STM32平台上快速开发出具有EtherCAT通信功能的主站设备,以满足工业自动化控制系统的需求。但需要注意,由于EtherCAT协议本身较为复杂,对于初次接触EtherCAT的开发者来说,可能需要一定的学习和熟悉过程。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
拉松
CSDN认证博客专家
CSDN认证企业博客
码龄9年
暂无认证
44
原创
1万+
周排名
64万+
总排名
16万+
访问
等级
1717
积分
499
粉丝
210
获赞
187
评论
1310
收藏
私信
关注
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
最新评论
基于STM32构建EtherCAT主站(SOEM方案)2
专噶猛男腰子:
不知道你解决了没,0x6040是伺服的使能流程,一般都是写6-7-F这样子,具体可以参考cia 402的控制手册,大概的意思 先清除报警然后(6/7)停机,后(f)使能驱动器。
基于STM32构建EtherCAT主站(SOEM方案)1
weixin_57482667:
大佬移植后的是不是用Codesys软件来编程的?
DIY运动控制器——移植grbl(软件架构、脉冲产生)
weixin_41776940:
最核心的就是这个,布鲁森汉姆插补
法。网上有一篇文章是讲关于这个算法的推导
beaglebone(AM335X)安装igh-ethercat
星栈:
博主你好,我am335x开发板4.1.18内核,暂时没有打实时补丁,已经移植好igh在开发板上了,现在正在交叉编译你博客里的igh.c;我输入指令arm-linux-gnueabihf-gcc igh.c -o igh
igh.c:11:29: fatal error: native/task.h: No such file or directory出现报错,缺少头文件,我没有xenomai的头文件,也没有rtdk.h,有rtdm.h但是指定目录后还是报错,请问您是怎么指定头文件目录并且交叉编译出来的
EtherCAT从站读取MPU9250数据并进行姿态解算
hehao9051:
有没有第一版本的资料可以参考呀,FSMC没有调通
大家在看
企业电子招标采购系统源码Spring Cloud + Spring Boot + MybatisPlus + Redis + Layui + 前后端分离 + 二次开发
64
【PLC学习十】PLC必会功能——报警
1
AI时代,Java从业者必学科目:数据机构和算法,以及AI算法和技能
提速电商效果图云渲染:优势与策略
283
爬取全国建筑公司信息,普通的AES解密,但是有陷阱,基于响应器去确定位置。
394
最新文章
基于rt thread smart构建EtherCAT主站
rt thread smart制作emmc镜像
rt thread smart适配野火imx6ull开发板的KSZ8081网卡
2022年5篇
2021年12篇
2020年9篇
2019年18篇
目录
目录
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
目录
评论 14
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
基于STM32的伺服总线EtherCAT主站设计——SOEM方案_stm32 ethercat-CSDN博客
>基于STM32的伺服总线EtherCAT主站设计——SOEM方案_stm32 ethercat-CSDN博客
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
河狸打捞员
已于 2023-09-25 22:03:08 修改
阅读量7.5k
收藏
161
点赞数
29
分类专栏:
CANopen、EtherCAT
文章标签:
stm32
单片机
嵌入式硬件
于 2023-04-16 23:44:49 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_48501028/article/details/128835795
版权
CANopen、EtherCAT
专栏收录该内容
4 篇文章
11 订阅
订阅专栏
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线。由于本人才疏学浅,如有错误,还请指正。
下文蓝色带下划线为参考资料的网址链接,蓝色字体为参考资料名称。
一、EtherCAT介绍
在了解EtherCAT之前,建议对于TCP/IP的概念有一些了解,可以观看正点原子的介绍视频:【正点原子】手把手教你学lwIP_哔哩哔哩_bilibili(建议看完前7讲)
对于EtherCAT概念的了解,可以观看:【工业通讯】EtherCAT&EtherNet/IP基础知识讲解合集_哔哩哔哩_bilibili
本项目移植过程中,参考的文献如下:
[1]王惠娇. 基于嵌入式平台的EtherCAT主站实现研究[D].郑州大学,2018.
[2]毛令. 基于STM32的嵌入式EtherCAT主站的研究与实现[D].北方民族大学,2022
[1]刘豪志. 基于嵌入式Linux的EtherCAT主站设计及伺服控制系统研究[D].南京航空航天大学,2020.
以上绍视频和文献,对于ETH和EtherCAT帧结构、寻址模式、通讯模式、同步模式等知识点讲解比较清晰,这里就不展开介绍。我们就直入主题,介绍在STM32H743基于SOEM实现EtherCAT通讯的移植和调试过程。
二、SOME库架构分析
SOEM的代码的官网下载链接:GitHub -OpenEtherCATsociety/SOEM: Simple Open Source EtherCAT Master
SOEM库采用分层设计,并且提供了一个抽象层,将SOEM协议栈与具体操作系统和硬件分开。抽象层由OSAL和OSHW两个模块组成,OSAL是操作系统抽象层,OSHW 是硬件抽象层,移植的主要内容就是对OSAL和OSHW具体API实现,在新的操作系统和硬件平台上的重写。
SOEM的层级架构如下图所示:
2.1 抽象层
抽象层可以分为操作系统抽象层OSAL和硬件抽象层OSHW两部分。
OSAL模块侧重于操作系统的抽象和时间机制。由osal.h和osal.c组成。定义了基本数据类型,时间相关结构以及时间和定时器相关API和线程相关API。其中的时间和定时器相关的API是必须实现的,线程相关的API不是必须实现的。
OSHW模块侧重于为上层提供网络服务。由oshw.h/oshw.c和nicdrv.h/nicdrv.c四个文件组成。oshw.h/.c主要实现网络大小端和本地大小端的转换,nicdrv.h/.c是网络驱动,主要实现 EtherCAT帧的发送和接收。
不同平台上nicdrv模块的逻辑结构基本相同,需要实现的是三个底层API:
(1)网口的初始化 (2)MAC层帧发送 (3)MAC层帧接收
2.2 中间层
SOEM的中间层,是EtherCAT协议 栈的具体实现,包含BASE模块、MAIN模块、CONFIG模块、CONFIGDC模块、COE等。各层的功能如下表所示。
层 功能 BASE 将工业应用数据组装成 EtherCAT 帧 MAIN 顺序寻址、广播方式、配置地址、逻辑地址方式对从站读写读写从站 EEPROM CONFIG 提供邮箱模式的非过程数据读写和三缓冲模式的过程数据 PDO读写初始化从站控制器的寄存器,配置从站FMMU CONFIGDC 提供分布式时钟,实现主从站之间时钟同步 COE CANOpen Over EtherCAT FOE File Over EtherCAT SOE Sercos Over EtherCAT
2.3 应用层
APP应用层并不属于SOEM库,应用层调用SOEM提供的服务,实现具体的应用,由用户按所需自行编辑。
三、移植SOEM到嵌入式平台STM32H743
本项目的移植流程参考文献:[1]王惠娇. 基于嵌入式平台的EtherCAT主站实现研究[D].郑州大学,2018.
网上也有人提供了程序源码,如以下的链接是基于STM32H743实现,论坛链接里有提供源码!!!
EasyControl ethercat总线 精简主从站方案 (amobbs.com 阿莫电子论坛
基于stm32和soem的EtherCAT主站代码分享 (amobbs.com 阿莫电子论坛
3.1 以太网口电路
移植SOEM到嵌入式平台的过程就是重写SOEM抽象层的过程。在STM32H743的开发板上,通过RMII外接一个PHY芯片,型号是LAN8720A。STM32H743的以太网口电路详见官方资料《STM32H7开发指南-HAL库版本_V1.0 66.1.1》介绍。
使用RMII接口,其电路图如下:
以太网口的电路,具体可参考网上博主的教程:基于STM32构建EtherCAT主站(SOEM方案)3_stm32 ethercat_拉松的博客
3.2 主站时钟优化
STM32H743具有400MHz的CPU频率,可是实现微秒级别精度的系统时钟。为了避免使用tick机制实现系统时钟的中断干扰,采用硬件定时器级联,将TIM3和TIM2二者级联起来,其中TIM2为32位计时器,TIM3为16位计时器,将二者连起来实现48比特系统时间。
设置TIM2频率1MHz,1us计数一次。配置TIM2输出一个1Hz的时钟信号,作为TIM3的输入端。这样,TIM2的计数值就是微秒数,TIM5的计数值是秒数。
代码如下:
//计时器 通过读取CNT值实现计时 避免中断的影响 TIM2 TIM3
//设置TIM2主模式,输入时钟1mhz,产生1hz的TRGO信号
//设置TIM3为从模式,时间源为TIM2更新信号
void PhyTim_EtherCAT_Init(void)
{
//-----------------TIM2初始化------------------//
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig; //定时器主模式配置
TIM_SlaveConfigTypeDef sSlaveConfig; //定时器从模式配置
TIM2_Handler.Instance = TIM2; //通用定时器2
TIM2_Handler.Init.Prescaler=199; //分频
TIM2_Handler.Init.CounterMode=TIM_COUNTERMODE_UP; //向上计数器
TIM2_Handler.Init.Period=1000000-1; //自动装载值
TIM2_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//时钟分频因子
TIM2_Handler.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; //自动重装载 写入新值后,计数器完成当前旧的计数后,再开始新的计数周期
HAL_TIM_Base_Init(&TIM2_Handler);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; //使用内部时钟源 外部触发预分频器 关闭预分频器 TIM2->SMCR
HAL_TIM_ConfigClockSource(&TIM2_Handler, &sClockSourceConfig); //定时器时钟配置
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_ENABLE; //TIM2设置为主模式
sMasterConfig.MasterOutputTrigger = TIM_TRGO_UPDATE; // 选择更新事件作为触发输出 (TRGO)
HAL_TIMEx_MasterConfigSynchronization(&TIM2_Handler, &sMasterConfig);
HAL_TIM_Base_Start(&TIM2_Handler); //使能定时器2
//-----------------TIM3初始化------------------//
TIM3_Handler.Instance = TIM3; //通用定时器3
TIM3_Handler.Init.Prescaler = 0; //不分频
TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数器
TIM3_Handler.Init.Period = 50000; //自动装载值
TIM3_Handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟分频因子
HAL_TIM_Base_Init(&TIM3_Handler);
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_ITR1; //定时器时钟源选择
HAL_TIM_ConfigClockSource(&TIM3_Handler, &sClockSourceConfig);
sSlaveConfig.SlaveMode = TIM_SLAVEMODE_EXTERNAL1; //外部时钟模式1 由所选触发信号 (TRGI) 的上升沿提供计数器时钟 TIM3->SMCR[2;0]=111
sSlaveConfig.InputTrigger = TIM_TS_ITR1; // 输入触发:选择 ITR0 作为输入源
sSlaveConfig.TriggerPolarity = TIM_TRIGGERPOLARITY_RISING;// 触发极性:上升沿
sSlaveConfig.TriggerPrescaler = TIM_TRIGGERPRESCALER_DIV1;// 触发预分频:无
sSlaveConfig.TriggerFilter = 0x0; // 滤波:不需要任何滤
HAL_TIM_SlaveConfigSynchronization(&TIM3_Handler, &sSlaveConfig); //定时器从模式配置
HAL_TIM_Base_Start(&TIM3_Handler);
}
//定时器底册驱动,开启时钟,设置中断优先级
//此函数会被HAL_TIM_Base_Init()函数调用
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM6) //0.5ms TIM6
{
__HAL_RCC_TIM6_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM6_DAC_IRQn,3,1);
HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
}
else if(htim->Instance==TIM7) //2ms TIM7
{
__HAL_RCC_TIM7_CLK_ENABLE();
HAL_NVIC_SetPriority(TIM7_IRQn,4,1);
HAL_NVIC_EnableIRQ(TIM7_IRQn);
}
else if(htim->Instance==TIM2) // TIM2
{
__HAL_RCC_TIM2_CLK_ENABLE();
}
else if(htim->Instance==TIM3) // TIM3
{
__HAL_RCC_TIM3_CLK_ENABLE();
}
}
//读取时间
uint32_t GetSec(void) //获取时间/秒
{
return TIM3->CNT;
}
uint32_t GetUSec(void) //获取时间/微妙
{
return TIM2->CNT;
}
参考资料:STM32定时器同步模式 四种_tim_masterconfigtypedef_luowei_memory的博客
3.3 网络驱动移植
STM32H743的ETH介绍详见 《STM32H7开发指南-HAL库版本_V1.0 66.1.1》,正点原子的教程也有介绍:【正点原子】手把手教你学lwIP_哔哩哔哩_bilibili
nicdrv负责Ethernet帧的打包和解包,需要实现EtherCAT帧通过MAC层发送出去,并将从MAC层接收到的EtherCAT帧送给nicdrv。Nicdrv模块的实现是EtherCAT移植的关键。
参考网上博主的介绍,相应的代码更改为H743即可。
基于STM32构建EtherCAT主站(SOEM方案)2_stm32 ethercat_拉松的博客;
基于STM32构建EtherCAT主站(SOEM方案)5_拉松的博客
在调试的时候,报错找不到从站,经过调试时PHY初始化的时候,滤波模式没有设置好(F767为混杂模式设置),修正后的代码如下:
//LAN8720初始化
int32_t Lan8720_Init(void)
{
//===============================================================MAC====================================================================
u32 sn0 = *((vu32*)(0x1FF0F420)); //获取STM32的唯一ID的前24位作为MAC地址后三字节
u8 macaddress[6]; //MAC地址
//MAC地址设置(高三字节固定为:2.0.0,低三字节用STM32唯一ID)
macaddress[0]=2; //高三字节(IEEE称之为组织唯一ID,OUI)地址固定为:2.0.0
macaddress[1]=0;
macaddress[2]=0;
macaddress[3]=(sn0>>16)&0XFF; //低三字节用STM32的唯一ID
macaddress[4]=(sn0>>8)&0XFF;
macaddress[5]=sn0&0XFF;
//硬件复位
__set_PRIMASK(1); //关闭所有中断,复位过程不能被打断!
PhyPCF8574_WriteBit(ETH_RESET_IO,1); //硬件复位
delay_ms(100);
PhyPCF8574_WriteBit(ETH_RESET_IO,0); //复位结束
delay_ms(100);
__set_PRIMASK(0); //开启所有中断
NETMPU_Config(); //MPU保护设置
ETH_Handler.Instance=ETH; //ETH
ETH_Handler.Init.MACAddr=macaddress; //MAC地址
ETH_Handler.Init.MediaInterface=HAL_ETH_RMII_MODE; //RMII接口
ETH_Handler.Init.RxDesc=DMARxDscrTab; //发送描述符
ETH_Handler.Init.TxDesc=DMATxDscrTab; //接收描述符
ETH_Handler.Init.RxBuffLen=ETH_MAX_PACKET_SIZE; //接收长度
//初始化ETH
HAL_ETH_Init(Ð_Handler);
memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig));
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD; //Tx数据包硬件功能
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC; //指定校验和插入控件:启用 IP 标头校验和和有效负载校验和计算和插入
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT; //指定CRC和Pad插入和替换控件
//===============================================================PHY====================================================================
uint32_t idx, duplex, speed = 0;
int32_t PHYLinkState; //Lan8720状态
ETH_MACConfigTypeDef MACConf; //ETH MAC 配置结构定义
ETH_MACFilterConfigTypeDef filterDef; //ETH MAC滤波器结构定义
HAL_ETH_GetMACFilterConfig(Ð_Handler,&filterDef); //获取 ETH MAC 过滤器配置
filterDef.PromiscuousMode = ENABLE; //过滤器使能PM模式
HAL_ETH_SetMACFilterConfig(Ð_Handler,&filterDef); //设置ETH MAC 过滤器
//将内存缓冲区分配给 DMA Rx 描述符
for(idx = 0; idx < ETH_RX_DESC_CNT; idx ++)
{
HAL_ETH_DescAssignMemory(Ð_Handler, idx, Rx_Buff[idx], NULL);
}
//===============================================================LAN8720=================================================================
uint32_t regvalue = 0, addr = 0;
u32 timeout=0; //超时计时
u32 regval=0; //lan8720addr 只有一个网口 默认使用0
u32 phylink=0;
HAL_StatusTypeDef rtn; //定义HAL状态结构
HAL_ETH_SetMDIOClockRange(Ð_Handler); //配置ETH MDIO接口的时钟范围
//获取lan8720地址
lan8720addr = 32;
for(addr = 0; addr <= lan8720addr; addr ++)
{
rtn = HAL_ETH_ReadPHYRegister(Ð_Handler, addr, LAN8720_SMR, ®value);
if( rtn != HAL_OK){continue;}
if((regvalue & LAN8720_SMR_PHY_ADDR) == addr)
{
lan8720addr = addr;
break;
}
}
if(LAN8720_WritePHY(LAN8720_BCR,LAN8720_BCR_SOFT_RESET)>=0) //LAN8720软件复位 判断LAN8720寄存器读写是否正常
{
//等待软件复位完成
if(LAN8720_ReadPHY(LAN8720_BCR,®val)>=0)
{
while(regval&LAN8720_BCR_SOFT_RESET)
{
if(LAN8720_ReadPHY(LAN8720_BCR,®val)<0)
{
PHYLinkState=LAN8720_STATUS_READ_ERROR;
break;
}
delay_ms(10);
timeout++;
if(timeout>=LAN8720_TIMEOUT) break; //超时跳出,5S
}
}
else
{
PHYLinkState=LAN8720_STATUS_READ_ERROR;
}
}
else
{
PHYLinkState=LAN8720_STATUS_WRITE_ERROR;
}
//===============================================================SET=================================================================
do
{
delay_ms(100);
PHYLinkState = LAN8720_GetLinkState(); //读取链接状态
}while(PHYLinkState <= LAN8720_STATUS_LINK_DOWN);
//打印连接状态
printf("ETH工作状态: ");
switch (PHYLinkState)
{
case LAN8720_STATUS_100MBITS_FULLDUPLEX:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_100M;
printf(" 100Mb/s FullDuplex \r\n");
break;
case LAN8720_STATUS_100MBITS_HALFDUPLEX:
duplex = ETH_HALFDUPLEX_MODE;
speed = ETH_SPEED_100M;
printf(" 100Mb/s HalfDuplex \r\n");
break;
case LAN8720_STATUS_10MBITS_FULLDUPLEX:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_10M;
printf(" 10Mb/s FullDuplex \r\n");
break;
case LAN8720_STATUS_10MBITS_HALFDUPLEX:
duplex = ETH_HALFDUPLEX_MODE;
speed = ETH_SPEED_10M;
printf(" 10Mb/s HalfDuplex \r\n");
break;
default:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_100M;
printf(" 100Mb/s FullDuplex__ \r\n");
break;
}
HAL_ETH_GetMACConfig(Ð_Handler, &MACConf); //获取 MAC 和 MTL 子系统的配置
MACConf.DuplexMode = duplex; //ETH工作模式 全双工/半双工
MACConf.Speed = speed; //ETH传输速度
MACConf.TransmitQueueMode = ETH_TRANSMITTHRESHOLD_128; //ETH传输模式 128字节
HAL_ETH_SetMACConfig(Ð_Handler, &MACConf); //MAC 配置
HAL_ETH_Start_IT(Ð_Handler); //开启ETH中断
HAL_ETH_BuildRxDescriptors(Ð_Handler); //将上次接收的数据包的 Rx Desc返回给 DMA
}
四、主站软件系统测试
上一节参考链接介绍,已经将Ether CAT主站协议库SOEM成功移植到嵌入式平台STM32H743上,本章从EtherCAT主站实现的有效性、可靠性、稳定性出发,对嵌入式平台的EtherCAT主站驱动从站进行测试分析。
4.1 硬件平台搭建
本项目调试所使用的伺服驱动器为英威腾的DA200,对于该伺服的介绍乐意查看以下链接:DA200交流伺服驱动器
实验平台及接线如下图所示,参考《DA200系列交流伺服驱动器中文说明书V2.2_3.2.1节》
参考说明书《英威腾SV-DA200交流伺服驱动器_EtherCAT技术指南V2.62》的第2章,在ServoPlorer软件上设置以下参数:
参数 名称 数值 P0.01 电机代码 2300 P0.03 控制模式选择 8 [EtherCAT 模式] P4.08 EtherCAT 同步类型 2: DCMode P4.07 EtherCAT同步周期 2: 1ms P4.09 EtherCAT 故障检测时间 100ms
4.2 EtherCAT应用层编辑
使用EtherCAT控制伺服电机,具体的配置可以总结为以下过程:
EtherCAT初始化过程 相关函数 配置初始化 ec_init() ec_config_init(FALSE) INVT_DA200_setup() 分配分布式时钟 ec_configdc() 配置过程数据映射 ec_config_map(&IOmap) 请求所有从站进入到安全模式
4.2.1 PDO 映射
其中的INVT_DA200_setup()为从站伺服器的PDO映射,参考《英威腾SV-DA200交流伺服驱动器_EtherCAT技术指南》介绍,具体的操作步骤为:
英威腾 PDO 映射的操作步骤代码如下:
// 英威腾 PDO 映射的操作步骤
int INVT_DA200_setup(uint16 slvcnt)
{
EtherCAT_write8(slvcnt, 0x1C12, 00, 0); // 1 停止PDO分配功能(将0x1C12和0x1C13的子索引0设置为0)
EtherCAT_write8(slvcnt, 0x1600, 00, 0); // 2 停止PDO映射功能(将0x1600~0x1603和0x1A00~0x1A03的子索引0全部设置为0)
EtherCAT_write32(slvcnt, 0x1600, 01, 0x60400010); // 3 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)的映射入口
EtherCAT_write32(slvcnt, 0x1600, 02, 0x607A0020); // 3 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)的映射入口
EtherCAT_write8(slvcnt, 0x1600, 00, 2); // 4 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)映射入口的数值
EtherCAT_write16(slvcnt, 0x1C12, 01, 0x1600); // 5 设置PDO分配对象(设置0x1C12和0x1C13的子索引1);
EtherCAT_write8(slvcnt, 0x1C12, 00, 1); // 6 重新打开PDO分配功能(将0x1C12和0x1C13的子索引0设置为1)
/**********************************************************************************************************/
EtherCAT_write8(slvcnt, 0x1C13, 00, 0); // 1 停止PDO分配功能(将0x1C12和0x1C13的子索引0设置为0)
EtherCAT_write8(slvcnt, 0x1A00, 00, 0); // 2 停止PDO映射功能(将0x1600~0x1603和0x1A00~0x1A03的子索引0全部设置为0)
EtherCAT_write32(slvcnt, 0x1A00, 01, 0x60410010); // 3 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)的映射入口
EtherCAT_write32(slvcnt, 0x1A00, 02, 0x60640020); // 3 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)的映射入口
EtherCAT_write8(slvcnt, 0x1A00, 00, 2); // 4 设置PDO映射对象(0x1600~0x1603和0x1A00~0x1A03)映射入口的数值
EtherCAT_write16(slvcnt, 0x1C13, 01, 0x1A00); // 5 设置PDO分配对象(设置0x1C12和0x1C13的子索引1);
EtherCAT_write8(slvcnt, 0x1C13, 00, 1); // 6 重新打开PDO分配功能(将0x1C12和0x1C13的子索引0设置为1)
EtherCAT_write8(slvcnt, 0x6060, 00, 8); //设置操作模式 :周期性同步位置模式
return 0;
}
4.2.2 EtherCAT 状态机
此外,还要实现EtherCAT状态机,状态机用于描述从站应用的状态和状态改变。状态改变请求通常由主站发起,从站响应。具体状态跳转方式如下图:
状态机的实现代码如下所示:
//EtherCAT状态机
void EtherCAT_ctrl_state(void)
{
switch (outputs1->controlword) //获取当前状态 0x6041状态字
{
case 0: //Switch on disabled
outputs1->controlword = 6; //Shutdown
break;
case 6: //Ready to switch on
outputs1->controlword = 7; //Disable voltage + Quick stop
break;
case 7: //Switched on
outputs1->targetPostion = inputs1->actualPostion; //查询【6064h: Position actual value】来获取电机实际位置反馈
outputs1->controlword = 0x0f; // Enable operation
break;
case 0x0f: //Operation enabled
if( OpenReady == 0 )
OpenReady = 1;
else
OpenReady = 0;
break;
default:
outputs1->controlword = 6; //Shutdown
break;
}
}
对于EtherCAT状态设置主要是对6041h状态字的查询和设置,如下图所示:
4.2.3 周期性同步位置模式
使用周期性同步位置模式控制电机转动,在该模式下,插补周期与 EtherCAT同步周期相同(本文设置为1ms)。
1、 设置 6060 h为 8,选择 Cyclic Synchronous Position Mode;
2、 设置 6040 h以使能驱动器,发送 0x0F;
3、 逐次设置 607A h为目标位置(绝对位置),进行位置控制。
具体的操作方法如下图所示:
通过逐次设置 607A h为目标位置(绝对位置),进行位置控制,实现电机的转动。
以上是本人使用SOEM方案在STM32H743实现EtherCAT主站通讯,的整个过程,如有错误,还请指教交流。
优惠劵
河狸打捞员
关注
关注
29
点赞
踩
161
收藏
觉得还不错?
一键收藏
打赏
知道了
11
评论
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
复制链接
扫一扫
专栏目录
EtherCAT主站SOEM -- 10 -- SOEM主站通信过程函数解析
qq_50808730的博客
12-17
1206
这个函数的目的是根据给定的网络接口名称,初始化相关的数据结构,并设置Ethernet设备。总体而言,这个函数的作用是根据特定规则填充以太网头部结构体,其中目标MAC地址被设置为广播地址,源MAC地址被设置为特定的。数组值,以太网类型字段被设置为特定协议类型。数组的前三个元素,通过这种方式将源MAC地址填充到以太网头部。这三行设置目标MAC地址为广播地址,即全FF(0xffff)。,是用于设置Ethernet通信接口的。,用于填充以太网头部结构体。,该值可能是一个特定的以太网协议类型。设置以太网类型字段为。
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序.zip
01-21
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序,该程序使用stm32f407芯片,ucosii系统,dp83848以太网芯片实现etherCAT主站程序,并使用台达etherCAT伺服测试成功
11 条评论
您还未登录,请先
登录
后发表或查看评论
基于SOEM的EtherCat主站程序控制汇川SV660
06-02
LAN8720,DP83848,汇川SV660,SV620,无操作系统STM32F407
STM32F303+LAN9252的EtherCAT实现IO、AD、DA
热门推荐
Taqingjie的博客
10-29
1万+
STM32F303+LAN9252的EtherCAT下位机设计
从去年年末接触EtherCAT总线以来,由于其他一些工作原因,前期设计的基于STM32F303+LAN9252开发板一直未能跑通,仅实现了LAN9252这部分电路与Twincat的通讯,MCU与LAN9252未能成功通信交互数据。近段时间又返回重新开始了这部分内容。终于是将下位机调试成功。之前在选择MCU时考虑很多,最后在网上找到了这样一份答案,选取EtherCAT主控单片机时应选择FLASH在25KB、RAM在32KB以上的MCU,考虑成本
基于STM32构建EtherCAT主站(SOEM方案)1
cln512的博客
12-05
1万+
最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。
准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。
整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。
当然了,移植过程中参考了许多网上资料(不限于以下几个)。在
基于stm32构建EtherCAT主站,采用了开源的soem方案
12-05
基于stm32构建EtherCAT主站,将soem方案移植到了stm32上。基本功能测试正常,可以驱动一部分的伺服电机,但也存在一些bug。整体移植方式应该是正确的,具体移植方式将写于CSDN博客中。
EtherCAT主站——SOEM(学习笔记1)
a1347065101的博客
07-14
3908
EtherCAT 是一个以以太网为基础的开放架构的现场总线系统,EtherCAT 数
据部分封装在以太网帧中,主站发送以太网帧在以太网上传输。
基于STM32构建EtherCAT主站(SOEM方案)2
cln512的博客
12-22
1万+
基于stm32构建ethercat主站
soem 学习1
jjinl的专栏
10-04
2640
ethercat主站学习计划,soem源码阅读
(转载)STM32与LAN9252构建EtherCAT从站
xiahailong90的博客
02-27
9502
EtherCAT Technology Group | 联系方式。使用SSC,可以快速地构建EtherCAT从站代码,保证从站协议栈与最新的EtherCAT协议相匹配,同时还可以生成从站设备描述文件,这是一份XML文件,需要放在TwinCAT安装路径下的目录下,在使用TwinCAT对设备进行组态时需要使用。是EtherCAT从站设计过程中很重要的一个文件,关于从站设备传输多少数据,是否启用分布式时钟,PHY(LAN9252)与MCU之间如何通信等等重要数据都在这个描述文件中定义。
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
ethercat从站stm32程序和使用文档,实现了IO、AD、DA功能。
07-20
2018年暑期自己搞的项目的一部分,包括基于stm32f407的ethercat从站程序以及配套的XML文件。实现了IO、AD、DA功能。在别人已经实现的ethercat从站功能上,我根据智昂的从站板子添加了AD、DA功能。参考了别人的提供的资料,算是踩在了巨人的肩膀上吧。
STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案
YEYUANGEN的专栏
09-20
930
TwinCAT,Codesys,欧姆龙,Trio,SOEM,IGH,Acontis,KPA 等。EtherCAT_Step_Motor_V1.0,四轴步进电机驱动器,单轴驱动最大电流 3A。带步进电机加减速最大 500 转/s²,最高速度 3000 转/min,最低转速 0.001。I10-I12 为电机 4 的数字输入,触发时,对应总线的输入对象字典显示 1、2、4。4pin 端子为步进电机端子,自上到下依次为电机 1、电机 2、电机 3、电机 4。分以上时,电机基本上处于空载状态。数字输入通道导通时,
SOEM主站开发篇(3):为APP程序添加命令
kevin1499的博客
11-23
105
详细介绍了如何在SOEM主站的APP程序内增加一个命令调用功能,为后面的SOEM主站开发铺路。
基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码技术分析
jxcwgir的博客
08-17
600
此外,该主站源码还可以与多种驱动器配合使用,如汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B A6B和欧姆龙G5系列驱动器等。本文介绍了基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码,该源码提供了配套的CUBE工程,使用SOEM协议栈的1.3.1版本,可配套NUCLEO-H743ZI开发板使用,支持DC同步。此外,该主站源码还可以与多种驱动器配合使用,提供了方便快捷的通信方式,满足了工业自动化领域的需求。
[工业互联-18]:常见EtherCAT主站方案:SOEM的Windows/Linux解决方案
文火冰糖(王文兵)的博客
07-09
2481
SOEM (Simple Open EtherCAT Master) 是一种开源的EtherCAT主站协议栈。EtherCAT(Ethernet for Control Automation Technology)是一种高性能实时以太网通信技术,用于实现工业自动化领域中的分布式控制系统。SOEM 提供了在PC或嵌入式系统上实现EtherCAT主站功能的软件库。它是一个轻量级的、可定制的协议栈,适用于不同的操作系统平台,例如Linux、Windows和RTOS等。
【FreeRTOS的SOEM-master(1.4.1)移植】
pengrunxin的博客
10-08
3241
工作需要移植soem做EtherCAT主站,就跟大家分享如何移植soem,板块网口一个,实现soem与lwip能共用。
十四.EtherCAT开发之ST MCU STM32F407ZGt6+ AX58100的开发FOE应用
aiot_bigbear的专栏,关注我获取最新技术文章信息与海量资源~
06-21
2469
STM32F407ZGt6与AX58100是 SPI连接,工作在SPI模式。FoE(File Access over EtherCAT)可实现EtherCAT节点之间的文件传输。
SOEM协议栈代码研读笔记(一)
zhiyaormb的博客
08-20
3101
对EtherCAT开源协议栈SOEM的源代码进行分析和解读
基于stm32的伺服总线ethercat主站设计
最新发布
12-05
基于STM32的伺服总线EtherCAT主站设计主要包括硬件和软件两个方面。硬件方面,首先要选择STM32系列微控制器作为主控芯片,该系列芯片具有丰富的外设资源和高性能的处理能力。其次,需要添加EtherCAT通信模块,例如ENC28J60芯片,用于实现与EtherCAT从站的通信。还需要加入电源管理模块、驱动器和通信接口等相关硬件电路。在设计时需要注意电路布局的合理性,防止干扰和噪音影响通信稳定性。
软件方面,主要涉及EtherCAT主站协议栈的实现和相应的控制算法开发。首先,需要编写底层驱动程序,完成与硬件的交互,包括通信接口的初始化和配置。然后,搭建EtherCAT主站协议栈,实现与从站的通信。可以选择现有的EtherCAT协议栈,也可以自行开发。同时,针对具体的伺服应用,编写控制算法,实现对从站的控制和监测。最后,进行系统集成和测试。
在基于STM32的伺服总线EtherCAT主站设计过程中,需要充分考虑系统的实时性和稳定性。通过合理的硬件设计和优化的软件算法,能够满足伺服应用的高精度和高性能要求。此外,还要关注系统安全性和可靠性,设计相应的保护机制和故障处理策略,确保系统的正常运行和数据的完整性。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
河狸打捞员
CSDN认证博客专家
CSDN认证企业博客
码龄4年
南京航空航天大学
18
原创
50万+
周排名
10万+
总排名
6万+
访问
等级
396
积分
125
粉丝
170
获赞
51
评论
801
收藏
私信
关注
热门文章
Fluent UDF教程——壁面温度设定,实现动态高斯热源的施加,DEFINE_PROFILE宏讲解
12209
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
7533
基于STM32F407实现离散傅里叶变换(FFT、DFT),计算指定频率的幅值
6350
GD32450Z 液晶RGB-LCD(AT070TN94)调试教程
4334
GD32450Z U盘通信教程——使用USBHS利用内部全速PHY作为USB MSC主机实现U盘通信
4194
分类专栏
电阻抗成像
4篇
CANopen、EtherCAT
4篇
STM32学习
8篇
最新评论
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
iscada:
6060h怎么写进去的,没有pdo映射啊?能解释一下吗?谢谢
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
河狸打捞员:
从站才需要两个,主站一个网口就够了
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
ZIYOU_1:
stm32只有一个以太网口,etherCAT就无法环形连接,这会有什么问题吗?
基于STM32F429 + ECM-XFU搭建运动控制平台,实现EtherCAT通讯
河狸打捞员:
我是淘宝上买的,ECM XF芯片价位大概是300一片。
基于STM32F429 + ECM-XFU搭建运动控制平台,实现EtherCAT通讯
yeshengwoju:
ECM XF-S看大概多少钱一块啊
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
基于Fluent的激光熔覆熔池流场仿真——VOF耦合融化凝固模型+源项UDF、二维模型、自由界面
EtherCAT运动控制——电子凸轮的实现(原理介绍、附代码)
AD导出文件供嘉利创打样及贴片——DRC校验、生产文件导出、嘉利创下单
2023年12篇
2022年6篇
目录
目录
分类专栏
电阻抗成像
4篇
CANopen、EtherCAT
4篇
STM32学习
8篇
目录
评论 11
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
河狸打捞员
你的鼓励将是我创作的最大动力
¥1
¥2
¥4
¥6
¥10
¥20
扫码支付:¥1
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
基于STM32构建EtherCAT主站(SOEM方案)2_stm32 ethercat-CSDN博客
>基于STM32构建EtherCAT主站(SOEM方案)2_stm32 ethercat-CSDN博客
基于STM32构建EtherCAT主站(SOEM方案)2
最新推荐文章于 2024-01-05 16:53:58 发布
拉松
最新推荐文章于 2024-01-05 16:53:58 发布
阅读量1w
收藏
118
点赞数
49
分类专栏:
ethercat
文章标签:
stm32
arm
嵌入式硬件
ethercat
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cln512/article/details/122093205
版权
ethercat
专栏收录该内容
24 篇文章
94 订阅
订阅专栏
2020年的12月初,我写了一篇《基于STM32构建EtherCAT主站(SOEM方案)1》博客,同时也上传了基于原子stm32f767开发板的源码(soem1.4.0版本,采用HAL库,控制伺服)。有兴趣的可以去我的博客目录找找。后续我会把整理好的源码上传到GitHub,如果发现了bug,或者我有讲错的地方,可以在评论区留言。欢迎指正。 之前打算把移植过程都写到博客上的,后来由于有其它事要忙,就没继续写了。期间也有一些网友私信我,为什么不把博客写完。 好吧,在2022年元旦前后,我将把后续的几篇移植博客写完。未来,如果有时间的话,我还会分享一些《igh+xenomai》demo(一些有意思的小项目)。
我的梦想是写一个EtherCAT五轴数控系统(实现基础功能即可,在zynq、imx6ull、stm32mp157中选用一款作为数控系统的芯片跑linux或者其它实时系统,基于QT开发上位机),研究EtherCAT主站只是朝梦想方向前进的一小步,希望能在30岁之前把系统干出来。
哈哈,言归正传,继续来讲soem。王惠娇同志的硕士论文《基于嵌入式平台的EtherCAT主站实现研究》,把soem移植讲的很清楚了,有兴趣的可以读一下。如果你有移植lwip的经验,那么移植soem还是挺容易的。我个人移植过soem1.3.1和soem1.4.0,这两个版本基本没啥变动,因此移植过程也是一样的。soem项目中主要包含osal、oshw、soem三个文件夹。soem库采用了分层设计的思想,把操作系统层和硬件层抽象了出来,因此移植过程才会比较简单,只需修改osal和oshw文件夹中的文件即可。 移植的代码我是参考rtk子文件夹的(soem官方提供的移植平台代码),这是最贴近单片机开发的一个平台,lw_emac对应于stm32网卡驱动。
SOEM源码目录结构
soem:主站主体 osal:操作系统抽象层。提供了函数的抽象,如定时器和线程等。 oshw:硬件抽象层,网卡驱动。 test:应用示例代码
整个移植过程
1.stm32定时器驱动:tim2用于系统时基,为osal.c中的函数提供时间信息。tim5定时器中断用于应用层中的周期性程序。 2.以太网驱动,lan8720芯片初始化,以太网接收函数、以太网发送函数 3.nicdrv.c:把bfin_EMAC_send、bfin_EMAC_recv等函数替换成stm32的以太网收发函数。 4.oshw.c文件中修改一些大小端序的定义。 5.编译keil,采用–gnu编译(keil中可以设置),还会有一些其它的报错,主要是一些编译器导致的问题。根据报错修改即可。 6.参考soem/test/rtk/main.c文件,把其main函数移植到stm32中。 7.ethercat IO从站控制例程编写、ethercat伺服从站例程编写。 90%的移植工作集中在图中的红圈部分,大家根据自己板子的硬件,酌情修改即可。 下面的内容取自https://lipoyang.hatenablog.com/entry/2019/12/08/101951,一位日本网友的soem移植总结,大家在github上也能找到他的代码。 https://github.com/lipoyang/SOEM4Arduino
1.soem文件中的移植
(1.1)节省内存资源
最初的 SOEM 使用过多的 RAM 在单片微控制器上运行。因此,通过根据目标的内存容量减少以下常量来减少 RAM 使用量。 EC_MAXODLIST:CoE 对象字典的最大数量 EC_MAXOELIST:CoE 对象条目的最大数量 EC_MAXSLAVE:从站连接的最大数量 EC_MAXBUF:以太网帧缓冲区的数量
(1.2)时钟
原SOEM使用时间。但是,单片机系统可能没有实时时钟,或者即使有实时时钟,也可能精度不够。我决定用计时器来计算从微机启动开始经过的时间,并用它来代替。
(1.3)省略 LAN 端口冗余
原始 SOEM 支持两个 LAN 端口以进行冗余配置。但是,在只有一个 LAN 端口的系统的情况下,RAM 是浪费的。因此,删除以下与 LAN 口冗余配置相关的变量和函数。 ecx_redportt、ecx_init_redundant、ec_init_redundant
2.osal文件夹中的移植
(2.1)定时器和时钟
实现如下函数,根据微机对定时器进行抽象。 osal_usleep:在以 usec 为单位指定的时间内停止处理。 osal_timer_start:通过以 usec 为单位指定超时时间来启动计时器。 osal_timer_is_expired:返回计时器是否超时。 它还实现了以下抽象时钟的函数。但是,如(1.2)所述,这次将使用从微机启动开始的经过时间。 osal_current_time:获取当前时间。 osal_time_diff:返回两次之间的差值。
(2.2)线程
实现如下函数,根据微机对定时器进行抽象。但是,SOEM 本身并没有使用线程功能。如果在应用端不使用线程,即使不实现也没有问题。 osal_thread_create:创建线程 osal_thread_create_rt:创建实时线程
(2.3)调试输出
为调试输出实现 EC_PRINT 函数。在微机系统的情况下,通常输出到UART(串口)进行调试。 EC_PRINT 函数由宏定义,只有在定义了 EC_DEBUG 宏时才有效。 EC_PRINT 函数的实质是作为一个函数实现的,该函数采用与 printf 函数等效的可变长度参数。如果可以使用 printf 函数,请使用 #define EC_PRINT printf。
3.oshw的移植
(3.1)字节序
以太网协议是大端,但有些 CPU 是大端,有些是小端。因此,实现以下函数应该吸收字节顺序的差异。 oshw_htons:将 16 位整数从 CPU 字节顺序转换为大端。 oshw_ntohs:将 16 位整数从 big endian 转换为 CPU 字节顺序。
(3.2)搜索网络接口
实现以下功能以搜索可用的网络接口。但是,在大多数微机系统中,网络接口都是固定为已知的,如果应用端不需要这个功能,即使不实现也没有问题。 oshw_find_adapters:列出可用的网络接口。 oshw_free_adapters:释放用于枚举网络接口的内存。
(3.3)网卡设备驱动(这是最难的部分!)
实现以下抽象 NIC 设备的函数。 这是最难的一点,但要点总结如下。
(3.3.1)临界区
为了保护临界区,如果是操作系统环境,请使用互斥锁等。即使在没有 OS 的微型计算机系统中也使用中断,则需要中断禁用/启用处理。
(3.3.2)冗長構成の省略
如(1.3)所述,如果要省略LAN口的冗余配置,删除第二个LAN口相关的变量redport和redstate,处理使用这些变量的冗余配置也删除。
(3.3.3)句柄
在 Windows、Mac 和 Linux 等操作系统环境中,网络通信是基于套接字的,“RAW 套接字”也用于发送和接收原始以太网帧。处理这个的变量是 sockhandle。但是,除非需要在微机系统中处理套接字,否则不需要使用该变量。
(3.3.4)以太网控制器控制处理的实现
这是最重要的部分。根据需要移植的硬件实现以太网控制器的初始化处理、终止处理、帧发送处理、帧接收处理,并从需要的位置调用。
结语
soem移植大体就这些,说难不难,说简单也不简单。虽然我在2020年就已经把soem移植完了,也驱动了一些伺服,但是并没有在工业中应用,因此对移植后的可靠性也没有把握。自己也在工控行业干过,深知工业产品的高要求,以及细微的问题可能会带来巨大的损失,因此我的博客仅供学习和参考。 电机也不仅仅能转就完事了,我在nucleo f767平台移植过soem主站,板子上除了f767芯片,还有一颗stm32用于stlink功能。f767的时钟由另一颗stm32的PA8引脚提供(MCO功能),频率为8Mhz。测试过程中,发现伺服会周期性抖动。仔细研究后发现,是由于8Mhz的抖动有点大,比如实际是7.99999Mhz。最后只能通过参考时钟,动态调整主站周期,从而解决了问题。说白了就是DC同步,同步方法也是我自己琢磨的,也不敢保证对不对,也许只是碰巧解决了我单伺服的同步问题吧。 我是在研究生期间开始搞ethercat主站的,课题是基于igh+xenomai搞三轴数控。工作后,ethercat并不是我的工作内容,只是周末研究一下。开头说过,我的梦想是diy一套ethercat五轴数控系统。我真的很想有人送我一套工业ethercat主站源码,哈哈,可惜没有,因此只能自己折腾了。xenomai、igh、soem我都搞过,因为是单兵作战的缘故,许多坑要自己踩。经常一个问题要琢磨好久,没人指导,只能在百度、csdn、google、知网上疯狂找资料,反复读代码、调试。唉,搞起来真心累,好几次想放弃。 因为体验过那种被问题卡住时,寝食难安的状态。所以我把一些学习调试的过程写成博客,分享一下。我时间和能力有限,有些问题我也回答不出来。有时工作太累,或者遇到烦心事,没精力和心情回答。请见谅哈。
优惠劵
拉松
关注
关注
49
点赞
踩
118
收藏
觉得还不错?
一键收藏
知道了
12
评论
基于STM32构建EtherCAT主站(SOEM方案)2
基于stm32构建ethercat主站
复制链接
扫一扫
专栏目录
基于stm32构建EtherCAT主站,采用了开源的soem方案
12-05
基于stm32构建EtherCAT主站,将soem方案移植到了stm32上。基本功能测试正常,可以驱动一部分的伺服电机,但也存在一些bug。整体移植方式应该是正确的,具体移植方式将写于CSDN博客中。
ethercat从站stm32程序和使用文档,实现了IO、AD、DA功能。
07-20
2018年暑期自己搞的项目的一部分,包括基于stm32f407的ethercat从站程序以及配套的XML文件。实现了IO、AD、DA功能。在别人已经实现的ethercat从站功能上,我根据智昂的从站板子添加了AD、DA功能。参考了别人的提供的资料,算是踩在了巨人的肩膀上吧。
12 条评论
您还未登录,请先
登录
后发表或查看评论
EtherCat 从站控制芯片
最新发布
weixin_46024116的博客
01-05
973
EtherCat 从站控制芯片简称ESC,是实现EtherCat数据链路层协议的专用芯片,用作处理EtherCat数据帧,并为从站控制装置提供数据接口,简单说就是一般我们的MCU不支持EtherCat(当然也有支持的,支持的就不需要ESC),ESC就是个转换器,一般和MCU选择串行(SPI)的方式来通信。ESC存储空间:前面讲到ESC具有64K字节的DPRAM,前4K(0x0000–0x0FFF)字节的寄存器空间。
基于STM32构建EtherCAT主站(SOEM方案)1
热门推荐
cln512的博客
12-05
1万+
最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。
准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。
整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。
当然了,移植过程中参考了许多网上资料(不限于以下几个)。在
基于STM32构建EtherCAT主站(SOEM方案)
m0_68007244的博客
03-12
6458
STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码 提供配套CUBE工程。
SOEM协议栈使用1.3.1版本。
可配套NUCLEO-H743ZI开发板使用。
支持DC同步。
可配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B/A6B和欧姆龙G5系列驱动器使用
基于STM32构建EtherCAT主站(SOEM方案)
有几点说一下:
1.以太网接收报文用的时轮询的方式,不是
EtherCAT主站——SOEM(学习笔记1)
a1347065101的博客
07-14
3908
EtherCAT 是一个以以太网为基础的开放架构的现场总线系统,EtherCAT 数
据部分封装在以太网帧中,主站发送以太网帧在以太网上传输。
soem 学习1
jjinl的专栏
10-04
2640
ethercat主站学习计划,soem源码阅读
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7550
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
SOEM协议栈代码研读笔记(一)
zhiyaormb的博客
08-20
3101
对EtherCAT开源协议栈SOEM的源代码进行分析和解读
(转载)STM32与LAN9252构建EtherCAT从站
xiahailong90的博客
02-27
9502
EtherCAT Technology Group | 联系方式。使用SSC,可以快速地构建EtherCAT从站代码,保证从站协议栈与最新的EtherCAT协议相匹配,同时还可以生成从站设备描述文件,这是一份XML文件,需要放在TwinCAT安装路径下的目录下,在使用TwinCAT对设备进行组态时需要使用。是EtherCAT从站设计过程中很重要的一个文件,关于从站设备传输多少数据,是否启用分布式时钟,PHY(LAN9252)与MCU之间如何通信等等重要数据都在这个描述文件中定义。
[工业互联-18]:常见EtherCAT主站方案:SOEM的Windows/Linux解决方案
文火冰糖(王文兵)的博客
07-09
2481
SOEM (Simple Open EtherCAT Master) 是一种开源的EtherCAT主站协议栈。EtherCAT(Ethernet for Control Automation Technology)是一种高性能实时以太网通信技术,用于实现工业自动化领域中的分布式控制系统。SOEM 提供了在PC或嵌入式系统上实现EtherCAT主站功能的软件库。它是一个轻量级的、可定制的协议栈,适用于不同的操作系统平台,例如Linux、Windows和RTOS等。
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序.zip
01-21
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序,该程序使用stm32f407芯片,ucosii系统,dp83848以太网芯片实现etherCAT主站程序,并使用台达etherCAT伺服测试成功
基于SOEM的EtherCat主站程序控制汇川SV660
06-02
LAN8720,DP83848,汇川SV660,SV620,无操作系统STM32F407
lan9252与stm32的EtherCAT从站实现,ethercat主站代码stm32,C,C++
09-10
实现基于 LAN9252
ubuntu14.04、xenomai3.1、ethercat igh构建主站(1)
cln512的博客
06-22
8704
内核选用4.1.18
参考文章
https://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai3.html
https://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai.html
https://www.bilibili.com/video/BV1wg4y1z7C2?t=1399
第一步
./scripts/prepare-kernel.sh --linux=/home/vmuser/workspace/linux-4
ubuntu14.04、xenomai3.1、ethercat igh构建主站(2)
cln512的博客
06-29
7218
我是在i9 9900k的主机上编译的linux内核、xenomai以及ethercat igh。
有如下两个版本:
1.linux4.9.38+xenomai3.1+ethercat igh
2.linux3.14.44+xenomai2.6.5+ethercat igh
我分别在i5 6600和i5 4460上进行了测试。都能成功驱动台达ethercat伺服(ASD-A2-0421-E),说明主站可以正常运行。
xenomai的实时性方面,i5 4460主机的效果比i5 6600主机好很多。i5
EtherCAT对象字典分析
cln512的博客
07-23
6312
EtherCAT开发中,主要通过两款软件查看XML文件,分别是"XML Notepad"和"Altova XMLSpy",两款界面如下:
通过对比可以看出Altova XMLSpy软件显示的更为直观,因此我在开发时主要使用此软件。
接下来进入正题。通过igh开发EtherCAT应用程序首先必须知道从站的对象字典,我们可以通过igh自带的ethercat软件查看从站的对象字典。实验设备为安装了xe...
基于stm32平台的ethercat主站 源代码 例程
07-26
基于STM32平台的EtherCAT主站的源代码例程是指用于实现EtherCAT主站功能的代码示例。EtherCAT(Ethernet for Control Automation Technology)是一种以太网通信协议,它可以实现高性能、实时性的工业控制系统。STM32是一种微控制器系列,常用于嵌入式系统和物联网设备。
在该源码例程中,主要包括以下几个方面的功能:
1. 初始化EtherCAT主站:设置STM32与EtherCAT总线之间的通信参数和初始化相关硬件资源,如CAN接口和中断。
2. EtherCAT主站通信:与其他EtherCAT设备进行通信,包括发送和接收数据报文,处理EtherCAT帧以及实现EtherCAT协议的各个功能。
3. 处理从站设备:与连接到EtherCAT总线上的从站设备进行通信,包括配置从站设备、发送和接收从站设备的数据等。
4. 实现EtherCAT主站的主要功能:根据实际需求,可以添加不同的功能模块,如数据采集、控制逻辑等。
该源代码例程可能包含多个文件,其中可能包括主函数文件、EtherCAT主站驱动文件、CAN通信文件、EtherCAT协议处理文件等。开发者可以根据具体需求进行修改和扩展。
通过使用该源代码例程,开发者可以在STM32平台上快速开发出具有EtherCAT通信功能的主站设备,以满足工业自动化控制系统的需求。但需要注意,由于EtherCAT协议本身较为复杂,对于初次接触EtherCAT的开发者来说,可能需要一定的学习和熟悉过程。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
拉松
CSDN认证博客专家
CSDN认证企业博客
码龄9年
暂无认证
44
原创
1万+
周排名
64万+
总排名
16万+
访问
等级
1717
积分
499
粉丝
210
获赞
187
评论
1310
收藏
私信
关注
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
最新评论
基于STM32构建EtherCAT主站(SOEM方案)2
专噶猛男腰子:
不知道你解决了没,0x6040是伺服的使能流程,一般都是写6-7-F这样子,具体可以参考cia 402的控制手册,大概的意思 先清除报警然后(6/7)停机,后(f)使能驱动器。
基于STM32构建EtherCAT主站(SOEM方案)1
weixin_57482667:
大佬移植后的是不是用Codesys软件来编程的?
DIY运动控制器——移植grbl(软件架构、脉冲产生)
weixin_41776940:
最核心的就是这个,布鲁森汉姆插补
法。网上有一篇文章是讲关于这个算法的推导
beaglebone(AM335X)安装igh-ethercat
星栈:
博主你好,我am335x开发板4.1.18内核,暂时没有打实时补丁,已经移植好igh在开发板上了,现在正在交叉编译你博客里的igh.c;我输入指令arm-linux-gnueabihf-gcc igh.c -o igh
igh.c:11:29: fatal error: native/task.h: No such file or directory出现报错,缺少头文件,我没有xenomai的头文件,也没有rtdk.h,有rtdm.h但是指定目录后还是报错,请问您是怎么指定头文件目录并且交叉编译出来的
EtherCAT从站读取MPU9250数据并进行姿态解算
hehao9051:
有没有第一版本的资料可以参考呀,FSMC没有调通
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
基于rt thread smart构建EtherCAT主站
rt thread smart制作emmc镜像
rt thread smart适配野火imx6ull开发板的KSZ8081网卡
2022年5篇
2021年12篇
2020年9篇
2019年18篇
目录
目录
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
目录
评论 12
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
基于STM32构建EtherCAT主站(SOEM方案)5_ethercat通信主站搭建-CSDN博客
>基于STM32构建EtherCAT主站(SOEM方案)5_ethercat通信主站搭建-CSDN博客
基于STM32构建EtherCAT主站(SOEM方案)5
最新推荐文章于 2023-07-14 22:31:53 发布
拉松
最新推荐文章于 2023-07-14 22:31:53 发布
阅读量2.3k
收藏
11
点赞数
3
分类专栏:
ethercat
文章标签:
stm32
arm
嵌入式硬件
ethercat
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cln512/article/details/122094432
版权
ethercat
专栏收录该内容
24 篇文章
94 订阅
订阅专栏
这里讲一下soem的网卡驱动
大小端序
ethercattype.h文件夹里有一些关于大端序、小端序的宏定义。
#if !defined(EC_BIG_ENDIAN) && defined(EC_LITTLE_ENDIAN)
#define htoes(A) (A)
#define htoel(A) (A)
#define htoell(A) (A)
#define etohs(A) (A)
#define etohl(A) (A)
#define etohll(A) (A)
#elif !defined(EC_LITTLE_ENDIAN) && defined(EC_BIG_ENDIAN)
#define htoes(A) ((((uint16)(A) & 0xff00) >> 8) | \
(((uint16)(A) & 0x00ff) << 8))
#define htoel(A) ((((uint32)(A) & 0xff000000) >> 24) | \
(((uint32)(A) & 0x00ff0000) >> 8) | \
(((uint32)(A) & 0x0000ff00) << 8) | \
(((uint32)(A) & 0x000000ff) << 24))
#define htoell(A) ((((uint64)(A) & (uint64)0xff00000000000000ULL) >> 56) | \
(((uint64)(A) & (uint64)0x00ff000000000000ULL) >> 40) | \
(((uint64)(A) & (uint64)0x0000ff0000000000ULL) >> 24) | \
(((uint64)(A) & (uint64)0x000000ff00000000ULL) >> 8) | \
(((uint64)(A) & (uint64)0x00000000ff000000ULL) << 8) | \
(((uint64)(A) & (uint64)0x0000000000ff0000ULL) << 24) | \
(((uint64)(A) & (uint64)0x000000000000ff00ULL) << 40) | \
(((uint64)(A) & (uint64)0x00000000000000ffULL) << 56))
#define etohs htoes
#define etohl htoel
#define etohll htoell
#else
#error "Must define one of EC_BIG_ENDIAN or EC_LITTLE_ENDIAN"
#endif
这里选择小端序(默认)。
nicdiv文件修改
这里只罗列了一部分
ecx_setupnic
/** Basic setup to connect NIC to socket.
* @param[in] port = port context struct
* @param[in] ifname = Name of NIC device, f.e. "eth0"
* @param[in] secondary = if >0 then use secondary stack instead of primary
* @return >0 if succeeded
*/
int ecx_setupnic(ecx_portt *port, const char *ifname, int secondary)
{
int i;
int rVal;
int *psock;
// port->getindex_mutex = mtx_create();
// port->tx_mutex = mtx_create();
// port->rx_mutex = mtx_create();
// rVal = bfin_EMAC_init((uint8_t *)priMAC);
// if (rVal != 0)
// return 0;
if (secondary)
{
/* secondary port stuct available? */
if (port->redport)
{
/* when using secondary socket it is automatically a redundant setup */
//psock = &(port->redport->sockhandle);
*psock = -1;
port->redstate = ECT_RED_DOUBLE;
//port->redport->stack.sock = &(port->redport->sockhandle);
port->redport->stack.txbuf = &(port->txbuf);
port->redport->stack.txbuflength = &(port->txbuflength);
port->redport->stack.tempbuf = &(port->redport->tempinbuf);
port->redport->stack.rxbuf = &(port->redport->rxbuf);
port->redport->stack.rxbufstat = &(port->redport->rxbufstat);
port->redport->stack.rxsa = &(port->redport->rxsa);
ecx_clear_rxbufstat(&(port->redport->rxbufstat[0]));
}
else
{
/* fail */
return 0;
}
}
else
{
// port->getindex_mutex = mtx_create();
// port->tx_mutex = mtx_create();
// port->rx_mutex = mtx_create();
port->sockhandle = -1;
port->lastidx = 0;
port->redstate = ECT_RED_NONE;
//port->stack.sock = &(port->sockhandle);
port->stack.txbuf = &(port->txbuf);
port->stack.txbuflength = &(port->txbuflength);
port->stack.tempbuf = &(port->tempinbuf);
port->stack.rxbuf = &(port->rxbuf);
port->stack.rxbufstat = &(port->rxbufstat);
port->stack.rxsa = &(port->rxsa);
ecx_clear_rxbufstat(&(port->rxbufstat[0]));
psock = &(port->sockhandle);
}
/* setup ethernet headers in tx buffers so we don't have to repeat it */
for (i = 0; i < EC_MAXBUF; i++)
{
ec_setupheader(&(port->txbuf[i]));
port->rxbufstat[i] = EC_BUF_EMPTY;
}
ec_setupheader(&(port->txbuf2));
return 1;
}
ecx_outframe
/** Transmit buffer over socket (non blocking).
* @param[in] port = port context struct
* @param[in] idx = index in tx buffer array
* @param[in] stacknumber = 0=Primary 1=Secondary stack
* @return socket send result
*/
int ecx_outframe(ecx_portt *port, int idx, int stacknumber)
{
int lp, rval;
ec_stackT *stack;
if (!stacknumber)
{
stack = &(port->stack);
}
else
{
stack = &(port->redport->stack);
}
lp = (*stack->txbuflength)[idx];
//rval = bfin_EMAC_send((*stack->txbuf)[idx], lp);
rval = EthWrPacket((*stack->txbuf)[idx], lp);
(*stack->rxbufstat)[idx] = EC_BUF_TX;
return rval;
}
ecx_recvpkt
/** Non blocking read of socket. Put frame in temporary buffer.
* @param[in] port = port context struct
* @param[in] stacknumber = 0=primary 1=secondary stack
* @return >0 if frame is available and read
*/
static int ecx_recvpkt(ecx_portt *port, int stacknumber)
{
int lp, bytesrx;
ec_stackT *stack;
if (!stacknumber)
{
stack = &(port->stack);
}
else
{
stack = &(port->redport->stack);
}
lp = sizeof(port->tempinbuf);
//bytesrx = bfin_EMAC_recv((*stack->tempbuf), lp);
bytesrx = EthRdPacket((*stack->tempbuf));
port->tempinbufs = bytesrx;
return (bytesrx > 0);
}
优惠劵
拉松
关注
关注
3
点赞
踩
11
收藏
觉得还不错?
一键收藏
知道了
1
评论
基于STM32构建EtherCAT主站(SOEM方案)5
基于stm32构建ethercat主站
复制链接
扫一扫
专栏目录
基于stm32构建EtherCAT主站,采用了开源的soem方案
12-05
基于stm32构建EtherCAT主站,将soem方案移植到了stm32上。基本功能测试正常,可以驱动一部分的伺服电机,但也存在一些bug。整体移植方式应该是正确的,具体移植方式将写于CSDN博客中。
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
1 条评论
您还未登录,请先
登录
后发表或查看评论
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序.zip
01-21
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序,该程序使用stm32f407芯片,ucosii系统,dp83848以太网芯片实现etherCAT主站程序,并使用台达etherCAT伺服测试成功
基于SOEM的EtherCat主站程序控制汇川SV660
06-02
LAN8720,DP83848,汇川SV660,SV620,无操作系统STM32F407
TI EtherCAT主站实现方案
10-22
TI官方的Tether CAT主站实现方案,详细的可以到其官网上了解。EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术(Control Automation Technology)字首的缩写。EtherCAT是确定性的工业以太网,最早是由德国的Beckhoff公司研发。
详解EtherCAT主站SOEM源码_eepromtool.c
zzz79的博客
05-03
3166
EhterCAT_SOEM
文章目录EhterCAT_SOEM前言一、eepromtool.c的作用二、读写EEPROM步骤1.读取EEPROM数据2.写入EEPROM数据2.1 写入从站别名2.2 读取0-6字数据2.3 计算校验和2.4 写入校验和总结
前言
SOEM简单开放式ETherCAT主站,支持Linux,Windows双系统,这里讲解是SOEM 1.3.1版本基于Windows平台编译后的源码eepromtool.c,在SOEM-1.3.1\test\win32\eepromtool文件夹中
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7550
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
[工业互联-17]:常见EtherCAT主站与实现方法
文火冰糖(王文兵)的博客
07-08
4542
EtherCAT(Ethernet for Control Automation Technology)是一种实时以太网通信协议,用于工业自动化和控制系统中实现高性能、实时数据传输和控制。它是由EtherCAT技术组织(ETG)开发和标准化的。EtherCAT基于以太网物理层和数据链路层,但使用了一种特殊的通信方法,称为"Processing on the Fly"。这种方法使得数据帧能够在通过从站设备时进行实时处理,而不需要完全接收整个数据帧。这样,数据传输和控制可以实现高效率和低延迟。
自建极简Ethercat主站-底层驱动编写
西澳峰的博客
06-05
2058
MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FOE、COE、过程数据通信这三个功能,仅用于学习和加深理解。主站的硬件是GD32F450Z_EVAL开发板,板载的以太网芯片是DP83848VV。基本接口已经写好,接下来就是按照Ethercat的数据包对数据进行打包,然后将发送出去。名称说明长度。
EtherCAT主站SOEM源码解析----分布时钟DC
weixin_43956732的博客
11-16
2831
EtherCAT主站SOEM源码解析----分布时钟DC
分布时钟(DC,Dsitributed Clock)可以使所有EtherCAT设备使用相同的系统时间,从而控制各设备任务的同步执行。
1、DC从站
支持分布式时钟的从站称为DC从站,同步原理如下所示:
其中,
Tref: 参考时间,网络
lan9252与stm32的EtherCAT从站实现,ethercat主站代码stm32,C,C++
09-10
实现基于 LAN9252
[工业互联-20]:常见EtherCAT主站方案:TwinCAT的Windows 解决方案
文火冰糖(王文兵)的博客
07-09
2213
TwinCAT是由德国Beckhoff公司开发的一套功能强大的自动化软件平台。它是一个集成的开发环境,用于实现实时控制、PLC编程、运动控制、HMI(人机界面)设计和数据采集等应用。TwinCAT广泛应用于工业自动化、机械控制、过程控制和实时系统等领域。
2.1 基于ZedBoard平台的EtherCAT主站方案实现
suntoarms的博客
02-29
3106
摘 要:EtherCAT 是开放的实时以太网通讯协议,由德国倍福自动化有限公司研发。EtherCAT 具有高性能、低成本、容易使用等特点,目前在工业自动化领域有着广泛的应用。Zynq-7000 是赛灵思公司(Xilinx)推出的行业第一个全可编程 SoC 产品, 它将双核 ARM Cortex-A9 处理器,低功耗可编程逻辑以及常用的外设紧密集成在一起。ZedBoard 是基于 XC7Z020 器...
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
lg28870983的博客
05-08
5348
EtherCAT在运动控制领域非常热门,有SOEM和IGH的开源主机实现。在STM系列处理器上的实现比较多,在RT-Thread上的实现还没有看到。这次就基于RT-Thread移植SEOM,并实现了DC+CSP对汇川伺服IS620N的控制,同步周期为1ms。
基于STM32构建EtherCAT主站(SOEM方案)3
cln512的博客
12-22
4920
基于stm32构建ethercat主站
[工业互联-18]:常见EtherCAT主站方案:SOEM的Windows/Linux解决方案
文火冰糖(王文兵)的博客
07-09
2481
SOEM (Simple Open EtherCAT Master) 是一种开源的EtherCAT主站协议栈。EtherCAT(Ethernet for Control Automation Technology)是一种高性能实时以太网通信技术,用于实现工业自动化领域中的分布式控制系统。SOEM 提供了在PC或嵌入式系统上实现EtherCAT主站功能的软件库。它是一个轻量级的、可定制的协议栈,适用于不同的操作系统平台,例如Linux、Windows和RTOS等。
EtherCAT主站——SOEM(学习笔记1)
a1347065101的博客
07-14
3908
EtherCAT 是一个以以太网为基础的开放架构的现场总线系统,EtherCAT 数
据部分封装在以太网帧中,主站发送以太网帧在以太网上传输。
基于STM32构建EtherCAT主站(SOEM方案)2
热门推荐
cln512的博客
12-22
1万+
基于stm32构建ethercat主站
基于 ARM + FPGA 的 EtherCAT 主站设计及实现
YEYUANGEN的专栏
12-03
1111
为解决实时工业以太网协议 EtherCAT 应用于嵌入式主站控制器所产生的实时性和稳定性等问题,首先研究了 EtherCAT 主站控制器在 EtherCAT 网络控制系统中的功能需求,分析并提出了实现嵌入式 EtherCAT 主站的架构,然后针对上述架构设计了基于 ARM + FPGA 的 EtherCAT 主站实现的硬件方案,并设计了基于 Xenomai 补丁的实时 Linux 操作系统的软件实现方案,最后搭建了互联互通的互操作性测试平台,实验结果表明,该主站控制器具有 EtherCAT 标准协议的兼容性
基于stm32平台的ethercat主站 源代码 例程
最新发布
07-26
基于STM32平台的EtherCAT主站的源代码例程是指用于实现EtherCAT主站功能的代码示例。EtherCAT(Ethernet for Control Automation Technology)是一种以太网通信协议,它可以实现高性能、实时性的工业控制系统。STM32是一种微控制器系列,常用于嵌入式系统和物联网设备。
在该源码例程中,主要包括以下几个方面的功能:
1. 初始化EtherCAT主站:设置STM32与EtherCAT总线之间的通信参数和初始化相关硬件资源,如CAN接口和中断。
2. EtherCAT主站通信:与其他EtherCAT设备进行通信,包括发送和接收数据报文,处理EtherCAT帧以及实现EtherCAT协议的各个功能。
3. 处理从站设备:与连接到EtherCAT总线上的从站设备进行通信,包括配置从站设备、发送和接收从站设备的数据等。
4. 实现EtherCAT主站的主要功能:根据实际需求,可以添加不同的功能模块,如数据采集、控制逻辑等。
该源代码例程可能包含多个文件,其中可能包括主函数文件、EtherCAT主站驱动文件、CAN通信文件、EtherCAT协议处理文件等。开发者可以根据具体需求进行修改和扩展。
通过使用该源代码例程,开发者可以在STM32平台上快速开发出具有EtherCAT通信功能的主站设备,以满足工业自动化控制系统的需求。但需要注意,由于EtherCAT协议本身较为复杂,对于初次接触EtherCAT的开发者来说,可能需要一定的学习和熟悉过程。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
拉松
CSDN认证博客专家
CSDN认证企业博客
码龄9年
暂无认证
44
原创
1万+
周排名
64万+
总排名
16万+
访问
等级
1717
积分
499
粉丝
210
获赞
187
评论
1310
收藏
私信
关注
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
最新评论
基于STM32构建EtherCAT主站(SOEM方案)2
专噶猛男腰子:
不知道你解决了没,0x6040是伺服的使能流程,一般都是写6-7-F这样子,具体可以参考cia 402的控制手册,大概的意思 先清除报警然后(6/7)停机,后(f)使能驱动器。
基于STM32构建EtherCAT主站(SOEM方案)1
weixin_57482667:
大佬移植后的是不是用Codesys软件来编程的?
DIY运动控制器——移植grbl(软件架构、脉冲产生)
weixin_41776940:
最核心的就是这个,布鲁森汉姆插补
法。网上有一篇文章是讲关于这个算法的推导
beaglebone(AM335X)安装igh-ethercat
星栈:
博主你好,我am335x开发板4.1.18内核,暂时没有打实时补丁,已经移植好igh在开发板上了,现在正在交叉编译你博客里的igh.c;我输入指令arm-linux-gnueabihf-gcc igh.c -o igh
igh.c:11:29: fatal error: native/task.h: No such file or directory出现报错,缺少头文件,我没有xenomai的头文件,也没有rtdk.h,有rtdm.h但是指定目录后还是报错,请问您是怎么指定头文件目录并且交叉编译出来的
EtherCAT从站读取MPU9250数据并进行姿态解算
hehao9051:
有没有第一版本的资料可以参考呀,FSMC没有调通
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
基于rt thread smart构建EtherCAT主站
rt thread smart制作emmc镜像
rt thread smart适配野火imx6ull开发板的KSZ8081网卡
2022年5篇
2021年12篇
2020年9篇
2019年18篇
目录
目录
分类专栏
运动控制器
8篇
rt thread smart
3篇
stm32
1篇
ethercat
24篇
c++ socket
1篇
c++ 多线程
1篇
linux进程线程
4篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0_rt-thread ethercat-CSDN博客
>在RT-Thread上移植EtherCAT开源主站SOEM1.4.0_rt-thread ethercat-CSDN博客
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
lg28870983
已于 2022-06-02 18:21:22 修改
阅读量5.3k
收藏
61
点赞数
5
分类专栏:
RT-Thread
文章标签:
单片机
嵌入式硬件
于 2022-05-08 15:00:32 首次发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lg28870983/article/details/124647952
版权
RT-Thread
专栏收录该内容
14 篇文章
2 订阅
订阅专栏
本文已参与「开源摘星计划」,欢迎正在阅读的你加入。活动链接:https://github.com/weopenprojects/WeOpen-Star
目录
1.背景
2.EtherCAT主站软件方案
3. 移植过程
3.1 RT-Thread 下载
3.2 Some移植
3.2.1 osal.c移植
3.2.2 oshw.c移植
3.2.3 nicdrv.c移植
3.2.4 net_hook.c实现
3.2.5 some基本功能测试
4. 运动控制测试
5. 总结
1.背景
最近计划DIY一个EtherCAT控制器,一直在看资料和选型,初步定了NUC980的方案,主要是看中NUC980的RAM比较大,采购还算方便(最近缺芯,大家都懂)。
选定硬件之后,NUC980跑什么系统呢?从以往经验来看,ARM9一般跑linux比较多,资源也好找,同时官方提供BSP。但这次任务有点特殊,EtherCAT对实时性要求比较高,linux不是最合适的。结合MCU开发经验,就准备上个RTOS,以前M3和M4的芯片,主要用FreeRTOS,最近也开始用RT-Thread。新唐官方也推出了NUC980的RT-Thread版BSP,对开发者非常友好,最终决定了NUC980+RT-Thread的方案。
2.EtherCAT主站软件方案
EtherCAT本身还是比较复杂的,我们就不自己造轮子了,考虑用开源方案,毕竟硬件成本这么低,商用方案是真的用不起啊!
现在开源主站主要就两种,SOEM和IGH(相关的资料网上很多,这儿就不展开了),IGH只支持linux,所以只能选SOME,最新版本是SOEM1.4,本次移植就基于该版本。
3. 移植过程
3.1 RT-Thread 下载
这个可以到github下载,最近Gitee也更新了。移植EtherCAT之前,首先把Nuvoton的BSP跑起来。这个参考官方的文档就可以了。本次移植基于最新发布的RT-Thread release 4.1.0。
3.2 Some移植
下载soem-1.4.0,将整个目录放在rt-thread项目里,下图是我的目录,供参考
在some-1.4.0及其子目录中需要手工编辑SConscript脚本。
import os
from building import *
objs = []
cwd = GetCurrentDir()
list = os.listdir(cwd)
for item in list:
if os.path.isfile(os.path.join(cwd, item, 'SConscript')):
objs = objs + SConscript(os.path.join(item, 'SConscript'))
Return('objs')
Some移植主要是三个文件 osal.c,oshw.c和nicdrv.c。
osal.c 主要是微秒及的延时和定时函数;
oshw.c 主要是网络端和本机端数据的大小端转换;
nicdrv.c 主要是网络数据收发。
Some已经给出了很多操作系统移植,我的移植是基于rtk,这个是嵌入式系统实现,和我们的开发环境最接近。
3.2.1 osal.c移植
主要内容是实现osal_usleep和osal_gettimeofday两个函数。
我开始思路是自定义一个定时器用于EtherCAT,当时用了Timer4。等实现差不多了,发现系统时钟用的是Timer5,很多地方功能重复。最终和系统共用Timer5,省了个Timer,代码也简化了不少。下面就是改动过的相关代码,osal_timer_init这个初始化函数要在启动EhterCAT功能之前调用。
#include
#include
#include
#include
#include
#include "NuMicro.h"
#include "drv_sys.h"
static rt_uint32_t us_ticks;
void osal_timer_init(void)
{
rt_uint32_t cmp = ETIMER_GetCompareData(5);
us_ticks = 1 * cmp / (1000000 / RT_TICK_PER_SECOND);
rt_kprintf("rt-thread hwtimer5 1us = %d ticks\n", us_ticks);
}
#define timercmp(a, b, CMP) \
(((a)->tv_sec == (b)->tv_sec) ? \
((a)->tv_usec CMP (b)->tv_usec) : \
((a)->tv_sec CMP (b)->tv_sec))
#define timeradd(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \
if ((result)->tv_usec >= 1000000) \
{ \
++(result)->tv_sec; \
(result)->tv_usec -= 1000000; \
} \
} while (0)
#define timersub(a, b, result) \
do { \
(result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
(result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \
if ((result)->tv_usec < 0) { \
--(result)->tv_sec; \
(result)->tv_usec += 1000000; \
} \
} while (0)
#define USECS_PER_SEC 1000000
#define USECS_PER_TICK (USECS_PER_SEC / CFG_TICKS_PER_SECOND)
/* Workaround for rt-labs defect 776.
* Default implementation of udelay() didn't work correctly when tick was
* shorter than one millisecond.
*/
//void udelay (uint32_t us)
//{
tick_t ticks = (us / USECS_PER_TICK) + 1;
task_delay (ticks);
//}
//int gettimeofday(struct timeval *tp, void *tzp)
//{
// tick_t tick = tick_get();
// tick_t ticks_left;
// ASSERT (tp != NULL);
// tp->tv_sec = tick / CFG_TICKS_PER_SECOND;
// ticks_left = tick % CFG_TICKS_PER_SECOND;
// tp->tv_usec = ticks_left * USECS_PER_TICK;
// ASSERT (tp->tv_usec < USECS_PER_SEC);
// return 0;
//}
int osal_usleep (uint32 usec)
{
//udelay(usec);
/*ajustment for precision*/
//usec -= usec / 4080;
usec -= usec / 1500;
/*rt_hw_us_delay work for a delay less than 16us*/
do{
if(usec>=1000)
{
rt_hw_us_delay(1000);
usec -= 1000;
}else{
rt_hw_us_delay(usec);
usec = 0;
}
}while(usec>0);
return 0;
}
int osal_gettimeofday(struct timeval *tv, struct timezone *tz)
{
// return gettimeofday(tv, tz);
RT_ASSERT (tv != NULL);
rt_uint32_t timer_tick,rt_tick;
rt_base_t level = rt_hw_interrupt_disable();
timer_tick = ETIMER_GetCounter(5);
rt_tick = rt_tick_get();
rt_hw_interrupt_enable(level);
tv->tv_sec = rt_tick/1000;
tv->tv_usec = (rt_tick % 1000)*1000 + timer_tick / us_ticks;
return 0;
}
ec_timet osal_current_time (void)
{
struct timeval current_time;
ec_timet return_value;
osal_gettimeofday (¤t_time, 0);
return_value.sec = current_time.tv_sec;
return_value.usec = current_time.tv_usec;
return return_value;
}
void osal_timer_start (osal_timert * self, uint32 timeout_usec)
{
struct timeval start_time;
struct timeval timeout;
struct timeval stop_time;
osal_gettimeofday (&start_time, 0);
timeout.tv_sec = timeout_usec / USECS_PER_SEC;
timeout.tv_usec = timeout_usec % USECS_PER_SEC;
timeradd (&start_time, &timeout, &stop_time);
self->stop_time.sec = stop_time.tv_sec;
self->stop_time.usec = stop_time.tv_usec;
}
boolean osal_timer_is_expired (osal_timert * self)
{
struct timeval current_time;
struct timeval stop_time;
int is_not_yet_expired;
osal_gettimeofday (¤t_time, 0);
stop_time.tv_sec = self->stop_time.sec;
stop_time.tv_usec = self->stop_time.usec;
is_not_yet_expired = timercmp (¤t_time, &stop_time, <);
return is_not_yet_expired == 0;
}
void *osal_malloc(size_t size)
{
return rt_malloc(size);
}
void osal_free(void *ptr)
{
rt_free(ptr);
}
int osal_thread_create(void *thandle, int stacksize, void *func, void *param)
{
// thandle = task_spawn ("worker", func, 6,stacksize, param);
// if(!thandle)
// {
// return 0;
// }
return 1;
}
int osal_thread_create_rt(void *thandle, int stacksize, void *func, void *param)
{
// thandle = task_spawn ("worker_rt", func, 15 ,stacksize, param);
// if(!thandle)
// {
// return 0;
// }
return 1;
}
3.2.2 oshw.c移植
不需做什么工作。
3.2.3 nicdrv.c移植
主要修改就是调用自己的网络发送和接收函数,我把它们命名为net_send和net_recv。这两个函数最好的实现是直接操作网卡(或者叫emac),我现在的实现参考了tcpdump的方法,在协议栈中加钩子(hook)实现,这样对原来系统影响最小,网口除了EtherCAT,还可以当正常的网口用。
ecx_setupnic函数中创建mutex(这个按照rt-thread格式改一下即可),安装网络钩子
ecx_closenic函数中删除mutex,卸载网络钩子。
/** Basic setup to connect NIC to socket.
* @param[in] port = port context struct
* @param[in] ifname = Name of NIC device, f.e. "eth0"
* @param[in] secondary = if >0 then use secondary stack instead of primary
* @return >0 if succeeded
*/
int ecx_setupnic(ecx_portt *port, const char *ifname, int secondary)
{
int i;
int rVal;
int *psock;
// rVal = bfin_EMAC_init((uint8_t *)priMAC);
// if (rVal != 0)
// return 0;
if (secondary)
{
/* secondary port struct available? */
if (port->redport)
{
/* when using secondary socket it is automatically a redundant setup */
psock = &(port->redport->sockhandle);
*psock = -1;
port->redstate = ECT_RED_DOUBLE;
port->redport->stack.sock = &(port->redport->sockhandle);
port->redport->stack.txbuf = &(port->txbuf);
port->redport->stack.txbuflength = &(port->txbuflength);
port->redport->stack.tempbuf = &(port->redport->tempinbuf);
port->redport->stack.rxbuf = &(port->redport->rxbuf);
port->redport->stack.rxbufstat = &(port->redport->rxbufstat);
port->redport->stack.rxsa = &(port->redport->rxsa);
ecx_clear_rxbufstat(&(port->redport->rxbufstat[0]));
}
else
{
/* fail */
return 0;
}
}
else
{
port->getindex_mutex = rt_mutex_create ("getindex_mutex", RT_IPC_FLAG_PRIO);
port->tx_mutex = rt_mutex_create ("tx_mutex", RT_IPC_FLAG_PRIO);
port->rx_mutex = rt_mutex_create ("rx_mutex", RT_IPC_FLAG_PRIO);
port->sockhandle = -1;
port->lastidx = 0;
port->redstate = ECT_RED_NONE;
port->stack.sock = &(port->sockhandle);
port->stack.txbuf = &(port->txbuf);
port->stack.txbuflength = &(port->txbuflength);
port->stack.tempbuf = &(port->tempinbuf);
port->stack.rxbuf = &(port->rxbuf);
port->stack.rxbufstat = &(port->rxbufstat);
port->stack.rxsa = &(port->rxsa);
ecx_clear_rxbufstat(&(port->rxbufstat[0]));
psock = &(port->sockhandle);
if(install_hook(port, ifname)==0){
rt_kprintf("ecx_setupnic fail\n");
return 0; //fail
}
}
/* setup ethernet headers in tx buffers so we don't have to repeat it */
for (i = 0; i < EC_MAXBUF; i++)
{
ec_setupheader(&(port->txbuf[i]));
port->rxbufstat[i] = EC_BUF_EMPTY;
}
ec_setupheader(&(port->txbuf2));
return 1;
}
/** Close sockets used
* @param[in] port = port context struct
* @return 0
*/
int ecx_closenic(ecx_portt *port)
{
rt_mutex_delete(port->getindex_mutex);
rt_mutex_delete(port->tx_mutex);
rt_mutex_delete(port->rx_mutex);
uninstall_hook(port);
return 0;
}
3.2.4 net_hook.c实现
主要实现EtherCAT数据帧收发,中间加了个环形缓冲区用于接收。具体原理就是在网卡加个钩子函数,有数据来的时候先经过钩子函数,我们把EtherCAT数据帧截住,不传给原来的lwip协议栈;如果要发送数据,就直接调用发送函数,绕过lwip协议栈。这样也不影响lwip协议栈工作。
#include
#include "netif/ethernetif.h"
#include "nicdrv.h"
#include
#include
/******************************************************************************
* receive fifo buf
*/
#define HOOK_RX_BUFSIZE 10
static uint8_t netfrmbuf[HOOK_RX_BUFSIZE][1540];
static int netfrmbuf_cnt[HOOK_RX_BUFSIZE];
static int netfrm_head = 0;
static int netfrm_tail = 0;
static int netfrm_full = 0;
int hook_rx_dump = 0;
int hook_tx_dump = 0;
static inline void tx_led_flash(void)
{
static int c = 0;
//rt_kprintf("c = %d\n",c);
if(++c%2)
rt_pin_write(NU_GET_PININDEX(NU_PB, 8), PIN_LOW);
else
rt_pin_write(NU_GET_PININDEX(NU_PB, 8), PIN_HIGH);
}
/******************************************************************************
* store netif and old function addr
*/
static struct netif *netif = RT_NULL;
static netif_linkoutput_fn link_output;
static netif_input_fn input;
/******************************************************************************
* hex dump
*/
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
static void hex_dump(const rt_uint8_t *ptr, rt_size_t buflen)
{
unsigned char *buf = (unsigned char *)ptr;
int i, j;
RT_ASSERT(ptr != RT_NULL);
for (i = 0; i < buflen; i += 16)
{
rt_kprintf("%08X: ", i);
for (j = 0; j < 16; j++)
if (i + j < buflen)
rt_kprintf("%02X ", buf[i + j]);
else
rt_kprintf(" ");
rt_kprintf(" ");
for (j = 0; j < 16; j++)
if (i + j < buflen)
rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
rt_kprintf("\n");
}
}
/******************************************************************************
* rx/tx hook function
*/
/* get tx data */
static err_t _netif_linkoutput(struct netif *netif, struct pbuf *p)
{
return link_output(netif, p);
}
/* get rx data */
static err_t _netif_input(struct pbuf *p, struct netif *inp)
{
if(p->tot_len>=14)
{
char *data = p->payload;
if(data[12]=='\x88' && data[13]=='\xa4') //filter for ethercat frame
{
if(netfrm_full == 0){
pbuf_copy_partial(p, netfrmbuf[netfrm_tail], p->tot_len, 0);
netfrmbuf_cnt[netfrm_tail] = p->tot_len;
netfrm_tail = (netfrm_tail+1) % HOOK_RX_BUFSIZE;
if(netfrm_tail==netfrm_head)
netfrm_full = 1;
}
//rt_kprintf("tail = %d, full = %d\n", netfrm_tail, netfrm_full);
}
}
return input(p, inp);
}
/******************************************************************************
* hook install
*/
int install_hook(ecx_portt *port, const char *ifname)
{
struct eth_device *device;
rt_base_t level;
netfrm_head = 0;
netfrm_tail = 0;
netfrm_full = 0;
if(netif == RT_NULL){
rt_kprintf("hook installing on %s\n", ifname);
device = (struct eth_device *)rt_device_find(ifname);
if (device == RT_NULL){
rt_kprintf("hook install error 'device == RT_NULL'\n");
return 0;
}
if ((device->netif == RT_NULL) || (device->netif->linkoutput == RT_NULL)){
rt_kprintf("hook install error '(device->netif == RT_NULL) || (device->netif->linkoutput == RT_NULL)'\n");
return 0;
}
rt_kprintf("device %s found: 0x%x \n", ifname, (uint32_t)device);
}else{
rt_kprintf("device %s hook already installed, must be uninstall it before intall new on\n", ifname);
}
netif = device->netif;
//install netdev hook
level = rt_hw_interrupt_disable();
link_output = netif->linkoutput;
netif->linkoutput = _netif_linkoutput;
input = netif->input;
netif->input = _netif_input;
rt_hw_interrupt_enable(level);
rt_kprintf("hook installed on %s\n", ifname);
return 1;
}
/******************************************************************************
* hook uninstall
*/
int uninstall_hook(ecx_portt *port)
{
rt_base_t level;
//uninstall netdev hook
if(netif != RT_NULL){
level = rt_hw_interrupt_disable();
netif->input = input;
netif->linkoutput = link_output;
rt_hw_interrupt_enable(level);
netif = RT_NULL;
}
rt_kprintf("hook uninstalled\n");
return 1;
}
/******************************************************************************
* netdev send/recv api
*/
int net_send(unsigned char *data, int len)
{
int ret = -1;
struct pbuf *p;
tx_led_flash();
p = pbuf_alloc(PBUF_TRANSPORT, len, PBUF_POOL);
if (p != NULL)
{
pbuf_take(p, data, len);
if(hook_tx_dump){
rt_kprintf("send --- len=%d>>>\n",len);
hex_dump(p->payload, p->tot_len);
}
_netif_linkoutput(netif,p);
pbuf_free(p);
ret = len;
}
else{
rt_kprintf("net_send alloc buffer error\n");
}
return ret;
}
int net_recv(unsigned char *data, int len)
{
if(netfrm_full == 0 && netfrm_tail==netfrm_head){
return 0;
}
int total = netfrmbuf_cnt[netfrm_head];
if(total > len) total = len;
rt_memcpy(data, netfrmbuf[netfrm_head], total);
netfrm_head = (netfrm_head+1) % HOOK_RX_BUFSIZE;
if(netfrm_tail==netfrm_head)
netfrm_full = 0;
if(hook_rx_dump){
rt_kprintf("recv <<<---\n");
hex_dump(data, total);
rt_kprintf("head = %d, tail = %d, full = %d\n", netfrm_head, netfrm_tail, netfrm_full);
}
return total;
}
void net_hook_test(int argc, char **argv)
{
unsigned char frame[] = "\xff\xff\xff\xff\xff\xff\x01\x01\x01\x01\x01\x01\x88\xa4\x0d\x10\
\x08\x01\x00\x00\x03\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
install_hook(NULL, "e0");
net_send(frame,60);
rt_thread_mdelay(20000);
uninstall_hook(NULL);
}
MSH_CMD_EXPORT(net_hook_test, net_hook_test sample on 'e0');
3.2.5 some基本功能测试
采用官方的slave_info测试代码,测试主要分为时钟测试和soem EtherCAT协议栈基本功能测试。在终端中输入 soem_test + 回车即可。
我接了一个汇川IS620N驱动器,下面是输出的部分内容:
Slave:1
Name:IS620N
Output size: 96bits
Input size: 224bits
State: 4
Delay: 0[ns]
Has DC: 1
DCParentport:0
Activeports:1.0.0.0
Configured address: 1001
Man: 00100000 ID: 000c0108 Rev: 00010001
SM0 A:1000 L: 128 F:00010026 Type:1
SM1 A:1400 L: 128 F:00010022 Type:2
SM2 A:1800 L: 12 F:00010064 Type:3
SM3 A:1c00 L: 28 F:00010020 Type:4
FMMU0 Ls:00000000 Ll: 12 Lsb:0 Leb:7 Ps:1800 Psb:0 Ty:02 Act:01
FMMU1 Ls:0000000c Ll: 28 Lsb:0 Leb:7 Ps:1c00 Psb:0 Ty:01 Act:01
FMMUfunc 0:1 1:2 2:0 3:0
MBX length wr: 128 rd: 128 MBX protocols : 04
CoE details: 0d FoE details: 00 EoE details: 00 SoE details: 00
Ebus current: 0[mA]
only LRD/LWR:0
4. 运动控制测试
基础工作做好以后,我们就能真正的控制电机运行了。在控制电机运行之前,还需要了解CIA402相关的规范,启动伺服需要按照规范要求,按顺序来。
程序主要流程如下,具体代码见附件。
a)初始化时钟 osal_timer_init
b)初始化网卡ec_init
c)等待进入INIT态
d)初始化驱动器(is620n)ec_config_init
e)DC配置
f)申请并等待进入Pre-OP态
g)配置过程数据TxPDO/RxPDO(自定义函数process_data_config)
h)配置FMMU ec_config_map
i)申请并等待进入Safe-OP态
j)设置CSP模式
k)发送和接收过程数据1次,触发SLAVE
l)申请并等待进入OP态
m)进入过程数据收发循环
#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
static void hex_dump(const rt_uint8_t *ptr, rt_size_t buflen)
{
unsigned char *buf = (unsigned char *)ptr;
int i, j;
RT_ASSERT(ptr != RT_NULL);
for (i = 0; i < buflen; i += 16)
{
rt_kprintf("%08X: ", i);
for (j = 0; j < 16; j++)
if (i + j < buflen)
rt_kprintf("%02X ", buf[i + j]);
else
rt_kprintf(" ");
rt_kprintf(" ");
for (j = 0; j < 16; j++)
if (i + j < buflen)
rt_kprintf("%c", __is_print(buf[i + j]) ? buf[i + j] : '.');
rt_kprintf("\n");
}
}
static char IOmap[4096];
typedef struct __attribute__((__packed__))
{
unsigned char mode_byte;
unsigned short control_word;
long dest_pos;
unsigned short error_word;
unsigned short status_word;
long cur_pos;
}SERVO_DATA_T;
typedef struct
{
SERVO_DATA_T servo_data[3];
}SERVOS_T;
SERVOS_T *servos = (SERVOS_T *)IOmap;
void view_slave_data()
{
hex_dump(IOmap,32);
}
static void echo_time()
{
struct timeval tp;
osal_gettimeofday(&tp, 0);
printf("****cur time = %d,%03d,%03d(us)\n", tp.tv_sec,tp.tv_usec/1000,tp.tv_usec%1000);
}
#define EC_TIMEOUTMON 500
int expectedWKC;
boolean needlf;
volatile int wkc;
boolean inOP;
uint8 currentgroup = 0;
void process_data_config()
{
u8_t ind;
for(int slave = 1; slave <= *ecx_context.slavecount; slave++)
{
//rpdo------------
//1c12.0
safe_SDCwrite_b(slave, 0x1c12, 0, 0);
safe_SDCwrite_w(slave, 0x1c12, 1, 0x1600);
//1600
ind = 0;
safe_SDCwrite_b(slave, 0x1600, 0, 0);
safe_SDCwrite_dw(slave, 0x1600, ++ind, htoel(0x60600008));//6060h(控制模式)
safe_SDCwrite_dw(slave, 0x1600, ++ind, htoel(0x60400010));//6040h(控制字)
safe_SDCwrite_dw(slave, 0x1600, ++ind, htoel(0x607a0020));//607Ah(目标位置)
safe_SDCwrite_b(slave, 0x1600, 0, ind);
//1c12.0
safe_SDCwrite_b(slave, 0x1c12, 0, 1);
//tpdo-------------
//1c13.0
safe_SDCwrite_b(slave, 0x1c13, 0x00, 0);
safe_SDCwrite_w(slave, 0x1c13, 0x01, 0x1a00);
//1a00
ind = 0;
safe_SDCwrite_b(slave, 0x1a00, 0, 0);
safe_SDCwrite_dw(slave, 0x1a00, ++ind, htoel(0x603F0010));//603Fh(错误码)
safe_SDCwrite_dw(slave, 0x1a00, ++ind, htoel(0x60410010));//6041h(状态字)
safe_SDCwrite_dw(slave, 0x1a00, ++ind, htoel(0x60640020));//6064h(位置反馈)
safe_SDCwrite_b(slave, 0x1a00, 0, ind);
//1c13.0
safe_SDCwrite_b(slave, 0x1c13, 0, 1);
safe_SDCwrite_b(slave, 0x6060, 0, 1);
//viewSDO(slave, 0x6060, 0, 1);
}
}
void servo_switch_op()
{
int sta;
for(int slave = 1; slave <= *ecx_context.slavecount; slave++)
{
int idx = slave - 1;
sta = servos->servo_data[idx].status_word & 0x3ff;
//printf("servo_switch_op: slave %d [6041]=%04x\n",slave,servos->servo_data[idx].status_word );
if(servos->servo_data[idx].status_word & 0x8){
servos->servo_data[idx].control_word = 0x8;
// printf("***slave %d control=%04x\n",slave,servos->servo_data[idx].control_word );
continue;
}
//printf("servo_switch_op: slave %d sta=%04x\n", slave, sta );
switch(sta)
{
case 0x250:
case 0x270:
servos->servo_data[idx].control_word = 0x6;
break;
case 0x231:
servos->servo_data[idx].control_word = 0x7;
break;
case 0x233:
servos->servo_data[idx].control_word = 0xf;
break;
default:
//servos->servo_data[idx].control_word = 0x6;
break;
}
//printf("slave %d control=%04x\n",slave,servos->servo_data[idx].control_word );
}
}
void servo_switch_idle()
{
int sta;
for(int slave = 1; slave <= *ecx_context.slavecount; slave++)
{
servos->servo_data[slave-1].control_word = 0x0;
}
}
void sv660n_config(char *ifname)
{
needlf = FALSE;
inOP = FALSE;
osal_timer_init();
ecx_context.manualstatechange = 1;
printf("========================\n");
printf("sv660 config\n");
echo_time();
if (ec_init(ifname))
{
printf("ec_init on %s succeeded.\n",ifname);
//init status
printf("\nRequest init state for all slaves\n");
ec_slave[0].state = EC_STATE_INIT;
//request INIT state for all slaves
ec_writestate(0);
//显示1状态
/* wait for all slaves to reach SAFE_OP state */
ec_statecheck(0, EC_STATE_INIT, EC_TIMEOUTSTATE * 3);
if (ec_slave[0].state != EC_STATE_INIT ){
printf("Not all slaves reached init state.\n");
ec_readstate();
for(int i = 1; i<=ec_slavecount ; i++){
if(ec_slave[i].state != EC_STATE_INIT){
printf("Slave %d State=0x%2x StatusCode=0x%04x : %s\n", i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
}
}
}
echo_time();
//if ( ec_config(FALSE, &IOmap) > 0 )
wkc = ec_config_init(0/*usetable*/);
if (wkc > 0)
{
ec_configdc();
ec_dcsync0(1, TRUE, 2000000, 50); // SYNC0 on slave 1
while(EcatError) printf("%s", ec_elist2string());
printf("%d slaves found and configured.\n",ec_slavecount);
/* request pre_op for slave */
printf("\nRequest pre_op state for all slaves\n");
ec_slave[0].state = EC_STATE_PRE_OP | EC_STATE_ACK;
ec_writestate(0);
//故障复位
// safe_SDCwrite_w(1,0x200d, 0x2, 1);
// safe_SDCwrite_w(1,0x200d, 0x2, 0);
//现在应该在pre_op状态
//显示2状态
process_data_config(); //config tpdo/rpdo
//config fmmu
ec_config_map(IOmap);
/* request safe_op for slave */
ec_slave[0].state = EC_STATE_SAFE_OP;
ec_writestate(0);
//safe-op
expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
printf("Calculated workcounter %d\n", expectedWKC);
/* wait for all slaves to reach SAFE_OP state */
ec_statecheck(0, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 3);
if (ec_slave[0].state != EC_STATE_SAFE_OP ){
printf("Not all slaves reached safe operational state.\n");
ec_readstate();
for(int i = 1; i<=ec_slavecount ; i++){
if(ec_slave[i].state != EC_STATE_SAFE_OP){
printf("Slave %d State=0x%2x StatusCode=0x%04x : %s\n", i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
}
}
}else{
//显示4状态
//启动伺服
servos->servo_data[0].mode_byte = 8; //csp mode
//op status
printf("Request operational state for all slaves\n");
expectedWKC = (ec_group[0].outputsWKC * 2) + ec_group[0].inputsWKC;
printf("Calculated workcounter %d\n", expectedWKC);
ec_slave[0].state = EC_STATE_OPERATIONAL;
// send one valid process data to make outputs in slaves happy
ec_send_processdata();
wkc = ec_receive_processdata(EC_TIMEOUTRET*3);
printf("--->workcounter %d\n", wkc);
//view_slave_data();
// request OP state for all slaves
ec_writestate(0);
int chk = 200;
// wait for all slaves to reach OP state
do
{
ec_send_processdata();
ec_receive_processdata(EC_TIMEOUTRET);
printf("--->workcounter %d\n", wkc);
ec_statecheck(0, EC_STATE_OPERATIONAL, 50000);
}
while (chk-- && (ec_slave[0].state != EC_STATE_OPERATIONAL));
if (ec_slave[0].state == EC_STATE_OPERATIONAL )
{
printf("<<
inOP = TRUE;
osal_timert t;
osal_timer_start(&t, 1000);
// cyclic loop
for(int i = 1; i <= 10000; i++)
{
servo_switch_op();
if(servos->servo_data[0].control_word==7){
servos->servo_data[0].dest_pos = servos->servo_data[0].cur_pos;
//printf("cur pos = %ld\n", servos->servo_data[0].cur_pos);
}
if(servos->servo_data[0].control_word==0xf){
servos->servo_data[0].dest_pos += 3000;
}
while(osal_timer_is_expired(&t)==FALSE);
osal_timer_start(&t, 1000);
ec_send_processdata();
wkc = ec_receive_processdata(EC_TIMEOUTRET);
if(wkc >= expectedWKC){
//printf("~~~~WKC %d \n", wkc);
}
if(wkc <=0 ){
printf("Error.\n");
break;
}
//osal_usleep(1000);
}
inOP = FALSE;
}
else
{
printf("Not all slaves reached operational state.\n");
ec_readstate();
for(int i = 1; i<=ec_slavecount ; i++)
{
if(ec_slave[i].state != EC_STATE_OPERATIONAL)
{
printf("Slave %d State=0x%2.2x StatusCode=0x%4.4x : %s\n",i, ec_slave[i].state, ec_slave[i].ALstatuscode, ec_ALstatuscode2string(ec_slave[i].ALstatuscode));
}
}
}
//init status
printf("\nRequest init state for all slaves\n");
ec_slave[0].state = EC_STATE_INIT;
//request INIT state for all slaves
ec_writestate(0);
}
} else {
printf("No slaves found!\n");
}
echo_time();
printf("End soem, close socket\n");
// stop SOEM, close socket
ec_close();
}else{
printf("ec_init on %s failed.\n",ifname);
}
printf("IOMAP addr = 0x%08x\n", (uint32_t)IOmap);
printf("========================\n");
view_slave_data();
}
在进入数据数据收发循环后,按次序发送控制字启动伺服(6040h发送6,7和15),然后就可以不断发送新的控制位置让电机转起来了!
5. 总结
整个移植过程还是充满了挑战,主要也是因为今年才开始接触EtherCAT,很多概念是边学边用,网上也参考了不少同学的帖子。很多人反应汇川的伺服用SOEM驱动DC同步模式总是有问题,确实遇到了很多奇奇怪怪的问题。经过这两个月的折腾,总算开了个头,基础打好了。
下一步可优化的就是现在的网络移植改用直接操作emac,这样可以减少网络抖动。
附件程序里还参考本站贴子移植了uffs文件系统,编译如果有问题,可能还需要下载uffs、ramdisk、optparse和netutils包。
完整程序包下载
优惠劵
lg28870983
关注
关注
5
点赞
踩
61
收藏
觉得还不错?
一键收藏
知道了
17
评论
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
EtherCAT在运动控制领域非常热门,有SOEM和IGH的开源主机实现。在STM系列处理器上的实现比较多,在RT-Thread上的实现还没有看到。这次就基于RT-Thread移植SEOM,并实现了DC+CSP对汇川伺服IS620N的控制,同步周期为1ms。
复制链接
扫一扫
专栏目录
VxWorks在Zynq平台上的移植详细流程
10-23
详细介绍了VxWorks移植到Zynq平台,包括bootrom和内核(vxWorks、vxworks.sym),通过QSPI启动bootrom,文件系统(TFFS)挂载到EMMC中,以及调试EMMC驱动,以及应用程序的开发
soem主站移植到rt thread smart操作系统
cln512的博客
04-16
4550
soem主站移植到rt thread smart操作系统
17 条评论
您还未登录,请先
登录
后发表或查看评论
RK3568平台移植EtherCAT Master
m0_56121792的博客
12-27
1063
EtherCAT全称EtherNet Control Automation Technology,是由德国倍福(Beckhoff)公司提出的一种实时以太网技术,用于工业自动化的现场总线通信协议。EtherCAT是一种开放但不开源的技术,意味着您可以任意使用这项技术,但若要进行相关设备的开发,则需要向倍福公司获取相关授权。
IGH EtherCAT是一种EtherCAT协议开源实现,是一个完全符合EtherCAT标准的库,能够在实时操作系统上运行。与传统总线相比,EtherCAT的优点在于减
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7550
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
【FreeRTOS的SOEM-master(1.4.1)移植】
pengrunxin的博客
10-08
3241
工作需要移植soem做EtherCAT主站,就跟大家分享如何移植soem,板块网口一个,实现soem与lwip能共用。
基于rt thread smart构建EtherCAT主站
cln512的博客
05-22
1988
基于rt thread smart构建EtherCAT主站
基于STM32构建EtherCAT主站(SOEM方案)2
热门推荐
cln512的博客
12-22
1万+
基于stm32构建ethercat主站
EtherCAT主站——SOEM(学习笔记1)
a1347065101的博客
07-14
3908
EtherCAT 是一个以以太网为基础的开放架构的现场总线系统,EtherCAT 数
据部分封装在以太网帧中,主站发送以太网帧在以太网上传输。
soem主站源码纯C代码编写,方便移植
09-17
SOEM最新源码。支持多种操作系统(包含Linux,win32,以及各种实时系统等),可供下载
rt-thread-smart-soem
04-14
rt-thread-smart-soem
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
Soem-1个IO模块输入IO显示及IO输出控制-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码
01-09
Soem-1个IO模块输入IO显示及IO输出控制-添加代码注释-CSDN.zip
EtherCAT主站-SOEM专栏的源代码。
EtherCAT主站SOEM -- 13 --Qt-Soem通过界面按键控制 EtherCAT IO模块的io输出 ;
EtherCAT主站SOEM -- 14 --Qt-Soem通过界面采集从站IO进行显示 ,这两篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/135429669 ,https://blog.csdn.net/qq_50808730/article/details/134894049 )。
注意: 该项目源代码提供了 QT-SOEM 配置从站到OP状态,并且对1个EtherCAT从站 IO模块进行操作,包括:IO输出控制,IO采集进行显示。
源代码 主要功能:
获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等。
对1个EtherCAT从站 IO模块进行操作,包括:IO输出控制,IO采集显示。
Soem-跟从站通讯到OP状态-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码
01-09
Soem-跟从站通讯到OP状态-添加备注-CSDN.zip
EtherCAT主站-SOEM专栏的源代码。
EtherCAT主站SOEM -- 9 -- SOEM之基于QT搭建自己的EtherCAT主站,这一篇博客的源代码,博客链接( https://blog.csdn.net/qq_50808730/article/details/134361490 )。
注意: 该项目源代码只是提供了 QT-SOEM 配置从站到OP状态,没有对EtherCAT从站进行操作。
源代码 主要功能:
获取网卡信息,绑定网卡,配置EtherCAT网络,等待从站进入OP状态,检查EtherCAT主站和从站状等等。
Soem主站识别到 几 个从站。
SOEM v1.4.0 - Simple Open Source EtherCAT Master
04-16
簡單的開源 EtherCAT 主站
SOEM 是用 c 編寫的 EtherCAT 主庫。它的目的是學習和使用。邀請所有用戶研究源代碼,以了解 EtherCAT 主站的功能以及它如何與 EtherCAT 從站交互。
由於所有應用程序都不同,SOEM 盡量不強加任何設計架構。在 Linux 下,它可以用於通用用戶模式、PREEMPT_RT 或 Xenomai。在 Windows 下,它可以用作用戶模式程序。
Soem-1个电机转圈圈PV模式-添加代码注释-CSDN - EtherCAT主站-SOEM专栏的源代码
01-09
EtherCAT主站-SOEM专栏的源代码。 EtherCAT主站SOEM -- 16 --Qt-Soem通过界面按键控制电机转圈圈PV模式,这一篇博客的源代码,博客链接( 正在编写,2024.1.14发布, ...
学习阶段单片机买esp32还是stm32?
无际单片机编程
03-07
1970
现在的趋势是,芯片厂不希望你把精力,浪费在研究他们芯片上,而是赶紧把产品开发出来,给我冲量(挣钱),只要你量管够,技术支持住在你们公司旁边都行,小公司做研发就比较惨了,供应商基本不理你。以前有个经理做一个项目,用到一颗芯片,不要说例程了,连资料都特么是日语的,只能靠自己的经验,去推测寄存器配置。如果现在哪款单片机,厂家想推出去,既没什么资料,又不提供外设例程,大概率推不动,除非价格,性能有特别的优势。随着不同的路段,不同的需求,再针对性去学习别的功能,慢慢就系统了,有些功能,车开到报废了也用不上。
基于单片机的Buck型变换器控制
最新发布
qq1744828575的博客
03-13
648
对于电子产品而言,必不可少的供电电源,随着人们对电子产品的安全性能要求越来越高,变相的对供电电源提出了新的机遇和挑战。Buck型变换器控制的研究一直是该领域重要的一方面,对于直流斩波电路而言,研究最多是压斩波电路。本文研究了一种基于单片机STM32F10ZET6的Buck型变换器控制,由主回路、控制回路以及超前滞后校正器三方面组成,控制回路用于输出指定的频率和占空比的数字PWM脉冲波;主回路主要涉及电阻、电容以及电感的性能参数的选择;超前滞后校正器主要用于使稳定输出电压的作用。
ethercat主站soem函数详解
05-30
`SOEM` 是一个开源的以太网通讯库,用于实时以太网通讯,支持 `EtherCAT` 协议。下面是一些 SOEM 的主要函数:
1. `ec_init()`:初始化 EtherCAT 主站。该函数会打开一个 EtherCAT 网络连接,并且会扫描 EtherCAT 总线上的所有从站。
2. `ec_config_init()`:初始化配置文件。在使用 EtherCAT 网络之前必须配置 EtherCAT 总线和从站的参数。该函数可以从 XML 配置文件中读取配置参数,并将其应用于 EtherCAT 总线和从站。
3. `ec_config_map()`:将变量映射到 EtherCAT 数据区。该函数将应用程序中的变量与 EtherCAT 数据区中的实际地址进行映射。这样,应用程序可以读取和写入 EtherCAT 从站的输入和输出数据。
4. `ec_task()`:启动 EtherCAT 主站任务。该函数用于启动 EtherCAT 主站任务,该任务会定期读取和写入 EtherCAT 数据区中的数据。
5. `ec_read()` 和 `ec_write()`:读取和写入 EtherCAT 数据区中的数据。这两个函数用于读取和写入 EtherCAT 从站的输入和输出数据。
6. `ec_slave[slave_number].outputs[offset]` 和 `ec_slave[slave_number].inputs[offset]`:EtherCAT 从站的输入和输出数据。这两个变量用于直接读取和写入 EtherCAT 从站的输入和输出数据。
以上是一些常用的 SOEM 函数,它们可以帮助开发人员实现对 EtherCAT 网络的控制和数据交换。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
lg28870983
CSDN认证博客专家
CSDN认证企业博客
码龄10年
暂无认证
29
原创
9万+
周排名
5万+
总排名
7万+
访问
等级
415
积分
148
粉丝
98
获赞
35
评论
273
收藏
私信
关注
热门文章
Soem配置汇川SV660N
12961
掌上实验室V8系列教程(八)ADC模数转换
6482
Qt5.14.2安装
5741
掌上实验室V8系列教程(三)数码管动态显示
5369
掌上实验室V8系列教程(五)定时器中断及应用
5348
分类专栏
掌上实验室V9
7篇
RT-Thread
14篇
掌上实验室V8
10篇
linux
2篇
QT
2篇
LicheeRV
1篇
最新评论
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
Amour771:
你好如果我ec_config_init(TRUE) soem中使用配置表初始化从站,可以进入op状态,但是再线程运行中会出现hard fault on handler报错,但是如果我是用ec_config_init(FALSE)的话可以初始化成功 并且不会报错
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
weiyicc:
请问,CFG_TICKS_PER_SECOND这个宏是在哪里定义的,等于多少
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
lg28870983:
有没有可能钩子函数没安装好
在RT-Thread上移植EtherCAT开源主站SOEM1.4.0
Amour771:
您好,在调试中现在发送可以进行 ,但是接收函数直接返回值0,这个是什么原因
Soem配置汇川SV660N
Studil:
您好,请问这个问题后来解决了吗?
大家在看
基于小蜜蜂蓝桥杯单片机矩阵键盘的基本应用
谷歌插件推荐Tab Switcher
165
基于的新生报到管理系统(1)(源码+开题)
IP代理技术革新:探索数据采集的新路径
数学新巅峰,微软&清华联合研究发现:7B级LLaMA-2模型数学能力惊人,准确率高达97.7%
最新文章
RT-Thread基于AT32单片机的CAN应用
RT-Thread基于AT32单片机的Flash应用
RT-Thread基于AT32单片机的485应用开发(三)Modbus从机
2024年7篇
2023年3篇
2022年8篇
2021年11篇
目录
目录
分类专栏
掌上实验室V9
7篇
RT-Thread
14篇
掌上实验室V8
10篇
linux
2篇
QT
2篇
LicheeRV
1篇
目录
评论 17
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
基于STM32H743芯片和SOEM的EtherCAT主站源码 - 27699885 - 博客园
基于STM32H743芯片和SOEM的EtherCAT主站源码 - 27699885 - 博客园
会员
周边
新闻
博问
AI培训
云市场
所有博客
当前博客
我的博客
我的园子
账号设置
简洁模式 ...
退出登录
注册
登录
judaima801
博客园
首页
新随笔
新文章
联系
管理
订阅
基于STM32H743芯片和SOEM的EtherCAT主站源码
STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码 提供配套CUBE工程SOEM协议栈使用1.3.1版本。可配套NUCLEO-H743ZI开发板使用。支持DC同步。可配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B/A6B和欧姆龙G5系列驱动器使用,或提供想适配的驱动器型号
目录
目录 1
1 引言 2
1.1 编写目的 2
1.2 参考资料 2
2 源码梳理 3
2.1 文件功能说明 3
2.2 基础知识 3
2.2.1 寻址方式 3
2.3 底层驱动移植 4
2.3.1 定时器移植 4
2.3.2 网卡驱动移植 4
2.4 函数说明 5
2.4.1 EE访问过程 5
2.4.2 ec_config_init 6
2.4.3 ec_config_map 7
2.5 分布时钟 8
2.5.1 解决计数时刻不一致的问题 8
2.5.2 计算传输延时 8
2.5.3 ESC 时间控制环以及漂移补偿 8
3 伺服适配 10
3.1 汇川IS620N 10
3.2 欧姆龙G5 11
3.3 松下A5B 11
引言
编写目的
记录SOEM学习过程
看是否能用在实际工程中
参考资料
SOEM-1.3.1源码
源码梳理
文件功能说明
名称
主要功能
ethercatbase.c
基本EtherCAT功能函数,主要包含的是一些EtherCAT通信服务命令函数以及EtherCAT数据帧组成的函数
ethercatcoe.c
CoE(CAN over EtherCAT)模块,包含的是应用层CoE协议相关的一些结构体和数据操作函数
ethercatconfig.c
EtherCAT主站配置模块,包含的是EtherCAT主站对从站的基本配置函数
ethercatconfiglist.h
此文件包含的是一个列表,里面包含了一些已知产品参数的EtherCAT从站
ethercatdc.c
EtherCAT分布时钟功能,包含了EtherCAT分布时钟(Distributed Clock)相关配置的函数
ethercatmain.c
EtherCAT主要功能模块,包含了EtherCAT初始化、状态设置和读取、邮箱数据通信、从站EEPROM操作、从站信息接口SII读和过程数据交换等函数。以及定义ec_slave[],所有从站信息都在这个结构体中
ethercatprint.c
将EtherCAT错误转换成可读信息模块,SDO中止信息和应用层状态代码用于传递从站信息给用户应用层,所以这个文件里函数的主要功能是将二进制码转换成可读的文本信息
ethercattype.c
此文件主要是一些新的类型定义和宏定义,使用这些可以给具体的应用程序带来优化和便利
nicdrv.c
EtherCAT原始套接字驱动,主要包含了使用网卡NIC和socket通信来发送数据帧的函数
osal.c
定时器配置模块,主要包含了一些定时器设置和延时等函数
oshw.c
此文件中包含的函数主要用来识别现在这台机器上现有的网卡信息
simple_test.c
此文件是根据自己所需的EtherCAT主站开发所编写的程序,通过各种配置,数据发送和读取
基础知识
寻址方式
顺序寻址
主站按照物理连接的先后顺序进行寻址,一般用在主机刚刚启动时
设置寻址
主站按照设置给每个从站的地址进行寻址,1001、1002……
逻辑寻址
主站将每个从站的地址映射到一个虚拟的4G缓存区,进行寻址(这种寻址比较实用、方便)。逻辑寻址的管理有从站的FMMU进行管理,FMMU将本地内存映射到主机设置的4G内存中的一块区域中。主站可以通过逻辑地址方便的读取任一从站的内存。
广播寻址
底层驱动移植
定时器移植
底层驱动需要开启一个周期性定时器,一来作为SOEM主站的时间基准,二来作为与从站PDO数据交换的周期,如125us、250us、500us、1000us。
定时器定时时长通过宏定义PDI_DC_CYCLE定义,默认为1000000ns(1ms),这个根据实际应用修改。
设置定时器时有个技巧,系统时钟分频后,定时器每个tick的时间是250ns,这个跟调节每次PDO数据交互有关,这个非常关键
SOEM系统本地时间用一个结构体表示,表示系统上电后执行了多长时间。
系统产生一个1ms定时中断,每次中断usec+=1000,如果usec超过1000000(1s)则sec+=1, usec-=1000
网卡驱动移植
网卡驱动是移植的重点
ecx_outframe函数完成数据发送,这块要根据自己的硬件平台适配
ecx_recvpkt函数完成网口数据接收,这块要根据自己的硬件平台适配
函数说明
EE访问过程
有明确地址的直接通过ecx_readeeprom1()和ecx_readeeprom2()访问
后面的category需要通过ecx_siifind函数找到对应的EE起始地址,然后通过地址偏移的方式ecx_siigetbyte访问EE
读的一般步骤为:
读取EEPROM控制/状态寄存器0x0502:0x0503的内容,确认EEPROM没有处于Busy状态
向0x0502:0x0503写入读控制命令,写入的值为0x0100,向0x0504:0x0507写入需要读的EEPROM地址
重复步骤(1)
从寄存器0x0508:0x050F中读取对应EEPROM地址的内容
读取一次SOEM主站需要发送4帧数据。
步骤(1)和(2)在SOEM源码中对应的实现函数为ecx_readeeprom1()。
步骤(3)和(4)在SOEM源码中对应的实现函数为ecx_readeeprom2()。
ec_config_init
获取连接的从站个数,获取从站的信息并将从站的信息填充到ec_slave结构体
ec_config_map
SOEM通过函数ec_config_map(&IOmap)完成逻辑地址和物理地址的映射,应用程序需要定义一个数组IOmap,完成映射后,应用程序就可以通过读写数组IOmap[]来完成与从站的数据交换。
首先获取每一个从站的RXPDO和TXPOD对应的字节数,两个函数可以实现这个功能
ecx_map_coe_soe->
ecx_readPDOmap
这个函数通过读取1C00h对象的值(代表四个SM的类型),得到1C12和1C13对应的1600和1A00,进而得到1600和1A00对应的子索引个数,然后分别读取子索引1……N(60400010 60600008),得到累计长度
ecx_map_sii
当上面那个函数失败后就会通过这个函数完成,主要是通过读取从站EE中category pdo完成
然后配置SYNCManager寄存器
最后通过FMMU映射地址,实际上就是将从站数据和IOmap中的一块区域关联上
分布时钟
https://blog.csdn.net/ethercat_i7/article/details/52858758
所谓时钟同步,是指所有从站间时钟同步,即各从站的系统标准时间相同:在同一时刻,各个从站报的时钟数值都相同(系统时间相同)。当然,严格意义上的时钟同步是不存在的,只能在一定精度上达到时钟同步, EtherCAT 上的时钟同步是远远低于 1 微秒的,实践中可以做到几个ns。
解决计数时刻不一致的问题
通过函数ec_configdc实现
在计算时间偏差Toffset(n)和传输延时之前,主站需要发送一个广播命令BWR,写所有从站端口0的接收时间寄存器0x0900,将所有从站捕捉数据帧第一个前导位到达每个端口的本地时间保存到寄存器0x0900~0x090F, 每个端口使用4个字节。
读取数据帧处理单元接收时间,与主站的系统时间比较,差值作为Toffset(n)写入从站寄存器0x0920
SOEM只在初始化时使从站时间同步主站时间,若要运行后使主从时间同步,需要定期修正主站时间或从站时间。
计算传输延时
通过函数ec_configdc实现,计算传输延时并写入从站寄存器0x0928
ESC 时间控制环以及漂移补偿
在运行过程中,主站使用命令FRMW读取第一个DC从站的时间并写入到后续DC从站,达到时间同步的目的。
除了保证所有从站间时钟同步,还要保证主站的数据发送中断相对于SYNC中断有一个固定的时间差,以保证在CSP模式时的稳定。通过函数ec_sync实现,使用了PI调节算法。补偿完毕后1ms定时中断相对于同步中断时间差稳定在490us左右,抖动16us.
伺服适配
汇川IS620N
需要特别注意的是IS620N伺服需要在PRE-OP状态下配置DC
直接扫描驱动器时得到的PDO映射比较简单,初始化时将PDO映射初始化成最复杂的一组PDO映射(1704h+1B02h)。这样所有的模式都可以通过PDO方式操作了。
欧姆龙G5
显示区的拨码开关用于设置从站地址,00是控制器配置,01-99按拨码开关的配置
控制字要遵循状态机6-7-15
使用默认PDO映射组就可以(1701和1B01那一组)
电机编码器分辨率1048576
在PRE-OP阶段配置DC,要不然报警90
松下A5B
控制字要遵循状态机6-7-15
电机编码器分辨率131072
使用默认PDO映射1600h和1A00h
伺服支持FREERUN和DC两种模式
源码使用
双击ctb.printf1.0.0.pack进行安装,支持串口1打印消息
posted on
2023-03-31 08:44
27699885
阅读(962)
评论(0)
编辑
收藏
举报
会员力量,点亮园子希望
刷新页面返回顶部
公告
Copyright © 2024 27699885
Powered by .NET 8.0 on Kubernetes
基于STM32构建EtherCAT主站(SOEM方案)1_stm32 soem-CSDN博客
>基于STM32构建EtherCAT主站(SOEM方案)1_stm32 soem-CSDN博客
基于STM32构建EtherCAT主站(SOEM方案)1
最新推荐文章于 2024-03-10 18:47:25 发布
jacksong2021
最新推荐文章于 2024-03-10 18:47:25 发布
阅读量1.2k
收藏
4
点赞数
1
文章标签:
stm32
原文链接:https://blog.csdn.net/cln512/article/details/110704584
版权
原文:https://blog.csdn.net/cln512/article/details/110704584
最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。
准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。
整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此改一下osal、oshw、nicdrv这几部分的代码就可以了。
当然了,移植过程中参考了许多网上资料(不限于以下几个)。在此,谢谢这些大佬了。
lwip移植: 这部分资料参考了原子、野火的stm32教程以及stm32参考手册,把以太网相关的部分看一下就行了。 相关论文: 王惠娇同志的硕士论文《基于嵌入式平台的EtherCAT主站实现研究》 这篇文章很关键,基本上把详细的移植过程都阐述了一遍,大家可以仔细研读一下。 成功案例: 一些网友已经在stm32上移植成功了,我在此转发一下。 EasyCAT,这是一个国外大佬做的一个项目,也是基于stm32的。 阿莫电子论坛的《基于stm32和soem的EtherCAT主站代码分享》 以及github上的一些开源代码 我移植好的soem主站,基于原子的stm32f767开发板。 点击相关文字就可以转到超链接的网站
我先去吃饭啦,有空再写。 ———————————————— 版权声明:本文为CSDN博主「拉松」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/cln512/article/details/110704584
优惠劵
jacksong2021
关注
关注
1
点赞
踩
4
收藏
觉得还不错?
一键收藏
知道了
0
评论
基于STM32构建EtherCAT主站(SOEM方案)1
原文:https://blog.csdn.net/cln512/article/details/110704584最近两月的周末,本人将SOEM主站移植到了STM32上,在free run模式下运行正常,可以驱动倍福的io从站;在DC模式下存在一些bug,只能驱动一部分的伺服驱动器。准备在博客上记录一些移植过程,和大家分享一下,肯定会有一些说的不对的地方,欢迎大家批评指正。整个移植过程其实和将lwip移植到stm32上的方法类似,SOEM主站在设计时就采用了硬件抽象层、操作系统抽象层的架构,因此
复制链接
扫一扫
参与评论
您还未登录,请先
登录
后发表或查看评论
EtherCAT主站SOEM源码解析----IOmap
ethercat_i7的博客
10-17
1万+
SOEM通过函数ec_config_map(&IOmap)完成逻辑地址和物理地址的映射,应用程序需要定义一个数组IOmap,例如:
char IOmap[4096];
完成映射后,应用程序就可以通过读写数组IOmap[]来完成与从站的数据交换。1、映射关系SOEM首先将所有从站的输出映射到IOmap[]的开始位置,然后是输入,如下图所示:
2、具体实现函数ec_config_m
基于STM32的伺服总线EtherCAT主站设计——SOEM方案
weixin_48501028的博客
04-16
7551
本文介绍在正点原子的STM32H743开发板上,使用SOEM方案实现EtherCAT主站通讯,本文记录从零基础学习路线,从入门到移植成功控制电机转动。
基于X86架构的EhterCAT主站控制器安装方法-2-linux kernel编译、安装、测试(x86)
PlutoZuo的博客
06-22
67
【代码】基于X86架构的EhterCAT主站控制器安装方法-2-linux kernel编译、安装、测试(x86)
EtherCAT---帧格式详解
热门推荐
ethercat_i7的博客
11-16
1万+
以COE(CANopen over EtherCAT)的SDO服务为例,EtherCAT帧格式如下图所示:从图中可看出CANopen、EtherCAT和Ethernet这几个协议的大致关系。
Soem配置汇川SV660N
lg28870983的博客
04-24
1万+
Soem配置汇川SV660N和启动控制器流程
基于STM32构建EtherCAT主站(SOEM方案)4
cln512的博客
12-22
5300
基于stm32构建ethercat主站
STM32H743 SOEM EtherCAT:基于STM32H743芯片和SOEM的EtherCAT主站源码的强大解决方案
XtVCVZFBV的博客
09-27
414
综上所述,STM32H743 SOEM EtherCAT主站源码的结合,不仅提供了高性能的硬件支持,还通过易于使用的二次开发环境,实现了对多种驱动器的广泛支持。同时,它还可以配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B A6B和欧姆龙G5系列驱动器,为你的系统提供更广泛的应用可能。STM32H743和SOEM的EtherCAT主站源码的结合,为嵌入式系统开发提供了一种高效、强大且灵活的解决方案。四、开发板及驱动器支持。
STM32H743 SOEM EtherCAT 基于STM32H743芯片和SOEM的EtherCAT主站介绍
2301_78835236的博客
06-22
823
SOEM的版本1.3.1是指其协议栈的特定版本,每个版本可能会有一些改进和修复。EtherCAT通信协议:我可以解释EtherCAT协议的工作原理、优势和应用场景,并介绍EtherCAT主站和从站的概念。如果您对STM32微控制器系列感兴趣,我可以为您提供更详细的信息,例如不同系列和型号的特点、应用案例和开发方法。如果您对实时以太网通信感兴趣,我可以为您详细介绍实时以太网通信的基本原理、常见协议和在工业自动化中的应用。实时以太网通信:我可以讲解实时以太网通信的基本原理、常见协议和在工业自动化中的应用。
STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码
06-27
231
该系统支持DC同步,并且可以与多种驱动器型号配合使用,包括汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B A6B和欧姆龙G5系列驱动器,同时也可以适配其他驱动器型号。可配合汇川IS620N、三洋RS3、赛孚德ASD620B、埃斯顿ProNet、迈信EP3E、台达A2-E、伟创SD700、松下A5B A6B和欧姆龙G5系列驱动器使用,或提供想适配的驱动器型号。SOEM协议栈使用1.3.1版本。
SOEM:简单的开源EtherCAT主站
01-30
SOEM:简单的开源EtherCAT主站
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序.zip
01-21
stm32f407_ucosii__dp83848以太网芯片实现etherCAT主站程序,该程序使用stm32f407芯片,ucosii系统,dp83848以太网芯片实现etherCAT主站程序,并使用台达etherCAT伺服测试成功
基于SOEM的EtherCat主站程序控制汇川SV660
06-02
LAN8720,DP83848,汇川SV660,SV620,无操作系统STM32F407
lan9252与stm32的EtherCAT从站实现,ethercat主站代码stm32,C,C++
09-10
实现基于 LAN9252
学习阶段单片机买esp32还是stm32?
无际单片机编程
03-07
1970
现在的趋势是,芯片厂不希望你把精力,浪费在研究他们芯片上,而是赶紧把产品开发出来,给我冲量(挣钱),只要你量管够,技术支持住在你们公司旁边都行,小公司做研发就比较惨了,供应商基本不理你。以前有个经理做一个项目,用到一颗芯片,不要说例程了,连资料都特么是日语的,只能靠自己的经验,去推测寄存器配置。如果现在哪款单片机,厂家想推出去,既没什么资料,又不提供外设例程,大概率推不动,除非价格,性能有特别的优势。随着不同的路段,不同的需求,再针对性去学习别的功能,慢慢就系统了,有些功能,车开到报废了也用不上。
STM32---ADC
qq_26048279的博客
03-10
827
众所周知,GPIO只能读入高电平或者低电平,那如果现有一个模拟量,该如何读取呢,比如电压的范围是0~3.3v,如何获取电压的值。就需要ADC(Analog-Digital Converter)了。ADC可以将引脚上连续变化的模拟电压转变为内存中存储的数字变量,建立模拟电路到数字电路的桥梁。stm32f103自带的是12位逐次逼近型ADC,1us转换时间,这样最多可以输出0-4095的数字量。
STM32基础--初识 STM32
weixin_48713132的博客
03-05
1794
对于STM32,从字面意思上来理解,ST是意法半导体,M是Microelectronics的缩写,其中32表示的是32位,那么整合起来理解就是:STM32就是指的ST公司开发的32位微控制器。在如今的32位控制器中,STM32可以说是最闪耀光彩夺目的新星,所以也造就了STM32被现在的大多数工程师以及市场所青睐,对它是宠爱有加啊!
STM32FreeRTOS-事件组1(STM32Cube高效开发教程)
qq_37281984的博客
03-05
1201
事件组是FreeRTOS中的一种对象,且FreeRTOS默认就可以使用事件组,无需设置相关参数,使用之前需要使用创建函数创建事件组对象。
【STM32】STM32F4中USART的使用方法和Printf的重定义(基于CubeMX和Keil)
最新发布
weixin_52296952的博客
03-10
932
STM32使用串口的方法和printf的重定义
基于stm32平台的ethercat主站 源代码 例程
07-26
基于STM32平台的EtherCAT主站的源代码例程是指用于实现EtherCAT主站功能的代码示例。EtherCAT(Ethernet for Control Automation Technology)是一种以太网通信协议,它可以实现高性能、实时性的工业控制系统。STM32...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
jacksong2021
CSDN认证博客专家
CSDN认证企业博客
码龄15年
暂无认证
22
原创
2万+
周排名
21万+
总排名
161万+
访问
等级
1万+
积分
844
粉丝
954
获赞
129
评论
7404
收藏
私信
关注
分类专栏
keil
最新评论
基于PSoC4的矢量控制方案 :电流采样
♛妖孽♞:
您好,可以发一下PSoc4的安装包吗?
工作总结-Icepak 19.0 CAD模型导入方法结
蒋济天:
请问可以如何解决呀,急,在线等,多谢大神
工作总结-Icepak 19.0 CAD模型导入方法结
蒋济天:
导入IGS到spaceclaim如何进行修改尺寸,提示锁定改不了
AD原理图选择了器件,但是PCB没反应是为什么?
奶茶舒胡蕾:
好好好 找的就是怎么解决这个问题
STM32-RS485通信软硬件实现
向山向海:
请问在主函数中怎么调用?如何结合串口实现485通信?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
你真的理解密勒效应吗?
元器件质量等级和质量保证等级
ALLEGRO开弧形槽
2024年2篇
2023年12篇
2022年3篇
2021年81篇
2020年108篇
2019年123篇
目录
目录
分类专栏
keil
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
个
红包个数最小为10个
红包总金额
元
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
0
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。
余额充值
SOEM: Simple Open EtherCAT Master or SOEM
SOEM: Simple Open EtherCAT Master or SOEM
SOEM v1.3.1
Main Page
Data Structures
Files
Simple Open EtherCAT Master or SOEM
Tutorial
For a tutorial on SOEM See tutorial.txt
Overview
SOEM is an EtherCAT master library written in c. Its purpose is to learn and to use. All users are invited to study the source to get an understanding how an EtherCAT master functions and how it interacts with EtherCAT slaves.
As all applications are different SOEM tries to not impose any design architecture. Under Linux it can be used in generic user mode, PREEMPT_RT or Xenomai. under Windows it can be used as user mode program.
Preconditions Linux:
Linux 2.6 kernel.
GCC compiler (others might work, just not tested).
One (or two if in redundant mode) 100Mb/s NIC that can connect to a RAW socket.
Application must run as root / kernel.
Preconditions Windows:
Windows2000 - Windows 7 (8 not tested, might work).
VC compiler (others might work, just not tested).
One (or two if in redundant mode) 100Mb/s NIC that can connect to a RAW socket.
WinPcap installed.
Features as of 1.1.2 :
Connects to a standard RAW socket.
Full redundancy support.
Recovery of "out-of-order" frames.
Low level functions, BRD, BWR, APRMW, FPRD, LRW....
Blocking or non blocking transfers.
Automatic configuration of slaves.
Use of internal configuration table (quick).
Use of slave internal data in EEprom and/or CoE.
Setting and reading of slave state.
Automatic generation of processdata mapping.
Mailbox link layer support with resend toggle.
CoE, SDO read / write.
CoE, Complete Access support.
CoE, Segmented transfer support.
CoE, Object Description list
CoE, Emergency and abort SDO support.
Distributed Clock (DC) support.
Automatic configuration of DC slaves.
Automatic sync of clocks with process data exchange.
Flexible settting of sync0 and sync1 firing per slave.
Access to slave functions through one slave structure.
EEPROM read / write.
Local cache for EEPROM access with automatic 4/8 byte reading.
SII parsing.
Portable code, only standard c, usable for embedded applications.
All buffers are static so can be memory locked.
Support for Little and Big endian targets.
Features as of 1.1.3 :
CoE, TxPDO and RxPDO, master is client (beta).
FoE, Read and Write file (beta).
Features as of 1.1.4 :
FMMU allocation is floating instead of fixed. If needed more than 2 FMMUs are used.
SYNC1 generation supported.
Features as of 1.2.0 :
Changed license to GPLv2 only. Adresses leagal concerns about master licensing.
Slave init and process data mapping is split in two functions. This allows dynamic user reconfiguration of PDO mapping.
Eeprom transfer to and from PDI
Eeprom is released to PDI when going to SAFEOP.
Features as of 1.2.2 :
Redesign of topology and delay measurement. 4 port slaves are fully supported now.
Delay measurement of slaves that are reverse connected work too.
New ethercatprint unit to display errors in readable text.
Features as of 1.2.4 :
SoE, servo over EtherCAT support.
SoE read request and write request.
SoE segmented transfers.
SoE error response.
Added SoE errors to print module.
Auto config of SoE process data.
Features as of 1.2.5 :
Added eepromtool, it can read and write the ESC eeprom of a designated slave.
Rewrite of eeprom read/write functions.
Added infrastructure change to allow slave groups.
Added recovery and reconfiguration of slaves after connection loss.
Improved CoE PDO assignment read from slaves, no longer assume assign indexes as functionally fixed.
Features as of 1.2.8 :
Changed directory structure.
Changed make file.
Moved hardware / OS dependend part in separate directories.
Added firm_update tool to upload firmware to slaves in Boot state, use with care.
Added DC for LRD/LWR case.
Separated expectedWKC to inputsWKC and outputsWKC.
Added PreOP->SafeOP hooks in configuration functions.
With CoE use expedited download if mailbox size is very small and object <= 4 bytes.
Added mailbox error handling.
Rewrite of ec_recover_slave() and ec_reconfigure_slave()
Added -map option in slaveinfo, shows SOEM IO mapping of all slaves found.
Features as of 1.3.0 :
Added win32 target.
Added rtk target.
Compiles under gcc / visual-c / borland-c.
Multiple port support. One master can run concurrent stacks on multiple network ports.
All global vars are encapsulated in context struct.
All timing abstracted in osal.c.
Linux timing converted to get_clock(CLOCK_MONOTONIC).
Error messages updated to latest ETG1020 document.
FoE transfers now support busy response.
Tutorial
For Linux
go to project directory
source ./setup.sh linux
make all
For examples see simple_test.c in ~/test/linux/simple_test. First try (assume EtherCAT on eth0): sudo ./simple_test eth0 As SOEM uses RAW sockets it will need to run as root.
For Windows
have winpcap installed (included with WireShark)
go to project directory
for VC, run vcvarsall.bat f.e. : C: Files (x86) Visual Studio 10.0.bat x86
run make_test_win32_all.bat
Squashed bugs
Version 1.1.3
Added missing Big-Endian conversion in ethercatconfig.c
Fixed bug in segmented SDO transfers in ethercatcoe.c
Version 1.1.4
Changed FMMU algorithm of allocation during configuration. EL4732 supported now.
Changed the ec_slave structure around SM en FMMU storage.
Fixed bug in FoE write in ethercatfoe.c
Version 1.2.0
Fixed bug in type definition of int32 and uint32 for 64bit OS.
Fixed bug in maximum dataframe size calculation.
Version 1.2.2
Fixed bugs in ec_adddatagram.
Fixed several bugs in CoE object dictionary read functions.
Fixed bug in PDO mapping read function.
Changed ec_slave structure around topology and delay variables.
Added several constants in ethercattype.c
Version 1.2.3
Clear SM enable if size is 0, even if enable is set in SII.
Fixed bug in DC propagation delay calculation. Branches with only non DC slaves now correctly close root port.
Fixed bug in ec_receive_processdata(), wkc now checks for EC_NOFRAME instead of 0.
Fixed bug in makefile.
Version 1.2.5
Fixed bugs in ec_config_map().
Added EC_STATE_BOOT constant.
Fixed mailbox size bug, In and Out mailbox can now be of different size.
Fixed SM type bug.
Fixed FoE bugs.
Fixed siigetbyte() unaligned copy.
Fixed bug in nicdrv.c, socket handles are 0 included.
Fixed bug in ethercatconfig.c causing memory corruption.
Version 1.2.8
Fixed NetX mailbox configuration behaviour.
Fixed FoE write bug.
Fixed SII string read bug.
Fixed bug in table lookup for printing
Version 1.3.0
Fixed NetX100 configuration behaviour.
Fixed linux gettimeofday() to get_clock().
Fixed eeprom cache flush on reinit.
Fixed make for new gcc linker version.
Version 1.3.1
Added intime target.
Added rtk target.
Compiles under gcc / visual-c / intime / borland-c .
Added multi-threaded configuration for parallel configurations of slaves
Legal notice
Copyright© 2005-2015 Speciaal Machinefabriek Ketels v.o.f.
Copyright© 2005-2015 Arthur Ketels
Copyright© 2008-2010 TU/e Technische Universiteit Eindhoven
Copyright© 2012-2015 RT-labs AB
SOEM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation.
SOEM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
As a special exception, if other files instantiate templates or use macros or inline functions from this file, or you compile this file and link it with other works to produce a work based on this file, this file does not by itself cause the resulting work to be covered by the GNU General Public License. However the source code for this file must still be made available in accordance with section (3) of the GNU General Public License.
This exception does not invalidate any other reasons why a work based on this file might be covered by the GNU General Public License.
The EtherCAT Technology, the trade name and logo "EtherCAT" are the intellectual property of, and protected by Beckhoff Automation GmbH. You can use SOEM for the sole purpose of creating, using and/or selling or otherwise distributing an EtherCAT network master provided that an EtherCAT Master License is obtained from Beckhoff Automation GmbH.
In case you did not receive a copy of the EtherCAT Master License along with SOEM write to Beckhoff Automation GmbH, Eiserstrasse 5, D-33415 Verl, Germany (www.beckhoff.com).
Generated on Wed Mar 11 2015 20:44:23 for SOEM by
1.7.4
yload":{"allShortcutsEnabled":false,"fileTree":{"doc":{"items":[{"name":"html","path":"doc/html","contentType":"directory"},{"name":"images","path":"doc/images","contentType":"directory"},{"name":"soem.dox","path":"doc/soem.dox","contentType":"file"},{"name":"tutorial.txt","path":"doc/tutorial.txt","contentType":"file"}],"totalCount":4},"":{"items":[{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"osal","path":"osal","contentType":"directory"},{"name":"oshw","path":"oshw","contentType":"directory"},{"name":"soem","path":"soem","contentType":"directory"},{"name":"test","path":"test","contentType":"directory"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"ChangeLog","path":"ChangeLog","contentType":"file"},{"name":"Doxyfile","path":"Doxyfile","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"drvcomment.txt","path":"drvcomment.txt","contentType":"file"}],"totalCount":11}},"fileTreeProcessingTime":6.089118999999999,"foldersToFetch":[],"repo":{"id":56061612,"defaultBranch":"master","name":"stm32f4_ethercat","ownerLogin":"ethercat-diy","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-04-12T12:35:41.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/10209323?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1460472817.0","canEdit":false,"refType":"branch","currentOid":"36acedde0b6b948a5887596239ca4599390cf87f"},"path":"doc/soem.dox","currentUser":null,"blob":{"rawLines":["/**"," * \\mainpage Simple Open EtherCAT Master or SOEM"," *"," * \\section start Tutorial"," * For a tutorial on SOEM See tutorial.txt"," * "," * \\section overview Overview"," * SOEM is an EtherCAT master library written in c. Its purpose is to learn and"," * to use. All users are invited to study the source to get an understanding"," * how an EtherCAT master functions and how it interacts with EtherCAT slaves."," *"," * As all applications are different SOEM tries to not impose any design architecture."," * Under Linux it can be used in generic user mode, PREEMPT_RT or Xenomai. under Windows"," * it can be used as user mode program."," *"," * Preconditions Linux:"," * - Linux 2.6 kernel."," * - GCC compiler (others might work, just not tested)."," * - One (or two if in redundant mode) 100Mb/s NIC that can connect to a RAW socket."," * - Application must run as root / kernel."," *"," * Preconditions Windows:"," * - Windows2000 - Windows 7 (8 not tested, might work)."," * - VC compiler (others might work, just not tested)."," * - One (or two if in redundant mode) 100Mb/s NIC that can connect to a RAW socket."," * - WinPcap installed."," *"," * Features as of 1.1.2 :"," * - Connects to a standard RAW socket."," * - Full redundancy support."," * - Recovery of \"out-of-order\" frames."," * - Low level functions, BRD, BWR, APRMW, FPRD, LRW...."," * - Blocking or non blocking transfers."," * - Automatic configuration of slaves."," * - Use of internal configuration table (quick)."," * - Use of slave internal data in EEprom and/or CoE."," * - Setting and reading of slave state."," * - Automatic generation of processdata mapping."," * - Mailbox link layer support with resend toggle."," * - CoE, SDO read / write."," * - CoE, Complete Access support."," * - CoE, Segmented transfer support."," * - CoE, Object Description list"," * - CoE, Emergency and abort SDO support."," * - Distributed Clock (DC) support."," * - Automatic configuration of DC slaves."," * - Automatic sync of clocks with process data exchange."," * - Flexible settting of sync0 and sync1 firing per slave."," * - Access to slave functions through one slave structure."," * - EEPROM read / write."," * - Local cache for EEPROM access with automatic 4/8 byte reading."," * - SII parsing."," * - Portable code, only standard c, usable for embedded applications."," * - All buffers are static so can be memory locked."," * - Support for Little and Big endian targets."," *"," * Features as of 1.1.3 :"," * - CoE, TxPDO and RxPDO, master is client (beta). "," * - FoE, Read and Write file (beta)."," *"," * Features as of 1.1.4 :"," * - FMMU allocation is floating instead of fixed. If needed more than 2 FMMUs are used."," * - SYNC1 generation supported."," *"," * Features as of 1.2.0 :"," * - Changed license to GPLv2 only. Adresses leagal concerns about master licensing."," * - Slave init and process data mapping is split in two functions. This allows"," * dynamic user reconfiguration of PDO mapping."," * - Eeprom transfer to and from PDI"," * - Eeprom is released to PDI when going to SAFEOP."," *"," * Features as of 1.2.2 :"," * - Redesign of topology and delay measurement. 4 port slaves are fully supported now."," * - Delay measurement of slaves that are reverse connected work too."," * - New ethercatprint unit to display errors in readable text."," *"," * Features as of 1.2.4 :"," * - SoE, servo over EtherCAT support."," * - SoE read request and write request."," * - SoE segmented transfers."," * - SoE error response."," * - Added SoE errors to print module."," * - Auto config of SoE process data."," *"," * Features as of 1.2.5 :"," * - Added eepromtool, it can read and write the ESC eeprom of a designated slave."," * - Rewrite of eeprom read/write functions."," * - Added infrastructure change to allow slave groups."," * - Added recovery and reconfiguration of slaves after connection loss."," * - Improved CoE PDO assignment read from slaves, no longer assume assign indexes"," * as functionally fixed."," *"," * Features as of 1.2.8 :"," * - Changed directory structure."," * - Changed make file."," * - Moved hardware / OS dependend part in separate directories."," * - Added firm_update tool to upload firmware to slaves in Boot state, use with care."," * - Added DC for LRD/LWR case."," * - Separated expectedWKC to inputsWKC and outputsWKC."," * - Added PreOP->SafeOP hooks in configuration functions."," * - With CoE use expedited download if mailbox size is very small and object <= 4 bytes."," * - Added mailbox error handling."," * - Rewrite of ec_recover_slave() and ec_reconfigure_slave()"," * - Added -map option in slaveinfo, shows SOEM IO mapping of all slaves found."," *"," * Features as of 1.3.0 :"," * - Added win32 target."," * - Added rtk target."," * - Compiles under gcc / visual-c / borland-c."," * - Multiple port support. One master can run concurrent stacks on multiple network ports."," * - All global vars are encapsulated in context struct."," * - All timing abstracted in osal.c."," * - Linux timing converted to get_clock(CLOCK_MONOTONIC)."," * - Error messages updated to latest ETG1020 document."," * - FoE transfers now support busy response."," *"," * \\section start Getting started"," *"," * For Linux"," * - go to project directory"," * - source ./setup.sh linux "," * - make all"," *"," * For examples see simple_test.c in ~/test/linux/simple_test."," * First try (assume EtherCAT on eth0): sudo ./simple_test eth0"," * As SOEM uses RAW sockets it will need to run as root."," *"," * For Windows"," * - have winpcap installed (included with WireShark)"," * - go to project directory"," * - for VC, run vcvarsall.bat"," * f.e. : C:\\Program Files (x86)\\Microsoft Visual Studio 10.0\\VC\\vcvarsall.bat x86"," * - run make_test_win32_all.bat"," *"," * \\section bugs Squashed bugs"," * Version 1.1.3"," * - Added missing Big-Endian conversion in ethercatconfig.c"," * - Fixed bug in segmented SDO transfers in ethercatcoe.c"," *"," * Version 1.1.4"," * - Changed FMMU algorithm of allocation during configuration. EL4732 supported now."," * - Changed the ec_slave structure around SM en FMMU storage."," * - Fixed bug in FoE write in ethercatfoe.c"," *"," * Version 1.2.0"," * - Fixed bug in type definition of int32 and uint32 for 64bit OS."," * - Fixed bug in maximum dataframe size calculation."," *"," * Version 1.2.2"," * - Fixed bugs in ec_adddatagram."," * - Fixed several bugs in CoE object dictionary read functions."," * - Fixed bug in PDO mapping read function."," * - Changed ec_slave structure around topology and delay variables."," * - Added several constants in ethercattype.c"," *"," * Version 1.2.3"," * - Clear SM enable if size is 0, even if enable is set in SII."," * - Fixed bug in DC propagation delay calculation. Branches with only non DC slaves"," * now correctly close root port."," * - Fixed bug in ec_receive_processdata(), wkc now checks for EC_NOFRAME instead of 0."," * - Fixed bug in makefile."," *"," * Version 1.2.5"," * - Fixed bugs in ec_config_map()."," * - Added EC_STATE_BOOT constant."," * - Fixed mailbox size bug, In and Out mailbox can now be of different size."," * - Fixed SM type bug."," * - Fixed FoE bugs."," * - Fixed siigetbyte() unaligned copy."," * - Fixed bug in nicdrv.c, socket handles are 0 included."," * - Fixed bug in ethercatconfig.c causing memory corruption."," *"," * Version 1.2.8"," * - Fixed NetX mailbox configuration behaviour."," * - Fixed FoE write bug."," * - Fixed SII string read bug."," * - Fixed bug in table lookup for printing"," *"," * Version 1.3.0"," * - Fixed NetX100 configuration behaviour."," * - Fixed linux gettimeofday() to get_clock()."," * - Fixed eeprom cache flush on reinit."," * - Fixed make for new gcc linker version."," *"," * Version 1.3.1"," * - Added intime target."," * - Added rtk\\fec target."," * - Compiles under gcc / visual-c / intime / borland-c ."," * - Added multi-threaded configuration for parallel configurations of slaves "," *"," * \\section legal Legal notice"," * Copyright© 2005-2015 Speciaal Machinefabriek Ketels v.o.f. \\n"," * Copyright© 2005-2015 Arthur Ketels \\n"," * Copyright© 2008-2010 TU/e Technische Universiteit Eindhoven \\n"," * Copyright© 2012-2015 RT-labs AB \\n"," *"," * SOEM is free software; you can redistribute it and/or modify it under"," * the terms of the GNU General Public License version 2 as published by the Free"," * Software Foundation."," *"," * SOEM is distributed in the hope that it will be useful, but WITHOUT ANY"," * WARRANTY; without even the implied warranty of MERCHANTABILITY or"," * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License"," * for more details."," *"," * As a special exception, if other files instantiate templates or use macros"," * or inline functions from this file, or you compile this file and link it"," * with other works to produce a work based on this file, this file does not"," * by itself cause the resulting work to be covered by the GNU General Public"," * License. However the source code for this file must still be made available"," * in accordance with section (3) of the GNU General Public License."," *"," * This exception does not invalidate any other reasons why a work based on"," * this file might be covered by the GNU General Public License."," *"," * The EtherCAT Technology, the trade name and logo \"EtherCAT\" are the intellectual"," * property of, and protected by Beckhoff Automation GmbH. You can use SOEM for"," * the sole purpose of creating, using and/or selling or otherwise distributing"," * an EtherCAT network master provided that an EtherCAT Master License is obtained"," * from Beckhoff Automation GmbH."," *"," * In case you did not receive a copy of the EtherCAT Master License along with"," * SOEM write to Beckhoff Automation GmbH, Eiserstrasse 5, D-33415 Verl, Germany"," * (www.beckhoff.com)."," */ "],"stylingDirectives":[[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]],"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/ethercat-diy/stm32f4_ethercat/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"soem.dox","displayUrl":"https://github.com/ethercat-diy/stm32f4_ethercat/blob/master/doc/soem.dox?raw=true","headerInfo":{"blobSize":"9.21 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"920ad7f","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fethercat-diy%2Fstm32f4_ethercat%2Fblob%2Fmaster%2Fdoc%2Fsoem.dox","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"225","truncatedSloc":"225"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":null,"languageID":null,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/ethercat-diy/stm32f4_ethercat/blob/master/doc/soem.dox","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/ethercat-diy/stm32f4_ethercat/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/ethercat-diy/stm32f4_ethercat/raw/master/doc/soem.dox","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":false,"not_analyzed":true,"symbols":[]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/ethercat-diy/stm32f4_ethercat/branches":{"post":"ZEFpXd7FpnuyzpzL_o8nNYoA6iR5dnm6fxDMMZfWcV0iKZjwneavZmU81y7CgA7nuuJ-cr1eok703k6QoCYSuQ"},"/repos/preferences":{"post":"7AqwcGVkPsX6a4qsbr0eKM6lDVX4JYWflMspauvORhiUk5FghgjOXoGGLdm-OUQLfAyhjIyfcG2NlWhrnvReMw"}}},"title":"stm32f4_ethercat/doc/soem.dox at master · ethercat-diy/stm32f4_ethercayload":{"allShortcutsEnabled":false,"fileTree":{"soem":{"items":[{"name":"ethercatbase.c","path":"soem/ethercatbase.c","contentType":"file"},{"name":"ethercatbase.h","path":"soem/ethercatbase.h","contentType":"file"},{"name":"ethercatcoe.c","path":"soem/ethercatcoe.c","contentType":"file"},{"name":"ethercatcoe.h","path":"soem/ethercatcoe.h","contentType":"file"},{"name":"ethercatconfig.c","path":"soem/ethercatconfig.c","contentType":"file"},{"name":"ethercatconfig.h","path":"soem/ethercatconfig.h","contentType":"file"},{"name":"ethercatconfiglist.h","path":"soem/ethercatconfiglist.h","contentType":"file"},{"name":"ethercatdc.c","path":"soem/ethercatdc.c","contentType":"file"},{"name":"ethercatdc.h","path":"soem/ethercatdc.h","contentType":"file"},{"name":"ethercatfoe.c","path":"soem/ethercatfoe.c","contentType":"file"},{"name":"ethercatfoe.h","path":"soem/ethercatfoe.h","contentType":"file"},{"name":"ethercatmain.c","path":"soem/ethercatmain.c","contentType":"file"},{"name":"ethercatmain.h","path":"soem/ethercatmain.h","contentType":"file"},{"name":"ethercatprint.c","path":"soem/ethercatprint.c","contentType":"file"},{"name":"ethercatprint.h","path":"soem/ethercatprint.h","contentType":"file"},{"name":"ethercatsoe.c","path":"soem/ethercatsoe.c","contentType":"file"},{"name":"ethercatsoe.h","path":"soem/ethercatsoe.h","contentType":"file"},{"name":"ethercattype.h","path":"soem/ethercattype.h","contentType":"file"}],"totalCount":18},"":{"items":[{"name":"cmake","path":"cmake","contentType":"directory"},{"name":"doc","path":"doc","contentType":"directory"},{"name":"osal","path":"osal","contentType":"directory"},{"name":"oshw","path":"oshw","contentType":"directory"},{"name":"soem","path":"soem","contentType":"directory"},{"name":"test","path":"test","contentType":"directory"},{"name":"CMakeLists.txt","path":"CMakeLists.txt","contentType":"file"},{"name":"ChangeLog","path":"ChangeLog","contentType":"file"},{"name":"Doxyfile","path":"Doxyfile","contentType":"file"},{"name":"README.md","path":"README.md","contentType":"file"},{"name":"drvcomment.txt","path":"drvcomment.txt","contentType":"file"}],"totalCount":11}},"fileTreeProcessingTime":8.206911000000002,"foldersToFetch":[],"repo":{"id":56061612,"defaultBranch":"master","name":"stm32f4_ethercat","ownerLogin":"ethercat-diy","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2016-04-12T12:35:41.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/10209323?v=4","public":true,"private":false,"isOrgOwned":false},"symbolsExpanded":false,"treeExpanded":true,"refInfo":{"name":"master","listCacheKey":"v0:1460472817.0","canEdit":false,"refType":"branch","currentOid":"36acedde0b6b948a5887596239ca4599390cf87f"},"path":"soem/ethercatmain.c","currentUser":null,"blob":{"rawLines":["/*"," * Simple Open EtherCAT Master Library"," *"," * File : ethercatmain.c"," * Version : 1.3.1"," * Date : 11-03-2015"," * Copyright (C) 2005-2015 Speciaal Machinefabriek Ketels v.o.f."," * Copyright (C) 2005-2015 Arthur Ketels"," * Copyright (C) 2008-2009 TU/e Technische Universiteit Eindhoven"," * Copyright (C) 2014-2015 rt-labs AB , Sweden"," *"," * SOEM is free software; you can redistribute it and/or modify it under"," * the terms of the GNU General Public License version 2 as published by the Free"," * Software Foundation."," *"," * SOEM is distributed in the hope that it will be useful, but WITHOUT ANY"," * WARRANTY; without even the implied warranty of MERCHANTABILITY or"," * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License"," * for more details."," *"," * As a special exception, if other files instantiate templates or use macros"," * or inline functions from this file, or you compile this file and link it"," * with other works to produce a work based on this file, this file does not"," * by itself cause the resulting work to be covered by the GNU General Public"," * License. However the source code for this file must still be made available"," * in accordance with section (3) of the GNU General Public License."," *"," * This exception does not invalidate any other reasons why a work based on"," * this file might be covered by the GNU General Public License."," *"," * The EtherCAT Technology, the trade name and logo “EtherCAT” are the intellectual"," * property of, and protected by Beckhoff Automation GmbH. You can use SOEM for"," * the sole purpose of creating, using and/or selling or otherwise distributing"," * an EtherCAT network master provided that an EtherCAT Master License is obtained"," * from Beckhoff Automation GmbH."," *"," * In case you did not receive a copy of the EtherCAT Master License along with"," * SOEM write to Beckhoff Automation GmbH, Eiserstraße 5, D-33415 Verl, Germany"," * (www.beckhoff.com)."," */","","/**"," * \\file"," * \\brief"," * Main EtherCAT functions."," *"," * Initialisation, state set and read, mailbox primitives, EEPROM primitives,"," * SII reading and processdata exchange."," *"," * Defines ec_slave[]. All slave information is put in this structure."," * Needed for most user interaction with slaves."," */","","#include ","#include ","#include \"osal.h\"","#include \"oshw.h\"","#include \"ethercattype.h\"","#include \"ethercatbase.h\"","#include \"ethercatmain.h\"","","","/** delay in us for eeprom ready loop */","#define EC_LOCALDELAY 200","","/** record for ethercat eeprom communications */ ","PACKED_BEGIN","typedef struct PACKED","{"," uint16 comm;"," uint16 addr;"," uint16 d2;","} ec_eepromt;","PACKED_END","","/** mailbox error structure */","PACKED_BEGIN","typedef struct PACKED","{"," ec_mbxheadert MbxHeader;"," uint16 Type;"," uint16 Detail;","} ec_mbxerrort;","PACKED_END","","/** emergency request structure */","PACKED_BEGIN","typedef struct PACKED","{"," ec_mbxheadert MbxHeader;"," uint16 CANOpen;"," uint16 ErrorCode;"," uint8 ErrorReg;"," uint8 bData;"," uint16 w1,w2;","} ec_emcyt;","PACKED_END"," ","#ifdef EC_VER1","/** Main slave data array."," * Each slave found on the network gets its own record."," * ec_slave[0] is reserved for the master. Structure gets filled"," * in by the configuration function ec_config()."," */","ec_slavet ec_slave[EC_MAXSLAVE];","/** number of slaves found on the network */","int ec_slavecount;","/** slave group structure */","ec_groupt ec_group[EC_MAXGROUP];","","/** cache for EEPROM read functions */","static uint8 ec_esibuf[EC_MAXEEPBUF];","/** bitmap for filled cache buffer bytes */","static uint32 ec_esimap[EC_MAXEEPBITMAP];","/** current slave for EEPROM cache buffer */","static ec_eringt ec_elist;","static ec_idxstackT ec_idxstack;","","/** SyncManager Communication Type struct to store data of one slave */","static ec_SMcommtypet ec_SMcommtype;","/** PDO assign struct to store data of one slave */","static ec_PDOassignt ec_PDOassign;","/** PDO description struct to store data of one slave */","static ec_PDOdesct ec_PDOdesc;","","/** buffer for EEPROM SM data */","static ec_eepromSMt ec_SM;","/** buffer for EEPROM FMMU data */","static ec_eepromFMMUt ec_FMMU;","/** Global variable TRUE if error available in error stack */","boolean EcatError = FALSE;","","int64 ec_DCtime;"," ","ecx_portt ecx_port;","ecx_redportt ecx_redport;","","ecx_contextt ecx_context = {"," &ecx_port, // .port ="," &ec_slave[0], // .slavelist ="," &ec_slavecount, // .slavecount ="," EC_MAXSLAVE, // .maxslave ="," &ec_group[0], // .grouplist ="," EC_MAXGROUP, // .maxgroup ="," &ec_esibuf[0], // .esibuf ="," &ec_esimap[0], // .esimap ="," 0, // .esislave ="," &ec_elist, // .elist ="," &ec_idxstack, // .idxstack ="," &EcatError, // .ecaterror ="," 0, // .DCtO ="," 0, // .DCl ="," &ec_DCtime, // .DCtime ="," &ec_SMcommtype, // .SMcommtype ="," &ec_PDOassign, // .PDOassign ="," &ec_PDOdesc, // .PDOdesc ="," &ec_SM, // .eepSM ="," &ec_FMMU, // .eepFMMU ="," NULL // .FOEhook()","}; ","#endif"," ","/** Create list over available network adapters."," *"," * @return First element in list over available network adapters."," */","ec_adaptert * ec_find_adapters (void)","{"," ec_adaptert * ret_adapter;",""," ret_adapter = oshw_find_adapters ();",""," return ret_adapter;","}","","/** Free dynamically allocated list over available network adapters."," *"," * @param[in] adapter = Struct holding adapter name, description and pointer to next."," */","void ec_free_adapters (ec_adaptert * adapter)","{"," oshw_free_adapters (adapter);","}","","/** Pushes an error on the error list."," *"," * @param[in] context = context struct"," * @param[in] Ec pointer describing the error."," */","void ecx_pusherror(ecx_contextt *context, const ec_errort *Ec)","{"," context->elist->Error[context->elist->head] = *Ec;"," context->elist->Error[context->elist->head].Signal = TRUE;"," context->elist->head++;"," if (context->elist->head > EC_MAXELIST)"," {"," context->elist->head = 0;"," }"," if (context->elist->head == context->elist->tail)"," {"," context->elist->tail++;"," }"," if (context->elist->tail > EC_MAXELIST)"," {"," context->elist->tail = 0;"," }"," *(context->ecaterror) = TRUE;","}","","/** Pops an error from the list."," *"," * @param[in] context = context struct"," * @param[out] Ec = Struct describing the error."," * @return TRUE if an error was popped."," */","boolean ecx_poperror(ecx_contextt *context, ec_errort *Ec)","{"," boolean notEmpty = (context->elist->head != context->elist->tail);",""," *Ec = context->elist->Error[context->elist->tail];"," context->elist->Error[context->elist->tail].Signal = FALSE;"," if (notEmpty)"," {"," context->elist->tail++;"," if (context->elist->tail > EC_MAXELIST)"," {"," context->elist->tail = 0;"," }"," }"," else"," {"," *(context->ecaterror) = FALSE;"," }"," return notEmpty;","}","","/** Check if error list has entries."," *"," * @param[in] context = context struct"," * @return TRUE if error list contains entries."," */","boolean ecx_iserror(ecx_contextt *context)","{"," return (context->elist->head != context->elist->tail);","}","","/** Report packet error"," *"," * @param[in] context = context struct"," * @param[in] Slave = Slave number"," * @param[in] Index = Index that generated error"," * @param[in] SubIdx = Subindex that generated error"," * @param[in] ErrorCode = Error code"," */","void ecx_packeterror(ecx_contextt *context, uint16 Slave, uint16 Index, uint8 SubIdx, uint16 ErrorCode)","{"," ec_errort Ec;",""," memset(&Ec, 0, sizeof(Ec));"," Ec.Time = osal_current_time();"," Ec.Slave = Slave;"," Ec.Index = Index;"," Ec.SubIdx = SubIdx;"," *(context->ecaterror) = TRUE;"," Ec.Etype = EC_ERR_TYPE_PACKET_ERROR;"," Ec.ErrorCode = ErrorCode;"," ecx_pusherror(context, &Ec);","}","","/** Report Mailbox Error"," *"," * @param[in] context = context struct"," * @param[in] Slave = Slave number"," * @param[in] Detail = Following EtherCAT specification"," */","static void ecx_mbxerror(ecx_contextt *context, uint16 Slave,uint16 Detail)","{"," ec_errort Ec;",""," memset(&Ec, 0, sizeof(Ec));"," Ec.Time = osal_current_time();"," Ec.Slave = Slave;"," Ec.Index = 0;"," Ec.SubIdx = 0;"," Ec.Etype = EC_ERR_TYPE_MBX_ERROR;"," Ec.ErrorCode = Detail;"," ecx_pusherror(context, &Ec);","}","","/** Report Mailbox Emergency Error"," *"," * @param[in] context = context struct"," * @param[in] Slave = Slave number"," * @param[in] ErrorCode = Following EtherCAT specification"," * @param[in] ErrorReg"," * @param[in] b1"," * @param[in] w1"," * @param[in] w2"," */","static void ecx_mbxemergencyerror(ecx_contextt *context, uint16 Slave,uint16 ErrorCode,uint16 ErrorReg,"," uint8 b1, uint16 w1, uint16 w2)","{"," ec_errort Ec;",""," memset(&Ec, 0, sizeof(Ec));"," Ec.Time = osal_current_time();"," Ec.Slave = Slave;"," Ec.Index = 0;"," Ec.SubIdx = 0;"," Ec.Etype = EC_ERR_TYPE_EMERGENCY;"," Ec.ErrorCode = ErrorCode;"," Ec.ErrorReg = (uint8)ErrorReg;"," Ec.b1 = b1;"," Ec.w1 = w1;"," Ec.w2 = w2;"," ecx_pusherror(context, &Ec);","}","","/** Initialise lib in single NIC mode"," * @param[in] context = context struct"," * @param[in] ifname = Dev name, f.e. \"eth0\""," * @return >0 if OK"," */","int ecx_init(ecx_contextt *context, char * ifname)","{"," return ecx_setupnic(context->port, ifname, FALSE);","}","","/** Initialise lib in redundant NIC mode"," * @param[in] context = context struct"," * @param[in] redport = pointer to redport, redundant port data"," * @param[in] ifname = Primary Dev name, f.e. \"eth0\""," * @param[in] if2name = Secondary Dev name, f.e. \"eth1\""," * @return >0 if OK"," */","int ecx_init_redundant(ecx_contextt *context, ecx_redportt *redport, char *ifname, char *if2name)","{"," int rval, zbuf;"," ec_etherheadert *ehp;",""," context->port->redport = redport;"," ecx_setupnic(context->port, ifname, FALSE);"," rval = ecx_setupnic(context->port, if2name, TRUE);"," /* prepare \"dummy\" BRD tx frame for redundant operation */"," ehp = (ec_etherheadert *)&(context->port->txbuf2);"," ehp->sa1 = oshw_htons(secMAC[0]);"," zbuf = 0;"," ecx_setupdatagram(context->port, &(context->port->txbuf2), EC_CMD_BRD, 0, 0x0000, 0x0000, 2, &zbuf);"," context->port->txbuflength2 = ETH_HEADERSIZE + EC_HEADERSIZE + EC_WKCSIZE + 2;",""," return rval;","}","","/** Close lib."," * @param[in] context = context struct"," */","void ecx_close(ecx_contextt *context)","{"," ecx_closenic(context->port);","};","","/** Read one byte from slave EEPROM via cache."," * If the cache location is empty then a read request is made to the slave."," * Depending on the slave capabillities the request is 4 or 8 bytes."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[in] address = eeprom address in bytes (slave uses words)"," * @return requested byte, if not available then 0xff"," */","uint8 ecx_siigetbyte(ecx_contextt *context, uint16 slave, uint16 address)","{"," uint16 configadr, eadr;"," uint64 edat;"," uint16 mapw, mapb;"," int lp,cnt;"," uint8 retval;",""," retval = 0xff;"," if (slave != context->esislave) /* not the same slave? */"," {"," memset(context->esimap, 0x00, EC_MAXEEPBITMAP * sizeof(uint32)); /* clear esibuf cache map */"," context->esislave = slave;"," }"," if (address < EC_MAXEEPBUF)"," {"," mapw = address >> 5;"," mapb = address - (mapw << 5);"," if (context->esimap[mapw] & (uint32)(1 << mapb))"," {"," /* byte is already in buffer */"," retval = context->esibuf[address];"," }"," else"," {"," /* byte is not in buffer, put it there */"," configadr = context->slavelist[slave].configadr;"," ecx_eeprom2master(context, slave); /* set eeprom control to master */"," eadr = address >> 1;"," edat = ecx_readeepromFP (context, configadr, eadr, EC_TIMEOUTEEP);"," /* 8 byte response */"," if (context->slavelist[slave].eep_8byte)"," {"," put_unaligned64(edat, &(context->esibuf[eadr << 1]));"," cnt = 8;"," }"," /* 4 byte response */"," else"," {"," put_unaligned32(edat, &(context->esibuf[eadr << 1]));"," cnt = 4;"," }"," /* find bitmap location */"," mapw = eadr >> 4;"," mapb = (eadr << 1) - (mapw << 5);"," for(lp = 0 ; lp < cnt ; lp++)"," {"," /* set bitmap for each byte that is read */"," context->esimap[mapw] |= (1 << mapb);"," mapb++;"," if (mapb > 31)"," {"," mapb = 0;"," mapw++;"," }"," }"," retval = context->esibuf[address];"," }"," }",""," return retval;","}","","/** Find SII section header in slave EEPROM."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[in] cat = section category"," * @return byte address of section at section length entry, if not available then 0"," */","int16 ecx_siifind(ecx_contextt *context, uint16 slave, uint16 cat)","{"," int16 a;"," uint16 p;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," a = ECT_SII_START << 1;"," /* read first SII section category */"," p = ecx_siigetbyte(context, slave, a++);"," p += (ecx_siigetbyte(context, slave, a++) << 8);"," /* traverse SII while category is not found and not EOF */"," while ((p != cat) && (p != 0xffff))"," {"," /* read section length */"," p = ecx_siigetbyte(context, slave, a++);"," p += (ecx_siigetbyte(context, slave, a++) << 8);"," /* locate next section category */"," a += p << 1;"," /* read section category */"," p = ecx_siigetbyte(context, slave, a++);"," p += (ecx_siigetbyte(context, slave, a++) << 8);"," }"," if (p != cat)"," {"," a = 0;"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }",""," return a;","}","","/** Get string from SII string section in slave EEPROM."," * @param[in] context = context struct"," * @param[out] str = requested string, 0x00 if not found"," * @param[in] slave = slave number"," * @param[in] Sn = string number"," */","void ecx_siistring(ecx_contextt *context, char *str, uint16 slave, uint16 Sn)","{"," uint16 a,i,j,l,n,ba;"," char *ptr;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," ptr = str;"," a = ecx_siifind (context, slave, ECT_SII_STRING); /* find string section */"," if (a > 0)"," {"," ba = a + 2; /* skip SII section header */"," n = ecx_siigetbyte(context, slave, ba++); /* read number of strings in section */"," if (Sn <= n) /* is req string available? */"," {"," for (i = 1; i <= Sn; i++) /* walk through strings */"," {"," l = ecx_siigetbyte(context, slave, ba++); /* length of this string */"," if (i < Sn)"," {"," ba += l;"," }"," else"," {"," ptr = str;"," for (j = 1; j <= l; j++) /* copy one string */"," {"," if(j <= EC_MAXNAME)"," {"," *ptr = (char)ecx_siigetbyte(context, slave, ba++);"," ptr++;"," }"," else"," {"," ba++;"," }"," }"," }"," }"," *ptr = 0; /* add zero terminator */"," }"," else"," {"," ptr = str;"," *ptr = 0; /* empty string */"," }"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }","}","","/** Get FMMU data from SII FMMU section in slave EEPROM."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[out] FMMU = FMMU struct from SII, max. 4 FMMU's"," * @return number of FMMU's defined in section"," */","uint16 ecx_siiFMMU(ecx_contextt *context, uint16 slave, ec_eepromFMMUt* FMMU)","{"," uint16 a;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," FMMU->nFMMU = 0;"," FMMU->FMMU0 = 0;"," FMMU->FMMU1 = 0;"," FMMU->FMMU2 = 0;"," FMMU->FMMU3 = 0;"," FMMU->Startpos = ecx_siifind(context, slave, ECT_SII_FMMU);",""," if (FMMU->Startpos > 0)"," {"," a = FMMU->Startpos;"," FMMU->nFMMU = ecx_siigetbyte(context, slave, a++);"," FMMU->nFMMU += (ecx_siigetbyte(context, slave, a++) << 8);"," FMMU->nFMMU *= 2;"," FMMU->FMMU0 = ecx_siigetbyte(context, slave, a++);"," FMMU->FMMU1 = ecx_siigetbyte(context, slave, a++);"," if (FMMU->nFMMU > 2)"," {"," FMMU->FMMU2 = ecx_siigetbyte(context, slave, a++);"," FMMU->FMMU3 = ecx_siigetbyte(context, slave, a++);"," }"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }",""," return FMMU->nFMMU;","}","","/** Get SM data from SII SM section in slave EEPROM."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[out] SM = first SM struct from SII"," * @return number of SM's defined in section"," */","uint16 ecx_siiSM(ecx_contextt *context, uint16 slave, ec_eepromSMt* SM)","{"," uint16 a,w;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," SM->nSM = 0;"," SM->Startpos = ecx_siifind(context, slave, ECT_SII_SM);"," if (SM->Startpos > 0)"," {"," a = SM->Startpos;"," w = ecx_siigetbyte(context, slave, a++);"," w += (ecx_siigetbyte(context, slave, a++) << 8);"," SM->nSM = (w / 4);"," SM->PhStart = ecx_siigetbyte(context, slave, a++);"," SM->PhStart += (ecx_siigetbyte(context, slave, a++) << 8);"," SM->Plength = ecx_siigetbyte(context, slave, a++);"," SM->Plength += (ecx_siigetbyte(context, slave, a++) << 8);"," SM->Creg = ecx_siigetbyte(context, slave, a++);"," SM->Sreg = ecx_siigetbyte(context, slave, a++);"," SM->Activate = ecx_siigetbyte(context, slave, a++);"," SM->PDIctrl = ecx_siigetbyte(context, slave, a++);"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }",""," return SM->nSM;","}","","/** Get next SM data from SII SM section in slave EEPROM."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[out] SM = first SM struct from SII"," * @param[in] n = SM number"," * @return >0 if OK"," */","uint16 ecx_siiSMnext(ecx_contextt *context, uint16 slave, ec_eepromSMt* SM, uint16 n)","{"," uint16 a;"," uint16 retVal = 0;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," if (n < SM->nSM)"," {"," a = SM->Startpos + 2 + (n * 8);"," SM->PhStart = ecx_siigetbyte(context, slave, a++);"," SM->PhStart += (ecx_siigetbyte(context, slave, a++) << 8);"," SM->Plength = ecx_siigetbyte(context, slave, a++);"," SM->Plength += (ecx_siigetbyte(context, slave, a++) << 8);"," SM->Creg = ecx_siigetbyte(context, slave, a++);"," SM->Sreg = ecx_siigetbyte(context, slave, a++);"," SM->Activate = ecx_siigetbyte(context, slave, a++);"," SM->PDIctrl = ecx_siigetbyte(context, slave, a++);"," retVal = 1;"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }",""," return retVal;","}","","/** Get PDO data from SII PDO section in slave EEPROM."," * @param[in] context = context struct"," * @param[in] slave = slave number"," * @param[out] PDO = PDO struct from SII"," * @param[in] t = 0=RXPDO 1=TXPDO"," * @return mapping size in bits of PDO"," */","int ecx_siiPDO(ecx_contextt *context, uint16 slave, ec_eepromPDOt* PDO, uint8 t)","{"," uint16 a , w, c, e, er, Size;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," Size = 0;"," PDO->nPDO = 0;"," PDO->Length = 0;"," PDO->Index[1] = 0;"," for (c = 0 ; c < EC_MAXSM ; c++) PDO->SMbitsize[c] = 0;"," if (t > 1)"," t = 1;"," PDO->Startpos = ecx_siifind(context, slave, ECT_SII_PDO + t);"," if (PDO->Startpos > 0)"," {"," a = PDO->Startpos;"," w = ecx_siigetbyte(context, slave, a++);"," w += (ecx_siigetbyte(context, slave, a++) << 8);"," PDO->Length = w;"," c = 1;"," /* traverse through all PDOs */"," do"," {"," PDO->nPDO++;"," PDO->Index[PDO->nPDO] = ecx_siigetbyte(context, slave, a++);"," PDO->Index[PDO->nPDO] += (ecx_siigetbyte(context, slave, a++) << 8);"," PDO->BitSize[PDO->nPDO] = 0;"," c++;"," e = ecx_siigetbyte(context, slave, a++);"," PDO->SyncM[PDO->nPDO] = ecx_siigetbyte(context, slave, a++);"," a += 4;"," c += 2;"," if (PDO->SyncM[PDO->nPDO] < EC_MAXSM) /* active and in range SM? */"," {"," /* read all entries defined in PDO */"," for (er = 1; er <= e; er++)"," {"," c += 4;"," a += 5;"," PDO->BitSize[PDO->nPDO] += ecx_siigetbyte(context, slave, a++);"," a += 2;"," }"," PDO->SMbitsize[ PDO->SyncM[PDO->nPDO] ] += PDO->BitSize[PDO->nPDO];"," Size += PDO->BitSize[PDO->nPDO];"," c++;"," }"," else /* PDO deactivated because SM is 0xff or > EC_MAXSM */"," {"," c += 4 * e;"," a += 8 * e;"," c++;"," }"," if (PDO->nPDO >= (EC_MAXEEPDO - 1))"," {"," c = PDO->Length; /* limit number of PDO entries in buffer */"," }"," }"," while (c < PDO->Length);"," }"," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }",""," return (Size);","}","","#define MAX_FPRD_MULTI 64","","int ecx_FPRD_multi(ecx_contextt *context, int n, uint16 *configlst, ec_alstatust *slstatlst, int timeout)","{"," int wkc;"," uint8 idx;"," ecx_portt *port;"," int sldatapos[MAX_FPRD_MULTI];"," int slcnt;",""," port = context->port;"," idx = ecx_getindex(port);"," slcnt = 0;"," ecx_setupdatagram(port, &(port->txbuf[idx]), EC_CMD_FPRD, idx,"," *(configlst + slcnt), ECT_REG_ALSTAT, sizeof(ec_alstatust), slstatlst + slcnt);"," sldatapos[slcnt] = EC_HEADERSIZE;"," while(++slcnt < (n - 1))"," {"," sldatapos[slcnt] = ecx_adddatagram(port, &(port->txbuf[idx]), EC_CMD_FPRD, idx, TRUE,"," *(configlst + slcnt), ECT_REG_ALSTAT, sizeof(ec_alstatust), slstatlst + slcnt);"," }"," if(slcnt < n)"," {"," sldatapos[slcnt] = ecx_adddatagram(port, &(port->txbuf[idx]), EC_CMD_FPRD, idx, FALSE,"," *(configlst + slcnt), ECT_REG_ALSTAT, sizeof(ec_alstatust), slstatlst + slcnt);"," }"," wkc = ecx_srconfirm(port, idx, timeout);"," if (wkc >= 0)"," {"," for(slcnt = 0 ; slcnt < n ; slcnt++)"," {"," memcpy(slstatlst + slcnt, &(port->rxbuf[idx][sldatapos[slcnt]]), sizeof(ec_alstatust));"," }"," }"," ecx_setbufstat(port, idx, EC_BUF_EMPTY);"," return wkc;","}","","/** Read all slave states in ec_slave."," * @param[in] context = context struct"," * @return lowest state found"," */","int ecx_readstate(ecx_contextt *context)","{"," uint16 slave, fslave, lslave, configadr, lowest, rval;"," ec_alstatust sl[MAX_FPRD_MULTI];"," uint16 slca[MAX_FPRD_MULTI];",""," lowest = 0xff;"," context->slavelist[0].ALstatuscode = 0;"," fslave = 1;"," do"," {"," lslave = *(context->slavecount);"," if ((lslave - fslave) >= MAX_FPRD_MULTI)"," {"," lslave = fslave + MAX_FPRD_MULTI - 1;"," }"," for (slave = fslave; slave <= lslave; slave++)"," {"," const ec_alstatust zero = {0, 0, 0};",""," configadr = context->slavelist[slave].configadr;"," slca[slave - fslave] = configadr;"," sl[slave - fslave] = zero;"," }"," ecx_FPRD_multi(context, (lslave - fslave) + 1, &(slca[0]), &(sl[0]), EC_TIMEOUTRET3);"," for (slave = fslave; slave <= lslave; slave++)"," {"," configadr = context->slavelist[slave].configadr;"," rval = etohs(sl[slave - fslave].alstatus);"," context->slavelist[slave].ALstatuscode = etohs(sl[slave - fslave].alstatuscode);"," if (rval < lowest)"," {"," lowest = rval;"," }"," context->slavelist[slave].state = rval;"," context->slavelist[0].ALstatuscode |= context->slavelist[slave].ALstatuscode;"," }"," fslave = lslave + 1;"," } while(lslave < *(context->slavecount)); "," context->slavelist[0].state = lowest;",""," return lowest;","}","","/** Write slave state, if slave = 0 then write to all slaves."," * The function does not check if the actual state is changed."," * @param[in] context = context struct"," * @param[in] slave = Slave number, 0 = master"," * @return 0"," */","int ecx_writestate(ecx_contextt *context, uint16 slave)","{"," uint16 configadr, slstate;",""," if (slave == 0)"," {"," slstate = htoes(context->slavelist[slave].state);"," ecx_BWR(context->port, 0, ECT_REG_ALCTL, sizeof(slstate), &slstate, EC_TIMEOUTRET3); /* write slave status */"," }"," else"," {"," configadr = context->slavelist[slave].configadr;",""," ecx_FPWRw(context->port, configadr, ECT_REG_ALCTL, htoes(context->slavelist[slave].state), EC_TIMEOUTRET3); /* write slave status */"," }"," return 0;","}","","/** Check actual slave state."," * This is a blocking function."," * @param[in] context = context struct"," * @param[in] slave = Slave number, 0 = all slaves"," * @param[in] reqstate = Requested state"," * @param[in] timeout = Timout value in us"," * @return Requested state, or found state after timeout."," */","uint16 ecx_statecheck(ecx_contextt *context, uint16 slave, uint16 reqstate, int timeout)","{"," uint16 configadr, state, rval;"," ec_alstatust slstat;"," osal_timert timer;",""," if ( slave > *(context->slavecount) )"," {"," return 0;"," }"," osal_timer_start(&timer, timeout);"," configadr = context->slavelist[slave].configadr;"," do"," {"," if (slave < 1)"," {"," rval = 0;"," ecx_BRD(context->port, 0, ECT_REG_ALSTAT, sizeof(rval), &rval , EC_TIMEOUTRET);"," rval = etohs(rval);"," }"," else"," {"," slstat.alstatus = 0;"," slstat.alstatuscode = 0;"," ecx_FPRD(context->port, configadr, ECT_REG_ALSTAT, sizeof(slstat), &slstat, EC_TIMEOUTRET);"," rval = etohs(slstat.alstatus);"," context->slavelist[slave].ALstatuscode = etohs(slstat.alstatuscode);"," }"," state = rval & 0x000f; /* read slave status */"," if (state != reqstate)"," {"," osal_usleep(1000);"," }"," }"," while ((state != reqstate) && (osal_timer_is_expired(&timer) == FALSE));"," context->slavelist[slave].state = rval;",""," return state;","}","","/** Get index of next mailbox counter value."," * Used for Mailbox Link Layer."," * @param[in] cnt = Mailbox counter value [0..7]"," * @return next mailbox counter value"," */","uint8 ec_nextmbxcnt(uint8 cnt)","{"," cnt++;"," if (cnt > 7)"," {"," cnt = 1; /* wrap around to 1, not 0 */"," }",""," return cnt;","}","","/** Clear mailbox buffer."," * @param[out] Mbx = Mailbox buffer to clear"," */","void ec_clearmbx(ec_mbxbuft *Mbx)","{"," memset(Mbx, 0x00, EC_MAXMBX);","}","","/** Check if IN mailbox of slave is empty."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[in] timeout = Timeout in us"," * @return >0 is success"," */","int ecx_mbxempty(ecx_contextt *context, uint16 slave, int timeout)","{"," uint16 configadr;"," uint8 SMstat;"," int wkc;"," osal_timert timer;",""," osal_timer_start(&timer, timeout);"," configadr = context->slavelist[slave].configadr;"," do"," {"," SMstat = 0;"," wkc = ecx_FPRD(context->port, configadr, ECT_REG_SM0STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);"," SMstat = etohs(SMstat);"," if (((SMstat & 0x08) != 0) && (timeout > EC_LOCALDELAY))"," {"," osal_usleep(EC_LOCALDELAY);"," }"," }"," while (((wkc <= 0) || ((SMstat & 0x08) != 0)) && (osal_timer_is_expired(&timer) == FALSE));",""," if ((wkc > 0) && ((SMstat & 0x08) == 0))"," {"," return 1;"," }",""," return 0;","}","","/** Write IN mailbox to slave."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[out] mbx = Mailbox data"," * @param[in] timeout = Timeout in us"," * @return Work counter (>0 is success)"," */","int ecx_mbxsend(ecx_contextt *context, uint16 slave,ec_mbxbuft *mbx, int timeout)","{"," uint16 mbxwo,mbxl,configadr;"," int wkc;",""," wkc = 0;"," configadr = context->slavelist[slave].configadr;"," mbxl = context->slavelist[slave].mbx_l;"," if ((mbxl > 0) && (mbxl <= EC_MAXMBX))"," {"," if (ecx_mbxempty(context, slave, timeout))"," {"," mbxwo = context->slavelist[slave].mbx_wo;"," /* write slave in mailbox */"," wkc = ecx_FPWR(context->port, configadr, mbxwo, mbxl, mbx, EC_TIMEOUTRET3);"," }"," else"," {"," wkc = 0;"," }"," }",""," return wkc;","}","","/** Read OUT mailbox from slave."," * Supports Mailbox Link Layer with repeat requests."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[out] mbx = Mailbox data"," * @param[in] timeout = Timeout in us"," * @return Work counter (>0 is success)"," */","int ecx_mbxreceive(ecx_contextt *context, uint16 slave, ec_mbxbuft *mbx, int timeout)","{"," uint16 mbxro,mbxl,configadr;"," int wkc=0;"," int wkc2;"," uint16 SMstat;"," uint8 SMcontr;"," ec_mbxheadert *mbxh;"," ec_emcyt *EMp;"," ec_mbxerrort *MBXEp;",""," configadr = context->slavelist[slave].configadr;"," mbxl = context->slavelist[slave].mbx_rl;"," if ((mbxl > 0) && (mbxl <= EC_MAXMBX))"," {"," osal_timert timer;",""," osal_timer_start(&timer, timeout);"," wkc = 0;"," do /* wait for read mailbox available */"," {"," SMstat = 0;"," wkc = ecx_FPRD(context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);"," SMstat = etohs(SMstat);"," if (((SMstat & 0x08) == 0) && (timeout > EC_LOCALDELAY))"," {"," osal_usleep(EC_LOCALDELAY);"," }"," }"," while (((wkc <= 0) || ((SMstat & 0x08) == 0)) && (osal_timer_is_expired(&timer) == FALSE));",""," if ((wkc > 0) && ((SMstat & 0x08) > 0)) /* read mailbox available ? */"," {"," mbxro = context->slavelist[slave].mbx_ro;"," mbxh = (ec_mbxheadert *)mbx;"," do"," {"," wkc = ecx_FPRD(context->port, configadr, mbxro, mbxl, mbx, EC_TIMEOUTRET); /* get mailbox */"," if ((wkc > 0) && ((mbxh->mbxtype & 0x0f) == 0x00)) /* Mailbox error response? */"," {"," MBXEp = (ec_mbxerrort *)mbx;"," ecx_mbxerror(context, slave, etohs(MBXEp->Detail));"," wkc = 0; /* prevent emergency to cascade up, it is already handled. */"," }"," else if ((wkc > 0) && ((mbxh->mbxtype & 0x0f) == 0x03)) /* CoE response? */"," {"," EMp = (ec_emcyt *)mbx;"," if ((etohs(EMp->CANOpen) >> 12) == 0x01) /* Emergency request? */"," {"," ecx_mbxemergencyerror(context, slave, etohs(EMp->ErrorCode), EMp->ErrorReg,"," EMp->bData, etohs(EMp->w1), etohs(EMp->w2));"," wkc = 0; /* prevent emergency to cascade up, it is already handled. */"," }"," }"," else"," {"," if (wkc <= 0) /* read mailbox lost */"," {"," SMstat ^= 0x0200; /* toggle repeat request */"," SMstat = htoes(SMstat);"," wkc2 = ecx_FPWR(context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);"," SMstat = etohs(SMstat);"," do /* wait for toggle ack */"," {"," wkc2 = ecx_FPRD(context->port, configadr, ECT_REG_SM1CONTR, sizeof(SMcontr), &SMcontr, EC_TIMEOUTRET);"," } while (((wkc2 <= 0) || ((SMcontr & 0x02) != (HI_BYTE(SMstat) & 0x02))) && (osal_timer_is_expired(&timer) == FALSE));"," do /* wait for read mailbox available */"," {"," wkc2 = ecx_FPRD(context->port, configadr, ECT_REG_SM1STAT, sizeof(SMstat), &SMstat, EC_TIMEOUTRET);"," SMstat = etohs(SMstat);"," if (((SMstat & 0x08) == 0) && (timeout > EC_LOCALDELAY))"," {"," osal_usleep(EC_LOCALDELAY);"," }"," } while (((wkc2 <= 0) || ((SMstat & 0x08) == 0)) && (osal_timer_is_expired(&timer) == FALSE));"," }"," }"," } while ((wkc <= 0) && (osal_timer_is_expired(&timer) == FALSE)); /* if WKC<=0 repeat */"," }"," else /* no read mailbox available */"," {"," wkc = 0;"," }"," }",""," return wkc;","}","","/** Dump complete EEPROM data from slave in buffer."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[out] esibuf = EEPROM data buffer, make sure it is big enough."," */","void ecx_esidump(ecx_contextt *context, uint16 slave, uint8 *esibuf)","{"," int address, incr;"," uint16 configadr;"," uint64 *p64;"," uint16 *p16;"," uint64 edat;"," uint8 eectl = context->slavelist[slave].eep_pdi;",""," ecx_eeprom2master(context, slave); /* set eeprom control to master */"," configadr = context->slavelist[slave].configadr;"," address = ECT_SII_START;"," p16=(uint16*)esibuf;"," if (context->slavelist[slave].eep_8byte)"," {"," incr = 4;"," }"," else"," {"," incr = 2;"," }"," do"," {"," edat = ecx_readeepromFP(context, configadr, address, EC_TIMEOUTEEP);"," p64 = (uint64*)p16;"," *p64 = edat;"," p16 += incr;"," address += incr;"," } while ((address <= (EC_MAXEEPBUF >> 1)) && ((uint32)edat != 0xffffffff));",""," if (eectl)"," {"," ecx_eeprom2pdi(context, slave); /* if eeprom control was previously pdi then restore */"," }","}","","/** Read EEPROM from slave bypassing cache."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] timeout = Timeout in us."," * @return EEPROM data 32bit"," */","uint32 ecx_readeeprom(ecx_contextt *context, uint16 slave, uint16 eeproma, int timeout)","{"," uint16 configadr;",""," ecx_eeprom2master(context, slave); /* set eeprom control to master */"," configadr = context->slavelist[slave].configadr;",""," return ((uint32)ecx_readeepromFP(context, configadr, eeproma, timeout));","}","","/** Write EEPROM to slave bypassing cache."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] data = 16bit data"," * @param[in] timeout = Timeout in us."," * @return >0 if OK"," */","int ecx_writeeeprom(ecx_contextt *context, uint16 slave, uint16 eeproma, uint16 data, int timeout)","{"," uint16 configadr;",""," ecx_eeprom2master(context, slave); /* set eeprom control to master */"," configadr = context->slavelist[slave].configadr;"," return (ecx_writeeepromFP(context, configadr, eeproma, data, timeout));","}","","/** Set eeprom control to master. Only if set to PDI."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @return >0 if OK"," */","int ecx_eeprom2master(ecx_contextt *context, uint16 slave)","{"," int wkc = 1, cnt = 0;"," uint16 configadr;"," uint8 eepctl;",""," if ( context->slavelist[slave].eep_pdi )"," {"," configadr = context->slavelist[slave].configadr;"," eepctl = 2;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl , EC_TIMEOUTRET); /* force Eeprom from PDI */"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," eepctl = 0;"," cnt = 0;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl , EC_TIMEOUTRET); /* set Eeprom to master */"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," context->slavelist[slave].eep_pdi = 0;"," }",""," return wkc;","}","","/** Set eeprom control to PDI. Only if set to master."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @return >0 if OK"," */","int ecx_eeprom2pdi(ecx_contextt *context, uint16 slave)","{"," int wkc = 1, cnt = 0;"," uint16 configadr;"," uint8 eepctl;",""," if ( !context->slavelist[slave].eep_pdi )"," {"," configadr = context->slavelist[slave].configadr;"," eepctl = 1;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCFG, sizeof(eepctl), &eepctl , EC_TIMEOUTRET); /* set Eeprom to PDI */"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," context->slavelist[slave].eep_pdi = 1;"," }",""," return wkc;","}","","uint16 ecx_eeprom_waitnotbusyAP(ecx_contextt *context, uint16 aiadr,uint16 *estat, int timeout)","{"," int wkc, cnt = 0, retval = 0;"," osal_timert timer;",""," osal_timer_start(&timer, timeout);"," do"," {"," if (cnt++)"," {"," osal_usleep(EC_LOCALDELAY);"," }"," *estat = 0;"," wkc=ecx_APRD(context->port, aiadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);"," *estat = etohs(*estat);"," }"," while (((wkc <= 0) || ((*estat & EC_ESTAT_BUSY) > 0)) && (osal_timer_is_expired(&timer) == FALSE)); /* wait for eeprom ready */"," if ((*estat & EC_ESTAT_BUSY) == 0)"," {"," retval = 1;"," }",""," return retval;","}","","/** Read EEPROM from slave bypassing cache. APRD method."," * @param[in] context = context struct"," * @param[in] aiadr = auto increment address of slave"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] timeout = Timeout in us."," * @return EEPROM data 64bit or 32bit"," */","uint64 ecx_readeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, int timeout)","{"," uint16 estat;"," uint32 edat32;"," uint64 edat64;"," ec_eepromt ed;"," int wkc, cnt, nackcnt = 0;",""," edat64 = 0;"," edat32 = 0;"," if (ecx_eeprom_waitnotbusyAP(context, aiadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_EMASK) /* error bits are set */"," {"," estat = htoes(EC_ECMD_NOP); /* clear error bits */"," wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);"," }",""," do"," {"," ed.comm = htoes(EC_ECMD_READ);"," ed.addr = htoes(eeproma);"," ed.d2 = 0x0000;"," cnt = 0;"," do"," {"," wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," if (wkc)"," {"," osal_usleep(EC_LOCALDELAY);"," estat = 0x0000;"," if (ecx_eeprom_waitnotbusyAP(context, aiadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_NACK)"," {"," nackcnt++;"," osal_usleep(EC_LOCALDELAY * 5);"," }"," else"," {"," nackcnt = 0;"," if (estat & EC_ESTAT_R64)"," {"," cnt = 0;"," do"," {"," wkc = ecx_APRD(context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," }"," else"," {"," cnt = 0;"," do"," {"," wkc = ecx_APRD(context->port, aiadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," edat64=(uint64)edat32;"," }"," }"," }"," }"," }"," while ((nackcnt > 0) && (nackcnt < 3));"," }",""," return edat64;","}","","/** Write EEPROM to slave bypassing cache. APWR method."," * @param[in] context = context struct"," * @param[in] aiadr = configured address of slave"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] data = 16bit data"," * @param[in] timeout = Timeout in us."," * @return >0 if OK"," */","int ecx_writeeepromAP(ecx_contextt *context, uint16 aiadr, uint16 eeproma, uint16 data, int timeout)","{"," uint16 estat;"," ec_eepromt ed;"," int wkc, rval = 0, cnt = 0, nackcnt = 0;",""," if (ecx_eeprom_waitnotbusyAP(context, aiadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_EMASK) /* error bits are set */"," {"," estat = htoes(EC_ECMD_NOP); /* clear error bits */"," wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);"," }"," do"," {"," cnt = 0;"," do"," {"," wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));",""," ed.comm = EC_ECMD_WRITE;"," ed.addr = eeproma;"," ed.d2 = 0x0000;"," cnt = 0;"," do"," {"," wkc = ecx_APWR(context->port, aiadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," if (wkc)"," {"," osal_usleep(EC_LOCALDELAY * 2);"," estat = 0x0000;"," if (ecx_eeprom_waitnotbusyAP(context, aiadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_NACK)"," {"," nackcnt++;"," osal_usleep(EC_LOCALDELAY * 5);"," }"," else"," {"," nackcnt = 0;"," rval = 1;"," }"," }"," }",""," }"," while ((nackcnt > 0) && (nackcnt < 3));"," }",""," return rval;","}","","uint16 ecx_eeprom_waitnotbusyFP(ecx_contextt *context, uint16 configadr,uint16 *estat, int timeout)","{"," int wkc, cnt = 0, retval = 0;"," osal_timert timer;",""," osal_timer_start(&timer, timeout);"," do"," {"," if (cnt++)"," {"," osal_usleep(EC_LOCALDELAY);"," }"," *estat = 0;"," wkc=ecx_FPRD(context->port, configadr, ECT_REG_EEPSTAT, sizeof(*estat), estat, EC_TIMEOUTRET);"," *estat = etohs(*estat);"," }"," while (((wkc <= 0) || ((*estat & EC_ESTAT_BUSY) > 0)) && (osal_timer_is_expired(&timer) == FALSE)); /* wait for eeprom ready */"," if ((*estat & EC_ESTAT_BUSY) == 0)"," {"," retval = 1;"," }",""," return retval;","}","","/** Read EEPROM from slave bypassing cache. FPRD method."," * @param[in] context = context struct"," * @param[in] configadr = configured address of slave"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] timeout = Timeout in us."," * @return EEPROM data 64bit or 32bit"," */","uint64 ecx_readeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, int timeout)","{"," uint16 estat;"," uint32 edat32;"," uint64 edat64;"," ec_eepromt ed;"," int wkc, cnt, nackcnt = 0;",""," edat64 = 0;"," edat32 = 0;"," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_EMASK) /* error bits are set */"," {"," estat = htoes(EC_ECMD_NOP); /* clear error bits */"," wkc=ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);"," }",""," do"," {"," ed.comm = htoes(EC_ECMD_READ);"," ed.addr = htoes(eeproma);"," ed.d2 = 0x0000;"," cnt = 0;"," do"," {"," wkc=ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," if (wkc)"," {"," osal_usleep(EC_LOCALDELAY);"," estat = 0x0000;"," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_NACK)"," {"," nackcnt++;"," osal_usleep(EC_LOCALDELAY * 5);"," }"," else"," {"," nackcnt = 0;"," if (estat & EC_ESTAT_R64)"," {"," cnt = 0;"," do"," {"," wkc=ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat64), &edat64, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," }"," else"," {"," cnt = 0;"," do"," {"," wkc=ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat32), &edat32, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," edat64=(uint64)edat32;"," }"," }"," }"," }"," }"," while ((nackcnt > 0) && (nackcnt < 3));"," }",""," return edat64;","}","","/** Write EEPROM to slave bypassing cache. FPWR method."," * @param[in] context = context struct"," * @param[in] configadr = configured address of slave"," * @param[in] eeproma = (WORD) Address in the EEPROM"," * @param[in] data = 16bit data"," * @param[in] timeout = Timeout in us."," * @return >0 if OK"," */","int ecx_writeeepromFP(ecx_contextt *context, uint16 configadr, uint16 eeproma, uint16 data, int timeout)","{"," uint16 estat;"," ec_eepromt ed;"," int wkc, rval = 0, cnt = 0, nackcnt = 0;",""," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_EMASK) /* error bits are set */"," {"," estat = htoes(EC_ECMD_NOP); /* clear error bits */"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);"," }"," do"," {"," cnt = 0;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPDAT, sizeof(data), &data, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," ed.comm = EC_ECMD_WRITE;"," ed.addr = eeproma;"," ed.d2 = 0x0000;"," cnt = 0;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," if (wkc)"," {"," osal_usleep(EC_LOCALDELAY * 2);"," estat = 0x0000;"," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, timeout))"," {"," if (estat & EC_ESTAT_NACK)"," {"," nackcnt++;"," osal_usleep(EC_LOCALDELAY * 5);"," }"," else"," {"," nackcnt = 0;"," rval = 1;"," }"," }"," }"," }"," while ((nackcnt > 0) && (nackcnt < 3));"," }",""," return rval;","}","","/** Read EEPROM from slave bypassing cache."," * Parallel read step 1, make request to slave."," * @param[in] context = context struct"," * @param[in] slave = Slave number"," * @param[in] eeproma = (WORD) Address in the EEPROM"," */","void ecx_readeeprom1(ecx_contextt *context, uint16 slave, uint16 eeproma)","{"," uint16 configadr, estat;"," ec_eepromt ed;"," int wkc, cnt = 0;",""," ecx_eeprom2master(context, slave); /* set eeprom control to master */"," configadr = context->slavelist[slave].configadr;"," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, EC_TIMEOUTEEP))"," {"," if (estat & EC_ESTAT_EMASK) /* error bits are set */"," {"," estat = htoes(EC_ECMD_NOP); /* clear error bits */"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET3);"," }"," ed.comm = htoes(EC_ECMD_READ);"," ed.addr = htoes(eeproma);"," ed.d2 = 0x0000;"," do"," {"," wkc = ecx_FPWR(context->port, configadr, ECT_REG_EEPCTL, sizeof(ed), &ed, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," }","}","","/** Read EEPROM from slave bypassing cache."," * Parallel read step 2, actual read from slave."," * @param[in] context = context struct"," * @param[in] slave = Slave number "," * @param[in] timeout = Timeout in us. "," * @return EEPROM data 32bit"," */","uint32 ecx_readeeprom2(ecx_contextt *context, uint16 slave, int timeout)","{"," uint16 estat, configadr;"," uint32 edat;"," int wkc, cnt = 0;",""," configadr = context->slavelist[slave].configadr;"," edat = 0;"," estat = 0x0000;"," if (ecx_eeprom_waitnotbusyFP(context, configadr, &estat, timeout))"," {"," do"," {"," wkc = ecx_FPRD(context->port, configadr, ECT_REG_EEPDAT, sizeof(edat), &edat, EC_TIMEOUTRET);"," }"," while ((wkc <= 0) && (cnt++ < EC_DEFAULTRETRIES));"," }",""," return edat;","}","","/** Push index of segmented LRD/LWR/LRW combination."," * @param[in] context = context struct"," * @param[in] idx = Used datagram index."," * @param[in] data = Pointer to process data segment."," * @param[in] length = Length of data segment in bytes."," */","static void ecx_pushindex(ecx_contextt *context, uint8 idx, void *data, uint16 length)","{"," if(context->idxstack->pushed < EC_MAXBUF)"," {"," context->idxstack->idx[context->idxstack->pushed] = idx;"," context->idxstack->data[context->idxstack->pushed] = data;"," context->idxstack->length[context->idxstack->pushed] = length;"," context->idxstack->pushed++;"," }","}","","/** Pull index of segmented LRD/LWR/LRW combination."," * @param[in] context = context struct"," * @return Stack location, -1 if stack is empty."," */","static int ecx_pullindex(ecx_contextt *context)","{"," int rval = -1;"," if(context->idxstack->pulled < context->idxstack->pushed)"," {"," rval = context->idxstack->pulled;"," context->idxstack->pulled++;"," }",""," return rval;","}","","/** Transmit processdata to slaves."," * Uses LRW, or LRD/LWR if LRW is not allowed (blockLRW)."," * Both the input and output processdata are transmitted."," * The outputs with the actual data, the inputs have a placeholder."," * The inputs are gathered with the receive processdata function."," * In contrast to the base LRW function this function is non-blocking."," * If the processdata does not fit in one datagram, multiple are used."," * In order to recombine the slave response, a stack is used."," * @param[in] context = context struct"," * @param[in] group = group number"," * @return >0 if processdata is transmitted."," */","int ecx_send_processdata_group(ecx_contextt *context, uint8 group)","{"," uint32 LogAdr;"," uint16 w1, w2;"," int length, sublength;"," uint8 idx;"," int wkc;"," uint8* data;"," boolean first=FALSE;"," uint16 currentsegment = 0;",""," wkc = 0;"," if(context->grouplist[group].hasdc)"," {"," first = TRUE;"," }"," length = context->grouplist[group].Obytes + context->grouplist[group].Ibytes;"," LogAdr = context->grouplist[group].logstartaddr;"," if (length)"," {"," if(!group)"," {"," context->idxstack->pushed = 0;"," context->idxstack->pulled = 0;"," }"," wkc = 1;"," /* LRW blocked by one or more slaves ? */"," if (context->grouplist[group].blockLRW)"," {"," /* if inputs available generate LRD */"," if(context->grouplist[group].Ibytes)"," {"," currentsegment = context->grouplist[group].Isegment;"," data = context->grouplist[group].inputs;"," length = context->grouplist[group].Ibytes;"," LogAdr += context->grouplist[group].Obytes;"," /* segment transfer if needed */"," do"," {"," if(currentsegment == context->grouplist[group].Isegment)"," {"," sublength = context->grouplist[group].IOsegment[currentsegment++] - context->grouplist[group].Ioffset;"," }"," else"," {"," sublength = context->grouplist[group].IOsegment[currentsegment++];"," }"," /* get new index */"," idx = ecx_getindex(context->port);"," w1 = LO_WORD(LogAdr);"," w2 = HI_WORD(LogAdr);"," ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LRD, idx, w1, w2, sublength, data);"," if(first)"," {"," context->DCl = sublength;"," /* FPRMW in second datagram */"," context->DCtO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,"," context->slavelist[context->grouplist[group].DCnext].configadr,"," ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);"," first = FALSE;"," }"," /* send frame */"," ecx_outframe_red(context->port, idx);"," /* push index and data pointer on stack */"," ecx_pushindex(context, idx, data, sublength);"," length -= sublength;"," LogAdr += sublength;"," data += sublength;"," } while (length && (currentsegment < context->grouplist[group].nsegments));"," }"," /* if outputs available generate LWR */"," if(context->grouplist[group].Obytes)"," {"," data = context->grouplist[group].outputs;"," length = context->grouplist[group].Obytes;"," LogAdr = context->grouplist[group].logstartaddr;"," currentsegment = 0;"," /* segment transfer if needed */"," do"," {"," sublength = context->grouplist[group].IOsegment[currentsegment++];"," if((length - sublength) < 0)"," {"," sublength = length;"," }"," /* get new index */"," idx = ecx_getindex(context->port);"," w1 = LO_WORD(LogAdr);"," w2 = HI_WORD(LogAdr);"," ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LWR, idx, w1, w2, sublength, data);"," if(first)"," {"," context->DCl = sublength;"," /* FPRMW in second datagram */"," context->DCtO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,"," context->slavelist[context->grouplist[group].DCnext].configadr,"," ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);"," first = FALSE;"," }"," /* send frame */"," ecx_outframe_red(context->port, idx);"," /* push index and data pointer on stack */"," ecx_pushindex(context, idx, data, sublength);"," length -= sublength;"," LogAdr += sublength;"," data += sublength;"," } while (length && (currentsegment < context->grouplist[group].nsegments));"," }"," }"," /* LRW can be used */"," else"," {"," if (context->grouplist[group].Obytes)"," {"," data = context->grouplist[group].outputs;"," }"," else"," {"," data = context->grouplist[group].inputs;"," }"," /* segment transfer if needed */"," do"," {"," sublength = context->grouplist[group].IOsegment[currentsegment++];"," /* get new index */"," idx = ecx_getindex(context->port);"," w1 = LO_WORD(LogAdr);"," w2 = HI_WORD(LogAdr);"," ecx_setupdatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_LRW, idx, w1, w2, sublength, data);"," if(first)"," {"," context->DCl = sublength;"," /* FPRMW in second datagram */"," context->DCtO = ecx_adddatagram(context->port, &(context->port->txbuf[idx]), EC_CMD_FRMW, idx, FALSE,"," context->slavelist[context->grouplist[group].DCnext].configadr,"," ECT_REG_DCSYSTIME, sizeof(int64), context->DCtime);"," first = FALSE;"," }"," /* send frame */"," ecx_outframe_red(context->port, idx);"," /* push index and data pointer on stack */"," ecx_pushindex(context, idx, data, sublength);"," length -= sublength;"," LogAdr += sublength;"," data += sublength;"," } while (length && (currentsegment < context->grouplist[group].nsegments));"," }"," }",""," return wkc;","}","","/** Receive processdata from slaves."," * Second part from ec_send_processdata()."," * Received datagrams are recombined with the processdata with help from the stack."," * If a datagram contains input processdata it copies it to the processdata structure."," * @param[in] context = context struct"," * @param[in] group = group number"," * @param[in] timeout = Timeout in us."," * @return Work counter."," */","int ecx_receive_processdata_group(ecx_contextt *context, uint8 group, int timeout)","{"," int pos, idx;"," int wkc = 0, wkc2;"," uint16 le_wkc = 0;"," int64 le_DCtime;"," boolean first = FALSE;",""," if(context->grouplist[group].hasdc)"," {"," first = TRUE;"," }"," /* get first index */"," pos = ecx_pullindex(context);"," /* read the same number of frames as send */"," while (pos >= 0)"," {"," idx = context->idxstack->idx[pos];"," wkc2 = ecx_waitinframe(context->port, context->idxstack->idx[pos], timeout);"," /* check if there is input data in frame */"," if (wkc2 > EC_NOFRAME)"," {"," if((context->port->rxbuf[idx][EC_CMDOFFSET]==EC_CMD_LRD) || (context->port->rxbuf[idx][EC_CMDOFFSET]==EC_CMD_LRW))"," {"," if(first)"," {"," memcpy(context->idxstack->data[pos], &(context->port->rxbuf[idx][EC_HEADERSIZE]), context->DCl);"," memcpy(≤_wkc, &(context->port->rxbuf[idx][EC_HEADERSIZE + context->DCl]), EC_WKCSIZE);"," wkc = etohs(le_wkc);"," memcpy(≤_DCtime, &(context->port->rxbuf[idx][context->DCtO]), sizeof(le_DCtime));"," *(context->DCtime) = etohll(le_DCtime);"," first = FALSE;"," }"," else"," {"," /* copy input data back to process data buffer */"," memcpy(context->idxstack->data[pos], &(context->port->rxbuf[idx][EC_HEADERSIZE]), context->idxstack->length[pos]);"," wkc += wkc2;"," }"," }"," else if(context->port->rxbuf[idx][EC_CMDOFFSET]==EC_CMD_LWR)"," {"," if(first)"," {"," memcpy(≤_wkc, &(context->port->rxbuf[idx][EC_HEADERSIZE + context->DCl]), EC_WKCSIZE);"," /* output WKC counts 2 times when using LRW, emulate the same for LWR */"," wkc = etohs(le_wkc) * 2;"," memcpy(≤_DCtime, &(context->port->rxbuf[idx][context->DCtO]), sizeof(le_DCtime));"," *(context->DCtime) = etohll(le_DCtime);"," first = FALSE;"," }"," else"," {"," /* output WKC counts 2 times when using LRW, emulate the same for LWR */"," wkc += wkc2 * 2;"," }"," }"," }"," /* release buffer */"," ecx_setbufstat(context->port, idx, EC_BUF_EMPTY);"," /* get next index */"," pos = ecx_pullindex(context);"," }",""," return wkc;","}","","","int ecx_send_processdata(ecx_contextt *context)","{"," return ecx_send_processdata_group(context, 0);","}","","int ecx_receive_processdata(ecx_contextt *context, int timeout)","{"," return ecx_receive_processdata_group(context, 0, timeout);","}","","#ifdef EC_VER1","void ec_pusherror(const ec_errort *Ec)","{"," ecx_pusherror(&ecx_context, Ec);","}","","boolean ec_poperror(ec_errort *Ec)","{"," return ecx_poperror(&ecx_context, Ec);","}","","boolean ec_iserror(void)","{"," return ecx_iserror(&ecx_context);","}","","void ec_packeterror(uint16 Slave, uint16 Index, uint8 SubIdx, uint16 ErrorCode)","{"," ecx_packeterror(&ecx_context, Slave, Index, SubIdx, ErrorCode);","}","","int ec_init(char * ifname)","{"," return ecx_init(&ecx_context, ifname);","}","","int ec_init_redundant(char *ifname, char *if2name)","{"," return ecx_init_redundant (&ecx_context, &ecx_redport, ifname, if2name);","}","","void ec_close(void)","{"," ecx_close(&ecx_context);","};","","uint8 ec_siigetbyte(uint16 slave, uint16 address)","{"," return ecx_siigetbyte (&ecx_context, slave, address);","}","","int16 ec_siifind(uint16 slave, uint16 cat)","{"," return ecx_siifind (&ecx_context, slave, cat);","}","","void ec_siistring(char *str, uint16 slave, uint16 Sn)","{"," ecx_siistring(&ecx_context, str, slave, Sn);","}","","uint16 ec_siiFMMU(uint16 slave, ec_eepromFMMUt* FMMU)","{"," return ecx_siiFMMU (&ecx_context, slave, FMMU);","}","","uint16 ec_siiSM(uint16 slave, ec_eepromSMt* SM)","{"," return ecx_siiSM (&ecx_context, slave, SM);","}","","uint16 ec_siiSMnext(uint16 slave, ec_eepromSMt* SM, uint16 n)","{"," return ecx_siiSMnext (&ecx_context, slave, SM, n);","}","","int ec_siiPDO(uint16 slave, ec_eepromPDOt* PDO, uint8 t)","{"," return ecx_siiPDO (&ecx_context, slave, PDO, t);","}","","int ec_readstate(void)","{"," return ecx_readstate (&ecx_context);","}","","int ec_writestate(uint16 slave)","{"," return ecx_writestate(&ecx_context, slave);","}","","uint16 ec_statecheck(uint16 slave, uint16 reqstate, int timeout)","{"," return ecx_statecheck (&ecx_context, slave, reqstate, timeout);","}","","int ec_mbxempty(uint16 slave, int timeout)","{"," return ecx_mbxempty (&ecx_context, slave, timeout);","}","","int ec_mbxsend(uint16 slave,ec_mbxbuft *mbx, int timeout)","{"," return ecx_mbxsend (&ecx_context, slave, mbx, timeout);","}","","int ec_mbxreceive(uint16 slave, ec_mbxbuft *mbx, int timeout)","{"," return ecx_mbxreceive (&ecx_context, slave, mbx, timeout);","}","","void ec_esidump(uint16 slave, uint8 *esibuf)","{"," ecx_esidump (&ecx_context, slave, esibuf);","}","","uint32 ec_readeeprom(uint16 slave, uint16 eeproma, int timeout)","{"," return ecx_readeeprom (&ecx_context, slave, eeproma, timeout);","}","","int ec_writeeeprom(uint16 slave, uint16 eeproma, uint16 data, int timeout)","{"," return ecx_writeeeprom (&ecx_context, slave, eeproma, data, timeout);","}","","int ec_eeprom2master(uint16 slave)","{"," return ecx_eeprom2master(&ecx_context, slave);","}","","int ec_eeprom2pdi(uint16 slave)","{"," return ecx_eeprom2pdi(&ecx_context, slave);","}","","uint16 ec_eeprom_waitnotbusyAP(uint16 aiadr,uint16 *estat, int timeout)","{"," return ecx_eeprom_waitnotbusyAP (&ecx_context, aiadr, estat, timeout);","}","","uint64 ec_readeepromAP(uint16 aiadr, uint16 eeproma, int timeout)","{"," return ecx_readeepromAP (&ecx_context, aiadr, eeproma, timeout);","}","","int ec_writeeepromAP(uint16 aiadr, uint16 eeproma, uint16 data, int timeout)","{"," return ecx_writeeepromAP (&ecx_context, aiadr, eeproma, data, timeout);","}","","uint16 ec_eeprom_waitnotbusyFP(uint16 configadr,uint16 *estat, int timeout)","{"," return ecx_eeprom_waitnotbusyFP (&ecx_context, configadr, estat, timeout);","}","","uint64 ec_readeepromFP(uint16 configadr, uint16 eeproma, int timeout)","{"," return ecx_readeepromFP (&ecx_context, configadr, eeproma, timeout);","}","","int ec_writeeepromFP(uint16 configadr, uint16 eeproma, uint16 data, int timeout)","{"," return ecx_writeeepromFP (&ecx_context, configadr, eeproma, data, timeout);","}","","void ec_readeeprom1(uint16 slave, uint16 eeproma)","{"," ecx_readeeprom1 (&ecx_context, slave, eeproma);","}","","uint32 ec_readeeprom2(uint16 slave, int timeout)","{"," return ecx_readeeprom2 (&ecx_context, slave, timeout);","}","","int ec_send_processdata_group(uint8 group)","{"," return ecx_send_processdata_group (&ecx_context, group);","}","","int ec_receive_processdata_group(uint8 group, int timeout)","{"," return ecx_receive_processdata_group (&ecx_context, group, timeout);","}","","int ec_send_processdata(void)","{"," return ec_send_processdata_group(0);","}","","int ec_receive_processdata(int timeout)","{"," return ec_receive_processdata_group(0, timeout);","}","#endif"],"stylingDirectives":[[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":27,"cssClass":"pl-c"}],[{"start":0,"end":18,"cssClass":"pl-c"}],[{"start":0,"end":23,"cssClass":"pl-c"}],[{"start":0,"end":64,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":65,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":72,"cssClass":"pl-c"}],[{"start":0,"end":81,"cssClass":"pl-c"}],[{"start":0,"end":23,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":74,"cssClass":"pl-c"}],[{"start":0,"end":68,"cssClass":"pl-c"}],[{"start":0,"end":72,"cssClass":"pl-c"}],[{"start":0,"end":20,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":77,"cssClass":"pl-c"}],[{"start":0,"end":75,"cssClass":"pl-c"}],[{"start":0,"end":76,"cssClass":"pl-c"}],[{"start":0,"end":77,"cssClass":"pl-c"}],[{"start":0,"end":78,"cssClass":"pl-c"}],[{"start":0,"end":68,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":75,"cssClass":"pl-c"}],[{"start":0,"end":64,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":83,"cssClass":"pl-c"}],[{"start":0,"end":79,"cssClass":"pl-c"}],[{"start":0,"end":79,"cssClass":"pl-c"}],[{"start":0,"end":82,"cssClass":"pl-c"}],[{"start":0,"end":33,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":79,"cssClass":"pl-c"}],[{"start":0,"end":79,"cssClass":"pl-c"}],[{"start":0,"end":22,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":8,"cssClass":"pl-c"}],[{"start":0,"end":9,"cssClass":"pl-c"}],[{"start":0,"end":27,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":77,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":70,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":18,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":19,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":17,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":17,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":25,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":25,"cssClass":"pl-s"}],[{"start":0,"end":8,"cssClass":"pl-k"},{"start":9,"end":25,"cssClass":"pl-s"}],[],[],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-k"},{"start":8,"end":21,"cssClass":"pl-c1"}],[],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-smi"}],[{"start":0,"end":7,"cssClass":"pl-s1"},{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":21,"cssClass":"pl-smi"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":13,"end":17,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":13,"end":17,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":13,"end":15,"cssClass":"pl-c1"}],[{"start":2,"end":12,"cssClass":"pl-s1"}],[{"start":0,"end":10,"cssClass":"pl-smi"}],[],[{"start":0,"end":30,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-c1"}],[{"start":0,"end":7,"cssClass":"pl-k"},{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":21,"cssClass":"pl-smi"}],[],[{"start":3,"end":16,"cssClass":"pl-smi"},{"start":19,"end":28,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":19,"end":23,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":19,"end":25,"cssClass":"pl-c1"}],[{"start":2,"end":14,"cssClass":"pl-smi"}],[{"start":0,"end":10,"cssClass":"pl-smi"}],[],[{"start":0,"end":34,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-c1"}],[{"start":0,"end":7,"cssClass":"pl-k"},{"start":8,"end":14,"cssClass":"pl-k"},{"start":15,"end":21,"cssClass":"pl-smi"}],[],[{"start":3,"end":16,"cssClass":"pl-smi"},{"start":19,"end":28,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":19,"end":26,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":19,"end":28,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":19,"end":27,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":19,"end":24,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":24,"cssClass":"pl-c1"}],[{"start":2,"end":10,"cssClass":"pl-smi"}],[{"start":0,"end":10,"cssClass":"pl-smi"}],[],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-c1"}],[{"start":0,"end":26,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":65,"cssClass":"pl-c"}],[{"start":0,"end":49,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":44,"cssClass":"pl-c1"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":24,"end":37,"cssClass":"pl-s1"}],[{"start":0,"end":28,"cssClass":"pl-c"}],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":24,"end":32,"cssClass":"pl-s1"},{"start":33,"end":44,"cssClass":"pl-c1"}],[],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-smi"},{"start":24,"end":33,"cssClass":"pl-s1"},{"start":34,"end":46,"cssClass":"pl-c1"}],[{"start":0,"end":43,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":13,"cssClass":"pl-smi"},{"start":24,"end":33,"cssClass":"pl-s1"},{"start":34,"end":49,"cssClass":"pl-c1"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":16,"cssClass":"pl-smi"},{"start":24,"end":32,"cssClass":"pl-s1"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":19,"cssClass":"pl-smi"},{"start":24,"end":35,"cssClass":"pl-s1"}],[],[{"start":0,"end":71,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":21,"cssClass":"pl-smi"},{"start":24,"end":37,"cssClass":"pl-s1"}],[{"start":0,"end":51,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":20,"cssClass":"pl-smi"},{"start":24,"end":36,"cssClass":"pl-s1"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":18,"cssClass":"pl-smi"},{"start":24,"end":34,"cssClass":"pl-s1"}],[],[{"start":0,"end":32,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":19,"cssClass":"pl-smi"},{"start":24,"end":29,"cssClass":"pl-s1"}],[{"start":0,"end":34,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":21,"cssClass":"pl-smi"},{"start":24,"end":31,"cssClass":"pl-s1"}],[{"start":0,"end":61,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":24,"end":33,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"}],[],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":24,"end":33,"cssClass":"pl-s1"}],[],[{"start":0,"end":9,"cssClass":"pl-smi"},{"start":24,"end":32,"cssClass":"pl-s1"}],[{"start":0,"end":12,"cssClass":"pl-smi"},{"start":24,"end":35,"cssClass":"pl-s1"}],[],[{"start":0,"end":12,"cssClass":"pl-smi"},{"start":14,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":13,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":18,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":15,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":15,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":13,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":16,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":14,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":14,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":18,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":17,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":15,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":10,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":5,"cssClass":"pl-c1"},{"start":5,"end":12,"cssClass":"pl-s1"},{"start":21,"end":40,"cssClass":"pl-c"}],[{"start":4,"end":8,"cssClass":"pl-c1"},{"start":21,"end":34,"cssClass":"pl-c"}],[],[{"start":0,"end":6,"cssClass":"pl-k"}],[],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":65,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":11,"cssClass":"pl-smi"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":30,"cssClass":"pl-en"},{"start":32,"end":36,"cssClass":"pl-smi"}],[],[{"start":3,"end":14,"cssClass":"pl-smi"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":28,"cssClass":"pl-s1"}],[],[{"start":3,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":35,"cssClass":"pl-en"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":21,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":68,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":85,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":21,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":44,"cssClass":"pl-s1"}],[],[{"start":3,"end":21,"cssClass":"pl-en"},{"start":23,"end":30,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":45,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":47,"cssClass":"pl-k"},{"start":48,"end":57,"cssClass":"pl-smi"},{"start":58,"end":59,"cssClass":"pl-c1"},{"start":59,"end":61,"cssClass":"pl-s1"}],[],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-c1"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":50,"end":52,"cssClass":"pl-s1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-c1"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":47,"end":53,"cssClass":"pl-c1"},{"start":54,"end":55,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-c1"},{"start":21,"end":23,"cssClass":"pl-c1"},{"start":23,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":41,"cssClass":"pl-c1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-c1"},{"start":21,"end":23,"cssClass":"pl-c1"},{"start":23,"end":27,"cssClass":"pl-c1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":38,"end":40,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-c1"},{"start":45,"end":47,"cssClass":"pl-c1"},{"start":47,"end":51,"cssClass":"pl-c1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-c1"},{"start":21,"end":23,"cssClass":"pl-c1"},{"start":23,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":41,"cssClass":"pl-c1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"}],[],[{"start":3,"end":4,"cssClass":"pl-c1"},{"start":5,"end":12,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":23,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":32,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":45,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":39,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":8,"end":20,"cssClass":"pl-en"},{"start":21,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":53,"cssClass":"pl-smi"},{"start":54,"end":55,"cssClass":"pl-c1"},{"start":55,"end":57,"cssClass":"pl-s1"}],[],[{"start":3,"end":10,"cssClass":"pl-smi"},{"start":11,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":23,"end":30,"cssClass":"pl-s1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":32,"end":37,"cssClass":"pl-c1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":43,"cssClass":"pl-c1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":56,"end":61,"cssClass":"pl-c1"},{"start":61,"end":63,"cssClass":"pl-c1"},{"start":63,"end":67,"cssClass":"pl-c1"}],[],[{"start":3,"end":4,"cssClass":"pl-c1"},{"start":4,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":38,"end":40,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-c1"},{"start":45,"end":47,"cssClass":"pl-c1"},{"start":47,"end":51,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-c1"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":47,"end":53,"cssClass":"pl-c1"},{"start":54,"end":55,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":15,"cssClass":"pl-s1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":44,"cssClass":"pl-c1"}],[],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":7,"cssClass":"pl-k"}],[],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":8,"end":15,"cssClass":"pl-s1"},{"start":15,"end":17,"cssClass":"pl-c1"},{"start":17,"end":26,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":18,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":36,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":45,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":8,"end":19,"cssClass":"pl-en"},{"start":20,"end":32,"cssClass":"pl-smi"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":34,"end":41,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":11,"end":18,"cssClass":"pl-s1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":20,"end":25,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":31,"cssClass":"pl-c1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"},{"start":44,"end":49,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":51,"end":55,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":23,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":20,"cssClass":"pl-en"},{"start":21,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-smi"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":58,"end":64,"cssClass":"pl-smi"},{"start":65,"end":70,"cssClass":"pl-s1"},{"start":72,"end":77,"cssClass":"pl-smi"},{"start":78,"end":84,"cssClass":"pl-s1"},{"start":86,"end":92,"cssClass":"pl-smi"},{"start":93,"end":102,"cssClass":"pl-s1"}],[],[{"start":3,"end":12,"cssClass":"pl-smi"},{"start":13,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-en"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":24,"cssClass":"pl-k"},{"start":25,"end":27,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":30,"cssClass":"pl-en"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":21,"cssClass":"pl-s1"}],[{"start":3,"end":4,"cssClass":"pl-c1"},{"start":5,"end":12,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":23,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":38,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-s1"}],[{"start":3,"end":16,"cssClass":"pl-en"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":24,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":62,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-smi"},{"start":12,"end":24,"cssClass":"pl-en"},{"start":25,"end":37,"cssClass":"pl-smi"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":39,"end":46,"cssClass":"pl-s1"},{"start":48,"end":54,"cssClass":"pl-smi"},{"start":55,"end":60,"cssClass":"pl-s1"},{"start":61,"end":67,"cssClass":"pl-smi"},{"start":68,"end":74,"cssClass":"pl-s1"}],[],[{"start":3,"end":12,"cssClass":"pl-smi"},{"start":13,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-en"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":24,"cssClass":"pl-k"},{"start":25,"end":27,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":30,"cssClass":"pl-en"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":35,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":24,"cssClass":"pl-s1"}],[{"start":3,"end":16,"cssClass":"pl-en"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":34,"cssClass":"pl-c"}],[{"start":0,"end":2,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":60,"cssClass":"pl-c"}],[{"start":0,"end":23,"cssClass":"pl-c"}],[{"start":0,"end":17,"cssClass":"pl-c"}],[{"start":0,"end":17,"cssClass":"pl-c"}],[{"start":0,"end":17,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-smi"},{"start":12,"end":33,"cssClass":"pl-en"},{"start":34,"end":46,"cssClass":"pl-smi"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-smi"},{"start":64,"end":69,"cssClass":"pl-s1"},{"start":70,"end":76,"cssClass":"pl-smi"},{"start":77,"end":86,"cssClass":"pl-s1"},{"start":87,"end":93,"cssClass":"pl-smi"},{"start":94,"end":102,"cssClass":"pl-s1"}],[{"start":4,"end":9,"cssClass":"pl-smi"},{"start":10,"end":12,"cssClass":"pl-s1"},{"start":14,"end":20,"cssClass":"pl-smi"},{"start":21,"end":23,"cssClass":"pl-s1"},{"start":25,"end":31,"cssClass":"pl-smi"},{"start":32,"end":34,"cssClass":"pl-s1"}],[],[{"start":3,"end":12,"cssClass":"pl-smi"},{"start":13,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-en"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":24,"cssClass":"pl-k"},{"start":25,"end":27,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":30,"cssClass":"pl-en"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":35,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":23,"cssClass":"pl-smi"},{"start":24,"end":32,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-s1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-s1"}],[{"start":3,"end":16,"cssClass":"pl-en"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":12,"cssClass":"pl-en"},{"start":13,"end":25,"cssClass":"pl-smi"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":40,"cssClass":"pl-smi"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":43,"end":49,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":22,"cssClass":"pl-en"},{"start":23,"end":30,"cssClass":"pl-s1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":32,"end":36,"cssClass":"pl-c1"},{"start":38,"end":44,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":65,"cssClass":"pl-c"}],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":22,"cssClass":"pl-en"},{"start":23,"end":35,"cssClass":"pl-smi"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":58,"cssClass":"pl-smi"},{"start":59,"end":60,"cssClass":"pl-c1"},{"start":60,"end":67,"cssClass":"pl-s1"},{"start":69,"end":73,"cssClass":"pl-smi"},{"start":74,"end":75,"cssClass":"pl-c1"},{"start":75,"end":81,"cssClass":"pl-s1"},{"start":83,"end":87,"cssClass":"pl-smi"},{"start":88,"end":89,"cssClass":"pl-c1"},{"start":89,"end":96,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":11,"cssClass":"pl-s1"},{"start":13,"end":17,"cssClass":"pl-s1"}],[{"start":3,"end":18,"cssClass":"pl-smi"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":20,"end":23,"cssClass":"pl-s1"}],[],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-c1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":3,"end":15,"cssClass":"pl-en"},{"start":16,"end":23,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":31,"end":37,"cssClass":"pl-s1"}],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":22,"cssClass":"pl-en"},{"start":23,"end":30,"cssClass":"pl-s1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":32,"end":36,"cssClass":"pl-c1"},{"start":38,"end":45,"cssClass":"pl-s1"}],[{"start":3,"end":61,"cssClass":"pl-c"}],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":10,"end":25,"cssClass":"pl-smi"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":43,"cssClass":"pl-c1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":51,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":24,"cssClass":"pl-en"},{"start":25,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":34,"cssClass":"pl-c1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":38,"end":45,"cssClass":"pl-s1"},{"start":45,"end":47,"cssClass":"pl-c1"},{"start":47,"end":51,"cssClass":"pl-c1"},{"start":51,"end":53,"cssClass":"pl-c1"},{"start":53,"end":59,"cssClass":"pl-c1"},{"start":62,"end":72,"cssClass":"pl-c1"},{"start":74,"end":75,"cssClass":"pl-c1"},{"start":77,"end":83,"cssClass":"pl-c1"},{"start":85,"end":91,"cssClass":"pl-c1"},{"start":93,"end":94,"cssClass":"pl-c1"},{"start":96,"end":97,"cssClass":"pl-c1"},{"start":97,"end":101,"cssClass":"pl-s1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":47,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":63,"cssClass":"pl-c1"},{"start":64,"end":65,"cssClass":"pl-c1"},{"start":66,"end":76,"cssClass":"pl-c1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":79,"end":80,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":14,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":14,"cssClass":"pl-en"},{"start":15,"end":27,"cssClass":"pl-smi"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":36,"cssClass":"pl-s1"}],[],[{"start":3,"end":15,"cssClass":"pl-en"},{"start":16,"end":23,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":76,"cssClass":"pl-c"}],[{"start":0,"end":69,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":67,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-smi"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":58,"end":64,"cssClass":"pl-smi"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"},{"start":21,"end":25,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":14,"cssClass":"pl-s1"},{"start":16,"end":20,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":9,"cssClass":"pl-s1"},{"start":10,"end":13,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":16,"end":23,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":33,"cssClass":"pl-c1"},{"start":35,"end":60,"cssClass":"pl-c"}],[],[{"start":6,"end":12,"cssClass":"pl-en"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":28,"cssClass":"pl-c1"},{"start":30,"end":34,"cssClass":"pl-c1"},{"start":36,"end":51,"cssClass":"pl-c1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":54,"end":60,"cssClass":"pl-k"},{"start":61,"end":67,"cssClass":"pl-s1"},{"start":71,"end":99,"cssClass":"pl-c"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":26,"end":31,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":29,"cssClass":"pl-c1"}],[],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":28,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-c1"},{"start":26,"end":30,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":35,"end":41,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-c1"},{"start":48,"end":52,"cssClass":"pl-s1"}],[],[{"start":9,"end":40,"cssClass":"pl-c"}],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":33,"cssClass":"pl-c1"},{"start":34,"end":41,"cssClass":"pl-s1"}],[],[{"start":6,"end":10,"cssClass":"pl-k"}],[],[{"start":9,"end":50,"cssClass":"pl-c"}],[{"start":9,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":44,"end":78,"cssClass":"pl-c"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":23,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":32,"cssClass":"pl-en"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":43,"end":52,"cssClass":"pl-s1"},{"start":54,"end":58,"cssClass":"pl-s1"},{"start":60,"end":73,"cssClass":"pl-c1"}],[{"start":9,"end":30,"cssClass":"pl-c"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":31,"cssClass":"pl-c1"},{"start":32,"end":37,"cssClass":"pl-s1"},{"start":39,"end":48,"cssClass":"pl-c1"}],[],[{"start":12,"end":27,"cssClass":"pl-en"},{"start":28,"end":32,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":51,"cssClass":"pl-c1"},{"start":52,"end":56,"cssClass":"pl-s1"},{"start":60,"end":61,"cssClass":"pl-c1"}],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[],[{"start":9,"end":30,"cssClass":"pl-c"}],[{"start":9,"end":13,"cssClass":"pl-k"}],[],[{"start":12,"end":27,"cssClass":"pl-en"},{"start":28,"end":32,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":51,"cssClass":"pl-c1"},{"start":52,"end":56,"cssClass":"pl-s1"},{"start":60,"end":61,"cssClass":"pl-c1"}],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[],[{"start":9,"end":35,"cssClass":"pl-c"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":17,"end":21,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":35,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-k"},{"start":13,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":22,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":30,"cssClass":"pl-s1"},{"start":33,"end":35,"cssClass":"pl-s1"},{"start":35,"end":37,"cssClass":"pl-c1"}],[],[{"start":12,"end":55,"cssClass":"pl-c"}],[{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":27,"cssClass":"pl-c1"},{"start":28,"end":32,"cssClass":"pl-s1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":43,"end":47,"cssClass":"pl-s1"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"}],[{"start":15,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"}],[],[],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":33,"cssClass":"pl-c1"},{"start":34,"end":41,"cssClass":"pl-s1"}],[],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":41,"cssClass":"pl-c"}],[{"start":0,"end":84,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":6,"end":17,"cssClass":"pl-en"},{"start":18,"end":30,"cssClass":"pl-smi"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":47,"cssClass":"pl-smi"},{"start":48,"end":53,"cssClass":"pl-s1"},{"start":55,"end":61,"cssClass":"pl-smi"},{"start":62,"end":65,"cssClass":"pl-s1"}],[],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":10,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":4,"cssClass":"pl-s1"},{"start":5,"end":6,"cssClass":"pl-c1"},{"start":7,"end":20,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[{"start":3,"end":40,"cssClass":"pl-c"}],[{"start":3,"end":4,"cssClass":"pl-s1"},{"start":5,"end":6,"cssClass":"pl-c1"},{"start":7,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":31,"end":36,"cssClass":"pl-s1"},{"start":38,"end":39,"cssClass":"pl-s1"},{"start":39,"end":41,"cssClass":"pl-c1"}],[{"start":3,"end":4,"cssClass":"pl-s1"},{"start":5,"end":7,"cssClass":"pl-c1"},{"start":9,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":33,"end":38,"cssClass":"pl-s1"},{"start":40,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"}],[{"start":3,"end":61,"cssClass":"pl-c"}],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":11,"end":12,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":16,"end":19,"cssClass":"pl-s1"},{"start":21,"end":23,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-s1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":30,"end":36,"cssClass":"pl-c1"}],[],[{"start":6,"end":31,"cssClass":"pl-c"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":12,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"}],[{"start":6,"end":40,"cssClass":"pl-c"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"}],[{"start":6,"end":33,"cssClass":"pl-c"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":12,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":8,"cssClass":"pl-s1"},{"start":9,"end":11,"cssClass":"pl-c1"},{"start":12,"end":15,"cssClass":"pl-s1"}],[],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":11,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":60,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":46,"cssClass":"pl-smi"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":48,"end":51,"cssClass":"pl-s1"},{"start":53,"end":59,"cssClass":"pl-smi"},{"start":60,"end":65,"cssClass":"pl-s1"},{"start":67,"end":73,"cssClass":"pl-smi"},{"start":74,"end":76,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-s1"}],[{"start":3,"end":7,"cssClass":"pl-smi"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":9,"end":12,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":12,"cssClass":"pl-s1"}],[{"start":3,"end":4,"cssClass":"pl-s1"},{"start":5,"end":6,"cssClass":"pl-c1"},{"start":7,"end":18,"cssClass":"pl-en"},{"start":20,"end":27,"cssClass":"pl-s1"},{"start":29,"end":34,"cssClass":"pl-s1"},{"start":36,"end":50,"cssClass":"pl-c1"},{"start":53,"end":78,"cssClass":"pl-c"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":47,"cssClass":"pl-c"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":48,"end":87,"cssClass":"pl-c"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":12,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-s1"},{"start":19,"end":49,"cssClass":"pl-c"}],[],[{"start":9,"end":12,"cssClass":"pl-k"},{"start":14,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-s1"},{"start":30,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":35,"end":61,"cssClass":"pl-c"}],[],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":30,"cssClass":"pl-en"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":54,"end":81,"cssClass":"pl-c"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-s1"}],[],[{"start":15,"end":17,"cssClass":"pl-s1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-s1"}],[],[{"start":12,"end":16,"cssClass":"pl-k"}],[],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":24,"cssClass":"pl-s1"}],[{"start":15,"end":18,"cssClass":"pl-k"},{"start":20,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-s1"},{"start":35,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":40,"end":61,"cssClass":"pl-c"}],[],[{"start":18,"end":20,"cssClass":"pl-k"},{"start":21,"end":22,"cssClass":"pl-s1"},{"start":26,"end":36,"cssClass":"pl-c1"}],[],[{"start":21,"end":22,"cssClass":"pl-c1"},{"start":22,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":29,"end":33,"cssClass":"pl-smi"},{"start":34,"end":48,"cssClass":"pl-en"},{"start":49,"end":56,"cssClass":"pl-s1"},{"start":58,"end":63,"cssClass":"pl-s1"},{"start":65,"end":67,"cssClass":"pl-s1"},{"start":67,"end":69,"cssClass":"pl-c1"}],[{"start":21,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"}],[],[{"start":18,"end":22,"cssClass":"pl-k"}],[],[{"start":21,"end":23,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-c1"}],[],[],[],[],[{"start":9,"end":10,"cssClass":"pl-c1"},{"start":10,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":19,"end":44,"cssClass":"pl-c"}],[],[{"start":6,"end":10,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":18,"cssClass":"pl-s1"}],[{"start":9,"end":10,"cssClass":"pl-c1"},{"start":10,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":19,"end":37,"cssClass":"pl-c"}],[],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":60,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-smi"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":70,"cssClass":"pl-smi"},{"start":70,"end":71,"cssClass":"pl-c1"},{"start":72,"end":76,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":11,"end":12,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-c1"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":60,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-c1"},{"start":13,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":24,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[],[{"start":9,"end":13,"cssClass":"pl-c1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":37,"cssClass":"pl-en"},{"start":38,"end":45,"cssClass":"pl-s1"},{"start":47,"end":52,"cssClass":"pl-s1"},{"start":54,"end":55,"cssClass":"pl-s1"},{"start":55,"end":57,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-c1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":37,"cssClass":"pl-en"},{"start":38,"end":45,"cssClass":"pl-s1"},{"start":47,"end":52,"cssClass":"pl-s1"},{"start":54,"end":55,"cssClass":"pl-s1"},{"start":55,"end":57,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":52,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":50,"cssClass":"pl-c"}],[{"start":0,"end":45,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-en"},{"start":17,"end":29,"cssClass":"pl-smi"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":40,"end":46,"cssClass":"pl-smi"},{"start":47,"end":52,"cssClass":"pl-s1"},{"start":54,"end":66,"cssClass":"pl-smi"},{"start":66,"end":67,"cssClass":"pl-c1"},{"start":68,"end":70,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-c1"},{"start":5,"end":7,"cssClass":"pl-c1"},{"start":7,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-c1"},{"start":5,"end":7,"cssClass":"pl-c1"},{"start":7,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":29,"cssClass":"pl-en"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-s1"},{"start":46,"end":56,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":9,"cssClass":"pl-c1"},{"start":9,"end":11,"cssClass":"pl-c1"},{"start":11,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":22,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":12,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":35,"cssClass":"pl-en"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-s1"},{"start":53,"end":55,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":17,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":49,"cssClass":"pl-c"}],[{"start":0,"end":34,"cssClass":"pl-c"}],[{"start":0,"end":20,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":20,"cssClass":"pl-en"},{"start":21,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-smi"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":58,"end":70,"cssClass":"pl-smi"},{"start":70,"end":71,"cssClass":"pl-c1"},{"start":72,"end":74,"cssClass":"pl-c1"},{"start":76,"end":82,"cssClass":"pl-smi"},{"start":83,"end":84,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":13,"cssClass":"pl-c1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":18,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":22,"cssClass":"pl-c1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":35,"cssClass":"pl-en"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-s1"},{"start":53,"end":55,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":34,"cssClass":"pl-en"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":52,"end":54,"cssClass":"pl-c1"}],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":39,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":14,"cssClass":"pl-en"},{"start":15,"end":27,"cssClass":"pl-smi"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":38,"end":44,"cssClass":"pl-smi"},{"start":45,"end":50,"cssClass":"pl-s1"},{"start":52,"end":65,"cssClass":"pl-smi"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":67,"end":70,"cssClass":"pl-c1"},{"start":72,"end":77,"cssClass":"pl-smi"},{"start":78,"end":79,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-s1"},{"start":27,"end":31,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-c1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-c1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-c1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-k"},{"start":8,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":28,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":36,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":50,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-s1"},{"start":54,"end":55,"cssClass":"pl-c1"},{"start":56,"end":57,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-c1"},{"start":6,"end":8,"cssClass":"pl-c1"},{"start":8,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":30,"cssClass":"pl-en"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":58,"cssClass":"pl-c1"},{"start":59,"end":60,"cssClass":"pl-c1"},{"start":61,"end":62,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":10,"cssClass":"pl-c1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":24,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":13,"cssClass":"pl-c1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":42,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":10,"cssClass":"pl-c1"},{"start":12,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-c1"},{"start":9,"end":11,"cssClass":"pl-c1"},{"start":11,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-s1"}],[{"start":6,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[{"start":6,"end":37,"cssClass":"pl-c"}],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":18,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-c1"},{"start":20,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":47,"cssClass":"pl-en"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":65,"cssClass":"pl-s1"},{"start":65,"end":67,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-c1"},{"start":20,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":35,"end":49,"cssClass":"pl-en"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":59,"end":64,"cssClass":"pl-s1"},{"start":66,"end":67,"cssClass":"pl-s1"},{"start":67,"end":69,"cssClass":"pl-c1"},{"start":74,"end":75,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":21,"cssClass":"pl-c1"},{"start":22,"end":25,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":31,"cssClass":"pl-c1"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"}],[{"start":9,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"}],[{"start":9,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":27,"cssClass":"pl-en"},{"start":28,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":45,"cssClass":"pl-s1"},{"start":45,"end":47,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-c1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":14,"end":19,"cssClass":"pl-c1"},{"start":20,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":47,"cssClass":"pl-en"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":65,"cssClass":"pl-s1"},{"start":65,"end":67,"cssClass":"pl-c1"}],[{"start":9,"end":10,"cssClass":"pl-s1"},{"start":11,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":9,"end":10,"cssClass":"pl-s1"},{"start":11,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-c1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":23,"cssClass":"pl-c1"},{"start":24,"end":27,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":29,"end":33,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":45,"cssClass":"pl-c1"},{"start":47,"end":76,"cssClass":"pl-c"}],[],[{"start":12,"end":49,"cssClass":"pl-c"}],[{"start":12,"end":15,"cssClass":"pl-k"},{"start":17,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"}],[],[{"start":15,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-c1"}],[{"start":15,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-c1"}],[{"start":15,"end":18,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":20,"end":27,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":42,"end":56,"cssClass":"pl-en"},{"start":57,"end":64,"cssClass":"pl-s1"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":73,"end":74,"cssClass":"pl-s1"},{"start":74,"end":76,"cssClass":"pl-c1"}],[{"start":15,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-c1"}],[],[{"start":12,"end":15,"cssClass":"pl-c1"},{"start":15,"end":17,"cssClass":"pl-c1"},{"start":17,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-c1"},{"start":42,"end":44,"cssClass":"pl-c1"},{"start":44,"end":48,"cssClass":"pl-c1"},{"start":52,"end":54,"cssClass":"pl-c1"},{"start":55,"end":58,"cssClass":"pl-c1"},{"start":58,"end":60,"cssClass":"pl-c1"},{"start":60,"end":67,"cssClass":"pl-c1"},{"start":68,"end":71,"cssClass":"pl-c1"},{"start":71,"end":73,"cssClass":"pl-c1"},{"start":73,"end":77,"cssClass":"pl-c1"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":32,"cssClass":"pl-c1"},{"start":33,"end":36,"cssClass":"pl-c1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":38,"end":42,"cssClass":"pl-c1"}],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"}],[],[{"start":9,"end":13,"cssClass":"pl-k"},{"start":14,"end":68,"cssClass":"pl-c"}],[],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-s1"}],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-s1"}],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"}],[],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-c1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-c1"},{"start":27,"end":38,"cssClass":"pl-c1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[{"start":12,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":19,"cssClass":"pl-c1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":27,"cssClass":"pl-c1"},{"start":29,"end":72,"cssClass":"pl-c"}],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":13,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":20,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":28,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":11,"end":15,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":7,"cssClass":"pl-k"},{"start":8,"end":22,"cssClass":"pl-c1"}],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":45,"cssClass":"pl-smi"},{"start":46,"end":47,"cssClass":"pl-s1"},{"start":49,"end":55,"cssClass":"pl-smi"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":66,"cssClass":"pl-s1"},{"start":68,"end":80,"cssClass":"pl-smi"},{"start":81,"end":82,"cssClass":"pl-c1"},{"start":82,"end":91,"cssClass":"pl-s1"},{"start":93,"end":96,"cssClass":"pl-smi"},{"start":97,"end":104,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":12,"cssClass":"pl-s1"}],[{"start":3,"end":12,"cssClass":"pl-smi"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":14,"end":18,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":16,"cssClass":"pl-s1"},{"start":17,"end":31,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":23,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":21,"cssClass":"pl-en"},{"start":22,"end":26,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"}],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":25,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":33,"cssClass":"pl-s1"},{"start":33,"end":35,"cssClass":"pl-c1"},{"start":35,"end":40,"cssClass":"pl-c1"},{"start":41,"end":44,"cssClass":"pl-s1"},{"start":48,"end":59,"cssClass":"pl-c1"},{"start":61,"end":64,"cssClass":"pl-s1"}],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":8,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":25,"cssClass":"pl-s1"},{"start":28,"end":42,"cssClass":"pl-c1"},{"start":44,"end":50,"cssClass":"pl-k"},{"start":51,"end":63,"cssClass":"pl-s1"},{"start":66,"end":75,"cssClass":"pl-s1"},{"start":76,"end":77,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":18,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":35,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":9,"end":11,"cssClass":"pl-c1"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[],[{"start":6,"end":15,"cssClass":"pl-s1"},{"start":16,"end":21,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":40,"cssClass":"pl-en"},{"start":41,"end":45,"cssClass":"pl-s1"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":49,"end":53,"cssClass":"pl-s1"},{"start":53,"end":55,"cssClass":"pl-c1"},{"start":55,"end":60,"cssClass":"pl-c1"},{"start":61,"end":64,"cssClass":"pl-s1"},{"start":68,"end":79,"cssClass":"pl-c1"},{"start":81,"end":84,"cssClass":"pl-s1"}],[{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-s1"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":85,"cssClass":"pl-s1"},{"start":88,"end":97,"cssClass":"pl-s1"},{"start":98,"end":99,"cssClass":"pl-c1"},{"start":100,"end":105,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":6,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-s1"}],[],[{"start":6,"end":15,"cssClass":"pl-s1"},{"start":16,"end":21,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":40,"cssClass":"pl-en"},{"start":41,"end":45,"cssClass":"pl-s1"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":49,"end":53,"cssClass":"pl-s1"},{"start":53,"end":55,"cssClass":"pl-c1"},{"start":55,"end":60,"cssClass":"pl-c1"},{"start":61,"end":64,"cssClass":"pl-s1"},{"start":68,"end":79,"cssClass":"pl-c1"},{"start":81,"end":84,"cssClass":"pl-s1"}],[{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-s1"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":85,"cssClass":"pl-s1"},{"start":88,"end":97,"cssClass":"pl-s1"},{"start":98,"end":99,"cssClass":"pl-c1"},{"start":100,"end":105,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":22,"cssClass":"pl-en"},{"start":23,"end":27,"cssClass":"pl-s1"},{"start":29,"end":32,"cssClass":"pl-s1"},{"start":34,"end":41,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"}],[],[{"start":6,"end":9,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":22,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":39,"end":41,"cssClass":"pl-c1"}],[],[{"start":9,"end":15,"cssClass":"pl-en"},{"start":16,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":43,"end":48,"cssClass":"pl-c1"},{"start":49,"end":52,"cssClass":"pl-s1"},{"start":54,"end":63,"cssClass":"pl-s1"},{"start":64,"end":69,"cssClass":"pl-s1"},{"start":74,"end":80,"cssClass":"pl-k"},{"start":81,"end":93,"cssClass":"pl-s1"}],[],[],[{"start":3,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-s1"},{"start":24,"end":27,"cssClass":"pl-s1"},{"start":29,"end":41,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":29,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":17,"cssClass":"pl-en"},{"start":18,"end":30,"cssClass":"pl-smi"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":32,"end":39,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":17,"end":23,"cssClass":"pl-s1"},{"start":25,"end":31,"cssClass":"pl-s1"},{"start":33,"end":42,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-s1"},{"start":52,"end":56,"cssClass":"pl-s1"}],[{"start":3,"end":15,"cssClass":"pl-smi"},{"start":16,"end":18,"cssClass":"pl-s1"},{"start":19,"end":33,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":14,"cssClass":"pl-s1"},{"start":15,"end":29,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":25,"end":37,"cssClass":"pl-c1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":36,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":11,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-s1"},{"start":31,"end":45,"cssClass":"pl-c1"}],[],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":41,"cssClass":"pl-c1"},{"start":42,"end":43,"cssClass":"pl-c1"},{"start":44,"end":45,"cssClass":"pl-c1"}],[],[{"start":6,"end":9,"cssClass":"pl-k"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-s1"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":36,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":15,"end":27,"cssClass":"pl-smi"},{"start":28,"end":32,"cssClass":"pl-s1"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":42,"end":43,"cssClass":"pl-c1"}],[],[{"start":9,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":28,"cssClass":"pl-s1"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":32,"end":41,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":34,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":31,"end":37,"cssClass":"pl-s1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":51,"cssClass":"pl-c1"},{"start":53,"end":54,"cssClass":"pl-c1"},{"start":55,"end":59,"cssClass":"pl-s1"},{"start":60,"end":61,"cssClass":"pl-c1"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":67,"end":69,"cssClass":"pl-s1"},{"start":70,"end":71,"cssClass":"pl-c1"},{"start":75,"end":89,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-k"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-s1"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":36,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-s1"},{"start":49,"end":51,"cssClass":"pl-c1"}],[],[{"start":9,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":24,"cssClass":"pl-s1"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":39,"cssClass":"pl-s1"},{"start":41,"end":49,"cssClass":"pl-c1"}],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":47,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":55,"cssClass":"pl-en"},{"start":56,"end":58,"cssClass":"pl-s1"},{"start":59,"end":64,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":67,"end":73,"cssClass":"pl-s1"},{"start":75,"end":87,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-s1"}],[],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":25,"cssClass":"pl-s1"}],[],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":43,"end":47,"cssClass":"pl-s1"}],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":43,"cssClass":"pl-c1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":56,"end":65,"cssClass":"pl-c1"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":73,"end":85,"cssClass":"pl-c1"}],[],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[{"start":5,"end":10,"cssClass":"pl-k"},{"start":11,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":41,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":39,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":61,"cssClass":"pl-c"}],[{"start":0,"end":62,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":49,"cssClass":"pl-c"}],[{"start":0,"end":12,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-smi"},{"start":49,"end":54,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"},{"start":21,"end":28,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":40,"cssClass":"pl-c1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":13,"cssClass":"pl-en"},{"start":14,"end":21,"cssClass":"pl-s1"},{"start":21,"end":23,"cssClass":"pl-c1"},{"start":23,"end":27,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":32,"end":45,"cssClass":"pl-c1"},{"start":47,"end":53,"cssClass":"pl-k"},{"start":54,"end":61,"cssClass":"pl-s1"},{"start":64,"end":65,"cssClass":"pl-c1"},{"start":65,"end":72,"cssClass":"pl-s1"},{"start":74,"end":88,"cssClass":"pl-c1"},{"start":91,"end":115,"cssClass":"pl-c"}],[],[{"start":3,"end":7,"cssClass":"pl-k"}],[],[{"start":6,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":36,"cssClass":"pl-c1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":53,"cssClass":"pl-c1"}],[],[{"start":6,"end":15,"cssClass":"pl-en"},{"start":16,"end":23,"cssClass":"pl-s1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":31,"end":40,"cssClass":"pl-s1"},{"start":42,"end":55,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-en"},{"start":63,"end":70,"cssClass":"pl-s1"},{"start":70,"end":72,"cssClass":"pl-c1"},{"start":72,"end":81,"cssClass":"pl-c1"},{"start":82,"end":87,"cssClass":"pl-s1"},{"start":89,"end":94,"cssClass":"pl-c1"},{"start":97,"end":111,"cssClass":"pl-c1"},{"start":114,"end":138,"cssClass":"pl-c"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":11,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":29,"cssClass":"pl-c"}],[{"start":0,"end":31,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":43,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-smi"},{"start":52,"end":57,"cssClass":"pl-s1"},{"start":59,"end":65,"cssClass":"pl-smi"},{"start":66,"end":74,"cssClass":"pl-s1"},{"start":76,"end":79,"cssClass":"pl-smi"},{"start":80,"end":87,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":32,"cssClass":"pl-s1"}],[{"start":3,"end":15,"cssClass":"pl-smi"},{"start":16,"end":22,"cssClass":"pl-s1"}],[{"start":3,"end":14,"cssClass":"pl-smi"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":37,"cssClass":"pl-c1"}],[],[{"start":6,"end":12,"cssClass":"pl-k"},{"start":13,"end":14,"cssClass":"pl-c1"}],[],[{"start":3,"end":19,"cssClass":"pl-en"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"}],[{"start":9,"end":16,"cssClass":"pl-en"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":30,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":35,"end":49,"cssClass":"pl-c1"},{"start":51,"end":57,"cssClass":"pl-k"},{"start":58,"end":62,"cssClass":"pl-s1"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":66,"end":70,"cssClass":"pl-s1"},{"start":73,"end":86,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":26,"cssClass":"pl-s1"}],[],[{"start":6,"end":10,"cssClass":"pl-k"}],[],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":24,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"}],[{"start":9,"end":17,"cssClass":"pl-en"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":31,"cssClass":"pl-c1"},{"start":33,"end":42,"cssClass":"pl-s1"},{"start":44,"end":58,"cssClass":"pl-c1"},{"start":60,"end":66,"cssClass":"pl-k"},{"start":67,"end":73,"cssClass":"pl-s1"},{"start":76,"end":77,"cssClass":"pl-c1"},{"start":77,"end":83,"cssClass":"pl-s1"},{"start":85,"end":98,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":28,"cssClass":"pl-s1"},{"start":29,"end":37,"cssClass":"pl-c1"}],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":47,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":55,"cssClass":"pl-en"},{"start":56,"end":62,"cssClass":"pl-s1"},{"start":63,"end":75,"cssClass":"pl-c1"}],[],[{"start":6,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":27,"cssClass":"pl-c1"},{"start":29,"end":52,"cssClass":"pl-c"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":19,"end":27,"cssClass":"pl-s1"}],[],[{"start":9,"end":20,"cssClass":"pl-en"},{"start":21,"end":25,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":28,"cssClass":"pl-s1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":34,"end":55,"cssClass":"pl-en"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":66,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":12,"end":21,"cssClass":"pl-c1"},{"start":22,"end":27,"cssClass":"pl-s1"},{"start":29,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":41,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":31,"cssClass":"pl-c"}],[{"start":0,"end":52,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":6,"end":19,"cssClass":"pl-en"},{"start":20,"end":25,"cssClass":"pl-smi"},{"start":26,"end":29,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":6,"end":8,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"}],[],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":15,"end":44,"cssClass":"pl-c"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":25,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":16,"cssClass":"pl-en"},{"start":17,"end":27,"cssClass":"pl-smi"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":32,"cssClass":"pl-s1"}],[],[{"start":4,"end":10,"cssClass":"pl-en"},{"start":11,"end":14,"cssClass":"pl-s1"},{"start":16,"end":20,"cssClass":"pl-c1"},{"start":22,"end":31,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":24,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":16,"cssClass":"pl-en"},{"start":17,"end":29,"cssClass":"pl-smi"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":40,"end":46,"cssClass":"pl-smi"},{"start":47,"end":52,"cssClass":"pl-s1"},{"start":54,"end":57,"cssClass":"pl-smi"},{"start":58,"end":65,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"}],[{"start":3,"end":14,"cssClass":"pl-smi"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":3,"end":19,"cssClass":"pl-en"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":34,"cssClass":"pl-c1"},{"start":36,"end":45,"cssClass":"pl-s1"},{"start":47,"end":62,"cssClass":"pl-c1"},{"start":64,"end":70,"cssClass":"pl-k"},{"start":71,"end":77,"cssClass":"pl-s1"},{"start":80,"end":81,"cssClass":"pl-c1"},{"start":81,"end":87,"cssClass":"pl-s1"},{"start":89,"end":102,"cssClass":"pl-c1"}],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-s1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":33,"end":35,"cssClass":"pl-c1"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":47,"end":60,"cssClass":"pl-c1"}],[],[{"start":9,"end":20,"cssClass":"pl-en"},{"start":21,"end":34,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":27,"end":33,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":44,"cssClass":"pl-c1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":53,"end":74,"cssClass":"pl-en"},{"start":75,"end":76,"cssClass":"pl-c1"},{"start":76,"end":81,"cssClass":"pl-s1"},{"start":83,"end":85,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":22,"end":28,"cssClass":"pl-s1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":31,"end":35,"cssClass":"pl-c1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"}],[],[{"start":6,"end":12,"cssClass":"pl-k"},{"start":13,"end":14,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":11,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":30,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":41,"cssClass":"pl-c"}],[{"start":0,"end":39,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":15,"cssClass":"pl-en"},{"start":16,"end":28,"cssClass":"pl-smi"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-smi"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":52,"end":62,"cssClass":"pl-smi"},{"start":63,"end":64,"cssClass":"pl-c1"},{"start":64,"end":67,"cssClass":"pl-s1"},{"start":69,"end":72,"cssClass":"pl-smi"},{"start":73,"end":80,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":30,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":10,"cssClass":"pl-c1"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":28,"cssClass":"pl-c1"},{"start":29,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-s1"},{"start":30,"end":39,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":22,"cssClass":"pl-en"},{"start":23,"end":30,"cssClass":"pl-s1"},{"start":32,"end":37,"cssClass":"pl-s1"},{"start":39,"end":46,"cssClass":"pl-s1"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":49,"cssClass":"pl-c1"}],[{"start":9,"end":37,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":57,"end":61,"cssClass":"pl-s1"},{"start":63,"end":66,"cssClass":"pl-s1"},{"start":68,"end":82,"cssClass":"pl-c1"}],[],[{"start":6,"end":10,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":32,"cssClass":"pl-c"}],[{"start":0,"end":52,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":41,"cssClass":"pl-c"}],[{"start":0,"end":39,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-smi"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":66,"cssClass":"pl-smi"},{"start":67,"end":68,"cssClass":"pl-c1"},{"start":68,"end":71,"cssClass":"pl-s1"},{"start":73,"end":76,"cssClass":"pl-smi"},{"start":77,"end":84,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":20,"cssClass":"pl-s1"},{"start":21,"end":30,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":12,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":11,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":16,"cssClass":"pl-smi"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":18,"end":22,"cssClass":"pl-s1"}],[{"start":3,"end":11,"cssClass":"pl-smi"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":13,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":15,"cssClass":"pl-smi"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-s1"}],[],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":28,"cssClass":"pl-c1"},{"start":29,"end":34,"cssClass":"pl-s1"},{"start":36,"end":42,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":18,"end":20,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-s1"},{"start":30,"end":39,"cssClass":"pl-c1"}],[],[{"start":6,"end":17,"cssClass":"pl-smi"},{"start":18,"end":23,"cssClass":"pl-s1"}],[],[{"start":6,"end":22,"cssClass":"pl-en"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":29,"cssClass":"pl-s1"},{"start":31,"end":38,"cssClass":"pl-s1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":9,"end":46,"cssClass":"pl-c"}],[],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":65,"cssClass":"pl-c1"},{"start":67,"end":73,"cssClass":"pl-k"},{"start":74,"end":80,"cssClass":"pl-s1"},{"start":83,"end":84,"cssClass":"pl-c1"},{"start":84,"end":90,"cssClass":"pl-s1"},{"start":92,"end":105,"cssClass":"pl-c1"}],[{"start":9,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":23,"cssClass":"pl-en"},{"start":24,"end":30,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":28,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":40,"end":47,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":63,"cssClass":"pl-c1"}],[],[{"start":12,"end":23,"cssClass":"pl-en"},{"start":24,"end":37,"cssClass":"pl-c1"}],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":15,"end":18,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":30,"end":36,"cssClass":"pl-s1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":43,"cssClass":"pl-c1"},{"start":45,"end":47,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":52,"end":54,"cssClass":"pl-c1"},{"start":56,"end":77,"cssClass":"pl-en"},{"start":78,"end":79,"cssClass":"pl-c1"},{"start":79,"end":84,"cssClass":"pl-s1"},{"start":86,"end":88,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":11,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-s1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":38,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":43,"cssClass":"pl-c1"},{"start":46,"end":76,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":49,"cssClass":"pl-c1"}],[{"start":9,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":17,"end":30,"cssClass":"pl-smi"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":36,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":51,"cssClass":"pl-s1"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":64,"cssClass":"pl-s1"},{"start":66,"end":69,"cssClass":"pl-s1"},{"start":71,"end":84,"cssClass":"pl-c1"},{"start":87,"end":104,"cssClass":"pl-c"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":31,"end":35,"cssClass":"pl-s1"},{"start":35,"end":37,"cssClass":"pl-c1"},{"start":37,"end":44,"cssClass":"pl-c1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":47,"end":51,"cssClass":"pl-c1"},{"start":53,"end":55,"cssClass":"pl-c1"},{"start":56,"end":60,"cssClass":"pl-c1"},{"start":63,"end":92,"cssClass":"pl-c"}],[],[{"start":15,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":36,"cssClass":"pl-smi"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":42,"cssClass":"pl-s1"}],[{"start":15,"end":27,"cssClass":"pl-en"},{"start":28,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":49,"cssClass":"pl-en"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":55,"end":57,"cssClass":"pl-c1"},{"start":57,"end":63,"cssClass":"pl-c1"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":85,"cssClass":"pl-c"}],[],[{"start":12,"end":16,"cssClass":"pl-k"},{"start":17,"end":19,"cssClass":"pl-k"},{"start":22,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-s1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":42,"end":49,"cssClass":"pl-c1"},{"start":50,"end":51,"cssClass":"pl-c1"},{"start":52,"end":56,"cssClass":"pl-c1"},{"start":58,"end":60,"cssClass":"pl-c1"},{"start":61,"end":65,"cssClass":"pl-c1"},{"start":68,"end":87,"cssClass":"pl-c"}],[],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":30,"cssClass":"pl-smi"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":36,"cssClass":"pl-s1"}],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":20,"end":25,"cssClass":"pl-en"},{"start":26,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-c1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":47,"end":49,"cssClass":"pl-c1"},{"start":50,"end":54,"cssClass":"pl-c1"},{"start":56,"end":80,"cssClass":"pl-c"}],[],[{"start":18,"end":39,"cssClass":"pl-en"},{"start":40,"end":47,"cssClass":"pl-s1"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":61,"cssClass":"pl-en"},{"start":62,"end":65,"cssClass":"pl-s1"},{"start":65,"end":67,"cssClass":"pl-c1"},{"start":67,"end":76,"cssClass":"pl-c1"},{"start":79,"end":82,"cssClass":"pl-s1"},{"start":82,"end":84,"cssClass":"pl-c1"},{"start":84,"end":92,"cssClass":"pl-c1"}],[{"start":26,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":36,"cssClass":"pl-c1"},{"start":38,"end":43,"cssClass":"pl-en"},{"start":44,"end":47,"cssClass":"pl-s1"},{"start":47,"end":49,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":54,"end":59,"cssClass":"pl-en"},{"start":60,"end":63,"cssClass":"pl-s1"},{"start":63,"end":65,"cssClass":"pl-c1"},{"start":65,"end":67,"cssClass":"pl-c1"}],[{"start":18,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":88,"cssClass":"pl-c"}],[],[],[{"start":12,"end":16,"cssClass":"pl-k"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":22,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":29,"end":52,"cssClass":"pl-c"}],[],[{"start":18,"end":24,"cssClass":"pl-s1"},{"start":28,"end":34,"cssClass":"pl-c1"},{"start":36,"end":63,"cssClass":"pl-c"}],[{"start":18,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":32,"cssClass":"pl-en"},{"start":33,"end":39,"cssClass":"pl-s1"}],[{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":33,"cssClass":"pl-en"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":43,"end":47,"cssClass":"pl-c1"},{"start":49,"end":58,"cssClass":"pl-s1"},{"start":60,"end":75,"cssClass":"pl-c1"},{"start":77,"end":83,"cssClass":"pl-k"},{"start":84,"end":90,"cssClass":"pl-s1"},{"start":93,"end":94,"cssClass":"pl-c1"},{"start":94,"end":100,"cssClass":"pl-s1"},{"start":102,"end":115,"cssClass":"pl-c1"}],[{"start":18,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":32,"cssClass":"pl-en"},{"start":33,"end":39,"cssClass":"pl-s1"}],[{"start":18,"end":20,"cssClass":"pl-k"},{"start":21,"end":46,"cssClass":"pl-c"}],[],[{"start":21,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":46,"end":50,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-s1"},{"start":63,"end":79,"cssClass":"pl-c1"},{"start":81,"end":87,"cssClass":"pl-k"},{"start":88,"end":95,"cssClass":"pl-s1"},{"start":98,"end":99,"cssClass":"pl-c1"},{"start":99,"end":106,"cssClass":"pl-s1"},{"start":108,"end":121,"cssClass":"pl-c1"}],[{"start":21,"end":26,"cssClass":"pl-k"},{"start":30,"end":34,"cssClass":"pl-s1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":46,"end":53,"cssClass":"pl-s1"},{"start":54,"end":55,"cssClass":"pl-c1"},{"start":56,"end":60,"cssClass":"pl-c1"},{"start":62,"end":64,"cssClass":"pl-c1"},{"start":66,"end":73,"cssClass":"pl-en"},{"start":74,"end":80,"cssClass":"pl-s1"},{"start":82,"end":83,"cssClass":"pl-c1"},{"start":84,"end":88,"cssClass":"pl-c1"},{"start":92,"end":94,"cssClass":"pl-c1"},{"start":96,"end":117,"cssClass":"pl-en"},{"start":118,"end":119,"cssClass":"pl-c1"},{"start":119,"end":124,"cssClass":"pl-s1"},{"start":126,"end":128,"cssClass":"pl-c1"}],[{"start":18,"end":20,"cssClass":"pl-k"},{"start":21,"end":58,"cssClass":"pl-c"}],[],[{"start":21,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":46,"end":50,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-s1"},{"start":63,"end":78,"cssClass":"pl-c1"},{"start":80,"end":86,"cssClass":"pl-k"},{"start":87,"end":93,"cssClass":"pl-s1"},{"start":96,"end":97,"cssClass":"pl-c1"},{"start":97,"end":103,"cssClass":"pl-s1"},{"start":105,"end":118,"cssClass":"pl-c1"}],[{"start":21,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":35,"cssClass":"pl-en"},{"start":36,"end":42,"cssClass":"pl-s1"}],[{"start":21,"end":23,"cssClass":"pl-k"},{"start":27,"end":33,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":44,"cssClass":"pl-c1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":48,"end":50,"cssClass":"pl-c1"},{"start":52,"end":59,"cssClass":"pl-s1"},{"start":60,"end":61,"cssClass":"pl-c1"},{"start":62,"end":75,"cssClass":"pl-c1"}],[],[{"start":24,"end":35,"cssClass":"pl-en"},{"start":36,"end":49,"cssClass":"pl-c1"}],[],[{"start":20,"end":25,"cssClass":"pl-k"},{"start":29,"end":33,"cssClass":"pl-s1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":45,"end":51,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":54,"end":58,"cssClass":"pl-c1"},{"start":60,"end":62,"cssClass":"pl-c1"},{"start":63,"end":64,"cssClass":"pl-c1"},{"start":67,"end":69,"cssClass":"pl-c1"},{"start":71,"end":92,"cssClass":"pl-en"},{"start":93,"end":94,"cssClass":"pl-c1"},{"start":94,"end":99,"cssClass":"pl-s1"},{"start":101,"end":103,"cssClass":"pl-c1"}],[],[],[{"start":11,"end":16,"cssClass":"pl-k"},{"start":19,"end":22,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":33,"end":54,"cssClass":"pl-en"},{"start":55,"end":56,"cssClass":"pl-c1"},{"start":56,"end":61,"cssClass":"pl-s1"},{"start":63,"end":65,"cssClass":"pl-c1"},{"start":75,"end":97,"cssClass":"pl-c"}],[],[{"start":6,"end":10,"cssClass":"pl-k"},{"start":11,"end":42,"cssClass":"pl-c"}],[],[{"start":10,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":17,"cssClass":"pl-c1"}],[],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":51,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":73,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":16,"cssClass":"pl-en"},{"start":17,"end":29,"cssClass":"pl-smi"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":40,"end":46,"cssClass":"pl-smi"},{"start":47,"end":52,"cssClass":"pl-s1"},{"start":54,"end":59,"cssClass":"pl-smi"},{"start":60,"end":61,"cssClass":"pl-c1"},{"start":61,"end":67,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":16,"end":20,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":11,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":35,"cssClass":"pl-c1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":72,"cssClass":"pl-c"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":26,"cssClass":"pl-c1"}],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":6,"end":7,"cssClass":"pl-c1"},{"start":8,"end":14,"cssClass":"pl-smi"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":22,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":16,"end":25,"cssClass":"pl-c1"},{"start":26,"end":31,"cssClass":"pl-s1"},{"start":33,"end":42,"cssClass":"pl-c1"}],[],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"}],[],[{"start":3,"end":7,"cssClass":"pl-k"}],[],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":29,"cssClass":"pl-en"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":59,"end":72,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":13,"end":19,"cssClass":"pl-smi"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":24,"cssClass":"pl-s1"}],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":17,"cssClass":"pl-s1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":12,"cssClass":"pl-c1"},{"start":13,"end":17,"cssClass":"pl-s1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-c1"},{"start":17,"end":21,"cssClass":"pl-s1"}],[{"start":5,"end":10,"cssClass":"pl-k"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":25,"end":37,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":45,"end":47,"cssClass":"pl-c1"},{"start":50,"end":56,"cssClass":"pl-smi"},{"start":57,"end":61,"cssClass":"pl-s1"},{"start":62,"end":64,"cssClass":"pl-c1"},{"start":65,"end":75,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":12,"cssClass":"pl-s1"}],[],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":93,"cssClass":"pl-c"}],[],[],[],[{"start":0,"end":43,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":28,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-smi"},{"start":52,"end":57,"cssClass":"pl-s1"},{"start":59,"end":65,"cssClass":"pl-smi"},{"start":66,"end":73,"cssClass":"pl-s1"},{"start":75,"end":78,"cssClass":"pl-smi"},{"start":79,"end":86,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":72,"cssClass":"pl-c"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":12,"end":18,"cssClass":"pl-smi"},{"start":19,"end":35,"cssClass":"pl-en"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":54,"cssClass":"pl-s1"},{"start":56,"end":63,"cssClass":"pl-s1"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":36,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":19,"cssClass":"pl-en"},{"start":20,"end":32,"cssClass":"pl-smi"},{"start":33,"end":34,"cssClass":"pl-c1"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":43,"end":49,"cssClass":"pl-smi"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":57,"end":63,"cssClass":"pl-smi"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":73,"end":79,"cssClass":"pl-smi"},{"start":80,"end":84,"cssClass":"pl-s1"},{"start":86,"end":89,"cssClass":"pl-smi"},{"start":90,"end":97,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":72,"cssClass":"pl-c"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":11,"end":28,"cssClass":"pl-en"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":38,"end":47,"cssClass":"pl-s1"},{"start":49,"end":56,"cssClass":"pl-s1"},{"start":58,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":53,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-smi"},{"start":52,"end":57,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":16,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":15,"cssClass":"pl-s1"},{"start":15,"end":17,"cssClass":"pl-c1"},{"start":17,"end":26,"cssClass":"pl-c1"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":34,"end":41,"cssClass":"pl-c1"}],[],[{"start":6,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":36,"cssClass":"pl-c1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":79,"cssClass":"pl-s1"},{"start":82,"end":83,"cssClass":"pl-c1"},{"start":83,"end":89,"cssClass":"pl-s1"},{"start":92,"end":105,"cssClass":"pl-c1"},{"start":108,"end":135,"cssClass":"pl-c"}],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":17,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":79,"cssClass":"pl-s1"},{"start":82,"end":83,"cssClass":"pl-c1"},{"start":83,"end":89,"cssClass":"pl-s1"},{"start":92,"end":105,"cssClass":"pl-c1"},{"start":108,"end":134,"cssClass":"pl-c"}],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":17,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":24,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":43,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":53,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":18,"cssClass":"pl-en"},{"start":19,"end":31,"cssClass":"pl-smi"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":42,"end":48,"cssClass":"pl-smi"},{"start":49,"end":54,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":16,"end":19,"cssClass":"pl-s1"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":22,"end":23,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":15,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":27,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":42,"cssClass":"pl-c1"}],[],[{"start":6,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":36,"cssClass":"pl-c1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":79,"cssClass":"pl-s1"},{"start":82,"end":83,"cssClass":"pl-c1"},{"start":83,"end":89,"cssClass":"pl-s1"},{"start":92,"end":105,"cssClass":"pl-c1"},{"start":108,"end":131,"cssClass":"pl-c"}],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":17,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":24,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"},{"start":42,"end":43,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":44,"cssClass":"pl-smi"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":53,"cssClass":"pl-s1"},{"start":55,"end":61,"cssClass":"pl-smi"},{"start":62,"end":67,"cssClass":"pl-s1"},{"start":68,"end":74,"cssClass":"pl-smi"},{"start":75,"end":76,"cssClass":"pl-c1"},{"start":76,"end":81,"cssClass":"pl-s1"},{"start":83,"end":86,"cssClass":"pl-smi"},{"start":87,"end":94,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":21,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-c1"}],[{"start":3,"end":14,"cssClass":"pl-smi"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":3,"end":19,"cssClass":"pl-en"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"}],[],[{"start":9,"end":20,"cssClass":"pl-en"},{"start":21,"end":34,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":10,"end":18,"cssClass":"pl-en"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":32,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":56,"cssClass":"pl-c1"},{"start":58,"end":64,"cssClass":"pl-k"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":74,"end":79,"cssClass":"pl-s1"},{"start":81,"end":94,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-en"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":22,"end":27,"cssClass":"pl-s1"}],[],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":49,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"},{"start":53,"end":54,"cssClass":"pl-c1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":61,"end":82,"cssClass":"pl-en"},{"start":83,"end":84,"cssClass":"pl-c1"},{"start":84,"end":89,"cssClass":"pl-s1"},{"start":91,"end":93,"cssClass":"pl-c1"},{"start":103,"end":130,"cssClass":"pl-c"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":30,"cssClass":"pl-c1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"}],[],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":59,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":23,"cssClass":"pl-en"},{"start":24,"end":36,"cssClass":"pl-smi"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":38,"end":45,"cssClass":"pl-s1"},{"start":47,"end":53,"cssClass":"pl-smi"},{"start":54,"end":59,"cssClass":"pl-s1"},{"start":61,"end":67,"cssClass":"pl-smi"},{"start":68,"end":75,"cssClass":"pl-s1"},{"start":77,"end":80,"cssClass":"pl-smi"},{"start":81,"end":88,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":13,"cssClass":"pl-smi"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":63,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":32,"cssClass":"pl-c1"},{"start":34,"end":58,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-c1"},{"start":37,"end":59,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":44,"cssClass":"pl-s1"},{"start":46,"end":60,"cssClass":"pl-c1"},{"start":62,"end":68,"cssClass":"pl-k"},{"start":69,"end":74,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":99,"cssClass":"pl-c1"}],[],[],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-en"},{"start":25,"end":37,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":49,"end":63,"cssClass":"pl-c1"},{"start":65,"end":71,"cssClass":"pl-k"},{"start":72,"end":74,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":80,"cssClass":"pl-s1"},{"start":82,"end":95,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-s1"}],[],[{"start":12,"end":23,"cssClass":"pl-en"},{"start":24,"end":37,"cssClass":"pl-c1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":40,"cssClass":"pl-en"},{"start":41,"end":48,"cssClass":"pl-s1"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":57,"end":58,"cssClass":"pl-c1"},{"start":58,"end":63,"cssClass":"pl-s1"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":40,"cssClass":"pl-c1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"}],[{"start":18,"end":29,"cssClass":"pl-en"},{"start":30,"end":43,"cssClass":"pl-c1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":47,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-k"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"}],[{"start":18,"end":20,"cssClass":"pl-k"},{"start":22,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":42,"cssClass":"pl-c1"}],[],[{"start":21,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":21,"end":23,"cssClass":"pl-k"}],[],[{"start":24,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":38,"cssClass":"pl-en"},{"start":39,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":48,"end":52,"cssClass":"pl-c1"},{"start":54,"end":59,"cssClass":"pl-s1"},{"start":61,"end":75,"cssClass":"pl-c1"},{"start":77,"end":83,"cssClass":"pl-k"},{"start":84,"end":90,"cssClass":"pl-s1"},{"start":93,"end":94,"cssClass":"pl-c1"},{"start":94,"end":100,"cssClass":"pl-s1"},{"start":102,"end":115,"cssClass":"pl-c1"}],[],[{"start":21,"end":26,"cssClass":"pl-k"},{"start":29,"end":32,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":43,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":51,"end":68,"cssClass":"pl-c1"}],[],[{"start":18,"end":22,"cssClass":"pl-k"}],[],[{"start":21,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":21,"end":23,"cssClass":"pl-k"}],[],[{"start":24,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":38,"cssClass":"pl-en"},{"start":39,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":48,"end":52,"cssClass":"pl-c1"},{"start":54,"end":59,"cssClass":"pl-s1"},{"start":61,"end":75,"cssClass":"pl-c1"},{"start":77,"end":83,"cssClass":"pl-k"},{"start":84,"end":90,"cssClass":"pl-s1"},{"start":93,"end":94,"cssClass":"pl-c1"},{"start":94,"end":100,"cssClass":"pl-s1"},{"start":102,"end":115,"cssClass":"pl-c1"}],[],[{"start":21,"end":26,"cssClass":"pl-k"},{"start":29,"end":32,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":43,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":51,"end":68,"cssClass":"pl-c1"}],[{"start":21,"end":27,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":35,"cssClass":"pl-smi"},{"start":36,"end":42,"cssClass":"pl-s1"}],[],[],[],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":54,"cssClass":"pl-c"}],[{"start":0,"end":36,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-smi"},{"start":52,"end":57,"cssClass":"pl-s1"},{"start":59,"end":65,"cssClass":"pl-smi"},{"start":66,"end":73,"cssClass":"pl-s1"},{"start":75,"end":81,"cssClass":"pl-smi"},{"start":82,"end":86,"cssClass":"pl-s1"},{"start":88,"end":91,"cssClass":"pl-smi"},{"start":92,"end":99,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":13,"cssClass":"pl-smi"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":63,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":32,"cssClass":"pl-c1"},{"start":34,"end":58,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-c1"},{"start":37,"end":59,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":44,"cssClass":"pl-s1"},{"start":46,"end":60,"cssClass":"pl-c1"},{"start":62,"end":68,"cssClass":"pl-k"},{"start":69,"end":74,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":99,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":49,"end":63,"cssClass":"pl-c1"},{"start":65,"end":71,"cssClass":"pl-k"},{"start":72,"end":76,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-c1"},{"start":80,"end":84,"cssClass":"pl-s1"},{"start":86,"end":99,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":32,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":49,"end":63,"cssClass":"pl-c1"},{"start":65,"end":71,"cssClass":"pl-k"},{"start":72,"end":74,"cssClass":"pl-s1"},{"start":77,"end":78,"cssClass":"pl-c1"},{"start":78,"end":80,"cssClass":"pl-s1"},{"start":82,"end":95,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-s1"}],[],[{"start":12,"end":23,"cssClass":"pl-en"},{"start":24,"end":37,"cssClass":"pl-c1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":40,"cssClass":"pl-en"},{"start":41,"end":48,"cssClass":"pl-s1"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":57,"end":58,"cssClass":"pl-c1"},{"start":58,"end":63,"cssClass":"pl-s1"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":40,"cssClass":"pl-c1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"}],[{"start":18,"end":29,"cssClass":"pl-en"},{"start":30,"end":43,"cssClass":"pl-c1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":47,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-k"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"}],[{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"}],[],[],[],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":44,"cssClass":"pl-smi"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":46,"end":53,"cssClass":"pl-s1"},{"start":55,"end":61,"cssClass":"pl-smi"},{"start":62,"end":71,"cssClass":"pl-s1"},{"start":72,"end":78,"cssClass":"pl-smi"},{"start":79,"end":80,"cssClass":"pl-c1"},{"start":80,"end":85,"cssClass":"pl-s1"},{"start":87,"end":90,"cssClass":"pl-smi"},{"start":91,"end":98,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":21,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":31,"cssClass":"pl-c1"}],[{"start":3,"end":14,"cssClass":"pl-smi"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":3,"end":19,"cssClass":"pl-en"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":35,"cssClass":"pl-s1"}],[{"start":3,"end":5,"cssClass":"pl-k"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"}],[],[{"start":9,"end":20,"cssClass":"pl-en"},{"start":21,"end":34,"cssClass":"pl-c1"}],[],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":10,"end":18,"cssClass":"pl-en"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":32,"cssClass":"pl-c1"},{"start":34,"end":43,"cssClass":"pl-s1"},{"start":45,"end":60,"cssClass":"pl-c1"},{"start":62,"end":68,"cssClass":"pl-k"},{"start":69,"end":70,"cssClass":"pl-c1"},{"start":70,"end":75,"cssClass":"pl-s1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":98,"cssClass":"pl-c1"}],[{"start":6,"end":7,"cssClass":"pl-c1"},{"start":7,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":20,"cssClass":"pl-en"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":22,"end":27,"cssClass":"pl-s1"}],[],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":49,"cssClass":"pl-c1"},{"start":51,"end":52,"cssClass":"pl-c1"},{"start":53,"end":54,"cssClass":"pl-c1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":61,"end":82,"cssClass":"pl-en"},{"start":83,"end":84,"cssClass":"pl-c1"},{"start":84,"end":89,"cssClass":"pl-s1"},{"start":91,"end":93,"cssClass":"pl-c1"},{"start":103,"end":130,"cssClass":"pl-c"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":30,"cssClass":"pl-c1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"}],[],[{"start":6,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":37,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":23,"cssClass":"pl-en"},{"start":24,"end":36,"cssClass":"pl-smi"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":38,"end":45,"cssClass":"pl-s1"},{"start":47,"end":53,"cssClass":"pl-smi"},{"start":54,"end":63,"cssClass":"pl-s1"},{"start":65,"end":71,"cssClass":"pl-smi"},{"start":72,"end":79,"cssClass":"pl-s1"},{"start":81,"end":84,"cssClass":"pl-smi"},{"start":85,"end":92,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":13,"cssClass":"pl-smi"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":67,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":32,"cssClass":"pl-c1"},{"start":34,"end":58,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-c1"},{"start":37,"end":59,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":13,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":35,"cssClass":"pl-c1"},{"start":37,"end":46,"cssClass":"pl-s1"},{"start":48,"end":62,"cssClass":"pl-c1"},{"start":64,"end":70,"cssClass":"pl-k"},{"start":71,"end":76,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-c1"},{"start":80,"end":85,"cssClass":"pl-s1"},{"start":87,"end":101,"cssClass":"pl-c1"}],[],[],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-en"},{"start":25,"end":37,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":16,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":34,"end":38,"cssClass":"pl-c1"},{"start":40,"end":49,"cssClass":"pl-s1"},{"start":51,"end":65,"cssClass":"pl-c1"},{"start":67,"end":73,"cssClass":"pl-k"},{"start":74,"end":76,"cssClass":"pl-s1"},{"start":79,"end":80,"cssClass":"pl-c1"},{"start":80,"end":82,"cssClass":"pl-s1"},{"start":84,"end":97,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-s1"}],[],[{"start":12,"end":23,"cssClass":"pl-en"},{"start":24,"end":37,"cssClass":"pl-c1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":40,"cssClass":"pl-en"},{"start":41,"end":48,"cssClass":"pl-s1"},{"start":50,"end":59,"cssClass":"pl-s1"},{"start":61,"end":62,"cssClass":"pl-c1"},{"start":62,"end":67,"cssClass":"pl-s1"},{"start":69,"end":76,"cssClass":"pl-s1"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":40,"cssClass":"pl-c1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"}],[{"start":18,"end":29,"cssClass":"pl-en"},{"start":30,"end":43,"cssClass":"pl-c1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":47,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-k"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"}],[{"start":18,"end":20,"cssClass":"pl-k"},{"start":22,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":42,"cssClass":"pl-c1"}],[],[{"start":21,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":21,"end":23,"cssClass":"pl-k"}],[],[{"start":24,"end":27,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":46,"end":50,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-s1"},{"start":63,"end":77,"cssClass":"pl-c1"},{"start":79,"end":85,"cssClass":"pl-k"},{"start":86,"end":92,"cssClass":"pl-s1"},{"start":95,"end":96,"cssClass":"pl-c1"},{"start":96,"end":102,"cssClass":"pl-s1"},{"start":104,"end":117,"cssClass":"pl-c1"}],[],[{"start":21,"end":26,"cssClass":"pl-k"},{"start":29,"end":32,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":43,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":51,"end":68,"cssClass":"pl-c1"}],[],[{"start":18,"end":22,"cssClass":"pl-k"}],[],[{"start":21,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[{"start":21,"end":23,"cssClass":"pl-k"}],[],[{"start":24,"end":27,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":44,"end":46,"cssClass":"pl-c1"},{"start":46,"end":50,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-s1"},{"start":63,"end":77,"cssClass":"pl-c1"},{"start":79,"end":85,"cssClass":"pl-k"},{"start":86,"end":92,"cssClass":"pl-s1"},{"start":95,"end":96,"cssClass":"pl-c1"},{"start":96,"end":102,"cssClass":"pl-s1"},{"start":104,"end":117,"cssClass":"pl-c1"}],[],[{"start":21,"end":26,"cssClass":"pl-k"},{"start":29,"end":32,"cssClass":"pl-s1"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":43,"end":46,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":51,"end":68,"cssClass":"pl-c1"}],[{"start":21,"end":27,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":35,"cssClass":"pl-smi"},{"start":36,"end":42,"cssClass":"pl-s1"}],[],[],[],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":16,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":55,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":38,"cssClass":"pl-c"}],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":19,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-smi"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-smi"},{"start":52,"end":61,"cssClass":"pl-s1"},{"start":63,"end":69,"cssClass":"pl-smi"},{"start":70,"end":77,"cssClass":"pl-s1"},{"start":79,"end":85,"cssClass":"pl-smi"},{"start":86,"end":90,"cssClass":"pl-s1"},{"start":92,"end":95,"cssClass":"pl-smi"},{"start":96,"end":103,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":13,"cssClass":"pl-smi"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":22,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":67,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":32,"cssClass":"pl-c1"},{"start":34,"end":58,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-c1"},{"start":37,"end":59,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":81,"end":82,"cssClass":"pl-c1"},{"start":82,"end":87,"cssClass":"pl-s1"},{"start":89,"end":103,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":51,"cssClass":"pl-s1"},{"start":53,"end":67,"cssClass":"pl-c1"},{"start":69,"end":75,"cssClass":"pl-k"},{"start":76,"end":80,"cssClass":"pl-s1"},{"start":83,"end":84,"cssClass":"pl-c1"},{"start":84,"end":88,"cssClass":"pl-s1"},{"start":90,"end":103,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":32,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":16,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"}],[{"start":9,"end":11,"cssClass":"pl-s1"},{"start":12,"end":14,"cssClass":"pl-c1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-c1"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":16,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-en"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":40,"cssClass":"pl-c1"},{"start":42,"end":51,"cssClass":"pl-s1"},{"start":53,"end":67,"cssClass":"pl-c1"},{"start":69,"end":75,"cssClass":"pl-k"},{"start":76,"end":78,"cssClass":"pl-s1"},{"start":81,"end":82,"cssClass":"pl-c1"},{"start":82,"end":84,"cssClass":"pl-s1"},{"start":86,"end":99,"cssClass":"pl-c1"}],[],[{"start":9,"end":14,"cssClass":"pl-k"},{"start":17,"end":20,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"},{"start":39,"end":56,"cssClass":"pl-c1"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":16,"cssClass":"pl-s1"}],[],[{"start":12,"end":23,"cssClass":"pl-en"},{"start":24,"end":37,"cssClass":"pl-c1"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":40,"end":41,"cssClass":"pl-c1"}],[{"start":12,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":26,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":16,"end":40,"cssClass":"pl-en"},{"start":41,"end":48,"cssClass":"pl-s1"},{"start":50,"end":59,"cssClass":"pl-s1"},{"start":61,"end":62,"cssClass":"pl-c1"},{"start":62,"end":67,"cssClass":"pl-s1"},{"start":69,"end":76,"cssClass":"pl-s1"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":40,"cssClass":"pl-c1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"}],[{"start":18,"end":29,"cssClass":"pl-en"},{"start":30,"end":43,"cssClass":"pl-c1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":47,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-k"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"}],[{"start":18,"end":22,"cssClass":"pl-s1"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":25,"end":26,"cssClass":"pl-c1"}],[],[],[],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":27,"end":29,"cssClass":"pl-c1"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":43,"cssClass":"pl-c"}],[{"start":0,"end":47,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":40,"cssClass":"pl-c"}],[{"start":0,"end":56,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":20,"cssClass":"pl-en"},{"start":21,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":42,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-smi"},{"start":51,"end":56,"cssClass":"pl-s1"},{"start":58,"end":64,"cssClass":"pl-smi"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":19,"cssClass":"pl-s1"},{"start":21,"end":26,"cssClass":"pl-s1"}],[{"start":3,"end":13,"cssClass":"pl-smi"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[],[{"start":3,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":38,"end":72,"cssClass":"pl-c"}],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":73,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":32,"cssClass":"pl-c1"},{"start":34,"end":58,"cssClass":"pl-c"}],[],[{"start":9,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":22,"cssClass":"pl-en"},{"start":23,"end":34,"cssClass":"pl-c1"},{"start":37,"end":59,"cssClass":"pl-c"}],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":78,"cssClass":"pl-s1"},{"start":81,"end":82,"cssClass":"pl-c1"},{"start":82,"end":87,"cssClass":"pl-s1"},{"start":89,"end":103,"cssClass":"pl-c1"}],[],[{"start":6,"end":8,"cssClass":"pl-s1"},{"start":9,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":34,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-s1"},{"start":9,"end":13,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"}],[{"start":6,"end":8,"cssClass":"pl-s1"},{"start":9,"end":11,"cssClass":"pl-c1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":22,"cssClass":"pl-c1"}],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":9,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-en"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":37,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-s1"},{"start":50,"end":64,"cssClass":"pl-c1"},{"start":66,"end":72,"cssClass":"pl-k"},{"start":73,"end":75,"cssClass":"pl-s1"},{"start":78,"end":79,"cssClass":"pl-c1"},{"start":79,"end":81,"cssClass":"pl-s1"},{"start":83,"end":96,"cssClass":"pl-c1"}],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":17,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":53,"cssClass":"pl-c1"}],[],[],[],[{"start":0,"end":43,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":74,"cssClass":"pl-c"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":28,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":22,"cssClass":"pl-en"},{"start":23,"end":35,"cssClass":"pl-smi"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":52,"cssClass":"pl-smi"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":63,"cssClass":"pl-smi"},{"start":64,"end":71,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":15,"cssClass":"pl-s1"},{"start":17,"end":26,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":19,"cssClass":"pl-c1"}],[],[{"start":3,"end":12,"cssClass":"pl-s1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":33,"cssClass":"pl-c1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":7,"cssClass":"pl-s1"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":11,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-s1"},{"start":9,"end":10,"cssClass":"pl-c1"},{"start":11,"end":17,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":41,"end":50,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":53,"end":58,"cssClass":"pl-s1"},{"start":60,"end":67,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"}],[],[{"start":10,"end":13,"cssClass":"pl-s1"},{"start":14,"end":15,"cssClass":"pl-c1"},{"start":16,"end":24,"cssClass":"pl-en"},{"start":25,"end":32,"cssClass":"pl-s1"},{"start":32,"end":34,"cssClass":"pl-c1"},{"start":34,"end":38,"cssClass":"pl-c1"},{"start":40,"end":49,"cssClass":"pl-s1"},{"start":51,"end":65,"cssClass":"pl-c1"},{"start":67,"end":73,"cssClass":"pl-k"},{"start":74,"end":78,"cssClass":"pl-s1"},{"start":81,"end":82,"cssClass":"pl-c1"},{"start":82,"end":86,"cssClass":"pl-s1"},{"start":88,"end":101,"cssClass":"pl-c1"}],[],[{"start":6,"end":11,"cssClass":"pl-k"},{"start":14,"end":17,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":28,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":53,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":52,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":60,"cssClass":"pl-c"}],[{"start":0,"end":60,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":11,"cssClass":"pl-smi"},{"start":12,"end":25,"cssClass":"pl-en"},{"start":26,"end":38,"cssClass":"pl-smi"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":40,"end":47,"cssClass":"pl-s1"},{"start":49,"end":54,"cssClass":"pl-smi"},{"start":55,"end":58,"cssClass":"pl-s1"},{"start":60,"end":64,"cssClass":"pl-smi"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":66,"end":70,"cssClass":"pl-s1"},{"start":72,"end":78,"cssClass":"pl-smi"},{"start":79,"end":85,"cssClass":"pl-s1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":43,"cssClass":"pl-c1"}],[],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":28,"cssClass":"pl-c1"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":38,"end":46,"cssClass":"pl-c1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":48,"end":54,"cssClass":"pl-c1"},{"start":56,"end":57,"cssClass":"pl-c1"},{"start":58,"end":61,"cssClass":"pl-s1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":29,"cssClass":"pl-c1"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":47,"cssClass":"pl-c1"},{"start":47,"end":49,"cssClass":"pl-c1"},{"start":49,"end":55,"cssClass":"pl-c1"},{"start":57,"end":58,"cssClass":"pl-c1"},{"start":59,"end":63,"cssClass":"pl-s1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-c1"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":49,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":51,"end":57,"cssClass":"pl-c1"},{"start":59,"end":60,"cssClass":"pl-c1"},{"start":61,"end":67,"cssClass":"pl-s1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"}],[],[],[],[{"start":0,"end":52,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":48,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":10,"cssClass":"pl-smi"},{"start":11,"end":24,"cssClass":"pl-en"},{"start":25,"end":37,"cssClass":"pl-smi"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":39,"end":46,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"},{"start":14,"end":16,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":43,"end":51,"cssClass":"pl-c1"},{"start":51,"end":53,"cssClass":"pl-c1"},{"start":53,"end":59,"cssClass":"pl-c1"}],[],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":30,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":32,"end":38,"cssClass":"pl-c1"}],[{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":23,"cssClass":"pl-c1"},{"start":23,"end":25,"cssClass":"pl-c1"},{"start":25,"end":31,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-c1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":35,"cssClass":"pl-c"}],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":57,"cssClass":"pl-c"}],[{"start":0,"end":67,"cssClass":"pl-c"}],[{"start":0,"end":65,"cssClass":"pl-c"}],[{"start":0,"end":70,"cssClass":"pl-c"}],[{"start":0,"end":70,"cssClass":"pl-c"}],[{"start":0,"end":61,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":30,"cssClass":"pl-en"},{"start":31,"end":43,"cssClass":"pl-smi"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":45,"end":52,"cssClass":"pl-s1"},{"start":54,"end":59,"cssClass":"pl-smi"},{"start":60,"end":65,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":12,"cssClass":"pl-s1"},{"start":14,"end":16,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":13,"cssClass":"pl-s1"},{"start":15,"end":24,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":12,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":8,"end":9,"cssClass":"pl-c1"},{"start":10,"end":14,"cssClass":"pl-s1"}],[{"start":3,"end":10,"cssClass":"pl-smi"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":28,"cssClass":"pl-c1"}],[],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":10,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":24,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":37,"cssClass":"pl-c1"}],[],[{"start":6,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":30,"cssClass":"pl-c1"},{"start":31,"end":36,"cssClass":"pl-s1"},{"start":38,"end":44,"cssClass":"pl-c1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":56,"end":65,"cssClass":"pl-c1"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":73,"end":79,"cssClass":"pl-c1"}],[{"start":3,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":30,"cssClass":"pl-c1"},{"start":31,"end":36,"cssClass":"pl-s1"},{"start":38,"end":50,"cssClass":"pl-c1"}],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":7,"end":13,"cssClass":"pl-s1"}],[],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":15,"cssClass":"pl-s1"}],[],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"}],[{"start":9,"end":16,"cssClass":"pl-s1"},{"start":16,"end":18,"cssClass":"pl-c1"},{"start":18,"end":26,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":34,"cssClass":"pl-c1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"}],[],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[{"start":6,"end":47,"cssClass":"pl-c"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":17,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":19,"end":28,"cssClass":"pl-c1"},{"start":29,"end":34,"cssClass":"pl-s1"},{"start":36,"end":44,"cssClass":"pl-c1"}],[],[{"start":9,"end":47,"cssClass":"pl-c"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":30,"cssClass":"pl-c1"},{"start":31,"end":36,"cssClass":"pl-s1"},{"start":38,"end":44,"cssClass":"pl-c1"}],[],[{"start":12,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":38,"end":47,"cssClass":"pl-c1"},{"start":48,"end":53,"cssClass":"pl-s1"},{"start":55,"end":63,"cssClass":"pl-c1"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":37,"cssClass":"pl-c1"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-c1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":53,"cssClass":"pl-c1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":40,"cssClass":"pl-c1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":54,"cssClass":"pl-c1"}],[{"start":12,"end":44,"cssClass":"pl-c"}],[{"start":12,"end":14,"cssClass":"pl-k"}],[],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":18,"end":32,"cssClass":"pl-s1"},{"start":33,"end":35,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":54,"cssClass":"pl-c1"},{"start":55,"end":60,"cssClass":"pl-s1"},{"start":62,"end":70,"cssClass":"pl-c1"}],[],[{"start":18,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-c1"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":65,"cssClass":"pl-c1"},{"start":66,"end":80,"cssClass":"pl-s1"},{"start":80,"end":82,"cssClass":"pl-c1"},{"start":84,"end":85,"cssClass":"pl-c1"},{"start":86,"end":93,"cssClass":"pl-s1"},{"start":93,"end":95,"cssClass":"pl-c1"},{"start":95,"end":104,"cssClass":"pl-c1"},{"start":105,"end":110,"cssClass":"pl-s1"},{"start":112,"end":119,"cssClass":"pl-c1"}],[],[{"start":15,"end":19,"cssClass":"pl-k"}],[],[{"start":18,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":48,"cssClass":"pl-c1"},{"start":49,"end":54,"cssClass":"pl-s1"},{"start":56,"end":65,"cssClass":"pl-c1"},{"start":66,"end":80,"cssClass":"pl-s1"},{"start":80,"end":82,"cssClass":"pl-c1"}],[],[{"start":15,"end":34,"cssClass":"pl-c"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":33,"cssClass":"pl-en"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":43,"end":47,"cssClass":"pl-c1"}],[{"start":15,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":27,"cssClass":"pl-en"},{"start":28,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":27,"cssClass":"pl-en"},{"start":28,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":32,"cssClass":"pl-en"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":42,"end":46,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":59,"end":63,"cssClass":"pl-c1"},{"start":63,"end":65,"cssClass":"pl-c1"},{"start":65,"end":70,"cssClass":"pl-c1"},{"start":71,"end":74,"cssClass":"pl-s1"},{"start":78,"end":88,"cssClass":"pl-c1"},{"start":90,"end":93,"cssClass":"pl-s1"},{"start":95,"end":97,"cssClass":"pl-s1"},{"start":99,"end":101,"cssClass":"pl-s1"},{"start":103,"end":112,"cssClass":"pl-s1"},{"start":114,"end":118,"cssClass":"pl-s1"}],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":18,"end":23,"cssClass":"pl-s1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":42,"cssClass":"pl-s1"}],[{"start":18,"end":48,"cssClass":"pl-c"}],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":31,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":49,"cssClass":"pl-en"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":59,"end":63,"cssClass":"pl-c1"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":67,"end":74,"cssClass":"pl-s1"},{"start":74,"end":76,"cssClass":"pl-c1"},{"start":76,"end":80,"cssClass":"pl-c1"},{"start":80,"end":82,"cssClass":"pl-c1"},{"start":82,"end":87,"cssClass":"pl-c1"},{"start":88,"end":91,"cssClass":"pl-s1"},{"start":95,"end":106,"cssClass":"pl-c1"},{"start":108,"end":111,"cssClass":"pl-s1"}],[{"start":43,"end":50,"cssClass":"pl-s1"},{"start":50,"end":52,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-c1"},{"start":62,"end":69,"cssClass":"pl-s1"},{"start":69,"end":71,"cssClass":"pl-c1"},{"start":71,"end":80,"cssClass":"pl-c1"},{"start":81,"end":86,"cssClass":"pl-s1"},{"start":88,"end":94,"cssClass":"pl-c1"},{"start":96,"end":105,"cssClass":"pl-c1"}],[{"start":43,"end":60,"cssClass":"pl-c1"},{"start":62,"end":68,"cssClass":"pl-k"},{"start":69,"end":74,"cssClass":"pl-s1"},{"start":77,"end":84,"cssClass":"pl-s1"},{"start":84,"end":86,"cssClass":"pl-c1"},{"start":86,"end":92,"cssClass":"pl-c1"}],[{"start":18,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[],[{"start":15,"end":31,"cssClass":"pl-c"}],[{"start":15,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":47,"end":50,"cssClass":"pl-s1"}],[{"start":15,"end":57,"cssClass":"pl-c"}],[{"start":15,"end":28,"cssClass":"pl-en"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":38,"end":41,"cssClass":"pl-s1"},{"start":43,"end":47,"cssClass":"pl-s1"},{"start":49,"end":58,"cssClass":"pl-s1"}],[{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":25,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":25,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":19,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":23,"end":32,"cssClass":"pl-s1"}],[{"start":14,"end":19,"cssClass":"pl-k"},{"start":21,"end":27,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":32,"end":46,"cssClass":"pl-s1"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":49,"end":56,"cssClass":"pl-s1"},{"start":56,"end":58,"cssClass":"pl-c1"},{"start":58,"end":67,"cssClass":"pl-c1"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":75,"end":84,"cssClass":"pl-c1"}],[],[{"start":9,"end":48,"cssClass":"pl-c"}],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":30,"cssClass":"pl-c1"},{"start":31,"end":36,"cssClass":"pl-s1"},{"start":38,"end":44,"cssClass":"pl-c1"}],[],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":37,"cssClass":"pl-c1"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":45,"end":52,"cssClass":"pl-c1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":53,"cssClass":"pl-c1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-c1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":59,"cssClass":"pl-c1"}],[{"start":12,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"}],[{"start":12,"end":44,"cssClass":"pl-c"}],[{"start":12,"end":14,"cssClass":"pl-k"}],[],[{"start":15,"end":24,"cssClass":"pl-s1"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":27,"end":34,"cssClass":"pl-s1"},{"start":34,"end":36,"cssClass":"pl-c1"},{"start":36,"end":45,"cssClass":"pl-c1"},{"start":46,"end":51,"cssClass":"pl-s1"},{"start":53,"end":62,"cssClass":"pl-c1"},{"start":63,"end":77,"cssClass":"pl-s1"},{"start":77,"end":79,"cssClass":"pl-c1"}],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":19,"end":25,"cssClass":"pl-s1"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":28,"end":37,"cssClass":"pl-s1"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":41,"end":42,"cssClass":"pl-c1"}],[],[{"start":18,"end":27,"cssClass":"pl-s1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":36,"cssClass":"pl-s1"}],[],[{"start":15,"end":34,"cssClass":"pl-c"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":33,"cssClass":"pl-en"},{"start":34,"end":41,"cssClass":"pl-s1"},{"start":41,"end":43,"cssClass":"pl-c1"},{"start":43,"end":47,"cssClass":"pl-c1"}],[{"start":15,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":27,"cssClass":"pl-en"},{"start":28,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":17,"cssClass":"pl-s1"},{"start":18,"end":19,"cssClass":"pl-c1"},{"start":20,"end":27,"cssClass":"pl-en"},{"start":28,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":32,"cssClass":"pl-en"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":42,"end":46,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-c1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":59,"end":63,"cssClass":"pl-c1"},{"start":63,"end":65,"cssClass":"pl-c1"},{"start":65,"end":70,"cssClass":"pl-c1"},{"start":71,"end":74,"cssClass":"pl-s1"},{"start":78,"end":88,"cssClass":"pl-c1"},{"start":90,"end":93,"cssClass":"pl-s1"},{"start":95,"end":97,"cssClass":"pl-s1"},{"start":99,"end":101,"cssClass":"pl-s1"},{"start":103,"end":112,"cssClass":"pl-s1"},{"start":114,"end":118,"cssClass":"pl-s1"}],[{"start":15,"end":17,"cssClass":"pl-k"},{"start":18,"end":23,"cssClass":"pl-s1"}],[],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":30,"cssClass":"pl-c1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":42,"cssClass":"pl-s1"}],[{"start":18,"end":48,"cssClass":"pl-c"}],[{"start":18,"end":25,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":27,"end":31,"cssClass":"pl-c1"},{"start":32,"end":33,"cssClass":"pl-c1"},{"start":34,"end":49,"cssClass":"pl-en"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":57,"end":59,"cssClass":"pl-c1"},{"start":59,"end":63,"cssClass":"pl-c1"},{"start":65,"end":66,"cssClass":"pl-c1"},{"start":67,"end":74,"cssClass":"pl-s1"},{"start":74,"end":76,"cssClass":"pl-c1"},{"start":76,"end":80,"cssClass":"pl-c1"},{"start":80,"end":82,"cssClass":"pl-c1"},{"start":82,"end":87,"cssClass":"pl-c1"},{"start":88,"end":91,"cssClass":"pl-s1"},{"start":95,"end":106,"cssClass":"pl-c1"},{"start":108,"end":111,"cssClass":"pl-s1"}],[{"start":43,"end":50,"cssClass":"pl-s1"},{"start":50,"end":52,"cssClass":"pl-c1"},{"start":52,"end":61,"cssClass":"pl-c1"},{"start":62,"end":69,"cssClass":"pl-s1"},{"start":69,"end":71,"cssClass":"pl-c1"},{"start":71,"end":80,"cssClass":"pl-c1"},{"start":81,"end":86,"cssClass":"pl-s1"},{"start":88,"end":94,"cssClass":"pl-c1"},{"start":96,"end":105,"cssClass":"pl-c1"}],[{"start":43,"end":60,"cssClass":"pl-c1"},{"start":62,"end":68,"cssClass":"pl-k"},{"start":69,"end":74,"cssClass":"pl-s1"},{"start":77,"end":84,"cssClass":"pl-s1"},{"start":84,"end":86,"cssClass":"pl-c1"},{"start":86,"end":92,"cssClass":"pl-c1"}],[{"start":18,"end":23,"cssClass":"pl-s1"},{"start":24,"end":25,"cssClass":"pl-c1"}],[],[{"start":15,"end":31,"cssClass":"pl-c"}],[{"start":15,"end":31,"cssClass":"pl-en"},{"start":32,"end":39,"cssClass":"pl-s1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":47,"end":50,"cssClass":"pl-s1"}],[{"start":15,"end":57,"cssClass":"pl-c"}],[{"start":15,"end":28,"cssClass":"pl-en"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":38,"end":41,"cssClass":"pl-s1"},{"start":43,"end":47,"cssClass":"pl-s1"},{"start":49,"end":58,"cssClass":"pl-s1"}],[{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":25,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":21,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":25,"end":34,"cssClass":"pl-s1"}],[{"start":15,"end":19,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":23,"end":32,"cssClass":"pl-s1"}],[{"start":14,"end":19,"cssClass":"pl-k"},{"start":21,"end":27,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":32,"end":46,"cssClass":"pl-s1"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":49,"end":56,"cssClass":"pl-s1"},{"start":56,"end":58,"cssClass":"pl-c1"},{"start":58,"end":67,"cssClass":"pl-c1"},{"start":68,"end":73,"cssClass":"pl-s1"},{"start":75,"end":84,"cssClass":"pl-c1"}],[],[],[{"start":6,"end":27,"cssClass":"pl-c"}],[{"start":6,"end":10,"cssClass":"pl-k"}],[],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":31,"cssClass":"pl-c1"},{"start":32,"end":37,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-c1"}],[],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":37,"cssClass":"pl-c1"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":45,"end":52,"cssClass":"pl-c1"}],[],[{"start":9,"end":13,"cssClass":"pl-k"}],[],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":26,"cssClass":"pl-s1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":37,"cssClass":"pl-c1"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":45,"end":51,"cssClass":"pl-c1"}],[],[{"start":9,"end":41,"cssClass":"pl-c"}],[{"start":9,"end":11,"cssClass":"pl-k"}],[],[{"start":12,"end":21,"cssClass":"pl-s1"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":24,"end":31,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-c1"},{"start":33,"end":42,"cssClass":"pl-c1"},{"start":43,"end":48,"cssClass":"pl-s1"},{"start":50,"end":59,"cssClass":"pl-c1"},{"start":60,"end":74,"cssClass":"pl-s1"},{"start":74,"end":76,"cssClass":"pl-c1"}],[{"start":12,"end":31,"cssClass":"pl-c"}],[{"start":12,"end":15,"cssClass":"pl-s1"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":18,"end":30,"cssClass":"pl-en"},{"start":31,"end":38,"cssClass":"pl-s1"},{"start":38,"end":40,"cssClass":"pl-c1"},{"start":40,"end":44,"cssClass":"pl-c1"}],[{"start":12,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-en"},{"start":25,"end":31,"cssClass":"pl-s1"}],[{"start":12,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-en"},{"start":25,"end":31,"cssClass":"pl-s1"}],[{"start":12,"end":29,"cssClass":"pl-en"},{"start":30,"end":37,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-c1"},{"start":39,"end":43,"cssClass":"pl-c1"},{"start":45,"end":46,"cssClass":"pl-c1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":56,"end":60,"cssClass":"pl-c1"},{"start":60,"end":62,"cssClass":"pl-c1"},{"start":62,"end":67,"cssClass":"pl-c1"},{"start":68,"end":71,"cssClass":"pl-s1"},{"start":75,"end":85,"cssClass":"pl-c1"},{"start":87,"end":90,"cssClass":"pl-s1"},{"start":92,"end":94,"cssClass":"pl-s1"},{"start":96,"end":98,"cssClass":"pl-s1"},{"start":100,"end":109,"cssClass":"pl-s1"},{"start":111,"end":115,"cssClass":"pl-s1"}],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":27,"cssClass":"pl-c1"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":30,"end":39,"cssClass":"pl-s1"}],[{"start":15,"end":45,"cssClass":"pl-c"}],[{"start":15,"end":22,"cssClass":"pl-s1"},{"start":22,"end":24,"cssClass":"pl-c1"},{"start":24,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":31,"end":46,"cssClass":"pl-en"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":54,"end":56,"cssClass":"pl-c1"},{"start":56,"end":60,"cssClass":"pl-c1"},{"start":62,"end":63,"cssClass":"pl-c1"},{"start":64,"end":71,"cssClass":"pl-s1"},{"start":71,"end":73,"cssClass":"pl-c1"},{"start":73,"end":77,"cssClass":"pl-c1"},{"start":77,"end":79,"cssClass":"pl-c1"},{"start":79,"end":84,"cssClass":"pl-c1"},{"start":85,"end":88,"cssClass":"pl-s1"},{"start":92,"end":103,"cssClass":"pl-c1"},{"start":105,"end":108,"cssClass":"pl-s1"}],[{"start":40,"end":47,"cssClass":"pl-s1"},{"start":47,"end":49,"cssClass":"pl-c1"},{"start":49,"end":58,"cssClass":"pl-c1"},{"start":59,"end":66,"cssClass":"pl-s1"},{"start":66,"end":68,"cssClass":"pl-c1"},{"start":68,"end":77,"cssClass":"pl-c1"},{"start":78,"end":83,"cssClass":"pl-s1"},{"start":85,"end":91,"cssClass":"pl-c1"},{"start":93,"end":102,"cssClass":"pl-c1"}],[{"start":40,"end":57,"cssClass":"pl-c1"},{"start":59,"end":65,"cssClass":"pl-k"},{"start":66,"end":71,"cssClass":"pl-s1"},{"start":74,"end":81,"cssClass":"pl-s1"},{"start":81,"end":83,"cssClass":"pl-c1"},{"start":83,"end":89,"cssClass":"pl-c1"}],[{"start":15,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"}],[],[{"start":12,"end":28,"cssClass":"pl-c"}],[{"start":12,"end":28,"cssClass":"pl-en"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":38,"end":42,"cssClass":"pl-c1"},{"start":44,"end":47,"cssClass":"pl-s1"}],[{"start":12,"end":54,"cssClass":"pl-c"}],[{"start":12,"end":25,"cssClass":"pl-en"},{"start":26,"end":33,"cssClass":"pl-s1"},{"start":35,"end":38,"cssClass":"pl-s1"},{"start":40,"end":44,"cssClass":"pl-s1"},{"start":46,"end":55,"cssClass":"pl-s1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":31,"cssClass":"pl-s1"}],[{"start":12,"end":18,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":31,"cssClass":"pl-s1"}],[{"start":12,"end":16,"cssClass":"pl-s1"},{"start":17,"end":19,"cssClass":"pl-c1"},{"start":20,"end":29,"cssClass":"pl-s1"}],[{"start":11,"end":16,"cssClass":"pl-k"},{"start":18,"end":24,"cssClass":"pl-s1"},{"start":25,"end":27,"cssClass":"pl-c1"},{"start":29,"end":43,"cssClass":"pl-s1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":46,"end":53,"cssClass":"pl-s1"},{"start":53,"end":55,"cssClass":"pl-c1"},{"start":55,"end":64,"cssClass":"pl-c1"},{"start":65,"end":70,"cssClass":"pl-s1"},{"start":72,"end":81,"cssClass":"pl-c1"}],[],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":36,"cssClass":"pl-c"}],[{"start":0,"end":42,"cssClass":"pl-c"}],[{"start":0,"end":83,"cssClass":"pl-c"}],[{"start":0,"end":86,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":44,"cssClass":"pl-c"}],[{"start":0,"end":46,"cssClass":"pl-c"}],[{"start":0,"end":24,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-c"}],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":33,"cssClass":"pl-en"},{"start":34,"end":46,"cssClass":"pl-smi"},{"start":47,"end":48,"cssClass":"pl-c1"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":62,"cssClass":"pl-smi"},{"start":63,"end":68,"cssClass":"pl-s1"},{"start":70,"end":73,"cssClass":"pl-smi"},{"start":74,"end":81,"cssClass":"pl-s1"}],[],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":12,"end":15,"cssClass":"pl-s1"}],[{"start":3,"end":6,"cssClass":"pl-smi"},{"start":7,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":16,"end":20,"cssClass":"pl-s1"}],[{"start":3,"end":9,"cssClass":"pl-smi"},{"start":10,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":20,"cssClass":"pl-c1"}],[{"start":3,"end":8,"cssClass":"pl-smi"},{"start":9,"end":18,"cssClass":"pl-s1"}],[{"start":3,"end":10,"cssClass":"pl-smi"},{"start":11,"end":16,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[],[{"start":3,"end":5,"cssClass":"pl-k"},{"start":6,"end":13,"cssClass":"pl-s1"},{"start":13,"end":15,"cssClass":"pl-c1"},{"start":15,"end":24,"cssClass":"pl-c1"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":37,"cssClass":"pl-c1"}],[],[{"start":6,"end":11,"cssClass":"pl-s1"},{"start":12,"end":13,"cssClass":"pl-c1"}],[],[{"start":3,"end":24,"cssClass":"pl-c"}],[{"start":3,"end":6,"cssClass":"pl-s1"},{"start":7,"end":8,"cssClass":"pl-c1"},{"start":9,"end":22,"cssClass":"pl-en"},{"start":23,"end":30,"cssClass":"pl-s1"}],[{"start":3,"end":47,"cssClass":"pl-c"}],[{"start":3,"end":8,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"},{"start":17,"end":18,"cssClass":"pl-c1"}],[],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":19,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":21,"end":29,"cssClass":"pl-c1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":34,"cssClass":"pl-c1"},{"start":35,"end":38,"cssClass":"pl-s1"}],[{"start":6,"end":10,"cssClass":"pl-s1"},{"start":11,"end":12,"cssClass":"pl-c1"},{"start":13,"end":28,"cssClass":"pl-en"},{"start":29,"end":36,"cssClass":"pl-s1"},{"start":36,"end":38,"cssClass":"pl-c1"},{"start":38,"end":42,"cssClass":"pl-c1"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":51,"end":53,"cssClass":"pl-c1"},{"start":53,"end":61,"cssClass":"pl-c1"},{"start":61,"end":63,"cssClass":"pl-c1"},{"start":63,"end":66,"cssClass":"pl-c1"},{"start":67,"end":70,"cssClass":"pl-s1"},{"start":73,"end":80,"cssClass":"pl-s1"}],[{"start":6,"end":49,"cssClass":"pl-c"}],[{"start":6,"end":8,"cssClass":"pl-k"},{"start":10,"end":14,"cssClass":"pl-s1"},{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":27,"cssClass":"pl-c1"}],[],[{"start":9,"end":11,"cssClass":"pl-k"},{"start":13,"end":20,"cssClass":"pl-s1"},{"start":20,"end":22,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-c1"},{"start":26,"end":28,"cssClass":"pl-c1"},{"start":28,"end":33,"cssClass":"pl-c1"},{"start":34,"end":37,"cssClass":"pl-s1"},{"start":39,"end":51,"cssClass":"pl-c1"},{"start":52,"end":54,"cssClass":"pl-c1"},{"start":54,"end":64,"cssClass":"pl-c1"},{"start":66,"end":68,"cssClass":"pl-c1"},{"start":70,"end":77,"cssClass":"pl-s1"},{"start":77,"end":79,"cssClass":"pl-c1"},{"start":79,"end":83,"cssClass":"pl-c1"},{"start":83,"end":85,"cssClass":"pl-c1"},{"start":85,"end":90,"cssClass":"pl-c1"},{"start":91,"end":94,"cssClass":"pl-s1"},{"start":96,"end":108,"cssClass":"pl-c1"},{"start":109,"end":111,"cssClass":"pl-c1"},{"start":111,"end":121,"cssClass":"pl-c1"}],[],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":54,"end":61,"cssClass":"pl-s1"},{"start":61,"end":63,"cssClass":"pl-c1"},{"start":63,"end":67,"cssClass":"pl-c1"},{"start":67,"end":69,"cssClass":"pl-c1"},{"start":69,"end":74,"cssClass":"pl-c1"},{"start":75,"end":78,"cssClass":"pl-s1"},{"start":80,"end":93,"cssClass":"pl-c1"},{"start":97,"end":104,"cssClass":"pl-s1"},{"start":104,"end":106,"cssClass":"pl-c1"},{"start":106,"end":109,"cssClass":"pl-c1"}],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":29,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":42,"end":46,"cssClass":"pl-c1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":48,"end":53,"cssClass":"pl-c1"},{"start":54,"end":57,"cssClass":"pl-s1"},{"start":59,"end":72,"cssClass":"pl-c1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":75,"end":82,"cssClass":"pl-s1"},{"start":82,"end":84,"cssClass":"pl-c1"},{"start":84,"end":87,"cssClass":"pl-c1"},{"start":91,"end":101,"cssClass":"pl-c1"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-en"},{"start":27,"end":33,"cssClass":"pl-s1"}],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":32,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":49,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":51,"end":56,"cssClass":"pl-c1"},{"start":57,"end":60,"cssClass":"pl-s1"},{"start":62,"end":69,"cssClass":"pl-s1"},{"start":69,"end":71,"cssClass":"pl-c1"},{"start":71,"end":75,"cssClass":"pl-c1"},{"start":79,"end":85,"cssClass":"pl-k"},{"start":86,"end":95,"cssClass":"pl-s1"}],[{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":32,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":42,"cssClass":"pl-en"},{"start":43,"end":52,"cssClass":"pl-s1"}],[{"start":15,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"}],[],[{"start":12,"end":16,"cssClass":"pl-k"}],[],[{"start":15,"end":64,"cssClass":"pl-c"}],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":29,"cssClass":"pl-s1"},{"start":29,"end":31,"cssClass":"pl-c1"},{"start":31,"end":39,"cssClass":"pl-c1"},{"start":39,"end":41,"cssClass":"pl-c1"},{"start":41,"end":45,"cssClass":"pl-c1"},{"start":46,"end":49,"cssClass":"pl-s1"},{"start":52,"end":53,"cssClass":"pl-c1"},{"start":54,"end":61,"cssClass":"pl-s1"},{"start":61,"end":63,"cssClass":"pl-c1"},{"start":63,"end":67,"cssClass":"pl-c1"},{"start":67,"end":69,"cssClass":"pl-c1"},{"start":69,"end":74,"cssClass":"pl-c1"},{"start":75,"end":78,"cssClass":"pl-s1"},{"start":80,"end":93,"cssClass":"pl-c1"},{"start":97,"end":104,"cssClass":"pl-s1"},{"start":104,"end":106,"cssClass":"pl-c1"},{"start":106,"end":114,"cssClass":"pl-c1"},{"start":114,"end":116,"cssClass":"pl-c1"},{"start":116,"end":122,"cssClass":"pl-c1"},{"start":123,"end":126,"cssClass":"pl-s1"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-s1"}],[],[],[{"start":9,"end":13,"cssClass":"pl-k"},{"start":14,"end":16,"cssClass":"pl-k"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":30,"cssClass":"pl-c1"},{"start":30,"end":32,"cssClass":"pl-c1"},{"start":32,"end":37,"cssClass":"pl-c1"},{"start":38,"end":41,"cssClass":"pl-s1"},{"start":43,"end":55,"cssClass":"pl-c1"},{"start":56,"end":58,"cssClass":"pl-c1"},{"start":58,"end":68,"cssClass":"pl-c1"}],[],[{"start":12,"end":14,"cssClass":"pl-k"},{"start":15,"end":20,"cssClass":"pl-s1"}],[],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":29,"cssClass":"pl-s1"},{"start":31,"end":32,"cssClass":"pl-c1"},{"start":33,"end":40,"cssClass":"pl-s1"},{"start":40,"end":42,"cssClass":"pl-c1"},{"start":42,"end":46,"cssClass":"pl-c1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":48,"end":53,"cssClass":"pl-c1"},{"start":54,"end":57,"cssClass":"pl-s1"},{"start":59,"end":72,"cssClass":"pl-c1"},{"start":73,"end":74,"cssClass":"pl-c1"},{"start":75,"end":82,"cssClass":"pl-s1"},{"start":82,"end":84,"cssClass":"pl-c1"},{"start":84,"end":87,"cssClass":"pl-c1"},{"start":91,"end":101,"cssClass":"pl-c1"}],[{"start":15,"end":87,"cssClass":"pl-c"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":21,"end":26,"cssClass":"pl-en"},{"start":27,"end":33,"cssClass":"pl-s1"},{"start":35,"end":36,"cssClass":"pl-c1"},{"start":37,"end":38,"cssClass":"pl-c1"}],[{"start":15,"end":21,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":32,"cssClass":"pl-s1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":43,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-c1"},{"start":45,"end":49,"cssClass":"pl-c1"},{"start":49,"end":51,"cssClass":"pl-c1"},{"start":51,"end":56,"cssClass":"pl-c1"},{"start":57,"end":60,"cssClass":"pl-s1"},{"start":62,"end":69,"cssClass":"pl-s1"},{"start":69,"end":71,"cssClass":"pl-c1"},{"start":71,"end":75,"cssClass":"pl-c1"},{"start":79,"end":85,"cssClass":"pl-k"},{"start":86,"end":95,"cssClass":"pl-s1"}],[{"start":15,"end":16,"cssClass":"pl-c1"},{"start":17,"end":24,"cssClass":"pl-s1"},{"start":24,"end":26,"cssClass":"pl-c1"},{"start":26,"end":32,"cssClass":"pl-c1"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":36,"end":42,"cssClass":"pl-en"},{"start":43,"end":52,"cssClass":"pl-s1"}],[{"start":15,"end":20,"cssClass":"pl-s1"},{"start":21,"end":22,"cssClass":"pl-c1"}],[],[{"start":12,"end":16,"cssClass":"pl-k"}],[],[{"start":15,"end":87,"cssClass":"pl-c"}],[{"start":15,"end":18,"cssClass":"pl-s1"},{"start":19,"end":21,"cssClass":"pl-c1"},{"start":22,"end":26,"cssClass":"pl-s1"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":29,"end":30,"cssClass":"pl-c1"}],[],[],[],[{"start":6,"end":26,"cssClass":"pl-c"}],[{"start":6,"end":20,"cssClass":"pl-en"},{"start":21,"end":28,"cssClass":"pl-s1"},{"start":28,"end":30,"cssClass":"pl-c1"},{"start":30,"end":34,"cssClass":"pl-c1"},{"start":36,"end":39,"cssClass":"pl-s1"},{"start":41,"end":53,"cssClass":"pl-c1"}],[{"start":6,"end":26,"cssClass":"pl-c"}],[{"start":6,"end":9,"cssClass":"pl-s1"},{"start":10,"end":11,"cssClass":"pl-c1"},{"start":12,"end":25,"cssClass":"pl-en"},{"start":26,"end":33,"cssClass":"pl-s1"}],[],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":13,"cssClass":"pl-s1"}],[],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":24,"cssClass":"pl-en"},{"start":25,"end":37,"cssClass":"pl-smi"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":39,"end":46,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":36,"cssClass":"pl-en"},{"start":37,"end":44,"cssClass":"pl-s1"},{"start":46,"end":47,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":27,"cssClass":"pl-en"},{"start":28,"end":40,"cssClass":"pl-smi"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":42,"end":49,"cssClass":"pl-s1"},{"start":51,"end":54,"cssClass":"pl-smi"},{"start":55,"end":62,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":39,"cssClass":"pl-en"},{"start":40,"end":47,"cssClass":"pl-s1"},{"start":49,"end":50,"cssClass":"pl-c1"},{"start":52,"end":59,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-k"},{"start":7,"end":14,"cssClass":"pl-c1"}],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":17,"cssClass":"pl-en"},{"start":18,"end":23,"cssClass":"pl-k"},{"start":24,"end":33,"cssClass":"pl-smi"},{"start":34,"end":35,"cssClass":"pl-c1"},{"start":35,"end":37,"cssClass":"pl-s1"}],[],[{"start":3,"end":16,"cssClass":"pl-en"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":18,"end":29,"cssClass":"pl-s1"},{"start":31,"end":33,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":8,"end":19,"cssClass":"pl-en"},{"start":20,"end":29,"cssClass":"pl-smi"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":31,"end":33,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":22,"cssClass":"pl-en"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":35,"cssClass":"pl-s1"},{"start":37,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":7,"cssClass":"pl-smi"},{"start":8,"end":18,"cssClass":"pl-en"},{"start":19,"end":23,"cssClass":"pl-smi"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":21,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":34,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":19,"cssClass":"pl-en"},{"start":20,"end":26,"cssClass":"pl-smi"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":34,"end":40,"cssClass":"pl-smi"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":53,"cssClass":"pl-smi"},{"start":54,"end":60,"cssClass":"pl-s1"},{"start":62,"end":68,"cssClass":"pl-smi"},{"start":69,"end":78,"cssClass":"pl-s1"}],[],[{"start":3,"end":18,"cssClass":"pl-en"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":33,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":53,"cssClass":"pl-s1"},{"start":55,"end":64,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":11,"cssClass":"pl-en"},{"start":12,"end":16,"cssClass":"pl-smi"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":19,"end":25,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":18,"cssClass":"pl-en"},{"start":19,"end":20,"cssClass":"pl-c1"},{"start":20,"end":31,"cssClass":"pl-s1"},{"start":33,"end":39,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":21,"cssClass":"pl-en"},{"start":22,"end":26,"cssClass":"pl-smi"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":34,"cssClass":"pl-s1"},{"start":36,"end":40,"cssClass":"pl-smi"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":42,"end":49,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":28,"cssClass":"pl-en"},{"start":30,"end":31,"cssClass":"pl-c1"},{"start":31,"end":42,"cssClass":"pl-s1"},{"start":44,"end":45,"cssClass":"pl-c1"},{"start":45,"end":56,"cssClass":"pl-s1"},{"start":58,"end":64,"cssClass":"pl-s1"},{"start":66,"end":73,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":13,"cssClass":"pl-en"},{"start":14,"end":18,"cssClass":"pl-smi"}],[],[{"start":3,"end":12,"cssClass":"pl-en"},{"start":13,"end":14,"cssClass":"pl-c1"},{"start":14,"end":25,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":6,"end":19,"cssClass":"pl-en"},{"start":20,"end":26,"cssClass":"pl-smi"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":34,"end":40,"cssClass":"pl-smi"},{"start":41,"end":48,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":54,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":5,"cssClass":"pl-smi"},{"start":6,"end":16,"cssClass":"pl-en"},{"start":17,"end":23,"cssClass":"pl-smi"},{"start":24,"end":29,"cssClass":"pl-s1"},{"start":31,"end":37,"cssClass":"pl-smi"},{"start":38,"end":41,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":21,"cssClass":"pl-en"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":47,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":17,"cssClass":"pl-en"},{"start":18,"end":22,"cssClass":"pl-smi"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":27,"cssClass":"pl-s1"},{"start":29,"end":35,"cssClass":"pl-smi"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":49,"cssClass":"pl-smi"},{"start":50,"end":52,"cssClass":"pl-s1"}],[],[{"start":3,"end":16,"cssClass":"pl-en"},{"start":17,"end":18,"cssClass":"pl-c1"},{"start":18,"end":29,"cssClass":"pl-s1"},{"start":31,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":45,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":17,"cssClass":"pl-en"},{"start":18,"end":24,"cssClass":"pl-smi"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":46,"cssClass":"pl-smi"},{"start":46,"end":47,"cssClass":"pl-c1"},{"start":48,"end":52,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":21,"cssClass":"pl-en"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":48,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":15,"cssClass":"pl-en"},{"start":16,"end":22,"cssClass":"pl-smi"},{"start":23,"end":28,"cssClass":"pl-s1"},{"start":30,"end":42,"cssClass":"pl-smi"},{"start":42,"end":43,"cssClass":"pl-c1"},{"start":44,"end":46,"cssClass":"pl-c1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":19,"cssClass":"pl-en"},{"start":21,"end":22,"cssClass":"pl-c1"},{"start":22,"end":33,"cssClass":"pl-s1"},{"start":35,"end":40,"cssClass":"pl-s1"},{"start":42,"end":44,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":19,"cssClass":"pl-en"},{"start":20,"end":26,"cssClass":"pl-smi"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":34,"end":46,"cssClass":"pl-smi"},{"start":46,"end":47,"cssClass":"pl-c1"},{"start":48,"end":50,"cssClass":"pl-c1"},{"start":52,"end":58,"cssClass":"pl-smi"},{"start":59,"end":60,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":23,"cssClass":"pl-en"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":26,"end":37,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-s1"},{"start":46,"end":48,"cssClass":"pl-c1"},{"start":50,"end":51,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":13,"cssClass":"pl-en"},{"start":14,"end":20,"cssClass":"pl-smi"},{"start":21,"end":26,"cssClass":"pl-s1"},{"start":28,"end":41,"cssClass":"pl-smi"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":43,"end":46,"cssClass":"pl-c1"},{"start":48,"end":53,"cssClass":"pl-smi"},{"start":54,"end":55,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":20,"cssClass":"pl-en"},{"start":22,"end":23,"cssClass":"pl-c1"},{"start":23,"end":34,"cssClass":"pl-s1"},{"start":36,"end":41,"cssClass":"pl-s1"},{"start":43,"end":46,"cssClass":"pl-c1"},{"start":48,"end":49,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":16,"cssClass":"pl-en"},{"start":17,"end":21,"cssClass":"pl-smi"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":23,"cssClass":"pl-en"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":26,"end":37,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":17,"cssClass":"pl-en"},{"start":18,"end":24,"cssClass":"pl-smi"},{"start":25,"end":30,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":26,"end":37,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-smi"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":41,"cssClass":"pl-smi"},{"start":42,"end":50,"cssClass":"pl-s1"},{"start":52,"end":55,"cssClass":"pl-smi"},{"start":56,"end":63,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":55,"cssClass":"pl-s1"},{"start":57,"end":64,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":15,"cssClass":"pl-en"},{"start":16,"end":22,"cssClass":"pl-smi"},{"start":23,"end":28,"cssClass":"pl-s1"},{"start":30,"end":33,"cssClass":"pl-smi"},{"start":34,"end":41,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":22,"cssClass":"pl-en"},{"start":24,"end":25,"cssClass":"pl-c1"},{"start":25,"end":36,"cssClass":"pl-s1"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":45,"end":52,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":14,"cssClass":"pl-en"},{"start":15,"end":21,"cssClass":"pl-smi"},{"start":22,"end":27,"cssClass":"pl-s1"},{"start":28,"end":38,"cssClass":"pl-smi"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":40,"end":43,"cssClass":"pl-s1"},{"start":45,"end":48,"cssClass":"pl-smi"},{"start":49,"end":56,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":21,"cssClass":"pl-en"},{"start":23,"end":24,"cssClass":"pl-c1"},{"start":24,"end":35,"cssClass":"pl-s1"},{"start":37,"end":42,"cssClass":"pl-s1"},{"start":44,"end":47,"cssClass":"pl-s1"},{"start":49,"end":56,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":17,"cssClass":"pl-en"},{"start":18,"end":24,"cssClass":"pl-smi"},{"start":25,"end":30,"cssClass":"pl-s1"},{"start":32,"end":42,"cssClass":"pl-smi"},{"start":43,"end":44,"cssClass":"pl-c1"},{"start":44,"end":47,"cssClass":"pl-s1"},{"start":49,"end":52,"cssClass":"pl-smi"},{"start":53,"end":60,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":50,"cssClass":"pl-s1"},{"start":52,"end":59,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":15,"cssClass":"pl-en"},{"start":16,"end":22,"cssClass":"pl-smi"},{"start":23,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-smi"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":37,"end":43,"cssClass":"pl-s1"}],[],[{"start":3,"end":14,"cssClass":"pl-en"},{"start":16,"end":17,"cssClass":"pl-c1"},{"start":17,"end":28,"cssClass":"pl-s1"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":37,"end":43,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-smi"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":41,"cssClass":"pl-smi"},{"start":42,"end":49,"cssClass":"pl-s1"},{"start":51,"end":54,"cssClass":"pl-smi"},{"start":55,"end":62,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":26,"end":27,"cssClass":"pl-c1"},{"start":27,"end":38,"cssClass":"pl-s1"},{"start":40,"end":45,"cssClass":"pl-s1"},{"start":47,"end":54,"cssClass":"pl-s1"},{"start":56,"end":63,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":18,"cssClass":"pl-en"},{"start":19,"end":25,"cssClass":"pl-smi"},{"start":26,"end":31,"cssClass":"pl-s1"},{"start":33,"end":39,"cssClass":"pl-smi"},{"start":40,"end":47,"cssClass":"pl-s1"},{"start":49,"end":55,"cssClass":"pl-smi"},{"start":56,"end":60,"cssClass":"pl-s1"},{"start":62,"end":65,"cssClass":"pl-smi"},{"start":66,"end":73,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":25,"cssClass":"pl-en"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":61,"cssClass":"pl-s1"},{"start":63,"end":70,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-smi"},{"start":28,"end":33,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":27,"cssClass":"pl-en"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":40,"cssClass":"pl-s1"},{"start":42,"end":47,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":17,"cssClass":"pl-en"},{"start":18,"end":24,"cssClass":"pl-smi"},{"start":25,"end":30,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":24,"cssClass":"pl-en"},{"start":25,"end":26,"cssClass":"pl-c1"},{"start":26,"end":37,"cssClass":"pl-s1"},{"start":39,"end":44,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":30,"cssClass":"pl-en"},{"start":31,"end":37,"cssClass":"pl-smi"},{"start":38,"end":43,"cssClass":"pl-s1"},{"start":44,"end":50,"cssClass":"pl-smi"},{"start":51,"end":52,"cssClass":"pl-c1"},{"start":52,"end":57,"cssClass":"pl-s1"},{"start":59,"end":62,"cssClass":"pl-smi"},{"start":63,"end":70,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":34,"cssClass":"pl-en"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":37,"end":48,"cssClass":"pl-s1"},{"start":50,"end":55,"cssClass":"pl-s1"},{"start":57,"end":62,"cssClass":"pl-s1"},{"start":64,"end":71,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":22,"cssClass":"pl-en"},{"start":23,"end":29,"cssClass":"pl-smi"},{"start":30,"end":35,"cssClass":"pl-s1"},{"start":37,"end":43,"cssClass":"pl-smi"},{"start":44,"end":51,"cssClass":"pl-s1"},{"start":53,"end":56,"cssClass":"pl-smi"},{"start":57,"end":64,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":26,"cssClass":"pl-en"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":40,"cssClass":"pl-s1"},{"start":42,"end":47,"cssClass":"pl-s1"},{"start":49,"end":56,"cssClass":"pl-s1"},{"start":58,"end":65,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-smi"},{"start":28,"end":33,"cssClass":"pl-s1"},{"start":35,"end":41,"cssClass":"pl-smi"},{"start":42,"end":49,"cssClass":"pl-s1"},{"start":51,"end":57,"cssClass":"pl-smi"},{"start":58,"end":62,"cssClass":"pl-s1"},{"start":64,"end":67,"cssClass":"pl-smi"},{"start":68,"end":75,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":27,"cssClass":"pl-en"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":30,"end":41,"cssClass":"pl-s1"},{"start":43,"end":48,"cssClass":"pl-s1"},{"start":50,"end":57,"cssClass":"pl-s1"},{"start":59,"end":63,"cssClass":"pl-s1"},{"start":65,"end":72,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":30,"cssClass":"pl-en"},{"start":31,"end":37,"cssClass":"pl-smi"},{"start":38,"end":47,"cssClass":"pl-s1"},{"start":48,"end":54,"cssClass":"pl-smi"},{"start":55,"end":56,"cssClass":"pl-c1"},{"start":56,"end":61,"cssClass":"pl-s1"},{"start":63,"end":66,"cssClass":"pl-smi"},{"start":67,"end":74,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":34,"cssClass":"pl-en"},{"start":36,"end":37,"cssClass":"pl-c1"},{"start":37,"end":48,"cssClass":"pl-s1"},{"start":50,"end":59,"cssClass":"pl-s1"},{"start":61,"end":66,"cssClass":"pl-s1"},{"start":68,"end":75,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":22,"cssClass":"pl-en"},{"start":23,"end":29,"cssClass":"pl-smi"},{"start":30,"end":39,"cssClass":"pl-s1"},{"start":41,"end":47,"cssClass":"pl-smi"},{"start":48,"end":55,"cssClass":"pl-s1"},{"start":57,"end":60,"cssClass":"pl-smi"},{"start":61,"end":68,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":26,"cssClass":"pl-en"},{"start":28,"end":29,"cssClass":"pl-c1"},{"start":29,"end":40,"cssClass":"pl-s1"},{"start":42,"end":51,"cssClass":"pl-s1"},{"start":53,"end":60,"cssClass":"pl-s1"},{"start":62,"end":69,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":20,"cssClass":"pl-en"},{"start":21,"end":27,"cssClass":"pl-smi"},{"start":28,"end":37,"cssClass":"pl-s1"},{"start":39,"end":45,"cssClass":"pl-smi"},{"start":46,"end":53,"cssClass":"pl-s1"},{"start":55,"end":61,"cssClass":"pl-smi"},{"start":62,"end":66,"cssClass":"pl-s1"},{"start":68,"end":71,"cssClass":"pl-smi"},{"start":72,"end":79,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":27,"cssClass":"pl-en"},{"start":29,"end":30,"cssClass":"pl-c1"},{"start":30,"end":41,"cssClass":"pl-s1"},{"start":43,"end":52,"cssClass":"pl-s1"},{"start":54,"end":61,"cssClass":"pl-s1"},{"start":63,"end":67,"cssClass":"pl-s1"},{"start":69,"end":76,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":4,"cssClass":"pl-smi"},{"start":5,"end":19,"cssClass":"pl-en"},{"start":20,"end":26,"cssClass":"pl-smi"},{"start":27,"end":32,"cssClass":"pl-s1"},{"start":34,"end":40,"cssClass":"pl-smi"},{"start":41,"end":48,"cssClass":"pl-s1"}],[],[{"start":3,"end":18,"cssClass":"pl-en"},{"start":20,"end":21,"cssClass":"pl-c1"},{"start":21,"end":32,"cssClass":"pl-s1"},{"start":34,"end":39,"cssClass":"pl-s1"},{"start":41,"end":48,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":6,"cssClass":"pl-smi"},{"start":7,"end":21,"cssClass":"pl-en"},{"start":22,"end":28,"cssClass":"pl-smi"},{"start":29,"end":34,"cssClass":"pl-s1"},{"start":36,"end":39,"cssClass":"pl-smi"},{"start":40,"end":47,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":25,"cssClass":"pl-en"},{"start":27,"end":28,"cssClass":"pl-c1"},{"start":28,"end":39,"cssClass":"pl-s1"},{"start":41,"end":46,"cssClass":"pl-s1"},{"start":48,"end":55,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":29,"cssClass":"pl-en"},{"start":30,"end":35,"cssClass":"pl-smi"},{"start":36,"end":41,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":36,"cssClass":"pl-en"},{"start":38,"end":39,"cssClass":"pl-c1"},{"start":39,"end":50,"cssClass":"pl-s1"},{"start":52,"end":57,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":32,"cssClass":"pl-en"},{"start":33,"end":38,"cssClass":"pl-smi"},{"start":39,"end":44,"cssClass":"pl-s1"},{"start":46,"end":49,"cssClass":"pl-smi"},{"start":50,"end":57,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":39,"cssClass":"pl-en"},{"start":41,"end":42,"cssClass":"pl-c1"},{"start":42,"end":53,"cssClass":"pl-s1"},{"start":55,"end":60,"cssClass":"pl-s1"},{"start":62,"end":69,"cssClass":"pl-s1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":23,"cssClass":"pl-en"},{"start":24,"end":28,"cssClass":"pl-smi"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":35,"cssClass":"pl-en"},{"start":36,"end":37,"cssClass":"pl-c1"}],[],[],[{"start":0,"end":3,"cssClass":"pl-smi"},{"start":4,"end":26,"cssClass":"pl-en"},{"start":27,"end":30,"cssClass":"pl-smi"},{"start":31,"end":38,"cssClass":"pl-s1"}],[],[{"start":3,"end":9,"cssClass":"pl-k"},{"start":10,"end":38,"cssClass":"pl-en"},{"start":39,"end":40,"cssClass":"pl-c1"},{"start":42,"end":49,"cssClass":"pl-s1"}],[],[{"start":0,"end":6,"cssClass":"pl-k"}]],"colorizedLines":null,"csv":null,"csvError":null,"dependabotInfo":{"showConfigurationBanner":false,"configFilePath":null,"networkDependabotPath":"/ethercat-diy/stm32f4_ethercat/network/updates","dismissConfigurationNoticePath":"/settings/dismiss-notice/dependabot_configuration_notice","configurationNoticeDismissed":null},"displayName":"ethercatmain.c","displayUrl":"https://github.com/ethercat-diy/stm32f4_ethercat/blob/master/soem/ethercatmain.c?raw=true","headerInfo":{"blobSize":"61.8 KB","deleteTooltip":"You must be signed in to make or propose changes","editTooltip":"You must be signed in to make or propose changes","ghDesktopPath":"https://desktop.github.com","isGitLfs":false,"onBranch":true,"shortPath":"dcc8fc5","siteNavLoginPath":"/login?return_to=https%3A%2F%2Fgithub.com%2Fethercat-diy%2Fstm32f4_ethercat%2Fblob%2Fmaster%2Fsoem%2Fethercatmain.c","isCSV":false,"isRichtext":false,"toc":null,"lineInfo":{"truncatedLoc":"2059","truncatedSloc":"1887"},"mode":"file"},"image":false,"isCodeownersFile":null,"isPlain":false,"isValidLegacyIssueTemplate":false,"issueTemplate":null,"discussionTemplate":null,"language":"C","languageID":41,"large":false,"planSupportInfo":{"repoIsFork":null,"repoOwnedByCurrentUser":null,"requestFullPath":"/ethercat-diy/stm32f4_ethercat/blob/master/soem/ethercatmain.c","showFreeOrgGatedFeatureMessage":null,"showPlanSupportBanner":null,"upgradeDataAttributes":null,"upgradePath":null},"publishBannersInfo":{"dismissActionNoticePath":"/settings/dismiss-notice/publish_action_from_dockerfile","releasePath":"/ethercat-diy/stm32f4_ethercat/releases/new?marketplace=true","showPublishActionBanner":false},"rawBlobUrl":"https://github.com/ethercat-diy/stm32f4_ethercat/raw/master/soem/ethercatmain.c","renderImageOrRaw":false,"richText":null,"renderedFileInfo":null,"shortPath":null,"symbolsEnabled":true,"tabSize":8,"topBannersInfo":{"overridingGlobalFundingFile":false,"globalPreferredFundingPath":null,"showInvalidCitationWarning":false,"citationHelpUrl":"https://docs.github.com/github/creating-cloning-and-archiving-repositories/creating-a-repository-on-github/about-citation-files","actionsOnboardingTip":null},"truncated":false,"viewable":true,"workflowRedirectUrl":null,"symbols":{"timed_out":true,"not_analyzed":false,"symbols":[{"name":"EC_LOCALDELAY","kind":"macro","ident_start":2427,"ident_end":2440,"extent_start":2419,"extent_end":2447,"fully_qualified_name":"EC_LOCALDELAY","ident_utf16":{"start":{"line_number":63,"utf16_col":8},"end":{"line_number":63,"utf16_col":21}},"extent_utf16":{"start":{"line_number":63,"utf16_col":0},"end":{"line_number":65,"utf16_col":0}}},{"name":"PACKED","kind":"class","ident_start":2531,"ident_end":2537,"extent_start":2524,"extent_end":2596,"fully_qualified_name":"PACKED","ident_utf16":{"start":{"line_number":67,"utf16_col":15},"end":{"line_number":67,"utf16_col":21}},"extent_utf16":{"start":{"line_number":67,"utf16_col":8},"end":{"line_number":72,"utf16_col":1}}},{"name":"PACKED","kind":"class","ident_start":2680,"ident_end":2686,"extent_start":2673,"extent_end":2772,"fully_qualified_name":"PACKED","ident_utf16":{"start":{"line_number":77,"utf16_col":15},"end":{"line_number":77,"utf16_col":21}},"extent_utf16":{"start":{"line_number":77,"utf16_col":8},"end":{"line_number":82,"utf16_col":1}}},{"name":"ec_mbxerrort","kind":"type","ident_start":2773,"ident_end":2785,"extent_start":2665,"extent_end":2786,"fully_qualified_name":"ec_mbxerrort","ident_utf16":{"start":{"line_number":82,"utf16_col":2},"end":{"line_number":82,"utf16_col":14}},"extent_utf16":{"start":{"line_number":77,"utf16_col":0},"end":{"line_number":82,"utf16_col":15}}},{"name":"PACKED","kind":"class","ident_start":2862,"ident_end":2868,"extent_start":2855,"extent_end":3041,"fully_qualified_name":"PACKED","ident_utf16":{"start":{"line_number":87,"utf16_col":15},"end":{"line_number":87,"utf16_col":21}},"extent_utf16":{"start":{"line_number":87,"utf16_col":8},"end":{"line_number":95,"utf16_col":1}}},{"name":"ec_emcyt","kind":"type","ident_start":3042,"ident_end":3050,"extent_start":2847,"extent_end":3051,"fully_qualified_name":"ec_emcyt","ident_utf16":{"start":{"line_number":95,"utf16_col":2},"end":{"line_number":95,"utf16_col":10}},"extent_utf16":{"start":{"line_number":87,"utf16_col":0},"end":{"line_number":95,"utf16_col":11}}},{"name":"ec_find_adapters","kind":"function","ident_start":5525,"ident_end":5541,"extent_start":5525,"extent_end":5548,"fully_qualified_name":"ec_find_adapters","ident_utf16":{"start":{"line_number":166,"utf16_col":14},"end":{"line_number":166,"utf16_col":30}},"extent_utf16":{"start":{"line_number":166,"utf16_col":14},"end":{"line_number":166,"utf16_col":37}}},{"name":"ec_free_adapters","kind":"function","ident_start":5816,"ident_end":5832,"extent_start":5816,"extent_end":5856,"fully_qualified_name":"ec_free_adapters","ident_utf16":{"start":{"line_number":179,"utf16_col":5},"end":{"line_number":179,"utf16_col":21}},"extent_utf16":{"start":{"line_number":179,"utf16_col":5},"end":{"line_number":179,"utf16_col":45}}},{"name":"ecx_pusherror","kind":"function","ident_start":6039,"ident_end":6052,"extent_start":6039,"extent_end":6096,"fully_qualified_name":"ecx_pusherror","ident_utf16":{"start":{"line_number":189,"utf16_col":5},"end":{"line_number":189,"utf16_col":18}},"extent_utf16":{"start":{"line_number":189,"utf16_col":5},"end":{"line_number":189,"utf16_col":62}}},{"name":"ecx_poperror","kind":"function","ident_start":6724,"ident_end":6736,"extent_start":6724,"extent_end":6774,"fully_qualified_name":"ecx_poperror","ident_utf16":{"start":{"line_number":215,"utf16_col":8},"end":{"line_number":215,"utf16_col":20}},"extent_utf16":{"start":{"line_number":215,"utf16_col":8},"end":{"line_number":215,"utf16_col":58}}},{"name":"ecx_iserror","kind":"function","ident_start":7343,"ident_end":7354,"extent_start":7343,"extent_end":7377,"fully_qualified_name":"ecx_iserror","ident_utf16":{"start":{"line_number":241,"utf16_col":8},"end":{"line_number":241,"utf16_col":19}},"extent_utf16":{"start":{"line_number":241,"utf16_col":8},"end":{"line_number":241,"utf16_col":42}}},{"name":"ecx_packeterror","kind":"function","ident_start":7717,"ident_end":7732,"extent_start":7717,"extent_end":7815,"fully_qualified_name":"ecx_packeterror","ident_utf16":{"start":{"line_number":254,"utf16_col":5},"end":{"line_number":254,"utf16_col":20}},"extent_utf16":{"start":{"line_number":254,"utf16_col":5},"end":{"line_number":254,"utf16_col":103}}},{"name":"ecx_mbxerror","kind":"function","ident_start":8300,"ident_end":8312,"extent_start":8300,"extent_end":8363,"fully_qualified_name":"ecx_mbxerror","ident_utf16":{"start":{"line_number":275,"utf16_col":12},"end":{"line_number":275,"utf16_col":24}},"extent_utf16":{"start":{"line_number":275,"utf16_col":12},"end":{"line_number":275,"utf16_col":75}}},{"name":"ecx_mbxemergencyerror","kind":"function","ident_start":8884,"ident_end":8905,"extent_start":8884,"extent_end":9011,"fully_qualified_name":"ecx_mbxemergencyerror","ident_utf16":{"start":{"line_number":299,"utf16_col":12},"end":{"line_number":299,"utf16_col":33}},"extent_utf16":{"start":{"line_number":299,"utf16_col":12},"end":{"line_number":300,"utf16_col":35}}},{"name":"ecx_init","kind":"function","ident_start":9493,"ident_end":9501,"extent_start":9493,"extent_end":9539,"fully_qualified_name":"ecx_init","ident_utf16":{"start":{"line_number":323,"utf16_col":4},"end":{"line_number":323,"utf16_col":12}},"extent_utf16":{"start":{"line_number":323,"utf16_col":4},"end":{"line_number":323,"utf16_col":50}}},{"name":"ecx_init_redundant","kind":"function","ident_start":9889,"ident_end":9907,"extent_start":9889,"extent_end":9982,"fully_qualified_name":"ecx_init_redundant","ident_utf16":{"start":{"line_number":335,"utf16_col":4},"end":{"line_number":335,"utf16_col":22}},"extent_utf16":{"start":{"line_number":335,"utf16_col":4},"end":{"line_number":335,"utf16_col":97}}},{"name":"ecx_close","kind":"function","ident_start":10611,"ident_end":10620,"extent_start":10611,"extent_end":10643,"fully_qualified_name":"ecx_close","ident_utf16":{"start":{"line_number":356,"utf16_col":5},"end":{"line_number":356,"utf16_col":14}},"extent_utf16":{"start":{"line_number":356,"utf16_col":5},"end":{"line_number":356,"utf16_col":37}}},{"name":"ecx_siigetbyte","kind":"function","ident_start":11095,"ident_end":11109,"extent_start":11095,"extent_end":11162,"fully_qualified_name":"ecx_siigetbyte","ident_utf16":{"start":{"line_number":369,"utf16_col":6},"end":{"line_number":369,"utf16_col":20}},"extent_utf16":{"start":{"line_number":369,"utf16_col":6},"end":{"line_number":369,"utf16_col":73}}},{"name":"ecx_siifind","kind":"function","ident_start":13140,"ident_end":13151,"extent_start":13140,"extent_end":13200,"fully_qualified_name":"ecx_siifind","ident_utf16":{"start":{"line_number":438,"utf16_col":6},"end":{"line_number":438,"utf16_col":17}},"extent_utf16":{"start":{"line_number":438,"utf16_col":6},"end":{"line_number":438,"utf16_col":66}}},{"name":"ecx_siistring","kind":"function","ident_start":14312,"ident_end":14325,"extent_start":14312,"extent_end":14384,"fully_qualified_name":"ecx_siistring","ident_utf16":{"start":{"line_number":478,"utf16_col":5},"end":{"line_number":478,"utf16_col":18}},"extent_utf16":{"start":{"line_number":478,"utf16_col":5},"end":{"line_number":478,"utf16_col":77}}},{"name":"ecx_siiFMMU","kind":"function","ident_start":15988,"ident_end":15999,"extent_start":15988,"extent_end":16058,"fully_qualified_name":"ecx_siiFMMU","ident_utf16":{"start":{"line_number":536,"utf16_col":7},"end":{"line_number":536,"utf16_col":18}},"extent_utf16":{"start":{"line_number":536,"utf16_col":7},"end":{"line_number":536,"utf16_col":77}}},{"name":"ecx_siiSM","kind":"function","ident_start":17171,"ident_end":17180,"extent_start":17171,"extent_end":17235,"fully_qualified_name":"ecx_siiSM","ident_utf16":{"start":{"line_number":576,"utf16_col":7},"end":{"line_number":576,"utf16_col":16}},"extent_utf16":{"start":{"line_number":576,"utf16_col":7},"end":{"line_number":576,"utf16_col":71}}},{"name":"ecx_siiSMnext","kind":"function","ident_start":18436,"ident_end":18449,"extent_start":18436,"extent_end":18514,"fully_qualified_name":"ecx_siiSMnext","ident_utf16":{"start":{"line_number":613,"utf16_col":7},"end":{"line_number":613,"utf16_col":20}},"extent_utf16":{"start":{"line_number":613,"utf16_col":7},"end":{"line_number":613,"utf16_col":85}}},{"name":"ecx_siiPDO","kind":"function","ident_start":19573,"ident_end":19583,"extent_start":19573,"extent_end":19649,"fully_qualified_name":"ecx_siiPDO","ident_utf16":{"start":{"line_number":647,"utf16_col":4},"end":{"line_number":647,"utf16_col":14}},"extent_utf16":{"start":{"line_number":647,"utf16_col":4},"end":{"line_number":647,"utf16_col":80}}},{"name":"MAX_FPRD_MULTI","kind":"macro","ident_start":21582,"ident_end":21596,"extent_start":21574,"extent_end":21601,"fully_qualified_name":"MAX_FPRD_MULTI","ident_utf16":{"start":{"line_number":714,"utf16_col":8},"end":{"line_number":714,"utf16_col":22}},"extent_utf16":{"start":{"line_number":714,"utf16_col":0},"end":{"line_number":716,"utf16_col":0}}},{"name":"ecx_FPRD_multi","kind":"function","ident_start":21605,"ident_end":21619,"extent_start":21605,"extent_end":21706,"fully_qualified_name":"ecx_FPRD_multi","ident_utf16":{"start":{"line_number":716,"utf16_col":4},"end":{"line_number":716,"utf16_col":18}},"extent_utf16":{"start":{"line_number":716,"utf16_col":4},"end":{"line_number":716,"utf16_col":105}}},{"name":"ecx_readstate","kind":"function","ident_start":22940,"ident_end":22953,"extent_start":22940,"extent_end":22976,"fully_qualified_name":"ecx_readstate","ident_utf16":{"start":{"line_number":756,"utf16_col":4},"end":{"line_number":756,"utf16_col":17}},"extent_utf16":{"start":{"line_number":756,"utf16_col":4},"end":{"line_number":756,"utf16_col":40}}},{"name":"ecx_writestate","kind":"function","ident_start":24550,"ident_end":24564,"extent_start":24550,"extent_end":24601,"fully_qualified_name":"ecx_writestate","ident_utf16":{"start":{"line_number":806,"utf16_col":4},"end":{"line_number":806,"utf16_col":18}},"extent_utf16":{"start":{"line_number":806,"utf16_col":4},"end":{"line_number":806,"utf16_col":55}}},{"name":"ecx_statecheck","kind":"function","ident_start":25391,"ident_end":25405,"extent_start":25391,"extent_end":25472,"fully_qualified_name":"ecx_statecheck","ident_utf16":{"start":{"line_number":832,"utf16_col":7},"end":{"line_number":832,"utf16_col":21}},"extent_utf16":{"start":{"line_number":832,"utf16_col":7},"end":{"line_number":832,"utf16_col":88}}},{"name":"ec_nextmbxcnt","kind":"function","ident_start":26657,"ident_end":26670,"extent_start":26657,"extent_end":26681,"fully_qualified_name":"ec_nextmbxcnt","ident_utf16":{"start":{"line_number":877,"utf16_col":6},"end":{"line_number":877,"utf16_col":19}},"extent_utf16":{"start":{"line_number":877,"utf16_col":6},"end":{"line_number":877,"utf16_col":30}}},{"name":"ec_clearmbx","kind":"function","ident_start":26868,"ident_end":26879,"extent_start":26868,"extent_end":26896,"fully_qualified_name":"ec_clearmbx","ident_utf16":{"start":{"line_number":891,"utf16_col":5},"end":{"line_number":891,"utf16_col":16}},"extent_utf16":{"start":{"line_number":891,"utf16_col":5},"end":{"line_number":891,"utf16_col":33}}},{"name":"ecx_mbxempty","kind":"function","ident_start":27136,"ident_end":27148,"extent_start":27136,"extent_end":27198,"fully_qualified_name":"ecx_mbxempty","ident_utf16":{"start":{"line_number":902,"utf16_col":4},"end":{"line_number":902,"utf16_col":16}},"extent_utf16":{"start":{"line_number":902,"utf16_col":4},"end":{"line_number":902,"utf16_col":66}}},{"name":"ecx_mbxsend","kind":"function","ident_start":28082,"ident_end":28093,"extent_start":28082,"extent_end":28159,"fully_qualified_name":"ecx_mbxsend","ident_utf16":{"start":{"line_number":938,"utf16_col":4},"end":{"line_number":938,"utf16_col":15}},"extent_utf16":{"start":{"line_number":938,"utf16_col":4},"end":{"line_number":938,"utf16_col":81}}},{"name":"ecx_mbxreceive","kind":"function","ident_start":28974,"ident_end":28988,"extent_start":28974,"extent_end":29055,"fully_qualified_name":"ecx_mbxreceive","ident_utf16":{"start":{"line_number":971,"utf16_col":4},"end":{"line_number":971,"utf16_col":18}},"extent_utf16":{"start":{"line_number":971,"utf16_col":4},"end":{"line_number":971,"utf16_col":85}}},{"name":"ecx_esidump","kind":"function","ident_start":32730,"ident_end":32741,"extent_start":32730,"extent_end":32793,"fully_qualified_name":"ecx_esidump","ident_utf16":{"start":{"line_number":1064,"utf16_col":5},"end":{"line_number":1064,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1064,"utf16_col":5},"end":{"line_number":1064,"utf16_col":68}}},{"name":"ecx_readeeprom","kind":"function","ident_start":33861,"ident_end":33875,"extent_start":33861,"extent_end":33941,"fully_qualified_name":"ecx_readeeprom","ident_utf16":{"start":{"line_number":1107,"utf16_col":7},"end":{"line_number":1107,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1107,"utf16_col":7},"end":{"line_number":1107,"utf16_col":87}}},{"name":"ecx_writeeeprom","kind":"function","ident_start":34461,"ident_end":34476,"extent_start":34461,"extent_end":34555,"fully_qualified_name":"ecx_writeeeprom","ident_utf16":{"start":{"line_number":1125,"utf16_col":4},"end":{"line_number":1125,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1125,"utf16_col":4},"end":{"line_number":1125,"utf16_col":98}}},{"name":"ecx_eeprom2master","kind":"function","ident_start":34951,"ident_end":34968,"extent_start":34951,"extent_end":35005,"fully_qualified_name":"ecx_eeprom2master","ident_utf16":{"start":{"line_number":1139,"utf16_col":4},"end":{"line_number":1139,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1139,"utf16_col":4},"end":{"line_number":1139,"utf16_col":58}}},{"name":"ecx_eeprom2pdi","kind":"function","ident_start":35899,"ident_end":35913,"extent_start":35899,"extent_end":35950,"fully_qualified_name":"ecx_eeprom2pdi","ident_utf16":{"start":{"line_number":1172,"utf16_col":4},"end":{"line_number":1172,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1172,"utf16_col":4},"end":{"line_number":1172,"utf16_col":55}}},{"name":"ecx_eeprom_waitnotbusyAP","kind":"function","ident_start":36430,"ident_end":36454,"extent_start":36430,"extent_end":36518,"fully_qualified_name":"ecx_eeprom_waitnotbusyAP","ident_utf16":{"start":{"line_number":1193,"utf16_col":7},"end":{"line_number":1193,"utf16_col":31}},"extent_utf16":{"start":{"line_number":1193,"utf16_col":7},"end":{"line_number":1193,"utf16_col":95}}},{"name":"ecx_readeepromAP","kind":"function","ident_start":37378,"ident_end":37394,"extent_start":37378,"extent_end":37460,"fully_qualified_name":"ecx_readeepromAP","ident_utf16":{"start":{"line_number":1225,"utf16_col":7},"end":{"line_number":1225,"utf16_col":23}},"extent_utf16":{"start":{"line_number":1225,"utf16_col":7},"end":{"line_number":1225,"utf16_col":89}}},{"name":"ecx_writeeepromAP","kind":"function","ident_start":39855,"ident_end":39872,"extent_start":39855,"extent_end":39951,"fully_qualified_name":"ecx_writeeepromAP","ident_utf16":{"start":{"line_number":1305,"utf16_col":4},"end":{"line_number":1305,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1305,"utf16_col":4},"end":{"line_number":1305,"utf16_col":100}}},{"name":"ecx_eeprom_waitnotbusyFP","kind":"function","ident_start":41443,"ident_end":41467,"extent_start":41443,"extent_end":41535,"fully_qualified_name":"ecx_eeprom_waitnotbusyFP","ident_utf16":{"start":{"line_number":1362,"utf16_col":7},"end":{"line_number":1362,"utf16_col":31}},"extent_utf16":{"start":{"line_number":1362,"utf16_col":7},"end":{"line_number":1362,"utf16_col":99}}},{"name":"ecx_readeepromFP","kind":"function","ident_start":42395,"ident_end":42411,"extent_start":42395,"extent_end":42481,"fully_qualified_name":"ecx_readeepromFP","ident_utf16":{"start":{"line_number":1394,"utf16_col":7},"end":{"line_number":1394,"utf16_col":23}},"extent_utf16":{"start":{"line_number":1394,"utf16_col":7},"end":{"line_number":1394,"utf16_col":93}}},{"name":"ecx_writeeepromFP","kind":"function","ident_start":44899,"ident_end":44916,"extent_start":44899,"extent_end":44999,"fully_qualified_name":"ecx_writeeepromFP","ident_utf16":{"start":{"line_number":1474,"utf16_col":4},"end":{"line_number":1474,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1474,"utf16_col":4},"end":{"line_number":1474,"utf16_col":104}}},{"name":"ecx_readeeprom1","kind":"function","ident_start":46748,"ident_end":46763,"extent_start":46748,"extent_end":46816,"fully_qualified_name":"ecx_readeeprom1","ident_utf16":{"start":{"line_number":1535,"utf16_col":5},"end":{"line_number":1535,"utf16_col":20}},"extent_utf16":{"start":{"line_number":1535,"utf16_col":5},"end":{"line_number":1535,"utf16_col":73}}},{"name":"ecx_readeeprom2","kind":"function","ident_start":47916,"ident_end":47931,"extent_start":47916,"extent_end":47981,"fully_qualified_name":"ecx_readeeprom2","ident_utf16":{"start":{"line_number":1568,"utf16_col":7},"end":{"line_number":1568,"utf16_col":22}},"extent_utf16":{"start":{"line_number":1568,"utf16_col":7},"end":{"line_number":1568,"utf16_col":72}}},{"name":"ecx_pushindex","kind":"function","ident_start":48707,"ident_end":48720,"extent_start":48707,"extent_end":48781,"fully_qualified_name":"ecx_pushindex","ident_utf16":{"start":{"line_number":1595,"utf16_col":12},"end":{"line_number":1595,"utf16_col":25}},"extent_utf16":{"start":{"line_number":1595,"utf16_col":12},"end":{"line_number":1595,"utf16_col":86}}},{"name":"ecx_pullindex","kind":"function","ident_start":49238,"ident_end":49251,"extent_start":49238,"extent_end":49274,"fully_qualified_name":"ecx_pullindex","ident_utf16":{"start":{"line_number":1610,"utf16_col":11},"end":{"line_number":1610,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1610,"utf16_col":11},"end":{"line_number":1610,"utf16_col":47}}},{"name":"ecx_send_processdata_group","kind":"function","ident_start":50096,"ident_end":50122,"extent_start":50096,"extent_end":50158,"fully_qualified_name":"ecx_send_processdata_group","ident_utf16":{"start":{"line_number":1634,"utf16_col":4},"end":{"line_number":1634,"utf16_col":30}},"extent_utf16":{"start":{"line_number":1634,"utf16_col":4},"end":{"line_number":1634,"utf16_col":66}}},{"name":"ecx_receive_processdata_group","kind":"function","ident_start":56515,"ident_end":56544,"extent_start":56515,"extent_end":56593,"fully_qualified_name":"ecx_receive_processdata_group","ident_utf16":{"start":{"line_number":1795,"utf16_col":4},"end":{"line_number":1795,"utf16_col":33}},"extent_utf16":{"start":{"line_number":1795,"utf16_col":4},"end":{"line_number":1795,"utf16_col":82}}},{"name":"ecx_send_processdata","kind":"function","ident_start":58921,"ident_end":58941,"extent_start":58921,"extent_end":58964,"fully_qualified_name":"ecx_send_processdata","ident_utf16":{"start":{"line_number":1863,"utf16_col":4},"end":{"line_number":1863,"utf16_col":24}},"extent_utf16":{"start":{"line_number":1863,"utf16_col":4},"end":{"line_number":1863,"utf16_col":47}}},{"name":"ecx_receive_processdata","kind":"function","ident_start":59024,"ident_end":59047,"extent_start":59024,"extent_end":59083,"fully_qualified_name":"ecx_receive_processdata","ident_utf16":{"start":{"line_number":1868,"utf16_col":4},"end":{"line_number":1868,"utf16_col":27}},"extent_utf16":{"start":{"line_number":1868,"utf16_col":4},"end":{"line_number":1868,"utf16_col":63}}},{"name":"ec_pusherror","kind":"function","ident_start":59171,"ident_end":59183,"extent_start":59171,"extent_end":59204,"fully_qualified_name":"ec_pusherror","ident_utf16":{"start":{"line_number":1874,"utf16_col":5},"end":{"line_number":1874,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1874,"utf16_col":5},"end":{"line_number":1874,"utf16_col":38}}},{"name":"ec_poperror","kind":"function","ident_start":59254,"ident_end":59265,"extent_start":59254,"extent_end":59280,"fully_qualified_name":"ec_poperror","ident_utf16":{"start":{"line_number":1879,"utf16_col":8},"end":{"line_number":1879,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1879,"utf16_col":8},"end":{"line_number":1879,"utf16_col":34}}},{"name":"ec_iserror","kind":"function","ident_start":59336,"ident_end":59346,"extent_start":59336,"extent_end":59352,"fully_qualified_name":"ec_iserror","ident_utf16":{"start":{"line_number":1884,"utf16_col":8},"end":{"line_number":1884,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1884,"utf16_col":8},"end":{"line_number":1884,"utf16_col":24}}},{"name":"ec_packeterror","kind":"function","ident_start":59400,"ident_end":59414,"extent_start":59400,"extent_end":59474,"fully_qualified_name":"ec_packeterror","ident_utf16":{"start":{"line_number":1889,"utf16_col":5},"end":{"line_number":1889,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1889,"utf16_col":5},"end":{"line_number":1889,"utf16_col":79}}},{"name":"ec_init","kind":"function","ident_start":59551,"ident_end":59558,"extent_start":59551,"extent_end":59573,"fully_qualified_name":"ec_init","ident_utf16":{"start":{"line_number":1894,"utf16_col":4},"end":{"line_number":1894,"utf16_col":11}},"extent_utf16":{"start":{"line_number":1894,"utf16_col":4},"end":{"line_number":1894,"utf16_col":26}}},{"name":"ec_init_redundant","kind":"function","ident_start":59625,"ident_end":59642,"extent_start":59625,"extent_end":59671,"fully_qualified_name":"ec_init_redundant","ident_utf16":{"start":{"line_number":1899,"utf16_col":4},"end":{"line_number":1899,"utf16_col":21}},"extent_utf16":{"start":{"line_number":1899,"utf16_col":4},"end":{"line_number":1899,"utf16_col":50}}},{"name":"ec_close","kind":"function","ident_start":59758,"ident_end":59766,"extent_start":59758,"extent_end":59772,"fully_qualified_name":"ec_close","ident_utf16":{"start":{"line_number":1904,"utf16_col":5},"end":{"line_number":1904,"utf16_col":13}},"extent_utf16":{"start":{"line_number":1904,"utf16_col":5},"end":{"line_number":1904,"utf16_col":19}}},{"name":"ec_siigetbyte","kind":"function","ident_start":59813,"ident_end":59826,"extent_start":59813,"extent_end":59856,"fully_qualified_name":"ec_siigetbyte","ident_utf16":{"start":{"line_number":1909,"utf16_col":6},"end":{"line_number":1909,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1909,"utf16_col":6},"end":{"line_number":1909,"utf16_col":49}}},{"name":"ec_siifind","kind":"function","ident_start":59925,"ident_end":59935,"extent_start":59925,"extent_end":59961,"fully_qualified_name":"ec_siifind","ident_utf16":{"start":{"line_number":1914,"utf16_col":6},"end":{"line_number":1914,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1914,"utf16_col":6},"end":{"line_number":1914,"utf16_col":42}}},{"name":"ec_siistring","kind":"function","ident_start":60022,"ident_end":60034,"extent_start":60022,"extent_end":60070,"fully_qualified_name":"ec_siistring","ident_utf16":{"start":{"line_number":1919,"utf16_col":5},"end":{"line_number":1919,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1919,"utf16_col":5},"end":{"line_number":1919,"utf16_col":53}}},{"name":"ec_siiFMMU","kind":"function","ident_start":60131,"ident_end":60141,"extent_start":60131,"extent_end":60177,"fully_qualified_name":"ec_siiFMMU","ident_utf16":{"start":{"line_number":1924,"utf16_col":7},"end":{"line_number":1924,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1924,"utf16_col":7},"end":{"line_number":1924,"utf16_col":53}}},{"name":"ec_siiSM","kind":"function","ident_start":60241,"ident_end":60249,"extent_start":60241,"extent_end":60281,"fully_qualified_name":"ec_siiSM","ident_utf16":{"start":{"line_number":1929,"utf16_col":7},"end":{"line_number":1929,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1929,"utf16_col":7},"end":{"line_number":1929,"utf16_col":47}}},{"name":"ec_siiSMnext","kind":"function","ident_start":60341,"ident_end":60353,"extent_start":60341,"extent_end":60395,"fully_qualified_name":"ec_siiSMnext","ident_utf16":{"start":{"line_number":1934,"utf16_col":7},"end":{"line_number":1934,"utf16_col":19}},"extent_utf16":{"start":{"line_number":1934,"utf16_col":7},"end":{"line_number":1934,"utf16_col":61}}},{"name":"ec_siiPDO","kind":"function","ident_start":60459,"ident_end":60468,"extent_start":60459,"extent_end":60511,"fully_qualified_name":"ec_siiPDO","ident_utf16":{"start":{"line_number":1939,"utf16_col":4},"end":{"line_number":1939,"utf16_col":13}},"extent_utf16":{"start":{"line_number":1939,"utf16_col":4},"end":{"line_number":1939,"utf16_col":56}}},{"name":"ec_readstate","kind":"function","ident_start":60573,"ident_end":60585,"extent_start":60573,"extent_end":60591,"fully_qualified_name":"ec_readstate","ident_utf16":{"start":{"line_number":1944,"utf16_col":4},"end":{"line_number":1944,"utf16_col":16}},"extent_utf16":{"start":{"line_number":1944,"utf16_col":4},"end":{"line_number":1944,"utf16_col":22}}},{"name":"ec_writestate","kind":"function","ident_start":60641,"ident_end":60654,"extent_start":60641,"extent_end":60668,"fully_qualified_name":"ec_writestate","ident_utf16":{"start":{"line_number":1949,"utf16_col":4},"end":{"line_number":1949,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1949,"utf16_col":4},"end":{"line_number":1949,"utf16_col":31}}},{"name":"ec_statecheck","kind":"function","ident_start":60728,"ident_end":60741,"extent_start":60728,"extent_end":60785,"fully_qualified_name":"ec_statecheck","ident_utf16":{"start":{"line_number":1954,"utf16_col":7},"end":{"line_number":1954,"utf16_col":20}},"extent_utf16":{"start":{"line_number":1954,"utf16_col":7},"end":{"line_number":1954,"utf16_col":64}}},{"name":"ec_mbxempty","kind":"function","ident_start":60862,"ident_end":60873,"extent_start":60862,"extent_end":60900,"fully_qualified_name":"ec_mbxempty","ident_utf16":{"start":{"line_number":1959,"utf16_col":4},"end":{"line_number":1959,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1959,"utf16_col":4},"end":{"line_number":1959,"utf16_col":42}}},{"name":"ec_mbxsend","kind":"function","ident_start":60965,"ident_end":60975,"extent_start":60965,"extent_end":61018,"fully_qualified_name":"ec_mbxsend","ident_utf16":{"start":{"line_number":1964,"utf16_col":4},"end":{"line_number":1964,"utf16_col":14}},"extent_utf16":{"start":{"line_number":1964,"utf16_col":4},"end":{"line_number":1964,"utf16_col":57}}},{"name":"ec_mbxreceive","kind":"function","ident_start":61087,"ident_end":61100,"extent_start":61087,"extent_end":61144,"fully_qualified_name":"ec_mbxreceive","ident_utf16":{"start":{"line_number":1969,"utf16_col":4},"end":{"line_number":1969,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1969,"utf16_col":4},"end":{"line_number":1969,"utf16_col":61}}},{"name":"ec_esidump","kind":"function","ident_start":61217,"ident_end":61227,"extent_start":61217,"extent_end":61256,"fully_qualified_name":"ec_esidump","ident_utf16":{"start":{"line_number":1974,"utf16_col":5},"end":{"line_number":1974,"utf16_col":15}},"extent_utf16":{"start":{"line_number":1974,"utf16_col":5},"end":{"line_number":1974,"utf16_col":44}}},{"name":"ec_readeeprom","kind":"function","ident_start":61315,"ident_end":61328,"extent_start":61315,"extent_end":61371,"fully_qualified_name":"ec_readeeprom","ident_utf16":{"start":{"line_number":1979,"utf16_col":7},"end":{"line_number":1979,"utf16_col":20}},"extent_utf16":{"start":{"line_number":1979,"utf16_col":7},"end":{"line_number":1979,"utf16_col":63}}},{"name":"ec_writeeeprom","kind":"function","ident_start":61447,"ident_end":61461,"extent_start":61447,"extent_end":61517,"fully_qualified_name":"ec_writeeeprom","ident_utf16":{"start":{"line_number":1984,"utf16_col":4},"end":{"line_number":1984,"utf16_col":18}},"extent_utf16":{"start":{"line_number":1984,"utf16_col":4},"end":{"line_number":1984,"utf16_col":74}}},{"name":"ec_eeprom2master","kind":"function","ident_start":61600,"ident_end":61616,"extent_start":61600,"extent_end":61630,"fully_qualified_name":"ec_eeprom2master","ident_utf16":{"start":{"line_number":1989,"utf16_col":4},"end":{"line_number":1989,"utf16_col":20}},"extent_utf16":{"start":{"line_number":1989,"utf16_col":4},"end":{"line_number":1989,"utf16_col":34}}},{"name":"ec_eeprom2pdi","kind":"function","ident_start":61690,"ident_end":61703,"extent_start":61690,"extent_end":61717,"fully_qualified_name":"ec_eeprom2pdi","ident_utf16":{"start":{"line_number":1994,"utf16_col":4},"end":{"line_number":1994,"utf16_col":17}},"extent_utf16":{"start":{"line_number":1994,"utf16_col":4},"end":{"line_number":1994,"utf16_col":31}}},{"name":"ec_eeprom_waitnotbusyAP","kind":"function","ident_start":61777,"ident_end":61800,"extent_start":61777,"extent_end":61841,"fully_qualified_name":"ec_eeprom_waitnotbusyAP","ident_utf16":{"start":{"line_number":1999,"utf16_col":7},"end":{"line_number":1999,"utf16_col":30}},"extent_utf16":{"start":{"line_number":1999,"utf16_col":7},"end":{"line_number":1999,"utf16_col":71}}},{"name":"ec_readeepromAP","kind":"function","ident_start":61928,"ident_end":61943,"extent_start":61928,"extent_end":61986,"fully_qualified_name":"ec_readeepromAP","ident_utf16":{"start":{"line_number":2004,"utf16_col":7},"end":{"line_number":2004,"utf16_col":22}},"extent_utf16":{"start":{"line_number":2004,"utf16_col":7},"end":{"line_number":2004,"utf16_col":65}}},{"name":"ec_writeeepromAP","kind":"function","ident_start":62064,"ident_end":62080,"extent_start":62064,"extent_end":62136,"fully_qualified_name":"ec_writeeepromAP","ident_utf16":{"start":{"line_number":2009,"utf16_col":4},"end":{"line_number":2009,"utf16_col":20}},"extent_utf16":{"start":{"line_number":2009,"utf16_col":4},"end":{"line_number":2009,"utf16_col":76}}},{"name":"ec_eeprom_waitnotbusyFP","kind":"function","ident_start":62224,"ident_end":62247,"extent_start":62224,"extent_end":62292,"fully_qualified_name":"ec_eeprom_waitnotbusyFP","ident_utf16":{"start":{"line_number":2014,"utf16_col":7},"end":{"line_number":2014,"utf16_col":30}},"extent_utf16":{"start":{"line_number":2014,"utf16_col":7},"end":{"line_number":2014,"utf16_col":75}}},{"name":"ec_readeepromFP","kind":"function","ident_start":62383,"ident_end":62398,"extent_start":62383,"extent_end":62445,"fully_qualified_name":"ec_readeepromFP","ident_utf16":{"start":{"line_number":2019,"utf16_col":7},"end":{"line_number":2019,"utf16_col":22}},"extent_utf16":{"start":{"line_number":2019,"utf16_col":7},"end":{"line_number":2019,"utf16_col":69}}},{"name":"ec_writeeepromFP","kind":"function","ident_start":62527,"ident_end":62543,"extent_start":62527,"extent_end":62603,"fully_qualified_name":"ec_writeeepromFP","ident_utf16":{"start":{"line_number":2024,"utf16_col":4},"end":{"line_number":2024,"utf16_col":20}},"extent_utf16":{"start":{"line_number":2024,"utf16_col":4},"end":{"line_number":2024,"utf16_col":80}}},{"name":"ec_readeeprom1","kind":"function","ident_start":62693,"ident_end":62707,"extent_start":62693,"extent_end":62737,"fully_qualified_name":"ec_readeeprom1","ident_utf16":{"start":{"line_number":2029,"utf16_col":5},"end":{"line_number":2029,"utf16_col":19}},"extent_utf16":{"start":{"line_number":2029,"utf16_col":5},"end":{"line_number":2029,"utf16_col":49}}},{"name":"ec_readeeprom2","kind":"function","ident_start":62801,"ident_end":62815,"extent_start":62801,"extent_end":62842,"fully_qualified_name":"ec_readeeprom2","ident_utf16":{"start":{"line_number":2034,"utf16_col":7},"end":{"line_number":2034,"utf16_col":21}},"extent_utf16":{"start":{"line_number":2034,"utf16_col":7},"end":{"line_number":2034,"utf16_col":48}}},{"name":"ec_send_processdata_group","kind":"function","ident_start":62910,"ident_end":62935,"extent_start":62910,"extent_end":62948,"fully_qualified_name":"ec_send_processdata_group","ident_utf16":{"start":{"line_number":2039,"utf16_col":4},"end":{"line_number":2039,"utf16_col":29}},"extent_utf16":{"start":{"line_number":2039,"utf16_col":4},"end":{"line_number":2039,"utf16_col":42}}},{"name":"ec_receive_processdata_group","kind":"function","ident_start":63018,"ident_end":63046,"extent_start":63018,"extent_end":63072,"fully_qualified_name":"ec_receive_processdata_group","ident_utf16":{"start":{"line_number":2044,"utf16_col":4},"end":{"line_number":2044,"utf16_col":32}},"extent_utf16":{"start":{"line_number":2044,"utf16_col":4},"end":{"line_number":2044,"utf16_col":58}}},{"name":"ec_send_processdata","kind":"function","ident_start":63154,"ident_end":63173,"extent_start":63154,"extent_end":63179,"fully_qualified_name":"ec_send_processdata","ident_utf16":{"start":{"line_number":2049,"utf16_col":4},"end":{"line_number":2049,"utf16_col":23}},"extent_utf16":{"start":{"line_number":2049,"utf16_col":4},"end":{"line_number":2049,"utf16_col":29}}},{"name":"ec_receive_processdata","kind":"function","ident_start":63229,"ident_end":63251,"extent_start":63229,"extent_end":63264,"fully_qualified_name":"ec_receive_processdata","ident_utf16":{"start":{"line_number":2054,"utf16_col":4},"end":{"line_number":2054,"utf16_col":26}},"extent_utf16":{"start":{"line_number":2054,"utf16_col":4},"end":{"line_number":2054,"utf16_col":39}}}]}},"copilotInfo":null,"copilotAccessAllowed":false,"csrf_tokens":{"/ethercat-diy/stm32f4_ethercat/branches":{"post":"CmKbNzyRI7PIqO1NCEqcvVpn2nPRGxTi_XL3UujH-GwvwlHZHFN5sC-QQXaBQrEMcLTXxkMV5uY79knfSk3J0g"},"/repos/preferences":{"post":"tOHE8KXshLlCPx329dBOg8omJku2nE48iwlNowqg9sf9KKgYlY0_KfQoLCZZTbcaHiRU5kbGkysTC0A8-r1oNw"}}},"title":"stm32f4_ethercat/soem/ethercatmain.c at master · ethercat-diy/stm32f4_etherca