diff --git a/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenContract.Tests.csproj b/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenContract.Tests.csproj index df500981..6e17f810 100644 --- a/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenContract.Tests.csproj +++ b/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenContract.Tests.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + net6.0 false @@ -9,6 +9,7 @@ + diff --git a/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenTests.cs b/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenTests.cs index 7a28850b..5fdf0229 100644 --- a/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenTests.cs +++ b/Testnet/NonFungibleToken-Ticket/NonFungibleToken.Tests/NonFungibleTokenTests.cs @@ -2,6 +2,8 @@ using FluentAssertions; using Moq; using Moq.Language.Flow; +using NBitcoin; +using NBitcoin.Networks; using NonFungibleTokenContract.Tests; using Stratis.SmartContracts; using System; @@ -15,24 +17,37 @@ public class NonFungibleTokenTests private Mock contractLoggerMock; private InMemoryState state; private Mock transactionExecutorMock; + private ISerializer serializer; private Address contractAddress; + private Network network; private string name; private string symbol; private bool ownerOnlyMinting; + class ChameleonNetwork : Network + { + public ChameleonNetwork(byte base58Prefix) + { + this.Base58Prefixes = new byte[][] { new byte[] { base58Prefix } }; + } + } + public NonFungibleTokenTests() { this.contractLoggerMock = new Mock(); this.smartContractStateMock = new Mock(); this.transactionExecutorMock = new Mock(); + this.serializer = new Stratis.SmartContracts.CLR.Serialization.Serializer(new Stratis.SmartContracts.CLR.Serialization.ContractPrimitiveSerializerV2(null)); this.state = new InMemoryState(); this.smartContractStateMock.Setup(s => s.PersistentState).Returns(this.state); this.smartContractStateMock.Setup(s => s.ContractLogger).Returns(this.contractLoggerMock.Object); this.smartContractStateMock.Setup(x => x.InternalTransactionExecutor).Returns(this.transactionExecutorMock.Object); + this.smartContractStateMock.Setup(x => x.Serializer).Returns(this.serializer); this.contractAddress = "0x0000000000000000000000000000000000000001".HexToAddress(); this.name = "Tickets Token"; this.symbol = "TCKT"; this.ownerOnlyMinting = true; + this.network = new ChameleonNetwork(119); } public string GetTokenURI(UInt256 tokenId) => $"https://example.com/api/tokens/{tokenId}"; @@ -590,6 +605,39 @@ public void TransferFrom_ValidTokenTransfer_MessageSender_TransfersTokenFrom_To( contractLoggerMock.Verify(l => l.Log(It.IsAny(), new NonFungibleToken.TransferLog { From = ownerAddress, To = targetAddress, TokenId = 1 })); } + private string AddressToString(Address address) + { + var address160 = Stratis.SmartContracts.CLR.AddressExtensions.ToUint160(address); + return Stratis.SmartContracts.CLR.AddressExtensions.ToBase58Address(address160, this.network); + } + + [Fact] + public void DelegatedTransfer_ValidTokenTransfer_MessageSender_TransfersTokenFrom_To() + { + var key = new Key(); + var ownerAddress = Convert.ToHexString(key.PubKey.Hash.ToBytes()).HexToAddress(); + var targetAddress = "0x0000000000000000000000000000000000000007".HexToAddress(); + var contractAddress = "0x0000000000000000000000000000000000000000".HexToAddress(); + state.SetAddress("IdToOwner:1", ownerAddress); + state.SetUInt256($"Balance:{ownerAddress}", 1); + + smartContractStateMock.Setup(m => m.Message.Sender).Returns(ownerAddress); + + var nonFungibleToken = CreateNonFungibleToken(); + var uid = Guid.NewGuid(); + + string url = $"?uid={Convert.ToHexString(uid.ToByteArray().Reverse().ToArray())}&contract={this.AddressToString(contractAddress)}&method=DelegatedTransfer&from={this.AddressToString(ownerAddress)}&to={this.AddressToString(targetAddress)}&tokenId=1"; + byte[] signature = Convert.FromBase64String(key.SignMessage(url)); + + nonFungibleToken.DelegatedTransfer(url, signature); + + Assert.Equal(targetAddress, state.GetAddress("IdToOwner:1")); + Assert.Equal(0, state.GetUInt256($"Balance:{ownerAddress}")); + Assert.Equal(1, state.GetUInt256($"Balance:{targetAddress}")); + + contractLoggerMock.Verify(l => l.Log(It.IsAny(), new NonFungibleToken.TransferLog { From = ownerAddress, To = targetAddress, TokenId = 1 })); + } + [Fact] public void TransferFrom_NFTokenOwnerZero_ThrowsException() { diff --git a/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleToken.cs b/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleToken.cs index 71ec7421..2e5bec68 100644 --- a/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleToken.cs +++ b/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleToken.cs @@ -1,9 +1,23 @@ using Stratis.SmartContracts; +using Stratis.SCL.Crypto; + /// /// A non fungible token contract. /// public class NonFungibleToken : SmartContract { + /// + /// Function to check for replays of signed transfers. + /// + /// A unique number identifying the transfer. + /// True if the transfer had already been performed, false otherwise. + public bool KnownTransfer(UInt128 transferID) => State.GetBool($"Transfer:{transferID}"); + + /// + /// Records the of a signed transfer. + /// + /// A unique number identifying the transfer. + private void SetKnownTransfer(UInt128 transferID) => State.SetBool($"Transfer:{transferID}", true); /// /// Function to check which interfaces are supported by this contract. @@ -215,6 +229,52 @@ public void SafeTransferFrom(Address from, Address to, UInt256 tokenId, byte[] d SafeTransferFromInternal(from, to, tokenId, data); } + /// + /// Throws if can't be resolved from . + /// Throws if the following fields are invalid: + /// + /// Throws if "method" is not "DelegatedTransfer". + /// Throws if "contract" is not this.Address. + /// Throws if "uid" has successfully been used before. + /// Throws if "from" is not the current owner or has a different address prexix from the "to" address or contract address. + /// Throws if "to" is the zero address or has a different address prexix from the "to" address or contract address. + /// Throws if "tokenId" is not a valid NFT or does not belong to the signee. + /// + /// + /// The caller is responsible to confirm that is capable of receiving NFTs or else + /// they maybe be permanently lost. + /// The url containing the method arguments. + /// The signature of the string signed by the owner. + public void DelegatedTransfer(string url, byte[] signature) + { + string[] args = SSAS.GetURLArguments(url, new string[] { "uid", "contract", "method", "from", "to", "tokenId" }); + + Assert(args != null && args.Length == 6 && args[2] == nameof(DelegatedTransfer), "Invalid url."); + Assert(Serializer.ToAddress(SSAS.ParseAddress(args[1], out byte prefix0)) == this.Address, "Invalid contract address."); + + var uniqueNumber = UInt128.Parse($"0x{args[0]}"); + Assert(!KnownTransfer(uniqueNumber), "The transfer has already been performed."); + + var tokenId = UInt256.Parse(args[5]); + Assert(SSAS.TryGetSignerSHA256(Serializer.Serialize(url), signature, out Address signer), "Could not resolve signer."); + Assert(signer == GetIdToOwner(tokenId), "Invalid signature."); + + // "ParseAddress" should work regardless of whether main or test address strings are passed. + var from = Serializer.ToAddress(SSAS.ParseAddress(args[3], out byte prefix1)); + var to = Serializer.ToAddress(SSAS.ParseAddress(args[4], out byte prefix2)); + Assert(prefix1 == prefix2, "'From' and 'To' address prefixes are different."); + Assert(prefix1 == prefix0, "Contract address versus 'From' and 'To' address prefixes are different."); + + // Allow Message.Sender to perform the transfer. + SetIdToApproval(tokenId, Message.Sender); + + SetKnownTransfer(uniqueNumber); + + TransferFrom(from, to, tokenId); + + LogDelegatedTransfer(from, to, tokenId, uniqueNumber, signature); + } + /// /// Transfers the ownership of an NFT from one address to another address. This function can /// be changed to payable. @@ -423,6 +483,11 @@ private void LogTransfer(Address from, Address to, UInt256 tokenId) Log(new TransferLog() { From = from, To = to, TokenId = tokenId }); } + private void LogDelegatedTransfer(Address from, Address to, UInt256 tokenId, UInt128 uniqueNumber, byte[] signature) + { + Log(new DelegatedTransferLog() { From = from, To = to, TokenId = tokenId, UniqueNumber = uniqueNumber, Signature = signature }); + } + /// /// This logs when the approved Address for an NFT is changed or reaffirmed. The zero /// Address indicates there is no approved Address. When a Transfer logs, this also @@ -612,6 +677,19 @@ private enum TokenInterface ITicketContract = 100, } + public struct DelegatedTransferLog + { + [Index] + public Address From; + [Index] + public Address To; + [Index] + public UInt256 TokenId; + + public UInt128 UniqueNumber; + public byte[] Signature; + } + public struct TransferLog { [Index] diff --git a/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleTokenContract.csproj b/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleTokenContract.csproj index b0475c52..88f59e1f 100644 --- a/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleTokenContract.csproj +++ b/Testnet/NonFungibleToken-Ticket/NonFungibleToken/NonFungibleTokenContract.csproj @@ -1,12 +1,16 @@ - netcoreapp2.1 + net6.0 - + + + + + diff --git a/Testnet/NonFungibleToken-Ticket/NonFungibleTokenContract.sln b/Testnet/NonFungibleToken-Ticket/NonFungibleTokenContract.sln index e069dd04..837413ae 100644 --- a/Testnet/NonFungibleToken-Ticket/NonFungibleTokenContract.sln +++ b/Testnet/NonFungibleToken-Ticket/NonFungibleTokenContract.sln @@ -1,12 +1,14 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29201.188 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33403.182 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NonFungibleTokenContract", "NonFungibleToken\NonFungibleTokenContract.csproj", "{D64B8959-5CC0-43D4-99B7-E07481222B5D}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NonFungibleTokenContract.Tests", "NonFungibleToken.Tests\NonFungibleTokenContract.Tests.csproj", "{855863D4-4F60-47D0-AD2A-164749950614}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Stratis.SCL", "..\..\..\StratisFullNode-1\src\Stratis.SCL\Stratis.SCL.csproj", "{D0399ECC-6A43-46F4-91AF-37B901661426}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {855863D4-4F60-47D0-AD2A-164749950614}.Debug|Any CPU.Build.0 = Debug|Any CPU {855863D4-4F60-47D0-AD2A-164749950614}.Release|Any CPU.ActiveCfg = Release|Any CPU {855863D4-4F60-47D0-AD2A-164749950614}.Release|Any CPU.Build.0 = Release|Any CPU + {D0399ECC-6A43-46F4-91AF-37B901661426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D0399ECC-6A43-46F4-91AF-37B901661426}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0399ECC-6A43-46F4-91AF-37B901661426}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D0399ECC-6A43-46F4-91AF-37B901661426}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Testnet/NonFungibleToken-Ticket/README.MD b/Testnet/NonFungibleToken-Ticket/README.MD index 373d5b50..8ce6e5cf 100644 --- a/Testnet/NonFungibleToken-Ticket/README.MD +++ b/Testnet/NonFungibleToken-Ticket/README.MD @@ -6,10 +6,10 @@ v2.0.0 ``` **Contract Hash** ``` -0a42a2b8a47e1aaac340e141700d146043e3e0d4bcceb9160994b962f4831ca2 +adf1b825661553dbad82d3a0756a19976de14339015b77850879093322f56fda ``` **Contract Byte Code** ``` -4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0102005CB4C08A0000000000000000E00022200B013000002200000002000000000000FE400000002000000060000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000AC4000004F000000000000000000000000000000000000000000000000000000006000000C000000904000001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E7465787400000004210000002000000022000000020000000000000000000000000000200000602E72656C6F6300000C000000006000000002000000240000000000000000000000000000400000420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000E0400000000000004800000002000500CC280000C417000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007202280500000A7201000070038C0E000001280600000A6F0700000A2A7A02280500000A720100007003B88C0E000001280600000A046F0800000A2A46722F000070038C06000001280600000A2A4E02280500000A020328030000066F0900000A2A5202280500000A02032803000006046F0A00000A2A46724B000070038C06000001280600000A2A4E02280500000A020328060000066F0900000A2A5202280500000A02032806000006046F0A00000A2A7202280500000A726D000070038C07000001280600000A6F0B00000A2A7602280500000A726D000070038C07000001280600000A046F0C00000A2A8A02280500000A7285000070038C07000001048C07000001280D00000A6F0700000A2A8E02280500000A7285000070038C07000001048C07000001280D00000A056F0800000A2A7202280500000A72B5000070038C06000001280600000A6F0700000A2A7602280500000A72B5000070038C06000001280600000A046F0800000A2A4602280500000A72CB0000706F0900000A2A4A02280500000A72CB000070036F0A00000A2A4602280500000A72D70000706F0900000A2A4A02280500000A72D7000070036F0A00000A2A4602280500000A72F10000706F0E00000A2A4A02280500000A72F1000070036F0F00000A2A4602280500000A72FB0000706F0E00000A2A4A02280500000A72FB000070036F0F00000A2A7202280500000A7209010070038C06000001280600000A6F0E00000A2A7602280500000A7209010070038C06000001280600000A046F0F00000A2A4602280500000A72190100706F0700000A2A4A02280500000A7219010070036F0800000A2A001330030060000000000000000203281000000A021717280200000602181728020000060219162802000006021A172802000006021B162802000006021F6417280200000602042814000006020528160000060202281100000A6F1200000A2810000006020E04281A0000062A5A022835000006020317280E0000060203282F0000062A220203280D0000062A32020304050E04282A0000062A4202030405168D12000001282A0000062A0000133004003A000000010000110204283C000006020528040000060A0206283C0000060206052832000006020603281300000A723B010070281400000A0206040528270000062A0000133004004400000001000011020428040000060A0206283C00000602062830000006020306281500000A728901007072D9010070280600000A281400000A020403280800000602060304282D0000062A9E0202281100000A6F1200000A0304280C0000060202281100000A6F1200000A0304282E0000062A3E0203283C000006020328090000062A133002001100000001000011020328040000060A0206283C000006062A000000133002001700000001000011020328040000060A0206283C000006020328070000062A26020304280B0000062A860205282B0000060203052828000006020405282900000602030405282C0000062A00133004002800000002000011020328090000060A02030617281600000A281700000A280A00000602047E1800000A28050000062A1330040024000000020000110204032805000006020328090000060A02030617281600000A281900000A280A0000062A56020304052820000006020304050E0428390000062A82020328070000067E1800000A281500000A2C0C02037E1800000A28080000062A00133003002800000003000011021200FE15040000021200037D080000041200047D090000041200057D0A00000406280100002B2A133003002800000004000011021200FE15050000021200037D0B0000041200047D0C0000041200057D0D00000406280200002B2A133003002800000005000011021200FE15060000021200037D0E0000041200047D0F0000041200057D1000000406280300002B2A133003001800000006000011021200FE15090000021200037D1500000406280400002B2A4E020203283100000672EB010070281400000A2AA20302281100000A6F1200000A281300000A2D13020302281100000A6F1200000A280B0000062A172A00000013300300440000000000000002020328310000062D190204280700000602281100000A6F1200000A281300000A2B0117722F020070281400000A020204281D00000616FE017287020070281400000A2A13300300320000000700001102283500000602032812000006021200FE1508000002120002280F0000067D130000041200037D1400000406280500002B2A0000133003005C000000080000110228110000060A020602281100000A6F1200000A281300000A72B9020070281400000A02280F0000060B02062810000006027E1800000A2812000006021202FE15070000021202077D110000041202067D1200000408280600002B2A8A0202281100000A6F1200000A02280F000006281300000A722B030070281400000A2A2E020304052838000006042A6A020304052838000006027E1800000A03040E042839000006042A00001330040051000000010000110228190000062C06022835000006020428040000060A02067E1800000A281300000A725F030070281400000A0203283C00000602030428290000060204052818000006027E1800000A0304282C0000062A00000013300800660000000900001102280500000A046F1B00000A2C570204166A728B0300701A8D10000001251602281100000A6F1200000A8C07000001A22517038C07000001A22518058C06000001A225190E04A2166A281C00000A0A02066F1D00000AA51300000172C1030070281400000A2A0000133004004900000001000011020328040000060A020602281100000A6F1200000A281300000A7211040070281400000A0203282B0000060206032828000006020314281800000602067E1800000A03282C0000062A22020328170000062A5E02037E1800000A281500000A725B040070281400000A2A000042534A4201000100000000000C00000076342E302E33303331390000000005006C00000084090000237E0000F00900001007000023537472696E67730000000000110000980400002355530098150000100000002347554944000000A81500001C02000023426C6F620000000000000002000001571DA201090A000000FA013300160000010000001300000009000000150000003C000000630000001D00000006000000100000000900000001000000050000000A000000010000000200000007000000060000000000A0030100000000000600C001D3050600EF01D3050600AC01A9050F00F30500000A00690630060A00160030060A00200630060A00810130060A008A0630060600FC03DF0306006201DF030A00E00130060A009501300606000100DF0306004F02DF0306007706DF030A001A01300606000D02DF0306000104DF03000000001E000000000001000100010010002F04000015000100010003010000E2000000290001003D000A011000F20200002D0008003D000A011000D40200002D000B003D000A011000E00200002D000E003D000A011000910200002D0011003D000A011000B60200002D0013003D000A011000A80200002D0015003D000606530016015680F100190156802E04190156805105190156805B00190156802F0119015680590619010600F2038900060076048900060098001D010600450589000600CD008900060098001D0106004505890006009A0589000600CD00210106001E05890006003905890006002C0589000600EC048900060098001D015020000000008600F200240101006D20000000008100BC05290102008C20000000008100BD06300104009E20000000008100040536010500B22000000000810011053D010600C720000000008100AA0630010800D920000000008100380336010900ED2000000000810048033D010A000221000000008100040145010C001F210000000081000F014C010D003D210000000081006B0554010F0060210000000081007E055C0111008421000000008100B60065011400A121000000008100C0006B011500BF21000000008608B3045D001700D121000000008108BD0472011700E421000000008608C7045D001800F621000000008108D8047201180009220000000086084B01780119001B2200000000810854017C0119002E22000000008608B20378011A004022000000008108BD037C011A005322000000008100330030011B007022000000008100430081011C008E22000000008108560288011E00A0220000000081086B028C011E00B422000000008618A30591011F002023000000008600AB009A0123003723000000008600C300650124004023000000008600E603A00125004D23000000008600E603AC0129006023000000008600EA03AC012C00A82300000000860028024C012F00F8230000000086008903B6013100202400000000860030024501330030240000000086003A02360134005024000000008600CA003601350073240000000086006603540136007D240000000081001B03AC013800A02400000000810040044C013B00D42400000000810009044C013D0004250000000081000203A0013F001A2500000000810058039A0143003C250000000081009B04AC01440070250000000081002C03AC014700A42500000000810077035C014A00D825000000008100A8009A014D00FC250000000081006C0172014E0010260000000081009105D9004F003C26000000008100A7044C0150008C26000000008600E90472015200CC260000000086008104060053003427000000008100CD060600530057270000000086009E06BD01530063270000000086009A06C701560080270000000081004C04D3015A00E0270000000081001204A0015D00542800000000860071049A016100A9280000000086004A0030016200B228000000008100F70672016300000001002700000001008C0000000200220200000100DF0000000100DF0000000100DF0000000200220200000100DF0000000100DF0000000100DF00000002002202000001002806000001002806000002002202000001004B05000002000206000001004B0500000200020600000300220200000100A00000000100A00000000200220200000100220200000100220200000100220200000100220200000100A00000000100A00000000200FE0200000100220200000100A601000002005D0100000300C80300000400800200000100A00000000100A00000000100F703000002007E0400000300A00000000400700000000100F703000002007E0400000300A00000000100F703000002007E0400000300A00000000100D60000000200A00000000100020600000200D600000001004B0500000100A00000000100A000000001004B0500000200020600000100F703000002007E0400000300A00000000100F70300000200A000000001007E0400000200A00000000100F703000002007E0400000300A00000000400700000000100A00000000100F703000002007E0400000300A000000001004B0500000200D60000000300A000000001004B0500000200020600000300D60000000100A00000000100F90400000100F90400000100F90400000200A000000001004205000001007E0400000200A00000000300FE02000001007E0400000200A00000000300FE02000004007000000001007E0400000200A00000000300FE0200000100F703000002007E0400000300A00000000400700000000100A00000000100A0000000010028060900A30501001100A30506001900A3050A006100A30506002900770110007900470615006900CF031B006900D703200069001206260069001D062C0069000800330069001300390079004706400069004202470069004C024C002900A3055200290023015800890090045D003900DD0667002900A3066F003900E906670031007E067A003100560480003900790489003100650480002900FA02920069004E06D90029009B03DF0049001202EB0008000800F80008000C00FD00080010000201080014000701080018000C0108001C0011012E000B00E9012E001300F2012E001B00110201012300F80021012300F80041012300F80061012300F80081012300F800A1012300F800C1012300F800E1012300F80021022300F80041022300F80061022300F80081022300F800A1022300F800620075008D009E00A800B200BC00C600D4000200010000004505DC010000EC04DC0100005801E1010000C103E10100006F02E50102000F000300010010000300020011000500010012000500020013000700010014000700020015000900010016000900020019000B0001001A000B0004800000000000000000000000000000000069060000040000000000000000000000EF00750000000000020000000000000000000000000030060000000003000200040002000500020006000200070002000800020009000200350099003500A3003500AD003500B7003500C1003500CF0000000055496E7433320047657455496E743235360053657455496E74323536003C4D6F64756C653E00696E746572666163654944004765744964546F546F6B656E555249005365744964546F546F6B656E5552490076616C75655F5F00494E6F6E46756E6769626C65546F6B656E4D657461646174610053797374656D2E507269766174652E436F72654C696200696E74657266616365496400546F6B656E496400746F6B656E4964004C6F674D61726B417355736564004765744973557365640053657449735573656400476574417070726F76656400617070726F76656400696400546F6B656E496E746572666163650049537570706F727473496E746572666163650047657442616C616E63650053657442616C616E636500494D657373616765006765745F4D65737361676500494E6F6E46756E6769626C65546F6B656E456E756D657261626C65006765745F4E616D65007365745F4E616D65006E616D650056616C7565547970650043616E4F706572617465006765745F53746174650049536D617274436F6E74726163745374617465004950657273697374656E7453746174650073746174650044656275676761626C6541747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500496E6465784174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650042797465006765745F52657475726E56616C75650076616C756500417070726F76650042616C616E63654F66004F776E65724F6600476574537472696E6700536574537472696E67006765745F4F776E65724F6E6C794D696E74696E67007365745F4F776E65724F6E6C794D696E74696E67006F776E65724F6E6C794D696E74696E67004F776E6572736869705472616E7366657265644C6F67004D61726B4173557365644C6F67004F776E6572736869705472616E736665725265717565737465644C6F6700417070726F76616C4C6F6700417070726F76616C466F72416C6C4C6F67005472616E736665724C6F670075726900536166655472616E7366657246726F6D496E7465726E616C005472616E73666572496E7465726E616C004C6F67417070726F76616C004765744964546F417070726F76616C005365744964546F417070726F76616C00436C656172417070726F76616C004973417070726F766564466F72416C6C004C6F67417070726F76616C466F72416C6C00536574417070726F76616C466F72416C6C0043616C6C00536D617274436F6E74726163742E646C6C006765745F53796D626F6C007365745F53796D626F6C0073796D626F6C00476574426F6F6C00536574426F6F6C0053797374656D00536166655472616E7366657246726F6D0066726F6D00456E756D00426F6F6C65616E00416464546F6B656E00456E73757265436F6E74726163745265636569766564546F6B656E00494E6F6E46756E6769626C65546F6B656E0052656D6F7665546F6B656E004D696E74546F6B656E006F705F5375627472616374696F6E006F705F4164646974696F6E004275726E00546F005A65726F00746F00436C61696D4F776E657273686970006765745F53656E646572004C6F675472616E736665720043616E5472616E73666572006765745F4F776E6572007365745F4F776E6572006765745F50656E64696E674F776E6572007365745F50656E64696E674F776E65720053657450656E64696E674F776E657200746F6B656E4F776E6572004765744964546F4F776E6572005365744964546F4F776E65720050726576696F75734F776E65720043757272656E744F776E6572004E65774F776E6572006E65774F776E6572006F776E657200494E6F6E46756E6769626C65546F6B656E5265636569766572004765744F776E6572546F4F70657261746F72005365744F776E6572546F4F70657261746F720049734F776E65724F724F70657261746F72002E63746F720053797374656D2E446961676E6F737469637300536574537570706F72746564496E74657266616365730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F646573006F70657261746F724164647265737300476574416464726573730053657441646472657373006164647265737300537472617469732E536D617274436F6E74726163747300466F726D6174004973436F6E747261637400495469636B6574436F6E747261637400536D617274436F6E7472616374004F626A656374006F705F496D706C6963697400495472616E73666572526573756C7400536166654D696E7400417373657274004765744964546F417070726F76616C4B6579004765744964546F4F776E65724B657900456E737572654F776E65724F6E6C79006F705F457175616C697479006F705F496E657175616C69747900456E737572654164647265737349734E6F74456D7074790000002D53007500700070006F00720074006500640049006E0074006500720066006100630065003A007B0030007D00001B4900640054006F004F0077006E00650072003A007B0030007D0000214900640054006F0041007000700072006F00760061006C003A007B0030007D000017420061006C0061006E00630065003A007B0030007D00002F4F0077006E006500720054006F004F00700065007200610074006F0072003A007B0030007D003A007B0031007D0000154900730055007300650064003A007B0030007D00000B4F0077006E00650072000019500065006E00640069006E0067004F0077006E006500720000094E0061006D006500000D530079006D0062006F006C00000F5500520049003A007B0030007D0000214F0077006E00650072004F006E006C0079004D0069006E00740069006E006700004D5400680065002000660072006F006D00200070006100720061006D00650074006500720020006900730020006E006F007400200074006F006B0065006E0020006F0077006E00650072002E00004F54006800650020007B0030007D0020006100640064007200650073007300200069007300200061006C0072006500610064007900200074006F006B0065006E0020006F0077006E00650072002E00001161007000700072006F007600650064000043430061006C006C006500720020006900730020006E006F00740020006F0077006E006500720020006E006F007200200061007000700072006F007600650064002E000057430061006C006C006500720020006900730020006E006F00740020006F0077006E006500720020006E006F007200200061007000700072006F00760065006400200066006F007200200074006F006B0065006E002E0000315400690063006B00650074002000770061007300200061006C0072006500610064007900200075007300650064002E00007143006C00610069006D004F0077006E0065007200730068006900700020006D007500730074002000620065002000630061006C006C0065006400200062007900200074006800650020006E00650077002800700065006E00640069006E006700290020006F0077006E00650072002E00003354006800650020006D006500740068006F00640020006900730020006F0077006E006500720020006F006E006C0079002E00002B54006F006B0065006E00200061006C007200650061006400790020006D0069006E007400650064002E0000354F006E004E006F006E00460075006E006700690062006C00650054006F006B0065006E0052006500630065006900760065006400004F4F006E004E006F006E00460075006E006700690062006C00650054006F006B0065006E00520065006300650069007600650064002000630061006C006C0020006600610069006C00650064002E0000494F006E006C007900200074006F006B0065006E0020006F0077006E00650072002000630061006E0020006200750072006E002000740068006500200074006F006B0065006E002E000039540068006500200061006400640072006500730073002000630061006E0020006E006F00740020006200650020007A00650072006F002E00000000008C629931B0A25947A574F3320067B7020004200101080320000105200101111104200012350500020E0E1C042001020E052002010E02052001111D0E062002010E111D05200111190E062002010E11190600030E0E1C1C0420010E0E052002010E0E0520010112210420001245042000111D040701111D07000202111D111D05200201020E04070111190500011119080800021119111911190306111D040701111006300101011E00040A0111100407011114040A0111140407011118040A0111180407011124040A0111240407011120040A011120080703111D111D111C040A01111C040701122505200102111D0B20051225111D0B0E1D1C0B0320001C087CEC85D7BEA7798E0401000000040200000004030000000404000000040500000004640000000206080306110C03061119020602042001020906200201110C020520010E1119062001111D1119072002011119111D0620011119111D07200201111D111907200202111D111D08200301111D111D020520010211190620020111190205200101111D0320000E042001010E0620020111190E0320000204200101020820040112210E0E020520010111190B200401111D111D11191D0509200301111D111D111906200201111D020920031119111D11190E0B20041119111D11190E1D0508200301111D11190E042800111D0328000E032800020801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F777301080100020000000000000000000000000000000000000010000000000000000000000000000000D44000000000000000000000EE400000002000000000000000000000000000000000000000000000E0400000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF2500200010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C000000003100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C01020017216DD00000000000000000E00022200B013000002A000000020000000000002A480000002000000060000000000010002000000002000004000000000000000400000000000000008000000002000000000000030040850000100000100000000010000010000000000000100000000000000000000000D84700004F000000000000000000000000000000000000000000000000000000006000000C000000BC4700001C0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E746578740000003028000000200000002A000000020000000000000000000000000000200000602E72656C6F6300000C0000000060000000020000002C00000000000000000000000000004000004200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000C480000000000004800000002000500D42A0000E81C000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007202280500000A7201000070038C06000001280600000A6F0700000A2A7602280500000A7201000070038C06000001280600000A176F0800000A2A7202280500000A721B000070038C11000001280600000A6F0700000A2A7A02280500000A721B00007003B88C11000001280600000A046F0800000A2A467249000070038C07000001280600000A2A4E02280500000A020328050000066F0900000A2A5202280500000A02032805000006046F0A00000A2A467265000070038C07000001280600000A2A4E02280500000A020328080000066F0900000A2A5202280500000A02032808000006046F0A00000A2A7202280500000A7287000070038C08000001280600000A6F0B00000A2A7602280500000A7287000070038C08000001280600000A046F0C00000A2A8A02280500000A729F000070038C08000001048C08000001280D00000A6F0700000A2A8E02280500000A729F000070038C08000001048C08000001280D00000A056F0800000A2A7202280500000A72CF000070038C07000001280600000A6F0700000A2A7602280500000A72CF000070038C07000001280600000A046F0800000A2A4602280500000A72E50000706F0900000A2A4A02280500000A72E5000070036F0A00000A2A4602280500000A72F10000706F0900000A2A4A02280500000A72F1000070036F0A00000A2A4602280500000A720B0100706F0E00000A2A4A02280500000A720B010070036F0F00000A2A4602280500000A72150100706F0E00000A2A4A02280500000A7215010070036F0F00000A2A7202280500000A7223010070038C07000001280600000A6F0E00000A2A7602280500000A7223010070038C07000001280600000A046F0F00000A2A4602280500000A72330100706F0700000A2A4A02280500000A7233010070036F0800000A2A00001330030060000000000000000203281000000A021717280400000602181728040000060219162804000006021A172804000006021B162804000006021F6417280400000602042816000006020528180000060202281100000A6F1200000A2812000006020E04281C0000062A5A0228390000060203172810000006020328330000062A220203280F0000062A32020304050E04282D0000062A000000133006007601000001000011031C8D0F00000125167255010070A22517725D010070A22518726F010070A22519727D010070A2251A7287010070A2251B728D010070A2281300000A0A02062C15068E691C330F06189A729D010070281400000A2B011672C1010070281500000A0202281600000A06179A1201281700000A6F1800000A02281900000A281A00000A72DB010070281500000A720F02007006169A280600000A281B00000A0C020208280100000616FE01721B020070281500000A061B9A281C00000A0D0202281600000A036F1D00000A041204281E00000A726D020070281500000A02110402092806000006281A00000A72A1020070281500000A02281600000A06199A1206281700000A6F1800000A130502281600000A061A9A1208281700000A6F1800000A13070211061108FE0172C7020070281500000A02110607FE017227030070281500000A020902281100000A6F1200000A280A000006020828020000060211051107092823000006021105110709080428300000062A4202030405168D15000001282D0000062A00133004003A0000000200001102042840000006020528060000060A020628400000060206052836000006020603281A00000A72B8030070281500000A02060405282A0000062A0000133004004400000002000011020428060000060A0206284000000602062834000006020306281F00000A72060400707256040070280600000A281500000A020403280A0000060206030428310000062A9E0202281100000A6F1200000A0304280E0000060202281100000A6F1200000A030428320000062A3E020328400000060203280B0000062A133002001100000002000011020328060000060A02062840000006062A000000133002001700000002000011020328060000060A02062840000006020328090000062A26020304280D0000062A860205282E000006020305282B000006020405282C00000602030405282F0000062A001330040028000000030000110203280B0000060A02030617282000000A282100000A280C00000602047E2200000A28070000062A13300400240000000300001102040328070000060203280B0000060A02030617282000000A282300000A280C0000062A56020304052823000006020304050E04283D0000062A82020328090000067E2200000A281F00000A2C0C02037E2200000A280A0000062A00133003002800000004000011021200FE15050000021200037D0D0000041200047D0E0000041200057D0F00000406280100002B2A133003003A00000005000011021200FE15040000021200037D080000041200047D090000041200057D0A00000412000E047D0B00000412000E057D0C00000406280200002B2A0000133003002800000006000011021200FE15060000021200037D100000041200047D110000041200057D1200000406280300002B2A133003002800000007000011021200FE15070000021200037D130000041200047D140000041200057D1500000406280400002B2A133003001800000008000011021200FE150A0000021200037D1A00000406280500002B2A4E02020328350000067268040070281500000A2AA20302281100000A6F1200000A281A00000A2D13020302281100000A6F1200000A280D0000062A172A00000013300300440000000000000002020328350000062D190204280900000602281100000A6F1200000A281A00000A2B011772AC040070281500000A020204281F00000616FE017204050070281500000A2A13300300320000000900001102283900000602032814000006021200FE150900000212000228110000067D180000041200037D1900000406280600002B2A0000133003005C0000000A0000110228130000060A020602281100000A6F1200000A281A00000A7236050070281500000A0228110000060B02062812000006027E2200000A2814000006021202FE15080000021202077D160000041202067D1700000408280700002B2A8A0202281100000A6F1200000A022811000006281A00000A72A8050070281500000A2A2E02030405283C000006042A6A02030405283C000006027E2200000A03040E04283D000006042A000013300400510000000200001102281B0000062C06022839000006020428060000060A02067E2200000A281A00000A72DC050070281500000A02032840000006020304282C000006020405281A000006027E2200000A0304282F0000062A00000013300800660000000B00001102280500000A046F2500000A2C570204166A72080600701A8D10000001251602281100000A6F1200000A8C08000001A22517038C08000001A22518058C07000001A225190E04A2166A282600000A0A02066F2700000AA516000001723E060070281500000A2A0000133004004900000002000011020328060000060A020602281100000A6F1200000A281A00000A728E060070281500000A0203282E000006020603282B000006020314281A00000602067E2200000A03282F0000062A22020328190000062A5E02037E2200000A281F00000A72D8060070281500000A2A000042534A4201000100000000000C00000076342E302E33303331390000000005006C000000A00A0000237E00000C0B00001808000023537472696E677300000000241300001407000023555300381A0000100000002347554944000000481A0000A002000023426C6F620000000000000002000001571DA201090A000000FA01330016000001000000160000000A0000001A000000400000006C0000002700000006000000130000000B00000001000000050000000A000000010000000300000008000000070000000000040401000000000006001102A60606004002A6060600FD017C060F00C60600000A006F0726070A00310026070A00290026070A00160726070A00D20126070A00900726070600640447040600990147040A00310226070A00E60126070600AA02470406007D0747040600010047040A00510126070E008500E6040A002306260706005E0247040600690447040000000039000000000001000100010010009704000015000100010003010000190100002D00010041000A0110004D0300003100080041000A0110005603000031000D0041000A0110002F0300003100100041000A0110003B0300003100130041000A011000EC0200003100160041000A011000110300003100180041000A0110000303000031001A00410006068A00710156802801740156809604740156800906740156809200740156806601740156805F07740106005A04DA000600DE04DA000600CF007801060008057C010600A301800106005A04DA000600DE04DA000600CF0078010600FD05DA0006000401DA000600CF0078010600FD05DA0006006D06DA000600040184010600D605DA000600F105DA000600E405DA000600A405DA000600CF00780150200000000086005D05870101006D200000000081005A058D0102008B20000000008600290193010300A8200000000081008F0698010400C720000000008100C3079F010600D920000000008100BC05A5010700ED20000000008100C905AC0108000221000000008100B0079F010A0014210000000081009C03A5010B002821000000008100AC03AC010C003D210000000081003B01B4010E005A210000000081004601BB010F0078210000000081003E06C30111009B210000000081005106CB011300BF21000000008100ED00D4011600DC21000000008100F700DA011700FA210000000086086B055D0019000C220000000081087505E10119001F220000000086087F055D001A0031220000000081089005E1011A0044220000000086088201E7011B0056220000000081088B01EB011B0069220000000086081604E7011C007B220000000081082104EB011C008E2200000000810059009F011D00AB220000000081006900F0011E00C922000000008108B102F7012000DB22000000008108C602FB012000F0220000000086187606000221005C23000000008600E200090225007323000000008600FA00D40126007C230000000086004E040F0227008C2300000000860030051B022B000E250000000086004E0422022D00202500000000860052042202300068250000000086007902BB013300B825000000008600ED032C023500E0250000000086008B02B4013700F0250000000086009502A501380010260000000086000101A50139003326000000008600CA03C3013A003D260000000081007F0322023C006026000000008100A804BB013F0094260000000081007104BB014100C42600000000810066030F024300DA26000000008100BC0309024700FC2600000000810042052202480030270000000081002D0533024B007827000000008100900322025000AC27000000008100DB03CB015300E027000000008100DF00090256000428000000008100BD01E1015700182800000000810064063401580044280000000081004E05BB0159009428000000008600A105E1015B00D428000000008600F90406005C003C29000000008100D30706005C005F29000000008600A40741025C006B29000000008600A0074B025F008829000000008100B40457026300E8290000000081007A040F0266005C2A000000008600D90409026A00B12A00000000860070009F016B00BA2A000000008100FD07E1016C00000001004E00000001004E0000000100420000000100C300000002007302000001001601000001001601000001001601000002007302000001001601000001001601000001001601000002007302000001001E07000001001E0700000200730200000100030600000200F80600000100030600000200F80600000300730200000100D70000000100D70000000200730200000100730200000100730200000100730200000100730200000100D70000000100D70000000200620300000100730200000100F701000002009401000003002C0400000400DB0200000100D70000000100D700000001005F0400000200F60400000300D70000000400A70000000100430400000200AD01000001005F0400000200F60400000300D700000001005F0400000200F60400000300D700000001000D0100000200D70000000100F806000002000D0100000100030600000100D70000000100D70000000100030600000200F806000001005F0400000200F60400000300D700000001005F0400000200D70000000100F60400000200D700000001005F0400000200F60400000300D70000000400A70000000100D700000001005F0400000200F60400000300D700000001005F0400000200F60400000300D70000000400150500000500AD01000001000306000002000D0100000300D70000000100030600000200F806000003000D0100000100D70000000100B10500000100B10500000100B10500000200D70000000100FA0500000100F60400000200D70000000300620300000100F60400000200D70000000300620300000400A70000000100F60400000200D700000003006203000001005F0400000200F60400000300D70000000400A70000000100D70000000100D700000001001E07090076060100110076060600190076060A006900760606002900C801100079004D071500710033041B0071003B042000710008072600710013072C0071001B00330071002600390079004D07400071009D0247007100A7024C0029007606520029005A015800910022055D0099003D0774007900E3077C002900A907820029002F0688009900E1068D00A100EE0695002900D5065D004100E3079C003100B701A4003900B701AA00A1008102B00099000800B6004100EF079C0039008407CB003900BE04D1004100E104DA003900CD04D10029005E03E3007100540734012900FF033A0151006302460108000800530108000C005801080010005D0108001400620108001800670108001C006C012E000B006D022E00130076022E001B009502010123005301210123005301410123005301A10123005301C10123005301E10123005301010223005301210223005301410223005301610223005301810223005301C10223005301E102230053010103230053012103230053014103230053016200C100C600DE00EF00F90003010D01170121012F01020001000000FD0560020000A405600200008F0165020000250465020000CA02690202001100030001001200030002001300050001001400050002001500070001001600070002001700090001001800090002001B000B0001001C000B000480000000000000000000000000000000006F0700000600000000000000000000004A01AC000000000002000000000000000000000000002607000000000200000002000000000000000000790000000000030002000400020005000200060002000700020008000200090002000A0002004900EA004900F4004900FE00490008014900120149001C0149002A01000000000055496E743332005472794765745369676E65725348413235360047657455496E743235360053657455496E743235360055496E74313238003C4D6F64756C653E00696E746572666163654944007472616E736665724944004765744964546F546F6B656E555249005365744964546F546F6B656E55524900537472617469732E53434C00535341530076616C75655F5F00494E6F6E46756E6769626C65546F6B656E4D657461646174610053797374656D2E507269766174652E436F72654C696200696E74657266616365496400546F6B656E496400746F6B656E4964004C6F674D61726B417355736564004765744973557365640053657449735573656400476574417070726F76656400617070726F76656400696400546F6B656E496E746572666163650049537570706F727473496E746572666163650047657442616C616E63650053657442616C616E636500494D657373616765006765745F4D65737361676500494E6F6E46756E6769626C65546F6B656E456E756D657261626C65006765745F4E616D65007365745F4E616D65006E616D650056616C756554797065005369676E6174757265007369676E61747572650050617273650043616E4F706572617465006765745F53746174650049536D617274436F6E74726163745374617465004950657273697374656E7453746174650073746174650044656275676761626C6541747472696275746500436F6D70696C6174696F6E52656C61786174696F6E7341747472696275746500496E6465784174747269627574650052756E74696D65436F6D7061746962696C6974794174747269627574650042797465006765745F52657475726E56616C75650076616C756500417070726F76650053657269616C697A650042616C616E63654F66004F776E65724F6600476574537472696E6700536574537472696E67006765745F4F776E65724F6E6C794D696E74696E67007365745F4F776E65724F6E6C794D696E74696E67006F776E65724F6E6C794D696E74696E67004F776E6572736869705472616E7366657265644C6F67004D61726B4173557365644C6F67004F776E6572736869705472616E736665725265717565737465644C6F6700417070726F76616C4C6F6700417070726F76616C466F72416C6C4C6F670044656C6567617465645472616E736665724C6F670075726900536166655472616E7366657246726F6D496E7465726E616C005472616E73666572496E7465726E616C004C6F67417070726F76616C004765744964546F417070726F76616C005365744964546F417070726F76616C00436C656172417070726F76616C004973417070726F766564466F72416C6C004C6F67417070726F76616C466F72416C6C00536574417070726F76616C466F72416C6C0043616C6C00536D617274436F6E74726163742E646C6C006765745F53796D626F6C007365745F53796D626F6C0073796D626F6C00476574426F6F6C00536574426F6F6C0075726C0053797374656D00536166655472616E7366657246726F6D0066726F6D00456E756D00426F6F6C65616E00416464546F6B656E00456E73757265436F6E74726163745265636569766564546F6B656E00494E6F6E46756E6769626C65546F6B656E0052656D6F7665546F6B656E004D696E74546F6B656E006F705F5375627472616374696F6E006F705F4164646974696F6E004275726E00546F005A65726F00537472617469732E53434C2E43727970746F00436C61696D4F776E65727368697000556E697175654E756D62657200756E697175654E756D626572006765745F53656E646572004C6F6744656C6567617465645472616E73666572004C6F675472616E736665720043616E5472616E73666572005365744B6E6F776E5472616E73666572006765745F4F776E6572007365745F4F776E6572006765745F50656E64696E674F776E6572007365745F50656E64696E674F776E65720053657450656E64696E674F776E657200746F6B656E4F776E6572004765744964546F4F776E6572005365744964546F4F776E65720050726576696F75734F776E65720043757272656E744F776E6572004E65774F776E6572006E65774F776E6572006F776E657200494E6F6E46756E6769626C65546F6B656E5265636569766572004953657269616C697A6572006765745F53657269616C697A6572004765744F776E6572546F4F70657261746F72005365744F776E6572546F4F70657261746F720049734F776E65724F724F70657261746F72002E63746F720053797374656D2E446961676E6F737469637300536574537570706F72746564496E74657266616365730053797374656D2E52756E74696D652E436F6D70696C6572536572766963657300446562756767696E674D6F646573006765745F416464726573730050617273654164647265737300546F41646472657373006F70657261746F724164647265737300476574416464726573730053657441646472657373006164647265737300537472617469732E536D617274436F6E7472616374730047657455524C417267756D656E747300466F726D6174004973436F6E747261637400495469636B6574436F6E747261637400536D617274436F6E7472616374004F626A656374006F705F496D706C6963697400495472616E73666572526573756C7400536166654D696E7400417373657274004765744964546F417070726F76616C4B6579004765744964546F4F776E65724B657900456E737572654F776E65724F6E6C79006F705F457175616C697479006F705F496E657175616C69747900456E737572654164647265737349734E6F74456D7074790000000000195400720061006E0073006600650072003A007B0030007D00002D53007500700070006F00720074006500640049006E0074006500720066006100630065003A007B0030007D00001B4900640054006F004F0077006E00650072003A007B0030007D0000214900640054006F0041007000700072006F00760061006C003A007B0030007D000017420061006C0061006E00630065003A007B0030007D00002F4F0077006E006500720054006F004F00700065007200610074006F0072003A007B0030007D003A007B0031007D0000154900730055007300650064003A007B0030007D00000B4F0077006E00650072000019500065006E00640069006E0067004F0077006E006500720000094E0061006D006500000D530079006D0062006F006C00000F5500520049003A007B0030007D0000214F0077006E00650072004F006E006C0079004D0069006E00740069006E0067000007750069006400001163006F006E0074007200610063007400000D6D006500740068006F0064000009660072006F006D00000574006F00000F74006F006B0065006E00490064000023440065006C006500670061007400650064005400720061006E007300660065007200001949006E00760061006C00690064002000750072006C002E00003349006E00760061006C0069006400200063006F006E0074007200610063007400200061006400640072006500730073002E00000B300078007B0030007D00005154006800650020007400720061006E0073006600650072002000680061007300200061006C007200650061006400790020006200650065006E00200070006500720066006F0072006D00650064002E00003343006F0075006C00640020006E006F00740020007200650073006F006C007600650020007300690067006E00650072002E00002549006E00760061006C006900640020007300690067006E00610074007500720065002E00005F2700460072006F006D002700200061006E0064002000270054006F002700200061006400640072006500730073002000700072006500660069007800650073002000610072006500200064006900660066006500720065006E0074002E0001808F43006F006E007400720061006300740020006100640064007200650073007300200076006500720073007500730020002700460072006F006D002700200061006E0064002000270054006F002700200061006400640072006500730073002000700072006500660069007800650073002000610072006500200064006900660066006500720065006E0074002E00014D5400680065002000660072006F006D00200070006100720061006D00650074006500720020006900730020006E006F007400200074006F006B0065006E0020006F0077006E00650072002E00004F54006800650020007B0030007D0020006100640064007200650073007300200069007300200061006C0072006500610064007900200074006F006B0065006E0020006F0077006E00650072002E00001161007000700072006F007600650064000043430061006C006C006500720020006900730020006E006F00740020006F0077006E006500720020006E006F007200200061007000700072006F007600650064002E000057430061006C006C006500720020006900730020006E006F00740020006F0077006E006500720020006E006F007200200061007000700072006F00760065006400200066006F007200200074006F006B0065006E002E0000315400690063006B00650074002000770061007300200061006C0072006500610064007900200075007300650064002E00007143006C00610069006D004F0077006E0065007200730068006900700020006D007500730074002000620065002000630061006C006C0065006400200062007900200074006800650020006E00650077002800700065006E00640069006E006700290020006F0077006E00650072002E00003354006800650020006D006500740068006F00640020006900730020006F0077006E006500720020006F006E006C0079002E00002B54006F006B0065006E00200061006C007200650061006400790020006D0069006E007400650064002E0000354F006E004E006F006E00460075006E006700690062006C00650054006F006B0065006E0052006500630065006900760065006400004F4F006E004E006F006E00460075006E006700690062006C00650054006F006B0065006E00520065006300650069007600650064002000630061006C006C0020006600610069006C00650064002E0000494F006E006C007900200074006F006B0065006E0020006F0077006E00650072002000630061006E0020006200750072006E002000740068006500200074006F006B0065006E002E000039540068006500200061006400640072006500730073002000630061006E0020006E006F00740020006200650020007A00650072006F002E00000000C1CD4BE1E40D08469C6127245A2DE3E80004200101080320000105200101111104200012390500020E0E1C042001020E052002010E0205200111210E062002010E1121052001111D0E062002010E111D0600030E0E1C1C0420010E0E052002010E0E052001011225042000124904200011211107091D0E051119111D11211121051121050700021D0E0E1D0E050002020E0E05200201020E04200012510700021D050E100506200111211D05070002021121112105000111190E050001111D0E0520011D050E0A0003021D051D051011210407011121040701111D050001111D08080002111D111D111D03061121040701111406300101011E00040A0111140407011110040A0111100407011118040A011118040701111C040A01111C0407011128040A0111280407011124040A011124080703112111211120040A01112004070112290520010211210B2005122911210B0E1D1C0B0320001C087CEC85D7BEA7798E0401000000040200000004030000000404000000040500000004640000000206080306110C0306111D0306111903061D05020602052001021119052001011119042001020906200201110C020520010E111D0620011121111D07200201111D1121062001111D1121072002011121111D072002021121112108200301112111210205200102111D06200201111D020520010111210320000E042001010E06200201111D0E0320000204200101020820040112250E0E0205200101111D0B20040111211121111D1D05062002010E1D050920030111211121111D062002011121020D20050111211121111D11191D05092003111D1121111D0E0B2004111D1121111D0E1D05082003011121111D0E04280011210328000E032800020801000800000000001E01000100540216577261704E6F6E457863657074696F6E5468726F7773010801000200000000000000000000000000000000000000100000000000000000000000000000000048000000000000000000001A4800000020000000000000000000000000000000000000000000000C480000000000000000000000005F436F72446C6C4D61696E006D73636F7265652E646C6C0000000000FF25002000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000C0000002C3800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ```