Diff of /branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Edge/FB_Edge/NCMD/onNCMDMessage/svnobj [r814] .. [r815]  Maximize  Restore

Switch to side-by-side view

--- a/branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Edge/FB_Edge/NCMD/onNCMDMessage/svnobj
+++ b/branches/FeatureBranches/refactorpayload/SparkplugB/Function Blocks/FB_Edge/FB_Edge/NCMD/onNCMDMessage/svnobj
@@ -1,288 +1,146 @@
-Gx_lgg!0…jüoRL
êÎÌíˆàæSystem.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
-longTagText
F//note: pMessage is already decoded.onNCMDMessage := FALSE;&//get first messageXpMessage.GetFirstMetric( name => MetricName,\                         datatype => datatype,f                         timestamp =>, //don't caret                         valueString => MetricValueString,p                         valueLreal => MetricValueLreal,l                         valueReal => MetricValueReal,t                         valueVarInt => MetricValueVarInt,h                         MetricValid => MetricValid,\                         HasNext => HasNext );ĖREPEAT //process the metric and grab the next metric until there are no more metrics (hasnext = FALSE).    IF MetricValid THEN0        CASE datatype OF@            MetricDataType.Int8:x                FOR i := LOWER_BOUND( THIS^.arSparkplugInt8,                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugInt8, €                                                          1 ) DO!€                    IF MetricName = arSparkplugInt8[i].Name THEN"–                        arSparkplugInt8[i].Value := MetricValueVarInt.Int8;#4                    END_IF$0                END_FOR;%B            MetricDataType.Int16:&z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt16,'Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt16,(‚                    IF MetricName = arSparkplugInt16[i].Name THEN)š                        arSparkplugInt16[i].Value := MetricValueVarInt.Int16;*Ō                // because cirrus Link MQTT Engine returns the ignition data type not the NBIRTH datatype+z                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt8,,Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt8,-‚                    IF MetricName = arSparkplugUInt8[i].Name THEN.š                        arSparkplugUInt8[i].Value := MetricValueVarInt.UInt8;/B            MetricDataType.Int32:0z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt32,1Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt32,2‚                    IF MetricName = arSparkplugInt32[i].Name THEN3š                        arSparkplugInt32[i].Value := MetricValueVarInt.Int32;4|                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt16,5Ī                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt16,6„                    IF MetricName = arSparkplugUInt16[i].Name THEN7ž                        arSparkplugUInt16[i].Value := MetricValueVarInt.UInt16;8B            MetricDataType.Int64:9z                FOR i := LOWER_BOUND( THIS^.arSparkplugInt64,:Ē                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugInt64,;‚                    IF MetricName = arSparkplugInt64[i].Name THEN<š                        arSparkplugInt64[i].Value := MetricValueVarInt.Int64;=|                FOR i := LOWER_BOUND( THIS^.arSparkplugUInt32,>Ī                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUInt32,?„                    IF MetricName = arSparkplugUInt32[i].Name THEN@ž                        arSparkplugUInt32[i].Value := MetricValueVarInt.UInt32;A|                FOR i := LOWER_BOUND( THIS^.arSparkplugUint64,BĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugUint64,C„                    IF MetricName = arSparkplugUint64[i].Name THENDž                        arSparkplugUint64[i].Value := MetricValueVarInt.Uint64;EB            MetricDataType.UInt8:FD            MetricDataType.UInt16:GD            MetricDataType.UInt32:HD            MetricDataType.UInt64:IB            MetricDataType.Float:Jz                FOR i := LOWER_BOUND( THIS^.arSparkplugFloat,KĒ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugFloat,L‚                    IF MetricName = arSparkplugFloat[i].Name THENMŠ                        arSparkplugFloat[i].Value := MetricValueReal;ND            MetricDataType.Double:O|                FOR i := LOWER_BOUND( THIS^.arSparkplugDouble,PĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugDouble,Q„                    IF MetricName = arSparkplugDouble[i].Name THENRŽ                        arSparkplugDouble[i].Value := MetricValueLreal;SF            MetricDataType.Boolean:Th                //Special place for handling RebirthUz                IF (MetricName = "Node Control/Rebirth") THENVŽ                    //We have found that the server wants us to rebirthWH                    Rebirth := TRUE;Xž                    WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),YĒ                                    'EoN NCMD Received is a Rebirth Command: %s',Zš                                    TO_STRING( MetricValueVarInt.Boolean ) );[,                END_IF\d                //normal place for normal booleans]~                FOR i := LOWER_BOUND( THIS^.arSparkplugBoolean,^Ķ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugBoolean,_†                    IF MetricName = arSparkplugBoolean[i].Name THEN`Ē                        arSparkplugBoolean[i].Value := MetricValueVarInt.Boolean;aF            MetricDataType.String_:b|                FOR i := LOWER_BOUND( THIS^.arSparkplugString,cĪ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugString,d„                    IF MetricName = arSparkplugString[i].Name THENe                        arSparkplugString[i].Value := MetricValueString;fx                FOR i := LOWER_BOUND( THIS^.arSparkplugText,g                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugText,h€                    IF MetricName = arSparkplugText[i].Name THENiŒ                        arSparkplugText[i].Value := MetricValueString;jx                FOR i := LOWER_BOUND( THIS^.arSparkplugUUID,k                                       1 ) TO UPPER_BOUND( THIS^.arSparkplugUUID,l€                    IF MetricName = arSparkplugUUID[i].Name THENmŒ                        arSparkplugUUID[i].Value := MetricValueString;nH            MetricDataType.DateTime:o€                FOR i := LOWER_BOUND( THIS^.arSparkplugDateTime,pĻ                                      1 ) TO UPPER_BOUND( THIS^.arSparkplugDateTime,qˆ                    IF MetricName = arSparkplugDateTime[i].Name THENrŽ                        arSparkplugDateTime[i].Value := MetricValueVarInt.uliDateTime;s@            MetricDataType.Text:t@            MetricDataType.UUID:uĖ            MetricDataType.Unknown, MetricDataType.DataSet, MetricDataType.Bytes, MetricDataType.File,vP                MetricDataType.Template:w†                ; //maybe a log message? in any case, do nothing.  xĘ        //It might be posible that someone sends a NCMD without a datatype but that would be so weirdy        ELSEz            ;{         END_CASE|    END_IF}2    //get the next metric~^    pMessage.GetNextMetric( name => MetricName,b                            datatype => datatype,€l                            timestamp =>, //don't carez                            valueString => MetricValueString,‚v                            valueLreal => MetricValueLreal,ƒr                            valueReal => MetricValueReal,„z                            valueVarInt => MetricValueVarInt,…n                            MetricValid => MetricValid,†b                            HasNext => HasNext );‡*UNTIL HasNext = FALSEˆEND_REPEAT;‰R//pMessage.GetNextMetric don't care todayŠD//pMessage.GetSeq don't care today‹P//pMessage.GetTimestamp don't care todayŒvWriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),\                'EoN NCMD Received Topic: %s',Ž^                WSTRING_TO_STRING( pTopic^ ) );,onNCMDMessage := TRUE;Interface‘L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}’(*“ 	At the moment, this only supports the one specific metric, Node Control/Rebirth”.    Node Command (NCMD)•    –Ę    NCMD messages are used by backend applications to write to EoN node outputs and send Node Control—Š    commands to EoN nodes. Multiple metrics can be supplied in a single NCMD message.˜˜    The following is a representation of a simple NCMD message on the topic:™l        spBv1.0/Sparkplug"! B Devices/NCMD/Raspberry Piš„        "    The  Group ID  of this device is: Sparkplug"! B Devices›ˆ        "    The host  EoN node ID  of this EoN node is: Raspberry Piœd        "    This is an NCMD message to an EoN node     Consider the following Sparkplug"! B payload in the NCMD message shown above:ž
-    {ŸF        "timestamp": 1486144502122, *        "metrics": [{¡^                "name": "Node Control/Rebirth",¢V                "timestamp": 1486144502122,£L                "dataType": "Boolean",¤:                "value": true¥         }]¦
-    }§â    This NCMD payload tells the EoN node to republish its NBIRTH and DBIRTH(s) messages. This can be requested if¨ä    a backend application gets an out of order seq number or if a metric arrives in an NDATA or DDATA message that©~    was not provided in the original NBIRTH or DBIRTH messages.ª*)«${attribute 'hide'}¬6METHOD onNCMDMessage : BOOL­VAR_INPUT®‚    pTopic : POINTER TO WSTRING(GC_Sparkplug.supported_string_lengths); // resembles the topic under which the message is posted ¯END_VAR°VAR_IN_OUT±†    pMessage : FB_PayloadSimpleDecoder; //should already be decoded²VAR_OUTPUT³8    Rebirth : BOOL := FALSE;´VARµŽ    MetricName        : WSTRING(GC_Sparkplug.supported_string_lengths);¶:    MetricValid       : BOOL;·L    MetricValueVarInt : DecodedVarInt;¸@    MetricValueString : WSTRING;¹<    MetricValueLreal  : LREAL;º:    MetricValueReal   : REAL;»:    HasNext           : BOOL;¼N    datatype          : MetricDataType;½:    i                 : DINT;ÐÐÐEæÐÐ	
+Gx_ll8!0…jüoŚ*«¤j
Š¸Z–System.StringL{f8a58466-d7f6-439f-bbb8-d4600e41d099}ImplementationL{3b83b776-fb25-43b8-99f2-3c507c9143fc}TextDocumentL{f3878285-8e4f-490b-bb1b-9acbb7eb04db}TextLinesL{a5de0b0b-1cb5-4913-ac21-9d70293ec00d}	Id
+longTagText
F//note: pMessage is already decoded.onNCMDMessage := FALSE;*// //get first metricRpMessage.GetFirstMetric( name => newName,\	                     datatype => newdatatype,B						 timestamp => newtimestamp,@						 valueString => newString,<						 valueLreal => newLreal,8						 valueReal => newreal,@						 valueVarInt => newVarInt,J						 MetricValid => newMetricValid,<						 HasNext => newHasNext);2                         LTHIS^.GetMetricbyName( DeviceId:= "", Z                       MetricName:= newName, f                       Metric=> itfExistingMetric, N                       GetTimestamp=> ,f                       xError=> MetricNotExisting, D                       eError=> ); .                       !2IF MetricNotExisting THEN"&    xError := TRUE;#f    eError := Error.OhMy_ThatShouldNotHaveHappened;$~    WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),%Ø                    'PrimaryHost ProcessNDATA MetricNotExisting but haven$'t implemeneted NCMD/Rebirth: %s',&˜                    TO_STRING( Error.OhMy_ThatShouldNotHaveHappened ) );    'ELSE(J	// update one as it allready excists)P    Update( Metric := itfExistingMetric,*8            Name := newName,+H            DataType := newdatatype,,Z            Status := MetricStatus.ONLINE_OK,-L            Timestamp := newtimestamp,.B            String_ := newString,/@            LReal_ :=  newLreal,0:            Real_ := newreal,1F            VarInt :=  newVarInt );2END_IF34&WHILE newHasNext DO5R	pMessage.GetNextMetric( name => newName,6h                            datatype => newdatatype,7l                            timestamp => newtimestamp,8j                            valueString => newString,9f                            valueLreal => newLreal,:b                            valueReal => newreal,;j                            valueVarInt => newVarInt,<t                            MetricValid => newMetricValid,=f                            HasNext => newHasNext);>8                            ?P	THIS^.GetMetricbyName( DeviceId := "", @d                           MetricName := newName, Ap                           Metric => itfExistingMetric, BV                           GetTimestamp=> ,C`						   xError=> MetricNotExisting, eError=> );D6                           E4	IF MetricNotExisting THENF.        xError := TRUE;Gn        eError := Error.OhMy_ThatShouldNotHaveHappened;H†        WriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),Ià                        'PrimaryHost ProcessNDATA MetricNotExisting but haven$'t implemeneted NCMD/Rebirth: %s',J˜                        TO_STRING( Error.OhMy_ThatShouldNotHaveHappened ) );K
+	ELSEL		//update oneMX        Update( Metric := itfExistingMetric,N@                Name := newName,OP                DataType := newdatatype,Pb                Status := MetricStatus.ONLINE_OK,QT                Timestamp := newtimestamp,RJ                String_ := newString,SH                LReal_ :=  newLreal,TB                Real_ := newreal,UN                VarInt :=  newVarInt );V                 W	END_IFXEND_WHILEYvWriteDeviceLog( UDINT_TO_DWORD( CmpLog.LogClass.LOG_INFO ),Z\                'EoN NCMD Received Topic: %s',[^                WSTRING_TO_STRING( pTopic^ ) );\,onNCMDMessage := TRUE;]Interface^L{a9ed5b7e-75c5-4651-af16-d2c27e98cb94}_(*` 	At the moment, this only supports the one specific metric, Node Control/Rebirtha.    Node Command (NCMD)b    cÊ    NCMD messages are used by backend applications to write to EoN node outputs and send Node Controldª    commands to EoN nodes. Multiple metrics can be supplied in a single NCMD message.e˜    The following is a representation of a simple NCMD message on the topic:fl        spBv1.0/Sparkplug"! B Devices/NCMD/Raspberry Pig„        "    The  Group ID  of this device is: Sparkplug"! B Deviceshˆ        "    The host  EoN node ID  of this EoN node is: Raspberry Piid        "    This is an NCMD message to an EoN nodej     Consider the following Sparkplug"! B payload in the NCMD message shown above:k
+    {lF        "timestamp": 1486144502122,m*        "metrics": [{n^                "name": "Node Control/Rebirth",oV                "timestamp": 1486144502122,pL                "dataType": "Boolean",q:                "value": truer         }]s
+    }tâ    This NCMD payload tells the EoN node to republish its NBIRTH and DBIRTH(s) messages. This can be requested ifuä    a backend application gets an out of order seq number or if a metric arrives in an NDATA or DDATA message thatv~    was not provided in the original NBIRTH or DBIRTH messages.w*)x${attribute 'hide'}y6METHOD onNCMDMessage : BOOLzVAR_INPUT{‚    pTopic : POINTER TO WSTRING(GC_Sparkplug.supported_string_lengths); // resembles the topic under which the message is posted |END_VAR}VAR_IN_OUT~†    pMessage : FB_PayloadSimpleDecoder; //should already be decodedVAR_OUTPUT€8    Rebirth : BOOL := FALSE; 	xError  : BOOL;‚"	eError  : ERROR;ƒVAR„Ž    newName           : WSTRING(GC_Sparkplug.supported_string_lengths);…@    newMetricValid       : BOOL;†<    newVarInt : DecodedVarInt;‡0    newString : WSTRING;ˆ,    newLreal  : LREAL;‰*    newreal   : REAL;Š@    newHasNext           : BOOL;‹T    newdatatype          : MetricDataType;ŒF	newtimestamp         : T_DateTime;:    i                 : DINT;Ž	F	itfExistingMetric : IRemoteMetric;4	MetricNotExisting : BOOL;ĞĞĞERĞĞ	
 ­UÚÐ-
ÐÐ	
 ­VÚÐ-ÐÐ	
 ­WÚÐ-ÐÐ	
-­XÚÐ-ÐÐ	
-­YÚÐ-ÐÐ	
-­ZÚÐ-ÐÐ	
-­[ÚÐ-ÐÐ	
-­\ÚÐ-ÐÐ	
-­]ÚÐ-ÐÐ	
-­^ÚÐ-ÐÐ	
-­_ÚÐ-ÐÐ	
-­`ÚÐ-ÐÐ	
-­aÚÐ-ÐÐ	
-­bÚÐ-ÐÐ	
-­cÚÐ-ÐÐ	
-­dÚÐ-ÐÐ	
-­eÚÐ-ÐÐ	
-­fÚÐ-ÐÐ	
-­gÚÐ-ÐÐ	
-­hÚÐ- ÐÐ	
-­iÚÐ-!ÐÐ	
-­jÚÐ-"ÐÐ	
-­kÚÐ-#ÐÐ	
-­lÚÐ-$ÐÐ	
-­mÚÐ-%ÐÐ	
-­nÚÐ-&ÐÐ	
-­oÚÐ-'ÐÐ	
-­pÚÐ- ÐÐ	
-­qÚÐ-(ÐÐ	
-­rÚÐ-)ÐÐ	
-­sÚÐ-#ÐÐ	
-­tÚÐ-$ÐÐ	
-­uÚÐ-ÐÐ	
-­vÚÐ-*ÐÐ	
-­wÚÐ-+ÐÐ	
-­xÚÐ-,ÐÐ	
-­yÚÐ- ÐÐ	
-­zÚÐ--ÐÐ	
-­{ÚÐ-.ÐÐ	
-­|ÚÐ-#ÐÐ	
-­}ÚÐ-$ÐÐ	
-­~ÚÐ-/ÐÐ	
-­ÚÐ-0ÐÐ	
-­€ÚÐ-1ÐÐ	
-­ÚÐ- ÐÐ	
-­‚ÚÐ-2ÐÐ	
-­ƒÚÐ-3ÐÐ	
-­„ÚÐ-#ÐÐ	
-­…ÚÐ-$ÐÐ	
-­†ÚÐ-ÐÐ	
-­‡ÚÐ-*ÐÐ	
-­ˆÚÐ-4ÐÐ	
-­‰ÚÐ-5ÐÐ	
-­ŠÚÐ- ÐÐ	
-­‹ÚÐ-6ÐÐ	
-­ŒÚÐ-7ÐÐ	
-­ÚÐ-#ÐÐ	
-­ŽÚÐ-$ÐÐ	
-­ÚÐ-8ÐÐ	
-­ÚÐ-9ÐÐ	
-­‘ÚÐ-:ÐÐ	
-­’ÚÐ- ÐÐ	
-­“ÚÐ-;ÐÐ	
-­”ÚÐ-<ÐÐ	
-­•ÚÐ-#ÐÐ	
-­–ÚÐ-$ÐÐ	
-­—ÚÐ-ÐÐ	
-­˜ÚÐ-*ÐÐ	
-­™ÚÐ-=ÐÐ	
-­šÚÐ->ÐÐ	
-­›ÚÐ- ÐÐ	
-­œÚÐ-?ÐÐ	
-­ÚÐ-@ÐÐ	
-­žÚÐ-#ÐÐ	
-­ŸÚÐ-$ÐÐ	
-­ ÚÐ-ÐÐ	
-­¡ÚÐ-*ÐÐ	
-­¢ÚÐ-AÐÐ	
-­£ÚÐ-BÐÐ	
-­¤ÚÐ- ÐÐ	
-­¥ÚÐ-CÐÐ	
-­¦ÚÐ-DÐÐ	
-­§ÚÐ-#ÐÐ	
-­¨ÚÐ-$ÐÐ	
-­©ÚÐ-EÐÐ	
-­ªÚÐ-+ÐÐ	
-­«ÚÐ-,ÐÐ	
-­¬ÚÐ- ÐÐ	
-­­ÚÐ--ÐÐ	
-­®ÚÐ-.ÐÐ	
-­¯ÚÐ-#ÐÐ	
-­°ÚÐ-$ÐÐ	
-­±ÚÐ-FÐÐ	
-­²ÚÐ-4ÐÐ	
-­³ÚÐ-5ÐÐ	
-­´ÚÐ- ÐÐ	
-­µÚÐ-6ÐÐ	
-­¶ÚÐ-7ÐÐ	
-­·ÚÐ-#ÐÐ	
-­¸ÚÐ-$ÐÐ	
-­¹ÚÐ-GÐÐ	
-­ºÚÐ-=ÐÐ	
-­»ÚÐ->ÐÐ	
-­¼ÚÐ- ÐÐ	
-­½ÚÐ-?ÐÐ	
-­¾ÚÐ-@ÐÐ	
-­¿ÚÐ-#ÐÐ	
-­ÀÚÐ-$ÐÐ	
-­ÁÚÐ-HÐÐ	
-­ÂÚÐ-AÐÐ	
-­ÃÚÐ-BÐÐ	
-­ÄÚÐ- ÐÐ	
-­ÅÚÐ-CÐÐ	
-­ÆÚÐ-DÐÐ	
-­ÇÚÐ-#ÐÐ	
-­ÈÚÐ-$ÐÐ	
-­ÉÚÐ-IÐÐ	
-­ÊÚÐ-JÐÐ	
-­ËÚÐ-KÐÐ	
-­ÌÚÐ- ÐÐ	
-­ÍÚÐ-LÐÐ	
-­ÎÚÐ-MÐÐ	
-­ÏÚÐ-#ÐÐ	
-­ÐÚÐ-$ÐÐ	
-­ÑÚÐ-NÐÐ	
-­ÒÚÐ-OÐÐ	
-­ÓÚÐ-PÐÐ	
-­ÔÚÐ- ÐÐ	
-­ÕÚÐ-QÐÐ	
-­ÖÚÐ-RÐÐ	
-­×ÚÐ-#ÐÐ	
-­ØÚÐ-$ÐÐ	
-­ÙÚÐ-SÐÐ	
-­ÚÚÐ-TÐÐ	
-­ÛÚÐ-UÐÐ	
-­ÜÚÐ-VÐÐ	
-­ÝÚÐ-WÐÐ	
-­ÞÚÐ-XÐÐ	
-­ßÚÐ-YÐÐ	
-­àÚÐ-ZÐÐ	
-­áÚÐ-[ÐÐ	
-­âÚÐ-ÐÐ	
-­ãÚÐ-\ÐÐ	
-­äÚÐ-]ÐÐ	
-­åÚÐ-^ÐÐ	
-­æÚÐ- ÐÐ	
-­çÚÐ-_ÐÐ	
-­èÚÐ-`ÐÐ	
-­éÚÐ-#ÐÐ	
-­êÚÐ-$ÐÐ	
-­ëÚÐ-aÐÐ	
-­ìÚÐ-bÐÐ	
-­íÚÐ-cÐÐ	
-­îÚÐ- ÐÐ	
-­ïÚÐ-dÐÐ	
-­ðÚÐ-eÐÐ	
-­ñÚÐ-#ÐÐ	
-­òÚÐ-$ÐÐ	
-­óÚÐ-ÐÐ	
-­ôÚÐ-*ÐÐ	
-­õÚÐ-fÐÐ	
-­öÚÐ-gÐÐ	
-­÷ÚÐ- ÐÐ	
-­øÚÐ-hÐÐ	
-­ùÚÐ-iÐÐ	
-­úÚÐ-#ÐÐ	
-­ûÚÐ-$ÐÐ	
-­üÚÐ-ÐÐ	
-­ýÚÐ-*ÐÐ	
-­þÚÐ-jÐÐ	
-­ÿÚÐ-kÐÐ	
-­ÚÐ- ÐÐ	
-­ÚÐ-lÐÐ	
-­ÚÐ-mÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-$ÐÐ	
-­ÚÐ-nÐÐ	
-­ÚÐ-oÐÐ	
-­ÚÐ-pÐÐ	
-­ÚÐ- ÐÐ	
-­	ÚÐ-qÐÐ	

-┌đ-rđđ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-$ÐÐ	

ÚÐ-sÐÐ	
-­ÚÐ-fÐÐ	
-­ÚÐ-gÐÐ	
-­ÚÐ- ÐÐ	
-­ÚÐ-hÐÐ	
-­ÚÐ-iÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-$ÐÐ	
-­ÚÐ-tÐÐ	
-­ÚÐ-jÐÐ	
-­ÚÐ-kÐÐ	
-­ÚÐ- ÐÐ	
-­ÚÐ-lÐÐ	
-­ÚÐ-mÐÐ	
-­ÚÐ-#ÐÐ	
-­ÚÐ-$ÐÐ	
-­ÚÐ-uÐÐ	
-­ÚÐ-vÐÐ	
-­ÚÐ-wÐÐ	
-­ ÚÐ-xÐÐ	
-­!ÚÐ-yÐÐ	
-­"ÚÐ-zÐÐ	
-­#ÚÐ-{ÐÐ	
-­$ÚÐ-|ÐÐ	
-­%ÚÐ-ÐÐ	
-­&ÚÐ-}ÐÐ	
-­'ÚÐ-~ÐÐ	
-­(ÚÐ-ÐÐ	
-­)ÚÐ-€ÐÐ	
-­*ÚÐ-ÐÐ	
-­+ÚÐ-‚ÐÐ	
-­,ÚÐ-ƒÐÐ	
-­-ÚÐ-„ÐÐ	
-­.ÚÐ-…ÐÐ	
-­/ÚÐ-†ÐÐ	
-­0ÚÐ-‡ÐÐ	
-­1ÚÐ-ˆÐÐ	
-­2ÚÐ-ÐÐ	
-­3ÚÐ-‰ÐÐ	
-­4ÚÐ-ŠÐÐ	
-­5ÚÐ-‹ÐÐ	
-­6ÚÐ-ŒÐÐ	
-­7ÚÐ-ÐÐ	
-­8ÚÐ-ŽÐÐ	
-­9ÚÐ-ÐÐ	
-­ÚÐ-А‘ÐE5ÐÐ	
-­!ÚÐ-’ÐÐ	
-­"ÚÐ-“ÐÐ	
-­#ÚÐ-”ÐÐ	
-­$ÚÐ-•ÐÐ	
-­%ÚÐ-–ÐÐ	
-­&ÚÐ-—ÐÐ	
-­'ÚÐ-˜ÐÐ	
-­(ÚÐ-ÐÐ	
-­)ÚÐ-™ÐÐ	
-­*ÚÐ-ÐÐ	
-­+ÚÐ-šÐÐ	
-­,ÚÐ-›ÐÐ	
-­-ÚÐ-œÐÐ	
-­.ÚÐ-ÐÐ	
-­/ÚÐ-ÐÐ	
-­0ÚÐ-•ÐÐ	
-­1ÚÐ-žÐÐ	
-­2ÚÐ-ŸÐÐ	
-­3ÚÐ- ÐÐ	
-­4ÚÐ-¡ÐÐ	
-­5ÚÐ-¢ÐÐ	
-­6ÚÐ-£ÐÐ	
-­7ÚÐ-¤ÐÐ	
-­8ÚÐ-¥ÐÐ	
-­9ÚÐ-¦ÐÐ	
-­:ÚÐ-•ÐÐ	
-­;ÚÐ-§ÐÐ	
-­<ÚÐ-¨ÐÐ	
-­=ÚÐ-©ÐÐ	
-­>ÚÐ-ÐÐ	
-­?ÚÐ-ªÐÐ	
-­@ÚÐ-«ÐÐ	
-­AÚÐ-¬ÐÐ	
-­BÚÐ-­ÐÐ	
-­CÚÐ-®ÐÐ	
-­DÚÐ-¯ÐÐ	
-­EÚÐ-°ÐÐ	
-­FÚÐ-±ÐÐ	
-­GÚÐ-¯ÐÐ	
-­HÚÐ-²ÐÐ	
-­IÚÐ-³ÐÐ	
-­JÚÐ-¯ÐÐ	
-­KÚÐ-´ÐÐ	
-­LÚÐ-µÐÐ	
-­MÚÐ-¶ÐÐ	
-­NÚÐ-·ÐÐ	
-­OÚÐ-¸ÐÐ	
-­PÚÐ-¹ÐÐ	
-­QÚÐ-ºÐÐ	
-­RÚÐ-»ÐÐ	
-­SÚÐ-¼ÐÐ	
-­TÚÐ-½ÐÐ	
-­ÚÐ-¯
\ No newline at end of file
+­FÚÐ-ÐÐ	
+­GÚÐ-ÐÐ	
+­HÚÐ-ÐÐ	
+­IÚÐ-ÐÐ	
+­JÚÐ-ÐÐ	
+­KÚÐ-ÐÐ	
+­LÚÐ-ÐÐ	
+­MÚÐ-ÐÐ	
+­NÚÐ-ÐÐ	
+­OÚÐ-ÐÐ	
+­PÚÐ-ÐÐ	
+­QÚÐ-ÐÐ	
+­RÚÐ-ÐÐ	
+­SÚÐ-ÐÐ	
+­TÚÐ-ÐÐ	
+­UÚÐ-ÐÐ	
+­VÚÐ- ÐÐ	
+­WÚÐ-!ÐÐ	
+­XÚÐ-"ÐÐ	
+­YÚÐ-#ÐÐ	
+­ZÚÐ-$ÐÐ	
+­[ÚÐ-%ÐÐ	
+­\ÚÐ-&ÐÐ	
+­]ÚÐ-'ÐÐ	
+­^ÚÐ-(ÐÐ	
+­_ÚÐ-)ÐÐ	
+­`ÚÐ-*ÐÐ	
+­aÚÐ-+ÐÐ	
+­bÚÐ-,ÐÐ	
+­cÚÐ--ÐÐ	
+­dÚÐ-.ÐÐ	
+­eÚÐ-/ÐÐ	
+­fÚÐ-0ÐÐ	
+­gÚÐ-1ÐÐ	
+­hÚÐ-2ÐÐ	
+­iÚÐ-3ÐÐ	
+­jÚÐ-4ÐÐ	
+­kÚÐ-5ÐÐ	
+­lÚÐ-6ÐÐ	
+­mÚÐ-7ÐÐ	
+­nÚÐ-8ÐÐ	
+­oÚÐ-9ÐÐ	
+­pÚÐ-:ÐÐ	
+­qÚÐ-;ÐÐ	
+­rÚÐ-<ÐÐ	
+­sÚÐ-=ÐÐ	
+­tÚÐ->ÐÐ	
+­uÚÐ-?ÐÐ	
+­vÚÐ-@ÐÐ	
+­wÚÐ-AÐÐ	
+­xÚÐ-BÐÐ	
+­yÚÐ-CÐÐ	
+­zÚÐ-DÐÐ	
+­{ÚÐ-EÐÐ	
+­|ÚÐ-FÐÐ	
+­}ÚÐ-GÐÐ	
+­~ÚÐ-HÐÐ	
+­ÚÐ-IÐÐ	
+­€ÚÐ-JÐÐ	
+­ÚÐ-KÐÐ	
+­‚ÚÐ-LÐÐ	
+­ƒÚÐ-MÐÐ	
+­„ÚÐ-NÐÐ	
+­…ÚÐ-OÐÐ	
+­†ÚÐ-PÐÐ	
+­‡ÚÐ-QÐÐ	
+­ˆÚÐ-RÐÐ	
+­‰ÚÐ-SÐÐ	
+­ŠÚÐ-TÐÐ	
+­‹ÚÐ-UÐÐ	
+­ŒÚÐ-VÐÐ	
+­ÚÐ-WÐÐ	
+­:ÚÐ-XÐÐ	
+­•ÚÐ-3ÐÐ	
+­–ÚÐ-YÐÐ	
+­—ÚÐ-ZÐÐ	
+­˜ÚÐ-[ÐÐ	
+­™ÚÐ-3ÐÐ	
+­”ÚÐ-\Ð]^ÐE;ÐÐ	
+­!ÚÐ-_ÐÐ	
+­"ÚÐ-`ÐÐ	
+­#ÚÐ-aÐÐ	
+­$ÚÐ-bÐÐ	
+­%ÚÐ-cÐÐ	
+­&ÚÐ-dÐÐ	
+­'ÚÐ-eÐÐ	
+­(ÚÐ-3ÐÐ	
+­)ÚÐ-fÐÐ	
+­*ÚÐ-3ÐÐ	
+­+ÚÐ-gÐÐ	
+­,ÚÐ-hÐÐ	
+­-ÚÐ-iÐÐ	
+­.ÚÐ-3ÐÐ	
+­/ÚÐ-jÐÐ	
+­0ÚÐ-bÐÐ	
+­1ÚÐ-kÐÐ	
+­2ÚÐ-lÐÐ	
+­3ÚÐ-mÐÐ	
+­4ÚÐ-nÐÐ	
+­5ÚÐ-oÐÐ	
+­6ÚÐ-pÐÐ	
+­7ÚÐ-qÐÐ	
+­8ÚÐ-rÐÐ	
+­9ÚÐ-sÐÐ	
+­:ÚÐ-bÐÐ	
+­;ÚÐ-tÐÐ	
+­<ÚÐ-uÐÐ	
+­=ÚÐ-vÐÐ	
+­>ÚÐ-3ÐÐ	
+­?ÚÐ-wÐÐ	
+­@ÚÐ-xÐÐ	
+­AÚÐ-yÐÐ	
+­BÚÐ-zÐÐ	
+­CÚÐ-{ÐÐ	
+­DÚÐ-|ÐÐ	
+­EÚÐ-}ÐÐ	
+­FÚÐ-~ÐÐ	
+­GÚÐ-|ÐÐ	
+­HÚÐ-ÐÐ	
+­IÚÐ-€ÐÐ	
+­’ÚÐ-ÐÐ	
+­“ÚÐ-‚ÐÐ	
+­JÚÐ-|ÐÐ	
+­KÚÐ-ƒÐÐ	
+­LÚÐ-„ÐÐ	
+­MÚÐ-…ÐÐ	
+­NÚÐ-†ÐÐ	
+­OÚÐ-‡ÐÐ	
+­PÚÐ-ˆÐÐ	
+­QÚÐ-‰ÐÐ	
+­RÚÐ-ŠÐÐ	
+­SÚÐ-‹ÐÐ	
+­ŽÚÐ-ŒÐÐ	
+­TÚÐ-ÐÐ	
+­ÚÐ-ŽÐÐ	
+­ÚÐ-ÐÐ	
+­‘ÚÐ-ÐÐ	
+­ÚÐ-|
\ No newline at end of file